Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions docs/llms-full.txt
Original file line number Diff line number Diff line change
Expand Up @@ -28917,6 +28917,11 @@ pip install 'datamodel-code-generator[http]'

When the `output` parameter is omitted (or set to `None`), `generate()` returns the generated code directly as a string:

!!! note
`GenerateConfig` is only available in Pydantic v2 environments.
For Pydantic v1, use `from datamodel_code_generator.config import GenerateConfig`
and call `update_forward_refs()` before use.

```python
from datamodel_code_generator import InputFileType, generate, GenerateConfig, DataModelType

Expand Down
5 changes: 5 additions & 0 deletions docs/using_as_module.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ pip install 'datamodel-code-generator[http]'

When the `output` parameter is omitted (or set to `None`), `generate()` returns the generated code directly as a string:

!!! note
`GenerateConfig` is only available in Pydantic v2 environments.
For Pydantic v1, use `from datamodel_code_generator.config import GenerateConfig`
and call `update_forward_refs()` before use.

```python
from datamodel_code_generator import InputFileType, generate, GenerateConfig, DataModelType

Expand Down
11 changes: 11 additions & 0 deletions src/datamodel_code_generator/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -971,13 +971,21 @@ def infer_input_type(text: str) -> InputFileType:
"detect_jsonschema_version": "datamodel_code_generator.parser.schema_version",
"detect_openapi_version": "datamodel_code_generator.parser.schema_version",
"generate_dynamic_models": "datamodel_code_generator.dynamic",
"GenerateConfig": "datamodel_code_generator.config",
}


def __getattr__(name: str) -> Any:
if name in _LAZY_IMPORTS:
import importlib # noqa: PLC0415

if name == "GenerateConfig" and not is_pydantic_v2(): # pragma: no cover
msg = (
f"'{name}' is only available in Pydantic v2 environments. "
"Use 'from datamodel_code_generator.config import GenerateConfig' instead."
)
raise ImportError(msg)

module = importlib.import_module(_LAZY_IMPORTS[name])
return getattr(module, name)
msg = f"module {__name__!r} has no attribute {name!r}"
Expand Down Expand Up @@ -1025,3 +1033,6 @@ def __getattr__(name: str) -> Any:
"generate",
"generate_dynamic_models", # noqa: F822
]

if is_pydantic_v2(): # pragma: no cover
__all__ += ["GenerateConfig"]
33 changes: 33 additions & 0 deletions tests/main/test_main_general.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import pytest
from inline_snapshot import snapshot

import datamodel_code_generator
from datamodel_code_generator import (
AllExportsScope,
DataModelType,
Expand All @@ -28,6 +29,7 @@
from datamodel_code_generator.format import CodeFormatter, PythonVersion
from datamodel_code_generator.model.pydantic_v2 import UnionMode
from datamodel_code_generator.parser.openapi import OpenAPIParser
from datamodel_code_generator.util import is_pydantic_v2
from tests.conftest import assert_output, create_assert_file_content, freeze_time
from tests.main.conftest import (
DATA_PATH,
Expand Down Expand Up @@ -2307,3 +2309,34 @@
extra_args=["--output-model-type", "pydantic.BaseModel"],
)
assert not any("--use-annotated will be enabled" in str(warning.message) for warning in w)


@pytest.mark.skipif(not is_pydantic_v2(), reason="GenerateConfig requires Pydantic v2")
def test_import_generate_config_from_top_level() -> None:
"""Test that GenerateConfig can be imported from top-level module."""
from datamodel_code_generator import GenerateConfig as TopLevelGenerateConfig

assert TopLevelGenerateConfig is not None
assert TopLevelGenerateConfig is GenerateConfig


@pytest.mark.skipif(not is_pydantic_v2(), reason="GenerateConfig requires Pydantic v2")
def test_generate_with_imported_config_from_top_level() -> None:
"""Test generate() with GenerateConfig imported from top-level."""
config = datamodel_code_generator.GenerateConfig(class_name="TestModel")
result = generate('{"type": "object"}', config=config)
assert result is not None
assert "class TestModel" in result


@pytest.mark.skipif(not is_pydantic_v2(), reason="GenerateConfig requires Pydantic v2")
def test_all_exports_includes_generate_config() -> None:
"""Test that __all__ includes GenerateConfig in Pydantic v2."""
assert "GenerateConfig" in datamodel_code_generator.__all__


@pytest.mark.skipif(is_pydantic_v2(), reason="Test for Pydantic v1 only")
def test_import_generate_config_fails_on_v1() -> None:
"""GenerateConfig should not be importable from top-level in Pydantic v1."""
with pytest.raises(ImportError, match="only available in Pydantic v2"):
_ = datamodel_code_generator.GenerateConfig
Loading