Skip to content

Commit ee74a30

Browse files
committed
Main work
1 parent 7b0b93a commit ee74a30

File tree

2 files changed

+69
-24
lines changed

2 files changed

+69
-24
lines changed

openapi_python_client/parser/openapi.py

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,21 @@ def __call__(
120120
... # pragma: no cover
121121

122122

123+
def get_status_codes_from_string(code: Union[int, str]) -> List[HTTPStatus]:
124+
"""Interpret HTTP status code patterns and return a list of HTTPStatus instances."""
125+
if isinstance(code, str) and "XX" in code:
126+
start_number = int(code[0])
127+
128+
start_range = start_number * 100
129+
end_range = start_range + 100
130+
131+
return [
132+
HTTPStatus(status) for status in range(start_range, end_range) if status in HTTPStatus._value2member_map_
133+
]
134+
135+
return [HTTPStatus(int(code))]
136+
137+
123138
@dataclass
124139
class Endpoint:
125140
"""
@@ -149,9 +164,8 @@ def _add_responses(
149164
) -> Tuple["Endpoint", Schemas]:
150165
endpoint = deepcopy(endpoint)
151166
for code, response_data in data.items():
152-
status_code: HTTPStatus
153167
try:
154-
status_code = HTTPStatus(int(code))
168+
parsable_codes = get_status_codes_from_string(code)
155169
except ValueError:
156170
endpoint.errors.append(
157171
ParseError(
@@ -164,30 +178,31 @@ def _add_responses(
164178
)
165179
continue
166180

167-
response, schemas = response_from_data(
168-
status_code=status_code,
169-
data=response_data,
170-
schemas=schemas,
171-
parent_name=endpoint.name,
172-
config=config,
173-
)
174-
if isinstance(response, ParseError):
175-
detail_suffix = "" if response.detail is None else f" ({response.detail})"
176-
endpoint.errors.append(
177-
ParseError(
178-
detail=(
179-
f"Cannot parse response for status code {status_code}{detail_suffix}, "
180-
f"response will be ommitted from generated client"
181-
),
182-
data=response.data,
183-
)
181+
for status_code in parsable_codes:
182+
response, schemas = response_from_data(
183+
status_code=status_code,
184+
data=response_data,
185+
schemas=schemas,
186+
parent_name=endpoint.name,
187+
config=config,
184188
)
185-
continue
189+
if isinstance(response, ParseError):
190+
detail_suffix = "" if response.detail is None else f" ({response.detail})"
191+
endpoint.errors.append(
192+
ParseError(
193+
detail=(
194+
f"Cannot parse response for status code {status_code}{detail_suffix}, "
195+
f"response will be ommitted from generated client"
196+
),
197+
data=response.data,
198+
)
199+
)
200+
continue
186201

187-
# No reasons to use lazy imports in endpoints, so add lazy imports to relative here.
188-
endpoint.relative_imports |= response.prop.get_lazy_imports(prefix=models_relative_prefix)
189-
endpoint.relative_imports |= response.prop.get_imports(prefix=models_relative_prefix)
190-
endpoint.responses.append(response)
202+
# No reasons to use lazy imports in endpoints, so add lazy imports to relative here.
203+
endpoint.relative_imports |= response.prop.get_lazy_imports(prefix=models_relative_prefix)
204+
endpoint.relative_imports |= response.prop.get_imports(prefix=models_relative_prefix)
205+
endpoint.responses.append(response)
191206
return endpoint, schemas
192207

193208
@staticmethod

tests/test_parser/test_openapi.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,36 @@ def test__add_responses_status_code_error(self, response_status_code, mocker):
151151
]
152152
response_from_data.assert_not_called()
153153

154+
def test__add_responses__wildcard_response(self, mocker):
155+
from openapi_python_client.parser.openapi import Endpoint, Schemas
156+
157+
schemas = Schemas()
158+
response_1_data = mocker.MagicMock()
159+
data = {
160+
"2XX": response_1_data,
161+
}
162+
endpoint = self.make_endpoint()
163+
parse_error = ParseError(data=mocker.MagicMock())
164+
response_from_data = mocker.patch(f"{MODULE_NAME}.response_from_data", return_value=(parse_error, schemas))
165+
config = MagicMock()
166+
167+
response, schemas = Endpoint._add_responses(endpoint=endpoint, data=data, schemas=schemas, config=config)
168+
169+
response_from_data.assert_has_calls(
170+
[
171+
mocker.call(status_code=200, data=response_1_data, schemas=schemas, parent_name="name", config=config),
172+
mocker.call(status_code=201, data=response_1_data, schemas=schemas, parent_name="name", config=config),
173+
mocker.call(status_code=202, data=response_1_data, schemas=schemas, parent_name="name", config=config),
174+
mocker.call(status_code=203, data=response_1_data, schemas=schemas, parent_name="name", config=config),
175+
mocker.call(status_code=204, data=response_1_data, schemas=schemas, parent_name="name", config=config),
176+
mocker.call(status_code=205, data=response_1_data, schemas=schemas, parent_name="name", config=config),
177+
mocker.call(status_code=206, data=response_1_data, schemas=schemas, parent_name="name", config=config),
178+
mocker.call(status_code=207, data=response_1_data, schemas=schemas, parent_name="name", config=config),
179+
mocker.call(status_code=208, data=response_1_data, schemas=schemas, parent_name="name", config=config),
180+
mocker.call(status_code=226, data=response_1_data, schemas=schemas, parent_name="name", config=config),
181+
]
182+
)
183+
154184
def test__add_responses_error(self, mocker):
155185
from openapi_python_client.parser.openapi import Endpoint, Schemas
156186

0 commit comments

Comments
 (0)