Skip to content

Resolve circular import for Operation and PathItem #661

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Aug 27, 2022

Conversation

dachucky
Copy link
Contributor

@dachucky dachucky commented Aug 26, 2022

When Callbacks were added in #568 , it doesn't appear they were actually tested. Trying to generate a client for a minimal schema with a callback results in the following error:

openapi-python-client generate --path min_callback.json
Traceback (most recent call last):

  File "/home/user/.local/bin/openapi-python-client", line 8, in <module>
    sys.exit(app())

  File "/home/user/.local/pipx/venvs/openapi-python-client/lib/python3.10/site-packages/openapi_python_client/cli.py", line 142, in generate
    errors = create_new_client(

  File "/home/user/.local/pipx/venvs/openapi-python-client/lib/python3.10/site-packages/openapi_python_client/__init__.py", line 338, in create_new_client
    project = _get_project_for_url_or_path(

  File "/home/user/.local/pipx/venvs/openapi-python-client/lib/python3.10/site-packages/openapi_python_client/__init__.py", line 311, in _get_project_for_url_or_path
    openapi = GeneratorData.from_dict(data_dict, config=config)

  File "/home/user/.local/pipx/venvs/openapi-python-client/lib/python3.10/site-packages/openapi_python_client/parser/openapi.py", line 511, in from_dict
    openapi = oai.OpenAPI.parse_obj(data)

  File "pydantic/main.py", line 521, in pydantic.main.BaseModel.parse_obj

  File "pydantic/main.py", line 339, in pydantic.main.BaseModel.__init__

  File "pydantic/main.py", line 1038, in pydantic.main.validate_model

  File "pydantic/fields.py", line 859, in pydantic.fields.ModelField.validate

  File "pydantic/fields.py", line 994, in pydantic.fields.ModelField._validate_mapping_like

  File "pydantic/fields.py", line 1067, in pydantic.fields.ModelField._validate_singleton

  File "pydantic/fields.py", line 857, in pydantic.fields.ModelField.validate

  File "pydantic/fields.py", line 1074, in pydantic.fields.ModelField._validate_singleton

  File "pydantic/fields.py", line 1121, in pydantic.fields.ModelField._apply_validators

  File "pydantic/class_validators.py", line 313, in pydantic.class_validators._generic_validator_basic.lambda12

  File "pydantic/main.py", line 686, in pydantic.main.BaseModel.validate

  File "pydantic/main.py", line 339, in pydantic.main.BaseModel.__init__

  File "pydantic/main.py", line 1038, in pydantic.main.validate_model

  File "pydantic/fields.py", line 857, in pydantic.fields.ModelField.validate

  File "pydantic/fields.py", line 1074, in pydantic.fields.ModelField._validate_singleton

  File "pydantic/fields.py", line 1121, in pydantic.fields.ModelField._apply_validators

  File "pydantic/class_validators.py", line 313, in pydantic.class_validators._generic_validator_basic.lambda12

  File "pydantic/main.py", line 686, in pydantic.main.BaseModel.validate

  File "pydantic/main.py", line 339, in pydantic.main.BaseModel.__init__

  File "pydantic/main.py", line 1038, in pydantic.main.validate_model

  File "pydantic/fields.py", line 859, in pydantic.fields.ModelField.validate

  File "pydantic/fields.py", line 994, in pydantic.fields.ModelField._validate_mapping_like

  File "pydantic/fields.py", line 1067, in pydantic.fields.ModelField._validate_singleton

  File "pydantic/fields.py", line 833, in pydantic.fields.ModelField.validate

pydantic.errors.ConfigError: field "_callbacks" not yet prepared so type is still a ForwardRef, you might need to call Operation.update_forward_refs().

Schema used:

{
  "openapi": "3.0.1",
  "info": {
    "title": "An API with Callback",
    "version": "v1"
  },
  "paths": {
    "/create": {
      "post": {
        "responses": {
          "200": {
            "description": "Success"
          }
        },
        "callbacks": {
          "event": {
            "callback": {
              "post": {
                "responses": {
                  "200": {
                    "description": "Success"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

This is due to a circular import dependency of Operation -> Callback -> PathItem -> Operation -> ...

This PR delays the imports in Operation and PathItem and uses the update_forward_refs() to update those references after each class is created.

I'm not very experienced with pydantic, so there may well be a better method for resolving this issue.

@dbanty
Copy link
Collaborator

dbanty commented Aug 27, 2022

Thanks @dachucky ! Could you add a little callback example to end_to_end_tests/openapi.json just to verify that nothing else breaks in the full flow?

@codecov
Copy link

codecov bot commented Aug 27, 2022

Codecov Report

Merging #661 (b27aa1f) into main (227bc5e) will not change coverage.
The diff coverage is 100.00%.

@@            Coverage Diff            @@
##              main      #661   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files           49        49           
  Lines         1791      1794    +3     
=========================================
+ Hits          1791      1794    +3     
Impacted Files Coverage Δ
...client/schema/openapi_schema_pydantic/operation.py 100.00% <100.00%> (ø)
...client/schema/openapi_schema_pydantic/path_item.py 100.00% <100.00%> (ø)

📣 We’re building smart automated test selection to slash your CI/CD build times. Learn more

@dbanty dbanty added this to the 0.11.6 milestone Aug 27, 2022
@dbanty dbanty added the 🐞bug Something isn't working label Aug 27, 2022
@dbanty dbanty enabled auto-merge (squash) August 27, 2022 21:27
@dbanty dbanty merged commit 6245b18 into openapi-generators:main Aug 27, 2022
@dachucky dachucky deleted the fix-callback-import-refs branch August 27, 2022 21:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🐞bug Something isn't working
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants