asyncapi / modelina

A library for generating typed models based on inputs such as AsyncAPI, OpenAPI, and JSON Schema documents with high customization
https://modelina.org
Apache License 2.0
295 stars 171 forks source link

[BUG] from . import AnonymousSchemaX breaks types (?) #2076

Open black-snow opened 1 month ago

black-snow commented 1 month ago

Describe the bug.

(ref. https://github.com/asyncapi/cli/issues/1485)

So with --pyDantic, the CLI generates models like:

from . import AnonymousSchema15

class AnonymousSchema13(BaseModel): 
  command: Optional[str] = Field(default=None)
  meta: Optional[AnonymousSchema15.AnonymousSchema15] = Field(default=None)

with

class AnonymousSchema15(BaseModel): 
  whatever: str = Field()

But when I try to use the models I end up with the unhelpful message:

... /opt/homebrew/Cellar/python@3.12/3.12.4/Frameworks/Python.framework/Versions/3.12/lib/python3.12/typing.py:415: in _eval_type return t._evaluate(globalns, localns, type_params, recursive_guard=recursive_guard) /opt/homebrew/Cellar/python@3.12/3.12.4/Frameworks/Python.framework/Versions/3.12/lib/python3.12/typing.py:938: in _evaluate eval(self.__forward_code__, globalns, locals_to_pass),

:1: in ??? ../.venv/lib/python3.12/site-packages/pydantic/_internal/_model_construction.py:237: in __getattr__ raise AttributeError(item) E AttributeError: AnonymousSchema15

The import seems to break the types for pydantic. It works fine when I go with from .AnonymousSchema15 import AnonymousSchema15 and then Optional[AnonymousSchema15]. This seems to be some deep crappy typehinting black magic eff-up.

So the fix might just be to adjust the import + the usage.

Expected behavior

Nested models should work out of the box.

Screenshots

-

How to Reproduce

🥦 Browser

None

👀 Have you checked for similar open issues?

🏢 Have you read the Contributing Guidelines?

Are you willing to work on this issue ?

None

github-actions[bot] commented 1 month ago

Welcome to AsyncAPI. Thanks a lot for reporting your first issue. Please check out our contributors guide and the instructions about a basic recommended setup useful for opening a pull request.
Keep in mind there are also other channels you can use to interact with AsyncAPI community. For more details check out this issue.

black-snow commented 1 month ago

I can strip down the schema to a minimal example if the issue isn't apparent.

My quick workaround is to patch it after code generation:

LC_ALL=C findmodels/generated -type f -exec sed -i '' -r 's/^from . import (AnonymousSchema[0-9]+)/from .\1 import \1/' {} \; \
    && LC_ALL=C findmodels/generated -type f -exec sed -i '' -r 's/Optional\[AnonymousSchema[0-9]+\./Optional[/' {} \;