Skip to content

Commit 12b2eb8

Browse files
committed
Implement ClassVar feature in code without changing template
1 parent 3914be8 commit 12b2eb8

4 files changed

Lines changed: 21 additions & 15 deletions

File tree

src/datamodel_code_generator/model/pydantic/base_model.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
DataModelFieldBase,
2020
)
2121
from datamodel_code_generator.model._types import WrappedDefault
22-
from datamodel_code_generator.model.base import UNDEFINED
22+
from datamodel_code_generator.model.base import UNDEFINED, repr_set_sorted
2323
from datamodel_code_generator.model.pydantic.imports import (
2424
IMPORT_ANYURL,
2525
IMPORT_EXTRA,
@@ -250,18 +250,34 @@ def __str__(self) -> str: # noqa: PLR0912
250250
elif self.required:
251251
field_arguments = ["...", *field_arguments]
252252
elif not default_factory:
253-
from datamodel_code_generator.model.base import repr_set_sorted # noqa: PLC0415
254-
255253
default_repr = repr_set_sorted(self.default) if isinstance(self.default, set) else repr(self.default)
256254
field_arguments = [default_repr, *field_arguments]
257255

256+
if self.is_class_var:
257+
return repr_set_sorted(self.default) if isinstance(self.default, set) else repr(self.default)
258+
258259
return f"Field({', '.join(field_arguments)})"
259260

261+
@property
262+
def is_class_var(self) -> bool:
263+
return self.extras.get("x-is-classvar") is True
264+
265+
@property
266+
def type_hint(self) -> str:
267+
"""Get the type hint including ClassVar if applicable."""
268+
# if self.name == "name":
269+
# breakpoint()
270+
if self.is_class_var:
271+
return f"ClassVar[{super().type_hint}]"
272+
return super().type_hint
273+
260274
@property
261275
def annotated(self) -> str | None:
262276
"""Get the Annotated type hint if use_annotated is enabled."""
263277
if not self.use_annotated or not str(self):
264278
return None
279+
if self.is_class_var:
280+
return self.type_hint
265281
return f"Annotated[{self.type_hint}, {self!s}]"
266282

267283
@property

src/datamodel_code_generator/model/pydantic_v2/base_model.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -188,14 +188,6 @@ def _has_discriminator_in_data_type(self) -> bool:
188188
"""Check if any nested DataType has a discriminator."""
189189
return any(dt.discriminator for dt in self.data_type.all_data_types)
190190

191-
@property
192-
def class_var_type_hint(self) -> str:
193-
return f"ClassVar[{self.type_hint}]"
194-
195-
@property
196-
def is_class_var(self) -> bool:
197-
return self.extras.get("x-is_classvar") is True
198-
199191
@property
200192
def imports(self) -> tuple[Import, ...]:
201193
"""Get all required imports including AliasChoices and Field for discriminator."""

src/datamodel_code_generator/model/template/pydantic_v2/BaseModel.jinja2

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@ class {{ class_name }}({{ base_class }}):{% if comment is defined %} # {{ comme
1616
{%- endfilter %}
1717
{%- endif %}
1818
{%- for field in fields %}
19-
{%- if field.is_class_var and field.represented_default %}
20-
{{ field.name }}: {{ field.class_var_type_hint }} = {{ field.represented_default }}
21-
{%- elif not field.annotated and field.field %}
19+
{%- if not field.annotated and field.field %}
2220
{{ field.name }}: {{ field.type_hint }} = {{ field.field }}
2321
{%- else %}
2422
{%- if field.annotated %}

tests/data/jsonschema/has_classvar_extra.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"properties": {
44
"namespace": {
55
"type": "string",
6-
"x-is_classvar": true,
6+
"x-is-classvar": true,
77
"default": "test"
88
}
99
}

0 commit comments

Comments
 (0)