Skip to content

Commit 95daa4e

Browse files
authored
Fix exact imports for reused tree-scope models (#3042)
1 parent 8c4bfd1 commit 95daa4e

6 files changed

Lines changed: 62 additions & 0 deletions

File tree

src/datamodel_code_generator/parser/base.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1779,6 +1779,7 @@ def __reuse_model(self, models: list[DataModel], require_update_action_models: l
17791779
duplicates.append(model)
17801780
else:
17811781
inherited_model = model.create_reuse_model(cached_model_reference)
1782+
model.replace_children_in_models(models, inherited_model.reference)
17821783
if cached_model_reference.path in require_update_action_models:
17831784
add_model_path_to_list(require_update_action_models, inherited_model)
17841785
self._replace_model_in_list(models, model, inherited_model)
@@ -1875,6 +1876,7 @@ def __create_shared_module_from_duplicates( # noqa: PLR0912
18751876
models_to_remove[module].add(duplicate_model)
18761877
else:
18771878
inherited_model = duplicate_model.create_reuse_model(shared_ref)
1879+
duplicate_model.replace_children_in_models(models, inherited_model.reference)
18781880
if shared_ref.path in require_update_action_models:
18791881
add_model_path_to_list(require_update_action_models, inherited_model)
18801882
self._replace_model_in_list(models, duplicate_model, inherited_model)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# generated by datamodel-codegen:
2+
# filename: reuse_scope_tree
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# generated by datamodel-codegen:
2+
# filename: reuse_scope_tree
3+
4+
from __future__ import annotations
5+
6+
from pydantic import BaseModel
7+
8+
from .shared import SharedModel as SharedModel_1
9+
10+
11+
class SharedModel(SharedModel_1):
12+
pass
13+
14+
15+
class Model(BaseModel):
16+
data: SharedModel | None = None
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# generated by datamodel-codegen:
2+
# filename: schema_b.json
3+
4+
from __future__ import annotations
5+
6+
from pydantic import BaseModel
7+
8+
from .shared import SharedModel
9+
10+
11+
class Model(BaseModel):
12+
info: SharedModel | None = None
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# generated by datamodel-codegen:
2+
# filename: shared.py
3+
4+
from __future__ import annotations
5+
6+
from pydantic import BaseModel
7+
8+
9+
class SharedModel(BaseModel):
10+
id: int | None = None
11+
name: str | None = None

tests/main/jsonschema/test_main_jsonschema.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5711,6 +5711,25 @@ def test_main_jsonschema_reuse_scope_tree(output_dir: Path) -> None:
57115711
)
57125712

57135713

5714+
def test_main_jsonschema_reuse_scope_tree_exact_imports(output_dir: Path) -> None:
5715+
"""Test --reuse-scope=tree with --use-exact-imports keeps local subclass references."""
5716+
run_main_and_assert(
5717+
input_path=JSON_SCHEMA_DATA_PATH / "reuse_scope_tree",
5718+
output_path=output_dir,
5719+
expected_directory=EXPECTED_JSON_SCHEMA_PATH / "reuse_scope_tree_exact_imports",
5720+
input_file_type="jsonschema",
5721+
extra_args=[
5722+
"--output-model-type",
5723+
"pydantic_v2.BaseModel",
5724+
"--reuse-model",
5725+
"--reuse-scope",
5726+
"tree",
5727+
"--use-exact-imports",
5728+
"--disable-timestamp",
5729+
],
5730+
)
5731+
5732+
57145733
def test_main_jsonschema_reuse_scope_tree_enum(output_dir: Path) -> None:
57155734
"""Test --reuse-scope=tree to deduplicate enum models across multiple files."""
57165735
run_main_and_assert(

0 commit comments

Comments
 (0)