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.
Files changed (73) hide show
  1. datamodel_code_generator/__init__.py +654 -185
  2. datamodel_code_generator/__main__.py +872 -388
  3. datamodel_code_generator/arguments.py +798 -0
  4. datamodel_code_generator/cli_options.py +295 -0
  5. datamodel_code_generator/format.py +292 -54
  6. datamodel_code_generator/http.py +85 -10
  7. datamodel_code_generator/imports.py +152 -43
  8. datamodel_code_generator/model/__init__.py +138 -1
  9. datamodel_code_generator/model/base.py +531 -120
  10. datamodel_code_generator/model/dataclass.py +211 -0
  11. datamodel_code_generator/model/enum.py +133 -12
  12. datamodel_code_generator/model/imports.py +22 -0
  13. datamodel_code_generator/model/msgspec.py +462 -0
  14. datamodel_code_generator/model/pydantic/__init__.py +30 -25
  15. datamodel_code_generator/model/pydantic/base_model.py +304 -100
  16. datamodel_code_generator/model/pydantic/custom_root_type.py +11 -2
  17. datamodel_code_generator/model/pydantic/dataclass.py +15 -4
  18. datamodel_code_generator/model/pydantic/imports.py +40 -27
  19. datamodel_code_generator/model/pydantic/types.py +188 -96
  20. datamodel_code_generator/model/pydantic_v2/__init__.py +51 -0
  21. datamodel_code_generator/model/pydantic_v2/base_model.py +268 -0
  22. datamodel_code_generator/model/pydantic_v2/imports.py +15 -0
  23. datamodel_code_generator/model/pydantic_v2/root_model.py +35 -0
  24. datamodel_code_generator/model/pydantic_v2/types.py +143 -0
  25. datamodel_code_generator/model/scalar.py +124 -0
  26. datamodel_code_generator/model/template/Enum.jinja2 +15 -2
  27. datamodel_code_generator/model/template/ScalarTypeAliasAnnotation.jinja2 +6 -0
  28. datamodel_code_generator/model/template/ScalarTypeAliasType.jinja2 +6 -0
  29. datamodel_code_generator/model/template/ScalarTypeStatement.jinja2 +6 -0
  30. datamodel_code_generator/model/template/TypeAliasAnnotation.jinja2 +20 -0
  31. datamodel_code_generator/model/template/TypeAliasType.jinja2 +20 -0
  32. datamodel_code_generator/model/template/TypeStatement.jinja2 +20 -0
  33. datamodel_code_generator/model/template/TypedDict.jinja2 +5 -0
  34. datamodel_code_generator/model/template/TypedDictClass.jinja2 +25 -0
  35. datamodel_code_generator/model/template/TypedDictFunction.jinja2 +24 -0
  36. datamodel_code_generator/model/template/UnionTypeAliasAnnotation.jinja2 +10 -0
  37. datamodel_code_generator/model/template/UnionTypeAliasType.jinja2 +10 -0
  38. datamodel_code_generator/model/template/UnionTypeStatement.jinja2 +10 -0
  39. datamodel_code_generator/model/template/dataclass.jinja2 +50 -0
  40. datamodel_code_generator/model/template/msgspec.jinja2 +55 -0
  41. datamodel_code_generator/model/template/pydantic/BaseModel.jinja2 +17 -4
  42. datamodel_code_generator/model/template/pydantic/BaseModel_root.jinja2 +12 -4
  43. datamodel_code_generator/model/template/pydantic/Config.jinja2 +1 -1
  44. datamodel_code_generator/model/template/pydantic/dataclass.jinja2 +15 -2
  45. datamodel_code_generator/model/template/pydantic_v2/BaseModel.jinja2 +57 -0
  46. datamodel_code_generator/model/template/pydantic_v2/ConfigDict.jinja2 +5 -0
  47. datamodel_code_generator/model/template/pydantic_v2/RootModel.jinja2 +48 -0
  48. datamodel_code_generator/model/type_alias.py +70 -0
  49. datamodel_code_generator/model/typed_dict.py +161 -0
  50. datamodel_code_generator/model/types.py +106 -0
  51. datamodel_code_generator/model/union.py +105 -0
  52. datamodel_code_generator/parser/__init__.py +30 -12
  53. datamodel_code_generator/parser/_graph.py +67 -0
  54. datamodel_code_generator/parser/_scc.py +171 -0
  55. datamodel_code_generator/parser/base.py +2426 -380
  56. datamodel_code_generator/parser/graphql.py +652 -0
  57. datamodel_code_generator/parser/jsonschema.py +2518 -647
  58. datamodel_code_generator/parser/openapi.py +631 -222
  59. datamodel_code_generator/py.typed +0 -0
  60. datamodel_code_generator/pydantic_patch.py +28 -0
  61. datamodel_code_generator/reference.py +672 -290
  62. datamodel_code_generator/types.py +521 -145
  63. datamodel_code_generator/util.py +155 -0
  64. datamodel_code_generator/watch.py +65 -0
  65. datamodel_code_generator-0.45.0.dist-info/METADATA +301 -0
  66. datamodel_code_generator-0.45.0.dist-info/RECORD +69 -0
  67. {datamodel_code_generator-0.11.12.dist-info → datamodel_code_generator-0.45.0.dist-info}/WHEEL +1 -1
  68. datamodel_code_generator-0.45.0.dist-info/entry_points.txt +2 -0
  69. datamodel_code_generator/version.py +0 -1
  70. datamodel_code_generator-0.11.12.dist-info/METADATA +0 -440
  71. datamodel_code_generator-0.11.12.dist-info/RECORD +0 -31
  72. datamodel_code_generator-0.11.12.dist-info/entry_points.txt +0 -3
  73. {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