datamodel-code-generator 0.25.6__tar.gz → 0.25.7__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 (59) hide show
  1. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/PKG-INFO +1 -1
  2. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/msgspec.py +6 -2
  3. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/pydantic_v2/__init__.py +2 -0
  4. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/pydantic_v2/base_model.py +11 -0
  5. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/template/msgspec.jinja2 +4 -2
  6. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/parser/base.py +16 -3
  7. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/parser/jsonschema.py +4 -0
  8. datamodel_code_generator-0.25.7/datamodel_code_generator/version.py +1 -0
  9. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/pyproject.toml +2 -2
  10. datamodel_code_generator-0.25.6/datamodel_code_generator/version.py +0 -1
  11. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/LICENSE +0 -0
  12. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/README.md +0 -0
  13. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/__init__.py +0 -0
  14. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/__main__.py +0 -0
  15. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/arguments.py +0 -0
  16. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/format.py +0 -0
  17. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/http.py +0 -0
  18. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/imports.py +0 -0
  19. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/__init__.py +0 -0
  20. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/base.py +0 -0
  21. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/dataclass.py +0 -0
  22. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/enum.py +0 -0
  23. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/imports.py +0 -0
  24. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/pydantic/__init__.py +0 -0
  25. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/pydantic/base_model.py +0 -0
  26. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/pydantic/custom_root_type.py +0 -0
  27. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/pydantic/dataclass.py +0 -0
  28. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/pydantic/imports.py +0 -0
  29. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/pydantic/types.py +0 -0
  30. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/pydantic_v2/imports.py +0 -0
  31. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/pydantic_v2/root_model.py +0 -0
  32. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/pydantic_v2/types.py +0 -0
  33. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/rootmodel.py +0 -0
  34. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/scalar.py +0 -0
  35. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/template/Enum.jinja2 +0 -0
  36. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/template/Scalar.jinja2 +0 -0
  37. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/template/TypedDict.jinja2 +0 -0
  38. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/template/TypedDictClass.jinja2 +0 -0
  39. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/template/TypedDictFunction.jinja2 +0 -0
  40. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/template/Union.jinja2 +0 -0
  41. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/template/dataclass.jinja2 +0 -0
  42. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/template/pydantic/BaseModel.jinja2 +0 -0
  43. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/template/pydantic/BaseModel_root.jinja2 +0 -0
  44. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/template/pydantic/Config.jinja2 +0 -0
  45. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/template/pydantic/dataclass.jinja2 +0 -0
  46. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/template/pydantic_v2/BaseModel.jinja2 +0 -0
  47. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/template/pydantic_v2/ConfigDict.jinja2 +0 -0
  48. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/template/pydantic_v2/RootModel.jinja2 +0 -0
  49. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/template/root.jinja2 +0 -0
  50. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/typed_dict.py +0 -0
  51. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/types.py +0 -0
  52. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/model/union.py +0 -0
  53. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/parser/__init__.py +0 -0
  54. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/parser/graphql.py +0 -0
  55. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/parser/openapi.py +0 -0
  56. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/py.typed +0 -0
  57. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/reference.py +0 -0
  58. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/datamodel_code_generator/types.py +0 -0
  59. {datamodel_code_generator-0.25.6 → datamodel_code_generator-0.25.7}/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.25.6
3
+ Version: 0.25.7
4
4
  Summary: Datamodel Code Generator
5
5
  Home-page: https://github.com/koxudaxi/datamodel-code-generator
6
6
  License: MIT
@@ -33,7 +33,7 @@ from datamodel_code_generator.types import chain_as_tuple, get_optional_type
33
33
 
34
34
 
35
35
  def _has_field_assignment(field: DataModelFieldBase) -> bool:
