fastapi-router-versioning 0.1.1__tar.gz → 0.1.2__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 (40) hide show
  1. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/PKG-INFO +15 -16
  2. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/README.md +13 -14
  3. fastapi_router_versioning-0.1.2/RELEASE_NOTES.md +47 -0
  4. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/fastapi_router_versioning/__init__.py +1 -1
  5. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/pyproject.toml +1 -1
  6. fastapi_router_versioning-0.1.1/RELEASE_NOTES.md +0 -37
  7. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/.github/dependabot.yml +0 -0
  8. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/.github/workflows/detect-conflicts.yml +0 -0
  9. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/.github/workflows/pre-commit.yml +0 -0
  10. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/.github/workflows/prepare-release.yml +0 -0
  11. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/.github/workflows/publish.yml +0 -0
  12. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/.github/workflows/test-redistribute.yml +0 -0
  13. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/.github/workflows/test.yml +0 -0
  14. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/.gitignore +0 -0
  15. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/.pre-commit-config.yaml +0 -0
  16. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/.python-version +0 -0
  17. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/LICENSE +0 -0
  18. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/examples/calver_app.py +0 -0
  19. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/examples/download_static_assets.py +0 -0
  20. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/examples/multi_router_app.py +0 -0
  21. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/examples/openapi_hook_app.py +0 -0
  22. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/examples/self_hosted_docs_app.py +0 -0
  23. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/examples/semver_app.py +0 -0
  24. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/examples/semver_major_only_app.py +0 -0
  25. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/examples/webhook_versioning_app.py +0 -0
  26. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/fastapi_router_versioning/py.typed +0 -0
  27. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/fastapi_router_versioning/versioner.py +0 -0
  28. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/scripts/format.sh +0 -0
  29. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/scripts/lint.sh +0 -0
  30. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/scripts/prepare_release.py +0 -0
  31. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/scripts/test-cov-html.sh +0 -0
  32. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/scripts/test-cov.sh +0 -0
  33. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/scripts/test.sh +0 -0
  34. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/tests/__init__.py +0 -0
  35. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/tests/test_calver.py +0 -0
  36. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/tests/test_fastapi_integration.py +0 -0
  37. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/tests/test_prepare_release.py +0 -0
  38. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/tests/test_semver.py +0 -0
  39. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/tests/test_versioner.py +0 -0
  40. {fastapi_router_versioning-0.1.1 → fastapi_router_versioning-0.1.2}/uv.lock +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastapi-router-versioning
3
- Version: 0.1.1
4
- Summary: Native, router-based API versioning for FastAPI, featuring per-version docs and a declarative route lifecycle.
3
+ Version: 0.1.2
4
+ Summary: Router-based API versioning for FastAPI, with per-version docs and a declarative route lifecycle.
5
5
  Project-URL: Homepage, https://github.com/mat81black/fastapi-router-versioning
6
6
  Project-URL: Repository, https://github.com/mat81black/fastapi-router-versioning
7
7
  Project-URL: Issues, https://github.com/mat81black/fastapi-router-versioning/issues
@@ -26,15 +26,15 @@ Requires-Python: >=3.10
26
26
  Requires-Dist: fastapi!=0.137.0,!=0.137.1,>=0.120.0
27
27
  Description-Content-Type: text/markdown
28
28
 
29
- # FastAPI Router Versioning (Native API Versioning)
29
+ # FastAPI Router Versioning
30
30
 
