essentials-openapi 1.1.0__tar.gz → 1.2.0__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 (71) hide show
  1. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/.gitignore +1 -0
  2. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/CHANGELOG.md +18 -0
  3. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/PKG-INFO +1 -1
  4. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/__init__.py +1 -1
  5. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/__init__.py +37 -5
  6. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_markdown/partial/servers.html +1 -1
  7. essentials_openapi-1.2.0/openapidocs/v3.py +947 -0
  8. essentials_openapi-1.1.0/openapidocs/v3.py +0 -364
  9. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/LICENSE +0 -0
  10. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/README.md +0 -0
  11. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/commands/__init__.py +0 -0
  12. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/commands/docs.py +0 -0
  13. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/common.py +0 -0
  14. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/logs.py +0 -0
  15. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/main.py +0 -0
  16. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/__init__.py +0 -0
  17. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/common.py +0 -0
  18. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/contents.py +0 -0
  19. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/generate.py +0 -0
  20. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/jinja.py +0 -0
  21. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/md.py +0 -0
  22. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/texts.py +0 -0
  23. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/examples.py +0 -0
  24. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_markdown/README.md +0 -0
  25. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_markdown/__init__.py +0 -0
  26. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_markdown/layout.html +0 -0
  27. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_markdown/partial/components-parameters.html +0 -0
  28. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_markdown/partial/components-responses.html +0 -0
  29. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_markdown/partial/components-schemas.html +0 -0
  30. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_markdown/partial/components-security-schemes.html +0 -0
  31. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_markdown/partial/content-examples.html +0 -0
  32. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_markdown/partial/external-docs.html +0 -0
  33. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_markdown/partial/info.html +0 -0
  34. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_markdown/partial/path-items.html +0 -0
  35. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_markdown/partial/request-auth.html +0 -0
  36. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_markdown/partial/request-body.html +0 -0
  37. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_markdown/partial/request-parameters.html +0 -0
  38. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_markdown/partial/request-responses.html +0 -0
  39. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_markdown/partial/schema-repr.html +0 -0
  40. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_markdown/partial/tags.html +0 -0
  41. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_markdown/partial/type.html +0 -0
  42. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_mkdocs/README.md +0 -0
  43. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_mkdocs/__init__.py +0 -0
  44. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_mkdocs/layout.html +0 -0
  45. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_mkdocs/partial/components-parameters.html +0 -0
  46. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_mkdocs/partial/components-responses.html +0 -0
  47. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_mkdocs/partial/components-schemas.html +0 -0
  48. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_mkdocs/partial/components-security-schemes.html +0 -0
  49. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_mkdocs/partial/content-examples.html +0 -0
  50. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_mkdocs/partial/external-docs.html +0 -0
  51. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_mkdocs/partial/info.html +0 -0
  52. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_mkdocs/partial/path-items.html +0 -0
  53. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_mkdocs/partial/request-auth.html +0 -0
  54. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_mkdocs/partial/request-body.html +0 -0
  55. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_mkdocs/partial/request-parameters.html +0 -0
  56. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_mkdocs/partial/request-responses.html +0 -0
  57. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_mkdocs/partial/schema-repr.html +0 -0
  58. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_mkdocs/partial/servers.html +0 -0
  59. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_mkdocs/partial/tags.html +0 -0
  60. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_mkdocs/partial/type.html +0 -0
  61. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_plantuml_api/README.md +0 -0
  62. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_plantuml_api/layout.html +0 -0
  63. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_plantuml_api/partial/schema-repr.html +0 -0
  64. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_plantuml_schemas/README.md +0 -0
  65. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_plantuml_schemas/layout.html +0 -0
  66. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/mk/v3/views_plantuml_schemas/partial/schema-repr.html +0 -0
  67. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/utils/__init__.py +0 -0
  68. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/utils/source.py +0 -0
  69. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/utils/web.py +0 -0
  70. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/openapidocs/v2.py +0 -0
  71. {essentials_openapi-1.1.0 → essentials_openapi-1.2.0}/pyproject.toml +0 -0
@@ -9,3 +9,4 @@ _test_files/
9
9
  dist/
10
10
  venv312/
11
11
  .local
