datamodel-code-generator 0.21.1__tar.gz → 0.21.3__tar.gz

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 (52) hide show
  1. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/PKG-INFO +2 -2
  2. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/README.md +1 -1
  3. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/__init__.py +3 -1
  4. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/__init__.py +1 -1
  5. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/base.py +18 -5
  6. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/dataclass.py +1 -1
  7. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/pydantic/__init__.py +1 -0
  8. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/pydantic/types.py +9 -1
  9. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/pydantic_v2/__init__.py +12 -2
  10. datamodel_code_generator-0.21.3/datamodel_code_generator/model/pydantic_v2/types.py +30 -0
  11. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/typed_dict.py +5 -1
  12. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/parser/base.py +17 -1
  13. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/parser/jsonschema.py +2 -0
  14. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/parser/openapi.py +7 -1
  15. datamodel_code_generator-0.21.3/datamodel_code_generator/version.py +1 -0
  16. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/pyproject.toml +1 -1
  17. datamodel_code_generator-0.21.1/datamodel_code_generator/model/pydantic_v2/types.py +0 -9
  18. datamodel_code_generator-0.21.1/datamodel_code_generator/version.py +0 -1
  19. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/LICENSE +0 -0
  20. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/__main__.py +0 -0
  21. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/format.py +0 -0
  22. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/http.py +0 -0
  23. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/imports.py +0 -0
  24. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/enum.py +0 -0
  25. /datamodel_code_generator-0.21.1/datamodel_code_generator/model/improts.py → /datamodel_code_generator-0.21.3/datamodel_code_generator/model/imports.py +0 -0
  26. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/pydantic/base_model.py +0 -0
  27. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/pydantic/custom_root_type.py +0 -0
  28. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/pydantic/dataclass.py +0 -0
  29. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/pydantic/imports.py +0 -0
  30. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/pydantic_v2/base_model.py +0 -0
  31. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/pydantic_v2/imports.py +0 -0
  32. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/pydantic_v2/root_model.py +0 -0
  33. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/rootmodel.py +0 -0
  34. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/template/Enum.jinja2 +0 -0
  35. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/template/TypedDict.jinja2 +0 -0
  36. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/template/TypedDictClass.jinja2 +0 -0
  37. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/template/TypedDictFunction.jinja2 +0 -0
  38. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/template/dataclass.jinja2 +0 -0
  39. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/template/pydantic/BaseModel.jinja2 +0 -0
  40. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/template/pydantic/BaseModel_root.jinja2 +0 -0
  41. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/template/pydantic/Config.jinja2 +0 -0
  42. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/template/pydantic/dataclass.jinja2 +0 -0
  43. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/template/pydantic_v2/BaseModel.jinja2 +0 -0
  44. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/template/pydantic_v2/ConfigDict.jinja2 +0 -0
  45. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/template/pydantic_v2/RootModel.jinja2 +0 -0
  46. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/template/root.jinja2 +0 -0
  47. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/model/types.py +0 -0
  48. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/parser/__init__.py +0 -0
  49. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/py.typed +0 -0
  50. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/reference.py +0 -0
  51. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/types.py +0 -0
  52. {datamodel_code_generator-0.21.1 → datamodel_code_generator-0.21.3}/datamodel_code_generator/util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: datamodel-code-generator
3
- Version: 0.21.1
3
+ Version: 0.21.3
4
4
  Summary: Datamodel Code Generator
5
5
  Home-page: https://github.com/koxudaxi/datamodel-code-generator
6
6
  License: MIT
@@ -321,7 +321,7 @@ $ docker pull koxudaxi/datamodel-code-generator
321
321
  ```
322
322
 
323
323
  ## Advanced Uses
324
- You can genearte models from a URL.
324
+ You can generate models from a URL.
325
325
  ```bash
326
326
  $ datamodel-codegen --url https://<INPUT FILE URL> --output model.py
327
327
  ```
@@ -283,7 +283,7 @@ $ docker pull koxudaxi/datamodel-code-generator
283
283
  ```
284
284
 
285
285
  ## Advanced Uses
286
- You can genearte models from a URL.
286
+ You can generate models from a URL.
287
287
  ```bash
288
288
  $ datamodel-codegen --url https://<INPUT FILE URL> --output model.py
289
289
  ```
