datamodel-code-generator 0.28.2__py3-none-any.whl → 0.28.4__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.

@@ -22,7 +22,13 @@ from urllib.parse import ParseResult
22
22
  import yaml
23
23
 
24
24
  import datamodel_code_generator.pydantic_patch # noqa: F401
25
- from datamodel_code_generator.format import DatetimeClassType, PythonVersion, PythonVersionMin
25
+ from datamodel_code_generator.format import (
26
+ DEFAULT_FORMATTERS,
27
+ DatetimeClassType,
28
+ Formatter,
29
+ PythonVersion,
30
+ PythonVersionMin,
31
+ )
26
32
  from datamodel_code_generator.parser import DefaultPutDict, LiteralType
27
33
  from datamodel_code_generator.util import SafeLoader
28
34
 
@@ -280,6 +286,7 @@ def generate( # noqa: PLR0912, PLR0913, PLR0914, PLR0915
280
286
  output_datetime_class: DatetimeClassType | None = None,
281
287
  keyword_only: bool = False,
282
288
  no_alias: bool = False,
289
+ formatters: list[Formatter] = DEFAULT_FORMATTERS,
283
290
  ) -> None:
284
291
  remote_text_cache: DefaultPutDict[str, str] = DefaultPutDict()
285
292
  if isinstance(input_, str):
@@ -474,6 +481,7 @@ def generate( # noqa: PLR0912, PLR0913, PLR0914, PLR0915
474
481
  target_datetime_class=output_datetime_class,
475
482
  keyword_only=keyword_only,
476
483
  no_alias=no_alias,
484
+ formatters=formatters,
477
485
  **kwargs,
478
486
  )
479
487
 
@@ -36,7 +36,9 @@ from datamodel_code_generator import (
36
36
  )
37
37
  from datamodel_code_generator.arguments import DEFAULT_ENCODING, arg_parser, namespace
38
38
  from datamodel_code_generator.format import (
39
+ DEFAULT_FORMATTERS,
39
40
  DatetimeClassType,
41
+ Formatter,
40
42
  PythonVersion,
41
43
  PythonVersionMin,
42
44
  is_supported_in_black,
@@ -311,6 +313,7 @@ class Config(BaseModel):
311
313
  output_datetime_class: Optional[DatetimeClassType] = None # noqa: UP045
312
314
  keyword_only: bool = False
313
315
  no_alias: bool = False
316
+ formatters: list[Formatter] = DEFAULT_FORMATTERS
314
317
 
315
318
  def merge_args(self, args: Namespace) -> None:
316
319
  set_args = {f: getattr(args, f) for f in self.get_fields() if getattr(args, f) is not None}
@@ -519,6 +522,7 @@ def main(args: Sequence[str] | None = None) -> Exit: # noqa: PLR0911, PLR0912,
519
522
  output_datetime_class=config.output_datetime_class,
520
523
  keyword_only=config.keyword_only,
521
524
  no_alias=config.no_alias,
525
+ formatters=config.formatters,
522
526
  )
523
527
  except InvalidClassNameError as e:
524
528
  print(f"{e} You have to set `--class-name` option", file=sys.stderr) # noqa: T201
@@ -6,7 +6,7 @@ from operator import attrgetter
6
6
  from typing import TYPE_CHECKING
7
7
 
8
8
  from datamodel_code_generator import DataModelType, InputFileType, OpenAPIScope
9
- from datamodel_code_generator.format import DatetimeClassType, PythonVersion
9
+ from datamodel_code_generator.format import DatetimeClassType, Formatter, PythonVersion
10
10
  from datamodel_code_generator.model.pydantic_v2 import UnionMode
11
11
  from datamodel_code_generator.parser import LiteralType
12
12
  from datamodel_code_generator.types import StrictTypes
@@ -168,7 +168,7 @@ model_options.add_argument(
168
168
  "--treat-dot-as-module",
169
169
  help="treat dotted module names as modules",
170
170
  action="store_true",
171
- default=False,
171
+ default=None,
172
172
  )
