datamodel-code-generator 0.11.12__py3-none-any.whl → 0.45.0__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.
- datamodel_code_generator/__init__.py +654 -185
- datamodel_code_generator/__main__.py +872 -388
- datamodel_code_generator/arguments.py +798 -0
- datamodel_code_generator/cli_options.py +295 -0
- datamodel_code_generator/format.py +292 -54
- datamodel_code_generator/http.py +85 -10
- datamodel_code_generator/imports.py +152 -43
- datamodel_code_generator/model/__init__.py +138 -1
- datamodel_code_generator/model/base.py +531 -120
- datamodel_code_generator/model/dataclass.py +211 -0
- datamodel_code_generator/model/enum.py +133 -12
- datamodel_code_generator/model/imports.py +22 -0
- datamodel_code_generator/model/msgspec.py +462 -0
- datamodel_code_generator/model/pydantic/__init__.py +30 -25
- datamodel_code_generator/model/pydantic/base_model.py +304 -100
- datamodel_code_generator/model/pydantic/custom_root_type.py +11 -2
- datamodel_code_generator/model/pydantic/dataclass.py +15 -4
- datamodel_code_generator/model/pydantic/imports.py +40 -27
- datamodel_code_generator/model/pydantic/types.py +188 -96
- datamodel_code_generator/model/pydantic_v2/__init__.py +51 -0
- datamodel_code_generator/model/pydantic_v2/base_model.py +268 -0
- datamodel_code_generator/model/pydantic_v2/imports.py +15 -0
- datamodel_code_generator/model/pydantic_v2/root_model.py +35 -0
- datamodel_code_generator/model/pydantic_v2/types.py +143 -0
- datamodel_code_generator/model/scalar.py +124 -0
- datamodel_code_generator/model/template/Enum.jinja2 +15 -2
- datamodel_code_generator/model/template/ScalarTypeAliasAnnotation.jinja2 +6 -0
- datamodel_code_generator/model/template/ScalarTypeAliasType.jinja2 +6 -0
- datamodel_code_generator/model/template/ScalarTypeStatement.jinja2 +6 -0
- datamodel_code_generator/model/template/TypeAliasAnnotation.jinja2 +20 -0
- datamodel_code_generator/model/template/TypeAliasType.jinja2 +20 -0
- datamodel_code_generator/model/template/TypeStatement.jinja2 +20 -0
- datamodel_code_generator/model/template/TypedDict.jinja2 +5 -0
- datamodel_code_generator/model/template/TypedDictClass.jinja2 +25 -0
- datamodel_code_generator/model/template/TypedDictFunction.jinja2 +24 -0
- datamodel_code_generator/model/template/UnionTypeAliasAnnotation.jinja2 +10 -0
- datamodel_code_generator/model/template/UnionTypeAliasType.jinja2 +10 -0
- datamodel_code_generator/model/template/UnionTypeStatement.jinja2 +10 -0
- datamodel_code_generator/model/template/dataclass.jinja2 +50 -0
- datamodel_code_generator/model/template/msgspec.jinja2 +55 -0
- datamodel_code_generator/model/template/pydantic/BaseModel.jinja2 +17 -4
- datamodel_code_generator/model/template/pydantic/BaseModel_root.jinja2 +12 -4
- datamodel_code_generator/model/template/pydantic/Config.jinja2 +1 -1
- datamodel_code_generator/model/template/pydantic/dataclass.jinja2 +15 -2
- datamodel_code_generator/model/template/pydantic_v2/BaseModel.jinja2 +57 -0
- datamodel_code_generator/model/template/pydantic_v2/ConfigDict.jinja2 +5 -0
- datamodel_code_generator/model/template/pydantic_v2/RootModel.jinja2 +48 -0
- datamodel_code_generator/model/type_alias.py +70 -0
- datamodel_code_generator/model/typed_dict.py +161 -0
- datamodel_code_generator/model/types.py +106 -0
- datamodel_code_generator/model/union.py +105 -0
- datamodel_code_generator/parser/__init__.py +30 -12
- datamodel_code_generator/parser/_graph.py +67 -0
- datamodel_code_generator/parser/_scc.py +171 -0
- datamodel_code_generator/parser/base.py +2426 -380
- datamodel_code_generator/parser/graphql.py +652 -0
- datamodel_code_generator/parser/jsonschema.py +2518 -647
- datamodel_code_generator/parser/openapi.py +631 -222
- datamodel_code_generator/py.typed +0 -0
- datamodel_code_generator/pydantic_patch.py +28 -0
- datamodel_code_generator/reference.py +672 -290
- datamodel_code_generator/types.py +521 -145
- datamodel_code_generator/util.py +155 -0
- datamodel_code_generator/watch.py +65 -0
- datamodel_code_generator-0.45.0.dist-info/METADATA +301 -0
- datamodel_code_generator-0.45.0.dist-info/RECORD +69 -0
- {datamodel_code_generator-0.11.12.dist-info → datamodel_code_generator-0.45.0.dist-info}/WHEEL +1 -1
- datamodel_code_generator-0.45.0.dist-info/entry_points.txt +2 -0
- datamodel_code_generator/version.py +0 -1
- datamodel_code_generator-0.11.12.dist-info/METADATA +0 -440
- datamodel_code_generator-0.11.12.dist-info/RECORD +0 -31
- datamodel_code_generator-0.11.12.dist-info/entry_points.txt +0 -3
- {datamodel_code_generator-0.11.12.dist-info → datamodel_code_generator-0.45.0.dist-info/licenses}/LICENSE +0 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
"""CLI option metadata for documentation.
|
|
2
|
+
|
|
3
|
+
This module provides metadata for CLI options used in documentation generation.
|
|
4
|
+
The argparse definitions in arguments.py remain the source of truth for CLI behavior.
|
|
5
|
+
This module only adds documentation-specific metadata (category, since_version, etc.).
|
|
6
|
+
|
|
7
|
+
Synchronization between this module and argparse is verified by tests in
|
|
8
|
+
tests/cli_doc/test_cli_options_sync.py.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from dataclasses import dataclass
|
|
14
|
+
from enum import Enum
|
|
15
|
+
from functools import lru_cache
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class OptionCategory(str, Enum):
|
|
19
|
+
"""Categories for organizing CLI options in documentation."""
|
|
20
|
+
|
|
21
|
+
BASE = "Base Options"
|
|
22
|
+
TYPING = "Typing Customization"
|
|
23
|
+
FIELD = "Field Customization"
|
|
24
|
+
MODEL = "Model Customization"
|
|
25
|
+
TEMPLATE = "Template Customization"
|
|
26
|
+
OPENAPI = "OpenAPI-only Options"
|
|
27
|
+
GENERAL = "General Options"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass(frozen=True)
|
|
31
|
+
class CLIOptionMeta:
|
|
32
|
+
"""Documentation metadata for a CLI option.
|
|
33
|
+
|
|
34
|
+
This is NOT the argparse definition - it only contains documentation metadata.
|
|
35
|
+
The actual CLI behavior is defined in arguments.py.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
name: str
|
|
39
|
+
category: OptionCategory
|
|
40
|
+
since_version: str | None = None
|
|
41
|
+
deprecated: bool = False
|
|
42
|
+
deprecated_message: str | None = None
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
# Options with manual documentation (not auto-generated from tests)
|
|
46
|
+
# These options have hand-written docs in docs/cli-reference/manual/
|
|
47
|
+
MANUAL_DOCS: frozenset[str] = frozenset({
|
|
48
|
+
"--help",
|
|
49
|
+
"--version",
|
|
50
|
+
"--debug",
|
|
51
|
+
"--profile",
|
|
52
|
+
"--no-color",
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
# Backward compatibility alias
|
|
56
|
+
EXCLUDED_FROM_DOCS = MANUAL_DOCS
|
|
57
|
+
|
|
58
|
+
# Documentation metadata for CLI options
|
|
59
|
+
# Sync is verified by tests/cli_doc/test_cli_options_sync.py
|
|
60
|
+
CLI_OPTION_META: dict[str, CLIOptionMeta] = {
|
|
61
|
+
# ==========================================================================
|
|
62
|
+
# Base Options (Input/Output)
|
|
63
|
+
# ==========================================================================
|
|
64
|
+
"--input": CLIOptionMeta(name="--input", category=OptionCategory.BASE),
|
|
65
|
+
"--output": CLIOptionMeta(name="--output", category=OptionCategory.BASE),
|
|
66
|
+
"--url": CLIOptionMeta(name="--url", category=OptionCategory.BASE),
|
|
67
|
+
"--input-file-type": CLIOptionMeta(name="--input-file-type", category=OptionCategory.BASE),
|
|
68
|
+
"--encoding": CLIOptionMeta(name="--encoding", category=OptionCategory.BASE),
|
|
69
|
+
# ==========================================================================
|
|
70
|
+
# Model Customization
|
|
71
|
+
# ==========================================================================
|
|
72
|
+
"--output-model-type": CLIOptionMeta(name="--output-model-type", category=OptionCategory.MODEL),
|
|
73
|
+
"--target-python-version": CLIOptionMeta(name="--target-python-version", category=OptionCategory.MODEL),
|
|
74
|
+
"--base-class": CLIOptionMeta(name="--base-class", category=OptionCategory.MODEL),
|
|
75
|
+
"--class-name": CLIOptionMeta(name="--class-name", category=OptionCategory.MODEL),
|
|
76
|
+
"--frozen-dataclasses": CLIOptionMeta(name="--frozen-dataclasses", category=OptionCategory.MODEL),
|
|
77
|
+
"--keyword-only": CLIOptionMeta(name="--keyword-only", category=OptionCategory.MODEL),
|
|
78
|
+
"--reuse-model": CLIOptionMeta(name="--reuse-model", category=OptionCategory.MODEL),
|
|
79
|
+
"--reuse-scope": CLIOptionMeta(name="--reuse-scope", category=OptionCategory.MODEL),
|
|
80
|
+
"--collapse-root-models": CLIOptionMeta(name="--collapse-root-models", category=OptionCategory.MODEL),
|
|
81
|
+
"--keep-model-order": CLIOptionMeta(name="--keep-model-order", category=OptionCategory.MODEL),
|
|
82
|
+
"--allow-extra-fields": CLIOptionMeta(name="--allow-extra-fields", category=OptionCategory.MODEL),
|
|
83
|
+
"--allow-population-by-field-name": CLIOptionMeta(
|
|
84
|
+
name="--allow-population-by-field-name", category=OptionCategory.MODEL
|
|
85
|
+
),
|
|
86
|
+
"--enable-faux-immutability": CLIOptionMeta(name="--enable-faux-immutability", category=OptionCategory.MODEL),
|
|
87
|
+
"--use-subclass-enum": CLIOptionMeta(name="--use-subclass-enum", category=OptionCategory.MODEL),
|
|
88
|
+
"--force-optional": CLIOptionMeta(name="--force-optional", category=OptionCategory.MODEL),
|
|
89
|
+
"--strict-nullable": CLIOptionMeta(name="--strict-nullable", category=OptionCategory.MODEL),
|
|
90
|
+
"--use-default": CLIOptionMeta(name="--use-default", category=OptionCategory.MODEL),
|
|
91
|
+
"--use-default-kwarg": CLIOptionMeta(name="--use-default-kwarg", category=OptionCategory.MODEL),
|
|
92
|
+
"--strip-default-none": CLIOptionMeta(name="--strip-default-none", category=OptionCategory.MODEL),
|
|
93
|
+
"--dataclass-arguments": CLIOptionMeta(name="--dataclass-arguments", category=OptionCategory.MODEL),
|
|
94
|
+
"--use-frozen-field": CLIOptionMeta(name="--use-frozen-field", category=OptionCategory.MODEL),
|
|
95
|
+
"--union-mode": CLIOptionMeta(name="--union-mode", category=OptionCategory.MODEL),
|
|
96
|
+
"--parent-scoped-naming": CLIOptionMeta(name="--parent-scoped-naming", category=OptionCategory.MODEL),
|
|
97
|
+
"--use-one-literal-as-default": CLIOptionMeta(name="--use-one-literal-as-default", category=OptionCategory.MODEL),
|
|
98
|
+
"--use-serialize-as-any": CLIOptionMeta(name="--use-serialize-as-any", category=OptionCategory.MODEL),
|
|
99
|
+
"--skip-root-model": CLIOptionMeta(name="--skip-root-model", category=OptionCategory.MODEL),
|
|
100
|
+
# ==========================================================================
|
|
101
|
+
# Field Customization
|
|
102
|
+
# ==========================================================================
|
|
103
|
+
"--snake-case-field": CLIOptionMeta(name="--snake-case-field", category=OptionCategory.FIELD),
|
|
104
|
+
"--original-field-name-delimiter": CLIOptionMeta(
|
|
105
|
+
name="--original-field-name-delimiter", category=OptionCategory.FIELD
|
|
106
|
+
),
|
|
107
|
+
"--capitalize-enum-members": CLIOptionMeta(name="--capitalize-enum-members", category=OptionCategory.FIELD),
|
|
108
|
+
"--special-field-name-prefix": CLIOptionMeta(name="--special-field-name-prefix", category=OptionCategory.FIELD),
|
|
109
|
+
"--remove-special-field-name-prefix": CLIOptionMeta(
|
|
110
|
+
name="--remove-special-field-name-prefix", category=OptionCategory.FIELD
|
|
111
|
+
),
|
|
112
|
+
"--empty-enum-field-name": CLIOptionMeta(name="--empty-enum-field-name", category=OptionCategory.FIELD),
|
|
113
|
+
"--set-default-enum-member": CLIOptionMeta(name="--set-default-enum-member", category=OptionCategory.FIELD),
|
|
114
|
+
"--aliases": CLIOptionMeta(name="--aliases", category=OptionCategory.FIELD),
|
|
115
|
+
"--no-alias": CLIOptionMeta(name="--no-alias", category=OptionCategory.FIELD),
|
|
116
|
+
"--use-title-as-name": CLIOptionMeta(name="--use-title-as-name", category=OptionCategory.FIELD),
|
|
117
|
+
"--use-schema-description": CLIOptionMeta(name="--use-schema-description", category=OptionCategory.FIELD),
|
|
118
|
+
"--use-field-description": CLIOptionMeta(name="--use-field-description", category=OptionCategory.FIELD),
|
|
119
|
+
"--use-attribute-docstrings": CLIOptionMeta(name="--use-attribute-docstrings", category=OptionCategory.FIELD),
|
|
120
|
+
"--use-inline-field-description": CLIOptionMeta(
|
|
121
|
+
name="--use-inline-field-description", category=OptionCategory.FIELD
|
|
122
|
+
),
|
|
123
|
+
"--field-constraints": CLIOptionMeta(name="--field-constraints", category=OptionCategory.FIELD),
|
|
124
|
+
"--field-extra-keys": CLIOptionMeta(name="--field-extra-keys", category=OptionCategory.FIELD),
|
|
125
|
+
"--field-extra-keys-without-x-prefix": CLIOptionMeta(
|
|
126
|
+
name="--field-extra-keys-without-x-prefix", category=OptionCategory.FIELD
|
|
127
|
+
),
|
|
128
|
+
"--field-include-all-keys": CLIOptionMeta(name="--field-include-all-keys", category=OptionCategory.FIELD),
|
|
129
|
+
"--extra-fields": CLIOptionMeta(name="--extra-fields", category=OptionCategory.FIELD),
|
|
130
|
+
"--use-enum-values-in-discriminator": CLIOptionMeta(
|
|
131
|
+
name="--use-enum-values-in-discriminator", category=OptionCategory.FIELD
|
|
132
|
+
),
|
|
133
|
+
# ==========================================================================
|
|
134
|
+
# Typing Customization
|
|
135
|
+
# ==========================================================================
|
|
136
|
+
"--use-union-operator": CLIOptionMeta(name="--use-union-operator", category=OptionCategory.TYPING),
|
|
137
|
+
"--use-standard-collections": CLIOptionMeta(name="--use-standard-collections", category=OptionCategory.TYPING),
|
|
138
|
+
"--use-generic-container-types": CLIOptionMeta(
|
|
139
|
+
name="--use-generic-container-types", category=OptionCategory.TYPING
|
|
140
|
+
),
|
|
141
|
+
"--use-annotated": CLIOptionMeta(name="--use-annotated", category=OptionCategory.TYPING),
|
|
142
|
+
"--use-type-alias": CLIOptionMeta(name="--use-type-alias", category=OptionCategory.TYPING),
|
|
143
|
+
"--strict-types": CLIOptionMeta(name="--strict-types", category=OptionCategory.TYPING),
|
|
144
|
+
"--enum-field-as-literal": CLIOptionMeta(name="--enum-field-as-literal", category=OptionCategory.TYPING),
|
|
145
|
+
"--disable-future-imports": CLIOptionMeta(name="--disable-future-imports", category=OptionCategory.TYPING),
|
|
146
|
+
"--use-pendulum": CLIOptionMeta(name="--use-pendulum", category=OptionCategory.TYPING),
|
|
147
|
+
"--output-datetime-class": CLIOptionMeta(name="--output-datetime-class", category=OptionCategory.TYPING),
|
|
148
|
+
"--use-decimal-for-multiple-of": CLIOptionMeta(
|
|
149
|
+
name="--use-decimal-for-multiple-of", category=OptionCategory.TYPING
|
|
150
|
+
),
|
|
151
|
+
"--use-non-positive-negative-number-constrained-types": CLIOptionMeta(
|
|
152
|
+
name="--use-non-positive-negative-number-constrained-types", category=OptionCategory.TYPING
|
|
153
|
+
),
|
|
154
|
+
"--use-unique-items-as-set": CLIOptionMeta(name="--use-unique-items-as-set", category=OptionCategory.TYPING),
|
|
155
|
+
"--type-mappings": CLIOptionMeta(name="--type-mappings", category=OptionCategory.TYPING),
|
|
156
|
+
"--no-use-specialized-enum": CLIOptionMeta(name="--no-use-specialized-enum", category=OptionCategory.TYPING),
|
|
157
|
+
"--allof-merge-mode": CLIOptionMeta(name="--allof-merge-mode", category=OptionCategory.TYPING),
|
|
158
|
+
# ==========================================================================
|
|
159
|
+
# Template Customization
|
|
160
|
+
# ==========================================================================
|
|
161
|
+
"--wrap-string-literal": CLIOptionMeta(name="--wrap-string-literal", category=OptionCategory.TEMPLATE),
|
|
162
|
+
"--custom-template-dir": CLIOptionMeta(name="--custom-template-dir", category=OptionCategory.TEMPLATE),
|
|
163
|
+
"--extra-template-data": CLIOptionMeta(name="--extra-template-data", category=OptionCategory.TEMPLATE),
|
|
164
|
+
"--custom-file-header": CLIOptionMeta(name="--custom-file-header", category=OptionCategory.TEMPLATE),
|
|
165
|
+
"--custom-file-header-path": CLIOptionMeta(name="--custom-file-header-path", category=OptionCategory.TEMPLATE),
|
|
166
|
+
"--additional-imports": CLIOptionMeta(name="--additional-imports", category=OptionCategory.TEMPLATE),
|
|
167
|
+
"--use-double-quotes": CLIOptionMeta(name="--use-double-quotes", category=OptionCategory.TEMPLATE),
|
|
168
|
+
"--use-exact-imports": CLIOptionMeta(name="--use-exact-imports", category=OptionCategory.TEMPLATE),
|
|
169
|
+
"--disable-appending-item-suffix": CLIOptionMeta(
|
|
170
|
+
name="--disable-appending-item-suffix", category=OptionCategory.TEMPLATE
|
|
171
|
+
),
|
|
172
|
+
"--treat-dot-as-module": CLIOptionMeta(name="--treat-dot-as-module", category=OptionCategory.TEMPLATE),
|
|
173
|
+
"--disable-timestamp": CLIOptionMeta(name="--disable-timestamp", category=OptionCategory.TEMPLATE),
|
|
174
|
+
"--enable-version-header": CLIOptionMeta(name="--enable-version-header", category=OptionCategory.TEMPLATE),
|
|
175
|
+
"--enable-command-header": CLIOptionMeta(name="--enable-command-header", category=OptionCategory.TEMPLATE),
|
|
176
|
+
"--formatters": CLIOptionMeta(name="--formatters", category=OptionCategory.TEMPLATE),
|
|
177
|
+
"--custom-formatters": CLIOptionMeta(name="--custom-formatters", category=OptionCategory.TEMPLATE),
|
|
178
|
+
"--custom-formatters-kwargs": CLIOptionMeta(name="--custom-formatters-kwargs", category=OptionCategory.TEMPLATE),
|
|
179
|
+
# ==========================================================================
|
|
180
|
+
# OpenAPI-only Options
|
|
181
|
+
# ==========================================================================
|
|
182
|
+
"--openapi-scopes": CLIOptionMeta(name="--openapi-scopes", category=OptionCategory.OPENAPI),
|
|
183
|
+
"--use-operation-id-as-name": CLIOptionMeta(name="--use-operation-id-as-name", category=OptionCategory.OPENAPI),
|
|
184
|
+
"--read-only-write-only-model-type": CLIOptionMeta(
|
|
185
|
+
name="--read-only-write-only-model-type", category=OptionCategory.OPENAPI
|
|
186
|
+
),
|
|
187
|
+
"--include-path-parameters": CLIOptionMeta(name="--include-path-parameters", category=OptionCategory.OPENAPI),
|
|
188
|
+
"--validation": CLIOptionMeta(
|
|
189
|
+
name="--validation",
|
|
190
|
+
category=OptionCategory.OPENAPI,
|
|
191
|
+
deprecated=True,
|
|
192
|
+
deprecated_message="Use --field-constraints instead",
|
|
193
|
+
),
|
|
194
|
+
# ==========================================================================
|
|
195
|
+
# General Options
|
|
196
|
+
# ==========================================================================
|
|
197
|
+
"--check": CLIOptionMeta(name="--check", category=OptionCategory.GENERAL),
|
|
198
|
+
"--http-headers": CLIOptionMeta(name="--http-headers", category=OptionCategory.GENERAL),
|
|
199
|
+
"--http-ignore-tls": CLIOptionMeta(name="--http-ignore-tls", category=OptionCategory.GENERAL),
|
|
200
|
+
"--http-query-parameters": CLIOptionMeta(name="--http-query-parameters", category=OptionCategory.GENERAL),
|
|
201
|
+
"--ignore-pyproject": CLIOptionMeta(name="--ignore-pyproject", category=OptionCategory.GENERAL),
|
|
202
|
+
"--generate-cli-command": CLIOptionMeta(name="--generate-cli-command", category=OptionCategory.GENERAL),
|
|
203
|
+
"--generate-pyproject-config": CLIOptionMeta(name="--generate-pyproject-config", category=OptionCategory.GENERAL),
|
|
204
|
+
"--shared-module-name": CLIOptionMeta(name="--shared-module-name", category=OptionCategory.GENERAL),
|
|
205
|
+
"--all-exports-scope": CLIOptionMeta(name="--all-exports-scope", category=OptionCategory.GENERAL),
|
|
206
|
+
"--all-exports-collision-strategy": CLIOptionMeta(
|
|
207
|
+
name="--all-exports-collision-strategy", category=OptionCategory.GENERAL
|
|
208
|
+
),
|
|
209
|
+
"--module-split-mode": CLIOptionMeta(name="--module-split-mode", category=OptionCategory.GENERAL),
|
|
210
|
+
"--disable-warnings": CLIOptionMeta(name="--disable-warnings", category=OptionCategory.GENERAL),
|
|
211
|
+
"--watch": CLIOptionMeta(name="--watch", category=OptionCategory.GENERAL),
|
|
212
|
+
"--watch-delay": CLIOptionMeta(name="--watch-delay", category=OptionCategory.GENERAL),
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def _canonical_option_key(option: str) -> tuple[int, str]:
|
|
217
|
+
"""Key function for determining canonical option.
|
|
218
|
+
|
|
219
|
+
Canonical option is determined by:
|
|
220
|
+
1. Longest option string (--help over -h)
|
|
221
|
+
2. Lexicographically last if same length (for stability)
|
|
222
|
+
|
|
223
|
+
This ensures deterministic canonical selection.
|
|
224
|
+
"""
|
|
225
|
+
return (len(option), option)
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
@lru_cache(maxsize=1)
|
|
229
|
+
def _build_alias_map_from_argparse() -> dict[str, str]:
|
|
230
|
+
"""Build alias -> canonical map from argparse (the source of truth).
|
|
231
|
+
|
|
232
|
+
The canonical option is the longest option string for each action.
|
|
233
|
+
If multiple options have the same length, the lexicographically last one is chosen.
|
|
234
|
+
"""
|
|
235
|
+
from datamodel_code_generator.arguments import arg_parser as argument_parser # noqa: PLC0415
|
|
236
|
+
|
|
237
|
+
alias_map: dict[str, str] = {}
|
|
238
|
+
for action in argument_parser._actions: # noqa: SLF001
|
|
239
|
+
if not action.option_strings:
|
|
240
|
+
continue # pragma: no cover
|
|
241
|
+
# Canonical = longest, then lexicographically last for stability
|
|
242
|
+
canonical = max(action.option_strings, key=_canonical_option_key)
|
|
243
|
+
for opt in action.option_strings:
|
|
244
|
+
alias_map[opt] = canonical
|
|
245
|
+
return alias_map
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def get_canonical_option(option: str) -> str:
|
|
249
|
+
"""Normalize an option alias to its canonical form.
|
|
250
|
+
|
|
251
|
+
Uses argparse definitions as the source of truth.
|
|
252
|
+
|
|
253
|
+
Examples:
|
|
254
|
+
>>> get_canonical_option("-h")
|
|
255
|
+
'--help'
|
|
256
|
+
>>> get_canonical_option("--help")
|
|
257
|
+
'--help'
|
|
258
|
+
"""
|
|
259
|
+
return _build_alias_map_from_argparse().get(option, option)
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
@lru_cache(maxsize=1)
|
|
263
|
+
def get_all_canonical_options() -> frozenset[str]:
|
|
264
|
+
"""Get all canonical options from argparse."""
|
|
265
|
+
return frozenset(_build_alias_map_from_argparse().values())
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def is_manual_doc(option: str) -> bool: # pragma: no cover
|
|
269
|
+
"""Check if an option has manual documentation (not auto-generated)."""
|
|
270
|
+
canonical = get_canonical_option(option)
|
|
271
|
+
return canonical in MANUAL_DOCS
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
# Backward compatibility alias
|
|
275
|
+
def is_excluded_from_docs(option: str) -> bool: # pragma: no cover
|
|
276
|
+
"""Check if an option is excluded from auto-generated documentation.
|
|
277
|
+
|
|
278
|
+
Deprecated: Use is_manual_doc() instead.
|
|
279
|
+
"""
|
|
280
|
+
return is_manual_doc(option)
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
def get_option_meta(option: str) -> CLIOptionMeta | None: # pragma: no cover
|
|
284
|
+
"""Get documentation metadata for an option.
|
|
285
|
+
|
|
286
|
+
Always canonicalizes the option name before lookup.
|
|
287
|
+
If the option is not explicitly registered, returns a default entry
|
|
288
|
+
with General category (auto-categorization for new options).
|
|
289
|
+
"""
|
|
290
|
+
canonical = get_canonical_option(option)
|
|
291
|
+
if canonical in CLI_OPTION_META:
|
|
292
|
+
return CLI_OPTION_META[canonical]
|
|
293
|
+
if canonical in get_all_canonical_options() and canonical not in EXCLUDED_FROM_DOCS:
|
|
294
|
+
return CLIOptionMeta(name=canonical, category=OptionCategory.GENERAL)
|
|
295
|
+
return None
|