openapi-python-client 0.21.0__tar.gz → 0.21.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/PKG-INFO +2 -2
  2. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/parser/bodies.py +26 -6
  3. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/parser/openapi.py +8 -2
  4. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/property_templates/list_property.py.jinja +1 -1
  5. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/pyproject.toml +3 -4
  6. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/.gitignore +0 -0
  7. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/LICENSE +0 -0
  8. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/README.md +0 -0
  9. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/__init__.py +0 -0
  10. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/__main__.py +0 -0
  11. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/cli.py +0 -0
  12. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/config.py +0 -0
  13. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/parser/__init__.py +0 -0
  14. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/parser/errors.py +0 -0
  15. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/parser/properties/__init__.py +0 -0
  16. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/parser/properties/any.py +0 -0
  17. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/parser/properties/boolean.py +0 -0
  18. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/parser/properties/const.py +0 -0
  19. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/parser/properties/date.py +0 -0
  20. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/parser/properties/datetime.py +0 -0
  21. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/parser/properties/enum_property.py +0 -0
  22. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/parser/properties/file.py +0 -0
  23. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/parser/properties/float.py +0 -0
  24. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/parser/properties/int.py +0 -0
  25. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/parser/properties/list_property.py +0 -0
  26. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/parser/properties/model_property.py +0 -0
  27. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/parser/properties/none.py +0 -0
  28. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/parser/properties/property.py +0 -0
  29. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/parser/properties/protocol.py +0 -0
  30. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/parser/properties/schemas.py +0 -0
  31. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/parser/properties/string.py +0 -0
  32. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/parser/properties/union.py +0 -0
  33. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/parser/responses.py +0 -0
  34. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/py.typed +0 -0
  35. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/3.0.3.md +0 -0
  36. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/3.1.0.md +0 -0
  37. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/__init__.py +0 -0
  38. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/data_type.py +0 -0
  39. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/LICENSE +0 -0
  40. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/README.md +0 -0
  41. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/__init__.py +0 -0
  42. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/callback.py +0 -0
  43. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/components.py +0 -0
  44. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/contact.py +0 -0
  45. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/discriminator.py +0 -0
  46. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/encoding.py +0 -0
  47. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/example.py +0 -0
  48. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/external_documentation.py +0 -0
  49. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/header.py +0 -0
  50. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/info.py +0 -0
  51. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/license.py +0 -0
  52. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/link.py +0 -0
  53. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/media_type.py +0 -0
  54. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/oauth_flow.py +0 -0
  55. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/oauth_flows.py +0 -0
  56. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/open_api.py +0 -0
  57. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/operation.py +0 -0
  58. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/parameter.py +0 -0
  59. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/path_item.py +0 -0
  60. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/paths.py +0 -0
  61. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/reference.py +0 -0
  62. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/request_body.py +0 -0
  63. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/response.py +0 -0
  64. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/responses.py +0 -0
  65. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/schema.py +0 -0
  66. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/security_requirement.py +0 -0
  67. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/security_scheme.py +0 -0
  68. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/server.py +0 -0
  69. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/server_variable.py +0 -0
  70. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/tag.py +0 -0
  71. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/openapi_schema_pydantic/xml.py +0 -0
  72. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/schema/parameter_location.py +0 -0
  73. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/.gitignore.jinja +0 -0
  74. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/README.md.jinja +0 -0
  75. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/api_init.py.jinja +0 -0
  76. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/client.py.jinja +0 -0
  77. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/endpoint_init.py.jinja +0 -0
  78. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/endpoint_macros.py.jinja +0 -0
  79. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/endpoint_module.py.jinja +0 -0
  80. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/errors.py.jinja +0 -0
  81. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/helpers.jinja +0 -0
  82. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/int_enum.py.jinja +0 -0
  83. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/model.py.jinja +0 -0
  84. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/models_init.py.jinja +0 -0
  85. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/package_init.py.jinja +0 -0
  86. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/property_templates/any_property.py.jinja +0 -0
  87. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/property_templates/boolean_property.py.jinja +0 -0
  88. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/property_templates/const_property.py.jinja +0 -0
  89. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/property_templates/date_property.py.jinja +0 -0
  90. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/property_templates/datetime_property.py.jinja +0 -0
  91. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/property_templates/enum_property.py.jinja +0 -0
  92. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/property_templates/file_property.py.jinja +0 -0
  93. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/property_templates/float_property.py.jinja +0 -0
  94. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/property_templates/helpers.jinja +0 -0
  95. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/property_templates/int_property.py.jinja +0 -0
  96. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/property_templates/model_property.py.jinja +0 -0
  97. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/property_templates/property_macros.py.jinja +0 -0
  98. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/property_templates/union_property.py.jinja +0 -0
  99. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/pyproject.toml.jinja +0 -0
  100. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/pyproject_ruff.toml.jinja +0 -0
  101. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/setup.py.jinja +0 -0
  102. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/str_enum.py.jinja +0 -0
  103. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/templates/types.py.jinja +0 -0
  104. {openapi_python_client-0.21.0 → openapi_python_client-0.21.1}/openapi_python_client/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: openapi-python-client
