datamodel-code-generator 0.27.1__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.
- datamodel_code_generator/__init__.py +159 -190
- datamodel_code_generator/__main__.py +151 -173
- datamodel_code_generator/arguments.py +227 -230
- datamodel_code_generator/format.py +77 -99
- datamodel_code_generator/http.py +9 -10
- datamodel_code_generator/imports.py +57 -64
- datamodel_code_generator/model/__init__.py +26 -31
- datamodel_code_generator/model/base.py +94 -127
- datamodel_code_generator/model/dataclass.py +58 -59
- datamodel_code_generator/model/enum.py +34 -30
- datamodel_code_generator/model/imports.py +13 -11
- datamodel_code_generator/model/msgspec.py +112 -126
- datamodel_code_generator/model/pydantic/__init__.py +14 -27
- datamodel_code_generator/model/pydantic/base_model.py +120 -139
- datamodel_code_generator/model/pydantic/custom_root_type.py +2 -2
- datamodel_code_generator/model/pydantic/dataclass.py +6 -4
- datamodel_code_generator/model/pydantic/imports.py +35 -33
- datamodel_code_generator/model/pydantic/types.py +86 -117
- datamodel_code_generator/model/pydantic_v2/__init__.py +17 -17
- datamodel_code_generator/model/pydantic_v2/base_model.py +118 -119
- datamodel_code_generator/model/pydantic_v2/imports.py +5 -3
- datamodel_code_generator/model/pydantic_v2/root_model.py +6 -6
- datamodel_code_generator/model/pydantic_v2/types.py +8 -7
- datamodel_code_generator/model/rootmodel.py +1 -1
- datamodel_code_generator/model/scalar.py +33 -32
- datamodel_code_generator/model/typed_dict.py +42 -41
- datamodel_code_generator/model/types.py +19 -17
- datamodel_code_generator/model/union.py +21 -17
- datamodel_code_generator/parser/__init__.py +12 -11
- datamodel_code_generator/parser/base.py +320 -492
- datamodel_code_generator/parser/graphql.py +80 -111
- datamodel_code_generator/parser/jsonschema.py +422 -580
- datamodel_code_generator/parser/openapi.py +175 -204
- datamodel_code_generator/pydantic_patch.py +8 -9
- datamodel_code_generator/reference.py +192 -274
- datamodel_code_generator/types.py +147 -182
- datamodel_code_generator/util.py +22 -26
- {datamodel_code_generator-0.27.1.dist-info → datamodel_code_generator-0.27.3.dist-info}/METADATA +12 -11
- datamodel_code_generator-0.27.3.dist-info/RECORD +59 -0
- datamodel_code_generator-0.27.1.dist-info/RECORD +0 -59
- {datamodel_code_generator-0.27.1.dist-info → datamodel_code_generator-0.27.3.dist-info}/WHEEL +0 -0
- {datamodel_code_generator-0.27.1.dist-info → datamodel_code_generator-0.27.3.dist-info}/entry_points.txt +0 -0
- {datamodel_code_generator-0.27.1.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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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] =
|
|
48
|
-
BASE_CLASS: ClassVar[str] =
|
|
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:
|
|
56
|
-
decorators:
|
|
57
|
-
base_classes:
|
|
58
|
-
custom_base_class:
|
|
59
|
-
custom_template_dir:
|
|
60
|
-
extra_template_data:
|
|
61
|
-
methods:
|
|
62
|
-
path:
|
|
63
|
-
description:
|
|
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:
|
|
103
|
-
|
|
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] =
|
|
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
|
|
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
|
|
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) ->
|
|
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
|
|
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:
|
|
14
|
-
data_type_int = data_type(type=
|
|
15
|
-
data_type_float = data_type(type=
|
|
16
|
-
data_type_str = data_type(type=
|
|
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=
|
|
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=
|
|
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=
|
|
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:
|
|
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:
|
|
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
|
|
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
|
-
|
|
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] =
|
|
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:
|
|
25
|
-
decorators:
|
|
26
|
-
base_classes:
|
|
27
|
-
custom_base_class:
|
|
28
|
-
custom_template_dir:
|
|
29
|
-
extra_template_data:
|
|
30
|
-
methods:
|
|
31
|
-
path:
|
|
32
|
-
description:
|
|
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,
|
|
4
|
+
from typing import Callable, Dict, TypeVar
|
|
5
5
|
|
|
6
|
-
TK = TypeVar(
|
|
7
|
-
TV = TypeVar(
|
|
6
|
+
TK = TypeVar("TK")
|
|
7
|
+
TV = TypeVar("TV")
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class LiteralType(Enum):
|
|
11
|
-
All =
|
|
12
|
-
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:
|
|
20
|
-
default_factory:
|
|
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
|
-
|
|
24
|
+
if default: # pragma: no cover
|
|
25
25
|
value = self[key] = default
|
|
26
26
|
return value
|
|
27
|
-
|
|
27
|
+
if default_factory:
|
|
28
28
|
value = self[key] = default_factory(key)
|
|
29
29
|
return value
|
|
30
|
-
|
|
30
|
+
msg = "Not found default and default_factory"
|
|
31
|
+
raise ValueError(msg) # pragma: no cover
|
|
31
32
|
|
|
32
33
|
|
|
33
|
-
__all__ = [
|
|
34
|
+
__all__ = ["LiteralType"]
|