datamodel-code-generator 0.27.2__py3-none-any.whl → 0.27.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of datamodel-code-generator might be problematic. Click here for more details.

Files changed (43) hide show
  1. datamodel_code_generator/__init__.py +159 -190
  2. datamodel_code_generator/__main__.py +151 -173
  3. datamodel_code_generator/arguments.py +227 -230
  4. datamodel_code_generator/format.py +77 -99
  5. datamodel_code_generator/http.py +9 -10
  6. datamodel_code_generator/imports.py +57 -64
  7. datamodel_code_generator/model/__init__.py +26 -31
  8. datamodel_code_generator/model/base.py +94 -127
  9. datamodel_code_generator/model/dataclass.py +58 -59
  10. datamodel_code_generator/model/enum.py +34 -30
  11. datamodel_code_generator/model/imports.py +13 -11
  12. datamodel_code_generator/model/msgspec.py +112 -126
  13. datamodel_code_generator/model/pydantic/__init__.py +14 -27
  14. datamodel_code_generator/model/pydantic/base_model.py +120 -139
  15. datamodel_code_generator/model/pydantic/custom_root_type.py +2 -2
  16. datamodel_code_generator/model/pydantic/dataclass.py +6 -4
  17. datamodel_code_generator/model/pydantic/imports.py +35 -33
  18. datamodel_code_generator/model/pydantic/types.py +86 -117
  19. datamodel_code_generator/model/pydantic_v2/__init__.py +17 -17
  20. datamodel_code_generator/model/pydantic_v2/base_model.py +118 -119
  21. datamodel_code_generator/model/pydantic_v2/imports.py +5 -3
  22. datamodel_code_generator/model/pydantic_v2/root_model.py +6 -6
  23. datamodel_code_generator/model/pydantic_v2/types.py +8 -7
  24. datamodel_code_generator/model/rootmodel.py +1 -1
  25. datamodel_code_generator/model/scalar.py +33 -32
  26. datamodel_code_generator/model/typed_dict.py +42 -41
  27. datamodel_code_generator/model/types.py +19 -17
  28. datamodel_code_generator/model/union.py +21 -17
  29. datamodel_code_generator/parser/__init__.py +12 -11
  30. datamodel_code_generator/parser/base.py +320 -492
  31. datamodel_code_generator/parser/graphql.py +80 -111
  32. datamodel_code_generator/parser/jsonschema.py +422 -580
  33. datamodel_code_generator/parser/openapi.py +175 -204
  34. datamodel_code_generator/pydantic_patch.py +8 -9
  35. datamodel_code_generator/reference.py +192 -274
  36. datamodel_code_generator/types.py +147 -182
  37. datamodel_code_generator/util.py +22 -26
  38. {datamodel_code_generator-0.27.2.dist-info → datamodel_code_generator-0.27.3.dist-info}/METADATA +7 -1
  39. datamodel_code_generator-0.27.3.dist-info/RECORD +59 -0
  40. datamodel_code_generator-0.27.2.dist-info/RECORD +0 -59
  41. {datamodel_code_generator-0.27.2.dist-info → datamodel_code_generator-0.27.3.dist-info}/WHEEL +0 -0
  42. {datamodel_code_generator-0.27.2.dist-info → datamodel_code_generator-0.27.3.dist-info}/entry_points.txt +0 -0
  43. {datamodel_code_generator-0.27.2.dist-info → datamodel_code_generator-0.27.3.dist-info}/licenses/LICENSE +0 -0
@@ -1,17 +1,14 @@
1
+ from __future__ import annotations
2
+
1
3
  import keyword
2
- from pathlib import Path
3
4
  from typing import (
5
+ TYPE_CHECKING,
4
6
  Any,
5
7
  ClassVar,
6
- DefaultDict,
7
- Dict,
8
8
  Iterator,
9
- List,
10
- Optional,
11
9
  Tuple,
12
10
  )
13
11
 
