Skip to content

Commit eb92c8f

Browse files
committed
Add schema_features property to parsers for version detection
1 parent 7e47a7e commit eb92c8f

3 files changed

Lines changed: 49 additions & 0 deletions

File tree

src/datamodel_code_generator/parser/jsonschema.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
AllOfClassHierarchy,
2929
AllOfMergeMode,
3030
InvalidClassNameError,
31+
JsonSchemaVersion,
3132
ReadOnlyWriteOnlyModelType,
3233
SchemaParseError,
3334
YamlValue,
@@ -87,6 +88,7 @@
8788

8889
from datamodel_code_generator._types import JSONSchemaParserConfigDict
8990
from datamodel_code_generator.config import JSONSchemaParserConfig
91+
from datamodel_code_generator.parser.schema_version import JsonSchemaFeatures
9092

9193

9294
def unescape_json_pointer_segment(segment: str) -> str:
@@ -769,6 +771,17 @@ def schema_paths(self) -> list[tuple[str, list[str]]]:
769771
"""Get schema paths for definitions and defs."""
770772
return [(s, s.lstrip("#/").split("/")) for s in self.SCHEMA_PATHS]
771773

774+
@cached_property
775+
def schema_features(self) -> JsonSchemaFeatures:
776+
"""Get schema features based on detected version."""
777+
from datamodel_code_generator.parser.schema_version import ( # noqa: PLC0415
778+
JsonSchemaFeatures,
779+
detect_jsonschema_version,
780+
)
781+
782+
version = detect_jsonschema_version(self.raw_obj) if self.raw_obj else JsonSchemaVersion.Auto
783+
return JsonSchemaFeatures.from_version(version)
784+
772785
@property
773786
def root_id(self) -> str | None:
774787
"""Get the root $id from the model resolver."""

src/datamodel_code_generator/parser/openapi.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from collections import defaultdict
1212
from contextlib import nullcontext
1313
from enum import Enum
14+
from functools import cached_property
1415
from pathlib import Path
1516
from re import Pattern
1617
from typing import TYPE_CHECKING, Any, ClassVar, Optional, TypeVar, Union
@@ -26,6 +27,7 @@
2627
load_data,
2728
snooper_to_methods,
2829
)
30+
from datamodel_code_generator.enums import OpenAPIVersion
2931
from datamodel_code_generator.parser.base import get_special_path
3032
from datamodel_code_generator.parser.jsonschema import (
3133
JsonSchemaObject,
@@ -45,6 +47,7 @@
4547
from datamodel_code_generator._types import OpenAPIParserConfigDict
4648
from datamodel_code_generator.config import OpenAPIParserConfig
4749
from datamodel_code_generator.model import DataModelFieldBase
50+
from datamodel_code_generator.parser.schema_version import OpenAPISchemaFeatures
4851

4952

5053
RE_APPLICATION_JSON_PATTERN: Pattern[str] = re.compile(r"^application/.*json$")
@@ -167,6 +170,17 @@ class OpenAPIParser(JsonSchemaParser):
167170

168171
SCHEMA_PATHS: ClassVar[list[str]] = ["#/components/schemas"]
169172

173+
@cached_property
174+
def schema_features(self) -> OpenAPISchemaFeatures:
175+
"""Get schema features based on detected OpenAPI version."""
176+
from datamodel_code_generator.parser.schema_version import ( # noqa: PLC0415
177+
OpenAPISchemaFeatures,
178+
detect_openapi_version,
179+
)
180+
181+
version = detect_openapi_version(self.raw_obj) if self.raw_obj else OpenAPIVersion.Auto
182+
return OpenAPISchemaFeatures.from_openapi_version(version)
183+
170184
@classmethod
171185
def _create_default_config(cls, options: OpenAPIParserConfigDict) -> OpenAPIParserConfig:
172186
"""Create an OpenAPIParserConfig from options."""

tests/parser/test_schema_version.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,3 +399,25 @@ def test_get_data_formats_openapi() -> None:
399399
"null": {"default": Types.null},
400400
"array": {"default": Types.array},
401401
})
402+
403+
404+
def test_jsonschema_parser_schema_features_detection() -> None:
405+
"""Test that JsonSchemaParser detects schema version from $schema."""
406+
from datamodel_code_generator.parser.jsonschema import JsonSchemaParser
407+
408+
parser = JsonSchemaParser("")
409+
parser.raw_obj = {"$schema": "http://json-schema.org/draft-07/schema#"}
410+
features = parser.schema_features
411+
assert features.boolean_schemas == snapshot(True)
412+
assert features.definitions_key == snapshot("definitions")
413+
414+
415+
def test_openapi_parser_schema_features_detection() -> None:
416+
"""Test that OpenAPIParser detects OpenAPI version from openapi field."""
417+
from datamodel_code_generator.parser.openapi import OpenAPIParser
418+
419+
parser = OpenAPIParser("")
420+
parser.raw_obj = {"openapi": "3.1.0"}
421+
features = parser.schema_features
422+
assert features.nullable_keyword == snapshot(False)
423+
assert features.null_in_type_array == snapshot(True)

0 commit comments

Comments
 (0)