-
Couldn't load subscription status.
- Fork 2
Description
Title: Enhance OpenAPI Generator Pydantic Models with Explicit __init__ Signatures for Snake‑case Fields
What
Our generated Pydantic models only declare field aliases, not an explicit constructor signature, so MyPy reports errors when consuming code passes snake_case keyword arguments:
Minimal example
# Generated by OpenAPI Generator (no explicit __init__)
class V2SetHumanProfile(BaseModel):
given_name: Annotated[str, Field(alias="givenName")]
family_name: Annotated[str, Field(alias="familyName")]
# … other fields …# In test or client code:
profile = V2SetHumanProfile(
given_name="John",
family_name="Doe",
)spec/sdk_test.py:35: error: Unexpected keyword argument "given_name" for "V2SetHumanProfile"; did you mean "givenName"? [call-arg]
At runtime, Pydantic’s populate_by_name=True accepts given_name/family_name, but MyPy only “sees” the aliased fields and so flags the snake_case kwargs as invalid.
Why
- Improved DX & autocompletion
Developers expect Python‑style constructor arguments (given_name, notgivenName). - Stronger static guarantees
Eliminates the need for# type: ignore[call-arg]or hand‑written stubs. - Consistency
Keeps runtime behavior and static types in sync.
How
-
Inject explicit
__init__in the generator template
Update the Jinja2 model template to emit a constructor exposing snake_case names: -
(Alternative) Generate
.pyistubs
Produce companion stub files with explicit__init__signatures. -
Regenerate the SDK & validate
- Run the generator with the updated template.
- Confirm constructors accept snake_case args.
- Verify MyPy passes without ignores.