CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/pypi-datamodel-code-generator

Generates Python data models from various schema formats including OpenAPI, JSON Schema, GraphQL, and raw data

Pending
Overview
Eval results
Files

generation.mddocs/

Main Generation API

The core programmatic interface for generating Python data models from various schema formats. The generate() function provides extensive configuration options for customizing input processing, output model types, and code generation behavior.

Capabilities

Primary Generation Function

Generates Python data models from input schemas with comprehensive configuration options for all aspects of the generation process.

def generate(
    input_: Path | str | ParseResult | Mapping[str, Any],
    *,
    input_filename: str | None = None,
    input_file_type: InputFileType = InputFileType.Auto,
    output: Path | None = None,
    output_model_type: DataModelType = DataModelType.PydanticBaseModel,
    target_python_version: PythonVersion = PythonVersionMin,
    base_class: str = "",
    additional_imports: list[str] | None = None,
    custom_template_dir: Path | None = None,
    extra_template_data: defaultdict[str, dict[str, Any]] | None = None,
    validation: bool = False,
    field_constraints: bool = False,
    snake_case_field: bool = False,
    strip_default_none: bool = False,
    aliases: Mapping[str, str] | None = None,
    disable_timestamp: bool = False,
    enable_version_header: bool = False,
    allow_population_by_field_name: bool = False,
    allow_extra_fields: bool = False,
    extra_fields: str | None = None,
    apply_default_values_for_required_fields: bool = False,
    force_optional_for_required_fields: bool = False,
    class_name: str | None = None,
    use_standard_collections: bool = False,
    use_schema_description: bool = False,
    use_field_description: bool = False,
    use_default_kwarg: bool = False,
    reuse_model: bool = False,
    encoding: str = "utf-8",
    enum_field_as_literal: LiteralType | None = None,
    use_one_literal_as_default: bool = False,
    set_default_enum_member: bool = False,
    use_subclass_enum: bool = False,
    strict_nullable: bool = False,
    use_generic_container_types: bool = False,
    enable_faux_immutability: bool = False,
    disable_appending_item_suffix: bool = False,
    strict_types: Sequence[StrictTypes] | None = None,
    empty_enum_field_name: str | None = None,
    custom_class_name_generator: Callable[[str], str] | None = None,
    field_extra_keys: set[str] | None = None,
    field_include_all_keys: bool = False,
    field_extra_keys_without_x_prefix: set[str] | None = None,
    openapi_scopes: list[OpenAPIScope] | None = None,
    include_path_parameters: bool = False,
    graphql_scopes: list[GraphQLScope] | None = None,
    wrap_string_literal: bool | None = None,
    use_title_as_name: bool = False,
    use_operation_id_as_name: bool = False,
    use_unique_items_as_set: bool = False,
    http_headers: Sequence[tuple[str, str]] | None = None,
    http_ignore_tls: bool = False,
    use_annotated: bool = False,
    use_non_positive_negative_number_constrained_types: bool = False,
    original_field_name_delimiter: str | None = None,
    use_double_quotes: bool = False,
    use_union_operator: bool = False,
    collapse_root_models: bool = False,
    special_field_name_prefix: str | None = None,
    remove_special_field_name_prefix: bool = False,
    capitalise_enum_members: bool = False,
    keep_model_order: bool = False,
    custom_file_header: str | None = None,
    custom_file_header_path: Path | None = None,
    custom_formatters: list[str] | None = None,
    custom_formatters_kwargs: dict[str, Any] | None = None,
    use_pendulum: bool = False,
    http_query_parameters: Sequence[tuple[str, str]] | None = None,
    treat_dot_as_module: bool = False,
    use_exact_imports: bool = False,
    union_mode: UnionMode | None = None,
    output_datetime_class: DatetimeClassType | None = None,
    keyword_only: bool = False,
    frozen_dataclasses: bool = False,
    no_alias: bool = False,
    formatters: list[Formatter] = DEFAULT_FORMATTERS,
    parent_scoped_naming: bool = False,
) -> None:
    """
    Generate Python data models from input schema.
    
    Args:
        input_: Input source - can be:
            - Path: Local file path to schema
            - str: Raw schema content as string
            - ParseResult: URL to remote schema
            - Mapping: Dictionary containing schema data
        input_filename: Name for input file (used in generated comments)
        input_file_type: Format of input data (auto-detected if Auto)
        output: Output file path (None writes to stdout)
        output_model_type: Python model type to generate
        target_python_version: Target Python version for generated code
        base_class: Custom base class for generated models
        additional_imports: Extra imports to include in generated code
        custom_template_dir: Directory containing custom Jinja2 templates
        extra_template_data: Additional data for custom templates
        validation: Enable Pydantic validation features
        field_constraints: Include field validation constraints
        snake_case_field: Convert field names to snake_case
        strip_default_none: Remove None default values from fields
        aliases: Custom field name aliases mapping
        disable_timestamp: Skip timestamp in generated file header
        enable_version_header: Include package version in file header
        allow_population_by_field_name: Allow population by original field names
        allow_extra_fields: Allow extra fields in models
        extra_fields: How to handle extra fields ('allow', 'forbid', 'ignore')
        apply_default_values_for_required_fields: Set defaults for required fields
        force_optional_for_required_fields: Make all fields optional
        class_name: Root class name for single-class generation
        use_standard_collections: Use built-in collections instead of typing
        use_schema_description: Use schema descriptions in docstrings
        use_field_description: Use field descriptions in field definitions
        use_default_kwarg: Use default= kwarg in field definitions
        reuse_model: Reuse models with same structure
        encoding: File encoding for input/output
        enum_field_as_literal: Convert enums to Literal types
        use_one_literal_as_default: Use single literal as default value
        set_default_enum_member: Set first enum member as default
        use_subclass_enum: Generate enum subclasses
        strict_nullable: Strict nullable field handling
        use_generic_container_types: Use generic types for containers
        enable_faux_immutability: Enable immutable-like behavior
        disable_appending_item_suffix: Don't append 'Item' suffix to names
        strict_types: Enable strict typing for specified types
        empty_enum_field_name: Name for empty enum fields
        custom_class_name_generator: Function to generate class names
        field_extra_keys: Extra keys to preserve in field metadata
        field_include_all_keys: Include all keys in field metadata
        field_extra_keys_without_x_prefix: Extra keys without x- prefix
        openapi_scopes: Scopes to parse from OpenAPI spec
        include_path_parameters: Include path parameters in models
        graphql_scopes: Scopes to parse from GraphQL schema
        wrap_string_literal: Wrap string literals in quotes
        use_title_as_name: Use title field as model name
        use_operation_id_as_name: Use operationId as model name
        use_unique_items_as_set: Convert uniqueItems arrays to sets
        http_headers: Headers for HTTP requests to remote schemas
        http_ignore_tls: Ignore TLS verification for HTTPS requests
        use_annotated: Use typing.Annotated for field annotations
        use_non_positive_negative_number_constrained_types: Use constrained numeric types
        original_field_name_delimiter: Delimiter for original field names
        use_double_quotes: Use double quotes in generated code
        use_union_operator: Use | union operator syntax (Python 3.10+)
        collapse_root_models: Merge root models into single class
        special_field_name_prefix: Prefix for special field names
        remove_special_field_name_prefix: Remove special prefixes from field names
        capitalise_enum_members: Capitalize enum member names
        keep_model_order: Preserve model definition order
        custom_file_header: Custom header for generated files
        custom_file_header_path: Path to file containing custom header
        custom_formatters: List of custom formatter class names
        custom_formatters_kwargs: Arguments for custom formatters
        use_pendulum: Use pendulum for datetime types
        http_query_parameters: Query parameters for HTTP requests
        treat_dot_as_module: Treat dots in names as module separators
        use_exact_imports: Use exact imports instead of wildcards
        union_mode: Union mode for Pydantic v2 (left_to_right, smart)
        output_datetime_class: Datetime class type for output
        keyword_only: Generate keyword-only fields
        frozen_dataclasses: Generate frozen dataclasses
        no_alias: Don't generate field aliases
        formatters: Code formatters to apply (Black, isort, Ruff)
        parent_scoped_naming: Use parent scope in model names
        
    Raises:
        Error: Base exception for generation errors
        InvalidClassNameError: When generated class names are invalid
        FileNotFoundError: When input file is not found
    """