36
- return bool(field.field) or not (
36
+ return not (
37
37
  field.required
38
38
  or (field.represented_default == 'None' and field.strip_default_none)
39
39
  )
@@ -48,7 +48,9 @@ def import_extender(cls: Type[DataModelFieldBaseT]) -> Type[DataModelFieldBaseT]
48
48
  @wraps(original_imports.fget) # type: ignore
49
49
  def new_imports(self: DataModelFieldBaseT) -> Tuple[Import, ...]:
50
50
  extra_imports = []
51
- if self.field:
51
+ field = self.field
52
+ # TODO: Improve field detection
53
+ if field and field.startswith('field('):
52
54
  extra_imports.append(IMPORT_MSGSPEC_FIELD)
53
55
  if self.field and 'lambda: convert' in self.field:
54
56
  extra_imports.append(IMPORT_MSGSPEC_CONVERT)
@@ -177,6 +179,8 @@ class DataModelField(DataModelFieldBase):
177
179
 
178
180
  if self.default != UNDEFINED and self.default is not None:
179
181
  data['default'] = self.default
182
+ elif not self.required:
183
+ data['default'] = None
180
184
 
181
185
  if self.required:
182
186
  data = {
@@ -18,9 +18,11 @@ class ConfigDict(_BaseModel):
18
18
  title: Optional[str] = None
19
19
  populate_by_name: Optional[bool] = None
20
20
  allow_extra_fields: Optional[bool] = None
21
+ from_attributes: Optional[bool] = None
21
22
  frozen: Optional[bool] = None
22
23
  arbitrary_types_allowed: Optional[bool] = None
23
24
  protected_namespaces: Optional[Tuple[str, ...]] = None
25
+ regex_engine: Optional[str] = None
24
26
 
25
27
 
26
28
  __all__ = [
@@ -1,3 +1,4 @@
1
+ import re
1
2
  from pathlib import Path
2
3
  from typing import (
3
4
  TYPE_CHECKING,
@@ -218,6 +219,16 @@ class BaseModel(BaseModelBase):
218
219
  config_parameters['arbitrary_types_allowed'] = True
219
220
  break
220
221
 
222
+ for field in self.fields:
223
+ # Check if a regex pattern uses lookarounds.
224
+ # Depending on the generation configuration, the pattern may end up in two different places.
225
+ pattern = (
226
+ isinstance(field.constraints, Constraints) and field.constraints.pattern
227
+ ) or (field.data_type.kwargs or {}).get('pattern')
228
+ if pattern and re.search(r'\(\?<?[=!]', pattern):
229
+ config_parameters['regex_engine'] = '"python-re"'
230
+ break
231
+
221
232
  if isinstance(self.extra_template_data.get('config'), dict):
222
233
  for key, value in self.extra_template_data['config'].items():
223
234
  config_parameters[key] = value
@@ -18,12 +18,14 @@ class {{ class_name }}:
18
18
  {%- if not field.annotated and field.field %}
19
19
  {{ field.name }}: {{ field.type_hint }} = {{ field.field }}
20
20
  {%- else %}
21
- {%- if field.annotated %}
21
+ {%- if field.annotated and not field.field %}
22
22
  {{ field.name }}: {{ field.annotated }}
23
+ {%- elif field.annotated and field.field %}
24
+ {{ field.name }}: {{ field.annotated }} = {{ field.field }}
23
25
  {%- else %}
24
26
  {{ field.name }}: {{ field.type_hint }}
25
27
  {%- endif %}
26
- {%- if not field.required or field.data_type.is_optional or field.nullable
28
+ {%- if not field.field and (not field.required or field.data_type.is_optional or field.nullable)
27
29
  %} = {{ field.represented_default }}
28
30
  {%- endif -%}
29
31
  {%- endif %}
@@ -700,6 +700,7 @@ class Parser(ABC):
700
700
  from_, import_ = full_path = relative(
701
701
  model.module_name, data_type.full_name
702
702
  )
703
+ import_ = import_.replace('-', '_')
703
704
 
704
705
  alias = scoped_model_resolver.add(full_path, import_).name
705
706
 
@@ -707,7 +708,7 @@ class Parser(ABC):
707
708
  if from_ and import_ and alias != name:
708
709
  data_type.alias = (
709
710
  alias
710
- if from_ == '.' and data_type.full_name == import_
711
+ if data_type.reference.short_name == import_
711
712
  else f'{alias}.{name}'
712
713
  )
713
714
 
@@ -778,8 +779,18 @@ class Parser(ABC):
778
779
  discriminator_model.path.split('#/')[-1]
779
780
  != path.split('#/')[-1]
780
781
  ):
781
- # TODO: support external reference
782
- continue
782
+ if (
783
+ path.startswith('#/')
784
+ or discriminator_model.path[:-1]
785
+ != path.split('/')[-1]
786
+ ):
787
+ t_path = path[str(path).find('/') + 1 :]
788
+ t_disc = discriminator_model.path[
789
+ : str(discriminator_model.path).find('#')
790
+ ].lstrip('../')
791
+ t_disc_2 = '/'.join(t_disc.split('/')[1:])
792
+ if t_path != t_disc and t_path != t_disc_2:
793
+ continue
783
794
  type_names.append(name)
784
795
  else:
785
796
  type_names = [discriminator_model.path.split('/')[-1]]
@@ -906,6 +917,7 @@ class Parser(ABC):
906
917
  name=model.name,
907
918
  path=model.reference.path + '/reuse',
908
919
  ),
920
+ custom_template_dir=model._custom_template_dir,
909
921
  )
910
922
  if cached_model_reference.path in require_update_action_models:
911
923
  require_update_action_models.append(inherited_model.path)
@@ -1249,6 +1261,7 @@ class Parser(ABC):
1249
1261
  init = True
1250
1262
  else:
1251
1263
  module = (*module[:-1], f'{module[-1]}.py')
1264
+ module = tuple(part.replace('-', '_') for part in module)
1252
1265
  else:
1253
1266
  module = ('__init__.py',)
1254
1267
 
@@ -1311,6 +1311,10 @@ class JsonSchemaParser(Parser):
1311
1311
  data_type = self.data_type_manager.get_data_type_from_full_path(
1312
1312
  obj.custom_type_path, is_custom_type=True
1313
1313
  )
1314
+ elif obj.is_array:
1315
+ data_type = self.parse_array_fields(
1316
+ name, obj, get_special_path('array', path)
1317
+ ).data_type
1314
1318
  elif obj.anyOf or obj.oneOf:
1315
1319
  reference = self.model_resolver.add(
1316
1320
  path, name, loaded=True, class_name=True
@@ -0,0 +1 @@
1
+ version: str = '0.25.7'
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "datamodel-code-generator"
3
- version = "0.25.6"
3
+ version = "0.25.7"
4
4
  description = "Datamodel Code Generator"
5
5
  authors = ["Koudai Aono <koxudaxi@gmail.com>"]
6
6
  readme = "README.md"
@@ -78,7 +78,7 @@ types-setuptools = ">=67.6.0.5,<70.0.0.0"
78
78
  pydantic = "*"
79
79
  httpx = ">=0.24.1"
80
80
  PySnooper = "*"
81
- ruff = ">=0.0.290,<0.4.2"
81
+ ruff = ">=0.0.290,<0.4.8"
82
82
  ruff-lsp = ">=0.0.39,<0.0.41"
83
83
  pre-commit = "*"
84
84
  pytest-xdist = "^3.3.1"
@@ -1 +0,0 @@
1
- version: str = '0.25.6'