Fix overriden required (#1868)

* reorder required to resolve it's imports

* add tests

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: fft001 <nicolas.wicht@cognex.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
Nicolas Wicht
2024-03-06 19:04:08 +01:00
committed by GitHub
parent 365c2312df
commit e1c795e09a
8 changed files with 124 additions and 1 deletions

View File

@@ -1235,6 +1235,7 @@ class Parser(ABC):
scoped_model_resolver = ModelResolver()
self.__override_required_field(models)
self.__replace_unique_list_to_set(models)
self.__change_from_import(models, imports, scoped_model_resolver, init)
self.__extract_inherited_enum(models)
@@ -1242,7 +1243,6 @@ class Parser(ABC):
self.__reuse_model(models, require_update_action_models)
self.__collapse_root_models(models, unused_models, imports)
self.__set_default_enum_member(models)
self.__override_required_field(models)
self.__sort_models(models, imports)
self.__set_one_literal_on_default(models)
self.__apply_discriminator_type(models, imports)

View File

@@ -0,0 +1,15 @@
# generated by datamodel-codegen:
# filename: referenced.json
# timestamp: 2019-07-26T00:00:00+00:00
from __future__ import annotations
from datetime import datetime
from typing import Optional
from pydantic import BaseModel
class Model(BaseModel):
some_optional_property: Optional[str] = None
some_optional_typed_property: Optional[datetime] = None

View File

@@ -0,0 +1,14 @@
# generated by datamodel-codegen:
# filename: required.json
# timestamp: 2019-07-26T00:00:00+00:00
from __future__ import annotations
from datetime import datetime
from .referenced import Model as Model_1
class Model(Model_1.Model):
some_optional_property: str
some_optional_typed_property: datetime

View File

@@ -0,0 +1,14 @@
# generated by datamodel-codegen:
# filename: referenced.json
# timestamp: 2019-07-26T00:00:00+00:00
from __future__ import annotations
from typing import Optional
from pydantic import AwareDatetime, BaseModel
class Model(BaseModel):
some_optional_property: Optional[str] = None
some_optional_typed_property: Optional[AwareDatetime] = None

View File

@@ -0,0 +1,14 @@
# generated by datamodel-codegen:
# filename: required.json
# timestamp: 2019-07-26T00:00:00+00:00
from __future__ import annotations
from pydantic import AwareDatetime
from .referenced import Model as Model_1
class Model(Model_1.Model):
some_optional_property: str
some_optional_typed_property: AwareDatetime

View File

@@ -0,0 +1,15 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "test",
"description": "test",
"type": "object",
"properties": {
"some_optional_property": {
"type": "string"
},
"some_optional_typed_property": {
"type": "string",
"format":"date-time"
}
}
}

View File

@@ -0,0 +1,12 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "test",
"description": "test",
"type": "object",
"allOf": [
{
"$ref": "referenced.json"
}
],
"required" : ["some_optional_property", "some_optional_typed_property"]
}

View File

@@ -2202,6 +2202,45 @@ def test_space_and_special_characters_dict():
)
@pytest.mark.parametrize(
'output_model,expected_output',
[
(
'pydantic.BaseModel',
'main_require_referenced_field',
),
(
'pydantic_v2.BaseModel',
'main_require_referenced_field_pydantic_v2',
),
],
)
@freeze_time('2019-07-26')
def test_main_require_referenced_field(output_model, expected_output):
with TemporaryDirectory() as output_dir:
output_dir: Path = Path(output_dir)
return_code: Exit = main(
[
'--input',
str(JSON_SCHEMA_DATA_PATH / 'require_referenced_field/'),
'--output',
str(output_dir),
'--input-file-type',
'jsonschema',
'--output-model-type',
output_model,
]
)
assert return_code == Exit.OK
assert (output_dir / 'referenced.py').read_text() == (
EXPECTED_MAIN_PATH / expected_output / 'referenced.py'
).read_text()
assert (output_dir / 'required.py').read_text() == (
EXPECTED_MAIN_PATH / expected_output / 'required.py'
).read_text()
@freeze_time('2019-07-26')
def test_csv_file():
with TemporaryDirectory() as output_dir: