Skip to content

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