Basic Usage Examples

Generate from local file

from datamodel_code_generator import generate, DataModelType
from pathlib import Path

generate(
    input_=Path("schema.json"),
    output=Path("models.py"),
    output_model_type=DataModelType.PydanticV2BaseModel
)

Generate from URL

from urllib.parse import urlparse
from datamodel_code_generator import generate

generate(
    input_=urlparse("https://example.com/api/schema.yaml"),
    output=Path("api_models.py"),
    http_headers=[("Authorization", "Bearer token")]
)

Generate from string content

from datamodel_code_generator import generate, InputFileType
from pathlib import Path

schema_json = '''
{
  "type": "object",
  "properties": {
    "name": {"type": "string"},
    "age": {"type": "integer", "minimum": 0}
  },
  "required": ["name"]
}
'''

generate(
    input_=schema_json,
    input_file_type=InputFileType.JsonSchema,
    output=Path("person.py"),
    field_constraints=True
)

Generate dataclasses with custom options

from datamodel_code_generator import generate, DataModelType
from pathlib import Path

generate(
    input_=Path("openapi.yaml"),
    output=Path("dataclasses_models.py"),
    output_model_type=DataModelType.DataclassesDataclass,
    frozen_dataclasses=True,
    use_schema_description=True,
    snake_case_field=True
)

Generate with custom formatting

from datamodel_code_generator.format import Formatter

generate(
    input_=Path("schema.yaml"),
    output=Path("formatted_models.py"),
    formatters=[Formatter.BLACK, Formatter.ISORT, Formatter.RUFF_FORMAT],
    use_double_quotes=True,
    target_python_version=PythonVersion.PY_311
)

Common Configuration Patterns

Pydantic v2 with Modern Python Features

generate(
    input_=schema_path,
    output=output_path,
    output_model_type=DataModelType.PydanticV2BaseModel,
    target_python_version=PythonVersion.PY_311,
    use_union_operator=True,
    use_annotated=True,
    union_mode="smart"
)

TypedDict for Type Hints Only

generate(
    input_=schema_path,
    output=output_path,
    output_model_type=DataModelType.TypingTypedDict,
    use_standard_collections=True,
    enum_field_as_literal=LiteralType.All
)

OpenAPI with Path Parameters

generate(
    input_=openapi_path,
    output=output_path,
    input_file_type=InputFileType.OpenAPI,
    openapi_scopes=[OpenAPIScope.Schemas, OpenAPIScope.Paths],
    include_path_parameters=True,
    use_operation_id_as_name=True
)

Install with Tessl CLI

npx tessl i tessl/pypi-datamodel-code-generator

docs

cli.md

generation.md

index.md

types-config.md

utilities.md

tile.json