Skip to content

Commit ec25db0

Browse files
bokelleyclaude
andcommitted
feat: add enum discriminator support and identifier validation
This addresses additional code review feedback (Priority 2 items): 1. Add single-value enum discriminator support - Previously only handled "const" discriminators - Now also supports "enum": ["value"] as discriminator - Enables semantic naming for more schema patterns 2. Add identifier validation in snake_to_pascal() - Validates result is a valid Python identifier - Raises clear error if conversion produces invalid name - Prevents silent failures with unicode/special characters Why these are easy wins: - Enum support: 3-line addition, handles edge case - Identifier validation: 5-line addition, defensive programming - Both improve robustness with minimal complexity Example: If a schema has discriminator like: "status": {"enum": ["active"]} ← now detected same as const Addresses code review Priority 2 items from code-reviewer agent. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 2895b80 commit ec25db0

File tree

1 file changed

+19
-2
lines changed

1 file changed

+19
-2
lines changed

scripts/generate_models_simple.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,21 @@
2828

2929

3030
def snake_to_pascal(name: str) -> str:
31-
"""Convert snake_case to PascalCase."""
32-
return "".join(word.capitalize() for word in name.split("-"))
31+
"""
32+
Convert snake_case to PascalCase.
33+
34+
Raises:
35+
ValueError: If the result is not a valid Python identifier
36+
"""
37+
pascal = "".join(word.capitalize() for word in name.split("-"))
38+
39+
# Validate result is a valid Python identifier
40+
if not pascal.isidentifier():
41+
raise ValueError(
42+
f"Cannot convert '{name}' to valid Python identifier: '{pascal}'"
43+
)
44+
45+
return pascal
3346

3447

3548
def sanitize_field_name(name: str) -> str:
@@ -100,6 +113,10 @@ def generate_discriminated_union(schema: dict, base_name: str) -> str:
100113
if "const" in disc_prop:
101114
discriminator_value = disc_prop["const"]
102115
break
116+
elif "enum" in disc_prop and len(disc_prop["enum"]) == 1:
117+
# Single-value enum can also be a discriminator
118+
discriminator_value = disc_prop["enum"][0]
119+
break
103120

104121
# Generate variant name
105122
if discriminator_value:

0 commit comments

Comments
 (0)