173
173
  model_options.add_argument(
174
174
  "--use-schema-description",
@@ -186,14 +186,14 @@ model_options.add_argument(
186
186
  "--use-pendulum",
187
187
  help="use pendulum instead of datetime",
188
188
  action="store_true",
189
- default=False,
189
+ default=None,
190
190
  )
191
191
  model_options.add_argument(
192
192
  "--use-exact-imports",
193
193
  help='import exact types instead of modules, for example: "from .foo import Bar" instead of '
194
194
  '"from . import foo" with "foo.Bar"',
195
195
  action="store_true",
196
- default=False,
196
+ default=None,
197
197
  )
198
198
  model_options.add_argument(
199
199
  "--output-datetime-class",
@@ -440,6 +440,13 @@ base_options.add_argument(
440
440
  type=str,
441
441
  default=None,
442
442
  )
443
+ base_options.add_argument(
444
+ "--formatters",
445
+ help="Formatters for output (default: [black, isort])",
446
+ choices=[f.value for f in Formatter],
447
+ nargs="+",
448
+ default=None,
449
+ )
443
450
  base_options.add_argument(
444
451
  "--custom-formatters",
445
452
  help="List of modules with custom formatter (delimited list input).",
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import subprocess # noqa: S404
3
4
  from enum import Enum
4
5
  from functools import cached_property
5
6
  from importlib import import_module
@@ -89,6 +90,16 @@ def black_find_project_root(sources: Sequence[Path]) -> Path:
89
90
  return project_root
90
91
 
91
92
 
93
+ class Formatter(Enum):
94
+ BLACK = "black"
95
+ ISORT = "isort"
96
+ RUFF_CHECK = "ruff-check"
97
+ RUFF_FORMAT = "ruff-format"
98
+
99
+
100
+ DEFAULT_FORMATTERS = [Formatter.BLACK, Formatter.ISORT]
101
+
102
+
92
103
  class CodeFormatter:
93
104
  def __init__( # noqa: PLR0912, PLR0913, PLR0917
94
105
  self,
@@ -99,6 +110,8 @@ class CodeFormatter:
99
110
  known_third_party: list[str] | None = None,
100
111
  custom_formatters: list[str] | None = None,
101
112
  custom_formatters_kwargs: dict[str, Any] | None = None,
113
+ encoding: str = "utf-8",
114
+ formatters: list[Formatter] = DEFAULT_FORMATTERS,
102
115
  ) -> None:
103
116
  if not settings_path:
104
117
  settings_path = Path.cwd()
@@ -158,6 +171,8 @@ class CodeFormatter:
158
171
 
159
172
  self.custom_formatters_kwargs = custom_formatters_kwargs or {}
160
173
  self.custom_formatters = self._check_custom_formatters(custom_formatters)
174
+ self.encoding = encoding
175
+ self.formatters = formatters
161
176
 
162
177
  def _load_custom_formatter(self, custom_formatter_import: str) -> CustomCodeFormatter:
163
178
  import_ = import_module(custom_formatter_import)
@@ -184,8 +199,16 @@ class CodeFormatter:
184
199
  self,
185
200
  code: str,
186
201
  ) -> str:
187
- code = self.apply_isort(code)
188
- code = self.apply_black(code)
202
+ if Formatter.ISORT in self.formatters:
203
+ code = self.apply_isort(code)
204
+ if Formatter.BLACK in self.formatters:
205
+ code = self.apply_black(code)
206
+
207
+ if Formatter.RUFF_CHECK in self.formatters:
208
+ code = self.apply_ruff_lint(code)
209
+
210
+ if Formatter.RUFF_FORMAT in self.formatters:
211
+ code = self.apply_ruff_formatter(code)
189
212
 
190
213
  for formatter in self.custom_formatters:
191
214
  code = formatter.apply(code)
@@ -198,6 +221,24 @@ class CodeFormatter:
198
221
  mode=self.black_mode,
199
222
  )
200
223
 
224
+ def apply_ruff_lint(self, code: str) -> str:
225
+ result = subprocess.run( # noqa: S603
226
+ ("ruff", "check", "--fix", "-"),
227
+ input=code.encode(self.encoding),
228
+ capture_output=True,
229
+ check=False,
230
+ )
231
+ return result.stdout.decode(self.encoding)
232
+
233
+ def apply_ruff_formatter(self, code: str) -> str:
234
+ result = subprocess.run( # noqa: S603
235
+ ("ruff", "format", "-"),
236
+ input=code.encode(self.encoding),
237
+ capture_output=True,
238
+ check=False,
239
+ )
240
+ return result.stdout.decode(self.encoding)
241
+
201
242
  if TYPE_CHECKING:
202
243
 
203
244
  def apply_isort(self, code: str) -> str: ...
@@ -12,7 +12,14 @@ from urllib.parse import ParseResult
12
12
 
13
13
  from pydantic import BaseModel
14
14
 
15
- from datamodel_code_generator.format import CodeFormatter, DatetimeClassType, PythonVersion, PythonVersionMin
15
+ from datamodel_code_generator.format import (
16
+ DEFAULT_FORMATTERS,
17
+ CodeFormatter,
18
+ DatetimeClassType,
19
+ Formatter,
20
+ PythonVersion,
21
+ PythonVersionMin,
22
+ )
16
23
  from datamodel_code_generator.imports import (
17
24
  IMPORT_ANNOTATIONS,
18
25
  IMPORT_LITERAL,
@@ -369,6 +376,7 @@ class Parser(ABC):
369
376
  target_datetime_class: DatetimeClassType | None = DatetimeClassType.Datetime,
370
377
  keyword_only: bool = False,
371
378
  no_alias: bool = False,
379
+ formatters: list[Formatter] = DEFAULT_FORMATTERS,
372
380
  ) -> None:
373
381
  self.keyword_only = keyword_only
374
382
  self.data_type_manager: DataTypeManager = data_type_manager_type(
@@ -476,6 +484,7 @@ class Parser(ABC):
476
484
  self.custom_formatters_kwargs = custom_formatters_kwargs
477
485
  self.treat_dots_as_module = treat_dots_as_module
478
486
  self.default_field_extras: dict[str, Any] | None = default_field_extras
487
+ self.formatters: list[Formatter] = formatters
479
488
 
480
489
  @property
481
490
  def iter_source(self) -> Iterator[Source]:
@@ -1173,6 +1182,8 @@ class Parser(ABC):
1173
1182
  known_third_party=self.known_third_party,
1174
1183
  custom_formatters=self.custom_formatter,
1175
1184
  custom_formatters_kwargs=self.custom_formatters_kwargs,
1185
+ encoding=self.encoding,
1186
+ formatters=self.formatters,
1176
1187
  )
1177
1188
  else:
1178
1189
  code_formatter = None
@@ -36,7 +36,7 @@ except ImportError as exc: # pragma: no cover
36
36
  raise Exception(msg) from exc # noqa: TRY002
37
37
 
38
38
 
39
- from datamodel_code_generator.format import DatetimeClassType
39
+ from datamodel_code_generator.format import DEFAULT_FORMATTERS, DatetimeClassType, Formatter
40
40
 
41
41
  if TYPE_CHECKING:
42
42
  from collections import defaultdict
@@ -153,6 +153,7 @@ class GraphQLParser(Parser):
153
153
  target_datetime_class: DatetimeClassType = DatetimeClassType.Datetime,
154
154
  keyword_only: bool = False,
155
155
  no_alias: bool = False,
156
+ formatters: list[Formatter] = DEFAULT_FORMATTERS,
156
157
  ) -> None:
157
158
  super().__init__(
158
159
  source=source,
@@ -226,6 +227,7 @@ class GraphQLParser(Parser):
226
227
  target_datetime_class=target_datetime_class,
227
228
  keyword_only=keyword_only,
228
229
  no_alias=no_alias,
230
+ formatters=formatters,
229
231
  )
230
232
 
231
233
  self.data_model_scalar_type = data_model_scalar_type
@@ -19,7 +19,7 @@ from datamodel_code_generator import (
19
19
  load_yaml_from_path,
20
20
  snooper_to_methods,
21
21
  )
22
- from datamodel_code_generator.format import PythonVersion, PythonVersionMin
22
+ from datamodel_code_generator.format import DEFAULT_FORMATTERS, Formatter, PythonVersion, PythonVersionMin
23
23
  from datamodel_code_generator.model import DataModel, DataModelFieldBase
24
24
  from datamodel_code_generator.model import pydantic as pydantic_model
25
25
  from datamodel_code_generator.model.base import UNDEFINED, get_module_name
@@ -422,6 +422,7 @@ class JsonSchemaParser(Parser):
422
422
  target_datetime_class: DatetimeClassType = DatetimeClassType.Datetime,
423
423
  keyword_only: bool = False,
424
424
  no_alias: bool = False,
425
+ formatters: list[Formatter] = DEFAULT_FORMATTERS,
425
426
  ) -> None:
426
427
  super().__init__(
427
428
  source=source,
@@ -495,6 +496,7 @@ class JsonSchemaParser(Parser):
495
496
  target_datetime_class=target_datetime_class,
496
497
  keyword_only=keyword_only,
497
498
  no_alias=no_alias,
499
+ formatters=formatters,
498
500
  )
499
501
 
500
502
  self.remote_object_cache: DefaultPutDict[str, dict[str, Any]] = DefaultPutDict()
