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
2 changes: 1 addition & 1 deletion .github/workflows/build-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ jobs:
path: dist/

- name: Install built package and test dependencies
run: uv sync --group dev && uv pip install --python .venv dist/schema2validataclass-*.whl --force-reinstall --no-deps
run: uv sync --group dev && uv pip install --python .venv dist/schema2classes-*.whl --force-reinstall --no-deps

- name: Run unit tests
run: uv run pytest
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@
/output
/input

/src/schema2validataclass/_version.py
/src/schema2classes/_version.py
/tests/test_schema/output
2 changes: 1 addition & 1 deletion LICENCE.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2026 Ernesto Ruge
Copyright (c) 2026 binary butterfly GmbH

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
12 changes: 6 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# schema2validataclass
# schema2classes

A Python code generator that transforms [JSON Schema](https://json-schema.org/) definitions into Python [`@validataclass`](https://github.com/binary-butterfly/validataclass)-decorated dataclasses, plain `@dataclass` classes, or [Pydantic](https://docs.pydantic.dev/) `BaseModel` classes, along with Enum classes.

Expand Down Expand Up @@ -28,20 +28,20 @@ A Python code generator that transforms [JSON Schema](https://json-schema.org/)
## Installation

```bash
uv add schema2validataclass
uv add schema2classes
```

Or with pip:

```bash
pip install schema2validataclass
pip install schema2classes
```


## Usage

```bash
schema2validataclass <schema_path> <output_path>
schema2classes <schema_path> <output_path>
```

**Arguments:**
Expand All @@ -54,7 +54,7 @@ schema2validataclass <schema_path> <output_path>
**Example:**

```bash
schema2validataclass input/schema.json output/
schema2classes input/schema.json output/
```

This reads the schema, recursively resolves all `$ref` references to other schema files, and generates:
Expand Down Expand Up @@ -160,7 +160,7 @@ detect_looping_references: false
The generator can be configured via a YAML file passed with the `-c` / `--config` flag:

```bash
schema2validataclass input/schema.json output/ -c config.yaml
schema2classes input/schema.json output/ -c config.yaml
```

All options have sensible defaults and are optional. Example `config.yaml`:
Expand Down
44 changes: 1 addition & 43 deletions dev/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,54 +3,12 @@
Use of this source code is governed by an MIT-style license that can be found in the LICENSE.txt.
"""

import logging
import sys
from pathlib import Path

sys.path.append(str(Path(Path(__file__).parent.parent, 'src'))) # noqa: E402

import argparse

from schema2validataclass import App
from schema2validataclass.common.uri import URI
from schema2validataclass.config import Config


def main():
parser = argparse.ArgumentParser(
prog='schema to validataclass',
description='Transforms schema to validataclasses and Enums',
)

parser.add_argument(
'schema_path',
type=Path,
help='Path to schema file',
)

parser.add_argument(
'output_path',
type=Path,
help='Path to output directory',
)

parser.add_argument(
'-c',
'--config',
type=Path,
help='Path to YAML configuration file',
)

args = parser.parse_args()

config = Config.from_yaml(args.config) if args.config else Config()

logging.basicConfig(stream=sys.stdout, level=logging.INFO)

app = App(config=config)
schema_uri = URI(file_path=args.schema_path)
app.generate(schema_uri, args.output_path)

from schema2classes.scripts.schema2classes import main

if __name__ == '__main__':
main()
12 changes: 6 additions & 6 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[project]
name = "schema2validataclass"
name = "schema2classes"
dynamic = ["version"]
authors = [
{name="Ernesto Ruge, binary butterfly GmbH", email="ernesto.ruge@binary-butterfly.de"},
Expand Down Expand Up @@ -35,9 +35,9 @@ dependencies = [
]

[project.urls]
Homepage = "https://github.com/datex2-tools/schema2validataclass"
Repository = "git@github.com:datex2-tools/schema2validataclass.git"
Issues = "https://github.com/datex2-tools/schema2validataclass/issues"
Homepage = "https://github.com/datex2-tools/schema2classes"
Repository = "git@github.com:datex2-tools/schema2classes.git"
Issues = "https://github.com/datex2-tools/schema2classes/issues"

[dependency-groups]
dev = [
Expand All @@ -57,7 +57,7 @@ build-backend = "hatchling.build"
source = "vcs"

[tool.hatch.build.targets.wheel]
packages = ["src/schema2validataclass"]
packages = ["src/schema2classes"]

[tool.pytest.ini_options]
addopts = "-ra --import-mode=importlib --cov-context=test --cov-report="
Expand Down Expand Up @@ -131,7 +131,7 @@ line-length = 120
# Don't require __init__.py files
"INP",
]
"src/schema2validataclass/scripts/*" = [
"src/schema2classes/scripts/*" = [
# Don't require __init__.py files
"INP",
]
Expand Down
File renamed without changes.
18 changes: 9 additions & 9 deletions src/schema2validataclass/app.py → src/schema2classes/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,21 @@
from typing import Callable
from urllib.request import urlopen

from schema2validataclass.common.helper import to_snake_case
from schema2validataclass.common.uri import URI, UriType
from schema2validataclass.config import Config, OutputFormat, PostProcessing
from schema2validataclass.generator.generator import Generator
from schema2validataclass.output.base_outputs import (
from schema2classes.common.helper import to_snake_case
from schema2classes.common.uri import URI, UriType
from schema2classes.config import Config, OutputFormat, PostProcessing
from schema2classes.generator.generator import Generator
from schema2classes.output.base_outputs import (
BaseOutput,
EnumBaseOutput,
ListBaseOutput,
NestedObjectBaseOutput,
ObjectBaseOutput,
)
from schema2validataclass.output.dataclass_outputs import DATACLASS_OUTPUT_CLASSES, DataclassObjectOutput
from schema2validataclass.output.pydantic_outputs import PYDANTIC_OUTPUT_CLASSES, PydanticObjectOutput
from schema2validataclass.output.validataclass_outputs import VALIDATACLASS_OUTPUT_CLASSES, ValidataclassObjectOutput
from schema2validataclass.schema.models import Array, BaseField, Object, Reference, Schema, get_reference_uris
from schema2classes.output.dataclass_outputs import DATACLASS_OUTPUT_CLASSES, DataclassObjectOutput
from schema2classes.output.pydantic_outputs import PYDANTIC_OUTPUT_CLASSES, PydanticObjectOutput
from schema2classes.output.validataclass_outputs import VALIDATACLASS_OUTPUT_CLASSES, ValidataclassObjectOutput
from schema2classes.schema.models import Array, BaseField, Object, Reference, Schema, get_reference_uris

logger = logging.getLogger(__name__)

Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@

from jinja2 import Environment, PackageLoader, select_autoescape

from schema2validataclass.config import Config, OutputFormat
from schema2validataclass.output.base_outputs import EnumBaseOutput, ObjectBaseOutput
from schema2classes.config import Config, OutputFormat
from schema2classes.output.base_outputs import EnumBaseOutput, ObjectBaseOutput


class Generator:
def __init__(self, config: Config):
self.env = Environment(loader=PackageLoader('schema2validataclass'), autoescape=select_autoescape())
self.env = Environment(loader=PackageLoader('schema2classes'), autoescape=select_autoescape())
self.config = config

def generate_init(self) -> str:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@
from dataclasses import dataclass
from typing import Any

from schema2validataclass.common.helper import get_class_name, get_enum_name
from schema2validataclass.common.uri import URI
from schema2validataclass.config import Config
from schema2validataclass.schema.models import (
from schema2classes.common.helper import get_class_name, get_enum_name
from schema2classes.common.uri import URI
from schema2classes.config import Config
from schema2classes.schema.models import (
Array,
BaseField,
Boolean,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from dataclasses import dataclass
from typing import Any

from schema2validataclass.common.helper import to_snake_case
from schema2classes.common.helper import to_snake_case

from .base_outputs import (
BooleanBaseOutput,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from dataclasses import dataclass
from typing import Any

from schema2validataclass.common.helper import to_snake_case
from schema2classes.common.helper import to_snake_case

from .base_outputs import (
BooleanBaseOutput,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
from dataclasses import dataclass
from typing import Any

from schema2validataclass.common.helper import to_snake_case
from schema2validataclass.config import Config, UnsetValueOutput
from schema2classes.common.helper import to_snake_case
from schema2classes.config import Config, UnsetValueOutput

from .base_outputs import (
BooleanBaseOutput,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from dataclasses import dataclass
from typing import Any

from schema2validataclass.common.uri import URI
from schema2classes.common.uri import URI


@dataclass(kw_only=True, init=False)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@

import argparse

from schema2validataclass import App
from schema2validataclass.common.uri import URI
from schema2validataclass.config import Config
from schema2classes import App
from schema2classes.common.uri import URI
from schema2classes.config import Config


def main():
Expand Down
6 changes: 3 additions & 3 deletions tests/integration/dataclass/chained_schemas_ignore_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@

from pathlib import Path

from schema2validataclass import App
from schema2validataclass.common.uri import URI
from schema2validataclass.config import Config, OutputFormat
from schema2classes import App
from schema2classes.common.uri import URI
from schema2classes.config import Config, OutputFormat
from tests.integration.dataclass.helpers import INPUT_DIR, generated_files

SCHEMA_PATH = INPUT_DIR / 'chained_schemas_ignore' / 'main_schema.json'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@

from pathlib import Path

from schema2validataclass import App
from schema2validataclass.common.uri import URI
from schema2validataclass.config import Config, OutputFormat
from schema2classes import App
from schema2classes.common.uri import URI
from schema2classes.config import Config, OutputFormat
from tests.integration.dataclass.helpers import INPUT_DIR, generated_files

SCHEMA_PATH = INPUT_DIR / 'chained_schemas_list_ignore' / 'main_schema.json'
Expand Down
6 changes: 3 additions & 3 deletions tests/integration/dataclass/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@

from pathlib import Path

from schema2validataclass import App
from schema2validataclass.common.uri import URI
from schema2validataclass.config import Config, OutputFormat
from schema2classes import App
from schema2classes.common.uri import URI
from schema2classes.config import Config, OutputFormat

INPUT_DIR = Path(__file__).resolve().parent.parent.parent / 'test_schema' / 'input'

Expand Down
6 changes: 3 additions & 3 deletions tests/integration/dataclass/renamed_properties_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@

from pathlib import Path

from schema2validataclass import App
from schema2validataclass.common.uri import URI
from schema2validataclass.config import Config, OutputFormat
from schema2classes import App
from schema2classes.common.uri import URI
from schema2classes.config import Config, OutputFormat
from tests.integration.dataclass.helpers import INPUT_DIR, generated_files

SCHEMA_PATH = INPUT_DIR / 'renamed_properties.json'
Expand Down
6 changes: 3 additions & 3 deletions tests/integration/pydantic/chained_schemas_ignore_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@

from pathlib import Path

from schema2validataclass import App
from schema2validataclass.common.uri import URI
from schema2validataclass.config import Config, OutputFormat
from schema2classes import App
from schema2classes.common.uri import URI
from schema2classes.config import Config, OutputFormat
from tests.integration.pydantic.helpers import INPUT_DIR, generated_files

SCHEMA_PATH = INPUT_DIR / 'chained_schemas_ignore' / 'main_schema.json'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@

from pathlib import Path

from schema2validataclass import App
from schema2validataclass.common.uri import URI
from schema2validataclass.config import Config, OutputFormat
from schema2classes import App
from schema2classes.common.uri import URI
from schema2classes.config import Config, OutputFormat
from tests.integration.pydantic.helpers import INPUT_DIR, generated_files

SCHEMA_PATH = INPUT_DIR / 'chained_schemas_list_ignore' / 'main_schema.json'
Expand Down
6 changes: 3 additions & 3 deletions tests/integration/pydantic/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@

from pathlib import Path

from schema2validataclass import App
from schema2validataclass.common.uri import URI
from schema2validataclass.config import Config, OutputFormat
from schema2classes import App
from schema2classes.common.uri import URI
from schema2classes.config import Config, OutputFormat

INPUT_DIR = Path(__file__).resolve().parent.parent.parent / 'test_schema' / 'input'

Expand Down
6 changes: 3 additions & 3 deletions tests/integration/pydantic/renamed_properties_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@

from pathlib import Path

from schema2validataclass import App
from schema2validataclass.common.uri import URI
from schema2validataclass.config import Config, OutputFormat
from schema2classes import App
from schema2classes.common.uri import URI
from schema2classes.config import Config, OutputFormat
from tests.integration.pydantic.helpers import INPUT_DIR, generated_files

SCHEMA_PATH = INPUT_DIR / 'renamed_properties.json'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@

from pathlib import Path

from schema2validataclass import App
from schema2validataclass.common.uri import URI
from schema2validataclass.config import Config
from schema2classes import App
from schema2classes.common.uri import URI
from schema2classes.config import Config
from tests.integration.validataclass.helpers import INPUT_DIR, generated_files

SCHEMA_PATH = INPUT_DIR / 'chained_schemas_ignore' / 'main_schema.json'
Expand Down
Loading
Loading