3
- Version: 0.21.0
3
+ Version: 0.21.1
4
4
  Summary: Generate modern Python clients from OpenAPI
5
5
  Project-URL: repository, https://github.com/openapi-generators/openapi-python-client
6
6
  Author-email: Dylan Anthony <contact@dylananthony.com>
@@ -18,7 +18,7 @@ Classifier: Programming Language :: Python :: 3.11
18
18
  Classifier: Programming Language :: Python :: 3.12
19
19
  Classifier: Topic :: Software Development :: Code Generators
20
20
  Classifier: Typing :: Typed
21
- Requires-Python: <4.0,>=3.8
21
+ Requires-Python: <4.0,>=3.8.1
22
22
  Requires-Dist: attrs>=21.3.0
23
23
  Requires-Dist: colorama>=0.4.3; sys_platform == 'win32'
24
24
  Requires-Dist: httpx<0.28.0,>=0.20.0
@@ -1,5 +1,5 @@
1
1
  import sys
2
- from typing import List, Tuple, Union
2
+ from typing import Dict, List, Tuple, Union
3
3
 
4
4
  import attr
5
5
 
@@ -44,15 +44,19 @@ def body_from_data(
44
44
  *,
45
45
  data: oai.Operation,
46
46
  schemas: Schemas,
47
+ request_bodies: Dict[str, Union[oai.RequestBody, oai.Reference]],
47
48
  config: Config,
48
49
  endpoint_name: str,
49
50
  ) -> Tuple[List[Union[Body, ParseError]], Schemas]:
50
51
  """Adds form or JSON body to Endpoint if included in data"""
51
- if data.request_body is None or isinstance(data.request_body, oai.Reference):
52
+ body = _resolve_reference(data.request_body, request_bodies)
53
+ if isinstance(body, ParseError):
54
+ return [body], schemas
55
+ if body is None:
52
56
  return [], schemas
53
57
 
54
58
  bodies: List[Union[Body, ParseError]] = []
55
- body_content = data.request_body.content
59
+ body_content = body.content
56
60
  prefix_type_names = len(body_content) > 1
57
61
 
58
62
  for content_type, media_type in body_content.items():
@@ -61,7 +65,7 @@ def body_from_data(
61
65
  bodies.append(
62
66
  ParseError(
63
67
  detail="Invalid content type",
64
- data=data.request_body,
68
+ data=body,
65
69
  level=ErrorLevel.WARNING,
66
70
  )
67
71
  )
@@ -71,7 +75,7 @@ def body_from_data(
71
75
  bodies.append(
72
76
  ParseError(
73
77
  detail="Missing schema",
74
- data=data.request_body,
78
+ data=body,
75
79
  level=ErrorLevel.WARNING,
76
80
  )
77
81
  )
@@ -88,7 +92,7 @@ def body_from_data(
88
92
  bodies.append(
89
93
  ParseError(
90
94
  detail=f"Unsupported content type {simplified_content_type}",
91
- data=data.request_body,
95
+ data=body,
92
96
  level=ErrorLevel.WARNING,
93
97
  )
94
98
  )
@@ -123,3 +127,19 @@ def body_from_data(
123
127
  )
124
128
 
125
129
  return bodies, schemas
130
+
131
+
132
+ def _resolve_reference(
133
+ body: Union[oai.RequestBody, oai.Reference, None], request_bodies: Dict[str, Union[oai.RequestBody, oai.Reference]]
134
+ ) -> Union[oai.RequestBody, ParseError, None]:
135
+ if body is None:
136
+ return None
137
+ references_seen = []
138
+ while isinstance(body, oai.Reference) and body.ref not in references_seen:
139
+ references_seen.append(body.ref)
140
+ body = request_bodies.get(body.ref.split("/")[-1])
141
+ if isinstance(body, oai.Reference):
142
+ return ParseError(detail="Circular $ref in request body", data=body)
143
+ if body is None and references_seen:
144
+ return ParseError(detail=f"Could not resolve $ref {references_seen[-1]} in request body")
145
+ return body
@@ -48,6 +48,7 @@ class EndpointCollection:
48
48
  data: Dict[str, oai.PathItem],
49
49
  schemas: Schemas,
50
50
  parameters: Parameters,
51
+ request_bodies: Dict[str, Union[oai.RequestBody, oai.Reference]],
51
52
  config: Config,
52
53
  ) -> Tuple[Dict[utils.PythonIdentifier, "EndpointCollection"], Schemas, Parameters]:
53
54
  """Parse the openapi paths data to get EndpointCollections by tag"""
@@ -69,6 +70,7 @@ class EndpointCollection:
69
70
  tag=tag,
70
71
  schemas=schemas,
71
72
  parameters=parameters,
73
+ request_bodies=request_bodies,
72
74
  config=config,
73
75
  )
74
76
  # Add `PathItem` parameters
@@ -392,6 +394,7 @@ class Endpoint:
392
394
  tag: str,
393
395
  schemas: Schemas,
394
396
  parameters: Parameters,
397
+ request_bodies: Dict[str, Union[oai.RequestBody, oai.Reference]],
395
398
  config: Config,
396
399
  ) -> Tuple[Union["Endpoint", ParseError], Schemas, Parameters]:
397
400
  """Construct an endpoint from the OpenAPI data"""
@@ -423,7 +426,9 @@ class Endpoint:
423
426
  result, schemas = Endpoint._add_responses(endpoint=result, data=data.responses, schemas=schemas, config=config)
424
427
  if isinstance(result, ParseError):
425
428
  return result, schemas, parameters
426
- bodies, schemas = body_from_data(data=data, schemas=schemas, config=config, endpoint_name=result.name)
429
+ bodies, schemas = body_from_data(
430
+ data=data, schemas=schemas, config=config, endpoint_name=result.name, request_bodies=request_bodies
431
+ )
427
432
  body_errors = []
428
433
  for body in bodies:
429
434
  if isinstance(body, ParseError):
@@ -507,8 +512,9 @@ class GeneratorData:
507
512
  parameters=parameters,
508
513
  config=config,
509
514
  )
515
+ request_bodies = (openapi.components and openapi.components.requestBodies) or {}
510
516
  endpoint_collections_by_tag, schemas, parameters = EndpointCollection.from_data(
511
- data=openapi.paths, schemas=schemas, parameters=parameters, config=config
517
+ data=openapi.paths, schemas=schemas, parameters=parameters, request_bodies=request_bodies, config=config
512
518
  )
513
519
 
514
520
  enums = (prop for prop in schemas.classes_by_name.values() if isinstance(prop, EnumProperty))
@@ -60,7 +60,7 @@ if not isinstance({{ source }}, Unset):
60
60
  {% else %}
61
61
  {{ destination }}: {{ type_string }} = UNSET
62
62
  if not isinstance({{ source }}, Unset):
63
- {{ _transform(property, source, destination, True, "to_dict") | indent(4)}}
63
+ {{ _transform(property, source, destination, True, "to_dict") | indent(4)}}
64
64
  {% endif %}
65
65
  {% endmacro %}
66
66
 
@@ -3,7 +3,7 @@ authors = [
3
3
  { name = "Dylan Anthony", email = "contact@dylananthony.com" },
4
4
  ]
5
5
  license = { text = "MIT" }
6
- requires-python = ">=3.8,<4.0"
6
+ requires-python = ">=3.8.1,<4.0"
7
7
  dependencies = [
8
8
  "jinja2>=3.0.0,<4.0.0",
9
9
  "typer>0.6,<0.13",
@@ -18,7 +18,7 @@ dependencies = [
18
18
  "typing-extensions>=4.8.0,<5.0.0",
19
19
  ]
20
20
  name = "openapi-python-client"
21
- version = "0.21.0"
21
+ version = "0.21.1"
22
22
  description = "Generate modern Python clients from OpenAPI"
23
23
  keywords = [
24
24
  "OpenAPI",
@@ -84,8 +84,6 @@ ignore_missing_imports = true
84
84
  [tool.pytest.ini_options]
85
85
  junit_family = "xunit2"
86
86
 
87
-
88
-
89
87
  [tool.pdm.dev-dependencies]
90
88
  dev = [
91
89
  "pytest",
@@ -98,6 +96,7 @@ dev = [
98
96
  "types-certifi<2021.10.9,>=2020.0.0",
99
97
  "types-python-dateutil<3.0.0,>=2.0.0",
100
98
  "ruamel-yaml-string>=0.1.1",
99
+ "syrupy>=4",
101
100
  ]
102
101
 
103
102
  [tool.pdm.build]