14
- from datamodel_code_generator.imports import Import
15
12
  from datamodel_code_generator.model import DataModel, DataModelFieldBase
16
13
  from datamodel_code_generator.model.base import UNDEFINED
17
14
  from datamodel_code_generator.model.imports import (
@@ -20,20 +17,25 @@ from datamodel_code_generator.model.imports import (
20
17
  IMPORT_TYPED_DICT,
21
18
  IMPORT_TYPED_DICT_BACKPORT,
22
19
  )
23
- from datamodel_code_generator.reference import Reference
24
20
  from datamodel_code_generator.types import NOT_REQUIRED_PREFIX
25
21
 
26
- escape_characters = str.maketrans(
27
- {
28
- '\\': r'\\',
29
- "'": r'\'',
30
- '\b': r'\b',
31
- '\f': r'\f',
32
- '\n': r'\n',
33
- '\r': r'\r',
34
- '\t': r'\t',
35
- }
36
- )
22
+ if TYPE_CHECKING:
23
+ from collections import defaultdict
24
+ from pathlib import Path
25
+
26
+ from datamodel_code_generator.reference import Reference
27
+
28
+ from datamodel_code_generator.imports import Import # noqa: TC001
29
+
30
+ escape_characters = str.maketrans({
31
+ "\\": r"\\",
32
+ "'": r"\'",
33
+ "\b": r"\b",
34
+ "\f": r"\f",
35
+ "\n": r"\n",
36
+ "\r": r"\r",
37
+ "\t": r"\t",
38
+ })
37
39
 
38
40
 
39
41
  def _is_valid_field_name(field: DataModelFieldBase) -> bool:
@@ -44,23 +46,23 @@ def _is_valid_field_name(field: DataModelFieldBase) -> bool:
44
46
 
45
47
 
46
48
  class TypedDict(DataModel):
47
- TEMPLATE_FILE_PATH: ClassVar[str] = 'TypedDict.jinja2'
48
- BASE_CLASS: ClassVar[str] = 'typing.TypedDict'
49
- DEFAULT_IMPORTS: ClassVar[Tuple[Import, ...]] = (IMPORT_TYPED_DICT,)
49
+ TEMPLATE_FILE_PATH: ClassVar[str] = "TypedDict.jinja2"
50
+ BASE_CLASS: ClassVar[str] = "typing.TypedDict"
51
+ DEFAULT_IMPORTS: ClassVar[Tuple[Import, ...]] = (IMPORT_TYPED_DICT,) # noqa: UP006
50
52
 
51
- def __init__(
53
+ def __init__( # noqa: PLR0913
52
54
  self,
53
55
  *,
54
56
  reference: Reference,
55
- fields: List[DataModelFieldBase],
56
- decorators: Optional[List[str]] = None,
57
- base_classes: Optional[List[Reference]] = None,
58
- custom_base_class: Optional[str] = None,
59
- custom_template_dir: Optional[Path] = None,
60
- extra_template_data: Optional[DefaultDict[str, Dict[str, Any]]] = None,
61
- methods: Optional[List[str]] = None,
62
- path: Optional[Path] = None,
63
- description: Optional[str] = None,
57
+ fields: list[DataModelFieldBase],
58
+ decorators: list[str] | None = None,
59
+ base_classes: list[Reference] | None = None,
60
+ custom_base_class: str | None = None,
61
+ custom_template_dir: Path | None = None,
62
+ extra_template_data: defaultdict[str, dict[str, Any]] | None = None,
63
+ methods: list[str] | None = None,
64
+ path: Path | None = None,
65
+ description: str | None = None,
64
66
  default: Any = UNDEFINED,
65
67
  nullable: bool = False,
66
68
  keyword_only: bool = False,
@@ -99,8 +101,8 @@ class TypedDict(DataModel):
99
101
 
100
102
  yield from self.fields
101
103
 
102
- def render(self, *, class_name: Optional[str] = None) -> str:
103
- response = self._render(
104
+ def render(self, *, class_name: str | None = None) -> str:
105
+ return self._render(
104
106
  class_name=class_name or self.class_name,
105
107
  fields=self.fields,
106
108
  decorators=self.decorators,
@@ -111,20 +113,19 @@ class TypedDict(DataModel):
111
113
  all_fields=self.all_fields,
112
114
  **self.extra_template_data,
113
115
  )
114
- return response
115
116
 
116
117
 
117
118
  class TypedDictBackport(TypedDict):
118
- BASE_CLASS: ClassVar[str] = 'typing_extensions.TypedDict'
119
- DEFAULT_IMPORTS: ClassVar[Tuple[Import, ...]] = (IMPORT_TYPED_DICT_BACKPORT,)
119
+ BASE_CLASS: ClassVar[str] = "typing_extensions.TypedDict"
120
+ DEFAULT_IMPORTS: ClassVar[Tuple[Import, ...]] = (IMPORT_TYPED_DICT_BACKPORT,) # noqa: UP006
120
121
 
121
122
 
122
123
  class DataModelField(DataModelFieldBase):
123
- DEFAULT_IMPORTS: ClassVar[Tuple[Import, ...]] = (IMPORT_NOT_REQUIRED,)
124
+ DEFAULT_IMPORTS: ClassVar[Tuple[Import, ...]] = (IMPORT_NOT_REQUIRED,) # noqa: UP006
124
125
 
125
126
  @property
126
127
  def key(self) -> str:
127
- return (self.original_name or self.name or '').translate( # pragma: no cover
128
+ return (self.original_name or self.name or "").translate( # pragma: no cover
128
129
  escape_characters
129
130
  )
130
131
 
@@ -132,7 +133,7 @@ class DataModelField(DataModelFieldBase):
132
133
  def type_hint(self) -> str:
133
134
  type_hint = super().type_hint
134
135
  if self._not_required:
135
- return f'{NOT_REQUIRED_PREFIX}{type_hint}]'
136
+ return f"{NOT_REQUIRED_PREFIX}{type_hint}]"
136
137
  return type_hint
137
138
 
138
139
  @property
@@ -144,7 +145,7 @@ class DataModelField(DataModelFieldBase):
144
145
  return not self._not_required
145
146
 
146
147
  @property
147
- def imports(self) -> Tuple[Import, ...]:
148
+ def imports(self) -> tuple[Import, ...]:
148
149
  return (
149
150
  *super().imports,
150
151
  *(self.DEFAULT_IMPORTS if self._not_required else ()),
@@ -152,4 +153,4 @@ class DataModelField(DataModelFieldBase):
152
153
 
153
154
 
154
155
  class DataModelFieldBackport(DataModelField):
155
- DEFAULT_IMPORTS: ClassVar[Tuple[Import, ...]] = (IMPORT_NOT_REQUIRED_BACKPORT,)
156
+ DEFAULT_IMPORTS: ClassVar[Tuple[Import, ...]] = (IMPORT_NOT_REQUIRED_BACKPORT,) # noqa: UP006
@@ -1,4 +1,6 @@
1
- from typing import Any, Dict, Optional, Sequence, Type
1
+ from __future__ import annotations
2
+
3
+ from typing import Any, Sequence
2
4
 
3
5
  from datamodel_code_generator import DatetimeClassType, PythonVersion
4
6
  from datamodel_code_generator.imports import (
@@ -10,10 +12,10 @@ from datamodel_code_generator.types import DataType, StrictTypes, Types
10
12
  from datamodel_code_generator.types import DataTypeManager as _DataTypeManager
11
13
 
12
14
 
13
- def type_map_factory(data_type: Type[DataType]) -> Dict[Types, DataType]:
14
- data_type_int = data_type(type='int')
15
- data_type_float = data_type(type='float')
16
- data_type_str = data_type(type='str')
15
+ def type_map_factory(data_type: type[DataType]) -> dict[Types, DataType]:
16
+ data_type_int = data_type(type="int")
17
+ data_type_float = data_type(type="float")
18
+ data_type_str = data_type(type="str")
17
19
  return {
18
20
  # TODO: Should we support a special type such UUID?
19
21
  Types.integer: data_type_int,
@@ -26,7 +28,7 @@ def type_map_factory(data_type: Type[DataType]) -> Dict[Types, DataType]:
26
28
  Types.time: data_type_str,
27
29
  Types.string: data_type_str,
28
30
  Types.byte: data_type_str, # base64 encoded string
29
- Types.binary: data_type(type='bytes'),
31
+ Types.binary: data_type(type="bytes"),
30
32
  Types.date: data_type_str,
31
33
  Types.date_time: data_type_str,
32
34
  Types.timedelta: data_type.from_import(IMPORT_TIMEDELTA),
@@ -44,26 +46,26 @@ def type_map_factory(data_type: Type[DataType]) -> Dict[Types, DataType]:
44
46
  Types.ipv6: data_type_str,
45
47
  Types.ipv4_network: data_type_str,
46
48
  Types.ipv6_network: data_type_str,
47
- Types.boolean: data_type(type='bool'),
49
+ Types.boolean: data_type(type="bool"),
48
50
  Types.object: data_type.from_import(IMPORT_ANY, is_dict=True),
49
- Types.null: data_type(type='None'),
51
+ Types.null: data_type(type="None"),
50
52
  Types.array: data_type.from_import(IMPORT_ANY, is_list=True),
51
53
  Types.any: data_type.from_import(IMPORT_ANY),
52
54
  }
53
55
 
54
56
 
55
57
  class DataTypeManager(_DataTypeManager):
56
- def __init__(
58
+ def __init__( # noqa: PLR0913, PLR0917
57
59
  self,
58
60
  python_version: PythonVersion = PythonVersion.PY_38,
59
- use_standard_collections: bool = False,
60
- use_generic_container_types: bool = False,
61
- strict_types: Optional[Sequence[StrictTypes]] = None,
62
- use_non_positive_negative_number_constrained_types: bool = False,
63
- use_union_operator: bool = False,
64
- use_pendulum: bool = False,
61
+ use_standard_collections: bool = False, # noqa: FBT001, FBT002
62
+ use_generic_container_types: bool = False, # noqa: FBT001, FBT002
63
+ strict_types: Sequence[StrictTypes] | None = None,
64
+ use_non_positive_negative_number_constrained_types: bool = False, # noqa: FBT001, FBT002
65
+ use_union_operator: bool = False, # noqa: FBT001, FBT002
66
+ use_pendulum: bool = False, # noqa: FBT001, FBT002
65
67
  target_datetime_class: DatetimeClassType = DatetimeClassType.Datetime,
66
- ):
68
+ ) -> None:
67
69
  super().__init__(
68
70
  python_version,
69
71
  use_standard_collections,
@@ -75,7 +77,7 @@ class DataTypeManager(_DataTypeManager):
75
77
  target_datetime_class,
76
78
  )
77
79
 
78
- self.type_map: Dict[Types, DataType] = type_map_factory(self.data_type)
80
+ self.type_map: dict[Types, DataType] = type_map_factory(self.data_type)
79
81
 
80
82
  def get_data_type(
81
83
  self,
@@ -1,39 +1,43 @@
1
1
  from __future__ import annotations
2
2
 
3
- from pathlib import Path
4
- from typing import Any, ClassVar, DefaultDict, Dict, List, Optional, Tuple
3
+ from typing import TYPE_CHECKING, Any, ClassVar, Tuple
5
4
 
6
5
  from datamodel_code_generator.imports import IMPORT_TYPE_ALIAS, IMPORT_UNION, Import
7
6
  from datamodel_code_generator.model import DataModel, DataModelFieldBase
8
7
  from datamodel_code_generator.model.base import UNDEFINED
9
- from datamodel_code_generator.reference import Reference
8
+
9
+ if TYPE_CHECKING:
10
+ from collections import defaultdict
11
+ from pathlib import Path
12
+
13
+ from datamodel_code_generator.reference import Reference
10
14
 
11
15
 
12
16
  class DataTypeUnion(DataModel):
13
- TEMPLATE_FILE_PATH: ClassVar[str] = 'Union.jinja2'
14
- BASE_CLASS: ClassVar[str] = ''
15
- DEFAULT_IMPORTS: ClassVar[Tuple[Import, ...]] = (
17
+ TEMPLATE_FILE_PATH: ClassVar[str] = "Union.jinja2"
18
+ BASE_CLASS: ClassVar[str] = ""
19
+ DEFAULT_IMPORTS: ClassVar[Tuple[Import, ...]] = ( # noqa: UP006
16
20
  IMPORT_TYPE_ALIAS,
17
21
  IMPORT_UNION,
18
22
  )
19
23
 
20
- def __init__(
24
+ def __init__( # noqa: PLR0913
21
25
  self,
22
26
  *,
23
27
  reference: Reference,
24
- fields: List[DataModelFieldBase],
25
- decorators: Optional[List[str]] = None,
26
- base_classes: Optional[List[Reference]] = None,
27
- custom_base_class: Optional[str] = None,
28
- custom_template_dir: Optional[Path] = None,
29
- extra_template_data: Optional[DefaultDict[str, Dict[str, Any]]] = None,
30
- methods: Optional[List[str]] = None,
31
- path: Optional[Path] = None,
32
- description: Optional[str] = None,
28
+ fields: list[DataModelFieldBase],
29
+ decorators: list[str] | None = None,
30
+ base_classes: list[Reference] | None = None,
31
+ custom_base_class: str | None = None,
32
+ custom_template_dir: Path | None = None,
33
+ extra_template_data: defaultdict[str, dict[str, Any]] | None = None,
34
+ methods: list[str] | None = None,
35
+ path: Path | None = None,
36
+ description: str | None = None,
33
37
  default: Any = UNDEFINED,
34
38
  nullable: bool = False,
35
39
  keyword_only: bool = False,
36
- ):
40
+ ) -> None:
37
41
  super().__init__(
38
42
  reference=reference,
39
43
  fields=fields,
@@ -1,33 +1,34 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from enum import Enum
4
- from typing import Callable, Dict, Optional, TypeVar
4
+ from typing import Callable, Dict, TypeVar
5
5
 
6
- TK = TypeVar('TK')
7
- TV = TypeVar('TV')
6
+ TK = TypeVar("TK")
7
+ TV = TypeVar("TV")
8
8
 
9
9
 
10
10
  class LiteralType(Enum):
11
- All = 'all'
12
- One = 'one'
11
+ All = "all"
12
+ One = "one"
13
13
 
14
14
 
15
15
  class DefaultPutDict(Dict[TK, TV]):
16
16
  def get_or_put(
17
17
  self,
18
18
  key: TK,
19
- default: Optional[TV] = None,
20
- default_factory: Optional[Callable[[TK], TV]] = None,
19
+ default: TV | None = None,
20
+ default_factory: Callable[[TK], TV] | None = None,
21
21
  ) -> TV:
22
22
  if key in self:
23
23
  return self[key]
24
- elif default: # pragma: no cover
24
+ if default: # pragma: no cover
25
25
  value = self[key] = default
26
26
  return value
27
- elif default_factory:
27
+ if default_factory:
28
28
  value = self[key] = default_factory(key)
29
29
  return value
30
- raise ValueError('Not found default and default_factory') # pragma: no cover
30
+ msg = "Not found default and default_factory"
31
+ raise ValueError(msg) # pragma: no cover
31
32
 
32
33
 
33
- __all__ = ['LiteralType']
34
+ __all__ = ["LiteralType"]