|
41 | 41 | from datamodel_code_generator.model.pydantic_base import DataModelField as PydanticBaseDataModelField |
42 | 42 | from datamodel_code_generator.model.pydantic_v2 import BaseModel |
43 | 43 | from datamodel_code_generator.model.pydantic_v2 import DataModelField as PydanticV2DataModelField |
| 44 | +from datamodel_code_generator.model.pydantic_v2.base_model import ( |
| 45 | + _strip_legacy_pydantic_extra_post_class_assignment, |
| 46 | +) |
44 | 47 | from datamodel_code_generator.model.pydantic_v2.imports import IMPORT_FIELD, IMPORT_MISSING |
45 | 48 | from datamodel_code_generator.reference import Reference |
46 | 49 | from datamodel_code_generator.types import ANY, NONE, DataType, Types |
@@ -261,9 +264,34 @@ def test_pydantic_v2_legacy_extra_template_supports_relative_custom_path() -> No |
261 | 264 | rendered = model.render() |
262 | 265 |
|
263 | 266 | assert "'__pydantic_extra__': Dict[str, str]," in rendered |
| 267 | + assert "Model.__annotations__['__pydantic_extra__']" not in rendered |
| 268 | + assert "Model.model_rebuild(force=True)" not in rendered |
264 | 269 | assert "locals()" not in rendered |
265 | 270 |
|
266 | 271 |
|
| 272 | +def test_strip_legacy_pydantic_extra_post_class_assignment_is_model_scoped() -> None: |
| 273 | + """Strip only the target model's old assignment while preserving rebuilds and helpers.""" |
| 274 | + rendered = ( |
| 275 | + "Helper.__annotations__['__pydantic_extra__'] = Dict[str, int]\n" |
| 276 | + "Helper.model_rebuild(force=True)\n" |
| 277 | + 'Model . __annotations__ [ "__pydantic_extra__" ] = Dict[str, int]\r\n' |
| 278 | + "\r\n" |
| 279 | + "Model . model_rebuild ( force = True ) # legacy\r\n" |
| 280 | + "Model.model_rebuild()\n" |
| 281 | + ) |
| 282 | + |
| 283 | + assert _strip_legacy_pydantic_extra_post_class_assignment(rendered, "Missing") == rendered |
| 284 | + assert _strip_legacy_pydantic_extra_post_class_assignment(rendered, "Model") == ( |
| 285 | + "Helper.__annotations__['__pydantic_extra__'] = Dict[str, int]\n" |
| 286 | + "Helper.model_rebuild(force=True)\n" |
| 287 | + "Model.model_rebuild()\n" |
| 288 | + ) |
| 289 | + assert not _strip_legacy_pydantic_extra_post_class_assignment( |
| 290 | + "℘Model.__annotations__['__pydantic_extra__'] = Dict[str, int]\n℘Model.model_rebuild(force=True)\n", |
| 291 | + "℘Model", |
| 292 | + ) |
| 293 | + |
| 294 | + |
267 | 295 | def test_pydantic_v2_missing_sentinel_default_keeps_explicit_default() -> None: |
268 | 296 | """Test explicit defaults are not replaced by the MISSING sentinel.""" |
269 | 297 | field = PydanticV2DataModelField( |
|
0 commit comments