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 2022/07/21 14:28:03 UTC

[airflow] branch v2-3-test updated (62778bb864 -> 9b987cf64a)

This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a change to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git


    from 62778bb864 Update the release note
     new 60c64bcdf1 Improve version check for kubectl (#24882)
     new 4daa5c1101 Add more selective provider tests (#24666)
     new cbdf3388cd Don't add init.py files to __pycache__ folders. (#24896)
     new d5357f761e Remove full provider's specification from TEST_TYPES (#24901)
     new fa4c440bee Make sure builder is created as needed before warming up (#24875)
     new 9b325a97e8 Run "fix-ownership" with sudo rather than docker image if specified (#24871)
     new c173b4c67f Airflow `2.3.3` has been released (#24942)
     new 960503293e Add `--clean-build` option for breeze build-docs (#24951)
     new c39ffb4a79 Add Kubernetes-related files to trigger helm tests (#24950)
     new ca3c851032 Old "Core" SQL database config used in breeze for old airflow versions (#25009)
     new ba3434dc0c Stop failing image refreshing on "warm-up" failure (#25046)
     new 9321c9cc6d Update `check_files.py` to support many provider releases (#25077)
     new 823e2f0d3f Fix markdown error in Airflow Readme (#25120)
     new ec8ea0e200 Bump typing-extensions and mypy for ParamSpec (#25088)
     new b932b1e62c Fix PR label detection in CI (#25148)
     new 4fe1dabd30 Speed up Kubernetes tests ~30% on main. (#25143)
     new bf2a6eaa50 Disable provider packages building for non-main branch builds (#25056)
     new fdece929ff Retrieve airflow branch/constraints from env variables (#25053)
     new e57d2fdbd3 Speed up Kubernetes upgrade tests at least 2x (#25159)
     new 2eb5e80c4a Update description of branch creation to include the new Breeze (#25155)
     new 0285bf8b71 Move javascript compilation to host (#25169)
     new 9b987cf64a Fix missing space for breeze build-image hint command (#25204)

The 22 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:
 .dockerignore                                      |   9 +-
 .github/ISSUE_TEMPLATE/airflow_bug_report.yml      |   7 +-
 .../airflow_helmchart_bug_report.yml               |  10 +-
 .../airflow_providers_bug_report.yml               |   7 +-
 .github/boring-cyborg.yml                          |   1 -
 .github/workflows/build-images.yml                 |  12 +-
 .github/workflows/ci.yml                           |  59 ++--
 .gitignore                                         |   2 +-
 .pre-commit-config.yaml                            |  65 +++-
 BREEZE.rst                                         |  89 ++++-
 CONTRIBUTING.rst                                   |  32 +-
 Dockerfile                                         | 160 +--------
 Dockerfile.ci                                      | 146 +-------
 IMAGES.rst                                         |   3 +-
 RELEASE_NOTES.rst                                  |  23 +-
 STATIC_CODE_CHECKS.rst                             |   8 +-
 TESTING.rst                                        |  15 +-
 airflow/jobs/scheduler_job.py                      |   4 +-
 airflow/mypy/plugin/decorators.py                  |   5 +-
 .../amazon/aws/transfers/dynamodb_to_s3.py         |   1 +
 .../providers/amazon/aws/transfers/sql_to_s3.py    |  19 +-
 .../providers/google/cloud/operators/cloud_sql.py  |   2 +-
 airflow/providers/microsoft/azure/hooks/cosmos.py  |  62 ++--
 airflow/utils/context.py                           |   2 +-
 airflow/www/ask_for_recompile_assets_if_needed.sh  |  56 ---
 airflow/www/compile_assets.sh                      |  34 --
 breeze-legacy                                      |   8 -
 dev/README_RELEASE_AIRFLOW.md                      |  30 +-
 dev/README_RELEASE_HELM_CHART.md                   |   2 +-
 dev/README_RELEASE_PROVIDER_PACKAGES.md            |   7 +-
 dev/breeze/SELECTIVE_CHECKS.md                     |   8 +
 .../src/airflow_breeze/commands/ci_commands.py     |  84 ++++-
 .../airflow_breeze/commands/ci_image_commands.py   |  10 +-
 .../airflow_breeze/commands/developer_commands.py  |  55 ++-
 .../commands/production_image_commands.py          |  19 +-
 .../commands/release_management_commands.py        |   5 +-
 .../airflow_breeze/commands/testing_commands.py    |  18 +-
 dev/breeze/src/airflow_breeze/global_constants.py  |   8 -
 .../src/airflow_breeze/params/build_ci_params.py   |   7 +-
 .../src/airflow_breeze/params/build_prod_params.py |  37 +-
 .../airflow_breeze/params/common_build_params.py   |   4 +-
 dev/breeze/src/airflow_breeze/pre_commit_ids.py    |   3 +
 .../airflow_breeze/utils/docker_command_utils.py   |  22 +-
 dev/breeze/src/airflow_breeze/utils/run_utils.py   |  31 ++
 .../src/airflow_breeze/utils/selective_checks.py   | 110 +++++-
 dev/breeze/tests/test_selective_checks.py          |  74 +++-
 dev/check_files.py                                 | 123 ++++---
 .../build_provider_documentation.sh                |   3 +-
 dev/refresh_images.sh                              |   2 -
 docs/docker-stack/build-arg-ref.rst                |  15 -
 docs/docker-stack/changelog.rst                    |   3 +-
 images/breeze/output-build-docs.svg                | 260 +++++++-------
 images/breeze/output-build-prod-image.svg          | 352 ++++++++++---------
 images/breeze/output-commands-hash.txt             |  13 +-
 images/breeze/output-commands.svg                  | 384 +++++++++++----------
 images/breeze/output-compile-www-assets.svg        |  99 ++++++
 images/breeze/output-fix-ownership.svg             |  84 +++--
 images/breeze/output-selective-check.svg           | 112 +++---
 images/breeze/output-static-checks.svg             | 228 ++++++------
 images/breeze/output-tests.svg                     | 160 ++++-----
 scripts/ci/libraries/_initialization.sh            |  35 --
 scripts/ci/libraries/_kind.sh                      |   2 +-
 scripts/ci/libraries/_parallel.sh                  |  14 +-
 .../pre_commit/pre_commit_check_init_in_tests.py   |   9 +-
 .../ci/pre_commit/pre_commit_compile_www_assets.py |  21 +-
 scripts/ci/pre_commit/pre_commit_ui_lint.py        |  40 +--
 scripts/ci/pre_commit/pre_commit_www_lint.py       |  41 +--
 scripts/ci/testing/ci_run_airflow_testing.sh       |   3 +-
 scripts/docker/compile_www_assets.sh               |  71 ----
 scripts/docker/entrypoint_ci.sh                    |  18 +-
 scripts/docker/prepare_node_modules.sh             |  52 ---
 scripts/in_container/_in_container_utils.sh        |  24 +-
 scripts/in_container/run_migration_reference.py    |   1 +
 .../in_container/run_prepare_airflow_packages.sh   |   2 +-
 setup.cfg                                          |   2 +-
 setup.py                                           |   2 +-
 .../internal_api}/__init__.py                      |   0
 .../microsoft/azure/hooks/test_azure_cosmos.py     |   8 +-
 .../api_connexion => tests/system}/__init__.py     |   0
 .../system/providers}/__init__.py                  |   0
 .../system/providers/apache}/__init__.py           |   0
 .../system/providers/google}/__init__.py           |   0
 82 files changed, 1786 insertions(+), 1772 deletions(-)
 delete mode 100755 airflow/www/ask_for_recompile_assets_if_needed.sh
 delete mode 100755 airflow/www/compile_assets.sh
 create mode 100644 images/breeze/output-compile-www-assets.svg
 copy dev/breeze/src/airflow_breeze/breeze.py => scripts/ci/pre_commit/pre_commit_compile_www_assets.py (62%)
 delete mode 100644 scripts/docker/compile_www_assets.sh
 delete mode 100644 scripts/docker/prepare_node_modules.sh
 copy {airflow/api_connexion => tests/internal_api}/__init__.py (100%)
 copy {airflow/api_connexion => tests/system}/__init__.py (100%)
 copy {airflow/api_connexion => tests/system/providers}/__init__.py (100%)
 copy {airflow/api_connexion => tests/system/providers/apache}/__init__.py (100%)
 copy {airflow/api_connexion => tests/system/providers/google}/__init__.py (100%)


[airflow] 19/22: Speed up Kubernetes upgrade tests at least 2x (#25159)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit e57d2fdbd3c6e4335ef2314ee012794b41c237e2
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Tue Jul 19 22:30:42 2022 +0200

    Speed up Kubernetes upgrade tests at least 2x (#25159)
    
    We do not need to run upgrade kubernetes tests for all python
    versions and all kubernetes versions. It is enough to run them
    for the minimum and maximum versions. We already run all k8s tests
    in main for all executors, so they "generally" work, and it
    is very, very unlikely that if it works for Python 3.7, and 3.10,
    it will not work for 3.8 or 3.9 (similarly for K8S version).
    
    This will speed up the build at least 2 times.
    
    (cherry picked from commit 907e720b9e312e9da1e645973a747ddbd3ba69f5)
---
 .github/workflows/ci.yml                           | 23 +++++++++++++---------
 .../src/airflow_breeze/utils/selective_checks.py   | 16 +++++++++++++++
 2 files changed, 30 insertions(+), 9 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index cd056e4238..c459b7001d 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -134,8 +134,13 @@ jobs:
       all-python-versions-list-as-string: >-
         ${{ steps.selective-checks.outputs.all-python-versions-list-as-string }}
       default-python-version: ${{ steps.selective-checks.outputs.default-python-version }}
+      min-max-python-versions-as-string: >-
+        ${{ steps.selective-checks.outputs.min-max-python-versions-as-string }}
       kubernetes-versions-list-as-string: >-
         ${{ steps.selective-checks.outputs.kubernetes-versions-list-as-string }}
+      default-kubernetes-version: ${{ steps.selective-checks.outputs.default-kubernetes-version }}
+      min-max-kubernetes-versions-as-string: >-
+        ${{ steps.selective-checks.outputs.min-max-kubernetes-versions-as-string }}
       postgres-versions: ${{ steps.selective-checks.outputs.postgres-versions }}
       default-postgres-version: ${{ steps.selective-checks.outputs.default-postgres-version }}
       mysql-versions: ${{ steps.selective-checks.outputs.mysql-versions }}
@@ -1524,7 +1529,7 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
 
   tests-helm-executor-upgrade:
     timeout-minutes: 150
-    name: Helm Chart Executor Upgrade - ${{needs.build-info.outputs.kubernetes-versions-list-as-string}}
+    name: Helm Chart Executor Upgrade - ${{needs.build-info.outputs.min-max-kubernetes-versions-as-string}}
     runs-on: ${{ fromJson(needs.build-info.outputs.runs-on) }}
     needs: [build-info, wait-for-prod-images]
     env:
@@ -1536,10 +1541,10 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
       EXECUTOR: "KubernetesExecutor"
       KIND_VERSION: "${{ needs.build-info.outputs.default-kind-version }}"
       HELM_VERSION: "${{ needs.build-info.outputs.default-helm-version }}"
-      CURRENT_PYTHON_MAJOR_MINOR_VERSIONS_AS_STRING: >
-        ${{needs.build-info.outputs.python-versions-list-as-string}}
-      CURRENT_KUBERNETES_VERSIONS_AS_STRING: >
-        ${{needs.build-info.outputs.kubernetes-versions-list-as-string}}
+      CURRENT_PYTHON_MAJOR_MINOR_VERSIONS_AS_STRING: >-
+        ${{needs.build-info.outputs.min-max-python-versions-as-string}}
+      CURRENT_KUBERNETES_VERSIONS_AS_STRING: >-
+        ${{needs.build-info.outputs.min-max-kubernetes-versions-as-string}}
     if: >
       needs.build-info.outputs.run-kubernetes-tests == 'true' &&
       needs.build-info.outputs.default-branch == 'main'
@@ -1569,12 +1574,12 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
         with:
           path: ".build/.kubernetes_venv"
           key: "kubernetes-${{ needs.build-info.outputs.default-python-version }}\
-  -${{needs.build-info.outputs.kubernetes-versions-list-as-string}}
-  -${{needs.build-info.outputs.python-versions-list-as-string}}
+  -${{needs.build-info.outputs.min-max-kubernetes-versions-as-string}}
+  -${{needs.build-info.outputs.min-max-python-versions-as-string}}
   -${{ hashFiles('setup.py','setup.cfg') }}"
           restore-keys: "kubernetes-${{ needs.build-info.outputs.default-python-version }}-\
-  -${{needs.build-info.outputs.kubernetes-versions-list-as-string}}
-  -${{needs.build-info.outputs.python-versions-list-as-string}}"
+  -${{needs.build-info.outputs.min-max-kubernetes-versions-as-string}} \
+  -${{needs.build-info.outputs.min-max-python-versions-as-string}}"
       - name: "Cache bin folder with tools for kubernetes testing"
         uses: actions/cache@v3
         with:
diff --git a/dev/breeze/src/airflow_breeze/utils/selective_checks.py b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
index 642bb75043..af5b7a154d 100644
--- a/dev/breeze/src/airflow_breeze/utils/selective_checks.py
+++ b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
@@ -330,6 +330,14 @@ class SelectiveChecks:
     def python_versions_list_as_string(self) -> str:
         return " ".join(self.python_versions)
 
+    @cached_property
+    def min_max_python_versions_as_string(self) -> str:
+        return " ".join(
+            [CURRENT_PYTHON_MAJOR_MINOR_VERSIONS[0], CURRENT_PYTHON_MAJOR_MINOR_VERSIONS[-1]]
+            if self._full_tests_needed
+            else [DEFAULT_PYTHON_MAJOR_MINOR_VERSION]
+        )
+
     @cached_property
     def all_python_versions(self) -> list[str]:
         return (
@@ -386,6 +394,14 @@ class SelectiveChecks:
     def kubernetes_versions(self) -> list[str]:
         return CURRENT_KUBERNETES_VERSIONS if self._full_tests_needed else [DEFAULT_KUBERNETES_VERSION]
 
+    @cached_property
+    def min_max_kubernetes_versions_as_string(self) -> str:
+        return " ".join(
+            [CURRENT_KUBERNETES_VERSIONS[0], CURRENT_KUBERNETES_VERSIONS[-1]]
+            if self._full_tests_needed
+            else [DEFAULT_KUBERNETES_VERSION]
+        )
+
     @cached_property
     def kubernetes_versions_list_as_string(self) -> str:
         return " ".join(self.kubernetes_versions)


[airflow] 20/22: Update description of branch creation to include the new Breeze (#25155)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 2eb5e80c4a1c5502de1bf106e343e791d3281d47
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Tue Jul 19 23:08:39 2022 +0200

    Update description of branch creation to include the new Breeze (#25155)
    
    * Update description of branch creation to include the new Breeze
    
    The new Breeze has a different place where default branch and
    constraints branch are kept.
    
    When we create a new "release" branch we should update it here
    as well as in the bash legacy breeze (until the bash breeze has
    stil some zombies around)
    
    (cherry picked from commit 8923e3ab0304caafd011253b52e2d644066f58fc)
---
 dev/README_RELEASE_AIRFLOW.md | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/dev/README_RELEASE_AIRFLOW.md b/dev/README_RELEASE_AIRFLOW.md
index 287b642d69..f699e04ab2 100644
--- a/dev/README_RELEASE_AIRFLOW.md
+++ b/dev/README_RELEASE_AIRFLOW.md
@@ -341,6 +341,8 @@ Run script to re-tag images from the ``main`` branch to the  ``vX-Y-test`` branc
 
 ### Update default branches
 
+#### In the legacy, bash breeze (to be removed when the bash breeze is entirely gone)
+
 In ``./scripts/ci/libraries/_intialization.sh`` update branches to reflect the new branch:
 
 ```bash
@@ -363,6 +365,22 @@ values for comparison and regexp):
         AIRFLOW_BRANCH_FOR_PYPI_PRELOADING="vX-Y-stable"
 ```
 
+#### In the new breeze
+
+In ``./dev/breeze/src/airflow_breeze/branch_defaults.py`` update branches to reflect the new branch:
+
+```python
+AIRFLOW_BRANCH = "main"
+DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH = "constraints-main"
+```
+
+should become this, where ``X-Y`` is your new branch version:
+
+```python
+AIRFLOW_BRANCH = "vX-Y-test"
+DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH = "constraints-X-Y"
+```
+
 ### Commit the changes to the test branch
 
 ```bash


[airflow] 13/22: Fix markdown error in Airflow Readme (#25120)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 823e2f0d3f82e0f9c523a5e2d6d0264b8c29ca91
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Mon Jul 18 10:59:41 2022 +0200

    Fix markdown error in Airflow Readme (#25120)
    
    The new markdown-lint is a bit more picky about headeers in markdown
    
    (cherry picked from commit 6e592ad7565d4f8a7371dea71ce6e74e512dec11)
---
 dev/README_RELEASE_AIRFLOW.md | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/dev/README_RELEASE_AIRFLOW.md b/dev/README_RELEASE_AIRFLOW.md
index f311cf556a..287b642d69 100644
--- a/dev/README_RELEASE_AIRFLOW.md
+++ b/dev/README_RELEASE_AIRFLOW.md
@@ -25,7 +25,7 @@
   - [Reviewing cherry-picked PRs and assigning labels](#reviewing-cherry-picked-prs-and-assigning-labels)
 - [Prepare the Apache Airflow Package RC](#prepare-the-apache-airflow-package-rc)
   - [Build RC artifacts](#build-rc-artifacts)
-  - [[\Optional\] Prepare new release branches and cache](#%5Coptional%5C-prepare-new-release-branches-and-cache)
+  - [Prepare new release branches and cache - optional when first minor version is released](#prepare-new-release-branches-and-cache---optional-when-first-minor-version-is-released)
   - [Prepare PyPI convenience "snapshot" packages](#prepare-pypi-convenience-snapshot-packages)
   - [Prepare production Docker Image RC](#prepare-production-docker-image-rc)
   - [Prepare issue for testing status of rc](#prepare-issue-for-testing-status-of-rc)
@@ -199,7 +199,9 @@ The Release Candidate artifacts we vote upon should be the exact ones we vote ag
 
 - Check out the 'test' branch
 
-  For major/minor version release, please follow  the instructions at [Prepare new release branches and cache](#%5Coptional%5C-prepare-new-release-branches-and-cache) to create the 'test' and 'stable' branches.
+  For major/minor version release, please follow  the instructions at
+  [Prepare new release branches and cache](#prepare-new-release-branches-and-cache---optional-when-first-minor-version-is-released)
+  to create the 'test' and 'stable' branches.
 
     ```shell script
     git checkout v${VERSION_BRANCH}-test
@@ -314,7 +316,7 @@ The Release Candidate artifacts we vote upon should be the exact ones we vote ag
     svn commit -m "Add artifacts for Airflow ${VERSION}"
     ```
 
-## [\Optional\] Prepare new release branches and cache
+## Prepare new release branches and cache - optional when first minor version is released
 
 When you just released the `X.Y.0` version (first release of new minor version) you need to create release
 branches: `vX-Y-test` and `vX-Y-stable` (for example with `2.1.0rc1` release you need to create v2-1-test and


[airflow] 14/22: Bump typing-extensions and mypy for ParamSpec (#25088)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit ec8ea0e200d5a13b1414312e017eea1af6fdf98d
Author: Tzu-ping Chung <ur...@gmail.com>
AuthorDate: Mon Jul 18 17:20:35 2022 +0800

    Bump typing-extensions and mypy for ParamSpec (#25088)
    
    * Bump typing-extensions and mypy for ParamSpec
    
    I want to use them in some @task signature improvements. Mypy added this
    in 0.950, but let's just bump to latest since why not.
    
    Changelog of typing-extensions is spotty before 4.0, but ParamSpec was
    introduced some time before that (likely some time in 2021), and it
    seems to be a reasonble minimum to bump to.
    
    For more about ParamSpec, read PEP 612: https://peps.python.org/pep-0612/
    
    (cherry picked from commit e32e9c58802fe9363cc87ea283a59218df7cec3a)
---
 airflow/jobs/scheduler_job.py                      |  4 +-
 airflow/mypy/plugin/decorators.py                  |  5 +-
 .../amazon/aws/transfers/dynamodb_to_s3.py         |  1 +
 .../providers/amazon/aws/transfers/sql_to_s3.py    | 19 ++++---
 .../providers/google/cloud/operators/cloud_sql.py  |  2 +-
 airflow/providers/microsoft/azure/hooks/cosmos.py  | 62 +++++++++++++---------
 airflow/utils/context.py                           |  2 +-
 .../airflow_breeze/commands/testing_commands.py    |  8 +--
 scripts/in_container/run_migration_reference.py    |  1 +
 setup.cfg                                          |  2 +-
 setup.py                                           |  2 +-
 .../microsoft/azure/hooks/test_azure_cosmos.py     |  8 ++-
 12 files changed, 71 insertions(+), 45 deletions(-)

diff --git a/airflow/jobs/scheduler_job.py b/airflow/jobs/scheduler_job.py
index 3440832275..3613b9be47 100644
--- a/airflow/jobs/scheduler_job.py
+++ b/airflow/jobs/scheduler_job.py
@@ -170,7 +170,7 @@ class SchedulerJob(BaseJob):
         signal.signal(signal.SIGTERM, self._exit_gracefully)
         signal.signal(signal.SIGUSR2, self._debug_dump)
 
-    def _exit_gracefully(self, signum, frame) -> None:
+    def _exit_gracefully(self, signum: int, frame) -> None:
         """Helper method to clean up processor_agent to avoid leaving orphan processes."""
         if not _is_parent_process():
             # Only the parent process should perform the cleanup.
@@ -181,7 +181,7 @@ class SchedulerJob(BaseJob):
             self.processor_agent.end()
         sys.exit(os.EX_OK)
 
-    def _debug_dump(self, signum, frame):
+    def _debug_dump(self, signum: int, frame) -> None:
         if not _is_parent_process():
             # Only the parent process should perform the debug dump.
             return
diff --git a/airflow/mypy/plugin/decorators.py b/airflow/mypy/plugin/decorators.py
index 76f1af54cd..32e1113876 100644
--- a/airflow/mypy/plugin/decorators.py
+++ b/airflow/mypy/plugin/decorators.py
@@ -68,7 +68,10 @@ def _change_decorator_function_type(
     # Mark provided arguments as optional
     decorator.arg_types = copy.copy(decorated.arg_types)
     for argument in provided_arguments:
-        index = decorated.arg_names.index(argument)
+        try:
+            index = decorated.arg_names.index(argument)
+        except ValueError:
+            continue
         decorated_type = decorated.arg_types[index]
         decorator.arg_types[index] = UnionType.make_union([decorated_type, NoneType()])
         decorated.arg_kinds[index] = ARG_NAMED_OPT
diff --git a/airflow/providers/amazon/aws/transfers/dynamodb_to_s3.py b/airflow/providers/amazon/aws/transfers/dynamodb_to_s3.py
index a6f5f8da21..218f4dc16c 100644
--- a/airflow/providers/amazon/aws/transfers/dynamodb_to_s3.py
+++ b/airflow/providers/amazon/aws/transfers/dynamodb_to_s3.py
@@ -114,6 +114,7 @@ class DynamoDBToS3Operator(BaseOperator):
 
         scan_kwargs = copy(self.dynamodb_scan_kwargs) if self.dynamodb_scan_kwargs else {}
         err = None
+        f: IO[Any]
         with NamedTemporaryFile() as f:
             try:
                 f = self._scan_dynamodb_and_upload_to_s3(f, scan_kwargs, table)
diff --git a/airflow/providers/amazon/aws/transfers/sql_to_s3.py b/airflow/providers/amazon/aws/transfers/sql_to_s3.py
index f399c27141..d9bebf5a39 100644
--- a/airflow/providers/amazon/aws/transfers/sql_to_s3.py
+++ b/airflow/providers/amazon/aws/transfers/sql_to_s3.py
@@ -16,8 +16,8 @@
 # specific language governing permissions and limitations
 # under the License.
 
+import enum
 from collections import namedtuple
-from enum import Enum
 from tempfile import NamedTemporaryFile
 from typing import TYPE_CHECKING, Iterable, Mapping, Optional, Sequence, Union
 
@@ -35,10 +35,13 @@ if TYPE_CHECKING:
     from airflow.utils.context import Context
 
 
-FILE_FORMAT = Enum(
-    "FILE_FORMAT",
-    "CSV, JSON, PARQUET",
-)
+class FILE_FORMAT(enum.Enum):
+    """Possible file formats."""
+
+    CSV = enum.auto()
+    JSON = enum.auto()
+    PARQUET = enum.auto()
+
 
 FileOptions = namedtuple('FileOptions', ['mode', 'suffix', 'function'])
 
@@ -118,9 +121,9 @@ class SqlToS3Operator(BaseOperator):
         if "path_or_buf" in self.pd_kwargs:
             raise AirflowException('The argument path_or_buf is not allowed, please remove it')
 
-        self.file_format = getattr(FILE_FORMAT, file_format.upper(), None)
-
-        if self.file_format is None:
+        try:
+            self.file_format = FILE_FORMAT[file_format.upper()]
+        except KeyError:
             raise AirflowException(f"The argument file_format doesn't support {file_format} value.")
 
     @staticmethod
diff --git a/airflow/providers/google/cloud/operators/cloud_sql.py b/airflow/providers/google/cloud/operators/cloud_sql.py
index 1441f518b4..fb5a88593e 100644
--- a/airflow/providers/google/cloud/operators/cloud_sql.py
+++ b/airflow/providers/google/cloud/operators/cloud_sql.py
@@ -35,7 +35,7 @@ if TYPE_CHECKING:
 SETTINGS = 'settings'
 SETTINGS_VERSION = 'settingsVersion'
 
-CLOUD_SQL_CREATE_VALIDATION = [
+CLOUD_SQL_CREATE_VALIDATION: Sequence[dict] = [
     dict(name="name", allow_empty=False),
     dict(
         name="settings",
diff --git a/airflow/providers/microsoft/azure/hooks/cosmos.py b/airflow/providers/microsoft/azure/hooks/cosmos.py
index ed475978b0..954b584846 100644
--- a/airflow/providers/microsoft/azure/hooks/cosmos.py
+++ b/airflow/providers/microsoft/azure/hooks/cosmos.py
@@ -23,6 +23,7 @@ Airflow connection of type `azure_cosmos` exists. Authorization can be done by s
 login (=Endpoint uri), password (=secret key) and extra fields database_name and collection_name to specify
 the default database and collection to use (see connection `azure_cosmos_default` for an example).
 """
+import json
 import uuid
 from typing import Any, Dict, Optional
 
@@ -140,14 +141,22 @@ class AzureCosmosDBHook(BaseHook):
         existing_container = list(
             self.get_conn()
             .get_database_client(self.__get_database_name(database_name))
-            .query_containers("SELECT * FROM r WHERE r.id=@id", [{"name": "@id", "value": collection_name}])
+            .query_containers(
+                "SELECT * FROM r WHERE r.id=@id",
+                parameters=[json.dumps({"name": "@id", "value": collection_name})],
+            )
         )
         if len(existing_container) == 0:
             return False
 
         return True
 
-    def create_collection(self, collection_name: str, database_name: Optional[str] = None) -> None:
+    def create_collection(
+        self,
+        collection_name: str,
+        database_name: Optional[str] = None,
+        partition_key: Optional[str] = None,
+    ) -> None:
         """Creates a new collection in the CosmosDB database."""
         if collection_name is None:
             raise AirflowBadRequest("Collection name cannot be None.")
@@ -157,13 +166,16 @@ class AzureCosmosDBHook(BaseHook):
         existing_container = list(
             self.get_conn()
             .get_database_client(self.__get_database_name(database_name))
-            .query_containers("SELECT * FROM r WHERE r.id=@id", [{"name": "@id", "value": collection_name}])
+            .query_containers(
+                "SELECT * FROM r WHERE r.id=@id",
+                parameters=[json.dumps({"name": "@id", "value": collection_name})],
+            )
         )
 
         # Only create if we did not find it already existing
         if len(existing_container) == 0:
             self.get_conn().get_database_client(self.__get_database_name(database_name)).create_container(
-                collection_name
+                collection_name, partition_key=partition_key
             )
 
     def does_database_exist(self, database_name: str) -> bool:
@@ -173,10 +185,8 @@ class AzureCosmosDBHook(BaseHook):
 
         existing_database = list(
             self.get_conn().query_databases(
-                {
-                    "query": "SELECT * FROM r WHERE r.id=@id",
-                    "parameters": [{"name": "@id", "value": database_name}],
-                }
+                "SELECT * FROM r WHERE r.id=@id",
+                parameters=[json.dumps({"name": "@id", "value": database_name})],
             )
         )
         if len(existing_database) == 0:
@@ -193,10 +203,8 @@ class AzureCosmosDBHook(BaseHook):
         # to create it twice
         existing_database = list(
             self.get_conn().query_databases(
-                {
-                    "query": "SELECT * FROM r WHERE r.id=@id",
-                    "parameters": [{"name": "@id", "value": database_name}],
-                }
+                "SELECT * FROM r WHERE r.id=@id",
+                parameters=[json.dumps({"name": "@id", "value": database_name})],
             )
         )
 
@@ -267,18 +275,28 @@ class AzureCosmosDBHook(BaseHook):
         return created_documents
 
     def delete_document(
-        self, document_id: str, database_name: Optional[str] = None, collection_name: Optional[str] = None
+        self,
+        document_id: str,
+        database_name: Optional[str] = None,
+        collection_name: Optional[str] = None,
+        partition_key: Optional[str] = None,
     ) -> None:
         """Delete an existing document out of a collection in the CosmosDB database."""
         if document_id is None:
             raise AirflowBadRequest("Cannot delete a document without an id")
-
-        self.get_conn().get_database_client(self.__get_database_name(database_name)).get_container_client(
-            self.__get_collection_name(collection_name)
-        ).delete_item(document_id)
+        (
+            self.get_conn()
+            .get_database_client(self.__get_database_name(database_name))
+            .get_container_client(self.__get_collection_name(collection_name))
+            .delete_item(document_id, partition_key=partition_key)
+        )
 
     def get_document(
-        self, document_id: str, database_name: Optional[str] = None, collection_name: Optional[str] = None
+        self,
+        document_id: str,
+        database_name: Optional[str] = None,
+        collection_name: Optional[str] = None,
+        partition_key: Optional[str] = None,
     ):
         """Get a document from an existing collection in the CosmosDB database."""
         if document_id is None:
@@ -289,7 +307,7 @@ class AzureCosmosDBHook(BaseHook):
                 self.get_conn()
                 .get_database_client(self.__get_database_name(database_name))
                 .get_container_client(self.__get_collection_name(collection_name))
-                .read_item(document_id)
+                .read_item(document_id, partition_key=partition_key)
             )
         except CosmosHttpResponseError:
             return None
@@ -305,17 +323,13 @@ class AzureCosmosDBHook(BaseHook):
         if sql_string is None:
             raise AirflowBadRequest("SQL query string cannot be None")
 
-        # Query them in SQL
-        query = {'query': sql_string}
-
         try:
             result_iterable = (
                 self.get_conn()
                 .get_database_client(self.__get_database_name(database_name))
                 .get_container_client(self.__get_collection_name(collection_name))
-                .query_items(query, partition_key)
+                .query_items(sql_string, partition_key=partition_key)
             )
-
             return list(result_iterable)
         except CosmosHttpResponseError:
             return None
diff --git a/airflow/utils/context.py b/airflow/utils/context.py
index 04dababa24..648a0f9a03 100644
--- a/airflow/utils/context.py
+++ b/airflow/utils/context.py
@@ -175,7 +175,7 @@ class Context(MutableMapping[str, Any]):
     }
 
     def __init__(self, context: Optional[MutableMapping[str, Any]] = None, **kwargs: Any) -> None:
-        self._context = context or {}
+        self._context: MutableMapping[str, Any] = context or {}
         if kwargs:
             self._context.update(kwargs)
         self._deprecation_replacements = self._DEPRECATION_REPLACEMENTS.copy()
diff --git a/dev/breeze/src/airflow_breeze/commands/testing_commands.py b/dev/breeze/src/airflow_breeze/commands/testing_commands.py
index b53333ea64..05aa3aa7e8 100644
--- a/dev/breeze/src/airflow_breeze/commands/testing_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/testing_commands.py
@@ -197,9 +197,9 @@ def run_with_progress(
 ) -> RunCommandResult:
     title = f"Running tests: {test_type}, Python: {python}, Backend: {backend}:{version}"
     try:
-        with tempfile.NamedTemporaryFile(mode='w+t', delete=False) as f:
+        with tempfile.NamedTemporaryFile(mode='w+t', delete=False) as tf:
             get_console().print(f"[info]Starting test = {title}[/]")
-            thread = MonitoringThread(title=title, file_name=f.name)
+            thread = MonitoringThread(title=title, file_name=tf.name)
             thread.start()
             try:
                 result = run_command(
@@ -208,14 +208,14 @@ def run_with_progress(
                     dry_run=dry_run,
                     env=env_variables,
                     check=False,
-                    stdout=f,
+                    stdout=tf,
                     stderr=subprocess.STDOUT,
                 )
             finally:
                 thread.stop()
                 thread.join()
         with ci_group(f"Result of {title}", message_type=message_type_from_return_code(result.returncode)):
-            with open(f.name) as f:
+            with open(tf.name) as f:
                 shutil.copyfileobj(f, sys.stdout)
     finally:
         os.unlink(f.name)
diff --git a/scripts/in_container/run_migration_reference.py b/scripts/in_container/run_migration_reference.py
index cc05408c2a..12ff265c55 100755
--- a/scripts/in_container/run_migration_reference.py
+++ b/scripts/in_container/run_migration_reference.py
@@ -102,6 +102,7 @@ def revision_suffix(rev: "Script"):
 
 def ensure_airflow_version(revisions: Iterable["Script"]):
     for rev in revisions:
+        assert rev.module.__file__ is not None  # For Mypy.
         file = Path(rev.module.__file__)
         content = file.read_text()
         if not has_version(content):
diff --git a/setup.cfg b/setup.cfg
index 0e1e9f7b84..2c96a0de42 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -146,7 +146,7 @@ install_requires =
     tabulate>=0.7.5
     tenacity>=6.2.0
     termcolor>=1.1.0
-    typing-extensions>=3.7.4
+    typing-extensions>=4.0.0
     unicodecsv>=0.14.1
     werkzeug>=2.0
 
diff --git a/setup.py b/setup.py
index 4d5dbd1bb8..6447281e5d 100644
--- a/setup.py
+++ b/setup.py
@@ -578,7 +578,7 @@ zendesk = [
 # mypyd which does not support installing the types dynamically with --install-types
 mypy_dependencies = [
     # TODO: upgrade to newer versions of MyPy continuously as they are released
-    'mypy==0.910',
+    'mypy==0.950',
     'types-boto',
     'types-certifi',
     'types-croniter',
diff --git a/tests/providers/microsoft/azure/hooks/test_azure_cosmos.py b/tests/providers/microsoft/azure/hooks/test_azure_cosmos.py
index b407fbdb3c..e157a5276b 100644
--- a/tests/providers/microsoft/azure/hooks/test_azure_cosmos.py
+++ b/tests/providers/microsoft/azure/hooks/test_azure_cosmos.py
@@ -90,7 +90,9 @@ class TestAzureCosmosDbHook(unittest.TestCase):
         hook = AzureCosmosDBHook(azure_cosmos_conn_id='azure_cosmos_test_key_id')
         hook.create_collection(self.test_collection_name, self.test_database_name)
         expected_calls = [
-            mock.call().get_database_client('test_database_name').create_container('test_collection_name')
+            mock.call()
+            .get_database_client('test_database_name')
+            .create_container('test_collection_name', partition_key=None)
         ]
         mock_cosmos.assert_any_call(self.test_end_point, {'masterKey': self.test_master_key})
         mock_cosmos.assert_has_calls(expected_calls)
@@ -100,7 +102,9 @@ class TestAzureCosmosDbHook(unittest.TestCase):
         hook = AzureCosmosDBHook(azure_cosmos_conn_id='azure_cosmos_test_key_id')
         hook.create_collection(self.test_collection_name)
         expected_calls = [
-            mock.call().get_database_client('test_database_name').create_container('test_collection_name')
+            mock.call()
+            .get_database_client('test_database_name')
+            .create_container('test_collection_name', partition_key=None)
         ]
         mock_cosmos.assert_any_call(self.test_end_point, {'masterKey': self.test_master_key})
         mock_cosmos.assert_has_calls(expected_calls)


[airflow] 09/22: Add Kubernetes-related files to trigger helm tests (#24950)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit c39ffb4a7928ac09bf023047095e311b15b7fd68
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Mon Jul 11 15:30:52 2022 +0200

    Add Kubernetes-related files to trigger helm tests (#24950)
    
    So far, when Kubernetes-related files ware changed, the Helm chart
    were not run - which lead to some of the tests failing after merge.
    This change adds kubernetes related files in airlfow to list of
    files that trigger Helm tets.
    
    (cherry picked from commit 7fc5e0b24a8938906ad23eaa1262c9fb74ee2df1)
---
 dev/breeze/src/airflow_breeze/utils/selective_checks.py | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/dev/breeze/src/airflow_breeze/utils/selective_checks.py b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
index 0d774c6c19..d3277e7b7e 100644
--- a/dev/breeze/src/airflow_breeze/utils/selective_checks.py
+++ b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
@@ -122,6 +122,8 @@ CI_FILE_GROUP_MATCHES = HashableDict(
         ],
         FileGroupForCi.HELM_FILES: [
             "^chart",
+            "^airflow/kubernetes",
+            "^tests/kubernetes",
         ],
         FileGroupForCi.SETUP_FILES: [
             r"^pyproject.toml",


[airflow] 01/22: Improve version check for kubectl (#24882)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 60c64bcdf150194163e37d129b138859a58b6714
Author: Gabriel Machado <ga...@hotmail.com>
AuthorDate: Wed Jul 6 21:22:03 2022 +0200

    Improve version check for kubectl (#24882)
    
    kubectl 1.24.0 added a warning that broke the version detection.
    It leads to redownload kubectl everytime we run a breeze-legacy command.
    
    (cherry picked from commit ff7e7a0dbb28ca66a2520bed569c7ffd5c8a03ee)
---
 scripts/ci/libraries/_kind.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/ci/libraries/_kind.sh b/scripts/ci/libraries/_kind.sh
index 875cd18a76..4ae6fd3383 100644
--- a/scripts/ci/libraries/_kind.sh
+++ b/scripts/ci/libraries/_kind.sh
@@ -69,7 +69,7 @@ function kind::make_sure_kubernetes_tools_are_installed() {
     kubectl_url="https://storage.googleapis.com/kubernetes-release/release/${KUBECTL_VERSION}/bin/${system}/${machine}/kubectl"
     if [[ -f "${KUBECTL_BINARY_PATH}" ]]; then
         local downloaded_kubectl_version
-        downloaded_kubectl_version="$(${KUBECTL_BINARY_PATH} version --client=true --short | awk '{ print $3 }')"
+        downloaded_kubectl_version="$(${KUBECTL_BINARY_PATH} version --client --output yaml | grep gitVersion | awk '{ print $2 }')"
         echo "Currently downloaded kubectl version = ${downloaded_kubectl_version}"
     fi
     if [[ ! -f "${KUBECTL_BINARY_PATH}" || ${downloaded_kubectl_version} != "${KUBECTL_VERSION}" ]]; then


[airflow] 12/22: Update `check_files.py` to support many provider releases (#25077)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 9321c9cc6d6594343473025e0f1e8bfb29c65335
Author: Jed Cunningham <66...@users.noreply.github.com>
AuthorDate: Fri Jul 15 08:13:55 2022 -0600

    Update `check_files.py` to support many provider releases (#25077)
    
    This allows you to put many provider releases in `packages.txt` and
    check them all in one go. In fact, you can copy/paste the list of pypi
    urls from the vote email!
    
    (cherry picked from commit ded93a762929ce2a0a8b76ede007c25de5a474e3)
---
 dev/README_RELEASE_AIRFLOW.md           |   2 +-
 dev/README_RELEASE_PROVIDER_PACKAGES.md |   3 +-
 dev/check_files.py                      | 123 ++++++++++++++++++--------------
 3 files changed, 73 insertions(+), 55 deletions(-)

diff --git a/dev/README_RELEASE_AIRFLOW.md b/dev/README_RELEASE_AIRFLOW.md
index 54ee66a1bc..f311cf556a 100644
--- a/dev/README_RELEASE_AIRFLOW.md
+++ b/dev/README_RELEASE_AIRFLOW.md
@@ -663,7 +663,7 @@ Optionally you can use `check_files.py` script to verify that all expected files
 present in SVN. This script may help also with verifying installation of the packages.
 
 ```shell script
-python check_files.py -v {VERSION} -t airflow -p {PATH_TO_SVN}
+python check_files.py airflow -v {VERSION} -p {PATH_TO_SVN}
 ```
 
 ## Licence check
diff --git a/dev/README_RELEASE_PROVIDER_PACKAGES.md b/dev/README_RELEASE_PROVIDER_PACKAGES.md
index bababed62f..7abd809102 100644
--- a/dev/README_RELEASE_PROVIDER_PACKAGES.md
+++ b/dev/README_RELEASE_PROVIDER_PACKAGES.md
@@ -499,7 +499,8 @@ Optionally you can use `check_files.py` script to verify that all expected files
 present in SVN. This script may help also with verifying installation of the packages.
 
 ```shell script
-python check_files.py -v {VERSION} -t providers -p {PATH_TO_SVN}
+# Copy the list of packages (pypi urls) into `packages.txt` then run:
+python check_files.py providers -p {PATH_TO_SVN}
 ```
 
 ### Licences check
diff --git a/dev/check_files.py b/dev/check_files.py
index f6267aa162..230c484b16 100644
--- a/dev/check_files.py
+++ b/dev/check_files.py
@@ -18,7 +18,7 @@
 import os
 import re
 from itertools import product
-from typing import List
+from typing import List, Tuple
 
 import rich_click as click
 from rich import print
@@ -51,7 +51,7 @@ PROVIDERS = "PROVIDERS"
 UPGRADE_CHECK = "UPGRADE_CHECK"
 
 
-def get_packages() -> List[str]:
+def get_packages() -> List[Tuple[str, str]]:
     try:
         with open("packages.txt") as file:
             content = file.read()
@@ -60,7 +60,15 @@ def get_packages() -> List[str]:
     if not content:
         raise SystemExit("List of packages to check is empty. Please add packages to `packages.txt`")
 
-    packages = [p.replace("* ", "").strip() for p in content.split("\n") if p]
+    # e.g. https://pypi.org/project/apache-airflow-providers-airbyte/3.1.0rc1/
+
+    packages = []
+    for line in content.split("\n"):
+        if not line:
+            continue
+        name, version = line.rstrip("/").split("/")[-2:]
+        packages.append((name, version))
+
     return packages
 
 
@@ -78,16 +86,16 @@ def create_docker(txt: str):
     )
 
 
-def check_providers(files: List[str], version: str):
-    print(f"Checking providers for version {version}:\n")
-    version = strip_rc_suffix(version)
+def check_providers(files: List[str]):
+    print("Checking providers from packages.txt:\n")
     missing_list = []
-    for p in get_packages():
-        print(p)
+    for name, version in get_packages():
+        print(f"Checking {name} {version}")
+        version = strip_rc_suffix(version)
         expected_files = expand_name_variations(
             [
-                f"{p}-{version}.tar.gz",
-                f"{p.replace('-', '_')}-{version}-py3-none-any.whl",
+                f"{name}-{version}.tar.gz",
+                f"{name.replace('-', '_')}-{version}-py3-none-any.whl",
             ]
         )
 
@@ -154,30 +162,24 @@ def warn_of_missing_files(files):
         print(f"    - [red]{file}[/red]")
 
 
-@click.command()
-@click.option(
-    "--type",
-    "-t",
-    "check_type",
-    prompt="providers, airflow, upgrade_check",
+path_option = click.option(
+    "--path",
+    "-p",
+    prompt="Path to files",
     type=str,
-    help="Type of the check to perform. One of: providers, airflow, upgrade_check",
+    help="Path to directory where are sources",
 )
-@click.option(
+version_option = click.option(
     "--version",
     "-v",
     prompt="Version",
     type=str,
     help="Version of package to verify. For example 1.10.15.rc1, 2021.3.17rc1",
 )
-@click.option(
-    "--path",
-    "-p",
-    prompt="Path to files",
-    type=str,
-    help="Path to directory where are sources",
-)
-def main(check_type: str, path: str, version: str):
+
+
+@click.group()
+def cli():
     """
     Use this tool to verify that all expected packages are present in Apache Airflow svn.
     In case of providers, it will generate Dockerfile.pmc that you can use
@@ -187,42 +189,57 @@ def main(check_type: str, path: str, version: str):
     that you expect to find (copy-paste the list from VOTE thread).
 
     Example usages:
-    python check_files.py -v 1.10.15rc1 -t airflow -p ~/code/airflow_svn
-    python check_files.py -v 1.3.0rc2 -t upgrade_check -p ~/code/airflow_svn
-    python check_files.py -v 1.0.3rc1 -t providers -p ~/code/airflow_svn
+    python check_files.py airflow -p ~/code/airflow_svn -v 1.10.15rc1
+    python check_files.py upgrade_check -p ~/code/airflow_svn -v 1.3.0rc2
+    python check_files.py providers -p ~/code/airflow_svn
     """
 
-    if check_type.upper() == PROVIDERS:
-        files = os.listdir(os.path.join(path, "providers"))
-        pips = [f"{p}=={version}" for p in get_packages()]
-        missing_files = check_providers(files, version)
-        create_docker(PROVIDERS_DOCKER.format("\n".join(f"RUN pip install '{p}'" for p in pips)))
-        if missing_files:
-            warn_of_missing_files(missing_files)
-        return
 
-    if check_type.upper() == AIRFLOW:
-        files = os.listdir(os.path.join(path, version))
-        missing_files = check_release(files, version)
-        create_docker(AIRFLOW_DOCKER.format(version))
-        if missing_files:
-            warn_of_missing_files(missing_files)
-        return
+@click.command()
+@path_option
+@click.pass_context
+def providers(ctx, path: str):
+    files = os.listdir(os.path.join(path, "providers"))
+    pips = [f"{name}=={version}" for name, version in get_packages()]
+    missing_files = check_providers(files)
+    create_docker(PROVIDERS_DOCKER.format("\n".join(f"RUN pip install '{p}'" for p in pips)))
+    if missing_files:
+        warn_of_missing_files(missing_files)
 
-    if check_type.upper() == UPGRADE_CHECK:
-        files = os.listdir(os.path.join(path, "upgrade-check", version))
-        missing_files = check_upgrade_check(files, version)
 
-        create_docker(DOCKER_UPGRADE.format(version))
-        if missing_files:
-            warn_of_missing_files(missing_files)
-        return
+@click.command()
+@path_option
+@version_option
+@click.pass_context
+def airflow(ctx, path: str, version: str):
+    files = os.listdir(os.path.join(path, version))
+    missing_files = check_release(files, version)
+    create_docker(AIRFLOW_DOCKER.format(version))
+    if missing_files:
+        warn_of_missing_files(missing_files)
+    return
+
+
+@click.command()
+@path_option
+@version_option
+@click.pass_context
+def upgrade_check(ctx, path: str, version: str):
+    files = os.listdir(os.path.join(path, "upgrade-check", version))
+    missing_files = check_upgrade_check(files, version)
+
+    create_docker(DOCKER_UPGRADE.format(version))
+    if missing_files:
+        warn_of_missing_files(missing_files)
+    return
 
-    raise SystemExit(f"Unknown check type: {check_type}")
 
+cli.add_command(providers)
+cli.add_command(airflow)
+cli.add_command(upgrade_check)
 
 if __name__ == "__main__":
-    main()
+    cli()
 
 
 def test_check_release_pass():


[airflow] 17/22: Disable provider packages building for non-main branch builds (#25056)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit bf2a6eaa50d4f0402f424be14f85c28d7965adcf
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Tue Jul 19 14:37:44 2022 +0200

    Disable provider packages building for non-main branch builds (#25056)
    
    * Disable provider packages building for non-main branch builds
    
    When running the builds from non-main, we do not want to use
    provider packages built locally, but we want to install those from
    PyPI. This is achieved by skipping the step of building providers
    in case default branch is not main.
    
    During this change it was also discovered that we do not need
    AIRFLOW_FROM_CONTEXT flag to indicate whether airflow is
    among those being installed from docker-context files. This is
    now detected automatically and airflow is installed from Pypi
    if not installed from docker context files. Providers
    and airflow are automatically detected and installed if they are
    present.
    
    Installing pre-cached dependencies from GitHub is skipped in
    case docker-context-files are used.
    
    (cherry picked from commit 67a24aed68c74aee2706d2c7b6b029a5846f0d55)
---
 .../airflow_providers_bug_report.yml               |   2 -
 .github/workflows/build-images.yml                 |   5 +-
 .github/workflows/ci.yml                           |  19 +-
 Dockerfile                                         |  29 +-
 IMAGES.rst                                         |   3 +-
 .../commands/production_image_commands.py          |   9 +-
 .../src/airflow_breeze/params/build_prod_params.py |  22 +-
 dev/refresh_images.sh                              |   2 -
 docs/docker-stack/build-arg-ref.rst                |   5 -
 docs/docker-stack/changelog.rst                    |   3 +-
 images/breeze/output-build-prod-image.svg          | 352 ++++++++++-----------
 images/breeze/output-commands-hash.txt             |   2 +-
 scripts/ci/libraries/_initialization.sh            |   7 -
 13 files changed, 208 insertions(+), 252 deletions(-)

diff --git a/.github/ISSUE_TEMPLATE/airflow_providers_bug_report.yml b/.github/ISSUE_TEMPLATE/airflow_providers_bug_report.yml
index 20845ea0c7..665093a84e 100644
--- a/.github/ISSUE_TEMPLATE/airflow_providers_bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/airflow_providers_bug_report.yml
@@ -43,7 +43,6 @@ body:
         - celery
         - cloudant
         - cncf-kubernetes
-        - common-sql
         - databricks
         - datadog
         - dbt-cloud
@@ -93,7 +92,6 @@ body:
         - sqlite
         - ssh
         - tableau
-        - tabular
         - telegram
         - trino
         - vertica
diff --git a/.github/workflows/build-images.yml b/.github/workflows/build-images.yml
index dc758877f7..4485e5c68d 100644
--- a/.github/workflows/build-images.yml
+++ b/.github/workflows/build-images.yml
@@ -318,12 +318,10 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
           key: "pre-commit-${{steps.host-python-version.outputs.host-python-version}}-\
 ${{ hashFiles('.pre-commit-config.yaml') }}"
           restore-keys: pre-commit-${{steps.host-python-version.outputs.host-python-version}}
-        if: needs.build-info.outputs.default-branch == 'main'
       - name: "Regenerate dependencies in case they was modified manually so that we can build an image"
         run: >
           breeze static-checks --type update-providers-dependencies --all-files
           --show-diff-on-failure --color always || true
-        if: needs.build-info.outputs.default-branch == 'main'
       - name: >
           Pull CI image for PROD build:
           ${{ needs.build-info.outputs.default-python-version }}:${{ env.IMAGE_TAG_FOR_THE_BUILD }}
@@ -340,6 +338,7 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
           --package-list-file ./scripts/ci/installed_providers.txt
           --package-format wheel
           --version-suffix-for-pypi dev0
+        if: needs.build-info.outputs.default-branch == 'main'
       - name: "Prepare airflow package"
         run: breeze prepare-airflow-package --package-format wheel --version-suffix-for-pypi dev0
       - name: "Move dist packages to docker-context files"
@@ -353,8 +352,6 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
           --tag-as-latest
           --push-image
           --install-packages-from-context
-          --disable-airflow-repo-cache
-          --airflow-is-in-context
         env:
           UPGRADE_TO_NEWER_DEPENDENCIES: ${{ needs.build-info.outputs.upgrade-to-newer-dependencies }}
           DOCKER_CACHE: ${{ needs.build-info.outputs.cache-directive }}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 86666cf17a..cd056e4238 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -434,7 +434,9 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
           breeze prepare-provider-packages
           --package-list-file ./scripts/ci/installed_providers.txt
           --package-format wheel --version-suffix-for-pypi dev0
-        if: needs.build-info.outputs.in-workflow-build == 'true'
+        if: >
+          needs.build-info.outputs.in-workflow-build == 'true' &&
+          needs.build-info.outputs.default-branch == 'main'
       - name: "Prepare airflow package"
         run: breeze prepare-airflow-package --package-format wheel --version-suffix-for-pypi dev0
         if: needs.build-info.outputs.in-workflow-build == 'true'
@@ -450,8 +452,6 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
           --run-in-parallel
           --push-image
           --install-packages-from-context
-          --disable-airflow-repo-cache
-          --airflow-is-in-context
         env:
           UPGRADE_TO_NEWER_DEPENDENCIES: ${{ needs.build-info.outputs.upgrade-to-newer-dependencies }}
           DOCKER_CACHE: ${{ needs.build-info.outputs.cache-directive }}
@@ -1719,6 +1719,10 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
           IMAGE_TAG: ${{ env.IMAGE_TAG_FOR_THE_BUILD }}
       - name: "Cleanup dist and context file"
         run: rm -fv ./dist/* ./docker-context-files/*
+      - name: "Prepare airflow package for PROD build"
+        run: breeze prepare-airflow-package --package-format wheel
+        env:
+          VERSION_SUFFIX_FOR_PYPI: "dev0"
       - name: "Prepare providers packages for PROD build"
         run: >
           breeze prepare-provider-packages
@@ -1726,10 +1730,7 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
           --package-format wheel
         env:
           VERSION_SUFFIX_FOR_PYPI: "dev0"
-      - name: "Prepare airflow package for PROD build"
-        run: breeze prepare-airflow-package --package-format wheel
-        env:
-          VERSION_SUFFIX_FOR_PYPI: "dev0"
+        if: needs.build-info.outputs.default-branch == 'main'
       - name: "Start ARM instance"
         run: ./scripts/ci/images/ci_start_arm_instance_and_connect_to_docker.sh
         if: matrix.platform == 'linux/arm64'
@@ -1745,17 +1746,17 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
           PYTHON_MAJOR_MINOR_VERSION: ${{ matrix.python-version }}
       - name: "Move dist packages to docker-context files"
         run: mv -v ./dist/*.whl ./docker-context-files
+        if: needs.build-info.outputs.default-branch == 'main'
       - name: "Push PROD cache ${{ matrix.python-version }} ${{ matrix.platform }}"
         run: >
           breeze build-prod-image
           --builder airflow_cache
-          --airflow-is-in-context
           --install-packages-from-context
           --prepare-buildx-cache
-          --disable-airflow-repo-cache
           --platform ${{ matrix.platform }}
         env:
           PYTHON_MAJOR_MINOR_VERSION: ${{ matrix.python-version }}
+        if: needs.build-info.outputs.default-branch == 'main'
       - name: "Stop ARM instance"
         run: ./scripts/ci/images/ci_stop_arm_instance.sh
         if: always() && matrix.platform == 'linux/arm64'
diff --git a/Dockerfile b/Dockerfile
index fdcbb6fa11..b4ddddef80 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1283,16 +1283,23 @@ ENV AIRFLOW_PIP_VERSION=${AIRFLOW_PIP_VERSION} \
 COPY --from=scripts common.sh install_pip_version.sh \
      install_airflow_dependencies_from_branch_tip.sh /scripts/docker/
 
+# We can set this value to true in case we want to install .whl/.tar.gz packages placed in the
+# docker-context-files folder. This can be done for both additional packages you want to install
+# as well as Airflow and Provider packages (it will be automatically detected if airflow
+# is installed from docker-context files rather than from PyPI)
+ARG INSTALL_PACKAGES_FROM_CONTEXT="false"
+
 # In case of Production build image segment we want to pre-install main version of airflow
 # dependencies from GitHub so that we do not have to always reinstall it from the scratch.
 # The Airflow (and providers in case INSTALL_PROVIDERS_FROM_SOURCES is "false")
 # are uninstalled, only dependencies remain
 # the cache is only used when "upgrade to newer dependencies" is not set to automatically
-# account for removed dependencies (we do not install them in the first place)
-# Upgrade to specific PIP version
+# account for removed dependencies (we do not install them in the first place) and in case
+# INSTALL_PACKAGES_FROM_CONTEXT is not set (because then caching it from main makes no sense).
 RUN bash /scripts/docker/install_pip_version.sh; \
     if [[ ${AIRFLOW_PRE_CACHED_PIP_PACKAGES} == "true" && \
-          ${UPGRADE_TO_NEWER_DEPENDENCIES} == "false" ]]; then \
+        ${INSTALL_PACKAGES_FROM_CONTEXT} == "false" && \
+        ${UPGRADE_TO_NEWER_DEPENDENCIES} == "false" ]]; then \
         bash /scripts/docker/install_airflow_dependencies_from_branch_tip.sh; \
     fi
 
@@ -1302,8 +1309,7 @@ COPY --chown=airflow:0 ${AIRFLOW_SOURCES_WWW_FROM} ${AIRFLOW_SOURCES_WWW_TO}
 # hadolint ignore=SC2086, SC2010
 RUN if [[ ${AIRFLOW_INSTALLATION_METHOD} == "." ]]; then \
         # only prepare node modules and compile assets if the prod image is build from sources
-        # otherwise they are already compiled-in. We should do it in one step with removing artifacts \
-        # as we want to keep the final image small
+        # otherwise they are already compiled-in the package.
         bash /scripts/docker/prepare_node_modules.sh; \
         REMOVE_ARTIFACTS="true" BUILD_TYPE="prod" bash /scripts/docker/compile_www_assets.sh; \
         # Copy generated dist folder (otherwise it will be overridden by the COPY step below)
@@ -1319,14 +1325,7 @@ RUN if [[ ${AIRFLOW_INSTALLATION_METHOD} == "." ]]; then \
 
 # Add extra python dependencies
 ARG ADDITIONAL_PYTHON_DEPS=""
-# We can set this value to true in case we want to install .whl .tar.gz packages placed in the
-# docker-context-files folder. This can be done for both - additional packages you want to install
-# and for airflow as well (you have to set AIRFLOW_IS_IN_CONTEXT to true in this case)
-ARG INSTALL_PACKAGES_FROM_CONTEXT="false"
-# By default we install latest airflow from PyPI or sources. You can set this parameter to false
-# if Airflow is in the .whl or .tar.gz packages placed in `docker-context-files` folder and you want
-# to skip installing Airflow/Providers from PyPI or sources.
-ARG AIRFLOW_IS_IN_CONTEXT="false"
+
 # Those are additional constraints that are needed for some extras but we do not want to
 # Force them on the main Airflow package.
 # * dill<0.3.3 required by apache-beam
@@ -1334,7 +1333,6 @@ ARG EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS="dill<0.3.3"
 
 ENV ADDITIONAL_PYTHON_DEPS=${ADDITIONAL_PYTHON_DEPS} \
     INSTALL_PACKAGES_FROM_CONTEXT=${INSTALL_PACKAGES_FROM_CONTEXT} \
-    AIRFLOW_IS_IN_CONTEXT=${AIRFLOW_IS_IN_CONTEXT} \
     EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS=${EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS}
 
 WORKDIR ${AIRFLOW_HOME}
@@ -1345,7 +1343,8 @@ COPY --from=scripts install_from_docker_context_files.sh install_airflow.sh \
 # hadolint ignore=SC2086, SC2010
 RUN if [[ ${INSTALL_PACKAGES_FROM_CONTEXT} == "true" ]]; then \
         bash /scripts/docker/install_from_docker_context_files.sh; \
-    elif [[ ${AIRFLOW_IS_IN_CONTEXT} == "false" ]]; then \
+    fi; \
+    if ! airflow version 2>/dev/null >/dev/null; then \
         bash /scripts/docker/install_airflow.sh; \
     fi; \
     if [[ -n "${ADDITIONAL_PYTHON_DEPS}" ]]; then \
diff --git a/IMAGES.rst b/IMAGES.rst
index 634c4ac8a0..f72f5bb58e 100644
--- a/IMAGES.rst
+++ b/IMAGES.rst
@@ -165,8 +165,7 @@ You can also skip installing airflow and install it from locally provided files
 
 .. code-block:: bash
 
-  breeze build-prod-image --python 3.7 --additional-extras=trino \
-     --airflow-is-in-context-pypi --install-packages-from-context
+  breeze build-prod-image --python 3.7 --additional-extras=trino --install-packages-from-context
 
 In this case you airflow and all packages (.whl files) should be placed in ``docker-context-files`` folder.
 
diff --git a/dev/breeze/src/airflow_breeze/commands/production_image_commands.py b/dev/breeze/src/airflow_breeze/commands/production_image_commands.py
index 2ee164645d..cafca59fde 100644
--- a/dev/breeze/src/airflow_breeze/commands/production_image_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/production_image_commands.py
@@ -143,7 +143,6 @@ PRODUCTION_IMAGE_TOOLS_PARAMETERS = {
             "name": "Customization options (for specific customization needs)",
             "options": [
                 "--install-packages-from-context",
-                "--airflow-is-in-context",
                 "--cleanup-context",
                 "--disable-mysql-client-installation",
                 "--disable-mssql-client-installation",
@@ -266,14 +265,10 @@ def run_build_in_parallel(
     type=BetterChoice(ALLOWED_INSTALLATION_METHODS),
 )
 @option_install_providers_from_sources
-@click.option(
-    '--airflow-is-in-context',
-    help="If set Airflow is installed from docker-context-files only rather than from PyPI or sources.",
-    is_flag=True,
-)
 @click.option(
     '--install-packages-from-context',
-    help='Install wheels from local docker-context-files when building image.',
+    help='Install wheels from local docker-context-files when building image. '
+    'Implies --disable-airflow-repo-cache.',
     is_flag=True,
 )
 @click.option(
diff --git a/dev/breeze/src/airflow_breeze/params/build_prod_params.py b/dev/breeze/src/airflow_breeze/params/build_prod_params.py
index c37569f85f..65e92400c4 100644
--- a/dev/breeze/src/airflow_breeze/params/build_prod_params.py
+++ b/dev/breeze/src/airflow_breeze/params/build_prod_params.py
@@ -43,7 +43,6 @@ class BuildProdParams(CommonBuildParams):
     airflow_constraints_mode: str = "constraints"
     default_constraints_branch: str = DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH
     airflow_constraints_reference: str = ""
-    airflow_is_in_context: bool = False
     cleanup_context: bool = False
     disable_airflow_repo_cache: bool = False
     disable_mssql_client_installation: bool = False
@@ -186,31 +185,19 @@ class BuildProdParams(CommonBuildParams):
 
     @property
     def airflow_pre_cached_pip_packages(self) -> str:
-        airflow_pre_cached_pip = 'true'
-        if not self.airflow_is_in_context or self.disable_airflow_repo_cache:
-            airflow_pre_cached_pip = 'false'
-        return airflow_pre_cached_pip
+        return 'false' if self.disable_airflow_repo_cache else 'true'
 
     @property
     def install_mssql_client(self) -> str:
-        install_mssql = 'true'
-        if self.disable_mssql_client_installation:
-            install_mssql = 'false'
-        return install_mssql
+        return 'false' if self.disable_mssql_client_installation else 'true'
 
     @property
     def install_mysql_client(self) -> str:
-        install_mysql = 'true'
-        if self.disable_mysql_client_installation:
-            install_mysql = 'false'
-        return install_mysql
+        return 'false' if self.disable_mysql_client_installation else 'true'
 
     @property
     def install_postgres_client(self) -> str:
-        install_postgres = 'true'
-        if self.disable_postgres_client_installation:
-            install_postgres = 'false'
-        return install_postgres
+        return 'false' if self.disable_postgres_client_installation else 'true'
 
     @property
     def docker_context_files(self) -> str:
@@ -233,7 +220,6 @@ class BuildProdParams(CommonBuildParams):
             "airflow_image_date_created",
             "airflow_image_readme_url",
             "airflow_image_repository",
-            "airflow_is_in_context",
             "airflow_pre_cached_pip_packages",
             "airflow_version",
             "build_id",
diff --git a/dev/refresh_images.sh b/dev/refresh_images.sh
index 596997d831..7675db65b2 100755
--- a/dev/refresh_images.sh
+++ b/dev/refresh_images.sh
@@ -47,9 +47,7 @@ mv -v ./dist/*.whl ./docker-context-files
 breeze build-prod-image \
      --builder airflow_cache \
      --run-in-parallel \
-     --airflow-is-in-context \
      --install-packages-from-context \
      --prepare-buildx-cache \
-     --disable-airflow-repo-cache \
      --platform linux/amd64,linux/arm64 \
      --verbose
diff --git a/docs/docker-stack/build-arg-ref.rst b/docs/docker-stack/build-arg-ref.rst
index f8e30c02ce..d38dc585fe 100644
--- a/docs/docker-stack/build-arg-ref.rst
+++ b/docs/docker-stack/build-arg-ref.rst
@@ -252,11 +252,6 @@ You can see some examples of those in:
 |                                    |                                          | .whl and .tar.gz files placed in the     |
 |                                    |                                          | ``docker-context-files``.                |
 +------------------------------------+------------------------------------------+------------------------------------------+
-| ``AIRFLOW_IS_IN_CONTEXT``          | ``false``                                | If set to true, it means that Airflow    |
-|                                    |                                          | and providers are available in context   |
-|                                    |                                          | and the image will not attempt to        |
-|                                    |                                          | install Airflow from PyPI or sources.    |
-+------------------------------------+------------------------------------------+------------------------------------------+
 
 Pre-caching PIP dependencies
 ............................
diff --git a/docs/docker-stack/changelog.rst b/docs/docker-stack/changelog.rst
index 9f53bf9987..fc4dcd6847 100644
--- a/docs/docker-stack/changelog.rst
+++ b/docs/docker-stack/changelog.rst
@@ -73,8 +73,7 @@ Airflow 2.3
   * Add Multi-Platform support (AMD64/ARM64) in order to accommodate MacOS M1 users
   * Build parameters which control if packages and Airflow should be installed from context file were
     unified
-  * The ``INSTALL_FROM_PYPI`` arg was replaced to ``AIRFLOW_IS_IN_CONTEXT`` (with reverse meaning and
-    default changed to false)
+  * The ``INSTALL_FROM_PYPI`` arg was removed - it is automatically detected now.
   * The ``INSTALL_FROM_DOCKER_CONTEXT_FILES`` arg changed to ``INSTALL_PACKAGES_FROM_CONTEXT``
 
 Airflow 2.2
diff --git a/images/breeze/output-build-prod-image.svg b/images/breeze/output-build-prod-image.svg
index 3d6122bc3f..dbb2b1d56e 100644
--- a/images/breeze/output-build-prod-image.svg
+++ b/images/breeze/output-build-prod-image.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 2026.3999999999999" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 2002.0" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -19,365 +19,361 @@
         font-weight: 700;
     }
 
-    .terminal-1181880005-matrix {
+    .terminal-4196591838-matrix {
         font-family: Fira Code, monospace;
         font-size: 20px;
         line-height: 24.4px;
         font-variant-east-asian: full-width;
     }
 
-    .terminal-1181880005-title {
+    .terminal-4196591838-title {
         font-size: 18px;
         font-weight: bold;
         font-family: arial;
     }
 
-    .terminal-1181880005-r1 { fill: #c5c8c6;font-weight: bold }
-.terminal-1181880005-r2 { fill: #c5c8c6 }
-.terminal-1181880005-r3 { fill: #d0b344;font-weight: bold }
-.terminal-1181880005-r4 { fill: #868887 }
-.terminal-1181880005-r5 { fill: #68a0b3;font-weight: bold }
-.terminal-1181880005-r6 { fill: #98a84b;font-weight: bold }
-.terminal-1181880005-r7 { fill: #8d7b39 }
+    .terminal-4196591838-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-4196591838-r2 { fill: #c5c8c6 }
+.terminal-4196591838-r3 { fill: #d0b344;font-weight: bold }
+.terminal-4196591838-r4 { fill: #868887 }
+.terminal-4196591838-r5 { fill: #68a0b3;font-weight: bold }
+.terminal-4196591838-r6 { fill: #98a84b;font-weight: bold }
+.terminal-4196591838-r7 { fill: #8d7b39 }
     </style>
 
     <defs>
-    <clipPath id="terminal-1181880005-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="1975.3999999999999" />
+    <clipPath id="terminal-4196591838-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="1951.0" />
     </clipPath>
-    <clipPath id="terminal-1181880005-line-0">
+    <clipPath id="terminal-4196591838-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-1">
+<clipPath id="terminal-4196591838-line-1">
     <rect x="0" y="25.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-2">
+<clipPath id="terminal-4196591838-line-2">
     <rect x="0" y="50.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-3">
+<clipPath id="terminal-4196591838-line-3">
     <rect x="0" y="74.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-4">
+<clipPath id="terminal-4196591838-line-4">
     <rect x="0" y="99.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-5">
+<clipPath id="terminal-4196591838-line-5">
     <rect x="0" y="123.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-6">
+<clipPath id="terminal-4196591838-line-6">
     <rect x="0" y="147.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-7">
+<clipPath id="terminal-4196591838-line-7">
     <rect x="0" y="172.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-8">
+<clipPath id="terminal-4196591838-line-8">
     <rect x="0" y="196.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-9">
+<clipPath id="terminal-4196591838-line-9">
     <rect x="0" y="221.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-10">
+<clipPath id="terminal-4196591838-line-10">
     <rect x="0" y="245.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-11">
+<clipPath id="terminal-4196591838-line-11">
     <rect x="0" y="269.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-12">
+<clipPath id="terminal-4196591838-line-12">
     <rect x="0" y="294.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-13">
+<clipPath id="terminal-4196591838-line-13">
     <rect x="0" y="318.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-14">
+<clipPath id="terminal-4196591838-line-14">
     <rect x="0" y="343.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-15">
+<clipPath id="terminal-4196591838-line-15">
     <rect x="0" y="367.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-16">
+<clipPath id="terminal-4196591838-line-16">
     <rect x="0" y="391.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-17">
+<clipPath id="terminal-4196591838-line-17">
     <rect x="0" y="416.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-18">
+<clipPath id="terminal-4196591838-line-18">
     <rect x="0" y="440.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-19">
+<clipPath id="terminal-4196591838-line-19">
     <rect x="0" y="465.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-20">
+<clipPath id="terminal-4196591838-line-20">
     <rect x="0" y="489.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-21">
+<clipPath id="terminal-4196591838-line-21">
     <rect x="0" y="513.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-22">
+<clipPath id="terminal-4196591838-line-22">
     <rect x="0" y="538.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-23">
+<clipPath id="terminal-4196591838-line-23">
     <rect x="0" y="562.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-24">
+<clipPath id="terminal-4196591838-line-24">
     <rect x="0" y="587.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-25">
+<clipPath id="terminal-4196591838-line-25">
     <rect x="0" y="611.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-26">
+<clipPath id="terminal-4196591838-line-26">
     <rect x="0" y="635.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-27">
+<clipPath id="terminal-4196591838-line-27">
     <rect x="0" y="660.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-28">
+<clipPath id="terminal-4196591838-line-28">
     <rect x="0" y="684.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-29">
+<clipPath id="terminal-4196591838-line-29">
     <rect x="0" y="709.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-30">
+<clipPath id="terminal-4196591838-line-30">
     <rect x="0" y="733.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-31">
+<clipPath id="terminal-4196591838-line-31">
     <rect x="0" y="757.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-32">
+<clipPath id="terminal-4196591838-line-32">
     <rect x="0" y="782.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-33">
+<clipPath id="terminal-4196591838-line-33">
     <rect x="0" y="806.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-34">
+<clipPath id="terminal-4196591838-line-34">
     <rect x="0" y="831.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-35">
+<clipPath id="terminal-4196591838-line-35">
     <rect x="0" y="855.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-36">
+<clipPath id="terminal-4196591838-line-36">
     <rect x="0" y="879.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-37">
+<clipPath id="terminal-4196591838-line-37">
     <rect x="0" y="904.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-38">
+<clipPath id="terminal-4196591838-line-38">
     <rect x="0" y="928.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-39">
+<clipPath id="terminal-4196591838-line-39">
     <rect x="0" y="953.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-40">
+<clipPath id="terminal-4196591838-line-40">
     <rect x="0" y="977.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-41">
+<clipPath id="terminal-4196591838-line-41">
     <rect x="0" y="1001.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-42">
+<clipPath id="terminal-4196591838-line-42">
     <rect x="0" y="1026.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-43">
+<clipPath id="terminal-4196591838-line-43">
     <rect x="0" y="1050.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-44">
+<clipPath id="terminal-4196591838-line-44">
     <rect x="0" y="1075.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-45">
+<clipPath id="terminal-4196591838-line-45">
     <rect x="0" y="1099.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-46">
+<clipPath id="terminal-4196591838-line-46">
     <rect x="0" y="1123.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-47">
+<clipPath id="terminal-4196591838-line-47">
     <rect x="0" y="1148.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-48">
+<clipPath id="terminal-4196591838-line-48">
     <rect x="0" y="1172.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-49">
+<clipPath id="terminal-4196591838-line-49">
     <rect x="0" y="1197.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-50">
+<clipPath id="terminal-4196591838-line-50">
     <rect x="0" y="1221.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-51">
+<clipPath id="terminal-4196591838-line-51">
     <rect x="0" y="1245.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-52">
+<clipPath id="terminal-4196591838-line-52">
     <rect x="0" y="1270.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-53">
+<clipPath id="terminal-4196591838-line-53">
     <rect x="0" y="1294.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-54">
+<clipPath id="terminal-4196591838-line-54">
     <rect x="0" y="1319.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-55">
+<clipPath id="terminal-4196591838-line-55">
     <rect x="0" y="1343.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-56">
+<clipPath id="terminal-4196591838-line-56">
     <rect x="0" y="1367.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-57">
+<clipPath id="terminal-4196591838-line-57">
     <rect x="0" y="1392.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-58">
+<clipPath id="terminal-4196591838-line-58">
     <rect x="0" y="1416.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-59">
+<clipPath id="terminal-4196591838-line-59">
     <rect x="0" y="1441.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-60">
+<clipPath id="terminal-4196591838-line-60">
     <rect x="0" y="1465.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-61">
+<clipPath id="terminal-4196591838-line-61">
     <rect x="0" y="1489.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-62">
+<clipPath id="terminal-4196591838-line-62">
     <rect x="0" y="1514.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-63">
+<clipPath id="terminal-4196591838-line-63">
     <rect x="0" y="1538.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-64">
+<clipPath id="terminal-4196591838-line-64">
     <rect x="0" y="1563.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-65">
+<clipPath id="terminal-4196591838-line-65">
     <rect x="0" y="1587.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-66">
+<clipPath id="terminal-4196591838-line-66">
     <rect x="0" y="1611.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-67">
+<clipPath id="terminal-4196591838-line-67">
     <rect x="0" y="1636.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-68">
+<clipPath id="terminal-4196591838-line-68">
     <rect x="0" y="1660.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-69">
+<clipPath id="terminal-4196591838-line-69">
     <rect x="0" y="1685.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-70">
+<clipPath id="terminal-4196591838-line-70">
     <rect x="0" y="1709.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-71">
+<clipPath id="terminal-4196591838-line-71">
     <rect x="0" y="1733.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-72">
+<clipPath id="terminal-4196591838-line-72">
     <rect x="0" y="1758.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-73">
+<clipPath id="terminal-4196591838-line-73">
     <rect x="0" y="1782.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-74">
+<clipPath id="terminal-4196591838-line-74">
     <rect x="0" y="1807.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-75">
+<clipPath id="terminal-4196591838-line-75">
     <rect x="0" y="1831.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-76">
+<clipPath id="terminal-4196591838-line-76">
     <rect x="0" y="1855.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-77">
+<clipPath id="terminal-4196591838-line-77">
     <rect x="0" y="1880.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-78">
+<clipPath id="terminal-4196591838-line-78">
     <rect x="0" y="1904.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1181880005-line-79">
-    <rect x="0" y="1929.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="2024.4" rx="8"/><text class="terminal-1181880005-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;build-prod-image</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="2000" rx="8"/><text class="terminal-4196591838-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;build-prod-image</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
             <circle cx="44" cy="0" r="7" fill="#28c840"/>
             </g>
         
-    <g transform="translate(9, 41)" clip-path="url(#terminal-1181880005-clip-terminal)">
+    <g transform="translate(9, 41)" clip-path="url(#terminal-4196591838-clip-terminal)">
     
-    <g class="terminal-1181880005-matrix">
-    <text class="terminal-1181880005-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-1181880005-line-0)">
-</text><text class="terminal-1181880005-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-1181880005-line-1)">Usage:&#160;</text><text class="terminal-1181880005-r1" x="97.6" y="44.4" textLength="402.6" clip-path="url(#terminal-1181880005-line-1)">breeze&#160;build-prod-image&#160;[OPTIONS]</text><text class="terminal-1181880005-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-1)">
-</text><text class="terminal-1181880005-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-2)">
-</text><text class="terminal-1181880005-r2" x="12.2" y="93.2" textLength="1293.2" clip-path="url(#terminal-1181880005-line-3)">Build&#160;Production&#160;image.&#160;Include&#160;building&#160;multiple&#160;images&#160;for&#160;all&#160;or&#160;selected&#160;Python&#160;versions&#160;sequentially.</text><text class="terminal-1181880005-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-3)">
-</text><text class="terminal-1181880005-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-4)">
-</text><text class="terminal-1181880005-r4" x="0" y="142" textLength="24.4" clip-path="url(#terminal-1181880005-line-5)">╭─</text><text class="terminal-1181880005-r4" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-1181880005-line-5)">&#160;Basic&#160;usage&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-1181880005-r4" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-118188 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-6)">│</text><text class="terminal-1181880005-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-6)">-</text><text class="terminal-1181880005-r5" x="36.6" y="166.4" textLength="85.4" clip-path="url(#terminal-1181880005-line-6)">-python</text><text class="terminal-1181880005-r6" x="427" y="166.4" textLength="24.4" clip-path="url(#terminal-118 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-7)">│</text><text class="terminal-1181880005-r7" x="475.8" y="190.8" textLength="732" clip-path="url(#terminal-1181880005-line-7)">(&gt;3.7&lt;&#160;|&#160;3.8&#160;|&#160;3.9&#160;|&#160;3.10)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
-</text><text class="terminal-1181880005-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-8)">│</text><text class="terminal-1181880005-r4" x="475.8" y="215.2" textLength="732" clip-path="url(#terminal-1181880005-line-8)">[default:&#160;3.7]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="terminal-1181880005-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-9)">│</text><text class="terminal-1181880005-r5" x="24.4" y="239.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-9)">-</text><text class="terminal-1181880005-r5" x="36.6" y="239.6" textLength="97.6" clip-path="url(#terminal-1181880005-line-9)">-install</text><text class="terminal-1181880005-r5" x="134.2" y="239.6" textLength="195.2" clip-path="url(#terminal [...]
-</text><text class="terminal-1181880005-r4" x="0" y="264" textLength="12.2" clip-path="url(#terminal-1181880005-line-10)">│</text><text class="terminal-1181880005-r5" x="24.4" y="264" textLength="12.2" clip-path="url(#terminal-1181880005-line-10)">-</text><text class="terminal-1181880005-r5" x="36.6" y="264" textLength="97.6" clip-path="url(#terminal-1181880005-line-10)">-upgrade</text><text class="terminal-1181880005-r5" x="134.2" y="264" textLength="268.4" clip-path="url(#terminal-1181 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-11)">│</text><text class="terminal-1181880005-r5" x="24.4" y="288.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-11)">-</text><text class="terminal-1181880005-r5" x="36.6" y="288.4" textLength="85.4" clip-path="url(#terminal-1181880005-line-11)">-debian</text><text class="terminal-1181880005-r5" x="122" y="288.4" textLength="97.6" clip-path="url(#terminal- [...]
-</text><text class="terminal-1181880005-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-12)">│</text><text class="terminal-1181880005-r5" x="24.4" y="312.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-12)">-</text><text class="terminal-1181880005-r5" x="36.6" y="312.8" textLength="73.2" clip-path="url(#terminal-1181880005-line-12)">-image</text><text class="terminal-1181880005-r5" x="109.8" y="312.8" textLength="48.8" clip-path="url(#terminal [...]
-</text><text class="terminal-1181880005-r4" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-13)">│</text><text class="terminal-1181880005-r5" x="24.4" y="337.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-13)">-</text><text class="terminal-1181880005-r5" x="36.6" y="337.2" textLength="48.8" clip-path="url(#terminal-1181880005-line-13)">-tag</text><text class="terminal-1181880005-r5" x="85.4" y="337.2" textLength="122" clip-path="url(#terminal-118 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-14)">│</text><text class="terminal-1181880005-r2" x="475.8" y="361.6" textLength="414.8" clip-path="url(#terminal-1181880005-line-14)">when&#160;you&#160;build&#160;or&#160;pull&#160;image&#160;with&#160;</text><text class="terminal-1181880005-r5" x="890.6" y="361.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-14)">-</text><text class="terminal-1181880005- [...]
-</text><text class="terminal-1181880005-r4" x="0" y="386" textLength="12.2" clip-path="url(#terminal-1181880005-line-15)">│</text><text class="terminal-1181880005-r5" x="24.4" y="386" textLength="12.2" clip-path="url(#terminal-1181880005-line-15)">-</text><text class="terminal-1181880005-r5" x="36.6" y="386" textLength="85.4" clip-path="url(#terminal-1181880005-line-15)">-docker</text><text class="terminal-1181880005-r5" x="122" y="386" textLength="73.2" clip-path="url(#terminal-11818800 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-16)">│</text><text class="terminal-1181880005-r4" x="475.8" y="410.4" textLength="549" clip-path="url(#terminal-1181880005-line-16)">[default:&#160;registry]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1181880005-r4" x="1451.8" y="41 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="434.8" textLength="1464" clip-path="url(#terminal-1181880005-line-17)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1181880005-r2" x="1464" y="434.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-17)">
-</text><text class="terminal-1181880005-r4" x="0" y="459.2" textLength="24.4" clip-path="url(#terminal-1181880005-line-18)">╭─</text><text class="terminal-1181880005-r4" x="24.4" y="459.2" textLength="1415.2" clip-path="url(#terminal-1181880005-line-18)">&#160;Building&#160;images&#160;in&#160;parallel&#160;───────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-1181880005-r4" x="1439.6" y="459.2" textLength="24.4" clip-path="ur [...]
-</text><text class="terminal-1181880005-r4" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-19)">│</text><text class="terminal-1181880005-r5" x="24.4" y="483.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-19)">-</text><text class="terminal-1181880005-r5" x="36.6" y="483.6" textLength="48.8" clip-path="url(#terminal-1181880005-line-19)">-run</text><text class="terminal-1181880005-r5" x="85.4" y="483.6" textLength="146.4" clip-path="url(#terminal-1 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="508" textLength="12.2" clip-path="url(#terminal-1181880005-line-20)">│</text><text class="terminal-1181880005-r5" x="24.4" y="508" textLength="12.2" clip-path="url(#terminal-1181880005-line-20)">-</text><text class="terminal-1181880005-r5" x="36.6" y="508" textLength="146.4" clip-path="url(#terminal-1181880005-line-20)">-parallelism</text><text class="terminal-1181880005-r2" x="280.6" y="508" textLength="915" clip-path="url(#terminal-1 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-21)">│</text><text class="terminal-1181880005-r4" x="280.6" y="532.4" textLength="915" clip-path="url(#terminal-1181880005-line-21)">[default:&#160;4;&#160;1&lt;=x&lt;=8]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-22)">│</text><text class="terminal-1181880005-r5" x="24.4" y="556.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-22)">-</text><text class="terminal-1181880005-r5" x="36.6" y="556.8" textLength="85.4" clip-path="url(#terminal-1181880005-line-22)">-python</text><text class="terminal-1181880005-r5" x="122" y="556.8" textLength="109.8" clip-path="url(#terminal [...]
-</text><text class="terminal-1181880005-r4" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-23)">│</text><text class="terminal-1181880005-r4" x="280.6" y="581.2" textLength="951.6" clip-path="url(#terminal-1181880005-line-23)">[default:&#160;3.7&#160;3.8&#160;3.9&#160;3.10]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="605.6" textLength="1464" clip-path="url(#terminal-1181880005-line-24)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1181880005-r2" x="1464" y="605.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-24)">
-</text><text class="terminal-1181880005-r4" x="0" y="630" textLength="24.4" clip-path="url(#terminal-1181880005-line-25)">╭─</text><text class="terminal-1181880005-r4" x="24.4" y="630" textLength="1415.2" clip-path="url(#terminal-1181880005-line-25)">&#160;Options&#160;for&#160;customizing&#160;images&#160;────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-1181880005-r4" x="1439.6" y="630" textLength="24.4" clip-path="url(#ter [...]
-</text><text class="terminal-1181880005-r4" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-26)">│</text><text class="terminal-1181880005-r5" x="24.4" y="654.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-26)">-</text><text class="terminal-1181880005-r5" x="36.6" y="654.4" textLength="97.6" clip-path="url(#terminal-1181880005-line-26)">-install</text><text class="terminal-1181880005-r5" x="134.2" y="654.4" textLength="280.6" clip-path="url(#termi [...]
-</text><text class="terminal-1181880005-r4" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-27)">│</text><text class="terminal-1181880005-r5" x="24.4" y="678.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-27)">-</text><text class="terminal-1181880005-r5" x="36.6" y="678.8" textLength="97.6" clip-path="url(#terminal-1181880005-line-27)">-airflow</text><text class="terminal-1181880005-r5" x="134.2" y="678.8" textLength="85.4" clip-path="url(#termin [...]
-</text><text class="terminal-1181880005-r4" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-28)">│</text><text class="terminal-1181880005-r7" x="463.6" y="703.2" textLength="976" clip-path="url(#terminal-1181880005-line-28)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
-</text><text class="terminal-1181880005-r4" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-29)">│</text><text class="terminal-1181880005-r4" x="463.6" y="727.6" textLength="976" clip-path="url(#terminal-1181880005-line-29)">[default:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="752" textLength="12.2" clip-path="url(#terminal-1181880005-line-30)">│</text><text class="terminal-1181880005-r4" x="463.6" y="752" textLength="976" clip-path="url(#terminal-1181880005-line-30)">amazon,async,celery,cncf.kubernetes,dask,docker,elasticsearch,ftp,google,google…</text><text class="terminal-1181880005-r4" x="1451.8" y="752" textLength="12.2" clip-path="url(#terminal-1181880005-line-30)">│</text><text class="terminal-1181880 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="776.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-31)">│</text><text class="terminal-1181880005-r5" x="24.4" y="776.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-31)">-</text><text class="terminal-1181880005-r5" x="36.6" y="776.4" textLength="97.6" clip-path="url(#terminal-1181880005-line-31)">-airflow</text><text class="terminal-1181880005-r5" x="134.2" y="776.4" textLength="207.4" clip-path="url(#termi [...]
-</text><text class="terminal-1181880005-r4" x="0" y="800.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-32)">│</text><text class="terminal-1181880005-r7" x="463.6" y="800.8" textLength="866.2" clip-path="url(#terminal-1181880005-line-32)">(constraints&#160;|&#160;constraints-no-providers&#160;|&#160;constraints-source-providers)</text><text class="terminal-1181880005-r4" x="1451.8" y="800.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-32)">│</text><text clas [...]
-</text><text class="terminal-1181880005-r4" x="0" y="825.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-33)">│</text><text class="terminal-1181880005-r4" x="463.6" y="825.2" textLength="866.2" clip-path="url(#terminal-1181880005-line-33)">[default:&#160;constraints]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="terminal-1181880005-r4" x="0" y="849.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-34)">│</text><text class="terminal-1181880005-r5" x="24.4" y="849.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-34)">-</text><text class="terminal-1181880005-r5" x="36.6" y="849.6" textLength="97.6" clip-path="url(#terminal-1181880005-line-34)">-airflow</text><text class="terminal-1181880005-r5" x="134.2" y="849.6" textLength="268.4" clip-path="url(#termi [...]
-</text><text class="terminal-1181880005-r4" x="0" y="874" textLength="12.2" clip-path="url(#terminal-1181880005-line-35)">│</text><text class="terminal-1181880005-r5" x="24.4" y="874" textLength="12.2" clip-path="url(#terminal-1181880005-line-35)">-</text><text class="terminal-1181880005-r5" x="36.6" y="874" textLength="85.4" clip-path="url(#terminal-1181880005-line-35)">-python</text><text class="terminal-1181880005-r5" x="122" y="874" textLength="73.2" clip-path="url(#terminal-11818800 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="898.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-36)">│</text><text class="terminal-1181880005-r2" x="463.6" y="898.4" textLength="976" clip-path="url(#terminal-1181880005-line-36)">something&#160;like:&#160;python:VERSION-slim-bullseye&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
-</text><text class="terminal-1181880005-r4" x="0" y="922.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-37)">│</text><text class="terminal-1181880005-r7" x="463.6" y="922.8" textLength="976" clip-path="url(#terminal-1181880005-line-37)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
-</text><text class="terminal-1181880005-r4" x="0" y="947.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-38)">│</text><text class="terminal-1181880005-r5" x="24.4" y="947.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-38)">-</text><text class="terminal-1181880005-r5" x="36.6" y="947.2" textLength="134.2" clip-path="url(#terminal-1181880005-line-38)">-additional</text><text class="terminal-1181880005-r5" x="170.8" y="947.2" textLength="146.4" clip-path="url(#t [...]
-</text><text class="terminal-1181880005-r4" x="0" y="971.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-39)">│</text><text class="terminal-1181880005-r5" x="24.4" y="971.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-39)">-</text><text class="terminal-1181880005-r5" x="36.6" y="971.6" textLength="134.2" clip-path="url(#terminal-1181880005-line-39)">-additional</text><text class="terminal-1181880005-r5" x="170.8" y="971.6" textLength="85.4" clip-path="url(#te [...]
-</text><text class="terminal-1181880005-r4" x="0" y="996" textLength="12.2" clip-path="url(#terminal-1181880005-line-40)">│</text><text class="terminal-1181880005-r5" x="24.4" y="996" textLength="12.2" clip-path="url(#terminal-1181880005-line-40)">-</text><text class="terminal-1181880005-r5" x="36.6" y="996" textLength="134.2" clip-path="url(#terminal-1181880005-line-40)">-additional</text><text class="terminal-1181880005-r5" x="170.8" y="996" textLength="207.4" clip-path="url(#terminal- [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1020.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-41)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1020.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-41)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1020.4" textLength="134.2" clip-path="url(#terminal-1181880005-line-41)">-additional</text><text class="terminal-1181880005-r5" x="170.8" y="1020.4" textLength="195.2" clip-path="ur [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1044.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-42)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1044.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-42)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1044.8" textLength="134.2" clip-path="url(#terminal-1181880005-line-42)">-additional</text><text class="terminal-1181880005-r5" x="170.8" y="1044.8" textLength="244" clip-path="url( [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1069.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-43)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1069.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-43)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1069.2" textLength="134.2" clip-path="url(#terminal-1181880005-line-43)">-additional</text><text class="terminal-1181880005-r5" x="170.8" y="1069.2" textLength="158.6" clip-path="ur [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1093.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-44)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1093.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-44)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1093.6" textLength="134.2" clip-path="url(#terminal-1181880005-line-44)">-additional</text><text class="terminal-1181880005-r5" x="170.8" y="1093.6" textLength="146.4" clip-path="ur [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1118" textLength="12.2" clip-path="url(#terminal-1181880005-line-45)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1118" textLength="12.2" clip-path="url(#terminal-1181880005-line-45)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1118" textLength="134.2" clip-path="url(#terminal-1181880005-line-45)">-additional</text><text class="terminal-1181880005-r5" x="170.8" y="1118" textLength="195.2" clip-path="url(#termi [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1142.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-46)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1142.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-46)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1142.4" textLength="97.6" clip-path="url(#terminal-1181880005-line-46)">-runtime</text><text class="terminal-1181880005-r5" x="134.2" y="1142.4" textLength="109.8" clip-path="url(#t [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1166.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-47)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1166.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-47)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1166.8" textLength="97.6" clip-path="url(#terminal-1181880005-line-47)">-runtime</text><text class="terminal-1181880005-r5" x="134.2" y="1166.8" textLength="146.4" clip-path="url(#t [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1191.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-48)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1191.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-48)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1191.2" textLength="48.8" clip-path="url(#terminal-1181880005-line-48)">-dev</text><text class="terminal-1181880005-r5" x="85.4" y="1191.2" textLength="109.8" clip-path="url(#termin [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1215.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-49)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1215.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-49)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1215.6" textLength="48.8" clip-path="url(#terminal-1181880005-line-49)">-dev</text><text class="terminal-1181880005-r5" x="85.4" y="1215.6" textLength="146.4" clip-path="url(#termin [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1240" textLength="1464" clip-path="url(#terminal-1181880005-line-50)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1181880005-r2" x="1464" y="1240" textLength="12.2" clip-path="url(#terminal-1181880005-line-50)">
-</text><text class="terminal-1181880005-r4" x="0" y="1264.4" textLength="24.4" clip-path="url(#terminal-1181880005-line-51)">╭─</text><text class="terminal-1181880005-r4" x="24.4" y="1264.4" textLength="1415.2" clip-path="url(#terminal-1181880005-line-51)">&#160;Customization&#160;options&#160;(for&#160;specific&#160;customization&#160;needs)&#160;──────────────────────────────────────────────────────────</text><text class="terminal-1181880005-r4" x="1439.6" y="1264.4" textLength="24.4"  [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1288.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-52)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1288.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-52)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1288.8" textLength="97.6" clip-path="url(#terminal-1181880005-line-52)">-install</text><text class="terminal-1181880005-r5" x="134.2" y="1288.8" textLength="268.4" clip-path="url(#t [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1313.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-53)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1313.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-53)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1313.2" textLength="97.6" clip-path="url(#terminal-1181880005-line-53)">-airflow</text><text class="terminal-1181880005-r5" x="134.2" y="1313.2" textLength="170.8" clip-path="url(#t [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1337.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-54)">│</text><text class="terminal-1181880005-r2" x="536.8" y="1337.6" textLength="902.8" clip-path="url(#terminal-1181880005-line-54)">from&#160;PyPI&#160;or&#160;sources.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1362" textLength="12.2" clip-path="url(#terminal-1181880005-line-55)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1362" textLength="12.2" clip-path="url(#terminal-1181880005-line-55)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1362" textLength="97.6" clip-path="url(#terminal-1181880005-line-55)">-cleanup</text><text class="terminal-1181880005-r5" x="134.2" y="1362" textLength="97.6" clip-path="url(#terminal-1 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1386.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-56)">│</text><text class="terminal-1181880005-r2" x="536.8" y="1386.4" textLength="170.8" clip-path="url(#terminal-1181880005-line-56)">together&#160;with&#160;</text><text class="terminal-1181880005-r5" x="707.6" y="1386.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-56)">-</text><text class="terminal-1181880005-r5" x="719.8" y="1386.4" textLength="97.6" [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1410.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-57)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1410.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-57)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1410.8" textLength="97.6" clip-path="url(#terminal-1181880005-line-57)">-disable</text><text class="terminal-1181880005-r5" x="134.2" y="1410.8" textLength="317.2" clip-path="url(#t [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1435.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-58)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1435.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-58)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1435.2" textLength="97.6" clip-path="url(#terminal-1181880005-line-58)">-disable</text><text class="terminal-1181880005-r5" x="134.2" y="1435.2" textLength="317.2" clip-path="url(#t [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1459.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-59)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1459.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-59)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1459.6" textLength="97.6" clip-path="url(#terminal-1181880005-line-59)">-disable</text><text class="terminal-1181880005-r5" x="134.2" y="1459.6" textLength="353.8" clip-path="url(#t [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1484" textLength="12.2" clip-path="url(#terminal-1181880005-line-60)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1484" textLength="12.2" clip-path="url(#terminal-1181880005-line-60)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1484" textLength="97.6" clip-path="url(#terminal-1181880005-line-60)">-disable</text><text class="terminal-1181880005-r5" x="134.2" y="1484" textLength="231.8" clip-path="url(#terminal- [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1508.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-61)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1508.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-61)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1508.4" textLength="97.6" clip-path="url(#terminal-1181880005-line-61)">-install</text><text class="terminal-1181880005-r5" x="134.2" y="1508.4" textLength="219.6" clip-path="url(#t [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1532.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-62)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1532.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-62)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1532.8" textLength="158.6" clip-path="url(#terminal-1181880005-line-62)">-installation</text><text class="terminal-1181880005-r5" x="195.2" y="1532.8" textLength="85.4" clip-path="u [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1557.2" textLength="1464" clip-path="url(#terminal-1181880005-line-63)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1181880005-r2" x="1464" y="1557.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-63)">
-</text><text class="terminal-1181880005-r4" x="0" y="1581.6" textLength="24.4" clip-path="url(#terminal-1181880005-line-64)">╭─</text><text class="terminal-1181880005-r4" x="24.4" y="1581.6" textLength="1415.2" clip-path="url(#terminal-1181880005-line-64)">&#160;Preparing&#160;cache&#160;and&#160;push&#160;(for&#160;maintainers&#160;and&#160;CI)&#160;─────────────────────────────────────────────────────────────────</text><text class="terminal-1181880005-r4" x="1439.6" y="1581.6" textLeng [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1606" textLength="12.2" clip-path="url(#terminal-1181880005-line-65)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1606" textLength="12.2" clip-path="url(#terminal-1181880005-line-65)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1606" textLength="85.4" clip-path="url(#terminal-1181880005-line-65)">-github</text><text class="terminal-1181880005-r5" x="122" y="1606" textLength="73.2" clip-path="url(#terminal-1181 [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1630.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-66)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1630.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-66)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1630.4" textLength="85.4" clip-path="url(#terminal-1181880005-line-66)">-github</text><text class="terminal-1181880005-r5" x="122" y="1630.4" textLength="109.8" clip-path="url(#term [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1654.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-67)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1654.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-67)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1654.8" textLength="109.8" clip-path="url(#terminal-1181880005-line-67)">-platform</text><text class="terminal-1181880005-r2" x="341.6" y="1654.8" textLength="329.4" clip-path="url( [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1679.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-68)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1679.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-68)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1679.2" textLength="61" clip-path="url(#terminal-1181880005-line-68)">-push</text><text class="terminal-1181880005-r5" x="97.6" y="1679.2" textLength="73.2" clip-path="url(#terminal [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1703.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-69)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1703.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-69)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1703.6" textLength="73.2" clip-path="url(#terminal-1181880005-line-69)">-empty</text><text class="terminal-1181880005-r5" x="109.8" y="1703.6" textLength="73.2" clip-path="url(#term [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1728" textLength="12.2" clip-path="url(#terminal-1181880005-line-70)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1728" textLength="12.2" clip-path="url(#terminal-1181880005-line-70)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1728" textLength="97.6" clip-path="url(#terminal-1181880005-line-70)">-prepare</text><text class="terminal-1181880005-r5" x="134.2" y="1728" textLength="158.6" clip-path="url(#terminal- [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1752.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-71)">│</text><text class="terminal-1181880005-r2" x="341.6" y="1752.4" textLength="1098" clip-path="url(#terminal-1181880005-line-71)">image).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1776.8" textLength="1464" clip-path="url(#terminal-1181880005-line-72)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1181880005-r2" x="1464" y="1776.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-72)">
-</text><text class="terminal-1181880005-r4" x="0" y="1801.2" textLength="24.4" clip-path="url(#terminal-1181880005-line-73)">╭─</text><text class="terminal-1181880005-r4" x="24.4" y="1801.2" textLength="1415.2" clip-path="url(#terminal-1181880005-line-73)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-1181880005-r4" x="1439.6" y="1801.2" textLength="24.4" clip-path="url(#terminal- [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1825.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-74)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1825.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-74)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1825.6" textLength="85.4" clip-path="url(#terminal-1181880005-line-74)">-github</text><text class="terminal-1181880005-r5" x="122" y="1825.6" textLength="134.2" clip-path="url(#term [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1850" textLength="12.2" clip-path="url(#terminal-1181880005-line-75)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1850" textLength="12.2" clip-path="url(#terminal-1181880005-line-75)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1850" textLength="97.6" clip-path="url(#terminal-1181880005-line-75)">-builder</text><text class="terminal-1181880005-r2" x="329.4" y="1850" textLength="744.2" clip-path="url(#terminal- [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1874.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-76)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1874.4" textLength="12.2" clip-path="url(#terminal-1181880005-line-76)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1874.4" textLength="85.4" clip-path="url(#terminal-1181880005-line-76)">-answer</text><text class="terminal-1181880005-r6" x="280.6" y="1874.4" textLength="24.4" clip-path="url(#ter [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1898.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-77)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1898.8" textLength="12.2" clip-path="url(#terminal-1181880005-line-77)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1898.8" textLength="48.8" clip-path="url(#terminal-1181880005-line-77)">-dry</text><text class="terminal-1181880005-r5" x="85.4" y="1898.8" textLength="48.8" clip-path="url(#termina [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1923.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-78)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1923.2" textLength="12.2" clip-path="url(#terminal-1181880005-line-78)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1923.2" textLength="97.6" clip-path="url(#terminal-1181880005-line-78)">-verbose</text><text class="terminal-1181880005-r6" x="280.6" y="1923.2" textLength="24.4" clip-path="url(#te [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1947.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-79)">│</text><text class="terminal-1181880005-r5" x="24.4" y="1947.6" textLength="12.2" clip-path="url(#terminal-1181880005-line-79)">-</text><text class="terminal-1181880005-r5" x="36.6" y="1947.6" textLength="61" clip-path="url(#terminal-1181880005-line-79)">-help</text><text class="terminal-1181880005-r6" x="280.6" y="1947.6" textLength="24.4" clip-path="url(#termina [...]
-</text><text class="terminal-1181880005-r4" x="0" y="1972" textLength="1464" clip-path="url(#terminal-1181880005-line-80)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1181880005-r2" x="1464" y="1972" textLength="12.2" clip-path="url(#terminal-1181880005-line-80)">
+    <g class="terminal-4196591838-matrix">
+    <text class="terminal-4196591838-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-4196591838-line-0)">
+</text><text class="terminal-4196591838-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-4196591838-line-1)">Usage:&#160;</text><text class="terminal-4196591838-r1" x="97.6" y="44.4" textLength="402.6" clip-path="url(#terminal-4196591838-line-1)">breeze&#160;build-prod-image&#160;[OPTIONS]</text><text class="terminal-4196591838-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-1)">
+</text><text class="terminal-4196591838-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-2)">
+</text><text class="terminal-4196591838-r2" x="12.2" y="93.2" textLength="1293.2" clip-path="url(#terminal-4196591838-line-3)">Build&#160;Production&#160;image.&#160;Include&#160;building&#160;multiple&#160;images&#160;for&#160;all&#160;or&#160;selected&#160;Python&#160;versions&#160;sequentially.</text><text class="terminal-4196591838-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-3)">
+</text><text class="terminal-4196591838-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-4)">
+</text><text class="terminal-4196591838-r4" x="0" y="142" textLength="24.4" clip-path="url(#terminal-4196591838-line-5)">╭─</text><text class="terminal-4196591838-r4" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-4196591838-line-5)">&#160;Basic&#160;usage&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-4196591838-r4" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-419659 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-6)">│</text><text class="terminal-4196591838-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-6)">-</text><text class="terminal-4196591838-r5" x="36.6" y="166.4" textLength="85.4" clip-path="url(#terminal-4196591838-line-6)">-python</text><text class="terminal-4196591838-r6" x="427" y="166.4" textLength="24.4" clip-path="url(#terminal-419 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-7)">│</text><text class="terminal-4196591838-r7" x="475.8" y="190.8" textLength="732" clip-path="url(#terminal-4196591838-line-7)">(&gt;3.7&lt;&#160;|&#160;3.8&#160;|&#160;3.9&#160;|&#160;3.10)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-4196591838-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-8)">│</text><text class="terminal-4196591838-r4" x="475.8" y="215.2" textLength="732" clip-path="url(#terminal-4196591838-line-8)">[default:&#160;3.7]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
+</text><text class="terminal-4196591838-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-9)">│</text><text class="terminal-4196591838-r5" x="24.4" y="239.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-9)">-</text><text class="terminal-4196591838-r5" x="36.6" y="239.6" textLength="97.6" clip-path="url(#terminal-4196591838-line-9)">-install</text><text class="terminal-4196591838-r5" x="134.2" y="239.6" textLength="195.2" clip-path="url(#terminal [...]
+</text><text class="terminal-4196591838-r4" x="0" y="264" textLength="12.2" clip-path="url(#terminal-4196591838-line-10)">│</text><text class="terminal-4196591838-r5" x="24.4" y="264" textLength="12.2" clip-path="url(#terminal-4196591838-line-10)">-</text><text class="terminal-4196591838-r5" x="36.6" y="264" textLength="97.6" clip-path="url(#terminal-4196591838-line-10)">-upgrade</text><text class="terminal-4196591838-r5" x="134.2" y="264" textLength="268.4" clip-path="url(#terminal-4196 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-11)">│</text><text class="terminal-4196591838-r5" x="24.4" y="288.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-11)">-</text><text class="terminal-4196591838-r5" x="36.6" y="288.4" textLength="85.4" clip-path="url(#terminal-4196591838-line-11)">-debian</text><text class="terminal-4196591838-r5" x="122" y="288.4" textLength="97.6" clip-path="url(#terminal- [...]
+</text><text class="terminal-4196591838-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-12)">│</text><text class="terminal-4196591838-r5" x="24.4" y="312.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-12)">-</text><text class="terminal-4196591838-r5" x="36.6" y="312.8" textLength="73.2" clip-path="url(#terminal-4196591838-line-12)">-image</text><text class="terminal-4196591838-r5" x="109.8" y="312.8" textLength="48.8" clip-path="url(#terminal [...]
+</text><text class="terminal-4196591838-r4" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-13)">│</text><text class="terminal-4196591838-r5" x="24.4" y="337.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-13)">-</text><text class="terminal-4196591838-r5" x="36.6" y="337.2" textLength="48.8" clip-path="url(#terminal-4196591838-line-13)">-tag</text><text class="terminal-4196591838-r5" x="85.4" y="337.2" textLength="122" clip-path="url(#terminal-419 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-14)">│</text><text class="terminal-4196591838-r2" x="475.8" y="361.6" textLength="414.8" clip-path="url(#terminal-4196591838-line-14)">when&#160;you&#160;build&#160;or&#160;pull&#160;image&#160;with&#160;</text><text class="terminal-4196591838-r5" x="890.6" y="361.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-14)">-</text><text class="terminal-4196591838- [...]
+</text><text class="terminal-4196591838-r4" x="0" y="386" textLength="12.2" clip-path="url(#terminal-4196591838-line-15)">│</text><text class="terminal-4196591838-r5" x="24.4" y="386" textLength="12.2" clip-path="url(#terminal-4196591838-line-15)">-</text><text class="terminal-4196591838-r5" x="36.6" y="386" textLength="85.4" clip-path="url(#terminal-4196591838-line-15)">-docker</text><text class="terminal-4196591838-r5" x="122" y="386" textLength="73.2" clip-path="url(#terminal-41965918 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-16)">│</text><text class="terminal-4196591838-r4" x="475.8" y="410.4" textLength="549" clip-path="url(#terminal-4196591838-line-16)">[default:&#160;registry]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4196591838-r4" x="1451.8" y="41 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="434.8" textLength="1464" clip-path="url(#terminal-4196591838-line-17)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4196591838-r2" x="1464" y="434.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-17)">
+</text><text class="terminal-4196591838-r4" x="0" y="459.2" textLength="24.4" clip-path="url(#terminal-4196591838-line-18)">╭─</text><text class="terminal-4196591838-r4" x="24.4" y="459.2" textLength="1415.2" clip-path="url(#terminal-4196591838-line-18)">&#160;Building&#160;images&#160;in&#160;parallel&#160;───────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-4196591838-r4" x="1439.6" y="459.2" textLength="24.4" clip-path="ur [...]
+</text><text class="terminal-4196591838-r4" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-19)">│</text><text class="terminal-4196591838-r5" x="24.4" y="483.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-19)">-</text><text class="terminal-4196591838-r5" x="36.6" y="483.6" textLength="48.8" clip-path="url(#terminal-4196591838-line-19)">-run</text><text class="terminal-4196591838-r5" x="85.4" y="483.6" textLength="146.4" clip-path="url(#terminal-4 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="508" textLength="12.2" clip-path="url(#terminal-4196591838-line-20)">│</text><text class="terminal-4196591838-r5" x="24.4" y="508" textLength="12.2" clip-path="url(#terminal-4196591838-line-20)">-</text><text class="terminal-4196591838-r5" x="36.6" y="508" textLength="146.4" clip-path="url(#terminal-4196591838-line-20)">-parallelism</text><text class="terminal-4196591838-r2" x="280.6" y="508" textLength="915" clip-path="url(#terminal-4 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-21)">│</text><text class="terminal-4196591838-r4" x="280.6" y="532.4" textLength="915" clip-path="url(#terminal-4196591838-line-21)">[default:&#160;4;&#160;1&lt;=x&lt;=8]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-22)">│</text><text class="terminal-4196591838-r5" x="24.4" y="556.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-22)">-</text><text class="terminal-4196591838-r5" x="36.6" y="556.8" textLength="85.4" clip-path="url(#terminal-4196591838-line-22)">-python</text><text class="terminal-4196591838-r5" x="122" y="556.8" textLength="109.8" clip-path="url(#terminal [...]
+</text><text class="terminal-4196591838-r4" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-23)">│</text><text class="terminal-4196591838-r4" x="280.6" y="581.2" textLength="951.6" clip-path="url(#terminal-4196591838-line-23)">[default:&#160;3.7&#160;3.8&#160;3.9&#160;3.10]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="605.6" textLength="1464" clip-path="url(#terminal-4196591838-line-24)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4196591838-r2" x="1464" y="605.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-24)">
+</text><text class="terminal-4196591838-r4" x="0" y="630" textLength="24.4" clip-path="url(#terminal-4196591838-line-25)">╭─</text><text class="terminal-4196591838-r4" x="24.4" y="630" textLength="1415.2" clip-path="url(#terminal-4196591838-line-25)">&#160;Options&#160;for&#160;customizing&#160;images&#160;────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-4196591838-r4" x="1439.6" y="630" textLength="24.4" clip-path="url(#ter [...]
+</text><text class="terminal-4196591838-r4" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-26)">│</text><text class="terminal-4196591838-r5" x="24.4" y="654.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-26)">-</text><text class="terminal-4196591838-r5" x="36.6" y="654.4" textLength="97.6" clip-path="url(#terminal-4196591838-line-26)">-install</text><text class="terminal-4196591838-r5" x="134.2" y="654.4" textLength="280.6" clip-path="url(#termi [...]
+</text><text class="terminal-4196591838-r4" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-27)">│</text><text class="terminal-4196591838-r5" x="24.4" y="678.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-27)">-</text><text class="terminal-4196591838-r5" x="36.6" y="678.8" textLength="97.6" clip-path="url(#terminal-4196591838-line-27)">-airflow</text><text class="terminal-4196591838-r5" x="134.2" y="678.8" textLength="85.4" clip-path="url(#termin [...]
+</text><text class="terminal-4196591838-r4" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-28)">│</text><text class="terminal-4196591838-r7" x="463.6" y="703.2" textLength="976" clip-path="url(#terminal-4196591838-line-28)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-4196591838-r4" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-29)">│</text><text class="terminal-4196591838-r4" x="463.6" y="727.6" textLength="976" clip-path="url(#terminal-4196591838-line-29)">[default:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="752" textLength="12.2" clip-path="url(#terminal-4196591838-line-30)">│</text><text class="terminal-4196591838-r4" x="463.6" y="752" textLength="976" clip-path="url(#terminal-4196591838-line-30)">amazon,async,celery,cncf.kubernetes,dask,docker,elasticsearch,ftp,google,google…</text><text class="terminal-4196591838-r4" x="1451.8" y="752" textLength="12.2" clip-path="url(#terminal-4196591838-line-30)">│</text><text class="terminal-4196591 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="776.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-31)">│</text><text class="terminal-4196591838-r5" x="24.4" y="776.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-31)">-</text><text class="terminal-4196591838-r5" x="36.6" y="776.4" textLength="97.6" clip-path="url(#terminal-4196591838-line-31)">-airflow</text><text class="terminal-4196591838-r5" x="134.2" y="776.4" textLength="207.4" clip-path="url(#termi [...]
+</text><text class="terminal-4196591838-r4" x="0" y="800.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-32)">│</text><text class="terminal-4196591838-r7" x="463.6" y="800.8" textLength="866.2" clip-path="url(#terminal-4196591838-line-32)">(constraints&#160;|&#160;constraints-no-providers&#160;|&#160;constraints-source-providers)</text><text class="terminal-4196591838-r4" x="1451.8" y="800.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-32)">│</text><text clas [...]
+</text><text class="terminal-4196591838-r4" x="0" y="825.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-33)">│</text><text class="terminal-4196591838-r4" x="463.6" y="825.2" textLength="866.2" clip-path="url(#terminal-4196591838-line-33)">[default:&#160;constraints]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
+</text><text class="terminal-4196591838-r4" x="0" y="849.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-34)">│</text><text class="terminal-4196591838-r5" x="24.4" y="849.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-34)">-</text><text class="terminal-4196591838-r5" x="36.6" y="849.6" textLength="97.6" clip-path="url(#terminal-4196591838-line-34)">-airflow</text><text class="terminal-4196591838-r5" x="134.2" y="849.6" textLength="268.4" clip-path="url(#termi [...]
+</text><text class="terminal-4196591838-r4" x="0" y="874" textLength="12.2" clip-path="url(#terminal-4196591838-line-35)">│</text><text class="terminal-4196591838-r5" x="24.4" y="874" textLength="12.2" clip-path="url(#terminal-4196591838-line-35)">-</text><text class="terminal-4196591838-r5" x="36.6" y="874" textLength="85.4" clip-path="url(#terminal-4196591838-line-35)">-python</text><text class="terminal-4196591838-r5" x="122" y="874" textLength="73.2" clip-path="url(#terminal-41965918 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="898.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-36)">│</text><text class="terminal-4196591838-r2" x="463.6" y="898.4" textLength="976" clip-path="url(#terminal-4196591838-line-36)">something&#160;like:&#160;python:VERSION-slim-bullseye&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-4196591838-r4" x="0" y="922.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-37)">│</text><text class="terminal-4196591838-r7" x="463.6" y="922.8" textLength="976" clip-path="url(#terminal-4196591838-line-37)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-4196591838-r4" x="0" y="947.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-38)">│</text><text class="terminal-4196591838-r5" x="24.4" y="947.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-38)">-</text><text class="terminal-4196591838-r5" x="36.6" y="947.2" textLength="134.2" clip-path="url(#terminal-4196591838-line-38)">-additional</text><text class="terminal-4196591838-r5" x="170.8" y="947.2" textLength="146.4" clip-path="url(#t [...]
+</text><text class="terminal-4196591838-r4" x="0" y="971.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-39)">│</text><text class="terminal-4196591838-r5" x="24.4" y="971.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-39)">-</text><text class="terminal-4196591838-r5" x="36.6" y="971.6" textLength="134.2" clip-path="url(#terminal-4196591838-line-39)">-additional</text><text class="terminal-4196591838-r5" x="170.8" y="971.6" textLength="85.4" clip-path="url(#te [...]
+</text><text class="terminal-4196591838-r4" x="0" y="996" textLength="12.2" clip-path="url(#terminal-4196591838-line-40)">│</text><text class="terminal-4196591838-r5" x="24.4" y="996" textLength="12.2" clip-path="url(#terminal-4196591838-line-40)">-</text><text class="terminal-4196591838-r5" x="36.6" y="996" textLength="134.2" clip-path="url(#terminal-4196591838-line-40)">-additional</text><text class="terminal-4196591838-r5" x="170.8" y="996" textLength="207.4" clip-path="url(#terminal- [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1020.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-41)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1020.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-41)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1020.4" textLength="134.2" clip-path="url(#terminal-4196591838-line-41)">-additional</text><text class="terminal-4196591838-r5" x="170.8" y="1020.4" textLength="195.2" clip-path="ur [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1044.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-42)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1044.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-42)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1044.8" textLength="134.2" clip-path="url(#terminal-4196591838-line-42)">-additional</text><text class="terminal-4196591838-r5" x="170.8" y="1044.8" textLength="244" clip-path="url( [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1069.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-43)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1069.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-43)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1069.2" textLength="134.2" clip-path="url(#terminal-4196591838-line-43)">-additional</text><text class="terminal-4196591838-r5" x="170.8" y="1069.2" textLength="158.6" clip-path="ur [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1093.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-44)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1093.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-44)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1093.6" textLength="134.2" clip-path="url(#terminal-4196591838-line-44)">-additional</text><text class="terminal-4196591838-r5" x="170.8" y="1093.6" textLength="146.4" clip-path="ur [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1118" textLength="12.2" clip-path="url(#terminal-4196591838-line-45)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1118" textLength="12.2" clip-path="url(#terminal-4196591838-line-45)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1118" textLength="134.2" clip-path="url(#terminal-4196591838-line-45)">-additional</text><text class="terminal-4196591838-r5" x="170.8" y="1118" textLength="195.2" clip-path="url(#termi [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1142.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-46)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1142.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-46)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1142.4" textLength="97.6" clip-path="url(#terminal-4196591838-line-46)">-runtime</text><text class="terminal-4196591838-r5" x="134.2" y="1142.4" textLength="109.8" clip-path="url(#t [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1166.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-47)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1166.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-47)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1166.8" textLength="97.6" clip-path="url(#terminal-4196591838-line-47)">-runtime</text><text class="terminal-4196591838-r5" x="134.2" y="1166.8" textLength="146.4" clip-path="url(#t [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1191.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-48)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1191.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-48)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1191.2" textLength="48.8" clip-path="url(#terminal-4196591838-line-48)">-dev</text><text class="terminal-4196591838-r5" x="85.4" y="1191.2" textLength="109.8" clip-path="url(#termin [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1215.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-49)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1215.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-49)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1215.6" textLength="48.8" clip-path="url(#terminal-4196591838-line-49)">-dev</text><text class="terminal-4196591838-r5" x="85.4" y="1215.6" textLength="146.4" clip-path="url(#termin [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1240" textLength="1464" clip-path="url(#terminal-4196591838-line-50)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4196591838-r2" x="1464" y="1240" textLength="12.2" clip-path="url(#terminal-4196591838-line-50)">
+</text><text class="terminal-4196591838-r4" x="0" y="1264.4" textLength="24.4" clip-path="url(#terminal-4196591838-line-51)">╭─</text><text class="terminal-4196591838-r4" x="24.4" y="1264.4" textLength="1415.2" clip-path="url(#terminal-4196591838-line-51)">&#160;Customization&#160;options&#160;(for&#160;specific&#160;customization&#160;needs)&#160;──────────────────────────────────────────────────────────</text><text class="terminal-4196591838-r4" x="1439.6" y="1264.4" textLength="24.4"  [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1288.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-52)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1288.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-52)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1288.8" textLength="97.6" clip-path="url(#terminal-4196591838-line-52)">-install</text><text class="terminal-4196591838-r5" x="134.2" y="1288.8" textLength="268.4" clip-path="url(#t [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1313.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-53)">│</text><text class="terminal-4196591838-r2" x="536.8" y="1313.2" textLength="97.6" clip-path="url(#terminal-4196591838-line-53)">Implies&#160;</text><text class="terminal-4196591838-r5" x="634.4" y="1313.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-53)">-</text><text class="terminal-4196591838-r5" x="646.6" y="1313.2" textLength="97.6" clip-path=" [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1337.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-54)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1337.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-54)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1337.6" textLength="97.6" clip-path="url(#terminal-4196591838-line-54)">-cleanup</text><text class="terminal-4196591838-r5" x="134.2" y="1337.6" textLength="97.6" clip-path="url(#te [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1362" textLength="12.2" clip-path="url(#terminal-4196591838-line-55)">│</text><text class="terminal-4196591838-r2" x="536.8" y="1362" textLength="170.8" clip-path="url(#terminal-4196591838-line-55)">together&#160;with&#160;</text><text class="terminal-4196591838-r5" x="707.6" y="1362" textLength="12.2" clip-path="url(#terminal-4196591838-line-55)">-</text><text class="terminal-4196591838-r5" x="719.8" y="1362" textLength="97.6" clip-pa [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1386.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-56)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1386.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-56)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1386.4" textLength="97.6" clip-path="url(#terminal-4196591838-line-56)">-disable</text><text class="terminal-4196591838-r5" x="134.2" y="1386.4" textLength="317.2" clip-path="url(#t [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1410.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-57)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1410.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-57)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1410.8" textLength="97.6" clip-path="url(#terminal-4196591838-line-57)">-disable</text><text class="terminal-4196591838-r5" x="134.2" y="1410.8" textLength="317.2" clip-path="url(#t [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1435.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-58)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1435.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-58)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1435.2" textLength="97.6" clip-path="url(#terminal-4196591838-line-58)">-disable</text><text class="terminal-4196591838-r5" x="134.2" y="1435.2" textLength="353.8" clip-path="url(#t [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1459.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-59)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1459.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-59)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1459.6" textLength="97.6" clip-path="url(#terminal-4196591838-line-59)">-disable</text><text class="terminal-4196591838-r5" x="134.2" y="1459.6" textLength="231.8" clip-path="url(#t [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1484" textLength="12.2" clip-path="url(#terminal-4196591838-line-60)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1484" textLength="12.2" clip-path="url(#terminal-4196591838-line-60)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1484" textLength="97.6" clip-path="url(#terminal-4196591838-line-60)">-install</text><text class="terminal-4196591838-r5" x="134.2" y="1484" textLength="219.6" clip-path="url(#terminal- [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1508.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-61)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1508.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-61)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1508.4" textLength="158.6" clip-path="url(#terminal-4196591838-line-61)">-installation</text><text class="terminal-4196591838-r5" x="195.2" y="1508.4" textLength="85.4" clip-path="u [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1532.8" textLength="1464" clip-path="url(#terminal-4196591838-line-62)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4196591838-r2" x="1464" y="1532.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-62)">
+</text><text class="terminal-4196591838-r4" x="0" y="1557.2" textLength="24.4" clip-path="url(#terminal-4196591838-line-63)">╭─</text><text class="terminal-4196591838-r4" x="24.4" y="1557.2" textLength="1415.2" clip-path="url(#terminal-4196591838-line-63)">&#160;Preparing&#160;cache&#160;and&#160;push&#160;(for&#160;maintainers&#160;and&#160;CI)&#160;─────────────────────────────────────────────────────────────────</text><text class="terminal-4196591838-r4" x="1439.6" y="1557.2" textLeng [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1581.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-64)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1581.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-64)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1581.6" textLength="85.4" clip-path="url(#terminal-4196591838-line-64)">-github</text><text class="terminal-4196591838-r5" x="122" y="1581.6" textLength="73.2" clip-path="url(#termi [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1606" textLength="12.2" clip-path="url(#terminal-4196591838-line-65)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1606" textLength="12.2" clip-path="url(#terminal-4196591838-line-65)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1606" textLength="85.4" clip-path="url(#terminal-4196591838-line-65)">-github</text><text class="terminal-4196591838-r5" x="122" y="1606" textLength="109.8" clip-path="url(#terminal-419 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1630.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-66)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1630.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-66)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1630.4" textLength="109.8" clip-path="url(#terminal-4196591838-line-66)">-platform</text><text class="terminal-4196591838-r2" x="341.6" y="1630.4" textLength="329.4" clip-path="url( [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1654.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-67)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1654.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-67)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1654.8" textLength="61" clip-path="url(#terminal-4196591838-line-67)">-push</text><text class="terminal-4196591838-r5" x="97.6" y="1654.8" textLength="73.2" clip-path="url(#terminal [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1679.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-68)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1679.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-68)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1679.2" textLength="73.2" clip-path="url(#terminal-4196591838-line-68)">-empty</text><text class="terminal-4196591838-r5" x="109.8" y="1679.2" textLength="73.2" clip-path="url(#term [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1703.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-69)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1703.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-69)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1703.6" textLength="97.6" clip-path="url(#terminal-4196591838-line-69)">-prepare</text><text class="terminal-4196591838-r5" x="134.2" y="1703.6" textLength="158.6" clip-path="url(#t [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1728" textLength="12.2" clip-path="url(#terminal-4196591838-line-70)">│</text><text class="terminal-4196591838-r2" x="341.6" y="1728" textLength="1098" clip-path="url(#terminal-4196591838-line-70)">image).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1752.4" textLength="1464" clip-path="url(#terminal-4196591838-line-71)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4196591838-r2" x="1464" y="1752.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-71)">
+</text><text class="terminal-4196591838-r4" x="0" y="1776.8" textLength="24.4" clip-path="url(#terminal-4196591838-line-72)">╭─</text><text class="terminal-4196591838-r4" x="24.4" y="1776.8" textLength="1415.2" clip-path="url(#terminal-4196591838-line-72)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-4196591838-r4" x="1439.6" y="1776.8" textLength="24.4" clip-path="url(#terminal- [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1801.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-73)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1801.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-73)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1801.2" textLength="85.4" clip-path="url(#terminal-4196591838-line-73)">-github</text><text class="terminal-4196591838-r5" x="122" y="1801.2" textLength="134.2" clip-path="url(#term [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1825.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-74)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1825.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-74)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1825.6" textLength="97.6" clip-path="url(#terminal-4196591838-line-74)">-builder</text><text class="terminal-4196591838-r2" x="329.4" y="1825.6" textLength="744.2" clip-path="url(#t [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1850" textLength="12.2" clip-path="url(#terminal-4196591838-line-75)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1850" textLength="12.2" clip-path="url(#terminal-4196591838-line-75)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1850" textLength="85.4" clip-path="url(#terminal-4196591838-line-75)">-answer</text><text class="terminal-4196591838-r6" x="280.6" y="1850" textLength="24.4" clip-path="url(#terminal-41 [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1874.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-76)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1874.4" textLength="12.2" clip-path="url(#terminal-4196591838-line-76)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1874.4" textLength="48.8" clip-path="url(#terminal-4196591838-line-76)">-dry</text><text class="terminal-4196591838-r5" x="85.4" y="1874.4" textLength="48.8" clip-path="url(#termina [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1898.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-77)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1898.8" textLength="12.2" clip-path="url(#terminal-4196591838-line-77)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1898.8" textLength="97.6" clip-path="url(#terminal-4196591838-line-77)">-verbose</text><text class="terminal-4196591838-r6" x="280.6" y="1898.8" textLength="24.4" clip-path="url(#te [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1923.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-78)">│</text><text class="terminal-4196591838-r5" x="24.4" y="1923.2" textLength="12.2" clip-path="url(#terminal-4196591838-line-78)">-</text><text class="terminal-4196591838-r5" x="36.6" y="1923.2" textLength="61" clip-path="url(#terminal-4196591838-line-78)">-help</text><text class="terminal-4196591838-r6" x="280.6" y="1923.2" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-4196591838-r4" x="0" y="1947.6" textLength="1464" clip-path="url(#terminal-4196591838-line-79)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4196591838-r2" x="1464" y="1947.6" textLength="12.2" clip-path="url(#terminal-4196591838-line-79)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output-commands-hash.txt b/images/breeze/output-commands-hash.txt
index a3b911c335..774cb26c3f 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -5,7 +5,7 @@
 main:fa4319079b275ce966502346f083f2e3
 build-docs:20b1a171a93c8ae1a62a0f3a804501f2
 build-image:b00ae014f9c45c116e8dd0ea72b61d19
-build-prod-image:4a3950d1a61aeb61218eb45659574139
+build-prod-image:6c614f9c76e776912dc1cf4506d2b6f5
 cleanup:9a94bd1063296ea86e895f671db0b330
 command-hash-export:83bc6a4a8c60b62da3d0f00e81d2c3ea
 config:92653afc11889e1b78e3a2e38f41107f
diff --git a/scripts/ci/libraries/_initialization.sh b/scripts/ci/libraries/_initialization.sh
index e7c96b20b5..96d3a65bf7 100644
--- a/scripts/ci/libraries/_initialization.sh
+++ b/scripts/ci/libraries/_initialization.sh
@@ -459,11 +459,6 @@ function initialization::initialize_image_build_variables() {
     # Determines which providers are used to generate constraints - source, pypi or no providers
     export AIRFLOW_CONSTRAINTS_MODE=${AIRFLOW_CONSTRAINTS_MODE:="constraints-source-providers"}
 
-    # By default we install latest airflow from PyPI or sources. You can set this parameter to false
-    # if Airflow is in the .whl or .tar.gz packages placed in `docker-context-files` folder and you want
-    # to skip installing Airflow/Providers from PyPI or sources.
-    export AIRFLOW_IS_IN_CONTEXT="${AIRFLOW_IS_IN_CONTEXT:="false"}"
-
     # whether installation should be performed from the local wheel packages in "docker-context-files" folder
     export INSTALL_PACKAGES_FROM_CONTEXT="${INSTALL_PACKAGES_FROM_CONTEXT:="false"}"
 
@@ -715,7 +710,6 @@ Common image build variables:
 
     INSTALL_AIRFLOW_VERSION: '${INSTALL_AIRFLOW_VERSION}'
     INSTALL_AIRFLOW_REFERENCE: '${INSTALL_AIRFLOW_REFERENCE}'
-    AIRFLOW_IS_IN_CONTEXT: '${AIRFLOW_IS_IN_CONTEXT}'
     AIRFLOW_PRE_CACHED_PIP_PACKAGES: '${AIRFLOW_PRE_CACHED_PIP_PACKAGES}'
     UPGRADE_TO_NEWER_DEPENDENCIES: '${UPGRADE_TO_NEWER_DEPENDENCIES}'
     CHECK_IMAGE_FOR_REBUILD: '${CHECK_IMAGE_FOR_REBUILD}'
@@ -858,7 +852,6 @@ function initialization::make_constants_read_only() {
     readonly IMAGE_TAG
 
     readonly AIRFLOW_PRE_CACHED_PIP_PACKAGES
-    readonly AIRFLOW_IS_IN_CONTEXT
     readonly INSTALL_PACKAGES_FROM_CONTEXT
     readonly AIRFLOW_CONSTRAINTS_REFERENCE
     readonly AIRFLOW_CONSTRAINTS_LOCATION


[airflow] 15/22: Fix PR label detection in CI (#25148)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit b932b1e62c2577f1e71d7752af861780733e790d
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Tue Jul 19 12:25:17 2022 +0200

    Fix PR label detection in CI (#25148)
    
    Label detection for incoming PR had few bugs:
    
    * wrong name of output was used for Build Info
    * assumption in selective checks was that PR labels are
      space separated, but they were really array formatted.
    * there was a $ typo in build-images.yaml
    
    This PR fixes all that:
    * output name and typo is corrected
    * we use ast.literal_eval now to parse the PR labels.
    
    (cherry picked from commit 9a939150c3bb02180e68edcc5ba62f50a0a219f7)
---
 .github/workflows/build-images.yml                 |   2 +-
 .github/workflows/ci.yml                           |   6 +-
 .../src/airflow_breeze/commands/ci_commands.py     |   5 +-
 .../src/airflow_breeze/utils/selective_checks.py   |   5 +-
 images/breeze/output-commands-hash.txt             |   2 +-
 images/breeze/output-selective-check.svg           | 112 ++++++++++-----------
 6 files changed, 68 insertions(+), 64 deletions(-)

diff --git a/.github/workflows/build-images.yml b/.github/workflows/build-images.yml
index d21aa522e4..dc758877f7 100644
--- a/.github/workflows/build-images.yml
+++ b/.github/workflows/build-images.yml
@@ -154,7 +154,7 @@ jobs:
       - name: Selective checks
         id: selective-checks
         env:
-          PR_LABELS: "$${{ steps.get-latest-pr-labels.outputs.pull-request-labels }}"
+          PR_LABELS: "${{ steps.get-latest-pr-labels.outputs.pull-request-labels }}"
           COMMIT_REF: "${{ env.TARGET_COMMIT_SHA }}"
         run: breeze selective-check
       - name: env
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index aa6c21fd9b..71514b8245 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -230,7 +230,7 @@ jobs:
       - name: Selective checks
         id: selective-checks
         env:
-          PR_LABELS: "${{ steps.source-run-info.outputs.pull-request-labels }}"
+          PR_LABELS: "${{ steps.source-run-info.outputs.pullRequestLabels }}"
           COMMIT_REF: "${{ github.sha }}"
         run: breeze selective-check
       # Avoid having to specify the runs-on logic every time. We use the custom
@@ -239,7 +239,7 @@ jobs:
       - name: Set runs-on
         id: set-runs-on
         env:
-          PR_LABELS: "${{ steps.source-run-info.outputs.pull-request-labels }}"
+          PR_LABELS: "${{ steps.source-run-info.outputs.pullRequestLabels }}"
         run: |
           if [[ ${PR_LABELS=} == *"use public runners"* ]]; then
             echo "Forcing running on Public Runners via `use public runners` label"
@@ -290,7 +290,7 @@ jobs:
       - name: env
         run: printenv
         env:
-          PR_LABELS: ${{ steps.get-latest-pr-labels.outputs.pull-request-labels }}
+          PR_LABELS: ${{ steps.source-run-info.outputs.pullRequestLabels }}
           GITHUB_CONTEXT: ${{ toJson(github) }}
 
   build-ci-images:
diff --git a/dev/breeze/src/airflow_breeze/commands/ci_commands.py b/dev/breeze/src/airflow_breeze/commands/ci_commands.py
index cb2d05f94d..cd9d05fa49 100644
--- a/dev/breeze/src/airflow_breeze/commands/ci_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/ci_commands.py
@@ -14,6 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
+import ast
 import os
 import platform
 import subprocess
@@ -244,7 +245,7 @@ def get_changed_files(commit_ref: Optional[str], dry_run: bool, verbose: bool) -
 )
 @click.option(
     '--pr-labels',
-    help="Space-separate list of labels which are valid for the PR",
+    help="Python array formatted PR labels assigned to the PR",
     default="",
     envvar="PR_LABELS",
 )
@@ -296,7 +297,7 @@ def selective_check(
         default_branch=default_branch,
         default_constraints_branch=default_constraints_branch,
         debian_version=debian_version,
-        pr_labels=tuple(" ".split(pr_labels)) if pr_labels else (),
+        pr_labels=tuple(ast.literal_eval(pr_labels)) if pr_labels else (),
         github_event=github_event,
     )
     print(str(sc))
diff --git a/dev/breeze/src/airflow_breeze/utils/selective_checks.py b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
index d3277e7b7e..642bb75043 100644
--- a/dev/breeze/src/airflow_breeze/utils/selective_checks.py
+++ b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
@@ -311,7 +311,10 @@ class SelectiveChecks:
             get_console().print(f"[warning]Full tests needed because event is {self._github_event}[/]")
             return True
         if FULL_TESTS_NEEDED_LABEL in self._pr_labels:
-            get_console().print(f"[warning]Full tests needed because labels are {self._pr_labels}[/]")
+            get_console().print(
+                "[warning]Full tests needed because "
+                f"label '{FULL_TESTS_NEEDED_LABEL}' is in  {self._pr_labels}[/]"
+            )
             return True
         return False
 
diff --git a/images/breeze/output-commands-hash.txt b/images/breeze/output-commands-hash.txt
index e3ddc61f81..a3b911c335 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -23,7 +23,7 @@ pull-prod-image:6e8467a2b8c833a392c8bdd65189363e
 regenerate-command-images:4fd2e7ecbfd6eebb18b854f3eb0f29c8
 release-prod-images:8858fe5a13989c7c65a79dc97a880928
 resource-check:0fb929ac3496dbbe97acfe99e35accd7
-selective-check:9b1cc2827b36be29141083dc9e9f6290
+selective-check:4be1ea17278fba654761531be0e3811a
 self-upgrade:b5437c0a1a91533a11ee9d0a9692369c
 setup-autocomplete:355b72dee171c2fcba46fc90ac7c97b0
 shell:ab7955da71048b3a695485c152d06786
diff --git a/images/breeze/output-selective-check.svg b/images/breeze/output-selective-check.svg
index 02ab2644d7..a1e143b10c 100644
--- a/images/breeze/output-selective-check.svg
+++ b/images/breeze/output-selective-check.svg
@@ -19,129 +19,129 @@
         font-weight: 700;
     }
 
-    .terminal-3947339877-matrix {
+    .terminal-516398974-matrix {
         font-family: Fira Code, monospace;
         font-size: 20px;
         line-height: 24.4px;
         font-variant-east-asian: full-width;
     }
 
-    .terminal-3947339877-title {
+    .terminal-516398974-title {
         font-size: 18px;
         font-weight: bold;
         font-family: arial;
     }
 
-    .terminal-3947339877-r1 { fill: #c5c8c6;font-weight: bold }
-.terminal-3947339877-r2 { fill: #c5c8c6 }
-.terminal-3947339877-r3 { fill: #d0b344;font-weight: bold }
-.terminal-3947339877-r4 { fill: #868887 }
-.terminal-3947339877-r5 { fill: #68a0b3;font-weight: bold }
-.terminal-3947339877-r6 { fill: #8d7b39 }
-.terminal-3947339877-r7 { fill: #98a84b;font-weight: bold }
+    .terminal-516398974-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-516398974-r2 { fill: #c5c8c6 }
+.terminal-516398974-r3 { fill: #d0b344;font-weight: bold }
+.terminal-516398974-r4 { fill: #868887 }
+.terminal-516398974-r5 { fill: #68a0b3;font-weight: bold }
+.terminal-516398974-r6 { fill: #8d7b39 }
+.terminal-516398974-r7 { fill: #98a84b;font-weight: bold }
     </style>
 
     <defs>
-    <clipPath id="terminal-3947339877-clip-terminal">
+    <clipPath id="terminal-516398974-clip-terminal">
       <rect x="0" y="0" width="1463.0" height="535.8" />
     </clipPath>
-    <clipPath id="terminal-3947339877-line-0">
+    <clipPath id="terminal-516398974-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-1">
+<clipPath id="terminal-516398974-line-1">
     <rect x="0" y="25.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-2">
+<clipPath id="terminal-516398974-line-2">
     <rect x="0" y="50.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-3">
+<clipPath id="terminal-516398974-line-3">
     <rect x="0" y="74.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-4">
+<clipPath id="terminal-516398974-line-4">
     <rect x="0" y="99.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-5">
+<clipPath id="terminal-516398974-line-5">
     <rect x="0" y="123.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-6">
+<clipPath id="terminal-516398974-line-6">
     <rect x="0" y="147.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-7">
+<clipPath id="terminal-516398974-line-7">
     <rect x="0" y="172.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-8">
+<clipPath id="terminal-516398974-line-8">
     <rect x="0" y="196.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-9">
+<clipPath id="terminal-516398974-line-9">
     <rect x="0" y="221.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-10">
+<clipPath id="terminal-516398974-line-10">
     <rect x="0" y="245.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-11">
+<clipPath id="terminal-516398974-line-11">
     <rect x="0" y="269.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-12">
+<clipPath id="terminal-516398974-line-12">
     <rect x="0" y="294.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-13">
+<clipPath id="terminal-516398974-line-13">
     <rect x="0" y="318.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-14">
+<clipPath id="terminal-516398974-line-14">
     <rect x="0" y="343.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-15">
+<clipPath id="terminal-516398974-line-15">
     <rect x="0" y="367.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-16">
+<clipPath id="terminal-516398974-line-16">
     <rect x="0" y="391.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-17">
+<clipPath id="terminal-516398974-line-17">
     <rect x="0" y="416.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-18">
+<clipPath id="terminal-516398974-line-18">
     <rect x="0" y="440.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-19">
+<clipPath id="terminal-516398974-line-19">
     <rect x="0" y="465.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3947339877-line-20">
+<clipPath id="terminal-516398974-line-20">
     <rect x="0" y="489.5" 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="584.8" rx="8"/><text class="terminal-3947339877-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;selective-check</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="584.8" rx="8"/><text class="terminal-516398974-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;selective-check</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
             <circle cx="44" cy="0" r="7" fill="#28c840"/>
             </g>
         
-    <g transform="translate(9, 41)" clip-path="url(#terminal-3947339877-clip-terminal)">
+    <g transform="translate(9, 41)" clip-path="url(#terminal-516398974-clip-terminal)">
     
-    <g class="terminal-3947339877-matrix">
-    <text class="terminal-3947339877-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-3947339877-line-0)">
-</text><text class="terminal-3947339877-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-3947339877-line-1)">Usage:&#160;</text><text class="terminal-3947339877-r1" x="97.6" y="44.4" textLength="390.4" clip-path="url(#terminal-3947339877-line-1)">breeze&#160;selective-check&#160;[OPTIONS]</text><text class="terminal-3947339877-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-3947339877-line-1)">
-</text><text class="terminal-3947339877-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-3947339877-line-2)">
-</text><text class="terminal-3947339877-r2" x="12.2" y="93.2" textLength="768.6" clip-path="url(#terminal-3947339877-line-3)">Checks&#160;what&#160;kind&#160;of&#160;tests&#160;should&#160;be&#160;run&#160;for&#160;an&#160;incoming&#160;commit.</text><text class="terminal-3947339877-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-3947339877-line-3)">
-</text><text class="terminal-3947339877-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-3947339877-line-4)">
-</text><text class="terminal-3947339877-r4" x="0" y="142" textLength="24.4" clip-path="url(#terminal-3947339877-line-5)">╭─</text><text class="terminal-3947339877-r4" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-3947339877-line-5)">&#160;Selective&#160;check&#160;flags&#160;─────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3947339877-r4" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-3 [...]
-</text><text class="terminal-3947339877-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-3947339877-line-6)">│</text><text class="terminal-3947339877-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-3947339877-line-6)">-</text><text class="terminal-3947339877-r5" x="36.6" y="166.4" textLength="85.4" clip-path="url(#terminal-3947339877-line-6)">-commit</text><text class="terminal-3947339877-r5" x="122" y="166.4" textLength="48.8" clip-path="url(#terminal-394 [...]
-</text><text class="terminal-3947339877-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-3947339877-line-7)">│</text><text class="terminal-3947339877-r5" x="24.4" y="190.8" textLength="12.2" clip-path="url(#terminal-3947339877-line-7)">-</text><text class="terminal-3947339877-r5" x="36.6" y="190.8" textLength="36.6" clip-path="url(#terminal-3947339877-line-7)">-pr</text><text class="terminal-3947339877-r5" x="73.2" y="190.8" textLength="85.4" clip-path="url(#terminal-394733 [...]
-</text><text class="terminal-3947339877-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-3947339877-line-8)">│</text><text class="terminal-3947339877-r5" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-3947339877-line-8)">-</text><text class="terminal-3947339877-r5" x="36.6" y="215.2" textLength="97.6" clip-path="url(#terminal-3947339877-line-8)">-default</text><text class="terminal-3947339877-r5" x="134.2" y="215.2" textLength="85.4" clip-path="url(#terminal- [...]
-</text><text class="terminal-3947339877-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-3947339877-line-9)">│</text><text class="terminal-3947339877-r5" x="24.4" y="239.6" textLength="12.2" clip-path="url(#terminal-3947339877-line-9)">-</text><text class="terminal-3947339877-r5" x="36.6" y="239.6" textLength="85.4" clip-path="url(#terminal-3947339877-line-9)">-github</text><text class="terminal-3947339877-r5" x="122" y="239.6" textLength="134.2" clip-path="url(#terminal-39 [...]
-</text><text class="terminal-3947339877-r4" x="0" y="264" textLength="12.2" clip-path="url(#terminal-3947339877-line-10)">│</text><text class="terminal-3947339877-r6" x="305" y="264" textLength="1134.6" clip-path="url(#terminal-3947339877-line-10)">(pull_request&#160;|&#160;pull_request_review&#160;|&#160;pull_request_target&#160;|&#160;pull_request_workflow&#160;|&#160;push&#160;|&#160;&#160;&#160;</text><text class="terminal-3947339877-r4" x="1451.8" y="264" textLength="12.2" clip-path [...]
-</text><text class="terminal-3947339877-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-3947339877-line-11)">│</text><text class="terminal-3947339877-r6" x="305" y="288.4" textLength="1134.6" clip-path="url(#terminal-3947339877-line-11)">schedule&#160;|&#160;workflow_run)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="terminal-3947339877-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-3947339877-line-12)">│</text><text class="terminal-3947339877-r4" x="305" y="312.8" textLength="1134.6" clip-path="url(#terminal-3947339877-line-12)">[default:&#160;pull_request]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="terminal-3947339877-r4" x="0" y="337.2" textLength="1464" clip-path="url(#terminal-3947339877-line-13)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3947339877-r2" x="1464" y="337.2" textLength="12.2" clip-path="url(#terminal-3947339877-line-13)">
-</text><text class="terminal-3947339877-r4" x="0" y="361.6" textLength="24.4" clip-path="url(#terminal-3947339877-line-14)">╭─</text><text class="terminal-3947339877-r4" x="24.4" y="361.6" textLength="1415.2" clip-path="url(#terminal-3947339877-line-14)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3947339877-r4" x="1439.6" y="361.6" textLength="24.4" clip-path="url(#terminal-394 [...]
-</text><text class="terminal-3947339877-r4" x="0" y="386" textLength="12.2" clip-path="url(#terminal-3947339877-line-15)">│</text><text class="terminal-3947339877-r5" x="24.4" y="386" textLength="12.2" clip-path="url(#terminal-3947339877-line-15)">-</text><text class="terminal-3947339877-r5" x="36.6" y="386" textLength="97.6" clip-path="url(#terminal-3947339877-line-15)">-default</text><text class="terminal-3947339877-r5" x="134.2" y="386" textLength="231.8" clip-path="url(#terminal-3947 [...]
-</text><text class="terminal-3947339877-r4" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-3947339877-line-16)">│</text><text class="terminal-3947339877-r4" x="439.2" y="410.4" textLength="756.4" clip-path="url(#terminal-3947339877-line-16)">[default:&#160;constraints-main]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
-</text><text class="terminal-3947339877-r4" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-3947339877-line-17)">│</text><text class="terminal-3947339877-r5" x="24.4" y="434.8" textLength="12.2" clip-path="url(#terminal-3947339877-line-17)">-</text><text class="terminal-3947339877-r5" x="36.6" y="434.8" textLength="85.4" clip-path="url(#terminal-3947339877-line-17)">-debian</text><text class="terminal-3947339877-r5" x="122" y="434.8" textLength="97.6" clip-path="url(#terminal- [...]
-</text><text class="terminal-3947339877-r4" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-3947339877-line-18)">│</text><text class="terminal-3947339877-r5" x="24.4" y="459.2" textLength="12.2" clip-path="url(#terminal-3947339877-line-18)">-</text><text class="terminal-3947339877-r5" x="36.6" y="459.2" textLength="97.6" clip-path="url(#terminal-3947339877-line-18)">-verbose</text><text class="terminal-3947339877-r7" x="390.4" y="459.2" textLength="24.4" clip-path="url(#termin [...]
-</text><text class="terminal-3947339877-r4" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-3947339877-line-19)">│</text><text class="terminal-3947339877-r5" x="24.4" y="483.6" textLength="12.2" clip-path="url(#terminal-3947339877-line-19)">-</text><text class="terminal-3947339877-r5" x="36.6" y="483.6" textLength="48.8" clip-path="url(#terminal-3947339877-line-19)">-dry</text><text class="terminal-3947339877-r5" x="85.4" y="483.6" textLength="48.8" clip-path="url(#terminal-39 [...]
-</text><text class="terminal-3947339877-r4" x="0" y="508" textLength="12.2" clip-path="url(#terminal-3947339877-line-20)">│</text><text class="terminal-3947339877-r5" x="24.4" y="508" textLength="12.2" clip-path="url(#terminal-3947339877-line-20)">-</text><text class="terminal-3947339877-r5" x="36.6" y="508" textLength="61" clip-path="url(#terminal-3947339877-line-20)">-help</text><text class="terminal-3947339877-r7" x="390.4" y="508" textLength="24.4" clip-path="url(#terminal-3947339877 [...]
-</text><text class="terminal-3947339877-r4" x="0" y="532.4" textLength="1464" clip-path="url(#terminal-3947339877-line-21)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3947339877-r2" x="1464" y="532.4" textLength="12.2" clip-path="url(#terminal-3947339877-line-21)">
+    <g class="terminal-516398974-matrix">
+    <text class="terminal-516398974-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-516398974-line-0)">
+</text><text class="terminal-516398974-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-516398974-line-1)">Usage:&#160;</text><text class="terminal-516398974-r1" x="97.6" y="44.4" textLength="390.4" clip-path="url(#terminal-516398974-line-1)">breeze&#160;selective-check&#160;[OPTIONS]</text><text class="terminal-516398974-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-516398974-line-1)">
+</text><text class="terminal-516398974-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-516398974-line-2)">
+</text><text class="terminal-516398974-r2" x="12.2" y="93.2" textLength="768.6" clip-path="url(#terminal-516398974-line-3)">Checks&#160;what&#160;kind&#160;of&#160;tests&#160;should&#160;be&#160;run&#160;for&#160;an&#160;incoming&#160;commit.</text><text class="terminal-516398974-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-516398974-line-3)">
+</text><text class="terminal-516398974-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-516398974-line-4)">
+</text><text class="terminal-516398974-r4" x="0" y="142" textLength="24.4" clip-path="url(#terminal-516398974-line-5)">╭─</text><text class="terminal-516398974-r4" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-516398974-line-5)">&#160;Selective&#160;check&#160;flags&#160;─────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-516398974-r4" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-516398 [...]
+</text><text class="terminal-516398974-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-516398974-line-6)">│</text><text class="terminal-516398974-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-516398974-line-6)">-</text><text class="terminal-516398974-r5" x="36.6" y="166.4" textLength="85.4" clip-path="url(#terminal-516398974-line-6)">-commit</text><text class="terminal-516398974-r5" x="122" y="166.4" textLength="48.8" clip-path="url(#terminal-516398974- [...]
+</text><text class="terminal-516398974-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-516398974-line-7)">│</text><text class="terminal-516398974-r5" x="24.4" y="190.8" textLength="12.2" clip-path="url(#terminal-516398974-line-7)">-</text><text class="terminal-516398974-r5" x="36.6" y="190.8" textLength="36.6" clip-path="url(#terminal-516398974-line-7)">-pr</text><text class="terminal-516398974-r5" x="73.2" y="190.8" textLength="85.4" clip-path="url(#terminal-516398974-lin [...]
+</text><text class="terminal-516398974-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-516398974-line-8)">│</text><text class="terminal-516398974-r5" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-516398974-line-8)">-</text><text class="terminal-516398974-r5" x="36.6" y="215.2" textLength="97.6" clip-path="url(#terminal-516398974-line-8)">-default</text><text class="terminal-516398974-r5" x="134.2" y="215.2" textLength="85.4" clip-path="url(#terminal-5163989 [...]
+</text><text class="terminal-516398974-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-516398974-line-9)">│</text><text class="terminal-516398974-r5" x="24.4" y="239.6" textLength="12.2" clip-path="url(#terminal-516398974-line-9)">-</text><text class="terminal-516398974-r5" x="36.6" y="239.6" textLength="85.4" clip-path="url(#terminal-516398974-line-9)">-github</text><text class="terminal-516398974-r5" x="122" y="239.6" textLength="134.2" clip-path="url(#terminal-516398974 [...]
+</text><text class="terminal-516398974-r4" x="0" y="264" textLength="12.2" clip-path="url(#terminal-516398974-line-10)">│</text><text class="terminal-516398974-r6" x="305" y="264" textLength="1134.6" clip-path="url(#terminal-516398974-line-10)">(pull_request&#160;|&#160;pull_request_review&#160;|&#160;pull_request_target&#160;|&#160;pull_request_workflow&#160;|&#160;push&#160;|&#160;&#160;&#160;</text><text class="terminal-516398974-r4" x="1451.8" y="264" textLength="12.2" clip-path="url [...]
+</text><text class="terminal-516398974-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-516398974-line-11)">│</text><text class="terminal-516398974-r6" x="305" y="288.4" textLength="1134.6" clip-path="url(#terminal-516398974-line-11)">schedule&#160;|&#160;workflow_run)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-516398974-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-516398974-line-12)">│</text><text class="terminal-516398974-r4" x="305" y="312.8" textLength="1134.6" clip-path="url(#terminal-516398974-line-12)">[default:&#160;pull_request]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-516398974-r4" x="0" y="337.2" textLength="1464" clip-path="url(#terminal-516398974-line-13)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-516398974-r2" x="1464" y="337.2" textLength="12.2" clip-path="url(#terminal-516398974-line-13)">
+</text><text class="terminal-516398974-r4" x="0" y="361.6" textLength="24.4" clip-path="url(#terminal-516398974-line-14)">╭─</text><text class="terminal-516398974-r4" x="24.4" y="361.6" textLength="1415.2" clip-path="url(#terminal-516398974-line-14)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-516398974-r4" x="1439.6" y="361.6" textLength="24.4" clip-path="url(#terminal-51639897 [...]
+</text><text class="terminal-516398974-r4" x="0" y="386" textLength="12.2" clip-path="url(#terminal-516398974-line-15)">│</text><text class="terminal-516398974-r5" x="24.4" y="386" textLength="12.2" clip-path="url(#terminal-516398974-line-15)">-</text><text class="terminal-516398974-r5" x="36.6" y="386" textLength="97.6" clip-path="url(#terminal-516398974-line-15)">-default</text><text class="terminal-516398974-r5" x="134.2" y="386" textLength="231.8" clip-path="url(#terminal-516398974-l [...]
+</text><text class="terminal-516398974-r4" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-516398974-line-16)">│</text><text class="terminal-516398974-r4" x="439.2" y="410.4" textLength="756.4" clip-path="url(#terminal-516398974-line-16)">[default:&#160;constraints-main]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-516398974-r4" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-516398974-line-17)">│</text><text class="terminal-516398974-r5" x="24.4" y="434.8" textLength="12.2" clip-path="url(#terminal-516398974-line-17)">-</text><text class="terminal-516398974-r5" x="36.6" y="434.8" textLength="85.4" clip-path="url(#terminal-516398974-line-17)">-debian</text><text class="terminal-516398974-r5" x="122" y="434.8" textLength="97.6" clip-path="url(#terminal-5163989 [...]
+</text><text class="terminal-516398974-r4" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-516398974-line-18)">│</text><text class="terminal-516398974-r5" x="24.4" y="459.2" textLength="12.2" clip-path="url(#terminal-516398974-line-18)">-</text><text class="terminal-516398974-r5" x="36.6" y="459.2" textLength="97.6" clip-path="url(#terminal-516398974-line-18)">-verbose</text><text class="terminal-516398974-r7" x="390.4" y="459.2" textLength="24.4" clip-path="url(#terminal-5163 [...]
+</text><text class="terminal-516398974-r4" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-516398974-line-19)">│</text><text class="terminal-516398974-r5" x="24.4" y="483.6" textLength="12.2" clip-path="url(#terminal-516398974-line-19)">-</text><text class="terminal-516398974-r5" x="36.6" y="483.6" textLength="48.8" clip-path="url(#terminal-516398974-line-19)">-dry</text><text class="terminal-516398974-r5" x="85.4" y="483.6" textLength="48.8" clip-path="url(#terminal-516398974 [...]
+</text><text class="terminal-516398974-r4" x="0" y="508" textLength="12.2" clip-path="url(#terminal-516398974-line-20)">│</text><text class="terminal-516398974-r5" x="24.4" y="508" textLength="12.2" clip-path="url(#terminal-516398974-line-20)">-</text><text class="terminal-516398974-r5" x="36.6" y="508" textLength="61" clip-path="url(#terminal-516398974-line-20)">-help</text><text class="terminal-516398974-r7" x="390.4" y="508" textLength="24.4" clip-path="url(#terminal-516398974-line-20 [...]
+</text><text class="terminal-516398974-r4" x="0" y="532.4" textLength="1464" clip-path="url(#terminal-516398974-line-21)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-516398974-r2" x="1464" y="532.4" textLength="12.2" clip-path="url(#terminal-516398974-line-21)">
 </text>
     </g>
     </g>


[airflow] 18/22: Retrieve airflow branch/constraints from env variables (#25053)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit fdece929ff0eb28460a607294fc470b4a542a9c9
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Tue Jul 19 14:38:02 2022 +0200

    Retrieve airflow branch/constraints from env variables (#25053)
    
    We are using the "main" breeze to build even v2-3 images and
    it has to retrieve the branch and constraints not from the
    Python constants but from environment variables that are
    set by build-image.yaml. Otherwise "main" is used to push/pull
    image and constraints.
    
    This pr changes the retrieval in build image to retrieve
    branch, constraints branch (and debian version) from env
    variables if they are set.
    
    (cherry picked from commit f36f81efc48fb5af3e86597068c7bf9b4a419251)
---
 dev/breeze/src/airflow_breeze/commands/ci_commands.py       | 7 +++++++
 dev/breeze/src/airflow_breeze/params/build_ci_params.py     | 7 +++++--
 dev/breeze/src/airflow_breeze/params/build_prod_params.py   | 5 ++++-
 dev/breeze/src/airflow_breeze/params/common_build_params.py | 4 ++--
 images/breeze/output-commands-hash.txt                      | 2 +-
 5 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/dev/breeze/src/airflow_breeze/commands/ci_commands.py b/dev/breeze/src/airflow_breeze/commands/ci_commands.py
index cd9d05fa49..9d4dda4297 100644
--- a/dev/breeze/src/airflow_breeze/commands/ci_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/ci_commands.py
@@ -263,6 +263,13 @@ def get_changed_files(commit_ref: Optional[str], dry_run: bool, verbose: bool) -
     envvar="DEFAULT_CONSTRAINTS_BRANCH",
     show_default=True,
 )
+@click.option(
+    '--default-constraints-branch',
+    help="Constraints Branch against which the PR should be run",
+    default="constraints-main",
+    envvar="DEFAULT_CONSTRAINTS_BRANCH",
+    show_default=True,
+)
 @click.option(
     '--github-event-name',
     type=BetterChoice(github_events()),
diff --git a/dev/breeze/src/airflow_breeze/params/build_ci_params.py b/dev/breeze/src/airflow_breeze/params/build_ci_params.py
index 52c242b65a..ee63033ef6 100644
--- a/dev/breeze/src/airflow_breeze/params/build_ci_params.py
+++ b/dev/breeze/src/airflow_breeze/params/build_ci_params.py
@@ -14,6 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
+import os
 from dataclasses import dataclass
 from pathlib import Path
 from typing import List
@@ -31,8 +32,10 @@ class BuildCiParams(CommonBuildParams):
     """
 
     airflow_constraints_mode: str = "constraints-source-providers"
-    default_constraints_branch: str = DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH
-    airflow_constraints_reference: str = DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH
+    default_constraints_branch: str = os.environ.get(
+        'DEFAULT_CONSTRAINTS_BRANCH', DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH
+    )
+    airflow_constraints_reference: str = ""
     airflow_extras: str = "devel_ci"
     airflow_pre_cached_pip_packages: bool = True
     force_build: bool = False
diff --git a/dev/breeze/src/airflow_breeze/params/build_prod_params.py b/dev/breeze/src/airflow_breeze/params/build_prod_params.py
index 65e92400c4..86a25b6999 100644
--- a/dev/breeze/src/airflow_breeze/params/build_prod_params.py
+++ b/dev/breeze/src/airflow_breeze/params/build_prod_params.py
@@ -16,6 +16,7 @@
 # under the License.
 
 import json
+import os
 import re
 import sys
 from dataclasses import dataclass
@@ -41,7 +42,9 @@ class BuildProdParams(CommonBuildParams):
     """
 
     airflow_constraints_mode: str = "constraints"
-    default_constraints_branch: str = DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH
+    default_constraints_branch: str = os.environ.get(
+        'DEFAULT_CONSTRAINTS_BRANCH', DEFAULT_AIRFLOW_CONSTRAINTS_BRANCH
+    )
     airflow_constraints_reference: str = ""
     cleanup_context: bool = False
     disable_airflow_repo_cache: bool = False
diff --git a/dev/breeze/src/airflow_breeze/params/common_build_params.py b/dev/breeze/src/airflow_breeze/params/common_build_params.py
index e6c2c70029..b4fc12e273 100644
--- a/dev/breeze/src/airflow_breeze/params/common_build_params.py
+++ b/dev/breeze/src/airflow_breeze/params/common_build_params.py
@@ -41,13 +41,13 @@ class CommonBuildParams:
     additional_runtime_apt_command: str = ""
     additional_runtime_apt_deps: str = ""
     additional_runtime_apt_env: str = ""
-    airflow_branch: str = AIRFLOW_BRANCH
+    airflow_branch: str = os.environ.get('DEFAULT_BRANCH', AIRFLOW_BRANCH)
     airflow_constraints_location: str = ""
     answer: Optional[str] = None
     build_id: int = 0
     builder: str = "default"
     constraints_github_repository: str = "apache/airflow"
-    debian_version: str = "bullseye"
+    debian_version: str = os.environ.get('DEBIAN_VERSION', "bullseye")
     dev_apt_command: str = ""
     dev_apt_deps: str = ""
     docker_cache: str = "registry"
diff --git a/images/breeze/output-commands-hash.txt b/images/breeze/output-commands-hash.txt
index 774cb26c3f..df2aa32c0a 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -23,7 +23,7 @@ pull-prod-image:6e8467a2b8c833a392c8bdd65189363e
 regenerate-command-images:4fd2e7ecbfd6eebb18b854f3eb0f29c8
 release-prod-images:8858fe5a13989c7c65a79dc97a880928
 resource-check:0fb929ac3496dbbe97acfe99e35accd7
-selective-check:4be1ea17278fba654761531be0e3811a
+selective-check:46db58b67a3441d39a62ae23c1082f09
 self-upgrade:b5437c0a1a91533a11ee9d0a9692369c
 setup-autocomplete:355b72dee171c2fcba46fc90ac7c97b0
 shell:ab7955da71048b3a695485c152d06786


[airflow] 11/22: Stop failing image refreshing on "warm-up" failure (#25046)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit ba3434dc0cf546d402c901284d0260bd4f261c50
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Thu Jul 14 07:46:08 2022 +0200

    Stop failing image refreshing on "warm-up" failure (#25046)
    
    The "warm-up" buld for parallel images might fail when you run
    it locally, but this should be ignored, because it is really only
    needed at the CI when we want to make sure that several parallel
    builds do not try to create the same buildx container.
    
    It's safe to ignore any failure at the warm-up stage.
    
    (cherry picked from commit 5e0160fe20ef1edc34d8f0a8e17a193504e4c541)
---
 dev/breeze/src/airflow_breeze/utils/docker_command_utils.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

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 df540a5bb8..99d98268b2 100644
--- a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
@@ -703,11 +703,11 @@ LABEL description="test warmup image"
         dry_run=dry_run,
         cwd=AIRFLOW_SOURCES_ROOT,
         text=True,
+        check=False,
         enabled_output_group=True,
     )
     if warm_up_command_result.returncode != 0:
         get_console().print(
-            f"[error]Error {warm_up_command_result.returncode} when warming up builder:"
+            f"[warning]Warning {warm_up_command_result.returncode} when warming up builder:"
             f" {warm_up_command_result.stdout} {warm_up_command_result.stderr}"
         )
-        sys.exit(warm_up_command_result.returncode)


[airflow] 21/22: Move javascript compilation to host (#25169)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 0285bf8b7180cf5c62a3559aeacb17a16235d5d6
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Wed Jul 20 19:30:03 2022 +0200

    Move javascript compilation to host (#25169)
    
    Previously, in order to keep consistent development environment
    we've compiled javascript in the CI image. However we can utilise
    power of pre-commmit for setting the node environment for all
    contributors automatically. Instead of compiling the javascript
    in the image, we can compile it via pre-commit in the host.
    
    This can be done thanks to the new python breeze which is far more
    flexible and can now add execution of compilation of the javascript when
    needed and using pre-commit environments.
    
    Thanks to that, we can vastly simplify the Dockerfiles and scripts that
    are used to automatically build or signal that the assets need
    recompilation. We can basically assume that the assets were prepared
    outside of the image building (and breeze makes sure it happens)
    
    The changes:
    
    * node.js is not needed in images (neither PROD build nor CI)
    * no need for multiple asset compilation scripts. All is done
      via pre-commit environment with `breeze compile-www-assets``
      command
    * lint checks for UI do not need the docker image any more
      (they are also based on pre-commit environment)
    * no more checks/warnings when you enter the image
    * start-airflow command builds the compilation before entering
    * prepare-airflow-package runs asset compilation before entering
      docker airflow building.
    
    (cherry picked from commit acff1296886d222cc411a99bb3276465ab03e36b)
---
 .dockerignore                                      |   9 +-
 .github/boring-cyborg.yml                          |   1 -
 .github/workflows/build-images.yml                 |   4 +
 .github/workflows/ci.yml                           |   8 +
 .gitignore                                         |   2 +-
 .pre-commit-config.yaml                            |  65 +++-
 BREEZE.rst                                         |  36 +-
 CONTRIBUTING.rst                                   |  32 +-
 Dockerfile                                         | 128 +------
 Dockerfile.ci                                      | 135 +-------
 STATIC_CODE_CHECKS.rst                             |   8 +-
 airflow/www/ask_for_recompile_assets_if_needed.sh  |  56 ---
 breeze-legacy                                      |   8 -
 .../airflow_breeze/commands/developer_commands.py  |  24 ++
 .../commands/release_management_commands.py        |   3 +-
 dev/breeze/src/airflow_breeze/global_constants.py  |   8 -
 .../src/airflow_breeze/params/build_prod_params.py |  10 -
 dev/breeze/src/airflow_breeze/pre_commit_ids.py    |   3 +
 dev/breeze/src/airflow_breeze/utils/run_utils.py   |  31 ++
 docs/docker-stack/build-arg-ref.rst                |  10 -
 images/breeze/output-commands-hash.txt             |   3 +-
 images/breeze/output-commands.svg                  | 384 +++++++++++----------
 images/breeze/output-compile-www-assets.svg        |  99 ++++++
 images/breeze/output-static-checks.svg             | 228 ++++++------
 scripts/ci/libraries/_initialization.sh            |  28 --
 .../ci/pre_commit/pre_commit_compile_www_assets.py |  28 +-
 scripts/ci/pre_commit/pre_commit_ui_lint.py        |  40 +--
 scripts/ci/pre_commit/pre_commit_www_lint.py       |  41 +--
 scripts/docker/compile_www_assets.sh               |  71 ----
 scripts/docker/entrypoint_ci.sh                    |   7 +-
 scripts/docker/prepare_node_modules.sh             |  52 ---
 scripts/in_container/_in_container_utils.sh        |  24 +-
 .../in_container/run_prepare_airflow_packages.sh   |   2 +-
 .../internal_api/__init__.py                       |  18 -
 .../compile_assets.sh => tests/system/__init__.py  |  18 -
 .../system/providers/__init__.py                   |  18 -
 .../system/providers/apache/__init__.py            |  18 -
 .../system/providers/google/__init__.py            |  18 -
 38 files changed, 611 insertions(+), 1067 deletions(-)

diff --git a/.dockerignore b/.dockerignore
index 69a3bbfca6..f412505e99 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -74,18 +74,15 @@
 !setup.cfg
 !setup.py
 !manifests
+!generated
 # Now - ignore unnecessary files inside allowed directories
 # This goes after the allowed directories
 
 # Git version is dynamically generated
 airflow/git_version
 
-# Exclude static www files generated by NPM
-airflow/www/static/coverage
-airflow/www/static/dist
+# Exclude mode_modules pulled by "yarn" for compilation of www files generated by NPM
 airflow/www/node_modules
-# Exclude static ui files generated by NPM
-airflow/ui/build
 airflow/ui/node_modules
 
 # Exclude link to docs
@@ -99,7 +96,7 @@ airflow/www/static/docs
 **/env/
 **/build/
 **/develop-eggs/
-**/dist/
+/dist/
 **/downloads/
 **/eggs/
 **/.eggs/
diff --git a/.github/boring-cyborg.yml b/.github/boring-cyborg.yml
index 607d4fb6cd..39d7718d7b 100644
--- a/.github/boring-cyborg.yml
+++ b/.github/boring-cyborg.yml
@@ -119,7 +119,6 @@ labelPRBasedOnFilePath:
     - airflow/www/.eslintrc
     - airflow/www/.stylelintignore
     - airflow/www/.stylelintrc
-    - airflow/www/compile_assets.sh
     - airflow/www/package.json
     - airflow/www/webpack.config.js
     - airflow/www/yarn.lock
diff --git a/.github/workflows/build-images.yml b/.github/workflows/build-images.yml
index 4485e5c68d..2757646887 100644
--- a/.github/workflows/build-images.yml
+++ b/.github/workflows/build-images.yml
@@ -232,6 +232,8 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
           breeze static-checks --type update-providers-dependencies --all-files
           --show-diff-on-failure --color always || true
         if: needs.build-info.outputs.default-branch == 'main'
+      - name: Compile www assets
+        run: breeze compile-www-assets
       - name: >-
           Build & Push AMD64 CI images ${{ env.IMAGE_TAG_FOR_THE_BUILD }}
           ${{ needs.build-info.outputs.all-python-versions-list-as-string }}
@@ -343,6 +345,8 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
         run: breeze prepare-airflow-package --package-format wheel --version-suffix-for-pypi dev0
       - name: "Move dist packages to docker-context files"
         run: mv -v ./dist/*.whl ./docker-context-files
+      - name: Compile www assets
+        run: breeze compile-www-assets
       - name: >-
           Build & Push PROD images ${{ env.IMAGE_TAG_FOR_THE_BUILD }}
           ${{ needs.build-info.outputs.all-python-versions-list-as-string }}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index c459b7001d..78ef756b4f 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -349,6 +349,11 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
         if: >
           needs.build-info.outputs.in-workflow-build == 'true' &&
           needs.build-info.outputs.default-branch == 'main'
+      - name: Compile www assets
+        run: breeze compile-www-assets
+        if: >
+          needs.build-info.outputs.in-workflow-build == 'true' &&
+          needs.build-info.outputs.default-branch == 'main'
       - name: >
           Build & Push CI images ${{ env.IMAGE_TAG_FOR_THE_BUILD }}
           ${{ needs.build-info.outputs.all-python-versions-list-as-string }}
@@ -448,6 +453,9 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
       - name: "Move dist packages to docker-context files"
         run: mv -v ./dist/*.whl ./docker-context-files
         if: needs.build-info.outputs.in-workflow-build == 'true'
+      - name: Compile www assets
+        run: breeze compile-www-assets
+        if: needs.build-info.outputs.in-workflow-build == 'true'
       - name: >
           Build & Push PROD images ${{ env.IMAGE_TAG_FOR_THE_BUILD }}
           ${{ needs.build-info.outputs.all-python-versions-list-as-string }}
diff --git a/.gitignore b/.gitignore
index fe3d74aa23..694e3ecf17 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,7 +13,7 @@ unittests.db
 # Airflow temporary artifacts
 airflow/git_version
 airflow/www/static/coverage/
-airflow/www/static/dist
+airflow/www/*.log
 
 /logs/
 airflow-webserver.pid
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 77da7b91ec..0efe856658 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -298,7 +298,7 @@ repos:
         exclude: ^airflow/_vendor/|^RELEASE_NOTES\.txt$|^airflow/www/static/css/material-icons\.css$|^images/.*$
         args:
           - --ignore-words=docs/spelling_wordlist.txt
-          - --skip=docs/*/commits.rst,airflow/providers/*/*.rst,*.lock,INTHEWILD.md,*.min.js,docs/apache-airflow/pipeline_example.csv
+          - --skip=docs/*/commits.rst,airflow/providers/*/*.rst,*.lock,INTHEWILD.md,*.min.js,docs/apache-airflow/pipeline_example.csv,airflow/www/*.log
           - --exclude-file=.codespellignorelines
   - repo: local
     hooks:
@@ -582,9 +582,20 @@ repos:
         name: stylelint
         entry: "stylelint"
         language: node
+        language_version: 18.6.0
         files: ^airflow/www/.*\.(css|scss|sass)$
         # Keep dependency versions in sync w/ airflow/www/package.json
         additional_dependencies: ['stylelint@13.3.1', 'stylelint-config-standard@20.0.0']
+      - id: compile-www-assets
+        name: Compile www assets
+        language: node
+        language_version: 18.6.0
+        stages: ['manual']
+        'types_or': [javascript, tsx, ts]
+        files: ^airflow/www/
+        entry: ./scripts/ci/pre_commit/pre_commit_compile_www_assets.py
+        pass_filenames: false
+        additional_dependencies: ['yarn@1.22.19']
       - id: check-providers-init-file-missing
         name: Provider init file is missing
         pass_filenames: false
@@ -657,6 +668,7 @@ repos:
         description: Checks the style of Markdown files.
         entry: markdownlint
         language: node
+        language_version: 18.6.0
         types: [markdown]
         files: \.(md|mdown|markdown)$
         additional_dependencies: ['markdownlint-cli']
@@ -777,6 +789,41 @@ repos:
         files: newsfragments/.*\.rst
         entry: ./scripts/ci/pre_commit/pre_commit_newsfragments.py
         pass_filenames: true
+        # We sometimes won't have newsfragments in the repo, so always run it so `check-hooks-apply` passes
+        # This is fast, so not too much downside
+        always_run: true
+      - id: check-system-tests-tocs
+        name: Check that system tests is properly added
+        entry: ./scripts/ci/pre_commit/pre_commit_check_system_tests_hidden_in_index.py
+        language: python
+        pass_filenames: true
+        files: ^docs/apache-airflow-providers-[^/]*/index\.rst$
+        additional_dependencies: ['rich>=12.4.4', 'pyyaml']
+      - id: create-missing-init-py-files-tests
+        name: Create missing init.py files in tests
+        entry: ./scripts/ci/pre_commit/pre_commit_check_init_in_tests.py
+        language: python
+        additional_dependencies: ['rich>=12.4.4']
+        pass_filenames: false
+        files: ^tests/.*\.py$
+      - id: lint-javascript
+        name: ESLint against airflow/ui
+        language: node
+        language_version: 18.6.0
+        'types_or': [javascript, tsx, ts]
+        files: ^airflow/ui/
+        entry: ./scripts/ci/pre_commit/pre_commit_ui_lint.py
+        pass_filenames: false
+        additional_dependencies: ['yarn@1.22.19']
+      - id: lint-javascript
+        name: ESLint against current UI JavaScript files
+        language: node
+        language_version: 18.6.0
+        'types_or': [javascript, tsx, ts]
+        files: ^airflow/www/static/js/
+        entry: ./scripts/ci/pre_commit/pre_commit_www_lint.py
+        additional_dependencies: ['yarn@1.22.19']
+        pass_filenames: false
         ## ADD MOST PRE-COMMITS ABOVE THAT LINE
         # The below pre-commits are those requiring CI image to be built
       - id: run-mypy
@@ -817,22 +864,6 @@ repos:
         pass_filenames: true
         exclude: ^airflow/_vendor/
         additional_dependencies: ['rich>=12.4.4', 'inputimeout']
-      - id: lint-javascript
-        name: ESLint against airflow/ui
-        language: python
-        'types_or': [javascript, tsx, ts]
-        files: ^airflow/ui/
-        entry: ./scripts/ci/pre_commit/pre_commit_ui_lint.py
-        pass_filenames: false
-        additional_dependencies: ['rich>=12.4.4', 'inputimeout']
-      - id: lint-javascript
-        name: ESLint against current UI JavaScript files
-        language: python
-        'types_or': [javascript]
-        files: ^airflow/www/static/js/
-        entry: ./scripts/ci/pre_commit/pre_commit_www_lint.py
-        pass_filenames: false
-        additional_dependencies: ['rich>=12.4.4', 'inputimeout']
       - id: update-migration-references
         name: Update migration ref doc
         language: python
diff --git a/BREEZE.rst b/BREEZE.rst
index 3a3034b06f..1489e2158c 100644
--- a/BREEZE.rst
+++ b/BREEZE.rst
@@ -438,6 +438,16 @@ regenerate all those images (which might be needed in case new version of rich i
   :alt: Breeze regenerate-command-images
 
 
+Compiling www assets
+====================
+
+Airflow webserver needs to prepare www assets - compiled with node and yarn. The ``compile-www-assets``
+command takes care about it. This is needed when you want to run webserver inside of the breeze.
+
+.. image:: ./images/breeze/output-compile-www-assets.svg
+  :width: 100%
+  :alt: Breeze compile-www-assets
+
 Starting complete Airflow installation
 ======================================
 
@@ -445,6 +455,13 @@ For testing Airflow oyou often want to start multiple components (in multiple te
 built-in ``start-airflow`` command that start breeze container, launches multiple terminals using tmux
 and launches all Airflow necessary components in those terminals.
 
+When you are starting airflow from local sources, www asset compilation is automatically executed before.
+
+.. code-block:: bash
+
+    breeze --python 3.7 --backend mysql start-airflow
+
+
 You can also use it to start any released version of Airflow from ``PyPI`` with the
 ``--use-airflow-version`` flag.
 
@@ -496,6 +513,7 @@ Those are commands mostly used by contributors:
 * Execute arbitrary command in the test environment with ``breeze shell`` command
 * Enter interactive shell in CI container when ``shell`` (or no command) is specified
 * Start containerised, development-friendly airflow installation with ``breeze start-airflow`` command
+* Compile www assets for webserver ``breeze compile-www-assets`` command
 * Build documentation with ``breeze build-docs`` command
 * Initialize local virtualenv with ``./scripts/tools/initialize_virtualenv.py`` command
 * Run static checks with autocomplete support ``breeze static-checks`` command
@@ -1575,24 +1593,14 @@ If you set these variables, next time when you enter the environment the new por
 Managing Dependencies
 ---------------------
 
-If you need to change apt dependencies in the ``Dockerfile.ci``, add Python packages in ``setup.py`` or
-add JavaScript dependencies in ``package.json``, you can either add dependencies temporarily for a single
-Breeze session or permanently in ``setup.py``, ``Dockerfile.ci``, or ``package.json`` files.
-
-Installing Dependencies for a Single Breeze Session
-...................................................
-
-You can install dependencies inside the container using ``sudo apt install``, ``pip install`` or
-``yarn install`` (in ``airflow/www`` folder) respectively. This is useful if you want to test something
-quickly while you are in the container. However, these changes are not retained: they disappear once you
-exit the container (except for the node.js dependencies if your sources are mounted to the container).
-Therefore, if you want to retain a new dependency, follow the second option described below.
+If you need to change apt dependencies in the ``Dockerfile.ci``, add Python packages in ``setup.py``
+for airflow and in provider.yaml for packages. If you add any "node" dependencies in ``airflow/www``
+or ``airflow/ui``, you need to compile them in the host with ``breeze compile-www-assets`` command.
 
 Adding Dependencies Permanently
 ...............................
 
-You can add dependencies to the ``Dockerfile.ci``, ``setup.py`` or ``package.json`` and rebuild the image.
-This should happen automatically if you modify any of these files.
+You can add dependencies to the ``Dockerfile.ci``, ``setup.py``.
 After you exit the container and re-run ``breeze``, Breeze detects changes in dependencies,
 asks you to confirm rebuilding the image and proceeds with rebuilding if you confirm (or skip it
 if you do not confirm). After rebuilding is done, Breeze drops you to shell. You may also use the
diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
index 1904c15abe..facd5d9863 100644
--- a/CONTRIBUTING.rst
+++ b/CONTRIBUTING.rst
@@ -1162,12 +1162,12 @@ itself comes bundled with jQuery and bootstrap. While they may be phased out
 over time, these packages are currently not managed with yarn.
 
 Make sure you are using recent versions of node and yarn. No problems have been
-found with node\>=8.11.3 and yarn\>=1.19.1.
+found with node\>=8.11.3 and yarn\>=1.19.1. The pre-commit framework of ours install
+node and yarn automatically when installed - if you use ``breeze`` you do not need to install
+neither node nor yarn.
 
-Installing yarn and its packages
---------------------------------
-
-Make sure yarn is available in your environment.
+Installing yarn and its packages manually
+-----------------------------------------
 
 To install yarn on macOS:
 
@@ -1191,27 +1191,6 @@ To install yarn on macOS:
     export PATH="$HOME/.yarn/bin:$PATH"
 
 4.  Install third-party libraries defined in ``package.json`` by running the
-    following commands within the ``airflow/www/`` directory:
-
-
-.. code-block:: bash
-
-    # from the root of the repository, move to where our JS package.json lives
-    cd airflow/www/
-    # run yarn install to fetch all the dependencies
-    yarn install
-
-
-These commands install the libraries in a new ``node_modules/`` folder within
-``www/``.
-
-Should you add or upgrade a node package, run
-``yarn add --dev <package>`` for packages needed in development or
-``yarn add <package>`` for packages used by the code.
-Then push the newly generated ``package.json`` and ``yarn.lock`` file so that we
-could get a reproducible build. See the `Yarn docs
-<https://yarnpkg.com/en/docs/cli/add#adding-dependencies->`_ for more details.
-
 
 Generate Bundled Files with yarn
 --------------------------------
@@ -1225,6 +1204,7 @@ commands:
     yarn run prod
 
     # Starts a web server that manages and updates your assets as you modify them
+    # You'll need to run the webserver in debug mode too: ``airflow webserver -d``
     yarn run dev
 
 
diff --git a/Dockerfile b/Dockerfile
index b4ddddef80..7fd6b8bbf6 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -397,101 +397,6 @@ function common::show_pip_version_and_location() {
 }
 EOF
 
-# The content below is automatically copied from scripts/docker/prepare_node_modules.sh
-COPY <<"EOF" /prepare_node_modules.sh
-set -euo pipefail
-
-COLOR_BLUE=$'\e[34m'
-readonly COLOR_BLUE
-COLOR_RESET=$'\e[0m'
-readonly COLOR_RESET
-
-function prepare_node_modules() {
-    echo
-    echo "${COLOR_BLUE}Preparing node modules${COLOR_RESET}"
-    echo
-    local www_dir
-    if [[ ${AIRFLOW_INSTALLATION_METHOD=} == "." ]]; then
-        # In case we are building from sources in production image, we should build the assets
-        www_dir="${AIRFLOW_SOURCES_TO=${AIRFLOW_SOURCES}}/airflow/www"
-    else
-        www_dir="$(python -m site --user-site)/airflow/www"
-    fi
-    pushd ${www_dir} || exit 1
-    set +e
-    yarn install --frozen-lockfile --no-cache 2>/tmp/out-yarn-install.txt
-    local res=$?
-    if [[ ${res} != 0 ]]; then
-        >&2 echo
-        >&2 echo "Error when running yarn install:"
-        >&2 echo
-        >&2 cat /tmp/out-yarn-install.txt && rm -f /tmp/out-yarn-install.txt
-        exit 1
-    fi
-    rm -f /tmp/out-yarn-install.txt
-    popd || exit 1
-}
-
-prepare_node_modules
-EOF
-
-# The content below is automatically copied from scripts/docker/compile_www_assets.sh
-COPY <<"EOF" /compile_www_assets.sh
-set -euo pipefail
-
-BUILD_TYPE=${BUILD_TYPE="prod"}
-REMOVE_ARTIFACTS=${REMOVE_ARTIFACTS="true"}
-
-COLOR_BLUE=$'\e[34m'
-readonly COLOR_BLUE
-COLOR_RESET=$'\e[0m'
-readonly COLOR_RESET
-
-function compile_www_assets() {
-    echo
-    echo "${COLOR_BLUE}Compiling www assets: running yarn ${BUILD_TYPE}${COLOR_RESET}"
-    echo
-    local www_dir
-    if [[ ${AIRFLOW_INSTALLATION_METHOD=} == "." ]]; then
-        # In case we are building from sources in production image, we should build the assets
-        www_dir="${AIRFLOW_SOURCES_TO=${AIRFLOW_SOURCES}}/airflow/www"
-    else
-        www_dir="$(python -m site --user-site)/airflow/www"
-    fi
-    pushd ${www_dir} || exit 1
-    set +e
-    yarn run "${BUILD_TYPE}" 2>/tmp/out-yarn-run.txt
-    res=$?
-    if [[ ${res} != 0 ]]; then
-        >&2 echo
-        >&2 echo "Error when running yarn run:"
-        >&2 echo
-        >&2 cat /tmp/out-yarn-run.txt && rm -rf /tmp/out-yarn-run.txt
-        exit 1
-    fi
-    rm -f /tmp/out-yarn-run.txt
-    set -e
-    local md5sum_file
-    md5sum_file="static/dist/sum.md5"
-    readonly md5sum_file
-    find package.json yarn.lock static/css static/js -type f | sort | xargs md5sum > "${md5sum_file}"
-    if [[ ${REMOVE_ARTIFACTS} == "true" ]]; then
-        echo
-        echo "${COLOR_BLUE}Removing generated node modules${COLOR_RESET}"
-        echo
-        rm -rf "${www_dir}/node_modules"
-        rm -vf "${www_dir}"/{package.json,yarn.lock,.eslintignore,.eslintrc,.stylelintignore,.stylelintrc,compile_assets.sh,webpack.config.js}
-    else
-        echo
-        echo "${COLOR_BLUE}Leaving generated node modules${COLOR_RESET}"
-        echo
-    fi
-    popd || exit 1
-}
-
-compile_www_assets
-EOF
-
 # The content below is automatically copied from scripts/docker/pip
 COPY <<"EOF" /pip
 #!/usr/bin/env bash
@@ -1120,7 +1025,6 @@ ARG DEV_APT_DEPS="\
      libssl-dev \
      locales  \
      lsb-release \
-     nodejs \
      openssh-client \
      sasl2-bin \
      software-properties-common \
@@ -1132,9 +1036,7 @@ ARG DEV_APT_DEPS="\
 
 ARG ADDITIONAL_DEV_APT_DEPS=""
 ARG DEV_APT_COMMAND="\
-    curl --silent --fail --location https://deb.nodesource.com/setup_14.x | \
-        bash -o pipefail -o errexit -o nolog - \
-    && curl --silent https://dl.yarnpkg.com/debian/pubkey.gpg | \
+    curl --silent https://dl.yarnpkg.com/debian/pubkey.gpg | \
     apt-key add - >/dev/null 2>&1\
     && echo 'deb https://dl.yarnpkg.com/debian/ stable main' > /etc/apt/sources.list.d/yarn.list"
 ARG ADDITIONAL_DEV_APT_COMMAND="echo"
@@ -1196,18 +1098,10 @@ ARG INSTALL_PROVIDERS_FROM_SOURCES="false"
 # But it also can be `.` from local installation or GitHub URL pointing to specific branch or tag
 # Of Airflow. Note That for local source installation you need to have local sources of
 # Airflow checked out together with the Dockerfile and AIRFLOW_SOURCES_FROM and AIRFLOW_SOURCES_TO
-# set to "." and "/opt/airflow" respectively. Similarly AIRFLOW_SOURCES_WWW_FROM/TO are set to right source
-# and destination
+# set to "." and "/opt/airflow" respectively.
 ARG AIRFLOW_INSTALLATION_METHOD="apache-airflow"
 # By default we do not upgrade to latest dependencies
 ARG UPGRADE_TO_NEWER_DEPENDENCIES="false"
-# By default we install latest airflow from PyPI so we do not need to copy sources of Airflow
-# www to compile the assets but in case of breeze/CI builds we use latest sources and we override those
-# those SOURCES_FROM/TO with "airflow/www" and "/opt/airflow/airflow/www" respectively.
-# This is to rebuild the assets only when any of the www sources change
-ARG AIRFLOW_SOURCES_WWW_FROM="Dockerfile"
-ARG AIRFLOW_SOURCES_WWW_TO="/Dockerfile"
-
 # By default we install latest airflow from PyPI so we do not need to copy sources of Airflow
 # but in case of breeze/CI builds we use latest sources and we override those
 # those SOURCES_FROM/TO with "." and "/opt/airflow" respectively
@@ -1303,26 +1197,8 @@ RUN bash /scripts/docker/install_pip_version.sh; \
         bash /scripts/docker/install_airflow_dependencies_from_branch_tip.sh; \
     fi
 
-COPY --from=scripts compile_www_assets.sh prepare_node_modules.sh /scripts/docker/
-COPY --chown=airflow:0 ${AIRFLOW_SOURCES_WWW_FROM} ${AIRFLOW_SOURCES_WWW_TO}
-
-# hadolint ignore=SC2086, SC2010
-RUN if [[ ${AIRFLOW_INSTALLATION_METHOD} == "." ]]; then \
-        # only prepare node modules and compile assets if the prod image is build from sources
-        # otherwise they are already compiled-in the package.
-        bash /scripts/docker/prepare_node_modules.sh; \
-        REMOVE_ARTIFACTS="true" BUILD_TYPE="prod" bash /scripts/docker/compile_www_assets.sh; \
-        # Copy generated dist folder (otherwise it will be overridden by the COPY step below)
-        mv -f /opt/airflow/airflow/www/static/dist /tmp/dist; \
-    fi;
-
 COPY --chown=airflow:0 ${AIRFLOW_SOURCES_FROM} ${AIRFLOW_SOURCES_TO}
 
-# Copy back the generated dist folder
-RUN if [[ ${AIRFLOW_INSTALLATION_METHOD} == "." ]]; then \
-        mv -f /tmp/dist /opt/airflow/airflow/www/static/dist; \
-    fi;
-
 # Add extra python dependencies
 ARG ADDITIONAL_PYTHON_DEPS=""
 
diff --git a/Dockerfile.ci b/Dockerfile.ci
index 4abaa4ad44..c06534357d 100644
--- a/Dockerfile.ci
+++ b/Dockerfile.ci
@@ -384,101 +384,6 @@ common::get_colors
 install_pipx_tools
 EOF
 
-# The content below is automatically copied from scripts/docker/prepare_node_modules.sh
-COPY <<"EOF" /prepare_node_modules.sh
-set -euo pipefail
-
-COLOR_BLUE=$'\e[34m'
-readonly COLOR_BLUE
-COLOR_RESET=$'\e[0m'
-readonly COLOR_RESET
-
-function prepare_node_modules() {
-    echo
-    echo "${COLOR_BLUE}Preparing node modules${COLOR_RESET}"
-    echo
-    local www_dir
-    if [[ ${AIRFLOW_INSTALLATION_METHOD=} == "." ]]; then
-        # In case we are building from sources in production image, we should build the assets
-        www_dir="${AIRFLOW_SOURCES_TO=${AIRFLOW_SOURCES}}/airflow/www"
-    else
-        www_dir="$(python -m site --user-site)/airflow/www"
-    fi
-    pushd ${www_dir} || exit 1
-    set +e
-    yarn install --frozen-lockfile --no-cache 2>/tmp/out-yarn-install.txt
-    local res=$?
-    if [[ ${res} != 0 ]]; then
-        >&2 echo
-        >&2 echo "Error when running yarn install:"
-        >&2 echo
-        >&2 cat /tmp/out-yarn-install.txt && rm -f /tmp/out-yarn-install.txt
-        exit 1
-    fi
-    rm -f /tmp/out-yarn-install.txt
-    popd || exit 1
-}
-
-prepare_node_modules
-EOF
-
-# The content below is automatically copied from scripts/docker/compile_www_assets.sh
-COPY <<"EOF" /compile_www_assets.sh
-set -euo pipefail
-
-BUILD_TYPE=${BUILD_TYPE="prod"}
-REMOVE_ARTIFACTS=${REMOVE_ARTIFACTS="true"}
-
-COLOR_BLUE=$'\e[34m'
-readonly COLOR_BLUE
-COLOR_RESET=$'\e[0m'
-readonly COLOR_RESET
-
-function compile_www_assets() {
-    echo
-    echo "${COLOR_BLUE}Compiling www assets: running yarn ${BUILD_TYPE}${COLOR_RESET}"
-    echo
-    local www_dir
-    if [[ ${AIRFLOW_INSTALLATION_METHOD=} == "." ]]; then
-        # In case we are building from sources in production image, we should build the assets
-        www_dir="${AIRFLOW_SOURCES_TO=${AIRFLOW_SOURCES}}/airflow/www"
-    else
-        www_dir="$(python -m site --user-site)/airflow/www"
-    fi
-    pushd ${www_dir} || exit 1
-    set +e
-    yarn run "${BUILD_TYPE}" 2>/tmp/out-yarn-run.txt
-    res=$?
-    if [[ ${res} != 0 ]]; then
-        >&2 echo
-        >&2 echo "Error when running yarn run:"
-        >&2 echo
-        >&2 cat /tmp/out-yarn-run.txt && rm -rf /tmp/out-yarn-run.txt
-        exit 1
-    fi
-    rm -f /tmp/out-yarn-run.txt
-    set -e
-    local md5sum_file
-    md5sum_file="static/dist/sum.md5"
-    readonly md5sum_file
-    find package.json yarn.lock static/css static/js -type f | sort | xargs md5sum > "${md5sum_file}"
-    if [[ ${REMOVE_ARTIFACTS} == "true" ]]; then
-        echo
-        echo "${COLOR_BLUE}Removing generated node modules${COLOR_RESET}"
-        echo
-        rm -rf "${www_dir}/node_modules"
-        rm -vf "${www_dir}"/{package.json,yarn.lock,.eslintignore,.eslintrc,.stylelintignore,.stylelintrc,compile_assets.sh,webpack.config.js}
-    else
-        echo
-        echo "${COLOR_BLUE}Leaving generated node modules${COLOR_RESET}"
-        echo
-    fi
-    popd || exit 1
-}
-
-compile_www_assets
-EOF
-
 # The content below is automatically copied from scripts/docker/install_airflow.sh
 COPY <<"EOF" /install_airflow.sh
 
@@ -663,11 +568,6 @@ if [[ ${SKIP_ENVIRONMENT_INITIALIZATION=} != "true" ]]; then
         echo
         echo "${COLOR_BLUE}Using airflow version from current sources${COLOR_RESET}"
         echo
-        if [[ -d "${AIRFLOW_SOURCES}/airflow/www/" ]]; then
-            pushd "${AIRFLOW_SOURCES}/airflow/www/" >/dev/null
-            ./ask_for_recompile_assets_if_needed.sh
-            popd >/dev/null
-        fi
         # Cleanup the logs, tmp when entering the environment
         sudo rm -rf "${AIRFLOW_SOURCES}"/logs/*
         sudo rm -rf "${AIRFLOW_SOURCES}"/tmp/*
@@ -795,6 +695,8 @@ if [[ ${SKIP_ENVIRONMENT_INITIALIZATION=} != "true" ]]; then
     touch /usr/lib/google-cloud-sdk/bin/gcloud
     ln -s -f /usr/bin/gcloud /usr/lib/google-cloud-sdk/bin/gcloud
 
+    in_container_fix_ownership
+
     if [[ ${SKIP_SSH_SETUP="false"} == "false" ]]; then
         # Set up ssh keys
         echo 'yes' | ssh-keygen -t rsa -C your_email@youremail.com -m PEM -P '' -f ~/.ssh/id_rsa \
@@ -1025,16 +927,6 @@ COPY <<"EOF" /entrypoint_exec.sh
 exec /bin/bash "${@}"
 EOF
 
-##############################################################################################
-# This is the www image where we keep all inlined files needed to build ui
-# It is copied separately to volume to speed up building and avoid cache miss on changed
-# file permissions.
-# We use PYTHON_BASE_IMAGE to make sure that the scripts are different for different platforms.
-##############################################################################################
-FROM ${PYTHON_BASE_IMAGE} as www
-COPY airflow/www/package.json airflow/www/yarn.lock airflow/www/webpack.config.js /
-COPY airflow/www/static/ /static
-
 FROM ${PYTHON_BASE_IMAGE} as main
 
 # Nolog bash flag is currently ignored - but you can replace it with other flags (for example
@@ -1060,8 +952,7 @@ RUN echo "Base image version: ${PYTHON_BASE_IMAGE}"
 
 ARG ADDITIONAL_DEV_APT_DEPS=""
 ARG DEV_APT_COMMAND="\
-    curl --silent --fail --location https://deb.nodesource.com/setup_14.x | bash - \
-    && curl --silent --fail https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - >/dev/null 2>&1 \
+    curl --silent --fail https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - >/dev/null 2>&1 \
     && echo 'deb https://dl.yarnpkg.com/debian/ stable main' > /etc/apt/sources.list.d/yarn.list"
 ARG ADDITIONAL_DEV_APT_COMMAND=""
 ARG ADDITIONAL_DEV_ENV_VARS=""
@@ -1104,7 +995,6 @@ RUN apt-get update \
            "${DISTRO_LIBENCHANT}" \
            locales  \
            netcat \
-           nodejs \
            rsync \
            sasl2-bin \
            sudo \
@@ -1307,25 +1197,6 @@ COPY --from=scripts install_pipx_tools.sh /scripts/docker/
 # dependencies installed in Airflow
 RUN bash /scripts/docker/install_pipx_tools.sh
 
-# Copy package.json and yarn.lock to install node modules
-# this way even if other static check files change, node modules will not need to be installed
-# we want to keep node_modules so we can do this step separately from compiling assets
-COPY --from=www package.json yarn.lock ${AIRFLOW_SOURCES}/airflow/www/
-COPY --from=scripts prepare_node_modules.sh /scripts/docker/
-
-# Package JS/css for production
-RUN bash /scripts/docker/prepare_node_modules.sh
-
-# Copy all the needed www/ for assets compilation. Done as two separate COPY
-# commands so as otherwise it copies the _contents_ of static/ in to www/
-COPY --from=www webpack.config.js ${AIRFLOW_SOURCES}/airflow/www/
-COPY --from=www static ${AIRFLOW_SOURCES}/airflow/www/static/
-COPY --from=scripts compile_www_assets.sh /scripts/docker/
-
-# Build artifacts without removing temporary artifacts (we will need them for incremental changes)
-# in build  mode
-RUN REMOVE_ARTIFACTS="false" BUILD_TYPE="build" bash /scripts/docker/compile_www_assets.sh
-
 # Airflow sources change frequently but dependency configuration won't change that often
 # We copy setup.py and other files needed to perform setup of dependencies
 # So in case setup.py changes we can install latest dependencies required.
diff --git a/STATIC_CODE_CHECKS.rst b/STATIC_CODE_CHECKS.rst
index b5b5e37ecb..cb05efa4e2 100644
--- a/STATIC_CODE_CHECKS.rst
+++ b/STATIC_CODE_CHECKS.rst
@@ -205,10 +205,16 @@ require Breeze Docker image to be build locally.
 +--------------------------------------------------------+------------------------------------------------------------------+---------+
 | check-system-tests-present                             | Check if system tests have required segments of code             |         |
 +--------------------------------------------------------+------------------------------------------------------------------+---------+
+| check-system-tests-tocs                                | Check that system tests is properly added                        |         |
++--------------------------------------------------------+------------------------------------------------------------------+---------+
 | check-xml                                              | Check XML files with xmllint                                     |         |
 +--------------------------------------------------------+------------------------------------------------------------------+---------+
 | codespell                                              | Run codespell to check for common misspellings in files          |         |
 +--------------------------------------------------------+------------------------------------------------------------------+---------+
+| compile-www-assets                                     | Compile www assets                                               |         |
++--------------------------------------------------------+------------------------------------------------------------------+---------+
+| create-missing-init-py-files-tests                     | Create missing init.py files in tests                            |         |
++--------------------------------------------------------+------------------------------------------------------------------+---------+
 | debug-statements                                       | Detect accidentally committed debug statements                   |         |
 +--------------------------------------------------------+------------------------------------------------------------------+---------+
 | detect-private-key                                     | Detect if private key is added to the repository                 |         |
@@ -246,7 +252,7 @@ require Breeze Docker image to be build locally.
 +--------------------------------------------------------+------------------------------------------------------------------+---------+
 | lint-helm-chart                                        | Lint Helm Chart                                                  |         |
 +--------------------------------------------------------+------------------------------------------------------------------+---------+
-| lint-javascript                                        | * ESLint against airflow/ui                                      | *       |
+| lint-javascript                                        | * ESLint against airflow/ui                                      |         |
 |                                                        | * ESLint against current UI JavaScript files                     |         |
 +--------------------------------------------------------+------------------------------------------------------------------+---------+
 | lint-json-schema                                       | * Lint JSON Schema files with JSON Schema                        |         |
diff --git a/airflow/www/ask_for_recompile_assets_if_needed.sh b/airflow/www/ask_for_recompile_assets_if_needed.sh
deleted file mode 100755
index 8342ae7631..0000000000
--- a/airflow/www/ask_for_recompile_assets_if_needed.sh
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/usr/bin/env bash
-# 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.
-set -e
-
-if [[ ${GITHUB_ACTIONS:="false"} == "true" ]]; then
-    echo
-    echo -e "${BLUE}Skipping asset compilation check in CI.${NO_COLOR}"
-    echo
-    exit 0
-fi
-
-cd "$( dirname "${BASH_SOURCE[0]}" )"
-
-MD5SUM_FILE="static/dist/sum.md5"
-readonly MD5SUM_FILE
-
-GREEN='\033[1;32m'
-YELLOW='\033[1;33m'
-NO_COLOR='\033[0m'
-
-md5sum=$(find package.json yarn.lock static/css static/js -type f | sort | xargs md5sum)
-old_md5sum=$(cat "${MD5SUM_FILE}" 2>/dev/null || true)
-if [[ ${old_md5sum} != "${md5sum}" ]]; then
-    if [[ ( ${START_AIRFLOW:="false"} == "true" || ${START_AIRFLOW} == "True" )  && ${USE_AIRFLOW_VERSION:=} == "" ]]; then
-        echo
-        echo -e "${YELLOW}Recompiling assets as they have changed and you need them for 'start_airflow' command${NO_COLOR}"
-        echo
-        ./compile_assets.sh
-    else
-        echo
-        echo -e "${YELLOW}WARNING: It seems that the generated assets files do not match the content of the sources.${NO_COLOR}"
-        echo "To recompile assets, run:"
-        echo ""
-        echo "   ./airflow/www/compile_assets.sh"
-        echo ""
-    fi
-else
-    echo
-    echo -e "${GREEN}No need for www assets recompilation.${NO_COLOR}"
-    echo
-fi
diff --git a/breeze-legacy b/breeze-legacy
index 0bb257494c..b03f5ae18f 100755
--- a/breeze-legacy
+++ b/breeze-legacy
@@ -136,14 +136,6 @@ function breeze::setup_default_breeze_constants() {
     AIRFLOW_SOURCES_TO=${AIRFLOW_SOURCES_TO:="/opt/airflow"}
     export AIRFLOW_SOURCES_TO
 
-    # Sources by default are installed from local sources when using breeze
-    AIRFLOW_SOURCES_WWW_FROM=${AIRFLOW_SOURCES_WWW_FROM:="./airflow/www"}
-    export AIRFLOW_SOURCES_WWW_FROM
-
-    # They are copied to /opt/airflow by default in breeze
-    AIRFLOW_SOURCES_WWW_TO=${AIRFLOW_SOURCES_WWW_TO:="/opt/airflow/airflow/www"}
-    export AIRFLOW_SOURCES_WWW_TO
-
     # Unlike in CI scripts, in breeze by default production image is installed from sources
     export AIRFLOW_INSTALLATION_METHOD="."
 
diff --git a/dev/breeze/src/airflow_breeze/commands/developer_commands.py b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
index 268dad01a8..404c2e2863 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
@@ -75,6 +75,7 @@ from airflow_breeze.utils.run_utils import (
     assert_pre_commit_installed,
     filter_out_none,
     run_command,
+    run_compile_www_assets,
 )
 from airflow_breeze.utils.visuals import ASCIIART, ASCIIART_STYLE, CHEATSHEET, CHEATSHEET_STYLE
 
@@ -83,6 +84,7 @@ DEVELOPER_COMMANDS = {
     "commands": [
         "shell",
         "start-airflow",
+        "compile-www-assets",
         "exec",
         "stop",
         "build-docs",
@@ -357,6 +359,8 @@ def start_airflow(
     extra_args: Tuple,
 ):
     """Enter breeze.py environment and starts all Airflow components in the tmux session."""
+    if use_airflow_version is None:
+        run_compile_www_assets(verbose=verbose, dry_run=dry_run)
     enter_shell(
         verbose=verbose,
         dry_run=dry_run,
@@ -546,6 +550,26 @@ def static_checks(
     sys.exit(static_checks_result.returncode)
 
 
+@main.command(
+    name="compile-www-assets",
+    help="Compiles www assets.",
+    context_settings=dict(
+        ignore_unknown_options=True,
+        allow_extra_args=True,
+    ),
+)
+@option_verbose
+@option_dry_run
+def compile_www_assets(
+    verbose: bool,
+    dry_run: bool,
+):
+    compile_www_assets_result = run_compile_www_assets(verbose=verbose, dry_run=dry_run)
+    if compile_www_assets_result.returncode != 0:
+        get_console().print("[warn]New assets were generated[/]")
+    sys.exit(0)
+
+
 @main.command(name="stop", help="Stop running breeze environment.")
 @option_verbose
 @option_dry_run
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 6a2c331e6d..87dae0c9a2 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -65,7 +65,7 @@ from airflow_breeze.utils.docker_command_utils import (
 )
 from airflow_breeze.utils.parallel import check_async_run_results
 from airflow_breeze.utils.python_versions import get_python_version_list
-from airflow_breeze.utils.run_utils import RunCommandResult, run_command
+from airflow_breeze.utils.run_utils import RunCommandResult, run_command, run_compile_www_assets
 
 RELEASE_MANAGEMENT_PARAMETERS = {
     "breeze prepare-airflow-package": [
@@ -234,6 +234,7 @@ def prepare_airflow_packages(
     debug: bool,
 ):
     perform_environment_checks(verbose=verbose)
+    run_compile_www_assets(verbose=verbose, dry_run=dry_run)
     shell_params = ShellParams(
         verbose=verbose,
         github_repository=github_repository,
diff --git a/dev/breeze/src/airflow_breeze/global_constants.py b/dev/breeze/src/airflow_breeze/global_constants.py
index 5ba825e71f..1b724974ae 100644
--- a/dev/breeze/src/airflow_breeze/global_constants.py
+++ b/dev/breeze/src/airflow_breeze/global_constants.py
@@ -225,18 +225,12 @@ FILES_FOR_REBUILD_CHECK = [
     'setup.cfg',
     'Dockerfile.ci',
     '.dockerignore',
-    'scripts/docker/compile_www_assets.sh',
     'scripts/docker/common.sh',
     'scripts/docker/install_additional_dependencies.sh',
     'scripts/docker/install_airflow.sh',
     'scripts/docker/install_airflow_dependencies_from_branch_tip.sh',
     'scripts/docker/install_from_docker_context_files.sh',
     'scripts/docker/install_mysql.sh',
-    'airflow/www/package.json',
-    'airflow/www/yarn.lock',
-    'airflow/www/webpack.config.js',
-    'airflow/ui/package.json',
-    'airflow/ui/yarn.lock',
 ]
 
 ENABLED_SYSTEMS = ""
@@ -265,8 +259,6 @@ MIN_DOCKER_COMPOSE_VERSION = "1.29.0"
 
 AIRFLOW_SOURCES_FROM = "."
 AIRFLOW_SOURCES_TO = "/opt/airflow"
-AIRFLOW_SOURCES_WWW_FROM = "./airflow/www"
-AIRFLOW_SOURCES_WWW_TO = "/opt/airflow/airflow/www"
 
 DEFAULT_EXTRAS = [
     # BEGINNING OF EXTRAS LIST UPDATED BY PRE COMMIT
diff --git a/dev/breeze/src/airflow_breeze/params/build_prod_params.py b/dev/breeze/src/airflow_breeze/params/build_prod_params.py
index 86a25b6999..9e30b95f69 100644
--- a/dev/breeze/src/airflow_breeze/params/build_prod_params.py
+++ b/dev/breeze/src/airflow_breeze/params/build_prod_params.py
@@ -26,8 +26,6 @@ from airflow_breeze.branch_defaults import AIRFLOW_BRANCH, DEFAULT_AIRFLOW_CONST
 from airflow_breeze.global_constants import (
     AIRFLOW_SOURCES_FROM,
     AIRFLOW_SOURCES_TO,
-    AIRFLOW_SOURCES_WWW_FROM,
-    AIRFLOW_SOURCES_WWW_TO,
     get_airflow_extras,
     get_airflow_version,
 )
@@ -73,10 +71,6 @@ class BuildProdParams(CommonBuildParams):
         build_args = []
         build_args.extend(
             [
-                "--build-arg",
-                "AIRFLOW_SOURCES_WWW_FROM=empty",
-                "--build-arg",
-                "AIRFLOW_SOURCES_WWW_TO=/empty",
                 "--build-arg",
                 "AIRFLOW_SOURCES_FROM=empty",
                 "--build-arg",
@@ -159,10 +153,6 @@ class BuildProdParams(CommonBuildParams):
                     "--build-arg",
                     f"AIRFLOW_SOURCES_TO={AIRFLOW_SOURCES_TO}",
                     "--build-arg",
-                    f"AIRFLOW_SOURCES_WWW_FROM={AIRFLOW_SOURCES_WWW_FROM}",
-                    "--build-arg",
-                    f"AIRFLOW_SOURCES_WWW_TO={AIRFLOW_SOURCES_WWW_TO}",
-                    "--build-arg",
                     f"AIRFLOW_INSTALLATION_METHOD={self.installation_method}",
                     "--build-arg",
                     f"AIRFLOW_CONSTRAINTS_REFERENCE={self.airflow_constraints_reference}",
diff --git a/dev/breeze/src/airflow_breeze/pre_commit_ids.py b/dev/breeze/src/airflow_breeze/pre_commit_ids.py
index a5f998ddef..b77f1931dc 100644
--- a/dev/breeze/src/airflow_breeze/pre_commit_ids.py
+++ b/dev/breeze/src/airflow_breeze/pre_commit_ids.py
@@ -59,8 +59,11 @@ PRE_COMMIT_LIST = [
     'check-setup-order',
     'check-start-date-not-used-in-defaults',
     'check-system-tests-present',
+    'check-system-tests-tocs',
     'check-xml',
     'codespell',
+    'compile-www-assets',
+    'create-missing-init-py-files-tests',
     'debug-statements',
     'detect-private-key',
     'doctoc',
diff --git a/dev/breeze/src/airflow_breeze/utils/run_utils.py b/dev/breeze/src/airflow_breeze/utils/run_utils.py
index 29268be8b3..36c5c6fa93 100644
--- a/dev/breeze/src/airflow_breeze/utils/run_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/run_utils.py
@@ -354,3 +354,34 @@ def get_runnable_ci_image(verbose: bool, dry_run: bool) -> str:
         instruction=f"breeze build-image --python {python_version}",
     )
     return airflow_image
+
+
+def run_compile_www_assets(
+    verbose: bool,
+    dry_run: bool,
+):
+    from airflow_breeze.utils.docker_command_utils import perform_environment_checks
+
+    assert_pre_commit_installed(verbose=verbose)
+    perform_environment_checks(verbose=verbose)
+    command_to_execute = [
+        sys.executable,
+        "-m",
+        "pre_commit",
+        'run',
+        "--hook-stage",
+        "manual",
+        'compile-www-assets',
+        '--all-files',
+    ]
+    env = os.environ.copy()
+    compile_www_assets_result = run_command(
+        command_to_execute,
+        verbose=verbose,
+        dry_run=dry_run,
+        check=False,
+        no_output_dump_on_exception=True,
+        text=True,
+        env=env,
+    )
+    return compile_www_assets_result
diff --git a/docs/docker-stack/build-arg-ref.rst b/docs/docker-stack/build-arg-ref.rst
index d38dc585fe..3b5745e1e3 100644
--- a/docs/docker-stack/build-arg-ref.rst
+++ b/docs/docker-stack/build-arg-ref.rst
@@ -208,16 +208,6 @@ You can see some examples of those in:
 |                                    |                                          | "/opt/airflow" when you install Airflow  |
 |                                    |                                          | from local sources.                      |
 +------------------------------------+------------------------------------------+------------------------------------------+
-| ``AIRFLOW_SOURCES_WWW_FROM``       | ``Dockerfile``                           | Sources of Airflow WWW files used for    |
-|                                    |                                          | asset compilation. Set it to             |
-|                                    |                                          | "./airflow/www" when                     |
-|                                    |                                          | you install Airflow from local sources   |
-+------------------------------------+------------------------------------------+------------------------------------------+
-| ``AIRFLOW_SOURCES_WWW_TO``         | ``/Dockerfile``                          | Target for Airflow files used for        |
-|                                    |                                          | asset compilation. Set it to             |
-|                                    |                                          | "/opt/airflow/airflow/www" when          |
-|                                    |                                          | you install Airflow from local sources.  |
-+------------------------------------+------------------------------------------+------------------------------------------+
 | ``AIRFLOW_VERSION_SPECIFICATION``  |                                          | Optional - might be used for using limit |
 |                                    |                                          | for Airflow version installation - for   |
 |                                    |                                          | example ``<2.0.2`` for automated builds. |
diff --git a/images/breeze/output-commands-hash.txt b/images/breeze/output-commands-hash.txt
index df2aa32c0a..a0ca87ce90 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -8,6 +8,7 @@ build-image:b00ae014f9c45c116e8dd0ea72b61d19
 build-prod-image:6c614f9c76e776912dc1cf4506d2b6f5
 cleanup:9a94bd1063296ea86e895f671db0b330
 command-hash-export:83bc6a4a8c60b62da3d0f00e81d2c3ea
+compile-www-assets:5f0d8af0a2a074f2ee577604662598c8
 config:92653afc11889e1b78e3a2e38f41107f
 docker-compose-tests:8ae3b6211fd31db81a750d1c6b96ec3d
 exec:e4329909b8b2a610fa4fad5116c4b896
@@ -28,7 +29,7 @@ self-upgrade:b5437c0a1a91533a11ee9d0a9692369c
 setup-autocomplete:355b72dee171c2fcba46fc90ac7c97b0
 shell:ab7955da71048b3a695485c152d06786
 start-airflow:30caa077555bef44e5bdf76dfeca092c
-static-checks:69bbef8c50c452faf58403d7a06f34b6
+static-checks:0166657e80e91b83e1cf69b022c4e864
 stop:8ebd8a42f1003495d37b884de5ac7ce6
 tests:e39111ecbd33a65ababb3cbfbac2b069
 verify-image:a6b3c70957aea96a5d4d261f23359a2d
diff --git a/images/breeze/output-commands.svg b/images/breeze/output-commands.svg
index 2e21ac9804..77e487bfd1 100644
--- a/images/breeze/output-commands.svg
+++ b/images/breeze/output-commands.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 2197.2" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 2221.6" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -19,393 +19,397 @@
         font-weight: 700;
     }
 
-    .terminal-460130354-matrix {
+    .terminal-4069008649-matrix {
         font-family: Fira Code, monospace;
         font-size: 20px;
         line-height: 24.4px;
         font-variant-east-asian: full-width;
     }
 
-    .terminal-460130354-title {
+    .terminal-4069008649-title {
         font-size: 18px;
         font-weight: bold;
         font-family: arial;
     }
 
-    .terminal-460130354-r1 { fill: #c5c8c6;font-weight: bold }
-.terminal-460130354-r2 { fill: #c5c8c6 }
-.terminal-460130354-r3 { fill: #d0b344;font-weight: bold }
-.terminal-460130354-r4 { fill: #868887 }
-.terminal-460130354-r5 { fill: #68a0b3;font-weight: bold }
-.terminal-460130354-r6 { fill: #98a84b;font-weight: bold }
-.terminal-460130354-r7 { fill: #8d7b39 }
+    .terminal-4069008649-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-4069008649-r2 { fill: #c5c8c6 }
+.terminal-4069008649-r3 { fill: #d0b344;font-weight: bold }
+.terminal-4069008649-r4 { fill: #868887 }
+.terminal-4069008649-r5 { fill: #68a0b3;font-weight: bold }
+.terminal-4069008649-r6 { fill: #98a84b;font-weight: bold }
+.terminal-4069008649-r7 { fill: #8d7b39 }
     </style>
 
     <defs>
-    <clipPath id="terminal-460130354-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="2146.2" />
+    <clipPath id="terminal-4069008649-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="2170.6" />
     </clipPath>
-    <clipPath id="terminal-460130354-line-0">
+    <clipPath id="terminal-4069008649-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-1">
+<clipPath id="terminal-4069008649-line-1">
     <rect x="0" y="25.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-2">
+<clipPath id="terminal-4069008649-line-2">
     <rect x="0" y="50.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-3">
+<clipPath id="terminal-4069008649-line-3">
     <rect x="0" y="74.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-4">
+<clipPath id="terminal-4069008649-line-4">
     <rect x="0" y="99.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-5">
+<clipPath id="terminal-4069008649-line-5">
     <rect x="0" y="123.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-6">
+<clipPath id="terminal-4069008649-line-6">
     <rect x="0" y="147.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-7">
+<clipPath id="terminal-4069008649-line-7">
     <rect x="0" y="172.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-8">
+<clipPath id="terminal-4069008649-line-8">
     <rect x="0" y="196.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-9">
+<clipPath id="terminal-4069008649-line-9">
     <rect x="0" y="221.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-10">
+<clipPath id="terminal-4069008649-line-10">
     <rect x="0" y="245.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-11">
+<clipPath id="terminal-4069008649-line-11">
     <rect x="0" y="269.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-12">
+<clipPath id="terminal-4069008649-line-12">
     <rect x="0" y="294.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-13">
+<clipPath id="terminal-4069008649-line-13">
     <rect x="0" y="318.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-14">
+<clipPath id="terminal-4069008649-line-14">
     <rect x="0" y="343.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-15">
+<clipPath id="terminal-4069008649-line-15">
     <rect x="0" y="367.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-16">
+<clipPath id="terminal-4069008649-line-16">
     <rect x="0" y="391.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-17">
+<clipPath id="terminal-4069008649-line-17">
     <rect x="0" y="416.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-18">
+<clipPath id="terminal-4069008649-line-18">
     <rect x="0" y="440.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-19">
+<clipPath id="terminal-4069008649-line-19">
     <rect x="0" y="465.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-20">
+<clipPath id="terminal-4069008649-line-20">
     <rect x="0" y="489.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-21">
+<clipPath id="terminal-4069008649-line-21">
     <rect x="0" y="513.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-22">
+<clipPath id="terminal-4069008649-line-22">
     <rect x="0" y="538.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-23">
+<clipPath id="terminal-4069008649-line-23">
     <rect x="0" y="562.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-24">
+<clipPath id="terminal-4069008649-line-24">
     <rect x="0" y="587.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-25">
+<clipPath id="terminal-4069008649-line-25">
     <rect x="0" y="611.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-26">
+<clipPath id="terminal-4069008649-line-26">
     <rect x="0" y="635.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-27">
+<clipPath id="terminal-4069008649-line-27">
     <rect x="0" y="660.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-28">
+<clipPath id="terminal-4069008649-line-28">
     <rect x="0" y="684.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-29">
+<clipPath id="terminal-4069008649-line-29">
     <rect x="0" y="709.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-30">
+<clipPath id="terminal-4069008649-line-30">
     <rect x="0" y="733.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-31">
+<clipPath id="terminal-4069008649-line-31">
     <rect x="0" y="757.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-32">
+<clipPath id="terminal-4069008649-line-32">
     <rect x="0" y="782.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-33">
+<clipPath id="terminal-4069008649-line-33">
     <rect x="0" y="806.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-34">
+<clipPath id="terminal-4069008649-line-34">
     <rect x="0" y="831.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-35">
+<clipPath id="terminal-4069008649-line-35">
     <rect x="0" y="855.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-36">
+<clipPath id="terminal-4069008649-line-36">
     <rect x="0" y="879.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-37">
+<clipPath id="terminal-4069008649-line-37">
     <rect x="0" y="904.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-38">
+<clipPath id="terminal-4069008649-line-38">
     <rect x="0" y="928.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-39">
+<clipPath id="terminal-4069008649-line-39">
     <rect x="0" y="953.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-40">
+<clipPath id="terminal-4069008649-line-40">
     <rect x="0" y="977.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-41">
+<clipPath id="terminal-4069008649-line-41">
     <rect x="0" y="1001.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-42">
+<clipPath id="terminal-4069008649-line-42">
     <rect x="0" y="1026.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-43">
+<clipPath id="terminal-4069008649-line-43">
     <rect x="0" y="1050.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-44">
+<clipPath id="terminal-4069008649-line-44">
     <rect x="0" y="1075.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-45">
+<clipPath id="terminal-4069008649-line-45">
     <rect x="0" y="1099.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-46">
+<clipPath id="terminal-4069008649-line-46">
     <rect x="0" y="1123.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-47">
+<clipPath id="terminal-4069008649-line-47">
     <rect x="0" y="1148.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-48">
+<clipPath id="terminal-4069008649-line-48">
     <rect x="0" y="1172.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-49">
+<clipPath id="terminal-4069008649-line-49">
     <rect x="0" y="1197.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-50">
+<clipPath id="terminal-4069008649-line-50">
     <rect x="0" y="1221.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-51">
+<clipPath id="terminal-4069008649-line-51">
     <rect x="0" y="1245.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-52">
+<clipPath id="terminal-4069008649-line-52">
     <rect x="0" y="1270.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-53">
+<clipPath id="terminal-4069008649-line-53">
     <rect x="0" y="1294.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-54">
+<clipPath id="terminal-4069008649-line-54">
     <rect x="0" y="1319.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-55">
+<clipPath id="terminal-4069008649-line-55">
     <rect x="0" y="1343.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-56">
+<clipPath id="terminal-4069008649-line-56">
     <rect x="0" y="1367.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-57">
+<clipPath id="terminal-4069008649-line-57">
     <rect x="0" y="1392.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-58">
+<clipPath id="terminal-4069008649-line-58">
     <rect x="0" y="1416.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-59">
+<clipPath id="terminal-4069008649-line-59">
     <rect x="0" y="1441.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-60">
+<clipPath id="terminal-4069008649-line-60">
     <rect x="0" y="1465.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-61">
+<clipPath id="terminal-4069008649-line-61">
     <rect x="0" y="1489.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-62">
+<clipPath id="terminal-4069008649-line-62">
     <rect x="0" y="1514.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-63">
+<clipPath id="terminal-4069008649-line-63">
     <rect x="0" y="1538.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-64">
+<clipPath id="terminal-4069008649-line-64">
     <rect x="0" y="1563.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-65">
+<clipPath id="terminal-4069008649-line-65">
     <rect x="0" y="1587.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-66">
+<clipPath id="terminal-4069008649-line-66">
     <rect x="0" y="1611.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-67">
+<clipPath id="terminal-4069008649-line-67">
     <rect x="0" y="1636.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-68">
+<clipPath id="terminal-4069008649-line-68">
     <rect x="0" y="1660.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-69">
+<clipPath id="terminal-4069008649-line-69">
     <rect x="0" y="1685.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-70">
+<clipPath id="terminal-4069008649-line-70">
     <rect x="0" y="1709.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-71">
+<clipPath id="terminal-4069008649-line-71">
     <rect x="0" y="1733.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-72">
+<clipPath id="terminal-4069008649-line-72">
     <rect x="0" y="1758.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-73">
+<clipPath id="terminal-4069008649-line-73">
     <rect x="0" y="1782.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-74">
+<clipPath id="terminal-4069008649-line-74">
     <rect x="0" y="1807.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-75">
+<clipPath id="terminal-4069008649-line-75">
     <rect x="0" y="1831.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-76">
+<clipPath id="terminal-4069008649-line-76">
     <rect x="0" y="1855.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-77">
+<clipPath id="terminal-4069008649-line-77">
     <rect x="0" y="1880.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-78">
+<clipPath id="terminal-4069008649-line-78">
     <rect x="0" y="1904.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-79">
+<clipPath id="terminal-4069008649-line-79">
     <rect x="0" y="1929.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-80">
+<clipPath id="terminal-4069008649-line-80">
     <rect x="0" y="1953.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-81">
+<clipPath id="terminal-4069008649-line-81">
     <rect x="0" y="1977.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-82">
+<clipPath id="terminal-4069008649-line-82">
     <rect x="0" y="2002.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-83">
+<clipPath id="terminal-4069008649-line-83">
     <rect x="0" y="2026.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-84">
+<clipPath id="terminal-4069008649-line-84">
     <rect x="0" y="2051.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-85">
+<clipPath id="terminal-4069008649-line-85">
     <rect x="0" y="2075.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-460130354-line-86">
+<clipPath id="terminal-4069008649-line-86">
     <rect x="0" y="2099.9" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="terminal-4069008649-line-87">
+    <rect x="0" y="2124.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="2195.2" rx="8"/><text class="terminal-460130354-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Breeze&#160;commands</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="2219.6" rx="8"/><text class="terminal-4069008649-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Breeze&#160;commands</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
             <circle cx="44" cy="0" r="7" fill="#28c840"/>
             </g>
         
-    <g transform="translate(9, 41)" clip-path="url(#terminal-460130354-clip-terminal)">
+    <g transform="translate(9, 41)" clip-path="url(#terminal-4069008649-clip-terminal)">
     
-    <g class="terminal-460130354-matrix">
-    <text class="terminal-460130354-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-460130354-line-0)">
-</text><text class="terminal-460130354-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-460130354-line-1)">Usage:&#160;</text><text class="terminal-460130354-r1" x="97.6" y="44.4" textLength="414.8" clip-path="url(#terminal-460130354-line-1)">breeze&#160;[OPTIONS]&#160;COMMAND&#160;[ARGS]...</text><text class="terminal-460130354-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-460130354-line-1)">
-</text><text class="terminal-460130354-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-460130354-line-2)">
-</text><text class="terminal-460130354-r4" x="0" y="93.2" textLength="24.4" clip-path="url(#terminal-460130354-line-3)">╭─</text><text class="terminal-460130354-r4" x="24.4" y="93.2" textLength="1415.2" clip-path="url(#terminal-460130354-line-3)">&#160;Basic&#160;flags&#160;for&#160;the&#160;default&#160;(shell)&#160;command&#160;───────────────────────────────────────────────────────────────────────</text><text class="terminal-460130354-r4" x="1439.6" y="93.2" textLength="24.4" clip-pat [...]
-</text><text class="terminal-460130354-r4" x="0" y="117.6" textLength="12.2" clip-path="url(#terminal-460130354-line-4)">│</text><text class="terminal-460130354-r5" x="24.4" y="117.6" textLength="12.2" clip-path="url(#terminal-460130354-line-4)">-</text><text class="terminal-460130354-r5" x="36.6" y="117.6" textLength="85.4" clip-path="url(#terminal-460130354-line-4)">-python</text><text class="terminal-460130354-r6" x="305" y="117.6" textLength="24.4" clip-path="url(#terminal-460130354- [...]
-</text><text class="terminal-460130354-r4" x="0" y="142" textLength="12.2" clip-path="url(#terminal-460130354-line-5)">│</text><text class="terminal-460130354-r4" x="353.8" y="142" textLength="732" clip-path="url(#terminal-460130354-line-5)">[default:&#160;3.7]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
-</text><text class="terminal-460130354-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-460130354-line-6)">│</text><text class="terminal-460130354-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-460130354-line-6)">-</text><text class="terminal-460130354-r5" x="36.6" y="166.4" textLength="97.6" clip-path="url(#terminal-460130354-line-6)">-backend</text><text class="terminal-460130354-r6" x="305" y="166.4" textLength="24.4" clip-path="url(#terminal-460130354 [...]
-</text><text class="terminal-460130354-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-460130354-line-7)">│</text><text class="terminal-460130354-r5" x="24.4" y="190.8" textLength="12.2" clip-path="url(#terminal-460130354-line-7)">-</text><text class="terminal-460130354-r5" x="36.6" y="190.8" textLength="109.8" clip-path="url(#terminal-460130354-line-7)">-postgres</text><text class="terminal-460130354-r5" x="146.4" y="190.8" textLength="97.6" clip-path="url(#terminal-46013 [...]
-</text><text class="terminal-460130354-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-460130354-line-8)">│</text><text class="terminal-460130354-r5" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-460130354-line-8)">-</text><text class="terminal-460130354-r5" x="36.6" y="215.2" textLength="73.2" clip-path="url(#terminal-460130354-line-8)">-mysql</text><text class="terminal-460130354-r5" x="109.8" y="215.2" textLength="97.6" clip-path="url(#terminal-460130354 [...]
-</text><text class="terminal-460130354-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-460130354-line-9)">│</text><text class="terminal-460130354-r5" x="24.4" y="239.6" textLength="12.2" clip-path="url(#terminal-460130354-line-9)">-</text><text class="terminal-460130354-r5" x="36.6" y="239.6" textLength="73.2" clip-path="url(#terminal-460130354-line-9)">-mssql</text><text class="terminal-460130354-r5" x="109.8" y="239.6" textLength="97.6" clip-path="url(#terminal-460130354 [...]
-</text><text class="terminal-460130354-r4" x="0" y="264" textLength="12.2" clip-path="url(#terminal-460130354-line-10)">│</text><text class="terminal-460130354-r5" x="24.4" y="264" textLength="12.2" clip-path="url(#terminal-460130354-line-10)">-</text><text class="terminal-460130354-r5" x="36.6" y="264" textLength="146.4" clip-path="url(#terminal-460130354-line-10)">-integration</text><text class="terminal-460130354-r2" x="353.8" y="264" textLength="1085.8" clip-path="url(#terminal-46013 [...]
-</text><text class="terminal-460130354-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-460130354-line-11)">│</text><text class="terminal-460130354-r7" x="353.8" y="288.4" textLength="1085.8" clip-path="url(#terminal-460130354-line-11)">(cassandra&#160;|&#160;kerberos&#160;|&#160;mongo&#160;|&#160;openldap&#160;|&#160;pinot&#160;|&#160;rabbitmq&#160;|&#160;redis&#160;|&#160;statsd&#160;|&#160;trino&#160;|&#160;&#160;&#160;</text><text class="terminal-460130354-r4" x="1451.8 [...]
-</text><text class="terminal-460130354-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-460130354-line-12)">│</text><text class="terminal-460130354-r7" x="353.8" y="312.8" textLength="1085.8" clip-path="url(#terminal-460130354-line-12)">all)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
-</text><text class="terminal-460130354-r4" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-460130354-line-13)">│</text><text class="terminal-460130354-r5" x="24.4" y="337.2" textLength="12.2" clip-path="url(#terminal-460130354-line-13)">-</text><text class="terminal-460130354-r5" x="36.6" y="337.2" textLength="97.6" clip-path="url(#terminal-460130354-line-13)">-forward</text><text class="terminal-460130354-r5" x="134.2" y="337.2" textLength="146.4" clip-path="url(#terminal-460 [...]
-</text><text class="terminal-460130354-r4" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-460130354-line-14)">│</text><text class="terminal-460130354-r5" x="24.4" y="361.6" textLength="12.2" clip-path="url(#terminal-460130354-line-14)">-</text><text class="terminal-460130354-r5" x="36.6" y="361.6" textLength="36.6" clip-path="url(#terminal-460130354-line-14)">-db</text><text class="terminal-460130354-r5" x="73.2" y="361.6" textLength="73.2" clip-path="url(#terminal-460130354- [...]
-</text><text class="terminal-460130354-r4" x="0" y="386" textLength="1464" clip-path="url(#terminal-460130354-line-15)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-460130354-r2" x="1464" y="386" textLength="12.2" clip-path="url(#terminal-460130354-line-15)">
-</text><text class="terminal-460130354-r4" x="0" y="410.4" textLength="24.4" clip-path="url(#terminal-460130354-line-16)">╭─</text><text class="terminal-460130354-r4" x="24.4" y="410.4" textLength="1415.2" clip-path="url(#terminal-460130354-line-16)">&#160;Advanced&#160;flags&#160;for&#160;the&#160;default&#160;(shell)&#160;command&#160;────────────────────────────────────────────────────────────────────</text><text class="terminal-460130354-r4" x="1439.6" y="410.4" textLength="24.4" cli [...]
-</text><text class="terminal-460130354-r4" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-460130354-line-17)">│</text><text class="terminal-460130354-r5" x="24.4" y="434.8" textLength="12.2" clip-path="url(#terminal-460130354-line-17)">-</text><text class="terminal-460130354-r5" x="36.6" y="434.8" textLength="48.8" clip-path="url(#terminal-460130354-line-17)">-use</text><text class="terminal-460130354-r5" x="85.4" y="434.8" textLength="195.2" clip-path="url(#terminal-46013035 [...]
-</text><text class="terminal-460130354-r4" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-460130354-line-18)">│</text><text class="terminal-460130354-r2" x="366" y="459.2" textLength="1073.6" clip-path="url(#terminal-460130354-line-18)">`sdist`&#160;if&#160;Airflow&#160;should&#160;be&#160;removed,&#160;installed&#160;from&#160;wheel&#160;packages&#160;or&#160;sdist&#160;packages&#160;&#160;&#160;</text><text class="terminal-460130354-r4" x="1451.8" y="459.2" textLength="12.2 [...]
-</text><text class="terminal-460130354-r4" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-460130354-line-19)">│</text><text class="terminal-460130354-r2" x="366" y="483.6" textLength="573.4" clip-path="url(#terminal-460130354-line-19)">available&#160;in&#160;dist&#160;folder&#160;respectively.&#160;Implies&#160;</text><text class="terminal-460130354-r5" x="939.4" y="483.6" textLength="12.2" clip-path="url(#terminal-460130354-line-19)">-</text><text class="terminal-460130354-r [...]
-</text><text class="terminal-460130354-r4" x="0" y="508" textLength="12.2" clip-path="url(#terminal-460130354-line-20)">│</text><text class="terminal-460130354-r7" x="366" y="508" textLength="1073.6" clip-path="url(#terminal-460130354-line-20)">(none&#160;|&#160;wheel&#160;|&#160;sdist&#160;|&#160;&lt;airflow_version&gt;)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="terminal-460130354-r4" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-460130354-line-21)">│</text><text class="terminal-460130354-r5" x="24.4" y="532.4" textLength="12.2" clip-path="url(#terminal-460130354-line-21)">-</text><text class="terminal-460130354-r5" x="36.6" y="532.4" textLength="97.6" clip-path="url(#terminal-460130354-line-21)">-airflow</text><text class="terminal-460130354-r5" x="134.2" y="532.4" textLength="85.4" clip-path="url(#terminal-4601 [...]
-</text><text class="terminal-460130354-r4" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-460130354-line-22)">│</text><text class="terminal-460130354-r5" x="24.4" y="556.8" textLength="12.2" clip-path="url(#terminal-460130354-line-22)">-</text><text class="terminal-460130354-r5" x="36.6" y="556.8" textLength="48.8" clip-path="url(#terminal-460130354-line-22)">-use</text><text class="terminal-460130354-r5" x="85.4" y="556.8" textLength="231.8" clip-path="url(#terminal-46013035 [...]
-</text><text class="terminal-460130354-r4" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-460130354-line-23)">│</text><text class="terminal-460130354-r2" x="366" y="581.2" textLength="1073.6" clip-path="url(#terminal-460130354-line-23)">entering&#160;breeze.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
-</text><text class="terminal-460130354-r4" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-460130354-line-24)">│</text><text class="terminal-460130354-r5" x="24.4" y="605.6" textLength="12.2" clip-path="url(#terminal-460130354-line-24)">-</text><text class="terminal-460130354-r5" x="36.6" y="605.6" textLength="97.6" clip-path="url(#terminal-460130354-line-24)">-package</text><text class="terminal-460130354-r5" x="134.2" y="605.6" textLength="85.4" clip-path="url(#terminal-4601 [...]
-</text><text class="terminal-460130354-r4" x="0" y="630" textLength="12.2" clip-path="url(#terminal-460130354-line-25)">│</text><text class="terminal-460130354-r5" x="24.4" y="630" textLength="12.2" clip-path="url(#terminal-460130354-line-25)">-</text><text class="terminal-460130354-r5" x="36.6" y="630" textLength="73.2" clip-path="url(#terminal-460130354-line-25)">-force</text><text class="terminal-460130354-r5" x="109.8" y="630" textLength="73.2" clip-path="url(#terminal-460130354-line [...]
-</text><text class="terminal-460130354-r4" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-460130354-line-26)">│</text><text class="terminal-460130354-r5" x="24.4" y="654.4" textLength="12.2" clip-path="url(#terminal-460130354-line-26)">-</text><text class="terminal-460130354-r5" x="36.6" y="654.4" textLength="73.2" clip-path="url(#terminal-460130354-line-26)">-mount</text><text class="terminal-460130354-r5" x="109.8" y="654.4" textLength="97.6" clip-path="url(#terminal-460130 [...]
-</text><text class="terminal-460130354-r4" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-460130354-line-27)">│</text><text class="terminal-460130354-r2" x="366" y="678.8" textLength="1073.6" clip-path="url(#terminal-460130354-line-27)">selected).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
-</text><text class="terminal-460130354-r4" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-460130354-line-28)">│</text><text class="terminal-460130354-r7" x="366" y="703.2" textLength="1073.6" clip-path="url(#terminal-460130354-line-28)">(selected&#160;|&#160;all&#160;|&#160;skip&#160;|&#160;remove)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="terminal-460130354-r4" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-460130354-line-29)">│</text><text class="terminal-460130354-r4" x="366" y="727.6" textLength="1073.6" clip-path="url(#terminal-460130354-line-29)">[default:&#160;selected]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
-</text><text class="terminal-460130354-r4" x="0" y="752" textLength="12.2" clip-path="url(#terminal-460130354-line-30)">│</text><text class="terminal-460130354-r5" x="24.4" y="752" textLength="12.2" clip-path="url(#terminal-460130354-line-30)">-</text><text class="terminal-460130354-r5" x="36.6" y="752" textLength="85.4" clip-path="url(#terminal-460130354-line-30)">-debian</text><text class="terminal-460130354-r5" x="122" y="752" textLength="97.6" clip-path="url(#terminal-460130354-line- [...]
-</text><text class="terminal-460130354-r4" x="0" y="776.4" textLength="1464" clip-path="url(#terminal-460130354-line-31)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-460130354-r2" x="1464" y="776.4" textLength="12.2" clip-path="url(#terminal-460130354-line-31)">
-</text><text class="terminal-460130354-r4" x="0" y="800.8" textLength="24.4" clip-path="url(#terminal-460130354-line-32)">╭─</text><text class="terminal-460130354-r4" x="24.4" y="800.8" textLength="1415.2" clip-path="url(#terminal-460130354-line-32)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-460130354-r4" x="1439.6" y="800.8" textLength="24.4" clip-path="url(#terminal-46013035 [...]
-</text><text class="terminal-460130354-r4" x="0" y="825.2" textLength="12.2" clip-path="url(#terminal-460130354-line-33)">│</text><text class="terminal-460130354-r5" x="24.4" y="825.2" textLength="12.2" clip-path="url(#terminal-460130354-line-33)">-</text><text class="terminal-460130354-r5" x="36.6" y="825.2" textLength="97.6" clip-path="url(#terminal-460130354-line-33)">-verbose</text><text class="terminal-460130354-r6" x="280.6" y="825.2" textLength="24.4" clip-path="url(#terminal-4601 [...]
-</text><text class="terminal-460130354-r4" x="0" y="849.6" textLength="12.2" clip-path="url(#terminal-460130354-line-34)">│</text><text class="terminal-460130354-r5" x="24.4" y="849.6" textLength="12.2" clip-path="url(#terminal-460130354-line-34)">-</text><text class="terminal-460130354-r5" x="36.6" y="849.6" textLength="48.8" clip-path="url(#terminal-460130354-line-34)">-dry</text><text class="terminal-460130354-r5" x="85.4" y="849.6" textLength="48.8" clip-path="url(#terminal-460130354 [...]
-</text><text class="terminal-460130354-r4" x="0" y="874" textLength="12.2" clip-path="url(#terminal-460130354-line-35)">│</text><text class="terminal-460130354-r5" x="24.4" y="874" textLength="12.2" clip-path="url(#terminal-460130354-line-35)">-</text><text class="terminal-460130354-r5" x="36.6" y="874" textLength="85.4" clip-path="url(#terminal-460130354-line-35)">-github</text><text class="terminal-460130354-r5" x="122" y="874" textLength="134.2" clip-path="url(#terminal-460130354-line [...]
-</text><text class="terminal-460130354-r4" x="0" y="898.4" textLength="12.2" clip-path="url(#terminal-460130354-line-36)">│</text><text class="terminal-460130354-r5" x="24.4" y="898.4" textLength="12.2" clip-path="url(#terminal-460130354-line-36)">-</text><text class="terminal-460130354-r5" x="36.6" y="898.4" textLength="85.4" clip-path="url(#terminal-460130354-line-36)">-answer</text><text class="terminal-460130354-r6" x="280.6" y="898.4" textLength="24.4" clip-path="url(#terminal-46013 [...]
-</text><text class="terminal-460130354-r4" x="0" y="922.8" textLength="12.2" clip-path="url(#terminal-460130354-line-37)">│</text><text class="terminal-460130354-r5" x="24.4" y="922.8" textLength="12.2" clip-path="url(#terminal-460130354-line-37)">-</text><text class="terminal-460130354-r5" x="36.6" y="922.8" textLength="61" clip-path="url(#terminal-460130354-line-37)">-help</text><text class="terminal-460130354-r6" x="280.6" y="922.8" textLength="24.4" clip-path="url(#terminal-460130354 [...]
-</text><text class="terminal-460130354-r4" x="0" y="947.2" textLength="1464" clip-path="url(#terminal-460130354-line-38)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-460130354-r2" x="1464" y="947.2" textLength="12.2" clip-path="url(#terminal-460130354-line-38)">
-</text><text class="terminal-460130354-r4" x="0" y="971.6" textLength="24.4" clip-path="url(#terminal-460130354-line-39)">╭─</text><text class="terminal-460130354-r4" x="24.4" y="971.6" textLength="1415.2" clip-path="url(#terminal-460130354-line-39)">&#160;Developer&#160;tools&#160;───────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-460130354-r4" x="1439.6" y="971.6" textLength="24.4" clip-path="url(#terminal-460 [...]
-</text><text class="terminal-460130354-r4" x="0" y="996" textLength="12.2" clip-path="url(#terminal-460130354-line-40)">│</text><text class="terminal-460130354-r5" x="24.4" y="996" textLength="183" clip-path="url(#terminal-460130354-line-40)">shell&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="231.8" y="996" textLength="1207.8" clip-path="url(#terminal-460130354-line-40)">Enter&#160;breeze.py&#160;environment.&#160;this&#160;is&# [...]
-</text><text class="terminal-460130354-r4" x="0" y="1020.4" textLength="12.2" clip-path="url(#terminal-460130354-line-41)">│</text><text class="terminal-460130354-r5" x="24.4" y="1020.4" textLength="183" clip-path="url(#terminal-460130354-line-41)">start-airflow&#160;&#160;</text><text class="terminal-460130354-r2" x="231.8" y="1020.4" textLength="1207.8" clip-path="url(#terminal-460130354-line-41)">Enter&#160;breeze.py&#160;environment&#160;and&#160;starts&#160;all&#160;Airflow&#160;com [...]
-</text><text class="terminal-460130354-r4" x="0" y="1044.8" textLength="12.2" clip-path="url(#terminal-460130354-line-42)">│</text><text class="terminal-460130354-r5" x="24.4" y="1044.8" textLength="183" clip-path="url(#terminal-460130354-line-42)">exec&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="231.8" y="1044.8" textLength="1207.8" clip-path="url(#terminal-460130354-line-42)">Joins&#160;the&#160;interactive&#160;shell&# [...]
-</text><text class="terminal-460130354-r4" x="0" y="1069.2" textLength="12.2" clip-path="url(#terminal-460130354-line-43)">│</text><text class="terminal-460130354-r5" x="24.4" y="1069.2" textLength="183" clip-path="url(#terminal-460130354-line-43)">stop&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="231.8" y="1069.2" textLength="1207.8" clip-path="url(#terminal-460130354-line-43)">Stop&#160;running&#160;breeze&#160;environme [...]
-</text><text class="terminal-460130354-r4" x="0" y="1093.6" textLength="12.2" clip-path="url(#terminal-460130354-line-44)">│</text><text class="terminal-460130354-r5" x="24.4" y="1093.6" textLength="183" clip-path="url(#terminal-460130354-line-44)">build-docs&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="231.8" y="1093.6" textLength="1207.8" clip-path="url(#terminal-460130354-line-44)">Build&#160;documentation&#160;in&#160;the&#160;container.&#160;&#160;&#160 [...]
-</text><text class="terminal-460130354-r4" x="0" y="1118" textLength="12.2" clip-path="url(#terminal-460130354-line-45)">│</text><text class="terminal-460130354-r5" x="24.4" y="1118" textLength="183" clip-path="url(#terminal-460130354-line-45)">static-checks&#160;&#160;</text><text class="terminal-460130354-r2" x="231.8" y="1118" textLength="1207.8" clip-path="url(#terminal-460130354-line-45)">Run&#160;static&#160;checks.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="terminal-460130354-r4" x="0" y="1142.4" textLength="1464" clip-path="url(#terminal-460130354-line-46)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-460130354-r2" x="1464" y="1142.4" textLength="12.2" clip-path="url(#terminal-460130354-line-46)">
-</text><text class="terminal-460130354-r4" x="0" y="1166.8" textLength="24.4" clip-path="url(#terminal-460130354-line-47)">╭─</text><text class="terminal-460130354-r4" x="24.4" y="1166.8" textLength="1415.2" clip-path="url(#terminal-460130354-line-47)">&#160;Testing&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-460130354-r4" x="1439.6" y="1166.8" textLength="24.4" clip-path="url(#terminal-46013 [...]
-</text><text class="terminal-460130354-r4" x="0" y="1191.2" textLength="12.2" clip-path="url(#terminal-460130354-line-48)">│</text><text class="terminal-460130354-r5" x="24.4" y="1191.2" textLength="256.2" clip-path="url(#terminal-460130354-line-48)">docker-compose-tests&#160;</text><text class="terminal-460130354-r2" x="305" y="1191.2" textLength="1134.6" clip-path="url(#terminal-460130354-line-48)">Run&#160;docker-compose&#160;tests.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
-</text><text class="terminal-460130354-r4" x="0" y="1215.6" textLength="12.2" clip-path="url(#terminal-460130354-line-49)">│</text><text class="terminal-460130354-r5" x="24.4" y="1215.6" textLength="256.2" clip-path="url(#terminal-460130354-line-49)">tests&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="305" y="1215.6" textLength="1134.6" clip-path="url(#terminal-460130354-line-49)">Run&#160;the& [...]
-</text><text class="terminal-460130354-r4" x="0" y="1240" textLength="1464" clip-path="url(#terminal-460130354-line-50)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-460130354-r2" x="1464" y="1240" textLength="12.2" clip-path="url(#terminal-460130354-line-50)">
-</text><text class="terminal-460130354-r4" x="0" y="1264.4" textLength="24.4" clip-path="url(#terminal-460130354-line-51)">╭─</text><text class="terminal-460130354-r4" x="24.4" y="1264.4" textLength="1415.2" clip-path="url(#terminal-460130354-line-51)">&#160;Configuration&#160;&amp;&#160;maintenance&#160;───────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-460130354-r4" x="1439.6" y="1264.4" textLength="24.4" clip-path="url(# [...]
-</text><text class="terminal-460130354-r4" x="0" y="1288.8" textLength="12.2" clip-path="url(#terminal-460130354-line-52)">│</text><text class="terminal-460130354-r5" x="24.4" y="1288.8" textLength="305" clip-path="url(#terminal-460130354-line-52)">cleanup&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="353.8" y="1288.8" textLength="1085.8" clip-path="url(#terminal-460130354-line-52)" [...]
-</text><text class="terminal-460130354-r4" x="0" y="1313.2" textLength="12.2" clip-path="url(#terminal-460130354-line-53)">│</text><text class="terminal-460130354-r2" x="353.8" y="1313.2" textLength="1085.8" clip-path="url(#terminal-460130354-line-53)">images.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
-</text><text class="terminal-460130354-r4" x="0" y="1337.6" textLength="12.2" clip-path="url(#terminal-460130354-line-54)">│</text><text class="terminal-460130354-r5" x="24.4" y="1337.6" textLength="305" clip-path="url(#terminal-460130354-line-54)">self-upgrade&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="353.8" y="1337.6" textLength="1085.8" clip-path="url(#terminal-460130354-line-54)">Self&#160;upgrade&#160;B [...]
-</text><text class="terminal-460130354-r4" x="0" y="1362" textLength="12.2" clip-path="url(#terminal-460130354-line-55)">│</text><text class="terminal-460130354-r5" x="24.4" y="1362" textLength="305" clip-path="url(#terminal-460130354-line-55)">setup-autocomplete&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="353.8" y="1362" textLength="1085.8" clip-path="url(#terminal-460130354-line-55)">Enables&#160;autocompletion&#160;of&#160;breeze&#160;command [...]
-</text><text class="terminal-460130354-r4" x="0" y="1386.4" textLength="12.2" clip-path="url(#terminal-460130354-line-56)">│</text><text class="terminal-460130354-r5" x="24.4" y="1386.4" textLength="305" clip-path="url(#terminal-460130354-line-56)">config&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="353.8" y="1386.4" textLength="1085.8" clip-path="url(#terminal-460130354-line [...]
-</text><text class="terminal-460130354-r4" x="0" y="1410.8" textLength="12.2" clip-path="url(#terminal-460130354-line-57)">│</text><text class="terminal-460130354-r5" x="24.4" y="1410.8" textLength="305" clip-path="url(#terminal-460130354-line-57)">regenerate-command-images</text><text class="terminal-460130354-r2" x="353.8" y="1410.8" textLength="1085.8" clip-path="url(#terminal-460130354-line-57)">Regenerate&#160;breeze&#160;command&#160;images.&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
-</text><text class="terminal-460130354-r4" x="0" y="1435.2" textLength="12.2" clip-path="url(#terminal-460130354-line-58)">│</text><text class="terminal-460130354-r5" x="24.4" y="1435.2" textLength="305" clip-path="url(#terminal-460130354-line-58)">command-hash-export&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="353.8" y="1435.2" textLength="1085.8" clip-path="url(#terminal-460130354-line-58)">Outputs&#160;hash&#160;of&#160;all&#160;click&#160;commands [...]
-</text><text class="terminal-460130354-r4" x="0" y="1459.6" textLength="12.2" clip-path="url(#terminal-460130354-line-59)">│</text><text class="terminal-460130354-r2" x="353.8" y="1459.6" textLength="1085.8" clip-path="url(#terminal-460130354-line-59)">images&#160;should&#160;be&#160;regenerated).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
-</text><text class="terminal-460130354-r4" x="0" y="1484" textLength="12.2" clip-path="url(#terminal-460130354-line-60)">│</text><text class="terminal-460130354-r5" x="24.4" y="1484" textLength="305" clip-path="url(#terminal-460130354-line-60)">version&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="353.8" y="1484" textLength="1085.8" clip-path="url(#terminal-460130354-line-60)">Print [...]
-</text><text class="terminal-460130354-r4" x="0" y="1508.4" textLength="1464" clip-path="url(#terminal-460130354-line-61)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-460130354-r2" x="1464" y="1508.4" textLength="12.2" clip-path="url(#terminal-460130354-line-61)">
-</text><text class="terminal-460130354-r4" x="0" y="1532.8" textLength="24.4" clip-path="url(#terminal-460130354-line-62)">╭─</text><text class="terminal-460130354-r4" x="24.4" y="1532.8" textLength="1415.2" clip-path="url(#terminal-460130354-line-62)">&#160;CI&#160;Image&#160;tools&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-460130354-r4" x="1439.6" y="1532.8" textLength="24.4" clip-path="url(#term [...]
-</text><text class="terminal-460130354-r4" x="0" y="1557.2" textLength="12.2" clip-path="url(#terminal-460130354-line-63)">│</text><text class="terminal-460130354-r5" x="24.4" y="1557.2" textLength="170.8" clip-path="url(#terminal-460130354-line-63)">build-image&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="219.6" y="1557.2" textLength="1220" clip-path="url(#terminal-460130354-line-63)">Build&#160;CI&#160;image.&#160;Include&#160;building&#160;multiple&#160;images&#160;f [...]
-</text><text class="terminal-460130354-r4" x="0" y="1581.6" textLength="12.2" clip-path="url(#terminal-460130354-line-64)">│</text><text class="terminal-460130354-r5" x="24.4" y="1581.6" textLength="170.8" clip-path="url(#terminal-460130354-line-64)">pull-image&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="219.6" y="1581.6" textLength="1220" clip-path="url(#terminal-460130354-line-64)">Pull&#160;and&#160;optionally&#160;verify&#160;CI&#160;images&#160;-&#160;possib [...]
-</text><text class="terminal-460130354-r4" x="0" y="1606" textLength="12.2" clip-path="url(#terminal-460130354-line-65)">│</text><text class="terminal-460130354-r5" x="24.4" y="1606" textLength="170.8" clip-path="url(#terminal-460130354-line-65)">verify-image&#160;&#160;</text><text class="terminal-460130354-r2" x="219.6" y="1606" textLength="1220" clip-path="url(#terminal-460130354-line-65)">Verify&#160;CI&#160;image.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
-</text><text class="terminal-460130354-r4" x="0" y="1630.4" textLength="1464" clip-path="url(#terminal-460130354-line-66)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-460130354-r2" x="1464" y="1630.4" textLength="12.2" clip-path="url(#terminal-460130354-line-66)">
-</text><text class="terminal-460130354-r4" x="0" y="1654.8" textLength="24.4" clip-path="url(#terminal-460130354-line-67)">╭─</text><text class="terminal-460130354-r4" x="24.4" y="1654.8" textLength="1415.2" clip-path="url(#terminal-460130354-line-67)">&#160;Production&#160;Image&#160;tools&#160;────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-460130354-r4" x="1439.6" y="1654.8" textLength="24.4" clip-path="url(#term [...]
-</text><text class="terminal-460130354-r4" x="0" y="1679.2" textLength="12.2" clip-path="url(#terminal-460130354-line-68)">│</text><text class="terminal-460130354-r5" x="24.4" y="1679.2" textLength="207.4" clip-path="url(#terminal-460130354-line-68)">build-prod-image&#160;</text><text class="terminal-460130354-r2" x="256.2" y="1679.2" textLength="1183.4" clip-path="url(#terminal-460130354-line-68)">Build&#160;Production&#160;image.&#160;Include&#160;building&#160;multiple&#160;images&#16 [...]
-</text><text class="terminal-460130354-r4" x="0" y="1703.6" textLength="12.2" clip-path="url(#terminal-460130354-line-69)">│</text><text class="terminal-460130354-r2" x="256.2" y="1703.6" textLength="1183.4" clip-path="url(#terminal-460130354-line-69)">sequentially.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
-</text><text class="terminal-460130354-r4" x="0" y="1728" textLength="12.2" clip-path="url(#terminal-460130354-line-70)">│</text><text class="terminal-460130354-r5" x="24.4" y="1728" textLength="207.4" clip-path="url(#terminal-460130354-line-70)">pull-prod-image&#160;&#160;</text><text class="terminal-460130354-r2" x="256.2" y="1728" textLength="1183.4" clip-path="url(#terminal-460130354-line-70)">Pull&#160;and&#160;optionally&#160;verify&#160;Production&#160;images&#160;-&#160;possibly& [...]
-</text><text class="terminal-460130354-r4" x="0" y="1752.4" textLength="12.2" clip-path="url(#terminal-460130354-line-71)">│</text><text class="terminal-460130354-r5" x="24.4" y="1752.4" textLength="207.4" clip-path="url(#terminal-460130354-line-71)">verify-prod-image</text><text class="terminal-460130354-r2" x="256.2" y="1752.4" textLength="1183.4" clip-path="url(#terminal-460130354-line-71)">Verify&#160;Production&#160;image.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="terminal-460130354-r4" x="0" y="1776.8" textLength="1464" clip-path="url(#terminal-460130354-line-72)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-460130354-r2" x="1464" y="1776.8" textLength="12.2" clip-path="url(#terminal-460130354-line-72)">
-</text><text class="terminal-460130354-r4" x="0" y="1801.2" textLength="24.4" clip-path="url(#terminal-460130354-line-73)">╭─</text><text class="terminal-460130354-r4" x="24.4" y="1801.2" textLength="1415.2" clip-path="url(#terminal-460130354-line-73)">&#160;CI&#160;commands&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-460130354-r4" x="1439.6" y="1801.2" textLength="24.4" clip-path="url(#terminal- [...]
-</text><text class="terminal-460130354-r4" x="0" y="1825.6" textLength="12.2" clip-path="url(#terminal-460130354-line-74)">│</text><text class="terminal-460130354-r5" x="24.4" y="1825.6" textLength="378.2" clip-path="url(#terminal-460130354-line-74)">fix-ownership&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="427" y="1825.6" textLength="1012.6" clip-path="url(#terminal-460130354-lin [...]
-</text><text class="terminal-460130354-r4" x="0" y="1850" textLength="12.2" clip-path="url(#terminal-460130354-line-75)">│</text><text class="terminal-460130354-r5" x="24.4" y="1850" textLength="378.2" clip-path="url(#terminal-460130354-line-75)">free-space&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="427" y="1850" textLength="1012.6" clip-path="url(#terminal-4601 [...]
-</text><text class="terminal-460130354-r4" x="0" y="1874.4" textLength="12.2" clip-path="url(#terminal-460130354-line-76)">│</text><text class="terminal-460130354-r5" x="24.4" y="1874.4" textLength="378.2" clip-path="url(#terminal-460130354-line-76)">resource-check&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="427" y="1874.4" textLength="1012.6" clip-path="url(#terminal-460130354-line-76) [...]
-</text><text class="terminal-460130354-r4" x="0" y="1898.8" textLength="12.2" clip-path="url(#terminal-460130354-line-77)">│</text><text class="terminal-460130354-r5" x="24.4" y="1898.8" textLength="378.2" clip-path="url(#terminal-460130354-line-77)">selective-check&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="427" y="1898.8" textLength="1012.6" clip-path="url(#terminal-460130354-line-77)">Che [...]
-</text><text class="terminal-460130354-r4" x="0" y="1923.2" textLength="12.2" clip-path="url(#terminal-460130354-line-78)">│</text><text class="terminal-460130354-r5" x="24.4" y="1923.2" textLength="378.2" clip-path="url(#terminal-460130354-line-78)">find-newer-dependencies&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="427" y="1923.2" textLength="1012.6" clip-path="url(#terminal-460130354-line-78)">Finds&#160;which&#160;dependencies&#160;are [...]
-</text><text class="terminal-460130354-r4" x="0" y="1947.6" textLength="1464" clip-path="url(#terminal-460130354-line-79)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-460130354-r2" x="1464" y="1947.6" textLength="12.2" clip-path="url(#terminal-460130354-line-79)">
-</text><text class="terminal-460130354-r4" x="0" y="1972" textLength="24.4" clip-path="url(#terminal-460130354-line-80)">╭─</text><text class="terminal-460130354-r4" x="24.4" y="1972" textLength="1415.2" clip-path="url(#terminal-460130354-line-80)">&#160;Release&#160;management&#160;────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-460130354-r4" x="1439.6" y="1972" textLength="24.4" clip-path="url(#terminal-460130 [...]
-</text><text class="terminal-460130354-r4" x="0" y="1996.4" textLength="12.2" clip-path="url(#terminal-460130354-line-81)">│</text><text class="terminal-460130354-r5" x="24.4" y="1996.4" textLength="402.6" clip-path="url(#terminal-460130354-line-81)">verify-provider-packages&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="451.4" y="1996.4" textLength="988.2" clip-path="url(#terminal-460130354-line-81)">Verifies&#160;if&#160;all&#160;prov [...]
-</text><text class="terminal-460130354-r4" x="0" y="2020.8" textLength="12.2" clip-path="url(#terminal-460130354-line-82)">│</text><text class="terminal-460130354-r5" x="24.4" y="2020.8" textLength="402.6" clip-path="url(#terminal-460130354-line-82)">prepare-provider-documentation&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="451.4" y="2020.8" textLength="988.2" clip-path="url(#terminal-460130354-line-82)">Prepare&#160;CHANGELOG,&#160;README&#160;and&#160;COMMITS&#160;in [...]
-</text><text class="terminal-460130354-r4" x="0" y="2045.2" textLength="12.2" clip-path="url(#terminal-460130354-line-83)">│</text><text class="terminal-460130354-r5" x="24.4" y="2045.2" textLength="402.6" clip-path="url(#terminal-460130354-line-83)">prepare-provider-packages&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="451.4" y="2045.2" textLength="988.2" clip-path="url(#terminal-460130354-line-83)">Prepare&#160;sdist/whl&#160;packages&#16 [...]
-</text><text class="terminal-460130354-r4" x="0" y="2069.6" textLength="12.2" clip-path="url(#terminal-460130354-line-84)">│</text><text class="terminal-460130354-r5" x="24.4" y="2069.6" textLength="402.6" clip-path="url(#terminal-460130354-line-84)">prepare-airflow-package&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="451.4" y="2069.6" textLength="988.2" clip-path="url(#terminal-460130354-line-84)">Prepare&#160;sdist/whl&#160;pa [...]
-</text><text class="terminal-460130354-r4" x="0" y="2094" textLength="12.2" clip-path="url(#terminal-460130354-line-85)">│</text><text class="terminal-460130354-r5" x="24.4" y="2094" textLength="402.6" clip-path="url(#terminal-460130354-line-85)">release-prod-images&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="451.4" y="2094" textLength="988.2" clip-path="url(#terminal-460130354-line-85)">Release&#160;pro [...]
-</text><text class="terminal-460130354-r4" x="0" y="2118.4" textLength="12.2" clip-path="url(#terminal-460130354-line-86)">│</text><text class="terminal-460130354-r5" x="24.4" y="2118.4" textLength="402.6" clip-path="url(#terminal-460130354-line-86)">generate-constraints&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-460130354-r2" x="451.4" y="2118.4" textLength="988.2" clip-path="url(#terminal-460130354-line-86)">Generates&#160; [...]
-</text><text class="terminal-460130354-r4" x="0" y="2142.8" textLength="1464" clip-path="url(#terminal-460130354-line-87)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-460130354-r2" x="1464" y="2142.8" textLength="12.2" clip-path="url(#terminal-460130354-line-87)">
+    <g class="terminal-4069008649-matrix">
+    <text class="terminal-4069008649-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-4069008649-line-0)">
+</text><text class="terminal-4069008649-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-4069008649-line-1)">Usage:&#160;</text><text class="terminal-4069008649-r1" x="97.6" y="44.4" textLength="414.8" clip-path="url(#terminal-4069008649-line-1)">breeze&#160;[OPTIONS]&#160;COMMAND&#160;[ARGS]...</text><text class="terminal-4069008649-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-1)">
+</text><text class="terminal-4069008649-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-2)">
+</text><text class="terminal-4069008649-r4" x="0" y="93.2" textLength="24.4" clip-path="url(#terminal-4069008649-line-3)">╭─</text><text class="terminal-4069008649-r4" x="24.4" y="93.2" textLength="1415.2" clip-path="url(#terminal-4069008649-line-3)">&#160;Basic&#160;flags&#160;for&#160;the&#160;default&#160;(shell)&#160;command&#160;───────────────────────────────────────────────────────────────────────</text><text class="terminal-4069008649-r4" x="1439.6" y="93.2" textLength="24.4" cli [...]
+</text><text class="terminal-4069008649-r4" x="0" y="117.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-4)">│</text><text class="terminal-4069008649-r5" x="24.4" y="117.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-4)">-</text><text class="terminal-4069008649-r5" x="36.6" y="117.6" textLength="85.4" clip-path="url(#terminal-4069008649-line-4)">-python</text><text class="terminal-4069008649-r6" x="305" y="117.6" textLength="24.4" clip-path="url(#terminal-406 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="142" textLength="12.2" clip-path="url(#terminal-4069008649-line-5)">│</text><text class="terminal-4069008649-r4" x="353.8" y="142" textLength="732" clip-path="url(#terminal-4069008649-line-5)">[default:&#160;3.7]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-6)">│</text><text class="terminal-4069008649-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-6)">-</text><text class="terminal-4069008649-r5" x="36.6" y="166.4" textLength="97.6" clip-path="url(#terminal-4069008649-line-6)">-backend</text><text class="terminal-4069008649-r6" x="305" y="166.4" textLength="24.4" clip-path="url(#terminal-40 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-7)">│</text><text class="terminal-4069008649-r5" x="24.4" y="190.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-7)">-</text><text class="terminal-4069008649-r5" x="36.6" y="190.8" textLength="109.8" clip-path="url(#terminal-4069008649-line-7)">-postgres</text><text class="terminal-4069008649-r5" x="146.4" y="190.8" textLength="97.6" clip-path="url(#termina [...]
+</text><text class="terminal-4069008649-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-8)">│</text><text class="terminal-4069008649-r5" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-8)">-</text><text class="terminal-4069008649-r5" x="36.6" y="215.2" textLength="73.2" clip-path="url(#terminal-4069008649-line-8)">-mysql</text><text class="terminal-4069008649-r5" x="109.8" y="215.2" textLength="97.6" clip-path="url(#terminal-40 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-9)">│</text><text class="terminal-4069008649-r5" x="24.4" y="239.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-9)">-</text><text class="terminal-4069008649-r5" x="36.6" y="239.6" textLength="73.2" clip-path="url(#terminal-4069008649-line-9)">-mssql</text><text class="terminal-4069008649-r5" x="109.8" y="239.6" textLength="97.6" clip-path="url(#terminal-40 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="264" textLength="12.2" clip-path="url(#terminal-4069008649-line-10)">│</text><text class="terminal-4069008649-r5" x="24.4" y="264" textLength="12.2" clip-path="url(#terminal-4069008649-line-10)">-</text><text class="terminal-4069008649-r5" x="36.6" y="264" textLength="146.4" clip-path="url(#terminal-4069008649-line-10)">-integration</text><text class="terminal-4069008649-r2" x="353.8" y="264" textLength="1085.8" clip-path="url(#termina [...]
+</text><text class="terminal-4069008649-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-11)">│</text><text class="terminal-4069008649-r7" x="353.8" y="288.4" textLength="1085.8" clip-path="url(#terminal-4069008649-line-11)">(cassandra&#160;|&#160;kerberos&#160;|&#160;mongo&#160;|&#160;openldap&#160;|&#160;pinot&#160;|&#160;rabbitmq&#160;|&#160;redis&#160;|&#160;statsd&#160;|&#160;trino&#160;|&#160;&#160;&#160;</text><text class="terminal-4069008649-r4" x="1 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-12)">│</text><text class="terminal-4069008649-r7" x="353.8" y="312.8" textLength="1085.8" clip-path="url(#terminal-4069008649-line-12)">all)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-13)">│</text><text class="terminal-4069008649-r5" x="24.4" y="337.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-13)">-</text><text class="terminal-4069008649-r5" x="36.6" y="337.2" textLength="97.6" clip-path="url(#terminal-4069008649-line-13)">-forward</text><text class="terminal-4069008649-r5" x="134.2" y="337.2" textLength="146.4" clip-path="url(#termi [...]
+</text><text class="terminal-4069008649-r4" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-14)">│</text><text class="terminal-4069008649-r5" x="24.4" y="361.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-14)">-</text><text class="terminal-4069008649-r5" x="36.6" y="361.6" textLength="36.6" clip-path="url(#terminal-4069008649-line-14)">-db</text><text class="terminal-4069008649-r5" x="73.2" y="361.6" textLength="73.2" clip-path="url(#terminal-406 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="386" textLength="1464" clip-path="url(#terminal-4069008649-line-15)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4069008649-r2" x="1464" y="386" textLength="12.2" clip-path="url(#terminal-4069008649-line-15)">
+</text><text class="terminal-4069008649-r4" x="0" y="410.4" textLength="24.4" clip-path="url(#terminal-4069008649-line-16)">╭─</text><text class="terminal-4069008649-r4" x="24.4" y="410.4" textLength="1415.2" clip-path="url(#terminal-4069008649-line-16)">&#160;Advanced&#160;flags&#160;for&#160;the&#160;default&#160;(shell)&#160;command&#160;────────────────────────────────────────────────────────────────────</text><text class="terminal-4069008649-r4" x="1439.6" y="410.4" textLength="24.4 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-17)">│</text><text class="terminal-4069008649-r5" x="24.4" y="434.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-17)">-</text><text class="terminal-4069008649-r5" x="36.6" y="434.8" textLength="48.8" clip-path="url(#terminal-4069008649-line-17)">-use</text><text class="terminal-4069008649-r5" x="85.4" y="434.8" textLength="195.2" clip-path="url(#terminal-4 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-18)">│</text><text class="terminal-4069008649-r2" x="366" y="459.2" textLength="1073.6" clip-path="url(#terminal-4069008649-line-18)">`sdist`&#160;if&#160;Airflow&#160;should&#160;be&#160;removed,&#160;installed&#160;from&#160;wheel&#160;packages&#160;or&#160;sdist&#160;packages&#160;&#160;&#160;</text><text class="terminal-4069008649-r4" x="1451.8" y="459.2" textLength= [...]
+</text><text class="terminal-4069008649-r4" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-19)">│</text><text class="terminal-4069008649-r2" x="366" y="483.6" textLength="573.4" clip-path="url(#terminal-4069008649-line-19)">available&#160;in&#160;dist&#160;folder&#160;respectively.&#160;Implies&#160;</text><text class="terminal-4069008649-r5" x="939.4" y="483.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-19)">-</text><text class="terminal-40690 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="508" textLength="12.2" clip-path="url(#terminal-4069008649-line-20)">│</text><text class="terminal-4069008649-r7" x="366" y="508" textLength="1073.6" clip-path="url(#terminal-4069008649-line-20)">(none&#160;|&#160;wheel&#160;|&#160;sdist&#160;|&#160;&lt;airflow_version&gt;)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-21)">│</text><text class="terminal-4069008649-r5" x="24.4" y="532.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-21)">-</text><text class="terminal-4069008649-r5" x="36.6" y="532.4" textLength="97.6" clip-path="url(#terminal-4069008649-line-21)">-airflow</text><text class="terminal-4069008649-r5" x="134.2" y="532.4" textLength="85.4" clip-path="url(#termin [...]
+</text><text class="terminal-4069008649-r4" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-22)">│</text><text class="terminal-4069008649-r5" x="24.4" y="556.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-22)">-</text><text class="terminal-4069008649-r5" x="36.6" y="556.8" textLength="48.8" clip-path="url(#terminal-4069008649-line-22)">-use</text><text class="terminal-4069008649-r5" x="85.4" y="556.8" textLength="231.8" clip-path="url(#terminal-4 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-23)">│</text><text class="terminal-4069008649-r2" x="366" y="581.2" textLength="1073.6" clip-path="url(#terminal-4069008649-line-23)">entering&#160;breeze.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
+</text><text class="terminal-4069008649-r4" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-24)">│</text><text class="terminal-4069008649-r5" x="24.4" y="605.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-24)">-</text><text class="terminal-4069008649-r5" x="36.6" y="605.6" textLength="97.6" clip-path="url(#terminal-4069008649-line-24)">-package</text><text class="terminal-4069008649-r5" x="134.2" y="605.6" textLength="85.4" clip-path="url(#termin [...]
+</text><text class="terminal-4069008649-r4" x="0" y="630" textLength="12.2" clip-path="url(#terminal-4069008649-line-25)">│</text><text class="terminal-4069008649-r5" x="24.4" y="630" textLength="12.2" clip-path="url(#terminal-4069008649-line-25)">-</text><text class="terminal-4069008649-r5" x="36.6" y="630" textLength="73.2" clip-path="url(#terminal-4069008649-line-25)">-force</text><text class="terminal-4069008649-r5" x="109.8" y="630" textLength="73.2" clip-path="url(#terminal-4069008 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-26)">│</text><text class="terminal-4069008649-r5" x="24.4" y="654.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-26)">-</text><text class="terminal-4069008649-r5" x="36.6" y="654.4" textLength="73.2" clip-path="url(#terminal-4069008649-line-26)">-mount</text><text class="terminal-4069008649-r5" x="109.8" y="654.4" textLength="97.6" clip-path="url(#terminal [...]
+</text><text class="terminal-4069008649-r4" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-27)">│</text><text class="terminal-4069008649-r2" x="366" y="678.8" textLength="1073.6" clip-path="url(#terminal-4069008649-line-27)">selected).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
+</text><text class="terminal-4069008649-r4" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-28)">│</text><text class="terminal-4069008649-r7" x="366" y="703.2" textLength="1073.6" clip-path="url(#terminal-4069008649-line-28)">(selected&#160;|&#160;all&#160;|&#160;skip&#160;|&#160;remove)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-29)">│</text><text class="terminal-4069008649-r4" x="366" y="727.6" textLength="1073.6" clip-path="url(#terminal-4069008649-line-29)">[default:&#160;selected]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="752" textLength="12.2" clip-path="url(#terminal-4069008649-line-30)">│</text><text class="terminal-4069008649-r5" x="24.4" y="752" textLength="12.2" clip-path="url(#terminal-4069008649-line-30)">-</text><text class="terminal-4069008649-r5" x="36.6" y="752" textLength="85.4" clip-path="url(#terminal-4069008649-line-30)">-debian</text><text class="terminal-4069008649-r5" x="122" y="752" textLength="97.6" clip-path="url(#terminal-40690086 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="776.4" textLength="1464" clip-path="url(#terminal-4069008649-line-31)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4069008649-r2" x="1464" y="776.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-31)">
+</text><text class="terminal-4069008649-r4" x="0" y="800.8" textLength="24.4" clip-path="url(#terminal-4069008649-line-32)">╭─</text><text class="terminal-4069008649-r4" x="24.4" y="800.8" textLength="1415.2" clip-path="url(#terminal-4069008649-line-32)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-4069008649-r4" x="1439.6" y="800.8" textLength="24.4" clip-path="url(#terminal-406 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="825.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-33)">│</text><text class="terminal-4069008649-r5" x="24.4" y="825.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-33)">-</text><text class="terminal-4069008649-r5" x="36.6" y="825.2" textLength="97.6" clip-path="url(#terminal-4069008649-line-33)">-verbose</text><text class="terminal-4069008649-r6" x="280.6" y="825.2" textLength="24.4" clip-path="url(#termin [...]
+</text><text class="terminal-4069008649-r4" x="0" y="849.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-34)">│</text><text class="terminal-4069008649-r5" x="24.4" y="849.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-34)">-</text><text class="terminal-4069008649-r5" x="36.6" y="849.6" textLength="48.8" clip-path="url(#terminal-4069008649-line-34)">-dry</text><text class="terminal-4069008649-r5" x="85.4" y="849.6" textLength="48.8" clip-path="url(#terminal-40 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="874" textLength="12.2" clip-path="url(#terminal-4069008649-line-35)">│</text><text class="terminal-4069008649-r5" x="24.4" y="874" textLength="12.2" clip-path="url(#terminal-4069008649-line-35)">-</text><text class="terminal-4069008649-r5" x="36.6" y="874" textLength="85.4" clip-path="url(#terminal-4069008649-line-35)">-github</text><text class="terminal-4069008649-r5" x="122" y="874" textLength="134.2" clip-path="url(#terminal-4069008 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="898.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-36)">│</text><text class="terminal-4069008649-r5" x="24.4" y="898.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-36)">-</text><text class="terminal-4069008649-r5" x="36.6" y="898.4" textLength="85.4" clip-path="url(#terminal-4069008649-line-36)">-answer</text><text class="terminal-4069008649-r6" x="280.6" y="898.4" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-4069008649-r4" x="0" y="922.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-37)">│</text><text class="terminal-4069008649-r5" x="24.4" y="922.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-37)">-</text><text class="terminal-4069008649-r5" x="36.6" y="922.8" textLength="61" clip-path="url(#terminal-4069008649-line-37)">-help</text><text class="terminal-4069008649-r6" x="280.6" y="922.8" textLength="24.4" clip-path="url(#terminal-40 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="947.2" textLength="1464" clip-path="url(#terminal-4069008649-line-38)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4069008649-r2" x="1464" y="947.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-38)">
+</text><text class="terminal-4069008649-r4" x="0" y="971.6" textLength="24.4" clip-path="url(#terminal-4069008649-line-39)">╭─</text><text class="terminal-4069008649-r4" x="24.4" y="971.6" textLength="1415.2" clip-path="url(#terminal-4069008649-line-39)">&#160;Developer&#160;tools&#160;───────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-4069008649-r4" x="1439.6" y="971.6" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-4069008649-r4" x="0" y="996" textLength="12.2" clip-path="url(#terminal-4069008649-line-40)">│</text><text class="terminal-4069008649-r5" x="24.4" y="996" textLength="244" clip-path="url(#terminal-4069008649-line-40)">shell&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="292.8" y="996" textLength="1146.8" clip-path="url(#terminal-4069008649-line-40)">Enter&#160;breeze.py&# [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1020.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-41)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1020.4" textLength="244" clip-path="url(#terminal-4069008649-line-41)">start-airflow&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="292.8" y="1020.4" textLength="1146.8" clip-path="url(#terminal-4069008649-line-41)">Enter&#160;breeze.py&#160;environment&#160;and&#160;s [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1044.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-42)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1044.8" textLength="244" clip-path="url(#terminal-4069008649-line-42)">compile-www-assets&#160;&#160;</text><text class="terminal-4069008649-r2" x="292.8" y="1044.8" textLength="1146.8" clip-path="url(#terminal-4069008649-line-42)">Compiles&#160;www&#160;assets.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1069.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-43)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1069.2" textLength="244" clip-path="url(#terminal-4069008649-line-43)">exec&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="292.8" y="1069.2" textLength="1146.8" clip-path="url(#terminal-4069008649-line-43)">Joins&#1 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1093.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-44)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1093.6" textLength="244" clip-path="url(#terminal-4069008649-line-44)">stop&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="292.8" y="1093.6" textLength="1146.8" clip-path="url(#terminal-4069008649-line-44)">Stop&#16 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1118" textLength="12.2" clip-path="url(#terminal-4069008649-line-45)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1118" textLength="244" clip-path="url(#terminal-4069008649-line-45)">build-docs&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="292.8" y="1118" textLength="1146.8" clip-path="url(#terminal-4069008649-line-45)">Build&#160;documentation&#160;in&#160;the&#1 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1142.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-46)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1142.4" textLength="244" clip-path="url(#terminal-4069008649-line-46)">static-checks&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="292.8" y="1142.4" textLength="1146.8" clip-path="url(#terminal-4069008649-line-46)">Run&#160;static&#160;checks.&#160;&#160;&#160;&#160;& [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1166.8" textLength="1464" clip-path="url(#terminal-4069008649-line-47)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4069008649-r2" x="1464" y="1166.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-47)">
+</text><text class="terminal-4069008649-r4" x="0" y="1191.2" textLength="24.4" clip-path="url(#terminal-4069008649-line-48)">╭─</text><text class="terminal-4069008649-r4" x="24.4" y="1191.2" textLength="1415.2" clip-path="url(#terminal-4069008649-line-48)">&#160;Testing&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-4069008649-r4" x="1439.6" y="1191.2" textLength="24.4" clip-path="url(#terminal- [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1215.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-49)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1215.6" textLength="256.2" clip-path="url(#terminal-4069008649-line-49)">docker-compose-tests&#160;</text><text class="terminal-4069008649-r2" x="305" y="1215.6" textLength="1134.6" clip-path="url(#terminal-4069008649-line-49)">Run&#160;docker-compose&#160;tests.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1240" textLength="12.2" clip-path="url(#terminal-4069008649-line-50)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1240" textLength="256.2" clip-path="url(#terminal-4069008649-line-50)">tests&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="305" y="1240" textLength="1134.6" clip-path="url(#terminal-4069008649-line-50)">Run&#160;the& [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1264.4" textLength="1464" clip-path="url(#terminal-4069008649-line-51)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4069008649-r2" x="1464" y="1264.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-51)">
+</text><text class="terminal-4069008649-r4" x="0" y="1288.8" textLength="24.4" clip-path="url(#terminal-4069008649-line-52)">╭─</text><text class="terminal-4069008649-r4" x="24.4" y="1288.8" textLength="1415.2" clip-path="url(#terminal-4069008649-line-52)">&#160;Configuration&#160;&amp;&#160;maintenance&#160;───────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-4069008649-r4" x="1439.6" y="1288.8" textLength="24.4" clip-path=" [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1313.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-53)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1313.2" textLength="305" clip-path="url(#terminal-4069008649-line-53)">cleanup&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="353.8" y="1313.2" textLength="1085.8" clip-path="url(#terminal-4069008649-lin [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1337.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-54)">│</text><text class="terminal-4069008649-r2" x="353.8" y="1337.6" textLength="1085.8" clip-path="url(#terminal-4069008649-line-54)">images.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1362" textLength="12.2" clip-path="url(#terminal-4069008649-line-55)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1362" textLength="305" clip-path="url(#terminal-4069008649-line-55)">self-upgrade&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="353.8" y="1362" textLength="1085.8" clip-path="url(#terminal-4069008649-line-55)">Self&#160;upgrade&#160;B [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1386.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-56)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1386.4" textLength="305" clip-path="url(#terminal-4069008649-line-56)">setup-autocomplete&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="353.8" y="1386.4" textLength="1085.8" clip-path="url(#terminal-4069008649-line-56)">Enables&#160;autocompletion&#160;of&#160;breeze& [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1410.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-57)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1410.8" textLength="305" clip-path="url(#terminal-4069008649-line-57)">config&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="353.8" y="1410.8" textLength="1085.8" clip-path="url(#terminal-406900864 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1435.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-58)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1435.2" textLength="305" clip-path="url(#terminal-4069008649-line-58)">regenerate-command-images</text><text class="terminal-4069008649-r2" x="353.8" y="1435.2" textLength="1085.8" clip-path="url(#terminal-4069008649-line-58)">Regenerate&#160;breeze&#160;command&#160;images.&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1459.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-59)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1459.6" textLength="305" clip-path="url(#terminal-4069008649-line-59)">command-hash-export&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="353.8" y="1459.6" textLength="1085.8" clip-path="url(#terminal-4069008649-line-59)">Outputs&#160;hash&#160;of&#160;all&#160;click&#160;co [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1484" textLength="12.2" clip-path="url(#terminal-4069008649-line-60)">│</text><text class="terminal-4069008649-r2" x="353.8" y="1484" textLength="1085.8" clip-path="url(#terminal-4069008649-line-60)">images&#160;should&#160;be&#160;regenerated).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1508.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-61)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1508.4" textLength="305" clip-path="url(#terminal-4069008649-line-61)">version&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="353.8" y="1508.4" textLength="1085.8" clip-path="url(#terminal-4069008649-lin [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1532.8" textLength="1464" clip-path="url(#terminal-4069008649-line-62)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4069008649-r2" x="1464" y="1532.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-62)">
+</text><text class="terminal-4069008649-r4" x="0" y="1557.2" textLength="24.4" clip-path="url(#terminal-4069008649-line-63)">╭─</text><text class="terminal-4069008649-r4" x="24.4" y="1557.2" textLength="1415.2" clip-path="url(#terminal-4069008649-line-63)">&#160;CI&#160;Image&#160;tools&#160;────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-4069008649-r4" x="1439.6" y="1557.2" textLength="24.4" clip-path="url( [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1581.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-64)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1581.6" textLength="170.8" clip-path="url(#terminal-4069008649-line-64)">build-image&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="219.6" y="1581.6" textLength="1220" clip-path="url(#terminal-4069008649-line-64)">Build&#160;CI&#160;image.&#160;Include&#160;building&#160;multiple&#160;images& [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1606" textLength="12.2" clip-path="url(#terminal-4069008649-line-65)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1606" textLength="170.8" clip-path="url(#terminal-4069008649-line-65)">pull-image&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="219.6" y="1606" textLength="1220" clip-path="url(#terminal-4069008649-line-65)">Pull&#160;and&#160;optionally&#160;verify&#160;CI&#160;images&#160;-&#160;possib [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1630.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-66)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1630.4" textLength="170.8" clip-path="url(#terminal-4069008649-line-66)">verify-image&#160;&#160;</text><text class="terminal-4069008649-r2" x="219.6" y="1630.4" textLength="1220" clip-path="url(#terminal-4069008649-line-66)">Verify&#160;CI&#160;image.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1654.8" textLength="1464" clip-path="url(#terminal-4069008649-line-67)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4069008649-r2" x="1464" y="1654.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-67)">
+</text><text class="terminal-4069008649-r4" x="0" y="1679.2" textLength="24.4" clip-path="url(#terminal-4069008649-line-68)">╭─</text><text class="terminal-4069008649-r4" x="24.4" y="1679.2" textLength="1415.2" clip-path="url(#terminal-4069008649-line-68)">&#160;Production&#160;Image&#160;tools&#160;────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-4069008649-r4" x="1439.6" y="1679.2" textLength="24.4" clip-path="url( [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1703.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-69)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1703.6" textLength="207.4" clip-path="url(#terminal-4069008649-line-69)">build-prod-image&#160;</text><text class="terminal-4069008649-r2" x="256.2" y="1703.6" textLength="1183.4" clip-path="url(#terminal-4069008649-line-69)">Build&#160;Production&#160;image.&#160;Include&#160;building&#160;multiple&#160;imag [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1728" textLength="12.2" clip-path="url(#terminal-4069008649-line-70)">│</text><text class="terminal-4069008649-r2" x="256.2" y="1728" textLength="1183.4" clip-path="url(#terminal-4069008649-line-70)">sequentially.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1752.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-71)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1752.4" textLength="207.4" clip-path="url(#terminal-4069008649-line-71)">pull-prod-image&#160;&#160;</text><text class="terminal-4069008649-r2" x="256.2" y="1752.4" textLength="1183.4" clip-path="url(#terminal-4069008649-line-71)">Pull&#160;and&#160;optionally&#160;verify&#160;Production&#160;images&#160;-&#1 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1776.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-72)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1776.8" textLength="207.4" clip-path="url(#terminal-4069008649-line-72)">verify-prod-image</text><text class="terminal-4069008649-r2" x="256.2" y="1776.8" textLength="1183.4" clip-path="url(#terminal-4069008649-line-72)">Verify&#160;Production&#160;image.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1801.2" textLength="1464" clip-path="url(#terminal-4069008649-line-73)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4069008649-r2" x="1464" y="1801.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-73)">
+</text><text class="terminal-4069008649-r4" x="0" y="1825.6" textLength="24.4" clip-path="url(#terminal-4069008649-line-74)">╭─</text><text class="terminal-4069008649-r4" x="24.4" y="1825.6" textLength="1415.2" clip-path="url(#terminal-4069008649-line-74)">&#160;CI&#160;commands&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-4069008649-r4" x="1439.6" y="1825.6" textLength="24.4" clip-path="url(#term [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1850" textLength="12.2" clip-path="url(#terminal-4069008649-line-75)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1850" textLength="378.2" clip-path="url(#terminal-4069008649-line-75)">fix-ownership&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="427" y="1850" textLength="1012.6" clip-path="url(#terminal-4069008649-lin [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1874.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-76)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1874.4" textLength="378.2" clip-path="url(#terminal-4069008649-line-76)">free-space&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="427" y="1874.4" textLength="1012.6" clip-path="url(#te [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1898.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-77)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1898.8" textLength="378.2" clip-path="url(#terminal-4069008649-line-77)">resource-check&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="427" y="1898.8" textLength="1012.6" clip-path="url(#terminal-4069008649-li [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1923.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-78)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1923.2" textLength="378.2" clip-path="url(#terminal-4069008649-line-78)">selective-check&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="427" y="1923.2" textLength="1012.6" clip-path="url(#terminal-4069008649-line-78 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1947.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-79)">│</text><text class="terminal-4069008649-r5" x="24.4" y="1947.6" textLength="378.2" clip-path="url(#terminal-4069008649-line-79)">find-newer-dependencies&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="427" y="1947.6" textLength="1012.6" clip-path="url(#terminal-4069008649-line-79)">Finds&#160;which&#160;dependencies&#1 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="1972" textLength="1464" clip-path="url(#terminal-4069008649-line-80)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4069008649-r2" x="1464" y="1972" textLength="12.2" clip-path="url(#terminal-4069008649-line-80)">
+</text><text class="terminal-4069008649-r4" x="0" y="1996.4" textLength="24.4" clip-path="url(#terminal-4069008649-line-81)">╭─</text><text class="terminal-4069008649-r4" x="24.4" y="1996.4" textLength="1415.2" clip-path="url(#terminal-4069008649-line-81)">&#160;Release&#160;management&#160;────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-4069008649-r4" x="1439.6" y="1996.4" textLength="24.4" clip-path="url(#term [...]
+</text><text class="terminal-4069008649-r4" x="0" y="2020.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-82)">│</text><text class="terminal-4069008649-r5" x="24.4" y="2020.8" textLength="402.6" clip-path="url(#terminal-4069008649-line-82)">verify-provider-packages&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="451.4" y="2020.8" textLength="988.2" clip-path="url(#terminal-4069008649-line-82)">Verifies&#160;if&#160;all&#16 [...]
+</text><text class="terminal-4069008649-r4" x="0" y="2045.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-83)">│</text><text class="terminal-4069008649-r5" x="24.4" y="2045.2" textLength="402.6" clip-path="url(#terminal-4069008649-line-83)">prepare-provider-documentation&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="451.4" y="2045.2" textLength="988.2" clip-path="url(#terminal-4069008649-line-83)">Prepare&#160;CHANGELOG,&#160;README&#160;and&#160;COMMITS&# [...]
+</text><text class="terminal-4069008649-r4" x="0" y="2069.6" textLength="12.2" clip-path="url(#terminal-4069008649-line-84)">│</text><text class="terminal-4069008649-r5" x="24.4" y="2069.6" textLength="402.6" clip-path="url(#terminal-4069008649-line-84)">prepare-provider-packages&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="451.4" y="2069.6" textLength="988.2" clip-path="url(#terminal-4069008649-line-84)">Prepare&#160;sdist/whl&#160;packag [...]
+</text><text class="terminal-4069008649-r4" x="0" y="2094" textLength="12.2" clip-path="url(#terminal-4069008649-line-85)">│</text><text class="terminal-4069008649-r5" x="24.4" y="2094" textLength="402.6" clip-path="url(#terminal-4069008649-line-85)">prepare-airflow-package&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="451.4" y="2094" textLength="988.2" clip-path="url(#terminal-4069008649-line-85)">Prepare&#160;sdist/whl&#160;pa [...]
+</text><text class="terminal-4069008649-r4" x="0" y="2118.4" textLength="12.2" clip-path="url(#terminal-4069008649-line-86)">│</text><text class="terminal-4069008649-r5" x="24.4" y="2118.4" textLength="402.6" clip-path="url(#terminal-4069008649-line-86)">release-prod-images&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="451.4" y="2118.4" textLength="988.2" clip-path="url(#terminal-4069008649-line-86)">Rele [...]
+</text><text class="terminal-4069008649-r4" x="0" y="2142.8" textLength="12.2" clip-path="url(#terminal-4069008649-line-87)">│</text><text class="terminal-4069008649-r5" x="24.4" y="2142.8" textLength="402.6" clip-path="url(#terminal-4069008649-line-87)">generate-constraints&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-4069008649-r2" x="451.4" y="2142.8" textLength="988.2" clip-path="url(#terminal-4069008649-line-87)">Generates [...]
+</text><text class="terminal-4069008649-r4" x="0" y="2167.2" textLength="1464" clip-path="url(#terminal-4069008649-line-88)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-4069008649-r2" x="1464" y="2167.2" textLength="12.2" clip-path="url(#terminal-4069008649-line-88)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output-compile-www-assets.svg b/images/breeze/output-compile-www-assets.svg
new file mode 100644
index 0000000000..5ffd5d828f
--- /dev/null
+++ b/images/breeze/output-compile-www-assets.svg
@@ -0,0 +1,99 @@
+<svg class="rich-terminal" viewBox="0 0 1482 294.0" xmlns="http://www.w3.org/2000/svg">
+    <!-- Generated with Rich https://www.textualize.io -->
+    <style>
+
+    @font-face {
+        font-family: "Fira Code";
+        src: local("FiraCode-Regular"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
+        font-style: normal;
+        font-weight: 400;
+    }
+    @font-face {
+        font-family: "Fira Code";
+        src: local("FiraCode-Bold"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
+        font-style: bold;
+        font-weight: 700;
+    }
+
+    .terminal-2464517397-matrix {
+        font-family: Fira Code, monospace;
+        font-size: 20px;
+        line-height: 24.4px;
+        font-variant-east-asian: full-width;
+    }
+
+    .terminal-2464517397-title {
+        font-size: 18px;
+        font-weight: bold;
+        font-family: arial;
+    }
+
+    .terminal-2464517397-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-2464517397-r2 { fill: #c5c8c6 }
+.terminal-2464517397-r3 { fill: #d0b344;font-weight: bold }
+.terminal-2464517397-r4 { fill: #868887 }
+.terminal-2464517397-r5 { fill: #68a0b3;font-weight: bold }
+.terminal-2464517397-r6 { fill: #98a84b;font-weight: bold }
+    </style>
+
+    <defs>
+    <clipPath id="terminal-2464517397-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="243.0" />
+    </clipPath>
+    <clipPath id="terminal-2464517397-line-0">
+    <rect x="0" y="1.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2464517397-line-1">
+    <rect x="0" y="25.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2464517397-line-2">
+    <rect x="0" y="50.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2464517397-line-3">
+    <rect x="0" y="74.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2464517397-line-4">
+    <rect x="0" y="99.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2464517397-line-5">
+    <rect x="0" y="123.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2464517397-line-6">
+    <rect x="0" y="147.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2464517397-line-7">
+    <rect x="0" y="172.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-2464517397-line-8">
+    <rect x="0" y="196.7" 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="292" rx="8"/><text class="terminal-2464517397-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;compile-www-assets</text>
+            <g transform="translate(26,22)">
+            <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
+            <circle cx="22" cy="0" r="7" fill="#febc2e"/>
+            <circle cx="44" cy="0" r="7" fill="#28c840"/>
+            </g>
+        
+    <g transform="translate(9, 41)" clip-path="url(#terminal-2464517397-clip-terminal)">
+    
+    <g class="terminal-2464517397-matrix">
+    <text class="terminal-2464517397-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-2464517397-line-0)">
+</text><text class="terminal-2464517397-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-2464517397-line-1)">Usage:&#160;</text><text class="terminal-2464517397-r1" x="97.6" y="44.4" textLength="427" clip-path="url(#terminal-2464517397-line-1)">breeze&#160;compile-www-assets&#160;[OPTIONS]</text><text class="terminal-2464517397-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-2464517397-line-1)">
+</text><text class="terminal-2464517397-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-2464517397-line-2)">
+</text><text class="terminal-2464517397-r2" x="12.2" y="93.2" textLength="244" clip-path="url(#terminal-2464517397-line-3)">Compiles&#160;www&#160;assets.</text><text class="terminal-2464517397-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-2464517397-line-3)">
+</text><text class="terminal-2464517397-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-2464517397-line-4)">
+</text><text class="terminal-2464517397-r4" x="0" y="142" textLength="24.4" clip-path="url(#terminal-2464517397-line-5)">╭─</text><text class="terminal-2464517397-r4" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-2464517397-line-5)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-2464517397-r4" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-2464517397- [...]
+</text><text class="terminal-2464517397-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-2464517397-line-6)">│</text><text class="terminal-2464517397-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-2464517397-line-6)">-</text><text class="terminal-2464517397-r5" x="36.6" y="166.4" textLength="97.6" clip-path="url(#terminal-2464517397-line-6)">-verbose</text><text class="terminal-2464517397-r6" x="158.6" y="166.4" textLength="24.4" clip-path="url(#terminal- [...]
+</text><text class="terminal-2464517397-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-2464517397-line-7)">│</text><text class="terminal-2464517397-r5" x="24.4" y="190.8" textLength="12.2" clip-path="url(#terminal-2464517397-line-7)">-</text><text class="terminal-2464517397-r5" x="36.6" y="190.8" textLength="48.8" clip-path="url(#terminal-2464517397-line-7)">-dry</text><text class="terminal-2464517397-r5" x="85.4" y="190.8" textLength="48.8" clip-path="url(#terminal-24645 [...]
+</text><text class="terminal-2464517397-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-2464517397-line-8)">│</text><text class="terminal-2464517397-r5" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-2464517397-line-8)">-</text><text class="terminal-2464517397-r5" x="36.6" y="215.2" textLength="61" clip-path="url(#terminal-2464517397-line-8)">-help</text><text class="terminal-2464517397-r6" x="158.6" y="215.2" textLength="24.4" clip-path="url(#terminal-24645 [...]
+</text><text class="terminal-2464517397-r4" x="0" y="239.6" textLength="1464" clip-path="url(#terminal-2464517397-line-9)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2464517397-r2" x="1464" y="239.6" textLength="12.2" clip-path="url(#terminal-2464517397-line-9)">
+</text>
+    </g>
+    </g>
+</svg>
diff --git a/images/breeze/output-static-checks.svg b/images/breeze/output-static-checks.svg
index 75126bd608..e27e8489f1 100644
--- a/images/breeze/output-static-checks.svg
+++ b/images/breeze/output-static-checks.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1221.1999999999998" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1270.0" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -19,233 +19,241 @@
         font-weight: 700;
     }
 
-    .terminal-751396731-matrix {
+    .terminal-1542824486-matrix {
         font-family: Fira Code, monospace;
         font-size: 20px;
         line-height: 24.4px;
         font-variant-east-asian: full-width;
     }
 
-    .terminal-751396731-title {
+    .terminal-1542824486-title {
         font-size: 18px;
         font-weight: bold;
         font-family: arial;
     }
 
-    .terminal-751396731-r1 { fill: #c5c8c6;font-weight: bold }
-.terminal-751396731-r2 { fill: #c5c8c6 }
-.terminal-751396731-r3 { fill: #d0b344;font-weight: bold }
-.terminal-751396731-r4 { fill: #868887 }
-.terminal-751396731-r5 { fill: #68a0b3;font-weight: bold }
-.terminal-751396731-r6 { fill: #98a84b;font-weight: bold }
-.terminal-751396731-r7 { fill: #8d7b39 }
+    .terminal-1542824486-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-1542824486-r2 { fill: #c5c8c6 }
+.terminal-1542824486-r3 { fill: #d0b344;font-weight: bold }
+.terminal-1542824486-r4 { fill: #868887 }
+.terminal-1542824486-r5 { fill: #68a0b3;font-weight: bold }
+.terminal-1542824486-r6 { fill: #98a84b;font-weight: bold }
+.terminal-1542824486-r7 { fill: #8d7b39 }
     </style>
 
     <defs>
-    <clipPath id="terminal-751396731-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="1170.1999999999998" />
+    <clipPath id="terminal-1542824486-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="1219.0" />
     </clipPath>
-    <clipPath id="terminal-751396731-line-0">
+    <clipPath id="terminal-1542824486-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-1">
+<clipPath id="terminal-1542824486-line-1">
     <rect x="0" y="25.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-2">
+<clipPath id="terminal-1542824486-line-2">
     <rect x="0" y="50.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-3">
+<clipPath id="terminal-1542824486-line-3">
     <rect x="0" y="74.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-4">
+<clipPath id="terminal-1542824486-line-4">
     <rect x="0" y="99.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-5">
+<clipPath id="terminal-1542824486-line-5">
     <rect x="0" y="123.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-6">
+<clipPath id="terminal-1542824486-line-6">
     <rect x="0" y="147.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-7">
+<clipPath id="terminal-1542824486-line-7">
     <rect x="0" y="172.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-8">
+<clipPath id="terminal-1542824486-line-8">
     <rect x="0" y="196.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-9">
+<clipPath id="terminal-1542824486-line-9">
     <rect x="0" y="221.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-10">
+<clipPath id="terminal-1542824486-line-10">
     <rect x="0" y="245.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-11">
+<clipPath id="terminal-1542824486-line-11">
     <rect x="0" y="269.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-12">
+<clipPath id="terminal-1542824486-line-12">
     <rect x="0" y="294.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-13">
+<clipPath id="terminal-1542824486-line-13">
     <rect x="0" y="318.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-14">
+<clipPath id="terminal-1542824486-line-14">
     <rect x="0" y="343.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-15">
+<clipPath id="terminal-1542824486-line-15">
     <rect x="0" y="367.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-16">
+<clipPath id="terminal-1542824486-line-16">
     <rect x="0" y="391.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-17">
+<clipPath id="terminal-1542824486-line-17">
     <rect x="0" y="416.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-18">
+<clipPath id="terminal-1542824486-line-18">
     <rect x="0" y="440.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-19">
+<clipPath id="terminal-1542824486-line-19">
     <rect x="0" y="465.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-20">
+<clipPath id="terminal-1542824486-line-20">
     <rect x="0" y="489.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-21">
+<clipPath id="terminal-1542824486-line-21">
     <rect x="0" y="513.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-22">
+<clipPath id="terminal-1542824486-line-22">
     <rect x="0" y="538.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-23">
+<clipPath id="terminal-1542824486-line-23">
     <rect x="0" y="562.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-24">
+<clipPath id="terminal-1542824486-line-24">
     <rect x="0" y="587.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-25">
+<clipPath id="terminal-1542824486-line-25">
     <rect x="0" y="611.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-26">
+<clipPath id="terminal-1542824486-line-26">
     <rect x="0" y="635.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-27">
+<clipPath id="terminal-1542824486-line-27">
     <rect x="0" y="660.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-28">
+<clipPath id="terminal-1542824486-line-28">
     <rect x="0" y="684.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-29">
+<clipPath id="terminal-1542824486-line-29">
     <rect x="0" y="709.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-30">
+<clipPath id="terminal-1542824486-line-30">
     <rect x="0" y="733.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-31">
+<clipPath id="terminal-1542824486-line-31">
     <rect x="0" y="757.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-32">
+<clipPath id="terminal-1542824486-line-32">
     <rect x="0" y="782.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-33">
+<clipPath id="terminal-1542824486-line-33">
     <rect x="0" y="806.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-34">
+<clipPath id="terminal-1542824486-line-34">
     <rect x="0" y="831.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-35">
+<clipPath id="terminal-1542824486-line-35">
     <rect x="0" y="855.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-36">
+<clipPath id="terminal-1542824486-line-36">
     <rect x="0" y="879.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-37">
+<clipPath id="terminal-1542824486-line-37">
     <rect x="0" y="904.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-38">
+<clipPath id="terminal-1542824486-line-38">
     <rect x="0" y="928.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-39">
+<clipPath id="terminal-1542824486-line-39">
     <rect x="0" y="953.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-40">
+<clipPath id="terminal-1542824486-line-40">
     <rect x="0" y="977.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-41">
+<clipPath id="terminal-1542824486-line-41">
     <rect x="0" y="1001.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-42">
+<clipPath id="terminal-1542824486-line-42">
     <rect x="0" y="1026.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-43">
+<clipPath id="terminal-1542824486-line-43">
     <rect x="0" y="1050.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-44">
+<clipPath id="terminal-1542824486-line-44">
     <rect x="0" y="1075.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-45">
+<clipPath id="terminal-1542824486-line-45">
     <rect x="0" y="1099.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-751396731-line-46">
+<clipPath id="terminal-1542824486-line-46">
     <rect x="0" y="1123.9" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="terminal-1542824486-line-47">
+    <rect x="0" y="1148.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-1542824486-line-48">
+    <rect x="0" y="1172.7" 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="1219.2" rx="8"/><text class="terminal-751396731-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;static-checks</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1268" rx="8"/><text class="terminal-1542824486-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;static-checks</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
             <circle cx="44" cy="0" r="7" fill="#28c840"/>
             </g>
         
-    <g transform="translate(9, 41)" clip-path="url(#terminal-751396731-clip-terminal)">
+    <g transform="translate(9, 41)" clip-path="url(#terminal-1542824486-clip-terminal)">
     
-    <g class="terminal-751396731-matrix">
-    <text class="terminal-751396731-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-751396731-line-0)">
-</text><text class="terminal-751396731-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-751396731-line-1)">Usage:&#160;</text><text class="terminal-751396731-r1" x="97.6" y="44.4" textLength="610" clip-path="url(#terminal-751396731-line-1)">breeze&#160;static-checks&#160;[OPTIONS]&#160;[PRECOMMIT_ARGS]...</text><text class="terminal-751396731-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-751396731-line-1)">
-</text><text class="terminal-751396731-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-751396731-line-2)">
-</text><text class="terminal-751396731-r2" x="12.2" y="93.2" textLength="219.6" clip-path="url(#terminal-751396731-line-3)">Run&#160;static&#160;checks.</text><text class="terminal-751396731-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-751396731-line-3)">
-</text><text class="terminal-751396731-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-751396731-line-4)">
-</text><text class="terminal-751396731-r4" x="0" y="142" textLength="24.4" clip-path="url(#terminal-751396731-line-5)">╭─</text><text class="terminal-751396731-r4" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-751396731-line-5)">&#160;Pre-commit&#160;flags&#160;──────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-751396731-r4" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-751396731-l [...]
-</text><text class="terminal-751396731-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-751396731-line-6)">│</text><text class="terminal-751396731-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-751396731-line-6)">-</text><text class="terminal-751396731-r5" x="36.6" y="166.4" textLength="61" clip-path="url(#terminal-751396731-line-6)">-type</text><text class="terminal-751396731-r6" x="317.2" y="166.4" textLength="24.4" clip-path="url(#terminal-751396731-li [...]
-</text><text class="terminal-751396731-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-751396731-line-7)">│</text><text class="terminal-751396731-r7" x="366" y="190.8" textLength="1073.6" clip-path="url(#terminal-751396731-line-7)">(all&#160;|&#160;black&#160;|&#160;blacken-docs&#160;|&#160;check-airflow-2-2-compatibility&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
-</text><text class="terminal-751396731-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-751396731-line-8)">│</text><text class="terminal-751396731-r7" x="366" y="215.2" textLength="1073.6" clip-path="url(#terminal-751396731-line-8)">check-airflow-config-yaml-consistent&#160;|&#160;check-airflow-providers-have-extras&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-751396731-r4" x="1451.8" y="215.2" textLength="12.2"  [...]
-</text><text class="terminal-751396731-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-751396731-line-9)">│</text><text class="terminal-751396731-r7" x="366" y="239.6" textLength="1073.6" clip-path="url(#terminal-751396731-line-9)">check-apache-license-rat&#160;|&#160;check-base-operator-usage&#160;|&#160;check-boring-cyborg-configuration</text><text class="terminal-751396731-r4" x="1451.8" y="239.6" textLength="12.2" clip-path="url(#terminal-751396731-line-9)">│</text><te [...]
-</text><text class="terminal-751396731-r4" x="0" y="264" textLength="12.2" clip-path="url(#terminal-751396731-line-10)">│</text><text class="terminal-751396731-r7" x="366" y="264" textLength="1073.6" clip-path="url(#terminal-751396731-line-10)">|&#160;check-breeze-top-dependencies-limited&#160;|&#160;check-builtin-literals&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal- [...]
-</text><text class="terminal-751396731-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-751396731-line-11)">│</text><text class="terminal-751396731-r7" x="366" y="288.4" textLength="1073.6" clip-path="url(#terminal-751396731-line-11)">check-changelog-has-no-duplicates&#160;|&#160;check-daysago-import-from-utils&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-751396731-r4" x= [...]
-</text><text class="terminal-751396731-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-751396731-line-12)">│</text><text class="terminal-751396731-r7" x="366" y="312.8" textLength="1073.6" clip-path="url(#terminal-751396731-line-12)">check-docstring-param-types&#160;|&#160;check-executables-have-shebangs&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text cl [...]
-</text><text class="terminal-751396731-r4" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-751396731-line-13)">│</text><text class="terminal-751396731-r7" x="366" y="337.2" textLength="1073.6" clip-path="url(#terminal-751396731-line-13)">check-extra-packages-references&#160;|&#160;check-extras-order&#160;|&#160;check-for-inclusive-language&#160;|&#160;&#160;&#160;</text><text class="terminal-751396731-r4" x="1451.8" y="337.2" textLength="12.2" clip-path="url(#terminal-75139673 [...]
-</text><text class="terminal-751396731-r4" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-751396731-line-14)">│</text><text class="terminal-751396731-r7" x="366" y="361.6" textLength="1073.6" clip-path="url(#terminal-751396731-line-14)">check-hooks-apply&#160;|&#160;check-incorrect-use-of-LoggingMixin&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
-</text><text class="terminal-751396731-r4" x="0" y="386" textLength="12.2" clip-path="url(#terminal-751396731-line-15)">│</text><text class="terminal-751396731-r7" x="366" y="386" textLength="1073.6" clip-path="url(#terminal-751396731-line-15)">check-integrations-are-consistent&#160;|&#160;check-merge-conflict&#160;|&#160;check-newsfragments-are-valid</text><text class="terminal-751396731-r4" x="1451.8" y="386" textLength="12.2" clip-path="url(#terminal-751396731-line-15)">│</text><text  [...]
-</text><text class="terminal-751396731-r4" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-751396731-line-16)">│</text><text class="terminal-751396731-r7" x="366" y="410.4" textLength="1073.6" clip-path="url(#terminal-751396731-line-16)">|&#160;check-no-providers-in-core-examples&#160;|&#160;check-no-relative-imports&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-7 [...]
-</text><text class="terminal-751396731-r4" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-751396731-line-17)">│</text><text class="terminal-751396731-r7" x="366" y="434.8" textLength="1073.6" clip-path="url(#terminal-751396731-line-17)">check-persist-credentials-disabled-in-github-workflows&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
-</text><text class="terminal-751396731-r4" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-751396731-line-18)">│</text><text class="terminal-751396731-r7" x="366" y="459.2" textLength="1073.6" clip-path="url(#terminal-751396731-line-18)">check-pre-commit-information-consistent&#160;|&#160;check-provide-create-sessions-imports&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-751396731-r4" x="1451.8" y="459.2" textLength="12.2" clip-path="url(#termina [...]
-</text><text class="terminal-751396731-r4" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-751396731-line-19)">│</text><text class="terminal-751396731-r7" x="366" y="483.6" textLength="1073.6" clip-path="url(#terminal-751396731-line-19)">check-provider-yaml-valid&#160;|&#160;check-providers-init-file-missing&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text cl [...]
-</text><text class="terminal-751396731-r4" x="0" y="508" textLength="12.2" clip-path="url(#terminal-751396731-line-20)">│</text><text class="terminal-751396731-r7" x="366" y="508" textLength="1073.6" clip-path="url(#terminal-751396731-line-20)">check-providers-subpackages-init-file-exist&#160;|&#160;check-pydevd-left-in-code&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-751396731-r4" x="1451.8" y="508" textLen [...]
-</text><text class="terminal-751396731-r4" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-751396731-line-21)">│</text><text class="terminal-751396731-r7" x="366" y="532.4" textLength="1073.6" clip-path="url(#terminal-751396731-line-21)">check-revision-heads-map&#160;|&#160;check-safe-filter-usage-in-html&#160;|&#160;check-setup-order&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-751396731-r4" x="1451.8" y="532.4" textLength="12.2" clip-pat [...]
-</text><text class="terminal-751396731-r4" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-751396731-line-22)">│</text><text class="terminal-751396731-r7" x="366" y="556.8" textLength="1073.6" clip-path="url(#terminal-751396731-line-22)">check-start-date-not-used-in-defaults&#160;|&#160;check-system-tests-present&#160;|&#160;check-xml&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-751396731-r4" x="1451.8" y="556.8" textLength="12.2" clip-pat [...]
-</text><text class="terminal-751396731-r4" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-751396731-line-23)">│</text><text class="terminal-751396731-r7" x="366" y="581.2" textLength="1073.6" clip-path="url(#terminal-751396731-line-23)">codespell&#160;|&#160;debug-statements&#160;|&#160;detect-private-key&#160;|&#160;doctoc&#160;|&#160;end-of-file-fixer&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-751396731-r4" x="1451.8" y="581.2" textLe [...]
-</text><text class="terminal-751396731-r4" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-751396731-line-24)">│</text><text class="terminal-751396731-r7" x="366" y="605.6" textLength="1073.6" clip-path="url(#terminal-751396731-line-24)">fix-encoding-pragma&#160;|&#160;flynt&#160;|&#160;forbid-tabs&#160;|&#160;identity&#160;|&#160;insert-license&#160;|&#160;isort&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-751396731-r4" x="1451.8" y [...]
-</text><text class="terminal-751396731-r4" x="0" y="630" textLength="12.2" clip-path="url(#terminal-751396731-line-25)">│</text><text class="terminal-751396731-r7" x="366" y="630" textLength="1073.6" clip-path="url(#terminal-751396731-line-25)">lint-chart-schema&#160;|&#160;lint-css&#160;|&#160;lint-dockerfile&#160;|&#160;lint-helm-chart&#160;|&#160;lint-javascript&#160;|&#160;&#160;&#160;&#160;</text><text class="terminal-751396731-r4" x="1451.8" y="630" textLength="12.2" clip-path="url [...]
-</text><text class="terminal-751396731-r4" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-751396731-line-26)">│</text><text class="terminal-751396731-r7" x="366" y="654.4" textLength="1073.6" clip-path="url(#terminal-751396731-line-26)">lint-json-schema&#160;|&#160;lint-markdown&#160;|&#160;lint-openapi&#160;|&#160;mixed-line-ending&#160;|&#160;pretty-format-json</text><text class="terminal-751396731-r4" x="1451.8" y="654.4" textLength="12.2" clip-path="url(#terminal-75139673 [...]
-</text><text class="terminal-751396731-r4" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-751396731-line-27)">│</text><text class="terminal-751396731-r7" x="366" y="678.8" textLength="1073.6" clip-path="url(#terminal-751396731-line-27)">|&#160;pydocstyle&#160;|&#160;python-no-log-warn&#160;|&#160;pyupgrade&#160;|&#160;rst-backticks&#160;|&#160;run-flake8&#160;|&#160;run-mypy&#160;|&#160;</text><text class="terminal-751396731-r4" x="1451.8" y="678.8" textLength="12.2" clip-pat [...]
-</text><text class="terminal-751396731-r4" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-751396731-line-28)">│</text><text class="terminal-751396731-r7" x="366" y="703.2" textLength="1073.6" clip-path="url(#terminal-751396731-line-28)">run-shellcheck&#160;|&#160;static-check-autoflake&#160;|&#160;trailing-whitespace&#160;|&#160;update-breeze-cmd-output</text><text class="terminal-751396731-r4" x="1451.8" y="703.2" textLength="12.2" clip-path="url(#terminal-751396731-line-28) [...]
-</text><text class="terminal-751396731-r4" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-751396731-line-29)">│</text><text class="terminal-751396731-r7" x="366" y="727.6" textLength="1073.6" clip-path="url(#terminal-751396731-line-29)">|&#160;update-breeze-readme-config-hash&#160;|&#160;update-extras&#160;|&#160;update-in-the-wild-to-be-sorted&#160;|&#160;&#160;</text><text class="terminal-751396731-r4" x="1451.8" y="727.6" textLength="12.2" clip-path="url(#terminal-75139673 [...]
-</text><text class="terminal-751396731-r4" x="0" y="752" textLength="12.2" clip-path="url(#terminal-751396731-line-30)">│</text><text class="terminal-751396731-r7" x="366" y="752" textLength="1073.6" clip-path="url(#terminal-751396731-line-30)">update-inlined-dockerfile-scripts&#160;|&#160;update-local-yml-file&#160;|&#160;update-migration-references&#160;</text><text class="terminal-751396731-r4" x="1451.8" y="752" textLength="12.2" clip-path="url(#terminal-751396731-line-30)">│</text>< [...]
-</text><text class="terminal-751396731-r4" x="0" y="776.4" textLength="12.2" clip-path="url(#terminal-751396731-line-31)">│</text><text class="terminal-751396731-r7" x="366" y="776.4" textLength="1073.6" clip-path="url(#terminal-751396731-line-31)">|&#160;update-providers-dependencies&#160;|&#160;update-setup-cfg-file&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
-</text><text class="terminal-751396731-r4" x="0" y="800.8" textLength="12.2" clip-path="url(#terminal-751396731-line-32)">│</text><text class="terminal-751396731-r7" x="366" y="800.8" textLength="1073.6" clip-path="url(#terminal-751396731-line-32)">update-spelling-wordlist-to-be-sorted&#160;|&#160;update-supported-versions&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-751396 [...]
-</text><text class="terminal-751396731-r4" x="0" y="825.2" textLength="12.2" clip-path="url(#terminal-751396731-line-33)">│</text><text class="terminal-751396731-r7" x="366" y="825.2" textLength="1073.6" clip-path="url(#terminal-751396731-line-33)">update-vendored-in-k8s-json-schema&#160;|&#160;update-version&#160;|&#160;yamllint&#160;|&#160;yesqa)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-751396731-r [...]
-</text><text class="terminal-751396731-r4" x="0" y="849.6" textLength="12.2" clip-path="url(#terminal-751396731-line-34)">│</text><text class="terminal-751396731-r5" x="24.4" y="849.6" textLength="12.2" clip-path="url(#terminal-751396731-line-34)">-</text><text class="terminal-751396731-r5" x="36.6" y="849.6" textLength="61" clip-path="url(#terminal-751396731-line-34)">-file</text><text class="terminal-751396731-r6" x="317.2" y="849.6" textLength="24.4" clip-path="url(#terminal-751396731 [...]
-</text><text class="terminal-751396731-r4" x="0" y="874" textLength="12.2" clip-path="url(#terminal-751396731-line-35)">│</text><text class="terminal-751396731-r5" x="24.4" y="874" textLength="12.2" clip-path="url(#terminal-751396731-line-35)">-</text><text class="terminal-751396731-r5" x="36.6" y="874" textLength="48.8" clip-path="url(#terminal-751396731-line-35)">-all</text><text class="terminal-751396731-r5" x="85.4" y="874" textLength="73.2" clip-path="url(#terminal-751396731-line-35 [...]
-</text><text class="terminal-751396731-r4" x="0" y="898.4" textLength="12.2" clip-path="url(#terminal-751396731-line-36)">│</text><text class="terminal-751396731-r5" x="24.4" y="898.4" textLength="12.2" clip-path="url(#terminal-751396731-line-36)">-</text><text class="terminal-751396731-r5" x="36.6" y="898.4" textLength="61" clip-path="url(#terminal-751396731-line-36)">-show</text><text class="terminal-751396731-r5" x="97.6" y="898.4" textLength="195.2" clip-path="url(#terminal-751396731 [...]
-</text><text class="terminal-751396731-r4" x="0" y="922.8" textLength="12.2" clip-path="url(#terminal-751396731-line-37)">│</text><text class="terminal-751396731-r5" x="24.4" y="922.8" textLength="12.2" clip-path="url(#terminal-751396731-line-37)">-</text><text class="terminal-751396731-r5" x="36.6" y="922.8" textLength="61" clip-path="url(#terminal-751396731-line-37)">-last</text><text class="terminal-751396731-r5" x="97.6" y="922.8" textLength="85.4" clip-path="url(#terminal-751396731- [...]
-</text><text class="terminal-751396731-r4" x="0" y="947.2" textLength="1464" clip-path="url(#terminal-751396731-line-38)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-751396731-r2" x="1464" y="947.2" textLength="12.2" clip-path="url(#terminal-751396731-line-38)">
-</text><text class="terminal-751396731-r4" x="0" y="971.6" textLength="24.4" clip-path="url(#terminal-751396731-line-39)">╭─</text><text class="terminal-751396731-r4" x="24.4" y="971.6" textLength="1415.2" clip-path="url(#terminal-751396731-line-39)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-751396731-r4" x="1439.6" y="971.6" textLength="24.4" clip-path="url(#terminal-75139673 [...]
-</text><text class="terminal-751396731-r4" x="0" y="996" textLength="12.2" clip-path="url(#terminal-751396731-line-40)">│</text><text class="terminal-751396731-r5" x="24.4" y="996" textLength="12.2" clip-path="url(#terminal-751396731-line-40)">-</text><text class="terminal-751396731-r5" x="36.6" y="996" textLength="85.4" clip-path="url(#terminal-751396731-line-40)">-commit</text><text class="terminal-751396731-r5" x="122" y="996" textLength="48.8" clip-path="url(#terminal-751396731-line- [...]
-</text><text class="terminal-751396731-r4" x="0" y="1020.4" textLength="12.2" clip-path="url(#terminal-751396731-line-41)">│</text><text class="terminal-751396731-r2" x="329.4" y="1020.4" textLength="183" clip-path="url(#terminal-751396731-line-41)">exclusive&#160;with&#160;</text><text class="terminal-751396731-r5" x="512.4" y="1020.4" textLength="12.2" clip-path="url(#terminal-751396731-line-41)">-</text><text class="terminal-751396731-r5" x="524.6" y="1020.4" textLength="61" clip-path [...]
-</text><text class="terminal-751396731-r4" x="0" y="1044.8" textLength="12.2" clip-path="url(#terminal-751396731-line-42)">│</text><text class="terminal-751396731-r7" x="329.4" y="1044.8" textLength="1110.2" clip-path="url(#terminal-751396731-line-42)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
-</text><text class="terminal-751396731-r4" x="0" y="1069.2" textLength="12.2" clip-path="url(#terminal-751396731-line-43)">│</text><text class="terminal-751396731-r5" x="24.4" y="1069.2" textLength="12.2" clip-path="url(#terminal-751396731-line-43)">-</text><text class="terminal-751396731-r5" x="36.6" y="1069.2" textLength="97.6" clip-path="url(#terminal-751396731-line-43)">-verbose</text><text class="terminal-751396731-r6" x="280.6" y="1069.2" textLength="24.4" clip-path="url(#terminal- [...]
-</text><text class="terminal-751396731-r4" x="0" y="1093.6" textLength="12.2" clip-path="url(#terminal-751396731-line-44)">│</text><text class="terminal-751396731-r5" x="24.4" y="1093.6" textLength="12.2" clip-path="url(#terminal-751396731-line-44)">-</text><text class="terminal-751396731-r5" x="36.6" y="1093.6" textLength="48.8" clip-path="url(#terminal-751396731-line-44)">-dry</text><text class="terminal-751396731-r5" x="85.4" y="1093.6" textLength="48.8" clip-path="url(#terminal-75139 [...]
-</text><text class="terminal-751396731-r4" x="0" y="1118" textLength="12.2" clip-path="url(#terminal-751396731-line-45)">│</text><text class="terminal-751396731-r5" x="24.4" y="1118" textLength="12.2" clip-path="url(#terminal-751396731-line-45)">-</text><text class="terminal-751396731-r5" x="36.6" y="1118" textLength="85.4" clip-path="url(#terminal-751396731-line-45)">-github</text><text class="terminal-751396731-r5" x="122" y="1118" textLength="134.2" clip-path="url(#terminal-751396731- [...]
-</text><text class="terminal-751396731-r4" x="0" y="1142.4" textLength="12.2" clip-path="url(#terminal-751396731-line-46)">│</text><text class="terminal-751396731-r5" x="24.4" y="1142.4" textLength="12.2" clip-path="url(#terminal-751396731-line-46)">-</text><text class="terminal-751396731-r5" x="36.6" y="1142.4" textLength="61" clip-path="url(#terminal-751396731-line-46)">-help</text><text class="terminal-751396731-r6" x="280.6" y="1142.4" textLength="24.4" clip-path="url(#terminal-75139 [...]
-</text><text class="terminal-751396731-r4" x="0" y="1166.8" textLength="1464" clip-path="url(#terminal-751396731-line-47)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-751396731-r2" x="1464" y="1166.8" textLength="12.2" clip-path="url(#terminal-751396731-line-47)">
+    <g class="terminal-1542824486-matrix">
+    <text class="terminal-1542824486-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-1542824486-line-0)">
+</text><text class="terminal-1542824486-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-1542824486-line-1)">Usage:&#160;</text><text class="terminal-1542824486-r1" x="97.6" y="44.4" textLength="610" clip-path="url(#terminal-1542824486-line-1)">breeze&#160;static-checks&#160;[OPTIONS]&#160;[PRECOMMIT_ARGS]...</text><text class="terminal-1542824486-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-1542824486-line-1)">
+</text><text class="terminal-1542824486-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-2)">
+</text><text class="terminal-1542824486-r2" x="12.2" y="93.2" textLength="219.6" clip-path="url(#terminal-1542824486-line-3)">Run&#160;static&#160;checks.</text><text class="terminal-1542824486-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-3)">
+</text><text class="terminal-1542824486-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-1542824486-line-4)">
+</text><text class="terminal-1542824486-r4" x="0" y="142" textLength="24.4" clip-path="url(#terminal-1542824486-line-5)">╭─</text><text class="terminal-1542824486-r4" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-1542824486-line-5)">&#160;Pre-commit&#160;flags&#160;──────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-1542824486-r4" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-154282 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-1542824486-line-6)">│</text><text class="terminal-1542824486-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-1542824486-line-6)">-</text><text class="terminal-1542824486-r5" x="36.6" y="166.4" textLength="61" clip-path="url(#terminal-1542824486-line-6)">-type</text><text class="terminal-1542824486-r6" x="317.2" y="166.4" textLength="24.4" clip-path="url(#terminal-15428 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-7)">│</text><text class="terminal-1542824486-r7" x="366" y="190.8" textLength="1073.6" clip-path="url(#terminal-1542824486-line-7)">(all&#160;|&#160;black&#160;|&#160;blacken-docs&#160;|&#160;check-airflow-2-2-compatibility&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-8)">│</text><text class="terminal-1542824486-r7" x="366" y="215.2" textLength="1073.6" clip-path="url(#terminal-1542824486-line-8)">check-airflow-config-yaml-consistent&#160;|&#160;check-airflow-providers-have-extras&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="215.2" textLength="1 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-1542824486-line-9)">│</text><text class="terminal-1542824486-r7" x="366" y="239.6" textLength="1073.6" clip-path="url(#terminal-1542824486-line-9)">check-apache-license-rat&#160;|&#160;check-base-operator-usage&#160;|&#160;check-boring-cyborg-configuration</text><text class="terminal-1542824486-r4" x="1451.8" y="239.6" textLength="12.2" clip-path="url(#terminal-1542824486-line-9)">│</te [...]
+</text><text class="terminal-1542824486-r4" x="0" y="264" textLength="12.2" clip-path="url(#terminal-1542824486-line-10)">│</text><text class="terminal-1542824486-r7" x="366" y="264" textLength="1073.6" clip-path="url(#terminal-1542824486-line-10)">|&#160;check-breeze-top-dependencies-limited&#160;|&#160;check-builtin-literals&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="termi [...]
+</text><text class="terminal-1542824486-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-1542824486-line-11)">│</text><text class="terminal-1542824486-r7" x="366" y="288.4" textLength="1073.6" clip-path="url(#terminal-1542824486-line-11)">check-changelog-has-no-duplicates&#160;|&#160;check-daysago-import-from-utils&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1542824486-r [...]
+</text><text class="terminal-1542824486-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-12)">│</text><text class="terminal-1542824486-r7" x="366" y="312.8" textLength="1073.6" clip-path="url(#terminal-1542824486-line-12)">check-docstring-param-types&#160;|&#160;check-executables-have-shebangs&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><tex [...]
+</text><text class="terminal-1542824486-r4" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-13)">│</text><text class="terminal-1542824486-r7" x="366" y="337.2" textLength="1073.6" clip-path="url(#terminal-1542824486-line-13)">check-extra-packages-references&#160;|&#160;check-extras-order&#160;|&#160;check-for-inclusive-language&#160;|&#160;&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="337.2" textLength="12.2" clip-path="url(#terminal-154 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-1542824486-line-14)">│</text><text class="terminal-1542824486-r7" x="366" y="361.6" textLength="1073.6" clip-path="url(#terminal-1542824486-line-14)">check-hooks-apply&#160;|&#160;check-incorrect-use-of-LoggingMixin&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="386" textLength="12.2" clip-path="url(#terminal-1542824486-line-15)">│</text><text class="terminal-1542824486-r7" x="366" y="386" textLength="1073.6" clip-path="url(#terminal-1542824486-line-15)">check-integrations-are-consistent&#160;|&#160;check-merge-conflict&#160;|&#160;check-newsfragments-are-valid</text><text class="terminal-1542824486-r4" x="1451.8" y="386" textLength="12.2" clip-path="url(#terminal-1542824486-line-15)">│</text> [...]
+</text><text class="terminal-1542824486-r4" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-1542824486-line-16)">│</text><text class="terminal-1542824486-r7" x="366" y="410.4" textLength="1073.6" clip-path="url(#terminal-1542824486-line-16)">|&#160;check-no-providers-in-core-examples&#160;|&#160;check-no-relative-imports&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="termin [...]
+</text><text class="terminal-1542824486-r4" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-17)">│</text><text class="terminal-1542824486-r7" x="366" y="434.8" textLength="1073.6" clip-path="url(#terminal-1542824486-line-17)">check-persist-credentials-disabled-in-github-workflows&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-18)">│</text><text class="terminal-1542824486-r7" x="366" y="459.2" textLength="1073.6" clip-path="url(#terminal-1542824486-line-18)">check-pre-commit-information-consistent&#160;|&#160;check-provide-create-sessions-imports&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="459.2" textLength="12.2" clip-path="url(#te [...]
+</text><text class="terminal-1542824486-r4" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-1542824486-line-19)">│</text><text class="terminal-1542824486-r7" x="366" y="483.6" textLength="1073.6" clip-path="url(#terminal-1542824486-line-19)">check-provider-yaml-valid&#160;|&#160;check-providers-init-file-missing&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><tex [...]
+</text><text class="terminal-1542824486-r4" x="0" y="508" textLength="12.2" clip-path="url(#terminal-1542824486-line-20)">│</text><text class="terminal-1542824486-r7" x="366" y="508" textLength="1073.6" clip-path="url(#terminal-1542824486-line-20)">check-providers-subpackages-init-file-exist&#160;|&#160;check-pydevd-left-in-code&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="508" te [...]
+</text><text class="terminal-1542824486-r4" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-1542824486-line-21)">│</text><text class="terminal-1542824486-r7" x="366" y="532.4" textLength="1073.6" clip-path="url(#terminal-1542824486-line-21)">check-revision-heads-map&#160;|&#160;check-safe-filter-usage-in-html&#160;|&#160;check-setup-order&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="532.4" textLength="12.2" cli [...]
+</text><text class="terminal-1542824486-r4" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-22)">│</text><text class="terminal-1542824486-r7" x="366" y="556.8" textLength="1073.6" clip-path="url(#terminal-1542824486-line-22)">check-start-date-not-used-in-defaults&#160;|&#160;check-system-tests-present&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1542824 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-23)">│</text><text class="terminal-1542824486-r7" x="366" y="581.2" textLength="1073.6" clip-path="url(#terminal-1542824486-line-23)">check-system-tests-tocs&#160;|&#160;check-xml&#160;|&#160;codespell&#160;|&#160;compile-www-assets&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="termin [...]
+</text><text class="terminal-1542824486-r4" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-1542824486-line-24)">│</text><text class="terminal-1542824486-r7" x="366" y="605.6" textLength="1073.6" clip-path="url(#terminal-1542824486-line-24)">create-missing-init-py-files-tests&#160;|&#160;debug-statements&#160;|&#160;detect-private-key&#160;|&#160;doctoc&#160;|&#160;&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="605.6" textLength="12.2" clip-path="url(#te [...]
+</text><text class="terminal-1542824486-r4" x="0" y="630" textLength="12.2" clip-path="url(#terminal-1542824486-line-25)">│</text><text class="terminal-1542824486-r7" x="366" y="630" textLength="1073.6" clip-path="url(#terminal-1542824486-line-25)">end-of-file-fixer&#160;|&#160;fix-encoding-pragma&#160;|&#160;flynt&#160;|&#160;forbid-tabs&#160;|&#160;identity&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1542824486- [...]
+</text><text class="terminal-1542824486-r4" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-1542824486-line-26)">│</text><text class="terminal-1542824486-r7" x="366" y="654.4" textLength="1073.6" clip-path="url(#terminal-1542824486-line-26)">insert-license&#160;|&#160;isort&#160;|&#160;lint-chart-schema&#160;|&#160;lint-css&#160;|&#160;lint-dockerfile&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-15 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-27)">│</text><text class="terminal-1542824486-r7" x="366" y="678.8" textLength="1073.6" clip-path="url(#terminal-1542824486-line-27)">lint-helm-chart&#160;|&#160;lint-javascript&#160;|&#160;lint-json-schema&#160;|&#160;lint-markdown&#160;|&#160;lint-openapi&#160;|&#160;&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="678.8" textLength="12.2" clip-pat [...]
+</text><text class="terminal-1542824486-r4" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-28)">│</text><text class="terminal-1542824486-r7" x="366" y="703.2" textLength="1073.6" clip-path="url(#terminal-1542824486-line-28)">mixed-line-ending&#160;|&#160;pretty-format-json&#160;|&#160;pydocstyle&#160;|&#160;python-no-log-warn&#160;|&#160;pyupgrade&#160;|&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="703.2" textLength="12.2" clip-path="ur [...]
+</text><text class="terminal-1542824486-r4" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-1542824486-line-29)">│</text><text class="terminal-1542824486-r7" x="366" y="727.6" textLength="1073.6" clip-path="url(#terminal-1542824486-line-29)">rst-backticks&#160;|&#160;run-flake8&#160;|&#160;run-mypy&#160;|&#160;run-shellcheck&#160;|&#160;static-check-autoflake&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="727.6" textLe [...]
+</text><text class="terminal-1542824486-r4" x="0" y="752" textLength="12.2" clip-path="url(#terminal-1542824486-line-30)">│</text><text class="terminal-1542824486-r7" x="366" y="752" textLength="1073.6" clip-path="url(#terminal-1542824486-line-30)">trailing-whitespace&#160;|&#160;update-breeze-cmd-output&#160;|&#160;update-breeze-readme-config-hash&#160;|&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="752" textLength="12.2" clip-path="url(#terminal [...]
+</text><text class="terminal-1542824486-r4" x="0" y="776.4" textLength="12.2" clip-path="url(#terminal-1542824486-line-31)">│</text><text class="terminal-1542824486-r7" x="366" y="776.4" textLength="1073.6" clip-path="url(#terminal-1542824486-line-31)">update-extras&#160;|&#160;update-in-the-wild-to-be-sorted&#160;|&#160;update-inlined-dockerfile-scripts&#160;|&#160;&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="776.4" textLength="12.2" clip-path="url(#terminal-154 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="800.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-32)">│</text><text class="terminal-1542824486-r7" x="366" y="800.8" textLength="1073.6" clip-path="url(#terminal-1542824486-line-32)">update-local-yml-file&#160;|&#160;update-migration-references&#160;|&#160;update-providers-dependencies&#160;|&#160;&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="800.8" textLength="12.2" clip-path="url(#terminal-154 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="825.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-33)">│</text><text class="terminal-1542824486-r7" x="366" y="825.2" textLength="1073.6" clip-path="url(#terminal-1542824486-line-33)">update-setup-cfg-file&#160;|&#160;update-spelling-wordlist-to-be-sorted&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><tex [...]
+</text><text class="terminal-1542824486-r4" x="0" y="849.6" textLength="12.2" clip-path="url(#terminal-1542824486-line-34)">│</text><text class="terminal-1542824486-r7" x="366" y="849.6" textLength="1073.6" clip-path="url(#terminal-1542824486-line-34)">update-supported-versions&#160;|&#160;update-vendored-in-k8s-json-schema&#160;|&#160;update-version&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1542824486-r4" x="1451.8" y="849.6" textLength="12.2" clip-pat [...]
+</text><text class="terminal-1542824486-r4" x="0" y="874" textLength="12.2" clip-path="url(#terminal-1542824486-line-35)">│</text><text class="terminal-1542824486-r7" x="366" y="874" textLength="1073.6" clip-path="url(#terminal-1542824486-line-35)">yamllint&#160;|&#160;yesqa)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-1542824486-r4" x="0" y="898.4" textLength="12.2" clip-path="url(#terminal-1542824486-line-36)">│</text><text class="terminal-1542824486-r5" x="24.4" y="898.4" textLength="12.2" clip-path="url(#terminal-1542824486-line-36)">-</text><text class="terminal-1542824486-r5" x="36.6" y="898.4" textLength="61" clip-path="url(#terminal-1542824486-line-36)">-file</text><text class="terminal-1542824486-r6" x="317.2" y="898.4" textLength="24.4" clip-path="url(#terminal-15 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="922.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-37)">│</text><text class="terminal-1542824486-r5" x="24.4" y="922.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-37)">-</text><text class="terminal-1542824486-r5" x="36.6" y="922.8" textLength="48.8" clip-path="url(#terminal-1542824486-line-37)">-all</text><text class="terminal-1542824486-r5" x="85.4" y="922.8" textLength="73.2" clip-path="url(#terminal-15 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="947.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-38)">│</text><text class="terminal-1542824486-r5" x="24.4" y="947.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-38)">-</text><text class="terminal-1542824486-r5" x="36.6" y="947.2" textLength="61" clip-path="url(#terminal-1542824486-line-38)">-show</text><text class="terminal-1542824486-r5" x="97.6" y="947.2" textLength="195.2" clip-path="url(#terminal-15 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="971.6" textLength="12.2" clip-path="url(#terminal-1542824486-line-39)">│</text><text class="terminal-1542824486-r5" x="24.4" y="971.6" textLength="12.2" clip-path="url(#terminal-1542824486-line-39)">-</text><text class="terminal-1542824486-r5" x="36.6" y="971.6" textLength="61" clip-path="url(#terminal-1542824486-line-39)">-last</text><text class="terminal-1542824486-r5" x="97.6" y="971.6" textLength="85.4" clip-path="url(#terminal-154 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="996" textLength="1464" clip-path="url(#terminal-1542824486-line-40)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1542824486-r2" x="1464" y="996" textLength="12.2" clip-path="url(#terminal-1542824486-line-40)">
+</text><text class="terminal-1542824486-r4" x="0" y="1020.4" textLength="24.4" clip-path="url(#terminal-1542824486-line-41)">╭─</text><text class="terminal-1542824486-r4" x="24.4" y="1020.4" textLength="1415.2" clip-path="url(#terminal-1542824486-line-41)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-1542824486-r4" x="1439.6" y="1020.4" textLength="24.4" clip-path="url(#terminal- [...]
+</text><text class="terminal-1542824486-r4" x="0" y="1044.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-42)">│</text><text class="terminal-1542824486-r5" x="24.4" y="1044.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-42)">-</text><text class="terminal-1542824486-r5" x="36.6" y="1044.8" textLength="85.4" clip-path="url(#terminal-1542824486-line-42)">-commit</text><text class="terminal-1542824486-r5" x="122" y="1044.8" textLength="48.8" clip-path="url(#termi [...]
+</text><text class="terminal-1542824486-r4" x="0" y="1069.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-43)">│</text><text class="terminal-1542824486-r2" x="329.4" y="1069.2" textLength="183" clip-path="url(#terminal-1542824486-line-43)">exclusive&#160;with&#160;</text><text class="terminal-1542824486-r5" x="512.4" y="1069.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-43)">-</text><text class="terminal-1542824486-r5" x="524.6" y="1069.2" textLength="61" cl [...]
+</text><text class="terminal-1542824486-r4" x="0" y="1093.6" textLength="12.2" clip-path="url(#terminal-1542824486-line-44)">│</text><text class="terminal-1542824486-r7" x="329.4" y="1093.6" textLength="1110.2" clip-path="url(#terminal-1542824486-line-44)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
+</text><text class="terminal-1542824486-r4" x="0" y="1118" textLength="12.2" clip-path="url(#terminal-1542824486-line-45)">│</text><text class="terminal-1542824486-r5" x="24.4" y="1118" textLength="12.2" clip-path="url(#terminal-1542824486-line-45)">-</text><text class="terminal-1542824486-r5" x="36.6" y="1118" textLength="97.6" clip-path="url(#terminal-1542824486-line-45)">-verbose</text><text class="terminal-1542824486-r6" x="280.6" y="1118" textLength="24.4" clip-path="url(#terminal-1 [...]
+</text><text class="terminal-1542824486-r4" x="0" y="1142.4" textLength="12.2" clip-path="url(#terminal-1542824486-line-46)">│</text><text class="terminal-1542824486-r5" x="24.4" y="1142.4" textLength="12.2" clip-path="url(#terminal-1542824486-line-46)">-</text><text class="terminal-1542824486-r5" x="36.6" y="1142.4" textLength="48.8" clip-path="url(#terminal-1542824486-line-46)">-dry</text><text class="terminal-1542824486-r5" x="85.4" y="1142.4" textLength="48.8" clip-path="url(#termina [...]
+</text><text class="terminal-1542824486-r4" x="0" y="1166.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-47)">│</text><text class="terminal-1542824486-r5" x="24.4" y="1166.8" textLength="12.2" clip-path="url(#terminal-1542824486-line-47)">-</text><text class="terminal-1542824486-r5" x="36.6" y="1166.8" textLength="85.4" clip-path="url(#terminal-1542824486-line-47)">-github</text><text class="terminal-1542824486-r5" x="122" y="1166.8" textLength="134.2" clip-path="url(#term [...]
+</text><text class="terminal-1542824486-r4" x="0" y="1191.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-48)">│</text><text class="terminal-1542824486-r5" x="24.4" y="1191.2" textLength="12.2" clip-path="url(#terminal-1542824486-line-48)">-</text><text class="terminal-1542824486-r5" x="36.6" y="1191.2" textLength="61" clip-path="url(#terminal-1542824486-line-48)">-help</text><text class="terminal-1542824486-r6" x="280.6" y="1191.2" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-1542824486-r4" x="0" y="1215.6" textLength="1464" clip-path="url(#terminal-1542824486-line-49)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1542824486-r2" x="1464" y="1215.6" textLength="12.2" clip-path="url(#terminal-1542824486-line-49)">
 </text>
     </g>
     </g>
diff --git a/scripts/ci/libraries/_initialization.sh b/scripts/ci/libraries/_initialization.sh
index 96d3a65bf7..a7727f23eb 100644
--- a/scripts/ci/libraries/_initialization.sh
+++ b/scripts/ci/libraries/_initialization.sh
@@ -217,26 +217,12 @@ function initialization::initialize_available_integrations() {
 FILES_FOR_REBUILD_CHECK=()
 
 # Determine which files trigger rebuild check
-#
-# !!!!!!!!!! IMPORTANT NOTE !!!!!!!!!!
-#  When you add files here, please make sure to not add files
-#  with the same name. And if you do - make sure that files with the
-#  same name are stored in directories with different name. For
-#  example we have two package.json files here, but they are in
-#  directories with different names (`www` and `ui`).
-#  The problem is that md5 hashes of those files are stored in
-#  `./build/directory` in the same directory as <PARENT_DIR>-<FILE>.md5sum.
-#  For example md5sum of the `airflow/www/package.json` file is stored
-#  as `www-package.json` and `airflow/ui/package.json` as `ui-package.json`,
-#  The file list here changes extremely rarely.
-# !!!!!!!!!! IMPORTANT NOTE !!!!!!!!!!
 function initialization::initialize_files_for_rebuild_check() {
     FILES_FOR_REBUILD_CHECK+=(
         "setup.py"
         "setup.cfg"
         "Dockerfile.ci"
         ".dockerignore"
-        "scripts/docker/compile_www_assets.sh"
         "scripts/docker/common.sh"
         "scripts/docker/install_additional_dependencies.sh"
         "scripts/docker/install_airflow.sh"
@@ -244,11 +230,6 @@ function initialization::initialize_files_for_rebuild_check() {
         "scripts/docker/install_from_docker_context_files.sh"
         "scripts/docker/install_mysql.sh"
         "scripts/docker/install_postgres.sh"
-        "airflow/www/package.json"
-        "airflow/www/yarn.lock"
-        "airflow/www/webpack.config.js"
-        "airflow/ui/package.json"
-        "airflow/ui/yarn.lock"
     )
 }
 
@@ -440,13 +421,6 @@ function initialization::initialize_image_build_variables() {
     AIRFLOW_SOURCES_TO=${AIRFLOW_SOURCES_TO:="/Dockerfile"}
     export AIRFLOW_SOURCES_TO
 
-    # By default no sources are copied to image
-    AIRFLOW_SOURCES_WWW_FROM=${AIRFLOW_SOURCES_WWW_FROM:="Dockerfile"}
-    export AIRFLOW_SOURCES_WWW_FROM
-
-    AIRFLOW_SOURCES_WWW_TO=${AIRFLOW_SOURCES_WWW_TO:="/Dockerfile"}
-    export AIRFLOW_SOURCES_WWW_TO
-
     # By default in scripts production docker image is installed from PyPI package
     export AIRFLOW_INSTALLATION_METHOD=${AIRFLOW_INSTALLATION_METHOD:="apache-airflow"}
 
@@ -735,8 +709,6 @@ Production image build variables:
     AIRFLOW_VERSION_SPECIFICATION: '${AIRFLOW_VERSION_SPECIFICATION}'
     AIRFLOW_SOURCES_FROM: '${AIRFLOW_SOURCES_FROM}'
     AIRFLOW_SOURCES_TO: '${AIRFLOW_SOURCES_TO}'
-    AIRFLOW_SOURCES_WWW_FROM: '${AIRFLOW_SOURCES_WWW_FROM}'
-    AIRFLOW_SOURCES_WWW_TO: '${AIRFLOW_SOURCES_WWW_TO}'
 
 Detected GitHub environment:
 
diff --git a/airflow/www/compile_assets.sh b/scripts/ci/pre_commit/pre_commit_compile_www_assets.py
similarity index 60%
copy from airflow/www/compile_assets.sh
copy to scripts/ci/pre_commit/pre_commit_compile_www_assets.py
index ba4576614d..c7dfae9936 100755
--- a/airflow/www/compile_assets.sh
+++ b/scripts/ci/pre_commit/pre_commit_compile_www_assets.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+#!/usr/bin/env python
 # 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
@@ -15,20 +15,16 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
+import subprocess
+from pathlib import Path
 
-set -e
+if __name__ not in ("__main__", "__mp_main__"):
+    raise SystemExit(
+        "This file is intended to be executed as an executable program. You cannot use it as a module."
+        f"To run this script, run the ./{__file__} command"
+    )
 
-cd "$( dirname "${BASH_SOURCE[0]}" )"
-
-MD5SUM_FILE="static/dist/sum.md5"
-readonly MD5SUM_FILE
-
-# first bump up package.json manually, commit and tag
-if [[ -d ./static/dist ]]; then
-  rm -f ./static/dist/*
-fi
-
-yarn install --frozen-lockfile
-yarn run build
-
-find package.json yarn.lock static/css static/js -type f | sort | xargs md5sum > "${MD5SUM_FILE}"
+if __name__ == '__main__':
+    dir = Path("airflow") / "www"
+    subprocess.check_call(['yarn', 'install', '--frozen-lockfile'], cwd=str(dir))
+    subprocess.check_call(['yarn', 'run', 'build'], cwd=str(dir))
diff --git a/scripts/ci/pre_commit/pre_commit_ui_lint.py b/scripts/ci/pre_commit/pre_commit_ui_lint.py
index 5812344a45..eee7526564 100755
--- a/scripts/ci/pre_commit/pre_commit_ui_lint.py
+++ b/scripts/ci/pre_commit/pre_commit_ui_lint.py
@@ -15,8 +15,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-import os
-import sys
+import subprocess
 from pathlib import Path
 
 if __name__ not in ("__main__", "__mp_main__"):
@@ -25,38 +24,7 @@ if __name__ not in ("__main__", "__mp_main__"):
         f"To run this script, run the ./{__file__} command"
     )
 
-AIRFLOW_SOURCES = Path(__file__).parents[3].resolve()
-# allow "False", "false", "True", "true", "f", "F", "t", "T" and the like
-VERBOSE = os.environ.get('VERBOSE', "false")[0].lower() == "t"
-DRY_RUN = os.environ.get('DRY_RUN', "false")[0].lower() == "t"
-
 if __name__ == '__main__':
-    sys.path.insert(0, str(AIRFLOW_SOURCES / "dev" / "breeze" / "src"))
-    from airflow_breeze.global_constants import MOUNT_SELECTED
-    from airflow_breeze.utils.docker_command_utils import get_extra_docker_flags
-    from airflow_breeze.utils.path_utils import create_static_check_volumes
-    from airflow_breeze.utils.run_utils import get_runnable_ci_image, run_command
-
-    airflow_image = get_runnable_ci_image(verbose=VERBOSE, dry_run=DRY_RUN)
-    create_static_check_volumes()
-    cmd_result = run_command(
-        [
-            "docker",
-            "run",
-            "-t",
-            *get_extra_docker_flags(MOUNT_SELECTED),
-            "-e",
-            "SKIP_ENVIRONMENT_INITIALIZATION=true",
-            "-e",
-            "PRINT_INFO_FROM_SCRIPTS=false",
-            "--pull",
-            "never",
-            airflow_image,
-            "-c",
-            'cd airflow/ui && yarn --frozen-lockfile --non-interactive && yarn run lint',
-        ],
-        check=False,
-        verbose=VERBOSE,
-        dry_run=DRY_RUN,
-    )
-    sys.exit(cmd_result.returncode)
+    dir = Path("airflow") / "ui"
+    subprocess.check_call(['yarn', '--frozen-lockfile', '--non-interactive'], cwd=str(dir))
+    subprocess.check_call(['yarn', 'run', 'lint'], cwd=str(dir))
diff --git a/scripts/ci/pre_commit/pre_commit_www_lint.py b/scripts/ci/pre_commit/pre_commit_www_lint.py
index b22750c56d..472c20b98e 100755
--- a/scripts/ci/pre_commit/pre_commit_www_lint.py
+++ b/scripts/ci/pre_commit/pre_commit_www_lint.py
@@ -15,8 +15,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-import os
-import sys
+import subprocess
 from pathlib import Path
 
 if __name__ not in ("__main__", "__mp_main__"):
@@ -25,39 +24,7 @@ if __name__ not in ("__main__", "__mp_main__"):
         f"To run this script, run the ./{__file__} command"
     )
 
-AIRFLOW_SOURCES = Path(__file__).parents[3].resolve()
-GITHUB_REPOSITORY = os.environ.get('GITHUB_REPOSITORY', "apache/airflow")
-# allow "False", "false", "True", "true", "f", "F", "t", "T" and the like
-VERBOSE = os.environ.get('VERBOSE', "false")[0].lower() == "t"
-DRY_RUN = os.environ.get('DRY_RUN', "false")[0].lower() == "t"
-
 if __name__ == '__main__':
-    sys.path.insert(0, str(AIRFLOW_SOURCES / "dev" / "breeze" / "src"))
-    from airflow_breeze.global_constants import MOUNT_SELECTED
-    from airflow_breeze.utils.docker_command_utils import get_extra_docker_flags
-    from airflow_breeze.utils.path_utils import create_static_check_volumes
-    from airflow_breeze.utils.run_utils import get_runnable_ci_image, run_command
-
-    airflow_image = get_runnable_ci_image(verbose=VERBOSE, dry_run=DRY_RUN)
-    create_static_check_volumes()
-    cmd_result = run_command(
-        [
-            "docker",
-            "run",
-            "-t",
-            *get_extra_docker_flags(MOUNT_SELECTED),
-            "-e",
-            "SKIP_ENVIRONMENT_INITIALIZATION=true",
-            "-e",
-            "PRINT_INFO_FROM_SCRIPTS=false",
-            "--pull",
-            "never",
-            airflow_image,
-            "-c",
-            'cd airflow/www && yarn --frozen-lockfile --non-interactive && yarn run lint',
-        ],
-        check=False,
-        verbose=VERBOSE,
-        dry_run=DRY_RUN,
-    )
-    sys.exit(cmd_result.returncode)
+    dir = Path("airflow") / "www"
+    subprocess.check_call(['yarn', '--frozen-lockfile', '--non-interactive'], cwd=dir)
+    subprocess.check_call(['yarn', 'run', 'lint'], cwd=dir)
diff --git a/scripts/docker/compile_www_assets.sh b/scripts/docker/compile_www_assets.sh
deleted file mode 100644
index 7bc87d85e9..0000000000
--- a/scripts/docker/compile_www_assets.sh
+++ /dev/null
@@ -1,71 +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.
-# shellcheck shell=bash disable=SC2086
-set -euo pipefail
-
-BUILD_TYPE=${BUILD_TYPE="prod"}
-REMOVE_ARTIFACTS=${REMOVE_ARTIFACTS="true"}
-
-COLOR_BLUE=$'\e[34m'
-readonly COLOR_BLUE
-COLOR_RESET=$'\e[0m'
-readonly COLOR_RESET
-
-# Installs additional dependencies passed as Argument to the Docker build command
-function compile_www_assets() {
-    echo
-    echo "${COLOR_BLUE}Compiling www assets: running yarn ${BUILD_TYPE}${COLOR_RESET}"
-    echo
-    local www_dir
-    if [[ ${AIRFLOW_INSTALLATION_METHOD=} == "." ]]; then
-        # In case we are building from sources in production image, we should build the assets
-        www_dir="${AIRFLOW_SOURCES_TO=${AIRFLOW_SOURCES}}/airflow/www"
-    else
-        www_dir="$(python -m site --user-site)/airflow/www"
-    fi
-    pushd ${www_dir} || exit 1
-    set +e
-    yarn run "${BUILD_TYPE}" 2>/tmp/out-yarn-run.txt
-    res=$?
-    if [[ ${res} != 0 ]]; then
-        >&2 echo
-        >&2 echo "Error when running yarn run:"
-        >&2 echo
-        >&2 cat /tmp/out-yarn-run.txt && rm -rf /tmp/out-yarn-run.txt
-        exit 1
-    fi
-    rm -f /tmp/out-yarn-run.txt
-    set -e
-    local md5sum_file
-    md5sum_file="static/dist/sum.md5"
-    readonly md5sum_file
-    find package.json yarn.lock static/css static/js -type f | sort | xargs md5sum > "${md5sum_file}"
-    if [[ ${REMOVE_ARTIFACTS} == "true" ]]; then
-        echo
-        echo "${COLOR_BLUE}Removing generated node modules${COLOR_RESET}"
-        echo
-        rm -rf "${www_dir}/node_modules"
-        rm -vf "${www_dir}"/{package.json,yarn.lock,.eslintignore,.eslintrc,.stylelintignore,.stylelintrc,compile_assets.sh,webpack.config.js}
-    else
-        echo
-        echo "${COLOR_BLUE}Leaving generated node modules${COLOR_RESET}"
-        echo
-    fi
-    popd || exit 1
-}
-
-compile_www_assets
diff --git a/scripts/docker/entrypoint_ci.sh b/scripts/docker/entrypoint_ci.sh
index ae4961ea64..ef6d092779 100755
--- a/scripts/docker/entrypoint_ci.sh
+++ b/scripts/docker/entrypoint_ci.sh
@@ -71,11 +71,6 @@ if [[ ${SKIP_ENVIRONMENT_INITIALIZATION=} != "true" ]]; then
         echo
         echo "${COLOR_BLUE}Using airflow version from current sources${COLOR_RESET}"
         echo
-        if [[ -d "${AIRFLOW_SOURCES}/airflow/www/" ]]; then
-            pushd "${AIRFLOW_SOURCES}/airflow/www/" >/dev/null
-            ./ask_for_recompile_assets_if_needed.sh
-            popd >/dev/null
-        fi
         # Cleanup the logs, tmp when entering the environment
         sudo rm -rf "${AIRFLOW_SOURCES}"/logs/*
         sudo rm -rf "${AIRFLOW_SOURCES}"/tmp/*
@@ -203,6 +198,8 @@ if [[ ${SKIP_ENVIRONMENT_INITIALIZATION=} != "true" ]]; then
     touch /usr/lib/google-cloud-sdk/bin/gcloud
     ln -s -f /usr/bin/gcloud /usr/lib/google-cloud-sdk/bin/gcloud
 
+    in_container_fix_ownership
+
     if [[ ${SKIP_SSH_SETUP="false"} == "false" ]]; then
         # Set up ssh keys
         echo 'yes' | ssh-keygen -t rsa -C your_email@youremail.com -m PEM -P '' -f ~/.ssh/id_rsa \
diff --git a/scripts/docker/prepare_node_modules.sh b/scripts/docker/prepare_node_modules.sh
deleted file mode 100644
index 6c39de9c4d..0000000000
--- a/scripts/docker/prepare_node_modules.sh
+++ /dev/null
@@ -1,52 +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.
-# shellcheck shell=bash disable=SC2086
-set -euo pipefail
-
-COLOR_BLUE=$'\e[34m'
-readonly COLOR_BLUE
-COLOR_RESET=$'\e[0m'
-readonly COLOR_RESET
-
-# Prepares node modules needed to compile WWW assets
-function prepare_node_modules() {
-    echo
-    echo "${COLOR_BLUE}Preparing node modules${COLOR_RESET}"
-    echo
-    local www_dir
-    if [[ ${AIRFLOW_INSTALLATION_METHOD=} == "." ]]; then
-        # In case we are building from sources in production image, we should build the assets
-        www_dir="${AIRFLOW_SOURCES_TO=${AIRFLOW_SOURCES}}/airflow/www"
-    else
-        www_dir="$(python -m site --user-site)/airflow/www"
-    fi
-    pushd ${www_dir} || exit 1
-    set +e
-    yarn install --frozen-lockfile --no-cache 2>/tmp/out-yarn-install.txt
-    local res=$?
-    if [[ ${res} != 0 ]]; then
-        >&2 echo
-        >&2 echo "Error when running yarn install:"
-        >&2 echo
-        >&2 cat /tmp/out-yarn-install.txt && rm -f /tmp/out-yarn-install.txt
-        exit 1
-    fi
-    rm -f /tmp/out-yarn-install.txt
-    popd || exit 1
-}
-
-prepare_node_modules
diff --git a/scripts/in_container/_in_container_utils.sh b/scripts/in_container/_in_container_utils.sh
index 66f2e6b083..cf35acc943 100644
--- a/scripts/in_container/_in_container_utils.sh
+++ b/scripts/in_container/_in_container_utils.sh
@@ -127,23 +127,21 @@ function in_container_fix_ownership() {
         DIRECTORIES_TO_FIX=(
             "/dist"
             "/files"
-            "/root/.aws"
-            "/root/.azure"
-            "/root/.config/gcloud"
-            "/root/.docker"
             "/opt/airflow/logs"
             "/opt/airflow/docs"
             "/opt/airflow/dags"
-            "${AIRFLOW_SOURCES}"
+            "/opt/airflow/airflow/"
         )
-        echo
-        echo "${COLOR_BLUE}Fixing ownership of generated files as Host OS is ${HOST_OS}${COLOR_RESET}"
-        echo "${COLOR_BLUE}Directories: ${DIRECTORIES_TO_FIX[*]}${COLOR_RESET}"
-        echo
-        find "${DIRECTORIES_TO_FIX[@]}" -print0 -user root 2>/dev/null |
-            xargs --null chown "${HOST_USER_ID}.${HOST_GROUP_ID}" --no-dereference || true >/dev/null 2>&1
-        echo "${COLOR_BLUE}Fixed ownership of generated files."
-        echo
+        count_matching=$(find "${DIRECTORIES_TO_FIX[@]}" -mindepth 1 -user root -printf . 2>/dev/null | wc -m || true)
+        if [[ ${count_matching=} != "0" && ${count_matching=} != "" ]]; then
+            echo
+            echo "${COLOR_BLUE}Fixing ownership of ${count_matching} root owned files on ${HOST_OS}${COLOR_RESET}"
+            echo
+            find "${DIRECTORIES_TO_FIX[@]}" -mindepth 1 -user root -print0 2> /dev/null |
+                xargs --null chown "${HOST_USER_ID}.${HOST_GROUP_ID}" --no-dereference || true >/dev/null 2>&1
+            echo "${COLOR_BLUE}Fixed ownership of generated files${COLOR_RESET}."
+            echo
+        fi
      else
         echo
         echo "${COLOR_YELLOW}Skip fixing ownership of generated files as Host OS is ${HOST_OS}${COLOR_RESET}"
diff --git a/scripts/in_container/run_prepare_airflow_packages.sh b/scripts/in_container/run_prepare_airflow_packages.sh
index 791724d2bb..50d4fb8f8a 100755
--- a/scripts/in_container/run_prepare_airflow_packages.sh
+++ b/scripts/in_container/run_prepare_airflow_packages.sh
@@ -63,7 +63,7 @@ function prepare_airflow_packages() {
     fi
 
     # Prepare airflow's wheel
-    PYTHONUNBUFFERED=1 python setup.py compile_assets "${tag_build[@]}" "${packages[@]}"
+    PYTHONUNBUFFERED=1 python setup.py "${tag_build[@]}" "${packages[@]}"
 
     # clean-up
     rm -rf -- *egg-info*
diff --git a/airflow/www/compile_assets.sh b/tests/internal_api/__init__.py
old mode 100755
new mode 100644
similarity index 67%
copy from airflow/www/compile_assets.sh
copy to tests/internal_api/__init__.py
index ba4576614d..13a83393a9
--- a/airflow/www/compile_assets.sh
+++ b/tests/internal_api/__init__.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env bash
 # 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
@@ -15,20 +14,3 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-
-set -e
-
-cd "$( dirname "${BASH_SOURCE[0]}" )"
-
-MD5SUM_FILE="static/dist/sum.md5"
-readonly MD5SUM_FILE
-
-# first bump up package.json manually, commit and tag
-if [[ -d ./static/dist ]]; then
-  rm -f ./static/dist/*
-fi
-
-yarn install --frozen-lockfile
-yarn run build
-
-find package.json yarn.lock static/css static/js -type f | sort | xargs md5sum > "${MD5SUM_FILE}"
diff --git a/airflow/www/compile_assets.sh b/tests/system/__init__.py
old mode 100755
new mode 100644
similarity index 67%
copy from airflow/www/compile_assets.sh
copy to tests/system/__init__.py
index ba4576614d..13a83393a9
--- a/airflow/www/compile_assets.sh
+++ b/tests/system/__init__.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env bash
 # 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
@@ -15,20 +14,3 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-
-set -e
-
-cd "$( dirname "${BASH_SOURCE[0]}" )"
-
-MD5SUM_FILE="static/dist/sum.md5"
-readonly MD5SUM_FILE
-
-# first bump up package.json manually, commit and tag
-if [[ -d ./static/dist ]]; then
-  rm -f ./static/dist/*
-fi
-
-yarn install --frozen-lockfile
-yarn run build
-
-find package.json yarn.lock static/css static/js -type f | sort | xargs md5sum > "${MD5SUM_FILE}"
diff --git a/airflow/www/compile_assets.sh b/tests/system/providers/__init__.py
old mode 100755
new mode 100644
similarity index 67%
copy from airflow/www/compile_assets.sh
copy to tests/system/providers/__init__.py
index ba4576614d..13a83393a9
--- a/airflow/www/compile_assets.sh
+++ b/tests/system/providers/__init__.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env bash
 # 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
@@ -15,20 +14,3 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-
-set -e
-
-cd "$( dirname "${BASH_SOURCE[0]}" )"
-
-MD5SUM_FILE="static/dist/sum.md5"
-readonly MD5SUM_FILE
-
-# first bump up package.json manually, commit and tag
-if [[ -d ./static/dist ]]; then
-  rm -f ./static/dist/*
-fi
-
-yarn install --frozen-lockfile
-yarn run build
-
-find package.json yarn.lock static/css static/js -type f | sort | xargs md5sum > "${MD5SUM_FILE}"
diff --git a/airflow/www/compile_assets.sh b/tests/system/providers/apache/__init__.py
old mode 100755
new mode 100644
similarity index 67%
copy from airflow/www/compile_assets.sh
copy to tests/system/providers/apache/__init__.py
index ba4576614d..13a83393a9
--- a/airflow/www/compile_assets.sh
+++ b/tests/system/providers/apache/__init__.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env bash
 # 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
@@ -15,20 +14,3 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-
-set -e
-
-cd "$( dirname "${BASH_SOURCE[0]}" )"
-
-MD5SUM_FILE="static/dist/sum.md5"
-readonly MD5SUM_FILE
-
-# first bump up package.json manually, commit and tag
-if [[ -d ./static/dist ]]; then
-  rm -f ./static/dist/*
-fi
-
-yarn install --frozen-lockfile
-yarn run build
-
-find package.json yarn.lock static/css static/js -type f | sort | xargs md5sum > "${MD5SUM_FILE}"
diff --git a/airflow/www/compile_assets.sh b/tests/system/providers/google/__init__.py
old mode 100755
new mode 100644
similarity index 67%
rename from airflow/www/compile_assets.sh
rename to tests/system/providers/google/__init__.py
index ba4576614d..13a83393a9
--- a/airflow/www/compile_assets.sh
+++ b/tests/system/providers/google/__init__.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env bash
 # 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
@@ -15,20 +14,3 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-
-set -e
-
-cd "$( dirname "${BASH_SOURCE[0]}" )"
-
-MD5SUM_FILE="static/dist/sum.md5"
-readonly MD5SUM_FILE
-
-# first bump up package.json manually, commit and tag
-if [[ -d ./static/dist ]]; then
-  rm -f ./static/dist/*
-fi
-
-yarn install --frozen-lockfile
-yarn run build
-
-find package.json yarn.lock static/css static/js -type f | sort | xargs md5sum > "${MD5SUM_FILE}"


[airflow] 05/22: Make sure builder is created as needed before warming up (#24875)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit fa4c440bee4ce67bbccb4c68c6888d00ca1194e5
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Fri Jul 8 01:33:30 2022 +0200

    Make sure builder is created as needed before warming up (#24875)
    
    In case of parallel cache building, we want to warm-up the builder and make
    sure the builder is created. It might or might not be created by
    in case of ARM builds (and then it will point to ARM builder) but in
    case we run AMD builds, we should attempt to check and re-create it if
    needed.
    
    (cherry picked from commit 6c256c8b00f0ad780c59eaea84bf45f57f4e3d4a)
---
 .../src/airflow_breeze/commands/ci_image_commands.py   | 10 ++++++++--
 .../commands/production_image_commands.py              | 10 +++++++---
 .../src/airflow_breeze/utils/docker_command_utils.py   | 18 +++++++++++-------
 3 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/dev/breeze/src/airflow_breeze/commands/ci_image_commands.py b/dev/breeze/src/airflow_breeze/commands/ci_image_commands.py
index dbc6acda2f..bc0eca063f 100644
--- a/dev/breeze/src/airflow_breeze/commands/ci_image_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/ci_image_commands.py
@@ -74,6 +74,7 @@ from airflow_breeze.utils.confirm import STANDARD_TIMEOUT, Answer, user_confirm
 from airflow_breeze.utils.console import get_console
 from airflow_breeze.utils.docker_command_utils import (
     build_cache,
+    make_sure_builder_configured,
     perform_environment_checks,
     prepare_docker_build_command,
     prepare_docker_build_from_input,
@@ -228,6 +229,11 @@ def run_build_in_parallel(
     pool.close()
 
 
+def start_building(params: BuildCiParams, dry_run: bool, verbose: bool):
+    check_if_image_building_is_needed(params, dry_run=dry_run, verbose=verbose)
+    make_sure_builder_configured(parallel=True, params=params, dry_run=dry_run, verbose=verbose)
+
+
 @main.command(name='build-image')
 @option_github_repository
 @option_verbose
@@ -298,7 +304,7 @@ def build_image(
             params.python = python
             params.answer = answer
             params_list.append(params)
-        check_if_image_building_is_needed(params_list[0], dry_run=dry_run, verbose=verbose)
+        start_building(params_list[0], dry_run, verbose)
         run_build_in_parallel(
             image_params_list=params_list,
             python_version_list=python_version_list,
@@ -308,7 +314,7 @@ def build_image(
         )
     else:
         params = BuildCiParams(**parameters_passed)
-        check_if_image_building_is_needed(params, dry_run=dry_run, verbose=verbose)
+        start_building(params, dry_run, verbose)
         run_build(ci_image_params=params)
 
 
diff --git a/dev/breeze/src/airflow_breeze/commands/production_image_commands.py b/dev/breeze/src/airflow_breeze/commands/production_image_commands.py
index a9442ba639..2ee164645d 100644
--- a/dev/breeze/src/airflow_breeze/commands/production_image_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/production_image_commands.py
@@ -73,6 +73,7 @@ from airflow_breeze.utils.console import get_console
 from airflow_breeze.utils.custom_param_types import BetterChoice
 from airflow_breeze.utils.docker_command_utils import (
     build_cache,
+    make_sure_builder_configured,
     perform_environment_checks,
     prepare_docker_build_command,
     prepare_docker_build_from_input,
@@ -200,7 +201,10 @@ PRODUCTION_IMAGE_TOOLS_PARAMETERS = {
 }
 
 
-def start_building(prod_image_params: BuildProdParams, dry_run: bool, verbose: bool):
+def start_building(parallel: bool, prod_image_params: BuildProdParams, dry_run: bool, verbose: bool):
+    make_sure_builder_configured(
+        parallel=parallel, params=prod_image_params, dry_run=dry_run, verbose=verbose
+    )
     if prod_image_params.cleanup_context:
         clean_docker_context_files(verbose=verbose, dry_run=dry_run)
     check_docker_context_files(prod_image_params.install_packages_from_context)
@@ -346,7 +350,7 @@ def build_prod_image(
             params.python = python
             params.answer = answer
             params_list.append(params)
-        start_building(prod_image_params=params_list[0], dry_run=dry_run, verbose=verbose)
+        start_building(parallel=True, prod_image_params=params_list[0], dry_run=dry_run, verbose=verbose)
         run_build_in_parallel(
             image_params_list=params_list,
             python_version_list=python_version_list,
@@ -356,7 +360,7 @@ def build_prod_image(
         )
     else:
         params = BuildProdParams(**parameters_passed)
-        start_building(prod_image_params=params, dry_run=dry_run, verbose=verbose)
+        start_building(parallel=False, prod_image_params=params, dry_run=dry_run, verbose=verbose)
         run_build(prod_image_params=params)
 
 
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 d646ba0fab..df540a5bb8 100644
--- a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
@@ -496,13 +496,6 @@ def build_cache(
     build_command_result: Union[CompletedProcess, CalledProcessError] = CompletedProcess(
         args=[], returncode=0
     )
-    cmd = ['docker', 'buildx', 'inspect', 'airflow_cache']
-    buildx_command_result = run_command(
-        cmd, verbose=verbose, dry_run=dry_run, text=True, check=False, enabled_output_group=not parallel
-    )
-    if buildx_command_result and buildx_command_result.returncode != 0:
-        next_cmd = ['docker', 'buildx', 'create', '--name', 'airflow_cache']
-        run_command(next_cmd, verbose=verbose, text=True, check=False, enabled_output_group=not parallel)
     for platform in image_params.platforms:
         platform_image_params = deepcopy(image_params)
         # override the platform in the copied params to only be single platform per run
@@ -523,6 +516,17 @@ def build_cache(
     return build_command_result
 
 
+def make_sure_builder_configured(parallel: bool, params: CommonBuildParams, dry_run: bool, verbose: bool):
+    if params.builder != 'default':
+        cmd = ['docker', 'buildx', 'inspect', params.builder]
+        buildx_command_result = run_command(
+            cmd, verbose=verbose, dry_run=dry_run, text=True, check=False, enabled_output_group=not parallel
+        )
+        if buildx_command_result and buildx_command_result.returncode != 0:
+            next_cmd = ['docker', 'buildx', 'create', '--name', params.builder]
+            run_command(next_cmd, verbose=verbose, text=True, check=False, enabled_output_group=not parallel)
+
+
 def set_value_to_default_if_not_set(env: Dict[str, str], name: str, default: str):
     """
     Set value of name parameter to default (indexed by name) if not set.


[airflow] 22/22: Fix missing space for breeze build-image hint command (#25204)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 9b987cf64a97c4311fcfd08e39b7c3f19488d0db
Author: Gabriel Machado <ga...@hotmail.com>
AuthorDate: Thu Jul 21 00:23:49 2022 +0200

    Fix missing space for breeze build-image hint command (#25204)
    
    (cherry picked from commit 88b529d5ccf60a2394eb68c001fd782f4f9a60d5)
---
 dev/breeze/src/airflow_breeze/commands/release_management_commands.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

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 87dae0c9a2..ed62f68cb8 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -445,7 +445,7 @@ def generate_constraints(
             )
             get_console().print("\n[info]Use this command to build the image:[/]\n")
             get_console().print(
-                f"     breeze build-image --python'{shell_params.python}' "
+                f"     breeze build-image --python '{shell_params.python}' "
                 f"--upgrade-to-newer-dependencies\n"
             )
         sys.exit(1)


[airflow] 04/22: Remove full provider's specification from TEST_TYPES (#24901)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit d5357f761e9a47bf5cf3f5de3374dd95ebd297a4
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Thu Jul 7 18:05:29 2022 +0200

    Remove full provider's specification from TEST_TYPES (#24901)
    
    The new provider's selective tests introduce option to specify
    which providers should be tested (which is automatically
    used in CI). This works fine but in case when we remove
    Provider's tests from the list (MySQL/MsSQL) the removal was
    done only for the Provider's part, not for the detailed list
    of providers. That led to test attempting to run
    ```
    [amazon,apache.hive,google,mysql,postgres]
    ```
    
    for example.
    
    This PR fixes it by removing full Provider's specification.
    
    (cherry picked from commit 1404d6785a39e56d9dec282e33f7cc66519369d7)
---
 scripts/ci/testing/ci_run_airflow_testing.sh | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/scripts/ci/testing/ci_run_airflow_testing.sh b/scripts/ci/testing/ci_run_airflow_testing.sh
index 292a6b447e..5c0c10c3f3 100755
--- a/scripts/ci/testing/ci_run_airflow_testing.sh
+++ b/scripts/ci/testing/ci_run_airflow_testing.sh
@@ -107,7 +107,8 @@ function run_all_test_types_in_parallel() {
             # Those tests will run in `main` anyway.
             if [[ ${test_types_to_run} == *"Providers"* ]]; then
                 echo "${COLOR_YELLOW}Remove Providers from tests_types_to_run and skip running them altogether (mysql/mssql case).${COLOR_RESET}"
-                test_types_to_run="${test_types_to_run//Providers/}"
+                # shellcheck disable=SC2001
+                test_types_to_run=$(echo "${test_types_to_run}" | sed 's/Providers[^ ]* *//')
             fi
         fi
     fi


[airflow] 06/22: Run "fix-ownership" with sudo rather than docker image if specified (#24871)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 9b325a97e8e6b1cd0a158b28e6fc3897c9c14dea
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Fri Jul 8 01:36:20 2022 +0200

    Run "fix-ownership" with sudo rather than docker image if specified (#24871)
    
    The "fix-ownership" command uses our breeze docker image to fix
    ownership of files generated by breeze. This is nice from the user
    perspective because there is no need to authenticate with password
    and - since we already have breeze image handy - it is fast and
    painless. However in CI, there are often cases where "fix-ownership"
    does not really have an image available and needs to pull one, which
    takes 1 minute. However the user in CI has sudoer capability without
    password, so we can use it to run fix-ownership with just plain
    sudo/chown.
    
    We switch all the CI jobs to "USE_SUDO" and also avoid running
    fix-ownership on other systems that Linux, as the ownership of
    files creaed from docker as root is only problem when the filesystem
    is directly mounted and used in the container (which happens only on
    Linux). MacOS and Windows have "user-space" filesystem that are
    much slower, but then they perform user-remapping on their own
    and files created in container have automatically ownership of
    the user who runs the docker container command.
    
    (cherry picked from commit bcf2c418d261c6244e60e4c2d5de42b23b714bd1)
---
 .github/workflows/build-images.yml                 |  1 +
 .github/workflows/ci.yml                           |  1 +
 .../src/airflow_breeze/commands/ci_commands.py     | 72 ++++++++++++++++++-
 images/breeze/output-commands-hash.txt             |  2 +-
 images/breeze/output-fix-ownership.svg             | 84 ++++++++++++----------
 5 files changed, 122 insertions(+), 38 deletions(-)

diff --git a/.github/workflows/build-images.yml b/.github/workflows/build-images.yml
index 638118727b..d21aa522e4 100644
--- a/.github/workflows/build-images.yml
+++ b/.github/workflows/build-images.yml
@@ -39,6 +39,7 @@ env:
   # This token is WRITE one - pull_request_target type of events always have the WRITE token
   GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
   IMAGE_TAG_FOR_THE_BUILD: "${{ github.event.pull_request.head.sha || github.sha }}"
+  USE_SUDO: "true"
 
 concurrency:
   group: build-${{ github.event.pull_request.number || github.ref }}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index ac1fb07688..aa6c21fd9b 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -47,6 +47,7 @@ env:
   GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
   ENABLE_TEST_COVERAGE: "${{ github.event_name == 'push' }}"
   IMAGE_TAG_FOR_THE_BUILD: "${{ github.event.pull_request.head.sha || github.sha }}"
+  USE_SUDO: "true"
 
 concurrency:
   group: ci-${{ github.event.pull_request.number || github.ref }}
diff --git a/dev/breeze/src/airflow_breeze/commands/ci_commands.py b/dev/breeze/src/airflow_breeze/commands/ci_commands.py
index 826a77bf1b..cb2d05f94d 100644
--- a/dev/breeze/src/airflow_breeze/commands/ci_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/ci_commands.py
@@ -14,7 +14,11 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
+import os
+import platform
+import subprocess
 import sys
+from pathlib import Path
 from typing import Optional, Tuple
 
 import click
@@ -50,6 +54,7 @@ from airflow_breeze.utils.docker_command_utils import (
 )
 from airflow_breeze.utils.find_newer_dependencies import find_newer_dependencies
 from airflow_breeze.utils.image import find_available_ci_image
+from airflow_breeze.utils.path_utils import AIRFLOW_SOURCES_ROOT
 from airflow_breeze.utils.run_utils import run_command
 
 CI_COMMANDS = {
@@ -64,6 +69,14 @@ CI_COMMANDS = {
 }
 
 CI_PARAMETERS = {
+    "breeze fix-ownership": [
+        {
+            "name": "Fix ownership flags",
+            "options": [
+                "--use-sudo",
+            ],
+        }
+    ],
     "breeze selective-check": [
         {
             "name": "Selective check flags",
@@ -115,11 +128,68 @@ def resource_check(verbose: bool, dry_run: bool):
     check_docker_resources(shell_params.airflow_image_name, verbose=verbose, dry_run=dry_run)
 
 
+HOME_DIR = Path(os.path.expanduser('~')).resolve()
+
+DIRECTORIES_TO_FIX = [
+    AIRFLOW_SOURCES_ROOT,
+    HOME_DIR / ".aws",
+    HOME_DIR / ".azure",
+    HOME_DIR / ".config/gcloud",
+    HOME_DIR / ".docker",
+    AIRFLOW_SOURCES_ROOT,
+]
+
+
+def fix_ownership_for_file(file: Path, dry_run: bool, verbose: bool):
+    get_console().print(f"[info]Fixing ownership of {file}")
+    result = run_command(
+        ["sudo", "chown", f"{os.getuid}:{os.getgid()}", str(file.resolve())],
+        check=False,
+        stderr=subprocess.STDOUT,
+        dry_run=dry_run,
+        verbose=verbose,
+    )
+    if result.returncode != 0:
+        get_console().print(f"[warning]Could not fix ownership for {file}: {result.stdout}")
+
+
+def fix_ownership_for_path(path: Path, dry_run: bool, verbose: bool):
+    if path.is_dir():
+        for p in Path(path).rglob('*'):
+            if p.owner == 'root':
+                fix_ownership_for_file(p, dry_run=dry_run, verbose=verbose)
+    else:
+        if path.owner == 'root':
+            fix_ownership_for_file(path, dry_run=dry_run, verbose=verbose)
+
+
+def fix_ownership_without_docker(dry_run: bool, verbose: bool):
+    for directory_to_fix in DIRECTORIES_TO_FIX:
+        fix_ownership_for_path(directory_to_fix, dry_run=dry_run, verbose=verbose)
+
+
 @main.command(name="fix-ownership", help="Fix ownership of source files to be same as host user.")
+@click.option(
+    '--use-sudo',
+    is_flag=True,
+    help="Use sudo instead of docker image to fix the ownership. You need to be a `sudoer` to run it",
+    envvar='USE_SUDO',
+)
 @option_github_repository
 @option_verbose
 @option_dry_run
-def fix_ownership(github_repository: str, verbose: bool, dry_run: bool):
+def fix_ownership(github_repository: str, use_sudo: bool, verbose: bool, dry_run: bool):
+    system = platform.system().lower()
+    if system != 'linux':
+        get_console().print(
+            f"[warning]You should only need to run fix-ownership on Linux and your system is {system}"
+        )
+        sys.exit(0)
+    if use_sudo:
+        get_console().print("[info]Fixing ownership using sudo.")
+        fix_ownership_without_docker(dry_run=dry_run, verbose=verbose)
+        sys.exit(0)
+    get_console().print("[info]Fixing ownership using docker.")
     perform_environment_checks(verbose=verbose)
     shell_params = find_available_ci_image(github_repository, dry_run, verbose)
     extra_docker_flags = get_extra_docker_flags(MOUNT_ALL)
diff --git a/images/breeze/output-commands-hash.txt b/images/breeze/output-commands-hash.txt
index d3291cb775..abf5c552cd 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -12,7 +12,7 @@ config:92653afc11889e1b78e3a2e38f41107f
 docker-compose-tests:8ae3b6211fd31db81a750d1c6b96ec3d
 exec:e4329909b8b2a610fa4fad5116c4b896
 find-newer-dependencies:5c9c5e568a930960a25ece6039e03e5c
-fix-ownership:596143cc74217f0a90850a554220ea45
+fix-ownership:84902165a54467564fbdd3598fa273e2
 free-space:bb8e7ac63d12ab3ede272a898de2f527
 generate-constraints:a5120e79439f30eb7fbee929dca23156
 prepare-airflow-package:cff9d88ca313db10f3cc464c6798f6be
diff --git a/images/breeze/output-fix-ownership.svg b/images/breeze/output-fix-ownership.svg
index d8fe2ea84f..f7208613b1 100644
--- a/images/breeze/output-fix-ownership.svg
+++ b/images/breeze/output-fix-ownership.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 318.4" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 391.59999999999997" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -19,85 +19,97 @@
         font-weight: 700;
     }
 
-    .terminal-2814491796-matrix {
+    .terminal-1020697717-matrix {
         font-family: Fira Code, monospace;
         font-size: 20px;
         line-height: 24.4px;
         font-variant-east-asian: full-width;
     }
 
-    .terminal-2814491796-title {
+    .terminal-1020697717-title {
         font-size: 18px;
         font-weight: bold;
         font-family: arial;
     }
 
-    .terminal-2814491796-r1 { fill: #c5c8c6;font-weight: bold }
-.terminal-2814491796-r2 { fill: #c5c8c6 }
-.terminal-2814491796-r3 { fill: #d0b344;font-weight: bold }
-.terminal-2814491796-r4 { fill: #868887 }
-.terminal-2814491796-r5 { fill: #68a0b3;font-weight: bold }
-.terminal-2814491796-r6 { fill: #98a84b;font-weight: bold }
-.terminal-2814491796-r7 { fill: #8d7b39 }
+    .terminal-1020697717-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-1020697717-r2 { fill: #c5c8c6 }
+.terminal-1020697717-r3 { fill: #d0b344;font-weight: bold }
+.terminal-1020697717-r4 { fill: #868887 }
+.terminal-1020697717-r5 { fill: #68a0b3;font-weight: bold }
+.terminal-1020697717-r6 { fill: #98a84b;font-weight: bold }
+.terminal-1020697717-r7 { fill: #8d7b39 }
     </style>
 
     <defs>
-    <clipPath id="terminal-2814491796-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="267.4" />
+    <clipPath id="terminal-1020697717-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="340.59999999999997" />
     </clipPath>
-    <clipPath id="terminal-2814491796-line-0">
+    <clipPath id="terminal-1020697717-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2814491796-line-1">
+<clipPath id="terminal-1020697717-line-1">
     <rect x="0" y="25.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2814491796-line-2">
+<clipPath id="terminal-1020697717-line-2">
     <rect x="0" y="50.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2814491796-line-3">
+<clipPath id="terminal-1020697717-line-3">
     <rect x="0" y="74.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2814491796-line-4">
+<clipPath id="terminal-1020697717-line-4">
     <rect x="0" y="99.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2814491796-line-5">
+<clipPath id="terminal-1020697717-line-5">
     <rect x="0" y="123.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2814491796-line-6">
+<clipPath id="terminal-1020697717-line-6">
     <rect x="0" y="147.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2814491796-line-7">
+<clipPath id="terminal-1020697717-line-7">
     <rect x="0" y="172.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2814491796-line-8">
+<clipPath id="terminal-1020697717-line-8">
     <rect x="0" y="196.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2814491796-line-9">
+<clipPath id="terminal-1020697717-line-9">
     <rect x="0" y="221.1" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="terminal-1020697717-line-10">
+    <rect x="0" y="245.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-1020697717-line-11">
+    <rect x="0" y="269.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-1020697717-line-12">
+    <rect x="0" y="294.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="316.4" rx="8"/><text class="terminal-2814491796-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;fix-ownership</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="389.6" rx="8"/><text class="terminal-1020697717-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;fix-ownership</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
             <circle cx="44" cy="0" r="7" fill="#28c840"/>
             </g>
         
-    <g transform="translate(9, 41)" clip-path="url(#terminal-2814491796-clip-terminal)">
+    <g transform="translate(9, 41)" clip-path="url(#terminal-1020697717-clip-terminal)">
     
-    <g class="terminal-2814491796-matrix">
-    <text class="terminal-2814491796-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-2814491796-line-0)">
-</text><text class="terminal-2814491796-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-2814491796-line-1)">Usage:&#160;</text><text class="terminal-2814491796-r1" x="97.6" y="44.4" textLength="366" clip-path="url(#terminal-2814491796-line-1)">breeze&#160;fix-ownership&#160;[OPTIONS]</text><text class="terminal-2814491796-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-2814491796-line-1)">
-</text><text class="terminal-2814491796-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-2814491796-line-2)">
-</text><text class="terminal-2814491796-r2" x="12.2" y="93.2" textLength="658.8" clip-path="url(#terminal-2814491796-line-3)">Fix&#160;ownership&#160;of&#160;source&#160;files&#160;to&#160;be&#160;same&#160;as&#160;host&#160;user.</text><text class="terminal-2814491796-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-2814491796-line-3)">
-</text><text class="terminal-2814491796-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-2814491796-line-4)">
-</text><text class="terminal-2814491796-r4" x="0" y="142" textLength="24.4" clip-path="url(#terminal-2814491796-line-5)">╭─</text><text class="terminal-2814491796-r4" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-2814491796-line-5)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-2814491796-r4" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-2814491796- [...]
-</text><text class="terminal-2814491796-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-2814491796-line-6)">│</text><text class="terminal-2814491796-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-2814491796-line-6)">-</text><text class="terminal-2814491796-r5" x="36.6" y="166.4" textLength="85.4" clip-path="url(#terminal-2814491796-line-6)">-github</text><text class="terminal-2814491796-r5" x="122" y="166.4" textLength="134.2" clip-path="url(#terminal-28 [...]
-</text><text class="terminal-2814491796-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-2814491796-line-7)">│</text><text class="terminal-2814491796-r5" x="24.4" y="190.8" textLength="12.2" clip-path="url(#terminal-2814491796-line-7)">-</text><text class="terminal-2814491796-r5" x="36.6" y="190.8" textLength="97.6" clip-path="url(#terminal-2814491796-line-7)">-verbose</text><text class="terminal-2814491796-r6" x="280.6" y="190.8" textLength="24.4" clip-path="url(#terminal- [...]
-</text><text class="terminal-2814491796-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-2814491796-line-8)">│</text><text class="terminal-2814491796-r5" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-2814491796-line-8)">-</text><text class="terminal-2814491796-r5" x="36.6" y="215.2" textLength="48.8" clip-path="url(#terminal-2814491796-line-8)">-dry</text><text class="terminal-2814491796-r5" x="85.4" y="215.2" textLength="48.8" clip-path="url(#terminal-28144 [...]
-</text><text class="terminal-2814491796-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-2814491796-line-9)">│</text><text class="terminal-2814491796-r5" x="24.4" y="239.6" textLength="12.2" clip-path="url(#terminal-2814491796-line-9)">-</text><text class="terminal-2814491796-r5" x="36.6" y="239.6" textLength="61" clip-path="url(#terminal-2814491796-line-9)">-help</text><text class="terminal-2814491796-r6" x="280.6" y="239.6" textLength="24.4" clip-path="url(#terminal-28144 [...]
-</text><text class="terminal-2814491796-r4" x="0" y="264" textLength="1464" clip-path="url(#terminal-2814491796-line-10)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2814491796-r2" x="1464" y="264" textLength="12.2" clip-path="url(#terminal-2814491796-line-10)">
+    <g class="terminal-1020697717-matrix">
+    <text class="terminal-1020697717-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-1020697717-line-0)">
+</text><text class="terminal-1020697717-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-1020697717-line-1)">Usage:&#160;</text><text class="terminal-1020697717-r1" x="97.6" y="44.4" textLength="366" clip-path="url(#terminal-1020697717-line-1)">breeze&#160;fix-ownership&#160;[OPTIONS]</text><text class="terminal-1020697717-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-1020697717-line-1)">
+</text><text class="terminal-1020697717-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-1020697717-line-2)">
+</text><text class="terminal-1020697717-r2" x="12.2" y="93.2" textLength="658.8" clip-path="url(#terminal-1020697717-line-3)">Fix&#160;ownership&#160;of&#160;source&#160;files&#160;to&#160;be&#160;same&#160;as&#160;host&#160;user.</text><text class="terminal-1020697717-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-1020697717-line-3)">
+</text><text class="terminal-1020697717-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-1020697717-line-4)">
+</text><text class="terminal-1020697717-r4" x="0" y="142" textLength="24.4" clip-path="url(#terminal-1020697717-line-5)">╭─</text><text class="terminal-1020697717-r4" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-1020697717-line-5)">&#160;Fix&#160;ownership&#160;flags&#160;───────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-1020697717-r4" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-1 [...]
+</text><text class="terminal-1020697717-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-1020697717-line-6)">│</text><text class="terminal-1020697717-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-1020697717-line-6)">-</text><text class="terminal-1020697717-r5" x="36.6" y="166.4" textLength="48.8" clip-path="url(#terminal-1020697717-line-6)">-use</text><text class="terminal-1020697717-r5" x="85.4" y="166.4" textLength="61" clip-path="url(#terminal-1020697 [...]
+</text><text class="terminal-1020697717-r4" x="0" y="190.8" textLength="1464" clip-path="url(#terminal-1020697717-line-7)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1020697717-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#terminal-1020697717-line-7)">
+</text><text class="terminal-1020697717-r4" x="0" y="215.2" textLength="24.4" clip-path="url(#terminal-1020697717-line-8)">╭─</text><text class="terminal-1020697717-r4" x="24.4" y="215.2" textLength="1415.2" clip-path="url(#terminal-1020697717-line-8)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-1020697717-r4" x="1439.6" y="215.2" textLength="24.4" clip-path="url(#terminal-10206 [...]
+</text><text class="terminal-1020697717-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-1020697717-line-9)">│</text><text class="terminal-1020697717-r5" x="24.4" y="239.6" textLength="12.2" clip-path="url(#terminal-1020697717-line-9)">-</text><text class="terminal-1020697717-r5" x="36.6" y="239.6" textLength="85.4" clip-path="url(#terminal-1020697717-line-9)">-github</text><text class="terminal-1020697717-r5" x="122" y="239.6" textLength="134.2" clip-path="url(#terminal-10 [...]
+</text><text class="terminal-1020697717-r4" x="0" y="264" textLength="12.2" clip-path="url(#terminal-1020697717-line-10)">│</text><text class="terminal-1020697717-r5" x="24.4" y="264" textLength="12.2" clip-path="url(#terminal-1020697717-line-10)">-</text><text class="terminal-1020697717-r5" x="36.6" y="264" textLength="97.6" clip-path="url(#terminal-1020697717-line-10)">-verbose</text><text class="terminal-1020697717-r6" x="280.6" y="264" textLength="24.4" clip-path="url(#terminal-10206 [...]
+</text><text class="terminal-1020697717-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-1020697717-line-11)">│</text><text class="terminal-1020697717-r5" x="24.4" y="288.4" textLength="12.2" clip-path="url(#terminal-1020697717-line-11)">-</text><text class="terminal-1020697717-r5" x="36.6" y="288.4" textLength="48.8" clip-path="url(#terminal-1020697717-line-11)">-dry</text><text class="terminal-1020697717-r5" x="85.4" y="288.4" textLength="48.8" clip-path="url(#terminal-10 [...]
+</text><text class="terminal-1020697717-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-1020697717-line-12)">│</text><text class="terminal-1020697717-r5" x="24.4" y="312.8" textLength="12.2" clip-path="url(#terminal-1020697717-line-12)">-</text><text class="terminal-1020697717-r5" x="36.6" y="312.8" textLength="61" clip-path="url(#terminal-1020697717-line-12)">-help</text><text class="terminal-1020697717-r6" x="280.6" y="312.8" textLength="24.4" clip-path="url(#terminal-10 [...]
+</text><text class="terminal-1020697717-r4" x="0" y="337.2" textLength="1464" clip-path="url(#terminal-1020697717-line-13)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1020697717-r2" x="1464" y="337.2" textLength="12.2" clip-path="url(#terminal-1020697717-line-13)">
 </text>
     </g>
     </g>


[airflow] 16/22: Speed up Kubernetes tests ~30% on main. (#25143)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 4fe1dabd30593e3c10750f3ba66b21e244ada4c6
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Tue Jul 19 13:37:00 2022 +0200

    Speed up Kubernetes tests ~30% on main. (#25143)
    
    We should have enough resources - we were limiting them to 2 parallel
    runs (we assumed 4 CPUs are needed for full K8S tests). However
    monitoring shows that ~20/30% memory and up to 4 CPUs are used
    when 2 tests are running in parallel (on a big instance) but the tests
    have also some peaks that might cause more than 3 parallel tests to fail.
    
    We currently run 5 tests so increasing the limit to 3 for self-hosted
    runners should actually speed it up quite a bit (generally speaking we
    had to run 2 tests in parallel twice and 5th test was run as standalone.
    By increasing the limit to 3 we switch to 3x, 2x mode - which not only
    will safe 30% of the time, but also has a free "slot" for one more
    K8S version.
    
    (cherry picked from commit b97d9b068368c76c52abdfbf972af5b7c93ea314)
---
 .github/workflows/ci.yml          |  4 ++--
 scripts/ci/libraries/_parallel.sh | 14 ++++----------
 2 files changed, 6 insertions(+), 12 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 71514b8245..86666cf17a 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1454,7 +1454,7 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
 
   tests-kubernetes:
     timeout-minutes: 240
-    name: Helm Chart; ${{matrix.executor}}
+    name: Helm Chart; ${{matrix.executor}} - ${{needs.build-info.outputs.kubernetes-versions-list-as-string}}
     runs-on: ${{ fromJson(needs.build-info.outputs.runs-on) }}
     needs: [build-info, wait-for-prod-images]
     strategy:
@@ -1524,7 +1524,7 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
 
   tests-helm-executor-upgrade:
     timeout-minutes: 150
-    name: Helm Chart Executor Upgrade
+    name: Helm Chart Executor Upgrade - ${{needs.build-info.outputs.kubernetes-versions-list-as-string}}
     runs-on: ${{ fromJson(needs.build-info.outputs.runs-on) }}
     needs: [build-info, wait-for-prod-images]
     env:
diff --git a/scripts/ci/libraries/_parallel.sh b/scripts/ci/libraries/_parallel.sh
index c09ca656c7..e3bf5acb0e 100644
--- a/scripts/ci/libraries/_parallel.sh
+++ b/scripts/ci/libraries/_parallel.sh
@@ -252,16 +252,10 @@ function parallel::get_maximum_parallel_k8s_jobs() {
         echo
         export MAX_PARALLEL_K8S_JOBS="1"
     else
-        if [[ ${MAX_PARALLEL_K8S_JOBS=} != "" ]]; then
-            echo
-            echo "${COLOR_YELLOW}Maximum parallel k8s jobs forced vi MAX_PARALLEL_K8S_JOBS = ${MAX_PARALLEL_K8S_JOBS}${COLOR_RESET}"
-            echo
-        else
-            MAX_PARALLEL_K8S_JOBS=$((CPUS_AVAILABLE_FOR_DOCKER / 4))
-            echo
-            echo "${COLOR_YELLOW}Maximum parallel k8s jobs set to number of CPUs available for Docker = ${MAX_PARALLEL_K8S_JOBS}${COLOR_RESET}"
-            echo
-        fi
+        echo
+        echo "${COLOR_YELLOW}This is a Self-Hosted runner - forcing max parallel jobs to 5${COLOR_RESET}"
+        echo
+        export MAX_PARALLEL_K8S_JOBS="3"
     fi
     export MAX_PARALLEL_K8S_JOBS
 }


[airflow] 10/22: Old "Core" SQL database config used in breeze for old airflow versions (#25009)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit ca3c851032ce15a48f330a9c8bb146197372af0e
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Wed Jul 13 12:49:10 2022 +0200

    Old "Core" SQL database config used in breeze for old airflow versions (#25009)
    
    Airflow versions from before Airlfow 2.3 used "CORE" section
    for SQL configuration and they need to add variable
    from the DATABASE one when Airflow version 2.2 and before is
    used in `--use-airflow-version` switch.
    
    (cherry picked from commit e9d19a60a017224165e835949f623f106b97e1cb)
---
 Dockerfile.ci                   | 4 ++++
 scripts/docker/entrypoint_ci.sh | 4 ++++
 2 files changed, 8 insertions(+)

diff --git a/Dockerfile.ci b/Dockerfile.ci
index 782342a3b8..4abaa4ad44 100644
--- a/Dockerfile.ci
+++ b/Dockerfile.ci
@@ -727,6 +727,10 @@ if [[ ${SKIP_ENVIRONMENT_INITIALIZATION=} != "true" ]]; then
             echo
             install_released_airflow_version "${USE_AIRFLOW_VERSION}" "${AIRFLOW_CONSTRAINTS_REFERENCE}"
         fi
+        if [[ "${USE_AIRFLOW_VERSION}" =~ ^2\.2\..*|^2\.1\..*|^2\.0\..* && "${AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=}" != "" ]]; then
+            # make sure old variable is used for older airflow versions
+            export AIRFLOW__CORE__SQL_ALCHEMY_CONN="${AIRFLOW__DATABASE__SQL_ALCHEMY_CONN}"
+        fi
     fi
     if [[ ${USE_PACKAGES_FROM_DIST=} == "true" ]]; then
         echo
diff --git a/scripts/docker/entrypoint_ci.sh b/scripts/docker/entrypoint_ci.sh
index 42dc3f5712..ae4961ea64 100755
--- a/scripts/docker/entrypoint_ci.sh
+++ b/scripts/docker/entrypoint_ci.sh
@@ -135,6 +135,10 @@ if [[ ${SKIP_ENVIRONMENT_INITIALIZATION=} != "true" ]]; then
             echo
             install_released_airflow_version "${USE_AIRFLOW_VERSION}" "${AIRFLOW_CONSTRAINTS_REFERENCE}"
         fi
+        if [[ "${USE_AIRFLOW_VERSION}" =~ ^2\.2\..*|^2\.1\..*|^2\.0\..* && "${AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=}" != "" ]]; then
+            # make sure old variable is used for older airflow versions
+            export AIRFLOW__CORE__SQL_ALCHEMY_CONN="${AIRFLOW__DATABASE__SQL_ALCHEMY_CONN}"
+        fi
     fi
     if [[ ${USE_PACKAGES_FROM_DIST=} == "true" ]]; then
         echo


[airflow] 02/22: Add more selective provider tests (#24666)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 4daa5c11019820524daa212ffa47a1196016ba12
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Wed Jul 6 21:55:21 2022 +0200

    Add more selective provider tests (#24666)
    
    After implementing #24610 and few follow-up fixes, it is now easy
    to add more optimizations to our unit test execution in CI (and
    to give this capability back to our contributors).
    
    This PR adds capability of running tests for selected set of
    providers - not for the whole "Providers" group. You can
    specify `--test-type "Providers[airbyte,http]" to only run tests
    for the two selected providers.
    
    This is the step towards separating providers to separate
    repositories, but it also allows to optimize the experience of
    the contributors developing only single provider changes (which
    is vast majority of contributions).
    
    This also allows to optimize build and elapsed time needd to run
    tests for those PRs that only affects selected providers (again -
    vast majority of PRs).
    
    The CI selection of which provider tests is done now in Selective
    Checkcs - they are a bit smarter in just selecting the providers
    that has been changed, they also check if there are any other
    providers that depend on it (we keep automatically updated by
    pre-commit dependencies.json file and this file determines
    which files should be run.
    
    (cherry picked from commit 3dedbd34e79c38d0fd5c55313d4b8fb3ced125ba)
---
 BREEZE.rst                                         |  53 ++++++-
 Dockerfile.ci                                      |   7 +-
 TESTING.rst                                        |  15 +-
 dev/breeze/SELECTIVE_CHECKS.md                     |   8 ++
 .../airflow_breeze/commands/testing_commands.py    |  10 +-
 .../src/airflow_breeze/utils/selective_checks.py   |  87 +++++++++--
 dev/breeze/tests/test_selective_checks.py          |  74 ++++++++--
 images/breeze/output-commands-hash.txt             |   2 +-
 images/breeze/output-tests.svg                     | 160 +++++++++++----------
 scripts/docker/entrypoint_ci.sh                    |   7 +-
 10 files changed, 311 insertions(+), 112 deletions(-)

diff --git a/BREEZE.rst b/BREEZE.rst
index 12bdeda0e9..3a3034b06f 100644
--- a/BREEZE.rst
+++ b/BREEZE.rst
@@ -491,9 +491,6 @@ Airflow Breeze is a bash script serving as a "swiss-army-knife" of Airflow testi
 hood it uses other scripts that you can also run manually if you have problem with running the Breeze
 environment. Breeze script allows performing the following tasks:
 
-Development tasks
------------------
-
 Those are commands mostly used by contributors:
 
 * Execute arbitrary command in the test environment with ``breeze shell`` command
@@ -503,6 +500,7 @@ Those are commands mostly used by contributors:
 * Initialize local virtualenv with ``./scripts/tools/initialize_virtualenv.py`` command
 * Run static checks with autocomplete support ``breeze static-checks`` command
 * Run test specified with ``breeze tests`` command
+* Run docker-compose tests with ``breeze docker-compose-tests`` command.
 * Build CI docker image with ``breeze build-image`` command
 * Cleanup breeze with ``breeze cleanup`` command
 
@@ -515,8 +513,53 @@ Additional management tasks:
 Tests
 -----
 
-* Run docker-compose tests with ``breeze docker-compose-tests`` command.
-* Run test specified with ``breeze tests`` command.
+You can regular unit tests with ``breeze`` in two different ways, either interactively run tests with
+the default ``shell`` command or via the ``tests`` command.
+
+Iterate on tests interactively
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+You can simply enter the ``breeze`` container and run ``pytest`` command there. You can enter the
+container via just ``breeze`` command or ``breeze shell`` command (the latter has more options
+useful when you run integration or system tests). This is the best way if you want to interactively
+run selected tests and iterate with the tests. Once you enter ``breeze`` environment it is ready
+out-of-the-box to run your tests by running the right ``pytest`` command (autocomplete should help
+you with autocompleting test name if you start typing ``pytest tests<TAB>``).
+
+Here are few examples:
+
+Running single test:
+
+.. code-block:: bash
+
+    pytest tests/core/test_core.py::TestCore::test_check_operators
+
+To run the whole test class:
+
+.. code-block:: bash
+
+    pytest tests/core/test_core.py::TestCore
+
+You can re-run the tests interactively, add extra parameters to pytest and modify the files before
+re-running the test to iterate over the tests. You can also add more flags when starting the
+``breeze shell`` command when you run integration tests or system tests. Read more details about it
+in the ``TESTING.rst <TESTING.rst#>`` where all the test types of our are explained and more information
+on how to run them.
+
+Running group of tests
+~~~~~~~~~~~~~~~~~~~~~~
+
+You can also run tests via built-in ``breeze tests`` command - similarly as iterative ``pytest`` command
+allows to run test individually, or by class or in any other way pytest allows to test them, but it
+also allows to run the tests in the same test "types" that are used to run the tests in CI: Core, Always
+API, Providers. This how our CI runs them - running each group in parallel to other groups and you can
+replicate this behaviour.
+
+Another interesting use of the ``breeze tests`` command is that you can easily specify sub-set of the
+tests for Providers. ``breeze tests --test-type "Providers[airbyte,http]`` for example will only run
+tests for airbyte and http providers.
+
+Here is the detailed set of options for the ``breeze tests`` command.
 
 .. image:: ./images/breeze/output-tests.svg
   :width: 100%
diff --git a/Dockerfile.ci b/Dockerfile.ci
index 337901d4a8..782342a3b8 100644
--- a/Dockerfile.ci
+++ b/Dockerfile.ci
@@ -952,13 +952,18 @@ else
             ${TEST_TYPE} == "Long" || \
             ${TEST_TYPE} == "Integration" ]]; then
         SELECTED_TESTS=("${ALL_TESTS[@]}")
+    elif [[ ${TEST_TYPE} =~ Providers\[(.*)\] ]]; then
+        SELECTED_TESTS=()
+        for provider in ${BASH_REMATCH[1]//,/ }
+        do
+            SELECTED_TESTS+=("tests/providers/${provider//./\/}")
+        done
     else
         echo
         echo  "${COLOR_RED}ERROR: Wrong test type ${TEST_TYPE}  ${COLOR_RESET}"
         echo
         exit 1
     fi
-
 fi
 readonly SELECTED_TESTS CLI_TESTS API_TESTS PROVIDERS_TESTS CORE_TESTS WWW_TESTS \
     ALL_TESTS ALL_PRESELECTED_TESTS
diff --git a/TESTING.rst b/TESTING.rst
index 4f7de58b76..0e2bd60289 100644
--- a/TESTING.rst
+++ b/TESTING.rst
@@ -109,7 +109,8 @@ To run unit tests from the Visual Studio Code:
     :alt: Running tests
 
 Running Unit Tests
---------------------------------
+------------------
+
 To run unit, integration, and system tests from the Breeze and your
 virtualenv, you can use the `pytest <http://doc.pytest.org/en/latest/>`_ framework.
 
@@ -188,6 +189,18 @@ You can also limit the tests to execute to specific group of tests
 
     breeze tests --test-type Core
 
+In case of Providers tests, you can run tests for all providers
+
+.. code-block:: bash
+
+    breeze tests --test-type Providers
+
+You can also limit the set of providers you would like to run tests of
+
+.. code-block:: bash
+
+    breeze tests --test-type "Providers[airbyte,http]"
+
 
 You can also write tests in "limited progress" mode (useful in the future to run CI). In this mode each
 test just prints "percentage" summary of the run as single line and only dumps full output of the test
diff --git a/dev/breeze/SELECTIVE_CHECKS.md b/dev/breeze/SELECTIVE_CHECKS.md
index 4504f8d9cd..c99139e34a 100644
--- a/dev/breeze/SELECTIVE_CHECKS.md
+++ b/dev/breeze/SELECTIVE_CHECKS.md
@@ -87,6 +87,14 @@ The logic implements the following rules:
 * If no Source files are changed - no tests are run and no further rules below are checked.
 * `Image building` is enabled if either test are run, docs are build or kubernetes tests are run. All those
   need `CI` or `PROD` images to be built.
+* In case of `Providers` test in regular PRs, additional check is done in order to determine which
+  providers are affected and the actual selection is made based on that:
+  * if directly provider code is changed (either in the provider, test or system tests) then this provider
+    is selected.
+  * if there are any providers that depend on the affected providers, they are also included in the list
+    of affected providers (but not recursively - only direct dependencies are added)
+  * if there are any changes to "common" provider code not belonging to any provider (usually system tests
+    or tests), then tests for all Providers are run
 * The specific unit test type is enabled only if changed files match the expected patterns for each type
   (`API`, `CLI`, `WWW`, `Providers`). The `Always` test type is added always if any unit tests are run.
   `Providers` tests are removed if current branch is different than `main`
diff --git a/dev/breeze/src/airflow_breeze/commands/testing_commands.py b/dev/breeze/src/airflow_breeze/commands/testing_commands.py
index 8c9200a840..b53333ea64 100644
--- a/dev/breeze/src/airflow_breeze/commands/testing_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/testing_commands.py
@@ -48,7 +48,7 @@ from airflow_breeze.utils.common_options import (
     option_verbose,
 )
 from airflow_breeze.utils.console import get_console, message_type_from_return_code
-from airflow_breeze.utils.custom_param_types import BetterChoice
+from airflow_breeze.utils.custom_param_types import NotVerifiedBetterChoice
 from airflow_breeze.utils.docker_command_utils import (
     get_env_variables_for_docker_commands,
     perform_environment_checks,
@@ -247,9 +247,10 @@ def run_with_progress(
 @option_mount_sources
 @click.option(
     "--test-type",
-    help="Type of test to run.",
+    help="Type of test to run. Note that with Providers, you can also specify which provider "
+    "tests should be run - for example --test-type \"Providers[airbyte,http]\"",
     default="All",
-    type=BetterChoice(ALLOWED_TEST_TYPE_CHOICES),
+    type=NotVerifiedBetterChoice(ALLOWED_TEST_TYPE_CHOICES),
 )
 @option_db_reset
 @click.argument('extra_pytest_args', nargs=-1, type=click.UNPROCESSED)
@@ -272,6 +273,9 @@ def tests(
     os.environ["RUN_TESTS"] = "true"
     if test_type:
         os.environ["TEST_TYPE"] = test_type
+        if "[" in test_type and not test_type.startswith("Providers"):
+            get_console().print("[error]Only 'Providers' test type can specify actual tests with \\[\\][/]")
+            sys.exit(1)
     if integration:
         if "trino" in integration:
             integration = integration + ("kerberos",)
diff --git a/dev/breeze/src/airflow_breeze/utils/selective_checks.py b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
index f47e30ec85..0d774c6c19 100644
--- a/dev/breeze/src/airflow_breeze/utils/selective_checks.py
+++ b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
@@ -17,12 +17,19 @@
 
 from __future__ import annotations
 
+import json
+import os
 import sys
 from enum import Enum
 
+from rich.markup import escape
+
+from airflow_breeze.utils.path_utils import AIRFLOW_SOURCES_ROOT
+
 if sys.version_info >= (3, 8):
     from functools import cached_property
 else:
+    # noinspection PyUnresolvedReferences
     from cached_property import cached_property
 
 from functools import lru_cache
@@ -59,7 +66,7 @@ FULL_TESTS_NEEDED_LABEL = "full tests needed"
 def get_ga_output(name: str, value: Any) -> str:
     output_name = name.replace('_', '-')
     printed_value = str(value).lower() if isinstance(value, bool) else value
-    get_console().print(f"[info]{output_name}[/] = [green]{printed_value}[/]")
+    get_console().print(f"[info]{output_name}[/] = [green]{escape(str(printed_value))}[/]")
     return f"::set-output name={output_name}::{printed_value}"
 
 
@@ -127,6 +134,7 @@ CI_FILE_GROUP_MATCHES = HashableDict(
             r"^airflow/.*\.py$",
             r"^chart",
             r"^providers",
+            r"^tests/system",
             r"^CHANGELOG\.txt",
             r"^airflow/config_templates/config\.yml",
             r"^chart/RELEASE_NOTES\.txt",
@@ -148,6 +156,7 @@ CI_FILE_GROUP_MATCHES = HashableDict(
             r"^kubernetes_tests",
             r"^airflow/providers/cncf/kubernetes/",
             r"^tests/providers/cncf/kubernetes/",
+            r"^tests/system/providers/cncf/kubernetes/",
         ],
         FileGroupForCi.ALL_PYTHON_FILES: [
             r"\.py$",
@@ -178,11 +187,61 @@ TEST_TYPE_MATCHES = HashableDict(
         SelectiveUnitTestTypes.PROVIDERS: [
             "^airflow/providers/",
             "^tests/providers/",
+            "^tests/system/",
         ],
         SelectiveUnitTestTypes.WWW: ["^airflow/www", "^tests/www", "^airflow/ui"],
     }
 )
 
+TESTS_PROVIDERS_ROOT = AIRFLOW_SOURCES_ROOT / "tests" / "providers"
+SYSTEM_TESTS_PROVIDERS_ROOT = AIRFLOW_SOURCES_ROOT / "tests" / "system" / "providers"
+AIRFLOW_PROVIDERS_ROOT = AIRFLOW_SOURCES_ROOT / "airflow" / "providers"
+
+
+def find_provider_affected(changed_file: str) -> str | None:
+    file_path = AIRFLOW_SOURCES_ROOT / changed_file
+    # is_relative_to is only available in Python 3.9 - we should simplify this check when we are Python 3.9+
+    for provider_root in (TESTS_PROVIDERS_ROOT, SYSTEM_TESTS_PROVIDERS_ROOT, AIRFLOW_PROVIDERS_ROOT):
+        try:
+            file_path.relative_to(provider_root)
+            relative_base_path = provider_root
+            break
+        except ValueError:
+            pass
+    else:
+        return None
+
+    for parent_dir_path in file_path.parents:
+        if parent_dir_path == relative_base_path:
+            break
+        relative_path = parent_dir_path.relative_to(relative_base_path)
+        if (AIRFLOW_PROVIDERS_ROOT / relative_path / "provider.yaml").exists():
+            return str(parent_dir_path.relative_to(relative_base_path)).replace(os.sep, ".")
+    # If we got here it means that some "common" files were modified. so we need to test all Providers
+    return "Providers"
+
+
+def add_dependent_providers(
+    providers: set[str], provider_to_check: str, dependencies: dict[str, dict[str, list[str]]]
+):
+    for provider, provider_info in dependencies.items():
+        if provider_to_check in provider_info['cross-providers-deps']:
+            providers.add(provider)
+
+
+def find_all_providers_affected(changed_files: tuple[str, ...]) -> set[str]:
+    all_providers: set[str] = set()
+    for changed_file in changed_files:
+        provider = find_provider_affected(changed_file)
+        if provider == "Providers":
+            return set()
+        if provider is not None:
+            all_providers.add(provider)
+    dependencies = json.loads((AIRFLOW_SOURCES_ROOT / "generated" / "provider_dependencies.json").read_text())
+    for provider in list(all_providers):
+        add_dependent_providers(all_providers, provider, dependencies)
+    return all_providers
+
 
 class SelectiveChecks:
     __HASHABLE_FIELDS = {'_files', '_default_branch', '_commit_ref', "_pr_labels", "_github_event"}
@@ -461,6 +520,11 @@ class SelectiveChecks:
             get_console().print(remaining_files)
             candidate_test_types.update(all_selective_test_types())
         else:
+            if "Providers" in candidate_test_types:
+                affected_providers = find_all_providers_affected(changed_files=self._files)
+                if len(affected_providers) != 0:
+                    candidate_test_types.remove("Providers")
+                    candidate_test_types.add(f"Providers[{','.join(sorted(affected_providers))}]")
             get_console().print(
                 "[warning]There are no core/other files. Only tests relevant to the changed files are run.[/]"
             )
@@ -474,22 +538,25 @@ class SelectiveChecks:
         if not self.run_tests:
             return ""
         if self._run_everything:
-            current_test_types = list(all_selective_test_types())
+            current_test_types = set(all_selective_test_types())
         else:
-            current_test_types = self._get_test_types_to_run()
+            current_test_types = set(self._get_test_types_to_run())
         if self._default_branch != "main":
-            if "Providers" in current_test_types:
-                get_console().print(
-                    "[warning]Removing 'Providers' because the target branch "
-                    f"is {self._default_branch} and not main[/]"
-                )
-                current_test_types.remove("Providers")
+            test_types_to_remove: set[str] = set()
+            for test_type in current_test_types:
+                if test_type.startswith("Providers"):
+                    get_console().print(
+                        f"[warning]Removing {test_type} because the target branch "
+                        f"is {self._default_branch} and not main[/]"
+                    )
+                    test_types_to_remove.add(test_type)
             if "Integration" in current_test_types:
                 get_console().print(
                     "[warning]Removing 'Integration' because the target branch "
                     f"is {self._default_branch} and not main[/]"
                 )
-                current_test_types.remove("Integration")
+                test_types_to_remove.add("Integration")
+            current_test_types = current_test_types - test_types_to_remove
         return " ".join(sorted(current_test_types))
 
     @cached_property
diff --git a/dev/breeze/tests/test_selective_checks.py b/dev/breeze/tests/test_selective_checks.py
index b4fd87f15f..33586bb088 100644
--- a/dev/breeze/tests/test_selective_checks.py
+++ b/dev/breeze/tests/test_selective_checks.py
@@ -77,14 +77,15 @@ def assert_outputs_are_printed(expected_outputs: Dict[str, str], output: str):
                     "run-tests": "true",
                     "docs-build": "true",
                     "upgrade-to-newer-dependencies": "false",
-                    "test-types": "API Always Providers",
+                    "test-types": "API Always Providers[amazon,apache.beam,google,hashicorp,"
+                    "microsoft.azure,presto,trino]",
                 },
                 id="API and providers tests and docs should run",
             )
         ),
         (
             pytest.param(
-                ("tests/providers/google/file.py",),
+                ("tests/providers/apache/beam/file.py",),
                 {
                     "all-python-versions": "['3.7']",
                     "all-python-versions-list-as-string": "3.7",
@@ -94,9 +95,9 @@ def assert_outputs_are_printed(expected_outputs: Dict[str, str], output: str):
                     "docs-build": "false",
                     "run-kubernetes-tests": "false",
                     "upgrade-to-newer-dependencies": "false",
-                    "test-types": "Always Providers",
+                    "test-types": "Always Providers[apache.beam,google]",
                 },
-                id="Providers and docs should run",
+                id="Selected Providers and docs should run",
             )
         ),
         (
@@ -131,7 +132,8 @@ def assert_outputs_are_printed(expected_outputs: Dict[str, str], output: str):
                     "docs-build": "true",
                     "run-kubernetes-tests": "true",
                     "upgrade-to-newer-dependencies": "false",
-                    "test-types": "Always Providers",
+                    "test-types": "Always Providers[amazon,apache.beam,google,"
+                    "hashicorp,microsoft.azure,presto,trino]",
                 },
                 id="Helm tests, providers, kubernetes tests and docs should run",
             )
@@ -141,7 +143,52 @@ def assert_outputs_are_printed(expected_outputs: Dict[str, str], output: str):
                 (
                     "INTHEWILD.md",
                     "chart/aaaa.txt",
-                    "tests/providers/google/file.py",
+                    "tests/providers/http/file.py",
+                ),
+                {
+                    "all-python-versions": "['3.7']",
+                    "all-python-versions-list-as-string": "3.7",
+                    "image-build": "true",
+                    "needs-helm-tests": "true",
+                    "run-tests": "true",
+                    "docs-build": "true",
+                    "run-kubernetes-tests": "true",
+                    "upgrade-to-newer-dependencies": "false",
+                    "test-types": "Always Providers[airbyte,apache.livy,"
+                    "dbt.cloud,dingding,discord,http,slack]",
+                },
+                id="Helm tests, http and all relevant providers, kubernetes tests and "
+                "docs should run even if unimportant files were added",
+            )
+        ),
+        (
+            pytest.param(
+                (
+                    "INTHEWILD.md",
+                    "chart/aaaa.txt",
+                    "tests/system/providers/airbyte/file.py",
+                ),
+                {
+                    "all-python-versions": "['3.7']",
+                    "all-python-versions-list-as-string": "3.7",
+                    "image-build": "true",
+                    "needs-helm-tests": "true",
+                    "run-tests": "true",
+                    "docs-build": "true",
+                    "run-kubernetes-tests": "true",
+                    "upgrade-to-newer-dependencies": "false",
+                    "test-types": "Always Providers[airbyte]",
+                },
+                id="Helm tests, airbyte providers, kubernetes tests and "
+                "docs should run even if unimportant files were added",
+            )
+        ),
+        (
+            pytest.param(
+                (
+                    "INTHEWILD.md",
+                    "chart/aaaa.txt",
+                    "tests/system/utils/file.py",
                 ),
                 {
                     "all-python-versions": "['3.7']",
@@ -154,8 +201,8 @@ def assert_outputs_are_printed(expected_outputs: Dict[str, str], output: str):
                     "upgrade-to-newer-dependencies": "false",
                     "test-types": "Always Providers",
                 },
-                id="Helm tests, providers, kubernetes tests and docs should run even if "
-                "unimportant files were added",
+                id="Helm tests, all providers as common util system file changed, kubernetes tests and "
+                "docs should run even if unimportant files were added",
             )
         ),
         (
@@ -171,7 +218,8 @@ def assert_outputs_are_printed(expected_outputs: Dict[str, str], output: str):
                     "upgrade-to-newer-dependencies": "true",
                     "test-types": "API Always CLI Core Integration Other Providers WWW",
                 },
-                id="Everything should run and upgrading to newer requirements as setup.py changed",
+                id="Everything should run - including all providers and upgrading to "
+                "newer requirements as setup.py changed",
             )
         ),
     ],
@@ -212,7 +260,7 @@ def test_expected_output_pull_request_main(
                     "upgrade-to-newer-dependencies": "false",
                     "test-types": "API Always CLI Core Integration Other Providers WWW",
                 },
-                id="Everything should run when full tests are needed",
+                id="Everything should run including all providers when full tests are needed",
             )
         ),
         (
@@ -234,7 +282,8 @@ def test_expected_output_pull_request_main(
                     "upgrade-to-newer-dependencies": "false",
                     "test-types": "API Always CLI Core Integration Other Providers WWW",
                 },
-                id="Everything should run when full tests are needed even with different label set as well",
+                id="Everything should run including full providers when full "
+                "tests are needed even with different label set as well",
             )
         ),
         (
@@ -256,7 +305,8 @@ def test_expected_output_pull_request_main(
                     "upgrade-to-newer-dependencies": "false",
                     "test-types": "API Always CLI Core Integration Other Providers WWW",
                 },
-                id="Everything should run when full tests are needed even if no files are changed",
+                id="Everything should run including full providers when"
+                "full tests are needed even if no files are changed",
             )
         ),
         (
diff --git a/images/breeze/output-commands-hash.txt b/images/breeze/output-commands-hash.txt
index b0f81d4d3d..d3291cb775 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -30,7 +30,7 @@ shell:ab7955da71048b3a695485c152d06786
 start-airflow:30caa077555bef44e5bdf76dfeca092c
 static-checks:69bbef8c50c452faf58403d7a06f34b6
 stop:8ebd8a42f1003495d37b884de5ac7ce6
-tests:ae8d62b505ff8f79bddc202fe9d575e3
+tests:e39111ecbd33a65ababb3cbfbac2b069
 verify-image:a6b3c70957aea96a5d4d261f23359a2d
 verify-prod-image:bf3cf39200e010e3015ef071fd387c6f
 verify-provider-packages:ce22b3617436bbe7f48597b2964b9c32
diff --git a/images/breeze/output-tests.svg b/images/breeze/output-tests.svg
index 8bdcd0c29b..ed99d925d2 100644
--- a/images/breeze/output-tests.svg
+++ b/images/breeze/output-tests.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 830.8" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 855.1999999999999" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -19,169 +19,173 @@
         font-weight: 700;
     }
 
-    .terminal-3386261188-matrix {
+    .terminal-3016257943-matrix {
         font-family: Fira Code, monospace;
         font-size: 20px;
         line-height: 24.4px;
         font-variant-east-asian: full-width;
     }
 
-    .terminal-3386261188-title {
+    .terminal-3016257943-title {
         font-size: 18px;
         font-weight: bold;
         font-family: arial;
     }
 
-    .terminal-3386261188-r1 { fill: #c5c8c6;font-weight: bold }
-.terminal-3386261188-r2 { fill: #c5c8c6 }
-.terminal-3386261188-r3 { fill: #d0b344;font-weight: bold }
-.terminal-3386261188-r4 { fill: #868887 }
-.terminal-3386261188-r5 { fill: #68a0b3;font-weight: bold }
-.terminal-3386261188-r6 { fill: #8d7b39 }
-.terminal-3386261188-r7 { fill: #98a84b;font-weight: bold }
+    .terminal-3016257943-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-3016257943-r2 { fill: #c5c8c6 }
+.terminal-3016257943-r3 { fill: #d0b344;font-weight: bold }
+.terminal-3016257943-r4 { fill: #868887 }
+.terminal-3016257943-r5 { fill: #68a0b3;font-weight: bold }
+.terminal-3016257943-r6 { fill: #8d7b39 }
+.terminal-3016257943-r7 { fill: #98a84b;font-weight: bold }
     </style>
 
     <defs>
-    <clipPath id="terminal-3386261188-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="779.8" />
+    <clipPath id="terminal-3016257943-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="804.1999999999999" />
     </clipPath>
-    <clipPath id="terminal-3386261188-line-0">
+    <clipPath id="terminal-3016257943-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-1">
+<clipPath id="terminal-3016257943-line-1">
     <rect x="0" y="25.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-2">
+<clipPath id="terminal-3016257943-line-2">
     <rect x="0" y="50.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-3">
+<clipPath id="terminal-3016257943-line-3">
     <rect x="0" y="74.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-4">
+<clipPath id="terminal-3016257943-line-4">
     <rect x="0" y="99.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-5">
+<clipPath id="terminal-3016257943-line-5">
     <rect x="0" y="123.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-6">
+<clipPath id="terminal-3016257943-line-6">
     <rect x="0" y="147.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-7">
+<clipPath id="terminal-3016257943-line-7">
     <rect x="0" y="172.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-8">
+<clipPath id="terminal-3016257943-line-8">
     <rect x="0" y="196.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-9">
+<clipPath id="terminal-3016257943-line-9">
     <rect x="0" y="221.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-10">
+<clipPath id="terminal-3016257943-line-10">
     <rect x="0" y="245.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-11">
+<clipPath id="terminal-3016257943-line-11">
     <rect x="0" y="269.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-12">
+<clipPath id="terminal-3016257943-line-12">
     <rect x="0" y="294.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-13">
+<clipPath id="terminal-3016257943-line-13">
     <rect x="0" y="318.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-14">
+<clipPath id="terminal-3016257943-line-14">
     <rect x="0" y="343.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-15">
+<clipPath id="terminal-3016257943-line-15">
     <rect x="0" y="367.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-16">
+<clipPath id="terminal-3016257943-line-16">
     <rect x="0" y="391.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-17">
+<clipPath id="terminal-3016257943-line-17">
     <rect x="0" y="416.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-18">
+<clipPath id="terminal-3016257943-line-18">
     <rect x="0" y="440.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-19">
+<clipPath id="terminal-3016257943-line-19">
     <rect x="0" y="465.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-20">
+<clipPath id="terminal-3016257943-line-20">
     <rect x="0" y="489.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-21">
+<clipPath id="terminal-3016257943-line-21">
     <rect x="0" y="513.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-22">
+<clipPath id="terminal-3016257943-line-22">
     <rect x="0" y="538.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-23">
+<clipPath id="terminal-3016257943-line-23">
     <rect x="0" y="562.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-24">
+<clipPath id="terminal-3016257943-line-24">
     <rect x="0" y="587.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-25">
+<clipPath id="terminal-3016257943-line-25">
     <rect x="0" y="611.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-26">
+<clipPath id="terminal-3016257943-line-26">
     <rect x="0" y="635.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-27">
+<clipPath id="terminal-3016257943-line-27">
     <rect x="0" y="660.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-28">
+<clipPath id="terminal-3016257943-line-28">
     <rect x="0" y="684.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-29">
+<clipPath id="terminal-3016257943-line-29">
     <rect x="0" y="709.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3386261188-line-30">
+<clipPath id="terminal-3016257943-line-30">
     <rect x="0" y="733.5" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="terminal-3016257943-line-31">
+    <rect x="0" y="757.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="828.8" rx="8"/><text class="terminal-3386261188-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;tests</text>
+    <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="terminal-3016257943-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;tests</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
             <circle cx="44" cy="0" r="7" fill="#28c840"/>
             </g>
         
-    <g transform="translate(9, 41)" clip-path="url(#terminal-3386261188-clip-terminal)">
+    <g transform="translate(9, 41)" clip-path="url(#terminal-3016257943-clip-terminal)">
     
-    <g class="terminal-3386261188-matrix">
-    <text class="terminal-3386261188-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-3386261188-line-0)">
-</text><text class="terminal-3386261188-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-3386261188-line-1)">Usage:&#160;</text><text class="terminal-3386261188-r1" x="97.6" y="44.4" textLength="549" clip-path="url(#terminal-3386261188-line-1)">breeze&#160;tests&#160;[OPTIONS]&#160;[EXTRA_PYTEST_ARGS]...</text><text class="terminal-3386261188-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-3386261188-line-1)">
-</text><text class="terminal-3386261188-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-3386261188-line-2)">
-</text><text class="terminal-3386261188-r2" x="12.2" y="93.2" textLength="1110.2" clip-path="url(#terminal-3386261188-line-3)">Run&#160;the&#160;specified&#160;unit&#160;test&#160;targets.&#160;Multiple&#160;targets&#160;may&#160;be&#160;specified&#160;separated&#160;by&#160;spaces.</text><text class="terminal-3386261188-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-3386261188-line-3)">
-</text><text class="terminal-3386261188-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-3386261188-line-4)">
-</text><text class="terminal-3386261188-r4" x="0" y="142" textLength="24.4" clip-path="url(#terminal-3386261188-line-5)">╭─</text><text class="terminal-3386261188-r4" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-3386261188-line-5)">&#160;Basic&#160;flag&#160;for&#160;tests&#160;command&#160;──────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3386261188-r4" x="1439.6" y="142" textLength="24.4" clip-path="url(# [...]
-</text><text class="terminal-3386261188-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-3386261188-line-6)">│</text><text class="terminal-3386261188-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-3386261188-line-6)">-</text><text class="terminal-3386261188-r5" x="36.6" y="166.4" textLength="146.4" clip-path="url(#terminal-3386261188-line-6)">-integration</text><text class="terminal-3386261188-r2" x="317.2" y="166.4" textLength="1110.2" clip-path="url(#te [...]
-</text><text class="terminal-3386261188-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-3386261188-line-7)">│</text><text class="terminal-3386261188-r6" x="317.2" y="190.8" textLength="1110.2" clip-path="url(#terminal-3386261188-line-7)">(cassandra&#160;|&#160;kerberos&#160;|&#160;mongo&#160;|&#160;openldap&#160;|&#160;pinot&#160;|&#160;rabbitmq&#160;|&#160;redis&#160;|&#160;statsd&#160;|&#160;trino&#160;|&#160;all)</text><text class="terminal-3386261188-r4" x="1451.8" y=" [...]
-</text><text class="terminal-3386261188-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-3386261188-line-8)">│</text><text class="terminal-3386261188-r5" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-3386261188-line-8)">-</text><text class="terminal-3386261188-r5" x="36.6" y="215.2" textLength="61" clip-path="url(#terminal-3386261188-line-8)">-test</text><text class="terminal-3386261188-r5" x="97.6" y="215.2" textLength="61" clip-path="url(#terminal-33862611 [...]
-</text><text class="terminal-3386261188-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-3386261188-line-9)">│</text><text class="terminal-3386261188-r6" x="317.2" y="239.6" textLength="1122.4" clip-path="url(#terminal-3386261188-line-9)">(All&#160;|&#160;Always&#160;|&#160;API&#160;|&#160;Always&#160;|&#160;CLI&#160;|&#160;Core&#160;|&#160;Integration&#160;|&#160;Other&#160;|&#160;Providers&#160;|&#160;WWW&#160;|&#160;Helm&#160;|&#160;&#160;</text><text class="terminal-338 [...]
-</text><text class="terminal-3386261188-r4" x="0" y="264" textLength="12.2" clip-path="url(#terminal-3386261188-line-10)">│</text><text class="terminal-3386261188-r6" x="317.2" y="264" textLength="1122.4" clip-path="url(#terminal-3386261188-line-10)">Postgres&#160;|&#160;MySQL&#160;|&#160;Integration&#160;|&#160;Other&#160;|&#160;Quarantine)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
-</text><text class="terminal-3386261188-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-3386261188-line-11)">│</text><text class="terminal-3386261188-r5" x="24.4" y="288.4" textLength="12.2" clip-path="url(#terminal-3386261188-line-11)">-</text><text class="terminal-3386261188-r5" x="36.6" y="288.4" textLength="36.6" clip-path="url(#terminal-3386261188-line-11)">-db</text><text class="terminal-3386261188-r5" x="73.2" y="288.4" textLength="73.2" clip-path="url(#terminal-338 [...]
-</text><text class="terminal-3386261188-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-3386261188-line-12)">│</text><text class="terminal-3386261188-r5" x="24.4" y="312.8" textLength="12.2" clip-path="url(#terminal-3386261188-line-12)">-</text><text class="terminal-3386261188-r5" x="36.6" y="312.8" textLength="97.6" clip-path="url(#terminal-3386261188-line-12)">-backend</text><text class="terminal-3386261188-r7" x="268.4" y="312.8" textLength="24.4" clip-path="url(#termin [...]
-</text><text class="terminal-3386261188-r4" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-3386261188-line-13)">│</text><text class="terminal-3386261188-r5" x="24.4" y="337.2" textLength="12.2" clip-path="url(#terminal-3386261188-line-13)">-</text><text class="terminal-3386261188-r5" x="36.6" y="337.2" textLength="85.4" clip-path="url(#terminal-3386261188-line-13)">-python</text><text class="terminal-3386261188-r7" x="268.4" y="337.2" textLength="24.4" clip-path="url(#termina [...]
-</text><text class="terminal-3386261188-r4" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-3386261188-line-14)">│</text><text class="terminal-3386261188-r4" x="317.2" y="361.6" textLength="732" clip-path="url(#terminal-3386261188-line-14)">[default:&#160;3.7]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
-</text><text class="terminal-3386261188-r4" x="0" y="386" textLength="12.2" clip-path="url(#terminal-3386261188-line-15)">│</text><text class="terminal-3386261188-r5" x="24.4" y="386" textLength="12.2" clip-path="url(#terminal-3386261188-line-15)">-</text><text class="terminal-3386261188-r5" x="36.6" y="386" textLength="109.8" clip-path="url(#terminal-3386261188-line-15)">-postgres</text><text class="terminal-3386261188-r5" x="146.4" y="386" textLength="97.6" clip-path="url(#terminal-338 [...]
-</text><text class="terminal-3386261188-r4" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-3386261188-line-16)">│</text><text class="terminal-3386261188-r5" x="24.4" y="410.4" textLength="12.2" clip-path="url(#terminal-3386261188-line-16)">-</text><text class="terminal-3386261188-r5" x="36.6" y="410.4" textLength="73.2" clip-path="url(#terminal-3386261188-line-16)">-mysql</text><text class="terminal-3386261188-r5" x="109.8" y="410.4" textLength="97.6" clip-path="url(#terminal [...]
-</text><text class="terminal-3386261188-r4" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-3386261188-line-17)">│</text><text class="terminal-3386261188-r5" x="24.4" y="434.8" textLength="12.2" clip-path="url(#terminal-3386261188-line-17)">-</text><text class="terminal-3386261188-r5" x="36.6" y="434.8" textLength="73.2" clip-path="url(#terminal-3386261188-line-17)">-mssql</text><text class="terminal-3386261188-r5" x="109.8" y="434.8" textLength="97.6" clip-path="url(#terminal [...]
-</text><text class="terminal-3386261188-r4" x="0" y="459.2" textLength="1464" clip-path="url(#terminal-3386261188-line-18)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3386261188-r2" x="1464" y="459.2" textLength="12.2" clip-path="url(#terminal-3386261188-line-18)">
-</text><text class="terminal-3386261188-r4" x="0" y="483.6" textLength="24.4" clip-path="url(#terminal-3386261188-line-19)">╭─</text><text class="terminal-3386261188-r4" x="24.4" y="483.6" textLength="1415.2" clip-path="url(#terminal-3386261188-line-19)">&#160;Advanced&#160;flag&#160;for&#160;tests&#160;command&#160;───────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3386261188-r4" x="1439.6" y="483.6" textLength="24.4" clip-pat [...]
-</text><text class="terminal-3386261188-r4" x="0" y="508" textLength="12.2" clip-path="url(#terminal-3386261188-line-20)">│</text><text class="terminal-3386261188-r5" x="24.4" y="508" textLength="12.2" clip-path="url(#terminal-3386261188-line-20)">-</text><text class="terminal-3386261188-r5" x="36.6" y="508" textLength="73.2" clip-path="url(#terminal-3386261188-line-20)">-limit</text><text class="terminal-3386261188-r5" x="109.8" y="508" textLength="195.2" clip-path="url(#terminal-338626 [...]
-</text><text class="terminal-3386261188-r4" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-3386261188-line-21)">│</text><text class="terminal-3386261188-r5" x="24.4" y="532.4" textLength="12.2" clip-path="url(#terminal-3386261188-line-21)">-</text><text class="terminal-3386261188-r5" x="36.6" y="532.4" textLength="73.2" clip-path="url(#terminal-3386261188-line-21)">-image</text><text class="terminal-3386261188-r5" x="109.8" y="532.4" textLength="48.8" clip-path="url(#terminal [...]
-</text><text class="terminal-3386261188-r4" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-3386261188-line-22)">│</text><text class="terminal-3386261188-r5" x="24.4" y="556.8" textLength="12.2" clip-path="url(#terminal-3386261188-line-22)">-</text><text class="terminal-3386261188-r5" x="36.6" y="556.8" textLength="73.2" clip-path="url(#terminal-3386261188-line-22)">-mount</text><text class="terminal-3386261188-r5" x="109.8" y="556.8" textLength="97.6" clip-path="url(#terminal [...]
-</text><text class="terminal-3386261188-r4" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-3386261188-line-23)">│</text><text class="terminal-3386261188-r2" x="378.2" y="581.2" textLength="1061.4" clip-path="url(#terminal-3386261188-line-23)">selected).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
-</text><text class="terminal-3386261188-r4" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-3386261188-line-24)">│</text><text class="terminal-3386261188-r6" x="378.2" y="605.6" textLength="1061.4" clip-path="url(#terminal-3386261188-line-24)">(selected&#160;|&#160;all&#160;|&#160;skip&#160;|&#160;remove)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="terminal-3386261188-r4" x="0" y="630" textLength="12.2" clip-path="url(#terminal-3386261188-line-25)">│</text><text class="terminal-3386261188-r4" x="378.2" y="630" textLength="1061.4" clip-path="url(#terminal-3386261188-line-25)">[default:&#160;selected]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="terminal-3386261188-r4" x="0" y="654.4" textLength="1464" clip-path="url(#terminal-3386261188-line-26)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3386261188-r2" x="1464" y="654.4" textLength="12.2" clip-path="url(#terminal-3386261188-line-26)">
-</text><text class="terminal-3386261188-r4" x="0" y="678.8" textLength="24.4" clip-path="url(#terminal-3386261188-line-27)">╭─</text><text class="terminal-3386261188-r4" x="24.4" y="678.8" textLength="1415.2" clip-path="url(#terminal-3386261188-line-27)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3386261188-r4" x="1439.6" y="678.8" textLength="24.4" clip-path="url(#terminal-338 [...]
-</text><text class="terminal-3386261188-r4" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-3386261188-line-28)">│</text><text class="terminal-3386261188-r5" x="24.4" y="703.2" textLength="12.2" clip-path="url(#terminal-3386261188-line-28)">-</text><text class="terminal-3386261188-r5" x="36.6" y="703.2" textLength="48.8" clip-path="url(#terminal-3386261188-line-28)">-dry</text><text class="terminal-3386261188-r5" x="85.4" y="703.2" textLength="48.8" clip-path="url(#terminal-33 [...]
-</text><text class="terminal-3386261188-r4" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-3386261188-line-29)">│</text><text class="terminal-3386261188-r5" x="24.4" y="727.6" textLength="12.2" clip-path="url(#terminal-3386261188-line-29)">-</text><text class="terminal-3386261188-r5" x="36.6" y="727.6" textLength="97.6" clip-path="url(#terminal-3386261188-line-29)">-verbose</text><text class="terminal-3386261188-r7" x="158.6" y="727.6" textLength="24.4" clip-path="url(#termin [...]
-</text><text class="terminal-3386261188-r4" x="0" y="752" textLength="12.2" clip-path="url(#terminal-3386261188-line-30)">│</text><text class="terminal-3386261188-r5" x="24.4" y="752" textLength="12.2" clip-path="url(#terminal-3386261188-line-30)">-</text><text class="terminal-3386261188-r5" x="36.6" y="752" textLength="61" clip-path="url(#terminal-3386261188-line-30)">-help</text><text class="terminal-3386261188-r7" x="158.6" y="752" textLength="24.4" clip-path="url(#terminal-3386261188 [...]
-</text><text class="terminal-3386261188-r4" x="0" y="776.4" textLength="1464" clip-path="url(#terminal-3386261188-line-31)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3386261188-r2" x="1464" y="776.4" textLength="12.2" clip-path="url(#terminal-3386261188-line-31)">
+    <g class="terminal-3016257943-matrix">
+    <text class="terminal-3016257943-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-3016257943-line-0)">
+</text><text class="terminal-3016257943-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-3016257943-line-1)">Usage:&#160;</text><text class="terminal-3016257943-r1" x="97.6" y="44.4" textLength="549" clip-path="url(#terminal-3016257943-line-1)">breeze&#160;tests&#160;[OPTIONS]&#160;[EXTRA_PYTEST_ARGS]...</text><text class="terminal-3016257943-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-3016257943-line-1)">
+</text><text class="terminal-3016257943-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-3016257943-line-2)">
+</text><text class="terminal-3016257943-r2" x="12.2" y="93.2" textLength="1110.2" clip-path="url(#terminal-3016257943-line-3)">Run&#160;the&#160;specified&#160;unit&#160;test&#160;targets.&#160;Multiple&#160;targets&#160;may&#160;be&#160;specified&#160;separated&#160;by&#160;spaces.</text><text class="terminal-3016257943-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-3016257943-line-3)">
+</text><text class="terminal-3016257943-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-3016257943-line-4)">
+</text><text class="terminal-3016257943-r4" x="0" y="142" textLength="24.4" clip-path="url(#terminal-3016257943-line-5)">╭─</text><text class="terminal-3016257943-r4" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-3016257943-line-5)">&#160;Basic&#160;flag&#160;for&#160;tests&#160;command&#160;──────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3016257943-r4" x="1439.6" y="142" textLength="24.4" clip-path="url(# [...]
+</text><text class="terminal-3016257943-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-3016257943-line-6)">│</text><text class="terminal-3016257943-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-3016257943-line-6)">-</text><text class="terminal-3016257943-r5" x="36.6" y="166.4" textLength="146.4" clip-path="url(#terminal-3016257943-line-6)">-integration</text><text class="terminal-3016257943-r2" x="317.2" y="166.4" textLength="1110.2" clip-path="url(#te [...]
+</text><text class="terminal-3016257943-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-3016257943-line-7)">│</text><text class="terminal-3016257943-r6" x="317.2" y="190.8" textLength="1110.2" clip-path="url(#terminal-3016257943-line-7)">(cassandra&#160;|&#160;kerberos&#160;|&#160;mongo&#160;|&#160;openldap&#160;|&#160;pinot&#160;|&#160;rabbitmq&#160;|&#160;redis&#160;|&#160;statsd&#160;|&#160;trino&#160;|&#160;all)</text><text class="terminal-3016257943-r4" x="1451.8" y=" [...]
+</text><text class="terminal-3016257943-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-3016257943-line-8)">│</text><text class="terminal-3016257943-r5" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-3016257943-line-8)">-</text><text class="terminal-3016257943-r5" x="36.6" y="215.2" textLength="61" clip-path="url(#terminal-3016257943-line-8)">-test</text><text class="terminal-3016257943-r5" x="97.6" y="215.2" textLength="61" clip-path="url(#terminal-30162579 [...]
+</text><text class="terminal-3016257943-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-3016257943-line-9)">│</text><text class="terminal-3016257943-r2" x="317.2" y="239.6" textLength="341.6" clip-path="url(#terminal-3016257943-line-9)">should&#160;be&#160;run&#160;-&#160;for&#160;example&#160;</text><text class="terminal-3016257943-r5" x="658.8" y="239.6" textLength="12.2" clip-path="url(#terminal-3016257943-line-9)">-</text><text class="terminal-3016257943-r5" x="671" y= [...]
+</text><text class="terminal-3016257943-r4" x="0" y="264" textLength="12.2" clip-path="url(#terminal-3016257943-line-10)">│</text><text class="terminal-3016257943-r6" x="317.2" y="264" textLength="1122.4" clip-path="url(#terminal-3016257943-line-10)">(All&#160;|&#160;Always&#160;|&#160;API&#160;|&#160;Always&#160;|&#160;CLI&#160;|&#160;Core&#160;|&#160;Integration&#160;|&#160;Other&#160;|&#160;Providers&#160;|&#160;WWW&#160;|&#160;Helm&#160;|&#160;&#160;</text><text class="terminal-30162 [...]
+</text><text class="terminal-3016257943-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-3016257943-line-11)">│</text><text class="terminal-3016257943-r6" x="317.2" y="288.4" textLength="1122.4" clip-path="url(#terminal-3016257943-line-11)">Postgres&#160;|&#160;MySQL&#160;|&#160;Integration&#160;|&#160;Other&#160;|&#160;Quarantine)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
+</text><text class="terminal-3016257943-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-3016257943-line-12)">│</text><text class="terminal-3016257943-r5" x="24.4" y="312.8" textLength="12.2" clip-path="url(#terminal-3016257943-line-12)">-</text><text class="terminal-3016257943-r5" x="36.6" y="312.8" textLength="36.6" clip-path="url(#terminal-3016257943-line-12)">-db</text><text class="terminal-3016257943-r5" x="73.2" y="312.8" textLength="73.2" clip-path="url(#terminal-301 [...]
+</text><text class="terminal-3016257943-r4" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-3016257943-line-13)">│</text><text class="terminal-3016257943-r5" x="24.4" y="337.2" textLength="12.2" clip-path="url(#terminal-3016257943-line-13)">-</text><text class="terminal-3016257943-r5" x="36.6" y="337.2" textLength="97.6" clip-path="url(#terminal-3016257943-line-13)">-backend</text><text class="terminal-3016257943-r7" x="268.4" y="337.2" textLength="24.4" clip-path="url(#termin [...]
+</text><text class="terminal-3016257943-r4" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-3016257943-line-14)">│</text><text class="terminal-3016257943-r5" x="24.4" y="361.6" textLength="12.2" clip-path="url(#terminal-3016257943-line-14)">-</text><text class="terminal-3016257943-r5" x="36.6" y="361.6" textLength="85.4" clip-path="url(#terminal-3016257943-line-14)">-python</text><text class="terminal-3016257943-r7" x="268.4" y="361.6" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-3016257943-r4" x="0" y="386" textLength="12.2" clip-path="url(#terminal-3016257943-line-15)">│</text><text class="terminal-3016257943-r4" x="317.2" y="386" textLength="732" clip-path="url(#terminal-3016257943-line-15)">[default:&#160;3.7]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
+</text><text class="terminal-3016257943-r4" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-3016257943-line-16)">│</text><text class="terminal-3016257943-r5" x="24.4" y="410.4" textLength="12.2" clip-path="url(#terminal-3016257943-line-16)">-</text><text class="terminal-3016257943-r5" x="36.6" y="410.4" textLength="109.8" clip-path="url(#terminal-3016257943-line-16)">-postgres</text><text class="terminal-3016257943-r5" x="146.4" y="410.4" textLength="97.6" clip-path="url(#term [...]
+</text><text class="terminal-3016257943-r4" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-3016257943-line-17)">│</text><text class="terminal-3016257943-r5" x="24.4" y="434.8" textLength="12.2" clip-path="url(#terminal-3016257943-line-17)">-</text><text class="terminal-3016257943-r5" x="36.6" y="434.8" textLength="73.2" clip-path="url(#terminal-3016257943-line-17)">-mysql</text><text class="terminal-3016257943-r5" x="109.8" y="434.8" textLength="97.6" clip-path="url(#terminal [...]
+</text><text class="terminal-3016257943-r4" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-3016257943-line-18)">│</text><text class="terminal-3016257943-r5" x="24.4" y="459.2" textLength="12.2" clip-path="url(#terminal-3016257943-line-18)">-</text><text class="terminal-3016257943-r5" x="36.6" y="459.2" textLength="73.2" clip-path="url(#terminal-3016257943-line-18)">-mssql</text><text class="terminal-3016257943-r5" x="109.8" y="459.2" textLength="97.6" clip-path="url(#terminal [...]
+</text><text class="terminal-3016257943-r4" x="0" y="483.6" textLength="1464" clip-path="url(#terminal-3016257943-line-19)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3016257943-r2" x="1464" y="483.6" textLength="12.2" clip-path="url(#terminal-3016257943-line-19)">
+</text><text class="terminal-3016257943-r4" x="0" y="508" textLength="24.4" clip-path="url(#terminal-3016257943-line-20)">╭─</text><text class="terminal-3016257943-r4" x="24.4" y="508" textLength="1415.2" clip-path="url(#terminal-3016257943-line-20)">&#160;Advanced&#160;flag&#160;for&#160;tests&#160;command&#160;───────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3016257943-r4" x="1439.6" y="508" textLength="24.4" clip-path="url [...]
+</text><text class="terminal-3016257943-r4" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-3016257943-line-21)">│</text><text class="terminal-3016257943-r5" x="24.4" y="532.4" textLength="12.2" clip-path="url(#terminal-3016257943-line-21)">-</text><text class="terminal-3016257943-r5" x="36.6" y="532.4" textLength="73.2" clip-path="url(#terminal-3016257943-line-21)">-limit</text><text class="terminal-3016257943-r5" x="109.8" y="532.4" textLength="195.2" clip-path="url(#termina [...]
+</text><text class="terminal-3016257943-r4" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-3016257943-line-22)">│</text><text class="terminal-3016257943-r5" x="24.4" y="556.8" textLength="12.2" clip-path="url(#terminal-3016257943-line-22)">-</text><text class="terminal-3016257943-r5" x="36.6" y="556.8" textLength="73.2" clip-path="url(#terminal-3016257943-line-22)">-image</text><text class="terminal-3016257943-r5" x="109.8" y="556.8" textLength="48.8" clip-path="url(#terminal [...]
+</text><text class="terminal-3016257943-r4" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-3016257943-line-23)">│</text><text class="terminal-3016257943-r5" x="24.4" y="581.2" textLength="12.2" clip-path="url(#terminal-3016257943-line-23)">-</text><text class="terminal-3016257943-r5" x="36.6" y="581.2" textLength="73.2" clip-path="url(#terminal-3016257943-line-23)">-mount</text><text class="terminal-3016257943-r5" x="109.8" y="581.2" textLength="97.6" clip-path="url(#terminal [...]
+</text><text class="terminal-3016257943-r4" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-3016257943-line-24)">│</text><text class="terminal-3016257943-r2" x="378.2" y="605.6" textLength="1061.4" clip-path="url(#terminal-3016257943-line-24)">selected).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-3016257943-r4" x="0" y="630" textLength="12.2" clip-path="url(#terminal-3016257943-line-25)">│</text><text class="terminal-3016257943-r6" x="378.2" y="630" textLength="1061.4" clip-path="url(#terminal-3016257943-line-25)">(selected&#160;|&#160;all&#160;|&#160;skip&#160;|&#160;remove)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-3016257943-r4" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-3016257943-line-26)">│</text><text class="terminal-3016257943-r4" x="378.2" y="654.4" textLength="1061.4" clip-path="url(#terminal-3016257943-line-26)">[default:&#160;selected]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
+</text><text class="terminal-3016257943-r4" x="0" y="678.8" textLength="1464" clip-path="url(#terminal-3016257943-line-27)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3016257943-r2" x="1464" y="678.8" textLength="12.2" clip-path="url(#terminal-3016257943-line-27)">
+</text><text class="terminal-3016257943-r4" x="0" y="703.2" textLength="24.4" clip-path="url(#terminal-3016257943-line-28)">╭─</text><text class="terminal-3016257943-r4" x="24.4" y="703.2" textLength="1415.2" clip-path="url(#terminal-3016257943-line-28)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-3016257943-r4" x="1439.6" y="703.2" textLength="24.4" clip-path="url(#terminal-301 [...]
+</text><text class="terminal-3016257943-r4" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-3016257943-line-29)">│</text><text class="terminal-3016257943-r5" x="24.4" y="727.6" textLength="12.2" clip-path="url(#terminal-3016257943-line-29)">-</text><text class="terminal-3016257943-r5" x="36.6" y="727.6" textLength="48.8" clip-path="url(#terminal-3016257943-line-29)">-dry</text><text class="terminal-3016257943-r5" x="85.4" y="727.6" textLength="48.8" clip-path="url(#terminal-30 [...]
+</text><text class="terminal-3016257943-r4" x="0" y="752" textLength="12.2" clip-path="url(#terminal-3016257943-line-30)">│</text><text class="terminal-3016257943-r5" x="24.4" y="752" textLength="12.2" clip-path="url(#terminal-3016257943-line-30)">-</text><text class="terminal-3016257943-r5" x="36.6" y="752" textLength="97.6" clip-path="url(#terminal-3016257943-line-30)">-verbose</text><text class="terminal-3016257943-r7" x="158.6" y="752" textLength="24.4" clip-path="url(#terminal-30162 [...]
+</text><text class="terminal-3016257943-r4" x="0" y="776.4" textLength="12.2" clip-path="url(#terminal-3016257943-line-31)">│</text><text class="terminal-3016257943-r5" x="24.4" y="776.4" textLength="12.2" clip-path="url(#terminal-3016257943-line-31)">-</text><text class="terminal-3016257943-r5" x="36.6" y="776.4" textLength="61" clip-path="url(#terminal-3016257943-line-31)">-help</text><text class="terminal-3016257943-r7" x="158.6" y="776.4" textLength="24.4" clip-path="url(#terminal-30 [...]
+</text><text class="terminal-3016257943-r4" x="0" y="800.8" textLength="1464" clip-path="url(#terminal-3016257943-line-32)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3016257943-r2" x="1464" y="800.8" textLength="12.2" clip-path="url(#terminal-3016257943-line-32)">
 </text>
     </g>
     </g>
diff --git a/scripts/docker/entrypoint_ci.sh b/scripts/docker/entrypoint_ci.sh
index 2994604fc9..42dc3f5712 100755
--- a/scripts/docker/entrypoint_ci.sh
+++ b/scripts/docker/entrypoint_ci.sh
@@ -363,13 +363,18 @@ else
             ${TEST_TYPE} == "Long" || \
             ${TEST_TYPE} == "Integration" ]]; then
         SELECTED_TESTS=("${ALL_TESTS[@]}")
+    elif [[ ${TEST_TYPE} =~ Providers\[(.*)\] ]]; then
+        SELECTED_TESTS=()
+        for provider in ${BASH_REMATCH[1]//,/ }
+        do
+            SELECTED_TESTS+=("tests/providers/${provider//./\/}")
+        done
     else
         echo
         echo  "${COLOR_RED}ERROR: Wrong test type ${TEST_TYPE}  ${COLOR_RESET}"
         echo
         exit 1
     fi
-
 fi
 readonly SELECTED_TESTS CLI_TESTS API_TESTS PROVIDERS_TESTS CORE_TESTS WWW_TESTS \
     ALL_TESTS ALL_PRESELECTED_TESTS


[airflow] 08/22: Add `--clean-build` option for breeze build-docs (#24951)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 960503293e78be67e6e1a2348a844cd0146d4dc7
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Mon Jul 11 13:24:56 2022 +0200

    Add `--clean-build` option for breeze build-docs (#24951)
    
    This option removes all previously generated docs files so that
    build docs can run using clean state. Prevents cases where local
    inventory has been updated from local providers rather than
    from released ones, breaking the docs building.
    
    (cherry picked from commit f4a3c64dd0d8996382dec813288e0995fb0a1e0c)
---
 dev/README_RELEASE_AIRFLOW.md                      |   2 +-
 dev/README_RELEASE_HELM_CHART.md                   |   2 +-
 dev/README_RELEASE_PROVIDER_PACKAGES.md            |   4 +-
 .../airflow_breeze/commands/developer_commands.py  |  31 ++-
 .../build_provider_documentation.sh                |   3 +-
 images/breeze/output-build-docs.svg                | 260 +++++++++++----------
 images/breeze/output-commands-hash.txt             |   2 +-
 7 files changed, 167 insertions(+), 137 deletions(-)

diff --git a/dev/README_RELEASE_AIRFLOW.md b/dev/README_RELEASE_AIRFLOW.md
index 7e2cc8da83..54ee66a1bc 100644
--- a/dev/README_RELEASE_AIRFLOW.md
+++ b/dev/README_RELEASE_AIRFLOW.md
@@ -1008,7 +1008,7 @@ Documentation for providers can be found in the ``/docs/apache-airflow`` directo
 
     ```shell script
     cd "${AIRFLOW_REPO_ROOT}"
-    breeze build-docs --package-filter apache-airflow --package-filter docker-stack --for-production
+    breeze build-docs --package-filter apache-airflow --package-filter docker-stack --clean-build --for-production
     ```
 
 - Now you can preview the documentation.
diff --git a/dev/README_RELEASE_HELM_CHART.md b/dev/README_RELEASE_HELM_CHART.md
index 8662f80a96..bd84315bbf 100644
--- a/dev/README_RELEASE_HELM_CHART.md
+++ b/dev/README_RELEASE_HELM_CHART.md
@@ -608,7 +608,7 @@ between the two repositories to be able to build the documentation.
     ```shell
     cd "${AIRFLOW_REPO_ROOT}"
     git checkout helm-chart/${VERSION}
-    breeze build-docs --package-filter helm-chart --for-production
+    breeze build-docs --package-filter helm-chart --clean-build --for-production
     ```
 
 - Now you can preview the documentation.
diff --git a/dev/README_RELEASE_PROVIDER_PACKAGES.md b/dev/README_RELEASE_PROVIDER_PACKAGES.md
index b0d751b251..bababed62f 100644
--- a/dev/README_RELEASE_PROVIDER_PACKAGES.md
+++ b/dev/README_RELEASE_PROVIDER_PACKAGES.md
@@ -304,7 +304,7 @@ export AIRFLOW_SITE_DIRECTORY="$(pwd)"
 
 ```shell script
 cd "${AIRFLOW_REPO_ROOT}"
-breeze build-docs --for-production --package-filter apache-airflow-providers \
+breeze build-docs --clean-build --for-production --package-filter apache-airflow-providers \
    --package-filter 'apache-airflow-providers-*'
 ```
 
@@ -316,7 +316,7 @@ If we want to just release some providers you can release them in this way:
 
 ```shell script
 cd "${AIRFLOW_REPO_ROOT}"
-breeze build-docs --for-production \
+breeze build-docs --clean-build --for-production \
   --package-filter apache-airflow-providers \
   --package-filter 'apache-airflow-providers-PACKAGE1' \
   --package-filter 'apache-airflow-providers-PACKAGE2' \
diff --git a/dev/breeze/src/airflow_breeze/commands/developer_commands.py b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
index cbb2b10d06..268dad01a8 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
@@ -16,6 +16,7 @@
 # under the License.
 
 import os
+import shutil
 import sys
 from typing import Iterable, Optional, Tuple
 
@@ -195,6 +196,7 @@ DEVELOPER_PARAMETERS = {
             "options": [
                 "--docs-only",
                 "--spellcheck-only",
+                "--clean-build",
                 "--for-production",
                 "--package-filter",
             ],
@@ -391,18 +393,23 @@ def start_airflow(
 @click.option('-d', '--docs-only', help="Only build documentation.", is_flag=True)
 @click.option('-s', '--spellcheck-only', help="Only run spell checking.", is_flag=True)
 @click.option(
-    '-p',
-    '--for-production',
-    help="Builds documentation for official release i.e. all links point to stable version.",
-    is_flag=True,
-)
-@click.option(
-    '-p',
     '--package-filter',
     help="List of packages to consider.",
     type=NotVerifiedBetterChoice(get_available_packages()),
     multiple=True,
 )
+@click.option(
+    '--clean-build',
+    help="Clean inventories of Inter-Sphinx documentation and generated APIs and sphinx artifacts "
+    "before the build - useful for a clean build.",
+    is_flag=True,
+)
+@click.option(
+    '--for-production',
+    help="Builds documentation for official release i.e. all links point to stable version. "
+    "Implies --clean-build",
+    is_flag=True,
+)
 def build_docs(
     verbose: bool,
     dry_run: bool,
@@ -410,12 +417,22 @@ def build_docs(
     docs_only: bool,
     spellcheck_only: bool,
     for_production: bool,
+    clean_build: bool,
     package_filter: Tuple[str],
 ):
     """Build documentation in the container."""
+    if for_production and not clean_build:
+        get_console().print("\n[warning]When building docs for production, clan-build is forced\n")
+        clean_build = True
     perform_environment_checks(verbose=verbose)
     params = BuildCiParams(github_repository=github_repository, python=DEFAULT_PYTHON_MAJOR_MINOR_VERSION)
     rebuild_or_pull_ci_image_if_needed(command_params=params, dry_run=dry_run, verbose=verbose)
+    if clean_build:
+        docs_dir = AIRFLOW_SOURCES_ROOT / "docs"
+        for dir_name in ['_build', "_doctrees", '_inventory_cache', '_api']:
+            for dir in docs_dir.rglob(dir_name):
+                get_console().print(f"[info]Removing {dir}")
+                shutil.rmtree(dir, ignore_errors=True)
     ci_image_name = params.airflow_image_name
     doc_builder = DocBuildParams(
         package_filter=package_filter,
diff --git a/dev/provider_packages/build_provider_documentation.sh b/dev/provider_packages/build_provider_documentation.sh
index 0fca5162cf..45ac94f7dc 100755
--- a/dev/provider_packages/build_provider_documentation.sh
+++ b/dev/provider_packages/build_provider_documentation.sh
@@ -28,8 +28,9 @@ do
     provider_filters+=("--package-filter" "apache-airflow-providers-${provider//./-}")
 done
 
-./breeze build-docs \
+.breeze build-docs \
     --for-production \
+    --clean-build \
     --package-filter apache-airflow-providers \
     "${provider_filters[@]}"
 cd "${AIRFLOW_SITE_DIRECTORY}"
diff --git a/images/breeze/output-build-docs.svg b/images/breeze/output-build-docs.svg
index 928f8f898b..27fc3c7751 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 1392.0" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1465.1999999999998" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -19,261 +19,273 @@
         font-weight: 700;
     }
 
-    .terminal-1803387802-matrix {
+    .terminal-417653393-matrix {
         font-family: Fira Code, monospace;
         font-size: 20px;
         line-height: 24.4px;
         font-variant-east-asian: full-width;
     }
 
-    .terminal-1803387802-title {
+    .terminal-417653393-title {
         font-size: 18px;
         font-weight: bold;
         font-family: arial;
     }
 
-    .terminal-1803387802-r1 { fill: #c5c8c6;font-weight: bold }
-.terminal-1803387802-r2 { fill: #c5c8c6 }
-.terminal-1803387802-r3 { fill: #d0b344;font-weight: bold }
-.terminal-1803387802-r4 { fill: #868887 }
-.terminal-1803387802-r5 { fill: #68a0b3;font-weight: bold }
-.terminal-1803387802-r6 { fill: #98a84b;font-weight: bold }
-.terminal-1803387802-r7 { fill: #8d7b39 }
+    .terminal-417653393-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-417653393-r2 { fill: #c5c8c6 }
+.terminal-417653393-r3 { fill: #d0b344;font-weight: bold }
+.terminal-417653393-r4 { fill: #868887 }
+.terminal-417653393-r5 { fill: #68a0b3;font-weight: bold }
+.terminal-417653393-r6 { fill: #98a84b;font-weight: bold }
+.terminal-417653393-r7 { fill: #8d7b39 }
     </style>
 
     <defs>
-    <clipPath id="terminal-1803387802-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="1341.0" />
+    <clipPath id="terminal-417653393-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="1414.1999999999998" />
     </clipPath>
-    <clipPath id="terminal-1803387802-line-0">
+    <clipPath id="terminal-417653393-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-1">
+<clipPath id="terminal-417653393-line-1">
     <rect x="0" y="25.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-2">
+<clipPath id="terminal-417653393-line-2">
     <rect x="0" y="50.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-3">
+<clipPath id="terminal-417653393-line-3">
     <rect x="0" y="74.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-4">
+<clipPath id="terminal-417653393-line-4">
     <rect x="0" y="99.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-5">
+<clipPath id="terminal-417653393-line-5">
     <rect x="0" y="123.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-6">
+<clipPath id="terminal-417653393-line-6">
     <rect x="0" y="147.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-7">
+<clipPath id="terminal-417653393-line-7">
     <rect x="0" y="172.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-8">
+<clipPath id="terminal-417653393-line-8">
     <rect x="0" y="196.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-9">
+<clipPath id="terminal-417653393-line-9">
     <rect x="0" y="221.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-10">
+<clipPath id="terminal-417653393-line-10">
     <rect x="0" y="245.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-11">
+<clipPath id="terminal-417653393-line-11">
     <rect x="0" y="269.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-12">
+<clipPath id="terminal-417653393-line-12">
     <rect x="0" y="294.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-13">
+<clipPath id="terminal-417653393-line-13">
     <rect x="0" y="318.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-14">
+<clipPath id="terminal-417653393-line-14">
     <rect x="0" y="343.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-15">
+<clipPath id="terminal-417653393-line-15">
     <rect x="0" y="367.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-16">
+<clipPath id="terminal-417653393-line-16">
     <rect x="0" y="391.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-17">
+<clipPath id="terminal-417653393-line-17">
     <rect x="0" y="416.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-18">
+<clipPath id="terminal-417653393-line-18">
     <rect x="0" y="440.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-19">
+<clipPath id="terminal-417653393-line-19">
     <rect x="0" y="465.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-20">
+<clipPath id="terminal-417653393-line-20">
     <rect x="0" y="489.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-21">
+<clipPath id="terminal-417653393-line-21">
     <rect x="0" y="513.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-22">
+<clipPath id="terminal-417653393-line-22">
     <rect x="0" y="538.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-23">
+<clipPath id="terminal-417653393-line-23">
     <rect x="0" y="562.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-24">
+<clipPath id="terminal-417653393-line-24">
     <rect x="0" y="587.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-25">
+<clipPath id="terminal-417653393-line-25">
     <rect x="0" y="611.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-26">
+<clipPath id="terminal-417653393-line-26">
     <rect x="0" y="635.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-27">
+<clipPath id="terminal-417653393-line-27">
     <rect x="0" y="660.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-28">
+<clipPath id="terminal-417653393-line-28">
     <rect x="0" y="684.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-29">
+<clipPath id="terminal-417653393-line-29">
     <rect x="0" y="709.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-30">
+<clipPath id="terminal-417653393-line-30">
     <rect x="0" y="733.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-31">
+<clipPath id="terminal-417653393-line-31">
     <rect x="0" y="757.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-32">
+<clipPath id="terminal-417653393-line-32">
     <rect x="0" y="782.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-33">
+<clipPath id="terminal-417653393-line-33">
     <rect x="0" y="806.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-34">
+<clipPath id="terminal-417653393-line-34">
     <rect x="0" y="831.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-35">
+<clipPath id="terminal-417653393-line-35">
     <rect x="0" y="855.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-36">
+<clipPath id="terminal-417653393-line-36">
     <rect x="0" y="879.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-37">
+<clipPath id="terminal-417653393-line-37">
     <rect x="0" y="904.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-38">
+<clipPath id="terminal-417653393-line-38">
     <rect x="0" y="928.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-39">
+<clipPath id="terminal-417653393-line-39">
     <rect x="0" y="953.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-40">
+<clipPath id="terminal-417653393-line-40">
     <rect x="0" y="977.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-41">
+<clipPath id="terminal-417653393-line-41">
     <rect x="0" y="1001.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-42">
+<clipPath id="terminal-417653393-line-42">
     <rect x="0" y="1026.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-43">
+<clipPath id="terminal-417653393-line-43">
     <rect x="0" y="1050.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-44">
+<clipPath id="terminal-417653393-line-44">
     <rect x="0" y="1075.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-45">
+<clipPath id="terminal-417653393-line-45">
     <rect x="0" y="1099.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-46">
+<clipPath id="terminal-417653393-line-46">
     <rect x="0" y="1123.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-47">
+<clipPath id="terminal-417653393-line-47">
     <rect x="0" y="1148.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-48">
+<clipPath id="terminal-417653393-line-48">
     <rect x="0" y="1172.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-49">
+<clipPath id="terminal-417653393-line-49">
     <rect x="0" y="1197.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-50">
+<clipPath id="terminal-417653393-line-50">
     <rect x="0" y="1221.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-51">
+<clipPath id="terminal-417653393-line-51">
     <rect x="0" y="1245.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-52">
+<clipPath id="terminal-417653393-line-52">
     <rect x="0" y="1270.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1803387802-line-53">
+<clipPath id="terminal-417653393-line-53">
     <rect x="0" y="1294.7" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="terminal-417653393-line-54">
+    <rect x="0" y="1319.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-417653393-line-55">
+    <rect x="0" y="1343.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="terminal-417653393-line-56">
+    <rect x="0" y="1367.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="1390" rx="8"/><text class="terminal-1803387802-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;build-docs</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1463.2" rx="8"/><text class="terminal-417653393-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;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"/>
             <circle cx="44" cy="0" r="7" fill="#28c840"/>
             </g>
         
-    <g transform="translate(9, 41)" clip-path="url(#terminal-1803387802-clip-terminal)">
+    <g transform="translate(9, 41)" clip-path="url(#terminal-417653393-clip-terminal)">
     
-    <g class="terminal-1803387802-matrix">
-    <text class="terminal-1803387802-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-1803387802-line-0)">
-</text><text class="terminal-1803387802-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-1803387802-line-1)">Usage:&#160;</text><text class="terminal-1803387802-r1" x="97.6" y="44.4" textLength="329.4" clip-path="url(#terminal-1803387802-line-1)">breeze&#160;build-docs&#160;[OPTIONS]</text><text class="terminal-1803387802-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-1803387802-line-1)">
-</text><text class="terminal-1803387802-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-1803387802-line-2)">
-</text><text class="terminal-1803387802-r2" x="12.2" y="93.2" textLength="451.4" clip-path="url(#terminal-1803387802-line-3)">Build&#160;documentation&#160;in&#160;the&#160;container.</text><text class="terminal-1803387802-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-1803387802-line-3)">
-</text><text class="terminal-1803387802-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-1803387802-line-4)">
-</text><text class="terminal-1803387802-r4" x="0" y="142" textLength="24.4" clip-path="url(#terminal-1803387802-line-5)">╭─</text><text class="terminal-1803387802-r4" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-1803387802-line-5)">&#160;Doc&#160;flags&#160;─────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-1803387802-r4" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-180338 [...]
-</text><text class="terminal-1803387802-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-1803387802-line-6)">│</text><text class="terminal-1803387802-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-1803387802-line-6)">-</text><text class="terminal-1803387802-r5" x="36.6" y="166.4" textLength="61" clip-path="url(#terminal-1803387802-line-6)">-docs</text><text class="terminal-1803387802-r5" x="97.6" y="166.4" textLength="61" clip-path="url(#terminal-18033878 [...]
-</text><text class="terminal-1803387802-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-1803387802-line-7)">│</text><text class="terminal-1803387802-r5" x="24.4" y="190.8" textLength="12.2" clip-path="url(#terminal-1803387802-line-7)">-</text><text class="terminal-1803387802-r5" x="36.6" y="190.8" textLength="134.2" clip-path="url(#terminal-1803387802-line-7)">-spellcheck</text><text class="terminal-1803387802-r5" x="170.8" y="190.8" textLength="61" clip-path="url(#termina [...]
-</text><text class="terminal-1803387802-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-1803387802-line-8)">│</text><text class="terminal-1803387802-r5" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-1803387802-line-8)">-</text><text class="terminal-1803387802-r5" x="36.6" y="215.2" textLength="48.8" clip-path="url(#terminal-1803387802-line-8)">-for</text><text class="terminal-1803387802-r5" x="85.4" y="215.2" textLength="134.2" clip-path="url(#terminal-1803 [...]
-</text><text class="terminal-1803387802-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-1803387802-line-9)">│</text><text class="terminal-1803387802-r5" x="24.4" y="239.6" textLength="12.2" clip-path="url(#terminal-1803387802-line-9)">-</text><text class="terminal-1803387802-r5" x="36.6" y="239.6" textLength="97.6" clip-path="url(#terminal-1803387802-line-9)">-package</text><text class="terminal-1803387802-r5" x="134.2" y="239.6" textLength="85.4" clip-path="url(#terminal- [...]
-</text><text class="terminal-1803387802-r4" x="0" y="264" textLength="12.2" clip-path="url(#terminal-1803387802-line-10)">│</text><text class="terminal-1803387802-r7" x="305" y="264" textLength="1134.6" clip-path="url(#terminal-1803387802-line-10)">(apache-airflow&#160;|&#160;apache-airflow-providers&#160;|&#160;apache-airflow-providers-airbyte&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1803387802-r4" x="1451.8"  [...]
-</text><text class="terminal-1803387802-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-1803387802-line-11)">│</text><text class="terminal-1803387802-r7" x="305" y="288.4" textLength="1134.6" clip-path="url(#terminal-1803387802-line-11)">apache-airflow-providers-alibaba&#160;|&#160;apache-airflow-providers-amazon&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text [...]
-</text><text class="terminal-1803387802-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-1803387802-line-12)">│</text><text class="terminal-1803387802-r7" x="305" y="312.8" textLength="1134.6" clip-path="url(#terminal-1803387802-line-12)">apache-airflow-providers-apache-beam&#160;|&#160;apache-airflow-providers-apache-cassandra&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1803387802-r4" x="1451.8" y="312.8" textLength= [...]
-</text><text class="terminal-1803387802-r4" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-1803387802-line-13)">│</text><text class="terminal-1803387802-r7" x="305" y="337.2" textLength="1134.6" clip-path="url(#terminal-1803387802-line-13)">apache-airflow-providers-apache-drill&#160;|&#160;apache-airflow-providers-apache-druid&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1803387802-r4" x="1451.8" y="337 [...]
-</text><text class="terminal-1803387802-r4" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-1803387802-line-14)">│</text><text class="terminal-1803387802-r7" x="305" y="361.6" textLength="1134.6" clip-path="url(#terminal-1803387802-line-14)">apache-airflow-providers-apache-hdfs&#160;|&#160;apache-airflow-providers-apache-hive&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1803387802-r4" x="1451 [...]
-</text><text class="terminal-1803387802-r4" x="0" y="386" textLength="12.2" clip-path="url(#terminal-1803387802-line-15)">│</text><text class="terminal-1803387802-r7" x="305" y="386" textLength="1134.6" clip-path="url(#terminal-1803387802-line-15)">apache-airflow-providers-apache-kylin&#160;|&#160;apache-airflow-providers-apache-livy&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1803387802-r4" x="1451.8" y="38 [...]
-</text><text class="terminal-1803387802-r4" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-1803387802-line-16)">│</text><text class="terminal-1803387802-r7" x="305" y="410.4" textLength="1134.6" clip-path="url(#terminal-1803387802-line-16)">apache-airflow-providers-apache-pig&#160;|&#160;apache-airflow-providers-apache-pinot&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1803387802-r4" x="1451 [...]
-</text><text class="terminal-1803387802-r4" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-1803387802-line-17)">│</text><text class="terminal-1803387802-r7" x="305" y="434.8" textLength="1134.6" clip-path="url(#terminal-1803387802-line-17)">apache-airflow-providers-apache-spark&#160;|&#160;apache-airflow-providers-apache-sqoop&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1803387802-r4" x="1451.8" y="434 [...]
-</text><text class="terminal-1803387802-r4" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-1803387802-line-18)">│</text><text class="terminal-1803387802-r7" x="305" y="459.2" textLength="1134.6" clip-path="url(#terminal-1803387802-line-18)">apache-airflow-providers-arangodb&#160;|&#160;apache-airflow-providers-asana&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text [...]
-</text><text class="terminal-1803387802-r4" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-1803387802-line-19)">│</text><text class="terminal-1803387802-r7" x="305" y="483.6" textLength="1134.6" clip-path="url(#terminal-1803387802-line-19)">apache-airflow-providers-celery&#160;|&#160;apache-airflow-providers-cloudant&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><tex [...]
-</text><text class="terminal-1803387802-r4" x="0" y="508" textLength="12.2" clip-path="url(#terminal-1803387802-line-20)">│</text><text class="terminal-1803387802-r7" x="305" y="508" textLength="1134.6" clip-path="url(#terminal-1803387802-line-20)">apache-airflow-providers-cncf-kubernetes&#160;|&#160;apache-airflow-providers-databricks&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1803387802-r4" x="1451.8" y="508" textLen [...]
-</text><text class="terminal-1803387802-r4" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-1803387802-line-21)">│</text><text class="terminal-1803387802-r7" x="305" y="532.4" textLength="1134.6" clip-path="url(#terminal-1803387802-line-21)">apache-airflow-providers-datadog&#160;|&#160;apache-airflow-providers-dbt-cloud&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="t [...]
-</text><text class="terminal-1803387802-r4" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-1803387802-line-22)">│</text><text class="terminal-1803387802-r7" x="305" y="556.8" textLength="1134.6" clip-path="url(#terminal-1803387802-line-22)">apache-airflow-providers-dingding&#160;|&#160;apache-airflow-providers-discord&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text cla [...]
-</text><text class="terminal-1803387802-r4" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-1803387802-line-23)">│</text><text class="terminal-1803387802-r7" x="305" y="581.2" textLength="1134.6" clip-path="url(#terminal-1803387802-line-23)">apache-airflow-providers-docker&#160;|&#160;apache-airflow-providers-elasticsearch&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1803387 [...]
-</text><text class="terminal-1803387802-r4" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-1803387802-line-24)">│</text><text class="terminal-1803387802-r7" x="305" y="605.6" textLength="1134.6" clip-path="url(#terminal-1803387802-line-24)">apache-airflow-providers-exasol&#160;|&#160;apache-airflow-providers-facebook&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><tex [...]
-</text><text class="terminal-1803387802-r4" x="0" y="630" textLength="12.2" clip-path="url(#terminal-1803387802-line-25)">│</text><text class="terminal-1803387802-r7" x="305" y="630" textLength="1134.6" clip-path="url(#terminal-1803387802-line-25)">apache-airflow-providers-ftp&#160;|&#160;apache-airflow-providers-github&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
-</text><text class="terminal-1803387802-r4" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-1803387802-line-26)">│</text><text class="terminal-1803387802-r7" x="305" y="654.4" textLength="1134.6" clip-path="url(#terminal-1803387802-line-26)">apache-airflow-providers-google&#160;|&#160;apache-airflow-providers-grpc&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
-</text><text class="terminal-1803387802-r4" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-1803387802-line-27)">│</text><text class="terminal-1803387802-r7" x="305" y="678.8" textLength="1134.6" clip-path="url(#terminal-1803387802-line-27)">apache-airflow-providers-hashicorp&#160;|&#160;apache-airflow-providers-http&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text [...]
-</text><text class="terminal-1803387802-r4" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-1803387802-line-28)">│</text><text class="terminal-1803387802-r7" x="305" y="703.2" textLength="1134.6" clip-path="url(#terminal-1803387802-line-28)">apache-airflow-providers-imap&#160;|&#160;apache-airflow-providers-influxdb&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;< [...]
-</text><text class="terminal-1803387802-r4" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-1803387802-line-29)">│</text><text class="terminal-1803387802-r7" x="305" y="727.6" textLength="1134.6" clip-path="url(#terminal-1803387802-line-29)">apache-airflow-providers-jdbc&#160;|&#160;apache-airflow-providers-jenkins&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
-</text><text class="terminal-1803387802-r4" x="0" y="752" textLength="12.2" clip-path="url(#terminal-1803387802-line-30)">│</text><text class="terminal-1803387802-r7" x="305" y="752" textLength="1134.6" clip-path="url(#terminal-1803387802-line-30)">apache-airflow-providers-jira&#160;|&#160;apache-airflow-providers-microsoft-azure&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1803387802- [...]
-</text><text class="terminal-1803387802-r4" x="0" y="776.4" textLength="12.2" clip-path="url(#terminal-1803387802-line-31)">│</text><text class="terminal-1803387802-r7" x="305" y="776.4" textLength="1134.6" clip-path="url(#terminal-1803387802-line-31)">apache-airflow-providers-microsoft-mssql&#160;|&#160;apache-airflow-providers-microsoft-psrp&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1803387802-r4" x="1451.8" y="776.4" textLength="12.2" cli [...]
-</text><text class="terminal-1803387802-r4" x="0" y="800.8" textLength="12.2" clip-path="url(#terminal-1803387802-line-32)">│</text><text class="terminal-1803387802-r7" x="305" y="800.8" textLength="1134.6" clip-path="url(#terminal-1803387802-line-32)">apache-airflow-providers-microsoft-winrm&#160;|&#160;apache-airflow-providers-mongo&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1803387802-r [...]
-</text><text class="terminal-1803387802-r4" x="0" y="825.2" textLength="12.2" clip-path="url(#terminal-1803387802-line-33)">│</text><text class="terminal-1803387802-r7" x="305" y="825.2" textLength="1134.6" clip-path="url(#terminal-1803387802-line-33)">apache-airflow-providers-mysql&#160;|&#160;apache-airflow-providers-neo4j&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1 [...]
-</text><text class="terminal-1803387802-r4" x="0" y="849.6" textLength="12.2" clip-path="url(#terminal-1803387802-line-34)">│</text><text class="terminal-1803387802-r7" x="305" y="849.6" textLength="1134.6" clip-path="url(#terminal-1803387802-line-34)">apache-airflow-providers-odbc&#160;|&#160;apache-airflow-providers-openfaas&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;< [...]
-</text><text class="terminal-1803387802-r4" x="0" y="874" textLength="12.2" clip-path="url(#terminal-1803387802-line-35)">│</text><text class="terminal-1803387802-r7" x="305" y="874" textLength="1134.6" clip-path="url(#terminal-1803387802-line-35)">apache-airflow-providers-opsgenie&#160;|&#160;apache-airflow-providers-oracle&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text cl [...]
-</text><text class="terminal-1803387802-r4" x="0" y="898.4" textLength="12.2" clip-path="url(#terminal-1803387802-line-36)">│</text><text class="terminal-1803387802-r7" x="305" y="898.4" textLength="1134.6" clip-path="url(#terminal-1803387802-line-36)">apache-airflow-providers-pagerduty&#160;|&#160;apache-airflow-providers-papermill&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-18 [...]
-</text><text class="terminal-1803387802-r4" x="0" y="922.8" textLength="12.2" clip-path="url(#terminal-1803387802-line-37)">│</text><text class="terminal-1803387802-r7" x="305" y="922.8" textLength="1134.6" clip-path="url(#terminal-1803387802-line-37)">apache-airflow-providers-plexus&#160;|&#160;apache-airflow-providers-postgres&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><tex [...]
-</text><text class="terminal-1803387802-r4" x="0" y="947.2" textLength="12.2" clip-path="url(#terminal-1803387802-line-38)">│</text><text class="terminal-1803387802-r7" x="305" y="947.2" textLength="1134.6" clip-path="url(#terminal-1803387802-line-38)">apache-airflow-providers-presto&#160;|&#160;apache-airflow-providers-qubole&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;< [...]
-</text><text class="terminal-1803387802-r4" x="0" y="971.6" textLength="12.2" clip-path="url(#terminal-1803387802-line-39)">│</text><text class="terminal-1803387802-r7" x="305" y="971.6" textLength="1134.6" clip-path="url(#terminal-1803387802-line-39)">apache-airflow-providers-redis&#160;|&#160;apache-airflow-providers-salesforce&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text cla [...]
-</text><text class="terminal-1803387802-r4" x="0" y="996" textLength="12.2" clip-path="url(#terminal-1803387802-line-40)">│</text><text class="terminal-1803387802-r7" x="305" y="996" textLength="1134.6" clip-path="url(#terminal-1803387802-line-40)">apache-airflow-providers-samba&#160;|&#160;apache-airflow-providers-segment&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tex [...]
-</text><text class="terminal-1803387802-r4" x="0" y="1020.4" textLength="12.2" clip-path="url(#terminal-1803387802-line-41)">│</text><text class="terminal-1803387802-r7" x="305" y="1020.4" textLength="1134.6" clip-path="url(#terminal-1803387802-line-41)">apache-airflow-providers-sendgrid&#160;|&#160;apache-airflow-providers-sftp&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
-</text><text class="terminal-1803387802-r4" x="0" y="1044.8" textLength="12.2" clip-path="url(#terminal-1803387802-line-42)">│</text><text class="terminal-1803387802-r7" x="305" y="1044.8" textLength="1134.6" clip-path="url(#terminal-1803387802-line-42)">apache-airflow-providers-singularity&#160;|&#160;apache-airflow-providers-slack&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class= [...]
-</text><text class="terminal-1803387802-r4" x="0" y="1069.2" textLength="12.2" clip-path="url(#terminal-1803387802-line-43)">│</text><text class="terminal-1803387802-r7" x="305" y="1069.2" textLength="1134.6" clip-path="url(#terminal-1803387802-line-43)">apache-airflow-providers-snowflake&#160;|&#160;apache-airflow-providers-sqlite&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text c [...]
-</text><text class="terminal-1803387802-r4" x="0" y="1093.6" textLength="12.2" clip-path="url(#terminal-1803387802-line-44)">│</text><text class="terminal-1803387802-r7" x="305" y="1093.6" textLength="1134.6" clip-path="url(#terminal-1803387802-line-44)">apache-airflow-providers-ssh&#160;|&#160;apache-airflow-providers-tableau&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="terminal-1803387802-r4" x="0" y="1118" textLength="12.2" clip-path="url(#terminal-1803387802-line-45)">│</text><text class="terminal-1803387802-r7" x="305" y="1118" textLength="1134.6" clip-path="url(#terminal-1803387802-line-45)">apache-airflow-providers-telegram&#160;|&#160;apache-airflow-providers-trino&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text>< [...]
-</text><text class="terminal-1803387802-r4" x="0" y="1142.4" textLength="12.2" clip-path="url(#terminal-1803387802-line-46)">│</text><text class="terminal-1803387802-r7" x="305" y="1142.4" textLength="1134.6" clip-path="url(#terminal-1803387802-line-46)">apache-airflow-providers-vertica&#160;|&#160;apache-airflow-providers-yandex&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</te [...]
-</text><text class="terminal-1803387802-r4" x="0" y="1166.8" textLength="12.2" clip-path="url(#terminal-1803387802-line-47)">│</text><text class="terminal-1803387802-r7" x="305" y="1166.8" textLength="1134.6" clip-path="url(#terminal-1803387802-line-47)">apache-airflow-providers-zendesk&#160;|&#160;docker-stack&#160;|&#160;helm-chart)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
-</text><text class="terminal-1803387802-r4" x="0" y="1191.2" textLength="1464" clip-path="url(#terminal-1803387802-line-48)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1803387802-r2" x="1464" y="1191.2" textLength="12.2" clip-path="url(#terminal-1803387802-line-48)">
-</text><text class="terminal-1803387802-r4" x="0" y="1215.6" textLength="24.4" clip-path="url(#terminal-1803387802-line-49)">╭─</text><text class="terminal-1803387802-r4" x="24.4" y="1215.6" textLength="1415.2" clip-path="url(#terminal-1803387802-line-49)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-1803387802-r4" x="1439.6" y="1215.6" textLength="24.4" clip-path="url(#terminal- [...]
-</text><text class="terminal-1803387802-r4" x="0" y="1240" textLength="12.2" clip-path="url(#terminal-1803387802-line-50)">│</text><text class="terminal-1803387802-r5" x="24.4" y="1240" textLength="12.2" clip-path="url(#terminal-1803387802-line-50)">-</text><text class="terminal-1803387802-r5" x="36.6" y="1240" textLength="97.6" clip-path="url(#terminal-1803387802-line-50)">-verbose</text><text class="terminal-1803387802-r6" x="280.6" y="1240" textLength="24.4" clip-path="url(#terminal-1 [...]
-</text><text class="terminal-1803387802-r4" x="0" y="1264.4" textLength="12.2" clip-path="url(#terminal-1803387802-line-51)">│</text><text class="terminal-1803387802-r5" x="24.4" y="1264.4" textLength="12.2" clip-path="url(#terminal-1803387802-line-51)">-</text><text class="terminal-1803387802-r5" x="36.6" y="1264.4" textLength="48.8" clip-path="url(#terminal-1803387802-line-51)">-dry</text><text class="terminal-1803387802-r5" x="85.4" y="1264.4" textLength="48.8" clip-path="url(#termina [...]
-</text><text class="terminal-1803387802-r4" x="0" y="1288.8" textLength="12.2" clip-path="url(#terminal-1803387802-line-52)">│</text><text class="terminal-1803387802-r5" x="24.4" y="1288.8" textLength="12.2" clip-path="url(#terminal-1803387802-line-52)">-</text><text class="terminal-1803387802-r5" x="36.6" y="1288.8" textLength="85.4" clip-path="url(#terminal-1803387802-line-52)">-github</text><text class="terminal-1803387802-r5" x="122" y="1288.8" textLength="134.2" clip-path="url(#term [...]
-</text><text class="terminal-1803387802-r4" x="0" y="1313.2" textLength="12.2" clip-path="url(#terminal-1803387802-line-53)">│</text><text class="terminal-1803387802-r5" x="24.4" y="1313.2" textLength="12.2" clip-path="url(#terminal-1803387802-line-53)">-</text><text class="terminal-1803387802-r5" x="36.6" y="1313.2" textLength="61" clip-path="url(#terminal-1803387802-line-53)">-help</text><text class="terminal-1803387802-r6" x="280.6" y="1313.2" textLength="24.4" clip-path="url(#termina [...]
-</text><text class="terminal-1803387802-r4" x="0" y="1337.6" textLength="1464" clip-path="url(#terminal-1803387802-line-54)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1803387802-r2" x="1464" y="1337.6" textLength="12.2" clip-path="url(#terminal-1803387802-line-54)">
+    <g class="terminal-417653393-matrix">
+    <text class="terminal-417653393-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-417653393-line-0)">
+</text><text class="terminal-417653393-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-417653393-line-1)">Usage:&#160;</text><text class="terminal-417653393-r1" x="97.6" y="44.4" textLength="329.4" clip-path="url(#terminal-417653393-line-1)">breeze&#160;build-docs&#160;[OPTIONS]</text><text class="terminal-417653393-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-417653393-line-1)">
+</text><text class="terminal-417653393-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-417653393-line-2)">
+</text><text class="terminal-417653393-r2" x="12.2" y="93.2" textLength="451.4" clip-path="url(#terminal-417653393-line-3)">Build&#160;documentation&#160;in&#160;the&#160;container.</text><text class="terminal-417653393-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-417653393-line-3)">
+</text><text class="terminal-417653393-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-417653393-line-4)">
+</text><text class="terminal-417653393-r4" x="0" y="142" textLength="24.4" clip-path="url(#terminal-417653393-line-5)">╭─</text><text class="terminal-417653393-r4" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-417653393-line-5)">&#160;Doc&#160;flags&#160;─────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-417653393-r4" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-417653393-l [...]
+</text><text class="terminal-417653393-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-417653393-line-6)">│</text><text class="terminal-417653393-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-417653393-line-6)">-</text><text class="terminal-417653393-r5" x="36.6" y="166.4" textLength="61" clip-path="url(#terminal-417653393-line-6)">-docs</text><text class="terminal-417653393-r5" x="97.6" y="166.4" textLength="61" clip-path="url(#terminal-417653393-line- [...]
+</text><text class="terminal-417653393-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-417653393-line-7)">│</text><text class="terminal-417653393-r5" x="24.4" y="190.8" textLength="12.2" clip-path="url(#terminal-417653393-line-7)">-</text><text class="terminal-417653393-r5" x="36.6" y="190.8" textLength="134.2" clip-path="url(#terminal-417653393-line-7)">-spellcheck</text><text class="terminal-417653393-r5" x="170.8" y="190.8" textLength="61" clip-path="url(#terminal-41765 [...]
+</text><text class="terminal-417653393-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-417653393-line-8)">│</text><text class="terminal-417653393-r5" x="24.4" y="215.2" textLength="12.2" clip-path="url(#terminal-417653393-line-8)">-</text><text class="terminal-417653393-r5" x="36.6" y="215.2" textLength="73.2" clip-path="url(#terminal-417653393-line-8)">-clean</text><text class="terminal-417653393-r5" x="109.8" y="215.2" textLength="73.2" clip-path="url(#terminal-417653393 [...]
+</text><text class="terminal-417653393-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-417653393-line-9)">│</text><text class="terminal-417653393-r2" x="305" y="239.6" textLength="1134.6" clip-path="url(#terminal-417653393-line-9)">before&#160;the&#160;build&#160;-&#160;useful&#160;for&#160;a&#160;clean&#160;build.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-417653393-r4" x="0" y="264" textLength="12.2" clip-path="url(#terminal-417653393-line-10)">│</text><text class="terminal-417653393-r5" x="24.4" y="264" textLength="12.2" clip-path="url(#terminal-417653393-line-10)">-</text><text class="terminal-417653393-r5" x="36.6" y="264" textLength="48.8" clip-path="url(#terminal-417653393-line-10)">-for</text><text class="terminal-417653393-r5" x="85.4" y="264" textLength="134.2" clip-path="url(#terminal-417653393-line-1 [...]
+</text><text class="terminal-417653393-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-417653393-line-11)">│</text><text class="terminal-417653393-r5" x="305" y="288.4" textLength="12.2" clip-path="url(#terminal-417653393-line-11)">-</text><text class="terminal-417653393-r5" x="317.2" y="288.4" textLength="73.2" clip-path="url(#terminal-417653393-line-11)">-clean</text><text class="terminal-417653393-r5" x="390.4" y="288.4" textLength="73.2" clip-path="url(#terminal-417653 [...]
+</text><text class="terminal-417653393-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-417653393-line-12)">│</text><text class="terminal-417653393-r5" x="24.4" y="312.8" textLength="12.2" clip-path="url(#terminal-417653393-line-12)">-</text><text class="terminal-417653393-r5" x="36.6" y="312.8" textLength="97.6" clip-path="url(#terminal-417653393-line-12)">-package</text><text class="terminal-417653393-r5" x="134.2" y="312.8" textLength="85.4" clip-path="url(#terminal-4176 [...]
+</text><text class="terminal-417653393-r4" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-417653393-line-13)">│</text><text class="terminal-417653393-r7" x="305" y="337.2" textLength="1134.6" clip-path="url(#terminal-417653393-line-13)">(apache-airflow&#160;|&#160;apache-airflow-providers&#160;|&#160;apache-airflow-providers-airbyte&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-417653393-r4" x="1451.8" y [...]
+</text><text class="terminal-417653393-r4" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-417653393-line-14)">│</text><text class="terminal-417653393-r7" x="305" y="361.6" textLength="1134.6" clip-path="url(#terminal-417653393-line-14)">apache-airflow-providers-alibaba&#160;|&#160;apache-airflow-providers-amazon&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><te [...]
+</text><text class="terminal-417653393-r4" x="0" y="386" textLength="12.2" clip-path="url(#terminal-417653393-line-15)">│</text><text class="terminal-417653393-r7" x="305" y="386" textLength="1134.6" clip-path="url(#terminal-417653393-line-15)">apache-airflow-providers-apache-beam&#160;|&#160;apache-airflow-providers-apache-cassandra&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-417653393-r4" x="1451.8" y="386" textLength="12.2" clip [...]
+</text><text class="terminal-417653393-r4" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-417653393-line-16)">│</text><text class="terminal-417653393-r7" x="305" y="410.4" textLength="1134.6" clip-path="url(#terminal-417653393-line-16)">apache-airflow-providers-apache-drill&#160;|&#160;apache-airflow-providers-apache-druid&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-417653393-r4" x="1451.8" y="410.4" t [...]
+</text><text class="terminal-417653393-r4" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-417653393-line-17)">│</text><text class="terminal-417653393-r7" x="305" y="434.8" textLength="1134.6" clip-path="url(#terminal-417653393-line-17)">apache-airflow-providers-apache-hdfs&#160;|&#160;apache-airflow-providers-apache-hive&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-417653393-r4" x="1451.8" y [...]
+</text><text class="terminal-417653393-r4" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-417653393-line-18)">│</text><text class="terminal-417653393-r7" x="305" y="459.2" textLength="1134.6" clip-path="url(#terminal-417653393-line-18)">apache-airflow-providers-apache-kylin&#160;|&#160;apache-airflow-providers-apache-livy&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-417653393-r4" x="1451.8" y="459 [...]
+</text><text class="terminal-417653393-r4" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-417653393-line-19)">│</text><text class="terminal-417653393-r7" x="305" y="483.6" textLength="1134.6" clip-path="url(#terminal-417653393-line-19)">apache-airflow-providers-apache-pig&#160;|&#160;apache-airflow-providers-apache-pinot&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-417653393-r4" x="1451.8" y [...]
+</text><text class="terminal-417653393-r4" x="0" y="508" textLength="12.2" clip-path="url(#terminal-417653393-line-20)">│</text><text class="terminal-417653393-r7" x="305" y="508" textLength="1134.6" clip-path="url(#terminal-417653393-line-20)">apache-airflow-providers-apache-spark&#160;|&#160;apache-airflow-providers-apache-sqoop&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-417653393-r4" x="1451.8" y="508" textLen [...]
+</text><text class="terminal-417653393-r4" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-417653393-line-21)">│</text><text class="terminal-417653393-r7" x="305" y="532.4" textLength="1134.6" clip-path="url(#terminal-417653393-line-21)">apache-airflow-providers-arangodb&#160;|&#160;apache-airflow-providers-asana&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><te [...]
+</text><text class="terminal-417653393-r4" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-417653393-line-22)">│</text><text class="terminal-417653393-r7" x="305" y="556.8" textLength="1134.6" clip-path="url(#terminal-417653393-line-22)">apache-airflow-providers-celery&#160;|&#160;apache-airflow-providers-cloudant&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text cl [...]
+</text><text class="terminal-417653393-r4" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-417653393-line-23)">│</text><text class="terminal-417653393-r7" x="305" y="581.2" textLength="1134.6" clip-path="url(#terminal-417653393-line-23)">apache-airflow-providers-cncf-kubernetes&#160;|&#160;apache-airflow-providers-databricks&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-417653393-r4" x="1451.8" y="581.2" textLe [...]
+</text><text class="terminal-417653393-r4" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-417653393-line-24)">│</text><text class="terminal-417653393-r7" x="305" y="605.6" textLength="1134.6" clip-path="url(#terminal-417653393-line-24)">apache-airflow-providers-datadog&#160;|&#160;apache-airflow-providers-dbt-cloud&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="termi [...]
+</text><text class="terminal-417653393-r4" x="0" y="630" textLength="12.2" clip-path="url(#terminal-417653393-line-25)">│</text><text class="terminal-417653393-r7" x="305" y="630" textLength="1134.6" clip-path="url(#terminal-417653393-line-25)">apache-airflow-providers-dingding&#160;|&#160;apache-airflow-providers-discord&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="term [...]
+</text><text class="terminal-417653393-r4" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-417653393-line-26)">│</text><text class="terminal-417653393-r7" x="305" y="654.4" textLength="1134.6" clip-path="url(#terminal-417653393-line-26)">apache-airflow-providers-docker&#160;|&#160;apache-airflow-providers-elasticsearch&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-417653393-r [...]
+</text><text class="terminal-417653393-r4" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-417653393-line-27)">│</text><text class="terminal-417653393-r7" x="305" y="678.8" textLength="1134.6" clip-path="url(#terminal-417653393-line-27)">apache-airflow-providers-exasol&#160;|&#160;apache-airflow-providers-facebook&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text cl [...]
+</text><text class="terminal-417653393-r4" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-417653393-line-28)">│</text><text class="terminal-417653393-r7" x="305" y="703.2" textLength="1134.6" clip-path="url(#terminal-417653393-line-28)">apache-airflow-providers-ftp&#160;|&#160;apache-airflow-providers-github&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
+</text><text class="terminal-417653393-r4" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-417653393-line-29)">│</text><text class="terminal-417653393-r7" x="305" y="727.6" textLength="1134.6" clip-path="url(#terminal-417653393-line-29)">apache-airflow-providers-google&#160;|&#160;apache-airflow-providers-grpc&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
+</text><text class="terminal-417653393-r4" x="0" y="752" textLength="12.2" clip-path="url(#terminal-417653393-line-30)">│</text><text class="terminal-417653393-r7" x="305" y="752" textLength="1134.6" clip-path="url(#terminal-417653393-line-30)">apache-airflow-providers-hashicorp&#160;|&#160;apache-airflow-providers-http&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text c [...]
+</text><text class="terminal-417653393-r4" x="0" y="776.4" textLength="12.2" clip-path="url(#terminal-417653393-line-31)">│</text><text class="terminal-417653393-r7" x="305" y="776.4" textLength="1134.6" clip-path="url(#terminal-417653393-line-31)">apache-airflow-providers-imap&#160;|&#160;apache-airflow-providers-influxdb&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tex [...]
+</text><text class="terminal-417653393-r4" x="0" y="800.8" textLength="12.2" clip-path="url(#terminal-417653393-line-32)">│</text><text class="terminal-417653393-r7" x="305" y="800.8" textLength="1134.6" clip-path="url(#terminal-417653393-line-32)">apache-airflow-providers-jdbc&#160;|&#160;apache-airflow-providers-jenkins&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-417653393-r4" x="0" y="825.2" textLength="12.2" clip-path="url(#terminal-417653393-line-33)">│</text><text class="terminal-417653393-r7" x="305" y="825.2" textLength="1134.6" clip-path="url(#terminal-417653393-line-33)">apache-airflow-providers-jira&#160;|&#160;apache-airflow-providers-microsoft-azure&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-417653393-r [...]
+</text><text class="terminal-417653393-r4" x="0" y="849.6" textLength="12.2" clip-path="url(#terminal-417653393-line-34)">│</text><text class="terminal-417653393-r7" x="305" y="849.6" textLength="1134.6" clip-path="url(#terminal-417653393-line-34)">apache-airflow-providers-microsoft-mssql&#160;|&#160;apache-airflow-providers-microsoft-psrp&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-417653393-r4" x="1451.8" y="849.6" textLength="12.2" clip-pat [...]
+</text><text class="terminal-417653393-r4" x="0" y="874" textLength="12.2" clip-path="url(#terminal-417653393-line-35)">│</text><text class="terminal-417653393-r7" x="305" y="874" textLength="1134.6" clip-path="url(#terminal-417653393-line-35)">apache-airflow-providers-microsoft-winrm&#160;|&#160;apache-airflow-providers-mongo&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-417653393-r4" x="145 [...]
+</text><text class="terminal-417653393-r4" x="0" y="898.4" textLength="12.2" clip-path="url(#terminal-417653393-line-36)">│</text><text class="terminal-417653393-r7" x="305" y="898.4" textLength="1134.6" clip-path="url(#terminal-417653393-line-36)">apache-airflow-providers-mysql&#160;|&#160;apache-airflow-providers-neo4j&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
+</text><text class="terminal-417653393-r4" x="0" y="922.8" textLength="12.2" clip-path="url(#terminal-417653393-line-37)">│</text><text class="terminal-417653393-r7" x="305" y="922.8" textLength="1134.6" clip-path="url(#terminal-417653393-line-37)">apache-airflow-providers-odbc&#160;|&#160;apache-airflow-providers-openfaas&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tex [...]
+</text><text class="terminal-417653393-r4" x="0" y="947.2" textLength="12.2" clip-path="url(#terminal-417653393-line-38)">│</text><text class="terminal-417653393-r7" x="305" y="947.2" textLength="1134.6" clip-path="url(#terminal-417653393-line-38)">apache-airflow-providers-opsgenie&#160;|&#160;apache-airflow-providers-oracle&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text cl [...]
+</text><text class="terminal-417653393-r4" x="0" y="971.6" textLength="12.2" clip-path="url(#terminal-417653393-line-39)">│</text><text class="terminal-417653393-r7" x="305" y="971.6" textLength="1134.6" clip-path="url(#terminal-417653393-line-39)">apache-airflow-providers-pagerduty&#160;|&#160;apache-airflow-providers-papermill&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-417653 [...]
+</text><text class="terminal-417653393-r4" x="0" y="996" textLength="12.2" clip-path="url(#terminal-417653393-line-40)">│</text><text class="terminal-417653393-r7" x="305" y="996" textLength="1134.6" clip-path="url(#terminal-417653393-line-40)">apache-airflow-providers-plexus&#160;|&#160;apache-airflow-providers-postgres&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class= [...]
+</text><text class="terminal-417653393-r4" x="0" y="1020.4" textLength="12.2" clip-path="url(#terminal-417653393-line-41)">│</text><text class="terminal-417653393-r7" x="305" y="1020.4" textLength="1134.6" clip-path="url(#terminal-417653393-line-41)">apache-airflow-providers-presto&#160;|&#160;apache-airflow-providers-qubole&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</t [...]
+</text><text class="terminal-417653393-r4" x="0" y="1044.8" textLength="12.2" clip-path="url(#terminal-417653393-line-42)">│</text><text class="terminal-417653393-r7" x="305" y="1044.8" textLength="1134.6" clip-path="url(#terminal-417653393-line-42)">apache-airflow-providers-redis&#160;|&#160;apache-airflow-providers-salesforce&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class [...]
+</text><text class="terminal-417653393-r4" x="0" y="1069.2" textLength="12.2" clip-path="url(#terminal-417653393-line-43)">│</text><text class="terminal-417653393-r7" x="305" y="1069.2" textLength="1134.6" clip-path="url(#terminal-417653393-line-43)">apache-airflow-providers-samba&#160;|&#160;apache-airflow-providers-segment&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</t [...]
+</text><text class="terminal-417653393-r4" x="0" y="1093.6" textLength="12.2" clip-path="url(#terminal-417653393-line-44)">│</text><text class="terminal-417653393-r7" x="305" y="1093.6" textLength="1134.6" clip-path="url(#terminal-417653393-line-44)">apache-airflow-providers-sendgrid&#160;|&#160;apache-airflow-providers-sftp&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</t [...]
+</text><text class="terminal-417653393-r4" x="0" y="1118" textLength="12.2" clip-path="url(#terminal-417653393-line-45)">│</text><text class="terminal-417653393-r7" x="305" y="1118" textLength="1134.6" clip-path="url(#terminal-417653393-line-45)">apache-airflow-providers-singularity&#160;|&#160;apache-airflow-providers-slack&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="termina [...]
+</text><text class="terminal-417653393-r4" x="0" y="1142.4" textLength="12.2" clip-path="url(#terminal-417653393-line-46)">│</text><text class="terminal-417653393-r7" x="305" y="1142.4" textLength="1134.6" clip-path="url(#terminal-417653393-line-46)">apache-airflow-providers-snowflake&#160;|&#160;apache-airflow-providers-sqlite&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class [...]
+</text><text class="terminal-417653393-r4" x="0" y="1166.8" textLength="12.2" clip-path="url(#terminal-417653393-line-47)">│</text><text class="terminal-417653393-r7" x="305" y="1166.8" textLength="1134.6" clip-path="url(#terminal-417653393-line-47)">apache-airflow-providers-ssh&#160;|&#160;apache-airflow-providers-tableau&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-417653393-r4" x="0" y="1191.2" textLength="12.2" clip-path="url(#terminal-417653393-line-48)">│</text><text class="terminal-417653393-r7" x="305" y="1191.2" textLength="1134.6" clip-path="url(#terminal-417653393-line-48)">apache-airflow-providers-telegram&#160;|&#160;apache-airflow-providers-trino&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text>< [...]
+</text><text class="terminal-417653393-r4" x="0" y="1215.6" textLength="12.2" clip-path="url(#terminal-417653393-line-49)">│</text><text class="terminal-417653393-r7" x="305" y="1215.6" textLength="1134.6" clip-path="url(#terminal-417653393-line-49)">apache-airflow-providers-vertica&#160;|&#160;apache-airflow-providers-yandex&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text>< [...]
+</text><text class="terminal-417653393-r4" x="0" y="1240" textLength="12.2" clip-path="url(#terminal-417653393-line-50)">│</text><text class="terminal-417653393-r7" x="305" y="1240" textLength="1134.6" clip-path="url(#terminal-417653393-line-50)">apache-airflow-providers-zendesk&#160;|&#160;docker-stack&#160;|&#160;helm-chart)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
+</text><text class="terminal-417653393-r4" x="0" y="1264.4" textLength="1464" clip-path="url(#terminal-417653393-line-51)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-417653393-r2" x="1464" y="1264.4" textLength="12.2" clip-path="url(#terminal-417653393-line-51)">
+</text><text class="terminal-417653393-r4" x="0" y="1288.8" textLength="24.4" clip-path="url(#terminal-417653393-line-52)">╭─</text><text class="terminal-417653393-r4" x="24.4" y="1288.8" textLength="1415.2" clip-path="url(#terminal-417653393-line-52)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-417653393-r4" x="1439.6" y="1288.8" textLength="24.4" clip-path="url(#terminal-41765 [...]
+</text><text class="terminal-417653393-r4" x="0" y="1313.2" textLength="12.2" clip-path="url(#terminal-417653393-line-53)">│</text><text class="terminal-417653393-r5" x="24.4" y="1313.2" textLength="12.2" clip-path="url(#terminal-417653393-line-53)">-</text><text class="terminal-417653393-r5" x="36.6" y="1313.2" textLength="97.6" clip-path="url(#terminal-417653393-line-53)">-verbose</text><text class="terminal-417653393-r6" x="280.6" y="1313.2" textLength="24.4" clip-path="url(#terminal- [...]
+</text><text class="terminal-417653393-r4" x="0" y="1337.6" textLength="12.2" clip-path="url(#terminal-417653393-line-54)">│</text><text class="terminal-417653393-r5" x="24.4" y="1337.6" textLength="12.2" clip-path="url(#terminal-417653393-line-54)">-</text><text class="terminal-417653393-r5" x="36.6" y="1337.6" textLength="48.8" clip-path="url(#terminal-417653393-line-54)">-dry</text><text class="terminal-417653393-r5" x="85.4" y="1337.6" textLength="48.8" clip-path="url(#terminal-41765 [...]
+</text><text class="terminal-417653393-r4" x="0" y="1362" textLength="12.2" clip-path="url(#terminal-417653393-line-55)">│</text><text class="terminal-417653393-r5" x="24.4" y="1362" textLength="12.2" clip-path="url(#terminal-417653393-line-55)">-</text><text class="terminal-417653393-r5" x="36.6" y="1362" textLength="85.4" clip-path="url(#terminal-417653393-line-55)">-github</text><text class="terminal-417653393-r5" x="122" y="1362" textLength="134.2" clip-path="url(#terminal-417653393- [...]
+</text><text class="terminal-417653393-r4" x="0" y="1386.4" textLength="12.2" clip-path="url(#terminal-417653393-line-56)">│</text><text class="terminal-417653393-r5" x="24.4" y="1386.4" textLength="12.2" clip-path="url(#terminal-417653393-line-56)">-</text><text class="terminal-417653393-r5" x="36.6" y="1386.4" textLength="61" clip-path="url(#terminal-417653393-line-56)">-help</text><text class="terminal-417653393-r6" x="280.6" y="1386.4" textLength="24.4" clip-path="url(#terminal-41765 [...]
+</text><text class="terminal-417653393-r4" x="0" y="1410.8" textLength="1464" clip-path="url(#terminal-417653393-line-57)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-417653393-r2" x="1464" y="1410.8" textLength="12.2" clip-path="url(#terminal-417653393-line-57)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output-commands-hash.txt b/images/breeze/output-commands-hash.txt
index abf5c552cd..e3ddc61f81 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -3,7 +3,7 @@
 # Please do not solve it but run `breeze regenerate-command-images`.
 # This command should fix the conflict and regenerate help images that you have conflict with.
 main:fa4319079b275ce966502346f083f2e3
-build-docs:b4f510db97402e0932f1ed86b37b4330
+build-docs:20b1a171a93c8ae1a62a0f3a804501f2
 build-image:b00ae014f9c45c116e8dd0ea72b61d19
 build-prod-image:4a3950d1a61aeb61218eb45659574139
 cleanup:9a94bd1063296ea86e895f671db0b330


[airflow] 07/22: Airflow `2.3.3` has been released (#24942)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit c173b4c67f0128b584834c35c8870b055e1b202d
Author: Ephraim Anierobi <sp...@gmail.com>
AuthorDate: Sun Jul 10 21:15:34 2022 +0100

    Airflow `2.3.3` has been released (#24942)
    
    (cherry picked from commit e2511910f2a4fc0120f1cc9c194663d42ffbe54d)
---
 .github/ISSUE_TEMPLATE/airflow_bug_report.yml      |  7 +++++--
 .../airflow_helmchart_bug_report.yml               | 10 +++++++---
 .../airflow_providers_bug_report.yml               |  9 +++++++--
 Dockerfile                                         |  5 ++---
 RELEASE_NOTES.rst                                  | 23 ++++++++++++++--------
 5 files changed, 36 insertions(+), 18 deletions(-)

diff --git a/.github/ISSUE_TEMPLATE/airflow_bug_report.yml b/.github/ISSUE_TEMPLATE/airflow_bug_report.yml
index 6d54817c82..f7f8232235 100644
--- a/.github/ISSUE_TEMPLATE/airflow_bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/airflow_bug_report.yml
@@ -25,8 +25,11 @@ body:
         discuss Airflow 1.10, open a [discussion](https://github.com/apache/airflow/discussions) instead!
       multiple: false
       options:
-        - "2.3.0b1 (pre-release)"
-        - "2.2.5 (latest released)"
+        - "2.3.3 (latest released)"
+        - "2.3.2"
+        - "2.3.1"
+        - "2.3.0"
+        - "2.2.5"
         - "2.2.4"
         - "2.2.3"
         - "2.2.2"
diff --git a/.github/ISSUE_TEMPLATE/airflow_helmchart_bug_report.yml b/.github/ISSUE_TEMPLATE/airflow_helmchart_bug_report.yml
index 677d41068d..27ce1cad56 100644
--- a/.github/ISSUE_TEMPLATE/airflow_helmchart_bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/airflow_helmchart_bug_report.yml
@@ -28,8 +28,8 @@ body:
         What Apache Airflow Helm Chart version are you using?
       multiple: false
       options:
-        - "2.3.0b1 (pre-release)"
-        - "1.5.0 (latest released)"
+        - "1.6.0 (latest released)"
+        - "1.5.0"
         - "1.4.0"
         - "1.3.0"
         - "1.2.0"
@@ -46,7 +46,11 @@ body:
         discuss Airflow 1.10, open a [discussion](https://github.com/apache/airflow/discussions) instead!
       multiple: false
       options:
-        - "2.2.5 (latest released)"
+        - "2.3.3 (latest released)"
+        - "2.3.2"
+        - "2.3.1"
+        - "2.3.0"
+        - "2.2.5"
         - "2.2.4"
         - "2.2.3"
         - "2.2.2"
diff --git a/.github/ISSUE_TEMPLATE/airflow_providers_bug_report.yml b/.github/ISSUE_TEMPLATE/airflow_providers_bug_report.yml
index ca1eb40fa7..20845ea0c7 100644
--- a/.github/ISSUE_TEMPLATE/airflow_providers_bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/airflow_providers_bug_report.yml
@@ -43,6 +43,7 @@ body:
         - celery
         - cloudant
         - cncf-kubernetes
+        - common-sql
         - databricks
         - datadog
         - dbt-cloud
@@ -92,6 +93,7 @@ body:
         - sqlite
         - ssh
         - tableau
+        - tabular
         - telegram
         - trino
         - vertica
@@ -112,8 +114,11 @@ body:
         discuss Airflow 1.10, open a [discussion](https://github.com/apache/airflow/discussions) instead!
       multiple: false
       options:
-        - "2.3.0b1 (pre-release)"
-        - "2.2.5 (latest released)"
+        - "2.3.3 (latest released)"
+        - "2.3.2"
+        - "2.3.1"
+        - "2.3.0"
+        - "2.2.5"
         - "2.2.4"
         - "2.2.3"
         - "2.2.2"
diff --git a/Dockerfile b/Dockerfile
index ce9b7d5b41..fdcbb6fa11 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.2.4"
+ARG AIRFLOW_VERSION="2.3.3"
 
 ARG PYTHON_BASE_IMAGE="python:3.7-slim-bullseye"
 
@@ -1329,9 +1329,8 @@ ARG INSTALL_PACKAGES_FROM_CONTEXT="false"
 ARG AIRFLOW_IS_IN_CONTEXT="false"
 # Those are additional constraints that are needed for some extras but we do not want to
 # Force them on the main Airflow package.
-# * certifi<2021.0.0 required to keep snowflake happy
 # * dill<0.3.3 required by apache-beam
-ARG EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS="dill<0.3.3 certifi<2021.0.0"
+ARG EAGER_UPGRADE_ADDITIONAL_REQUIREMENTS="dill<0.3.3"
 
 ENV ADDITIONAL_PYTHON_DEPS=${ADDITIONAL_PYTHON_DEPS} \
     INSTALL_PACKAGES_FROM_CONTEXT=${INSTALL_PACKAGES_FROM_CONTEXT} \
diff --git a/RELEASE_NOTES.rst b/RELEASE_NOTES.rst
index 3791ac7dcd..9b445081cf 100644
--- a/RELEASE_NOTES.rst
+++ b/RELEASE_NOTES.rst
@@ -294,7 +294,7 @@ Continuing the effort to bind TaskInstance to a DagRun, XCom entries are now als
 Task log templates are now read from the metadata database instead of ``airflow.cfg`` (#20165)
 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 
-Previously, a task’s log is dynamically rendered from the ``[core] log_filename_template`` and ``[elasticsearch] log_id_template`` config values at runtime. This resulted in unfortunate characteristics, e.g. it is impractical to modify the config value after an Airflow instance is running for a while, since all existing task logs have be saved under the previous format and cannot be found with the new config value.
+Previously, a task's log is dynamically rendered from the ``[core] log_filename_template`` and ``[elasticsearch] log_id_template`` config values at runtime. This resulted in unfortunate characteristics, e.g. it is impractical to modify the config value after an Airflow instance is running for a while, since all existing task logs have be saved under the previous format and cannot be found with the new config value.
 
 A new ``log_template`` table is introduced to solve this problem. This table is synchronized with the aforementioned config values every time Airflow starts, and a new field ``log_template_id`` is added to every DAG run to point to the format used by tasks (``NULL`` indicates the first ever entry for compatibility).
 
@@ -311,9 +311,9 @@ No change in behavior is expected.  This was necessary in order to take advantag
 XCom now defined by ``run_id`` instead of ``execution_date`` (#20975)
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 
-As a continuation to the TaskInstance-DagRun relation change started in Airflow 2.2, the ``execution_date`` columns on XCom has been removed from the database, and replaced by an `association proxy <https://docs.sqlalchemy.org/en/13/orm/extensions/associationproxy.html>`_ field at the ORM level. If you access Airflow’s metadata database directly, you should rewrite the implementation to use the ``run_id`` column instead.
+As a continuation to the TaskInstance-DagRun relation change started in Airflow 2.2, the ``execution_date`` columns on XCom has been removed from the database, and replaced by an `association proxy <https://docs.sqlalchemy.org/en/13/orm/extensions/associationproxy.html>`_ field at the ORM level. If you access Airflow's metadata database directly, you should rewrite the implementation to use the ``run_id`` column instead.
 
-Note that Airflow’s metadatabase definition on both the database and ORM levels are considered implementation detail without strict backward compatibility guarantees.
+Note that Airflow's metadatabase definition on both the database and ORM levels are considered implementation detail without strict backward compatibility guarantees.
 
 Non-JSON-serializable params deprecated (#21135).
 """""""""""""""""""""""""""""""""""""""""""""""""
@@ -361,7 +361,7 @@ This setting is also used for the deprecated experimental API, which only uses t
 ``airflow.models.base.Operator`` is removed (#21505)
 """"""""""""""""""""""""""""""""""""""""""""""""""""
 
-Previously, there was an empty class ``airflow.models.base.Operator`` for “type hinting”. This class was never really useful for anything (everything it did could be done better with ``airflow.models.baseoperator.BaseOperator``), and has been removed. If you are relying on the class’s existence, use ``BaseOperator`` (for concrete operators), ``airflow.models.abstractoperator.AbstractOperator`` (the base class of both ``BaseOperator`` and the AIP-42 ``MappedOperator``), or ``airflow.model [...]
+Previously, there was an empty class ``airflow.models.base.Operator`` for "type hinting". This class was never really useful for anything (everything it did could be done better with ``airflow.models.baseoperator.BaseOperator``), and has been removed. If you are relying on the class's existence, use ``BaseOperator`` (for concrete operators), ``airflow.models.abstractoperator.AbstractOperator`` (the base class of both ``BaseOperator`` and the AIP-42 ``MappedOperator``), or ``airflow.model [...]
 
 Zip files in the DAGs folder can no longer have a ``.py`` extension (#21538)
 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
@@ -1372,15 +1372,22 @@ As part of this change the ``clean_tis_without_dagrun_interval`` config option u
 TaskInstance and TaskReschedule now define ``run_id`` instead of ``execution_date``
 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 
-As a part of the TaskInstance-DagRun relation change, the ``execution_date`` columns on TaskInstance and TaskReschedule have been removed from the database, and replaced by `association proxy <https://docs.sqlalchemy.org/en/13/orm/extensions/associationproxy.html>`_ fields at the ORM level. If you access Airflow’s metadatabase directly, you should rewrite the implementation to use the ``run_id`` columns instead.
+As a part of the TaskInstance-DagRun relation change, the ``execution_date`` columns on TaskInstance and TaskReschedule have been removed from the database, and replaced by `association proxy <https://docs.sqlalchemy.org/en/13/orm/extensions/associationproxy.html>`_ fields at the ORM level. If you access Airflow's metadatabase directly, you should rewrite the implementation to use the ``run_id`` columns instead.
 
-Note that Airflow’s metadatabase definition on both the database and ORM levels are considered implementation detail without strict backward compatibility guarantees.
+Note that Airflow's metadatabase definition on both the database and ORM levels are considered implementation detail without strict backward compatibility guarantees.
 
 DaskExecutor - Dask Worker Resources and queues
 """""""""""""""""""""""""""""""""""""""""""""""
 
 If dask workers are not started with complementary resources to match the specified queues, it will now result in an ``AirflowException``\ , whereas before it would have just ignored the ``queue`` argument.
 
+Logical date of a DAG run triggered from the web UI now have its sub-second component set to zero
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+Due to a change in how the logical date (``execution_date``) is generated for a manual DAG run, a manual DAG run's logical date may not match its time-of-trigger, but have its sub-second part zero-ed out. For example, a DAG run triggered on ``2021-10-11T12:34:56.78901`` would have its logical date set to ``2021-10-11T12:34:56.00000``.
+
+This may affect some logic that expects on this quirk to detect whether a run is triggered manually or not. Note that ``dag_run.run_type`` is a more authoritative value for this purpose. Also, if you need this distinction between automated and manually-triggered run for "next execution date" calculation, please also consider using the new data interval variables instead, which provide a more consistent behavior between the two run types.
+
 New Features
 ^^^^^^^^^^^^
 
@@ -8884,14 +8891,14 @@ A logger is the entry point into the logging system. Each logger is a named buck
 
 Each message that is written to the logger is a Log Record. Each log record contains a log level indicating the severity of that specific message. A log record can also contain useful metadata that describes the event that is being logged. This can include details such as a stack trace or an error code.
 
-When a message is given to the logger, the log level of the message is compared to the log level of the logger. If the log level of the message meets or exceeds the log level of the logger itself, the message will undergo further processing. If it doesn’t, the message will be ignored.
+When a message is given to the logger, the log level of the message is compared to the log level of the logger. If the log level of the message meets or exceeds the log level of the logger itself, the message will undergo further processing. If it doesn't, the message will be ignored.
 
 Once a logger has determined that a message needs to be processed, it is passed to a Handler. This configuration is now more flexible and can be easily be maintained in a single file.
 
 Changes in Airflow Logging
 ~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-Airflow's logging mechanism has been refactored to use Python’s built-in ``logging`` module to perform logging of the application. By extending classes with the existing ``LoggingMixin``\ , all the logging will go through a central logger. Also the ``BaseHook`` and ``BaseOperator`` already extend this class, so it is easily available to do logging.
+Airflow's logging mechanism has been refactored to use Python's built-in ``logging`` module to perform logging of the application. By extending classes with the existing ``LoggingMixin``\ , all the logging will go through a central logger. Also the ``BaseHook`` and ``BaseOperator`` already extend this class, so it is easily available to do logging.
 
 The main benefit is easier configuration of the logging by setting a single centralized python file. Disclaimer; there is still some inline configuration, but this will be removed eventually. The new logging class is defined by setting the dotted classpath in your ``~/airflow/airflow.cfg`` file:
 


[airflow] 03/22: Don't add init.py files to __pycache__ folders. (#24896)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v2-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit cbdf3388cd6a0bd6f23432d8a61a2c963b4e0ecb
Author: Ash Berlin-Taylor <as...@apache.org>
AuthorDate: Thu Jul 7 16:02:08 2022 +0100

    Don't add init.py files to __pycache__ folders. (#24896)
    
    For instance, after running pytest I had these files created by this
    step:
    
    ```
    Create missing init.py files in tests..................................................Failed
    - hook id: create-missing-init-py-files-tests
    - exit code: 1
    
     Created /home/ash/code/airflow/airflow/tests/__pycache__/__init__.py
     Created /home/ash/code/airflow/airflow/tests/models/__pycache__/__init__.py
     Created /home/ash/code/airflow/airflow/tests/test_utils/__pycache__/__init__.py
     Created /home/ash/code/airflow/airflow/tests/test_utils/perf/__pycache__/__init__.py
     Created /home/ash/code/airflow/airflow/tests/test_utils/perf/perf_kit/__pycache__/__init__.py
    ```
    
    (This change also stops the `os.walkdir` from needlessly recursing in to
    test_logs folder as well.)
    
    (cherry picked from commit 90450c029b39e13222d85c1d2c0a4958d8930be0)
---
 scripts/ci/pre_commit/pre_commit_check_init_in_tests.py | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/scripts/ci/pre_commit/pre_commit_check_init_in_tests.py b/scripts/ci/pre_commit/pre_commit_check_init_in_tests.py
index 947f284e16..e59abddcef 100755
--- a/scripts/ci/pre_commit/pre_commit_check_init_in_tests.py
+++ b/scripts/ci/pre_commit/pre_commit_check_init_in_tests.py
@@ -39,11 +39,12 @@ errors: List[str] = []
 added = False
 
 if __name__ == '__main__':
-    for dir, sub_dirs, files in os.walk(str(ROOT_DIR / "tests")):
+    for dirname, sub_dirs, files in os.walk(ROOT_DIR / "tests"):
+        dir = Path(dirname)
+        sub_dirs[:] = [subdir for subdir in sub_dirs if subdir not in {"__pycache__", "test_logs"}]
         for sub_dir in sub_dirs:
-            dir_to_check = dir + os.sep + sub_dir
-            init_py_path = Path(dir_to_check) / "__init__.py"
-            if not init_py_path.exists() and "/test_logs/" not in str(init_py_path):
+            init_py_path = dir / sub_dir / "__init__.py"
+            if not init_py_path.exists():
                 init_py_path.touch()
                 console.print(f"[yellow] Created {init_py_path}[/]")
                 added = True