This is an automated email from the ASF dual-hosted git repository.
jscheffl pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new dc2e21b39bf Replace Sphinx Redoc with Swagger API Docs (#67390)
dc2e21b39bf is described below
commit dc2e21b39bfee9c820a6847495f5747de64397be
Author: Jens Scheffler <[email protected]>
AuthorDate: Fri May 29 11:40:40 2026 +0200
Replace Sphinx Redoc with Swagger API Docs (#67390)
* Replace Sphinx Redoc with Swagger API Docs
* Upgrade Swagger version
* Fix CSS for dark mode
* Upgrade swagger-plugin-for-sphinx>=7.1.0 and remove mirror logic
* Cleanup
---
airflow-core/docs/conf.py | 39 +++--------
.../auth-manager/simple/sam-token-api-ref.rst | 6 +-
airflow-core/docs/stable-rest-api-ref.rst | 10 +--
airflow-ctl/docs/conf.py | 7 --
devel-common/pyproject.toml | 5 +-
devel-common/sphinx_design/static/custom.css | 50 +++++++++++++++
devel-common/src/docs/provider_conf.py | 75 ++++++----------------
devel-common/src/docs/utils/conf_constants.py | 17 +++--
.../docs/edge-api-ref.rst} | 9 ++-
providers/edge3/docs/index.rst | 1 +
providers/fab/docs/api-ref/fab-api-ref.rst | 5 +-
providers/keycloak/docs/api-ref/token-api-ref.rst | 5 +-
pyproject.toml | 7 ++
uv.lock | 40 ++++++------
14 files changed, 140 insertions(+), 136 deletions(-)
diff --git a/airflow-core/docs/conf.py b/airflow-core/docs/conf.py
index 71e2b0cd06a..d8e0d76ef53 100644
--- a/airflow-core/docs/conf.py
+++ b/airflow-core/docs/conf.py
@@ -24,7 +24,6 @@ import logging
import os
import pathlib
import re
-from pathlib import Path
from typing import Any
from docs.utils.conf_constants import (
@@ -37,12 +36,14 @@ from docs.utils.conf_constants import (
AUTOAPI_OPTIONS,
BASIC_AUTOAPI_IGNORE_PATTERNS,
BASIC_SPHINX_EXTENSIONS,
- REDOC_SCRIPT_URL,
SMARTQUOTES_EXCLUDES,
SPELLING_WORDLIST_PATH,
SPHINX_DESIGN_STATIC_PATH,
- SPHINX_REDOC_EXTENSIONS,
+ SPHINX_SWAGGER_EXTENSION,
SUPPRESS_WARNINGS,
+ SWAGGER_BUNDLE_URI,
+ SWAGGER_CSS_URI,
+ SWAGGER_PRESENT_URI,
filter_autoapi_ignore_entries,
get_autodoc_mock_imports,
get_configs_and_deprecations,
@@ -58,8 +59,6 @@ from docs.utils.conf_constants import (
from packaging.version import Version, parse as parse_version
import airflow
-from airflow.api_fastapi.auth.managers.simple.openapi import __file__ as
sam_openapi_file
-from airflow.api_fastapi.core_api.openapi import __file__ as main_openapi_file
from airflow.configuration import retrieve_configuration_description
PACKAGE_NAME = "apache-airflow"
@@ -91,11 +90,12 @@ smartquotes_excludes = SMARTQUOTES_EXCLUDES
# ones.
extensions = BASIC_SPHINX_EXTENSIONS
-# -- Options for sphinxcontrib.redoc
-------------------------------------------
-# See: https://sphinxcontrib-redoc.readthedocs.io/en/stable/
+extensions.append(SPHINX_SWAGGER_EXTENSION)
-extensions.extend(SPHINX_REDOC_EXTENSIONS)
-redoc_script_url = REDOC_SCRIPT_URL
+swagger_present_uri = SWAGGER_PRESENT_URI
+swagger_bundle_uri = SWAGGER_BUNDLE_URI
+swagger_css_uri = SWAGGER_CSS_URI
+swagger_mirror_external_resources = True # Ensure we embed external resources
prevent tracking
extensions.extend(
[
@@ -357,27 +357,6 @@ spelling_ignore_importable_modules = True
graphviz_output_format = "svg"
-main_openapi_path =
Path(main_openapi_file).parent.joinpath("v2-rest-api-generated.yaml")
-sam_openapi_path =
Path(sam_openapi_file).parent.joinpath("v2-simple-auth-manager-generated.yaml")
-redoc = [
- {
- "name": "Simple auth manager token API",
- "page": "core-concepts/auth-manager/simple/sam-token-api-ref",
- "spec": sam_openapi_path.as_posix(),
- "opts": {
- "hide-hostname": True,
- },
- },
- {
- "name": "Airflow REST API",
- "page": "stable-rest-api-ref",
- "spec": main_openapi_path.as_posix(),
- "opts": {
- "hide-hostname": True,
- },
- },
-]
-
def setup(sphinx):
sphinx.connect("autoapi-skip-member", skip_util_classes_extension)
diff --git
a/airflow-core/docs/core-concepts/auth-manager/simple/sam-token-api-ref.rst
b/airflow-core/docs/core-concepts/auth-manager/simple/sam-token-api-ref.rst
index 02fd335086d..518e6e97449 100644
--- a/airflow-core/docs/core-concepts/auth-manager/simple/sam-token-api-ref.rst
+++ b/airflow-core/docs/core-concepts/auth-manager/simple/sam-token-api-ref.rst
@@ -19,5 +19,7 @@
Simple auth manager token API
=============================
-It's a stub file. It will be converted automatically during the build process
-to the valid documentation by the Sphinx plugin. See: /docs/conf.py
+.. swagger-plugin::
../../../../src/airflow/api_fastapi/auth/managers/simple/openapi/v2-simple-auth-manager-generated.yaml
+ :id: sam-token-api-ref
+ :page-title: Simple auth manager token API
+ :swagger-options: { "tryItOutEnabled": "false", "supportedSubmitMethods":
[] }
diff --git a/airflow-core/docs/stable-rest-api-ref.rst
b/airflow-core/docs/stable-rest-api-ref.rst
index a02e89b5a59..bde135f3ec7 100644
--- a/airflow-core/docs/stable-rest-api-ref.rst
+++ b/airflow-core/docs/stable-rest-api-ref.rst
@@ -16,8 +16,10 @@
specific language governing permissions and limitations
under the License.
-Airflow public API reference
-============================
+Airflow public REST API reference
+=================================
-It's a stub file. It will be converted automatically during the build process
-to the valid documentation by the Sphinx plugin. See: airflow-core/docs/conf.py
+.. swagger-plugin::
../src/airflow/api_fastapi/core_api/openapi/v2-rest-api-generated.yaml
+ :id: core-rest-api-ref
+ :page-title: Airflow public REST API
+ :swagger-options: { "tryItOutEnabled": "false", "supportedSubmitMethods":
[] }
diff --git a/airflow-ctl/docs/conf.py b/airflow-ctl/docs/conf.py
index 5a19b2adea3..055de186d3e 100644
--- a/airflow-ctl/docs/conf.py
+++ b/airflow-ctl/docs/conf.py
@@ -33,11 +33,9 @@ from docs.utils.conf_constants import (
AUTOAPI_OPTIONS,
BASIC_AUTOAPI_IGNORE_PATTERNS,
BASIC_SPHINX_EXTENSIONS,
- REDOC_SCRIPT_URL,
SMARTQUOTES_EXCLUDES,
SPELLING_WORDLIST_PATH,
SPHINX_DESIGN_STATIC_PATH,
- SPHINX_REDOC_EXTENSIONS,
SUPPRESS_WARNINGS,
filter_autoapi_ignore_entries,
get_autodoc_mock_imports,
@@ -88,11 +86,6 @@ smartquotes_excludes = SMARTQUOTES_EXCLUDES
# ones.
extensions = BASIC_SPHINX_EXTENSIONS
-# -- Options for sphinxcontrib.redoc
-------------------------------------------
-# See: https://sphinxcontrib-redoc.readthedocs.io/en/stable/
-
-extensions.extend(SPHINX_REDOC_EXTENSIONS)
-redoc_script_url = REDOC_SCRIPT_URL
extensions.extend(
[
diff --git a/devel-common/pyproject.toml b/devel-common/pyproject.toml
index 845802eb257..bd3a4ecf3c1 100644
--- a/devel-common/pyproject.toml
+++ b/devel-common/pyproject.toml
@@ -98,12 +98,9 @@ dependencies = [
"sphinxcontrib-jsmath>=1.0.1",
"sphinxcontrib-mermaid>=1.0.0",
"sphinxcontrib-qthelp>=1.0.3",
- "sphinxcontrib-redoc>=1.6.0",
"sphinxcontrib-serializinghtml>=1.1.5",
"sphinxcontrib-spelling>=8.0.0",
- # setuptools 82.0.0+ causes redoc to fail due to pkg_resources removal
- # until https://github.com/sphinx-contrib/redoc/issues/53 is resolved
- "setuptools<82.0.0",
+ "swagger-plugin-for-sphinx>=7.1.0",
]
"docs-gen" = [
"diagrams>=0.24.4",
diff --git a/devel-common/sphinx_design/static/custom.css
b/devel-common/sphinx_design/static/custom.css
index fecb79f96b6..8ead5f275bc 100644
--- a/devel-common/sphinx_design/static/custom.css
+++ b/devel-common/sphinx_design/static/custom.css
@@ -97,3 +97,53 @@ a.headerlink svg {
margin: -117px 0 0; /* negative fixed header height */
}
}
+
+/*
+Some layout optimization especially for dark mode for Swagger API reference
+*/
+
+/* Hide the authorize button which is use-less in docs w/o API running behind
*/
+.swagger-ui div.scheme-container {
+ display: none;
+}
+
+/* Set text color to white in dark mode for better readability */
+[data-bs-theme="dark"] .swagger-ui .title,
+[data-bs-theme="dark"] .swagger-ui h4,
+[data-bs-theme="dark"] .swagger-ui .opblock .opblock-section-header h4,
+[data-bs-theme="dark"] .swagger-ui .parameter__name,
+[data-bs-theme="dark"] .swagger-ui .parameter__type,
+[data-bs-theme="dark"] .swagger-ui p {
+ color: var(--bs-emphasis-color);
+}
+
+[data-bs-theme="dark"] .swagger-ui a.nostyle {
+ color: var(--bs-link-color);
+}
+
+[data-bs-theme="dark"] .swagger-ui .opblock .opblock-summary-description {
+ color: var(--bs-secondary-color);
+}
+
+[data-bs-theme="dark"] .swagger-ui svg {
+ stroke: var(--bs-emphasis-color);
+}
+
+[data-bs-theme="dark"] .swagger-ui .opblock .opblock-section-header {
+ color: var(--bs-emphasis-color);
+ background-color: var(--bs-secondary-bg);
+}
+
+[data-bs-theme="dark"] .swagger-ui input[disabled],
+[data-bs-theme="dark"] .swagger-ui select[disabled],
+[data-bs-theme="dark"] .swagger-ui select,
+[data-bs-theme="dark"] .swagger-ui textarea[disabled] {
+ border: 1px solid var(--bs-border-color) ;
+ color: var(--bs-emphasis-color);
+ background-color: var(--bs-secondary-bg);
+}
+
+/* Somehow some dark mode is showing-up also in light mode for code areas, fix
it here */
+.swagger-ui pre code {
+ background-color: rgb(51, 51, 51);
+}
diff --git a/devel-common/src/docs/provider_conf.py
b/devel-common/src/docs/provider_conf.py
index bc182653468..96d5e2f93cc 100644
--- a/devel-common/src/docs/provider_conf.py
+++ b/devel-common/src/docs/provider_conf.py
@@ -33,7 +33,6 @@ from __future__ import annotations
# serve to show the default.
import logging
import os
-from pathlib import Path
from typing import Any
import rich
@@ -47,11 +46,14 @@ from docs.utils.conf_constants import (
AUTOAPI_OPTIONS,
BASIC_AUTOAPI_IGNORE_PATTERNS,
BASIC_SPHINX_EXTENSIONS,
- REDOC_SCRIPT_URL,
SMARTQUOTES_EXCLUDES,
SPELLING_WORDLIST_PATH,
SPHINX_DESIGN_STATIC_PATH,
+ SPHINX_SWAGGER_EXTENSION,
SUPPRESS_WARNINGS,
+ SWAGGER_BUNDLE_URI,
+ SWAGGER_CSS_URI,
+ SWAGGER_PRESENT_URI,
filter_autoapi_ignore_entries,
get_autodoc_mock_imports,
get_configs_and_deprecations,
@@ -119,25 +121,21 @@ smartquotes_excludes = SMARTQUOTES_EXCLUDES
# ones.
extensions = BASIC_SPHINX_EXTENSIONS
-PROVIDER_PACKAGES_WITH_REDOC = ["apache-airflow-providers-fab",
"apache-airflow-providers-keycloak"]
-
-if PACKAGE_NAME in PROVIDER_PACKAGES_WITH_REDOC:
- extensions.extend(
- [
- "autoapi.extension",
- # First, generate redoc
- "sphinxcontrib.redoc",
- # Second, update redoc script
- "sphinx_script_update",
- ]
- )
- redoc_script_url = REDOC_SCRIPT_URL
-else:
- extensions.extend(
- [
- "autoapi.extension",
- ]
- )
+PROVIDER_PACKAGES_WITH_API_REFERENCE = [
+ "apache-airflow-providers-edge3",
+ "apache-airflow-providers-fab",
+ "apache-airflow-providers-keycloak",
+]
+
+if PACKAGE_NAME in PROVIDER_PACKAGES_WITH_API_REFERENCE:
+ extensions.append(SPHINX_SWAGGER_EXTENSION)
+
+ swagger_present_uri = SWAGGER_PRESENT_URI
+ swagger_bundle_uri = SWAGGER_BUNDLE_URI
+ swagger_css_uri = SWAGGER_CSS_URI
+ swagger_mirror_external_resources = True # Ensure we embed external
resources prevent tracking
+
+extensions.append("autoapi.extension")
extensions.extend(
[
@@ -357,38 +355,3 @@ spelling_ignore_contributor_names = False
spelling_ignore_importable_modules = True
graphviz_output_format = "svg"
-
-if PACKAGE_NAME in PROVIDER_PACKAGES_WITH_REDOC:
- from airflow.providers.fab.auth_manager.api_fastapi.openapi import (
- __file__ as fab_auth_manager_fastapi_api_file,
- )
- from airflow.providers.keycloak.auth_manager.openapi import (
- __file__ as keycloak_auth_manager_fastapi_api_file,
- )
-
- fab_auth_manager_fastapi_api_path =
Path(fab_auth_manager_fastapi_api_file).parent.joinpath(
- "v2-fab-auth-manager-generated.yaml"
- )
- keycloak_auth_manager_fastapi_api_path =
Path(keycloak_auth_manager_fastapi_api_file).parent.joinpath(
- "v2-keycloak-auth-manager-generated.yaml"
- )
- redoc = [
- {
- "name": "Fab auth manager API",
- "page": "api-ref/fab-api-ref",
- "spec": fab_auth_manager_fastapi_api_path.as_posix(),
- "opts": {
- "hide-hostname": True,
- "no-auto-auth": True,
- },
- },
- {
- "name": "Keycloak auth manager token API",
- "page": "api-ref/token-api-ref",
- "spec": keycloak_auth_manager_fastapi_api_path.as_posix(),
- "opts": {
- "hide-hostname": True,
- "no-auto-auth": True,
- },
- },
- ]
diff --git a/devel-common/src/docs/utils/conf_constants.py
b/devel-common/src/docs/utils/conf_constants.py
index d68cd83530f..1331c039553 100644
--- a/devel-common/src/docs/utils/conf_constants.py
+++ b/devel-common/src/docs/utils/conf_constants.py
@@ -97,15 +97,14 @@ BASIC_SPHINX_EXTENSIONS = [
"metrics_tables_from_registry",
]
-SPHINX_REDOC_EXTENSIONS = [
- "autoapi.extension",
- # First, generate redoc
- "sphinxcontrib.redoc",
- # Second, update redoc script
- "sphinx_script_update",
-]
-
-REDOC_SCRIPT_URL =
"https://cdn.jsdelivr.net/npm/[email protected]/bundles/redoc.standalone.js"
+# Properties for Swagger OpenAPI generation:
+# See https://github.com/SAP/swagger-plugin-for-sphinx
+SPHINX_SWAGGER_EXTENSION = "swagger_plugin_for_sphinx"
+
+_SWAGGER_VERSION = "5.32.6"
+SWAGGER_PRESENT_URI =
f"https://unpkg.com/swagger-ui-dist@{_SWAGGER_VERSION}/swagger-ui-standalone-preset.js"
+SWAGGER_BUNDLE_URI =
f"https://unpkg.com/swagger-ui-dist@{_SWAGGER_VERSION}/swagger-ui-bundle.js"
+SWAGGER_CSS_URI =
f"https://unpkg.com/swagger-ui-dist@{_SWAGGER_VERSION}/swagger-ui.css"
def get_rst_filepath_from_path(filepath: pathlib.Path, root: pathlib.Path):
diff --git a/providers/fab/docs/api-ref/fab-api-ref.rst
b/providers/edge3/docs/edge-api-ref.rst
similarity index 74%
copy from providers/fab/docs/api-ref/fab-api-ref.rst
copy to providers/edge3/docs/edge-api-ref.rst
index 87d68179eeb..7854c8c2402 100644
--- a/providers/fab/docs/api-ref/fab-api-ref.rst
+++ b/providers/edge3/docs/edge-api-ref.rst
@@ -16,7 +16,10 @@
specific language governing permissions and limitations
under the License.
-FAB auth manager token API
-==========================
+Edge Worker REST API
+====================
-It's a stub file. It will be automatically converted during the build process
into valid documentation by the Sphinx plugin. See: /docs/conf.py
+.. swagger-plugin::
../src/airflow/providers/edge3/worker_api/v2-edge-generated.yaml
+ :id: edge-worker-api-ref
+ :page-title: Edge Worker REST API
+ :swagger-options: { "tryItOutEnabled": "false", "supportedSubmitMethods":
[] }
diff --git a/providers/edge3/docs/index.rst b/providers/edge3/docs/index.rst
index 3da9957684c..794cb51aef9 100644
--- a/providers/edge3/docs/index.rst
+++ b/providers/edge3/docs/index.rst
@@ -58,6 +58,7 @@
Configuration <configurations-ref>
CLI <cli-ref>
Python API <_api/airflow/providers/edge3/index>
+ Edge Worker REST API <edge-api-ref>
.. toctree::
:hidden:
diff --git a/providers/fab/docs/api-ref/fab-api-ref.rst
b/providers/fab/docs/api-ref/fab-api-ref.rst
index 87d68179eeb..71824513474 100644
--- a/providers/fab/docs/api-ref/fab-api-ref.rst
+++ b/providers/fab/docs/api-ref/fab-api-ref.rst
@@ -19,4 +19,7 @@
FAB auth manager token API
==========================
-It's a stub file. It will be automatically converted during the build process
into valid documentation by the Sphinx plugin. See: /docs/conf.py
+.. swagger-plugin::
../../src/airflow/providers/fab/auth_manager/api_fastapi/openapi/v2-fab-auth-manager-generated.yaml
+ :id: fab-auth-manager-api-ref
+ :page-title: FAB auth manager token API
+ :swagger-options: { "tryItOutEnabled": "false", "supportedSubmitMethods":
[] }
diff --git a/providers/keycloak/docs/api-ref/token-api-ref.rst
b/providers/keycloak/docs/api-ref/token-api-ref.rst
index e9003e082d0..e48c66a4ab9 100644
--- a/providers/keycloak/docs/api-ref/token-api-ref.rst
+++ b/providers/keycloak/docs/api-ref/token-api-ref.rst
@@ -19,4 +19,7 @@
Keycloak auth manager token API
===============================
-It's a stub file. It will be automatically converted during the build process
into valid documentation by the Sphinx plugin. See: /docs/conf.py
+.. swagger-plugin::
../../src/airflow/providers/keycloak/auth_manager/openapi/v2-keycloak-auth-manager-generated.yaml
+ :id: keycloak-auth-manager-api-ref
+ :page-title: Keycloak auth manager token API
+ :swagger-options: { "tryItOutEnabled": "false", "supportedSubmitMethods":
[] }
diff --git a/pyproject.toml b/pyproject.toml
index 960bd58618c..cb18d57405a 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1540,6 +1540,10 @@ apache-aurflow-docker-stack = false
# Manual overrides (kept outside the auto-generated block above so the
# update_airflow_pyproject_toml.py script doesn't clobber them).
+# REMOVE BY 2026-05-31 — once 7.1.0 is older than the global 4-day cooldown
+# this override is redundant and should be deleted along with the line below.
+swagger-plugin-for-sphinx = "8 hours"
+
[tool.uv.pip]
# Synchroonize with scripts/ci/prek/upgrade_important_versions.py
exclude-newer = "4 days"
@@ -1683,6 +1687,9 @@ apache-aurflow-docker-stack = false
# Manual overrides — see the matching block under
# `[tool.uv.exclude-newer-package]` above for rationale.
+# REMOVE BY 2026-05-31 along with the matching entry above.
+swagger-plugin-for-sphinx = "8 hours"
+
[tool.uv.sources]
# These names must match the names as defined in the pyproject.toml of the
workspace items,
diff --git a/uv.lock b/uv.lock
index 6b359ddae46..caf92c6b934 100644
--- a/uv.lock
+++ b/uv.lock
@@ -107,6 +107,7 @@ apache-airflow-providers-zendesk = false
apache-airflow-providers-presto = false
apache-airflow-providers-airbyte = false
apache-airflow-providers-apache-hive = false
+swagger-plugin-for-sphinx = { timestamp = "0001-01-01T00:00:00Z", span =
"PT2H" }
apache-airflow-kubernetes-tests = false
apache-airflow-providers-grpc = false
apache-airflow-providers-apache-druid = false
@@ -2457,7 +2458,6 @@ docs = [
{ name = "pagefind" },
{ name = "pagefind-bin" },
{ name = "rich-click" },
- { name = "setuptools" },
{ name = "sphinx", version = "8.1.3", source = { registry =
"https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
{ name = "sphinx", version = "9.0.4", source = { registry =
"https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" },
{ name = "sphinx", version = "9.1.0", source = { registry =
"https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
@@ -2479,9 +2479,9 @@ docs = [
{ name = "sphinxcontrib-jsmath" },
{ name = "sphinxcontrib-mermaid" },
{ name = "sphinxcontrib-qthelp" },
- { name = "sphinxcontrib-redoc" },
{ name = "sphinxcontrib-serializinghtml" },
{ name = "sphinxcontrib-spelling" },
+ { name = "swagger-plugin-for-sphinx" },
]
docs-gen = [
{ name = "diagrams" },
@@ -2650,7 +2650,6 @@ requires-dist = [
{ name = "ruff", specifier = "==0.15.14" },
{ name = "semver", specifier = ">=3.0.2" },
{ name = "semver", marker = "extra == 'devscripts'", specifier = ">=3.0.2"
},
- { name = "setuptools", marker = "extra == 'docs'", specifier = "<82.0.0" },
{ name = "sphinx", marker = "extra == 'docs'", specifier = ">=7" },
{ name = "sphinx-airflow-theme", marker = "extra == 'docs'", url =
"https://airflow.apache.org/sphinx-airflow-theme/sphinx_airflow_theme-0.3.10-py3-none-any.whl"
},
{ name = "sphinx-argparse", marker = "extra == 'docs'", specifier =
">=0.4.0" },
@@ -2668,11 +2667,11 @@ requires-dist = [
{ name = "sphinxcontrib-jsmath", marker = "extra == 'docs'", specifier =
">=1.0.1" },
{ name = "sphinxcontrib-mermaid", marker = "extra == 'docs'", specifier =
">=1.0.0" },
{ name = "sphinxcontrib-qthelp", marker = "extra == 'docs'", specifier =
">=1.0.3" },
- { name = "sphinxcontrib-redoc", marker = "extra == 'docs'", specifier =
">=1.6.0" },
{ name = "sphinxcontrib-serializinghtml", marker = "extra == 'docs'",
specifier = ">=1.1.5" },
{ name = "sphinxcontrib-spelling", marker = "extra == 'docs'", specifier =
">=8.0.0" },
{ name = "sqlalchemy", extras = ["asyncio"], marker = "extra ==
'sqlalchemy'", specifier = ">=1.4.49" },
{ name = "sqlalchemy-utils", marker = "extra == 'sqlalchemy'", specifier =
">=0.41.2" },
+ { name = "swagger-plugin-for-sphinx", marker = "extra == 'docs'",
specifier = ">=7.1.0" },
{ name = "time-machine", extras = ["dateutil"], specifier = ">=3.0.0" },
{ name = "towncrier", marker = "extra == 'devscripts'", specifier =
">=23.11.0" },
{ name = "twine", marker = "extra == 'devscripts'", specifier = ">=4.0.2"
},
@@ -21894,21 +21893,6 @@ wheels = [
{ url =
"https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl",
hash =
"sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size
= 88743, upload-time = "2024-07-29T01:09:54.885Z" },
]
-[[package]]
-name = "sphinxcontrib-redoc"
-version = "1.6.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "jinja2" },
- { name = "jsonschema" },
- { name = "pyyaml" },
- { name = "six" },
- { name = "sphinx", version = "8.1.3", source = { registry =
"https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
- { name = "sphinx", version = "9.0.4", source = { registry =
"https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" },
- { name = "sphinx", version = "9.1.0", source = { registry =
"https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
-]
-sdist = { url =
"https://files.pythonhosted.org/packages/6d/73/872189269380d0271d575771986db8a77f06bc4565c1a971bebd54f38d2c/sphinxcontrib-redoc-1.6.0.tar.gz",
hash =
"sha256:e358edbe23927d36432dde748e978cf897283a331a03e93d3ef02e348dee4561", size
= 350482, upload-time = "2020-04-17T19:46:48.041Z" }
-
[[package]]
name = "sphinxcontrib-serializinghtml"
version = "2.0.0"
@@ -22201,6 +22185,24 @@ wheels = [
{ url =
"https://files.pythonhosted.org/packages/a2/1c/a6b5d90a9ca479805798276728ccbbdff0c7228e2ea93b1f731779d635e3/svcs-25.1.0-py3-none-any.whl",
hash =
"sha256:df49cb7d1a05dfd2dd60af1a2cb84b9c3bb0a74728833cb8c54a7ceeecce6c97", size
= 19456, upload-time = "2025-01-25T13:15:19.677Z" },
]
+[[package]]
+name = "swagger-plugin-for-sphinx"
+version = "7.1.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "docutils", version = "0.21.2", source = { registry =
"https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
+ { name = "docutils", version = "0.22.4", source = { registry =
"https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
+ { name = "jinja2" },
+ { name = "sphinx", version = "8.1.3", source = { registry =
"https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
+ { name = "sphinx", version = "9.0.4", source = { registry =
"https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" },
+ { name = "sphinx", version = "9.1.0", source = { registry =
"https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
+ { name = "typing-extensions" },
+]
+sdist = { url =
"https://files.pythonhosted.org/packages/2e/00/1b2ea76705a887b47d2ba1fa38bb01222431697e6fd020f25c95d6a44615/swagger_plugin_for_sphinx-7.1.0.tar.gz",
hash =
"sha256:8a054d69600767721f8920f90f87e9078e1736d8c89a6fe74d38ea930f95c9e2", size
= 118298, upload-time = "2026-05-27T08:10:11.488Z" }
+wheels = [
+ { url =
"https://files.pythonhosted.org/packages/c4/14/43f25438e93fd40f172535b0fac0ab2a4827e13a74f62c35860ba04fc891/swagger_plugin_for_sphinx-7.1.0-py3-none-any.whl",
hash =
"sha256:1a6369c6e9ee5bca88c11a327e58c134a457401a6a7f8bb97e166d3a2568d4d7", size
= 11644, upload-time = "2026-05-27T08:10:10.347Z" },
+]
+
[[package]]
name = "sympy"
version = "1.14.0"