12
+ v3_debug_*
@@ -5,6 +5,24 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.2.0] - 2025-04-27
9
+
10
+ - Update objects to the OpenAPI Specification v3.1, by @tyzhnenko.
11
+ - Add docstrings to all `v3` classes.
12
+ - Upgrade the `v3.OpenAPI` class from OpenAPI version `3.0.3` to `3.1.0`.
13
+
14
+ ## [1.1.1] - 2025-03-20
15
+
16
+ - Fix bug in `MARKDOWN` view for `servers` (displaying twice the `description`
17
+ instead of `description` and `url`).
18
+ - Fix bug happening when a `path item` includes properties that are not of kind
19
+ `operation item` (https://github.com/Neoteroi/mkdocs-plugins/issues/5).
20
+ - Add support for handling `parameters` defined on `path items` (common
21
+ parameters for all operation under a certain path).
22
+ Refer to the [`Path Item` specification](https://swagger.io/specification/#path-item-object).
23
+ - Fix bug happening when a parameter has a non-str `name` property.
24
+ - Add Python 3.13 to the build matrix.
25
+
8
26
  ## [1.1.0] - 2025-01-18
9
27
 
10
28
  - Add additionalProperties to Schema object, by @tyzhnenko.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: essentials-openapi
3
- Version: 1.1.0
3
+ Version: 1.2.0
4
4
  Summary: Classes to generate OpenAPI Documentation v3 and v2, in JSON and YAML.
5
5
  Project-URL: Homepage, https://github.com/Neoteroi/essentials-openapi
6
6
  Project-URL: Bug Tracker, https://github.com/Neoteroi/essentials-openapi/issues
@@ -1,2 +1,2 @@
1
- __version__ = "1.1.0"
1
+ __version__ = "1.2.0"
2
2
  VERSION = __version__
@@ -178,6 +178,8 @@ class OpenAPIV3DocumentationHandler:
178
178
  paths = data["paths"]
179
179
 
180
180
  for path, path_item in paths.items():
181
+ if not isinstance(path_item, dict):
182
+ continue
181
183
  tag = self.get_tag(path_item) or ""
182
184
 
183
185
  for operation in path_item.values():
@@ -186,11 +188,32 @@ class OpenAPIV3DocumentationHandler:
186
188
  operation["requestBody"] = self._resolve_opt_ref(
187
189
  operation["requestBody"]
188
190
  )
189
-
190
- groups[tag].append((path, path_item))
191
+ groups[tag].append((path, self._keep_operations(path_item)))
191
192
 
192
193
  return groups
193
194
 
195
+ def _keep_operations(self, path_item):
196
+ # discard dictionary keys that are not of dict type
197
+
198
+ # if the path item defines common parameters, merge them into each operation:
199
+ # https://swagger.io/specification/#path-item-object
200
+ common_parameters = path_item.get("parameters", [])
201
+ # Note: we don't need to resolve $ref here, because they are resolved in
202
+ # get_parameters
203
+
204
+ return {
205
+ key: self._merge_common_parameters(value, common_parameters)
206
+ for key, value in path_item.items()
207
+ if isinstance(value, dict)
208
+ }
209
+
210
+ def _merge_common_parameters(self, operation, common_parameters):
211
+ if not common_parameters:
212
+ return operation
213
+ data = copy.deepcopy(operation)
214
+ data["parameters"] = common_parameters + data.get("parameters", [])
215
+ return data
216
+
194
217
  def get_schemas(self):
195
218
  schemas = read_dict(self.doc, "components", "schemas")
196
219
 
@@ -215,8 +238,12 @@ class OpenAPIV3DocumentationHandler:
215
238
  """
216
239
  single_tag: Optional[str] = None
217
240
 
218
- for operation in path_item.values():
219
- tags = operation.get("tags")
241
+ for prop in path_item.values():
242
+ if not isinstance(prop, dict):
243
+ # This property is not an operation; in this context we ignore it.
244
+ # See Path Item Object here: https://swagger.io/specification/
245
+ continue
246
+ tags = prop.get("tags")
220
247
 
221
248
  if not tags:
222
249
  continue
@@ -383,6 +410,11 @@ class OpenAPIV3DocumentationHandler:
383
410
  return self.resolve_reference(obj)
384
411
  return obj
385
412
 
413
+ def _lower(self, obj):
414
+ if isinstance(obj, str):
415
+ return obj.lower()
416
+ return str(obj)
417
+
386
418
  def get_parameters(self, operation) -> List[dict]:
387
419
  """
388
420
  Returns a list of objects describing the input parameters for a given operation.
@@ -397,7 +429,7 @@ class OpenAPIV3DocumentationHandler:
397
429
  param
398
430
  for param in sorted(
399
431
  parameters,
400
- key=lambda x: x["name"].lower() if (x and "name" in x) else "",
432
+ key=lambda x: self._lower(x["name"]) if (x and "name" in x) else "",
401
433
  )
402
434
  if param
403
435
  ]
@@ -3,7 +3,7 @@
3
3
 
4
4
  {% with rows = [[texts.description, texts.url]] %}
5
5
  {%- for server in servers -%}
6
- {%- set _ = rows.append([server.description, server.description]) -%}
6
+ {%- set _ = rows.append([server.description, server.url]) -%}
7
7
  {%- endfor -%}
8
8
  {{ rows | table }}
9
9
  {%- endwith -%}