@@ -18,7 +18,7 @@ from datamodel_code_generator import (
18
18
  load_yaml,
19
19
  snooper_to_methods,
20
20
  )
21
- from datamodel_code_generator.format import DatetimeClassType
21
+ from datamodel_code_generator.format import DEFAULT_FORMATTERS, DatetimeClassType, Formatter
22
22
  from datamodel_code_generator.model import DataModel, DataModelFieldBase
23
23
  from datamodel_code_generator.model import pydantic as pydantic_model
24
24
  from datamodel_code_generator.parser import DefaultPutDict # noqa: TC001 # needed for type check
@@ -215,6 +215,7 @@ class OpenAPIParser(JsonSchemaParser):
215
215
  target_datetime_class: DatetimeClassType = DatetimeClassType.Datetime,
216
216
  keyword_only: bool = False,
217
217
  no_alias: bool = False,
218
+ formatters: list[Formatter] = DEFAULT_FORMATTERS,
218
219
  ) -> None:
219
220
  super().__init__(
220
221
  source=source,
@@ -288,6 +289,7 @@ class OpenAPIParser(JsonSchemaParser):
288
289
  target_datetime_class=target_datetime_class,
289
290
  keyword_only=keyword_only,
290
291
  no_alias=no_alias,
292
+ formatters=formatters,
291
293
  )
292
294
  self.open_api_scopes: list[OpenAPIScope] = openapi_scopes or [OpenAPIScope.Schemas]
293
295
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datamodel-code-generator
3
- Version: 0.28.2
3
+ Version: 0.28.4
4
4
  Summary: Datamodel Code Generator
5
5
  Project-URL: Homepage, https://github.com/koxudaxi/datamodel-code-generator
6
6
  Project-URL: Source, https://github.com/koxudaxi/datamodel-code-generator
@@ -34,12 +34,15 @@ Requires-Dist: httpx>=0.24.1; extra == 'all'
34
34
  Requires-Dist: openapi-spec-validator<0.7,>=0.2.8; extra == 'all'
35
35
  Requires-Dist: prance>=0.18.2; extra == 'all'
36
36
  Requires-Dist: pysnooper<2,>=0.4.1; extra == 'all'
37
+ Requires-Dist: ruff>=0.9.10; extra == 'all'
37
38
  Provides-Extra: debug
38
39
  Requires-Dist: pysnooper<2,>=0.4.1; extra == 'debug'
39
40
  Provides-Extra: graphql
40
41
  Requires-Dist: graphql-core>=3.2.3; extra == 'graphql'
41
42
  Provides-Extra: http
42
43
  Requires-Dist: httpx>=0.24.1; extra == 'http'
44
+ Provides-Extra: ruff
45
+ Requires-Dist: ruff>=0.9.10; extra == 'ruff'
43
46
  Provides-Extra: validation
44
47
  Requires-Dist: openapi-spec-validator<0.7,>=0.2.8; extra == 'validation'
45
48
  Requires-Dist: prance>=0.18.2; extra == 'validation'
@@ -403,6 +406,8 @@ Options:
403
406
  "datetime.date,datetime.datetime"
404
407
  --custom-formatters CUSTOM_FORMATTERS
405
408
  List of modules with custom formatter (delimited list input).
409
+ --formatters {black,isort,ruff-check,ruff-format} [{black,isort,ruff-check,ruff-format} ...]
410
+ Formatters for output (default: [black, isort])
406
411
  --http-headers HTTP_HEADER [HTTP_HEADER ...]
407
412
  Set headers in HTTP requests to the remote host. (example:
408
413
  "Authorization: Basic dXNlcjpwYXNz")
@@ -1,7 +1,7 @@
1
- datamodel_code_generator/__init__.py,sha256=Ta_7GGxfh5nqIEweL-M4WkOF6DNtX7x_v61AKzV13hI,20189
2
- datamodel_code_generator/__main__.py,sha256=itZbM4fpgEOJ-srnZx5rOJcQlFXpWT171p4kyHUjadQ,22004
3
- datamodel_code_generator/arguments.py,sha256=TRy7ubmEC5-FnZq0viCRnhw3SjdG8OzhZ2IieEUg2tY,16274
4
- datamodel_code_generator/format.py,sha256=FYAx8yTS9GHPWw_gxkxxSF2mrO4DT2_4Gic45tc4z4o,7667
1
+ datamodel_code_generator/__init__.py,sha256=MRt95aGlb7T2fEVUQkLdlAFUKmdQbmr2TliEfLInS2E,20330
2
+ datamodel_code_generator/__main__.py,sha256=xd4V0fpYpgdMDTb0QB1EFeOOblkbkk2v-wXs4Sv9K2o,22138
3
+ datamodel_code_generator/arguments.py,sha256=LQyCC7tsDdy7ie7nbQVVW_79usVumX8O5pd99ZZ51ds,16466
4
+ datamodel_code_generator/format.py,sha256=zvX0KH1uWwGnTYoVM4KhAuKZn5erjkH5eyi4t3leirw,8962
5
5
  datamodel_code_generator/http.py,sha256=LE94GC7I9D8lWIg_YAGWedfy0XNxOXTmiYKuNMTwouo,887