@@ -224,7 +224,8 @@ def generate(
224
224
  output: Optional[Path] = None,
225
225
  output_model_type: DataModelType = DataModelType.PydanticBaseModel,
226
226
  target_python_version: PythonVersion = PythonVersion.PY_37,
227
- base_class: str = DEFAULT_BASE_CLASS,
227
+ base_class: str = '',
228
+ additional_imports: Optional[List[str]] = None,
228
229
  custom_template_dir: Optional[Path] = None,
229
230
  extra_template_data: Optional[DefaultDict[str, Dict[str, Any]]] = None,
230
231
  validation: bool = False,
@@ -369,6 +370,7 @@ def generate(
369
370
  data_model_field_type=data_model_types.field_model,
370
371
  data_type_manager_type=data_model_types.data_type_manager,
371
372
  base_class=base_class,
373
+ additional_imports=additional_imports,
372
374
  custom_template_dir=custom_template_dir,
373
375
  extra_template_data=extra_template_data,
374
376
  target_python_version=target_python_version,
@@ -38,7 +38,7 @@ def get_data_model_types(
38
38
  root_model=pydantic_v2.RootModel,
39
39
  field_model=pydantic_v2.DataModelField,
40
40
  data_type_manager=pydantic_v2.DataTypeManager,
41
- dump_resolve_reference_action=pydantic.dump_resolve_reference_action,
41
+ dump_resolve_reference_action=pydantic_v2.dump_resolve_reference_action,
42
42
  )
43
43
  elif data_model_type == DataModelType.DataclassesDataclass:
44
44
  return DataModelSet(
@@ -114,7 +114,10 @@ class DataModelFieldBase(_BaseModel):
114
114
  return type_hint
115
115
  elif self.required:
116
116
  return type_hint
117
- return get_optional_type(type_hint, self.data_type.use_union_operator)
117
+ elif self.fall_back_to_nullable:
118
+ return get_optional_type(type_hint, self.data_type.use_union_operator)
119
+ else:
120
+ return type_hint
118
121
 
119
122
  @property
120
123
  def imports(self) -> Tuple[Import, ...]:
@@ -128,10 +131,16 @@ class DataModelFieldBase(_BaseModel):
128
131
  )
129
132
  ]
130
133
 
131
- if (
132
- self.nullable or (self.nullable is None and not self.required)
133
- ) and not self.data_type.use_union_operator:
134
- imports.append((IMPORT_OPTIONAL,))
134
+ if self.fall_back_to_nullable:
135
+ if (
136
+ self.nullable or (self.nullable is None and not self.required)
137
+ ) and not self.data_type.use_union_operator:
138
+ imports.append((IMPORT_OPTIONAL,))
139
+ else:
140
+ if (
141
+ self.nullable and not self.data_type.use_union_operator
142
+ ): # pragma: no cover
143
+ imports.append((IMPORT_OPTIONAL,))
135
144
  if self.use_annotated:
136
145
  import_annotated = (
137
146
  IMPORT_ANNOTATED
@@ -174,6 +183,10 @@ class DataModelFieldBase(_BaseModel):
174
183
  def has_default_factory(self) -> bool:
175
184
  return 'default_factory' in self.extras
176
185
 
186
+ @property
187
+ def fall_back_to_nullable(self) -> bool:
188
+ return True
189
+
177
190
 
178
191
  @lru_cache()
179
192
  def get_template(template_file_path: Path) -> Template:
@@ -6,7 +6,7 @@ from typing import Any, ClassVar, DefaultDict, Dict, List, Optional, Set, Tuple
6
6
  from datamodel_code_generator.imports import Import
7
7
  from datamodel_code_generator.model import DataModel, DataModelFieldBase
8
8
  from datamodel_code_generator.model.base import UNDEFINED
9
- from datamodel_code_generator.model.improts import IMPORT_DATACLASS, IMPORT_FIELD
9
+ from datamodel_code_generator.model.imports import IMPORT_DATACLASS, IMPORT_FIELD
10
10
  from datamodel_code_generator.model.pydantic.base_model import Constraints
11
11
  from datamodel_code_generator.reference import Reference
12
12
  from datamodel_code_generator.types import chain_as_tuple
@@ -23,6 +23,7 @@ class Config(_BaseModel):
23
23
  allow_extra_fields: Optional[bool] = None
24
24
  allow_mutation: Optional[bool] = None
25
25
  arbitrary_types_allowed: Optional[bool] = None
26
+ orm_mode: Optional[bool] = None
26
27
 
27
28
 
28
29
  # def get_validator_template() -> Template:
@@ -155,7 +155,7 @@ class DataTypeManager(_DataTypeManager):
155
155
  use_union_operator,
156
156
  )
157
157
 
158
- self.type_map: Dict[Types, DataType] = type_map_factory(
158
+ self.type_map: Dict[Types, DataType] = self.type_map_factory(
159
159
  self.data_type,
160
160
  strict_types=self.strict_types,
161
161
  pattern_key=self.PATTERN_KEY,
@@ -177,6 +177,14 @@ class DataTypeManager(_DataTypeManager):
177
177
  'pattern': self.PATTERN_KEY,
178
178
  }
179
179
 
180
+ def type_map_factory(
181
+ self,
182
+ data_type: Type[DataType],
183
+ strict_types: Sequence[StrictTypes],
184
+ pattern_key: str,
185
+ ) -> Dict[Types, DataType]:
186
+ return type_map_factory(data_type, strict_types, pattern_key)
187
+
180
188
  def transform_kwargs(
181
189
  self, kwargs: Dict[str, Any], filter_: Set[str]
182
190
  ) -> Dict[str, str]:
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Optional
3
+ from typing import Iterable, Optional
4
4
 
5
5
  from pydantic import BaseModel as _BaseModel
6
6
 
@@ -9,6 +9,10 @@ from .root_model import RootModel
9
9
  from .types import DataTypeManager
10
10
 
11
11
 
12
+ def dump_resolve_reference_action(class_names: Iterable[str]) -> str:
13
+ return '\n'.join(f'{class_name}.model_rebuild()' for class_name in class_names)
14
+
15
+
12
16
  class ConfigDict(_BaseModel):
13
17
  extra: Optional[str] = None
14
18
  title: Optional[str] = None
@@ -18,4 +22,10 @@ class ConfigDict(_BaseModel):
18
22
  arbitrary_types_allowed: Optional[bool] = None
19
23
 
20
24
 
21
- __all__ = ['BaseModel', 'DataModelField', 'RootModel', 'DataTypeManager']
25
+ __all__ = [
26
+ 'BaseModel',
27
+ 'DataModelField',
28
+ 'RootModel',
29
+ 'dump_resolve_reference_action',
30
+ 'DataTypeManager',
31
+ ]
@@ -0,0 +1,30 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import ClassVar, Dict, Sequence, Type
4
+
5
+ from datamodel_code_generator.model.pydantic import DataTypeManager as _DataTypeManager
6
+ from datamodel_code_generator.model.pydantic.imports import IMPORT_CONSTR
7
+ from datamodel_code_generator.types import DataType, StrictTypes, Types
8
+
9
+
10
+ class DataTypeManager(_DataTypeManager):
11
+ PATTERN_KEY: ClassVar[str] = 'pattern'
12
+
13
+ def type_map_factory(
14
+ self,
15
+ data_type: Type[DataType],
16
+ strict_types: Sequence[StrictTypes],
17
+ pattern_key: str,
18
+ ) -> Dict[Types, DataType]:
19
+ return {
20
+ **super().type_map_factory(data_type, strict_types, pattern_key),
21
+ Types.hostname: self.data_type.from_import(
22
+ IMPORT_CONSTR,
23
+ strict=StrictTypes.str in strict_types,
24
+ # https://github.com/horejsek/python-fastjsonschema/blob/61c6997a8348b8df9b22e029ca2ba35ef441fbb8/fastjsonschema/draft04.py#L31
25
+ kwargs={
26
+ pattern_key: r"r'^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9])$'",
27
+ **({'strict': True} if StrictTypes.str in strict_types else {}),
28
+ },
29
+ ),
30
+ }
@@ -16,7 +16,7 @@ from typing import (
16
16
  from datamodel_code_generator.imports import Import
17
17
  from datamodel_code_generator.model import DataModel, DataModelFieldBase
18
18
  from datamodel_code_generator.model.base import UNDEFINED
19
- from datamodel_code_generator.model.improts import (
19
+ from datamodel_code_generator.model.imports import (
20
20
  IMPORT_NOT_REQUIRED,
21
21
  IMPORT_NOT_REQUIRED_BACKPORT,
22
22
  IMPORT_TYPED_DICT,
@@ -139,6 +139,10 @@ class DataModelField(DataModelFieldBase):
139
139
  def _not_required(self) -> bool:
140
140
  return not self.required and isinstance(self.parent, TypedDict)
141
141
 
142
+ @property
143
+ def fall_back_to_nullable(self) -> bool:
144
+ return not self._not_required
145
+
142
146
  @property
143
147
  def imports(self) -> Tuple[Import, ...]:
144
148
  return (
@@ -314,6 +314,7 @@ class Parser(ABC):
314
314
  data_type_manager_type: Type[DataTypeManager] = pydantic_model.DataTypeManager,
315
315
  data_model_field_type: Type[DataModelFieldBase] = pydantic_model.DataModelField,
316
316
  base_class: Optional[str] = None,
317
+ additional_imports: Optional[List[str]] = None,
317
318
  custom_template_dir: Optional[Path] = None,
318
319
  extra_template_data: Optional[DefaultDict[str, Dict[str, Any]]] = None,
319
320
  target_python_version: PythonVersion = PythonVersion.PY_37,
@@ -380,7 +381,10 @@ class Parser(ABC):
380
381
  self.data_model_type: Type[DataModel] = data_model_type
381
382
  self.data_model_root_type: Type[DataModel] = data_model_root_type
382
383
  self.data_model_field_type: Type[DataModelFieldBase] = data_model_field_type
384
+
383
385
  self.imports: Imports = Imports()
386
+ self._append_additional_imports(additional_imports=additional_imports)
387
+
384
388
  self.base_class: Optional[str] = base_class
385
389
  self.target_python_version: PythonVersion = target_python_version
386
390
  self.results: List[DataModel] = []
@@ -504,6 +508,16 @@ class Parser(ABC):
504
508
  ),
505
509
  )
506
510
 
511
+ def _append_additional_imports(
512
+ self, additional_imports: Optional[List[str]]
513
+ ) -> None:
514
+ if additional_imports is None:
515
+ additional_imports = []
516
+
517
+ for additional_import_string in additional_imports:
518
+ new_import = Import.from_full_path(additional_import_string)
519
+ self.imports.append(new_import)
520
+
507
521
  def _get_text_from_url(self, url: str) -> str:
508
522
  from datamodel_code_generator.http import get_body
509
523
 
@@ -854,7 +868,9 @@ class Parser(ABC):
854
868
  data_type.remove_reference()
855
869
 
856
870
  root_type_model.reference.children = [
857
- c for c in root_type_model.reference.children if c.parent
871
+ c
872
+ for c in root_type_model.reference.children
873
+ if getattr(c, 'parent', None)
858
874
  ]
859
875
 
860
876
  if not root_type_model.reference.children:
@@ -371,6 +371,7 @@ class JsonSchemaParser(Parser):
371
371
  data_type_manager_type: Type[DataTypeManager] = pydantic_model.DataTypeManager,
372
372
  data_model_field_type: Type[DataModelFieldBase] = pydantic_model.DataModelField,
373
373
  base_class: Optional[str] = None,
374
+ additional_imports: Optional[List[str]] = None,
374
375
  custom_template_dir: Optional[Path] = None,
375
376
  extra_template_data: Optional[DefaultDict[str, Dict[str, Any]]] = None,
376
377
  target_python_version: PythonVersion = PythonVersion.PY_37,
@@ -432,6 +433,7 @@ class JsonSchemaParser(Parser):
432
433
  data_type_manager_type=data_type_manager_type,
433
434
  data_model_field_type=data_model_field_type,
434
435
  base_class=base_class,
436
+ additional_imports=additional_imports,
435
437
  custom_template_dir=custom_template_dir,
436
438
  extra_template_data=extra_template_data,
437
439
  target_python_version=target_python_version,
@@ -161,6 +161,7 @@ class OpenAPIParser(JsonSchemaParser):
161
161
  data_type_manager_type: Type[DataTypeManager] = pydantic_model.DataTypeManager,
162
162
  data_model_field_type: Type[DataModelFieldBase] = pydantic_model.DataModelField,
163
163
  base_class: Optional[str] = None,
164
+ additional_imports: Optional[List[str]] = None,
164
165
  custom_template_dir: Optional[Path] = None,
165
166
  extra_template_data: Optional[DefaultDict[str, Dict[str, Any]]] = None,
166
167
  target_python_version: PythonVersion = PythonVersion.PY_37,
@@ -223,6 +224,7 @@ class OpenAPIParser(JsonSchemaParser):
223
224
  data_type_manager_type=data_type_manager_type,
224
225
  data_model_field_type=data_model_field_type,
225
226
  base_class=base_class,
227
+ additional_imports=additional_imports,
226
228
  custom_template_dir=custom_template_dir,
227
229
  extra_template_data=extra_template_data,
228
230
  target_python_version=target_python_version,
@@ -477,7 +479,11 @@ class OpenAPIParser(JsonSchemaParser):
477
479
 
478
480
  if OpenAPIScope.Parameters in self.open_api_scopes and fields:
479
481
  self.results.append(
480
- self.data_model_type(fields=fields, reference=reference)
482
+ self.data_model_type(
483
+ fields=fields,
484
+ reference=reference,
485
+ custom_base_class=self.base_class,
486
+ )
481
487
  )
482
488
 
483
489
  def parse_operation(
@@ -0,0 +1 @@
1
+ version: str = '0.21.3'
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "datamodel-code-generator"
3
- version = "0.21.1"
3
+ version = "0.21.3"
4
4
  description = "Datamodel Code Generator"
5
5
  authors = ["Koudai Aono <koxudaxi@gmail.com>"]
6
6
  readme = "README.md"
@@ -1,9 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import ClassVar
4
-
5
- from datamodel_code_generator.model.pydantic import DataTypeManager as _DataTypeManager
6
-
7
-
8
- class DataTypeManager(_DataTypeManager):
9
- PATTERN_KEY: ClassVar[str] = 'pattern'
@@ -1 +0,0 @@
1
- version: str = '0.21.1'