Skip to content

Commit fddf68a

Browse files
authored
fix(parser): Prevent crash when providing a non-string default to a string attribute. Fixes #414 (#415)
1 parent e708750 commit fddf68a

File tree

5 files changed

+23
-10
lines changed

5 files changed

+23
-10
lines changed

openapi_python_client/__main__.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
from .cli import cli
1+
from .cli import app
22

3-
cli()
3+
app()

openapi_python_client/parser/openapi.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,14 @@ def _add_body(
151151
body=data.requestBody, schemas=schemas, parent_name=endpoint.name, config=config
152152
)
153153
if isinstance(json_body, ParseError):
154-
return ParseError(detail=f"cannot parse body of endpoint {endpoint.name}", data=json_body.data), schemas
154+
return (
155+
ParseError(
156+
header=f"Cannot parse body of endpoint {endpoint.name}",
157+
detail=json_body.detail,
158+
data=json_body.data,
159+
),
160+
schemas,
161+
)
155162

156163
endpoint.multipart_body_class = Endpoint.parse_multipart_body(body=data.requestBody, config=config)
157164

openapi_python_client/parser/properties/converter.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def convert(type_string: str, value: Any) -> Optional[Any]:
3131
raise ValidationError()
3232
try:
3333
return _CONVERTERS[type_string](value)
34-
except (KeyError, ValueError) as e:
34+
except (KeyError, ValueError, AttributeError) as e:
3535
raise ValidationError from e
3636

3737

@@ -58,8 +58,10 @@ def convert_chain(type_strings: Iterable[str], value: Any) -> Optional[Any]:
5858
raise ValidationError()
5959

6060

61-
def _convert_string(value: str) -> Optional[str]:
62-
return f"{utils.remove_string_escapes(value)!r}"
61+
def _convert_string(value: Any) -> Optional[str]:
62+
if isinstance(value, str):
63+
value = utils.remove_string_escapes(value)
64+
return repr(value)
6365

6466

6567
def _convert_datetime(value: str) -> Optional[str]:

tests/test___main__.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
def test_main(mocker):
2-
cli = mocker.patch("openapi_python_client.cli.cli")
2+
app = mocker.patch("openapi_python_client.cli.app")
33

44
# noinspection PyUnresolvedReferences
55
from openapi_python_client import __main__
66

7-
cli.assert_called_once()
7+
app.assert_called_once()

tests/test_parser/test_openapi.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ def test_add_body_bad_data(self, mocker):
234234
from openapi_python_client.parser.openapi import Endpoint, Schemas
235235

236236
mocker.patch.object(Endpoint, "parse_request_form_body")
237-
parse_error = ParseError(data=mocker.MagicMock())
237+
parse_error = ParseError(data=mocker.MagicMock(), detail=mocker.MagicMock())
238238
other_schemas = mocker.MagicMock()
239239
mocker.patch.object(Endpoint, "parse_request_json_body", return_value=(parse_error, other_schemas))
240240
endpoint = self.make_endpoint()
@@ -249,7 +249,11 @@ def test_add_body_bad_data(self, mocker):
249249
)
250250

251251
assert result == (
252-
ParseError(detail=f"cannot parse body of endpoint {endpoint.name}", data=parse_error.data),
252+
ParseError(
253+
header=f"Cannot parse body of endpoint {endpoint.name}",
254+
detail=parse_error.detail,
255+
data=parse_error.data,
256+
),
253257
other_schemas,
254258
)
255259

0 commit comments

Comments
 (0)