31
31
  [![PyPI](https://img.shields.io/pypi/v/fastapi-router-versioning)](https://pypi.org/project/fastapi-router-versioning/)
32
32
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
33
33
  [![Python](https://img.shields.io/pypi/pyversions/fastapi-router-versioning)](https://pypi.org/project/fastapi-router-versioning/)
34
34
 
35
- The native, router-based solution for **API versioning in FastAPI**.
35
+ Router-based API versioning for FastAPI.
36
36
 
37
- If you want to implement **FastAPI API versioning**, you can simply annotate your routes with `@api_version`, call `.versionize()`, and get isolated URL prefixes, per-version Swagger UI, and a full route lifecycle — all without touching your existing application structure.
37
+ FastAPI has no built-in versioning mechanism. The common workaround duplicating routers or managing prefixes manually breaks down quickly as the number of versions grows. This package adds declarative versioning directly on routes, with isolated URL prefixes, per-version Swagger UI, and a full route lifecycle, without touching the existing application structure.
38
38
 
39
39
  ---
40
40
 
@@ -93,7 +93,7 @@ RouterVersioner(app=app, routers=router, version_format=VersionFormat.SEMVER).ve
93
93
  # Mounts: GET /v1_0/items GET /v2_0/items
94
94
  ```
95
95
 
96
- Each version also gets its own Swagger UI at `/v1_0/docs`, `/v2_0/docs`, and so on.
96
+ Each version gets its own Swagger UI at `/v1_0/docs`, `/v2_0/docs`, and so on.
97
97
 
98
98
  ---
99
99
 
@@ -117,9 +117,9 @@ RouterVersioner(app=app, routers=router, version_format=VersionFormat.CALVER).ve
117
117
  # Mounts: GET /2025-01-01/items
118
118
  ```
119
119
 
120
- Any string is a valid CalVer token: `"2025-01-01"`, `"v3"`, `"stable"`, etc.
120
+ Valid CalVer tokens: `"2025-01-01"`, `"v3"`, `"stable"`, etc.
121
121
 
122
- > **CalVer sorting:** versions are sorted lexicographically, so strings must be comparable in the intended order. ISO dates (`"2025-01-01"`) and zero-padded numbers (`"v01"`, `"v02"`) work correctly. Strings like `"v1"`, `"v10"`, `"v2"` will **not** sort correctly and will cause routes to appear in the wrong versions.
122
+ **CalVer sorting:** versions are sorted lexicographically, so tokens must be comparable in the intended order. ISO dates (`"2025-01-01"`) and zero-padded numbers (`"v01"`, `"v02"`) work correctly. Non-padded strings like `"v1"`, `"v10"`, `"v2"` will not sort correctly and will cause routes to appear in the wrong versions.
123
123
 
124
124
  ---
125
125
 
@@ -181,8 +181,8 @@ Call `.versionize()` after constructing the object. It returns the list of activ
181
181
 
182
182
  | Parameter | Type | Required | Description |
183
183
  |---|---|---|---|
184
- | `version` | `tuple[int, int] \| str` | yes | Version when this route is introduced |
185
- | `deprecate_in` | same \| `None` | no | Version when this route is marked deprecated in the docs |
184
+ | `version` | `tuple[int, int] \| str` | yes | First version in which this route is active |
185
+ | `deprecate_in` | same \| `None` | no | Version in which this route is marked deprecated in the docs |
186
186
  | `remove_in` | same \| `None` | no | Version from which this route is removed entirely |
187
187
 
188
188
  All three parameters must match the `version_format` configured on `RouterVersioner`
@@ -278,7 +278,7 @@ RouterVersioner(
278
278
  ).versionize()
279
279
  ```
280
280
 
281
- The hook receives `(schema: dict, version: VersionT)` and must return the (modified) dict.
281
+ The hook receives `(schema: dict, version: VersionT)` and must return the modified dict.
282
282
 
283
283
  ### OpenAPI Callbacks and Webhooks
284
284
 
@@ -325,12 +325,11 @@ RouterVersioner(
325
325
  # /v2_0/openapi.json → webhooks: /order-created (V2) ← /payment-failed removed
326
326
  ```
327
327
 
328
- The same introduce / `remove_in` lifecycle applies. Webhook versions follow route versions:
329
- a new webhook version only appears once a route version creates that API prefix.
328
+ The same `remove_in` lifecycle applies. A new webhook version only appears once a route version creates that API prefix.
330
329
 
331
330
  ### Multiple routers
332
331
 
333
- Pass a list of routers to version routes that are split across modules:
332
+ Pass a list of routers to version routes split across modules:
334
333
 
335
334
  ```python
336
335
  RouterVersioner(
@@ -344,7 +343,7 @@ All routers are versioned together under the same prefix tree.
344
343
 
345
344
  ### Self-hosted docs (air-gapped environments)
346
345
 
347
- By default, Swagger UI and ReDoc assets are loaded from the FastAPI CDN. In air-gapped or corporate environments, point them at assets you host yourself:
346
+ By default, Swagger UI and ReDoc assets are loaded from the FastAPI CDN. In air-gapped or corporate environments, point them at locally hosted assets:
348
347
 
349
348
  ```python
350
349
  RouterVersioner(
@@ -360,7 +359,7 @@ RouterVersioner(
360
359
  ).versionize()
361
360
  ```
362
361
 
363
- See [`examples/download_static_assets.py`](examples/download_static_assets.py) for a ready-made script that downloads all required assets in one step, and [`examples/self_hosted_docs_app.py`](examples/self_hosted_docs_app.py) for a complete working example.
362
+ See [`examples/download_static_assets.py`](examples/download_static_assets.py) for a script that downloads all required assets in one step, and [`examples/self_hosted_docs_app.py`](examples/self_hosted_docs_app.py) for a complete working example.
364
363
 
365
364
  ### Reverse proxy / sub-app mounting
366
365
 
@@ -1,12 +1,12 @@
1
- # FastAPI Router Versioning (Native API Versioning)
1
+ # FastAPI Router Versioning
2
2
 
3
3
  [![PyPI](https://img.shields.io/pypi/v/fastapi-router-versioning)](https://pypi.org/project/fastapi-router-versioning/)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
5
5
  [![Python](https://img.shields.io/pypi/pyversions/fastapi-router-versioning)](https://pypi.org/project/fastapi-router-versioning/)
6
6
 
7
- The native, router-based solution for **API versioning in FastAPI**.
7
+ Router-based API versioning for FastAPI.
8
8
 
9
- If you want to implement **FastAPI API versioning**, you can simply annotate your routes with `@api_version`, call `.versionize()`, and get isolated URL prefixes, per-version Swagger UI, and a full route lifecycle — all without touching your existing application structure.
9
+ FastAPI has no built-in versioning mechanism. The common workaround duplicating routers or managing prefixes manually breaks down quickly as the number of versions grows. This package adds declarative versioning directly on routes, with isolated URL prefixes, per-version Swagger UI, and a full route lifecycle, without touching the existing application structure.
10
10
 
11
11
  ---
12
12
 
@@ -65,7 +65,7 @@ RouterVersioner(app=app, routers=router, version_format=VersionFormat.SEMVER).ve
65
65
  # Mounts: GET /v1_0/items GET /v2_0/items
66
66
  ```
67
67
 
68
- Each version also gets its own Swagger UI at `/v1_0/docs`, `/v2_0/docs`, and so on.
68
+ Each version gets its own Swagger UI at `/v1_0/docs`, `/v2_0/docs`, and so on.
69
69
 
70
70
  ---
71
71
 
@@ -89,9 +89,9 @@ RouterVersioner(app=app, routers=router, version_format=VersionFormat.CALVER).ve
89
89
  # Mounts: GET /2025-01-01/items
90
90
  ```
91
91
 
92
- Any string is a valid CalVer token: `"2025-01-01"`, `"v3"`, `"stable"`, etc.
92
+ Valid CalVer tokens: `"2025-01-01"`, `"v3"`, `"stable"`, etc.
93
93
 
94
- > **CalVer sorting:** versions are sorted lexicographically, so strings must be comparable in the intended order. ISO dates (`"2025-01-01"`) and zero-padded numbers (`"v01"`, `"v02"`) work correctly. Strings like `"v1"`, `"v10"`, `"v2"` will **not** sort correctly and will cause routes to appear in the wrong versions.
94
+ **CalVer sorting:** versions are sorted lexicographically, so tokens must be comparable in the intended order. ISO dates (`"2025-01-01"`) and zero-padded numbers (`"v01"`, `"v02"`) work correctly. Non-padded strings like `"v1"`, `"v10"`, `"v2"` will not sort correctly and will cause routes to appear in the wrong versions.
95
95
 
96
96
  ---
97
97
 
@@ -153,8 +153,8 @@ Call `.versionize()` after constructing the object. It returns the list of activ
153
153
 
154
154
  | Parameter | Type | Required | Description |
155
155
  |---|---|---|---|
156
- | `version` | `tuple[int, int] \| str` | yes | Version when this route is introduced |
157
- | `deprecate_in` | same \| `None` | no | Version when this route is marked deprecated in the docs |
156
+ | `version` | `tuple[int, int] \| str` | yes | First version in which this route is active |
157
+ | `deprecate_in` | same \| `None` | no | Version in which this route is marked deprecated in the docs |
158
158
  | `remove_in` | same \| `None` | no | Version from which this route is removed entirely |
159
159
 
160
160
  All three parameters must match the `version_format` configured on `RouterVersioner`
@@ -250,7 +250,7 @@ RouterVersioner(
250
250
  ).versionize()
251
251
  ```
252
252
 
253
- The hook receives `(schema: dict, version: VersionT)` and must return the (modified) dict.
253
+ The hook receives `(schema: dict, version: VersionT)` and must return the modified dict.
254
254
 
255
255
  ### OpenAPI Callbacks and Webhooks
256
256
 
@@ -297,12 +297,11 @@ RouterVersioner(
297
297
  # /v2_0/openapi.json → webhooks: /order-created (V2) ← /payment-failed removed
298
298
  ```
299
299
 
300
- The same introduce / `remove_in` lifecycle applies. Webhook versions follow route versions:
301
- a new webhook version only appears once a route version creates that API prefix.
300
+ The same `remove_in` lifecycle applies. A new webhook version only appears once a route version creates that API prefix.
302
301
 
303
302
  ### Multiple routers
304
303
 
305
- Pass a list of routers to version routes that are split across modules:
304
+ Pass a list of routers to version routes split across modules:
306
305
 
307
306
  ```python
308
307
  RouterVersioner(
@@ -316,7 +315,7 @@ All routers are versioned together under the same prefix tree.
316
315
 
317
316
  ### Self-hosted docs (air-gapped environments)
318
317
 
319
- By default, Swagger UI and ReDoc assets are loaded from the FastAPI CDN. In air-gapped or corporate environments, point them at assets you host yourself:
318
+ By default, Swagger UI and ReDoc assets are loaded from the FastAPI CDN. In air-gapped or corporate environments, point them at locally hosted assets:
320
319
 
321
320
  ```python
322
321
  RouterVersioner(
@@ -332,7 +331,7 @@ RouterVersioner(
332
331
  ).versionize()
333
332
  ```
334
333
 
335
- See [`examples/download_static_assets.py`](examples/download_static_assets.py) for a ready-made script that downloads all required assets in one step, and [`examples/self_hosted_docs_app.py`](examples/self_hosted_docs_app.py) for a complete working example.
334
+ See [`examples/download_static_assets.py`](examples/download_static_assets.py) for a script that downloads all required assets in one step, and [`examples/self_hosted_docs_app.py`](examples/self_hosted_docs_app.py) for a complete working example.
336
335
 
337
336
  ### Reverse proxy / sub-app mounting
338
337
 
@@ -0,0 +1,47 @@
1
+ # Release Notes
2
+
3
+ ## Latest Changes
4
+
5
+ ## 0.1.2 (2026-06-25)
6
+
7
+ ### Internal
8
+
9
+ * 👷 Add Python 3.14 classifier to `pyproject.toml` to align with the versions already covered by CI.
10
+
11
+ ### Docs
12
+
13
+ * 📝 Update README and `pyproject.toml` to clarify package description and improve documentation consistency. PR [#12](https://github.com/mat81black/fastapi-router-versioning/pull/12) by [@mat81black](https://github.com/mat81black).
14
+
15
+ ## 0.1.1 (2026-06-24)
16
+
17
+ ### Features
18
+
19
+ * ✨ Add per-version OpenAPI schema caching: schemas are generated once and cached, reducing overhead on repeated requests. PR [#5](https://github.com/mat81black/fastapi-router-versioning/pull/5) by [@mat81black](https://github.com/mat81black).
20
+ * ✨ Track which routes belong to each version to invalidate the cache automatically when the route set changes. PR [#5](https://github.com/mat81black/fastapi-router-versioning/pull/5) by [@mat81black](https://github.com/mat81black).
21
+
22
+ ### Fixes
23
+
24
+ * 🐛 Fix WebSocket routes not being handled correctly in `versioned_routers` when the cache was active. PR [#5](https://github.com/mat81black/fastapi-router-versioning/pull/5) by [@mat81black](https://github.com/mat81black).
25
+ * 🐛 Improve OpenAPI schema cache resilience: cache is now safely bypassed on unexpected errors instead of raising. PR [#5](https://github.com/mat81black/fastapi-router-versioning/pull/5) by [@mat81black](https://github.com/mat81black).
26
+
27
+ ### Internal
28
+
29
+ * 👷 Add `prepare-release.yml` workflow and `scripts/prepare_release.py` for automated version bumping and release PR creation. PR [#6](https://github.com/mat81black/fastapi-router-versioning/pull/6) by [@mat81black](https://github.com/mat81black).
30
+ * 👷 Add `changes` job to `test.yml` and `test-redistribute.yml` to skip CI when no relevant files are modified. PR [#10](https://github.com/mat81black/fastapi-router-versioning/pull/10) by [@mat81black](https://github.com/mat81black).
31
+
32
+ ## 0.1.0 (2025-06-24)
33
+
34
+ 🚀 First official public release of **fastapi-router-versioning**.
35
+
36
+ Router-based API versioning for FastAPI, with declarative route lifecycle, per-version OpenAPI schemas, and isolated documentation — without altering the core application structure.
37
+
38
+ ### Features
39
+
40
+ * ✨ SemVer & CalVer support: route versioning using `(major, minor)` tuples or lexicographically sortable arbitrary strings.
41
+ * ✨ Declarative route lifecycle: introduce, deprecate (`deprecate_in`), and remove (`remove_in`) routes across versions.
42
+ * ✨ Per-version documentation: isolated Swagger UI, ReDoc, and `openapi.json` for each active version.
43
+ * ✨ OpenAPI schema hook: modify the filtered schema per version via `openapi_hook`.
44
+ * ✨ Independent webhook versioning via `webhook_routers`, with propagation of per-route OpenAPI Callbacks.
45
+ * ✨ Latest-version alias: expose the highest active version under a stable configurable prefix.
46
+ * ✨ Self-hosted docs: full control over Swagger/ReDoc static assets and option to disable Google Fonts.
47
+ * ✨ Reverse proxy aware: resolves and injects the ASGI `root_path` at request time.
@@ -1,5 +1,5 @@
1
1
  from .versioner import RouterVersioner, VersionFormat, VersionT, api_version
2
2
 
3
- __version__ = "0.1.1"
3
+ __version__ = "0.1.2"
4
4
 
5
5
  __all__ = ["RouterVersioner", "api_version", "VersionFormat", "VersionT"]
@@ -5,7 +5,7 @@ build-backend = "hatchling.build"
5
5
  [project]
6
6
  name = "fastapi-router-versioning"
7
7
  dynamic = ["version"]
8
- description = "Native, router-based API versioning for FastAPI, featuring per-version docs and a declarative route lifecycle."
8
+ description = "Router-based API versioning for FastAPI, with per-version docs and a declarative route lifecycle."
9
9
  readme = "README.md"
10
10
  license = "MIT"
11
11
  license-files = ["LICENSE"]
@@ -1,37 +0,0 @@
1
- # Release Notes
2
-
3
- ## Latest Changes
4
-
5
- ## 0.1.1 (2026-06-24)
6
-
7
- ### Features
8
-
9
- * ✨ Add per-version OpenAPI schema caching: schemas are generated once and cached, significantly reducing overhead on repeated requests.
10
- * ✨ Track which routes belong to each version to invalidate the cache automatically when the route set changes.
11
-
12
- ### Fixes
13
-
14
- * 🐛 Fix WebSocket routes not being handled correctly in `versioned_routers` when the cache was active.
15
- * 🐛 Improve OpenAPI schema cache resilience: cache is now safely bypassed on unexpected errors instead of raising.
16
-
17
- ### Internal
18
-
19
- * 👷 Add `prepare-release.yml` workflow and `scripts/prepare_release.py` for automated version bumping and release PR creation.
20
- * 👷 Add `changes` job to `test.yml` and `test-redistribute.yml` to skip CI when no relevant files are modified.
21
-
22
- ## 0.1.0 (2025-06-24)
23
-
24
- 🚀 First official public release of **fastapi-router-versioning**.
25
-
26
- This library provides an elegant, native, router-based solution for **FastAPI API versioning**. It allows you to manage the entire lifecycle of your endpoints declaratively with a single decorator, automatically generating isolated schemas and documentation for every version without altering your core application structure.
27
-
28
- ### Features
29
-
30
- * ✨ SemVer & CalVer support: route versioning using `(major, minor)` tuples or lexicographically sortable arbitrary strings (like ISO dates).
31
- * ✨ Declarative route lifecycle: introduce, deprecate (`deprecate_in`), and remove (`remove_in`) routes across versions.
32
- * ✨ Per-version documentation: isolated Swagger UI, ReDoc, and `openapi.json` for each active version.
33
- * ✨ Advanced OpenAPI customization via `openapi_hook`: manipulate the filtered JSON schema per version (vendor extensions, custom logos, API Gateway integrations).
34
- * ✨ Independent webhook versioning via `webhook_routers`, with native propagation of per-route OpenAPI Callbacks and WebSockets.
35
- * ✨ Latest-version alias: expose the highest active version under a stable configurable prefix (e.g. `/latest`).
36
- * ✨ Enterprise & air-gapped ready: full control over Swagger/ReDoc static assets and option to disable Google Fonts.
37
- * ✨ Reverse proxy aware: dynamically resolves and injects the ASGI `root_path` at request time.