You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by po...@apache.org on 2023/12/30 12:20:03 UTC
(airflow) branch v2-8-test updated (2c10e93f67 -> 94186a04f1)
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a change to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
from 2c10e93f67 Update version of airflow to 2.8.1.dev0
new 00ee94bb64 Add code snippet formatting in docstrings via Ruff (#36262)
new 097659eb5b Move removal of chicken-egg providers to before releasing image (#36286)
new b3031114b8 Remove additional generation of dependencies when building CI images (#36283)
new 8986f8f3be Fix using extras when `--use-airflow-version` is used in Breeze (#36280)
new 75dc157950 Add steps to update constraints and adjust version for chicken-egg (#36288)
new 2cad58ad4e Updating version of airflow pre-commit should happen when version change (#36293)
new c284ece145 Less verbose information about changed provider.yaml files (#36307)
new b06b1fc8be Airflow 2.8.0 has been released (#36298)
new a51887bcb7 Update the release date of Airflow 2.8.0 (#36321)
new ae0ceb382d Improve pre-commit to generate Airflow diagrams as a code (#36333)
new 0d12706dd9 Remove rendundant and unused code in docs building/publishing (#36346)
new d79f7a4027 Fix problems with missing selective checks on new types of unit tests (#36372)
new 99ec731487 Fix --use-airflow-version constraints (#36378)
new 7985fa898a Add note for release manager about updating the states of providers (#36392)
new e49c573d9c Update release process for providers to include mixed RC versions (#36385)
new 879af06000 Use default Postgres version for Quarantined tests (#36390)
new 0db3bc6b53 Add feture of "not-ready" provider. (#36391)
new d853785703 Automate rcN calculation when releasing provider packages (#36441)
new e1d2e7f3b5 Update BREEZE.rst with different test example (#36234)
new 5576e1151d Update providers metadata 2023-12-28 (#36459)
new 00fc3db79a Remove pypitest from the release process (#36466)
new e3316c36b4 Fix preparing rc candidates for providers (#36465)
new 21a411d58f Add utkarsharma2 to committers list (#36474)
new b9ef5a0898 Improve generation of "Status of testing" issue (#36470)
new dd6572fb03 Check executable permission for entrypoints at breeze start (#36482)
new a161e6eb6e Add zlib1g-dev package to Airflow images (#36493)
new 94186a04f1 Bump stalebot to version 9 (#36494)
The 27 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.github/ISSUE_TEMPLATE/airflow_bug_report.yml | 17 +-
.github/actions/build-ci-images/action.yml | 4 +-
.github/workflows/build-images.yml | 1 +
.github/workflows/ci.yml | 9 +-
.github/workflows/recheck-old-bug-report.yml | 8 +-
.github/workflows/stale.yml | 2 +-
.pre-commit-config.yaml | 10 +-
.rat-excludes | 3 +
BREEZE.rst | 2 +-
CONTRIBUTING.rst | 45 ++
Dockerfile | 4 +-
Dockerfile.ci | 2 +-
RELEASE_NOTES.rst | 2 +-
TESTING.rst | 2 +-
airflow/io/path.py | 4 +-
airflow/macros/__init__.py | 8 +-
airflow/models/baseoperator.py | 18 +-
airflow/models/dag.py | 7 +-
airflow/models/taskinstance.py | 4 +
airflow/models/xcom_arg.py | 4 +-
airflow/provider.yaml.schema.json | 4 +
airflow/providers/amazon/aws/operators/s3.py | 20 +-
.../providers/amazon/aws/operators/sagemaker.py | 13 +-
.../providers/apache/cassandra/hooks/cassandra.py | 6 +-
.../providers/apache/cassandra/sensors/record.py | 10 +-
.../providers/apache/cassandra/sensors/table.py | 6 +-
airflow/providers/apache/hive/hooks/hive.py | 23 +-
airflow/providers/apache/hive/macros/hive.py | 6 +-
.../providers/databricks/operators/databricks.py | 18 +-
airflow/providers/ftp/operators/ftp.py | 2 +-
.../providers/google/cloud/operators/bigquery.py | 83 ++--
airflow/providers/google/cloud/operators/gcs.py | 10 +-
.../google/cloud/operators/kubernetes_engine.py | 5 +-
airflow/providers/google/cloud/operators/pubsub.py | 102 ++---
.../google/cloud/transfers/adls_to_gcs.py | 10 +-
.../providers/google/cloud/transfers/gcs_to_gcs.py | 84 ++--
.../google/cloud/transfers/mssql_to_gcs.py | 18 +-
.../providers/microsoft/azure/operators/adls.py | 6 +-
.../azure/operators/container_instances.py | 46 +-
airflow/providers/sftp/operators/sftp.py | 2 +-
airflow/sensors/weekday.py | 17 +-
airflow/utils/email.py | 2 +-
airflow/utils/helpers.py | 2 +-
airflow/utils/types.py | 1 +
airflow/www/extensions/init_appbuilder.py | 21 +-
dev/README_RELEASE_AIRFLOW.md | 46 +-
dev/README_RELEASE_PROVIDER_PACKAGES.md | 180 +++++---
.../src/airflow_breeze/commands/common_options.py | 11 +-
.../common_package_installation_options.py | 5 +-
.../airflow_breeze/commands/developer_commands.py | 7 +-
.../commands/developer_commands_config.py | 1 +
.../commands/release_management_commands.py | 115 ++++-
.../commands/release_management_commands_config.py | 5 +-
dev/breeze/src/airflow_breeze/global_constants.py | 1 +
.../src/airflow_breeze/params/shell_params.py | 7 +
.../prepare_providers/provider_packages.py | 43 +-
.../provider_issue_TEMPLATE.md.jinja2 | 10 +-
.../airflow_breeze/utils/docker_command_utils.py | 35 +-
.../src/airflow_breeze/utils/docs_publisher.py | 101 +++++
.../src/airflow_breeze/utils/md5_build_check.py | 13 +-
dev/breeze/src/airflow_breeze/utils/packages.py | 24 +-
dev/breeze/src/airflow_breeze/utils/path_utils.py | 1 +
.../airflow_breeze/utils/publish_docs_builder.py | 297 ------------
.../src/airflow_breeze/utils/selective_checks.py | 58 +--
dev/breeze/tests/test_selective_checks.py | 47 ++
dev/mypy/plugin/outputs.py | 1 +
...agram_fab_auth_manager_airflow_architecture.png | Bin 0 -> 81735 bytes
...iagram_auth_manager_airflow_architecture.md5sum | 1 +
.../diagram_auth_manager_airflow_architecture.png | Bin 0 -> 54220 bytes
.../diagram_auth_manager_airflow_architecture.py | 73 +++
.../img/diagram_basic_airflow_architecture.md5sum | 1 +
.../img/diagram_basic_airflow_architecture.py | 77 ++++
...agram_dag_processor_airflow_architecture.md5sum | 1 +
.../diagram_dag_processor_airflow_architecture.py | 84 ++++
...am_fab_auth_manager_airflow_architecture.md5sum | 1 +
...agram_fab_auth_manager_airflow_architecture.png | Bin 0 -> 49545 bytes
...iagram_fab_auth_manager_airflow_architecture.py | 74 +++
.../diagrams/python_multiprocess_logo.png | Bin
docs/exts/docs_build/docs_builder.py | 34 --
generated/provider_dependencies.json | 2 +-
generated/provider_metadata.json | 500 ++++++++++++---------
images/breeze/output_build-docs.svg | 54 ++-
images/breeze/output_build-docs.txt | 2 +-
...tput_release-management_add-back-references.svg | 26 +-
...tput_release-management_add-back-references.txt | 2 +-
...management_generate-issue-content-providers.svg | 18 +-
...management_generate-issue-content-providers.txt | 2 +-
...elease-management_install-provider-packages.svg | 92 ++--
...elease-management_install-provider-packages.txt | 2 +-
...e-management_prepare-provider-documentation.svg | 54 +--
...e-management_prepare-provider-documentation.txt | 2 +-
...elease-management_prepare-provider-packages.svg | 36 +-
...elease-management_prepare-provider-packages.txt | 2 +-
.../output_release-management_publish-docs.svg | 56 +--
.../output_release-management_publish-docs.txt | 2 +-
...release-management_verify-provider-packages.svg | 74 ++-
...release-management_verify-provider-packages.txt | 2 +-
images/breeze/output_shell.svg | 104 +++--
images/breeze/output_shell.txt | 2 +-
images/breeze/output_start-airflow.svg | 82 ++--
images/breeze/output_start-airflow.txt | 2 +-
pyproject.toml | 3 +
scripts/ci/pre_commit/common_precommit_utils.py | 2 +-
.../pre_commit_generate_airflow_diagrams.py | 121 +----
.../pre_commit_update_providers_dependencies.py | 8 +-
scripts/docker/install_os_dependencies.sh | 2 +-
.../in_container/install_airflow_and_providers.py | 7 +-
tests/conftest.py | 6 +-
tests/test_utils/providers.py | 2 +-
tests/www/views/test_views_tasks.py | 1 +
110 files changed, 1858 insertions(+), 1439 deletions(-)
create mode 100644 dev/breeze/src/airflow_breeze/utils/docs_publisher.py
delete mode 100644 dev/breeze/src/airflow_breeze/utils/publish_docs_builder.py
create mode 100644 docs/apache-airflow-providers-fab/img/diagram_fab_auth_manager_airflow_architecture.png
create mode 100644 docs/apache-airflow/img/diagram_auth_manager_airflow_architecture.md5sum
create mode 100644 docs/apache-airflow/img/diagram_auth_manager_airflow_architecture.png
create mode 100644 docs/apache-airflow/img/diagram_auth_manager_airflow_architecture.py
create mode 100644 docs/apache-airflow/img/diagram_basic_airflow_architecture.md5sum
create mode 100644 docs/apache-airflow/img/diagram_basic_airflow_architecture.py
create mode 100644 docs/apache-airflow/img/diagram_dag_processor_airflow_architecture.md5sum
create mode 100644 docs/apache-airflow/img/diagram_dag_processor_airflow_architecture.py
create mode 100644 docs/apache-airflow/img/diagram_fab_auth_manager_airflow_architecture.md5sum
create mode 100644 docs/apache-airflow/img/diagram_fab_auth_manager_airflow_architecture.png
create mode 100644 docs/apache-airflow/img/diagram_fab_auth_manager_airflow_architecture.py
rename {images => docs}/diagrams/python_multiprocess_logo.png (100%)
(airflow) 09/27: Update the release date of Airflow 2.8.0 (#36321)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit a51887bcb777bb2cdde3146d734b2e6b00c82175
Author: Ephraim Anierobi <sp...@gmail.com>
AuthorDate: Wed Dec 20 08:32:11 2023 +0100
Update the release date of Airflow 2.8.0 (#36321)
2.8.0 was later released on 18th
(cherry picked from commit c09a64c9c77cba13507b99c4054bdef653282027)
---
RELEASE_NOTES.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/RELEASE_NOTES.rst b/RELEASE_NOTES.rst
index 4be89c2010..8f34a8dbf3 100644
--- a/RELEASE_NOTES.rst
+++ b/RELEASE_NOTES.rst
@@ -21,7 +21,7 @@
.. towncrier release notes start
-Airflow 2.8.0 (2023-12-14)
+Airflow 2.8.0 (2023-12-18)
--------------------------
Significant Changes
(airflow) 15/27: Update release process for providers to include mixed RC versions (#36385)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit e49c573d9ce03066c61cce0624576700de1de07a
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Sat Dec 23 17:46:29 2023 +0100
Update release process for providers to include mixed RC versions (#36385)
This PR updates released process for providers to enable releasing
providers in more regular batches. Sometimes when we exclude a
provider from previous voting, we want to release RCN (2,3 etc.)
candidate.
However, especially when time between previous RC and the new one
is long (for example because fixing took a long time) we might
want to release the RCN release for that cancelled providers and
RC1 for all the providers that have been changed in the meantime.
This cchange makes it possible (and easy):
1) release RC1 for all providers (the RCN provider should be skipped,
because tag for this provider already exists.
2) release the RCN providers with `--version-suffix-for-pypi rcN`.
The release process and tools were updated to account for that - where
rc candidate number is retrieved from packages prepared in `dist`.
Fixed a few small missing things in the process.
(cherry picked from commit 4deed641322343cb18eabd9ad199f5ac83f29ff0)
---
dev/README_RELEASE_PROVIDER_PACKAGES.md | 20 ++++++++++++--------
.../commands/release_management_commands.py | 22 +++++++++++++++++++++-
.../provider_issue_TEMPLATE.md.jinja2 | 2 +-
3 files changed, 34 insertions(+), 10 deletions(-)
diff --git a/dev/README_RELEASE_PROVIDER_PACKAGES.md b/dev/README_RELEASE_PROVIDER_PACKAGES.md
index f281b8403f..2c7830a413 100644
--- a/dev/README_RELEASE_PROVIDER_PACKAGES.md
+++ b/dev/README_RELEASE_PROVIDER_PACKAGES.md
@@ -330,13 +330,21 @@ breeze release-management prepare-provider-packages --include-removed-providers
--version-suffix-for-pypi rc1 --package-format both
```
-if you only build few packages, run:
+If you only build few packages, run:
```shell script
breeze release-management prepare-provider-packages \
--version-suffix-for-pypi rc1 --package-format both PACKAGE PACKAGE ....
```
+In case you are ALSO releasing RC2, RC3, etc. for selected packages, they will be skipped automatically because
+the `rc1` tag will be created for them already. In this case you should specify the ``rc*`` that you want to
+build and specify the package id's you want to build.
+
+```shell script
+breeze release-management prepare-provider-packages --version-suffix-for-pypi rc2 --package-format both PACKAGE
+```
+
* Verify the artifacts that would be uploaded:
```shell script
@@ -416,7 +424,7 @@ git pull --rebase
```shell script
cd "${AIRFLOW_REPO_ROOT}"
-breeze build-docs --clean-build apache-airflow-providers all-providers
+breeze build-docs --clean-build apache-airflow-providers all-providers --include-removed-providers
```
Usually when we release packages we also build documentation for the "documentation-only" packages. This
@@ -461,12 +469,6 @@ breeze release-management publish-docs apache-airflow-providers all-providers --
breeze release-management add-back-references all-providers
```
-If you see `ModuleNotFoundError: No module named 'docs'`, set:
-
-```
-export PYTHONPATH=.:${PYTHONPATH}
-```
-
If you have providers as list of provider ids because you just released them you can build them with
```shell script
@@ -503,6 +505,8 @@ You can also pass the token as `--github-token` option in the script.
You can also pass list of PR to be excluded from the issue with `--excluded-pr-list`.
```shell script
+cd "${AIRFLOW_REPO_ROOT}"
+
breeze release-management generate-issue-content-providers --only-available-in-dist
```
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 4a6a2e996a..fba5855ef1 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -1495,6 +1495,23 @@ def is_package_in_dist(dist_files: list[str], package: str) -> bool:
)
+VERSION_MATCH = re.compile(r"([0-9]+)\.([0-9]+)\.([0-9]+)(.*)")
+
+
+def get_suffix_from_package_in_dist(dist_files: list[str], package: str) -> str | None:
+ """Get suffix from package prepared in dist folder."""
+ for file in dist_files:
+ if file.startswith(f'apache_airflow_providers_{package.replace(".", "_")}') and file.endswith(
+ ".tar.gz"
+ ):
+ file = file[: -len(".tar.gz")]
+ version = file.split("-")[-1]
+ match = VERSION_MATCH.match(version)
+ if match:
+ return match.group(4)
+ return None
+
+
def get_prs_for_package(provider_id: str) -> list[int]:
pr_matcher = re.compile(r".*\(#([0-9]*)\)``$")
prs = []
@@ -1566,6 +1583,7 @@ def generate_issue_content_providers(
pypi_package_name: str
version: str
pr_list: list[PullRequest.PullRequest | Issue.Issue]
+ suffix: str
if not provider_packages:
provider_packages = list(DEPENDENCIES.keys())
@@ -1622,16 +1640,18 @@ def generate_issue_content_providers(
).read_text()
)
if pull_request_list:
+ package_suffix = get_suffix_from_package_in_dist(files_in_dist, provider_id)
providers[provider_id] = ProviderPRInfo(
version=provider_yaml_dict["versions"][0],
provider_package_id=provider_id,
pypi_package_name=provider_yaml_dict["package-name"],
pr_list=pull_request_list,
+ suffix=package_suffix if package_suffix else suffix,
)
template = jinja2.Template(
(Path(__file__).parents[1] / "provider_issue_TEMPLATE.md.jinja2").read_text()
)
- issue_content = template.render(providers=providers, date=datetime.now(), suffix=suffix)
+ issue_content = template.render(providers=providers, date=datetime.now())
get_console().print()
get_console().print(
"[green]Below you can find the issue content that you can use "
diff --git a/dev/breeze/src/airflow_breeze/provider_issue_TEMPLATE.md.jinja2 b/dev/breeze/src/airflow_breeze/provider_issue_TEMPLATE.md.jinja2
index 1639a8857d..8009549772 100644
--- a/dev/breeze/src/airflow_breeze/provider_issue_TEMPLATE.md.jinja2
+++ b/dev/breeze/src/airflow_breeze/provider_issue_TEMPLATE.md.jinja2
@@ -10,7 +10,7 @@ Let us know in the comment, whether the issue is addressed.
Those are providers that require testing as there were some substantial changes introduced:
{% for provider_id, provider_info in providers.items() %}
-## Provider [{{ provider_id }}: {{ provider_info.version }}{{ suffix }}](https://pypi.org/project/{{ provider_info.pypi_package_name }}/{{ provider_info.version }}{{ suffix }})
+## Provider [{{ provider_id }}: {{ provider_info.version }}{{ provider_info.suffix }}](https://pypi.org/project/{{ provider_info.pypi_package_name }}/{{ provider_info.version }}{{ provider_info.suffix }})
{%- for pr in provider_info.pr_list %}
- [ ] [{{ pr.title }} (#{{ pr.number }})]({{ pr.html_url }}): @{{ pr.user.login }}
{%- endfor %}
(airflow) 04/27: Fix using extras when `--use-airflow-version` is used in Breeze (#36280)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 8986f8f3beba11cf568e0f014883b997e4042f7b
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Mon Dec 18 20:18:30 2023 +0100
Fix using extras when `--use-airflow-version` is used in Breeze (#36280)
When we are installing a released version of Airflow in Breeze, we can
pass additional extras to install (For example, we need to pass celery
extra in order to start airflow with celery executor.
The extras could be specified as:
```
breeze start-airflow --use-airflow-version 2.8.0rc4 \
--executor CeleryExecutor --airflow-extras "celery"
```
However recent refactors caused a problem that the extras added were
specified after version (which is rejected by newer versions of `pip`).
This PR fixes it and also moves the place where CeleryExecutor use
triggers adding celery extra when`--use-airflow-version` is used.
The warning about this is better visible when moving to Shell Params.
(cherry picked from commit 329780649543ab7b9d593a2e2428073fbd4cf274)
---
dev/breeze/src/airflow_breeze/params/shell_params.py | 7 +++++++
.../src/airflow_breeze/utils/docker_command_utils.py | 14 --------------
scripts/in_container/install_airflow_and_providers.py | 2 +-
3 files changed, 8 insertions(+), 15 deletions(-)
diff --git a/dev/breeze/src/airflow_breeze/params/shell_params.py b/dev/breeze/src/airflow_breeze/params/shell_params.py
index 58c49ecf9b..e90d348046 100644
--- a/dev/breeze/src/airflow_breeze/params/shell_params.py
+++ b/dev/breeze/src/airflow_breeze/params/shell_params.py
@@ -328,6 +328,13 @@ class ShellParams:
if self.executor == "CeleryExecutor":
compose_file_list.append(DOCKER_COMPOSE_DIR / "integration-celery.yml")
+ if self.use_airflow_version:
+ current_extras = self.airflow_extras
+ if "celery" not in current_extras.split(","):
+ get_console().print(
+ "[warning]Adding `celery` extras as it is implicitly needed by celery executor"
+ )
+ self.airflow_extras = ",".join(current_extras.split(",") + ["celery"])
compose_file_list.append(DOCKER_COMPOSE_DIR / "base.yml")
self.add_docker_in_docker(compose_file_list)
diff --git a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
index 2ad25acb7c..bc54b9bf69 100644
--- a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
@@ -751,20 +751,6 @@ def enter_shell(shell_params: ShellParams, output: Output | None = None) -> RunC
f"Changing the executor to {SEQUENTIAL_EXECUTOR}.\n"
)
shell_params.executor = SEQUENTIAL_EXECUTOR
-
- if shell_params.executor == "CeleryExecutor" and shell_params.use_airflow_version:
- if shell_params.airflow_extras and "celery" not in shell_params.airflow_extras.split():
- get_console().print(
- f"\n[warning]CeleryExecutor requires airflow_extras: celery. "
- f"Adding celery to extras: '{shell_params.airflow_extras}'.\n"
- )
- shell_params.airflow_extras += ",celery"
- elif not shell_params.airflow_extras:
- get_console().print(
- "\n[warning]CeleryExecutor requires airflow_extras: celery. "
- "Setting airflow extras to 'celery'.\n"
- )
- shell_params.airflow_extras = "celery"
if shell_params.restart:
bring_compose_project_down(preserve_volumes=False, shell_params=shell_params)
if shell_params.include_mypy_volume:
diff --git a/scripts/in_container/install_airflow_and_providers.py b/scripts/in_container/install_airflow_and_providers.py
index 9eadad9789..58f2d86af3 100755
--- a/scripts/in_container/install_airflow_and_providers.py
+++ b/scripts/in_container/install_airflow_and_providers.py
@@ -253,7 +253,7 @@ def find_installation_spec(
)
else:
console.print(f"\nInstalling airflow via apache-airflow=={use_airflow_version}")
- airflow_package_spec = f"apache-airflow=={use_airflow_version}{airflow_extras}"
+ airflow_package_spec = f"apache-airflow{airflow_extras}=={use_airflow_version}"
airflow_constraints_location = get_airflow_constraints_location(
airflow_skip_constraints=airflow_skip_constraints,
airflow_constraints_mode=airflow_constraints_mode,
(airflow) 03/27: Remove additional generation of dependencies when building CI images (#36283)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit b3031114b8d0d3aff361475acbcd2d987b11298d
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Mon Dec 18 19:36:04 2023 +0100
Remove additional generation of dependencies when building CI images (#36283)
When generated dependencies are not properly updated, we had a special
step where the dependencies were generated "just in case" before CI
image was built, because otherwise building the CI image could have
failed with strange "failed because of conflicting dependencies"
without a clue what was the root cause.
However, the pre-commit did not return error exit code - because for the
pre-commit, it is enough that a file is modified during pre-commit to
fail the pre-commit in general.
That had a nasty side effect because the built CI image actually already
contained properly generated dependencies (by this step), and it did not
properly detected cases where the ones in the repository were added
manually and not generated with pre-commit.
This PR fixes it - instead of generating and building such image in
CI it will now fail the CI image building step but with clear
instructions what to do.
The CI job step uses now regular breeze command rather than running
the script manually but also the script returns error code in case
the generated dependencies have been updated.
(cherry picked from commit 33a2fbef9ff656c3522ea8dea5fff2e2c2645abf)
---
.github/actions/build-ci-images/action.yml | 4 +---
generated/provider_dependencies.json | 2 +-
scripts/ci/pre_commit/pre_commit_update_providers_dependencies.py | 8 +++++---
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/.github/actions/build-ci-images/action.yml b/.github/actions/build-ci-images/action.yml
index c437835a4d..820c858366 100644
--- a/.github/actions/build-ci-images/action.yml
+++ b/.github/actions/build-ci-images/action.yml
@@ -23,9 +23,7 @@ runs:
steps:
- name: "Install Breeze"
uses: ./.github/actions/breeze
- - name: "Regenerate dependencies"
- # This is done in case some someone updated provider dependencies and did not generate
- # dependencies - in which case build image might fail because of lack of new dependencies
+ - name: "Check if dependencies are properly regenerated"
shell: bash
run: |
pip install rich>=12.4.4 pyyaml
diff --git a/generated/provider_dependencies.json b/generated/provider_dependencies.json
index 8d2f31048b..ae52c8231b 100644
--- a/generated/provider_dependencies.json
+++ b/generated/provider_dependencies.json
@@ -407,7 +407,7 @@
"asgiref>=3.5.2",
"gcloud-aio-auth>=4.0.0,<5.0.0",
"gcloud-aio-bigquery>=6.1.2",
- "gcloud-aio-storage",
+ "gcloud-aio-storage>=9.0.0",
"gcsfs>=2023.10.0",
"google-ads>=22.1.0",
"google-api-core>=2.11.0",
diff --git a/scripts/ci/pre_commit/pre_commit_update_providers_dependencies.py b/scripts/ci/pre_commit/pre_commit_update_providers_dependencies.py
index ada9f884be..a3056df3a1 100755
--- a/scripts/ci/pre_commit/pre_commit_update_providers_dependencies.py
+++ b/scripts/ci/pre_commit/pre_commit_update_providers_dependencies.py
@@ -213,11 +213,12 @@ if __name__ == "__main__":
DEPENDENCIES_JSON_FILE_PATH.write_text(json.dumps(unique_sorted_dependencies, indent=2) + "\n")
if os.environ.get("CI"):
console.print()
- console.print(f"[info]Written {DEPENDENCIES_JSON_FILE_PATH}")
+ console.print(f"[info]There is a need to regenerate {DEPENDENCIES_JSON_FILE_PATH}")
console.print(
- f"[yellow]You will need to run breeze locally and commit "
- f"{DEPENDENCIES_JSON_FILE_PATH.relative_to(AIRFLOW_SOURCES_ROOT)}!\n"
+ f"[red]You need to run the following command locally and commit generated "
+ f"{DEPENDENCIES_JSON_FILE_PATH.relative_to(AIRFLOW_SOURCES_ROOT)} file:\n"
)
+ console.print("breeze static-checks --type update-providers-dependencies --all-files")
console.print()
else:
console.print()
@@ -227,6 +228,7 @@ if __name__ == "__main__":
)
console.print(f"[info]Written {DEPENDENCIES_JSON_FILE_PATH}")
console.print()
+ sys.exit(1)
else:
console.print(
"[green]No need to regenerate dependencies!\n[/]"
(airflow) 25/27: Check executable permission for entrypoints at breeze start (#36482)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit dd6572fb0350d0f8f5473a2d30163a550b7dff6a
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Fri Dec 29 12:47:48 2023 +0100
Check executable permission for entrypoints at breeze start (#36482)
* Check executable permission for entrypoints at breeze start
Sometimes our contributors check out Airflow repository on filesystems
that are not POSIX compliant and do not have support for executable bits
(for example when you check-out the repository in Windows and attempt to
map it to a Linux VM). Breeze and building CI images will not
work in this case, but the error that you see might be misleading.
This PR performs additional environment check and informs you that
you should not do it, if executable bits are missing from entrypoints.
* Update dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
Co-authored-by: Jens Scheffler <95...@users.noreply.github.com>
---------
Co-authored-by: Jens Scheffler <95...@users.noreply.github.com>
(cherry picked from commit 5551e14f6c0d8706bf8beaaab6a8fa5c80719a89)
---
.../airflow_breeze/utils/docker_command_utils.py | 21 +++++++++++++++++++++
dev/breeze/src/airflow_breeze/utils/path_utils.py | 1 +
2 files changed, 22 insertions(+)
diff --git a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
index bc54b9bf69..5c8e98056d 100644
--- a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
@@ -30,6 +30,7 @@ from airflow_breeze.utils.cache import read_from_cache_file
from airflow_breeze.utils.host_info_utils import get_host_group_id, get_host_os, get_host_user_id
from airflow_breeze.utils.path_utils import (
AIRFLOW_SOURCES_ROOT,
+ SCRIPTS_DOCKER_DIR,
cleanup_python_generated_files,
create_mypy_volume_if_needed,
)
@@ -481,10 +482,30 @@ def prepare_broker_url(params, env_variables):
env_variables["AIRFLOW__CELERY__BROKER_URL"] = url_map[params.celery_broker]
+def check_executable_entrypoint_permissions(quiet: bool = False):
+ """
+ Checks if the user has executable permissions on the entrypoints in checked-out airflow repository..
+ """
+ for entrypoint in SCRIPTS_DOCKER_DIR.glob("entrypoint*.sh"):
+ if get_verbose() and not quiet:
+ get_console().print(f"[info]Checking executable permissions on {entrypoint.as_posix()}[/]")
+ if not os.access(entrypoint.as_posix(), os.X_OK):
+ get_console().print(
+ f"[error]You do not have executable permissions on {entrypoint}[/]\n"
+ f"You likely checked out airflow repo on a filesystem that does not support executable "
+ f"permissions (for example on a Windows filesystem that is mapped to Linux VM). Airflow "
+ f"repository should only be checked out on a filesystem that is POSIX compliant."
+ )
+ sys.exit(1)
+ if not quiet:
+ get_console().print("[success]Executable permissions on entrypoints are OK[/]")
+
+
def perform_environment_checks(quiet: bool = False):
check_docker_is_running()
check_docker_version(quiet)
check_docker_compose_version(quiet)
+ check_executable_entrypoint_permissions(quiet)
def get_docker_syntax_version() -> str:
diff --git a/dev/breeze/src/airflow_breeze/utils/path_utils.py b/dev/breeze/src/airflow_breeze/utils/path_utils.py
index 6e701e0c24..21644a1dd9 100644
--- a/dev/breeze/src/airflow_breeze/utils/path_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/path_utils.py
@@ -291,6 +291,7 @@ DIST_DIR = AIRFLOW_SOURCES_ROOT / "dist"
GENERATED_PROVIDER_PACKAGES_DIR = DIST_DIR / "provider_packages"
DOCS_DIR = AIRFLOW_SOURCES_ROOT / "docs"
SCRIPTS_CI_DIR = AIRFLOW_SOURCES_ROOT / "scripts" / "ci"
+SCRIPTS_DOCKER_DIR = AIRFLOW_SOURCES_ROOT / "scripts" / "docker"
SCRIPTS_CI_DOCKER_COMPOSE_DIR = SCRIPTS_CI_DIR / "docker-compose"
SCRIPTS_CI_DOCKER_COMPOSE_LOCAL_YAML_FILE = SCRIPTS_CI_DOCKER_COMPOSE_DIR / "local.yml"
GENERATED_DOCKER_COMPOSE_ENV_FILE = SCRIPTS_CI_DOCKER_COMPOSE_DIR / "_generated_docker_compose.env"
(airflow) 23/27: Add utkarsharma2 to committers list (#36474)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 21a411d58ffb08638817acf958c3119198860c0f
Author: Hussein Awala <hu...@awala.fr>
AuthorDate: Thu Dec 28 15:43:45 2023 +0100
Add utkarsharma2 to committers list (#36474)
(cherry picked from commit e3fb20d358646d276d4e275fa67d34b4fc13b73a)
---
dev/breeze/src/airflow_breeze/global_constants.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/dev/breeze/src/airflow_breeze/global_constants.py b/dev/breeze/src/airflow_breeze/global_constants.py
index 7a35f6238f..ffb8d4645e 100644
--- a/dev/breeze/src/airflow_breeze/global_constants.py
+++ b/dev/breeze/src/airflow_breeze/global_constants.py
@@ -338,6 +338,7 @@ COMMITTERS = [
"sekikn",
"turbaszek",
"uranusjr",
+ "utkarsharma2",
"vikramkoka",
"vincbeck",
"xinbinhuang",
(airflow) 22/27: Fix preparing rc candidates for providers (#36465)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit e3316c36b4159d5bc6ae73e4b77ba62045064184
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Thu Dec 28 10:53:57 2023 +0100
Fix preparing rc candidates for providers (#36465)
The last auto-upgrade RC implementd in #36441 had a bug - it was bumping
rc even for providers that have been already released. This change fixes
it - it skips packages that already have "final" tag present in the
repo. It also explicitely calls "Apply template update" as optional
step - only needed in case we modify templates and want to update
automatically generated documentation with it.
(cherry picked from commit a3e5a971edf9e4e86c86d595daa04dccd277aabe)
---
dev/README_RELEASE_PROVIDER_PACKAGES.md | 7 ++++---
.../src/airflow_breeze/prepare_providers/provider_packages.py | 4 ++++
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/dev/README_RELEASE_PROVIDER_PACKAGES.md b/dev/README_RELEASE_PROVIDER_PACKAGES.md
index 00a10352a2..cbf645d649 100644
--- a/dev/README_RELEASE_PROVIDER_PACKAGES.md
+++ b/dev/README_RELEASE_PROVIDER_PACKAGES.md
@@ -29,7 +29,7 @@
- [Prepare Regular Provider packages (RC)](#prepare-regular-provider-packages-rc)
- [Increasing version number](#increasing-version-number)
- [Generate release notes](#generate-release-notes)
- - [Apply template updates](#apply-template-updates)
+ - [(Optional) Apply template updates](#optional-apply-template-updates)
- [Open PR with suggested version releases](#open-pr-with-suggested-version-releases)
- [Build provider packages for SVN apache upload](#build-provider-packages-for-svn-apache-upload)
- [Build and sign the source and convenience packages](#build-and-sign-the-source-and-convenience-packages)
@@ -261,9 +261,10 @@ breeze release-management prepare-provider-documentation --include-removed-provi
--base-branch provider-cncf-kubernetes/v4-4 cncf.kubernetes
```
-## Apply template updates
+## (Optional) Apply template updates
-(This step can also be executed independently when needed)
+This step should only be executed if we want to change template files for the providers - i.e. change
+security information, commit/index/README content that is automatically generated.
Regenerate the documentation templates by running the command with
`--reapply-templates` flag to the command above. This refreshes the content of:
diff --git a/dev/breeze/src/airflow_breeze/prepare_providers/provider_packages.py b/dev/breeze/src/airflow_breeze/prepare_providers/provider_packages.py
index e8d99e6ed6..a158334f7d 100644
--- a/dev/breeze/src/airflow_breeze/prepare_providers/provider_packages.py
+++ b/dev/breeze/src/airflow_breeze/prepare_providers/provider_packages.py
@@ -172,6 +172,10 @@ def should_skip_the_package(provider_id: str, version_suffix: str) -> tuple[bool
return False, version_suffix
# version_suffix starts with "rc"
current_version = int(version_suffix[2:])
+ release_tag = get_latest_provider_tag(provider_id, "")
+ if tag_exists_for_provider(provider_id, release_tag):
+ get_console().print(f"[warning]The tag {release_tag} exists. Provider is released. Skipping it.[/]")
+ return True, ""
while True:
current_tag = get_latest_provider_tag(provider_id, f"rc{current_version}")
if tag_exists_for_provider(provider_id, current_tag):
(airflow) 27/27: Bump stalebot to version 9 (#36494)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 94186a04f193ad9fe6a142c9335d73551eafadcc
Author: Elad Kalif <45...@users.noreply.github.com>
AuthorDate: Sat Dec 30 12:08:08 2023 +0200
Bump stalebot to version 9 (#36494)
(cherry picked from commit 13e4905a60011e162f34e86a77acfcb4af874685)
---
.github/workflows/recheck-old-bug-report.yml | 8 +++++---
.github/workflows/stale.yml | 2 +-
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/.github/workflows/recheck-old-bug-report.yml b/.github/workflows/recheck-old-bug-report.yml
index 7c3adcd0a6..462c51362b 100644
--- a/.github/workflows/recheck-old-bug-report.yml
+++ b/.github/workflows/recheck-old-bug-report.yml
@@ -28,7 +28,7 @@ jobs:
recheck-old-bug-report:
runs-on: "ubuntu-22.04"
steps:
- - uses: actions/stale@v8
+ - uses: actions/stale@v9
with:
only-issue-labels: 'kind:bug'
stale-issue-label: 'Stale Bug Report'
@@ -38,8 +38,10 @@ jobs:
# scan only issues: https://github.com/actions/stale/issues/837
# To avoid this job scanning also PRs and setting the defaults of the bot to them,
# we set high number of days thus effectively this job will not do any changes on PRs
- days-before-pr-stale: 7000
- days-before-pr-close: 7000
+ # Possible workaround with -1 as mentioned in
+ # https://github.com/actions/stale/issues/1112#issuecomment-1871654196
+ days-before-pr-stale: -1
+ days-before-pr-close: -1
remove-stale-when-updated: false
remove-issue-stale-when-updated: true
labels-to-add-when-unstale: 'needs-triage'
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
index fb680826aa..953369a0ae 100644
--- a/.github/workflows/stale.yml
+++ b/.github/workflows/stale.yml
@@ -29,7 +29,7 @@ jobs:
stale:
runs-on: "ubuntu-22.04"
steps:
- - uses: actions/stale@v8
+ - uses: actions/stale@v9
with:
stale-pr-message: >
This pull request has been automatically marked as stale because it has not had
(airflow) 01/27: Add code snippet formatting in docstrings via Ruff (#36262)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 00ee94bb64139d66ffde4b0fea71effcd36b120f
Author: Josh Fell <48...@users.noreply.github.com>
AuthorDate: Sun Dec 17 12:36:52 2023 -0500
Add code snippet formatting in docstrings via Ruff (#36262)
This was made available [as part of v0.1.8 of the Ruff Formatter](https://astral.sh/blog/ruff-v0.1.8#formatting-code-snippets-in-docstrings). Adding this config option to the `ruff-format` pre-commit hook.
(cherry picked from commit e9ba37bb58da0e3d6739ec063f7160f50487d3b8)
---
.pre-commit-config.yaml | 4 +-
airflow/io/path.py | 4 +-
airflow/macros/__init__.py | 8 +-
airflow/models/baseoperator.py | 18 +---
airflow/models/dag.py | 7 +-
airflow/models/taskinstance.py | 4 +
airflow/models/xcom_arg.py | 4 +-
airflow/providers/amazon/aws/operators/s3.py | 20 ++--
.../providers/amazon/aws/operators/sagemaker.py | 13 +--
.../providers/apache/cassandra/hooks/cassandra.py | 6 +-
.../providers/apache/cassandra/sensors/record.py | 10 +-
.../providers/apache/cassandra/sensors/table.py | 6 +-
airflow/providers/apache/hive/hooks/hive.py | 23 +++--
airflow/providers/apache/hive/macros/hive.py | 6 +-
.../providers/databricks/operators/databricks.py | 18 ++--
airflow/providers/ftp/operators/ftp.py | 2 +-
.../providers/google/cloud/operators/bigquery.py | 83 +++++++++--------
airflow/providers/google/cloud/operators/gcs.py | 10 +-
.../google/cloud/operators/kubernetes_engine.py | 5 +-
airflow/providers/google/cloud/operators/pubsub.py | 102 ++++++++++-----------
.../google/cloud/transfers/adls_to_gcs.py | 10 +-
.../providers/google/cloud/transfers/gcs_to_gcs.py | 84 ++++++++---------
.../google/cloud/transfers/mssql_to_gcs.py | 18 ++--
.../providers/microsoft/azure/operators/adls.py | 6 +-
.../azure/operators/container_instances.py | 46 +++++-----
airflow/providers/sftp/operators/sftp.py | 2 +-
airflow/sensors/weekday.py | 17 ++--
airflow/utils/email.py | 2 +-
airflow/utils/helpers.py | 2 +-
airflow/utils/types.py | 1 +
airflow/www/extensions/init_appbuilder.py | 21 ++---
dev/mypy/plugin/outputs.py | 1 +
pyproject.toml | 3 +
tests/conftest.py | 6 +-
tests/test_utils/providers.py | 2 +-
tests/www/views/test_views_tasks.py | 1 +
36 files changed, 272 insertions(+), 303 deletions(-)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index dd6dac7d0e..0b917bd75f 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -174,7 +174,7 @@ repos:
pass_filenames: false
require_serial: true
- repo: https://github.com/astral-sh/ruff-pre-commit
- rev: v0.1.4
+ rev: v0.1.9
hooks:
# Since ruff makes use of multiple cores we _purposefully_ don't run this in docker so it can use the
# host CPU to it's fullest
@@ -250,7 +250,7 @@ repos:
name: Check if there are no deprecate log warn
exclude: ^.*/.*_vendor/
- repo: https://github.com/adrienverge/yamllint
- rev: v1.32.0
+ rev: v1.33.0
hooks:
- id: yamllint
name: Check YAML files with yamllint
diff --git a/airflow/io/path.py b/airflow/io/path.py
index ed5ab664eb..bd7c320653 100644
--- a/airflow/io/path.py
+++ b/airflow/io/path.py
@@ -263,11 +263,11 @@ class ObjectStoragePath(CloudPath):
--------
>>> read_block(0, 13)
b'Alice, 100\\nBo'
- >>> read_block(0, 13, delimiter=b'\\n')
+ >>> read_block(0, 13, delimiter=b"\\n")
b'Alice, 100\\nBob, 200\\n'
Use ``length=None`` to read to the end of the file.
- >>> read_block(0, None, delimiter=b'\\n')
+ >>> read_block(0, None, delimiter=b"\\n")
b'Alice, 100\\nBob, 200\\nCharlie, 300'
See Also
diff --git a/airflow/macros/__init__.py b/airflow/macros/__init__.py
index 95e84d559a..ee22a47dc6 100644
--- a/airflow/macros/__init__.py
+++ b/airflow/macros/__init__.py
@@ -49,9 +49,9 @@ def ds_add(ds: str, days: int) -> str:
:param ds: anchor date in ``YYYY-MM-DD`` format to add to
:param days: number of days to add to the ds, you can use negative values
- >>> ds_add('2015-01-01', 5)
+ >>> ds_add("2015-01-01", 5)
'2015-01-06'
- >>> ds_add('2015-01-06', -5)
+ >>> ds_add("2015-01-06", -5)
'2015-01-01'
"""
if not days:
@@ -68,9 +68,9 @@ def ds_format(ds: str, input_format: str, output_format: str) -> str:
:param input_format: input string format. E.g. %Y-%m-%d
:param output_format: output string format E.g. %Y-%m-%d
- >>> ds_format('2015-01-01', "%Y-%m-%d", "%m-%d-%y")
+ >>> ds_format("2015-01-01", "%Y-%m-%d", "%m-%d-%y")
'01-01-15'
- >>> ds_format('1/5/2015', "%m/%d/%Y", "%Y-%m-%d")
+ >>> ds_format("1/5/2015", "%m/%d/%Y", "%Y-%m-%d")
'2015-01-05'
"""
return datetime.strptime(str(ds), input_format).strftime(output_format)
diff --git a/airflow/models/baseoperator.py b/airflow/models/baseoperator.py
index 2ba7ec8ad1..f7f1d6ccc6 100644
--- a/airflow/models/baseoperator.py
+++ b/airflow/models/baseoperator.py
@@ -628,12 +628,7 @@ class BaseOperator(AbstractOperator, metaclass=BaseOperatorMeta):
**Example**: to run this task in a specific docker container through
the KubernetesExecutor ::
- MyOperator(...,
- executor_config={
- "KubernetesExecutor":
- {"image": "myCustomDockerImage"}
- }
- )
+ MyOperator(..., executor_config={"KubernetesExecutor": {"image": "myCustomDockerImage"}})
:param do_xcom_push: if True, an XCom is pushed containing the Operator's
result
@@ -1152,9 +1147,7 @@ class BaseOperator(AbstractOperator, metaclass=BaseOperatorMeta):
# This is equivalent to
with DAG(...):
generate_content = GenerateContentOperator(task_id="generate_content")
- send_email = EmailOperator(
- ..., html_content="{{ task_instance.xcom_pull('generate_content') }}"
- )
+ send_email = EmailOperator(..., html_content="{{ task_instance.xcom_pull('generate_content') }}")
generate_content >> send_email
"""
@@ -1866,12 +1859,7 @@ def chain_linear(*elements: DependencyMixin | Sequence[DependencyMixin]):
Then you can accomplish like so::
- chain_linear(
- op1,
- [op2, op3],
- [op4, op5, op6],
- op7
- )
+ chain_linear(op1, [op2, op3], [op4, op5, op6], op7)
:param elements: a list of operators / lists of operators
"""
diff --git a/airflow/models/dag.py b/airflow/models/dag.py
index 654bc85cae..9150adaf6f 100644
--- a/airflow/models/dag.py
+++ b/airflow/models/dag.py
@@ -381,11 +381,12 @@ class DAG(LoggingMixin):
**Example**: to avoid Jinja from removing a trailing newline from template strings ::
- DAG(dag_id='my-dag',
+ DAG(
+ dag_id="my-dag",
jinja_environment_kwargs={
- 'keep_trailing_newline': True,
+ "keep_trailing_newline": True,
# some other jinja2 Environment options here
- }
+ },
)
**See**: `Jinja Environment documentation
diff --git a/airflow/models/taskinstance.py b/airflow/models/taskinstance.py
index f041dcf208..ae6b1e35c1 100644
--- a/airflow/models/taskinstance.py
+++ b/airflow/models/taskinstance.py
@@ -3319,19 +3319,23 @@ class TaskInstance(Base, LoggingMixin):
def this_task(v): # This is self.task.
return v * 2
+
@task_group
def tg1(inp):
val = upstream(inp) # This is the upstream task.
this_task(val) # When inp is 1, val here should resolve to 2.
return val
+
# This val is the same object returned by tg1.
val = tg1.expand(inp=[1, 2, 3])
+
@task_group
def tg2(inp):
another_task(inp, val) # val here should resolve to [2, 4, 6].
+
tg2.expand(inp=["a", "b"])
The surrounding mapped task groups of ``upstream`` and ``self.task`` are
diff --git a/airflow/models/xcom_arg.py b/airflow/models/xcom_arg.py
index 7dc5577e60..60315617e4 100644
--- a/airflow/models/xcom_arg.py
+++ b/airflow/models/xcom_arg.py
@@ -59,8 +59,8 @@ class XComArg(ResolveMixin, DependencyMixin):
xcomarg >> op
xcomarg << op
- op >> xcomarg # By BaseOperator code
- op << xcomarg # By BaseOperator code
+ op >> xcomarg # By BaseOperator code
+ op << xcomarg # By BaseOperator code
**Example**: The moment you get a result from any operator (decorated or regular) you can ::
diff --git a/airflow/providers/amazon/aws/operators/s3.py b/airflow/providers/amazon/aws/operators/s3.py
index 37dbc6c528..9ce0373666 100644
--- a/airflow/providers/amazon/aws/operators/s3.py
+++ b/airflow/providers/amazon/aws/operators/s3.py
@@ -762,11 +762,11 @@ class S3ListOperator(BaseOperator):
``customers/2018/04/`` key in the ``data`` bucket. ::
s3_file = S3ListOperator(
- task_id='list_3s_files',
- bucket='data',
- prefix='customers/2018/04/',
- delimiter='/',
- aws_conn_id='aws_customers_conn'
+ task_id="list_3s_files",
+ bucket="data",
+ prefix="customers/2018/04/",
+ delimiter="/",
+ aws_conn_id="aws_customers_conn",
)
"""
@@ -843,11 +843,11 @@ class S3ListPrefixesOperator(BaseOperator):
from the S3 ``customers/2018/04/`` prefix in the ``data`` bucket. ::
s3_file = S3ListPrefixesOperator(
- task_id='list_s3_prefixes',
- bucket='data',
- prefix='customers/2018/04/',
- delimiter='/',
- aws_conn_id='aws_customers_conn'
+ task_id="list_s3_prefixes",
+ bucket="data",
+ prefix="customers/2018/04/",
+ delimiter="/",
+ aws_conn_id="aws_customers_conn",
)
"""
diff --git a/airflow/providers/amazon/aws/operators/sagemaker.py b/airflow/providers/amazon/aws/operators/sagemaker.py
index 66cc7103b7..2eba21e734 100644
--- a/airflow/providers/amazon/aws/operators/sagemaker.py
+++ b/airflow/providers/amazon/aws/operators/sagemaker.py
@@ -404,14 +404,14 @@ class SageMakerEndpointOperator(SageMakerBaseOperator):
If you need to create a SageMaker endpoint based on an existed
SageMaker model and an existed SageMaker endpoint config::
- config = endpoint_configuration;
+ config = endpoint_configuration
If you need to create all of SageMaker model, SageMaker endpoint-config and SageMaker endpoint::
config = {
- 'Model': model_configuration,
- 'EndpointConfig': endpoint_config_configuration,
- 'Endpoint': endpoint_configuration
+ "Model": model_configuration,
+ "EndpointConfig": endpoint_config_configuration,
+ "Endpoint": endpoint_configuration,
}
For details of the configuration parameter of model_configuration see
@@ -579,10 +579,7 @@ class SageMakerTransformOperator(SageMakerBaseOperator):
If you need to create both SageMaker model and SageMaker Transform job::
- config = {
- 'Model': model_config,
- 'Transform': transform_config
- }
+ config = {"Model": model_config, "Transform": transform_config}
For details of the configuration parameter of transform_config see
:py:meth:`SageMaker.Client.create_transform_job`
diff --git a/airflow/providers/apache/cassandra/hooks/cassandra.py b/airflow/providers/apache/cassandra/hooks/cassandra.py
index 999782e0da..6ce5c1b89d 100644
--- a/airflow/providers/apache/cassandra/hooks/cassandra.py
+++ b/airflow/providers/apache/cassandra/hooks/cassandra.py
@@ -47,11 +47,7 @@ class CassandraHook(BaseHook, LoggingMixin):
If SSL is enabled in Cassandra, pass in a dict in the extra field as kwargs for
``ssl.wrap_socket()``. For example::
- {
- 'ssl_options' : {
- 'ca_certs' : PATH_TO_CA_CERTS
- }
- }
+ {"ssl_options": {"ca_certs": PATH_TO_CA_CERTS}}
Default load balancing policy is RoundRobinPolicy. To specify a different
LB policy::
diff --git a/airflow/providers/apache/cassandra/sensors/record.py b/airflow/providers/apache/cassandra/sensors/record.py
index 9f0a766456..bcd417d49c 100644
--- a/airflow/providers/apache/cassandra/sensors/record.py
+++ b/airflow/providers/apache/cassandra/sensors/record.py
@@ -38,10 +38,12 @@ class CassandraRecordSensor(BaseSensorOperator):
primary keys 'p1' and 'p2' to be populated in keyspace 'k' and table 't',
instantiate it as follows:
- >>> cassandra_sensor = CassandraRecordSensor(table="k.t",
- ... keys={"p1": "v1", "p2": "v2"},
- ... cassandra_conn_id="cassandra_default",
- ... task_id="cassandra_sensor")
+ >>> cassandra_sensor = CassandraRecordSensor(
+ ... table="k.t",
+ ... keys={"p1": "v1", "p2": "v2"},
+ ... cassandra_conn_id="cassandra_default",
+ ... task_id="cassandra_sensor",
+ ... )
:param table: Target Cassandra table.
Use dot notation to target a specific keyspace.
diff --git a/airflow/providers/apache/cassandra/sensors/table.py b/airflow/providers/apache/cassandra/sensors/table.py
index 62bfdaf72c..1ee99f6876 100644
--- a/airflow/providers/apache/cassandra/sensors/table.py
+++ b/airflow/providers/apache/cassandra/sensors/table.py
@@ -38,9 +38,9 @@ class CassandraTableSensor(BaseSensorOperator):
For example, if you want to wait for a table called 't' to be created
in a keyspace 'k', instantiate it as follows:
- >>> cassandra_sensor = CassandraTableSensor(table="k.t",
- ... cassandra_conn_id="cassandra_default",
- ... task_id="cassandra_sensor")
+ >>> cassandra_sensor = CassandraTableSensor(
+ ... table="k.t", cassandra_conn_id="cassandra_default", task_id="cassandra_sensor"
+ ... )
:param table: Target Cassandra table.
Use dot notation to target a specific keyspace.
diff --git a/airflow/providers/apache/hive/hooks/hive.py b/airflow/providers/apache/hive/hooks/hive.py
index cf5ed97291..00a3a7f148 100644
--- a/airflow/providers/apache/hive/hooks/hive.py
+++ b/airflow/providers/apache/hive/hooks/hive.py
@@ -582,12 +582,11 @@ class HiveMetastoreHook(BaseHook):
:param schema: Name of hive schema (database) @table belongs to
:param table: Name of hive table @partition belongs to
- :param partition: Expression that matches the partitions to check for
- (eg `a = 'b' AND c = 'd'`)
+ :param partition: Expression that matches the partitions to check for (e.g. `a = 'b' AND c = 'd'`)
>>> hh = HiveMetastoreHook()
- >>> t = 'static_babynames_partitioned'
- >>> hh.check_for_partition('airflow', t, "ds='2015-01-01'")
+ >>> t = "static_babynames_partitioned"
+ >>> hh.check_for_partition("airflow", t, "ds='2015-01-01'")
True
"""
with self.metastore as client:
@@ -606,10 +605,10 @@ class HiveMetastoreHook(BaseHook):
:param partition_name: Name of the partitions to check for (eg `a=b/c=d`)
>>> hh = HiveMetastoreHook()
- >>> t = 'static_babynames_partitioned'
- >>> hh.check_for_named_partition('airflow', t, "ds=2015-01-01")
+ >>> t = "static_babynames_partitioned"
+ >>> hh.check_for_named_partition("airflow", t, "ds=2015-01-01")
True
- >>> hh.check_for_named_partition('airflow', t, "ds=xxx")
+ >>> hh.check_for_named_partition("airflow", t, "ds=xxx")
False
"""
with self.metastore as client:
@@ -619,7 +618,7 @@ class HiveMetastoreHook(BaseHook):
"""Get a metastore table object.
>>> hh = HiveMetastoreHook()
- >>> t = hh.get_table(db='airflow', table_name='static_babynames')
+ >>> t = hh.get_table(db="airflow", table_name="static_babynames")
>>> t.tableName
'static_babynames'
>>> [col.name for col in t.sd.cols]
@@ -649,8 +648,8 @@ class HiveMetastoreHook(BaseHook):
For subpartitioned table, the number might easily exceed this.
>>> hh = HiveMetastoreHook()
- >>> t = 'static_babynames_partitioned'
- >>> parts = hh.get_partitions(schema='airflow', table_name=t)
+ >>> t = "static_babynames_partitioned"
+ >>> parts = hh.get_partitions(schema="airflow", table_name=t)
>>> len(parts)
1
>>> parts
@@ -765,9 +764,9 @@ class HiveMetastoreHook(BaseHook):
Check if table exists.
>>> hh = HiveMetastoreHook()
- >>> hh.table_exists(db='airflow', table_name='static_babynames')
+ >>> hh.table_exists(db="airflow", table_name="static_babynames")
True
- >>> hh.table_exists(db='airflow', table_name='does_not_exist')
+ >>> hh.table_exists(db="airflow", table_name="does_not_exist")
False
"""
try:
diff --git a/airflow/providers/apache/hive/macros/hive.py b/airflow/providers/apache/hive/macros/hive.py
index 24868f28ad..1d5f6f6a5c 100644
--- a/airflow/providers/apache/hive/macros/hive.py
+++ b/airflow/providers/apache/hive/macros/hive.py
@@ -39,7 +39,7 @@ def max_partition(
:param field: the field to get the max value from. If there's only
one partition field, this will be inferred
- >>> max_partition('airflow.static_babynames_partitioned')
+ >>> max_partition("airflow.static_babynames_partitioned")
'2015-01-01'
"""
from airflow.providers.apache.hive.hooks.hive import HiveMetastoreHook
@@ -94,8 +94,8 @@ def closest_ds_partition(
:param metastore_conn_id: which metastore connection to use
:returns: The closest date
- >>> tbl = 'airflow.static_babynames_partitioned'
- >>> closest_ds_partition(tbl, '2015-01-02')
+ >>> tbl = "airflow.static_babynames_partitioned"
+ >>> closest_ds_partition(tbl, "2015-01-02")
'2015-01-01'
"""
from airflow.providers.apache.hive.hooks.hive import HiveMetastoreHook
diff --git a/airflow/providers/databricks/operators/databricks.py b/airflow/providers/databricks/operators/databricks.py
index 5a54b7e9ee..c8e5180f9b 100644
--- a/airflow/providers/databricks/operators/databricks.py
+++ b/airflow/providers/databricks/operators/databricks.py
@@ -580,26 +580,20 @@ class DatabricksRunNowOperator(BaseOperator):
For example ::
json = {
- "job_id": 42,
- "notebook_params": {
- "dry-run": "true",
- "oldest-time-to-consider": "1457570074236"
- }
+ "job_id": 42,
+ "notebook_params": {"dry-run": "true", "oldest-time-to-consider": "1457570074236"},
}
- notebook_run = DatabricksRunNowOperator(task_id='notebook_run', json=json)
+ notebook_run = DatabricksRunNowOperator(task_id="notebook_run", json=json)
Another way to accomplish the same thing is to use the named parameters
of the ``DatabricksRunNowOperator`` directly. Note that there is exactly
one named parameter for each top level parameter in the ``run-now``
endpoint. In this method, your code would look like this: ::
- job_id=42
+ job_id = 42
- notebook_params = {
- "dry-run": "true",
- "oldest-time-to-consider": "1457570074236"
- }
+ notebook_params = {"dry-run": "true", "oldest-time-to-consider": "1457570074236"}
python_params = ["douglas adams", "42"]
@@ -612,7 +606,7 @@ class DatabricksRunNowOperator(BaseOperator):
notebook_params=notebook_params,
python_params=python_params,
jar_params=jar_params,
- spark_submit_params=spark_submit_params
+ spark_submit_params=spark_submit_params,
)
In the case where both the json parameter **AND** the named parameters
diff --git a/airflow/providers/ftp/operators/ftp.py b/airflow/providers/ftp/operators/ftp.py
index 98ff11bc21..654c60bf7e 100644
--- a/airflow/providers/ftp/operators/ftp.py
+++ b/airflow/providers/ftp/operators/ftp.py
@@ -66,7 +66,7 @@ class FTPFileTransmitOperator(BaseOperator):
remote_filepath="/tmp/tmp1/tmp2/file.txt",
operation="put",
create_intermediate_dirs=True,
- dag=dag
+ dag=dag,
)
"""
diff --git a/airflow/providers/google/cloud/operators/bigquery.py b/airflow/providers/google/cloud/operators/bigquery.py
index 91ff370366..27a115a4f9 100644
--- a/airflow/providers/google/cloud/operators/bigquery.py
+++ b/airflow/providers/google/cloud/operators/bigquery.py
@@ -449,7 +449,7 @@ class BigQueryValueCheckOperator(_BigQueryDbHookMixin, SQLValueCheckOperator):
# job.result() returns a RowIterator. Mypy expects an instance of SupportsNext[Any] for
# the next() call which the RowIterator does not resemble to. Hence, ignore the arg-type error.
records = next(job.result()) # type: ignore[arg-type]
- self.check_value(records)
+ self.check_value(records) # type: ignore[attr-defined]
self.log.info("Current state of job %s is %s", job.job_id, job.state)
@staticmethod
@@ -884,13 +884,13 @@ class BigQueryGetDataOperator(GoogleCloudBaseOperator):
**Example**::
get_data = BigQueryGetDataOperator(
- task_id='get_data_from_bq',
- dataset_id='test_dataset',
- table_id='Transaction_partitions',
- project_id='internal-gcp-project',
+ task_id="get_data_from_bq",
+ dataset_id="test_dataset",
+ table_id="Transaction_partitions",
+ project_id="internal-gcp-project",
max_results=100,
- selected_fields='DATE',
- gcp_conn_id='airflow-conn-id'
+ selected_fields="DATE",
+ gcp_conn_id="airflow-conn-id",
)
:param dataset_id: The dataset ID of the requested table. (templated)
@@ -1331,8 +1331,10 @@ class BigQueryCreateEmptyTableOperator(GoogleCloudBaseOperator):
**Example**::
- schema_fields=[{"name": "emp_name", "type": "STRING", "mode": "REQUIRED"},
- {"name": "salary", "type": "INTEGER", "mode": "NULLABLE"}]
+ schema_fields = [
+ {"name": "emp_name", "type": "STRING", "mode": "REQUIRED"},
+ {"name": "salary", "type": "INTEGER", "mode": "NULLABLE"},
+ ]
:param gcs_schema_object: Full path to the JSON file containing
schema (templated). For
@@ -1351,41 +1353,35 @@ class BigQueryCreateEmptyTableOperator(GoogleCloudBaseOperator):
**Example (with schema JSON in GCS)**::
CreateTable = BigQueryCreateEmptyTableOperator(
- task_id='BigQueryCreateEmptyTableOperator_task',
- dataset_id='ODS',
- table_id='Employees',
- project_id='internal-gcp-project',
- gcs_schema_object='gs://schema-bucket/employee_schema.json',
- gcp_conn_id='airflow-conn-id',
- google_cloud_storage_conn_id='airflow-conn-id'
+ task_id="BigQueryCreateEmptyTableOperator_task",
+ dataset_id="ODS",
+ table_id="Employees",
+ project_id="internal-gcp-project",
+ gcs_schema_object="gs://schema-bucket/employee_schema.json",
+ gcp_conn_id="airflow-conn-id",
+ google_cloud_storage_conn_id="airflow-conn-id",
)
**Corresponding Schema file** (``employee_schema.json``)::
[
- {
- "mode": "NULLABLE",
- "name": "emp_name",
- "type": "STRING"
- },
- {
- "mode": "REQUIRED",
- "name": "salary",
- "type": "INTEGER"
- }
+ {"mode": "NULLABLE", "name": "emp_name", "type": "STRING"},
+ {"mode": "REQUIRED", "name": "salary", "type": "INTEGER"},
]
**Example (with schema in the DAG)**::
CreateTable = BigQueryCreateEmptyTableOperator(
- task_id='BigQueryCreateEmptyTableOperator_task',
- dataset_id='ODS',
- table_id='Employees',
- project_id='internal-gcp-project',
- schema_fields=[{"name": "emp_name", "type": "STRING", "mode": "REQUIRED"},
- {"name": "salary", "type": "INTEGER", "mode": "NULLABLE"}],
- gcp_conn_id='airflow-conn-id-account',
- google_cloud_storage_conn_id='airflow-conn-id'
+ task_id="BigQueryCreateEmptyTableOperator_task",
+ dataset_id="ODS",
+ table_id="Employees",
+ project_id="internal-gcp-project",
+ schema_fields=[
+ {"name": "emp_name", "type": "STRING", "mode": "REQUIRED"},
+ {"name": "salary", "type": "INTEGER", "mode": "NULLABLE"},
+ ],
+ gcp_conn_id="airflow-conn-id-account",
+ google_cloud_storage_conn_id="airflow-conn-id",
)
:param view: [Optional] A dictionary containing definition for the view.
@@ -1582,8 +1578,10 @@ class BigQueryCreateExternalTableOperator(GoogleCloudBaseOperator):
**Example**::
- schema_fields=[{"name": "emp_name", "type": "STRING", "mode": "REQUIRED"},
- {"name": "salary", "type": "INTEGER", "mode": "NULLABLE"}]
+ schema_fields = [
+ {"name": "emp_name", "type": "STRING", "mode": "REQUIRED"},
+ {"name": "salary", "type": "INTEGER", "mode": "NULLABLE"},
+ ]
Should not be set when source_format is 'DATASTORE_BACKUP'.
:param table_resource: Table resource as described in documentation:
@@ -1878,12 +1876,13 @@ class BigQueryDeleteDatasetOperator(GoogleCloudBaseOperator):
**Example**::
delete_temp_data = BigQueryDeleteDatasetOperator(
- dataset_id='temp-dataset',
- project_id='temp-project',
- delete_contents=True, # Force the deletion of the dataset as well as its tables (if any).
- gcp_conn_id='_my_gcp_conn_',
- task_id='Deletetemp',
- dag=dag)
+ dataset_id="temp-dataset",
+ project_id="temp-project",
+ delete_contents=True, # Force the deletion of the dataset as well as its tables (if any).
+ gcp_conn_id="_my_gcp_conn_",
+ task_id="Deletetemp",
+ dag=dag,
+ )
"""
template_fields: Sequence[str] = (
diff --git a/airflow/providers/google/cloud/operators/gcs.py b/airflow/providers/google/cloud/operators/gcs.py
index 61bcd013c2..dfaeb48522 100644
--- a/airflow/providers/google/cloud/operators/gcs.py
+++ b/airflow/providers/google/cloud/operators/gcs.py
@@ -188,11 +188,11 @@ class GCSListObjectsOperator(GoogleCloudBaseOperator):
folder in ``data`` bucket. ::
GCS_Files = GCSListOperator(
- task_id='GCS_Files',
- bucket='data',
- prefix='sales/sales-2017/',
- match_glob='**/*/.avro',
- gcp_conn_id=google_cloud_conn_id
+ task_id="GCS_Files",
+ bucket="data",
+ prefix="sales/sales-2017/",
+ match_glob="**/*/.avro",
+ gcp_conn_id=google_cloud_conn_id,
)
"""
diff --git a/airflow/providers/google/cloud/operators/kubernetes_engine.py b/airflow/providers/google/cloud/operators/kubernetes_engine.py
index c4eeadd07b..233a9d62a0 100644
--- a/airflow/providers/google/cloud/operators/kubernetes_engine.py
+++ b/airflow/providers/google/cloud/operators/kubernetes_engine.py
@@ -192,15 +192,14 @@ class GKECreateClusterOperator(GoogleCloudBaseOperator):
The **minimum** required to define a cluster to create is:
``dict()`` ::
- cluster_def = {'name': 'my-cluster-name',
- 'initial_node_count': 1}
+ cluster_def = {"name": "my-cluster-name", "initial_node_count": 1}
or
``Cluster`` proto ::
from google.cloud.container_v1.types import Cluster
- cluster_def = Cluster(name='my-cluster-name', initial_node_count=1)
+ cluster_def = Cluster(name="my-cluster-name", initial_node_count=1)
**Operator Creation**: ::
diff --git a/airflow/providers/google/cloud/operators/pubsub.py b/airflow/providers/google/cloud/operators/pubsub.py
index 3751e9a371..0858c427b6 100644
--- a/airflow/providers/google/cloud/operators/pubsub.py
+++ b/airflow/providers/google/cloud/operators/pubsub.py
@@ -58,24 +58,22 @@ class PubSubCreateTopicOperator(GoogleCloudBaseOperator):
By default, if the topic already exists, this operator will
not cause the DAG to fail. ::
- with DAG('successful DAG') as dag:
- (
- PubSubCreateTopicOperator(project_id='my-project', topic='my_new_topic')
- >> PubSubCreateTopicOperator(project_id='my-project', topic='my_new_topic')
- )
+ with DAG("successful DAG") as dag:
+ create_topic = PubSubCreateTopicOperator(project_id="my-project", topic="my_new_topic")
+ create_topic_again = PubSubCreateTopicOperator(project_id="my-project", topic="my_new_topic")
+
+ create_topic >> create_topic_again
The operator can be configured to fail if the topic already exists. ::
- with DAG('failing DAG') as dag:
- (
- PubSubCreateTopicOperator(project_id='my-project', topic='my_new_topic')
- >> PubSubCreateTopicOperator(
- project_id='my-project',
- topic='my_new_topic',
- fail_if_exists=True,
- )
+ with DAG("failing DAG") as dag:
+ create_topic = PubSubCreateTopicOperator(project_id="my-project", topic="my_new_topic")
+ create_topic_again = PubSubCreateTopicOperator(
+ project_id="my-project", topic="my_new_topic", fail_if_exists=True
)
+ create_topic >> create_topic_again
+
Both ``project_id`` and ``topic`` are templated so you can use Jinja templating in their values.
:param project_id: Optional, the Google Cloud project ID where the topic will be created.
@@ -197,43 +195,35 @@ class PubSubCreateSubscriptionOperator(GoogleCloudBaseOperator):
By default, if the subscription already exists, this operator will
not cause the DAG to fail. However, the topic must exist in the project. ::
- with DAG('successful DAG') as dag:
- (
- PubSubCreateSubscriptionOperator(
- project_id='my-project',
- topic='my-topic',
- subscription='my-subscription'
- )
- >> PubSubCreateSubscriptionOperator(
- project_id='my-project',
- topic='my-topic',
- subscription='my-subscription',
- )
+ with DAG("successful DAG") as dag:
+ create_subscription = PubSubCreateSubscriptionOperator(
+ project_id="my-project", topic="my-topic", subscription="my-subscription"
+ )
+ create_subscription_again = PubSubCreateSubscriptionOperator(
+ project_id="my-project", topic="my-topic", subscription="my-subscription"
)
+ create_subscription >> create_subscription_again
+
+
The operator can be configured to fail if the subscription already exists.
::
- with DAG('failing DAG') as dag:
- (
- PubSubCreateSubscriptionOperator(
- project_id='my-project',
- topic='my-topic',
- subscription='my-subscription',
- )
- >> PubSubCreateSubscriptionOperator(
- project_id='my-project',
- topic='my-topic',
- subscription='my-subscription',
- fail_if_exists=True,
- )
+ with DAG("failing DAG") as dag:
+ create_subscription = PubSubCreateSubscriptionOperator(
+ project_id="my-project", topic="my-topic", subscription="my-subscription"
)
+ create_subscription_again = PubSubCreateSubscriptionOperator(
+ project_id="my-project", topic="my-topic", subscription="my-subscription", fail_if_exists=True
+ )
+
+ create_subscription >> create_subscription_again
Finally, subscription is not required. If not passed, the operator will
generated a universally unique identifier for the subscription's name. ::
- with DAG('DAG') as dag:
- PubSubCreateSubscriptionOperator(project_id='my-project', topic='my-topic')
+ with DAG("DAG") as dag:
+ PubSubCreateSubscriptionOperator(project_id="my-project", topic="my-topic")
``project_id``, ``topic``, ``subscription``, ``subscription_project_id`` and
``impersonation_chain`` are templated so you can use Jinja templating in their values.
@@ -410,14 +400,16 @@ class PubSubDeleteTopicOperator(GoogleCloudBaseOperator):
By default, if the topic does not exist, this operator will
not cause the DAG to fail. ::
- with DAG('successful DAG') as dag:
- PubSubDeleteTopicOperator(project_id='my-project', topic='non_existing_topic')
+ with DAG("successful DAG") as dag:
+ PubSubDeleteTopicOperator(project_id="my-project", topic="non_existing_topic")
The operator can be configured to fail if the topic does not exist. ::
- with DAG('failing DAG') as dag:
+ with DAG("failing DAG") as dag:
PubSubDeleteTopicOperator(
- project_id='my-project', topic='non_existing_topic', fail_if_not_exists=True,
+ project_id="my-project",
+ topic="non_existing_topic",
+ fail_if_not_exists=True,
)
Both ``project_id`` and ``topic`` are templated so you can use Jinja templating in their values.
@@ -506,16 +498,18 @@ class PubSubDeleteSubscriptionOperator(GoogleCloudBaseOperator):
By default, if the subscription does not exist, this operator will
not cause the DAG to fail. ::
- with DAG('successful DAG') as dag:
- PubSubDeleteSubscriptionOperator(project_id='my-project', subscription='non-existing')
+ with DAG("successful DAG") as dag:
+ PubSubDeleteSubscriptionOperator(project_id="my-project", subscription="non-existing")
The operator can be configured to fail if the subscription already exists.
::
- with DAG('failing DAG') as dag:
+ with DAG("failing DAG") as dag:
PubSubDeleteSubscriptionOperator(
- project_id='my-project', subscription='non-existing', fail_if_not_exists=True,
+ project_id="my-project",
+ subscription="non-existing",
+ fail_if_not_exists=True,
)
``project_id``, and ``subscription`` are templated so you can use Jinja templating in their values.
@@ -605,15 +599,13 @@ class PubSubPublishMessageOperator(GoogleCloudBaseOperator):
in a single Google Cloud project. If the topic does not exist, this
task will fail. ::
- m1 = {'data': b'Hello, World!',
- 'attributes': {'type': 'greeting'}
- }
- m2 = {'data': b'Knock, knock'}
- m3 = {'attributes': {'foo': ''}}
+ m1 = {"data": b"Hello, World!", "attributes": {"type": "greeting"}}
+ m2 = {"data": b"Knock, knock"}
+ m3 = {"attributes": {"foo": ""}}
t1 = PubSubPublishMessageOperator(
- project_id='my-project',
- topic='my_topic',
+ project_id="my-project",
+ topic="my_topic",
messages=[m1, m2, m3],
create_topic=True,
dag=dag,
diff --git a/airflow/providers/google/cloud/transfers/adls_to_gcs.py b/airflow/providers/google/cloud/transfers/adls_to_gcs.py
index 7782d127de..7abbd9a9c3 100644
--- a/airflow/providers/google/cloud/transfers/adls_to_gcs.py
+++ b/airflow/providers/google/cloud/transfers/adls_to_gcs.py
@@ -58,12 +58,12 @@ class ADLSToGCSOperator(ADLSListOperator):
resulting gcs path will be ``gs://mybucket/hello/world.avro`` ::
copy_single_file = AdlsToGoogleCloudStorageOperator(
- task_id='copy_single_file',
- src_adls='hello/world.avro',
- dest_gcs='gs://mybucket',
+ task_id="copy_single_file",
+ src_adls="hello/world.avro",
+ dest_gcs="gs://mybucket",
replace=False,
- azure_data_lake_conn_id='azure_data_lake_default',
- gcp_conn_id='google_cloud_default'
+ azure_data_lake_conn_id="azure_data_lake_default",
+ gcp_conn_id="google_cloud_default",
)
The following Operator would copy all parquet files from ADLS
diff --git a/airflow/providers/google/cloud/transfers/gcs_to_gcs.py b/airflow/providers/google/cloud/transfers/gcs_to_gcs.py
index c82faaff01..856d3153e5 100644
--- a/airflow/providers/google/cloud/transfers/gcs_to_gcs.py
+++ b/airflow/providers/google/cloud/transfers/gcs_to_gcs.py
@@ -101,13 +101,13 @@ class GCSToGCSOperator(BaseOperator):
``copied_sales/2017/january-backup.avro`` in the ``data_backup`` bucket ::
copy_single_file = GCSToGCSOperator(
- task_id='copy_single_file',
- source_bucket='data',
- source_objects=['sales/sales-2017/january.avro'],
- destination_bucket='data_backup',
- destination_object='copied_sales/2017/january-backup.avro',
+ task_id="copy_single_file",
+ source_bucket="data",
+ source_objects=["sales/sales-2017/january.avro"],
+ destination_bucket="data_backup",
+ destination_object="copied_sales/2017/january-backup.avro",
exact_match=True,
- gcp_conn_id=google_cloud_conn_id
+ gcp_conn_id=google_cloud_conn_id,
)
The following Operator would copy all the Avro files from ``sales/sales-2017``
@@ -141,12 +141,12 @@ class GCSToGCSOperator(BaseOperator):
process. ::
move_files = GCSToGCSOperator(
- task_id='move_files',
- source_bucket='data',
- source_object='sales/sales-2017/*.avro',
- destination_bucket='data_backup',
+ task_id="move_files",
+ source_bucket="data",
+ source_object="sales/sales-2017/*.avro",
+ destination_bucket="data_backup",
move_object=True,
- gcp_conn_id=google_cloud_conn_id
+ gcp_conn_id=google_cloud_conn_id,
)
The following Operator would move all the Avro files from ``sales/sales-2019``
@@ -154,13 +154,13 @@ class GCSToGCSOperator(BaseOperator):
``data_backup`` bucket, deleting the original files in the process. ::
move_files = GCSToGCSOperator(
- task_id='move_files',
- source_bucket='data',
- source_objects=['sales/sales-2019/*.avro', 'sales/sales-2020'],
- destination_bucket='data_backup',
- delimiter='.avro',
+ task_id="move_files",
+ source_bucket="data",
+ source_objects=["sales/sales-2019/*.avro", "sales/sales-2020"],
+ destination_bucket="data_backup",
+ delimiter=".avro",
move_object=True,
- gcp_conn_id=google_cloud_conn_id
+ gcp_conn_id=google_cloud_conn_id,
)
"""
@@ -329,12 +329,12 @@ class GCSToGCSOperator(BaseOperator):
the ``data_backup`` bucket (b/a.csv, b/b.csv, b/c.csv) ::
copy_files = GCSToGCSOperator(
- task_id='copy_files_without_wildcard',
- source_bucket='data',
- source_objects=['a/'],
- destination_bucket='data_backup',
- destination_object='b/',
- gcp_conn_id=google_cloud_conn_id
+ task_id="copy_files_without_wildcard",
+ source_bucket="data",
+ source_objects=["a/"],
+ destination_bucket="data_backup",
+ destination_object="b/",
+ gcp_conn_id=google_cloud_conn_id,
)
Example 2:
@@ -345,13 +345,13 @@ class GCSToGCSOperator(BaseOperator):
the ``data_backup`` bucket (b/a.avro, b/b.avro, b/c.avro) ::
copy_files = GCSToGCSOperator(
- task_id='copy_files_without_wildcard',
- source_bucket='data',
- source_objects=['a/'],
- destination_bucket='data_backup',
- destination_object='b/',
- delimiter='.avro',
- gcp_conn_id=google_cloud_conn_id
+ task_id="copy_files_without_wildcard",
+ source_bucket="data",
+ source_objects=["a/"],
+ destination_bucket="data_backup",
+ destination_object="b/",
+ delimiter=".avro",
+ gcp_conn_id=google_cloud_conn_id,
)
Example 3:
@@ -362,12 +362,12 @@ class GCSToGCSOperator(BaseOperator):
the ``data_backup`` bucket (b/file_1.txt, b/file_2.csv, b/file_3.avro) ::
copy_files = GCSToGCSOperator(
- task_id='copy_files_without_wildcard',
- source_bucket='data',
- source_objects=['a/file_1.txt', 'a/file_2.csv', 'a/file_3.avro'],
- destination_bucket='data_backup',
- destination_object='b/',
- gcp_conn_id=google_cloud_conn_id
+ task_id="copy_files_without_wildcard",
+ source_bucket="data",
+ source_objects=["a/file_1.txt", "a/file_2.csv", "a/file_3.avro"],
+ destination_bucket="data_backup",
+ destination_object="b/",
+ gcp_conn_id=google_cloud_conn_id,
)
Example 4:
@@ -378,12 +378,12 @@ class GCSToGCSOperator(BaseOperator):
(b/foo.txt, b/foo.txt.abc, b/foo.txt/subfolder/file.txt) ::
copy_files = GCSToGCSOperator(
- task_id='copy_files_without_wildcard',
- source_bucket='data',
- source_object='a/foo.txt',
- destination_bucket='data_backup',
- destination_object='b/',
- gcp_conn_id=google_cloud_conn_id
+ task_id="copy_files_without_wildcard",
+ source_bucket="data",
+ source_object="a/foo.txt",
+ destination_bucket="data_backup",
+ destination_object="b/",
+ gcp_conn_id=google_cloud_conn_id,
)
"""
objects = hook.list(
diff --git a/airflow/providers/google/cloud/transfers/mssql_to_gcs.py b/airflow/providers/google/cloud/transfers/mssql_to_gcs.py
index d8f78ffd23..81e9af6d31 100644
--- a/airflow/providers/google/cloud/transfers/mssql_to_gcs.py
+++ b/airflow/providers/google/cloud/transfers/mssql_to_gcs.py
@@ -42,15 +42,15 @@ class MSSQLToGCSOperator(BaseSQLToGCSOperator):
'mssql-export' GCS bucket (along with a schema file). ::
export_customers = MSSQLToGCSOperator(
- task_id='export_customers',
- sql='SELECT * FROM dbo.Customers;',
- bit_fields=['some_bit_field', 'another_bit_field'],
- bucket='mssql-export',
- filename='data/customers/export.json',
- schema_filename='schemas/export.json',
- mssql_conn_id='mssql_default',
- gcp_conn_id='google_cloud_default',
- dag=dag
+ task_id="export_customers",
+ sql="SELECT * FROM dbo.Customers;",
+ bit_fields=["some_bit_field", "another_bit_field"],
+ bucket="mssql-export",
+ filename="data/customers/export.json",
+ schema_filename="schemas/export.json",
+ mssql_conn_id="mssql_default",
+ gcp_conn_id="google_cloud_default",
+ dag=dag,
)
.. seealso::
diff --git a/airflow/providers/microsoft/azure/operators/adls.py b/airflow/providers/microsoft/azure/operators/adls.py
index dd642d4f70..345336b2c4 100644
--- a/airflow/providers/microsoft/azure/operators/adls.py
+++ b/airflow/providers/microsoft/azure/operators/adls.py
@@ -78,9 +78,9 @@ class ADLSListOperator(BaseOperator):
folder in the specified ADLS account ::
adls_files = ADLSListOperator(
- task_id='adls_files',
- path='folder/output/*.parquet',
- azure_data_lake_conn_id='azure_data_lake_default'
+ task_id="adls_files",
+ path="folder/output/*.parquet",
+ azure_data_lake_conn_id="azure_data_lake_default",
)
"""
diff --git a/airflow/providers/microsoft/azure/operators/container_instances.py b/airflow/providers/microsoft/azure/operators/container_instances.py
index dde105e022..f00c933487 100644
--- a/airflow/providers/microsoft/azure/operators/container_instances.py
+++ b/airflow/providers/microsoft/azure/operators/container_instances.py
@@ -93,29 +93,29 @@ class AzureContainerInstancesOperator(BaseOperator):
**Example**::
- AzureContainerInstancesOperator(
- ci_conn_id = "azure_service_principal",
- registry_conn_id = "azure_registry_user",
- resource_group = "my-resource-group",
- name = "my-container-name-{{ ds }}",
- image = "myprivateregistry.azurecr.io/my_container:latest",
- region = "westeurope",
- environment_variables = {"MODEL_PATH": "my_value",
- "POSTGRES_LOGIN": "{{ macros.connection('postgres_default').login }}",
- "POSTGRES_PASSWORD": "{{ macros.connection('postgres_default').password }}",
- "JOB_GUID": "{{ ti.xcom_pull(task_ids='task1', key='guid') }}" },
- secured_variables = ['POSTGRES_PASSWORD'],
- volumes = [("azure_container_instance_conn_id",
- "my_storage_container",
- "my_fileshare",
- "/input-data",
- True),],
- memory_in_gb=14.0,
- cpu=4.0,
- gpu=GpuResource(count=1, sku='K80'),
- command=["/bin/echo", "world"],
- task_id="start_container"
- )
+ AzureContainerInstancesOperator(
+ ci_conn_id="azure_service_principal",
+ registry_conn_id="azure_registry_user",
+ resource_group="my-resource-group",
+ name="my-container-name-{{ ds }}",
+ image="myprivateregistry.azurecr.io/my_container:latest",
+ region="westeurope",
+ environment_variables={
+ "MODEL_PATH": "my_value",
+ "POSTGRES_LOGIN": "{{ macros.connection('postgres_default').login }}",
+ "POSTGRES_PASSWORD": "{{ macros.connection('postgres_default').password }}",
+ "JOB_GUID": "{{ ti.xcom_pull(task_ids='task1', key='guid') }}",
+ },
+ secured_variables=["POSTGRES_PASSWORD"],
+ volumes=[
+ ("azure_container_instance_conn_id", "my_storage_container", "my_fileshare", "/input-data", True),
+ ],
+ memory_in_gb=14.0,
+ cpu=4.0,
+ gpu=GpuResource(count=1, sku="K80"),
+ command=["/bin/echo", "world"],
+ task_id="start_container",
+ )
"""
template_fields: Sequence[str] = ("name", "image", "command", "environment_variables", "volumes")
diff --git a/airflow/providers/sftp/operators/sftp.py b/airflow/providers/sftp/operators/sftp.py
index 8e04b0d0b9..0976f52674 100644
--- a/airflow/providers/sftp/operators/sftp.py
+++ b/airflow/providers/sftp/operators/sftp.py
@@ -74,7 +74,7 @@ class SFTPOperator(BaseOperator):
remote_filepath="/tmp/tmp1/tmp2/file.txt",
operation="put",
create_intermediate_dirs=True,
- dag=dag
+ dag=dag,
)
"""
diff --git a/airflow/sensors/weekday.py b/airflow/sensors/weekday.py
index ba88ee14d6..f48f0bef1e 100644
--- a/airflow/sensors/weekday.py
+++ b/airflow/sensors/weekday.py
@@ -39,18 +39,14 @@ class DayOfWeekSensor(BaseSensorOperator):
**Example** (with single day): ::
weekend_check = DayOfWeekSensor(
- task_id='weekend_check',
- week_day='Saturday',
- use_task_logical_date=True,
- dag=dag)
+ task_id="weekend_check", week_day="Saturday", use_task_logical_date=True, dag=dag
+ )
**Example** (with multiple day using set): ::
weekend_check = DayOfWeekSensor(
- task_id='weekend_check',
- week_day={'Saturday', 'Sunday'},
- use_task_logical_date=True,
- dag=dag)
+ task_id="weekend_check", week_day={"Saturday", "Sunday"}, use_task_logical_date=True, dag=dag
+ )
**Example** (with :class:`~airflow.utils.weekday.WeekDay` enum): ::
@@ -58,10 +54,11 @@ class DayOfWeekSensor(BaseSensorOperator):
from airflow.utils.weekday import WeekDay
weekend_check = DayOfWeekSensor(
- task_id='weekend_check',
+ task_id="weekend_check",
week_day={WeekDay.SATURDAY, WeekDay.SUNDAY},
use_task_logical_date=True,
- dag=dag)
+ dag=dag,
+ )
:param week_day: Day of the week to check (full name). Optionally, a set
of days can also be provided using a set.
diff --git a/airflow/utils/email.py b/airflow/utils/email.py
index 659c3bdb0f..55dccc97f5 100644
--- a/airflow/utils/email.py
+++ b/airflow/utils/email.py
@@ -125,7 +125,7 @@ def send_email_smtp(
:param custom_headers: Dictionary of custom headers to include in the email.
:param kwargs: Additional keyword arguments.
- >>> send_email('test@example.com', 'foo', '<b>Foo</b> bar', ['/dev/null'], dryrun=True)
+ >>> send_email("test@example.com", "foo", "<b>Foo</b> bar", ["/dev/null"], dryrun=True)
"""
smtp_mail_from = conf.get("smtp", "SMTP_MAIL_FROM")
diff --git a/airflow/utils/helpers.py b/airflow/utils/helpers.py
index acbe25bd92..3ad87bd104 100644
--- a/airflow/utils/helpers.py
+++ b/airflow/utils/helpers.py
@@ -155,7 +155,7 @@ def as_flattened_list(iterable: Iterable[Iterable[T]]) -> list[T]:
"""
Return an iterable with one level flattened.
- >>> as_flattened_list((('blue', 'red'), ('green', 'yellow', 'pink')))
+ >>> as_flattened_list((("blue", "red"), ("green", "yellow", "pink")))
['blue', 'red', 'green', 'yellow', 'pink']
"""
return [e for i in iterable for e in i]
diff --git a/airflow/utils/types.py b/airflow/utils/types.py
index 32a0bda6bb..cf3de511b0 100644
--- a/airflow/utils/types.py
+++ b/airflow/utils/types.py
@@ -35,6 +35,7 @@ class ArgNotSet:
return False
return True
+
is_arg_passed() # False.
is_arg_passed(None) # True.
"""
diff --git a/airflow/www/extensions/init_appbuilder.py b/airflow/www/extensions/init_appbuilder.py
index ddb44200f9..bda10d8ddc 100644
--- a/airflow/www/extensions/init_appbuilder.py
+++ b/airflow/www/extensions/init_appbuilder.py
@@ -411,32 +411,27 @@ class AirflowAppBuilder:
# or not instantiated
appbuilder.add_view(MyModelView, "My View")
# Register a view, a submenu "Other View" from "Other" with a phone icon.
- appbuilder.add_view(
- MyOtherModelView,
- "Other View",
- icon='fa-phone',
- category="Others"
- )
+ appbuilder.add_view(MyOtherModelView, "Other View", icon="fa-phone", category="Others")
# Register a view, with category icon and translation.
appbuilder.add_view(
YetOtherModelView,
"Other View",
- icon='fa-phone',
- label=_('Other View'),
+ icon="fa-phone",
+ label=_("Other View"),
category="Others",
- category_icon='fa-envelop',
- category_label=_('Other View')
+ category_icon="fa-envelop",
+ category_label=_("Other View"),
)
# Register a view whose menu item will be conditionally displayed
appbuilder.add_view(
YourFeatureView,
"Your Feature",
- icon='fa-feature',
- label=_('Your Feature'),
+ icon="fa-feature",
+ label=_("Your Feature"),
menu_cond=lambda: is_feature_enabled("your-feature"),
)
# Add a link
- appbuilder.add_link("google", href="www.google.com", icon = "fa-google-plus")
+ appbuilder.add_link("google", href="www.google.com", icon="fa-google-plus")
"""
baseview = self._check_and_init(baseview)
log.info(LOGMSG_INF_FAB_ADD_VIEW, baseview.__class__.__name__, name)
diff --git a/dev/mypy/plugin/outputs.py b/dev/mypy/plugin/outputs.py
index 308ba4aed0..fe1ccd5e7c 100644
--- a/dev/mypy/plugin/outputs.py
+++ b/dev/mypy/plugin/outputs.py
@@ -41,6 +41,7 @@ class OperatorOutputPlugin(Plugin):
def f(a: str) -> int:
return len(a)
+
f(op.output) # "op" is an operator instance.
f(g()) # "g" is a taskflow task.
diff --git a/pyproject.toml b/pyproject.toml
index 6187f8ca6f..7a305243a1 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -75,6 +75,9 @@ extend-ignore = [
namespace-packages = ["airflow/providers"]
+[tool.ruff.format]
+docstring-code-format = true
+
[tool.pytest.ini_options]
# * Disable `flaky` plugin for pytest. This plugin conflicts with `rerunfailures` because provide same marker.
# * Disable `nose` builtin plugin for pytest. This feature deprecated in 7.2 and will be removed in pytest>=8
diff --git a/tests/conftest.py b/tests/conftest.py
index b48c51a0cb..646ca32228 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -616,8 +616,8 @@ def dag_maker(request):
the same argument as DAG::
with dag_maker(dag_id="mydag") as dag:
- task1 = EmptyOperator(task_id='mytask')
- task2 = EmptyOperator(task_id='mytask2')
+ task1 = EmptyOperator(task_id="mytask")
+ task2 = EmptyOperator(task_id="mytask2")
If the DagModel you want to use needs different parameters than the one
automatically created by the dag_maker, you have to update the DagModel as below::
@@ -854,7 +854,7 @@ def create_dummy_dag(dag_maker):
is not here, please use `default_args` so that the DAG will pass it to the
Task::
- dag, task = create_dummy_dag(default_args={'start_date':timezone.datetime(2016, 1, 1)})
+ dag, task = create_dummy_dag(default_args={"start_date": timezone.datetime(2016, 1, 1)})
You cannot be able to alter the created DagRun or DagModel, use `dag_maker` fixture instead.
"""
diff --git a/tests/test_utils/providers.py b/tests/test_utils/providers.py
index 99f64a6849..02ca9bed41 100644
--- a/tests/test_utils/providers.py
+++ b/tests/test_utils/providers.py
@@ -36,7 +36,7 @@ def get_provider_version(provider_name):
Returns provider version given provider package name.
Example::
- if provider_version('apache-airflow-providers-cncf-kubernetes') >= (6, 0):
+ if provider_version("apache-airflow-providers-cncf-kubernetes") >= (6, 0):
raise Exception(
"You must now remove `get_kube_client` from PodManager "
"and make kube_client a required argument."
diff --git a/tests/www/views/test_views_tasks.py b/tests/www/views/test_views_tasks.py
index 55568d4d8f..8cd257d89e 100644
--- a/tests/www/views/test_views_tasks.py
+++ b/tests/www/views/test_views_tasks.py
@@ -797,6 +797,7 @@ def _get_appbuilder_pk_string(model_view_cls, instance) -> str:
Example usage::
from airflow.www.views import TaskInstanceModelView
+
ti = session.Query(TaskInstance).filter(...).one()
pk = _get_appbuilder_pk_string(TaskInstanceModelView, ti)
client.post("...", data={"action": "...", "rowid": pk})
(airflow) 12/27: Fix problems with missing selective checks on new types of unit tests (#36372)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit d79f7a4027fd9b252005fa98f4a31d171f65c45b
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Fri Dec 22 20:12:54 2023 +0100
Fix problems with missing selective checks on new types of unit tests (#36372)
When the DB/NonDB tests were introduced (#35160) new test types have
been added (separating various Python test types from generic
Operator test type). However we have not added matching of the python
operator and test files into the right selective unit test type. This
caused that when only `operators/python.py` and `tests/test_python` were
changed, then `Operators` test type was run but the specific Python *
test types were not run.
This PR fixes it for current test type (including also separated
Serialization test type) and for the future - instead of matching
selected test type we match all of them except the few that we
now are "special" ("Always, Core, Other, PlainAsserts").
(cherry picked from commit b0db1f94ede7d316b3f63a924176e5e1eefa89c1)
---
.../src/airflow_breeze/utils/selective_checks.py | 58 +++++++++++-----------
dev/breeze/tests/test_selective_checks.py | 47 ++++++++++++++++++
2 files changed, 77 insertions(+), 28 deletions(-)
diff --git a/dev/breeze/src/airflow_breeze/utils/selective_checks.py b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
index dba6000902..2cf57200a4 100644
--- a/dev/breeze/src/airflow_breeze/utils/selective_checks.py
+++ b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
@@ -223,33 +223,42 @@ CI_FILE_GROUP_EXCLUDES = HashableDict(
}
)
+PYTHON_OPERATOR_FILES = [
+ r"^airflow/operators/python.py",
+ r"^tests/operators/test_python.py",
+]
+
TEST_TYPE_MATCHES = HashableDict(
{
SelectiveUnitTestTypes.API: [
- r"^airflow/api",
- r"^airflow/api_connexion",
- r"^tests/api",
- r"^tests/api_connexion",
+ r"^airflow/api/",
+ r"^airflow/api_connexion/",
+ r"^airflow/api_internal/",
+ r"^tests/api/",
+ r"^tests/api_connexion/",
+ r"^tests/api_internal/",
],
SelectiveUnitTestTypes.CLI: [
- r"^airflow/cli",
- r"^tests/cli",
+ r"^airflow/cli/",
+ r"^tests/cli/",
],
SelectiveUnitTestTypes.OPERATORS: [
- r"^airflow/operators",
- r"^tests/operators",
+ r"^airflow/operators/",
+ r"^tests/operators/",
],
SelectiveUnitTestTypes.PROVIDERS: [
r"^airflow/providers/",
r"^tests/system/providers/",
r"^tests/providers/",
],
- SelectiveUnitTestTypes.PYTHON_VENV: [
- r"^tests/operators/test_python.py",
- ],
- SelectiveUnitTestTypes.BRANCH_PYTHON_VENV: [
- r"^tests/operators/test_python.py",
+ SelectiveUnitTestTypes.SERIALIZATION: [
+ r"^airflow/serialization/",
+ r"^tests/serialization/",
],
+ SelectiveUnitTestTypes.PYTHON_VENV: PYTHON_OPERATOR_FILES,
+ SelectiveUnitTestTypes.BRANCH_PYTHON_VENV: PYTHON_OPERATOR_FILES,
+ SelectiveUnitTestTypes.EXTERNAL_PYTHON: PYTHON_OPERATOR_FILES,
+ SelectiveUnitTestTypes.EXTERNAL_BRANCH_PYTHON: PYTHON_OPERATOR_FILES,
SelectiveUnitTestTypes.WWW: [r"^airflow/www", r"^tests/www"],
}
)
@@ -652,21 +661,14 @@ class SelectiveChecks:
candidate_test_types: set[str] = {"Always"}
matched_files: set[str] = set()
- matched_files.update(
- self._select_test_type_if_matching(candidate_test_types, SelectiveUnitTestTypes.WWW)
- )
- matched_files.update(
- self._select_test_type_if_matching(candidate_test_types, SelectiveUnitTestTypes.PROVIDERS)
- )
- matched_files.update(
- self._select_test_type_if_matching(candidate_test_types, SelectiveUnitTestTypes.CLI)
- )
- matched_files.update(
- self._select_test_type_if_matching(candidate_test_types, SelectiveUnitTestTypes.OPERATORS)
- )
- matched_files.update(
- self._select_test_type_if_matching(candidate_test_types, SelectiveUnitTestTypes.API)
- )
+ for test_type in SelectiveUnitTestTypes:
+ if test_type not in [
+ SelectiveUnitTestTypes.ALWAYS,
+ SelectiveUnitTestTypes.CORE,
+ SelectiveUnitTestTypes.OTHER,
+ SelectiveUnitTestTypes.PLAIN_ASSERTS,
+ ]:
+ matched_files.update(self._select_test_type_if_matching(candidate_test_types, test_type))
kubernetes_files = self._matching_files(
FileGroupForCi.KUBERNETES_FILES, CI_FILE_GROUP_MATCHES, CI_FILE_GROUP_EXCLUDES
diff --git a/dev/breeze/tests/test_selective_checks.py b/dev/breeze/tests/test_selective_checks.py
index 6198cc59cd..495c98fd87 100644
--- a/dev/breeze/tests/test_selective_checks.py
+++ b/dev/breeze/tests/test_selective_checks.py
@@ -161,6 +161,53 @@ def assert_outputs_are_printed(expected_outputs: dict[str, str], stderr: str):
id="Only Operator tests and DOCS should run",
)
),
+ (
+ pytest.param(
+ ("airflow/operators/python.py",),
+ {
+ "affected-providers-list-as-string": None,
+ "all-python-versions": "['3.8']",
+ "all-python-versions-list-as-string": "3.8",
+ "python-versions": "['3.8']",
+ "python-versions-list-as-string": "3.8",
+ "ci-image-build": "true",
+ "prod-image-build": "false",
+ "needs-helm-tests": "false",
+ "run-tests": "true",
+ "run-amazon-tests": "false",
+ "docs-build": "true",
+ "skip-pre-commits": "check-provider-yaml-valid,identity,lint-helm-chart,mypy-dev,"
+ "mypy-docs,mypy-providers,ts-compile-format-lint-www",
+ "upgrade-to-newer-dependencies": "false",
+ "parallel-test-types-list-as-string": "Always BranchExternalPython BranchPythonVenv "
+ "ExternalPython Operators PythonVenv",
+ },
+ id="Only Python tests",
+ )
+ ),
+ (
+ pytest.param(
+ ("airflow/serialization/python.py",),
+ {
+ "affected-providers-list-as-string": None,
+ "all-python-versions": "['3.8']",
+ "all-python-versions-list-as-string": "3.8",
+ "python-versions": "['3.8']",
+ "python-versions-list-as-string": "3.8",
+ "ci-image-build": "true",
+ "prod-image-build": "false",
+ "needs-helm-tests": "false",
+ "run-tests": "true",
+ "run-amazon-tests": "false",
+ "docs-build": "true",
+ "skip-pre-commits": "check-provider-yaml-valid,identity,lint-helm-chart,mypy-dev,"
+ "mypy-docs,mypy-providers,ts-compile-format-lint-www",
+ "upgrade-to-newer-dependencies": "false",
+ "parallel-test-types-list-as-string": "Always Serialization",
+ },
+ id="Only Serialization tests",
+ )
+ ),
(
pytest.param(
(
(airflow) 21/27: Remove pypitest from the release process (#36466)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 00fc3db79aebd0b9de2724340c703d44ae17e394
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Thu Dec 28 10:11:31 2023 +0100
Remove pypitest from the release process (#36466)
(cherry picked from commit c16b4218728a654c2a9d51a5a637ebf595f20136)
---
dev/README_RELEASE_PROVIDER_PACKAGES.md | 37 ++++++---------------------------
1 file changed, 6 insertions(+), 31 deletions(-)
diff --git a/dev/README_RELEASE_PROVIDER_PACKAGES.md b/dev/README_RELEASE_PROVIDER_PACKAGES.md
index 4663e0c1c3..00a10352a2 100644
--- a/dev/README_RELEASE_PROVIDER_PACKAGES.md
+++ b/dev/README_RELEASE_PROVIDER_PACKAGES.md
@@ -400,31 +400,13 @@ increased until the tag is not found.
twine check ${AIRFLOW_REPO_ROOT}/dist/*
```
-* Upload the package to PyPi's test environment:
-
-```shell script
-twine upload -r pypitest ${AIRFLOW_REPO_ROOT}/dist/*
-```
-
-If you see
-> WARNING Error during upload. Retry with the --verbose option for more details.
-ERROR HTTPError: 403 Forbidden from https://test.pypi.org/legacy/
- The user [user_name] isn't allowed to upload to project [provider_name]
-
-It means that you don't have permission to upload providers.
-Please ask one of the Admins to grant you permissions on the packages you wish to release.
-
-
-* Verify that the test packages look good by downloading it and installing them into a virtual environment.
-Twine prints the package links as output - separately for each package.
-
-* Upload the package to PyPi's production environment:
+* Upload the package to PyPi:
```shell script
twine upload -r pypi ${AIRFLOW_REPO_ROOT}/dist/*
```
-* Again, confirm that the packages are available under the links printed.
+* Confirm that the packages are available under the links printed and look good.
## Add tags in git
@@ -1111,22 +1093,15 @@ This is expected, the RC tag is most likely behind the main branch.
twine check ${AIRFLOW_REPO_ROOT}/dist/*.whl ${AIRFLOW_REPO_ROOT}/dist/*.tar.gz
```
-* Upload the package to PyPi's test environment:
-
-```shell script
-twine upload -r pypitest ${AIRFLOW_REPO_ROOT}/dist/*.whl ${AIRFLOW_REPO_ROOT}/dist/*.tar.gz
-```
-
-* Verify that the test packages look good by downloading it and installing them into a virtual environment.
- Twine prints the package links as output - separately for each package.
-
-* Upload the package to PyPi's production environment:
+* Upload the package to PyPi:
```shell script
twine upload -r pypi ${AIRFLOW_REPO_ROOT}/dist/*.whl ${AIRFLOW_REPO_ROOT}/dist/*.tar.gz
```
-Copy links to updated packages, sort it aphabeticly and save it on the side. You will need it for the announcement message.
+* Verify that the packages are available under the links printed.
+
+Copy links to updated packages, sort it alphabetically and save it on the side. You will need it for the announcement message.
* Again, confirm that the packages are available under the links printed.
(airflow) 16/27: Use default Postgres version for Quarantined tests (#36390)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 879af06000f615f0cbf19a3b5e0dce9a4e31fb6f
Author: Andrey Anshin <An...@taragol.is>
AuthorDate: Sat Dec 23 22:21:41 2023 +0400
Use default Postgres version for Quarantined tests (#36390)
(cherry picked from commit 8e70d560245e9a102834fc8ff1d3cb269254e5a5)
---
.github/workflows/ci.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 7e1436476c..0c4962ff06 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1497,8 +1497,8 @@ jobs:
run: breeze testing tests || true
env:
BACKEND: "postgres"
- BACKEND_VERSION: "11"
- POSTGRES_VERSION: "11"
+ BACKEND_VERSION: ${{needs.build-info.outputs.default-postgres-version}}
+ POSTGRES_VERSION: ${{needs.build-info.outputs.default-postgres-version}}
- name: >
Tests: mysql:${{needs.build-info.outputs.default-python-version}}:Quarantined
run: breeze testing tests || true
(airflow) 14/27: Add note for release manager about updating the states of providers (#36392)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 7985fa898a7670903eea4426db12dfc4d2ab57a8
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Sat Dec 23 17:46:10 2023 +0100
Add note for release manager about updating the states of providers (#36392)
(cherry picked from commit d172ca933a7718e2c2d89761b5a38515621ffc0c)
---
dev/README_RELEASE_PROVIDER_PACKAGES.md | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/dev/README_RELEASE_PROVIDER_PACKAGES.md b/dev/README_RELEASE_PROVIDER_PACKAGES.md
index 16d6fbe9f9..f281b8403f 100644
--- a/dev/README_RELEASE_PROVIDER_PACKAGES.md
+++ b/dev/README_RELEASE_PROVIDER_PACKAGES.md
@@ -476,8 +476,11 @@ breeze release-management publish-docs amazon apache.beam google ....
breeze release-management add-back-references all-providers
```
-- If you publish a new package, you must add it to
- [the docs index](https://github.com/apache/airflow-site/blob/master/landing-pages/site/content/en/docs/_index.md):
+Review the state of removed, suspended, new packages in
+[the docs index](https://github.com/apache/airflow-site/blob/master/landing-pages/site/content/en/docs/_index.md):
+
+- If you publish a new package, you must add it to the list of packages in the index.
+- If there are changes to suspension or removal status of a package you must move it appropriate section.
- Create the commit and push changes.
(airflow) 18/27: Automate rcN calculation when releasing provider packages (#36441)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit d8537857036a36dcfda171395092f932770d6dda
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Wed Dec 27 09:05:54 2023 +0100
Automate rcN calculation when releasing provider packages (#36441)
This change will automatically generate the **right** rcN package
when prepareing the packages for PyPI. This allows to have pretty
much continuous release process for voting over the provider packages.
Simply when an rcN candidate is not released, it will be automatically
included in the next wave of packages with rcN+1 version - unless during
provider package generation the version will be bumped to MAJOR or MINOR
due to new changes.
This allows for the workflow where in every new wave we always generate
all provider packages ready for release.
(cherry picked from commit 6f5a50ea10842c2bb4b6bdc1e28dfaa680536d5a)
---
dev/README_RELEASE_PROVIDER_PACKAGES.md | 17 ++++++---------
.../commands/release_management_commands.py | 9 +++++---
.../prepare_providers/provider_packages.py | 25 ++++++++++++++++------
3 files changed, 31 insertions(+), 20 deletions(-)
diff --git a/dev/README_RELEASE_PROVIDER_PACKAGES.md b/dev/README_RELEASE_PROVIDER_PACKAGES.md
index e53ef22d1a..554197b40f 100644
--- a/dev/README_RELEASE_PROVIDER_PACKAGES.md
+++ b/dev/README_RELEASE_PROVIDER_PACKAGES.md
@@ -206,7 +206,7 @@ are not generated. Release notes are only generated, when the latest version of
yet have a corresponding TAG.
The tags for providers is of the form ``providers-<PROVIDER_ID>/<VERSION>`` for example
-``providers-amazon/1.0.0``. During releasing, the RC1/RC2 tags are created (for example
+``providers-amazon/1.0.0``. During releasing, the `rc*` tags are created (for example
``providers-amazon/1.0.0rc1``).
Details about maintaining the SEMVER version are going to be discussed and implemented in
@@ -372,8 +372,8 @@ so you need to use `--version-suffix-for-pypi` switch to prepare those packages.
Note that these are different packages than the ones used for SVN upload
though they should be generated from the same sources.
-* Generate the packages with the right RC version (specify the version suffix with PyPI switch). Note that
-this will clean up dist folder before generating the packages, so you will only have the right packages there.
+* Generate the packages with the rc1 version (specify the version suffix with PyPI switch). Note that
+you should clean up dist folder before generating the packages, so you will only have the right packages there.
```shell script
rm -rf ${AIRFLOW_REPO_ROOT}/dist/*
@@ -389,13 +389,10 @@ breeze release-management prepare-provider-packages \
--version-suffix-for-pypi rc1 --package-format both PACKAGE PACKAGE ....
```
-In case you are ALSO releasing RC2, RC3, etc. for selected packages, they will be skipped automatically because
-the `rc1` tag will be created for them already. In this case you should specify the ``rc*`` that you want to
-build and specify the package id's you want to build.
-
-```shell script
-breeze release-management prepare-provider-packages --version-suffix-for-pypi rc2 --package-format both PACKAGE
-```
+In case some packages already had rc1 suffix prepared and released, and they still need to be released, they
+will have automatically appropriate rcN suffix added to them. The suffix will be increased for each release
+candidate and checked if tag has been already created for that release candidate. If yes, the suffix will be
+increased until the tag is not found.
* Verify the artifacts that would be uploaded:
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 21a2e17987..8d1ee6eaa6 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -563,17 +563,20 @@ def prepare_provider_packages(
shutil.rmtree(DIST_DIR, ignore_errors=True)
DIST_DIR.mkdir(parents=True, exist_ok=True)
for provider_id in packages_list:
+ package_version = version_suffix_for_pypi
try:
basic_provider_checks(provider_id)
- if not skip_tag_check and should_skip_the_package(provider_id, version_suffix_for_pypi):
- continue
+ if not skip_tag_check:
+ should_skip, package_version = should_skip_the_package(provider_id, package_version)
+ if should_skip:
+ continue
get_console().print()
with ci_group(f"Preparing provider package [special]{provider_id}"):
get_console().print()
target_provider_root_sources_path = copy_provider_sources_to_target(provider_id)
generate_build_files(
provider_id=provider_id,
- version_suffix=version_suffix_for_pypi,
+ version_suffix=package_version,
target_provider_root_sources_path=target_provider_root_sources_path,
)
cleanup_build_remnants(target_provider_root_sources_path)
diff --git a/dev/breeze/src/airflow_breeze/prepare_providers/provider_packages.py b/dev/breeze/src/airflow_breeze/prepare_providers/provider_packages.py
index 231bb7ff87..e8d99e6ed6 100644
--- a/dev/breeze/src/airflow_breeze/prepare_providers/provider_packages.py
+++ b/dev/breeze/src/airflow_breeze/prepare_providers/provider_packages.py
@@ -155,19 +155,30 @@ def generate_build_files(provider_id: str, version_suffix: str, target_provider_
get_console().print(f"\n[info]Generated package build files for {provider_id}[/]\n")
-def should_skip_the_package(provider_id: str, version_suffix: str) -> bool:
- """Return True if the package should be skipped.
+def should_skip_the_package(provider_id: str, version_suffix: str) -> tuple[bool, str]:
+ """Return True, version if the package should be skipped and False, good version suffix if not.
For RC and official releases we check if the "officially released" version exists
and skip the released if it was. This allows to skip packages that have not been
marked for release in this wave. For "dev" suffixes, we always build all packages.
"""
- if version_suffix.startswith("rc") or version_suffix == "":
- current_tag = get_latest_provider_tag(provider_id, version_suffix)
+ if version_suffix != "" and not version_suffix.startswith("rc"):
+ return False, version_suffix
+ if version_suffix == "":
+ current_tag = get_latest_provider_tag(provider_id, "")
if tag_exists_for_provider(provider_id, current_tag):
- get_console().print(f"[warning]The tag {current_tag} exists. Skipping the package.[/]")
- return True
- return False
+ get_console().print(f"[warning]The 'final' tag {current_tag} exists. Skipping the package.[/]")
+ return True, version_suffix
+ return False, version_suffix
+ # version_suffix starts with "rc"
+ current_version = int(version_suffix[2:])
+ while True:
+ current_tag = get_latest_provider_tag(provider_id, f"rc{current_version}")
+ if tag_exists_for_provider(provider_id, current_tag):
+ current_version += 1
+ get_console().print(f"[warning]The tag {current_tag} exists. Checking rc{current_version}.[/]")
+ else:
+ return False, f"rc{current_version}"
def cleanup_build_remnants(target_provider_root_sources_path: Path):
(airflow) 08/27: Airflow 2.8.0 has been released (#36298)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit b06b1fc8be66298bb8682dcb87b5413ee88d63af
Author: Ephraim Anierobi <sp...@gmail.com>
AuthorDate: Tue Dec 19 22:14:19 2023 +0100
Airflow 2.8.0 has been released (#36298)
* Update RELEASE_NOTES.rst
(cherry picked from commit 26990e2ed640039e14458cb223e2d6801e315770)
* Update RELEASE_NOTES.rst
(cherry picked from commit d0c1c452ce06a89c0ea24ef21384efe26393a446)
* Update RELEASE_NOTES.rst
(cherry picked from commit db2b75c233e3e3c59ec9d0563b93ddbe733ad0bf)
* Airflow 2.8.0 has been released
* fixup! Airflow 2.8.0 has been released
(cherry picked from commit 51d31147894c543c5231a94fedbc4ff1589a32eb)
---
.github/ISSUE_TEMPLATE/airflow_bug_report.yml | 17 +++++++++++++----
Dockerfile | 2 +-
2 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/.github/ISSUE_TEMPLATE/airflow_bug_report.yml b/.github/ISSUE_TEMPLATE/airflow_bug_report.yml
index 309151c8d7..cc260a61dc 100644
--- a/.github/ISSUE_TEMPLATE/airflow_bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/airflow_bug_report.yml
@@ -25,14 +25,23 @@ body:
the latest release or main to see if the issue is fixed before reporting it.
multiple: false
options:
- - "2.7.3"
+ - "2.8.0"
- "main (development)"
- "Other Airflow 2 version (please specify below)"
validations:
required: true
+ - type: input
+ attributes:
+ label: If "Other Airflow 2 version" selected, which one?
+ # yamllint disable rule:line-length
+ description: >
+ On what 2.X version of Airflow are you currently experiencing the issue? Remember, you are encouraged to
+ test with the latest release or on the main branch to verify your issue still exists, especially if
+ your version is at least a minor version older than the [current stable release](https://airflow.apache.org/docs/apache-airflow/stable/installation/supported-versions.html#version-life-cycle).
+ # yamllint enable rule:line-length
- type: textarea
attributes:
- label: What happened
+ label: What happened?
description: Describe what happened.
placeholder: >
Please provide the context in which the problem occurred and explain what happened
@@ -40,7 +49,7 @@ body:
required: true
- type: textarea
attributes:
- label: What you think should happen instead
+ label: What you think should happen instead?
description: What do you think went wrong?
placeholder: >
Please explain why you think the behaviour is erroneous. It is extremely helpful if you copy&paste
@@ -101,7 +110,7 @@ body:
software (docker-compose, helm, k8s, etc.), any customisation and configuration you added.
- type: textarea
attributes:
- label: Anything else
+ label: Anything else?
description: Anything else we need to know?
placeholder: >
How often does this problem occur? (Once? Every time? Only when certain conditions are met?)
diff --git a/Dockerfile b/Dockerfile
index 2a62ef8712..21925364cc 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -44,7 +44,7 @@ ARG AIRFLOW_UID="50000"
ARG AIRFLOW_USER_HOME_DIR=/home/airflow
# latest released version here
-ARG AIRFLOW_VERSION="2.7.3"
+ARG AIRFLOW_VERSION="2.8.0"
ARG PYTHON_BASE_IMAGE="python:3.8-slim-bookworm"
(airflow) 26/27: Add zlib1g-dev package to Airflow images (#36493)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit a161e6eb6e7f7ba8bfa57c80a83b83800d72e1ee
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Sat Dec 30 02:17:30 2023 +0100
Add zlib1g-dev package to Airflow images (#36493)
Seems that when mysql repository is used to install mysql client,
it induces libxml compilation for Python 3.8 and 3.9 and this
library requires devel version of zlib that is missing in the image.
This PR adds the devel version as dev apt dependency.
(cherry picked from commit 2bc34ffcb5e830544e024e085f36481a33852f49)
---
.github/workflows/ci.yml | 4 ++--
Dockerfile | 2 +-
Dockerfile.ci | 2 +-
scripts/docker/install_os_dependencies.sh | 2 +-
4 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 5071fe7bb3..2511903912 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1712,7 +1712,7 @@ jobs:
build-prod-images-mysql-client:
timeout-minutes: 80
name: >
- Build MysQL Client PROD images (main)
+ Build MySQL Client PROD images (main)
${{needs.build-info.outputs.all-python-versions-list-as-string}}
runs-on: ${{fromJSON(needs.build-info.outputs.runs-on)}}
needs: [build-info, build-ci-images]
@@ -1746,7 +1746,7 @@ jobs:
needs.build-info.outputs.in-workflow-build == 'true' &&
needs.build-info.outputs.default-branch == 'main'
- name: >
- Build Bullseye PROD Images
+ Build MySQL Client PROD Images
${{needs.build-info.outputs.all-python-versions-list-as-string}}:${{env.IMAGE_TAG}}
uses: ./.github/actions/build-prod-images
if: >
diff --git a/Dockerfile b/Dockerfile
index 21925364cc..6627f77598 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -98,7 +98,7 @@ function get_dev_apt_deps() {
freetds-bin freetds-dev git gosu graphviz graphviz-dev krb5-user ldap-utils libffi-dev libgeos-dev \
libkrb5-dev libldap2-dev libleveldb1d libleveldb-dev libsasl2-2 libsasl2-dev libsasl2-modules \
libssl-dev libxmlsec1 libxmlsec1-dev locales lsb-release openssh-client pkgconf sasl2-bin \
-software-properties-common sqlite3 sudo unixodbc unixodbc-dev"
+software-properties-common sqlite3 sudo unixodbc unixodbc-dev zlib1g-dev"
export DEV_APT_DEPS
fi
}
diff --git a/Dockerfile.ci b/Dockerfile.ci
index 7991df99ac..ec752740a0 100644
--- a/Dockerfile.ci
+++ b/Dockerfile.ci
@@ -58,7 +58,7 @@ function get_dev_apt_deps() {
freetds-bin freetds-dev git gosu graphviz graphviz-dev krb5-user ldap-utils libffi-dev libgeos-dev \
libkrb5-dev libldap2-dev libleveldb1d libleveldb-dev libsasl2-2 libsasl2-dev libsasl2-modules \
libssl-dev libxmlsec1 libxmlsec1-dev locales lsb-release openssh-client pkgconf sasl2-bin \
-software-properties-common sqlite3 sudo unixodbc unixodbc-dev"
+software-properties-common sqlite3 sudo unixodbc unixodbc-dev zlib1g-dev"
export DEV_APT_DEPS
fi
}
diff --git a/scripts/docker/install_os_dependencies.sh b/scripts/docker/install_os_dependencies.sh
index 318add1435..5d53867643 100644
--- a/scripts/docker/install_os_dependencies.sh
+++ b/scripts/docker/install_os_dependencies.sh
@@ -40,7 +40,7 @@ function get_dev_apt_deps() {
freetds-bin freetds-dev git gosu graphviz graphviz-dev krb5-user ldap-utils libffi-dev libgeos-dev \
libkrb5-dev libldap2-dev libleveldb1d libleveldb-dev libsasl2-2 libsasl2-dev libsasl2-modules \
libssl-dev libxmlsec1 libxmlsec1-dev locales lsb-release openssh-client pkgconf sasl2-bin \
-software-properties-common sqlite3 sudo unixodbc unixodbc-dev"
+software-properties-common sqlite3 sudo unixodbc unixodbc-dev zlib1g-dev"
export DEV_APT_DEPS
fi
}
(airflow) 17/27: Add feture of "not-ready" provider. (#36391)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 0db3bc6b53cdb86720900418b63f515b76db46f8
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Sat Dec 23 19:49:15 2023 +0100
Add feture of "not-ready" provider. (#36391)
This PR adds possibility of marking the provider as "not ready" in the
provider.yaml (by setting optional field as "not-ready" to `true".
Setting provider as "not-ready", removes it by default from all the
release management commands - preparing documentation files preparing
provider packages, publishing docs.
You can include such providers via `--include-not-ready-providers`
flag (or setting INCLUDE_NOT_READY_PROVIDERS environment variable to
true).
This flag is set to True in our CI, so that we can make sure the
providers in-progress are also being tested and verified, but when
release manager prepares packages, those providers are not prepared.
That will help in early stage of a lifecycle of a provider when we
already want to iterate and test it continuously, but - for example
the API of such provider is not yet stable or when we are in progress
of moving functionality for such provider from core.
This PR also marks `fab` providers as "not-ready" as it is still
early days and we want to exclude it for now from any kind of release
process.
(cherry picked from commit 341d5b747db78b9be00d5d5dc491e37d413570da)
---
.github/workflows/build-images.yml | 1 +
.github/workflows/ci.yml | 1 +
airflow/provider.yaml.schema.json | 4 ++
dev/README_RELEASE_PROVIDER_PACKAGES.md | 52 ++++++++++++++++++++
.../src/airflow_breeze/commands/common_options.py | 11 ++++-
.../airflow_breeze/commands/developer_commands.py | 7 ++-
.../commands/developer_commands_config.py | 1 +
.../commands/release_management_commands.py | 35 ++++++++++++--
.../commands/release_management_commands_config.py | 4 ++
.../prepare_providers/provider_packages.py | 14 ++++--
dev/breeze/src/airflow_breeze/utils/packages.py | 24 +++++++++-
images/breeze/output_build-docs.svg | 54 ++++++++++++---------
images/breeze/output_build-docs.txt | 2 +-
...tput_release-management_add-back-references.svg | 26 +++++-----
...tput_release-management_add-back-references.txt | 2 +-
...elease-management_install-provider-packages.txt | 2 +-
...e-management_prepare-provider-documentation.svg | 54 +++++++++++----------
...e-management_prepare-provider-documentation.txt | 2 +-
...elease-management_prepare-provider-packages.svg | 36 +++++++-------
...elease-management_prepare-provider-packages.txt | 2 +-
.../output_release-management_publish-docs.svg | 56 ++++++++++++----------
.../output_release-management_publish-docs.txt | 2 +-
...release-management_verify-provider-packages.txt | 2 +-
images/breeze/output_shell.txt | 2 +-
images/breeze/output_start-airflow.txt | 2 +-
25 files changed, 275 insertions(+), 123 deletions(-)
diff --git a/.github/workflows/build-images.yml b/.github/workflows/build-images.yml
index 82cc6e5987..8ea80a9ac6 100644
--- a/.github/workflows/build-images.yml
+++ b/.github/workflows/build-images.yml
@@ -259,6 +259,7 @@ jobs:
RUNS_ON: "${{ needs.build-info.outputs.runs-on }}"
BACKEND: sqlite
VERSION_SUFFIX_FOR_PYPI: "dev0"
+ INCLUDE_NOT_READY_PROVIDERS: "true"
steps:
- name: Cleanup repo
run: docker run -v "${GITHUB_WORKSPACE}:/workspace" -u 0:0 bash -c "rm -rf /workspace/*"
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 0c4962ff06..5071fe7bb3 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -49,6 +49,7 @@ env:
IMAGE_TAG: "${{ github.event.pull_request.head.sha || github.sha }}"
USE_SUDO: "true"
INCLUDE_SUCCESS_OUTPUTS: "true"
+ INCLUDE_NOT_READY_PROVIDERS: "true"
AIRFLOW_ENABLE_AIP_44: "true"
MOUNT_SOURCES: "skip"
diff --git a/airflow/provider.yaml.schema.json b/airflow/provider.yaml.schema.json
index be589f5490..d811f7318d 100644
--- a/airflow/provider.yaml.schema.json
+++ b/airflow/provider.yaml.schema.json
@@ -29,6 +29,10 @@
"description": "If set to true, the provider is also removed and will be soon removed from the code",
"type:": "boolean"
},
+ "not-ready": {
+ "description": "If set to true, the provider is not included by default in release commands - for example when provider release or documentation is being prepared (not-ready providers are enabled in CI by default)",
+ "type:": "boolean"
+ },
"dependencies": {
"description": "Dependencies that should be added to the provider",
"type": "array",
diff --git a/dev/README_RELEASE_PROVIDER_PACKAGES.md b/dev/README_RELEASE_PROVIDER_PACKAGES.md
index 2c7830a413..e53ef22d1a 100644
--- a/dev/README_RELEASE_PROVIDER_PACKAGES.md
+++ b/dev/README_RELEASE_PROVIDER_PACKAGES.md
@@ -25,6 +25,7 @@
- [Bump min Airflow version for providers](#bump-min-airflow-version-for-providers)
- [Decide when to release](#decide-when-to-release)
- [Provider packages versioning](#provider-packages-versioning)
+- [Possible states of provider packages](#possible-states-of-provider-packages)
- [Prepare Regular Provider packages (RC)](#prepare-regular-provider-packages-rc)
- [Increasing version number](#increasing-version-number)
- [Generate release notes](#generate-release-notes)
@@ -122,6 +123,57 @@ packages.
Details about maintaining the SEMVER version are going to be discussed and implemented in
[the related issue](https://github.com/apache/airflow/issues/11425)
+# Possible states of provider packages
+
+The provider packages can be in one of several states.
+
+* The `ready` state the provider package is released as part of the regular release cycle (including the
+ documentation, package building and publishing). This is the default state for all providers.
+* The `not-ready` state is when the provider has `not-ready` field set to `true` in the `provider.yaml` file.
+ This is usually used when the provider has some in-progress changes (usually API changes) that we do not
+ want to release yet as part of the regular release cycle. Providers in this state are excluded from being
+ released as part of the regular release cycle (including documentation building). You can build and prepare
+ such provider when you explicitly specify it as argument of a release command or by passing
+ `--include-not-ready-providers` flag in corresponding command. The `not-ready` providers are treated as
+ regular providers when it comes to running tests and preparing and releasing packages in `CI` - as we want
+ to make sure they are properly releasable any time and we want them to contribute to dependencies and we
+ want to test them.
+* The `suspended` state is when the provider has `suspended` field set to `true` in the `provider.yaml` file.
+ This is used when we have a good reason to suspend such provider, following the devlist discussion and
+ vote or "lazy consensus". The process of suspension is described in [Provider's docs](../PROVIDERS.rst).
+ The `suspended` providers are excluded from being released as part of the regular release cycle (including
+ documentation building) but also they do not contribute dependencies to the CI image and their tests are
+ not run in CI process. You can build and prepare such provider when you explicitly specify it as argument
+ of a release command or by passing `--include-suspended-providers` flag in corresponding command (but it
+ might or might not work at any time as the provider release commands are not regularly run on CI for the
+ suspended providers). The `suspended` providers are not released as part of the regular release cycle.
+* The `removed` state is when the provider is marked as `removed` - usually after some period of time being
+ `suspended`. This is a temporary state after the provider has been voted (or agreed in "lazy consensus") to
+ be removed and it is only used for exactly one release cycle - in order to produce the final version of
+ the package - identical to the previous version with the exception of the removal notice. The process
+ of removal is described in [Provider's docs](../PROVIDERS.rst). The `removed` providers are included in
+ the regular release cycle (including documentation building) because the `--include-removed-providers`
+ flag is passed to commands that release manager runs (see below). The difference between `suspended`
+ and `removed` providers is that additional information is added to their documentation about the provider
+ not being maintained any more by the community.
+
+This graph shows the possible transitions between the states:
+
+```mermaid
+graph TD;
+ new[/new/]
+ new -- Add to the code -->ready;
+ ready
+ ready-- Mark as not ready -->not-ready;
+ not-ready-- Mark as ready -->ready;
+ ready-- Suspend -->suspended;
+ suspended-- Resume -->ready;
+ ready-- Mark as removed -->removed;
+ suspended-- Mark as removed -->removed;
+ gone[\gone\]
+ removed -- Remove from the code --> gone;
+```
+
# Prepare Regular Provider packages (RC)
## Increasing version number
diff --git a/dev/breeze/src/airflow_breeze/commands/common_options.py b/dev/breeze/src/airflow_breeze/commands/common_options.py
index 5cb8c771f8..12d0ee77b8 100644
--- a/dev/breeze/src/airflow_breeze/commands/common_options.py
+++ b/dev/breeze/src/airflow_breeze/commands/common_options.py
@@ -74,7 +74,10 @@ argument_doc_packages = click.argument(
required=False,
type=NotVerifiedBetterChoice(
get_available_packages(
- include_non_provider_doc_packages=True, include_all_providers=True, include_removed=True
+ include_non_provider_doc_packages=True,
+ include_all_providers=True,
+ include_removed=True,
+ include_not_ready=True,
)
),
)
@@ -189,6 +192,12 @@ option_include_removed_providers = click.option(
is_flag=True,
envvar="INCLUDE_REMOVED_PROVIDERS",
)
+option_include_not_ready_providers = click.option(
+ "--include-not-ready-providers",
+ help="Whether to include providers that are not yet ready to be released.",
+ is_flag=True,
+ envvar="INCLUDE_NOT_READY_PROVIDERS",
+)
option_include_success_outputs = click.option(
"--include-success-outputs",
help="Whether to include outputs of successful parallel runs (skipped by default).",
diff --git a/dev/breeze/src/airflow_breeze/commands/developer_commands.py b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
index a30184ab68..fcc9bd57ce 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
@@ -44,6 +44,7 @@ from airflow_breeze.commands.common_options import (
option_forward_credentials,
option_github_repository,
option_image_tag_for_running,
+ option_include_not_ready_providers,
option_include_removed_providers,
option_installation_package_format,
option_integration,
@@ -590,6 +591,7 @@ def start_airflow(
@click.option("-d", "--docs-only", help="Only build documentation.", is_flag=True)
@option_dry_run
@option_github_repository
+@option_include_not_ready_providers
@option_include_removed_providers
@click.option(
"--one-pass-only",
@@ -612,6 +614,7 @@ def build_docs(
clean_build: bool,
docs_only: bool,
github_repository: str,
+ include_not_ready_providers: bool,
include_removed_providers: bool,
one_pass_only: bool,
package_filter: tuple[str, ...],
@@ -640,7 +643,9 @@ def build_docs(
spellcheck_only=spellcheck_only,
one_pass_only=one_pass_only,
short_doc_packages=expand_all_provider_packages(
- doc_packages, include_removed=include_removed_providers
+ short_doc_packages=doc_packages,
+ include_removed=include_removed_providers,
+ include_not_ready=include_not_ready_providers,
),
)
cmd = "/opt/airflow/scripts/in_container/run_docs_build.sh " + " ".join(
diff --git a/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py b/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py
index 13f3d518c3..7fba31b8b0 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py
@@ -294,6 +294,7 @@ DEVELOPER_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
"--clean-build",
"--one-pass-only",
"--package-filter",
+ "--include-not-ready-providers",
"--include-removed-providers",
"--github-repository",
"--builder",
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 fba5855ef1..21a2e17987 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -46,6 +46,7 @@ from airflow_breeze.commands.common_options import (
option_github_repository,
option_historical_python_version,
option_image_tag_for_running,
+ option_include_not_ready_providers,
option_include_removed_providers,
option_include_success_outputs,
option_installation_package_format,
@@ -153,7 +154,7 @@ argument_provider_packages = click.argument(
"provider_packages",
nargs=-1,
required=False,
- type=NotVerifiedBetterChoice(get_available_packages(include_removed=False)),
+ type=NotVerifiedBetterChoice(get_available_packages(include_removed=False, include_not_ready=False)),
)
option_airflow_site_directory = click.option(
"-a",
@@ -346,6 +347,7 @@ def provider_action_summary(description: str, message_type: MessageType, package
@argument_provider_packages
@option_answer
@option_dry_run
+@option_include_not_ready_providers
@option_include_removed_providers
@click.option(
"--non-interactive",
@@ -368,6 +370,7 @@ def provider_action_summary(description: str, message_type: MessageType, package
def prepare_provider_documentation(
base_branch: str,
github_repository: str,
+ include_not_ready_providers: bool,
include_removed_providers: bool,
non_interactive: bool,
only_min_version_update: bool,
@@ -390,7 +393,9 @@ def prepare_provider_documentation(
fix_ownership_using_docker()
cleanup_python_generated_files()
if not provider_packages:
- provider_packages = get_available_packages(include_removed=include_removed_providers)
+ provider_packages = get_available_packages(
+ include_removed=include_removed_providers, include_not_ready=include_not_ready_providers
+ )
if not skip_git_fetch:
run_command(["git", "remote", "rm", "apache-https-for-providers"], check=False, stderr=DEVNULL)
@@ -520,12 +525,14 @@ def basic_provider_checks(provider_package_id: str) -> dict[str, Any]:
)
@option_dry_run
@option_github_repository
+@option_include_not_ready_providers
@option_include_removed_providers
@argument_provider_packages
@option_verbose
def prepare_provider_packages(
clean_dist: bool,
github_repository: str,
+ include_not_ready_providers: bool,
include_removed_providers: bool,
package_format: str,
package_list_file: IO | None,
@@ -538,7 +545,10 @@ def prepare_provider_packages(
fix_ownership_using_docker()
cleanup_python_generated_files()
packages_list = get_packages_list_to_act_on(
- package_list_file, provider_packages, include_removed_providers
+ package_list_file=package_list_file,
+ provider_packages=provider_packages,
+ include_removed=include_removed_providers,
+ include_not_ready=include_not_ready_providers,
)
if not skip_tag_check:
run_command(["git", "remote", "rm", "apache-https-for-providers"], check=False, stderr=DEVNULL)
@@ -1145,6 +1155,7 @@ def run_publish_docs_in_parallel(
@option_airflow_site_directory
@option_debug_resources
@option_dry_run
+@option_include_not_ready_providers
@option_include_removed_providers
@option_include_success_outputs
@click.option("-s", "--override-versioned", help="Overrides versioned directories.", is_flag=True)
@@ -1165,6 +1176,7 @@ def publish_docs(
debug_resources: bool,
doc_packages: tuple[str, ...],
include_success_outputs: bool,
+ include_not_ready_providers: bool,
include_removed_providers: bool,
override_versioned: bool,
package_filter: tuple[str, ...],
@@ -1180,7 +1192,11 @@ def publish_docs(
)
current_packages = find_matching_long_package_names(
- short_packages=expand_all_provider_packages(doc_packages, include_removed=include_removed_providers),
+ short_packages=expand_all_provider_packages(
+ short_doc_packages=doc_packages,
+ include_removed=include_removed_providers,
+ include_not_ready=include_not_ready_providers,
+ ),
filters=package_filter,
)
print(f"Publishing docs for {len(current_packages)} package(s)")
@@ -1209,12 +1225,14 @@ def publish_docs(
help="Command to add back references for documentation to make it backward compatible.",
)
@option_airflow_site_directory
+@option_include_not_ready_providers
@option_include_removed_providers
@argument_doc_packages
@option_dry_run
@option_verbose
def add_back_references(
airflow_site_directory: str,
+ include_not_ready_providers: bool,
include_removed_providers: bool,
doc_packages: tuple[str, ...],
):
@@ -1232,7 +1250,14 @@ def add_back_references(
)
sys.exit(1)
start_generating_back_references(
- site_path, list(expand_all_provider_packages(doc_packages, include_removed=include_removed_providers))
+ site_path,
+ list(
+ expand_all_provider_packages(
+ short_doc_packages=doc_packages,
+ include_removed=include_removed_providers,
+ include_not_ready=include_not_ready_providers,
+ )
+ ),
)
diff --git a/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py b/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
index 1e24023159..1dfa78f3aa 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
@@ -132,6 +132,7 @@ RELEASE_MANAGEMENT_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
"options": [
"--clean-dist",
"--github-repository",
+ "--include-not-ready-providers",
"--include-removed-providers",
"--package-format",
"--package-list-file",
@@ -147,6 +148,7 @@ RELEASE_MANAGEMENT_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
"options": [
"--base-branch",
"--github-repository",
+ "--include-not-ready-providers",
"--include-removed-providers",
"--non-interactive",
"--only-min-version-update",
@@ -197,6 +199,7 @@ RELEASE_MANAGEMENT_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
"name": "Publish Docs",
"options": [
"--airflow-site-directory",
+ "--include-not-ready-providers",
"--include-removed-providers",
"--override-versioned",
"--package-filter",
@@ -218,6 +221,7 @@ RELEASE_MANAGEMENT_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
"name": "Add Back References to Docs",
"options": [
"--airflow-site-directory",
+ "--include-not-ready-providers",
"--include-removed-providers",
],
},
diff --git a/dev/breeze/src/airflow_breeze/prepare_providers/provider_packages.py b/dev/breeze/src/airflow_breeze/prepare_providers/provider_packages.py
index b9b79f3654..231bb7ff87 100644
--- a/dev/breeze/src/airflow_breeze/prepare_providers/provider_packages.py
+++ b/dev/breeze/src/airflow_breeze/prepare_providers/provider_packages.py
@@ -22,12 +22,13 @@ import subprocess
import sys
from pathlib import Path
from shutil import copytree, rmtree
-from typing import IO, Any
+from typing import Any, TextIO
from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.packages import (
get_available_packages,
get_latest_provider_tag,
+ get_not_ready_provider_ids,
get_provider_details,
get_provider_jinja_context,
get_removed_provider_ids,
@@ -228,7 +229,10 @@ def move_built_packages_and_cleanup(
def get_packages_list_to_act_on(
- package_list_file: IO | None, provider_packages: tuple[str, ...], include_removed: bool = False
+ package_list_file: TextIO | None,
+ provider_packages: tuple[str, ...],
+ include_not_ready: bool = False,
+ include_removed: bool = False,
) -> list[str]:
if package_list_file and provider_packages:
get_console().print(
@@ -237,11 +241,13 @@ def get_packages_list_to_act_on(
sys.exit(1)
if package_list_file:
removed_provider_ids = get_removed_provider_ids()
+ not_ready_provider_ids = get_not_ready_provider_ids()
return [
package.strip()
for package in package_list_file.readlines()
- if package.strip() not in removed_provider_ids
+ if (package.strip() not in removed_provider_ids or include_removed)
+ and (package.strip() not in not_ready_provider_ids or include_not_ready)
]
elif provider_packages:
return list(provider_packages)
- return get_available_packages(include_removed=include_removed)
+ return get_available_packages(include_removed=include_removed, include_not_ready=include_not_ready)
diff --git a/dev/breeze/src/airflow_breeze/utils/packages.py b/dev/breeze/src/airflow_breeze/utils/packages.py
index 63c1f25728..59fe46f2e2 100644
--- a/dev/breeze/src/airflow_breeze/utils/packages.py
+++ b/dev/breeze/src/airflow_breeze/utils/packages.py
@@ -228,6 +228,15 @@ def get_removed_provider_ids() -> list[str]:
]
+@lru_cache
+def get_not_ready_provider_ids() -> list[str]:
+ return [
+ provider_id
+ for provider_id, provider_metadata in get_provider_packages_metadata().items()
+ if provider_metadata.get("not-ready", False)
+ ]
+
+
def get_provider_requirements(provider_id: str) -> list[str]:
package_metadata = get_provider_packages_metadata().get(provider_id)
return package_metadata["dependencies"] if package_metadata else []
@@ -239,6 +248,7 @@ def get_available_packages(
include_all_providers: bool = False,
include_suspended: bool = False,
include_removed: bool = False,
+ include_not_ready: bool = False,
) -> list[str]:
"""
Return provider ids for all packages that are available currently (not suspended).
@@ -246,6 +256,7 @@ def get_available_packages(
:rtype: object
:param include_suspended: whether the suspended packages should be included
:param include_removed: whether the removed packages should be included
+ :param include_not_ready: whether the not-ready ppackages should be included
:param include_non_provider_doc_packages: whether the non-provider doc packages should be included
(packages like apache-airflow, helm-chart, docker-stack)
:param include_all_providers: whether "all-providers" should be included ni the list.
@@ -253,6 +264,11 @@ def get_available_packages(
"""
provider_ids: list[str] = list(json.loads(PROVIDER_DEPENDENCIES_JSON_FILE_PATH.read_text()).keys())
available_packages = []
+ not_ready_provider_ids = get_not_ready_provider_ids()
+ if not include_not_ready:
+ provider_ids = [
+ provider_id for provider_id in provider_ids if provider_id not in not_ready_provider_ids
+ ]
if include_non_provider_doc_packages:
available_packages.extend(REGULAR_DOC_PACKAGES)
if include_all_providers:
@@ -266,12 +282,16 @@ def get_available_packages(
def expand_all_provider_packages(
- short_doc_packages: tuple[str, ...], include_removed: bool = False
+ short_doc_packages: tuple[str, ...],
+ include_removed: bool = False,
+ include_not_ready: bool = False,
) -> tuple[str, ...]:
"""In case there are "all-providers" in the list, expand the list with all providers."""
if "all-providers" in short_doc_packages:
packages = [package for package in short_doc_packages if package != "all-providers"]
- packages.extend(get_available_packages(include_removed=include_removed))
+ packages.extend(
+ get_available_packages(include_removed=include_removed, include_not_ready=include_not_ready)
+ )
short_doc_packages = tuple(set(packages))
return short_doc_packages
diff --git a/images/breeze/output_build-docs.svg b/images/breeze/output_build-docs.svg
index 9d606635f6..31dbcd785b 100644
--- a/images/breeze/output_build-docs.svg
+++ b/images/breeze/output_build-docs.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 952.8" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1001.5999999999999" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -44,7 +44,7 @@
<defs>
<clipPath id="breeze-build-docs-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="901.8" />
+ <rect x="0" y="0" width="1463.0" height="950.5999999999999" />
</clipPath>
<clipPath id="breeze-build-docs-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -154,9 +154,15 @@
<clipPath id="breeze-build-docs-line-35">
<rect x="0" y="855.5" width="1464" height="24.65"/>
</clipPath>
+<clipPath id="breeze-build-docs-line-36">
+ <rect x="0" y="879.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-build-docs-line-37">
+ <rect x="0" y="904.3" width="1464" height="24.65"/>
+ </clipPath>
</defs>
- <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="950.8" rx="8"/><text class="breeze-build-docs-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: build-docs</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="999.6" rx="8"/><text class="breeze-build-docs-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: build-docs</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -183,26 +189,28 @@
</text><text class="breeze-build-docs-r1" x="12.2" y="361.6" textLength="195.2" clip-path="url(#breeze-build-docs-line-14)">Build documents.</text><text class="breeze-build-docs-r1" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-14)">
</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-r5" x="0" y="410.4" textLength="24.4" clip-path="url(#breeze-build-docs-line-16)">â•─</text><text class="breeze-build-docs-r5" x="24.4" y="410.4" textLength="134.2" clip-path="url(#breeze-build-docs-line-16)"> Doc flags </text><text class="breeze-build-docs-r5" x="158.6" y="410.4" textLength="1281" clip-path="url(#breeze-build-docs-line-16)">──────────────────────────────────────────────────────────────────────────────────────────────── [...]
-</text><text class="breeze-build-docs-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-17)">│</text><text class="breeze-build-docs-r4" x="24.4" y="434.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-17)">-</text><text class="breeze-build-docs-r4" x="36.6" y="434.8" textLength="61" clip-path="url(#breeze-build-docs-line-17)">-docs</text><text class="breeze-build-docs-r4" x="97.6" y="434.8" textLength="61" clip-path="url(#breeze-build-docs-line-17)"> [...]
-</text><text class="breeze-build-docs-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-18)">│</text><text class="breeze-build-docs-r4" x="24.4" y="459.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-18)">-</text><text class="breeze-build-docs-r4" x="36.6" y="459.2" textLength="134.2" clip-path="url(#breeze-build-docs-line-18)">-spellcheck</text><text class="breeze-build-docs-r4" x="170.8" y="459.2" textLength="61" clip-path="url(#breeze-build-docs- [...]
-</text><text class="breeze-build-docs-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-19)">│</text><text class="breeze-build-docs-r4" x="24.4" y="483.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-19)">-</text><text class="breeze-build-docs-r4" x="36.6" y="483.6" textLength="73.2" clip-path="url(#breeze-build-docs-line-19)">-clean</text><text class="breeze-build-docs-r4" x="109.8" y="483.6" textLength="73.2" clip-path="url(#breeze-build-docs-line [...]
-</text><text class="breeze-build-docs-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-build-docs-line-20)">│</text><text class="breeze-build-docs-r1" x="427" y="508" textLength="1012.6" clip-path="url(#breeze-build-docs-line-20)">artifacts before the build - useful for a clean build.                         &# [...]
-</text><text class="breeze-build-docs-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-21)">│</text><text class="breeze-build-docs-r4" x="24.4" y="532.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-21)">-</text><text class="breeze-build-docs-r4" x="36.6" y="532.4" textLength="48.8" clip-path="url(#breeze-build-docs-line-21)">-one</text><text class="breeze-build-docs-r4" x="85.4" y="532.4" textLength="122" clip-path="url(#breeze-build-docs-line-21) [...]
-</text><text class="breeze-build-docs-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-22)">│</text><text class="breeze-build-docs-r4" x="24.4" y="556.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-22)">-</text><text class="breeze-build-docs-r4" x="36.6" y="556.8" textLength="97.6" clip-path="url(#breeze-build-docs-line-22)">-package</text><text class="breeze-build-docs-r4" x="134.2" y="556.8" textLength="85.4" clip-path="url(#breeze-build-docs-li [...]
-</text><text class="breeze-build-docs-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-23)">│</text><text class="breeze-build-docs-r1" x="427" y="581.2" textLength="305" clip-path="url(#breeze-build-docs-line-23)">apache-airflow-providers-</text><text class="breeze-build-docs-r7" x="732" y="581.2" textLength="122" clip-path="url(#breeze-build-docs-line-23)"><provider></text><text class="breeze-build-docs-r1" x="854" y="581.2" textLength="585.6" clip-path [...]
-</text><text class="breeze-build-docs-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-24)">│</text><text class="breeze-build-docs-r1" x="427" y="605.6" textLength="939.4" clip-path="url(#breeze-build-docs-line-24)">matching the full package name. The list of short hand names can be found in </text><text class="breeze-build-docs-r4" x="1366.4" y="605.6" textLength="12.2" clip-path="url( [...]
-</text><text class="breeze-build-docs-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-build-docs-line-25)">│</text><text class="breeze-build-docs-r1" x="427" y="630" textLength="1012.6" clip-path="url(#breeze-build-docs-line-25)">output                                          [...]
-</text><text class="breeze-build-docs-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-26)">│</text><text class="breeze-build-docs-r8" x="427" y="654.4" textLength="1012.6" clip-path="url(#breeze-build-docs-line-26)">(TEXT)                                        & [...]
-</text><text class="breeze-build-docs-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-27)">│</text><text class="breeze-build-docs-r4" x="24.4" y="678.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-27)">-</text><text class="breeze-build-docs-r4" x="36.6" y="678.8" textLength="97.6" clip-path="url(#breeze-build-docs-line-27)">-include</text><text class="breeze-build-docs-r4" x="134.2" y="678.8" textLength="219.6" clip-path="url(#breeze-build-docs-l [...]
-</text><text class="breeze-build-docs-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-28)">│</text><text class="breeze-build-docs-r4" x="24.4" y="703.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-28)">-</text><text class="breeze-build-docs-r4" x="36.6" y="703.2" textLength="85.4" clip-path="url(#breeze-build-docs-line-28)">-github</text><text class="breeze-build-docs-r4" x="122" y="703.2" textLength="134.2" clip-path="url(#breeze-build-docs-line [...]
-</text><text class="breeze-build-docs-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-29)">│</text><text class="breeze-build-docs-r4" x="24.4" y="727.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-29)">-</text><text class="breeze-build-docs-r4" x="36.6" y="727.6" textLength="97.6" clip-path="url(#breeze-build-docs-line-29)">-builder</text><text class="breeze-build-docs-r1" x="427" y="727.6" textLength="756.4" clip-path="url(#breeze-build-docs-lin [...]
-</text><text class="breeze-build-docs-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-build-docs-line-30)">│</text><text class="breeze-build-docs-r5" x="427" y="752" textLength="756.4" clip-path="url(#breeze-build-docs-line-30)">[default: autodetect]                                      [...]
-</text><text class="breeze-build-docs-r5" x="0" y="776.4" textLength="1464" clip-path="url(#breeze-build-docs-line-31)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-build-docs-r1" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-31)">
-</text><text class="breeze-build-docs-r5" x="0" y="800.8" textLength="24.4" clip-path="url(#breeze-build-docs-line-32)">â•─</text><text class="breeze-build-docs-r5" x="24.4" y="800.8" textLength="195.2" clip-path="url(#breeze-build-docs-line-32)"> Common options </text><text class="breeze-build-docs-r5" x="219.6" y="800.8" textLength="1220" clip-path="url(#breeze-build-docs-line-32)">─────────────────────────────────────────────────────────────────────────────────────────── [...]
-</text><text class="breeze-build-docs-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-33)">│</text><text class="breeze-build-docs-r4" x="24.4" y="825.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-33)">-</text><text class="breeze-build-docs-r4" x="36.6" y="825.2" textLength="48.8" clip-path="url(#breeze-build-docs-line-33)">-dry</text><text class="breeze-build-docs-r4" x="85.4" y="825.2" textLength="48.8" clip-path="url(#breeze-build-docs-line-33 [...]
-</text><text class="breeze-build-docs-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-34)">│</text><text class="breeze-build-docs-r4" x="24.4" y="849.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-34)">-</text><text class="breeze-build-docs-r4" x="36.6" y="849.6" textLength="97.6" clip-path="url(#breeze-build-docs-line-34)">-verbose</text><text class="breeze-build-docs-r6" x="158.6" y="849.6" textLength="24.4" clip-path="url(#breeze-build-docs-li [...]
-</text><text class="breeze-build-docs-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-build-docs-line-35)">│</text><text class="breeze-build-docs-r4" x="24.4" y="874" textLength="12.2" clip-path="url(#breeze-build-docs-line-35)">-</text><text class="breeze-build-docs-r4" x="36.6" y="874" textLength="61" clip-path="url(#breeze-build-docs-line-35)">-help</text><text class="breeze-build-docs-r6" x="158.6" y="874" textLength="24.4" clip-path="url(#breeze-build-docs-line-35)">-h</t [...]
-</text><text class="breeze-build-docs-r5" x="0" y="898.4" textLength="1464" clip-path="url(#breeze-build-docs-line-36)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-build-docs-r1" x="1464" y="898.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-36)">
+</text><text class="breeze-build-docs-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-17)">│</text><text class="breeze-build-docs-r4" x="24.4" y="434.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-17)">-</text><text class="breeze-build-docs-r4" x="36.6" y="434.8" textLength="61" clip-path="url(#breeze-build-docs-line-17)">-docs</text><text class="breeze-build-docs-r4" x="97.6" y="434.8" textLength="61" clip-path="url(#breeze-build-docs-line-17)"> [...]
+</text><text class="breeze-build-docs-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-18)">│</text><text class="breeze-build-docs-r4" x="24.4" y="459.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-18)">-</text><text class="breeze-build-docs-r4" x="36.6" y="459.2" textLength="134.2" clip-path="url(#breeze-build-docs-line-18)">-spellcheck</text><text class="breeze-build-docs-r4" x="170.8" y="459.2" textLength="61" clip-path="url(#breeze-build-docs- [...]
+</text><text class="breeze-build-docs-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-19)">│</text><text class="breeze-build-docs-r4" x="24.4" y="483.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-19)">-</text><text class="breeze-build-docs-r4" x="36.6" y="483.6" textLength="73.2" clip-path="url(#breeze-build-docs-line-19)">-clean</text><text class="breeze-build-docs-r4" x="109.8" y="483.6" textLength="73.2" clip-path="url(#breeze-build-docs-line [...]
+</text><text class="breeze-build-docs-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-build-docs-line-20)">│</text><text class="breeze-build-docs-r1" x="451.4" y="508" textLength="988.2" clip-path="url(#breeze-build-docs-line-20)">artifacts before the build - useful for a clean build.                         & [...]
+</text><text class="breeze-build-docs-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-21)">│</text><text class="breeze-build-docs-r4" x="24.4" y="532.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-21)">-</text><text class="breeze-build-docs-r4" x="36.6" y="532.4" textLength="48.8" clip-path="url(#breeze-build-docs-line-21)">-one</text><text class="breeze-build-docs-r4" x="85.4" y="532.4" textLength="122" clip-path="url(#breeze-build-docs-line-21) [...]
+</text><text class="breeze-build-docs-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-22)">│</text><text class="breeze-build-docs-r1" x="451.4" y="556.8" textLength="988.2" clip-path="url(#breeze-build-docs-line-22)">errors.                                         [...]
+</text><text class="breeze-build-docs-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-23)">│</text><text class="breeze-build-docs-r4" x="24.4" y="581.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-23)">-</text><text class="breeze-build-docs-r4" x="36.6" y="581.2" textLength="97.6" clip-path="url(#breeze-build-docs-line-23)">-package</text><text class="breeze-build-docs-r4" x="134.2" y="581.2" textLength="85.4" clip-path="url(#breeze-build-docs-li [...]
+</text><text class="breeze-build-docs-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-24)">│</text><text class="breeze-build-docs-r1" x="451.4" y="605.6" textLength="305" clip-path="url(#breeze-build-docs-line-24)">apache-airflow-providers-</text><text class="breeze-build-docs-r7" x="756.4" y="605.6" textLength="122" clip-path="url(#breeze-build-docs-line-24)"><provider></text><text class="breeze-build-docs-r1" x="878.4" y="605.6" textLength="561.2" cli [...]
+</text><text class="breeze-build-docs-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-build-docs-line-25)">│</text><text class="breeze-build-docs-r1" x="451.4" y="630" textLength="988.2" clip-path="url(#breeze-build-docs-line-25)">matching the full package name. The list of short hand names can be found in     </text><text class="breeze-build-docs-r5" x="1451.8" y="630" textLength="1 [...]
+</text><text class="breeze-build-docs-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-26)">│</text><text class="breeze-build-docs-r4" x="451.4" y="654.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-26)">-</text><text class="breeze-build-docs-r4" x="463.6" y="654.4" textLength="61" clip-path="url(#breeze-build-docs-line-26)">-help</text><text class="breeze-build-docs-r1" x="524.6" y="654.4" textLength="915" clip-path="url(#breeze-build-docs-line-2 [...]
+</text><text class="breeze-build-docs-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-27)">│</text><text class="breeze-build-docs-r8" x="451.4" y="678.8" textLength="988.2" clip-path="url(#breeze-build-docs-line-27)">(TEXT)                                         [...]
+</text><text class="breeze-build-docs-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-28)">│</text><text class="breeze-build-docs-r4" x="24.4" y="703.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-28)">-</text><text class="breeze-build-docs-r4" x="36.6" y="703.2" textLength="97.6" clip-path="url(#breeze-build-docs-line-28)">-include</text><text class="breeze-build-docs-r4" x="134.2" y="703.2" textLength="244" clip-path="url(#breeze-build-docs-lin [...]
+</text><text class="breeze-build-docs-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-29)">│</text><text class="breeze-build-docs-r4" x="24.4" y="727.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-29)">-</text><text class="breeze-build-docs-r4" x="36.6" y="727.6" textLength="97.6" clip-path="url(#breeze-build-docs-line-29)">-include</text><text class="breeze-build-docs-r4" x="134.2" y="727.6" textLength="219.6" clip-path="url(#breeze-build-docs-l [...]
+</text><text class="breeze-build-docs-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-build-docs-line-30)">│</text><text class="breeze-build-docs-r4" x="24.4" y="752" textLength="12.2" clip-path="url(#breeze-build-docs-line-30)">-</text><text class="breeze-build-docs-r4" x="36.6" y="752" textLength="85.4" clip-path="url(#breeze-build-docs-line-30)">-github</text><text class="breeze-build-docs-r4" x="122" y="752" textLength="134.2" clip-path="url(#breeze-build-docs-line-30)">-r [...]
+</text><text class="breeze-build-docs-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-31)">│</text><text class="breeze-build-docs-r4" x="24.4" y="776.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-31)">-</text><text class="breeze-build-docs-r4" x="36.6" y="776.4" textLength="97.6" clip-path="url(#breeze-build-docs-line-31)">-builder</text><text class="breeze-build-docs-r1" x="451.4" y="776.4" textLength="756.4" clip-path="url(#breeze-build-docs-l [...]
+</text><text class="breeze-build-docs-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-32)">│</text><text class="breeze-build-docs-r5" x="451.4" y="800.8" textLength="756.4" clip-path="url(#breeze-build-docs-line-32)">[default: autodetect]                                     [...]
+</text><text class="breeze-build-docs-r5" x="0" y="825.2" textLength="1464" clip-path="url(#breeze-build-docs-line-33)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-build-docs-r1" x="1464" y="825.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-33)">
+</text><text class="breeze-build-docs-r5" x="0" y="849.6" textLength="24.4" clip-path="url(#breeze-build-docs-line-34)">â•─</text><text class="breeze-build-docs-r5" x="24.4" y="849.6" textLength="195.2" clip-path="url(#breeze-build-docs-line-34)"> Common options </text><text class="breeze-build-docs-r5" x="219.6" y="849.6" textLength="1220" clip-path="url(#breeze-build-docs-line-34)">─────────────────────────────────────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-build-docs-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-build-docs-line-35)">│</text><text class="breeze-build-docs-r4" x="24.4" y="874" textLength="12.2" clip-path="url(#breeze-build-docs-line-35)">-</text><text class="breeze-build-docs-r4" x="36.6" y="874" textLength="48.8" clip-path="url(#breeze-build-docs-line-35)">-dry</text><text class="breeze-build-docs-r4" x="85.4" y="874" textLength="48.8" clip-path="url(#breeze-build-docs-line-35)">-run< [...]
+</text><text class="breeze-build-docs-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-36)">│</text><text class="breeze-build-docs-r4" x="24.4" y="898.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-36)">-</text><text class="breeze-build-docs-r4" x="36.6" y="898.4" textLength="97.6" clip-path="url(#breeze-build-docs-line-36)">-verbose</text><text class="breeze-build-docs-r6" x="158.6" y="898.4" textLength="24.4" clip-path="url(#breeze-build-docs-li [...]
+</text><text class="breeze-build-docs-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-37)">│</text><text class="breeze-build-docs-r4" x="24.4" y="922.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-37)">-</text><text class="breeze-build-docs-r4" x="36.6" y="922.8" textLength="61" clip-path="url(#breeze-build-docs-line-37)">-help</text><text class="breeze-build-docs-r6" x="158.6" y="922.8" textLength="24.4" clip-path="url(#breeze-build-docs-line-37 [...]
+</text><text class="breeze-build-docs-r5" x="0" y="947.2" textLength="1464" clip-path="url(#breeze-build-docs-line-38)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-build-docs-r1" x="1464" y="947.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-38)">
</text>
</g>
</g>
diff --git a/images/breeze/output_build-docs.txt b/images/breeze/output_build-docs.txt
index e512c338a7..685d1d66c1 100644
--- a/images/breeze/output_build-docs.txt
+++ b/images/breeze/output_build-docs.txt
@@ -1 +1 @@
-4661a2dc967b5fb62159ea3a3c84e73c
+2425ec92863ed22ad079d6ac19fa5075
diff --git a/images/breeze/output_release-management_add-back-references.svg b/images/breeze/output_release-management_add-back-references.svg
index 167e7b1bf9..be6c012df2 100644
--- a/images/breeze/output_release-management_add-back-references.svg
+++ b/images/breeze/output_release-management_add-back-references.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 660.0" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 684.4" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -45,7 +45,7 @@
<defs>
<clipPath id="breeze-release-management-add-back-references-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="609.0" />
+ <rect x="0" y="0" width="1463.0" height="633.4" />
</clipPath>
<clipPath id="breeze-release-management-add-back-references-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -119,9 +119,12 @@
<clipPath id="breeze-release-management-add-back-references-line-23">
<rect x="0" y="562.7" width="1464" height="24.65"/>
</clipPath>
+<clipPath id="breeze-release-management-add-back-references-line-24">
+ <rect x="0" y="587.1" width="1464" height="24.65"/>
+ </clipPath>
</defs>
- <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="658" rx="8"/><text class="breeze-release-management-add-back-references-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: release-management add-back-references</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="682.4" rx="8"/><text class="breeze-release-management-add-back-references-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: release-management add-back-references</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -148,14 +151,15 @@
</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="361.6" textLength="976" clip-path="url(#breeze-release-management-add-back-references-line-14)">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="361.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-14)">
</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-r5" x="0" y="410.4" textLength="24.4" clip-path="url(#breeze-release-management-add-back-references-line-16)">â•─</text><text class="breeze-release-management-add-back-references-r5" x="24.4" y="410.4" textLength="353.8" clip-path="url(#breeze-release-management-add-back-references-line-16)"> Add Back References to Docs </text><text class="breeze-release-management-add-back-references-r5" x="37 [...]
-</text><text class="breeze-release-management-add-back-references-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-17)">│</text><text class="breeze-release-management-add-back-references-r6" x="24.4" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-17)">*</text><text class="breeze-release-management-add-back-references-r4" x="61" y="434.8" textLength="12.2" clip-path="url(#breeze-release [...]
-</text><text class="breeze-release-management-add-back-references-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-18)">│</text><text class="breeze-release-management-add-back-references-r4" x="61" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-18)">-</text><text class="breeze-release-management-add-back-references-r4" x="73.2" y="459.2" textLength="97.6" clip-path="url(#breeze-release [...]
-</text><text class="breeze-release-management-add-back-references-r5" x="0" y="483.6" textLength="1464" clip-path="url(#breeze-release-management-add-back-references-line-19)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-add-back-references-r1" x="1464" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-19)">
-</text><text class="breeze-release-management-add-back-references-r5" x="0" y="508" textLength="24.4" clip-path="url(#breeze-release-management-add-back-references-line-20)">â•─</text><text class="breeze-release-management-add-back-references-r5" x="24.4" y="508" textLength="195.2" clip-path="url(#breeze-release-management-add-back-references-line-20)"> Common options </text><text class="breeze-release-management-add-back-references-r5" x="219.6" y="508" textLength="1220" c [...]
-</text><text class="breeze-release-management-add-back-references-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-21)">│</text><text class="breeze-release-management-add-back-references-r4" x="24.4" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-21)">-</text><text class="breeze-release-management-add-back-references-r4" x="36.6" y="532.4" textLength="48.8" clip-path="url(#breeze-relea [...]
-</text><text class="breeze-release-management-add-back-references-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-22)">│</text><text class="breeze-release-management-add-back-references-r4" x="24.4" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-22)">-</text><text class="breeze-release-management-add-back-references-r4" x="36.6" y="556.8" textLength="97.6" clip-path="url(#breeze-relea [...]
-</text><text class="breeze-release-management-add-back-references-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-23)">│</text><text class="breeze-release-management-add-back-references-r4" x="24.4" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-23)">-</text><text class="breeze-release-management-add-back-references-r4" x="36.6" y="581.2" textLength="61" clip-path="url(#breeze-release [...]
-</text><text class="breeze-release-management-add-back-references-r5" x="0" y="605.6" textLength="1464" clip-path="url(#breeze-release-management-add-back-references-line-24)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-add-back-references-r1" x="1464" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-24)">
+</text><text class="breeze-release-management-add-back-references-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-17)">│</text><text class="breeze-release-management-add-back-references-r6" x="24.4" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-17)">*</text><text class="breeze-release-management-add-back-references-r4" x="61" y="434.8" textLength="12.2" clip-path="url(#breeze-release [...]
+</text><text class="breeze-release-management-add-back-references-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-18)">│</text><text class="breeze-release-management-add-back-references-r4" x="61" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-18)">-</text><text class="breeze-release-management-add-back-references-r4" x="73.2" y="459.2" textLength="97.6" clip-path="url(#breeze-release [...]
+</text><text class="breeze-release-management-add-back-references-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-19)">│</text><text class="breeze-release-management-add-back-references-r4" x="61" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-19)">-</text><text class="breeze-release-management-add-back-references-r4" x="73.2" y="483.6" textLength="97.6" clip-path="url(#breeze-release [...]
+</text><text class="breeze-release-management-add-back-references-r5" x="0" y="508" textLength="1464" clip-path="url(#breeze-release-management-add-back-references-line-20)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-add-back-references-r1" x="1464" y="508" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-20)">
+</text><text class="breeze-release-management-add-back-references-r5" x="0" y="532.4" textLength="24.4" clip-path="url(#breeze-release-management-add-back-references-line-21)">â•─</text><text class="breeze-release-management-add-back-references-r5" x="24.4" y="532.4" textLength="195.2" clip-path="url(#breeze-release-management-add-back-references-line-21)"> Common options </text><text class="breeze-release-management-add-back-references-r5" x="219.6" y="532.4" textLength="1 [...]
+</text><text class="breeze-release-management-add-back-references-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-22)">│</text><text class="breeze-release-management-add-back-references-r4" x="24.4" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-22)">-</text><text class="breeze-release-management-add-back-references-r4" x="36.6" y="556.8" textLength="48.8" clip-path="url(#breeze-relea [...]
+</text><text class="breeze-release-management-add-back-references-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-23)">│</text><text class="breeze-release-management-add-back-references-r4" x="24.4" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-23)">-</text><text class="breeze-release-management-add-back-references-r4" x="36.6" y="581.2" textLength="97.6" clip-path="url(#breeze-relea [...]
+</text><text class="breeze-release-management-add-back-references-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-24)">│</text><text class="breeze-release-management-add-back-references-r4" x="24.4" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-24)">-</text><text class="breeze-release-management-add-back-references-r4" x="36.6" y="605.6" textLength="61" clip-path="url(#breeze-release [...]
+</text><text class="breeze-release-management-add-back-references-r5" x="0" y="630" textLength="1464" clip-path="url(#breeze-release-management-add-back-references-line-25)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-add-back-references-r1" x="1464" y="630" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-25)">
</text>
</g>
</g>
diff --git a/images/breeze/output_release-management_add-back-references.txt b/images/breeze/output_release-management_add-back-references.txt
index 898fef4cf5..e3586bfb8c 100644
--- a/images/breeze/output_release-management_add-back-references.txt
+++ b/images/breeze/output_release-management_add-back-references.txt
@@ -1 +1 @@
-d01fc18ce8392fc51de2742ebe85dd41
+39e64a2af8bff3aa0c951ffe72f01cb4
diff --git a/images/breeze/output_release-management_install-provider-packages.txt b/images/breeze/output_release-management_install-provider-packages.txt
index cd480d68e4..8ba3a6fe83 100644
--- a/images/breeze/output_release-management_install-provider-packages.txt
+++ b/images/breeze/output_release-management_install-provider-packages.txt
@@ -1 +1 @@
-aba68f434b87d954ad27f594031bb919
+d70adec21231406278a24f4dc9937efd
diff --git a/images/breeze/output_release-management_prepare-provider-documentation.svg b/images/breeze/output_release-management_prepare-provider-documentation.svg
index 21e781615d..561b4a627d 100644
--- a/images/breeze/output_release-management_prepare-provider-documentation.svg
+++ b/images/breeze/output_release-management_prepare-provider-documentation.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 977.1999999999999" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1001.5999999999999" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-release-management-prepare-provider-documentation-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="926.1999999999999" />
+ <rect x="0" y="0" width="1463.0" height="950.5999999999999" />
</clipPath>
<clipPath id="breeze-release-management-prepare-provider-documentation-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -156,9 +156,12 @@
<clipPath id="breeze-release-management-prepare-provider-documentation-line-36">
<rect x="0" y="879.9" width="1464" height="24.65"/>
</clipPath>
+<clipPath id="breeze-release-management-prepare-provider-documentation-line-37">
+ <rect x="0" y="904.3" width="1464" height="24.65"/>
+ </clipPath>
</defs>
- <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="975.2" rx="8"/><text class="breeze-release-management-prepare-provider-documentation-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: release-management prepare-provider-documentation</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="999.6" rx="8"/><text class="breeze-release-management-prepare-provider-documentation-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: release-management prepare-provider-documentation</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -184,28 +187,29 @@
</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="337.2" textLength="780.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-13)">Prepare CHANGELOG, README and COMMITS information for providers.</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation- [...]
</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-14)">
</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="386" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-15)">â•─</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="24.4" y="386" textLength="512.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-15)"> Provider documentation preparation flags </text><text class="breeze- [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-16)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-16)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-17)">│</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="427" y="434.8" textLength="1012.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-17)">old branch)             [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-18)">│</text><text class="breeze-release-management-prepare-provider-documentation-r6" x="427" y="459.2" textLength="1012.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-18)">(TEXT)              & [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-19)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-19)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-20)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="508" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-20)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y="50 [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-21)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-21)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-22)">│</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="427" y="556.8" textLength="1012.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-22)">confirms releasefor providers prepared for release - use [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-23)">│</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="427" y="581.2" textLength="1012.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-23)">non-interactive mode in CI.        & [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-24)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-24)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-25)">│</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="427" y="630" textLength="1012.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-25)">documentation              [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-26)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-26)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-27)">│</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="427" y="678.8" textLength="1012.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-27)">need to regenerate documentation.       & [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-28)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-28)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-29)">│</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="427" y="727.6" textLength="1012.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-29)">default, the remote is recreated and fetched to mak [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-30)">│</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="427" y="752" textLength="1012.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-30)">that recent commits are not missing       [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="776.4" textLength="1464" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-31)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provid [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="800.8" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-32)">â•─</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="24.4" y="800.8" textLength="195.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-32)"> Common options </text><text class="breeze-release-management-prepare-provi [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-33)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-33)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-34)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-34)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-35)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="874" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-35)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y="87 [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-36)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-36)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y [...]
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="922.8" textLength="1464" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-37)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="1464" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provid [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-16)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-16)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-17)">│</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="451.4" y="434.8" textLength="988.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-17)">old branch)            &# [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-18)">│</text><text class="breeze-release-management-prepare-provider-documentation-r6" x="451.4" y="459.2" textLength="988.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-18)">(TEXT)               [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-19)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-19)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-20)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="508" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-20)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y="50 [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-21)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-21)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-22)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-22)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-23)">│</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="451.4" y="581.2" textLength="988.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-23)">confirms releasefor providers prepared for release - us [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-24)">│</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="451.4" y="605.6" textLength="988.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-24)">non-interactive mode in CI.         [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-25)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-25)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y="63 [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-26)">│</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="451.4" y="654.4" textLength="988.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-26)">documentation              [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-27)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-27)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-28)">│</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="451.4" y="703.2" textLength="988.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-28)">you need to regenerate documentation.      [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-29)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-29)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-30)">│</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="451.4" y="752" textLength="988.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-30)">default, the remote is recreated and fetched to make&# [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-31)">│</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="451.4" y="776.4" textLength="988.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-31)">and that recent commits are not missing    [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="800.8" textLength="1464" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-32)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="1464" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provid [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="825.2" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-33)">â•─</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="24.4" y="825.2" textLength="195.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-33)"> Common options </text><text class="breeze-release-management-prepare-provi [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-34)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-34)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-35)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="874" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-35)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y="87 [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-36)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-36)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-37)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-37)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y [...]
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="947.2" textLength="1464" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-38)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="1464" y="947.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provid [...]
</text>
</g>
</g>
diff --git a/images/breeze/output_release-management_prepare-provider-documentation.txt b/images/breeze/output_release-management_prepare-provider-documentation.txt
index 1cab6ad197..6708878a18 100644
--- a/images/breeze/output_release-management_prepare-provider-documentation.txt
+++ b/images/breeze/output_release-management_prepare-provider-documentation.txt
@@ -1 +1 @@
-d73adb90b5bd1ea6c74c2c3ab23f10c6
+f4dbf1109bcdcca01230e5eb5331fa26
diff --git a/images/breeze/output_release-management_prepare-provider-packages.svg b/images/breeze/output_release-management_prepare-provider-packages.svg
index 9283feb0ac..970ef40924 100644
--- a/images/breeze/output_release-management_prepare-provider-packages.svg
+++ b/images/breeze/output_release-management_prepare-provider-packages.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 855.1999999999999" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 879.5999999999999" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-release-management-prepare-provider-packages-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="804.1999999999999" />
+ <rect x="0" y="0" width="1463.0" height="828.5999999999999" />
</clipPath>
<clipPath id="breeze-release-management-prepare-provider-packages-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -141,9 +141,12 @@
<clipPath id="breeze-release-management-prepare-provider-packages-line-31">
<rect x="0" y="757.9" width="1464" height="24.65"/>
</clipPath>
+<clipPath id="breeze-release-management-prepare-provider-packages-line-32">
+ <rect x="0" y="782.3" width="1464" height="24.65"/>
+ </clipPath>
</defs>
- <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="853.2" rx="8"/><text class="breeze-release-management-prepare-provider-packages-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: release-management prepare-provider-packages</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="877.6" rx="8"/><text class="breeze-release-management-prepare-provider-packages-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: release-management prepare-provider-packages</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -173,19 +176,20 @@
</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-17)">│</text><text class="breeze-release-management-prepare-provider-packages-r1" x="475.8" y="434.8" textLength="963.8" clip-path="url(#breeze-release-management-prepare-provider-packages-line-17)">multiple packages  in a clean environment       [...]
</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-18)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-18)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="459.2" textLength="85.4 [...]
</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-19)">│</text><text class="breeze-release-management-prepare-provider-packages-r5" x="475.8" y="483.6" textLength="585.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-19)">[default: apache/airflow]             &# [...]
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-20)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="508" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-20)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="508" textLength="97.6" clip [...]
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-21)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-21)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="532.4" textLength="97.6 [...]
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-22)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-22)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="556.8" textLength="97.6 [...]
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-23)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-23)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="581.2" textLength="61" [...]
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-24)">│</text><text class="breeze-release-management-prepare-provider-packages-r1" x="475.8" y="605.6" textLength="963.8" clip-path="url(#breeze-release-management-prepare-provider-packages-line-24)">debugging and developing changes to the build process.    [...]
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-25)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-25)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="630" textLength="61" clip-p [...]
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-26)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-26)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="654.4" textLength="97.6 [...]
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="678.8" textLength="1464" clip-path="url(#breeze-release-management-prepare-provider-packages-line-27)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-prepare-provider-packages-r1" x="1464" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-27)">
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="703.2" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-28)">â•─</text><text class="breeze-release-management-prepare-provider-packages-r5" x="24.4" y="703.2" textLength="195.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-28)"> Common options </text><text class="breeze-release-management-prepare-provider-packages-r5" x=" [...]
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-29)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-29)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="727.6" textLength="48.8 [...]
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-30)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="752" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-30)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="752" textLength="97.6" clip [...]
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-31)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-31)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="776.4" textLength="61" [...]
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="800.8" textLength="1464" clip-path="url(#breeze-release-management-prepare-provider-packages-line-32)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-prepare-provider-packages-r1" x="1464" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-32)">
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-20)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="508" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-20)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="508" textLength="97.6" clip [...]
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-21)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-21)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="532.4" textLength="97.6 [...]
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-22)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-22)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="556.8" textLength="97.6 [...]
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-23)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-23)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="581.2" textLength="97.6 [...]
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-24)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-24)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="605.6" textLength="61" [...]
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-25)">│</text><text class="breeze-release-management-prepare-provider-packages-r1" x="475.8" y="630" textLength="963.8" clip-path="url(#breeze-release-management-prepare-provider-packages-line-25)">debugging and developing changes to the build process.    & [...]
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-26)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-26)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="654.4" textLength="61" [...]
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-27)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-27)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="678.8" textLength="97.6 [...]
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="703.2" textLength="1464" clip-path="url(#breeze-release-management-prepare-provider-packages-line-28)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-prepare-provider-packages-r1" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-28)">
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="727.6" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-29)">â•─</text><text class="breeze-release-management-prepare-provider-packages-r5" x="24.4" y="727.6" textLength="195.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-29)"> Common options </text><text class="breeze-release-management-prepare-provider-packages-r5" x=" [...]
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-30)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="752" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-30)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="752" textLength="48.8" clip [...]
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-31)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-31)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="776.4" textLength="97.6 [...]
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-32)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-32)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="800.8" textLength="61" [...]
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="825.2" textLength="1464" clip-path="url(#breeze-release-management-prepare-provider-packages-line-33)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-prepare-provider-packages-r1" x="1464" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-33)">
</text>
</g>
</g>
diff --git a/images/breeze/output_release-management_prepare-provider-packages.txt b/images/breeze/output_release-management_prepare-provider-packages.txt
index 9cc18c5ef9..50a99b308f 100644
--- a/images/breeze/output_release-management_prepare-provider-packages.txt
+++ b/images/breeze/output_release-management_prepare-provider-packages.txt
@@ -1 +1 @@
-b2ea32dc47688c8e30624a120c6162b8
+e82f390815da62d3927de3f6cb9704f1
diff --git a/images/breeze/output_release-management_publish-docs.svg b/images/breeze/output_release-management_publish-docs.svg
index ab5135adfa..93533504ec 100644
--- a/images/breeze/output_release-management_publish-docs.svg
+++ b/images/breeze/output_release-management_publish-docs.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1026.0" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1050.4" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -46,7 +46,7 @@
<defs>
<clipPath id="breeze-release-management-publish-docs-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="975.0" />
+ <rect x="0" y="0" width="1463.0" height="999.4" />
</clipPath>
<clipPath id="breeze-release-management-publish-docs-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -165,9 +165,12 @@
<clipPath id="breeze-release-management-publish-docs-line-38">
<rect x="0" y="928.7" width="1464" height="24.65"/>
</clipPath>
+<clipPath id="breeze-release-management-publish-docs-line-39">
+ <rect x="0" y="953.1" width="1464" height="24.65"/>
+ </clipPath>
</defs>
- <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1024" rx="8"/><text class="breeze-release-management-publish-docs-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: release-management publish-docs</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1048.4" rx="8"/><text class="breeze-release-management-publish-docs-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: release-management publish-docs</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -194,29 +197,30 @@
</text><text class="breeze-release-management-publish-docs-r1" x="12.2" y="361.6" textLength="707.6" clip-path="url(#breeze-release-management-publish-docs-line-14)">Command to publish generated documentation to airflow-site</text><text class="breeze-release-management-publish-docs-r1" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-14)">
</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-r5" x="0" y="410.4" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-16)">â•─</text><text class="breeze-release-management-publish-docs-r5" x="24.4" y="410.4" textLength="170.8" clip-path="url(#breeze-release-management-publish-docs-line-16)"> Publish Docs </text><text class="breeze-release-management-publish-docs-r5" x="195.2" y="410.4" textLength="1244.4" clip-path="url(#breeze-release [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-17)">│</text><text class="breeze-release-management-publish-docs-r6" x="24.4" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-17)">*</text><text class="breeze-release-management-publish-docs-r4" x="61" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-17)"> [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-18)">│</text><text class="breeze-release-management-publish-docs-r4" x="61" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-18)">-</text><text class="breeze-release-management-publish-docs-r4" x="73.2" y="459.2" textLength="97.6" clip-path="url(#breeze-release-management-publish-docs-line-18)"> [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-19)">│</text><text class="breeze-release-management-publish-docs-r4" x="61" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-19)">-</text><text class="breeze-release-management-publish-docs-r4" x="73.2" y="483.6" textLength="109.8" clip-path="url(#breeze-release-management-publish-docs-line-19)" [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-20)">│</text><text class="breeze-release-management-publish-docs-r4" x="61" y="508" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-20)">-</text><text class="breeze-release-management-publish-docs-r4" x="73.2" y="508" textLength="97.6" clip-path="url(#breeze-release-management-publish-docs-line-20)">-packa [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-21)">│</text><text class="breeze-release-management-publish-docs-r1" x="463.6" y="532.4" textLength="305" clip-path="url(#breeze-release-management-publish-docs-line-21)">apache-airflow-providers-</text><text class="breeze-release-management-publish-docs-r10" x="768.6" y="532.4" textLength="122" clip-path="url(#breeze-release-managem [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-22)">│</text><text class="breeze-release-management-publish-docs-r1" x="463.6" y="556.8" textLength="976" clip-path="url(#breeze-release-management-publish-docs-line-22)">matching the full package name. The list of short hand names can be found in    [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-23)">│</text><text class="breeze-release-management-publish-docs-r4" x="463.6" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-23)">-</text><text class="breeze-release-management-publish-docs-r4" x="475.8" y="581.2" textLength="61" clip-path="url(#breeze-release-management-publish-docs-line-23) [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-24)">│</text><text class="breeze-release-management-publish-docs-r8" x="463.6" y="605.6" textLength="976" clip-path="url(#breeze-release-management-publish-docs-line-24)">(TEXT)                          &# [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="630" textLength="1464" clip-path="url(#breeze-release-management-publish-docs-line-25)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-publish-docs-r1" x="1464" y="630" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-25)">
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="654.4" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-26)">â•─</text><text class="breeze-release-management-publish-docs-r5" x="24.4" y="654.4" textLength="219.6" clip-path="url(#breeze-release-management-publish-docs-line-26)"> Parallel running </text><text class="breeze-release-management-publish-docs-r5" x="244" y="654.4" textLength="1195.6" clip-path="url(#breeze-relea [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-27)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-27)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="678.8" textLength="48.8" clip-path="url(#breeze-release-management-publish-docs-line-27) [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-28)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-28)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="703.2" textLength="146.4" clip-path="url(#breeze-release-management-publish-docs-line-28 [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-29)">│</text><text class="breeze-release-management-publish-docs-r8" x="378.2" y="727.6" textLength="915" clip-path="url(#breeze-release-management-publish-docs-line-29)">(INTEGER RANGE)                         [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-30)">│</text><text class="breeze-release-management-publish-docs-r5" x="378.2" y="752" textLength="915" clip-path="url(#breeze-release-management-publish-docs-line-30)">[default: 4; 1<=x<=8]                       [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-31)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-31)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="776.4" textLength="61" clip-path="url(#breeze-release-management-publish-docs-line-31)"> [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-32)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-32)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="800.8" textLength="73.2" clip-path="url(#breeze-release-management-publish-docs-line-32) [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-33)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-33)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="825.2" textLength="97.6" clip-path="url(#breeze-release-management-publish-docs-line-33) [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="849.6" textLength="1464" clip-path="url(#breeze-release-management-publish-docs-line-34)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-publish-docs-r1" x="1464" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-34)">
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="874" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-35)">â•─</text><text class="breeze-release-management-publish-docs-r5" x="24.4" y="874" textLength="195.2" clip-path="url(#breeze-release-management-publish-docs-line-35)"> Common options </text><text class="breeze-release-management-publish-docs-r5" x="219.6" y="874" textLength="1220" clip-path="url(#breeze-release-manag [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-36)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-36)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="898.4" textLength="48.8" clip-path="url(#breeze-release-management-publish-docs-line-36) [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-37)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-37)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="922.8" textLength="97.6" clip-path="url(#breeze-release-management-publish-docs-line-37) [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-38)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="947.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-38)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="947.2" textLength="61" clip-path="url(#breeze-release-management-publish-docs-line-38)"> [...]
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="971.6" textLength="1464" clip-path="url(#breeze-release-management-publish-docs-line-39)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-publish-docs-r1" x="1464" y="971.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-39)">
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-17)">│</text><text class="breeze-release-management-publish-docs-r6" x="24.4" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-17)">*</text><text class="breeze-release-management-publish-docs-r4" x="61" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-17)"> [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-18)">│</text><text class="breeze-release-management-publish-docs-r4" x="61" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-18)">-</text><text class="breeze-release-management-publish-docs-r4" x="73.2" y="459.2" textLength="97.6" clip-path="url(#breeze-release-management-publish-docs-line-18)"> [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-19)">│</text><text class="breeze-release-management-publish-docs-r4" x="61" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-19)">-</text><text class="breeze-release-management-publish-docs-r4" x="73.2" y="483.6" textLength="97.6" clip-path="url(#breeze-release-management-publish-docs-line-19)"> [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-20)">│</text><text class="breeze-release-management-publish-docs-r4" x="61" y="508" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-20)">-</text><text class="breeze-release-management-publish-docs-r4" x="73.2" y="508" textLength="109.8" clip-path="url(#breeze-release-management-publish-docs-line-20)">-over [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-21)">│</text><text class="breeze-release-management-publish-docs-r4" x="61" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-21)">-</text><text class="breeze-release-management-publish-docs-r4" x="73.2" y="532.4" textLength="97.6" clip-path="url(#breeze-release-management-publish-docs-line-21)"> [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-22)">│</text><text class="breeze-release-management-publish-docs-r1" x="488" y="556.8" textLength="305" clip-path="url(#breeze-release-management-publish-docs-line-22)">apache-airflow-providers-</text><text class="breeze-release-management-publish-docs-r10" x="793" y="556.8" textLength="122" clip-path="url(#breeze-release-management- [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-23)">│</text><text class="breeze-release-management-publish-docs-r1" x="488" y="581.2" textLength="951.6" clip-path="url(#breeze-release-management-publish-docs-line-23)">matching the full package name. The list of short hand names can be found in  </text [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-24)">│</text><text class="breeze-release-management-publish-docs-r4" x="488" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-24)">-</text><text class="breeze-release-management-publish-docs-r4" x="500.2" y="605.6" textLength="61" clip-path="url(#breeze-release-management-publish-docs-line-24)"> [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-25)">│</text><text class="breeze-release-management-publish-docs-r8" x="488" y="630" textLength="951.6" clip-path="url(#breeze-release-management-publish-docs-line-25)">(TEXT)                            [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="654.4" textLength="1464" clip-path="url(#breeze-release-management-publish-docs-line-26)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-publish-docs-r1" x="1464" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-26)">
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="678.8" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-27)">â•─</text><text class="breeze-release-management-publish-docs-r5" x="24.4" y="678.8" textLength="219.6" clip-path="url(#breeze-release-management-publish-docs-line-27)"> Parallel running </text><text class="breeze-release-management-publish-docs-r5" x="244" y="678.8" textLength="1195.6" clip-path="url(#breeze-relea [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-28)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-28)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="703.2" textLength="48.8" clip-path="url(#breeze-release-management-publish-docs-line-28) [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-29)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-29)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="727.6" textLength="146.4" clip-path="url(#breeze-release-management-publish-docs-line-29 [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-30)">│</text><text class="breeze-release-management-publish-docs-r8" x="378.2" y="752" textLength="915" clip-path="url(#breeze-release-management-publish-docs-line-30)">(INTEGER RANGE)                         [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-31)">│</text><text class="breeze-release-management-publish-docs-r5" x="378.2" y="776.4" textLength="915" clip-path="url(#breeze-release-management-publish-docs-line-31)">[default: 4; 1<=x<=8]                     & [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-32)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-32)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="800.8" textLength="61" clip-path="url(#breeze-release-management-publish-docs-line-32)"> [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-33)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-33)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="825.2" textLength="73.2" clip-path="url(#breeze-release-management-publish-docs-line-33) [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-34)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-34)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="849.6" textLength="97.6" clip-path="url(#breeze-release-management-publish-docs-line-34) [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="874" textLength="1464" clip-path="url(#breeze-release-management-publish-docs-line-35)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-publish-docs-r1" x="1464" y="874" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-35)">
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="898.4" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-36)">â•─</text><text class="breeze-release-management-publish-docs-r5" x="24.4" y="898.4" textLength="195.2" clip-path="url(#breeze-release-management-publish-docs-line-36)"> Common options </text><text class="breeze-release-management-publish-docs-r5" x="219.6" y="898.4" textLength="1220" clip-path="url(#breeze-release [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-37)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-37)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="922.8" textLength="48.8" clip-path="url(#breeze-release-management-publish-docs-line-37) [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-38)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="947.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-38)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="947.2" textLength="97.6" clip-path="url(#breeze-release-management-publish-docs-line-38) [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-39)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="971.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-39)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="971.6" textLength="61" clip-path="url(#breeze-release-management-publish-docs-line-39)"> [...]
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="996" textLength="1464" clip-path="url(#breeze-release-management-publish-docs-line-40)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-publish-docs-r1" x="1464" y="996" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-40)">
</text>
</g>
</g>
diff --git a/images/breeze/output_release-management_publish-docs.txt b/images/breeze/output_release-management_publish-docs.txt
index 09bca0bc0c..bd6f702e07 100644
--- a/images/breeze/output_release-management_publish-docs.txt
+++ b/images/breeze/output_release-management_publish-docs.txt
@@ -1 +1 @@
-aa3c6002bc170536cb1abc8f7169fcaa
+753e7a7273bf88128aa4a4b2c0faac73
diff --git a/images/breeze/output_release-management_verify-provider-packages.txt b/images/breeze/output_release-management_verify-provider-packages.txt
index 9ea71c96db..4d34c31928 100644
--- a/images/breeze/output_release-management_verify-provider-packages.txt
+++ b/images/breeze/output_release-management_verify-provider-packages.txt
@@ -1 +1 @@
-2d128022c661ad702c6236dd75dd8531
+fbada2db7324ba53ba7a30c7b75bbda2
diff --git a/images/breeze/output_shell.txt b/images/breeze/output_shell.txt
index 13e1c2d6db..e71507684a 100644
--- a/images/breeze/output_shell.txt
+++ b/images/breeze/output_shell.txt
@@ -1 +1 @@
-a1b6c6d56b8a06f741dde59a01f71338
+0ceaf6dd335e09cc9ecb42cedd18c064
diff --git a/images/breeze/output_start-airflow.txt b/images/breeze/output_start-airflow.txt
index 9c0ec3642a..8d4f9b8b9a 100644
--- a/images/breeze/output_start-airflow.txt
+++ b/images/breeze/output_start-airflow.txt
@@ -1 +1 @@
-0543b012b7058e62a807609e8dfc5139
+2a7ecb1274ddcab1c6839a224958565e
(airflow) 02/27: Move removal of chicken-egg providers to before releasing image (#36286)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 097659eb5b4d8bef0fc9471a319adff984af96b7
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Mon Dec 18 19:30:25 2023 +0100
Move removal of chicken-egg providers to before releasing image (#36286)
Once Airflow is relesed to PyPI we should remove chicken-egg
providers for that release and cherry-pick them to v2-*-test in
order to prepare container images in case the image contains the
providers as default extras.
(cherry picked from commit 663dfd007000824a71f84f6db84a43654a2dbe4f)
---
dev/README_RELEASE_AIRFLOW.md | 19 ++++++++++++++++---
1 file changed, 16 insertions(+), 3 deletions(-)
diff --git a/dev/README_RELEASE_AIRFLOW.md b/dev/README_RELEASE_AIRFLOW.md
index 2074e88995..797f24ef9e 100644
--- a/dev/README_RELEASE_AIRFLOW.md
+++ b/dev/README_RELEASE_AIRFLOW.md
@@ -40,6 +40,7 @@
- [Publish the final Apache Airflow release](#publish-the-final-apache-airflow-release)
- [Summarize the voting for the Apache Airflow release](#summarize-the-voting-for-the-apache-airflow-release)
- [Publish release to SVN](#publish-release-to-svn)
+ - [Remove chicken-egg providers](#remove-chicken-egg-providers)
- [Manually prepare production Docker Image](#manually-prepare-production-docker-image)
- [Verify production images](#verify-production-images)
- [Publish documentation](#publish-documentation)
@@ -764,6 +765,20 @@ export AIRFLOW_REPO_ROOT=$(pwd)
breeze release-management start-release --release-candidate ${RC} --previous-release <PREVIOUS RELEASE>
```
+## Remove chicken-egg providers
+
+For the first MINOR (X.Y.0) release - remove all providers from ``CHICKEN_EGG_PROVIDERS`` list
+in ``src/airflow_breeze/global_constants.py`` that have >= ``X.Y.0`` in the corresponding provider.yaml file.
+
+In case the provider should also be installed in the image (it is part of ``airflow/providers/installed_providers.txt``)
+it should also be added at this moment to ``Dockerfile`` to the list of default extras in the lin with ``AIRFLOW_EXTRAS``:
+
+```Dockerfile
+ARG AIRFLOW_EXTRAS=".....,<provider>,...."
+```
+
+This change needs to be merged to ``main`` and cherry-picked to ``v2-*-test`` branch before building the image.
+
## Manually prepare production Docker Image
Building the image is triggered by running the
@@ -774,7 +789,7 @@ When you trigger it you need to pass:
* Airflow Version
* Optional "true" in skip latest field if you do not want to re-tag the latest image
-Make sure you use v2-*-stable branch to run the workflow.
+Make sure you use ``v2-*-test`` branch to run the workflow.

@@ -980,8 +995,6 @@ This includes:
- Sync `RELEASE_NOTES.rst` (including deleting relevant `newsfragments`) and `README.md` changes.
- Updating `Dockerfile` with the new version.
- Updating `airflow_bug_report.yml` issue template in `.github/ISSUE_TEMPLATE/` with the new version.
-- For the first MINOR (X.Y.0) release - remove all providers from ``CHICKEN_EGG_PROVIDERS`` list
- in ``src/airflow_breeze/global_constants.py`` that have >= ``X.Y.0`` in the corresponding provider.yaml file.
## Update default Airflow version in the helm chart
(airflow) 19/27: Update BREEZE.rst with different test example (#36234)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit e1d2e7f3b52c40e34a5b947fc64cc6e641841c81
Author: Bowrna <ma...@gmail.com>
AuthorDate: Wed Dec 27 15:58:20 2023 +0530
Update BREEZE.rst with different test example (#36234)
Updating the breeze docs with different pytest example as the function mentioned in the example is removed from the test_core.py
(cherry picked from commit 71c726d52d5a8a30f59268cc175560a4244c8016)
---
BREEZE.rst | 2 +-
TESTING.rst | 2 +-
scripts/ci/pre_commit/common_precommit_utils.py | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/BREEZE.rst b/BREEZE.rst
index 4350c243e4..7bcda45029 100644
--- a/BREEZE.rst
+++ b/BREEZE.rst
@@ -1004,7 +1004,7 @@ Running single test:
.. code-block:: bash
- pytest tests/core/test_core.py::TestCore::test_check_operators
+ pytest tests/core/test_core.py::TestCore::test_dag_params_and_task_params
To run the whole test class:
diff --git a/TESTING.rst b/TESTING.rst
index 5c0e16bc26..fba97b870a 100644
--- a/TESTING.rst
+++ b/TESTING.rst
@@ -830,7 +830,7 @@ This can also be done by specifying a full path to the test:
.. code-block:: bash
- pytest tests/core/test_core.py::TestCore::test_check_operators
+ pytest tests/core/test_core.py::TestCore::test_dag_params_and_task_params
To run the whole test class, enter:
diff --git a/scripts/ci/pre_commit/common_precommit_utils.py b/scripts/ci/pre_commit/common_precommit_utils.py
index 5284f71fc1..76370b15ad 100644
--- a/scripts/ci/pre_commit/common_precommit_utils.py
+++ b/scripts/ci/pre_commit/common_precommit_utils.py
@@ -79,7 +79,7 @@ def initialize_breeze_precommit(name: str, file: str):
if os.environ.get("SKIP_BREEZE_PRE_COMMITS"):
console.print("[yellow]Skipping breeze pre-commit as SKIP_BREEZE_PRE_COMMIT is set")
- sys.exit(1)
+ sys.exit(0)
if shutil.which("breeze") is None:
console.print(
"[red]The `breeze` command is not on path.[/]\n\n"
(airflow) 11/27: Remove rendundant and unused code in docs building/publishing (#36346)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 0d12706dd9e8559942c303df8bb86d107ae9b039
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Thu Dec 21 15:03:15 2023 +0100
Remove rendundant and unused code in docs building/publishing (#36346)
Currently docs building happens insid of the container image and code
doing that sits in `docs` folder, while publishing has already been
moved to `breeze` code (and is executed in the Breeze venv, not in the
container). Both building and publishing code were present in both
(copy&pasted) and the parts of it not relevant to the `other` function
has not been used.
While eventually we will move docs building also to `breeze` the first
step of that is to remove the redundancy and clean-up unused code, so
that we can make the transition cleaner.
(cherry picked from commit bf90992dd48bce7de9f2a687860479e95575cd24)
---
.../commands/release_management_commands.py | 4 +-
.../src/airflow_breeze/utils/docs_publisher.py | 101 +++++++
.../airflow_breeze/utils/publish_docs_builder.py | 297 ---------------------
docs/exts/docs_build/docs_builder.py | 34 ---
4 files changed, 103 insertions(+), 333 deletions(-)
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 f527ee4b27..4a6a2e996a 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -109,6 +109,7 @@ from airflow_breeze.utils.docker_command_utils import (
fix_ownership_using_docker,
perform_environment_checks,
)
+from airflow_breeze.utils.docs_publisher import DocsPublisher
from airflow_breeze.utils.github import download_constraints_file, get_active_airflow_versions
from airflow_breeze.utils.packages import (
PackageSuspendedException,
@@ -139,7 +140,6 @@ from airflow_breeze.utils.provider_dependencies import (
generate_providers_metadata_for_package,
get_related_providers,
)
-from airflow_breeze.utils.publish_docs_builder import PublishDocsBuilder
from airflow_breeze.utils.python_versions import get_python_version_list
from airflow_breeze.utils.run_utils import (
clean_www_assets,
@@ -1083,7 +1083,7 @@ def run_docs_publishing(
verbose: bool,
output: Output | None,
) -> tuple[int, str]:
- builder = PublishDocsBuilder(package_name=package_name, output=output, verbose=verbose)
+ builder = DocsPublisher(package_name=package_name, output=output, verbose=verbose)
builder.publish(override_versioned=override_versioned, airflow_site_dir=airflow_site_directory)
return (
0,
diff --git a/dev/breeze/src/airflow_breeze/utils/docs_publisher.py b/dev/breeze/src/airflow_breeze/utils/docs_publisher.py
new file mode 100644
index 0000000000..8b47948cd0
--- /dev/null
+++ b/dev/breeze/src/airflow_breeze/utils/docs_publisher.py
@@ -0,0 +1,101 @@
+# 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
+import shutil
+from pathlib import Path
+
+from airflow_breeze.global_constants import get_airflow_version
+from airflow_breeze.utils.console import Output, get_console
+from airflow_breeze.utils.helm_chart_utils import chart_version
+from airflow_breeze.utils.packages import get_provider_packages_metadata, get_short_package_name
+from airflow_breeze.utils.publish_docs_helpers import pretty_format_path
+
+PROCESS_TIMEOUT = 15 * 60
+
+ROOT_PROJECT_DIR = Path(__file__).parents[5].resolve()
+DOCS_DIR = os.path.join(ROOT_PROJECT_DIR, "docs")
+
+
+class DocsPublisher:
+ """Documentation builder for Airflow Docs Publishing."""
+
+ def __init__(self, package_name: str, output: Output | None, verbose: bool):
+ self.package_name = package_name
+ self.output = output
+ self.verbose = verbose
+
+ @property
+ def is_versioned(self):
+ """Is current documentation package versioned?"""
+ # Disable versioning. This documentation does not apply to any released product and we can update
+ # it as needed, i.e. with each new package of providers.
+ return self.package_name not in ("apache-airflow-providers", "docker-stack")
+
+ @property
+ def _build_dir(self) -> str:
+ if self.is_versioned:
+ version = "stable"
+ return f"{DOCS_DIR}/_build/docs/{self.package_name}/{version}"
+ else:
+ return f"{DOCS_DIR}/_build/docs/{self.package_name}"
+
+ @property
+ def _current_version(self):
+ if not self.is_versioned:
+ raise Exception("This documentation package is not versioned")
+ if self.package_name == "apache-airflow":
+ return get_airflow_version()
+ if self.package_name.startswith("apache-airflow-providers-"):
+ provider = get_provider_packages_metadata().get(get_short_package_name(self.package_name))
+ return provider["versions"][0]
+ if self.package_name == "helm-chart":
+ return chart_version()
+ return Exception(f"Unsupported package: {self.package_name}")
+
+ @property
+ def _publish_dir(self) -> str:
+ if self.is_versioned:
+ return f"docs-archive/{self.package_name}/{self._current_version}"
+ else:
+ return f"docs-archive/{self.package_name}"
+
+ def publish(self, override_versioned: bool, airflow_site_dir: str):
+ """Copy documentation packages files to airflow-site repository."""
+ get_console(output=self.output).print(f"Publishing docs for {self.package_name}")
+ output_dir = os.path.join(airflow_site_dir, self._publish_dir)
+ pretty_source = pretty_format_path(self._build_dir, os.getcwd())
+ pretty_target = pretty_format_path(output_dir, airflow_site_dir)
+ get_console(output=self.output).print(f"Copy directory: {pretty_source} => {pretty_target}")
+ if os.path.exists(output_dir):
+ if self.is_versioned:
+ if override_versioned:
+ get_console(output=self.output).print(f"Overriding previously existing {output_dir}! ")
+ else:
+ get_console(output=self.output).print(
+ f"Skipping previously existing {output_dir}! "
+ f"Delete it manually if you want to regenerate it!"
+ )
+ get_console(output=self.output).print()
+ return
+ shutil.rmtree(output_dir)
+ shutil.copytree(self._build_dir, output_dir)
+ if self.is_versioned:
+ with open(os.path.join(output_dir, "..", "stable.txt"), "w") as stable_file:
+ stable_file.write(self._current_version)
+ get_console(output=self.output).print()
diff --git a/dev/breeze/src/airflow_breeze/utils/publish_docs_builder.py b/dev/breeze/src/airflow_breeze/utils/publish_docs_builder.py
deleted file mode 100644
index c3b380b07b..0000000000
--- a/dev/breeze/src/airflow_breeze/utils/publish_docs_builder.py
+++ /dev/null
@@ -1,297 +0,0 @@
-# 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
-import re
-import shlex
-import shutil
-from glob import glob
-from pathlib import Path
-from subprocess import run
-
-from airflow_breeze.global_constants import get_airflow_version
-from airflow_breeze.utils.console import Output, get_console
-from airflow_breeze.utils.docs_errors import DocBuildError, parse_sphinx_warnings
-from airflow_breeze.utils.helm_chart_utils import chart_version
-from airflow_breeze.utils.packages import get_provider_packages_metadata, get_short_package_name
-from airflow_breeze.utils.publish_docs_helpers import pretty_format_path
-from airflow_breeze.utils.spelling_checks import SpellingError, parse_spelling_warnings
-
-PROCESS_TIMEOUT = 15 * 60
-
-ROOT_PROJECT_DIR = Path(__file__).parents[5].resolve()
-DOCS_DIR = os.path.join(ROOT_PROJECT_DIR, "docs")
-
-
-class PublishDocsBuilder:
- """Documentation builder for Airflow Docs Publishing."""
-
- def __init__(self, package_name: str, output: Output | None, verbose: bool):
- self.package_name = package_name
- self.output = output
- self.verbose = verbose
-
- @property
- def _doctree_dir(self) -> str:
- return f"{DOCS_DIR}/_doctrees/docs/{self.package_name}"
-
- @property
- def _inventory_cache_dir(self) -> str:
- return f"{DOCS_DIR}/_inventory_cache"
-
- @property
- def is_versioned(self):
- """Is current documentation package versioned?"""
- # Disable versioning. This documentation does not apply to any released product and we can update
- # it as needed, i.e. with each new package of providers.
- return self.package_name not in ("apache-airflow-providers", "docker-stack")
-
- @property
- def _build_dir(self) -> str:
- if self.is_versioned:
- version = "stable"
- return f"{DOCS_DIR}/_build/docs/{self.package_name}/{version}"
- else:
- return f"{DOCS_DIR}/_build/docs/{self.package_name}"
-
- @property
- def log_spelling_filename(self) -> str:
- """Log from spelling job."""
- return os.path.join(self._build_dir, f"output-spelling-{self.package_name}.log")
-
- @property
- def log_spelling_output_dir(self) -> str:
- """Results from spelling job."""
- return os.path.join(self._build_dir, f"output-spelling-results-{self.package_name}")
-
- @property
- def log_build_filename(self) -> str:
- """Log from build job."""
- return os.path.join(self._build_dir, f"output-build-{self.package_name}.log")
-
- @property
- def log_build_warning_filename(self) -> str:
- """Warnings from build job."""
- return os.path.join(self._build_dir, f"warning-build-{self.package_name}.log")
-
- @property
- def _current_version(self):
- if not self.is_versioned:
- raise Exception("This documentation package is not versioned")
- if self.package_name == "apache-airflow":
- return get_airflow_version()
- if self.package_name.startswith("apache-airflow-providers-"):
- provider = get_provider_packages_metadata().get(get_short_package_name(self.package_name))
- return provider["versions"][0]
- if self.package_name == "helm-chart":
- return chart_version()
- return Exception(f"Unsupported package: {self.package_name}")
-
- @property
- def _publish_dir(self) -> str:
- if self.is_versioned:
- return f"docs-archive/{self.package_name}/{self._current_version}"
- else:
- return f"docs-archive/{self.package_name}"
-
- @property
- def _src_dir(self) -> str:
- return f"{DOCS_DIR}/{self.package_name}"
-
- def clean_files(self) -> None:
- """Cleanup all artifacts generated by previous builds."""
- api_dir = os.path.join(self._src_dir, "_api")
-
- shutil.rmtree(api_dir, ignore_errors=True)
- shutil.rmtree(self._build_dir, ignore_errors=True)
- os.makedirs(api_dir, exist_ok=True)
- os.makedirs(self._build_dir, exist_ok=True)
-
- def check_spelling(self, verbose: bool) -> list[SpellingError]:
- """
- Checks spelling
-
- :param verbose: whether to show output while running
- :return: list of errors
- """
- spelling_errors = []
- os.makedirs(self._build_dir, exist_ok=True)
- shutil.rmtree(self.log_spelling_output_dir, ignore_errors=True)
- os.makedirs(self.log_spelling_output_dir, exist_ok=True)
-
- build_cmd = [
- "sphinx-build",
- "-W", # turn warnings into errors
- "--color", # do emit colored output
- "-T", # show full traceback on exception
- "-b", # builder to use
- "spelling",
- "-c",
- DOCS_DIR,
- "-d", # path for the cached environment and doctree files
- self._doctree_dir,
- self._src_dir, # path to documentation source files
- self.log_spelling_output_dir,
- ]
-
- env = os.environ.copy()
- env["AIRFLOW_PACKAGE_NAME"] = self.package_name
- if verbose:
- get_console(output=self.output).print(
- f"[info]{self.package_name:60}:[/] Executing cmd: ",
- " ".join(shlex.quote(c) for c in build_cmd),
- )
- get_console(output=self.output).print(
- f"[info]{self.package_name:60}:[/] The output is hidden until an error occurs."
- )
- with open(self.log_spelling_filename, "w") as output:
- completed_proc = run(
- build_cmd,
- cwd=self._src_dir,
- env=env,
- stdout=output if not verbose else None,
- stderr=output if not verbose else None,
- timeout=PROCESS_TIMEOUT,
- )
- if completed_proc.returncode != 0:
- spelling_errors.append(
- SpellingError(
- file_path=None,
- line_no=None,
- spelling=None,
- suggestion=None,
- context_line=None,
- message=(
- f"Sphinx spellcheck returned non-zero exit status: {completed_proc.returncode}."
- ),
- )
- )
- warning_text = ""
- for filepath in glob(f"{self.log_spelling_output_dir}/**/*.spelling", recursive=True):
- with open(filepath) as spelling_file:
- warning_text += spelling_file.read()
-
- spelling_errors.extend(parse_spelling_warnings(warning_text, self._src_dir))
- get_console(output=self.output).print(
- f"[info]{self.package_name:60}:[/] [red]Finished spell-checking with errors[/]"
- )
- else:
- if spelling_errors:
- get_console(output=self.output).print(
- f"[info]{self.package_name:60}:[/] [yellow]Finished spell-checking with warnings[/]"
- )
- else:
- get_console(output=self.output).print(
- f"[info]{self.package_name:60}:[/] [green]Finished spell-checking successfully[/]"
- )
- return spelling_errors
-
- def build_sphinx_docs(self, verbose: bool) -> list[DocBuildError]:
- """
- Build Sphinx documentation.
-
- :param verbose: whether to show output while running
- :return: list of errors
- """
- build_errors = []
- os.makedirs(self._build_dir, exist_ok=True)
-
- build_cmd = [
- "sphinx-build",
- "-T", # show full traceback on exception
- "--color", # do emit colored output
- "-b", # builder to use
- "html",
- "-d", # path for the cached environment and doctree files
- self._doctree_dir,
- "-c",
- DOCS_DIR,
- "-w", # write warnings (and errors) to given file
- self.log_build_warning_filename,
- self._src_dir,
- self._build_dir, # path to output directory
- ]
- env = os.environ.copy()
- env["AIRFLOW_PACKAGE_NAME"] = self.package_name
- if verbose:
- get_console(output=self.output).print(
- f"[info]{self.package_name:60}:[/] Executing cmd: ",
- " ".join(shlex.quote(c) for c in build_cmd),
- )
- else:
- get_console(output=self.output).print(
- f"[info]{self.package_name:60}:[/] Running sphinx. "
- f"The output is hidden until an error occurs."
- )
- with open(self.log_build_filename, "w") as output:
- completed_proc = run(
- build_cmd,
- cwd=self._src_dir,
- env=env,
- stdout=output if not verbose else None,
- stderr=output if not verbose else None,
- timeout=PROCESS_TIMEOUT,
- )
- if completed_proc.returncode != 0:
- build_errors.append(
- DocBuildError(
- file_path=None,
- line_no=None,
- message=f"Sphinx returned non-zero exit status: {completed_proc.returncode}.",
- )
- )
- if os.path.isfile(self.log_build_warning_filename):
- with open(self.log_build_warning_filename) as warning_file:
- warning_text = warning_file.read()
- # Remove 7-bit C1 ANSI escape sequences
- warning_text = re.sub(r"\x1B[@-_][0-?]*[ -/]*[@-~]", "", warning_text)
- build_errors.extend(parse_sphinx_warnings(warning_text, self._src_dir))
- if build_errors:
- get_console(output=self.output).print(
- f"[info]{self.package_name:60}:[/] [red]Finished docs building with errors[/]"
- )
- else:
- get_console(output=self.output).print(
- f"[info]{self.package_name:60}:[/] [green]Finished docs building successfully[/]"
- )
- return build_errors
-
- def publish(self, override_versioned: bool, airflow_site_dir: str):
- """Copy documentation packages files to airflow-site repository."""
- get_console(output=self.output).print(f"Publishing docs for {self.package_name}")
- output_dir = os.path.join(airflow_site_dir, self._publish_dir)
- pretty_source = pretty_format_path(self._build_dir, os.getcwd())
- pretty_target = pretty_format_path(output_dir, airflow_site_dir)
- get_console(output=self.output).print(f"Copy directory: {pretty_source} => {pretty_target}")
- if os.path.exists(output_dir):
- if self.is_versioned:
- if override_versioned:
- get_console(output=self.output).print(f"Overriding previously existing {output_dir}! ")
- else:
- get_console(output=self.output).print(
- f"Skipping previously existing {output_dir}! "
- f"Delete it manually if you want to regenerate it!"
- )
- get_console(output=self.output).print()
- return
- shutil.rmtree(output_dir)
- shutil.copytree(self._build_dir, output_dir)
- if self.is_versioned:
- with open(os.path.join(output_dir, "..", "stable.txt"), "w") as stable_file:
- stable_file.write(self._current_version)
- get_console(output=self.output).print()
diff --git a/docs/exts/docs_build/docs_builder.py b/docs/exts/docs_build/docs_builder.py
index d72c8941f6..19efcceaf1 100644
--- a/docs/exts/docs_build/docs_builder.py
+++ b/docs/exts/docs_build/docs_builder.py
@@ -26,13 +26,11 @@ from subprocess import run
from rich.console import Console
from .code_utils import (
- AIRFLOW_SITE_DIR,
ALL_PROVIDER_YAMLS,
ALL_PROVIDER_YAMLS_WITH_SUSPENDED,
CONSOLE_WIDTH,
DOCS_DIR,
PROCESS_TIMEOUT,
- pretty_format_path,
)
from .errors import DocBuildError, parse_sphinx_warnings
from .helm_chart_utils import chart_version
@@ -105,13 +103,6 @@ class AirflowDocsBuilder:
return chart_version()
return Exception(f"Unsupported package: {self.package_name}")
- @property
- def _publish_dir(self) -> str:
- if self.is_versioned:
- return f"docs-archive/{self.package_name}/{self._current_version}"
- else:
- return f"docs-archive/{self.package_name}"
-
@property
def _src_dir(self) -> str:
return f"{DOCS_DIR}/{self.package_name}"
@@ -266,31 +257,6 @@ class AirflowDocsBuilder:
console.print(f"[info]{self.package_name:60}:[/] [green]Finished docs building successfully[/]")
return build_errors
- def publish(self, override_versioned: bool):
- """Copy documentation packages files to airflow-site repository."""
- console.print(f"Publishing docs for {self.package_name}")
- output_dir = os.path.join(AIRFLOW_SITE_DIR, self._publish_dir)
- pretty_source = pretty_format_path(self._build_dir, os.getcwd())
- pretty_target = pretty_format_path(output_dir, AIRFLOW_SITE_DIR)
- console.print(f"Copy directory: {pretty_source} => {pretty_target}")
- if os.path.exists(output_dir):
- if self.is_versioned:
- if override_versioned:
- console.print(f"Overriding previously existing {output_dir}! ")
- else:
- console.print(
- f"Skipping previously existing {output_dir}! "
- f"Delete it manually if you want to regenerate it!"
- )
- console.print()
- return
- shutil.rmtree(output_dir)
- shutil.copytree(self._build_dir, output_dir)
- if self.is_versioned:
- with open(os.path.join(output_dir, "..", "stable.txt"), "w") as stable_file:
- stable_file.write(self._current_version)
- console.print()
-
def get_available_providers_packages(include_suspended: bool = False):
"""Get list of all available providers packages to build."""
(airflow) 24/27: Improve generation of "Status of testing" issue (#36470)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit b9ef5a089837e4d911c7a80d4ab5449946fbb6d8
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Thu Dec 28 21:02:27 2023 +0100
Improve generation of "Status of testing" issue (#36470)
This PR improves/simplifies the process of issue generation when
provider package rc candidates are prepared for voting.
It improves the commmand to generate the issue and makes it simpler
(less copy&paste) to create such issue, the issue also does not use
the "Meta" template and gets the right labels assigned automatically.
Recent changes that automatically derive the suffix from PyPI packages
prepared, removed the need of passing `--suffix` as parameter. In all
cases the right rc* suffix will be automatically added during issue
generation based on the version of package being prepared. The process
has been updated and command simplified by removing the `--suffix` flag.
When the issue is prepared, we display the issue in terminal and asked
the release manager to create the issue by copy&pasting the issue
content and title to a new issue, but that required a few copy&pastes
and opening new Issue via "Meta" task type. This PR simplifies it a
bit by not only displaying the content but also generating a URL that
can be either copy&pasted to browser URL field or just Cmd+clicked
if your terminal allows that. Issue created this way does not have
the "Body" field header and has the labels properly assigned including
a dedicated "testing status" label that is used to gether stats for
past "status" issues.
The advice for release manager has been improved (the comment generated
had some missing end of sentence and it should be now clearer on how
to iterate during issue generation if you want to remove some PRs from
the generated issue content.
(cherry picked from commit 5d88f6f9a4c7140c1da9db47aab7caf2d4c5f453)
---
dev/README_RELEASE_PROVIDER_PACKAGES.md | 50 ++++++++++++++++++----
.../commands/release_management_commands.py | 47 +++++++++++++++-----
.../commands/release_management_commands_config.py | 1 -
.../provider_issue_TEMPLATE.md.jinja2 | 8 +---
...management_generate-issue-content-providers.svg | 18 +++-----
...management_generate-issue-content-providers.txt | 2 +-
6 files changed, 88 insertions(+), 38 deletions(-)
diff --git a/dev/README_RELEASE_PROVIDER_PACKAGES.md b/dev/README_RELEASE_PROVIDER_PACKAGES.md
index cbf645d649..9609c20873 100644
--- a/dev/README_RELEASE_PROVIDER_PACKAGES.md
+++ b/dev/README_RELEASE_PROVIDER_PACKAGES.md
@@ -529,28 +529,60 @@ git push --set-upstream origin "${branch}"
## Prepare issue in GitHub to keep status of testing
-Create a GitHub issue with the content generated via manual
-execution of the script below. You will use link to that issue in the next step. You need a GITHUB_TOKEN
-set as your environment variable.
+Create a GitHub issue with the content generated via manual execution of the command below. You will use
+link to that issue in the next step.
-You can also pass the token as `--github-token` option in the script.
-You can also pass list of PR to be excluded from the issue with `--excluded-pr-list`.
+```shell script
+cd "${AIRFLOW_REPO_ROOT}"
+
+breeze release-management generate-issue-content-providers --only-available-in-dist
+```
+
+GitHub API uses rate limiting that is based on the public IP address of client if you do not authenticate
+with GitHub, so when you retrieve bigger number of PRs or when you are behind NAT and share your public
+IP address with many other Anonymous GitHub API users, issue retrieval will be halted and your API calls
+might slow down to a crawl, you will need then a GITHUB_TOKEN set as your
+environment variable or pass the token as `--github-token` option in the script.
```shell script
cd "${AIRFLOW_REPO_ROOT}"
+breeze release-management generate-issue-content-providers --only-available-in-dist --github-token TOKEN
+```
+
+or
+
+```shell script
+cd "${AIRFLOW_REPO_ROOT}"
+export GITHUB_TOKEN=TOKEN
breeze release-management generate-issue-content-providers --only-available-in-dist
```
-You can also generate the token by following
-[this link](https://github.com/settings/tokens/new?description=Read%20sssues&scopes=repo:status)
+You can generate the token by following
+[this link](https://github.com/settings/tokens/new?description=Read%20issues&scopes=repo:status). Since it is easy to generate such token, by following the link, it is recommended to
+generate a new token for each release and delete it once you've generated the issue.
+
+If you see in the output that some of the PRs are just "noise" (i.e. there is no need to verify them
+as they are misc/documentation kind of changes that have no impact on the actual installation of
+the provider or the code of the provider, can optionally pass list of PR to be excluded from
+the issue with `--excluded-pr-list`. This might limit the scope of verification. Some providers
+might disappear from the list and list of authors that will be pinged in the generated issue.
-If you are preparing release for RC2/RC3 candidates, you should add `--suffix` parameter:
+You can repeat that and regenerate the issue content until you are happy with the generated issue.
```shell script
-breeze release-management generate-issue-content-providers --only-available-in-dist --suffix rc2
+cd "${AIRFLOW_REPO_ROOT}"
+
+breeze release-management generate-issue-content-providers --only-available-in-dist --github-token TOKEN \
+ --excluded-pr-list PR_NUMBER1,PR_NUMBER2
```
+It's also OK to manually modify the content of such generated issue before actually creating the
+issue. There is a comment generated with NOTE TO RELEASE MANAGER about this in the issue content.
+Hit Preview button on "create issue" screen before creating it to verify how it will look like
+for the contributors.
+
+
## Prepare voting email for Providers release candidate
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 8d1ee6eaa6..7525a353ff 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -29,7 +29,7 @@ from copy import deepcopy
from datetime import datetime
from pathlib import Path
from subprocess import DEVNULL
-from typing import IO, TYPE_CHECKING, Any, Generator, NamedTuple
+from typing import IO, TYPE_CHECKING, Any, Generator, Iterable, NamedTuple
import click
from rich.progress import Progress
@@ -1571,6 +1571,25 @@ def get_prs_for_package(provider_id: str) -> list[int]:
return prs
+def create_github_issue_url(title: str, body: str, labels: Iterable[str]) -> str:
+ """
+ Creates URL to create the issue with title, body and labels.
+ :param title: issue title
+ :param body: issue body
+ :param labels: labels for the issue
+ :return: URL to use to create the issue
+ """
+ from urllib.parse import quote
+
+ quoted_labels = quote(",".join(labels))
+ quoted_title = quote(title)
+ quoted_body = quote(body)
+ return (
+ f"https://github.com/apache/airflow/issues/new?labels={quoted_labels}&"
+ f"title={quoted_title}&body={quoted_body}"
+ )
+
+
@release_management.command(
name="generate-issue-content-providers", help="Generates content for issue to test the release."
)
@@ -1592,14 +1611,12 @@ def get_prs_for_package(provider_id: str) -> list[int]:
is_flag=True,
help="Only consider package ids with packages prepared in the dist folder",
)
-@click.option("--suffix", default="rc1", help="Suffix to add to the version prepared")
@argument_provider_packages
def generate_issue_content_providers(
disable_progress: bool,
excluded_pr_list: str,
github_token: str,
only_available_in_dist: bool,
- suffix: str,
provider_packages: list[str],
):
import jinja2
@@ -1674,7 +1691,7 @@ def generate_issue_content_providers(
provider_package_id=provider_id,
pypi_package_name=provider_yaml_dict["package-name"],
pr_list=pull_request_list,
- suffix=package_suffix if package_suffix else suffix,
+ suffix=package_suffix if package_suffix else "",
)
template = jinja2.Template(
(Path(__file__).parents[1] / "provider_issue_TEMPLATE.md.jinja2").read_text()
@@ -1688,19 +1705,29 @@ def generate_issue_content_providers(
get_console().print()
get_console().print()
get_console().print(
- "Issue title: [yellow]Status of testing Providers that were "
+ "Issue title: [warning]Status of testing Providers that were "
f"prepared on {datetime.now():%B %d, %Y}[/]"
)
get_console().print()
- syntax = Syntax(issue_content, "markdown", theme="ansi_dark")
- get_console().print(syntax)
- get_console().print()
+ issue_content += "\n"
users: set[str] = set()
for provider_info in providers.values():
for pr in provider_info.pr_list:
users.add("@" + pr.user.login)
- get_console().print("All users involved in the PRs:")
- get_console().print(" ".join(users))
+ issue_content += f"All users involved in the PRs:\n{' '.join(users)}"
+ syntax = Syntax(issue_content, "markdown", theme="ansi_dark")
+ get_console().print(syntax)
+ url_to_create_the_issue = create_github_issue_url(
+ title=f"Status of testing Providers that were prepared on {datetime.now():%B %d, %Y}",
+ body=issue_content,
+ labels=["testing status", "kind:meta"],
+ )
+ get_console().print()
+ get_console().print(
+ "[info]You can prefill the issue by copy&pasting this link to browser "
+ "(or Cmd+Click if your terminal supports it):\n"
+ )
+ print(url_to_create_the_issue)
def get_all_constraint_files(refresh_constraints: bool, python_version: str) -> None:
diff --git a/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py b/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
index 1dfa78f3aa..77fc83650c 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
@@ -234,7 +234,6 @@ RELEASE_MANAGEMENT_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
"--excluded-pr-list",
"--github-token",
"--only-available-in-dist",
- "--suffix",
],
}
],
diff --git a/dev/breeze/src/airflow_breeze/provider_issue_TEMPLATE.md.jinja2 b/dev/breeze/src/airflow_breeze/provider_issue_TEMPLATE.md.jinja2
index 8009549772..c519048723 100644
--- a/dev/breeze/src/airflow_breeze/provider_issue_TEMPLATE.md.jinja2
+++ b/dev/breeze/src/airflow_breeze/provider_issue_TEMPLATE.md.jinja2
@@ -20,11 +20,7 @@ Those are providers that require testing as there were some substantial changes
NOTE TO RELEASE MANAGER:
-Please move here the providers that have doc-only changes or for which changes are trivial, and
-you could assess that they are OK. In case
-
-The providers are automatically installed on Airflow 2.3 and latest `main` during the CI, so we know they
-are installable. Also, all classes within the providers are imported during the CI run so we know all
-providers can be imported.
+You can move here the providers that have doc-only changes or for which changes are trivial, and
+you could assess that they are OK.
-->
diff --git a/images/breeze/output_release-management_generate-issue-content-providers.svg b/images/breeze/output_release-management_generate-issue-content-providers.svg
index 46fce9329b..e8e193e1d1 100644
--- a/images/breeze/output_release-management_generate-issue-content-providers.svg
+++ b/images/breeze/output_release-management_generate-issue-content-providers.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 733.1999999999999" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 708.8" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-release-management-generate-issue-content-providers-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="682.1999999999999" />
+ <rect x="0" y="0" width="1463.0" height="657.8" />
</clipPath>
<clipPath id="breeze-release-management-generate-issue-content-providers-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -123,12 +123,9 @@
<clipPath id="breeze-release-management-generate-issue-content-providers-line-25">
<rect x="0" y="611.5" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-release-management-generate-issue-content-providers-line-26">
- <rect x="0" y="635.9" width="1464" height="24.65"/>
- </clipPath>
</defs>
- <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="731.2" rx="8"/><text class="breeze-release-management-generate-issue-content-providers-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: release-management generate-issue-content-providers</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="706.8" rx="8"/><text class="breeze-release-management-generate-issue-content-providers-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: release-management generate-issue-content-providers</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -161,11 +158,10 @@
</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-20)">│</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="366" y="508" textLength="1073.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-20)">https://github.com/settings/tokens/new?description=Read%20sssues&scopes=repo:status [...]
</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-21)">│</text><text class="breeze-release-management-generate-issue-content-providers-r6" x="366" y="532.4" textLength="1073.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-21)">(TEXT)              [...]
</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-22)">│</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="24.4" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-22)">-</text><text class="breeze-release-management-generate-issue-content-providers-r4" [...]
-</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-23)">│</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="24.4" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-23)">-</text><text class="breeze-release-management-generate-issue-content-providers-r4" [...]
-</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="605.6" textLength="1464" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-24)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="1464" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-generate [...]
-</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="630" textLength="24.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-25)">â•─</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="24.4" y="630" textLength="195.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-25)"> Common options </text><text class="breeze-release-management-generate- [...]
-</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-26)">│</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-26)">-</text><text class="breeze-release-management-generate-issue-content-providers-r4" [...]
-</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="678.8" textLength="1464" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-27)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="1464" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-generate [...]
+</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="581.2" textLength="1464" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-23)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="1464" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-generate [...]
+</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="605.6" textLength="24.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-24)">â•─</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="24.4" y="605.6" textLength="195.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-24)"> Common options </text><text class="breeze-release-management-gener [...]
+</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-25)">│</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-25)">-</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="3 [...]
+</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="654.4" textLength="1464" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-26)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="1464" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-generate [...]
</text>
</g>
</g>
diff --git a/images/breeze/output_release-management_generate-issue-content-providers.txt b/images/breeze/output_release-management_generate-issue-content-providers.txt
index 896b36c77a..aa42535eac 100644
--- a/images/breeze/output_release-management_generate-issue-content-providers.txt
+++ b/images/breeze/output_release-management_generate-issue-content-providers.txt
@@ -1 +1 @@
-7361238411e5097d70e0e359b5246a2a
+8109ff3d327a5e6921b15402f9c15bb6
(airflow) 05/27: Add steps to update constraints and adjust version for chicken-egg (#36288)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 75dc15795033fa23b5edd8d084d38c3bf1de7744
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Mon Dec 18 21:18:56 2023 +0100
Add steps to update constraints and adjust version for chicken-egg (#36288)
When Chicken-egg providers are released, we also have to do some
manual adjustments of constraints and version of airflow in
the v2-8-test branch.
(cherry picked from commit 35117aa9e931ec6b9e4c5669cd23014bd38c7514)
---
dev/README_RELEASE_AIRFLOW.md | 35 +++++++++++++++++++++++++++++++----
1 file changed, 31 insertions(+), 4 deletions(-)
diff --git a/dev/README_RELEASE_AIRFLOW.md b/dev/README_RELEASE_AIRFLOW.md
index 797f24ef9e..5b1ad59a40 100644
--- a/dev/README_RELEASE_AIRFLOW.md
+++ b/dev/README_RELEASE_AIRFLOW.md
@@ -767,11 +767,34 @@ breeze release-management start-release --release-candidate ${RC} --previous-rel
## Remove chicken-egg providers
-For the first MINOR (X.Y.0) release - remove all providers from ``CHICKEN_EGG_PROVIDERS`` list
-in ``src/airflow_breeze/global_constants.py`` that have >= ``X.Y.0`` in the corresponding provider.yaml file.
+For the first MINOR (X.Y.0) release you need to do few more steps if there are new "chicken-egg" providers
+that have min-airflow version set to X.Y.0
-In case the provider should also be installed in the image (it is part of ``airflow/providers/installed_providers.txt``)
-it should also be added at this moment to ``Dockerfile`` to the list of default extras in the lin with ``AIRFLOW_EXTRAS``:
+* NOTE! WE MIGHT WANT TO AUTOMATE THAT STEP IN THE FUTURE
+
+1. Checkout the constraints-2-* branch and update the ``constraints-3*.txt`` file with the new provider
+ version. Find the place where the provider should be added, add it with the latest provider version.
+
+```
+apache-airflow-providers-PROVIDER==VERSION
+```
+
+Commit, push and tag this change with ``constraints-X.Y.Z`` tag:
+
+```bash
+git add
+git commit -m "Add chicken-egg provider apache-airflow-providers-PROVIDER"
+git tag -s constraints-X.Y.Z --force
+git push -f apache constraints-X.Y.Z
+```
+
+
+2. remove providers from ``CHICKEN_EGG_PROVIDERS`` list in ``src/airflow_breeze/global_constants.py``
+ that have >= ``X.Y.0`` in the corresponding provider.yaml file.
+
+
+3. In case the provider should also be installed in the image (it is part of ``airflow/providers/installed_providers.txt``)
+ it should also be added at this moment to ``Dockerfile`` to the list of default extras in the line with ``AIRFLOW_EXTRAS``:
```Dockerfile
ARG AIRFLOW_EXTRAS=".....,<provider>,...."
@@ -779,6 +802,10 @@ ARG AIRFLOW_EXTRAS=".....,<provider>,...."
This change needs to be merged to ``main`` and cherry-picked to ``v2-*-test`` branch before building the image.
+4. Make sure to update Airflow version in ``v2-*-test`` branch after cherry-picking to X.Y.1.dev0 in
+ ``airflow/__init__.py``
+
+
## Manually prepare production Docker Image
Building the image is triggered by running the
(airflow) 07/27: Less verbose information about changed provider.yaml files (#36307)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit c284ece1454bc64afdb2686464e91e42a4519b55
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Tue Dec 19 15:22:44 2023 +0100
Less verbose information about changed provider.yaml files (#36307)
When we attempt to see if provider.yaml files make changes in
dependencies, we print verbose information on what provider.yaml
files changeed, but this is not necessary or needed. This change
makes the output less verbose by detail - just a number of changed
files rather than full list of them - the full list is only printed
when `--verbose` flag is used.
(cherry picked from commit 7212301b2200cb968cd38cdaddb30d7ed7360bda)
---
dev/breeze/src/airflow_breeze/utils/md5_build_check.py | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/dev/breeze/src/airflow_breeze/utils/md5_build_check.py b/dev/breeze/src/airflow_breeze/utils/md5_build_check.py
index 9a43f6ea38..9901d6b1da 100644
--- a/dev/breeze/src/airflow_breeze/utils/md5_build_check.py
+++ b/dev/breeze/src/airflow_breeze/utils/md5_build_check.py
@@ -29,6 +29,7 @@ from airflow_breeze.global_constants import ALL_PROVIDER_YAML_FILES, FILES_FOR_R
from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.path_utils import AIRFLOW_SOURCES_ROOT
from airflow_breeze.utils.run_utils import run_command
+from airflow_breeze.utils.shared_options import get_verbose
if TYPE_CHECKING:
from airflow_breeze.params.build_ci_params import BuildCiParams
@@ -102,11 +103,15 @@ def calculate_md5_checksum_for_files(
if modified_provider_yaml_files:
get_console().print(
"[info]Attempting to generate provider dependencies. "
- "Provider yaml files changed since last check:[/]"
- )
- get_console().print(
- [os.fspath(file.relative_to(AIRFLOW_SOURCES_ROOT)) for file in modified_provider_yaml_files]
+ f"{len(modified_provider_yaml_files)} provider.yaml file(s) changed since last check."
)
+ if get_verbose():
+ get_console().print(
+ [
+ os.fspath(file.relative_to(AIRFLOW_SOURCES_ROOT))
+ for file in modified_provider_yaml_files
+ ]
+ )
# Regenerate provider_dependencies.json
run_command(
[
(airflow) 13/27: Fix --use-airflow-version constraints (#36378)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 99ec731487e57cf3245953fda4d9a5746677a4c7
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Sat Dec 23 14:42:34 2023 +0100
Fix --use-airflow-version constraints (#36378)
When `--use-airflow-version` is a numeric or rc version, the constraints
should be specific for that version when installing airflow. For example
when we install 2.7.3rc1, `constraints-2.7.3rc1` should be used.
This has been lost when fixing version in CI.
This PR introduces these fixes:
* default varlue for airflow constraints is DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH
* when --use-airflow-version is numeric version and default value is
used for constraints (DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH) then it
is replaced with `constraints-VERSION`
* when we print out constraints used, we print which are the
constraints used by Airflow and which by providers.
(cherry picked from commit 5ddd67a9a670caf210fbcd15e033561ebe4404d8)
---
.../common_package_installation_options.py | 5 +-
...elease-management_install-provider-packages.svg | 92 +++++++++---------
...elease-management_install-provider-packages.txt | 2 +-
...release-management_verify-provider-packages.svg | 74 +++++++--------
...release-management_verify-provider-packages.txt | 2 +-
images/breeze/output_shell.svg | 104 ++++++++++-----------
images/breeze/output_shell.txt | 2 +-
images/breeze/output_start-airflow.svg | 82 ++++++++--------
images/breeze/output_start-airflow.txt | 2 +-
.../in_container/install_airflow_and_providers.py | 5 +-
10 files changed, 179 insertions(+), 191 deletions(-)
diff --git a/dev/breeze/src/airflow_breeze/commands/common_package_installation_options.py b/dev/breeze/src/airflow_breeze/commands/common_package_installation_options.py
index 5a5d428886..d0b85e82e8 100644
--- a/dev/breeze/src/airflow_breeze/commands/common_package_installation_options.py
+++ b/dev/breeze/src/airflow_breeze/commands/common_package_installation_options.py
@@ -19,13 +19,14 @@ from __future__ import annotations
import click
+from airflow_breeze.branch_defaults import DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH
from airflow_breeze.global_constants import ALLOWED_CONSTRAINTS_MODES_CI, ALLOWED_CONSTRAINTS_MODES_PROD
from airflow_breeze.utils.custom_param_types import BetterChoice
option_airflow_constraints_reference = click.option(
"--airflow-constraints-reference",
- help="Constraint reference to use for airflow installation (used in calculated constraints URL). "
- "Can be 'default' in which case the default constraints-reference is used.",
+ default=DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH,
+ help="Constraint reference to use for airflow installation (used in calculated constraints URL).",
envvar="AIRFLOW_CONSTRAINTS_REFERENCE",
)
option_airflow_constraints_location = click.option(
diff --git a/images/breeze/output_release-management_install-provider-packages.svg b/images/breeze/output_release-management_install-provider-packages.svg
index 42a8725c29..dd728de859 100644
--- a/images/breeze/output_release-management_install-provider-packages.svg
+++ b/images/breeze/output_release-management_install-provider-packages.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1587.1999999999998" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1562.8" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-release-management-install-provider-packages-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="1536.1999999999998" />
+ <rect x="0" y="0" width="1463.0" height="1511.8" />
</clipPath>
<clipPath id="breeze-release-management-install-provider-packages-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -228,12 +228,9 @@
<clipPath id="breeze-release-management-install-provider-packages-line-60">
<rect x="0" y="1465.5" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-release-management-install-provider-packages-line-61">
- <rect x="0" y="1489.9" width="1464" height="24.65"/>
- </clipPath>
</defs>
- <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1585.2" rx="8"/><text class="breeze-release-management-install-provider-packages-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: release-management install-provider-packages</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1560.8" rx="8"/><text class="breeze-release-management-install-provider-packages-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: release-management install-provider-packages</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -264,48 +261,47 @@
</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-18)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="459.2" textLength="866.2" clip-path="url(#breeze-release-management-install-provider-packages-line-18)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class= [...]
</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-19)">│</text><text class="breeze-release-management-install-provider-packages-r5" x="475.8" y="483.6" textLength="866.2" clip-path="url(#breeze-release-management-install-provider-packages-line-19)">[default: constraints-source-providers]            [...]
</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-20)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="508" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-20)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="508" textLength="97.6" clip [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-21)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="532.4" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-21)">constraints URL). Can be 'default' in which case the de [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-22)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="556.8" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-22)">constraints-reference is used.            [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-23)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="581.2" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-23)">(TEXT)                 &# [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-24)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-24)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="605.6" textLength="97.6 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-25)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-25)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="630" textLength="97.6" clip [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-26)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-26)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="654.4" textLength="97.6 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-27)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="475.8" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-27)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="488" y="678.8" textLength="48.8 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-28)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="703.2" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-28)">(TEXT)                 &# [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-29)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-29)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="727.6" textLength="97.6 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-30)">│</text><text class="breeze-release-management-install-provider-packages-r5" x="475.8" y="752" textLength="658.8" clip-path="url(#breeze-release-management-install-provider-packages-line-30)">[default: wheel]                [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-31)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-31)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="776.4" textLength="122" [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-32)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="800.8" textLength="927.2" clip-path="url(#breeze-release-management-install-provider-packages-line-32)">(TEXT)                 &# [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-33)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-33)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="825.2" textLength="122" [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-34)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="849.6" textLength="866.2" clip-path="url(#breeze-release-management-install-provider-packages-line-34)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class= [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-35)">│</text><text class="breeze-release-management-install-provider-packages-r5" x="475.8" y="874" textLength="866.2" clip-path="url(#breeze-release-management-install-provider-packages-line-35)">[default: constraints-source-providers]            [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-36)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-36)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="898.4" textLength="122" [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-37)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="922.8" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-37)">constraints URL). Can be 'default' in which case the de [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-38)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="947.2" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-38)">constraints-reference is used.            [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-39)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="971.6" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-39)">(TEXT)                 &# [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-40)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="996" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-40)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="996" textLength="122" clip- [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-41)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1020.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-41)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1020.4" textLength="4 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-42)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="1044.8" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-42)">install from PyPI), `none`, `wheel`, or `sdist` to install from [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-43)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="1069.2" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-43)">or VCS URL to install from (https://pip.pypa.io/en/stable/topics/vcs-support/) [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1093.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-44)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="1093.6" textLength="97.6" clip-path="url(#breeze-release-management-install-provider-packages-line-44)">Implies </text><text class="breeze-release-management-install-provider-packages-r4" x="573.4" y="1093.6" [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1118" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-45)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="1118" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-45)">(none | wheel | sdist | <airflow_version>)      [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-46)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1142.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-46)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1142.4" textLength="4 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1166.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-47)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="1166.8" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-47)">folder when entering breeze.            [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1191.2" textLength="1464" clip-path="url(#breeze-release-management-install-provider-packages-line-48)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-install-provider-packages-r1" x="1464" y="1191.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-l [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1215.6" textLength="24.4" clip-path="url(#breeze-release-management-install-provider-packages-line-49)">â•─</text><text class="breeze-release-management-install-provider-packages-r5" x="24.4" y="1215.6" textLength="219.6" clip-path="url(#breeze-release-management-install-provider-packages-line-49)"> Parallel running </text><text class="breeze-release-management-install-provider-packages-r5" [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1240" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-50)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1240" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-50)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1240" textLength="48.8" c [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1264.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-51)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1264.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-51)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1264.4" textLength="1 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1288.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-52)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="378.2" y="1288.8" textLength="915" clip-path="url(#breeze-release-management-install-provider-packages-line-52)">(INTEGER RANGE)                [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1313.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-53)">│</text><text class="breeze-release-management-install-provider-packages-r5" x="378.2" y="1313.2" textLength="915" clip-path="url(#breeze-release-management-install-provider-packages-line-53)">[default: 4; 1<=x<=8]            & [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1337.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-54)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1337.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-54)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1337.6" textLength="6 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1362" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-55)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1362" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-55)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1362" textLength="97.6" c [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1386.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-56)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1386.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-56)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1386.4" textLength="7 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1410.8" textLength="1464" clip-path="url(#breeze-release-management-install-provider-packages-line-57)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-install-provider-packages-r1" x="1464" y="1410.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-l [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1435.2" textLength="24.4" clip-path="url(#breeze-release-management-install-provider-packages-line-58)">â•─</text><text class="breeze-release-management-install-provider-packages-r5" x="24.4" y="1435.2" textLength="195.2" clip-path="url(#breeze-release-management-install-provider-packages-line-58)"> Common options </text><text class="breeze-release-management-install-provider-packages-r5" x [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1459.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-59)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1459.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-59)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1459.6" textLength="4 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1484" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-60)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1484" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-60)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1484" textLength="97.6" c [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1508.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-61)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1508.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-61)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1508.4" textLength="6 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1532.8" textLength="1464" clip-path="url(#breeze-release-management-install-provider-packages-line-62)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-install-provider-packages-r1" x="1464" y="1532.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-l [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-21)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="532.4" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-21)">constraints URL).               [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-22)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="556.8" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-22)">(TEXT)                 &# [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-23)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-23)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="581.2" textLength="97.6 [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-24)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-24)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="605.6" textLength="97.6 [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-25)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-25)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="630" textLength="97.6" clip [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-26)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="475.8" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-26)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="488" y="654.4" textLength="48.8 [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-27)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="678.8" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-27)">(TEXT)                 &# [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-28)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-28)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="703.2" textLength="97.6 [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-29)">│</text><text class="breeze-release-management-install-provider-packages-r5" x="475.8" y="727.6" textLength="658.8" clip-path="url(#breeze-release-management-install-provider-packages-line-29)">[default: wheel]                [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-30)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="752" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-30)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="752" textLength="122" clip- [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-31)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="776.4" textLength="927.2" clip-path="url(#breeze-release-management-install-provider-packages-line-31)">(TEXT)                 &# [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-32)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-32)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="800.8" textLength="122" [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-33)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="825.2" textLength="866.2" clip-path="url(#breeze-release-management-install-provider-packages-line-33)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class= [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-34)">│</text><text class="breeze-release-management-install-provider-packages-r5" x="475.8" y="849.6" textLength="866.2" clip-path="url(#breeze-release-management-install-provider-packages-line-34)">[default: constraints-source-providers]            [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-35)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="874" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-35)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="874" textLength="122" clip- [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-36)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="898.4" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-36)">constraints URL). Can be 'default' in which case the de [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-37)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="922.8" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-37)">constraints-reference is used.            [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-38)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="947.2" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-38)">(TEXT)                 &# [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-39)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="971.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-39)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="971.6" textLength="122" [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-40)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="996" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-40)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="996" textLength="48.8" clip [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-41)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="1020.4" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-41)">install from PyPI), `none`, `wheel`, or `sdist` to install from [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-42)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="1044.8" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-42)">or VCS URL to install from (https://pip.pypa.io/en/stable/topics/vcs-support/) [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-43)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="1069.2" textLength="97.6" clip-path="url(#breeze-release-management-install-provider-packages-line-43)">Implies </text><text class="breeze-release-management-install-provider-packages-r4" x="573.4" y="1069.2" [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1093.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-44)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="1093.6" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-44)">(none | wheel | sdist | <airflow_version>)      [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1118" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-45)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1118" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-45)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1118" textLength="48.8" c [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-46)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="1142.4" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-46)">folder when entering breeze.            [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1166.8" textLength="1464" clip-path="url(#breeze-release-management-install-provider-packages-line-47)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-install-provider-packages-r1" x="1464" y="1166.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-l [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1191.2" textLength="24.4" clip-path="url(#breeze-release-management-install-provider-packages-line-48)">â•─</text><text class="breeze-release-management-install-provider-packages-r5" x="24.4" y="1191.2" textLength="219.6" clip-path="url(#breeze-release-management-install-provider-packages-line-48)"> Parallel running </text><text class="breeze-release-management-install-provider-packages-r5" [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1215.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-49)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1215.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-49)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1215.6" textLength="4 [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1240" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-50)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1240" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-50)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1240" textLength="146.4" [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1264.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-51)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="378.2" y="1264.4" textLength="915" clip-path="url(#breeze-release-management-install-provider-packages-line-51)">(INTEGER RANGE)                [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1288.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-52)">│</text><text class="breeze-release-management-install-provider-packages-r5" x="378.2" y="1288.8" textLength="915" clip-path="url(#breeze-release-management-install-provider-packages-line-52)">[default: 4; 1<=x<=8]            & [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1313.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-53)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1313.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-53)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1313.2" textLength="6 [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1337.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-54)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1337.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-54)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1337.6" textLength="9 [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1362" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-55)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1362" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-55)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1362" textLength="73.2" c [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1386.4" textLength="1464" clip-path="url(#breeze-release-management-install-provider-packages-line-56)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-install-provider-packages-r1" x="1464" y="1386.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-l [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1410.8" textLength="24.4" clip-path="url(#breeze-release-management-install-provider-packages-line-57)">â•─</text><text class="breeze-release-management-install-provider-packages-r5" x="24.4" y="1410.8" textLength="195.2" clip-path="url(#breeze-release-management-install-provider-packages-line-57)"> Common options </text><text class="breeze-release-management-install-provider-packages-r5" x [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1435.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-58)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1435.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-58)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1435.2" textLength="4 [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1459.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-59)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1459.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-59)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1459.6" textLength="9 [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1484" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-60)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1484" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-60)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1484" textLength="61" cli [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1508.4" textLength="1464" clip-path="url(#breeze-release-management-install-provider-packages-line-61)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-install-provider-packages-r1" x="1464" y="1508.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-l [...]
</text>
</g>
</g>
diff --git a/images/breeze/output_release-management_install-provider-packages.txt b/images/breeze/output_release-management_install-provider-packages.txt
index 917fddb9a7..cd480d68e4 100644
--- a/images/breeze/output_release-management_install-provider-packages.txt
+++ b/images/breeze/output_release-management_install-provider-packages.txt
@@ -1 +1 @@
-71725748176f8e86b78433c6ab8fa698
+aba68f434b87d954ad27f594031bb919
diff --git a/images/breeze/output_release-management_verify-provider-packages.svg b/images/breeze/output_release-management_verify-provider-packages.svg
index b755651de8..71011b5580 100644
--- a/images/breeze/output_release-management_verify-provider-packages.svg
+++ b/images/breeze/output_release-management_verify-provider-packages.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1367.6" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1343.1999999999998" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-release-management-verify-provider-packages-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="1316.6" />
+ <rect x="0" y="0" width="1463.0" height="1292.1999999999998" />
</clipPath>
<clipPath id="breeze-release-management-verify-provider-packages-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -201,12 +201,9 @@
<clipPath id="breeze-release-management-verify-provider-packages-line-51">
<rect x="0" y="1245.9" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-release-management-verify-provider-packages-line-52">
- <rect x="0" y="1270.3" width="1464" height="24.65"/>
- </clipPath>
</defs>
- <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1365.6" rx="8"/><text class="breeze-release-management-verify-provider-packages-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: release-management verify-provider-packages</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1341.2" rx="8"/><text class="breeze-release-management-verify-provider-packages-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: release-management verify-provider-packages</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -237,39 +234,38 @@
</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-18)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="459.2" textLength="866.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-18)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class="bre [...]
</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-19)">│</text><text class="breeze-release-management-verify-provider-packages-r5" x="475.8" y="483.6" textLength="866.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-19)">[default: constraints-source-providers]            [...]
</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-20)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="508" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-20)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="508" textLength="97.6" clip-path [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-21)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="532.4" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-21)">constraints URL). Can be 'default' in which case the defaul [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-22)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="556.8" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-22)">constraints-reference is used.            &# [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-23)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="581.2" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-23)">(TEXT)                   [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-24)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-24)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="605.6" textLength="97.6" cli [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-25)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-25)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="630" textLength="97.6" clip-path [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-26)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-26)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="654.4" textLength="97.6" cli [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-27)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="475.8" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-27)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="488" y="678.8" textLength="48.8" cli [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-28)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="703.2" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-28)">(TEXT)                   [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-29)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-29)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="727.6" textLength="97.6" cli [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-30)">│</text><text class="breeze-release-management-verify-provider-packages-r5" x="475.8" y="752" textLength="658.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-30)">[default: wheel]                & [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-31)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-31)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="776.4" textLength="122" clip [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-32)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="800.8" textLength="927.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-32)">(TEXT)                   [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-33)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-33)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="825.2" textLength="122" clip [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-34)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="849.6" textLength="866.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-34)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class="bre [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-35)">│</text><text class="breeze-release-management-verify-provider-packages-r5" x="475.8" y="874" textLength="866.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-35)">[default: constraints-source-providers]            &# [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-36)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-36)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="898.4" textLength="122" clip [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-37)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="922.8" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-37)">constraints URL). Can be 'default' in which case the defaul [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-38)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="947.2" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-38)">constraints-reference is used.            &# [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-39)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="971.6" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-39)">(TEXT)                   [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-40)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="996" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-40)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="996" textLength="122" clip-path= [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-41)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="1020.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-41)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="1020.4" textLength="48.8" [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-42)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="1044.8" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-42)">install from PyPI), `none`, `wheel`, or `sdist` to install from [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-43)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="1069.2" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-43)">or VCS URL to install from (https://pip.pypa.io/en/stable/topics/vcs-support/).</t [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1093.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-44)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="1093.6" textLength="97.6" clip-path="url(#breeze-release-management-verify-provider-packages-line-44)">Implies </text><text class="breeze-release-management-verify-provider-packages-r4" x="573.4" y="1093.6" text [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1118" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-45)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="1118" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-45)">(none | wheel | sdist | <airflow_version>)      &# [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-46)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="1142.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-46)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="1142.4" textLength="48.8" [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1166.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-47)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="1166.8" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-47)">folder when entering breeze.            [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1191.2" textLength="1464" clip-path="url(#breeze-release-management-verify-provider-packages-line-48)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-verify-provider-packages-r1" x="1464" y="1191.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-48)">
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1215.6" textLength="24.4" clip-path="url(#breeze-release-management-verify-provider-packages-line-49)">â•─</text><text class="breeze-release-management-verify-provider-packages-r5" x="24.4" y="1215.6" textLength="195.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-49)"> Common options </text><text class="breeze-release-management-verify-provider-packages-r5" x="219 [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1240" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-50)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="1240" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-50)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="1240" textLength="48.8" clip-p [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1264.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-51)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="1264.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-51)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="1264.4" textLength="97.6" [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1288.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-52)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="1288.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-52)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="1288.8" textLength="61" cl [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1313.2" textLength="1464" clip-path="url(#breeze-release-management-verify-provider-packages-line-53)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-verify-provider-packages-r1" x="1464" y="1313.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-53)">
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-21)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="532.4" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-21)">constraints URL).               &# [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-22)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="556.8" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-22)">(TEXT)                   [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-23)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-23)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="581.2" textLength="97.6" cli [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-24)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-24)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="605.6" textLength="97.6" cli [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-25)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-25)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="630" textLength="97.6" clip-path [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-26)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="475.8" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-26)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="488" y="654.4" textLength="48.8" cli [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-27)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="678.8" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-27)">(TEXT)                   [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-28)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-28)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="703.2" textLength="97.6" cli [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-29)">│</text><text class="breeze-release-management-verify-provider-packages-r5" x="475.8" y="727.6" textLength="658.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-29)">[default: wheel]                [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-30)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="752" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-30)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="752" textLength="122" clip-path= [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-31)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="776.4" textLength="927.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-31)">(TEXT)                   [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-32)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-32)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="800.8" textLength="122" clip [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-33)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="825.2" textLength="866.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-33)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class="bre [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-34)">│</text><text class="breeze-release-management-verify-provider-packages-r5" x="475.8" y="849.6" textLength="866.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-34)">[default: constraints-source-providers]            [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-35)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="874" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-35)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="874" textLength="122" clip-path= [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-36)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="898.4" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-36)">constraints URL). Can be 'default' in which case the defaul [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-37)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="922.8" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-37)">constraints-reference is used.            &# [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-38)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="947.2" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-38)">(TEXT)                   [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-39)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="971.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-39)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="971.6" textLength="122" clip [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-40)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="996" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-40)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="996" textLength="48.8" clip-path [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-41)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="1020.4" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-41)">install from PyPI), `none`, `wheel`, or `sdist` to install from [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-42)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="1044.8" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-42)">or VCS URL to install from (https://pip.pypa.io/en/stable/topics/vcs-support/).</t [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-43)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="1069.2" textLength="97.6" clip-path="url(#breeze-release-management-verify-provider-packages-line-43)">Implies </text><text class="breeze-release-management-verify-provider-packages-r4" x="573.4" y="1069.2" text [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1093.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-44)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="1093.6" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-44)">(none | wheel | sdist | <airflow_version>)      [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1118" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-45)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="1118" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-45)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="1118" textLength="48.8" clip-p [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-46)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="1142.4" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-46)">folder when entering breeze.            [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1166.8" textLength="1464" clip-path="url(#breeze-release-management-verify-provider-packages-line-47)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-verify-provider-packages-r1" x="1464" y="1166.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-47)">
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1191.2" textLength="24.4" clip-path="url(#breeze-release-management-verify-provider-packages-line-48)">â•─</text><text class="breeze-release-management-verify-provider-packages-r5" x="24.4" y="1191.2" textLength="195.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-48)"> Common options </text><text class="breeze-release-management-verify-provider-packages-r5" x="219 [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1215.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-49)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="1215.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-49)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="1215.6" textLength="48.8" [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1240" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-50)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="1240" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-50)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="1240" textLength="97.6" clip-p [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1264.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-51)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="1264.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-51)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="1264.4" textLength="61" cl [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1288.8" textLength="1464" clip-path="url(#breeze-release-management-verify-provider-packages-line-52)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-verify-provider-packages-r1" x="1464" y="1288.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-52)">
</text>
</g>
</g>
diff --git a/images/breeze/output_release-management_verify-provider-packages.txt b/images/breeze/output_release-management_verify-provider-packages.txt
index 1ab9de67fc..9ea71c96db 100644
--- a/images/breeze/output_release-management_verify-provider-packages.txt
+++ b/images/breeze/output_release-management_verify-provider-packages.txt
@@ -1 +1 @@
-505041dc3cf367fe381126db0b62c4a5
+2d128022c661ad702c6236dd75dd8531
diff --git a/images/breeze/output_shell.svg b/images/breeze/output_shell.svg
index 8027ed2fe2..8d9d7350d5 100644
--- a/images/breeze/output_shell.svg
+++ b/images/breeze/output_shell.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 3051.2" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 3026.7999999999997" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-shell-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="3000.2" />
+ <rect x="0" y="0" width="1463.0" height="2975.7999999999997" />
</clipPath>
<clipPath id="breeze-shell-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -408,12 +408,9 @@
<clipPath id="breeze-shell-line-120">
<rect x="0" y="2929.5" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-shell-line-121">
- <rect x="0" y="2953.9" width="1464" height="24.65"/>
- </clipPath>
</defs>
- <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="3049.2" rx="8"/><text class="breeze-shell-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: shell</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="3024.8" rx="8"/><text class="breeze-shell-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: shell</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -498,54 +495,53 @@
</text><text class="breeze-shell-r5" x="0" y="1776.8" textLength="12.2" clip-path="url(#breeze-shell-line-72)">│</text><text class="breeze-shell-r7" x="475.8" y="1776.8" textLength="866.2" clip-path="url(#breeze-shell-line-72)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class="breeze-shell-r5" x="1451.8" y="1776.8" textLength="12.2" clip-path="url(#breeze-shell-line-72)">│</text><text class="breeze-shell-r1" x="1464" y="1776.8" [...]
</text><text class="breeze-shell-r5" x="0" y="1801.2" textLength="12.2" clip-path="url(#breeze-shell-line-73)">│</text><text class="breeze-shell-r5" x="475.8" y="1801.2" textLength="866.2" clip-path="url(#breeze-shell-line-73)">[default: constraints-source-providers]                                </text><text class="breeze-s [...]
</text><text class="breeze-shell-r5" x="0" y="1825.6" textLength="12.2" clip-path="url(#breeze-shell-line-74)">│</text><text class="breeze-shell-r4" x="24.4" y="1825.6" textLength="12.2" clip-path="url(#breeze-shell-line-74)">-</text><text class="breeze-shell-r4" x="36.6" y="1825.6" textLength="97.6" clip-path="url(#breeze-shell-line-74)">-airflow</text><text class="breeze-shell-r4" x="134.2" y="1825.6" textLength="268.4" clip-path="url(#breeze-shell-line-74)">-constraints-reference</tex [...]
-</text><text class="breeze-shell-r5" x="0" y="1850" textLength="12.2" clip-path="url(#breeze-shell-line-75)">│</text><text class="breeze-shell-r1" x="475.8" y="1850" textLength="963.8" clip-path="url(#breeze-shell-line-75)">constraints URL). Can be 'default' in which case the default                   </text><text class="breeze-shell-r5" x= [...]
-</text><text class="breeze-shell-r5" x="0" y="1874.4" textLength="12.2" clip-path="url(#breeze-shell-line-76)">│</text><text class="breeze-shell-r1" x="475.8" y="1874.4" textLength="963.8" clip-path="url(#breeze-shell-line-76)">constraints-reference is used.                                     &# [...]
-</text><text class="breeze-shell-r5" x="0" y="1898.8" textLength="12.2" clip-path="url(#breeze-shell-line-77)">│</text><text class="breeze-shell-r7" x="475.8" y="1898.8" textLength="963.8" clip-path="url(#breeze-shell-line-77)">(TEXT)                                            [...]
-</text><text class="breeze-shell-r5" x="0" y="1923.2" textLength="12.2" clip-path="url(#breeze-shell-line-78)">│</text><text class="breeze-shell-r4" x="24.4" y="1923.2" textLength="12.2" clip-path="url(#breeze-shell-line-78)">-</text><text class="breeze-shell-r4" x="36.6" y="1923.2" textLength="97.6" clip-path="url(#breeze-shell-line-78)">-airflow</text><text class="breeze-shell-r4" x="134.2" y="1923.2" textLength="85.4" clip-path="url(#breeze-shell-line-78)">-extras</text><text class="b [...]
-</text><text class="breeze-shell-r5" x="0" y="1947.6" textLength="12.2" clip-path="url(#breeze-shell-line-79)">│</text><text class="breeze-shell-r4" x="24.4" y="1947.6" textLength="12.2" clip-path="url(#breeze-shell-line-79)">-</text><text class="breeze-shell-r4" x="36.6" y="1947.6" textLength="97.6" clip-path="url(#breeze-shell-line-79)">-airflow</text><text class="breeze-shell-r4" x="134.2" y="1947.6" textLength="207.4" clip-path="url(#breeze-shell-line-79)">-skip-constraints</text><te [...]
-</text><text class="breeze-shell-r5" x="0" y="1972" textLength="12.2" clip-path="url(#breeze-shell-line-80)">│</text><text class="breeze-shell-r4" x="24.4" y="1972" textLength="12.2" clip-path="url(#breeze-shell-line-80)">-</text><text class="breeze-shell-r4" x="36.6" y="1972" textLength="97.6" clip-path="url(#breeze-shell-line-80)">-install</text><text class="breeze-shell-r4" x="134.2" y="1972" textLength="231.8" clip-path="url(#breeze-shell-line-80)">-selected-providers</text><text cla [...]
-</text><text class="breeze-shell-r5" x="0" y="1996.4" textLength="12.2" clip-path="url(#breeze-shell-line-81)">│</text><text class="breeze-shell-r4" x="475.8" y="1996.4" textLength="12.2" clip-path="url(#breeze-shell-line-81)">-</text><text class="breeze-shell-r4" x="488" y="1996.4" textLength="48.8" clip-path="url(#breeze-shell-line-81)">-use</text><text class="breeze-shell-r4" x="536.8" y="1996.4" textLength="231.8" clip-path="url(#breeze-shell-line-81)">-packages-from-dist</text><text [...]
-</text><text class="breeze-shell-r5" x="0" y="2020.8" textLength="12.2" clip-path="url(#breeze-shell-line-82)">│</text><text class="breeze-shell-r7" x="475.8" y="2020.8" textLength="963.8" clip-path="url(#breeze-shell-line-82)">(TEXT)                                            [...]
-</text><text class="breeze-shell-r5" x="0" y="2045.2" textLength="12.2" clip-path="url(#breeze-shell-line-83)">│</text><text class="breeze-shell-r4" x="24.4" y="2045.2" textLength="12.2" clip-path="url(#breeze-shell-line-83)">-</text><text class="breeze-shell-r4" x="36.6" y="2045.2" textLength="97.6" clip-path="url(#breeze-shell-line-83)">-package</text><text class="breeze-shell-r4" x="134.2" y="2045.2" textLength="85.4" clip-path="url(#breeze-shell-line-83)">-format</text><text class="b [...]
-</text><text class="breeze-shell-r5" x="0" y="2069.6" textLength="12.2" clip-path="url(#breeze-shell-line-84)">│</text><text class="breeze-shell-r5" x="475.8" y="2069.6" textLength="658.8" clip-path="url(#breeze-shell-line-84)">[default: wheel]                                      </text><text cl [...]
-</text><text class="breeze-shell-r5" x="0" y="2094" textLength="12.2" clip-path="url(#breeze-shell-line-85)">│</text><text class="breeze-shell-r4" x="24.4" y="2094" textLength="12.2" clip-path="url(#breeze-shell-line-85)">-</text><text class="breeze-shell-r4" x="36.6" y="2094" textLength="122" clip-path="url(#breeze-shell-line-85)">-providers</text><text class="breeze-shell-r4" x="158.6" y="2094" textLength="256.2" clip-path="url(#breeze-shell-line-85)">-constraints-location</text><text [...]
-</text><text class="breeze-shell-r5" x="0" y="2118.4" textLength="12.2" clip-path="url(#breeze-shell-line-86)">│</text><text class="breeze-shell-r7" x="475.8" y="2118.4" textLength="927.2" clip-path="url(#breeze-shell-line-86)">(TEXT)                                            [...]
-</text><text class="breeze-shell-r5" x="0" y="2142.8" textLength="12.2" clip-path="url(#breeze-shell-line-87)">│</text><text class="breeze-shell-r4" x="24.4" y="2142.8" textLength="12.2" clip-path="url(#breeze-shell-line-87)">-</text><text class="breeze-shell-r4" x="36.6" y="2142.8" textLength="122" clip-path="url(#breeze-shell-line-87)">-providers</text><text class="breeze-shell-r4" x="158.6" y="2142.8" textLength="207.4" clip-path="url(#breeze-shell-line-87)">-constraints-mode</text><t [...]
-</text><text class="breeze-shell-r5" x="0" y="2167.2" textLength="12.2" clip-path="url(#breeze-shell-line-88)">│</text><text class="breeze-shell-r7" x="475.8" y="2167.2" textLength="866.2" clip-path="url(#breeze-shell-line-88)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class="breeze-shell-r5" x="1451.8" y="2167.2" textLength="12.2" clip-path="url(#breeze-shell-line-88)">│</text><text class="breeze-shell-r1" x="1464" y="2167.2" [...]
-</text><text class="breeze-shell-r5" x="0" y="2191.6" textLength="12.2" clip-path="url(#breeze-shell-line-89)">│</text><text class="breeze-shell-r5" x="475.8" y="2191.6" textLength="866.2" clip-path="url(#breeze-shell-line-89)">[default: constraints-source-providers]                                </text><text class="breeze-s [...]
-</text><text class="breeze-shell-r5" x="0" y="2216" textLength="12.2" clip-path="url(#breeze-shell-line-90)">│</text><text class="breeze-shell-r4" x="24.4" y="2216" textLength="12.2" clip-path="url(#breeze-shell-line-90)">-</text><text class="breeze-shell-r4" x="36.6" y="2216" textLength="122" clip-path="url(#breeze-shell-line-90)">-providers</text><text class="breeze-shell-r4" x="158.6" y="2216" textLength="268.4" clip-path="url(#breeze-shell-line-90)">-constraints-reference</text><text [...]
-</text><text class="breeze-shell-r5" x="0" y="2240.4" textLength="12.2" clip-path="url(#breeze-shell-line-91)">│</text><text class="breeze-shell-r1" x="475.8" y="2240.4" textLength="963.8" clip-path="url(#breeze-shell-line-91)">constraints URL). Can be 'default' in which case the default                   </text><text class="breeze-shell-r5 [...]
-</text><text class="breeze-shell-r5" x="0" y="2264.8" textLength="12.2" clip-path="url(#breeze-shell-line-92)">│</text><text class="breeze-shell-r1" x="475.8" y="2264.8" textLength="963.8" clip-path="url(#breeze-shell-line-92)">constraints-reference is used.                                     &# [...]
-</text><text class="breeze-shell-r5" x="0" y="2289.2" textLength="12.2" clip-path="url(#breeze-shell-line-93)">│</text><text class="breeze-shell-r7" x="475.8" y="2289.2" textLength="963.8" clip-path="url(#breeze-shell-line-93)">(TEXT)                                            [...]
-</text><text class="breeze-shell-r5" x="0" y="2313.6" textLength="12.2" clip-path="url(#breeze-shell-line-94)">│</text><text class="breeze-shell-r4" x="24.4" y="2313.6" textLength="12.2" clip-path="url(#breeze-shell-line-94)">-</text><text class="breeze-shell-r4" x="36.6" y="2313.6" textLength="122" clip-path="url(#breeze-shell-line-94)">-providers</text><text class="breeze-shell-r4" x="158.6" y="2313.6" textLength="207.4" clip-path="url(#breeze-shell-line-94)">-skip-constraints</text><t [...]
-</text><text class="breeze-shell-r5" x="0" y="2338" textLength="12.2" clip-path="url(#breeze-shell-line-95)">│</text><text class="breeze-shell-r4" x="24.4" y="2338" textLength="12.2" clip-path="url(#breeze-shell-line-95)">-</text><text class="breeze-shell-r4" x="36.6" y="2338" textLength="48.8" clip-path="url(#breeze-shell-line-95)">-use</text><text class="breeze-shell-r4" x="85.4" y="2338" textLength="195.2" clip-path="url(#breeze-shell-line-95)">-airflow-version</text><text class="bree [...]
-</text><text class="breeze-shell-r5" x="0" y="2362.4" textLength="12.2" clip-path="url(#breeze-shell-line-96)">│</text><text class="breeze-shell-r1" x="475.8" y="2362.4" textLength="963.8" clip-path="url(#breeze-shell-line-96)">install from PyPI), `none`, `wheel`, or `sdist` to install from `dist` folder, </text><text class="breeze-shell-r5" x="1451.8" y="2362.4" textLength="12.2" clip-path="url(#breeze-shell-line-96)">│</text>< [...]
-</text><text class="breeze-shell-r5" x="0" y="2386.8" textLength="12.2" clip-path="url(#breeze-shell-line-97)">│</text><text class="breeze-shell-r1" x="475.8" y="2386.8" textLength="963.8" clip-path="url(#breeze-shell-line-97)">or VCS URL to install from (https://pip.pypa.io/en/stable/topics/vcs-support/).</text><text class="breeze-shell-r5" x="1451.8" y="2386.8" textLength="12.2" clip-path="url(#breeze-shell-line-97)">│</text><text class="breeze-shell-r1" x [...]
-</text><text class="breeze-shell-r5" x="0" y="2411.2" textLength="12.2" clip-path="url(#breeze-shell-line-98)">│</text><text class="breeze-shell-r1" x="475.8" y="2411.2" textLength="97.6" clip-path="url(#breeze-shell-line-98)">Implies </text><text class="breeze-shell-r4" x="573.4" y="2411.2" textLength="12.2" clip-path="url(#breeze-shell-line-98)">-</text><text class="breeze-shell-r4" x="585.6" y="2411.2" textLength="73.2" clip-path="url(#breeze-shell-line-98)">-mount</text><text cl [...]
-</text><text class="breeze-shell-r5" x="0" y="2435.6" textLength="12.2" clip-path="url(#breeze-shell-line-99)">│</text><text class="breeze-shell-r7" x="475.8" y="2435.6" textLength="963.8" clip-path="url(#breeze-shell-line-99)">(none | wheel | sdist | <airflow_version>)                                [...]
-</text><text class="breeze-shell-r5" x="0" y="2460" textLength="12.2" clip-path="url(#breeze-shell-line-100)">│</text><text class="breeze-shell-r4" x="24.4" y="2460" textLength="12.2" clip-path="url(#breeze-shell-line-100)">-</text><text class="breeze-shell-r4" x="36.6" y="2460" textLength="48.8" clip-path="url(#breeze-shell-line-100)">-use</text><text class="breeze-shell-r4" x="85.4" y="2460" textLength="231.8" clip-path="url(#breeze-shell-line-100)">-packages-from-dist</text><text clas [...]
-</text><text class="breeze-shell-r5" x="0" y="2484.4" textLength="12.2" clip-path="url(#breeze-shell-line-101)">│</text><text class="breeze-shell-r1" x="475.8" y="2484.4" textLength="963.8" clip-path="url(#breeze-shell-line-101)">folder when entering breeze.                                     [...]
-</text><text class="breeze-shell-r5" x="0" y="2508.8" textLength="1464" clip-path="url(#breeze-shell-line-102)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="2508.8" textLength="12.2" clip-path="url(#breeze-shell-line-102)">
-</text><text class="breeze-shell-r5" x="0" y="2533.2" textLength="24.4" clip-path="url(#breeze-shell-line-103)">â•─</text><text class="breeze-shell-r5" x="24.4" y="2533.2" textLength="500.2" clip-path="url(#breeze-shell-line-103)"> Upgrading/downgrading selected packages </text><text class="breeze-shell-r5" x="524.6" y="2533.2" textLength="915" clip-path="url(#breeze-shell-line-103)">───────────────────────────────────────────────────────────────────────────</text><tex [...]
-</text><text class="breeze-shell-r5" x="0" y="2557.6" textLength="12.2" clip-path="url(#breeze-shell-line-104)">│</text><text class="breeze-shell-r4" x="24.4" y="2557.6" textLength="12.2" clip-path="url(#breeze-shell-line-104)">-</text><text class="breeze-shell-r4" x="36.6" y="2557.6" textLength="97.6" clip-path="url(#breeze-shell-line-104)">-upgrade</text><text class="breeze-shell-r4" x="134.2" y="2557.6" textLength="61" clip-path="url(#breeze-shell-line-104)">-boto</text><text class="b [...]
-</text><text class="breeze-shell-r5" x="0" y="2582" textLength="12.2" clip-path="url(#breeze-shell-line-105)">│</text><text class="breeze-shell-r4" x="24.4" y="2582" textLength="12.2" clip-path="url(#breeze-shell-line-105)">-</text><text class="breeze-shell-r4" x="36.6" y="2582" textLength="122" clip-path="url(#breeze-shell-line-105)">-downgrade</text><text class="breeze-shell-r4" x="158.6" y="2582" textLength="134.2" clip-path="url(#breeze-shell-line-105)">-sqlalchemy</text><text class= [...]
-</text><text class="breeze-shell-r5" x="0" y="2606.4" textLength="1464" clip-path="url(#breeze-shell-line-106)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="2606.4" textLength="12.2" clip-path="url(#breeze-shell-line-106)">
-</text><text class="breeze-shell-r5" x="0" y="2630.8" textLength="24.4" clip-path="url(#breeze-shell-line-107)">â•─</text><text class="breeze-shell-r5" x="24.4" y="2630.8" textLength="183" clip-path="url(#breeze-shell-line-107)"> DB test flags </text><text class="breeze-shell-r5" x="207.4" y="2630.8" textLength="1232.2" clip-path="url(#breeze-shell-line-107)">─────────────────────────────────────────────────────────────────────────────────────────────────────</text><te [...]
-</text><text class="breeze-shell-r5" x="0" y="2655.2" textLength="12.2" clip-path="url(#breeze-shell-line-108)">│</text><text class="breeze-shell-r4" x="24.4" y="2655.2" textLength="12.2" clip-path="url(#breeze-shell-line-108)">-</text><text class="breeze-shell-r4" x="36.6" y="2655.2" textLength="48.8" clip-path="url(#breeze-shell-line-108)">-run</text><text class="breeze-shell-r4" x="85.4" y="2655.2" textLength="170.8" clip-path="url(#breeze-shell-line-108)">-db-tests-only</text><text c [...]
-</text><text class="breeze-shell-r5" x="0" y="2679.6" textLength="12.2" clip-path="url(#breeze-shell-line-109)">│</text><text class="breeze-shell-r4" x="24.4" y="2679.6" textLength="12.2" clip-path="url(#breeze-shell-line-109)">-</text><text class="breeze-shell-r4" x="36.6" y="2679.6" textLength="61" clip-path="url(#breeze-shell-line-109)">-skip</text><text class="breeze-shell-r4" x="97.6" y="2679.6" textLength="109.8" clip-path="url(#breeze-shell-line-109)">-db-tests</text><text class=" [...]
-</text><text class="breeze-shell-r5" x="0" y="2704" textLength="1464" clip-path="url(#breeze-shell-line-110)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="2704" textLength="12.2" clip-path="url(#breeze-shell-line-110)">
-</text><text class="breeze-shell-r5" x="0" y="2728.4" textLength="24.4" clip-path="url(#breeze-shell-line-111)">â•─</text><text class="breeze-shell-r5" x="24.4" y="2728.4" textLength="183" clip-path="url(#breeze-shell-line-111)"> Other options </text><text class="breeze-shell-r5" x="207.4" y="2728.4" textLength="1232.2" clip-path="url(#breeze-shell-line-111)">─────────────────────────────────────────────────────────────────────────────────────────────────────</text><text cl [...]
-</text><text class="breeze-shell-r5" x="0" y="2752.8" textLength="12.2" clip-path="url(#breeze-shell-line-112)">│</text><text class="breeze-shell-r4" x="24.4" y="2752.8" textLength="12.2" clip-path="url(#breeze-shell-line-112)">-</text><text class="breeze-shell-r4" x="36.6" y="2752.8" textLength="97.6" clip-path="url(#breeze-shell-line-112)">-forward</text><text class="breeze-shell-r4" x="134.2" y="2752.8" textLength="146.4" clip-path="url(#breeze-shell-line-112)">-credentials</text><tex [...]
-</text><text class="breeze-shell-r5" x="0" y="2777.2" textLength="12.2" clip-path="url(#breeze-shell-line-113)">│</text><text class="breeze-shell-r4" x="24.4" y="2777.2" textLength="12.2" clip-path="url(#breeze-shell-line-113)">-</text><text class="breeze-shell-r4" x="36.6" y="2777.2" textLength="48.8" clip-path="url(#breeze-shell-line-113)">-max</text><text class="breeze-shell-r4" x="85.4" y="2777.2" textLength="61" clip-path="url(#breeze-shell-line-113)">-time</text><text class="breeze [...]
-</text><text class="breeze-shell-r5" x="0" y="2801.6" textLength="12.2" clip-path="url(#breeze-shell-line-114)">│</text><text class="breeze-shell-r7" x="353.8" y="2801.6" textLength="1049.2" clip-path="url(#breeze-shell-line-114)">(INTEGER RANGE)                                        & [...]
-</text><text class="breeze-shell-r5" x="0" y="2826" textLength="12.2" clip-path="url(#breeze-shell-line-115)">│</text><text class="breeze-shell-r4" x="24.4" y="2826" textLength="12.2" clip-path="url(#breeze-shell-line-115)">-</text><text class="breeze-shell-r4" x="36.6" y="2826" textLength="97.6" clip-path="url(#breeze-shell-line-115)">-verbose</text><text class="breeze-shell-r4" x="134.2" y="2826" textLength="109.8" clip-path="url(#breeze-shell-line-115)">-commands</text><text class="br [...]
-</text><text class="breeze-shell-r5" x="0" y="2850.4" textLength="1464" clip-path="url(#breeze-shell-line-116)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="2850.4" textLength="12.2" clip-path="url(#breeze-shell-line-116)">
-</text><text class="breeze-shell-r5" x="0" y="2874.8" textLength="24.4" clip-path="url(#breeze-shell-line-117)">â•─</text><text class="breeze-shell-r5" x="24.4" y="2874.8" textLength="195.2" clip-path="url(#breeze-shell-line-117)"> Common options </text><text class="breeze-shell-r5" x="219.6" y="2874.8" textLength="1220" clip-path="url(#breeze-shell-line-117)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text cl [...]
-</text><text class="breeze-shell-r5" x="0" y="2899.2" textLength="12.2" clip-path="url(#breeze-shell-line-118)">│</text><text class="breeze-shell-r4" x="24.4" y="2899.2" textLength="12.2" clip-path="url(#breeze-shell-line-118)">-</text><text class="breeze-shell-r4" x="36.6" y="2899.2" textLength="85.4" clip-path="url(#breeze-shell-line-118)">-answer</text><text class="breeze-shell-r6" x="158.6" y="2899.2" textLength="24.4" clip-path="url(#breeze-shell-line-118)">-a</text><text class="bre [...]
-</text><text class="breeze-shell-r5" x="0" y="2923.6" textLength="12.2" clip-path="url(#breeze-shell-line-119)">│</text><text class="breeze-shell-r4" x="24.4" y="2923.6" textLength="12.2" clip-path="url(#breeze-shell-line-119)">-</text><text class="breeze-shell-r4" x="36.6" y="2923.6" textLength="48.8" clip-path="url(#breeze-shell-line-119)">-dry</text><text class="breeze-shell-r4" x="85.4" y="2923.6" textLength="48.8" clip-path="url(#breeze-shell-line-119)">-run</text><text class="breez [...]
-</text><text class="breeze-shell-r5" x="0" y="2948" textLength="12.2" clip-path="url(#breeze-shell-line-120)">│</text><text class="breeze-shell-r4" x="24.4" y="2948" textLength="12.2" clip-path="url(#breeze-shell-line-120)">-</text><text class="breeze-shell-r4" x="36.6" y="2948" textLength="97.6" clip-path="url(#breeze-shell-line-120)">-verbose</text><text class="breeze-shell-r6" x="158.6" y="2948" textLength="24.4" clip-path="url(#breeze-shell-line-120)">-v</text><text class="breeze-she [...]
-</text><text class="breeze-shell-r5" x="0" y="2972.4" textLength="12.2" clip-path="url(#breeze-shell-line-121)">│</text><text class="breeze-shell-r4" x="24.4" y="2972.4" textLength="12.2" clip-path="url(#breeze-shell-line-121)">-</text><text class="breeze-shell-r4" x="36.6" y="2972.4" textLength="61" clip-path="url(#breeze-shell-line-121)">-help</text><text class="breeze-shell-r6" x="158.6" y="2972.4" textLength="24.4" clip-path="url(#breeze-shell-line-121)">-h</text><text class="breeze- [...]
-</text><text class="breeze-shell-r5" x="0" y="2996.8" textLength="1464" clip-path="url(#breeze-shell-line-122)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="2996.8" textLength="12.2" clip-path="url(#breeze-shell-line-122)">
+</text><text class="breeze-shell-r5" x="0" y="1850" textLength="12.2" clip-path="url(#breeze-shell-line-75)">│</text><text class="breeze-shell-r1" x="475.8" y="1850" textLength="963.8" clip-path="url(#breeze-shell-line-75)">constraints URL).                                          [...]
+</text><text class="breeze-shell-r5" x="0" y="1874.4" textLength="12.2" clip-path="url(#breeze-shell-line-76)">│</text><text class="breeze-shell-r7" x="475.8" y="1874.4" textLength="963.8" clip-path="url(#breeze-shell-line-76)">(TEXT)                                            [...]
+</text><text class="breeze-shell-r5" x="0" y="1898.8" textLength="12.2" clip-path="url(#breeze-shell-line-77)">│</text><text class="breeze-shell-r4" x="24.4" y="1898.8" textLength="12.2" clip-path="url(#breeze-shell-line-77)">-</text><text class="breeze-shell-r4" x="36.6" y="1898.8" textLength="97.6" clip-path="url(#breeze-shell-line-77)">-airflow</text><text class="breeze-shell-r4" x="134.2" y="1898.8" textLength="85.4" clip-path="url(#breeze-shell-line-77)">-extras</text><text class="b [...]
+</text><text class="breeze-shell-r5" x="0" y="1923.2" textLength="12.2" clip-path="url(#breeze-shell-line-78)">│</text><text class="breeze-shell-r4" x="24.4" y="1923.2" textLength="12.2" clip-path="url(#breeze-shell-line-78)">-</text><text class="breeze-shell-r4" x="36.6" y="1923.2" textLength="97.6" clip-path="url(#breeze-shell-line-78)">-airflow</text><text class="breeze-shell-r4" x="134.2" y="1923.2" textLength="207.4" clip-path="url(#breeze-shell-line-78)">-skip-constraints</text><te [...]
+</text><text class="breeze-shell-r5" x="0" y="1947.6" textLength="12.2" clip-path="url(#breeze-shell-line-79)">│</text><text class="breeze-shell-r4" x="24.4" y="1947.6" textLength="12.2" clip-path="url(#breeze-shell-line-79)">-</text><text class="breeze-shell-r4" x="36.6" y="1947.6" textLength="97.6" clip-path="url(#breeze-shell-line-79)">-install</text><text class="breeze-shell-r4" x="134.2" y="1947.6" textLength="231.8" clip-path="url(#breeze-shell-line-79)">-selected-providers</text>< [...]
+</text><text class="breeze-shell-r5" x="0" y="1972" textLength="12.2" clip-path="url(#breeze-shell-line-80)">│</text><text class="breeze-shell-r4" x="475.8" y="1972" textLength="12.2" clip-path="url(#breeze-shell-line-80)">-</text><text class="breeze-shell-r4" x="488" y="1972" textLength="48.8" clip-path="url(#breeze-shell-line-80)">-use</text><text class="breeze-shell-r4" x="536.8" y="1972" textLength="231.8" clip-path="url(#breeze-shell-line-80)">-packages-from-dist</text><text class=" [...]
+</text><text class="breeze-shell-r5" x="0" y="1996.4" textLength="12.2" clip-path="url(#breeze-shell-line-81)">│</text><text class="breeze-shell-r7" x="475.8" y="1996.4" textLength="963.8" clip-path="url(#breeze-shell-line-81)">(TEXT)                                            [...]
+</text><text class="breeze-shell-r5" x="0" y="2020.8" textLength="12.2" clip-path="url(#breeze-shell-line-82)">│</text><text class="breeze-shell-r4" x="24.4" y="2020.8" textLength="12.2" clip-path="url(#breeze-shell-line-82)">-</text><text class="breeze-shell-r4" x="36.6" y="2020.8" textLength="97.6" clip-path="url(#breeze-shell-line-82)">-package</text><text class="breeze-shell-r4" x="134.2" y="2020.8" textLength="85.4" clip-path="url(#breeze-shell-line-82)">-format</text><text class="b [...]
+</text><text class="breeze-shell-r5" x="0" y="2045.2" textLength="12.2" clip-path="url(#breeze-shell-line-83)">│</text><text class="breeze-shell-r5" x="475.8" y="2045.2" textLength="658.8" clip-path="url(#breeze-shell-line-83)">[default: wheel]                                      </text><text cl [...]
+</text><text class="breeze-shell-r5" x="0" y="2069.6" textLength="12.2" clip-path="url(#breeze-shell-line-84)">│</text><text class="breeze-shell-r4" x="24.4" y="2069.6" textLength="12.2" clip-path="url(#breeze-shell-line-84)">-</text><text class="breeze-shell-r4" x="36.6" y="2069.6" textLength="122" clip-path="url(#breeze-shell-line-84)">-providers</text><text class="breeze-shell-r4" x="158.6" y="2069.6" textLength="256.2" clip-path="url(#breeze-shell-line-84)">-constraints-location</tex [...]
+</text><text class="breeze-shell-r5" x="0" y="2094" textLength="12.2" clip-path="url(#breeze-shell-line-85)">│</text><text class="breeze-shell-r7" x="475.8" y="2094" textLength="927.2" clip-path="url(#breeze-shell-line-85)">(TEXT)                                            [...]
+</text><text class="breeze-shell-r5" x="0" y="2118.4" textLength="12.2" clip-path="url(#breeze-shell-line-86)">│</text><text class="breeze-shell-r4" x="24.4" y="2118.4" textLength="12.2" clip-path="url(#breeze-shell-line-86)">-</text><text class="breeze-shell-r4" x="36.6" y="2118.4" textLength="122" clip-path="url(#breeze-shell-line-86)">-providers</text><text class="breeze-shell-r4" x="158.6" y="2118.4" textLength="207.4" clip-path="url(#breeze-shell-line-86)">-constraints-mode</text><t [...]
+</text><text class="breeze-shell-r5" x="0" y="2142.8" textLength="12.2" clip-path="url(#breeze-shell-line-87)">│</text><text class="breeze-shell-r7" x="475.8" y="2142.8" textLength="866.2" clip-path="url(#breeze-shell-line-87)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class="breeze-shell-r5" x="1451.8" y="2142.8" textLength="12.2" clip-path="url(#breeze-shell-line-87)">│</text><text class="breeze-shell-r1" x="1464" y="2142.8" [...]
+</text><text class="breeze-shell-r5" x="0" y="2167.2" textLength="12.2" clip-path="url(#breeze-shell-line-88)">│</text><text class="breeze-shell-r5" x="475.8" y="2167.2" textLength="866.2" clip-path="url(#breeze-shell-line-88)">[default: constraints-source-providers]                                </text><text class="breeze-s [...]
+</text><text class="breeze-shell-r5" x="0" y="2191.6" textLength="12.2" clip-path="url(#breeze-shell-line-89)">│</text><text class="breeze-shell-r4" x="24.4" y="2191.6" textLength="12.2" clip-path="url(#breeze-shell-line-89)">-</text><text class="breeze-shell-r4" x="36.6" y="2191.6" textLength="122" clip-path="url(#breeze-shell-line-89)">-providers</text><text class="breeze-shell-r4" x="158.6" y="2191.6" textLength="268.4" clip-path="url(#breeze-shell-line-89)">-constraints-reference</te [...]
+</text><text class="breeze-shell-r5" x="0" y="2216" textLength="12.2" clip-path="url(#breeze-shell-line-90)">│</text><text class="breeze-shell-r1" x="475.8" y="2216" textLength="963.8" clip-path="url(#breeze-shell-line-90)">constraints URL). Can be 'default' in which case the default                   </text><text class="breeze-shell-r5" x= [...]
+</text><text class="breeze-shell-r5" x="0" y="2240.4" textLength="12.2" clip-path="url(#breeze-shell-line-91)">│</text><text class="breeze-shell-r1" x="475.8" y="2240.4" textLength="963.8" clip-path="url(#breeze-shell-line-91)">constraints-reference is used.                                     &# [...]
+</text><text class="breeze-shell-r5" x="0" y="2264.8" textLength="12.2" clip-path="url(#breeze-shell-line-92)">│</text><text class="breeze-shell-r7" x="475.8" y="2264.8" textLength="963.8" clip-path="url(#breeze-shell-line-92)">(TEXT)                                            [...]
+</text><text class="breeze-shell-r5" x="0" y="2289.2" textLength="12.2" clip-path="url(#breeze-shell-line-93)">│</text><text class="breeze-shell-r4" x="24.4" y="2289.2" textLength="12.2" clip-path="url(#breeze-shell-line-93)">-</text><text class="breeze-shell-r4" x="36.6" y="2289.2" textLength="122" clip-path="url(#breeze-shell-line-93)">-providers</text><text class="breeze-shell-r4" x="158.6" y="2289.2" textLength="207.4" clip-path="url(#breeze-shell-line-93)">-skip-constraints</text><t [...]
+</text><text class="breeze-shell-r5" x="0" y="2313.6" textLength="12.2" clip-path="url(#breeze-shell-line-94)">│</text><text class="breeze-shell-r4" x="24.4" y="2313.6" textLength="12.2" clip-path="url(#breeze-shell-line-94)">-</text><text class="breeze-shell-r4" x="36.6" y="2313.6" textLength="48.8" clip-path="url(#breeze-shell-line-94)">-use</text><text class="breeze-shell-r4" x="85.4" y="2313.6" textLength="195.2" clip-path="url(#breeze-shell-line-94)">-airflow-version</text><text cla [...]
+</text><text class="breeze-shell-r5" x="0" y="2338" textLength="12.2" clip-path="url(#breeze-shell-line-95)">│</text><text class="breeze-shell-r1" x="475.8" y="2338" textLength="963.8" clip-path="url(#breeze-shell-line-95)">install from PyPI), `none`, `wheel`, or `sdist` to install from `dist` folder, </text><text class="breeze-shell-r5" x="1451.8" y="2338" textLength="12.2" clip-path="url(#breeze-shell-line-95)">│</text><text c [...]
+</text><text class="breeze-shell-r5" x="0" y="2362.4" textLength="12.2" clip-path="url(#breeze-shell-line-96)">│</text><text class="breeze-shell-r1" x="475.8" y="2362.4" textLength="963.8" clip-path="url(#breeze-shell-line-96)">or VCS URL to install from (https://pip.pypa.io/en/stable/topics/vcs-support/).</text><text class="breeze-shell-r5" x="1451.8" y="2362.4" textLength="12.2" clip-path="url(#breeze-shell-line-96)">│</text><text class="breeze-shell-r1" x [...]
+</text><text class="breeze-shell-r5" x="0" y="2386.8" textLength="12.2" clip-path="url(#breeze-shell-line-97)">│</text><text class="breeze-shell-r1" x="475.8" y="2386.8" textLength="97.6" clip-path="url(#breeze-shell-line-97)">Implies </text><text class="breeze-shell-r4" x="573.4" y="2386.8" textLength="12.2" clip-path="url(#breeze-shell-line-97)">-</text><text class="breeze-shell-r4" x="585.6" y="2386.8" textLength="73.2" clip-path="url(#breeze-shell-line-97)">-mount</text><text cl [...]
+</text><text class="breeze-shell-r5" x="0" y="2411.2" textLength="12.2" clip-path="url(#breeze-shell-line-98)">│</text><text class="breeze-shell-r7" x="475.8" y="2411.2" textLength="963.8" clip-path="url(#breeze-shell-line-98)">(none | wheel | sdist | <airflow_version>)                                [...]
+</text><text class="breeze-shell-r5" x="0" y="2435.6" textLength="12.2" clip-path="url(#breeze-shell-line-99)">│</text><text class="breeze-shell-r4" x="24.4" y="2435.6" textLength="12.2" clip-path="url(#breeze-shell-line-99)">-</text><text class="breeze-shell-r4" x="36.6" y="2435.6" textLength="48.8" clip-path="url(#breeze-shell-line-99)">-use</text><text class="breeze-shell-r4" x="85.4" y="2435.6" textLength="231.8" clip-path="url(#breeze-shell-line-99)">-packages-from-dist</text><text [...]
+</text><text class="breeze-shell-r5" x="0" y="2460" textLength="12.2" clip-path="url(#breeze-shell-line-100)">│</text><text class="breeze-shell-r1" x="475.8" y="2460" textLength="963.8" clip-path="url(#breeze-shell-line-100)">folder when entering breeze.                                     & [...]
+</text><text class="breeze-shell-r5" x="0" y="2484.4" textLength="1464" clip-path="url(#breeze-shell-line-101)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="2484.4" textLength="12.2" clip-path="url(#breeze-shell-line-101)">
+</text><text class="breeze-shell-r5" x="0" y="2508.8" textLength="24.4" clip-path="url(#breeze-shell-line-102)">â•─</text><text class="breeze-shell-r5" x="24.4" y="2508.8" textLength="500.2" clip-path="url(#breeze-shell-line-102)"> Upgrading/downgrading selected packages </text><text class="breeze-shell-r5" x="524.6" y="2508.8" textLength="915" clip-path="url(#breeze-shell-line-102)">───────────────────────────────────────────────────────────────────────────</text><tex [...]
+</text><text class="breeze-shell-r5" x="0" y="2533.2" textLength="12.2" clip-path="url(#breeze-shell-line-103)">│</text><text class="breeze-shell-r4" x="24.4" y="2533.2" textLength="12.2" clip-path="url(#breeze-shell-line-103)">-</text><text class="breeze-shell-r4" x="36.6" y="2533.2" textLength="97.6" clip-path="url(#breeze-shell-line-103)">-upgrade</text><text class="breeze-shell-r4" x="134.2" y="2533.2" textLength="61" clip-path="url(#breeze-shell-line-103)">-boto</text><text class="b [...]
+</text><text class="breeze-shell-r5" x="0" y="2557.6" textLength="12.2" clip-path="url(#breeze-shell-line-104)">│</text><text class="breeze-shell-r4" x="24.4" y="2557.6" textLength="12.2" clip-path="url(#breeze-shell-line-104)">-</text><text class="breeze-shell-r4" x="36.6" y="2557.6" textLength="122" clip-path="url(#breeze-shell-line-104)">-downgrade</text><text class="breeze-shell-r4" x="158.6" y="2557.6" textLength="134.2" clip-path="url(#breeze-shell-line-104)">-sqlalchemy</text><tex [...]
+</text><text class="breeze-shell-r5" x="0" y="2582" textLength="1464" clip-path="url(#breeze-shell-line-105)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="2582" textLength="12.2" clip-path="url(#breeze-shell-line-105)">
+</text><text class="breeze-shell-r5" x="0" y="2606.4" textLength="24.4" clip-path="url(#breeze-shell-line-106)">â•─</text><text class="breeze-shell-r5" x="24.4" y="2606.4" textLength="183" clip-path="url(#breeze-shell-line-106)"> DB test flags </text><text class="breeze-shell-r5" x="207.4" y="2606.4" textLength="1232.2" clip-path="url(#breeze-shell-line-106)">─────────────────────────────────────────────────────────────────────────────────────────────────────</text><te [...]
+</text><text class="breeze-shell-r5" x="0" y="2630.8" textLength="12.2" clip-path="url(#breeze-shell-line-107)">│</text><text class="breeze-shell-r4" x="24.4" y="2630.8" textLength="12.2" clip-path="url(#breeze-shell-line-107)">-</text><text class="breeze-shell-r4" x="36.6" y="2630.8" textLength="48.8" clip-path="url(#breeze-shell-line-107)">-run</text><text class="breeze-shell-r4" x="85.4" y="2630.8" textLength="170.8" clip-path="url(#breeze-shell-line-107)">-db-tests-only</text><text c [...]
+</text><text class="breeze-shell-r5" x="0" y="2655.2" textLength="12.2" clip-path="url(#breeze-shell-line-108)">│</text><text class="breeze-shell-r4" x="24.4" y="2655.2" textLength="12.2" clip-path="url(#breeze-shell-line-108)">-</text><text class="breeze-shell-r4" x="36.6" y="2655.2" textLength="61" clip-path="url(#breeze-shell-line-108)">-skip</text><text class="breeze-shell-r4" x="97.6" y="2655.2" textLength="109.8" clip-path="url(#breeze-shell-line-108)">-db-tests</text><text class=" [...]
+</text><text class="breeze-shell-r5" x="0" y="2679.6" textLength="1464" clip-path="url(#breeze-shell-line-109)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="2679.6" textLength="12.2" clip-path="url(#breeze-shell-line-109)">
+</text><text class="breeze-shell-r5" x="0" y="2704" textLength="24.4" clip-path="url(#breeze-shell-line-110)">â•─</text><text class="breeze-shell-r5" x="24.4" y="2704" textLength="183" clip-path="url(#breeze-shell-line-110)"> Other options </text><text class="breeze-shell-r5" x="207.4" y="2704" textLength="1232.2" clip-path="url(#breeze-shell-line-110)">─────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="b [...]
+</text><text class="breeze-shell-r5" x="0" y="2728.4" textLength="12.2" clip-path="url(#breeze-shell-line-111)">│</text><text class="breeze-shell-r4" x="24.4" y="2728.4" textLength="12.2" clip-path="url(#breeze-shell-line-111)">-</text><text class="breeze-shell-r4" x="36.6" y="2728.4" textLength="97.6" clip-path="url(#breeze-shell-line-111)">-forward</text><text class="breeze-shell-r4" x="134.2" y="2728.4" textLength="146.4" clip-path="url(#breeze-shell-line-111)">-credentials</text><tex [...]
+</text><text class="breeze-shell-r5" x="0" y="2752.8" textLength="12.2" clip-path="url(#breeze-shell-line-112)">│</text><text class="breeze-shell-r4" x="24.4" y="2752.8" textLength="12.2" clip-path="url(#breeze-shell-line-112)">-</text><text class="breeze-shell-r4" x="36.6" y="2752.8" textLength="48.8" clip-path="url(#breeze-shell-line-112)">-max</text><text class="breeze-shell-r4" x="85.4" y="2752.8" textLength="61" clip-path="url(#breeze-shell-line-112)">-time</text><text class="breeze [...]
+</text><text class="breeze-shell-r5" x="0" y="2777.2" textLength="12.2" clip-path="url(#breeze-shell-line-113)">│</text><text class="breeze-shell-r7" x="353.8" y="2777.2" textLength="1049.2" clip-path="url(#breeze-shell-line-113)">(INTEGER RANGE)                                        & [...]
+</text><text class="breeze-shell-r5" x="0" y="2801.6" textLength="12.2" clip-path="url(#breeze-shell-line-114)">│</text><text class="breeze-shell-r4" x="24.4" y="2801.6" textLength="12.2" clip-path="url(#breeze-shell-line-114)">-</text><text class="breeze-shell-r4" x="36.6" y="2801.6" textLength="97.6" clip-path="url(#breeze-shell-line-114)">-verbose</text><text class="breeze-shell-r4" x="134.2" y="2801.6" textLength="109.8" clip-path="url(#breeze-shell-line-114)">-commands</text><text c [...]
+</text><text class="breeze-shell-r5" x="0" y="2826" textLength="1464" clip-path="url(#breeze-shell-line-115)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="2826" textLength="12.2" clip-path="url(#breeze-shell-line-115)">
+</text><text class="breeze-shell-r5" x="0" y="2850.4" textLength="24.4" clip-path="url(#breeze-shell-line-116)">â•─</text><text class="breeze-shell-r5" x="24.4" y="2850.4" textLength="195.2" clip-path="url(#breeze-shell-line-116)"> Common options </text><text class="breeze-shell-r5" x="219.6" y="2850.4" textLength="1220" clip-path="url(#breeze-shell-line-116)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text cl [...]
+</text><text class="breeze-shell-r5" x="0" y="2874.8" textLength="12.2" clip-path="url(#breeze-shell-line-117)">│</text><text class="breeze-shell-r4" x="24.4" y="2874.8" textLength="12.2" clip-path="url(#breeze-shell-line-117)">-</text><text class="breeze-shell-r4" x="36.6" y="2874.8" textLength="85.4" clip-path="url(#breeze-shell-line-117)">-answer</text><text class="breeze-shell-r6" x="158.6" y="2874.8" textLength="24.4" clip-path="url(#breeze-shell-line-117)">-a</text><text class="bre [...]
+</text><text class="breeze-shell-r5" x="0" y="2899.2" textLength="12.2" clip-path="url(#breeze-shell-line-118)">│</text><text class="breeze-shell-r4" x="24.4" y="2899.2" textLength="12.2" clip-path="url(#breeze-shell-line-118)">-</text><text class="breeze-shell-r4" x="36.6" y="2899.2" textLength="48.8" clip-path="url(#breeze-shell-line-118)">-dry</text><text class="breeze-shell-r4" x="85.4" y="2899.2" textLength="48.8" clip-path="url(#breeze-shell-line-118)">-run</text><text class="breez [...]
+</text><text class="breeze-shell-r5" x="0" y="2923.6" textLength="12.2" clip-path="url(#breeze-shell-line-119)">│</text><text class="breeze-shell-r4" x="24.4" y="2923.6" textLength="12.2" clip-path="url(#breeze-shell-line-119)">-</text><text class="breeze-shell-r4" x="36.6" y="2923.6" textLength="97.6" clip-path="url(#breeze-shell-line-119)">-verbose</text><text class="breeze-shell-r6" x="158.6" y="2923.6" textLength="24.4" clip-path="url(#breeze-shell-line-119)">-v</text><text class="br [...]
+</text><text class="breeze-shell-r5" x="0" y="2948" textLength="12.2" clip-path="url(#breeze-shell-line-120)">│</text><text class="breeze-shell-r4" x="24.4" y="2948" textLength="12.2" clip-path="url(#breeze-shell-line-120)">-</text><text class="breeze-shell-r4" x="36.6" y="2948" textLength="61" clip-path="url(#breeze-shell-line-120)">-help</text><text class="breeze-shell-r6" x="158.6" y="2948" textLength="24.4" clip-path="url(#breeze-shell-line-120)">-h</text><text class="breeze-shell-r1 [...]
+</text><text class="breeze-shell-r5" x="0" y="2972.4" textLength="1464" clip-path="url(#breeze-shell-line-121)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="2972.4" textLength="12.2" clip-path="url(#breeze-shell-line-121)">
</text>
</g>
</g>
diff --git a/images/breeze/output_shell.txt b/images/breeze/output_shell.txt
index 5c0110a800..13e1c2d6db 100644
--- a/images/breeze/output_shell.txt
+++ b/images/breeze/output_shell.txt
@@ -1 +1 @@
-1721fbbc6f8794c0d671be243bcb6f50
+a1b6c6d56b8a06f741dde59a01f71338
diff --git a/images/breeze/output_start-airflow.svg b/images/breeze/output_start-airflow.svg
index 3180d8b713..bfb5e80c5d 100644
--- a/images/breeze/output_start-airflow.svg
+++ b/images/breeze/output_start-airflow.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 2709.6" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 2685.2" xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-start-airflow-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="2658.6" />
+ <rect x="0" y="0" width="1463.0" height="2634.2" />
</clipPath>
<clipPath id="breeze-start-airflow-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -366,12 +366,9 @@
<clipPath id="breeze-start-airflow-line-106">
<rect x="0" y="2587.9" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-start-airflow-line-107">
- <rect x="0" y="2612.3" width="1464" height="24.65"/>
- </clipPath>
</defs>
- <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="2707.6" rx="8"/><text class="breeze-start-airflow-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: start-airflow</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="2683.2" rx="8"/><text class="breeze-start-airflow-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: start-airflow</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -453,43 +450,42 @@
</text><text class="breeze-start-airflow-r5" x="0" y="1703.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-69)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="1703.6" textLength="866.2" clip-path="url(#breeze-start-airflow-line-69)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class="breeze-start-airflow-r5" x="1451.8" y="1703.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-69)">│</text>< [...]
</text><text class="breeze-start-airflow-r5" x="0" y="1728" textLength="12.2" clip-path="url(#breeze-start-airflow-line-70)">│</text><text class="breeze-start-airflow-r5" x="475.8" y="1728" textLength="866.2" clip-path="url(#breeze-start-airflow-line-70)">[default: constraints-source-providers]                                 [...]
</text><text class="breeze-start-airflow-r5" x="0" y="1752.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-71)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1752.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-71)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="1752.4" textLength="97.6" clip-path="url(#breeze-start-airflow-line-71)">-airflow</text><text class="breeze-start-airflow-r4" x="134.2" y="1752.4" textLength="268.4" clip-path= [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1776.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-72)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="1776.8" textLength="963.8" clip-path="url(#breeze-start-airflow-line-72)">constraints URL). Can be 'default' in which case the default                   </t [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1801.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-73)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="1801.2" textLength="963.8" clip-path="url(#breeze-start-airflow-line-73)">constraints-reference is used.                                 [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1825.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-74)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="1825.6" textLength="963.8" clip-path="url(#breeze-start-airflow-line-74)">(TEXT)                                      [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1850" textLength="12.2" clip-path="url(#breeze-start-airflow-line-75)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1850" textLength="12.2" clip-path="url(#breeze-start-airflow-line-75)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="1850" textLength="97.6" clip-path="url(#breeze-start-airflow-line-75)">-airflow</text><text class="breeze-start-airflow-r4" x="134.2" y="1850" textLength="85.4" clip-path="url(#bre [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1874.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-76)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1874.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-76)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="1874.4" textLength="97.6" clip-path="url(#breeze-start-airflow-line-76)">-airflow</text><text class="breeze-start-airflow-r4" x="134.2" y="1874.4" textLength="207.4" clip-path= [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1898.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-77)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1898.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-77)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="1898.8" textLength="97.6" clip-path="url(#breeze-start-airflow-line-77)">-install</text><text class="breeze-start-airflow-r4" x="134.2" y="1898.8" textLength="231.8" clip-path= [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1923.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-78)">│</text><text class="breeze-start-airflow-r4" x="475.8" y="1923.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-78)">-</text><text class="breeze-start-airflow-r4" x="488" y="1923.2" textLength="48.8" clip-path="url(#breeze-start-airflow-line-78)">-use</text><text class="breeze-start-airflow-r4" x="536.8" y="1923.2" textLength="231.8" clip-path="url [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1947.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-79)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="1947.6" textLength="963.8" clip-path="url(#breeze-start-airflow-line-79)">(TEXT)                                      [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1972" textLength="12.2" clip-path="url(#breeze-start-airflow-line-80)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1972" textLength="12.2" clip-path="url(#breeze-start-airflow-line-80)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="1972" textLength="97.6" clip-path="url(#breeze-start-airflow-line-80)">-package</text><text class="breeze-start-airflow-r4" x="134.2" y="1972" textLength="85.4" clip-path="url(#bre [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1996.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-81)">│</text><text class="breeze-start-airflow-r5" x="475.8" y="1996.4" textLength="658.8" clip-path="url(#breeze-start-airflow-line-81)">[default: wheel]                                   & [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2020.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-82)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2020.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-82)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="2020.8" textLength="122" clip-path="url(#breeze-start-airflow-line-82)">-providers</text><text class="breeze-start-airflow-r4" x="158.6" y="2020.8" textLength="256.2" clip-path [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2045.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-83)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="2045.2" textLength="927.2" clip-path="url(#breeze-start-airflow-line-83)">(TEXT)                                      [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2069.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-84)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2069.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-84)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="2069.6" textLength="122" clip-path="url(#breeze-start-airflow-line-84)">-providers</text><text class="breeze-start-airflow-r4" x="158.6" y="2069.6" textLength="207.4" clip-path [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2094" textLength="12.2" clip-path="url(#breeze-start-airflow-line-85)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="2094" textLength="866.2" clip-path="url(#breeze-start-airflow-line-85)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class="breeze-start-airflow-r5" x="1451.8" y="2094" textLength="12.2" clip-path="url(#breeze-start-airflow-line-85)">│</text><text c [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2118.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-86)">│</text><text class="breeze-start-airflow-r5" x="475.8" y="2118.4" textLength="866.2" clip-path="url(#breeze-start-airflow-line-86)">[default: constraints-source-providers]                               &# [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2142.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-87)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2142.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-87)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="2142.8" textLength="122" clip-path="url(#breeze-start-airflow-line-87)">-providers</text><text class="breeze-start-airflow-r4" x="158.6" y="2142.8" textLength="268.4" clip-path [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2167.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-88)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="2167.2" textLength="963.8" clip-path="url(#breeze-start-airflow-line-88)">constraints URL). Can be 'default' in which case the default                   </t [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2191.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-89)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="2191.6" textLength="963.8" clip-path="url(#breeze-start-airflow-line-89)">constraints-reference is used.                                 [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2216" textLength="12.2" clip-path="url(#breeze-start-airflow-line-90)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="2216" textLength="963.8" clip-path="url(#breeze-start-airflow-line-90)">(TEXT)                                      &# [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2240.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-91)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2240.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-91)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="2240.4" textLength="122" clip-path="url(#breeze-start-airflow-line-91)">-providers</text><text class="breeze-start-airflow-r4" x="158.6" y="2240.4" textLength="207.4" clip-path [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2264.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-92)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2264.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-92)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="2264.8" textLength="48.8" clip-path="url(#breeze-start-airflow-line-92)">-use</text><text class="breeze-start-airflow-r4" x="85.4" y="2264.8" textLength="195.2" clip-path="url( [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2289.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-93)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="2289.2" textLength="963.8" clip-path="url(#breeze-start-airflow-line-93)">install from PyPI), `none`, `wheel`, or `sdist` to install from `dist` folder, </text><text class="breeze-start-airflow-r5" x="1451.8" y="2289.2" textLength="12.2" clip-pat [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2313.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-94)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="2313.6" textLength="963.8" clip-path="url(#breeze-start-airflow-line-94)">or VCS URL to install from (https://pip.pypa.io/en/stable/topics/vcs-support/).</text><text class="breeze-start-airflow-r5" x="1451.8" y="2313.6" textLength="12.2" clip-path="url(#breeze-start-airflow-l [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2338" textLength="12.2" clip-path="url(#breeze-start-airflow-line-95)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="2338" textLength="97.6" clip-path="url(#breeze-start-airflow-line-95)">Implies </text><text class="breeze-start-airflow-r4" x="573.4" y="2338" textLength="12.2" clip-path="url(#breeze-start-airflow-line-95)">-</text><text class="breeze-start-airflow-r4" x="585.6" y="2338" textLength="73.2" clip-path="u [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2362.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-96)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="2362.4" textLength="963.8" clip-path="url(#breeze-start-airflow-line-96)">(none | wheel | sdist | <airflow_version>)                          [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2386.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-97)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2386.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-97)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="2386.8" textLength="48.8" clip-path="url(#breeze-start-airflow-line-97)">-use</text><text class="breeze-start-airflow-r4" x="85.4" y="2386.8" textLength="231.8" clip-path="url( [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2411.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-98)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="2411.2" textLength="963.8" clip-path="url(#breeze-start-airflow-line-98)">folder when entering breeze.                                [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2435.6" textLength="1464" clip-path="url(#breeze-start-airflow-line-99)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-start-airflow-r1" x="1464" y="2435.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-99)">
-</text><text class="breeze-start-airflow-r5" x="0" y="2460" textLength="24.4" clip-path="url(#breeze-start-airflow-line-100)">â•─</text><text class="breeze-start-airflow-r5" x="24.4" y="2460" textLength="183" clip-path="url(#breeze-start-airflow-line-100)"> Other options </text><text class="breeze-start-airflow-r5" x="207.4" y="2460" textLength="1232.2" clip-path="url(#breeze-start-airflow-line-100)">────────────────────────────────────────────────────────────────────────── [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2484.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-101)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2484.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-101)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="2484.4" textLength="97.6" clip-path="url(#breeze-start-airflow-line-101)">-forward</text><text class="breeze-start-airflow-r4" x="134.2" y="2484.4" textLength="146.4" clip-pa [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2508.8" textLength="1464" clip-path="url(#breeze-start-airflow-line-102)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-start-airflow-r1" x="1464" y="2508.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-102)">
-</text><text class="breeze-start-airflow-r5" x="0" y="2533.2" textLength="24.4" clip-path="url(#breeze-start-airflow-line-103)">â•─</text><text class="breeze-start-airflow-r5" x="24.4" y="2533.2" textLength="195.2" clip-path="url(#breeze-start-airflow-line-103)"> Common options </text><text class="breeze-start-airflow-r5" x="219.6" y="2533.2" textLength="1220" clip-path="url(#breeze-start-airflow-line-103)">─────────────────────────────────────────────────────────────────── [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2557.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-104)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2557.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-104)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="2557.6" textLength="85.4" clip-path="url(#breeze-start-airflow-line-104)">-answer</text><text class="breeze-start-airflow-r6" x="158.6" y="2557.6" textLength="24.4" clip-path [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2582" textLength="12.2" clip-path="url(#breeze-start-airflow-line-105)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2582" textLength="12.2" clip-path="url(#breeze-start-airflow-line-105)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="2582" textLength="48.8" clip-path="url(#breeze-start-airflow-line-105)">-dry</text><text class="breeze-start-airflow-r4" x="85.4" y="2582" textLength="48.8" clip-path="url(#breez [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2606.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-106)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2606.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-106)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="2606.4" textLength="97.6" clip-path="url(#breeze-start-airflow-line-106)">-verbose</text><text class="breeze-start-airflow-r6" x="158.6" y="2606.4" textLength="24.4" clip-pat [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2630.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-107)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2630.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-107)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="2630.8" textLength="61" clip-path="url(#breeze-start-airflow-line-107)">-help</text><text class="breeze-start-airflow-r6" x="158.6" y="2630.8" textLength="24.4" clip-path="ur [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="2655.2" textLength="1464" clip-path="url(#breeze-start-airflow-line-108)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-start-airflow-r1" x="1464" y="2655.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-108)">
+</text><text class="breeze-start-airflow-r5" x="0" y="1776.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-72)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="1776.8" textLength="963.8" clip-path="url(#breeze-start-airflow-line-72)">constraints URL).                                    [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1801.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-73)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="1801.2" textLength="963.8" clip-path="url(#breeze-start-airflow-line-73)">(TEXT)                                      [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1825.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-74)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1825.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-74)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="1825.6" textLength="97.6" clip-path="url(#breeze-start-airflow-line-74)">-airflow</text><text class="breeze-start-airflow-r4" x="134.2" y="1825.6" textLength="85.4" clip-path=" [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1850" textLength="12.2" clip-path="url(#breeze-start-airflow-line-75)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1850" textLength="12.2" clip-path="url(#breeze-start-airflow-line-75)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="1850" textLength="97.6" clip-path="url(#breeze-start-airflow-line-75)">-airflow</text><text class="breeze-start-airflow-r4" x="134.2" y="1850" textLength="207.4" clip-path="url(#br [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1874.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-76)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1874.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-76)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="1874.4" textLength="97.6" clip-path="url(#breeze-start-airflow-line-76)">-install</text><text class="breeze-start-airflow-r4" x="134.2" y="1874.4" textLength="231.8" clip-path= [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1898.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-77)">│</text><text class="breeze-start-airflow-r4" x="475.8" y="1898.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-77)">-</text><text class="breeze-start-airflow-r4" x="488" y="1898.8" textLength="48.8" clip-path="url(#breeze-start-airflow-line-77)">-use</text><text class="breeze-start-airflow-r4" x="536.8" y="1898.8" textLength="231.8" clip-path="url [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1923.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-78)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="1923.2" textLength="963.8" clip-path="url(#breeze-start-airflow-line-78)">(TEXT)                                      [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1947.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-79)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1947.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-79)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="1947.6" textLength="97.6" clip-path="url(#breeze-start-airflow-line-79)">-package</text><text class="breeze-start-airflow-r4" x="134.2" y="1947.6" textLength="85.4" clip-path=" [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1972" textLength="12.2" clip-path="url(#breeze-start-airflow-line-80)">│</text><text class="breeze-start-airflow-r5" x="475.8" y="1972" textLength="658.8" clip-path="url(#breeze-start-airflow-line-80)">[default: wheel]                                     [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1996.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-81)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="1996.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-81)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="1996.4" textLength="122" clip-path="url(#breeze-start-airflow-line-81)">-providers</text><text class="breeze-start-airflow-r4" x="158.6" y="1996.4" textLength="256.2" clip-path [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2020.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-82)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="2020.8" textLength="927.2" clip-path="url(#breeze-start-airflow-line-82)">(TEXT)                                      [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2045.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-83)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2045.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-83)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="2045.2" textLength="122" clip-path="url(#breeze-start-airflow-line-83)">-providers</text><text class="breeze-start-airflow-r4" x="158.6" y="2045.2" textLength="207.4" clip-path [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2069.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-84)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="2069.6" textLength="866.2" clip-path="url(#breeze-start-airflow-line-84)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class="breeze-start-airflow-r5" x="1451.8" y="2069.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-84)">│</text>< [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2094" textLength="12.2" clip-path="url(#breeze-start-airflow-line-85)">│</text><text class="breeze-start-airflow-r5" x="475.8" y="2094" textLength="866.2" clip-path="url(#breeze-start-airflow-line-85)">[default: constraints-source-providers]                                 [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2118.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-86)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2118.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-86)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="2118.4" textLength="122" clip-path="url(#breeze-start-airflow-line-86)">-providers</text><text class="breeze-start-airflow-r4" x="158.6" y="2118.4" textLength="268.4" clip-path [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2142.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-87)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="2142.8" textLength="963.8" clip-path="url(#breeze-start-airflow-line-87)">constraints URL). Can be 'default' in which case the default                   </t [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2167.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-88)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="2167.2" textLength="963.8" clip-path="url(#breeze-start-airflow-line-88)">constraints-reference is used.                                 [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2191.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-89)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="2191.6" textLength="963.8" clip-path="url(#breeze-start-airflow-line-89)">(TEXT)                                      [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2216" textLength="12.2" clip-path="url(#breeze-start-airflow-line-90)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2216" textLength="12.2" clip-path="url(#breeze-start-airflow-line-90)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="2216" textLength="122" clip-path="url(#breeze-start-airflow-line-90)">-providers</text><text class="breeze-start-airflow-r4" x="158.6" y="2216" textLength="207.4" clip-path="url(#b [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2240.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-91)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2240.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-91)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="2240.4" textLength="48.8" clip-path="url(#breeze-start-airflow-line-91)">-use</text><text class="breeze-start-airflow-r4" x="85.4" y="2240.4" textLength="195.2" clip-path="url( [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2264.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-92)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="2264.8" textLength="963.8" clip-path="url(#breeze-start-airflow-line-92)">install from PyPI), `none`, `wheel`, or `sdist` to install from `dist` folder, </text><text class="breeze-start-airflow-r5" x="1451.8" y="2264.8" textLength="12.2" clip-pat [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2289.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-93)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="2289.2" textLength="963.8" clip-path="url(#breeze-start-airflow-line-93)">or VCS URL to install from (https://pip.pypa.io/en/stable/topics/vcs-support/).</text><text class="breeze-start-airflow-r5" x="1451.8" y="2289.2" textLength="12.2" clip-path="url(#breeze-start-airflow-l [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2313.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-94)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="2313.6" textLength="97.6" clip-path="url(#breeze-start-airflow-line-94)">Implies </text><text class="breeze-start-airflow-r4" x="573.4" y="2313.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-94)">-</text><text class="breeze-start-airflow-r4" x="585.6" y="2313.6" textLength="73.2" clip [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2338" textLength="12.2" clip-path="url(#breeze-start-airflow-line-95)">│</text><text class="breeze-start-airflow-r7" x="475.8" y="2338" textLength="963.8" clip-path="url(#breeze-start-airflow-line-95)">(none | wheel | sdist | <airflow_version>)                          &# [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2362.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-96)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2362.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-96)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="2362.4" textLength="48.8" clip-path="url(#breeze-start-airflow-line-96)">-use</text><text class="breeze-start-airflow-r4" x="85.4" y="2362.4" textLength="231.8" clip-path="url( [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2386.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-97)">│</text><text class="breeze-start-airflow-r1" x="475.8" y="2386.8" textLength="963.8" clip-path="url(#breeze-start-airflow-line-97)">folder when entering breeze.                                [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2411.2" textLength="1464" clip-path="url(#breeze-start-airflow-line-98)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-start-airflow-r1" x="1464" y="2411.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-98)">
+</text><text class="breeze-start-airflow-r5" x="0" y="2435.6" textLength="24.4" clip-path="url(#breeze-start-airflow-line-99)">â•─</text><text class="breeze-start-airflow-r5" x="24.4" y="2435.6" textLength="183" clip-path="url(#breeze-start-airflow-line-99)"> Other options </text><text class="breeze-start-airflow-r5" x="207.4" y="2435.6" textLength="1232.2" clip-path="url(#breeze-start-airflow-line-99)">─────────────────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2460" textLength="12.2" clip-path="url(#breeze-start-airflow-line-100)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2460" textLength="12.2" clip-path="url(#breeze-start-airflow-line-100)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="2460" textLength="97.6" clip-path="url(#breeze-start-airflow-line-100)">-forward</text><text class="breeze-start-airflow-r4" x="134.2" y="2460" textLength="146.4" clip-path="url( [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2484.4" textLength="1464" clip-path="url(#breeze-start-airflow-line-101)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-start-airflow-r1" x="1464" y="2484.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-101)">
+</text><text class="breeze-start-airflow-r5" x="0" y="2508.8" textLength="24.4" clip-path="url(#breeze-start-airflow-line-102)">â•─</text><text class="breeze-start-airflow-r5" x="24.4" y="2508.8" textLength="195.2" clip-path="url(#breeze-start-airflow-line-102)"> Common options </text><text class="breeze-start-airflow-r5" x="219.6" y="2508.8" textLength="1220" clip-path="url(#breeze-start-airflow-line-102)">─────────────────────────────────────────────────────────────────── [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2533.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-103)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2533.2" textLength="12.2" clip-path="url(#breeze-start-airflow-line-103)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="2533.2" textLength="85.4" clip-path="url(#breeze-start-airflow-line-103)">-answer</text><text class="breeze-start-airflow-r6" x="158.6" y="2533.2" textLength="24.4" clip-path [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2557.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-104)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2557.6" textLength="12.2" clip-path="url(#breeze-start-airflow-line-104)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="2557.6" textLength="48.8" clip-path="url(#breeze-start-airflow-line-104)">-dry</text><text class="breeze-start-airflow-r4" x="85.4" y="2557.6" textLength="48.8" clip-path="ur [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2582" textLength="12.2" clip-path="url(#breeze-start-airflow-line-105)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2582" textLength="12.2" clip-path="url(#breeze-start-airflow-line-105)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="2582" textLength="97.6" clip-path="url(#breeze-start-airflow-line-105)">-verbose</text><text class="breeze-start-airflow-r6" x="158.6" y="2582" textLength="24.4" clip-path="url(# [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2606.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-106)">│</text><text class="breeze-start-airflow-r4" x="24.4" y="2606.4" textLength="12.2" clip-path="url(#breeze-start-airflow-line-106)">-</text><text class="breeze-start-airflow-r4" x="36.6" y="2606.4" textLength="61" clip-path="url(#breeze-start-airflow-line-106)">-help</text><text class="breeze-start-airflow-r6" x="158.6" y="2606.4" textLength="24.4" clip-path="ur [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="2630.8" textLength="1464" clip-path="url(#breeze-start-airflow-line-107)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-start-airflow-r1" x="1464" y="2630.8" textLength="12.2" clip-path="url(#breeze-start-airflow-line-107)">
</text>
</g>
</g>
diff --git a/images/breeze/output_start-airflow.txt b/images/breeze/output_start-airflow.txt
index 0d27e6d4a1..9c0ec3642a 100644
--- a/images/breeze/output_start-airflow.txt
+++ b/images/breeze/output_start-airflow.txt
@@ -1 +1 @@
-f08786008dc6552dd92880a45ed5771a
+0543b012b7058e62a807609e8dfc5139
diff --git a/scripts/in_container/install_airflow_and_providers.py b/scripts/in_container/install_airflow_and_providers.py
index 58f2d86af3..d0b79b417b 100755
--- a/scripts/in_container/install_airflow_and_providers.py
+++ b/scripts/in_container/install_airflow_and_providers.py
@@ -76,10 +76,11 @@ def calculate_constraints_location(
constraints_reference: str | None,
github_repository: str,
python_version: str,
+ providers: bool,
):
constraints_base = f"https://raw.githubusercontent.com/{github_repository}/{constraints_reference}"
location = f"{constraints_base}/{constraints_mode}-{python_version}.txt"
- console.print(f"[info]Determined constraints as: {location}")
+ console.print(f"[info]Determined {'providers' if providers else 'airflow'} constraints as: {location}")
return location
@@ -126,6 +127,7 @@ def get_airflow_constraints_location(
constraints_reference=airflow_constraints_reference,
github_repository=github_repository,
python_version=python_version,
+ providers=False,
)
@@ -157,6 +159,7 @@ def get_providers_constraints_location(
constraints_reference=providers_constraints_reference,
python_version=python_version,
github_repository=github_repository,
+ providers=True,
)
(airflow) 10/27: Improve pre-commit to generate Airflow diagrams as a code (#36333)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit ae0ceb382dc0dfb91adc5d22b480c321ffbe3fe0
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Wed Dec 20 19:44:33 2023 +0100
Improve pre-commit to generate Airflow diagrams as a code (#36333)
Since we are getting more diagrams generated in Airflow using the
"diagram as a code" approach, this PR improves the pre-commit to be
more suitable to support generation of more of the images coming
from different sources, placed in different directories and generated
independently, so that the whole process is more distributed and easy
for whoever creates diagrams to add their own diagram.
The changes implemented in this PR:
* the code to generate the diagrams is now next to the diagram they
generate. It has the same name as the diagram, but it has the .py
extension. This way it is immediately visible where is the source
of each diagram (right next to each diagram)
* each of the .py diagram Python files is runnable on its own. This
way you can easily regenerate the diagrams by running corresponding
Python file or even automate it by running "save" action and generate
the diagrams automatically by running the Python code every time
the file is saved. That makes a very nice workflow on iterating on
each diagram, independently from each othere
* the pre-commit script is given a set of folders which should be
scanned and it finds and run the diagrams on pre-commmit. It also
creates and verifies the md5sum hash of the source Python file
separately for each diagram and only runs diagram generation when
the source file changed vs. last time the hash was saved and
committed. The hash sum is stored next to the image and sources
with .md5sum extension
Also updated documentation in the CONTRIBUTING.rst explaining how
to generate the diagrams and what is the mechanism of that
generation.
(cherry picked from commit b35b08ec41814b6fe5d7388296db83a726e6d6d0)
---
.pre-commit-config.yaml | 4 +-
.rat-excludes | 3 +
CONTRIBUTING.rst | 45 ++++++++
...agram_fab_auth_manager_airflow_architecture.png | Bin 0 -> 81735 bytes
...iagram_auth_manager_airflow_architecture.md5sum | 1 +
.../diagram_auth_manager_airflow_architecture.png | Bin 0 -> 54220 bytes
.../diagram_auth_manager_airflow_architecture.py | 73 +++++++++++++
.../img/diagram_basic_airflow_architecture.md5sum | 1 +
.../img/diagram_basic_airflow_architecture.py | 77 +++++++++++++
...agram_dag_processor_airflow_architecture.md5sum | 1 +
.../diagram_dag_processor_airflow_architecture.py | 84 ++++++++++++++
...am_fab_auth_manager_airflow_architecture.md5sum | 1 +
...agram_fab_auth_manager_airflow_architecture.png | Bin 0 -> 49545 bytes
...iagram_fab_auth_manager_airflow_architecture.py | 74 +++++++++++++
.../diagrams/python_multiprocess_logo.png | Bin
.../pre_commit_generate_airflow_diagrams.py | 121 ++++-----------------
16 files changed, 381 insertions(+), 104 deletions(-)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index c12be3a5f1..7a7b2a64e5 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -416,8 +416,8 @@ repos:
name: Generate airflow diagrams
entry: ./scripts/ci/pre_commit/pre_commit_generate_airflow_diagrams.py
language: python
- files: ^scripts/ci/pre_commit/pre_commit_generate_airflow_diagrams.py
- pass_filenames: false
+ files: ^docs/.*/diagram_[^/]*\.py$
+ pass_filenames: true
additional_dependencies: ['rich>=12.4.4', "diagrams>=0.23.4"]
- id: update-supported-versions
name: Updates supported versions in documentation
diff --git a/.rat-excludes b/.rat-excludes
index 751742b1af..d881787de9 100644
--- a/.rat-excludes
+++ b/.rat-excludes
@@ -145,3 +145,6 @@ doap_airflow.rdf
# PKG-INFO file
PKG-INFO
+
+# checksum files
+.*\.md5sum
diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
index c015e457bd..abb9ed59da 100644
--- a/CONTRIBUTING.rst
+++ b/CONTRIBUTING.rst
@@ -942,6 +942,51 @@ Documentation for ``apache-airflow`` package and other packages that are closely
providers packages are in ``/docs/`` directory. For detailed information on documentation development,
see: `docs/README.rst <docs/README.rst>`_
+Diagrams
+========
+
+We started to use (and gradually convert old diagrams to use it) `Diagrams <https://diagrams.mingrammer.com/>`_
+as our tool of choice to generate diagrams. The diagrams are generated from Python code and can be
+automatically updated when the code changes. The diagrams are generated using pre-commit hooks (See
+static checks below) but they can also be generated manually by running the corresponding Python code.
+
+To run the code you need to install the dependencies in the virtualenv you use to run it:
+* ``pip install diagrams rich``. You need to have graphviz installed in your
+system (``brew install graphviz`` on macOS for example).
+
+The source code of the diagrams are next to the generated diagram, the difference is that the source
+code has ``.py`` extension and the generated diagram has ``.png`` extension. The pre-commit hook
+ ``generate-airflow-diagrams`` will look for ``diagram_*.py`` files in the ``docs`` subdirectories
+to find them and runs them when the sources changed and the diagrams are not up to date (the
+pre-commit will automatically generate an .md5sum hash of the sources and store it next to the diagram
+file).
+
+In order to generate the diagram manually you can run the following command:
+
+.. code-block:: bash
+
+ python <path-to-diagram-file>.py
+
+You can also generate all diagrams by:
+
+.. code-block:: bash
+
+ pre-commit run generate-airflow-diagrams
+
+or with Breeze:
+
+.. code-block:: bash
+
+ breeze static-checks --type generate-airflow-diagrams --all-files
+
+When you iterate over a diagram, you can also setup a "save" action in your IDE to run the python
+file automatically when you save the diagram file.
+
+Once you've done iteration and you are happy with the diagram, you can commit the diagram, the source
+code and the .md5sum file. The pre-commit hook will then not run the diagram generation until the
+source code for it changes.
+
+
Static code checks
==================
diff --git a/docs/apache-airflow-providers-fab/img/diagram_fab_auth_manager_airflow_architecture.png b/docs/apache-airflow-providers-fab/img/diagram_fab_auth_manager_airflow_architecture.png
new file mode 100644
index 0000000000..9c7a1d1561
Binary files /dev/null and b/docs/apache-airflow-providers-fab/img/diagram_fab_auth_manager_airflow_architecture.png differ
diff --git a/docs/apache-airflow/img/diagram_auth_manager_airflow_architecture.md5sum b/docs/apache-airflow/img/diagram_auth_manager_airflow_architecture.md5sum
new file mode 100644
index 0000000000..ac3e24d848
--- /dev/null
+++ b/docs/apache-airflow/img/diagram_auth_manager_airflow_architecture.md5sum
@@ -0,0 +1 @@
+5b82cba489898a46dcfe5f458eeee33b
diff --git a/docs/apache-airflow/img/diagram_auth_manager_airflow_architecture.png b/docs/apache-airflow/img/diagram_auth_manager_airflow_architecture.png
new file mode 100644
index 0000000000..35f3f418f2
Binary files /dev/null and b/docs/apache-airflow/img/diagram_auth_manager_airflow_architecture.png differ
diff --git a/docs/apache-airflow/img/diagram_auth_manager_airflow_architecture.py b/docs/apache-airflow/img/diagram_auth_manager_airflow_architecture.py
new file mode 100644
index 0000000000..453d17267c
--- /dev/null
+++ b/docs/apache-airflow/img/diagram_auth_manager_airflow_architecture.py
@@ -0,0 +1,73 @@
+# 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 diagrams import Cluster, Diagram, Edge
+from diagrams.custom import Custom
+from diagrams.onprem.client import User
+from rich.console import Console
+
+MY_DIR = Path(__file__).parent
+MY_FILENAME = Path(__file__).with_suffix("").name
+PYTHON_MULTIPROCESS_LOGO = MY_DIR.parents[1] / "diagrams" / "python_multiprocess_logo.png"
+
+console = Console(width=400, color_system="standard")
+
+
+def generate_auth_manager_airflow_diagram():
+ image_file = (MY_DIR / MY_FILENAME).with_suffix(".png")
+
+ console.print(f"[bright_blue]Generating architecture image {image_file}")
+ with Diagram(
+ name="",
+ show=False,
+ direction="LR",
+ curvestyle="ortho",
+ filename=MY_FILENAME,
+ ):
+ user = User("User")
+ with Cluster("Airflow environment"):
+ webserver = Custom("Webserver(s)", PYTHON_MULTIPROCESS_LOGO.as_posix())
+
+ with Cluster("Provider X"):
+ auth_manager = Custom("X auth manager", PYTHON_MULTIPROCESS_LOGO.as_posix())
+ with Cluster("Core Airflow"):
+ auth_manager_interface = Custom(
+ "Auth manager\ninterface", PYTHON_MULTIPROCESS_LOGO.as_posix()
+ )
+
+ (user >> Edge(color="black", style="solid", reverse=True, label="Access to the console") >> webserver)
+
+ (
+ webserver
+ >> Edge(color="black", style="solid", reverse=True, label="Is user authorized?")
+ >> auth_manager
+ )
+
+ (
+ auth_manager
+ >> Edge(color="black", style="dotted", reverse=False, label="Inherit")
+ >> auth_manager_interface
+ )
+
+ console.print(f"[green]Generating architecture image {image_file}")
+
+
+if __name__ == "__main__":
+ generate_auth_manager_airflow_diagram()
diff --git a/docs/apache-airflow/img/diagram_basic_airflow_architecture.md5sum b/docs/apache-airflow/img/diagram_basic_airflow_architecture.md5sum
new file mode 100644
index 0000000000..d20c0307d4
--- /dev/null
+++ b/docs/apache-airflow/img/diagram_basic_airflow_architecture.md5sum
@@ -0,0 +1 @@
+ac9bd11824e7faf5ed5232ff242c3157
diff --git a/docs/apache-airflow/img/diagram_basic_airflow_architecture.py b/docs/apache-airflow/img/diagram_basic_airflow_architecture.py
new file mode 100644
index 0000000000..d65a6ae83a
--- /dev/null
+++ b/docs/apache-airflow/img/diagram_basic_airflow_architecture.py
@@ -0,0 +1,77 @@
+# 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 diagrams import Cluster, Diagram, Edge
+from diagrams.custom import Custom
+from diagrams.onprem.client import User
+from diagrams.onprem.database import PostgreSQL
+from diagrams.programming.flowchart import MultipleDocuments
+from rich.console import Console
+
+MY_DIR = Path(__file__).parent
+MY_FILENAME = Path(__file__).with_suffix("").name
+PYTHON_MULTIPROCESS_LOGO = MY_DIR.parents[1] / "diagrams" / "python_multiprocess_logo.png"
+
+console = Console(width=400, color_system="standard")
+
+
+def generate_basic_airflow_diagram():
+ image_file = (MY_DIR / MY_FILENAME).with_suffix(".png")
+
+ console.print(f"[bright_blue]Generating architecture image {image_file}")
+ with Diagram(
+ name="", show=False, direction="LR", curvestyle="ortho", filename=MY_FILENAME, outformat="png"
+ ):
+ with Cluster("Parsing & Scheduling"):
+ schedulers = Custom("Scheduler(s)", PYTHON_MULTIPROCESS_LOGO.as_posix())
+
+ metadata_db = PostgreSQL("Metadata DB")
+
+ dag_author = User("DAG Author")
+ dag_files = MultipleDocuments("DAG files")
+
+ dag_author >> Edge(color="black", style="dashed", reverse=False) >> dag_files
+
+ with Cluster("Execution"):
+ workers = Custom("Worker(s)", PYTHON_MULTIPROCESS_LOGO.as_posix())
+ triggerer = Custom("Triggerer(s)", PYTHON_MULTIPROCESS_LOGO.as_posix())
+
+ schedulers - Edge(color="blue", style="dashed", taillabel="Executor") - workers
+
+ schedulers >> Edge(color="red", style="dotted", reverse=True) >> metadata_db
+ workers >> Edge(color="red", style="dotted", reverse=True) >> metadata_db
+ triggerer >> Edge(color="red", style="dotted", reverse=True) >> metadata_db
+
+ operations_user = User("Operations User")
+ with Cluster("UI"):
+ webservers = Custom("Webserver(s)", PYTHON_MULTIPROCESS_LOGO.as_posix())
+
+ webservers >> Edge(color="black", style="dashed", reverse=True) >> operations_user
+
+ metadata_db >> Edge(color="red", style="dotted", reverse=True) >> webservers
+
+ dag_files >> Edge(color="brown", style="solid") >> workers
+ dag_files >> Edge(color="brown", style="solid") >> schedulers
+ dag_files >> Edge(color="brown", style="solid") >> triggerer
+ console.print(f"[green]Generating architecture image {image_file}")
+
+
+if __name__ == "__main__":
+ generate_basic_airflow_diagram()
diff --git a/docs/apache-airflow/img/diagram_dag_processor_airflow_architecture.md5sum b/docs/apache-airflow/img/diagram_dag_processor_airflow_architecture.md5sum
new file mode 100644
index 0000000000..ebe1a15d56
--- /dev/null
+++ b/docs/apache-airflow/img/diagram_dag_processor_airflow_architecture.md5sum
@@ -0,0 +1 @@
+e189c45f79a7a878802bde13be27a112
diff --git a/docs/apache-airflow/img/diagram_dag_processor_airflow_architecture.py b/docs/apache-airflow/img/diagram_dag_processor_airflow_architecture.py
new file mode 100644
index 0000000000..714049d349
--- /dev/null
+++ b/docs/apache-airflow/img/diagram_dag_processor_airflow_architecture.py
@@ -0,0 +1,84 @@
+# 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 diagrams import Cluster, Diagram, Edge
+from diagrams.custom import Custom
+from diagrams.onprem.client import User
+from diagrams.onprem.database import PostgreSQL
+from diagrams.programming.flowchart import MultipleDocuments
+from rich.console import Console
+
+MY_DIR = Path(__file__).parent
+MY_FILENAME = Path(__file__).with_suffix("").name
+PYTHON_MULTIPROCESS_LOGO = MY_DIR.parents[1] / "diagrams" / "python_multiprocess_logo.png"
+
+console = Console(width=400, color_system="standard")
+
+
+def generate_dag_processor_airflow_diagram():
+ dag_processor_architecture_image_file = (MY_DIR / MY_FILENAME).with_suffix(".png")
+ console.print(f"[bright_blue]Generating architecture image {dag_processor_architecture_image_file}")
+ with Diagram(
+ name="",
+ show=False,
+ direction="LR",
+ curvestyle="ortho",
+ filename=MY_FILENAME,
+ outformat="png",
+ ):
+ operations_user = User("Operations User")
+ with Cluster("No DAG Python Code Execution", graph_attr={"bgcolor": "lightgrey"}):
+ with Cluster("Scheduling"):
+ schedulers = Custom("Scheduler(s)", PYTHON_MULTIPROCESS_LOGO.as_posix())
+
+ with Cluster("UI"):
+ webservers = Custom("Webserver(s)", PYTHON_MULTIPROCESS_LOGO.as_posix())
+
+ webservers >> Edge(color="black", style="dashed", reverse=True) >> operations_user
+
+ metadata_db = PostgreSQL("Metadata DB")
+
+ dag_author = User("DAG Author")
+ with Cluster("DAG Python Code Execution"):
+ with Cluster("Execution"):
+ workers = Custom("Worker(s)", PYTHON_MULTIPROCESS_LOGO.as_posix())
+ triggerer = Custom("Triggerer(s)", PYTHON_MULTIPROCESS_LOGO.as_posix())
+ with Cluster("Parsing"):
+ dag_processors = Custom("DAG\nProcessor(s)", PYTHON_MULTIPROCESS_LOGO.as_posix())
+ dag_files = MultipleDocuments("DAG files")
+
+ dag_author >> Edge(color="black", style="dashed", reverse=False) >> dag_files
+
+ workers - Edge(color="blue", style="dashed", headlabel="Executor") - schedulers
+
+ metadata_db >> Edge(color="red", style="dotted", reverse=True) >> webservers
+ metadata_db >> Edge(color="red", style="dotted", reverse=True) >> schedulers
+ dag_processors >> Edge(color="red", style="dotted", reverse=True) >> metadata_db
+ workers >> Edge(color="red", style="dotted", reverse=True) >> metadata_db
+ triggerer >> Edge(color="red", style="dotted", reverse=True) >> metadata_db
+
+ dag_files >> Edge(color="brown", style="solid") >> workers
+ dag_files >> Edge(color="brown", style="solid") >> dag_processors
+ dag_files >> Edge(color="brown", style="solid") >> triggerer
+ console.print(f"[green]Generating architecture image {dag_processor_architecture_image_file}")
+
+
+if __name__ == "__main__":
+ generate_dag_processor_airflow_diagram()
diff --git a/docs/apache-airflow/img/diagram_fab_auth_manager_airflow_architecture.md5sum b/docs/apache-airflow/img/diagram_fab_auth_manager_airflow_architecture.md5sum
new file mode 100644
index 0000000000..fb928aa691
--- /dev/null
+++ b/docs/apache-airflow/img/diagram_fab_auth_manager_airflow_architecture.md5sum
@@ -0,0 +1 @@
+aa73a8292341145e0f60682f7047503b
diff --git a/docs/apache-airflow/img/diagram_fab_auth_manager_airflow_architecture.png b/docs/apache-airflow/img/diagram_fab_auth_manager_airflow_architecture.png
new file mode 100644
index 0000000000..4057a67615
Binary files /dev/null and b/docs/apache-airflow/img/diagram_fab_auth_manager_airflow_architecture.png differ
diff --git a/docs/apache-airflow/img/diagram_fab_auth_manager_airflow_architecture.py b/docs/apache-airflow/img/diagram_fab_auth_manager_airflow_architecture.py
new file mode 100644
index 0000000000..393d988bb2
--- /dev/null
+++ b/docs/apache-airflow/img/diagram_fab_auth_manager_airflow_architecture.py
@@ -0,0 +1,74 @@
+# 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 diagrams import Cluster, Diagram, Edge
+from diagrams.custom import Custom
+from diagrams.onprem.client import User
+from diagrams.onprem.database import PostgreSQL
+from rich.console import Console
+
+MY_DIR = Path(__file__).parent
+MY_FILENAME = Path(__file__).with_suffix("").name
+PYTHON_MULTIPROCESS_LOGO = MY_DIR.parents[1] / "diagrams" / "python_multiprocess_logo.png"
+
+console = Console(width=400, color_system="standard")
+
+
+def generate_fab_auth_manager_airflow_diagram():
+ image_file = (MY_DIR / MY_FILENAME).with_suffix(".png")
+ console.print(f"[bright_blue]Generating architecture image {image_file}")
+ with Diagram(
+ name="",
+ show=False,
+ direction="LR",
+ curvestyle="ortho",
+ filename=MY_FILENAME,
+ ):
+ user = User("User")
+ with Cluster("Airflow environment"):
+ webserver = Custom("Webserver(s)", PYTHON_MULTIPROCESS_LOGO.as_posix())
+
+ with Cluster("FAB provider"):
+ fab_auth_manager = Custom("FAB auth manager", PYTHON_MULTIPROCESS_LOGO.as_posix())
+ with Cluster("Core Airflow"):
+ auth_manager_interface = Custom(
+ "Auth manager\ninterface", PYTHON_MULTIPROCESS_LOGO.as_posix()
+ )
+
+ db = PostgreSQL("Metadata DB")
+
+ user >> Edge(color="black", style="solid", reverse=True, label="Access to the console") >> webserver
+ (
+ webserver
+ >> Edge(color="black", style="solid", reverse=True, label="Is user authorized?")
+ >> fab_auth_manager
+ )
+ (fab_auth_manager >> Edge(color="black", style="solid", reverse=True) >> db)
+ (
+ fab_auth_manager
+ >> Edge(color="black", style="dotted", reverse=False, label="Inherit")
+ >> auth_manager_interface
+ )
+
+ console.print(f"[green]Generating architecture image {image_file}")
+
+
+if __name__ == "__main__":
+ generate_fab_auth_manager_airflow_diagram()
diff --git a/images/diagrams/python_multiprocess_logo.png b/docs/diagrams/python_multiprocess_logo.png
similarity index 100%
rename from images/diagrams/python_multiprocess_logo.png
rename to docs/diagrams/python_multiprocess_logo.png
diff --git a/scripts/ci/pre_commit/pre_commit_generate_airflow_diagrams.py b/scripts/ci/pre_commit/pre_commit_generate_airflow_diagrams.py
index 22f05715b1..f809d566e3 100755
--- a/scripts/ci/pre_commit/pre_commit_generate_airflow_diagrams.py
+++ b/scripts/ci/pre_commit/pre_commit_generate_airflow_diagrams.py
@@ -18,121 +18,38 @@
from __future__ import annotations
import hashlib
-import os
+import subprocess
+import sys
from pathlib import Path
-from diagrams import Cluster, Diagram, Edge
-from diagrams.custom import Custom
-from diagrams.onprem.client import User
-from diagrams.onprem.database import PostgreSQL
-from diagrams.programming.flowchart import MultipleDocuments
from rich.console import Console
console = Console(width=400, color_system="standard")
LOCAL_DIR = Path(__file__).parent
AIRFLOW_SOURCES_ROOT = Path(__file__).parents[3]
-DOCS_IMAGES_DIR = AIRFLOW_SOURCES_ROOT / "docs" / "apache-airflow" / "img"
-PYTHON_MULTIPROCESS_LOGO = AIRFLOW_SOURCES_ROOT / "images" / "diagrams" / "python_multiprocess_logo.png"
-BASIC_ARCHITECTURE_IMAGE_NAME = "diagram_basic_airflow_architecture"
-DAG_PROCESSOR_AIRFLOW_ARCHITECTURE_IMAGE_NAME = "diagram_dag_processor_airflow_architecture"
-DIAGRAM_HASH_FILE_NAME = "diagram_hash.txt"
-
-def generate_basic_airflow_diagram(filename: str):
- basic_architecture_image_file = (DOCS_IMAGES_DIR / BASIC_ARCHITECTURE_IMAGE_NAME).with_suffix(".png")
- console.print(f"[bright_blue]Generating architecture image {basic_architecture_image_file}")
- with Diagram(name="", show=False, direction="LR", curvestyle="ortho", filename=filename):
- with Cluster("Parsing & Scheduling"):
- schedulers = Custom("Scheduler(s)", PYTHON_MULTIPROCESS_LOGO.as_posix())
-
- metadata_db = PostgreSQL("Metadata DB")
-
- dag_author = User("DAG Author")
- dag_files = MultipleDocuments("DAG files")
-
- dag_author >> Edge(color="black", style="dashed", reverse=False) >> dag_files
-
- with Cluster("Execution"):
- workers = Custom("Worker(s)", PYTHON_MULTIPROCESS_LOGO.as_posix())
- triggerer = Custom("Triggerer(s)", PYTHON_MULTIPROCESS_LOGO.as_posix())
-
- schedulers - Edge(color="blue", style="dashed", taillabel="Executor") - workers
-
- schedulers >> Edge(color="red", style="dotted", reverse=True) >> metadata_db
- workers >> Edge(color="red", style="dotted", reverse=True) >> metadata_db
- triggerer >> Edge(color="red", style="dotted", reverse=True) >> metadata_db
-
- operations_user = User("Operations User")
- with Cluster("UI"):
- webservers = Custom("Webserver(s)", PYTHON_MULTIPROCESS_LOGO.as_posix())
-
- webservers >> Edge(color="black", style="dashed", reverse=True) >> operations_user
-
- metadata_db >> Edge(color="red", style="dotted", reverse=True) >> webservers
-
- dag_files >> Edge(color="brown", style="solid") >> workers
- dag_files >> Edge(color="brown", style="solid") >> schedulers
- dag_files >> Edge(color="brown", style="solid") >> triggerer
- console.print(f"[green]Generating architecture image {basic_architecture_image_file}")
-
-
-def generate_dag_processor_airflow_diagram(filename: str):
- dag_processor_architecture_image_file = (
- DOCS_IMAGES_DIR / DAG_PROCESSOR_AIRFLOW_ARCHITECTURE_IMAGE_NAME
- ).with_suffix(".png")
- console.print(f"[bright_blue]Generating architecture image {dag_processor_architecture_image_file}")
- with Diagram(name="", show=False, direction="LR", curvestyle="ortho", filename=filename):
- operations_user = User("Operations User")
- with Cluster("No DAG Python Code Execution", graph_attr={"bgcolor": "lightgrey"}):
- with Cluster("Scheduling"):
- schedulers = Custom("Scheduler(s)", PYTHON_MULTIPROCESS_LOGO.as_posix())
-
- with Cluster("UI"):
- webservers = Custom("Webserver(s)", PYTHON_MULTIPROCESS_LOGO.as_posix())
-
- webservers >> Edge(color="black", style="dashed", reverse=True) >> operations_user
-
- metadata_db = PostgreSQL("Metadata DB")
-
- dag_author = User("DAG Author")
- with Cluster("DAG Python Code Execution"):
- with Cluster("Execution"):
- workers = Custom("Worker(s)", PYTHON_MULTIPROCESS_LOGO.as_posix())
- triggerer = Custom("Triggerer(s)", PYTHON_MULTIPROCESS_LOGO.as_posix())
- with Cluster("Parsing"):
- dag_processors = Custom("DAG\nProcessor(s)", PYTHON_MULTIPROCESS_LOGO.as_posix())
- dag_files = MultipleDocuments("DAG files")
-
- dag_author >> Edge(color="black", style="dashed", reverse=False) >> dag_files
-
- workers - Edge(color="blue", style="dashed", headlabel="Executor") - schedulers
-
- metadata_db >> Edge(color="red", style="dotted", reverse=True) >> webservers
- metadata_db >> Edge(color="red", style="dotted", reverse=True) >> schedulers
- dag_processors >> Edge(color="red", style="dotted", reverse=True) >> metadata_db
- workers >> Edge(color="red", style="dotted", reverse=True) >> metadata_db
- triggerer >> Edge(color="red", style="dotted", reverse=True) >> metadata_db
-
- dag_files >> Edge(color="brown", style="solid") >> workers
- dag_files >> Edge(color="brown", style="solid") >> dag_processors
- dag_files >> Edge(color="brown", style="solid") >> triggerer
- console.print(f"[green]Generating architecture image {dag_processor_architecture_image_file}")
+def _get_file_hash(file_to_check: Path) -> str:
+ hash_md5 = hashlib.md5()
+ hash_md5.update(Path(file_to_check).resolve().read_bytes())
+ return hash_md5.hexdigest()
def main():
- hash_md5 = hashlib.md5()
- hash_md5.update(Path(__file__).resolve().read_bytes())
- my_file_hash = hash_md5.hexdigest()
- hash_file = LOCAL_DIR / DIAGRAM_HASH_FILE_NAME
- if not hash_file.exists() or not hash_file.read_text().strip() == str(my_file_hash).strip():
- os.chdir(DOCS_IMAGES_DIR)
- generate_basic_airflow_diagram(BASIC_ARCHITECTURE_IMAGE_NAME)
- generate_dag_processor_airflow_diagram(DAG_PROCESSOR_AIRFLOW_ARCHITECTURE_IMAGE_NAME)
- hash_file.write_text(str(my_file_hash) + "\n")
- else:
- console.print("[bright_blue]No changes to generation script. Not regenerating the images.")
+ # get all files as arguments
+ for arg in sys.argv[1:]:
+ source_file = Path(arg).resolve()
+ checksum = _get_file_hash(source_file)
+ hash_file = source_file.with_suffix(".md5sum")
+ if not hash_file.exists() or not hash_file.read_text().strip() == str(checksum).strip():
+ console.print(f"[bright_blue]Changes in {source_file}. Regenerating the image.")
+ subprocess.run(
+ [sys.executable, source_file.resolve().as_posix()], check=True, cwd=source_file.parent
+ )
+ hash_file.write_text(str(checksum) + "\n")
+ else:
+ console.print(f"[bright_blue]No changes in {source_file}. Not regenerating the image.")
if __name__ == "__main__":
(airflow) 20/27: Update providers metadata 2023-12-28 (#36459)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 5576e1151dcabe66b18b350d296574631d4f493e
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Thu Dec 28 02:41:04 2023 +0100
Update providers metadata 2023-12-28 (#36459)
(cherry picked from commit 8fea49f90a6b1597648d5b95982624eaff34fd68)
---
dev/README_RELEASE_PROVIDER_PACKAGES.md | 4 +-
generated/provider_metadata.json | 500 ++++++++++++++++++--------------
2 files changed, 289 insertions(+), 215 deletions(-)
diff --git a/dev/README_RELEASE_PROVIDER_PACKAGES.md b/dev/README_RELEASE_PROVIDER_PACKAGES.md
index 554197b40f..4663e0c1c3 100644
--- a/dev/README_RELEASE_PROVIDER_PACKAGES.md
+++ b/dev/README_RELEASE_PROVIDER_PACKAGES.md
@@ -1168,9 +1168,9 @@ Make sure you create the following branch from the git tag (steps before) and no
cd ${AIRFLOW_REPO_ROOT}
branch="update-providers-metadata-$(date '+%Y-%m-%d%n')"
git checkout -b "${branch}"
-breeze release-management generate-providers-metadata
+breeze release-management generate-providers-metadata --refresh-constraints
git add -p .
-git commit -m "Update providers metadata $(date '+%Y-%m-%d%n')"
+git commit -m "Update providers metadata ${branch}"
git push --set-upstream origin "${branch}"
```
diff --git a/generated/provider_metadata.json b/generated/provider_metadata.json
index 54b6e2304e..7a6c737cad 100644
--- a/generated/provider_metadata.json
+++ b/generated/provider_metadata.json
@@ -61,8 +61,12 @@
"date_released": "2023-10-17T07:49:16Z"
},
"3.5.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "3.5.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:26Z"
}
},
"alibaba": {
@@ -131,7 +135,7 @@
"date_released": "2023-10-17T07:49:16Z"
},
"2.7.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -325,8 +329,12 @@
"date_released": "2023-11-29T07:17:22Z"
},
"8.13.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "8.14.0": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:26Z"
}
},
"apache.beam": {
@@ -423,8 +431,12 @@
"date_released": "2023-10-17T07:49:16Z"
},
"5.4.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "5.5.0": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:26Z"
}
},
"apache.cassandra": {
@@ -485,8 +497,12 @@
"date_released": "2023-10-17T07:49:16Z"
},
"3.4.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "3.4.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:26Z"
}
},
"apache.drill": {
@@ -563,7 +579,7 @@
"date_released": "2023-10-17T07:49:16Z"
},
"2.6.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -661,7 +677,7 @@
"date_released": "2023-10-17T07:49:16Z"
},
"3.7.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -695,7 +711,7 @@
"date_released": "2023-10-17T07:49:16Z"
},
"1.3.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -773,8 +789,12 @@
"date_released": "2023-10-17T07:49:16Z"
},
"4.3.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "4.3.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:26Z"
}
},
"apache.hive": {
@@ -915,8 +935,12 @@
"date_released": "2023-10-17T07:49:16Z"
},
"6.3.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "6.4.0": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:26Z"
}
},
"apache.impala": {
@@ -949,7 +973,7 @@
"date_released": "2023-11-29T07:17:22Z"
},
"1.3.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -975,8 +999,12 @@
"date_released": "2023-10-17T07:49:16Z"
},
"1.3.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "1.3.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:26Z"
}
},
"apache.kylin": {
@@ -1029,7 +1057,7 @@
"date_released": "2023-10-17T07:49:16Z"
},
"3.4.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -1115,7 +1143,7 @@
"date_released": "2023-10-17T07:49:16Z"
},
"3.7.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -1173,7 +1201,7 @@
"date_released": "2023-10-17T07:49:16Z"
},
"4.3.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -1255,7 +1283,7 @@
"date_released": "2023-10-17T07:49:16Z"
},
"4.3.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -1357,78 +1385,12 @@
"date_released": "2023-11-12T18:51:15Z"
},
"4.5.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
- }
- },
- "apache.sqoop": {
- "1.0.0": {
- "associated_airflow_version": "2.0.0",
- "date_released": "2020-12-09T21:48:29Z"
- },
- "1.0.1": {
- "associated_airflow_version": "2.1.0",
- "date_released": "2021-02-04T09:11:00Z"
- },
- "2.0.0": {
- "associated_airflow_version": "2.1.2",
- "date_released": "2021-06-23T12:50:28Z"
- },
- "2.0.1": {
- "associated_airflow_version": "2.1.3",
- "date_released": "2021-07-26T20:06:28Z"
- },
- "2.0.2": {
- "associated_airflow_version": "2.2.3",
- "date_released": "2021-08-30T21:27:32Z"
- },
- "2.1.0": {
- "associated_airflow_version": "2.2.4",
- "date_released": "2022-02-08T21:57:49Z"
- },
- "2.1.1": {
- "associated_airflow_version": "2.2.4",
- "date_released": "2022-03-07T20:27:47Z"
- },
- "2.1.2": {
- "associated_airflow_version": "2.2.4",
- "date_released": "2022-03-14T22:17:57Z"
- },
- "2.1.3": {
- "associated_airflow_version": "2.3.2",
- "date_released": "2022-03-22T22:09:01Z"
},
- "3.0.0": {
- "associated_airflow_version": "2.4.3",
- "date_released": "2022-06-08T22:56:47Z"
- },
- "3.1.0": {
- "associated_airflow_version": "2.5.1",
- "date_released": "2022-11-18T10:44:03Z"
- },
- "3.1.1": {
- "associated_airflow_version": "2.6.1",
- "date_released": "2023-02-21T21:29:22Z"
- },
- "3.2.0": {
- "associated_airflow_version": "2.6.2",
- "date_released": "2023-05-23T14:20:25Z"
- },
- "3.2.1": {
- "associated_airflow_version": "2.6.3",
- "date_released": "2023-06-23T15:38:45Z"
- },
- "4.0.0": {
- "associated_airflow_version": "2.7.2",
- "date_released": "2023-08-08T06:19:11Z"
- },
- "4.1.0": {
- "associated_airflow_version": "2.7.3",
- "date_released": "2023-10-17T07:49:16Z"
- },
- "4.2.0": {
- "associated_airflow_version": "2.7.3",
- "date_released": "2023-12-12T07:17:12Z"
+ "4.6.0": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:26Z"
}
},
"apprise": {
@@ -1449,8 +1411,12 @@
"date_released": "2023-10-17T07:49:16Z"
},
"1.2.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "1.2.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:26Z"
}
},
"arangodb": {
@@ -1487,8 +1453,12 @@
"date_released": "2023-10-17T07:49:16Z"
},
"2.4.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "2.4.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:26Z"
}
},
"asana": {
@@ -1541,8 +1511,12 @@
"date_released": "2023-10-17T07:49:16Z"
},
"2.4.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "2.4.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:26Z"
}
},
"atlassian.jira": {
@@ -1579,7 +1553,7 @@
"date_released": "2023-11-29T07:17:22Z"
},
"2.4.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -1661,8 +1635,12 @@
"date_released": "2023-10-21T20:02:16Z"
},
"3.5.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "3.5.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:26Z"
}
},
"cloudant": {
@@ -1715,8 +1693,12 @@
"date_released": "2023-10-17T07:49:16Z"
},
"3.4.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "3.4.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:26Z"
}
},
"cncf.kubernetes": {
@@ -1909,8 +1891,12 @@
"date_released": "2023-11-29T07:17:22Z"
},
"7.11.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "7.12.0": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"cohere": {
@@ -1919,8 +1905,12 @@
"date_released": "2023-11-12T18:51:15Z"
},
"1.1.0": {
- "associated_airflow_version": "2.0.0",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "1.1.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"common.io": {
@@ -1933,7 +1923,7 @@
"date_released": "2023-11-12T18:51:15Z"
},
"1.1.0": {
- "associated_airflow_version": "2.0.0",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-11-29T07:17:22Z"
}
},
@@ -2019,8 +2009,12 @@
"date_released": "2023-11-29T07:17:22Z"
},
"1.9.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "1.10.0": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"databricks": {
@@ -2141,12 +2135,16 @@
"date_released": "2023-10-31T20:27:29Z"
},
"5.0.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-11-12T18:51:15Z"
},
"5.0.1": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-11-29T07:17:22Z"
+ },
+ "6.0.0": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"datadog": {
@@ -2207,8 +2205,12 @@
"date_released": "2023-10-17T07:49:16Z"
},
"3.5.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "3.5.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"dbt.cloud": {
@@ -2285,8 +2287,12 @@
"date_released": "2023-11-29T07:17:22Z"
},
"3.5.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "3.5.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"dingding": {
@@ -2343,7 +2349,7 @@
"date_released": "2023-10-17T07:49:16Z"
},
"3.4.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -2409,7 +2415,7 @@
"date_released": "2023-11-14T16:59:36Z"
},
"3.5.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -2547,8 +2553,16 @@
"date_released": "2023-11-12T18:51:15Z"
},
"3.8.2": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-11-29T07:17:22Z"
+ },
+ "3.9.0": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-17T17:15:14Z"
+ },
+ "3.9.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"elasticsearch": {
@@ -2677,7 +2691,7 @@
"date_released": "2023-11-29T07:17:22Z"
},
"5.3.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -2779,8 +2793,18 @@
"date_released": "2023-10-17T07:49:16Z"
},
"4.4.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "4.4.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
+ }
+ },
+ "fab": {
+ "1.0.0": {
+ "associated_airflow_version": "2.0.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"facebook": {
@@ -2853,7 +2877,7 @@
"date_released": "2023-10-17T07:49:16Z"
},
"3.4.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -2943,7 +2967,7 @@
"date_released": "2023-11-12T18:51:15Z"
},
"3.7.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -2997,8 +3021,12 @@
"date_released": "2023-10-17T07:49:16Z"
},
"2.5.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "2.5.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"google": {
@@ -3191,8 +3219,12 @@
"date_released": "2023-11-12T18:51:15Z"
},
"10.12.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-11-29T07:17:22Z"
+ },
+ "10.13.0": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"grpc": {
@@ -3253,8 +3285,12 @@
"date_released": "2023-10-17T07:49:16Z"
},
"3.4.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "3.4.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"hashicorp": {
@@ -3343,8 +3379,12 @@
"date_released": "2023-10-17T07:49:16Z"
},
"3.6.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "3.6.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"http": {
@@ -3445,7 +3485,7 @@
"date_released": "2023-11-14T16:59:36Z"
},
"4.8.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -3527,7 +3567,7 @@
"date_released": "2023-10-17T07:49:16Z"
},
"3.5.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -3581,7 +3621,7 @@
"date_released": "2023-10-17T07:49:16Z"
},
"2.4.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -3659,8 +3699,12 @@
"date_released": "2023-10-17T07:49:16Z"
},
"4.2.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "4.2.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"jenkins": {
@@ -3745,8 +3789,12 @@
"date_released": "2023-10-17T07:49:16Z"
},
"3.5.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "3.5.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"microsoft.azure": {
@@ -3931,8 +3979,12 @@
"date_released": "2023-11-29T07:17:22Z"
},
"8.4.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "8.5.0": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"microsoft.mssql": {
@@ -4017,7 +4069,7 @@
"date_released": "2023-10-17T07:49:16Z"
},
"3.6.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -4079,7 +4131,7 @@
"date_released": "2023-10-17T07:49:16Z"
},
"2.5.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -4153,7 +4205,7 @@
"date_released": "2023-10-17T07:49:16Z"
},
"3.4.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -4227,7 +4279,7 @@
"date_released": "2023-10-31T20:27:29Z"
},
"3.5.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -4345,7 +4397,7 @@
"date_released": "2023-10-17T07:49:16Z"
},
"5.5.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -4423,7 +4475,7 @@
"date_released": "2023-10-17T07:49:17Z"
},
"3.5.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -4493,8 +4545,16 @@
"date_released": "2023-10-17T07:49:17Z"
},
"4.2.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-11-29T07:17:22Z"
+ },
+ "4.3.0": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-17T17:15:14Z"
+ },
+ "4.4.0": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"openai": {
@@ -4507,7 +4567,7 @@
"date_released": "2023-11-29T07:17:22Z"
},
"1.1.0": {
- "associated_airflow_version": "2.0.0",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -4561,7 +4621,7 @@
"date_released": "2023-10-17T07:49:17Z"
},
"3.4.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -4595,8 +4655,12 @@
"date_released": "2023-11-12T18:51:15Z"
},
"1.3.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "1.3.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"opensearch": {
@@ -4605,8 +4669,12 @@
"date_released": "2023-10-21T20:02:16Z"
},
"1.1.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "1.1.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"opsgenie": {
@@ -4675,7 +4743,7 @@
"date_released": "2023-11-29T07:17:22Z"
},
"5.4.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -4777,8 +4845,12 @@
"date_released": "2023-10-17T07:49:17Z"
},
"3.9.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "3.9.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"pagerduty": {
@@ -4839,8 +4911,12 @@
"date_released": "2023-10-17T07:49:17Z"
},
"3.5.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
+ },
+ "3.5.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"papermill": {
@@ -4913,7 +4989,7 @@
"date_released": "2023-11-29T07:17:22Z"
},
"3.6.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -4923,7 +4999,7 @@
"date_released": "2023-11-12T18:51:15Z"
},
"1.1.0": {
- "associated_airflow_version": "2.0.0",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
}
},
@@ -4933,66 +5009,12 @@
"date_released": "2023-11-12T18:51:15Z"
},
"1.1.0": {
- "associated_airflow_version": "2.0.0",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:12Z"
- }
- },
- "plexus": {
- "1.0.0": {
- "associated_airflow_version": "2.0.0",
- "date_released": "2020-12-09T21:48:29Z"
- },
- "1.0.1": {
- "associated_airflow_version": "2.1.0",
- "date_released": "2021-02-04T09:11:00Z"
- },
- "2.0.0": {
- "associated_airflow_version": "2.1.3",
- "date_released": "2021-06-23T12:50:28Z"
},
- "2.0.1": {
- "associated_airflow_version": "2.2.4",
- "date_released": "2021-08-30T21:27:32Z"
- },
- "2.0.2": {
- "associated_airflow_version": "2.2.4",
- "date_released": "2022-03-07T20:27:47Z"
- },
- "2.0.3": {
- "associated_airflow_version": "2.2.4",
- "date_released": "2022-03-14T22:17:57Z"
- },
- "2.0.4": {
- "associated_airflow_version": "2.3.2",
- "date_released": "2022-03-22T22:09:01Z"
- },
- "3.0.0": {
- "associated_airflow_version": "2.4.3",
- "date_released": "2022-06-08T22:56:47Z"
- },
- "3.1.0": {
- "associated_airflow_version": "2.6.1",
- "date_released": "2022-11-18T10:44:03Z"
- },
- "3.2.0": {
- "associated_airflow_version": "2.6.2",
- "date_released": "2023-05-23T14:20:25Z"
- },
- "3.2.1": {
- "associated_airflow_version": "2.7.0",
- "date_released": "2023-06-23T15:38:46Z"
- },
- "3.2.2": {
- "associated_airflow_version": "2.7.2",
- "date_released": "2023-08-29T06:43:23Z"
- },
- "3.3.0": {
- "associated_airflow_version": "2.7.3",
- "date_released": "2023-10-17T07:49:17Z"
- },
- "3.4.0": {
- "associated_airflow_version": "2.7.3",
- "date_released": "2023-12-12T07:17:12Z"
+ "1.1.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"postgres": {
@@ -5109,8 +5131,12 @@
"date_released": "2023-11-12T18:51:15Z"
},
"5.9.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:13Z"
+ },
+ "5.10.0": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"presto": {
@@ -5219,8 +5245,12 @@
"date_released": "2023-10-31T20:27:30Z"
},
"5.3.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:13Z"
+ },
+ "5.4.0": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"redis": {
@@ -5289,7 +5319,7 @@
"date_released": "2023-11-29T07:17:22Z"
},
"3.5.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:13Z"
}
},
@@ -5387,8 +5417,12 @@
"date_released": "2023-11-12T18:51:15Z"
},
"5.6.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:13Z"
+ },
+ "5.6.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"samba": {
@@ -5449,7 +5483,7 @@
"date_released": "2023-10-17T07:49:17Z"
},
"4.4.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:13Z"
}
},
@@ -5503,7 +5537,7 @@
"date_released": "2023-10-17T07:49:17Z"
},
"3.4.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:13Z"
}
},
@@ -5565,7 +5599,7 @@
"date_released": "2023-10-17T07:49:17Z"
},
"3.4.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:13Z"
}
},
@@ -5691,8 +5725,12 @@
"date_released": "2023-10-17T07:49:17Z"
},
"4.8.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:13Z"
+ },
+ "4.8.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"singularity": {
@@ -5753,7 +5791,7 @@
"date_released": "2023-10-17T07:49:17Z"
},
"3.4.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:13Z"
}
},
@@ -5859,8 +5897,12 @@
"date_released": "2023-11-12T18:51:15Z"
},
"8.5.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:13Z"
+ },
+ "8.5.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"smtp": {
@@ -5901,8 +5943,12 @@
"date_released": "2023-10-31T20:27:30Z"
},
"1.5.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:13Z"
+ },
+ "1.6.0": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"snowflake": {
@@ -6063,8 +6109,12 @@
"date_released": "2023-11-29T07:17:22Z"
},
"5.2.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:13Z"
+ },
+ "5.2.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"sqlite": {
@@ -6153,8 +6203,12 @@
"date_released": "2023-10-17T07:49:17Z"
},
"3.6.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:13Z"
+ },
+ "3.7.0": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"ssh": {
@@ -6267,8 +6321,12 @@
"date_released": "2023-10-31T20:27:30Z"
},
"3.9.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:13Z"
+ },
+ "3.10.0": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"tableau": {
@@ -6349,7 +6407,7 @@
"date_released": "2023-10-17T07:49:17Z"
},
"4.4.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:13Z"
}
},
@@ -6379,8 +6437,12 @@
"date_released": "2023-10-17T07:49:17Z"
},
"1.4.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:13Z"
+ },
+ "1.4.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"telegram": {
@@ -6445,7 +6507,7 @@
"date_released": "2023-10-17T07:49:17Z"
},
"4.3.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:13Z"
}
},
@@ -6559,8 +6621,12 @@
"date_released": "2023-11-29T07:17:22Z"
},
"5.5.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:13Z"
+ },
+ "5.6.0": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"vertica": {
@@ -6645,7 +6711,7 @@
"date_released": "2023-10-17T07:49:17Z"
},
"3.7.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:13Z"
}
},
@@ -6655,8 +6721,12 @@
"date_released": "2023-11-12T18:51:15Z"
},
"1.1.0": {
- "associated_airflow_version": "2.0.0",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:13Z"
+ },
+ "1.2.0": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"yandex": {
@@ -6721,8 +6791,12 @@
"date_released": "2023-11-12T18:51:15Z"
},
"3.7.0": {
- "associated_airflow_version": "2.6.1",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:13Z"
+ },
+ "3.7.1": {
+ "associated_airflow_version": "2.8.0",
+ "date_released": "2023-12-27T23:07:27Z"
}
},
"zendesk": {
@@ -6787,7 +6861,7 @@
"date_released": "2023-10-17T07:49:17Z"
},
"4.5.0": {
- "associated_airflow_version": "2.7.3",
+ "associated_airflow_version": "2.8.0",
"date_released": "2023-12-12T07:17:13Z"
}
}
(airflow) 06/27: Updating version of airflow pre-commit should happen when version change (#36293)
Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 2cad58ad4e58f7b4c18b0b903de307faae265565
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Tue Dec 19 00:02:06 2023 +0100
Updating version of airflow pre-commit should happen when version change (#36293)
(cherry picked from commit b5cd96a27f30bb5515299eaf8c15204291030c37)
---
.pre-commit-config.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 0b917bd75f..c12be3a5f1 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -441,7 +441,7 @@ repos:
name: Update version to the latest version in the documentation
entry: ./scripts/ci/pre_commit/pre_commit_update_versions.py
language: python
- files: ^docs
+ files: ^docs|^airflow/__init__.py$
pass_filenames: false
additional_dependencies: ['rich>=12.4.4']
- id: check-pydevd-left-in-code