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
24 changes: 24 additions & 0 deletions src/schema2validataclass/_version.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# file generated by vcs-versioning
# don't change, don't track in version control
from __future__ import annotations

__all__ = [
'__version__',
'__version_tuple__',
'version',
'version_tuple',
'__commit_id__',
'commit_id',
]

version: str
__version__: str
__version_tuple__: tuple[int | str, ...]
version_tuple: tuple[int | str, ...]
commit_id: str | None
__commit_id__: str | None

__version__ = version = '0.0.post8+g5df0c6455.d20260404'
__version_tuple__ = version_tuple = (0, 0, 'post8', 'g5df0c6455.d20260404')

__commit_id__ = commit_id = 'g5df0c6455'
19 changes: 10 additions & 9 deletions src/schema2validataclass/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,17 @@
from schema2validataclass.common.uri import URI, UriType
from schema2validataclass.config import Config, OutputFormat, PostProcessing
from schema2validataclass.generator.generator import Generator
from schema2validataclass.schema.base_outputs import (
from schema2validataclass.output.base_outputs import (
BaseOutput,
EnumBaseOutput,
ListBaseOutput,
NestedObjectBaseOutput,
ObjectBaseOutput,
)
from schema2validataclass.schema.dataclass_outputs import DATACLASS_OUTPUT_CLASSES, DataclassObjectOutput
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 BaseField, Object, Schema
from schema2validataclass.schema.validataclass_outputs import VALIDATACLASS_OUTPUT_CLASSES, ValidataclassObjectOutput

logger = logging.getLogger(__name__)

Expand All @@ -36,12 +37,12 @@ def __init__(self, config: Config | None = None):
self.generator = Generator(config=self.config)

def generate(self, schema_uri: URI, output_path: Path):
if self.config.output_format == OutputFormat.DATACLASS:
object_output_class = DataclassObjectOutput
output_classes = DATACLASS_OUTPUT_CLASSES
else:
object_output_class = ValidataclassObjectOutput
output_classes = VALIDATACLASS_OUTPUT_CLASSES
output_format_map = {
OutputFormat.VALIDATACLASS: (ValidataclassObjectOutput, VALIDATACLASS_OUTPUT_CLASSES),
OutputFormat.DATACLASS: (DataclassObjectOutput, DATACLASS_OUTPUT_CLASSES),
OutputFormat.PYDANTIC: (PydanticObjectOutput, PYDANTIC_OUTPUT_CLASSES),
}
object_output_class, output_classes = output_format_map[self.config.output_format]

main_schema_dict = self.read_schema(schema_uri)

Expand Down
5 changes: 5 additions & 0 deletions src/schema2validataclass/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
Use of this source code is governed by an MIT-style license that can be found in the LICENSE.txt.
"""

import keyword
from dataclasses import dataclass, field
from enum import Enum
from pathlib import Path
Expand All @@ -24,6 +25,7 @@ def to_output(self) -> str:
class OutputFormat(Enum):
VALIDATACLASS = 'validataclass'
DATACLASS = 'dataclass'
PYDANTIC = 'pydantic'


class PostProcessing(Enum):
Expand All @@ -40,6 +42,9 @@ class Config:
)
output_format: OutputFormat = OutputFormat.VALIDATACLASS
set_validataclass_mixin: bool = True
renamed_properties: list[str] = field(
default_factory=lambda: keyword.kwlist,
)
detect_looping_references: bool = True
post_processing: list[PostProcessing] = field(
default_factory=lambda: [PostProcessing.RUFF_FORMAT, PostProcessing.RUFF_CHECK],
Expand Down
12 changes: 7 additions & 5 deletions src/schema2validataclass/generator/generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from jinja2 import Environment, PackageLoader, select_autoescape

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


class Generator:
Expand All @@ -18,10 +18,12 @@ def generate_init(self) -> str:
return self.env.get_template('init.jinja2').render(config=self.config)

def generate_object(self, model: ObjectBaseOutput) -> str:
if self.config.output_format == OutputFormat.DATACLASS:
template = 'dataclass.jinja2'
else:
template = 'validataclass.jinja2'
templates = {
OutputFormat.VALIDATACLASS: 'validataclass.jinja2',
OutputFormat.DATACLASS: 'dataclass.jinja2',
OutputFormat.PYDANTIC: 'pydantic.jinja2',
}
template = templates[self.config.output_format]
return self.env.get_template(template).render(model=model, config=self.config)

def generate_enum(self, model: EnumBaseOutput) -> str:
Expand Down
4 changes: 4 additions & 0 deletions src/schema2validataclass/output/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
"""
Copyright 2025 binary butterfly GmbH
Use of this source code is governed by an MIT-style license that can be found in the LICENSE.txt.
"""
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,10 @@
from dataclasses import dataclass
from typing import Any

from schema2validataclass.common.helper import get_class_name, get_enum_name, to_snake_case
from schema2validataclass.common.helper import get_class_name, get_enum_name
from schema2validataclass.common.uri import URI
from schema2validataclass.config import Config

from .models import (
from schema2validataclass.schema.models import (
Array,
BaseField,
Boolean,
Expand All @@ -33,6 +32,7 @@ class BaseOutput(ABC):
field: BaseField
config: Config
key: str
original_key: str | None = None
title: str | None = None
description: str | None = None
default: Any | None = None
Expand All @@ -47,6 +47,13 @@ def __init__(self, field: BaseField, config: Config, references: list[Reference]
for reference in reversed(references):
self.apply_field(reference)

# Rename properties that conflict with Python reserved words
if self.key in self.config.renamed_properties:
self.original_key = self.key
self.key = f'{self.key}_'
else:
self.original_key = None

def apply_field(self, field: BaseField) -> None:
self.key = field.uri.key

Expand Down Expand Up @@ -128,7 +135,7 @@ def apply_field(self, field: Number):

@staticmethod
def get_type() -> str:
return 'int'
return 'float'


@dataclass(kw_only=True, init=False)
Expand Down Expand Up @@ -178,7 +185,7 @@ def get_type(self) -> str:
def render_enum_values(self) -> list[str]:
result: list[str] = []
for enum_value in self.enum_values:
result.append(f'{get_enum_name(enum_value)} = "{enum_value}"')
result.append(f"{get_enum_name(enum_value)} = '{enum_value}'")
return result


Expand Down Expand Up @@ -211,7 +218,9 @@ def __init__(
output_classes: dict,
**kwargs,
):
super().__init__(field, config=config, referencable_fields=referencable_fields, output_classes=output_classes, **kwargs)
super().__init__(
field, config=config, referencable_fields=referencable_fields, output_classes=output_classes, **kwargs
)

item_field = field.items

Expand Down Expand Up @@ -325,6 +334,13 @@ def _format_imports(raw_imports: list[str]) -> list[str]:

return result_imports

def get_field_mapping(self) -> dict[str, str]:
mapping = {}
for output in self.outputs:
if output.original_key is not None:
mapping[output.original_key] = output.key
return mapping

def get_enum_outputs(self) -> list[EnumBaseOutput]:
enum_outputs: list[EnumBaseOutput] = []

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@
DATACLASS_OUTPUT_CLASSES,
DataclassObjectOutput,
)
from .pydantic_outputs import ( # noqa: F401
PYDANTIC_OUTPUT_CLASSES,
PydanticObjectOutput,
)
from .validataclass_outputs import ( # noqa: F401
VALIDATACLASS_OUTPUT_CLASSES,
ValidataclassObjectOutput,
Expand Down
Loading
Loading