Skip to content

Commit a4fb571

Browse files
authored
Fix parameter type checks for OpenAPI 3.0 and 3.1 (#121)
1 parent af4688f commit a4fb571

File tree

3 files changed

+98
-5
lines changed

3 files changed

+98
-5
lines changed

src/openapi_python_generator/language_converters/python/service_generator.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import click
55
from openapi_pydantic.v3 import (
66
Operation,
7-
Parameter,
87
PathItem,
98
Reference,
109
Response,
@@ -24,6 +23,7 @@
2423
from openapi_pydantic.v3.v3_0 import (
2524
Schema as Schema30,
2625
)
26+
from openapi_pydantic.v3.v3_0.parameter import Parameter as Parameter30
2727
from openapi_pydantic.v3.v3_1 import (
2828
MediaType as MediaType31,
2929
)
@@ -36,6 +36,7 @@
3636
from openapi_pydantic.v3.v3_1 import (
3737
Schema as Schema31,
3838
)
39+
from openapi_pydantic.v3.v3_1.parameter import Parameter as Parameter31
3940

4041
from openapi_python_generator.language_converters.python import common
4142
from openapi_python_generator.language_converters.python.common import normalize_symbol
@@ -152,7 +153,7 @@ def _generate_params_from_content(content: Any):
152153
default_params = ""
153154
if operation.parameters is not None:
154155
for param in operation.parameters:
155-
if not isinstance(param, Parameter):
156+
if not isinstance(param, (Parameter30, Parameter31)):
156157
continue # pragma: no cover
157158
converted_result = ""
158159
required = False
@@ -245,7 +246,7 @@ def _generate_params(
245246

246247
params = []
247248
for param in operation.parameters:
248-
if isinstance(param, Parameter) and param.param_in == param_in:
249+
if isinstance(param, (Parameter30, Parameter31)) and param.param_in == param_in:
249250
param_name_cleaned = common.normalize_symbol(param.name)
250251
params.append(f"{param.name!r} : {param_name_cleaned}")
251252

@@ -358,10 +359,13 @@ def generate_service_operation(
358359
existing_names = set()
359360
if op.parameters is not None:
360361
for p in op.parameters: # type: ignore
361-
if isinstance(p, Parameter):
362+
if isinstance(p, (Parameter30, Parameter31)):
362363
existing_names.add(p.name)
363364
for p in path_level_params:
364-
if isinstance(p, Parameter) and p.name not in existing_names:
365+
if (
366+
isinstance(p, (Parameter30, Parameter31))
367+
and p.name not in existing_names
368+
):
365369
if op.parameters is None:
366370
op.parameters = [] # type: ignore
367371
op.parameters.append(p) # type: ignore

tests/regression/test_issue_120.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import pytest
2+
from click.testing import CliRunner
3+
4+
from openapi_python_generator.common import HTTPLibrary, library_config_dict
5+
from openapi_python_generator.generate_data import generate_data
6+
from tests.conftest import test_data_folder
7+
from tests.conftest import test_result_path
8+
9+
10+
@pytest.fixture
11+
def runner() -> CliRunner:
12+
"""Fixture for invoking command-line interfaces."""
13+
return CliRunner()
14+
15+
16+
@pytest.mark.parametrize(
17+
"library",
18+
[HTTPLibrary.httpx, HTTPLibrary.aiohttp, HTTPLibrary.requests],
19+
)
20+
def test_issue_120(runner: CliRunner, model_data_with_cleanup, library) -> None:
21+
"""
22+
https://github.com/MarcoMuellner/openapi-python-generator/issues/120
23+
"""
24+
generate_data(test_data_folder / "issue_120.json", test_result_path, library)
25+
26+
if library_config_dict[library].include_sync:
27+
assert (test_result_path / "services" / "default_service.py").exists()
28+
assert (test_result_path / "services" / "default_service.py").read_text().find(
29+
"language: Optional[str] = None"
30+
) != -1
31+
32+
if library_config_dict[library].include_async:
33+
assert (test_result_path / "services" / "async_default_service.py").exists()
34+
assert (
35+
test_result_path / "services" / "async_default_service.py"
36+
).read_text().find("language: Optional[str] = None") != -1

tests/test_data/issue_120.json

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
{
2+
"openapi": "3.0.0",
3+
"info": {
4+
"title": "New Specs",
5+
"version": "1.0.0"
6+
},
7+
"paths": {
8+
"/foo-bar": {
9+
"get": {
10+
"operationId": "getFooBar",
11+
"parameters": [
12+
{
13+
"name": "language",
14+
"in": "query",
15+
"description": "strLanguageParam",
16+
"required": false,
17+
"style": "form",
18+
"explode": true,
19+
"schema": {
20+
"type": "string",
21+
"default": "en",
22+
"enum": [
23+
"en",
24+
"es",
25+
"fr"
26+
]
27+
}
28+
}
29+
],
30+
"responses": {
31+
"200": {
32+
"description": "Successful response",
33+
"content": {
34+
"application/json": {
35+
"schema": {
36+
"type": "object",
37+
"properties": {
38+
"message": {
39+
"type": "string"
40+
}
41+
}
42+
}
43+
}
44+
}
45+
}
46+
}
47+
}
48+
}
49+
},
50+
"components": {
51+
"schemas": {}
52+
}
53+
}

0 commit comments

Comments
 (0)