From 5dd878cba72fd103faebb5cd4d319a4522dbd2a3 Mon Sep 17 00:00:00 2001 From: Ilia Ablamonov Date: Tue, 20 Jan 2026 10:09:35 +0100 Subject: [PATCH 1/2] Better enum class names for camel case types --- src/iron_sql/generator.py | 10 +++++++--- tests/test_type_system.py | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/iron_sql/generator.py b/src/iron_sql/generator.py index e2ae742..97dc652 100644 --- a/src/iron_sql/generator.py +++ b/src/iron_sql/generator.py @@ -292,7 +292,7 @@ def render_enum_class( to_pascal_fn: Callable[[str], str], to_snake_fn: Callable[[str], str], ) -> str: - class_name = to_pascal_fn(f"{package_name}_{enum.name}") + class_name = to_pascal_fn(f"{package_name}_{to_snake_fn(enum.name)}") members = [] seen_names: dict[str, int] = {} @@ -589,7 +589,7 @@ def column_py_spec( # noqa: C901, PLR0912 catalog: Catalog, package_name: str, to_pascal_fn: Callable[[str], str], - _to_snake_fn: Callable[[str], str] = inflection.underscore, + to_snake_fn: Callable[[str], str] = inflection.underscore, number: int = 0, ) -> ColumnPySpec: db_type = column.type.name.removeprefix("pg_catalog.") @@ -628,7 +628,11 @@ def column_py_spec( # noqa: C901, PLR0912 case "any" | "anyelement": py_type = "object" case enum if catalog.schema_by_ref(column.type).has_enum(enum): - py_type = to_pascal_fn(f"{package_name}_{enum}") if package_name else "str" + py_type = ( + to_pascal_fn(f"{package_name}_{to_snake_fn(enum)}") + if package_name + else "str" + ) case _: logger.warning(f"Unknown SQL type: {column.type.name} ({column.name})") py_type = "object" diff --git a/tests/test_type_system.py b/tests/test_type_system.py index 03cd41c..2fd4704 100644 --- a/tests/test_type_system.py +++ b/tests/test_type_system.py @@ -101,7 +101,7 @@ async def test_enum_naming_normalization(test_project: ProjectBuilder) -> None: mod = test_project.generate() - assert hasattr(mod, "TestdbCamelcaseenum") + assert hasattr(mod, "TestdbCamelCaseEnum") assert hasattr(mod, "TestdbScreamingEnum") From c39b028ce0c8f72d87c6da4dad5f1cb45df3867a Mon Sep 17 00:00:00 2001 From: Ilia Ablamonov Date: Tue, 20 Jan 2026 10:26:03 +0100 Subject: [PATCH 2/2] Better names for enum values starting with digit --- src/iron_sql/generator.py | 2 +- tests/test_type_system.py | 11 ++++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/iron_sql/generator.py b/src/iron_sql/generator.py index 97dc652..a135c3c 100644 --- a/src/iron_sql/generator.py +++ b/src/iron_sql/generator.py @@ -301,7 +301,7 @@ def render_enum_class( name = "".join(c if c.isalnum() else "_" for c in name) name = name.strip("_") or "EMPTY" if name[0].isdigit(): - name = "_" + name + name = "NUM" + name if name in seen_names: seen_names[name] += 1 name = f"{name}_{seen_names[name]}" diff --git a/tests/test_type_system.py b/tests/test_type_system.py index 2fd4704..b9b836a 100644 --- a/tests/test_type_system.py +++ b/tests/test_type_system.py @@ -1,4 +1,3 @@ -import keyword from enum import StrEnum import pytest @@ -117,13 +116,11 @@ async def test_enum_value_name_normalization(test_project: ProjectBuilder) -> No mod = test_project.generate() enum_cls = mod.TestdbWeirdEnum - expected = {"1st", "foo-bar", "foo_bar"} + assert enum_cls.NUM1ST == "1st" + assert enum_cls.FOO_BAR == "foo-bar" + assert enum_cls.FOO_BAR_2 == "foo_bar" - assert {member.value for member in enum_cls} == expected - assert len(enum_cls.__members__) == len(expected) - for name in enum_cls.__members__: - assert name.isidentifier() - assert not keyword.iskeyword(name.lower()) + assert len(enum_cls.__members__) == 3 async def test_enum_empty_label_value(test_project: ProjectBuilder) -> None: