ab-openapi-python-generator 2.2.5__tar.gz → 2.2.7__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 (94) hide show
  1. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/PKG-INFO +1 -1
  2. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/pyproject.toml +1 -1
  3. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/language_converters/python/client_generator.py +40 -32
  4. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/language_converters/python/generator.py +9 -0
  5. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/language_converters/python/model_generator.py +9 -4
  6. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/language_converters/python/templates/async_client_httpx_pydantic_2.jinja2 +6 -1
  7. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/language_converters/python/templates/sync_client_httpx_pydantic_2.jinja2 +6 -1
  8. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/.envrc.example +0 -0
  9. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/.gitattributes +0 -0
  10. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/.github/dependabot.yml +0 -0
  11. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/.github/workflows/ci.yaml +0 -0
  12. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/.github/workflows/publish.yaml +0 -0
  13. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/.gitignore +0 -0
  14. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/.pre-commit-config.yaml +0 -0
  15. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/.vscode/launch.json +0 -0
  16. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/.vscode/tasks.json +0 -0
  17. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/LICENSE +0 -0
  18. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/Makefile +0 -0
  19. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/README.md +0 -0
  20. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/docs/acknowledgements/index.md +0 -0
  21. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/docs/css/custom.css +0 -0
  22. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/docs/css/termynal.css +0 -0
  23. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/docs/index.md +0 -0
  24. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/docs/js/custom.js +0 -0
  25. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/docs/js/termynal.js +0 -0
  26. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/docs/openapi-definition.md +0 -0
  27. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/docs/quick_start.md +0 -0
  28. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/docs/references/index.md +0 -0
  29. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/docs/references/module_usage.md +0 -0
  30. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/docs/tutorial/advanced.md +0 -0
  31. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/docs/tutorial/authentication.md +0 -0
  32. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/docs/tutorial/index.md +0 -0
  33. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/logo.png +0 -0
  34. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/__init__.py +0 -0
  35. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/__main__.py +0 -0
  36. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/common.py +0 -0
  37. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/generate_data.py +0 -0
  38. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/language_converters/__init__.py +0 -0
  39. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/language_converters/python/__init__.py +0 -0
  40. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/language_converters/python/common.py +0 -0
  41. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/language_converters/python/exception_generator.py +0 -0
  42. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/language_converters/python/jinja_config.py +0 -0
  43. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/language_converters/python/templates/alias_union.jinja2 +0 -0
  44. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/language_converters/python/templates/discriminator_enum.jinja2 +0 -0
  45. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/language_converters/python/templates/enum.jinja2 +0 -0
  46. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/language_converters/python/templates/http_exception.jinja2 +0 -0
  47. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/language_converters/python/templates/models.jinja2 +0 -0
  48. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/language_converters/python/templates/models_pydantic_2.jinja2 +0 -0
  49. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/models.py +0 -0
  50. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/parsers/__init__.py +0 -0
  51. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/parsers/openapi_30.py +0 -0
  52. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/parsers/openapi_31.py +0 -0
  53. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/py.typed +0 -0
  54. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/src/ab_openapi_python_generator/version_detector.py +0 -0
  55. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/__init__.py +0 -0
  56. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/build_test_api/api.py +0 -0
  57. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/conftest.py +0 -0
  58. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_common_normalize_symbol.py +0 -0
  59. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_data/failing_api.json +0 -0
  60. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_data/gitea_issue_11.json +0 -0
  61. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_data/issue_117.json +0 -0
  62. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_data/issue_120.json +0 -0
  63. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_data/issue_17.json +0 -0
  64. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_data/issue_30_87.json +0 -0
  65. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_data/issue_51.json +0 -0
  66. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_data/issue_55.json +0 -0
  67. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_data/issue_71.json +0 -0
  68. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_data/issue_71_31.json +0 -0
  69. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_data/issue_illegal_character_in_operation_id.json +0 -0
  70. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_data/issue_keyword_parameter_name.json +0 -0
  71. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_data/openapi_gitea_converted.json +0 -0
  72. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_data/swagger_petstore_3_0_4.yaml +0 -0
  73. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_data/swagger_petstore_3_1.yaml +0 -0
  74. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_data/test_api.json +0 -0
  75. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_data/test_api_31.json +0 -0
  76. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_generate_data.py +0 -0
  77. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_generate_data_negative.py +0 -0
  78. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_generated_code.py +0 -0
  79. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_jinja_no_autoescape.py +0 -0
  80. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_main.py +0 -0
  81. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_model_docstring.py +0 -0
  82. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_model_generator.py +0 -0
  83. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_model_generator_edges.py +0 -0
  84. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_openapi_30.py +0 -0
  85. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_openapi_31.py +0 -0
  86. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_openapi_31_completeness.py +0 -0
  87. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_openapi_31_coverage.py +0 -0
  88. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_openapi_31_schema_features.py +0 -0
  89. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_service_generator.py +0 -0
  90. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_service_generator_edges.py +0 -0
  91. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_swagger_petstore_30.py +0 -0
  92. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_swagger_petstore_31.py +0 -0
  93. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tests/test_version_detector_edges.py +0 -0
  94. {ab_openapi_python_generator-2.2.5 → ab_openapi_python_generator-2.2.7}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ab-openapi-python-generator
3
- Version: 2.2.5
3
+ Version: 2.2.7
4
4
  Summary: Openapi Python Generator
5
5
  Project-URL: Homepage, https://github.com/auth-broker/openapi-python-generator
6
6
  Project-URL: Repository, https://github.com/auth-broker/openapi-python-generator
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ab-openapi-python-generator"
3
- version = "2.2.5"
3
+ version = "2.2.7"
4
4
  description = "Openapi Python Generator"
5
5
  authors = [
6
6
  { name = "Marco Müllner", email = "muellnermarco@gmail.com" },
@@ -144,38 +144,46 @@ HTTP_OPERATIONS = ["get", "post", "put", "delete", "options", "head", "patch", "
144
144
  def generate_body_param(operation: Operation) -> Union[str, None]:
145
145
  if operation.requestBody is None:
146
146
  return None
147
- else:
148
- if isinstance(operation.requestBody, Reference30) or isinstance(operation.requestBody, Reference31):
149
- return "data.dict()"
150
-
151
- if operation.requestBody.content is None:
152
- return None # pragma: no cover
153
-
154
- if operation.requestBody.content.get("application/json") is None:
155
- return None # pragma: no cover
156
-
157
- media_type = operation.requestBody.content.get("application/json")
158
-
159
- if media_type is None:
160
- return None # pragma: no cover
161
-
162
- if isinstance(media_type.media_type_schema, (Reference, Reference30, Reference31)):
163
- return "data.dict()"
164
- elif hasattr(media_type.media_type_schema, "ref"):
165
- # Handle Reference objects from different OpenAPI versions
166
- return "data.dict()"
167
- elif isinstance(media_type.media_type_schema, (Schema, Schema30, Schema31)):
168
- schema = media_type.media_type_schema
169
- if schema.type == "array":
170
- return "[i.dict() for i in data]"
171
- elif schema.type == "object":
172
- return "data"
173
- else:
174
- raise Exception(f"Unsupported schema type for request body: {schema.type}") # pragma: no cover
175
- else:
176
- raise Exception(
177
- f"Unsupported schema type for request body: {type(media_type.media_type_schema)}"
178
- ) # pragma: no cover
147
+
148
+ # If requestBody is a $ref, it will be a Pydantic model instance in the client.
149
+ if isinstance(operation.requestBody, (Reference30, Reference31)):
150
+ return "data.model_dump(by_alias=True, exclude_none=True)"
151
+
152
+ rb_content = getattr(operation.requestBody, "content", None)
153
+ if rb_content is None:
154
+ return None # pragma: no cover
155
+
156
+ if rb_content.get("application/json") is None:
157
+ return None # pragma: no cover
158
+
159
+ media_type = rb_content.get("application/json")
160
+ if media_type is None:
161
+ return None # pragma: no cover
162
+
163
+ mts = getattr(media_type, "media_type_schema", None)
164
+ if mts is None:
165
+ return None # pragma: no cover
166
+
167
+ # $ref schema -> model
168
+ if isinstance(mts, (Reference, Reference30, Reference31)) or hasattr(mts, "ref"):
169
+ return "data.model_dump(by_alias=True, exclude_none=True)"
170
+
171
+ # Concrete schema
172
+ if isinstance(mts, (Schema, Schema30, Schema31)):
173
+ schema = mts
174
+
175
+ if schema.type == "array":
176
+ # List of models or primitives
177
+ return "[i.model_dump(by_alias=True, exclude_none=True) if hasattr(i, 'model_dump') else i for i in data]"
178
+
179
+ if schema.type == "object":
180
+ # Model or dict-like
181
+ return "data.model_dump(by_alias=True, exclude_none=True) if hasattr(data, 'model_dump') else data"
182
+
183
+ # Primitive (string/int/etc.)
184
+ return "data"
185
+
186
+ raise Exception(f"Unsupported schema type for request body: {type(mts)}") # pragma: no cover
179
187
 
180
188
 
181
189
  def generate_params(operation: Operation) -> str:
@@ -13,6 +13,7 @@ from ab_openapi_python_generator.language_converters.python.exception_generator
13
13
  )
14
14
  from ab_openapi_python_generator.language_converters.python.model_generator import (
15
15
  generate_models,
16
+ generate_response_union_alias_models,
16
17
  )
17
18
  from ab_openapi_python_generator.models import ConversionResult, LibraryConfig
18
19
 
@@ -40,6 +41,14 @@ def generator(
40
41
  else:
41
42
  models = []
42
43
 
44
+ # Generate response union alias models (e.g. AuthorizeResponse) from paths
45
+ # so client return types that reference those aliases have corresponding
46
+ # model modules available in the output.
47
+ if data.paths is not None:
48
+ resp_alias_models = generate_response_union_alias_models(data.paths, pydantic_version)
49
+ if resp_alias_models:
50
+ models.extend(resp_alias_models)
51
+
43
52
  if data.paths is not None:
44
53
  clients = generate_clients(data, data.paths, library_config, env_token_name, pydantic_version)
45
54
  else:
@@ -757,16 +757,21 @@ def _generate_property_from_schema(
757
757
  """
758
758
  required = parent_schema is not None and parent_schema.required is not None and name in parent_schema.required
759
759
 
760
- import_type = None
760
+ # Pick up OpenAPI default (if present)
761
+ default_val = getattr(schema, "default", None)
762
+
761
763
  if required:
762
- import_type = [] if name == model_name else [name]
764
+ rendered_default = None
765
+ else:
766
+ # If OpenAPI provides a default, use it. Otherwise fall back to None.
767
+ rendered_default = repr(default_val) if default_val is not None else "None"
763
768
 
764
769
  return Property(
765
770
  name=name,
766
771
  type=type_converter(schema, required, model_name),
767
772
  required=required,
768
- default=None if required else "None",
769
- import_type=import_type,
773
+ default=rendered_default,
774
+ import_type=None if not required else ([] if name == model_name else [name]),
770
775
  )
771
776
 
772
777
 
@@ -57,15 +57,20 @@ AsyncGenerator[str | dict[str, Any], None]
57
57
  path = f"{{ op.path_name }}"
58
58
 
59
59
  headers = {
60
+ {% if op.body_param %}
60
61
  "Content-Type": "application/json",
62
+ {% endif %}
61
63
  {% if op.is_sse %}
62
64
  "Accept": "text/event-stream",
63
65
  {% else %}
64
66
  "Accept": "application/json",
65
67
  {% endif %}
66
- "Authorization": f"Bearer { await self.get_access_token() }",
67
68
  }
68
69
 
70
+ _token = await self.get_access_token()
71
+ if _token:
72
+ headers["Authorization"] = f"Bearer {_token}"
73
+
69
74
  query_params: Dict[str, Any] = {
70
75
  {% for qp in op.query_params %}
71
76
  {{ qp }},
@@ -57,15 +57,20 @@ Generator[str | dict[str, Any], None, None]
57
57
  path = f"{{ op.path_name }}"
58
58
 
59
59
  headers = {
60
+ {% if op.body_param %}
60
61
  "Content-Type": "application/json",
62
+ {% endif %}
61
63
  {% if op.is_sse %}
62
64
  "Accept": "text/event-stream",
63
65
  {% else %}
64
66
  "Accept": "application/json",
65
67
  {% endif %}
66
- "Authorization": f"Bearer { self.get_access_token() }",
67
68
  }
68
69
 
70
+ _token = self.get_access_token()
71
+ if _token:
72
+ headers["Authorization"] = f"Bearer {_token}"
73
+
69
74
  query_params: Dict[str, Any] = {
70
75
  {% for qp in op.query_params %}
71
76
  {{ qp }},