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

cli.mddocs/

CLI Interface

Command-line interface for generating Python data models from various schema formats. The datamodel-codegen command provides access to all generation features through command-line arguments.

Capabilities

Main CLI Entry Point

Primary command-line interface accessed through the datamodel-codegen console script.

def main(args: Sequence[str] | None = None) -> Exit:
    """
    Main CLI entry point for datamodel-codegen command.
    
    Parses command-line arguments and calls generate() function with
    appropriate parameters. Handles user input validation, error reporting,
    and output formatting.
    
    Args:
        args: Command-line arguments (uses sys.argv[1:] if None)
        
    Returns:
        Exit enum indicating success or failure status
        
    Exit codes:
        Exit.OK (0): Successful completion
        Exit.ERROR (1): General error (invalid arguments, processing failure, etc.)
        Exit.KeyboardInterrupt (2): User interrupted operation
    """

Types

class Exit(IntEnum):
    """Exit status codes for CLI operations."""
    
    OK = 0                    # Successful completion
    ERROR = 1                 # General error
    KeyboardInterrupt = 2     # User interrupted operation

Command-Line Usage

Basic Syntax

datamodel-codegen [OPTIONS]

Required Options

--input INPUT_FILE          # Input file path or URL
--output OUTPUT_FILE         # Output file path

Common Options

# Input/Output Control
--input-file-type TYPE      # Input format (auto|openapi|jsonschema|json|yaml|csv|graphql)
--output-model-type TYPE    # Output model type (pydantic.BaseModel|pydantic_v2.BaseModel|dataclasses.dataclass|typing.TypedDict|msgspec.Struct)
--encoding ENCODING         # File encoding (default: utf-8)

# Code Generation Options  
--target-python-version VER # Target Python version (3.9|3.10|3.11|3.12|3.13)
--base-class CLASS          # Custom base class
--class-name NAME           # Root class name
--field-constraints         # Include field validation constraints
--validation                # Enable Pydantic validation features
--use-annotated             # Use typing.Annotated for annotations

# Field Naming Options
--snake-case-field          # Convert field names to snake_case
--original-field-name-delimiter DELIM  # Delimiter for original field names
--aliases MAPPING           # Custom field name aliases
--capitalise-enum-members   # Capitalize enum member names

# Output Formatting
--disable-timestamp         # Skip timestamp in file header
--enable-version-header     # Include package version in header
--custom-file-header PATH   # Path to custom file header
--formatters LIST           # Code formatters (black,isort,ruff-check,ruff-format)
--use-double-quotes         # Use double quotes in generated code

# Model Behavior
--strip-default-none        # Remove None default values
--allow-extra-fields        # Allow extra fields in models
--force-optional-for-required-fields  # Make all fields optional
--reuse-model              # Reuse models with same structure
--use-schema-description   # Use schema descriptions in docstrings
--use-field-description    # Use field descriptions in field definitions

# Advanced Options
--custom-template-dir DIR   # Directory with custom Jinja2 templates
--http-headers HEADERS      # Headers for HTTP requests (format: "key:value")
--http-ignore-tls          # Ignore TLS verification
--openapi-scopes SCOPES    # OpenAPI parsing scopes (schemas,paths,tags,parameters)
--enum-field-as-literal TYPE  # Convert enums to literals (all|one)
--strict-types TYPES       # Enable strict typing for types (str,bytes,int,float,bool)

Usage Examples

Basic Model Generation

# Generate Pydantic models from OpenAPI spec
datamodel-codegen --input api.yaml --output models.py

# Generate from JSON Schema
datamodel-codegen --input schema.json --output models.py --input-file-type jsonschema

Different Output Model Types

# Generate Pydantic v2 models
datamodel-codegen --input schema.yaml --output models.py --output-model-type pydantic_v2.BaseModel

# Generate dataclasses
datamodel-codegen --input data.json --output models.py --output-model-type dataclasses.dataclass

# Generate TypedDict
datamodel-codegen --input schema.json --output types.py --output-model-type typing.TypedDict

Advanced Configuration

# With field constraints and validation
datamodel-codegen \
  --input openapi.yaml \
  --output models.py \
  --field-constraints \
  --validation \
  --use-schema-description \
  --snake-case-field

# With custom formatting and Python version
datamodel-codegen \
  --input schema.json \
  --output models.py \
  --target-python-version 3.11 \
  --formatters black,isort,ruff-format \
  --use-double-quotes \
  --use-annotated

Remote Schema Fetching

# Fetch from URL with authentication
datamodel-codegen \
  --input https://api.example.com/schema.yaml \
  --output api_models.py \
  --http-headers "Authorization:Bearer token123" \
  --http-headers "User-Agent:datamodel-codegen"

# With custom query parameters
datamodel-codegen \
  --input "https://api.example.com/schema?version=v2" \
  --output models.py \
  --http-ignore-tls

OpenAPI-Specific Options

# Generate from OpenAPI with path parameters
datamodel-codegen \
  --input openapi.yaml \
  --output models.py \
  --input-file-type openapi \
  --openapi-scopes schemas,paths \
  --include-path-parameters \
  --use-operation-id-as-name

GraphQL Schema Generation

# Generate from GraphQL schema (requires graphql extra)
datamodel-codegen \
  --input schema.graphql \
  --output models.py \
  --input-file-type graphql

Custom Templates and Headers

# Use custom templates and file header
datamodel-codegen \
  --input schema.json \
  --output models.py \
  --custom-template-dir ./templates \
  --custom-file-header ./header.txt \
  --disable-timestamp

Enum and Literal Handling

# Convert enums to literals
datamodel-codegen \
  --input schema.json \
  --output models.py \
  --enum-field-as-literal all \
  --capitalise-enum-members \
  --use-one-literal-as-default

Error Handling

The CLI provides clear error messages for common issues:

# Invalid input file
$ datamodel-codegen --input nonexistent.yaml --output models.py
Error: File not found

# Unsupported input format  
$ datamodel-codegen --input invalid.txt --output models.py
Error: Invalid file format

# Missing required arguments
$ datamodel-codegen --input schema.json
Error: --output is required

Environment Variables

Some CLI behavior can be controlled via environment variables:

# Set default encoding
export DATAMODEL_CODEGEN_ENCODING=utf-8

# Enable debug mode (requires debug extra)
export DATAMODEL_CODEGEN_DEBUG=1

Integration Examples

Makefile Integration

generate-models:
	datamodel-codegen \
		--input schemas/api.yaml \
		--output src/models.py \
		--output-model-type pydantic_v2.BaseModel \
		--field-constraints \
		--formatters black,isort

CI/CD Pipeline

# GitHub Actions example
- name: Generate Models
  run: |
    pip install datamodel-code-generator
    datamodel-codegen \
      --input ${{ github.workspace }}/schemas/openapi.yaml \
      --output ${{ github.workspace }}/src/generated_models.py \
      --validation \
      --use-schema-description

Pre-commit Hook

# .pre-commit-config.yaml
repos:
  - repo: local
    hooks:
      - id: generate-models
        name: Generate data models
        entry: datamodel-codegen
        args: [--input, schemas/api.yaml, --output, src/models.py]
        files: ^schemas/.*\.(yaml|json)$
        language: system

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