This is an automated email from the ASF dual-hosted git repository.
potiuk 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 29c3ac211f2 Publish standalone documentation for Apache Airflow Mypy
(#71878)
29c3ac211f2 is described below
commit 29c3ac211f237da0eeba82413478c6340c065aa5
Author: Hussein Awala <[email protected]>
AuthorDate: Fri Aug 21 10:21:12 2026 +0200
Publish standalone documentation for Apache Airflow Mypy (#71878)
The independently released plugin needs version-aligned documentation and
discoverable stable links instead of relying on the Airflow core release
cadence.
---
.github/workflows/publish-docs-to-s3.yml | 2 +-
airflow-core/docs/howto/static-type-checking.rst | 56 +---------------
dev/README_RELEASE_MYPY.md | 33 +++++++++-
dev/breeze/doc/ci/04_selective_checks.md | 4 +-
dev/breeze/doc/images/output_build-docs.svg | 22 +++----
dev/breeze/doc/images/output_build-docs.txt | 2 +-
...tput_release-management_add-back-references.svg | 22 +++----
...tput_release-management_add-back-references.txt | 2 +-
.../output_release-management_publish-docs.svg | 22 +++----
.../output_release-management_publish-docs.txt | 2 +-
.../images/output_workflow-run_publish-docs.svg | 22 +++----
.../images/output_workflow-run_publish-docs.txt | 2 +-
.../commands/release_management_commands.py | 4 ++
dev/breeze/src/airflow_breeze/global_constants.py | 15 +++++
.../airflow_breeze/utils/add_back_references.py | 3 +
.../src/airflow_breeze/utils/docs_publisher.py | 3 +
.../src/airflow_breeze/utils/publish_docs_to_s3.py | 1 +
.../src/airflow_breeze/utils/selective_checks.py | 6 ++
dev/breeze/tests/test_add_back_references.py | 32 +++++++++
dev/breeze/tests/test_docs_publisher.py | 7 ++
dev/breeze/tests/test_publish_docs_to_s3.py | 2 +
.../tests/test_release_management_commands.py | 6 ++
dev/breeze/tests/test_selective_checks.py | 7 ++
dev/mypy/docs/conf.py | 75 ++++++++++++++++++++++
dev/mypy/docs/index.rst | 75 ++++++++++++++++++++++
dev/mypy/docs/release_notes.rst | 21 ++++++
dev/mypy/docs/spelling_wordlist.txt | 20 ++++++
dev/mypy/pyproject.toml | 16 ++++-
dev/registry/derive_wave_providers.py | 1 +
dev/registry/tests/test_derive_wave_providers.py | 2 +-
devel-common/pyproject.toml | 1 +
.../docs_build/dev_index_template.html.jinja2 | 9 +++
.../src/sphinx_exts/docs_build/docs_builder.py | 3 +
.../sphinx_exts/docs_build/test_docs_builder.py | 30 +++++++++
docs/README.md | 3 +-
scripts/ci/docs/store_stable_versions.py | 5 ++
scripts/ci/prek/mypy_folder.py | 1 +
.../tests/ci/docs/test_store_stable_versions.py | 15 ++++-
uv.lock | 14 ++++
39 files changed, 459 insertions(+), 109 deletions(-)
diff --git a/.github/workflows/publish-docs-to-s3.yml
b/.github/workflows/publish-docs-to-s3.yml
index c0dccd10bce..ca8fc8d2562 100644
--- a/.github/workflows/publish-docs-to-s3.yml
+++ b/.github/workflows/publish-docs-to-s3.yml
@@ -152,7 +152,7 @@ jobs:
run: |
# Keep the non-provider list in sync with NON_PROVIDER_TOKENS in
# dev/registry/derive_wave_providers.py.
- NON_PROVIDER_TOKENS=("apache-airflow" "apache-airflow-ctl"
"task-sdk" "helm-chart" "docker-stack")
+ NON_PROVIDER_TOKENS=("apache-airflow" "apache-airflow-ctl"
"apache-airflow-mypy" "task-sdk" "helm-chart" "docker-stack")
has_provider=false
for token in $INCLUDE_DOCS; do
is_non_provider=false
diff --git a/airflow-core/docs/howto/static-type-checking.rst
b/airflow-core/docs/howto/static-type-checking.rst
index 0d8559434fc..651a67bcf1b 100644
--- a/airflow-core/docs/howto/static-type-checking.rst
+++ b/airflow-core/docs/howto/static-type-checking.rst
@@ -20,56 +20,6 @@
Static Type Checking for Dags
=============================
-Airflow publishes a set of `mypy <https://mypy-lang.org/>`_ plugins as a
standalone, independently
-versioned distribution: `apache-airflow-mypy
<https://pypi.org/project/apache-airflow-mypy/>`_.
-
-When to use it
---------------
-
-If you run ``mypy`` over your Dags, custom operators, or hooks, install the
plugins to get accurate
-results for Airflow-specific patterns that plain ``mypy`` cannot reason about
and would otherwise report
-as false positives. The plugins teach ``mypy`` about:
-
-* **Typed decorators** -- decorators that inject keyword arguments at runtime
(for example
- ``GoogleBaseHook.fallback_to_default_project_id``), so ``mypy`` does not
flag those arguments as missing.
-* **Operator outputs** -- the ``.output`` attribute of operators and the
return value of ``@task``-decorated
- functions (an ``XComArg``) are resolved to the underlying runtime type. This
lets you wire a task's output
- into a downstream task without spurious type errors:
-
- .. code-block:: python
-
- @task
- def f(a: str) -> int:
- return len(a)
-
-
- @task
- def g(b: int) -> None: ...
-
-
- g(f("hello")) # mypy understands the output of f() is an int
-
-The package is entirely optional -- Airflow does not require it at runtime; it
only improves the accuracy
-of static type checking for Dag authors.
-
-Installation
-------------
-
-Install it alongside ``mypy``:
-
-.. code-block:: bash
-
- pip install apache-airflow-mypy
-
-The package follows `SemVer <https://semver.org/>`_ and is released on its own
cadence, so you can adopt it
-independently of your Airflow version.
-
-Configuration
--------------
-
-Enable the plugins in your ``mypy`` configuration (``mypy.ini``, ``setup.cfg``
or ``pyproject.toml``):
-
-.. code-block:: ini
-
- [mypy]
- plugins = airflow_mypy.plugins.decorators, airflow_mypy.plugins.outputs
+Airflow publishes optional `mypy <https://mypy-lang.org/>`_ plugins as the
independently versioned
+`apache-airflow-mypy
<https://airflow.apache.org/docs/apache-airflow-mypy/stable/index.html>`_
distribution.
+See the plugin documentation for installation, configuration, supported
Airflow patterns, and release notes.
diff --git a/dev/README_RELEASE_MYPY.md b/dev/README_RELEASE_MYPY.md
index 53138fd2692..9df04a6d6a1 100644
--- a/dev/README_RELEASE_MYPY.md
+++ b/dev/README_RELEASE_MYPY.md
@@ -31,6 +31,7 @@
- [Add tags in git](#add-tags-in-git)
- [Commit the source packages to Apache SVN
repo](#commit-the-source-packages-to-apache-svn-repo)
- [Publish the distributions to PyPI (release
candidates)](#publish-the-distributions-to-pypi-release-candidates)
+ - [Publish release candidate
documentation](#publish-release-candidate-documentation)
- [Prepare voting email](#prepare-voting-email)
- [Verify the release candidate by PMC
members](#verify-the-release-candidate-by-pmc-members)
- [Verify the release candidate by
Contributors](#verify-the-release-candidate-by-contributors)
@@ -39,6 +40,7 @@
- [Publish release to SVN](#publish-release-to-svn)
- [Publish the packages to PyPI](#publish-the-packages-to-pypi)
- [Add tags in git](#add-tags-in-git-1)
+ - [Publish documentation](#publish-documentation)
- [Notify developers of release](#notify-developers-of-release)
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
@@ -166,6 +168,18 @@ twine upload dist/apache_airflow_mypy-<VERSION>rc<RC>*
Use a short-lived (throw-away) PyPI API token for the upload and delete it
afterwards.
+## Publish release candidate documentation
+
+Run the `Publish Docs to S3` workflow from the `apache/airflow` repository
with:
+
+- **ref**: `apache-airflow-mypy-<VERSION>rc<RC>`
+- **destination**: `staging`
+- **include-docs**: `apache-airflow-mypy`
+
+After it completes, run the `Build docs` workflow from the `staging` branch of
the `apache/airflow-site`
+repository. Verify the release candidate documentation at
+`https://airflow.staged.apache.org/docs/apache-airflow-mypy/stable/index.html`
before starting the vote.
+
## Prepare voting email
Send a voting email to [email protected] with the following template:
@@ -408,6 +422,20 @@ git tag -s apache-airflow-mypy-<VERSION> -m "Apache
Airflow Mypy <VERSION>"
git push origin apache-airflow-mypy-<VERSION>
```
+## Publish documentation
+
+Run the `Publish Docs to S3` workflow from the `apache/airflow` repository
with:
+
+- **ref**: `apache-airflow-mypy-<VERSION>`
+- **destination**: `live`
+- **include-docs**: `apache-airflow-mypy`
+
+After it completes, run the `Build docs` workflow from the `main` branch of
the `apache/airflow-site`
+repository. Verify both the versioned and stable documentation URLs:
+
+- `https://airflow.apache.org/docs/apache-airflow-mypy/<VERSION>/index.html`
+- `https://airflow.apache.org/docs/apache-airflow-mypy/stable/index.html`
+
## Notify developers of release
Send an announcement email to [email protected] and [email protected]:
@@ -422,8 +450,11 @@ Apache Airflow Mypy provides Mypy plugins for Apache
Airflow to enhance type che
The release is available at:
https://pypi.org/project/apache-airflow-mypy/<VERSION>/
+Documentation:
+https://airflow.apache.org/docs/apache-airflow-mypy/stable/index.html
+
Release notes:
-https://github.com/apache/airflow/blob/main/dev/mypy/RELEASE_NOTES.rst
+https://airflow.apache.org/docs/apache-airflow-mypy/stable/release_notes.html
Installation:
pip install apache-airflow-mypy
diff --git a/dev/breeze/doc/ci/04_selective_checks.md
b/dev/breeze/doc/ci/04_selective_checks.md
index 1e4f0b08394..78848313242 100644
--- a/dev/breeze/doc/ci/04_selective_checks.md
+++ b/dev/breeze/doc/ci/04_selective_checks.md
@@ -467,8 +467,8 @@ together using `pytest-xdist` (pytest-xdist distributes the
tests among parallel
* If there are some build dependencies changed (`hatch_build.py` and updated
system dependencies in
the `pyproject.toml` - then `upgrade to newer dependencies` is enabled.
* If docs are build, the `docs-list-as-string` will determine which docs
packages to build. This is based on
- several criteria: if any of the airflow core, charts, docker-stack,
providers files or docs have changed,
- then corresponding packages are build (including cross-dependent providers).
If any of the core files
+ several criteria: if any of the airflow core, charts, docker-stack, Apache
Airflow Mypy, providers files or
+ docs have changed, then corresponding packages are built (including
cross-dependent providers). If any of the core files
changed, also providers docs are built because all providers depend on
airflow docs. If any of the docs
build python files changed or when build is "canary" type in main - all docs
packages are built.
diff --git a/dev/breeze/doc/images/output_build-docs.svg
b/dev/breeze/doc/images/output_build-docs.svg
index 32179cfaf12..a0eb4546855 100644
--- a/dev/breeze/doc/images/output_build-docs.svg
+++ b/dev/breeze/doc/images/output_build-docs.svg
@@ -241,17 +241,17 @@
</text><text class="breeze-build-docs-r2" x="12.2" y="44.4"
textLength="1439.6"
clip-path="url(#breeze-build-docs-line-1)">Usage:                                                            
[...]
</text><text class="breeze-build-docs-r3" x="12.2" y="68.8"
textLength="1439.6"
clip-path="url(#breeze-build-docs-line-2)">breeze build-docs                                                          
[...]
</text><text class="breeze-build-docs-r1" x="12.2" y="93.2" textLength="12.2"
clip-path="url(#breeze-build-docs-line-3)">[</text><text
class="breeze-build-docs-r4" x="24.4" y="93.2" textLength="85.4"
clip-path="url(#breeze-build-docs-line-3)">OPTIONS</text><text
class="breeze-build-docs-r1" x="109.8" y="93.2" textLength="36.6"
clip-path="url(#breeze-build-docs-line-3)">] [</text><text
class="breeze-build-docs-r4" x="146.4" y="93.2" textLength="85.4"
clip-path="url(#breeze-build-docs [...]
-</text><text class="breeze-build-docs-r4" x="12.2" y="117.6" textLength="73.2"
clip-path="url(#breeze-build-docs-line-4)">apache</text><text
class="breeze-build-docs-r1" x="85.4" y="117.6" textLength="12.2"
clip-path="url(#breeze-build-docs-line-4)">-</text><text
class="breeze-build-docs-r4" x="97.6" y="117.6" textLength="85.4"
clip-path="url(#breeze-build-docs-line-4)">airflow</text><text
class="breeze-build-docs-r1" x="183" y="117.6" textLength="12.2"
clip-path="url(#breeze-build-docs- [...]
-</text><text class="breeze-build-docs-r4" x="12.2" y="142" textLength="73.2"
clip-path="url(#breeze-build-docs-line-5)">apache</text><text
class="breeze-build-docs-r1" x="85.4" y="142" textLength="12.2"
clip-path="url(#breeze-build-docs-line-5)">.</text><text
class="breeze-build-docs-r4" x="97.6" y="142" textLength="85.4"
clip-path="url(#breeze-build-docs-line-5)">iceberg</text><text
class="breeze-build-docs-r1" x="183" y="142" textLength="36.6"
clip-path="url(#breeze-build-docs-line-5)" [...]
-</text><text class="breeze-build-docs-r1" x="12.2" y="166.4" textLength="24.4"
clip-path="url(#breeze-build-docs-line-6)">| </text><text
class="breeze-build-docs-r4" x="36.6" y="166.4" textLength="73.2"
clip-path="url(#breeze-build-docs-line-6)">apache</text><text
class="breeze-build-docs-r1" x="109.8" y="166.4" textLength="12.2"
clip-path="url(#breeze-build-docs-line-6)">.</text><text
class="breeze-build-docs-r4" x="122" y="166.4" textLength="109.8"
clip-path="url(#breeze-build-doc [...]
-</text><text class="breeze-build-docs-r1" x="12.2" y="190.8" textLength="24.4"
clip-path="url(#breeze-build-docs-line-7)">| </text><text
class="breeze-build-docs-r4" x="36.6" y="190.8" textLength="73.2"
clip-path="url(#breeze-build-docs-line-7)">cohere</text><text
class="breeze-build-docs-r1" x="109.8" y="190.8" textLength="36.6"
clip-path="url(#breeze-build-docs-line-7)"> | </text><text
class="breeze-build-docs-r4" x="146.4" y="190.8" textLength="73.2"
clip-path="url(#bre [...]
-</text><text class="breeze-build-docs-r4" x="12.2" y="215.2" textLength="85.4"
clip-path="url(#breeze-build-docs-line-8)">datadog</text><text
class="breeze-build-docs-r1" x="97.6" y="215.2" textLength="36.6"
clip-path="url(#breeze-build-docs-line-8)"> | </text><text
class="breeze-build-docs-r4" x="134.2" y="215.2" textLength="36.6"
clip-path="url(#breeze-build-docs-line-8)">dbt</text><text
class="breeze-build-docs-r1" x="170.8" y="215.2" textLength="12.2"
clip-path="url(#breeze [...]
-</text><text class="breeze-build-docs-r4" x="12.2" y="239.6" textLength="36.6"
clip-path="url(#breeze-build-docs-line-9)">ftp</text><text
class="breeze-build-docs-r1" x="48.8" y="239.6" textLength="36.6"
clip-path="url(#breeze-build-docs-line-9)"> | </text><text
class="breeze-build-docs-r4" x="85.4" y="239.6" textLength="36.6"
clip-path="url(#breeze-build-docs-line-9)">git</text><text
class="breeze-build-docs-r1" x="122" y="239.6" textLength="36.6"
clip-path="url(#breeze-build- [...]
-</text><text class="breeze-build-docs-r1" x="12.2" y="264" textLength="24.4"
clip-path="url(#breeze-build-docs-line-10)">| </text><text
class="breeze-build-docs-r4" x="36.6" y="264" textLength="48.8"
clip-path="url(#breeze-build-docs-line-10)">jdbc</text><text
class="breeze-build-docs-r1" x="85.4" y="264" textLength="36.6"
clip-path="url(#breeze-build-docs-line-10)"> | </text><text
class="breeze-build-docs-r4" x="122" y="264" textLength="85.4"
clip-path="url(#breeze-build- [...]
-</text><text class="breeze-build-docs-r4" x="12.2" y="288.4" textLength="61"
clip-path="url(#breeze-build-docs-line-11)">neo4j</text><text
class="breeze-build-docs-r1" x="73.2" y="288.4" textLength="36.6"
clip-path="url(#breeze-build-docs-line-11)"> | </text><text
class="breeze-build-docs-r4" x="109.8" y="288.4" textLength="48.8"
clip-path="url(#breeze-build-docs-line-11)">odbc</text><text
class="breeze-build-docs-r1" x="158.6" y="288.4" textLength="36.6"
clip-path="url(#breeze [...]
-</text><text class="breeze-build-docs-r4" x="12.2" y="312.8" textLength="97.6"
clip-path="url(#breeze-build-docs-line-12)">pinecone</text><text
class="breeze-build-docs-r1" x="109.8" y="312.8" textLength="36.6"
clip-path="url(#breeze-build-docs-line-12)"> | </text><text
class="breeze-build-docs-r4" x="146.4" y="312.8" textLength="97.6"
clip-path="url(#breeze-build-docs-line-12)">postgres</text><text
class="breeze-build-docs-r1" x="244" y="312.8" textLength="36.6" clip-path="url
[...]
-</text><text class="breeze-build-docs-r4" x="12.2" y="337.2" textLength="48.8"
clip-path="url(#breeze-build-docs-line-13)">smtp</text><text
class="breeze-build-docs-r1" x="61" y="337.2" textLength="36.6"
clip-path="url(#breeze-build-docs-line-13)"> | </text><text
class="breeze-build-docs-r4" x="97.6" y="337.2" textLength="109.8"
clip-path="url(#breeze-build-docs-line-13)">snowflake</text><text
class="breeze-build-docs-r1" x="207.4" y="337.2" textLength="36.6"
clip-path="url(#br [...]
-</text><text class="breeze-build-docs-r4" x="12.2" y="361.6" textLength="61"
clip-path="url(#breeze-build-docs-line-14)">vespa</text><text
class="breeze-build-docs-r1" x="73.2" y="361.6" textLength="36.6"
clip-path="url(#breeze-build-docs-line-14)"> | </text><text
class="breeze-build-docs-r4" x="109.8" y="361.6" textLength="97.6"
clip-path="url(#breeze-build-docs-line-14)">weaviate</text><text
class="breeze-build-docs-r1" x="207.4" y="361.6" textLength="36.6"
clip-path="url(#br [...]
+</text><text class="breeze-build-docs-r4" x="12.2" y="117.6" textLength="73.2"
clip-path="url(#breeze-build-docs-line-4)">apache</text><text
class="breeze-build-docs-r1" x="85.4" y="117.6" textLength="12.2"
clip-path="url(#breeze-build-docs-line-4)">-</text><text
class="breeze-build-docs-r4" x="97.6" y="117.6" textLength="85.4"
clip-path="url(#breeze-build-docs-line-4)">airflow</text><text
class="breeze-build-docs-r1" x="183" y="117.6" textLength="12.2"
clip-path="url(#breeze-build-docs- [...]
+</text><text class="breeze-build-docs-r4" x="12.2" y="142" textLength="73.2"
clip-path="url(#breeze-build-docs-line-5)">apache</text><text
class="breeze-build-docs-r1" x="85.4" y="142" textLength="12.2"
clip-path="url(#breeze-build-docs-line-5)">.</text><text
class="breeze-build-docs-r4" x="97.6" y="142" textLength="48.8"
clip-path="url(#breeze-build-docs-line-5)">hdfs</text><text
class="breeze-build-docs-r1" x="146.4" y="142" textLength="36.6"
clip-path="url(#breeze-build-docs-line-5)"> [...]
+</text><text class="breeze-build-docs-r4" x="12.2" y="166.4" textLength="73.2"
clip-path="url(#breeze-build-docs-line-6)">apache</text><text
class="breeze-build-docs-r1" x="85.4" y="166.4" textLength="12.2"
clip-path="url(#breeze-build-docs-line-6)">.</text><text
class="breeze-build-docs-r4" x="97.6" y="166.4" textLength="61"
clip-path="url(#breeze-build-docs-line-6)">pinot</text><text
class="breeze-build-docs-r1" x="158.6" y="166.4" textLength="36.6"
clip-path="url(#breeze-build-docs-li [...]
+</text><text class="breeze-build-docs-r4" x="12.2" y="190.8" textLength="97.6"
clip-path="url(#breeze-build-docs-line-7)">cloudant</text><text
class="breeze-build-docs-r1" x="109.8" y="190.8" textLength="36.6"
clip-path="url(#breeze-build-docs-line-7)"> | </text><text
class="breeze-build-docs-r4" x="146.4" y="190.8" textLength="48.8"
clip-path="url(#breeze-build-docs-line-7)">cncf</text><text
class="breeze-build-docs-r1" x="195.2" y="190.8" textLength="12.2"
clip-path="url(#bre [...]
+</text><text class="breeze-build-docs-r4" x="12.2" y="215.2" textLength="73.2"
clip-path="url(#breeze-build-docs-line-8)">common</text><text
class="breeze-build-docs-r1" x="85.4" y="215.2" textLength="12.2"
clip-path="url(#breeze-build-docs-line-8)">.</text><text
class="breeze-build-docs-r4" x="97.6" y="215.2" textLength="36.6"
clip-path="url(#breeze-build-docs-line-8)">sql</text><text
class="breeze-build-docs-r1" x="134.2" y="215.2" textLength="36.6"
clip-path="url(#breeze-build-docs-li [...]
+</text><text class="breeze-build-docs-r4" x="12.2" y="239.6" textLength="73.2"
clip-path="url(#breeze-build-docs-line-9)">exasol</text><text
class="breeze-build-docs-r1" x="85.4" y="239.6" textLength="36.6"
clip-path="url(#breeze-build-docs-line-9)"> | </text><text
class="breeze-build-docs-r4" x="122" y="239.6" textLength="36.6"
clip-path="url(#breeze-build-docs-line-9)">fab</text><text
class="breeze-build-docs-r1" x="158.6" y="239.6" textLength="36.6"
clip-path="url(#breeze-bu [...]
+</text><text class="breeze-build-docs-r4" x="12.2" y="264" textLength="97.6"
clip-path="url(#breeze-build-docs-line-10)">influxdb</text><text
class="breeze-build-docs-r1" x="109.8" y="264" textLength="36.6"
clip-path="url(#breeze-build-docs-line-10)"> | </text><text
class="breeze-build-docs-r4" x="146.4" y="264" textLength="134.2"
clip-path="url(#breeze-build-docs-line-10)">informatica</text><text
class="breeze-build-docs-r1" x="280.6" y="264" textLength="36.6"
clip-path="url(# [...]
+</text><text class="breeze-build-docs-r4" x="12.2" y="288.4"
textLength="109.8"
clip-path="url(#breeze-build-docs-line-11)">microsoft</text><text
class="breeze-build-docs-r1" x="122" y="288.4" textLength="12.2"
clip-path="url(#breeze-build-docs-line-11)">.</text><text
class="breeze-build-docs-r4" x="134.2" y="288.4" textLength="61"
clip-path="url(#breeze-build-docs-line-11)">winrm</text><text
class="breeze-build-docs-r1" x="195.2" y="288.4" textLength="36.6"
clip-path="url(#breeze-build- [...]
+</text><text class="breeze-build-docs-r4" x="12.2" y="312.8"
textLength="109.8"
clip-path="url(#breeze-build-docs-line-12)">pagerduty</text><text
class="breeze-build-docs-r1" x="122" y="312.8" textLength="36.6"
clip-path="url(#breeze-build-docs-line-12)"> | </text><text
class="breeze-build-docs-r4" x="158.6" y="312.8" textLength="109.8"
clip-path="url(#breeze-build-docs-line-12)">papermill</text><text
class="breeze-build-docs-r1" x="268.4" y="312.8" textLength="36.6" clip-path=
[...]
+</text><text class="breeze-build-docs-r4" x="12.2" y="337.2" textLength="97.6"
clip-path="url(#breeze-build-docs-line-13)">sendgrid</text><text
class="breeze-build-docs-r1" x="109.8" y="337.2" textLength="36.6"
clip-path="url(#breeze-build-docs-line-13)"> | </text><text
class="breeze-build-docs-r4" x="146.4" y="337.2" textLength="48.8"
clip-path="url(#breeze-build-docs-line-13)">sftp</text><text
class="breeze-build-docs-r1" x="195.2" y="337.2" textLength="36.6"
clip-path="url(# [...]
+</text><text class="breeze-build-docs-r4" x="12.2" y="361.6" textLength="97.6"
clip-path="url(#breeze-build-docs-line-14)">teradata</text><text
class="breeze-build-docs-r1" x="109.8" y="361.6" textLength="36.6"
clip-path="url(#breeze-build-docs-line-14)"> | </text><text
class="breeze-build-docs-r4" x="146.4" y="361.6" textLength="61"
clip-path="url(#breeze-build-docs-line-14)">trino</text><text
class="breeze-build-docs-r1" x="207.4" y="361.6" textLength="36.6"
clip-path="url(#b [...]
</text><text class="breeze-build-docs-r1" x="1464" y="386" textLength="12.2"
clip-path="url(#breeze-build-docs-line-15)">
</text><text class="breeze-build-docs-r1" x="12.2" y="410.4"
textLength="195.2"
clip-path="url(#breeze-build-docs-line-16)">Build documents.</text><text
class="breeze-build-docs-r1" x="1464" y="410.4" textLength="12.2"
clip-path="url(#breeze-build-docs-line-16)">
</text><text class="breeze-build-docs-r1" x="1464" y="434.8" textLength="12.2"
clip-path="url(#breeze-build-docs-line-17)">
diff --git a/dev/breeze/doc/images/output_build-docs.txt
b/dev/breeze/doc/images/output_build-docs.txt
index 1916a18fb3b..301b3089dbb 100644
--- a/dev/breeze/doc/images/output_build-docs.txt
+++ b/dev/breeze/doc/images/output_build-docs.txt
@@ -1 +1 @@
-bd120b39a206e374a2867ca6020fba81
+6869c62bf6dd00ce2c54810da1e09c95
diff --git
a/dev/breeze/doc/images/output_release-management_add-back-references.svg
b/dev/breeze/doc/images/output_release-management_add-back-references.svg
index 634c1cef692..915f4492250 100644
--- a/dev/breeze/doc/images/output_release-management_add-back-references.svg
+++ b/dev/breeze/doc/images/output_release-management_add-back-references.svg
@@ -150,17 +150,17 @@
</text><text class="breeze-release-management-add-back-references-r2" x="12.2"
y="44.4" textLength="1439.6"
clip-path="url(#breeze-release-management-add-back-references-line-1)">Usage:                                                   &
[...]
</text><text class="breeze-release-management-add-back-references-r3" x="12.2"
y="68.8" textLength="1439.6"
clip-path="url(#breeze-release-management-add-back-references-line-2)">breeze release-management add-back-references                                           
[...]
</text><text class="breeze-release-management-add-back-references-r1" x="12.2"
y="93.2" textLength="12.2"
clip-path="url(#breeze-release-management-add-back-references-line-3)">[</text><text
class="breeze-release-management-add-back-references-r4" x="24.4" y="93.2"
textLength="85.4"
clip-path="url(#breeze-release-management-add-back-references-line-3)">OPTIONS</text><text
class="breeze-release-management-add-back-references-r1" x="109.8" y="93.2"
textLength="36.6" clip-path="url(#breeze- [...]
-</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="117.6" textLength="73.2"
clip-path="url(#breeze-release-management-add-back-references-line-4)">apache</text><text
class="breeze-release-management-add-back-references-r1" x="85.4" y="117.6"
textLength="12.2"
clip-path="url(#breeze-release-management-add-back-references-line-4)">-</text><text
class="breeze-release-management-add-back-references-r4" x="97.6" y="117.6"
textLength="85.4" clip-path="url(#breeze [...]
-</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="142" textLength="73.2"
clip-path="url(#breeze-release-management-add-back-references-line-5)">apache</text><text
class="breeze-release-management-add-back-references-r1" x="85.4" y="142"
textLength="12.2"
clip-path="url(#breeze-release-management-add-back-references-line-5)">.</text><text
class="breeze-release-management-add-back-references-r4" x="97.6" y="142"
textLength="85.4" clip-path="url(#breeze-relea [...]
-</text><text class="breeze-release-management-add-back-references-r1" x="12.2"
y="166.4" textLength="24.4"
clip-path="url(#breeze-release-management-add-back-references-line-6)">| </text><text
class="breeze-release-management-add-back-references-r4" x="36.6" y="166.4"
textLength="73.2"
clip-path="url(#breeze-release-management-add-back-references-line-6)">apache</text><text
class="breeze-release-management-add-back-references-r1" x="109.8" y="166.4"
textLength="12.2" clip-path="url( [...]
-</text><text class="breeze-release-management-add-back-references-r1" x="12.2"
y="190.8" textLength="24.4"
clip-path="url(#breeze-release-management-add-back-references-line-7)">| </text><text
class="breeze-release-management-add-back-references-r4" x="36.6" y="190.8"
textLength="73.2"
clip-path="url(#breeze-release-management-add-back-references-line-7)">cohere</text><text
class="breeze-release-management-add-back-references-r1" x="109.8" y="190.8"
textLength="36.6" clip-path="url( [...]
-</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="215.2" textLength="85.4"
clip-path="url(#breeze-release-management-add-back-references-line-8)">datadog</text><text
class="breeze-release-management-add-back-references-r1" x="97.6" y="215.2"
textLength="36.6"
clip-path="url(#breeze-release-management-add-back-references-line-8)"> | </text><text
class="breeze-release-management-add-back-references-r4" x="134.2" y="215.2"
textLength="36.6" clip-pat [...]
-</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="239.6" textLength="36.6"
clip-path="url(#breeze-release-management-add-back-references-line-9)">ftp</text><text
class="breeze-release-management-add-back-references-r1" x="48.8" y="239.6"
textLength="36.6"
clip-path="url(#breeze-release-management-add-back-references-line-9)"> | </text><text
class="breeze-release-management-add-back-references-r4" x="85.4" y="239.6"
textLength="36.6" clip-path="ur [...]
-</text><text class="breeze-release-management-add-back-references-r1" x="12.2"
y="264" textLength="24.4"
clip-path="url(#breeze-release-management-add-back-references-line-10)">| </text><text
class="breeze-release-management-add-back-references-r4" x="36.6" y="264"
textLength="48.8"
clip-path="url(#breeze-release-management-add-back-references-line-10)">jdbc</text><text
class="breeze-release-management-add-back-references-r1" x="85.4" y="264"
textLength="36.6" clip-path="url(#breeze [...]
-</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="288.4" textLength="61"
clip-path="url(#breeze-release-management-add-back-references-line-11)">neo4j</text><text
class="breeze-release-management-add-back-references-r1" x="73.2" y="288.4"
textLength="36.6"
clip-path="url(#breeze-release-management-add-back-references-line-11)"> | </text><text
class="breeze-release-management-add-back-references-r4" x="109.8" y="288.4"
textLength="48.8" clip-path= [...]
-</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="312.8" textLength="97.6"
clip-path="url(#breeze-release-management-add-back-references-line-12)">pinecone</text><text
class="breeze-release-management-add-back-references-r1" x="109.8" y="312.8"
textLength="36.6"
clip-path="url(#breeze-release-management-add-back-references-line-12)"> | </text><text
class="breeze-release-management-add-back-references-r4" x="146.4" y="312.8"
textLength="97.6" clip [...]
-</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="337.2" textLength="48.8"
clip-path="url(#breeze-release-management-add-back-references-line-13)">smtp</text><text
class="breeze-release-management-add-back-references-r1" x="61" y="337.2"
textLength="36.6"
clip-path="url(#breeze-release-management-add-back-references-line-13)"> | </text><text
class="breeze-release-management-add-back-references-r4" x="97.6" y="337.2"
textLength="109.8" clip-path=" [...]
-</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="361.6" textLength="61"
clip-path="url(#breeze-release-management-add-back-references-line-14)">vespa</text><text
class="breeze-release-management-add-back-references-r1" x="73.2" y="361.6"
textLength="36.6"
clip-path="url(#breeze-release-management-add-back-references-line-14)"> | </text><text
class="breeze-release-management-add-back-references-r4" x="109.8" y="361.6"
textLength="97.6" clip-path= [...]
+</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="117.6" textLength="73.2"
clip-path="url(#breeze-release-management-add-back-references-line-4)">apache</text><text
class="breeze-release-management-add-back-references-r1" x="85.4" y="117.6"
textLength="12.2"
clip-path="url(#breeze-release-management-add-back-references-line-4)">-</text><text
class="breeze-release-management-add-back-references-r4" x="97.6" y="117.6"
textLength="85.4" clip-path="url(#breeze [...]
+</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="142" textLength="73.2"
clip-path="url(#breeze-release-management-add-back-references-line-5)">apache</text><text
class="breeze-release-management-add-back-references-r1" x="85.4" y="142"
textLength="12.2"
clip-path="url(#breeze-release-management-add-back-references-line-5)">.</text><text
class="breeze-release-management-add-back-references-r4" x="97.6" y="142"
textLength="48.8" clip-path="url(#breeze-relea [...]
+</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="166.4" textLength="73.2"
clip-path="url(#breeze-release-management-add-back-references-line-6)">apache</text><text
class="breeze-release-management-add-back-references-r1" x="85.4" y="166.4"
textLength="12.2"
clip-path="url(#breeze-release-management-add-back-references-line-6)">.</text><text
class="breeze-release-management-add-back-references-r4" x="97.6" y="166.4"
textLength="61" clip-path="url(#breeze-r [...]
+</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="190.8" textLength="97.6"
clip-path="url(#breeze-release-management-add-back-references-line-7)">cloudant</text><text
class="breeze-release-management-add-back-references-r1" x="109.8" y="190.8"
textLength="36.6"
clip-path="url(#breeze-release-management-add-back-references-line-7)"> | </text><text
class="breeze-release-management-add-back-references-r4" x="146.4" y="190.8"
textLength="48.8" clip-p [...]
+</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="215.2" textLength="73.2"
clip-path="url(#breeze-release-management-add-back-references-line-8)">common</text><text
class="breeze-release-management-add-back-references-r1" x="85.4" y="215.2"
textLength="12.2"
clip-path="url(#breeze-release-management-add-back-references-line-8)">.</text><text
class="breeze-release-management-add-back-references-r4" x="97.6" y="215.2"
textLength="36.6" clip-path="url(#breeze [...]
+</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="239.6" textLength="73.2"
clip-path="url(#breeze-release-management-add-back-references-line-9)">exasol</text><text
class="breeze-release-management-add-back-references-r1" x="85.4" y="239.6"
textLength="36.6"
clip-path="url(#breeze-release-management-add-back-references-line-9)"> | </text><text
class="breeze-release-management-add-back-references-r4" x="122" y="239.6"
textLength="36.6" clip-path=" [...]
+</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="264" textLength="97.6"
clip-path="url(#breeze-release-management-add-back-references-line-10)">influxdb</text><text
class="breeze-release-management-add-back-references-r1" x="109.8" y="264"
textLength="36.6"
clip-path="url(#breeze-release-management-add-back-references-line-10)"> | </text><text
class="breeze-release-management-add-back-references-r4" x="146.4" y="264"
textLength="134.2" clip-path [...]
+</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="288.4" textLength="109.8"
clip-path="url(#breeze-release-management-add-back-references-line-11)">microsoft</text><text
class="breeze-release-management-add-back-references-r1" x="122" y="288.4"
textLength="12.2"
clip-path="url(#breeze-release-management-add-back-references-line-11)">.</text><text
class="breeze-release-management-add-back-references-r4" x="134.2" y="288.4"
textLength="61" clip-path="url(#br [...]
+</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="312.8" textLength="109.8"
clip-path="url(#breeze-release-management-add-back-references-line-12)">pagerduty</text><text
class="breeze-release-management-add-back-references-r1" x="122" y="312.8"
textLength="36.6"
clip-path="url(#breeze-release-management-add-back-references-line-12)"> | </text><text
class="breeze-release-management-add-back-references-r4" x="158.6" y="312.8"
textLength="109.8" cli [...]
+</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="337.2" textLength="97.6"
clip-path="url(#breeze-release-management-add-back-references-line-13)">sendgrid</text><text
class="breeze-release-management-add-back-references-r1" x="109.8" y="337.2"
textLength="36.6"
clip-path="url(#breeze-release-management-add-back-references-line-13)"> | </text><text
class="breeze-release-management-add-back-references-r4" x="146.4" y="337.2"
textLength="48.8" clip [...]
+</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="361.6" textLength="97.6"
clip-path="url(#breeze-release-management-add-back-references-line-14)">teradata</text><text
class="breeze-release-management-add-back-references-r1" x="109.8" y="361.6"
textLength="36.6"
clip-path="url(#breeze-release-management-add-back-references-line-14)"> | </text><text
class="breeze-release-management-add-back-references-r4" x="146.4" y="361.6"
textLength="61" clip-p [...]
</text><text class="breeze-release-management-add-back-references-r1" x="1464"
y="386" textLength="12.2"
clip-path="url(#breeze-release-management-add-back-references-line-15)">
</text><text class="breeze-release-management-add-back-references-r1" x="12.2"
y="410.4" textLength="976"
clip-path="url(#breeze-release-management-add-back-references-line-16)">Command to add back references for documentation to make it backward compatible.</text><text
class="breeze-release-management-add-back-references-r1" x="1464" y="410.4"
textLength="12.2"
clip-path="url(#breeze-release-management-add-back-references-line-16)">
</text><text class="breeze-release-management-add-back-references-r1" x="1464"
y="434.8" textLength="12.2"
clip-path="url(#breeze-release-management-add-back-references-line-17)">
diff --git
a/dev/breeze/doc/images/output_release-management_add-back-references.txt
b/dev/breeze/doc/images/output_release-management_add-back-references.txt
index e5d9287fb40..338338df1b5 100644
--- a/dev/breeze/doc/images/output_release-management_add-back-references.txt
+++ b/dev/breeze/doc/images/output_release-management_add-back-references.txt
@@ -1 +1 @@
-541760eea56b065a0bd0573fba31bdb0
+da17572185eeb81b9714aa9514be1970
diff --git a/dev/breeze/doc/images/output_release-management_publish-docs.svg
b/dev/breeze/doc/images/output_release-management_publish-docs.svg
index ba78a0c8a0b..75477c8bf57 100644
--- a/dev/breeze/doc/images/output_release-management_publish-docs.svg
+++ b/dev/breeze/doc/images/output_release-management_publish-docs.svg
@@ -189,17 +189,17 @@
</text><text class="breeze-release-management-publish-docs-r2" x="12.2"
y="44.4" textLength="1439.6"
clip-path="url(#breeze-release-management-publish-docs-line-1)">Usage:                                                     
[...]
</text><text class="breeze-release-management-publish-docs-r3" x="12.2"
y="68.8" textLength="1439.6"
clip-path="url(#breeze-release-management-publish-docs-line-2)">breeze release-management publish-docs                                              
[...]
</text><text class="breeze-release-management-publish-docs-r1" x="12.2"
y="93.2" textLength="12.2"
clip-path="url(#breeze-release-management-publish-docs-line-3)">[</text><text
class="breeze-release-management-publish-docs-r4" x="24.4" y="93.2"
textLength="85.4"
clip-path="url(#breeze-release-management-publish-docs-line-3)">OPTIONS</text><text
class="breeze-release-management-publish-docs-r1" x="109.8" y="93.2"
textLength="36.6" clip-path="url(#breeze-release-management-publish-docs-lin
[...]
-</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="117.6" textLength="73.2"
clip-path="url(#breeze-release-management-publish-docs-line-4)">apache</text><text
class="breeze-release-management-publish-docs-r1" x="85.4" y="117.6"
textLength="12.2"
clip-path="url(#breeze-release-management-publish-docs-line-4)">-</text><text
class="breeze-release-management-publish-docs-r4" x="97.6" y="117.6"
textLength="85.4" clip-path="url(#breeze-release-management-publish-docs-li
[...]
-</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="142" textLength="73.2"
clip-path="url(#breeze-release-management-publish-docs-line-5)">apache</text><text
class="breeze-release-management-publish-docs-r1" x="85.4" y="142"
textLength="12.2"
clip-path="url(#breeze-release-management-publish-docs-line-5)">.</text><text
class="breeze-release-management-publish-docs-r4" x="97.6" y="142"
textLength="85.4"
clip-path="url(#breeze-release-management-publish-docs-line-5)" [...]
-</text><text class="breeze-release-management-publish-docs-r1" x="12.2"
y="166.4" textLength="24.4"
clip-path="url(#breeze-release-management-publish-docs-line-6)">| </text><text
class="breeze-release-management-publish-docs-r4" x="36.6" y="166.4"
textLength="73.2"
clip-path="url(#breeze-release-management-publish-docs-line-6)">apache</text><text
class="breeze-release-management-publish-docs-r1" x="109.8" y="166.4"
textLength="12.2" clip-path="url(#breeze-release-management-publish- [...]
-</text><text class="breeze-release-management-publish-docs-r1" x="12.2"
y="190.8" textLength="24.4"
clip-path="url(#breeze-release-management-publish-docs-line-7)">| </text><text
class="breeze-release-management-publish-docs-r4" x="36.6" y="190.8"
textLength="73.2"
clip-path="url(#breeze-release-management-publish-docs-line-7)">cohere</text><text
class="breeze-release-management-publish-docs-r1" x="109.8" y="190.8"
textLength="36.6" clip-path="url(#breeze-release-management-publish- [...]
-</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="215.2" textLength="85.4"
clip-path="url(#breeze-release-management-publish-docs-line-8)">datadog</text><text
class="breeze-release-management-publish-docs-r1" x="97.6" y="215.2"
textLength="36.6"
clip-path="url(#breeze-release-management-publish-docs-line-8)"> | </text><text
class="breeze-release-management-publish-docs-r4" x="134.2" y="215.2"
textLength="36.6" clip-path="url(#breeze-release-management-p [...]
-</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="239.6" textLength="36.6"
clip-path="url(#breeze-release-management-publish-docs-line-9)">ftp</text><text
class="breeze-release-management-publish-docs-r1" x="48.8" y="239.6"
textLength="36.6"
clip-path="url(#breeze-release-management-publish-docs-line-9)"> | </text><text
class="breeze-release-management-publish-docs-r4" x="85.4" y="239.6"
textLength="36.6" clip-path="url(#breeze-release-management-publis [...]
-</text><text class="breeze-release-management-publish-docs-r1" x="12.2"
y="264" textLength="24.4"
clip-path="url(#breeze-release-management-publish-docs-line-10)">| </text><text
class="breeze-release-management-publish-docs-r4" x="36.6" y="264"
textLength="48.8"
clip-path="url(#breeze-release-management-publish-docs-line-10)">jdbc</text><text
class="breeze-release-management-publish-docs-r1" x="85.4" y="264"
textLength="36.6" clip-path="url(#breeze-release-management-publish-docs-li
[...]
-</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="288.4" textLength="61"
clip-path="url(#breeze-release-management-publish-docs-line-11)">neo4j</text><text
class="breeze-release-management-publish-docs-r1" x="73.2" y="288.4"
textLength="36.6"
clip-path="url(#breeze-release-management-publish-docs-line-11)"> | </text><text
class="breeze-release-management-publish-docs-r4" x="109.8" y="288.4"
textLength="48.8" clip-path="url(#breeze-release-management-pub [...]
-</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="312.8" textLength="97.6"
clip-path="url(#breeze-release-management-publish-docs-line-12)">pinecone</text><text
class="breeze-release-management-publish-docs-r1" x="109.8" y="312.8"
textLength="36.6"
clip-path="url(#breeze-release-management-publish-docs-line-12)"> | </text><text
class="breeze-release-management-publish-docs-r4" x="146.4" y="312.8"
textLength="97.6" clip-path="url(#breeze-release-manageme [...]
-</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="337.2" textLength="48.8"
clip-path="url(#breeze-release-management-publish-docs-line-13)">smtp</text><text
class="breeze-release-management-publish-docs-r1" x="61" y="337.2"
textLength="36.6"
clip-path="url(#breeze-release-management-publish-docs-line-13)"> | </text><text
class="breeze-release-management-publish-docs-r4" x="97.6" y="337.2"
textLength="109.8" clip-path="url(#breeze-release-management-publ [...]
-</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="361.6" textLength="61"
clip-path="url(#breeze-release-management-publish-docs-line-14)">vespa</text><text
class="breeze-release-management-publish-docs-r1" x="73.2" y="361.6"
textLength="36.6"
clip-path="url(#breeze-release-management-publish-docs-line-14)"> | </text><text
class="breeze-release-management-publish-docs-r4" x="109.8" y="361.6"
textLength="97.6" clip-path="url(#breeze-release-management-pub [...]
+</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="117.6" textLength="73.2"
clip-path="url(#breeze-release-management-publish-docs-line-4)">apache</text><text
class="breeze-release-management-publish-docs-r1" x="85.4" y="117.6"
textLength="12.2"
clip-path="url(#breeze-release-management-publish-docs-line-4)">-</text><text
class="breeze-release-management-publish-docs-r4" x="97.6" y="117.6"
textLength="85.4" clip-path="url(#breeze-release-management-publish-docs-li
[...]
+</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="142" textLength="73.2"
clip-path="url(#breeze-release-management-publish-docs-line-5)">apache</text><text
class="breeze-release-management-publish-docs-r1" x="85.4" y="142"
textLength="12.2"
clip-path="url(#breeze-release-management-publish-docs-line-5)">.</text><text
class="breeze-release-management-publish-docs-r4" x="97.6" y="142"
textLength="48.8"
clip-path="url(#breeze-release-management-publish-docs-line-5)" [...]
+</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="166.4" textLength="73.2"
clip-path="url(#breeze-release-management-publish-docs-line-6)">apache</text><text
class="breeze-release-management-publish-docs-r1" x="85.4" y="166.4"
textLength="12.2"
clip-path="url(#breeze-release-management-publish-docs-line-6)">.</text><text
class="breeze-release-management-publish-docs-r4" x="97.6" y="166.4"
textLength="61" clip-path="url(#breeze-release-management-publish-docs-line
[...]
+</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="190.8" textLength="97.6"
clip-path="url(#breeze-release-management-publish-docs-line-7)">cloudant</text><text
class="breeze-release-management-publish-docs-r1" x="109.8" y="190.8"
textLength="36.6"
clip-path="url(#breeze-release-management-publish-docs-line-7)"> | </text><text
class="breeze-release-management-publish-docs-r4" x="146.4" y="190.8"
textLength="48.8" clip-path="url(#breeze-release-management [...]
+</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="215.2" textLength="73.2"
clip-path="url(#breeze-release-management-publish-docs-line-8)">common</text><text
class="breeze-release-management-publish-docs-r1" x="85.4" y="215.2"
textLength="12.2"
clip-path="url(#breeze-release-management-publish-docs-line-8)">.</text><text
class="breeze-release-management-publish-docs-r4" x="97.6" y="215.2"
textLength="36.6" clip-path="url(#breeze-release-management-publish-docs-li
[...]
+</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="239.6" textLength="73.2"
clip-path="url(#breeze-release-management-publish-docs-line-9)">exasol</text><text
class="breeze-release-management-publish-docs-r1" x="85.4" y="239.6"
textLength="36.6"
clip-path="url(#breeze-release-management-publish-docs-line-9)"> | </text><text
class="breeze-release-management-publish-docs-r4" x="122" y="239.6"
textLength="36.6" clip-path="url(#breeze-release-management-publ [...]
+</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="264" textLength="97.6"
clip-path="url(#breeze-release-management-publish-docs-line-10)">influxdb</text><text
class="breeze-release-management-publish-docs-r1" x="109.8" y="264"
textLength="36.6"
clip-path="url(#breeze-release-management-publish-docs-line-10)"> | </text><text
class="breeze-release-management-publish-docs-r4" x="146.4" y="264"
textLength="134.2" clip-path="url(#breeze-release-management-pu [...]
+</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="288.4" textLength="109.8"
clip-path="url(#breeze-release-management-publish-docs-line-11)">microsoft</text><text
class="breeze-release-management-publish-docs-r1" x="122" y="288.4"
textLength="12.2"
clip-path="url(#breeze-release-management-publish-docs-line-11)">.</text><text
class="breeze-release-management-publish-docs-r4" x="134.2" y="288.4"
textLength="61" clip-path="url(#breeze-release-management-publish-doc [...]
+</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="312.8" textLength="109.8"
clip-path="url(#breeze-release-management-publish-docs-line-12)">pagerduty</text><text
class="breeze-release-management-publish-docs-r1" x="122" y="312.8"
textLength="36.6"
clip-path="url(#breeze-release-management-publish-docs-line-12)"> | </text><text
class="breeze-release-management-publish-docs-r4" x="158.6" y="312.8"
textLength="109.8" clip-path="url(#breeze-release-managem [...]
+</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="337.2" textLength="97.6"
clip-path="url(#breeze-release-management-publish-docs-line-13)">sendgrid</text><text
class="breeze-release-management-publish-docs-r1" x="109.8" y="337.2"
textLength="36.6"
clip-path="url(#breeze-release-management-publish-docs-line-13)"> | </text><text
class="breeze-release-management-publish-docs-r4" x="146.4" y="337.2"
textLength="48.8" clip-path="url(#breeze-release-manageme [...]
+</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="361.6" textLength="97.6"
clip-path="url(#breeze-release-management-publish-docs-line-14)">teradata</text><text
class="breeze-release-management-publish-docs-r1" x="109.8" y="361.6"
textLength="36.6"
clip-path="url(#breeze-release-management-publish-docs-line-14)"> | </text><text
class="breeze-release-management-publish-docs-r4" x="146.4" y="361.6"
textLength="61" clip-path="url(#breeze-release-management [...]
</text><text class="breeze-release-management-publish-docs-r1" x="1464"
y="386" textLength="12.2"
clip-path="url(#breeze-release-management-publish-docs-line-15)">
</text><text class="breeze-release-management-publish-docs-r1" x="12.2"
y="410.4" textLength="707.6"
clip-path="url(#breeze-release-management-publish-docs-line-16)">Command to publish generated documentation to airflow-site</text><text
class="breeze-release-management-publish-docs-r1" x="1464" y="410.4"
textLength="12.2"
clip-path="url(#breeze-release-management-publish-docs-line-16)">
</text><text class="breeze-release-management-publish-docs-r1" x="1464"
y="434.8" textLength="12.2"
clip-path="url(#breeze-release-management-publish-docs-line-17)">
diff --git a/dev/breeze/doc/images/output_release-management_publish-docs.txt
b/dev/breeze/doc/images/output_release-management_publish-docs.txt
index 2113a9db3c8..cf48a3e8d38 100644
--- a/dev/breeze/doc/images/output_release-management_publish-docs.txt
+++ b/dev/breeze/doc/images/output_release-management_publish-docs.txt
@@ -1 +1 @@
-314fc7a431405a85bfe701e396ea09fb
+ea0870d76dc087db72a64b430dc321fe
diff --git a/dev/breeze/doc/images/output_workflow-run_publish-docs.svg
b/dev/breeze/doc/images/output_workflow-run_publish-docs.svg
index 1eecdebc1cc..bbb753547dd 100644
--- a/dev/breeze/doc/images/output_workflow-run_publish-docs.svg
+++ b/dev/breeze/doc/images/output_workflow-run_publish-docs.svg
@@ -204,17 +204,17 @@
</text><text class="breeze-workflow-run-publish-docs-r2" x="12.2" y="44.4"
textLength="1439.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-1)">Usage:                                                       
[...]
</text><text class="breeze-workflow-run-publish-docs-r3" x="12.2" y="68.8"
textLength="1439.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-2)">breeze workflow-run publish-docs                                                 
[...]
</text><text class="breeze-workflow-run-publish-docs-r1" x="12.2" y="93.2"
textLength="12.2"
clip-path="url(#breeze-workflow-run-publish-docs-line-3)">[</text><text
class="breeze-workflow-run-publish-docs-r4" x="24.4" y="93.2" textLength="85.4"
clip-path="url(#breeze-workflow-run-publish-docs-line-3)">OPTIONS</text><text
class="breeze-workflow-run-publish-docs-r1" x="109.8" y="93.2"
textLength="36.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-3)">] [</text><text
class="br [...]
-</text><text class="breeze-workflow-run-publish-docs-r4" x="12.2" y="117.6"
textLength="73.2"
clip-path="url(#breeze-workflow-run-publish-docs-line-4)">apache</text><text
class="breeze-workflow-run-publish-docs-r1" x="85.4" y="117.6"
textLength="12.2"
clip-path="url(#breeze-workflow-run-publish-docs-line-4)">-</text><text
class="breeze-workflow-run-publish-docs-r4" x="97.6" y="117.6"
textLength="85.4"
clip-path="url(#breeze-workflow-run-publish-docs-line-4)">airflow</text><text
class="br [...]
-</text><text class="breeze-workflow-run-publish-docs-r4" x="12.2" y="142"
textLength="73.2"
clip-path="url(#breeze-workflow-run-publish-docs-line-5)">apache</text><text
class="breeze-workflow-run-publish-docs-r1" x="85.4" y="142" textLength="12.2"
clip-path="url(#breeze-workflow-run-publish-docs-line-5)">.</text><text
class="breeze-workflow-run-publish-docs-r4" x="97.6" y="142" textLength="85.4"
clip-path="url(#breeze-workflow-run-publish-docs-line-5)">iceberg</text><text
class="breeze-w [...]
-</text><text class="breeze-workflow-run-publish-docs-r1" x="12.2" y="166.4"
textLength="24.4"
clip-path="url(#breeze-workflow-run-publish-docs-line-6)">| </text><text
class="breeze-workflow-run-publish-docs-r4" x="36.6" y="166.4"
textLength="73.2"
clip-path="url(#breeze-workflow-run-publish-docs-line-6)">apache</text><text
class="breeze-workflow-run-publish-docs-r1" x="109.8" y="166.4"
textLength="12.2"
clip-path="url(#breeze-workflow-run-publish-docs-line-6)">.</text><text
class="b [...]
-</text><text class="breeze-workflow-run-publish-docs-r1" x="12.2" y="190.8"
textLength="24.4"
clip-path="url(#breeze-workflow-run-publish-docs-line-7)">| </text><text
class="breeze-workflow-run-publish-docs-r4" x="36.6" y="190.8"
textLength="73.2"
clip-path="url(#breeze-workflow-run-publish-docs-line-7)">cohere</text><text
class="breeze-workflow-run-publish-docs-r1" x="109.8" y="190.8"
textLength="36.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-7)"> | </text><t
[...]
-</text><text class="breeze-workflow-run-publish-docs-r4" x="12.2" y="215.2"
textLength="85.4"
clip-path="url(#breeze-workflow-run-publish-docs-line-8)">datadog</text><text
class="breeze-workflow-run-publish-docs-r1" x="97.6" y="215.2"
textLength="36.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-8)"> | </text><text
class="breeze-workflow-run-publish-docs-r4" x="134.2" y="215.2"
textLength="36.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-8)">dbt</text><text [...]
-</text><text class="breeze-workflow-run-publish-docs-r4" x="12.2" y="239.6"
textLength="36.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-9)">ftp</text><text
class="breeze-workflow-run-publish-docs-r1" x="48.8" y="239.6"
textLength="36.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-9)"> | </text><text
class="breeze-workflow-run-publish-docs-r4" x="85.4" y="239.6"
textLength="36.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-9)">git</text><text clas
[...]
-</text><text class="breeze-workflow-run-publish-docs-r1" x="12.2" y="264"
textLength="24.4"
clip-path="url(#breeze-workflow-run-publish-docs-line-10)">| </text><text
class="breeze-workflow-run-publish-docs-r4" x="36.6" y="264" textLength="48.8"
clip-path="url(#breeze-workflow-run-publish-docs-line-10)">jdbc</text><text
class="breeze-workflow-run-publish-docs-r1" x="85.4" y="264" textLength="36.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-10)"> | </text><text
cl [...]
-</text><text class="breeze-workflow-run-publish-docs-r4" x="12.2" y="288.4"
textLength="61"
clip-path="url(#breeze-workflow-run-publish-docs-line-11)">neo4j</text><text
class="breeze-workflow-run-publish-docs-r1" x="73.2" y="288.4"
textLength="36.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-11)"> | </text><text
class="breeze-workflow-run-publish-docs-r4" x="109.8" y="288.4"
textLength="48.8"
clip-path="url(#breeze-workflow-run-publish-docs-line-11)">odbc</text><text
[...]
-</text><text class="breeze-workflow-run-publish-docs-r4" x="12.2" y="312.8"
textLength="97.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-12)">pinecone</text><text
class="breeze-workflow-run-publish-docs-r1" x="109.8" y="312.8"
textLength="36.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-12)"> | </text><text
class="breeze-workflow-run-publish-docs-r4" x="146.4" y="312.8"
textLength="97.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-12)">postgres</ [...]
-</text><text class="breeze-workflow-run-publish-docs-r4" x="12.2" y="337.2"
textLength="48.8"
clip-path="url(#breeze-workflow-run-publish-docs-line-13)">smtp</text><text
class="breeze-workflow-run-publish-docs-r1" x="61" y="337.2" textLength="36.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-13)"> | </text><text
class="breeze-workflow-run-publish-docs-r4" x="97.6" y="337.2"
textLength="109.8"
clip-path="url(#breeze-workflow-run-publish-docs-line-13)">snowflake</text><
[...]
-</text><text class="breeze-workflow-run-publish-docs-r4" x="12.2" y="361.6"
textLength="61"
clip-path="url(#breeze-workflow-run-publish-docs-line-14)">vespa</text><text
class="breeze-workflow-run-publish-docs-r1" x="73.2" y="361.6"
textLength="36.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-14)"> | </text><text
class="breeze-workflow-run-publish-docs-r4" x="109.8" y="361.6"
textLength="97.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-14)">weaviate</text><
[...]
+</text><text class="breeze-workflow-run-publish-docs-r4" x="12.2" y="117.6"
textLength="73.2"
clip-path="url(#breeze-workflow-run-publish-docs-line-4)">apache</text><text
class="breeze-workflow-run-publish-docs-r1" x="85.4" y="117.6"
textLength="12.2"
clip-path="url(#breeze-workflow-run-publish-docs-line-4)">-</text><text
class="breeze-workflow-run-publish-docs-r4" x="97.6" y="117.6"
textLength="85.4"
clip-path="url(#breeze-workflow-run-publish-docs-line-4)">airflow</text><text
class="br [...]
+</text><text class="breeze-workflow-run-publish-docs-r4" x="12.2" y="142"
textLength="73.2"
clip-path="url(#breeze-workflow-run-publish-docs-line-5)">apache</text><text
class="breeze-workflow-run-publish-docs-r1" x="85.4" y="142" textLength="12.2"
clip-path="url(#breeze-workflow-run-publish-docs-line-5)">.</text><text
class="breeze-workflow-run-publish-docs-r4" x="97.6" y="142" textLength="48.8"
clip-path="url(#breeze-workflow-run-publish-docs-line-5)">hdfs</text><text
class="breeze-work [...]
+</text><text class="breeze-workflow-run-publish-docs-r4" x="12.2" y="166.4"
textLength="73.2"
clip-path="url(#breeze-workflow-run-publish-docs-line-6)">apache</text><text
class="breeze-workflow-run-publish-docs-r1" x="85.4" y="166.4"
textLength="12.2"
clip-path="url(#breeze-workflow-run-publish-docs-line-6)">.</text><text
class="breeze-workflow-run-publish-docs-r4" x="97.6" y="166.4" textLength="61"
clip-path="url(#breeze-workflow-run-publish-docs-line-6)">pinot</text><text
class="breeze [...]
+</text><text class="breeze-workflow-run-publish-docs-r4" x="12.2" y="190.8"
textLength="97.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-7)">cloudant</text><text
class="breeze-workflow-run-publish-docs-r1" x="109.8" y="190.8"
textLength="36.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-7)"> | </text><text
class="breeze-workflow-run-publish-docs-r4" x="146.4" y="190.8"
textLength="48.8"
clip-path="url(#breeze-workflow-run-publish-docs-line-7)">cncf</text><t [...]
+</text><text class="breeze-workflow-run-publish-docs-r4" x="12.2" y="215.2"
textLength="73.2"
clip-path="url(#breeze-workflow-run-publish-docs-line-8)">common</text><text
class="breeze-workflow-run-publish-docs-r1" x="85.4" y="215.2"
textLength="12.2"
clip-path="url(#breeze-workflow-run-publish-docs-line-8)">.</text><text
class="breeze-workflow-run-publish-docs-r4" x="97.6" y="215.2"
textLength="36.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-8)">sql</text><text
class="breeze [...]
+</text><text class="breeze-workflow-run-publish-docs-r4" x="12.2" y="239.6"
textLength="73.2"
clip-path="url(#breeze-workflow-run-publish-docs-line-9)">exasol</text><text
class="breeze-workflow-run-publish-docs-r1" x="85.4" y="239.6"
textLength="36.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-9)"> | </text><text
class="breeze-workflow-run-publish-docs-r4" x="122" y="239.6"
textLength="36.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-9)">fab</text><text cl
[...]
+</text><text class="breeze-workflow-run-publish-docs-r4" x="12.2" y="264"
textLength="97.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-10)">influxdb</text><text
class="breeze-workflow-run-publish-docs-r1" x="109.8" y="264" textLength="36.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-10)"> | </text><text
class="breeze-workflow-run-publish-docs-r4" x="146.4" y="264"
textLength="134.2"
clip-path="url(#breeze-workflow-run-publish-docs-line-10)">informatica</te [...]
+</text><text class="breeze-workflow-run-publish-docs-r4" x="12.2" y="288.4"
textLength="109.8"
clip-path="url(#breeze-workflow-run-publish-docs-line-11)">microsoft</text><text
class="breeze-workflow-run-publish-docs-r1" x="122" y="288.4"
textLength="12.2"
clip-path="url(#breeze-workflow-run-publish-docs-line-11)">.</text><text
class="breeze-workflow-run-publish-docs-r4" x="134.2" y="288.4" textLength="61"
clip-path="url(#breeze-workflow-run-publish-docs-line-11)">winrm</text><text
class= [...]
+</text><text class="breeze-workflow-run-publish-docs-r4" x="12.2" y="312.8"
textLength="109.8"
clip-path="url(#breeze-workflow-run-publish-docs-line-12)">pagerduty</text><text
class="breeze-workflow-run-publish-docs-r1" x="122" y="312.8"
textLength="36.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-12)"> | </text><text
class="breeze-workflow-run-publish-docs-r4" x="158.6" y="312.8"
textLength="109.8"
clip-path="url(#breeze-workflow-run-publish-docs-line-12)">papermill [...]
+</text><text class="breeze-workflow-run-publish-docs-r4" x="12.2" y="337.2"
textLength="97.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-13)">sendgrid</text><text
class="breeze-workflow-run-publish-docs-r1" x="109.8" y="337.2"
textLength="36.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-13)"> | </text><text
class="breeze-workflow-run-publish-docs-r4" x="146.4" y="337.2"
textLength="48.8"
clip-path="url(#breeze-workflow-run-publish-docs-line-13)">sftp</text [...]
+</text><text class="breeze-workflow-run-publish-docs-r4" x="12.2" y="361.6"
textLength="97.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-14)">teradata</text><text
class="breeze-workflow-run-publish-docs-r1" x="109.8" y="361.6"
textLength="36.6"
clip-path="url(#breeze-workflow-run-publish-docs-line-14)"> | </text><text
class="breeze-workflow-run-publish-docs-r4" x="146.4" y="361.6"
textLength="61"
clip-path="url(#breeze-workflow-run-publish-docs-line-14)">trino</text> [...]
</text><text class="breeze-workflow-run-publish-docs-r1" x="1464" y="386"
textLength="12.2" clip-path="url(#breeze-workflow-run-publish-docs-line-15)">
</text><text class="breeze-workflow-run-publish-docs-r1" x="12.2" y="410.4"
textLength="427"
clip-path="url(#breeze-workflow-run-publish-docs-line-16)">Trigger publish docs to S3 workflow</text><text
class="breeze-workflow-run-publish-docs-r1" x="1464" y="410.4"
textLength="12.2" clip-path="url(#breeze-workflow-run-publish-docs-line-16)">
</text><text class="breeze-workflow-run-publish-docs-r1" x="1464" y="434.8"
textLength="12.2" clip-path="url(#breeze-workflow-run-publish-docs-line-17)">
diff --git a/dev/breeze/doc/images/output_workflow-run_publish-docs.txt
b/dev/breeze/doc/images/output_workflow-run_publish-docs.txt
index 46fa631c817..d5c977ca9dc 100644
--- a/dev/breeze/doc/images/output_workflow-run_publish-docs.txt
+++ b/dev/breeze/doc/images/output_workflow-run_publish-docs.txt
@@ -1 +1 @@
-9845cbadb564c5fe56361e299dc1fb66
+f4e0b4ba219bf74c7f8935ef27799253
diff --git
a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
index 84ddb9f6b45..c4d9202e0eb 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -102,6 +102,7 @@ from airflow_breeze.global_constants import (
MULTI_PLATFORM,
SCHEMA_DESTINATION_LOCATIONS,
UV_VERSION,
+ get_airflow_mypy_version,
get_airflow_version,
get_airflowctl_version,
get_task_sdk_version,
@@ -2044,6 +2045,9 @@ def
get_package_version_possibly_from_stable_txt(package_name: str) -> str | Non
if package_name == "apache-airflow-ctl":
return get_airflowctl_version()
+ if package_name == "apache-airflow-mypy":
+ return get_airflow_mypy_version()
+
if package_name == "task-sdk":
return get_task_sdk_version()
diff --git a/dev/breeze/src/airflow_breeze/global_constants.py
b/dev/breeze/src/airflow_breeze/global_constants.py
index 0e311c13101..9e625094171 100644
--- a/dev/breeze/src/airflow_breeze/global_constants.py
+++ b/dev/breeze/src/airflow_breeze/global_constants.py
@@ -33,6 +33,7 @@ from airflow_breeze.utils.path_utils import (
AIRFLOW_CTL_SOURCES_PATH,
AIRFLOW_ROOT_PATH,
AIRFLOW_TASK_SDK_SOURCES_PATH,
+ MYPY_SOURCES_PATH,
)
PUBLIC_AMD_RUNNERS = '["ubuntu-22.04"]'
@@ -312,6 +313,7 @@ REGULAR_DOC_PACKAGES = [
"task-sdk",
"ts-sdk",
"apache-airflow-ctl",
+ "apache-airflow-mypy",
]
@@ -707,6 +709,19 @@ def get_airflowctl_version():
return airflowctl_version
+def get_airflow_mypy_version():
+ mypy_init_py_file = MYPY_SOURCES_PATH / "airflow_mypy" / "__init__.py"
+ mypy_version = "unknown"
+ with open(mypy_init_py_file) as init_file:
+ while line := init_file.readline():
+ if "__version__ = " in line:
+ mypy_version = line.split()[2][1:-1]
+ break
+ if mypy_version == "unknown":
+ raise RuntimeError("Unable to determine Apache Airflow Mypy version")
+ return mypy_version
+
+
def get_airflow_version():
airflow_init_py_file = AIRFLOW_CORE_SOURCES_PATH / "airflow" /
"__init__.py"
airflow_version = "unknown"
diff --git a/dev/breeze/src/airflow_breeze/utils/add_back_references.py
b/dev/breeze/src/airflow_breeze/utils/add_back_references.py
index 318873f02f2..75fd803fb3d 100644
--- a/dev/breeze/src/airflow_breeze/utils/add_back_references.py
+++ b/dev/breeze/src/airflow_breeze/utils/add_back_references.py
@@ -158,6 +158,9 @@ def start_generating_back_references(
if "apache-airflow-ctl" in short_provider_ids:
console_print("[info]Skipping airflowctl package. No back-reference
needed.")
short_provider_ids.remove("apache-airflow-ctl")
+ if "apache-airflow-mypy" in short_provider_ids:
+ console_print("[info]Skipping apache-airflow-mypy package. No
back-reference needed.")
+ short_provider_ids.remove("apache-airflow-mypy")
if short_provider_ids:
for p in short_provider_ids:
diff --git a/dev/breeze/src/airflow_breeze/utils/docs_publisher.py
b/dev/breeze/src/airflow_breeze/utils/docs_publisher.py
index a27d7490bfc..10dae33e9bd 100644
--- a/dev/breeze/src/airflow_breeze/utils/docs_publisher.py
+++ b/dev/breeze/src/airflow_breeze/utils/docs_publisher.py
@@ -20,6 +20,7 @@ import os
import shutil
from airflow_breeze.global_constants import (
+ get_airflow_mypy_version,
get_airflow_version,
get_airflowctl_version,
get_java_sdk_version,
@@ -88,6 +89,8 @@ class DocsPublisher:
return chart_version()
if self.package_name == "apache-airflow-ctl":
return get_airflowctl_version()
+ if self.package_name == "apache-airflow-mypy":
+ return get_airflow_mypy_version()
if self.package_name == "java-sdk":
return get_java_sdk_version()
raise SystemExit(f"Unsupported package: {self.package_name}")
diff --git a/dev/breeze/src/airflow_breeze/utils/publish_docs_to_s3.py
b/dev/breeze/src/airflow_breeze/utils/publish_docs_to_s3.py
index 972c1b472d6..507983583ce 100644
--- a/dev/breeze/src/airflow_breeze/utils/publish_docs_to_s3.py
+++ b/dev/breeze/src/airflow_breeze/utils/publish_docs_to_s3.py
@@ -34,6 +34,7 @@ PROVIDER_NAME_FORMAT = "apache-airflow-providers-{}"
NON_SHORT_NAME_PACKAGES = [
"apache-airflow",
"apache-airflow-ctl",
+ "apache-airflow-mypy",
"docker-stack",
"helm-chart",
"java-sdk",
diff --git a/dev/breeze/src/airflow_breeze/utils/selective_checks.py
b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
index 33dbaffc35c..02c2e4bb929 100644
--- a/dev/breeze/src/airflow_breeze/utils/selective_checks.py
+++ b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
@@ -367,6 +367,10 @@ CI_FILE_GROUP_MATCHES: HashableDict[FileGroupForCi] =
HashableDict(
r"^airflow-ctl/docs",
r"^airflow-ctl/src/.*\.py$",
r"^airflow-ctl/tests/.*\.py$",
+ r"^dev/mypy/docs/",
+ r"^dev/mypy/src/.*\.py$",
+ r"^dev/mypy/RELEASE_NOTES\.rst$",
+ r"^dev/mypy/pyproject\.toml$",
r"^CHANGELOG\.txt",
r"^airflow-core/src/airflow/config_templates/config\.yml",
r"^chart/RELEASE_NOTES\.rst",
@@ -1670,6 +1674,8 @@ class SelectiveChecks:
packages.append("task-sdk")
if any(file.startswith("airflow-ctl/") for file in self._files):
packages.append("apache-airflow-ctl")
+ if any(file.startswith("dev/mypy/") for file in self._files):
+ packages.append("apache-airflow-mypy")
if providers_affected:
suspended = set(get_suspended_provider_ids())
for provider in providers_affected:
diff --git a/dev/breeze/tests/test_add_back_references.py
b/dev/breeze/tests/test_add_back_references.py
new file mode 100644
index 00000000000..fd6be5d04ef
--- /dev/null
+++ b/dev/breeze/tests/test_add_back_references.py
@@ -0,0 +1,32 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+from pathlib import Path
+from unittest import mock
+
+from airflow_breeze.utils.add_back_references import
start_generating_back_references
+
+
[email protected]("airflow_breeze.utils.add_back_references.generate_back_references",
autospec=True)
+def
test_mypy_docs_do_not_generate_provider_back_references(mock_generate_back_references):
+ package_ids = ["apache-airflow-mypy"]
+
+ start_generating_back_references(Path("airflow-site"), package_ids)
+
+ assert package_ids == []
+ mock_generate_back_references.assert_not_called()
diff --git a/dev/breeze/tests/test_docs_publisher.py
b/dev/breeze/tests/test_docs_publisher.py
index dc32b55256d..83ba086acf0 100644
--- a/dev/breeze/tests/test_docs_publisher.py
+++ b/dev/breeze/tests/test_docs_publisher.py
@@ -114,6 +114,13 @@ def
test_publish_java_sdk_version_falls_back_to_gradle_properties(
assert (java_sdk_archive / "stable.txt").read_text() == "9.9.9\n"
+def test_mypy_version_falls_back_to_package_source(monkeypatch):
+ monkeypatch.setattr(docs_publisher, "get_airflow_mypy_version", lambda:
"0.2.0")
+ publisher = DocsPublisher(package_name="apache-airflow-mypy", output=None,
verbose=False)
+
+ assert publisher._current_version == "0.2.0"
+
+
def test_publish_ts_sdk_version_falls_back_to_package_json(generated_path,
airflow_site_dir, monkeypatch):
monkeypatch.setattr(docs_publisher, "get_ts_sdk_version", lambda:
"0.1.0-alpha.0")
_stage_ts_sdk_docs(generated_path, version=None)
diff --git a/dev/breeze/tests/test_publish_docs_to_s3.py
b/dev/breeze/tests/test_publish_docs_to_s3.py
index f0d419a43e9..b1b14126920 100644
--- a/dev/breeze/tests/test_publish_docs_to_s3.py
+++ b/dev/breeze/tests/test_publish_docs_to_s3.py
@@ -60,6 +60,7 @@ class TestPublishDocsToS3:
"apache-airflow-providers-apache-cassandra",
"helm-chart",
"apache-airflow-ctl",
+ "apache-airflow-mypy",
]
self.publish_docs_to_s3.exclude_docs = "amazon docker-stack
apache.kafka"
@@ -71,6 +72,7 @@ class TestPublishDocsToS3:
"apache-airflow-providers-apache-cassandra",
"helm-chart",
"apache-airflow-ctl",
+ "apache-airflow-mypy",
]
)
diff --git a/dev/breeze/tests/test_release_management_commands.py
b/dev/breeze/tests/test_release_management_commands.py
index 63d2232bc65..26209cbf541 100644
--- a/dev/breeze/tests/test_release_management_commands.py
+++ b/dev/breeze/tests/test_release_management_commands.py
@@ -296,6 +296,12 @@ def
test_get_package_version_possibly_from_stable_txt_for_java_sdk(
assert get_package_version_possibly_from_stable_txt("java-sdk") ==
expected_version
+def test_get_package_version_possibly_from_stable_txt_for_mypy(monkeypatch):
+ monkeypatch.setattr(release_management_commands,
"get_airflow_mypy_version", lambda: "0.2.0")
+
+ assert get_package_version_possibly_from_stable_txt("apache-airflow-mypy")
== "0.2.0"
+
+
@pytest.mark.parametrize(
("stable_txt_content", "expected_version"),
[
diff --git a/dev/breeze/tests/test_selective_checks.py
b/dev/breeze/tests/test_selective_checks.py
index a91804ff4e8..9b953a10c66 100644
--- a/dev/breeze/tests/test_selective_checks.py
+++ b/dev/breeze/tests/test_selective_checks.py
@@ -3104,6 +3104,13 @@ def test_upgrade_to_newer_dependencies(
},
id="Only Airflow docs changed",
),
+ pytest.param(
+ ("dev/mypy/docs/index.rst",),
+ {
+ "docs-list-as-string": "apache-airflow-mypy",
+ },
+ id="Only Apache Airflow Mypy docs changed",
+ ),
pytest.param(
("providers/celery/src/airflow/providers/celery/file.py",),
{"docs-list-as-string": "celery cncf.kubernetes common.compat"},
diff --git a/dev/mypy/docs/conf.py b/dev/mypy/docs/conf.py
new file mode 100644
index 00000000000..713238f8e93
--- /dev/null
+++ b/dev/mypy/docs/conf.py
@@ -0,0 +1,75 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+import os
+from pathlib import Path
+
+from docs.utils.conf_constants import (
+ AIRFLOW_FAVICON_PATH,
+ SPELLING_WORDLIST_PATH,
+ SPHINX_DESIGN_STATIC_PATH,
+ get_html_context,
+ get_html_sidebars,
+ get_html_theme_options,
+)
+
+import airflow_mypy
+
+CONF_DIR = Path(__file__).parent.absolute()
+PACKAGE_NAME = "apache-airflow-mypy"
+PACKAGE_VERSION = airflow_mypy.__version__
+
+os.environ["AIRFLOW_PACKAGE_NAME"] = PACKAGE_NAME
+
+project = "Apache Airflow Mypy"
+version = PACKAGE_VERSION
+release = PACKAGE_VERSION
+
+language = "en"
+locale_dirs: list[str] = []
+
+extensions = [
+ "sphinx.ext.intersphinx",
+ "airflow_intersphinx",
+ "sphinxcontrib.spelling",
+]
+
+html_theme = "sphinx_airflow_theme"
+html_title = "Apache Airflow Mypy Documentation"
+html_short_title = "Airflow Mypy"
+html_favicon = AIRFLOW_FAVICON_PATH.as_posix()
+html_static_path = [SPHINX_DESIGN_STATIC_PATH.as_posix()]
+html_css_files = ["custom.css"]
+html_sidebars = get_html_sidebars(PACKAGE_VERSION)
+html_theme_options = get_html_theme_options()
+conf_py_path = "/dev/mypy/docs/"
+html_context = get_html_context(conf_py_path)
+html_use_index = True
+html_show_copyright = False
+
+intersphinx_mapping = {
+ "airflow": ("https://airflow.apache.org/docs/apache-airflow/stable/",
None),
+}
+
+spelling_show_suggestions = False
+spelling_word_list_filename = [
+ SPELLING_WORDLIST_PATH.as_posix(),
+ (CONF_DIR / "spelling_wordlist.txt").as_posix(),
+]
+spelling_ignore_importable_modules = True
+spelling_ignore_contributor_names = True
diff --git a/dev/mypy/docs/index.rst b/dev/mypy/docs/index.rst
new file mode 100644
index 00000000000..31e255344bb
--- /dev/null
+++ b/dev/mypy/docs/index.rst
@@ -0,0 +1,75 @@
+ .. Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ .. http://www.apache.org/licenses/LICENSE-2.0
+
+ .. Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+Apache Airflow Mypy plugins
+===========================
+
+``apache-airflow-mypy`` provides `mypy <https://mypy-lang.org/>`_ plugins for
Airflow-specific patterns.
+The package is optional, independently versioned, and is not required to run
Airflow.
+
+Use the plugins when type-checking Dags, custom operators, or hooks to avoid
false positives that plain
+``mypy`` cannot resolve. The plugins support:
+
+* **Typed decorators** -- decorators that inject keyword arguments at runtime,
such as
+ ``GoogleBaseHook.fallback_to_default_project_id``.
+* **Operator outputs** -- the ``.output`` attribute of operators and the
return value of ``@task``-decorated
+ functions are resolved from ``XComArg`` to their underlying runtime type.
+
+Installation
+------------
+
+Install the package alongside ``mypy``:
+
+.. code-block:: bash
+
+ pip install apache-airflow-mypy
+
+The package follows `SemVer <https://semver.org/>`_ and can be upgraded
independently of Airflow.
+
+Configuration
+-------------
+
+Enable both plugins in ``mypy.ini``, ``setup.cfg``, or ``pyproject.toml``:
+
+.. code-block:: ini
+
+ [mypy]
+ plugins = airflow_mypy.plugins.decorators, airflow_mypy.plugins.outputs
+
+For example, the output plugin lets ``mypy`` infer the return type of a
TaskFlow task:
+
+.. code-block:: python
+
+ @task
+ def count_characters(value: str) -> int:
+ return len(value)
+
+
+ @task
+ def report_count(count: int) -> None: ...
+
+
+ report_count(count_characters("Airflow"))
+
+Without the plugin, ``mypy`` sees an ``XComArg`` passed to ``report_count``.
With the plugin enabled, it
+understands that ``count_characters`` produces an ``int``.
+
+.. toctree::
+ :hidden:
+ :caption: Reference
+
+ release_notes
diff --git a/dev/mypy/docs/release_notes.rst b/dev/mypy/docs/release_notes.rst
new file mode 100644
index 00000000000..d64d2f314b4
--- /dev/null
+++ b/dev/mypy/docs/release_notes.rst
@@ -0,0 +1,21 @@
+ .. Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ .. http://www.apache.org/licenses/LICENSE-2.0
+
+ .. Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+Release Notes
+=============
+
+.. include:: ../RELEASE_NOTES.rst
diff --git a/dev/mypy/docs/spelling_wordlist.txt
b/dev/mypy/docs/spelling_wordlist.txt
new file mode 100644
index 00000000000..171ae874ec6
--- /dev/null
+++ b/dev/mypy/docs/spelling_wordlist.txt
@@ -0,0 +1,20 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+mypy
+TaskFlow
+XComArg
diff --git a/dev/mypy/pyproject.toml b/dev/mypy/pyproject.toml
index 612e9e75674..f3f18673808 100644
--- a/dev/mypy/pyproject.toml
+++ b/dev/mypy/pyproject.toml
@@ -52,7 +52,7 @@ dependencies = [
Documentation =
"https://airflow.apache.org/docs/apache-airflow-mypy/stable/index.html"
Downloads = "https://archive.apache.org/dist/airflow/airflow-mypy/"
Homepage = "https://airflow.apache.org/"
-"Release Notes" =
"https://airflow.apache.org/docs/apache-airflow-mypy/stable/changelog.html"
+"Release Notes" =
"https://airflow.apache.org/docs/apache-airflow-mypy/stable/release_notes.html"
"Slack Chat" = "https://s.apache.org/airflow-slack"
"Source Code" = "https://github.com/apache/airflow"
LinkedIn = "https://www.linkedin.com/company/apache-airflow/"
@@ -78,6 +78,16 @@ path = "src/airflow_mypy/__init__.py"
[tool.hatch.build.targets.wheel]
packages = ["src/airflow_mypy"]
+[dependency-groups]
+# To build docs:
+#
+# uv run --group docs build-docs
+#
+docs = [
+ "apache-airflow-core",
+ "apache-airflow-devel-common[docs]"
+]
+
[tool.ruff]
extend = "../../pyproject.toml"
src = ["src"]
@@ -128,3 +138,7 @@ showcontent = true
[tool.uv]
required-version = ">=0.11.8"
+
+[tool.uv.sources]
+apache-airflow-core = { path = "../../airflow-core", editable = true }
+apache-airflow-devel-common = { path = "../../devel-common", editable = true }
diff --git a/dev/registry/derive_wave_providers.py
b/dev/registry/derive_wave_providers.py
index 374cf3e6ff1..9ce9d59c28f 100644
--- a/dev/registry/derive_wave_providers.py
+++ b/dev/registry/derive_wave_providers.py
@@ -59,6 +59,7 @@ NON_PROVIDER_TOKENS = frozenset(
"helm-chart",
"docker-stack",
"apache-airflow-ctl",
+ "apache-airflow-mypy",
"task-sdk",
}
)
diff --git a/dev/registry/tests/test_derive_wave_providers.py
b/dev/registry/tests/test_derive_wave_providers.py
index 32a35d93b95..08f011b52a0 100644
--- a/dev/registry/tests/test_derive_wave_providers.py
+++ b/dev/registry/tests/test_derive_wave_providers.py
@@ -90,7 +90,7 @@ WAVE_PROVIDER_TAGS = [
# Explicit with dot-to-hyphen conversion.
("common.ai", "any", "common-ai", False, ""),
# Explicit with non-provider tokens stripped.
- ("apache-airflow helm-chart docker-stack", "any", "", False, ""),
+ ("apache-airflow apache-airflow-mypy helm-chart docker-stack", "any",
"", False, ""),
# Explicit dedup.
("amazon amazon google", "any", "amazon google", False, ""),
# Empty.
diff --git a/devel-common/pyproject.toml b/devel-common/pyproject.toml
index 17ad5220fdd..5006e1fe2eb 100644
--- a/devel-common/pyproject.toml
+++ b/devel-common/pyproject.toml
@@ -77,6 +77,7 @@ dependencies = [
"astroid>=4",
"rich-click>=1.9.7",
"click>=8.3.0",
+ "tabulate>=0.9.0",
"docutils>=0.21",
"pagefind>=1.5.0",
"pagefind-bin>=1.5.0",
diff --git
a/devel-common/src/sphinx_exts/docs_build/dev_index_template.html.jinja2
b/devel-common/src/sphinx_exts/docs_build/dev_index_template.html.jinja2
index 4c990817d38..9931753143f 100644
--- a/devel-common/src/sphinx_exts/docs_build/dev_index_template.html.jinja2
+++ b/devel-common/src/sphinx_exts/docs_build/dev_index_template.html.jinja2
@@ -65,6 +65,15 @@
</div>
</div>
+ <div class="row">
+ <div class="col">
+ <h2><a
href="/docs/apache-airflow-mypy/stable/index.html"><code>apache-airflow-mypy</code></a></h2>
+ <p>
+ Mypy plugins for Airflow-specific static type checking.
+ </p>
+ </div>
+ </div>
+
<div class="row">
<div class="col">
<h2><a href="/docs/task-sdk/stable/index.html">Task SDK</a></h2>
diff --git a/devel-common/src/sphinx_exts/docs_build/docs_builder.py
b/devel-common/src/sphinx_exts/docs_build/docs_builder.py
index 147215a7353..12bf36e79a4 100644
--- a/devel-common/src/sphinx_exts/docs_build/docs_builder.py
+++ b/devel-common/src/sphinx_exts/docs_build/docs_builder.py
@@ -124,6 +124,8 @@ class AirflowDocsBuilder:
return (AIRFLOW_CONTENT_ROOT_PATH /
"providers").joinpath(*package_paths) / "docs"
if self.package_name == "apache-airflow-ctl":
return AIRFLOW_CONTENT_ROOT_PATH / "airflow-ctl" / "docs"
+ if self.package_name == "apache-airflow-mypy":
+ return AIRFLOW_CONTENT_ROOT_PATH / "dev" / "mypy" / "docs"
if self.package_name == "task-sdk":
return AIRFLOW_CONTENT_ROOT_PATH / "task-sdk" / "docs"
console.print(f"[red]Unknown package name: {self.package_name}")
@@ -342,6 +344,7 @@ def get_available_packages(include_suspended: bool = False,
short_form: bool = F
*provider_names,
"apache-airflow-providers",
"apache-airflow-ctl",
+ "apache-airflow-mypy",
"task-sdk",
"helm-chart",
"docker-stack",
diff --git
a/devel-common/tests/unit/sphinx_exts/docs_build/test_docs_builder.py
b/devel-common/tests/unit/sphinx_exts/docs_build/test_docs_builder.py
new file mode 100644
index 00000000000..49434230c10
--- /dev/null
+++ b/devel-common/tests/unit/sphinx_exts/docs_build/test_docs_builder.py
@@ -0,0 +1,30 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+from sphinx_exts.docs_build.code_utils import AIRFLOW_CONTENT_ROOT_PATH
+from sphinx_exts.docs_build.docs_builder import AirflowDocsBuilder,
get_available_packages
+
+
+def test_mypy_docs_package_is_available():
+ assert "apache-airflow-mypy" in get_available_packages()
+
+
+def test_mypy_docs_source_directory():
+ builder = AirflowDocsBuilder(package_name="apache-airflow-mypy")
+
+ assert builder._src_dir == AIRFLOW_CONTENT_ROOT_PATH / "dev" / "mypy" /
"docs"
diff --git a/docs/README.md b/docs/README.md
index 28ae32a1db8..02c4af4b5d8 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -50,6 +50,7 @@ Documentation in separate distributions:
* `chart/docs` - documentation for the Helm Chart
* `task-sdk/docs` - documentation for Task SDK (new format not yet published)
* `airflow-ctl/docs` - documentation for Airflow CLI
+* `dev/mypy/docs` - documentation for the Apache Airflow Mypy plugins
Documentation for a general overview and summaries not connected with any
specific distribution:
@@ -141,7 +142,7 @@ You can also specify whether documentation should be
published to `live` or `sta
The person who triggers the build (release manager) should specify the tag
name of the docs to be published
and the list of documentation packages to be published. Usually it is:
-* Airflow: `apache-airflow docker-stack task-sdk apache-airflow-ctl`
+* Airflow: `apache-airflow docker-stack task-sdk apache-airflow-ctl
apache-airflow-mypy`
* Helm chart: `helm-chart`
* Providers: `provider_id1 provider_id2` or `all providers` if all providers
should be published.
diff --git a/scripts/ci/docs/store_stable_versions.py
b/scripts/ci/docs/store_stable_versions.py
index 91fb8247761..c00d7ab79f8 100755
--- a/scripts/ci/docs/store_stable_versions.py
+++ b/scripts/ci/docs/store_stable_versions.py
@@ -105,6 +105,11 @@ def get_package_version(package_name: str, airflow_root:
Path) -> str | None:
if package_name == "apache-airflow-ctl":
return get_version_from_init_py(airflow_root / "airflow-ctl" / "src" /
"airflowctl" / "__init__.py")
+ if package_name == "apache-airflow-mypy":
+ return get_version_from_init_py(
+ airflow_root / "dev" / "mypy" / "src" / "airflow_mypy" /
"__init__.py"
+ )
+
if package_name == "task-sdk":
return get_version_from_init_py(airflow_root / "task-sdk" / "src" /
"airflow" / "sdk" / "__init__.py")
diff --git a/scripts/ci/prek/mypy_folder.py b/scripts/ci/prek/mypy_folder.py
index 420017c1616..860755ff689 100755
--- a/scripts/ci/prek/mypy_folder.py
+++ b/scripts/ci/prek/mypy_folder.py
@@ -45,6 +45,7 @@ ALLOWED_FOLDERS = [
"airflow-core",
*[f"providers/{provider_id.replace('.', '/')}" for provider_id in
get_all_provider_ids()],
"dev",
+ "dev/mypy",
"scripts",
"devel-common",
"task-sdk",
diff --git a/scripts/tests/ci/docs/test_store_stable_versions.py
b/scripts/tests/ci/docs/test_store_stable_versions.py
index ef02e2e5787..9755256dbbc 100644
--- a/scripts/tests/ci/docs/test_store_stable_versions.py
+++ b/scripts/tests/ci/docs/test_store_stable_versions.py
@@ -155,6 +155,13 @@ class TestGetPackageVersion:
assert get_package_version("apache-airflow-ctl", tmp_path) == "0.1.3"
+ def test_apache_airflow_mypy(self, tmp_path):
+ init_file = tmp_path / "dev" / "mypy" / "src" / "airflow_mypy" /
"__init__.py"
+ init_file.parent.mkdir(parents=True)
+ init_file.write_text('__version__ = "0.2.0"\n')
+
+ assert get_package_version("apache-airflow-mypy", tmp_path) == "0.2.0"
+
def test_task_sdk(self, tmp_path):
init_file = tmp_path / "task-sdk" / "src" / "airflow" / "sdk" /
"__init__.py"
init_file.parent.mkdir(parents=True)
@@ -212,6 +219,9 @@ class TestMain:
ctl_init = airflow_root / "airflow-ctl" / "src" / "airflowctl" /
"__init__.py"
ctl_init.parent.mkdir(parents=True)
ctl_init.write_text('__version__ = "0.1.3"\n')
+ mypy_init = airflow_root / "dev" / "mypy" / "src" / "airflow_mypy" /
"__init__.py"
+ mypy_init.parent.mkdir(parents=True)
+ mypy_init.write_text('__version__ = "0.2.0"\n')
return airflow_root
def _create_docs_build_dir(self, tmp_path, packages):
@@ -225,7 +235,9 @@ class TestMain:
def test_creates_stable_txt(self, tmp_path, monkeypatch):
airflow_root = self._create_fake_airflow_root(tmp_path)
- docs_dir = self._create_docs_build_dir(tmp_path, ["apache-airflow",
"apache-airflow-ctl"])
+ docs_dir = self._create_docs_build_dir(
+ tmp_path, ["apache-airflow", "apache-airflow-ctl",
"apache-airflow-mypy"]
+ )
monkeypatch.setenv("DOCS_BUILD_DIR", str(docs_dir))
monkeypatch.setenv("AIRFLOW_ROOT", str(airflow_root))
@@ -235,6 +247,7 @@ class TestMain:
assert result == 0
assert (docs_dir / "apache-airflow" / "stable.txt").read_text() ==
"3.2.0\n"
assert (docs_dir / "apache-airflow-ctl" / "stable.txt").read_text() ==
"0.1.3\n"
+ assert (docs_dir / "apache-airflow-mypy" / "stable.txt").read_text()
== "0.2.0\n"
def test_creates_versioned_directory(self, tmp_path, monkeypatch):
airflow_root = self._create_fake_airflow_root(tmp_path)
diff --git a/uv.lock b/uv.lock
index ef8a6032697..fd05489f13a 100644
--- a/uv.lock
+++ b/uv.lock
@@ -2513,6 +2513,7 @@ docs = [
{ name = "sphinxcontrib-serializinghtml" },
{ name = "sphinxcontrib-spelling" },
{ name = "swagger-plugin-for-sphinx" },
+ { name = "tabulate" },
]
docs-gen = [
{ name = "diagrams" },
@@ -2702,6 +2703,7 @@ requires-dist = [
{ 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,!=7.2.0" },
+ { name = "tabulate", marker = "extra == 'docs'", specifier = ">=0.9.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"
},
@@ -2876,9 +2878,21 @@ dependencies = [
{ name = "mypy" },
]
+[package.dev-dependencies]
+docs = [
+ { name = "apache-airflow-core" },
+ { name = "apache-airflow-devel-common", extra = ["docs"] },
+]
+
[package.metadata]
requires-dist = [{ name = "mypy", specifier = ">=1.0.0" }]
+[package.metadata.requires-dev]
+docs = [
+ { name = "apache-airflow-core", editable = "airflow-core" },
+ { name = "apache-airflow-devel-common", extras = ["docs"], editable =
"devel-common" },
+]
+
[[package]]
name = "apache-airflow-providers"
version = "0.0.1"