6
6
  datamodel_code_generator/imports.py,sha256=Nq83WbEGCegntg3WX4VbKfzAIs84alZ7IrYyNPrlUbc,5517
7
7
  datamodel_code_generator/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -48,12 +48,12 @@ datamodel_code_generator/model/template/pydantic_v2/BaseModel.jinja2,sha256=XdSC
48
48
  datamodel_code_generator/model/template/pydantic_v2/ConfigDict.jinja2,sha256=xHvBYrh__32O1xRCSl6_u5zbyYIjB8a5k8fZiTo0spY,149
49
49
  datamodel_code_generator/model/template/pydantic_v2/RootModel.jinja2,sha256=XQBlML7Hm5hN6_AExENNvVc_yxNWijcIfTTbbmegCpE,1223
50
50
  datamodel_code_generator/parser/__init__.py,sha256=3XtFcDPocaetfjmWFqj_CubqNCDipb7vXZHsYKdJXXU,851
51
- datamodel_code_generator/parser/base.py,sha256=cGguXxF7DNRPz4Nq-AmpLKZL5SKBFr-qOGNp_1e7WlY,59208
52
- datamodel_code_generator/parser/graphql.py,sha256=n3WwlzdDndNKIRZXXVUPImdfJfqreC9AUEb7fB6UwpA,22406
53
- datamodel_code_generator/parser/jsonschema.py,sha256=5qz5zfX-eWrq9XZCQheTV6-ZzCGG87rvTrbYn6qLars,69148
54
- datamodel_code_generator/parser/openapi.py,sha256=TPefYZoQ8NosYLuj7htXpTwhBQHIGzvXpmtvt0RZyBk,26993
55
- datamodel_code_generator-0.28.2.dist-info/METADATA,sha256=Rn5ls_a2VIEh_5Ip3UJzfM2QAdMeG6NOHiugmoHCYn8,24912
56
- datamodel_code_generator-0.28.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
57
- datamodel_code_generator-0.28.2.dist-info/entry_points.txt,sha256=cJVcHiEViQMANaoM5C1xR5hzmyCqH6hHHMpV8W00in8,77
58
- datamodel_code_generator-0.28.2.dist-info/licenses/LICENSE,sha256=K54Lwc6_jduycsy8oFFjQEeSSuEiqvVIjCGIXOMnuTQ,1068
59
- datamodel_code_generator-0.28.2.dist-info/RECORD,,
51
+ datamodel_code_generator/parser/base.py,sha256=hLHTxTJqA5Ffu9VYFoeKb2TbWZRewpXr8FO2rFBi7s8,59464
52
+ datamodel_code_generator/parser/graphql.py,sha256=tiD1XYRuQvrcJRnHUBRzWUgV_V00tbABcn_jy_E2DVo,22530
53
+ datamodel_code_generator/parser/jsonschema.py,sha256=PzOjbhB6RT0UGDG37lbwhhebbPnK4yVcv1_C-D2FqSo,69272
54
+ datamodel_code_generator/parser/openapi.py,sha256=6lCR9xfMrgLaP-wsby4bB0_fYkkgMXV2N-aRnPkKdoE,27117
55
+ datamodel_code_generator-0.28.4.dist-info/METADATA,sha256=L3e4L3XI47-qWfwRMATKbmY38RYCQBXd3tSI45w6V0c,25189
56
+ datamodel_code_generator-0.28.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
57
+ datamodel_code_generator-0.28.4.dist-info/entry_points.txt,sha256=cJVcHiEViQMANaoM5C1xR5hzmyCqH6hHHMpV8W00in8,77
58
+ datamodel_code_generator-0.28.4.dist-info/licenses/LICENSE,sha256=K54Lwc6_jduycsy8oFFjQEeSSuEiqvVIjCGIXOMnuTQ,1068
59
+ datamodel_code_generator-0.28.4.dist-info/RECORD,,