diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 6ca7543136bfc..39ed3ac08d456 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1021,6 +1021,55 @@ jobs:
         uses: ./.github/actions/post_tests_failure
         if: failure()
 
+  tests-postgres-min-sqlalchemy:
+    timeout-minutes: 130
+    name: >
+      MinSQLAlchemy${{needs.build-info.outputs.default-postgres-version}},
+      Py${{needs.build-info.outputs.default-python-version}}:
+      ${{needs.build-info.outputs.parallel-test-types-list-as-string}}
+    runs-on: "${{needs.build-info.outputs.runs-on}}"
+    needs: [build-info, wait-for-ci-images]
+    env:
+      RUNS_ON: "${{needs.build-info.outputs.runs-on}}"
+      PARALLEL_TEST_TYPES: "${{needs.build-info.outputs.parallel-test-types-list-as-string}}"
+      PR_LABELS: "${{needs.build-info.outputs.pull-request-labels}}"
+      FULL_TESTS_NEEDED: "${{needs.build-info.outputs.full-tests-needed}}"
+      DEBUG_RESOURCES: "${{needs.build-info.outputs.debug-resources}}"
+      BACKEND: "postgres"
+      PYTHON_MAJOR_MINOR_VERSION: "${{needs.build-info.outputs.default-python-version}}"
+      PYTHON_VERSION: "${needs.build-info.outputs.default-python-version}}"
+      POSTGRES_VERSION: "${{needs.build-info.outputs.default-postgres-version}}"
+      BACKEND_VERSION: "${{needs.build-info.outputs.default-postgres-version}}"
+      DOWNGRADE_SQLALCHEMY: "true"
+      JOB_ID: >
+        postgres-min-sqlalchemy-${{needs.build-info.outputs.default-python-version}}-
+        ${{needs.build-info.outputs.default-postgres-version}}
+      COVERAGE: "${{needs.build-info.outputs.run-coverage}}"
+    if: needs.build-info.outputs.run-tests == 'true'
+    steps:
+      - name: Cleanup repo
+        shell: bash
+        run: docker run -v "${GITHUB_WORKSPACE}:/workspace" -u 0:0 bash -c "rm -rf /workspace/*"
+      - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
+        uses: actions/checkout@v3
+        with:
+          persist-credentials: false
+      - name: >
+          Prepare breeze & CI image: ${{needs.build-info.outputs.default-python-version}}:${{env.IMAGE_TAG}}
+        uses: ./.github/actions/prepare_breeze_and_image
+      - name: >
+          Tests: ${{needs.build-info.outputs.default-python-version}}:
+          ${{needs.build-info.outputs.parallel-test-types-list-as-string}}
+        run: breeze testing tests --run-in-parallel
+      - name: >
+          Post Tests success: ${{needs.build-info.outputs.default-python-version}}:Boto"
+        uses: ./.github/actions/post_tests_success
+        if: success()
+      - name: >
+          Post Tests failure: ${{needs.build-info.outputs.default-python-version}}:Boto"
+        uses: ./.github/actions/post_tests_failure
+        if: failure()
+
   tests-postgres-in-progress-features-disabled:
     timeout-minutes: 130
     name: >
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 6c101938082a1..6e5d981a10288 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -292,6 +292,11 @@ repos:
           - --ignore-words=docs/spelling_wordlist.txt
           - --skip=airflow/providers/*/*.rst,airflow/www/*.log,docs/*/commits.rst,docs/apache-airflow/tutorial/pipeline_example.csv,*.min.js,*.lock,INTHEWILD.md
           - --exclude-file=.codespellignorelines
+  - repo: https://github.com/abravalheri/validate-pyproject
+    rev: v0.14
+    hooks:
+      - id: validate-pyproject
+        name: Validate pyproject.toml
   - repo: local
     # Note that this is the 2nd "local" repo group in the .pre-commit-config.yaml file. This is because
     # we try to minimise the number of passes that must happen in order to apply some of the changes
diff --git a/BREEZE.rst b/BREEZE.rst
index 9ebb0f76e15b1..c7e4f1ff9b28b 100644
--- a/BREEZE.rst
+++ b/BREEZE.rst
@@ -2051,23 +2051,35 @@ To add back references to the documentation generated by ``build-docs`` in Breez
 use the ``release-management add-back-references`` command. This is important to support backward compatibility
 the airflow documentation.
 
-.. code-block:: bash
-
-     breeze release-management add-back-references
+You have to specify which packages you run it on. For example you can run it for all providers:
 
 .. code-block:: bash
 
-     release-management add-back-references --airflow-site-directory DIRECTORY
+     release-management add-back-references --airflow-site-directory DIRECTORY all-providers
 
 The flag ``--airflow-site-directory`` takes the path of the cloned ``airflow-site``. The command will
 not proceed if this is an invalid path.
 
+You can also run the command for apache-airflow (core documentation):
+
+.. code-block:: bash
+
+     breeze release-management publish-docs --airflow-site-directory DIRECTORY apache-airflow
+
+Also for helm-chart package:
+
+.. code-block:: bash
+
+     breeze release-management publish-docs --airflow-site-directory DIRECTORY helm-chart
+
+
+You can also manually specify (it's auto-completable) list of packages to run the command for including individual
+providers - you can mix apache-airflow, helm-chart and provider packages this way:
+
 .. code-block:: bash
 
-     breeze release-management publish-docs --gen-type [airflow | providers | helm]
+     breeze release-management publish-docs --airflow-site-directory DIRECTORY apache.airflow apache.beam google
 
-The flag ``--gen-type`` is a string of which type of back references to generate. It can take the values of
-airflow, providers, or helm. The command will fail if this is incorrect.
 
 These are all available flags of ``release-management add-back-references`` command:
 
diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
index be9a68d382eeb..15bba2fc9125e 100644
--- a/CONTRIBUTING.rst
+++ b/CONTRIBUTING.rst
@@ -1457,15 +1457,17 @@ We don't create new issues on JIRA anymore. The reason we still look at JIRA iss
 * The `Apache Airflow Slack <https://s.apache.org/airflow-slack>`_ for:
    * ad-hoc questions related to development (#development channel)
    * asking for review (#development channel)
-   * asking for help with PRs (#how-to-pr channel)
+   * asking for help with first contribution PRs (#development-first-pr-support channel)
    * troubleshooting (#troubleshooting channel)
    * group talks (including SIG - special interest groups) (#sig-* channels)
    * notifications (#announcements channel)
    * random queries (#random channel)
    * regional announcements (#users-* channels)
-   * newbie questions (#newbie-questions channel)
    * occasional discussions (wherever appropriate including group and 1-1 discussions)
 
+Please exercise caution against posting same questions across multiple channels. Doing so not only prevents
+redundancy but also promotes more efficient and effective communication for everyone involved.
+
 The devlist is the most important and official communication channel. Often at Apache project you can
 hear "if it is not in the devlist - it did not happen". If you discuss and agree with someone from the
 community on something important for the community (including if it is with committer or PMC member) the
diff --git a/Dockerfile.ci b/Dockerfile.ci
index 9092465c82b70..aba7e6913b3c0 100644
--- a/Dockerfile.ci
+++ b/Dockerfile.ci
@@ -937,6 +937,22 @@ if [[ ${SKIP_ENVIRONMENT_INITIALIZATION=} != "true" ]]; then
 fi
 
 rm -f "${AIRFLOW_SOURCES}/pytest.ini"
+if [[ ${UPGRADE_BOTO=} == "true" ]]; then
+    echo
+    echo "${COLOR_BLUE}Upgrading boto3, botocore to latest version to run Amazon tests with them${COLOR_RESET}"
+    echo
+    pip uninstall --root-user-action ignore aiobotocore -y || true
+    pip install --root-user-action ignore --upgrade boto3 botocore
+    pip check
+fi
+if [[ ${DOWNGRADE_SQLALCHEMY=} == "true" ]]; then
+    min_sqlalchemy_version=$(grep "sqlalchemy>=" setup.cfg | sed "s/.*>=\([0-9\.]*\).*/\1/")
+    echo
+    echo "${COLOR_BLUE}Downgrading sqlalchemy to minimum supported version: ${min_sqlalchemy_version}${COLOR_RESET}"
+    echo
+    pip install --root-user-action ignore "sqlalchemy==${min_sqlalchemy_version}"
+    pip check
+fi
 
 set +u
 if [[ "${RUN_TESTS}" != "true" ]]; then
@@ -1166,13 +1182,6 @@ else
         exit 1
     fi
 fi
-if [[ ${UPGRADE_BOTO=} == "true" ]]; then
-    echo
-    echo "${COLOR_BLUE}Upgrading boto3, botocore to latest version to run Amazon tests with them${COLOR_RESET}"
-    echo
-    pip uninstall aiobotocore -y || true
-    pip install --upgrade boto3 botocore
-fi
 readonly SELECTED_TESTS CLI_TESTS API_TESTS PROVIDERS_TESTS CORE_TESTS WWW_TESTS \
     ALL_TESTS ALL_PRESELECTED_TESTS
 
@@ -1233,7 +1242,7 @@ ARG PYTHON_BASE_IMAGE
 ARG AIRFLOW_IMAGE_REPOSITORY="https://github.com/apache/airflow"
 
 # By increasing this number we can do force build of all dependencies
-ARG DEPENDENCIES_EPOCH_NUMBER="9"
+ARG DEPENDENCIES_EPOCH_NUMBER="10"
 
 # Make sure noninteractive debian install is used and language variables set
 ENV PYTHON_BASE_IMAGE=${PYTHON_BASE_IMAGE} \
diff --git a/README.md b/README.md
index e8c2adc346df5..cd8c597a44e00 100644
--- a/README.md
+++ b/README.md
@@ -89,18 +89,20 @@ Airflow is not a streaming solution, but it is often used to process real-time d
 
 Apache Airflow is tested with:
 
-|             | Main version (dev)     | Stable version (2.7.1) |
-|-------------|------------------------|------------------------|
-| Python      | 3.8, 3.9, 3.10, 3.11   | 3.8, 3.9, 3.10, 3.11   |
-| Platform    | AMD64/ARM64(\*)        | AMD64/ARM64(\*)        |
-| Kubernetes  | 1.24, 1.25, 1.26, 1.27 | 1.24, 1.25, 1.26, 1.27 |
-| PostgreSQL  | 11, 12, 13, 14, 15     | 11, 12, 13, 14, 15     |
-| MySQL       | 5.7, 8.0, 8.1          | 5.7, 8.0, 8.1          |
-| SQLite      | 3.15.0+                | 3.15.0+                |
-| MSSQL       | 2017(\*), 2019(\*)     | 2017(\*), 2019(\*)     |
+|             | Main version (dev)           | Stable version (2.7.2) |
+|-------------|------------------------------|------------------------|
+| Python      | 3.8, 3.9, 3.10, 3.11         | 3.8, 3.9, 3.10, 3.11   |
+| Platform    | AMD64/ARM64(\*)              | AMD64/ARM64(\*)        |
+| Kubernetes  | 1.24, 1.25, 1.26, 1.27, 1.28 | 1.24, 1.25, 1.26, 1.27 |
+| PostgreSQL  | 11, 12, 13, 14, 15           | 11, 12, 13, 14, 15     |
+| MySQL       | 5.7, 8.0, 8.1                | 5.7, 8.0               |
+| SQLite      | 3.15.0+                      | 3.15.0+                |
+| MSSQL       | 2017(\*\*), 2019(\*\*)       | 2017(\*), 2019(\*)     |
 
 \* Experimental
 
+\*\* **Discontinued soon**, not recommended for the new installation
+
 **Note**: MySQL 5.x versions are unable to or have limitations with
 running multiple schedulers -- please see the [Scheduler docs](https://airflow.apache.org/docs/apache-airflow/stable/scheduler.html).
 MariaDB is not tested/recommended.
@@ -170,15 +172,15 @@ them to the appropriate format and workflow that your tool requires.
 
 
 ```bash
-pip install 'apache-airflow==2.7.1' \
- --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.7.1/constraints-3.8.txt"
+pip install 'apache-airflow==2.7.2' \
+ --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.7.2/constraints-3.8.txt"
 ```
 
 2. Installing with extras (i.e., postgres, google)
 
 ```bash
-pip install 'apache-airflow[postgres,google]==2.7.1' \
- --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.7.1/constraints-3.8.txt"
+pip install 'apache-airflow[postgres,google]==2.7.2' \
+ --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.7.2/constraints-3.8.txt"
 ```
 
 For information on installing provider packages, check
@@ -290,7 +292,7 @@ Apache Airflow version life cycle:
 
 | Version   | Current Patch/Minor   | State     | First Release   | Limited Support   | EOL/Terminated   |
 |-----------|-----------------------|-----------|-----------------|-------------------|------------------|
-| 2         | 2.7.1                 | Supported | Dec 17, 2020    | TBD               | TBD              |
+| 2         | 2.7.2                 | Supported | Dec 17, 2020    | TBD               | TBD              |
 | 1.10      | 1.10.15               | EOL       | Aug 27, 2018    | Dec 17, 2020      | June 17, 2021    |
 | 1.9       | 1.9.0                 | EOL       | Jan 03, 2018    | Aug 27, 2018      | Aug 27, 2018     |
 | 1.8       | 1.8.2                 | EOL       | Mar 19, 2017    | Jan 03, 2018      | Jan 03, 2018     |
diff --git a/RELEASE_NOTES.rst b/RELEASE_NOTES.rst
index 7f4ff593b4ebe..6430d19ded585 100644
--- a/RELEASE_NOTES.rst
+++ b/RELEASE_NOTES.rst
@@ -21,6 +21,121 @@
 
 .. towncrier release notes start
 
+Airflow 2.7.2 (2023-10-12)
+--------------------------
+
+Significant Changes
+^^^^^^^^^^^^^^^^^^^
+
+No significant changes
+
+
+Bug Fixes
+"""""""""
+- Check if the lower of provided values are sensitives in config endpoint (#34712)
+- Add support for ZoneInfo and generic UTC to fix datetime serialization (#34683, #34804)
+- Fix AttributeError: 'Select' object has no attribute 'count' during the airflow db migrate command (#34348)
+- Make dry run optional for patch task instance  (#34568)
+- Fix non deterministic datetime deserialization (#34492)
+- Use iterative loop to look for mapped parent (#34622)
+- Fix is_parent_mapped value by checking if any of the parent ``taskgroup`` is mapped (#34587)
+- Avoid top-level airflow import to avoid circular dependency (#34586)
+- Add more exemptions to lengthy metric list (#34531)
+- Fix dag warning endpoint permissions (#34355)
+- Fix task instance access issue in the batch endpoint (#34315)
+- Correcting wrong time showing in grid view (#34179)
+- Fix www ``cluster_activity`` view not loading due to ``standaloneDagProcessor`` templating (#34274)
+- Set ``loglevel=DEBUG`` in 'Not syncing ``DAG-level`` permissions' (#34268)
+- Make param validation consistent for DAG validation and triggering (#34248)
+- Ensure details panel is shown when any tab is selected (#34136)
+- Fix issues related to ``access_control={}`` (#34114)
+- Fix not found ``ab_user`` table in the CLI session (#34120)
+- Fix FAB-related logging format interpolation (#34139)
+- Fix query bug in ``next_run_datasets_summary`` endpoint (#34143)
+- Fix for TaskGroup toggles for duplicated labels (#34072)
+- Fix the required permissions to clear a TI from the UI (#34123)
+- Reuse ``_run_task_session`` in mapped ``render_template_fields`` (#33309)
+- Fix scheduler logic to plan new dag runs by ignoring manual runs (#34027)
+- Add missing audit logs for Flask actions add, edit and delete (#34090)
+- Hide Irrelevant Dag Processor from Cluster Activity Page (#33611)
+- Remove infinite animation for pinwheel, spin for 1.5s (#34020)
+- Restore rendering of provider configuration with ``version_added`` (#34011)
+
+Doc Only Changes
+""""""""""""""""
+- Clarify audit log permissions (#34815)
+- Add explanation for Audit log users (#34814)
+- Import ``AUTH_REMOTE_USER`` from FAB in WSGI middleware example (#34721)
+- Add information about drop support MsSQL as DB Backend in the future (#34375)
+- Document how to use the system's timezone database (#34667)
+- Clarify what landing time means in doc (#34608)
+- Fix screenshot in dynamic task mapping docs (#34566)
+- Fix class reference in Public Interface documentation (#34454)
+- Clarify var.value.get  and var.json.get usage (#34411)
+- Schedule default value description (#34291)
+- Docs for triggered_dataset_event (#34410)
+- Add DagRun events (#34328)
+- Provide tabular overview about trigger form param types (#34285)
+- Add link to Amazon Provider Configuration in Core documentation (#34305)
+- Add "security infrastructure" paragraph to security model (#34301)
+- Change links to SQLAlchemy 1.4 (#34288)
+- Add SBOM entry in security documentation (#34261)
+- Added more example code for XCom push and pull (#34016)
+- Add state utils to Public Airflow Interface (#34059)
+- Replace markdown style link with rst style link (#33990)
+- Fix broken link to the "UPDATING.md" file (#33583)
+
+Misc/Internal
+"""""""""""""
+- Update min-sqlalchemy version to account for latest features used (#34293)
+- Fix SesssionExemptMixin spelling (#34696)
+- Restrict ``astroid`` version < 3 (#34658)
+- Fail dag test if defer without triggerer (#34619)
+- Fix connections exported output (#34640)
+- Don't run isort when creating new alembic migrations (#34636)
+- Deprecate numeric type python version in PythonVirtualEnvOperator (#34359)
+- Refactor ``os.path.splitext`` to ``Path.*`` (#34352, #33669)
+- Replace = by is for type comparison (#33983)
+- Refactor integer division (#34180)
+- Refactor: Simplify comparisons (#34181)
+- Refactor: Simplify string generation (#34118)
+- Replace unnecessary dict comprehension with dict() in core (#33858)
+- Change "not all" to "any" for ease of readability (#34259)
+- Replace assert by if...raise in code (#34250, #34249)
+- Move default timezone to except block (#34245)
+- Combine similar if logic in core (#33988)
+- Refactor: Consolidate import and usage of random (#34108)
+- Consolidate importing of os.path.* (#34060)
+- Replace sequence concatenation by unpacking in Airflow core (#33934)
+- Refactor unneeded 'continue' jumps around the repo (#33849, #33845, #33846, #33848, #33839, #33844, #33836, #33842)
+- Remove [project] section from ``pyproject.toml`` (#34014)
+- Move the try outside the loop when this is possible in Airflow core (#33975)
+- Replace loop by any when looking for a positive value in core (#33985)
+- Do not create lists we don't need (#33519)
+- Remove useless string join from core (#33969)
+- Add TCH001 and TCH002 rules to pre-commit to detect and move type checking modules (#33865)
+- Add cancel_trigger_ids to to_cancel dequeue in batch (#33944)
+- Avoid creating unnecessary list when parsing stats datadog tags (#33943)
+- Replace dict.items by dict.values when key is not used in core (#33940)
+- Replace lambdas with comprehensions (#33745)
+- Improve modules import in Airflow core by some of them into a type-checking block (#33755)
+- Refactor: remove unused state - SHUTDOWN (#33746, #34063, #33893)
+- Refactor: Use in-place .sort() (#33743)
+- Use literal dict instead of calling dict() in Airflow core (#33762)
+- remove unnecessary map and rewrite it using list in Airflow core (#33764)
+- Replace lambda by a def method in Airflow core (#33758)
+- Replace type func by ``isinstance`` in fab_security manager (#33760)
+- Replace single quotes by double quotes in all Airflow modules (#33766)
+- Merge multiple ``isinstance`` calls for the same object in a single call (#33767)
+- Use a single  statement with multiple contexts instead of nested  statements in core (#33769)
+- Refactor: Use f-strings (#33734, #33455)
+- Refactor: Use random.choices (#33631)
+- Use ``str.splitlines()`` to split lines (#33592)
+- Refactor: Remove useless str() calls (#33629)
+- Refactor: Improve detection of duplicates and list sorting (#33675)
+- Simplify conditions on ``len()`` (#33454)
+
+
 Airflow 2.7.1 (2023-09-07)
 --------------------------
 
diff --git a/STATIC_CODE_CHECKS.rst b/STATIC_CODE_CHECKS.rst
index 8563045a5eeaa..d85b75ae7d079 100644
--- a/STATIC_CODE_CHECKS.rst
+++ b/STATIC_CODE_CHECKS.rst
@@ -357,6 +357,8 @@ require Breeze Docker image to be built locally.
 +-----------------------------------------------------------+--------------------------------------------------------------+---------+
 | update-version                                            | Update version to the latest version in the documentation    |         |
 +-----------------------------------------------------------+--------------------------------------------------------------+---------+
+| validate-pyproject                                        | Validate pyproject.toml                                      |         |
++-----------------------------------------------------------+--------------------------------------------------------------+---------+
 | yamllint                                                  | Check YAML files with yamllint                               |         |
 +-----------------------------------------------------------+--------------------------------------------------------------+---------+
 
diff --git a/airflow/__init__.py b/airflow/__init__.py
index cd5ec8b7ac381..182b71dc2feb9 100644
--- a/airflow/__init__.py
+++ b/airflow/__init__.py
@@ -26,7 +26,7 @@
 """
 from __future__ import annotations
 
-__version__ = "2.7.1"
+__version__ = "2.7.2"
 
 # flake8: noqa: F401
 
diff --git a/airflow/_vendor/README.md b/airflow/_vendor/README.md
index e708f1e507160..e76d8beea360c 100644
--- a/airflow/_vendor/README.md
+++ b/airflow/_vendor/README.md
@@ -10,7 +10,7 @@ the `_vendor` package.
 All Vendored libraries must follow these rules:
 
 1. Vendored libraries must be pure Python--no compiling (so that we do not have to release multi-platform airflow packages on PyPI).
-2. Source code for the libary is included in this directory.
+2. Source code for the library is included in this directory.
 3. License must be included in this repo and in the [LICENSE](../../LICENSE) file and in the
    [licenses](../../licenses) folder.
 4. Requirements of the library become requirements of airflow core.
@@ -19,7 +19,7 @@ All Vendored libraries must follow these rules:
 7. Apply the fixes necessary to use the vendored library as separate commits - each package separately,
    so that they can be cherry-picked later if we upgrade the vendored package. Changes to airflow code to
    use the vendored packages should be applied as separate commits/PRs.
-8. The `_vendor` packages should be excluded from any refactorings, static checks and automated fixes.
+8. The `_vendor` packages should be excluded from any refactoring, static checks and automated fixes.
 
 ## Adding and upgrading a vendored package
 
@@ -28,7 +28,7 @@ Way to vendor a library or update a version:
 1. Update ``vendor.txt`` with the library, version, and SHA256 (`pypi` provides hashes as of recently)
 2. Remove all old files and directories of the old version.
 3. Replace them with new files (only replace relevant python packages:move LICENSE )
-   * move licence files to [licenses](../../licenses) folder
+   * move license files to [licenses](../../licenses) folder
    * remove README and any other supporting files (they can be found in PyPI)
    * make sure to add requirements from setup.py to airflow's setup.py with appropriate comment stating
      why the requirements are added and when they should be removed
diff --git a/airflow/alembic.ini b/airflow/alembic.ini
index e16f51979f148..988fa234ee7df 100644
--- a/airflow/alembic.ini
+++ b/airflow/alembic.ini
@@ -83,9 +83,3 @@ formatter = generic
 [formatter_generic]
 format = %(levelname)-5.5s [%(name)s] %(message)s
 datefmt = %H:%M:%S
-
-[post_write_hooks]
-hooks=isort
-
-isort.type=console_scripts
-isort.entrypoint=isort
diff --git a/airflow/api/__init__.py b/airflow/api/__init__.py
index 656009b0dd69d..a58caea9fd8fb 100644
--- a/airflow/api/__init__.py
+++ b/airflow/api/__init__.py
@@ -36,12 +36,12 @@ def load_auth():
         pass
 
     backends = []
-    for backend in auth_backends.split(","):
-        try:
+    try:
+        for backend in auth_backends.split(","):
             auth = import_module(backend.strip())
             log.info("Loaded API auth backend: %s", backend)
             backends.append(auth)
-        except ImportError as err:
-            log.critical("Cannot import %s for API authentication due to: %s", backend, err)
-            raise AirflowException(err)
+    except ImportError as err:
+        log.critical("Cannot import %s for API authentication due to: %s", backend, err)
+        raise AirflowException(err)
     return backends
diff --git a/airflow/api/auth/backend/kerberos_auth.py b/airflow/api/auth/backend/kerberos_auth.py
index 5306ca6d1ee74..e5458d05529c1 100644
--- a/airflow/api/auth/backend/kerberos_auth.py
+++ b/airflow/api/auth/backend/kerberos_auth.py
@@ -144,7 +144,7 @@ def decorated(*args, **kwargs):
                 response = function(*args, **kwargs)
                 response = make_response(response)
                 if ctx.kerberos_token is not None:
-                    response.headers["WWW-Authenticate"] = " ".join(["negotiate", ctx.kerberos_token])
+                    response.headers["WWW-Authenticate"] = f"negotiate {ctx.kerberos_token}"
 
                 return response
             if return_code != kerberos.AUTH_GSS_CONTINUE:
diff --git a/airflow/api/common/delete_dag.py b/airflow/api/common/delete_dag.py
index 1d879a667addc..de0abdfb400a3 100644
--- a/airflow/api/common/delete_dag.py
+++ b/airflow/api/common/delete_dag.py
@@ -79,9 +79,7 @@ def delete_dag(dag_id: str, keep_records_in_log: bool = True, session: Session =
     count = 0
 
     for model in get_sqla_model_classes():
-        if hasattr(model, "dag_id"):
-            if keep_records_in_log and model.__name__ == "Log":
-                continue
+        if hasattr(model, "dag_id") and (not keep_records_in_log or model.__name__ != "Log"):
             count += session.execute(
                 delete(model)
                 .where(model.dag_id.in_(dags_to_delete))
diff --git a/airflow/api/common/experimental/get_code.py b/airflow/api/common/experimental/get_code.py
index 9e2e8c08a4b56..b74ed036ccadc 100644
--- a/airflow/api/common/experimental/get_code.py
+++ b/airflow/api/common/experimental/get_code.py
@@ -37,5 +37,5 @@ def get_code(dag_id: str) -> str:
     try:
         return DagCode.get_code_by_fileloc(dag.fileloc)
     except (OSError, DagCodeNotFound) as exception:
-        error_message = f"Error {str(exception)} while reading Dag id {dag_id} Code"
+        error_message = f"Error {exception} while reading Dag id {dag_id} Code"
         raise AirflowException(error_message, exception)
diff --git a/airflow/api/common/experimental/get_lineage.py b/airflow/api/common/experimental/get_lineage.py
index 73bc9dd862ef3..aaf51f60e748b 100644
--- a/airflow/api/common/experimental/get_lineage.py
+++ b/airflow/api/common/experimental/get_lineage.py
@@ -47,4 +47,4 @@ def get_lineage(
     for meta in outlets:
         lineage[meta.task_id]["outlets"] = meta.value
 
-    return {"task_ids": {k: v for k, v in lineage.items()}}
+    return {"task_ids": dict(lineage)}
diff --git a/airflow/api/common/mark_tasks.py b/airflow/api/common/mark_tasks.py
index 4d2df78e82db9..87b46a88effc8 100644
--- a/airflow/api/common/mark_tasks.py
+++ b/airflow/api/common/mark_tasks.py
@@ -62,16 +62,15 @@ def _create_dagruns(
     }
 
     for info in infos:
-        if info.logical_date in dag_runs:
-            continue
-        dag_runs[info.logical_date] = dag.create_dagrun(
-            execution_date=info.logical_date,
-            data_interval=info.data_interval,
-            start_date=timezone.utcnow(),
-            external_trigger=False,
-            state=state,
-            run_type=run_type,
-        )
+        if info.logical_date not in dag_runs:
+            dag_runs[info.logical_date] = dag.create_dagrun(
+                execution_date=info.logical_date,
+                data_interval=info.data_interval,
+                start_date=timezone.utcnow(),
+                external_trigger=False,
+                state=state,
+                run_type=run_type,
+            )
     return dag_runs.values()
 
 
@@ -488,10 +487,9 @@ def set_dag_run_state_to_failed(
 
     tasks = []
     for task in dag.tasks:
-        if task.task_id not in task_ids_of_running_tis:
-            continue
-        task.dag = dag
-        tasks.append(task)
+        if task.task_id in task_ids_of_running_tis:
+            task.dag = dag
+            tasks.append(task)
 
     # Mark non-finished tasks as SKIPPED.
     tis = session.scalars(
diff --git a/airflow/api/common/trigger_dag.py b/airflow/api/common/trigger_dag.py
index 01da7745c7bf3..4551af5faf2c5 100644
--- a/airflow/api/common/trigger_dag.py
+++ b/airflow/api/common/trigger_dag.py
@@ -82,7 +82,7 @@ def _trigger_dag(
         run_conf = conf if isinstance(conf, dict) else json.loads(conf)
 
     dag_runs = []
-    dags_to_run = [dag] + dag.subdags
+    dags_to_run = [dag, *dag.subdags]
     for _dag in dags_to_run:
         dag_run = _dag.create_dagrun(
             run_id=run_id,
diff --git a/airflow/api_connexion/endpoints/config_endpoint.py b/airflow/api_connexion/endpoints/config_endpoint.py
index 38f6f32c22b2d..a6fc67beb7bf5 100644
--- a/airflow/api_connexion/endpoints/config_endpoint.py
+++ b/airflow/api_connexion/endpoints/config_endpoint.py
@@ -123,7 +123,7 @@ def get_value(section: str, option: str) -> Response:
                 "Config not found.", detail=f"The option [{section}/{option}] is not found in config."
             )
 
-        if (section, option) in conf.sensitive_config_values:
+        if (section.lower(), option.lower()) in conf.sensitive_config_values:
             value = "< hidden >"
         else:
             value = conf.get(section, option)
diff --git a/airflow/api_connexion/endpoints/dag_source_endpoint.py b/airflow/api_connexion/endpoints/dag_source_endpoint.py
index 42ccd4e5d8671..b191630815004 100644
--- a/airflow/api_connexion/endpoints/dag_source_endpoint.py
+++ b/airflow/api_connexion/endpoints/dag_source_endpoint.py
@@ -43,6 +43,6 @@ def get_dag_source(*, file_token: str) -> Response:
     if return_type == "text/plain":
         return Response(dag_source, headers={"Content-Type": return_type})
     if return_type == "application/json":
-        content = dag_source_schema.dumps(dict(content=dag_source))
+        content = dag_source_schema.dumps({"content": dag_source})
         return Response(content, headers={"Content-Type": return_type})
     return Response("Not Allowed Accept Header", status=HTTPStatus.NOT_ACCEPTABLE)
diff --git a/airflow/api_connexion/endpoints/dag_warning_endpoint.py b/airflow/api_connexion/endpoints/dag_warning_endpoint.py
index 1031d532a00f5..3794f5f5425a5 100644
--- a/airflow/api_connexion/endpoints/dag_warning_endpoint.py
+++ b/airflow/api_connexion/endpoints/dag_warning_endpoint.py
@@ -16,10 +16,12 @@
 # under the License.
 from __future__ import annotations
 
+from flask import g
 from sqlalchemy import select
 from sqlalchemy.orm import Session
 
 from airflow.api_connexion import security
+from airflow.api_connexion.exceptions import PermissionDenied
 from airflow.api_connexion.parameters import apply_sorting, check_limit, format_parameters
 from airflow.api_connexion.schemas.dag_warning_schema import (
     DagWarningCollection,
@@ -28,6 +30,7 @@
 from airflow.api_connexion.types import APIResponse
 from airflow.models.dagwarning import DagWarning as DagWarningModel
 from airflow.security import permissions
+from airflow.utils.airflow_flask_app import get_airflow_app
 from airflow.utils.db import get_query_count
 from airflow.utils.session import NEW_SESSION, provide_session
 
@@ -52,7 +55,12 @@ def get_dag_warnings(
     allowed_filter_attrs = ["dag_id", "warning_type", "message", "timestamp"]
     query = select(DagWarningModel)
     if dag_id:
+        if not get_airflow_app().appbuilder.sm.can_read_dag(dag_id, g.user):
+            raise PermissionDenied(detail=f"User not allowed to access this DAG: {dag_id}")
         query = query.where(DagWarningModel.dag_id == dag_id)
+    else:
+        readable_dags = get_airflow_app().appbuilder.sm.get_accessible_dag_ids(g.user)
+        query = query.where(DagWarningModel.dag_id.in_(readable_dags))
     if warning_type:
         query = query.where(DagWarningModel.warning_type == warning_type)
     total_entries = get_query_count(query, session=session)
diff --git a/airflow/api_connexion/endpoints/task_endpoint.py b/airflow/api_connexion/endpoints/task_endpoint.py
index 23c2b32487b31..f4d48fe02d2fb 100644
--- a/airflow/api_connexion/endpoints/task_endpoint.py
+++ b/airflow/api_connexion/endpoints/task_endpoint.py
@@ -61,7 +61,7 @@ def get_tasks(*, dag_id: str, order_by: str = "task_id") -> APIResponse:
     tasks = dag.tasks
 
     try:
-        tasks = sorted(tasks, key=attrgetter(order_by.lstrip("-")), reverse=(order_by[0:1] == "-"))
+        tasks.sort(key=attrgetter(order_by.lstrip("-")), reverse=(order_by[0:1] == "-"))
     except AttributeError as err:
         raise BadRequest(detail=str(err))
     task_collection = TaskCollection(tasks=tasks, total_entries=len(tasks))
diff --git a/airflow/api_connexion/endpoints/task_instance_endpoint.py b/airflow/api_connexion/endpoints/task_instance_endpoint.py
index a18514696ba39..b9a5ac9777279 100644
--- a/airflow/api_connexion/endpoints/task_instance_endpoint.py
+++ b/airflow/api_connexion/endpoints/task_instance_endpoint.py
@@ -18,6 +18,7 @@
 
 from typing import Any, Iterable, TypeVar
 
+from flask import g
 from marshmallow import ValidationError
 from sqlalchemy import and_, or_, select
 from sqlalchemy.exc import MultipleResultsFound
@@ -26,7 +27,7 @@
 
 from airflow.api_connexion import security
 from airflow.api_connexion.endpoints.request_dict import get_json_request_dict
-from airflow.api_connexion.exceptions import BadRequest, NotFound
+from airflow.api_connexion.exceptions import BadRequest, NotFound, PermissionDenied
 from airflow.api_connexion.parameters import format_datetime, format_parameters
 from airflow.api_connexion.schemas.task_instance_schema import (
     TaskInstanceCollection,
@@ -396,10 +397,23 @@ def get_task_instances_batch(session: Session = NEW_SESSION) -> APIResponse:
         data = task_instance_batch_form.load(body)
     except ValidationError as err:
         raise BadRequest(detail=str(err.messages))
+    dag_ids = data["dag_ids"]
+    if dag_ids:
+        cannot_access_dag_ids = set()
+        for id in dag_ids:
+            if not get_airflow_app().appbuilder.sm.can_read_dag(id, g.user):
+                cannot_access_dag_ids.add(id)
+        if cannot_access_dag_ids:
+            raise PermissionDenied(
+                detail=f"User not allowed to access these DAGs: {list(cannot_access_dag_ids)}"
+            )
+    else:
+        dag_ids = get_airflow_app().appbuilder.sm.get_accessible_dag_ids(g.user)
+
     states = _convert_ti_states(data["state"])
     base_query = select(TI).join(TI.dag_run)
 
-    base_query = _apply_array_filter(base_query, key=TI.dag_id, values=data["dag_ids"])
+    base_query = _apply_array_filter(base_query, key=TI.dag_id, values=dag_ids)
     base_query = _apply_array_filter(base_query, key=TI.run_id, values=data["dag_run_ids"])
     base_query = _apply_array_filter(base_query, key=TI.task_id, values=data["task_ids"])
     base_query = _apply_range_filter(
diff --git a/airflow/api_connexion/openapi/v1.yaml b/airflow/api_connexion/openapi/v1.yaml
index 341b1d78c3bf6..b94fe05b59602 100644
--- a/airflow/api_connexion/openapi/v1.yaml
+++ b/airflow/api_connexion/openapi/v1.yaml
@@ -231,7 +231,7 @@ info:
     This means that the server encountered an unexpected condition that prevented it from
     fulfilling the request.
 
-  version: '2.7.1'
+  version: '2.7.2'
   license:
     name: Apache 2.0
     url: http://www.apache.org/licenses/LICENSE-2.0.html
@@ -4307,7 +4307,7 @@ components:
             If set, don't actually run this operation. The response will contain the task instance
             planned to be affected, but won't be modified in any way.
           type: boolean
-          default: false
+          default: true
 
         new_state:
           description: Expected new state.
diff --git a/airflow/api_connexion/schemas/common_schema.py b/airflow/api_connexion/schemas/common_schema.py
index cf510137621b6..a470e6b1c04c8 100644
--- a/airflow/api_connexion/schemas/common_schema.py
+++ b/airflow/api_connexion/schemas/common_schema.py
@@ -135,7 +135,7 @@ class ColorField(fields.String):
 
     def __init__(self, **metadata):
         super().__init__(**metadata)
-        self.validators = [validate.Regexp("^#[a-fA-F0-9]{3,6}$")] + list(self.validators)
+        self.validators = [validate.Regexp("^#[a-fA-F0-9]{3,6}$"), *self.validators]
 
 
 class WeightRuleField(fields.String):
@@ -143,7 +143,7 @@ class WeightRuleField(fields.String):
 
     def __init__(self, **metadata):
         super().__init__(**metadata)
-        self.validators = [validate.OneOf(WeightRule.all_weight_rules())] + list(self.validators)
+        self.validators = [validate.OneOf(WeightRule.all_weight_rules()), *self.validators]
 
 
 class TimezoneField(fields.String):
diff --git a/airflow/api_connexion/schemas/dag_schema.py b/airflow/api_connexion/schemas/dag_schema.py
index 08f649b3d699f..9c063cb93729a 100644
--- a/airflow/api_connexion/schemas/dag_schema.py
+++ b/airflow/api_connexion/schemas/dag_schema.py
@@ -120,7 +120,7 @@ def get_tags(obj: DAG):
         """Dump tags as objects."""
         tags = obj.tags
         if tags:
-            return [DagTagSchema().dump(dict(name=tag)) for tag in tags]
+            return [DagTagSchema().dump({"name": tag}) for tag in tags]
         return []
 
     @staticmethod
diff --git a/airflow/api_connexion/schemas/enum_schemas.py b/airflow/api_connexion/schemas/enum_schemas.py
index 981a3669b1b58..ba82010783213 100644
--- a/airflow/api_connexion/schemas/enum_schemas.py
+++ b/airflow/api_connexion/schemas/enum_schemas.py
@@ -26,7 +26,7 @@ class DagStateField(fields.String):
 
     def __init__(self, **metadata):
         super().__init__(**metadata)
-        self.validators = [validate.OneOf(State.dag_states)] + list(self.validators)
+        self.validators = [validate.OneOf(State.dag_states), *self.validators]
 
 
 class TaskInstanceStateField(fields.String):
@@ -34,4 +34,4 @@ class TaskInstanceStateField(fields.String):
 
     def __init__(self, **metadata):
         super().__init__(**metadata)
-        self.validators = [validate.OneOf(State.task_states)] + list(self.validators)
+        self.validators = [validate.OneOf(State.task_states), *self.validators]
diff --git a/airflow/api_connexion/schemas/task_instance_schema.py b/airflow/api_connexion/schemas/task_instance_schema.py
index 9aea40e195bf9..38a776866eec6 100644
--- a/airflow/api_connexion/schemas/task_instance_schema.py
+++ b/airflow/api_connexion/schemas/task_instance_schema.py
@@ -177,7 +177,7 @@ def validate_form(self, data, **kwargs):
 class SetSingleTaskInstanceStateFormSchema(Schema):
     """Schema for handling the request of updating state of a single task instance."""
 
-    dry_run = fields.Boolean(dump_default=True)
+    dry_run = fields.Boolean(load_default=True)
     new_state = TaskInstanceStateField(
         required=True,
         validate=validate.OneOf(
diff --git a/airflow/cli/cli_config.py b/airflow/cli/cli_config.py
index b0c363750692a..6c133d8a7116e 100644
--- a/airflow/cli/cli_config.py
+++ b/airflow/cli/cli_config.py
@@ -92,18 +92,17 @@ def __init__(
         self.flags = flags
         self.kwargs = {}
         for k, v in locals().items():
-            if v is _UNSET:
-                continue
-            if k in ("self", "flags"):
-                continue
-
-            self.kwargs[k] = v
+            if k not in ("self", "flags") and v is not _UNSET:
+                self.kwargs[k] = v
 
     def add_to_parser(self, parser: argparse.ArgumentParser):
         """Add this argument to an ArgumentParser."""
         if "metavar" in self.kwargs and "type" not in self.kwargs:
             if self.kwargs["metavar"] == "DIRPATH":
-                type = lambda x: self._is_valid_directory(parser, x)
+
+                def type(x):
+                    return self._is_valid_directory(parser, x)
+
                 self.kwargs["type"] = type
         parser.add_argument(*self.flags, **self.kwargs)
 
@@ -157,9 +156,7 @@ def string_lower_type(val):
     nargs="?",
     help="The execution_date of the DAG or run_id of the DAGRun (optional)",
 )
-ARG_TASK_REGEX = Arg(
-    ("-t", "--task-regex"), help="The regex to filter specific task_ids to backfill (optional)"
-)
+ARG_TASK_REGEX = Arg(("-t", "--task-regex"), help="The regex to filter specific task_ids (optional)")
 ARG_SUBDIR = Arg(
     ("-S", "--subdir"),
     help=(
@@ -1677,7 +1674,7 @@ class GroupCommand(NamedTuple):
         name="add",
         help="Add a connection",
         func=lazy_load_command("airflow.cli.commands.connection_command.connections_add"),
-        args=(ARG_CONN_ID, ARG_CONN_URI, ARG_CONN_JSON, ARG_CONN_EXTRA) + tuple(ALTERNATIVE_CONN_SPECS_ARGS),
+        args=(ARG_CONN_ID, ARG_CONN_URI, ARG_CONN_JSON, ARG_CONN_EXTRA, *ALTERNATIVE_CONN_SPECS_ARGS),
     ),
     ActionCommand(
         name="delete",
@@ -2206,7 +2203,7 @@ class GroupCommand(NamedTuple):
         name="standalone",
         help="Run an all-in-one copy of Airflow",
         func=lazy_load_command("airflow.cli.commands.standalone_command.standalone"),
-        args=tuple(),
+        args=(),
     ),
 ]
 
diff --git a/airflow/cli/cli_parser.py b/airflow/cli/cli_parser.py
index 8e4d819098c5a..af8a7326f57d8 100644
--- a/airflow/cli/cli_parser.py
+++ b/airflow/cli/cli_parser.py
@@ -81,12 +81,12 @@ def _iter_indented_subactions(self, action: Action):
             action_subcommands, group_subcommands = partition(
                 lambda d: isinstance(ALL_COMMANDS_DICT[d.dest], GroupCommand), subactions
             )
-            yield Action([], "\n%*s%s:" % (self._current_indent, "", "Groups"), nargs=0)
+            yield Action([], f"\n{' ':{self._current_indent}}Groups", nargs=0)
             self._indent()
             yield from group_subcommands
             self._dedent()
 
-            yield Action([], "\n%*s%s:" % (self._current_indent, "", "Commands"), nargs=0)
+            yield Action([], f"\n{' ':{self._current_indent}}Commands:", nargs=0)
             self._indent()
             yield from action_subcommands
             self._dedent()
diff --git a/airflow/cli/commands/connection_command.py b/airflow/cli/commands/connection_command.py
index bf7ebc6ba5f2f..2ff7c50ae24a2 100644
--- a/airflow/cli/commands/connection_command.py
+++ b/airflow/cli/commands/connection_command.py
@@ -96,16 +96,16 @@ def connections_list(args):
 
 
 def _connection_to_dict(conn: Connection) -> dict:
-    return dict(
-        conn_type=conn.conn_type,
-        description=conn.description,
-        login=conn.login,
-        password=conn.password,
-        host=conn.host,
-        port=conn.port,
-        schema=conn.schema,
-        extra=conn.extra,
-    )
+    return {
+        "conn_type": conn.conn_type,
+        "description": conn.description,
+        "login": conn.login,
+        "password": conn.password,
+        "host": conn.host,
+        "port": conn.port,
+        "schema": conn.schema,
+        "extra": conn.extra,
+    }
 
 
 def create_default_connections(args):
@@ -114,7 +114,10 @@ def create_default_connections(args):
 
 def _format_connections(conns: list[Connection], file_format: str, serialization_format: str) -> str:
     if serialization_format == "json":
-        serializer_func = lambda x: json.dumps(_connection_to_dict(x))
+
+        def serializer_func(x):
+            return json.dumps(_connection_to_dict(x))
+
     elif serialization_format == "uri":
         serializer_func = Connection.get_uri
     else:
@@ -200,9 +203,9 @@ def connections_export(args):
         f.write(msg)
 
     if file_is_stdout:
-        print("\nConnections successfully exported.", file=sys.stderr)
+        print(f"\n{len(connections)} connections successfully exported.", file=sys.stderr)
     else:
-        print(f"Connections successfully exported to {args.file.name}.")
+        print(f"{len(connections)} connections successfully exported to {args.file.name}.")
 
 
 alternative_conn_specs = ["conn_type", "conn_host", "conn_login", "conn_password", "conn_schema", "conn_port"]
diff --git a/airflow/cli/commands/internal_api_command.py b/airflow/cli/commands/internal_api_command.py
index b9b77c093446d..73ed2e250130b 100644
--- a/airflow/cli/commands/internal_api_command.py
+++ b/airflow/cli/commands/internal_api_command.py
@@ -24,6 +24,7 @@
 import sys
 import textwrap
 from contextlib import suppress
+from pathlib import Path
 from tempfile import gettempdir
 from time import sleep
 
@@ -170,13 +171,15 @@ def monitor_gunicorn(gunicorn_master_pid: int):
 
             handle = setup_logging(log_file)
 
-            base, ext = os.path.splitext(pid_file)
+            pid_path = Path(pid_file)
+            pidlock_path = pid_path.with_name(f"{pid_path.stem}-monitor{pid_path.suffix}")
+
             with open(stdout, "a") as stdout, open(stderr, "a") as stderr:
                 stdout.truncate(0)
                 stderr.truncate(0)
 
                 ctx = daemon.DaemonContext(
-                    pidfile=TimeoutPIDLockFile(f"{base}-monitor{ext}", -1),
+                    pidfile=TimeoutPIDLockFile(pidlock_path, -1),
                     files_preserve=[handle],
                     stdout=stdout,
                     stderr=stderr,
@@ -187,11 +190,10 @@ def monitor_gunicorn(gunicorn_master_pid: int):
 
                     # Reading pid of gunicorn main process as it will be different that
                     # the one of process spawned above.
-                    while True:
+                    gunicorn_master_proc_pid = None
+                    while not gunicorn_master_proc_pid:
                         sleep(0.1)
                         gunicorn_master_proc_pid = read_pid_from_pidfile(pid_file)
-                        if gunicorn_master_proc_pid:
-                            break
 
                     # Run Gunicorn monitor
                     gunicorn_master_proc = psutil.Process(gunicorn_master_proc_pid)
diff --git a/airflow/cli/commands/kubernetes_command.py b/airflow/cli/commands/kubernetes_command.py
index 038f53e3f3707..2d9a488ebbc5e 100644
--- a/airflow/cli/commands/kubernetes_command.py
+++ b/airflow/cli/commands/kubernetes_command.py
@@ -142,8 +142,8 @@ def cleanup_pods(args):
                     _delete_pod(pod.metadata.name, namespace)
                 except ApiException as e:
                     print(f"Can't remove POD: {e}", file=sys.stderr)
-                continue
-            print(f"No action taken on pod {pod_name}")
+            else:
+                print(f"No action taken on pod {pod_name}")
         continue_token = pod_list.metadata._continue
         if not continue_token:
             break
diff --git a/airflow/cli/commands/pool_command.py b/airflow/cli/commands/pool_command.py
index b26f2032a85bc..13386d6fbe8b6 100644
--- a/airflow/cli/commands/pool_command.py
+++ b/airflow/cli/commands/pool_command.py
@@ -97,7 +97,7 @@ def pool_import(args):
     if not os.path.exists(args.file):
         raise SystemExit(f"Missing pools file {args.file}")
     pools, failed = pool_import_helper(args.file)
-    if len(failed) > 0:
+    if failed:
         raise SystemExit(f"Failed to update pool(s): {', '.join(failed)}")
     print(f"Uploaded {len(pools)} pool(s)")
 
diff --git a/airflow/cli/commands/standalone_command.py b/airflow/cli/commands/standalone_command.py
index ceae1c6dcaec6..d949e5e5d2fd6 100644
--- a/airflow/cli/commands/standalone_command.py
+++ b/airflow/cli/commands/standalone_command.py
@@ -91,8 +91,8 @@ def run(self):
             command.start()
         # Run output loop
         shown_ready = False
-        while True:
-            try:
+        try:
+            while True:
                 # Print all the current lines onto the screen
                 self.update_output()
                 # Print info banner when all components are ready and the
@@ -108,8 +108,8 @@ def run(self):
                     shown_ready = True
                 # Ensure we idle-sleep rather than fast-looping
                 time.sleep(0.1)
-            except KeyboardInterrupt:
-                break
+        except KeyboardInterrupt:
+            pass
         # Stop subcommand threads
         self.print_output("standalone", "Shutting down components")
         for command in self.subcommands.values():
@@ -139,8 +139,8 @@ def print_output(self, name: str, output):
             "triggerer": "cyan",
             "standalone": "white",
         }.get(name, "white")
-        colorised_name = colored("%10s" % name, color)
-        for line in output.split("\n"):
+        colorised_name = colored(f"{name:10}", color)
+        for line in output.splitlines():
             print(f"{colorised_name} | {line.strip()}")
 
     def print_error(self, name: str, output):
@@ -193,9 +193,8 @@ def initialize_database(self):
             self.print_output("standalone", "Creating admin user")
             role = appbuilder.sm.find_role("Admin")
             assert role is not None
-            password = "".join(
-                random.choice("abcdefghkmnpqrstuvwxyzABCDEFGHKMNPQRSTUVWXYZ23456789") for i in range(16)
-            )
+            # password does not contain visually similar characters: ijlIJL1oO0
+            password = "".join(random.choices("abcdefghkmnpqrstuvwxyzABCDEFGHKMNPQRSTUVWXYZ23456789", k=16))
             with open(password_path, "w") as file:
                 file.write(password)
             make_group_other_inaccessible(password_path)
@@ -289,7 +288,7 @@ def __init__(self, parent, name: str, command: list[str], env: dict[str, str]):
     def run(self):
         """Run the actual process and captures it output to a queue."""
         self.process = subprocess.Popen(
-            ["airflow"] + self.command,
+            ["airflow", *self.command],
             stdout=subprocess.PIPE,
             stderr=subprocess.STDOUT,
             env=self.env,
diff --git a/airflow/cli/commands/task_command.py b/airflow/cli/commands/task_command.py
index 205d87b2f0345..e51a15cbe94a6 100644
--- a/airflow/cli/commands/task_command.py
+++ b/airflow/cli/commands/task_command.py
@@ -68,6 +68,7 @@
 from airflow.utils.providers_configuration_loader import providers_configuration_loaded
 from airflow.utils.session import NEW_SESSION, create_session, provide_session
 from airflow.utils.state import DagRunState
+from airflow.utils.task_instance_session import set_current_task_instance_session
 
 log = logging.getLogger(__name__)
 
@@ -548,7 +549,7 @@ def task_states_for_dag_run(args, session: Session = NEW_SESSION) -> None:
                 select(DagRun).where(DagRun.execution_date == execution_date, DagRun.dag_id == args.dag_id)
             )
         except (ParserError, TypeError) as err:
-            raise AirflowException(f"Error parsing the supplied execution_date. Error: {str(err)}")
+            raise AirflowException(f"Error parsing the supplied execution_date. Error: {err}")
 
     if dag_run is None:
         raise DagRunNotFound(
@@ -645,7 +646,8 @@ def task_render(args, dag: DAG | None = None) -> None:
     ti, _ = _get_ti(
         task, args.map_index, exec_date_or_run_id=args.execution_date_or_run_id, create_if_necessary="memory"
     )
-    ti.render_templates()
+    with create_session() as session, set_current_task_instance_session(session=session):
+        ti.render_templates()
     for attr in task.template_fields:
         print(
             textwrap.dedent(
diff --git a/airflow/cli/commands/user_command.py b/airflow/cli/commands/user_command.py
index bc982719c94df..b2380e6454b08 100644
--- a/airflow/cli/commands/user_command.py
+++ b/airflow/cli/commands/user_command.py
@@ -73,7 +73,7 @@ def users_create(args):
             valid_roles = appbuilder.sm.get_all_roles()
             raise SystemExit(f"{args.role} is not a valid role. Valid roles are: {valid_roles}")
         if args.use_random_password:
-            password = "".join(random.choice(string.printable) for _ in range(16))
+            password = "".join(random.choices(string.printable, k=16))
         elif args.password:
             password = args.password
         else:
diff --git a/airflow/cli/commands/webserver_command.py b/airflow/cli/commands/webserver_command.py
index 00ac66372465c..a9258a1ae204a 100644
--- a/airflow/cli/commands/webserver_command.py
+++ b/airflow/cli/commands/webserver_command.py
@@ -26,6 +26,7 @@
 import time
 import types
 from contextlib import suppress
+from pathlib import Path
 from time import sleep
 from typing import NoReturn
 
@@ -138,14 +139,14 @@ def _get_num_ready_workers_running(self) -> int:
         def ready_prefix_on_cmdline(proc):
             try:
                 cmdline = proc.cmdline()
-                if len(cmdline) > 0:
+                if cmdline:
                     return settings.GUNICORN_WORKER_READY_PREFIX in cmdline[0]
             except psutil.NoSuchProcess:
                 pass
             return False
 
-        ready_workers = [proc for proc in workers if ready_prefix_on_cmdline(proc)]
-        return len(ready_workers)
+        nb_ready_workers = sum(1 for proc in workers if ready_prefix_on_cmdline(proc))
+        return nb_ready_workers
 
     def _get_num_workers_running(self) -> int:
         """Return number of running Gunicorn workers processes."""
@@ -474,13 +475,15 @@ def monitor_gunicorn(gunicorn_master_pid: int) -> NoReturn:
 
             handle = setup_logging(log_file)
 
-            base, ext = os.path.splitext(pid_file)
+            pid_path = Path(pid_file)
+            pidlock_path = pid_path.with_name(f"{pid_path.stem}-monitor{pid_path.suffix}")
+
             with open(stdout, "a") as stdout, open(stderr, "a") as stderr:
                 stdout.truncate(0)
                 stderr.truncate(0)
 
                 ctx = daemon.DaemonContext(
-                    pidfile=TimeoutPIDLockFile(f"{base}-monitor{ext}", -1),
+                    pidfile=TimeoutPIDLockFile(pidlock_path, -1),
                     files_preserve=[handle],
                     stdout=stdout,
                     stderr=stderr,
@@ -491,11 +494,10 @@ def monitor_gunicorn(gunicorn_master_pid: int) -> NoReturn:
 
                     # Reading pid of gunicorn master as it will be different that
                     # the one of process spawned above.
-                    while True:
+                    gunicorn_master_proc_pid = None
+                    while not gunicorn_master_proc_pid:
                         sleep(0.1)
                         gunicorn_master_proc_pid = read_pid_from_pidfile(pid_file)
-                        if gunicorn_master_proc_pid:
-                            break
 
                     # Run Gunicorn monitor
                     gunicorn_master_proc = psutil.Process(gunicorn_master_proc_pid)
diff --git a/airflow/config_templates/config.yml b/airflow/config_templates/config.yml
index 4ff95db84f82c..caaec5dc1cc8a 100644
--- a/airflow/config_templates/config.yml
+++ b/airflow/config_templates/config.yml
@@ -64,7 +64,7 @@ core:
       description: |
         The executor class that airflow should use. Choices include
         ``SequentialExecutor``, ``LocalExecutor``, ``CeleryExecutor``, ``DaskExecutor``,
-        ``KubernetesExecutor``, ``CeleryKubernetesExecutor`` or the
+        ``KubernetesExecutor``, ``CeleryKubernetesExecutor``, ``LocalKubernetesExecutor`` or the
         full import path to the class when using a custom executor.
       version_added: ~
       type: string
diff --git a/airflow/configuration.py b/airflow/configuration.py
index 92b9bd0f643f4..fb3af35852f55 100644
--- a/airflow/configuration.py
+++ b/airflow/configuration.py
@@ -16,6 +16,7 @@
 # under the License.
 from __future__ import annotations
 
+import contextlib
 import datetime
 import functools
 import io
@@ -310,7 +311,11 @@ def sensitive_config_values(self) -> Set[tuple[str, str]]:  # noqa: UP006
             for s, s_c in self.configuration_description.items()
             for k, item in s_c.get("options").items()  # type: ignore[union-attr]
         }
-        sensitive = {(section, key) for (section, key), v in flattened.items() if v.get("sensitive") is True}
+        sensitive = {
+            (section.lower(), key.lower())
+            for (section, key), v in flattened.items()
+            if v.get("sensitive") is True
+        }
         depr_option = {self.deprecated_options[x][:-1] for x in sensitive if x in self.deprecated_options}
         depr_section = {
             (self.deprecated_sections[s][0], k) for s, k in sensitive if s in self.deprecated_sections
@@ -464,7 +469,7 @@ def inversed_deprecated_sections(self):
         ("logging", "logging_level"): _available_logging_levels,
         ("logging", "fab_logging_level"): _available_logging_levels,
         # celery_logging_level can be empty, which uses logging_level as fallback
-        ("logging", "celery_logging_level"): _available_logging_levels + [""],
+        ("logging", "celery_logging_level"): [*_available_logging_levels, ""],
         ("webserver", "analytical_tool"): ["google_analytics", "metarouter", "segment", ""],
     }
 
@@ -1473,14 +1478,13 @@ def as_dict(
             # if they are not provided through env, cmd and secret
             hidden = "< hidden >"
             for section, key in self.sensitive_config_values:
-                if not config_sources.get(section):
-                    continue
-                if config_sources[section].get(key, None):
-                    if display_source:
-                        source = config_sources[section][key][1]
-                        config_sources[section][key] = (hidden, source)
-                    else:
-                        config_sources[section][key] = hidden
+                if config_sources.get(section):
+                    if config_sources[section].get(key, None):
+                        if display_source:
+                            source = config_sources[section][key][1]
+                            config_sources[section][key] = (hidden, source)
+                        else:
+                            config_sources[section][key] = hidden
 
         return config_sources
 
@@ -1650,16 +1654,13 @@ def _deprecated_value_is_set_in_config(
         configs: Iterable[tuple[str, ConfigParser]],
     ) -> bool:
         for config_type, config in configs:
-            if config_type == "default":
-                continue
-            try:
-                deprecated_section_array = config.items(section=deprecated_section, raw=True)
-                for key_candidate, _ in deprecated_section_array:
-                    if key_candidate == deprecated_key:
+            if config_type != "default":
+                with contextlib.suppress(NoSectionError):
+                    deprecated_section_array = config.items(section=deprecated_section, raw=True)
+                    if any(key == deprecated_key for key, _ in deprecated_section_array):
                         return True
-            except NoSectionError:
-                pass
-        return False
+        else:
+            return False
 
     @staticmethod
     def _deprecated_variable_is_set(deprecated_section: str, deprecated_key: str) -> bool:
@@ -1855,8 +1856,8 @@ def load_providers_configuration(self):
                     raise AirflowConfigException(
                         f"The provider {provider} is attempting to contribute "
                         f"configuration section {provider_section} that "
-                        f"has already been added before. The source of it: {section_source}."
-                        "This is forbidden. A provider can only add new sections. It"
+                        f"has already been added before. The source of it: {section_source}. "
+                        "This is forbidden. A provider can only add new sections. It "
                         "cannot contribute options to existing sections or override other "
                         "provider's configuration.",
                         UserWarning,
diff --git a/airflow/contrib/hooks/__init__.py b/airflow/contrib/hooks/__init__.py
index cffc937097306..5385599aca54e 100644
--- a/airflow/contrib/hooks/__init__.py
+++ b/airflow/contrib/hooks/__init__.py
@@ -30,307 +30,307 @@
 )
 
 __deprecated_classes = {
-    'aws_athena_hook': {
-        'AWSAthenaHook': 'airflow.providers.amazon.aws.hooks.athena.AthenaHook',
+    "aws_athena_hook": {
+        "AWSAthenaHook": "airflow.providers.amazon.aws.hooks.athena.AthenaHook",
     },
-    'aws_datasync_hook': {
-        'AWSDataSyncHook': 'airflow.providers.amazon.aws.hooks.datasync.DataSyncHook',
+    "aws_datasync_hook": {
+        "AWSDataSyncHook": "airflow.providers.amazon.aws.hooks.datasync.DataSyncHook",
     },
-    'aws_dynamodb_hook': {
-        'AwsDynamoDBHook': 'airflow.providers.amazon.aws.hooks.dynamodb.DynamoDBHook',
+    "aws_dynamodb_hook": {
+        "AwsDynamoDBHook": "airflow.providers.amazon.aws.hooks.dynamodb.DynamoDBHook",
     },
-    'aws_firehose_hook': {
-        'FirehoseHook': 'airflow.providers.amazon.aws.hooks.kinesis.FirehoseHook',
+    "aws_firehose_hook": {
+        "FirehoseHook": "airflow.providers.amazon.aws.hooks.kinesis.FirehoseHook",
     },
-    'aws_glue_catalog_hook': {
-        'AwsGlueCatalogHook': 'airflow.providers.amazon.aws.hooks.glue_catalog.GlueCatalogHook',
+    "aws_glue_catalog_hook": {
+        "AwsGlueCatalogHook": "airflow.providers.amazon.aws.hooks.glue_catalog.GlueCatalogHook",
     },
-    'aws_hook': {
-        'AwsBaseHook': 'airflow.providers.amazon.aws.hooks.base_aws.AwsBaseHook',
-        '_parse_s3_config': 'airflow.providers.amazon.aws.hooks.base_aws._parse_s3_config',
-        'boto3': 'airflow.providers.amazon.aws.hooks.base_aws.boto3',
-        'AwsHook': 'airflow.providers.amazon.aws.hooks.base_aws.AwsBaseHook',
+    "aws_hook": {
+        "AwsBaseHook": "airflow.providers.amazon.aws.hooks.base_aws.AwsBaseHook",
+        "_parse_s3_config": "airflow.providers.amazon.aws.hooks.base_aws._parse_s3_config",
+        "boto3": "airflow.providers.amazon.aws.hooks.base_aws.boto3",
+        "AwsHook": "airflow.providers.amazon.aws.hooks.base_aws.AwsBaseHook",
     },
-    'aws_lambda_hook': {
-        'AwsLambdaHook': 'airflow.providers.amazon.aws.hooks.lambda_function.LambdaHook',
+    "aws_lambda_hook": {
+        "AwsLambdaHook": "airflow.providers.amazon.aws.hooks.lambda_function.LambdaHook",
     },
-    'aws_logs_hook': {
-        'AwsLogsHook': 'airflow.providers.amazon.aws.hooks.logs.AwsLogsHook',
+    "aws_logs_hook": {
+        "AwsLogsHook": "airflow.providers.amazon.aws.hooks.logs.AwsLogsHook",
     },
-    'aws_sns_hook': {
-        'AwsSnsHook': 'airflow.providers.amazon.aws.hooks.sns.SnsHook',
+    "aws_sns_hook": {
+        "AwsSnsHook": "airflow.providers.amazon.aws.hooks.sns.SnsHook",
     },
-    'aws_sqs_hook': {
-        'SqsHook': 'airflow.providers.amazon.aws.hooks.sqs.SqsHook',
-        'SQSHook': 'airflow.providers.amazon.aws.hooks.sqs.SqsHook',
+    "aws_sqs_hook": {
+        "SqsHook": "airflow.providers.amazon.aws.hooks.sqs.SqsHook",
+        "SQSHook": "airflow.providers.amazon.aws.hooks.sqs.SqsHook",
     },
-    'azure_container_instance_hook': {
-        'AzureContainerInstanceHook': (
-            'airflow.providers.microsoft.azure.hooks.container_instance.AzureContainerInstanceHook'
+    "azure_container_instance_hook": {
+        "AzureContainerInstanceHook": (
+            "airflow.providers.microsoft.azure.hooks.container_instance.AzureContainerInstanceHook"
         ),
     },
-    'azure_container_registry_hook': {
-        'AzureContainerRegistryHook': (
-            'airflow.providers.microsoft.azure.hooks.container_registry.AzureContainerRegistryHook'
+    "azure_container_registry_hook": {
+        "AzureContainerRegistryHook": (
+            "airflow.providers.microsoft.azure.hooks.container_registry.AzureContainerRegistryHook"
         ),
     },
-    'azure_container_volume_hook': {
-        'AzureContainerVolumeHook': (
-            'airflow.providers.microsoft.azure.hooks.container_volume.AzureContainerVolumeHook'
+    "azure_container_volume_hook": {
+        "AzureContainerVolumeHook": (
+            "airflow.providers.microsoft.azure.hooks.container_volume.AzureContainerVolumeHook"
         ),
     },
-    'azure_cosmos_hook': {
-        'AzureCosmosDBHook': 'airflow.providers.microsoft.azure.hooks.cosmos.AzureCosmosDBHook',
-    },
-    'azure_data_lake_hook': {
-        'AzureDataLakeHook': 'airflow.providers.microsoft.azure.hooks.data_lake.AzureDataLakeHook',
-    },
-    'azure_fileshare_hook': {
-        'AzureFileShareHook': 'airflow.providers.microsoft.azure.hooks.fileshare.AzureFileShareHook',
-    },
-    'bigquery_hook': {
-        'BigQueryBaseCursor': 'airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor',
-        'BigQueryConnection': 'airflow.providers.google.cloud.hooks.bigquery.BigQueryConnection',
-        'BigQueryCursor': 'airflow.providers.google.cloud.hooks.bigquery.BigQueryCursor',
-        'BigQueryHook': 'airflow.providers.google.cloud.hooks.bigquery.BigQueryHook',
-        'GbqConnector': 'airflow.providers.google.cloud.hooks.bigquery.GbqConnector',
-    },
-    'cassandra_hook': {
-        'CassandraHook': 'airflow.providers.apache.cassandra.hooks.cassandra.CassandraHook',
-    },
-    'cloudant_hook': {
-        'CloudantHook': 'airflow.providers.cloudant.hooks.cloudant.CloudantHook',
-    },
-    'databricks_hook': {
-        'CANCEL_RUN_ENDPOINT': 'airflow.providers.databricks.hooks.databricks.CANCEL_RUN_ENDPOINT',
-        'GET_RUN_ENDPOINT': 'airflow.providers.databricks.hooks.databricks.GET_RUN_ENDPOINT',
-        'RESTART_CLUSTER_ENDPOINT': 'airflow.providers.databricks.hooks.databricks.RESTART_CLUSTER_ENDPOINT',
-        'RUN_LIFE_CYCLE_STATES': 'airflow.providers.databricks.hooks.databricks.RUN_LIFE_CYCLE_STATES',
-        'RUN_NOW_ENDPOINT': 'airflow.providers.databricks.hooks.databricks.RUN_NOW_ENDPOINT',
-        'START_CLUSTER_ENDPOINT': 'airflow.providers.databricks.hooks.databricks.START_CLUSTER_ENDPOINT',
-        'SUBMIT_RUN_ENDPOINT': 'airflow.providers.databricks.hooks.databricks.SUBMIT_RUN_ENDPOINT',
-        'TERMINATE_CLUSTER_ENDPOINT': (
-            'airflow.providers.databricks.hooks.databricks.TERMINATE_CLUSTER_ENDPOINT'
+    "azure_cosmos_hook": {
+        "AzureCosmosDBHook": "airflow.providers.microsoft.azure.hooks.cosmos.AzureCosmosDBHook",
+    },
+    "azure_data_lake_hook": {
+        "AzureDataLakeHook": "airflow.providers.microsoft.azure.hooks.data_lake.AzureDataLakeHook",
+    },
+    "azure_fileshare_hook": {
+        "AzureFileShareHook": "airflow.providers.microsoft.azure.hooks.fileshare.AzureFileShareHook",
+    },
+    "bigquery_hook": {
+        "BigQueryBaseCursor": "airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor",
+        "BigQueryConnection": "airflow.providers.google.cloud.hooks.bigquery.BigQueryConnection",
+        "BigQueryCursor": "airflow.providers.google.cloud.hooks.bigquery.BigQueryCursor",
+        "BigQueryHook": "airflow.providers.google.cloud.hooks.bigquery.BigQueryHook",
+        "GbqConnector": "airflow.providers.google.cloud.hooks.bigquery.GbqConnector",
+    },
+    "cassandra_hook": {
+        "CassandraHook": "airflow.providers.apache.cassandra.hooks.cassandra.CassandraHook",
+    },
+    "cloudant_hook": {
+        "CloudantHook": "airflow.providers.cloudant.hooks.cloudant.CloudantHook",
+    },
+    "databricks_hook": {
+        "CANCEL_RUN_ENDPOINT": "airflow.providers.databricks.hooks.databricks.CANCEL_RUN_ENDPOINT",
+        "GET_RUN_ENDPOINT": "airflow.providers.databricks.hooks.databricks.GET_RUN_ENDPOINT",
+        "RESTART_CLUSTER_ENDPOINT": "airflow.providers.databricks.hooks.databricks.RESTART_CLUSTER_ENDPOINT",
+        "RUN_LIFE_CYCLE_STATES": "airflow.providers.databricks.hooks.databricks.RUN_LIFE_CYCLE_STATES",
+        "RUN_NOW_ENDPOINT": "airflow.providers.databricks.hooks.databricks.RUN_NOW_ENDPOINT",
+        "START_CLUSTER_ENDPOINT": "airflow.providers.databricks.hooks.databricks.START_CLUSTER_ENDPOINT",
+        "SUBMIT_RUN_ENDPOINT": "airflow.providers.databricks.hooks.databricks.SUBMIT_RUN_ENDPOINT",
+        "TERMINATE_CLUSTER_ENDPOINT": (
+            "airflow.providers.databricks.hooks.databricks.TERMINATE_CLUSTER_ENDPOINT"
         ),
-        'DatabricksHook': 'airflow.providers.databricks.hooks.databricks.DatabricksHook',
-        'RunState': 'airflow.providers.databricks.hooks.databricks.RunState',
+        "DatabricksHook": "airflow.providers.databricks.hooks.databricks.DatabricksHook",
+        "RunState": "airflow.providers.databricks.hooks.databricks.RunState",
     },
-    'datadog_hook': {
-        'DatadogHook': 'airflow.providers.datadog.hooks.datadog.DatadogHook',
+    "datadog_hook": {
+        "DatadogHook": "airflow.providers.datadog.hooks.datadog.DatadogHook",
     },
-    'datastore_hook': {
-        'DatastoreHook': 'airflow.providers.google.cloud.hooks.datastore.DatastoreHook',
+    "datastore_hook": {
+        "DatastoreHook": "airflow.providers.google.cloud.hooks.datastore.DatastoreHook",
     },
-    'dingding_hook': {
-        'DingdingHook': 'airflow.providers.dingding.hooks.dingding.DingdingHook',
-        'requests': 'airflow.providers.dingding.hooks.dingding.requests',
+    "dingding_hook": {
+        "DingdingHook": "airflow.providers.dingding.hooks.dingding.DingdingHook",
+        "requests": "airflow.providers.dingding.hooks.dingding.requests",
     },
-    'discord_webhook_hook': {
-        'DiscordWebhookHook': 'airflow.providers.discord.hooks.discord_webhook.DiscordWebhookHook',
+    "discord_webhook_hook": {
+        "DiscordWebhookHook": "airflow.providers.discord.hooks.discord_webhook.DiscordWebhookHook",
     },
-    'emr_hook': {
-        'EmrHook': 'airflow.providers.amazon.aws.hooks.emr.EmrHook',
+    "emr_hook": {
+        "EmrHook": "airflow.providers.amazon.aws.hooks.emr.EmrHook",
     },
-    'fs_hook': {
-        'FSHook': 'airflow.hooks.filesystem.FSHook',
+    "fs_hook": {
+        "FSHook": "airflow.hooks.filesystem.FSHook",
     },
-    'ftp_hook': {
-        'FTPHook': 'airflow.providers.ftp.hooks.ftp.FTPHook',
-        'FTPSHook': 'airflow.providers.ftp.hooks.ftp.FTPSHook',
+    "ftp_hook": {
+        "FTPHook": "airflow.providers.ftp.hooks.ftp.FTPHook",
+        "FTPSHook": "airflow.providers.ftp.hooks.ftp.FTPSHook",
     },
-    'gcp_api_base_hook': {
-        'GoogleBaseHook': 'airflow.providers.google.common.hooks.base_google.GoogleBaseHook',
-        'GoogleCloudBaseHook': 'airflow.providers.google.common.hooks.base_google.GoogleBaseHook',
+    "gcp_api_base_hook": {
+        "GoogleBaseHook": "airflow.providers.google.common.hooks.base_google.GoogleBaseHook",
+        "GoogleCloudBaseHook": "airflow.providers.google.common.hooks.base_google.GoogleBaseHook",
     },
-    'gcp_bigtable_hook': {
-        'BigtableHook': 'airflow.providers.google.cloud.hooks.bigtable.BigtableHook',
+    "gcp_bigtable_hook": {
+        "BigtableHook": "airflow.providers.google.cloud.hooks.bigtable.BigtableHook",
     },
-    'gcp_cloud_build_hook': {
-        'CloudBuildHook': 'airflow.providers.google.cloud.hooks.cloud_build.CloudBuildHook',
+    "gcp_cloud_build_hook": {
+        "CloudBuildHook": "airflow.providers.google.cloud.hooks.cloud_build.CloudBuildHook",
     },
-    'gcp_compute_hook': {
-        'ComputeEngineHook': 'airflow.providers.google.cloud.hooks.compute.ComputeEngineHook',
-        'GceHook': 'airflow.providers.google.cloud.hooks.compute.ComputeEngineHook',
+    "gcp_compute_hook": {
+        "ComputeEngineHook": "airflow.providers.google.cloud.hooks.compute.ComputeEngineHook",
+        "GceHook": "airflow.providers.google.cloud.hooks.compute.ComputeEngineHook",
     },
-    'gcp_container_hook': {
-        'GKEHook': 'airflow.providers.google.cloud.hooks.kubernetes_engine.GKEHook',
-        'GKEClusterHook': 'airflow.providers.google.cloud.hooks.kubernetes_engine.GKEHook',
+    "gcp_container_hook": {
+        "GKEHook": "airflow.providers.google.cloud.hooks.kubernetes_engine.GKEHook",
+        "GKEClusterHook": "airflow.providers.google.cloud.hooks.kubernetes_engine.GKEHook",
     },
-    'gcp_dataflow_hook': {
-        'DataflowHook': 'airflow.providers.google.cloud.hooks.dataflow.DataflowHook',
-        'DataFlowHook': 'airflow.providers.google.cloud.hooks.dataflow.DataflowHook',
+    "gcp_dataflow_hook": {
+        "DataflowHook": "airflow.providers.google.cloud.hooks.dataflow.DataflowHook",
+        "DataFlowHook": "airflow.providers.google.cloud.hooks.dataflow.DataflowHook",
     },
-    'gcp_dataproc_hook': {
-        'DataprocHook': 'airflow.providers.google.cloud.hooks.dataproc.DataprocHook',
-        'DataProcHook': 'airflow.providers.google.cloud.hooks.dataproc.DataprocHook',
+    "gcp_dataproc_hook": {
+        "DataprocHook": "airflow.providers.google.cloud.hooks.dataproc.DataprocHook",
+        "DataProcHook": "airflow.providers.google.cloud.hooks.dataproc.DataprocHook",
     },
-    'gcp_dlp_hook': {
-        'CloudDLPHook': 'airflow.providers.google.cloud.hooks.dlp.CloudDLPHook',
-        'DlpJob': 'airflow.providers.google.cloud.hooks.dlp.DlpJob',
+    "gcp_dlp_hook": {
+        "CloudDLPHook": "airflow.providers.google.cloud.hooks.dlp.CloudDLPHook",
+        "DlpJob": "airflow.providers.google.cloud.hooks.dlp.DlpJob",
     },
-    'gcp_function_hook': {
-        'CloudFunctionsHook': 'airflow.providers.google.cloud.hooks.functions.CloudFunctionsHook',
-        'GcfHook': 'airflow.providers.google.cloud.hooks.functions.CloudFunctionsHook',
+    "gcp_function_hook": {
+        "CloudFunctionsHook": "airflow.providers.google.cloud.hooks.functions.CloudFunctionsHook",
+        "GcfHook": "airflow.providers.google.cloud.hooks.functions.CloudFunctionsHook",
     },
-    'gcp_kms_hook': {
-        'CloudKMSHook': 'airflow.providers.google.cloud.hooks.kms.CloudKMSHook',
-        'GoogleCloudKMSHook': 'airflow.providers.google.cloud.hooks.kms.CloudKMSHook',
+    "gcp_kms_hook": {
+        "CloudKMSHook": "airflow.providers.google.cloud.hooks.kms.CloudKMSHook",
+        "GoogleCloudKMSHook": "airflow.providers.google.cloud.hooks.kms.CloudKMSHook",
     },
-    'gcp_mlengine_hook': {
-        'MLEngineHook': 'airflow.providers.google.cloud.hooks.mlengine.MLEngineHook',
+    "gcp_mlengine_hook": {
+        "MLEngineHook": "airflow.providers.google.cloud.hooks.mlengine.MLEngineHook",
     },
-    'gcp_natural_language_hook': {
-        'CloudNaturalLanguageHook': (
-            'airflow.providers.google.cloud.hooks.natural_language.CloudNaturalLanguageHook'
+    "gcp_natural_language_hook": {
+        "CloudNaturalLanguageHook": (
+            "airflow.providers.google.cloud.hooks.natural_language.CloudNaturalLanguageHook"
         ),
     },
-    'gcp_pubsub_hook': {
-        'PubSubException': 'airflow.providers.google.cloud.hooks.pubsub.PubSubException',
-        'PubSubHook': 'airflow.providers.google.cloud.hooks.pubsub.PubSubHook',
+    "gcp_pubsub_hook": {
+        "PubSubException": "airflow.providers.google.cloud.hooks.pubsub.PubSubException",
+        "PubSubHook": "airflow.providers.google.cloud.hooks.pubsub.PubSubHook",
     },
-    'gcp_spanner_hook': {
-        'SpannerHook': 'airflow.providers.google.cloud.hooks.spanner.SpannerHook',
-        'CloudSpannerHook': 'airflow.providers.google.cloud.hooks.spanner.SpannerHook',
+    "gcp_spanner_hook": {
+        "SpannerHook": "airflow.providers.google.cloud.hooks.spanner.SpannerHook",
+        "CloudSpannerHook": "airflow.providers.google.cloud.hooks.spanner.SpannerHook",
     },
-    'gcp_speech_to_text_hook': {
-        'CloudSpeechToTextHook': 'airflow.providers.google.cloud.hooks.speech_to_text.CloudSpeechToTextHook',
-        'GCPSpeechToTextHook': 'airflow.providers.google.cloud.hooks.speech_to_text.CloudSpeechToTextHook',
+    "gcp_speech_to_text_hook": {
+        "CloudSpeechToTextHook": "airflow.providers.google.cloud.hooks.speech_to_text.CloudSpeechToTextHook",
+        "GCPSpeechToTextHook": "airflow.providers.google.cloud.hooks.speech_to_text.CloudSpeechToTextHook",
     },
-    'gcp_sql_hook': {
-        'CloudSQLDatabaseHook': 'airflow.providers.google.cloud.hooks.cloud_sql.CloudSQLDatabaseHook',
-        'CloudSQLHook': 'airflow.providers.google.cloud.hooks.cloud_sql.CloudSQLHook',
-        'CloudSqlDatabaseHook': 'airflow.providers.google.cloud.hooks.cloud_sql.CloudSQLDatabaseHook',
-        'CloudSqlHook': 'airflow.providers.google.cloud.hooks.cloud_sql.CloudSQLHook',
+    "gcp_sql_hook": {
+        "CloudSQLDatabaseHook": "airflow.providers.google.cloud.hooks.cloud_sql.CloudSQLDatabaseHook",
+        "CloudSQLHook": "airflow.providers.google.cloud.hooks.cloud_sql.CloudSQLHook",
+        "CloudSqlDatabaseHook": "airflow.providers.google.cloud.hooks.cloud_sql.CloudSQLDatabaseHook",
+        "CloudSqlHook": "airflow.providers.google.cloud.hooks.cloud_sql.CloudSQLHook",
     },
-    'gcp_tasks_hook': {
-        'CloudTasksHook': 'airflow.providers.google.cloud.hooks.tasks.CloudTasksHook',
+    "gcp_tasks_hook": {
+        "CloudTasksHook": "airflow.providers.google.cloud.hooks.tasks.CloudTasksHook",
     },
-    'gcp_text_to_speech_hook': {
-        'CloudTextToSpeechHook': 'airflow.providers.google.cloud.hooks.text_to_speech.CloudTextToSpeechHook',
-        'GCPTextToSpeechHook': 'airflow.providers.google.cloud.hooks.text_to_speech.CloudTextToSpeechHook',
+    "gcp_text_to_speech_hook": {
+        "CloudTextToSpeechHook": "airflow.providers.google.cloud.hooks.text_to_speech.CloudTextToSpeechHook",
+        "GCPTextToSpeechHook": "airflow.providers.google.cloud.hooks.text_to_speech.CloudTextToSpeechHook",
     },
-    'gcp_transfer_hook': {
-        'CloudDataTransferServiceHook': (
-            'airflow.providers.google.cloud.hooks.cloud_storage_transfer_service.CloudDataTransferServiceHook'
+    "gcp_transfer_hook": {
+        "CloudDataTransferServiceHook": (
+            "airflow.providers.google.cloud.hooks.cloud_storage_transfer_service.CloudDataTransferServiceHook"
         ),
-        'GCPTransferServiceHook': (
-            'airflow.providers.google.cloud.hooks.cloud_storage_transfer_service.CloudDataTransferServiceHook'
+        "GCPTransferServiceHook": (
+            "airflow.providers.google.cloud.hooks.cloud_storage_transfer_service.CloudDataTransferServiceHook"
         ),
     },
-    'gcp_translate_hook': {
-        'CloudTranslateHook': 'airflow.providers.google.cloud.hooks.translate.CloudTranslateHook',
+    "gcp_translate_hook": {
+        "CloudTranslateHook": "airflow.providers.google.cloud.hooks.translate.CloudTranslateHook",
     },
-    'gcp_video_intelligence_hook': {
-        'CloudVideoIntelligenceHook': (
-            'airflow.providers.google.cloud.hooks.video_intelligence.CloudVideoIntelligenceHook'
+    "gcp_video_intelligence_hook": {
+        "CloudVideoIntelligenceHook": (
+            "airflow.providers.google.cloud.hooks.video_intelligence.CloudVideoIntelligenceHook"
         ),
     },
-    'gcp_vision_hook': {
-        'CloudVisionHook': 'airflow.providers.google.cloud.hooks.vision.CloudVisionHook',
+    "gcp_vision_hook": {
+        "CloudVisionHook": "airflow.providers.google.cloud.hooks.vision.CloudVisionHook",
     },
-    'gcs_hook': {
-        'GCSHook': 'airflow.providers.google.cloud.hooks.gcs.GCSHook',
-        'GoogleCloudStorageHook': 'airflow.providers.google.cloud.hooks.gcs.GCSHook',
+    "gcs_hook": {
+        "GCSHook": "airflow.providers.google.cloud.hooks.gcs.GCSHook",
+        "GoogleCloudStorageHook": "airflow.providers.google.cloud.hooks.gcs.GCSHook",
     },
-    'gdrive_hook': {
-        'GoogleDriveHook': 'airflow.providers.google.suite.hooks.drive.GoogleDriveHook',
+    "gdrive_hook": {
+        "GoogleDriveHook": "airflow.providers.google.suite.hooks.drive.GoogleDriveHook",
     },
-    'grpc_hook': {
-        'GrpcHook': 'airflow.providers.grpc.hooks.grpc.GrpcHook',
+    "grpc_hook": {
+        "GrpcHook": "airflow.providers.grpc.hooks.grpc.GrpcHook",
     },
-    'imap_hook': {
-        'ImapHook': 'airflow.providers.imap.hooks.imap.ImapHook',
-        'Mail': 'airflow.providers.imap.hooks.imap.Mail',
-        'MailPart': 'airflow.providers.imap.hooks.imap.MailPart',
+    "imap_hook": {
+        "ImapHook": "airflow.providers.imap.hooks.imap.ImapHook",
+        "Mail": "airflow.providers.imap.hooks.imap.Mail",
+        "MailPart": "airflow.providers.imap.hooks.imap.MailPart",
     },
-    'jenkins_hook': {
-        'JenkinsHook': 'airflow.providers.jenkins.hooks.jenkins.JenkinsHook',
+    "jenkins_hook": {
+        "JenkinsHook": "airflow.providers.jenkins.hooks.jenkins.JenkinsHook",
     },
-    'jira_hook': {
-        'JiraHook': 'airflow.providers.atlassian.jira.hooks.jira.JiraHook',
+    "jira_hook": {
+        "JiraHook": "airflow.providers.atlassian.jira.hooks.jira.JiraHook",
     },
-    'mongo_hook': {
-        'MongoHook': 'airflow.providers.mongo.hooks.mongo.MongoHook',
+    "mongo_hook": {
+        "MongoHook": "airflow.providers.mongo.hooks.mongo.MongoHook",
     },
-    'openfaas_hook': {
-        'OK_STATUS_CODE': 'airflow.providers.openfaas.hooks.openfaas.OK_STATUS_CODE',
-        'OpenFaasHook': 'airflow.providers.openfaas.hooks.openfaas.OpenFaasHook',
-        'requests': 'airflow.providers.openfaas.hooks.openfaas.requests',
+    "openfaas_hook": {
+        "OK_STATUS_CODE": "airflow.providers.openfaas.hooks.openfaas.OK_STATUS_CODE",
+        "OpenFaasHook": "airflow.providers.openfaas.hooks.openfaas.OpenFaasHook",
+        "requests": "airflow.providers.openfaas.hooks.openfaas.requests",
     },
-    'opsgenie_alert_hook': {
-        'OpsgenieAlertHook': 'airflow.providers.opsgenie.hooks.opsgenie.OpsgenieAlertHook',
+    "opsgenie_alert_hook": {
+        "OpsgenieAlertHook": "airflow.providers.opsgenie.hooks.opsgenie.OpsgenieAlertHook",
     },
-    'pagerduty_hook': {
-        'PagerdutyHook': 'airflow.providers.pagerduty.hooks.pagerduty.PagerdutyHook',
+    "pagerduty_hook": {
+        "PagerdutyHook": "airflow.providers.pagerduty.hooks.pagerduty.PagerdutyHook",
     },
-    'pinot_hook': {
-        'PinotAdminHook': 'airflow.providers.apache.pinot.hooks.pinot.PinotAdminHook',
-        'PinotDbApiHook': 'airflow.providers.apache.pinot.hooks.pinot.PinotDbApiHook',
+    "pinot_hook": {
+        "PinotAdminHook": "airflow.providers.apache.pinot.hooks.pinot.PinotAdminHook",
+        "PinotDbApiHook": "airflow.providers.apache.pinot.hooks.pinot.PinotDbApiHook",
     },
-    'qubole_check_hook': {
-        'QuboleCheckHook': 'airflow.providers.qubole.hooks.qubole_check.QuboleCheckHook',
+    "qubole_check_hook": {
+        "QuboleCheckHook": "airflow.providers.qubole.hooks.qubole_check.QuboleCheckHook",
     },
-    'qubole_hook': {
-        'QuboleHook': 'airflow.providers.qubole.hooks.qubole.QuboleHook',
+    "qubole_hook": {
+        "QuboleHook": "airflow.providers.qubole.hooks.qubole.QuboleHook",
     },
-    'redis_hook': {
-        'RedisHook': 'airflow.providers.redis.hooks.redis.RedisHook',
+    "redis_hook": {
+        "RedisHook": "airflow.providers.redis.hooks.redis.RedisHook",
     },
-    'redshift_hook': {
-        'RedshiftHook': 'airflow.providers.amazon.aws.hooks.redshift_cluster.RedshiftHook',
+    "redshift_hook": {
+        "RedshiftHook": "airflow.providers.amazon.aws.hooks.redshift_cluster.RedshiftHook",
     },
-    'sagemaker_hook': {
-        'LogState': 'airflow.providers.amazon.aws.hooks.sagemaker.LogState',
-        'Position': 'airflow.providers.amazon.aws.hooks.sagemaker.Position',
-        'SageMakerHook': 'airflow.providers.amazon.aws.hooks.sagemaker.SageMakerHook',
-        'argmin': 'airflow.providers.amazon.aws.hooks.sagemaker.argmin',
-        'secondary_training_status_changed': (
-            'airflow.providers.amazon.aws.hooks.sagemaker.secondary_training_status_changed'
+    "sagemaker_hook": {
+        "LogState": "airflow.providers.amazon.aws.hooks.sagemaker.LogState",
+        "Position": "airflow.providers.amazon.aws.hooks.sagemaker.Position",
+        "SageMakerHook": "airflow.providers.amazon.aws.hooks.sagemaker.SageMakerHook",
+        "argmin": "airflow.providers.amazon.aws.hooks.sagemaker.argmin",
+        "secondary_training_status_changed": (
+            "airflow.providers.amazon.aws.hooks.sagemaker.secondary_training_status_changed"
         ),
-        'secondary_training_status_message': (
-            'airflow.providers.amazon.aws.hooks.sagemaker.secondary_training_status_message'
+        "secondary_training_status_message": (
+            "airflow.providers.amazon.aws.hooks.sagemaker.secondary_training_status_message"
         ),
     },
-    'salesforce_hook': {
-        'SalesforceHook': 'airflow.providers.salesforce.hooks.salesforce.SalesforceHook',
-        'pd': 'airflow.providers.salesforce.hooks.salesforce.pd',
+    "salesforce_hook": {
+        "SalesforceHook": "airflow.providers.salesforce.hooks.salesforce.SalesforceHook",
+        "pd": "airflow.providers.salesforce.hooks.salesforce.pd",
     },
-    'segment_hook': {
-        'SegmentHook': 'airflow.providers.segment.hooks.segment.SegmentHook',
-        'analytics': 'airflow.providers.segment.hooks.segment.analytics',
+    "segment_hook": {
+        "SegmentHook": "airflow.providers.segment.hooks.segment.SegmentHook",
+        "analytics": "airflow.providers.segment.hooks.segment.analytics",
     },
-    'sftp_hook': {
-        'SFTPHook': 'airflow.providers.sftp.hooks.sftp.SFTPHook',
+    "sftp_hook": {
+        "SFTPHook": "airflow.providers.sftp.hooks.sftp.SFTPHook",
     },
-    'slack_webhook_hook': {
-        'SlackWebhookHook': 'airflow.providers.slack.hooks.slack_webhook.SlackWebhookHook',
+    "slack_webhook_hook": {
+        "SlackWebhookHook": "airflow.providers.slack.hooks.slack_webhook.SlackWebhookHook",
     },
-    'snowflake_hook': {
-        'SnowflakeHook': 'airflow.providers.snowflake.hooks.snowflake.SnowflakeHook',
+    "snowflake_hook": {
+        "SnowflakeHook": "airflow.providers.snowflake.hooks.snowflake.SnowflakeHook",
     },
-    'spark_jdbc_hook': {
-        'SparkJDBCHook': 'airflow.providers.apache.spark.hooks.spark_jdbc.SparkJDBCHook',
+    "spark_jdbc_hook": {
+        "SparkJDBCHook": "airflow.providers.apache.spark.hooks.spark_jdbc.SparkJDBCHook",
     },
-    'spark_sql_hook': {
-        'SparkSqlHook': 'airflow.providers.apache.spark.hooks.spark_sql.SparkSqlHook',
+    "spark_sql_hook": {
+        "SparkSqlHook": "airflow.providers.apache.spark.hooks.spark_sql.SparkSqlHook",
     },
-    'spark_submit_hook': {
-        'SparkSubmitHook': 'airflow.providers.apache.spark.hooks.spark_submit.SparkSubmitHook',
+    "spark_submit_hook": {
+        "SparkSubmitHook": "airflow.providers.apache.spark.hooks.spark_submit.SparkSubmitHook",
     },
-    'sqoop_hook': {
-        'SqoopHook': 'airflow.providers.apache.sqoop.hooks.sqoop.SqoopHook',
+    "sqoop_hook": {
+        "SqoopHook": "airflow.providers.apache.sqoop.hooks.sqoop.SqoopHook",
     },
-    'ssh_hook': {
-        'SSHHook': 'airflow.providers.ssh.hooks.ssh.SSHHook',
+    "ssh_hook": {
+        "SSHHook": "airflow.providers.ssh.hooks.ssh.SSHHook",
     },
-    'vertica_hook': {
-        'VerticaHook': 'airflow.providers.vertica.hooks.vertica.VerticaHook',
+    "vertica_hook": {
+        "VerticaHook": "airflow.providers.vertica.hooks.vertica.VerticaHook",
     },
-    'wasb_hook': {
-        'WasbHook': 'airflow.providers.microsoft.azure.hooks.wasb.WasbHook',
+    "wasb_hook": {
+        "WasbHook": "airflow.providers.microsoft.azure.hooks.wasb.WasbHook",
     },
-    'winrm_hook': {
-        'WinRMHook': 'airflow.providers.microsoft.winrm.hooks.winrm.WinRMHook',
+    "winrm_hook": {
+        "WinRMHook": "airflow.providers.microsoft.winrm.hooks.winrm.WinRMHook",
     },
 }
 
diff --git a/airflow/contrib/operators/__init__.py b/airflow/contrib/operators/__init__.py
index 4893c8c4299b5..fe090c8b0d7fd 100644
--- a/airflow/contrib/operators/__init__.py
+++ b/airflow/contrib/operators/__init__.py
@@ -30,1112 +30,1112 @@
 )
 
 __deprecated_classes = {
-    'adls_list_operator': {
-        'ADLSListOperator': 'airflow.providers.microsoft.azure.operators.adls.ADLSListOperator',
-        'AzureDataLakeStorageListOperator': (
-            'airflow.providers.microsoft.azure.operators.adls.ADLSListOperator'
+    "adls_list_operator": {
+        "ADLSListOperator": "airflow.providers.microsoft.azure.operators.adls.ADLSListOperator",
+        "AzureDataLakeStorageListOperator": (
+            "airflow.providers.microsoft.azure.operators.adls.ADLSListOperator"
         ),
     },
-    'adls_to_gcs': {
-        'ADLSToGCSOperator': 'airflow.providers.google.cloud.transfers.adls_to_gcs.ADLSToGCSOperator',
-        'AdlsToGoogleCloudStorageOperator': (
-            'airflow.providers.google.cloud.transfers.adls_to_gcs.ADLSToGCSOperator'
+    "adls_to_gcs": {
+        "ADLSToGCSOperator": "airflow.providers.google.cloud.transfers.adls_to_gcs.ADLSToGCSOperator",
+        "AdlsToGoogleCloudStorageOperator": (
+            "airflow.providers.google.cloud.transfers.adls_to_gcs.ADLSToGCSOperator"
         ),
     },
-    'aws_athena_operator': {
-        'AWSAthenaOperator': 'airflow.providers.amazon.aws.operators.athena.AthenaOperator',
+    "aws_athena_operator": {
+        "AWSAthenaOperator": "airflow.providers.amazon.aws.operators.athena.AthenaOperator",
     },
-    'aws_sqs_publish_operator': {
-        'SqsPublishOperator': 'airflow.providers.amazon.aws.operators.sqs.SqsPublishOperator',
-        'SQSPublishOperator': 'airflow.providers.amazon.aws.operators.sqs.SqsPublishOperator',
+    "aws_sqs_publish_operator": {
+        "SqsPublishOperator": "airflow.providers.amazon.aws.operators.sqs.SqsPublishOperator",
+        "SQSPublishOperator": "airflow.providers.amazon.aws.operators.sqs.SqsPublishOperator",
     },
-    'awsbatch_operator': {
-        'BatchProtocol': 'airflow.providers.amazon.aws.hooks.batch_client.BatchProtocol',
-        'BatchOperator': 'airflow.providers.amazon.aws.operators.batch.BatchOperator',
-        'AWSBatchOperator': 'airflow.providers.amazon.aws.operators.batch.BatchOperator',
+    "awsbatch_operator": {
+        "BatchProtocol": "airflow.providers.amazon.aws.hooks.batch_client.BatchProtocol",
+        "BatchOperator": "airflow.providers.amazon.aws.operators.batch.BatchOperator",
+        "AWSBatchOperator": "airflow.providers.amazon.aws.operators.batch.BatchOperator",
     },
-    'azure_container_instances_operator': {
-        'AzureContainerInstancesOperator': (
-            'airflow.providers.microsoft.azure.operators.container_instances.AzureContainerInstancesOperator'
+    "azure_container_instances_operator": {
+        "AzureContainerInstancesOperator": (
+            "airflow.providers.microsoft.azure.operators.container_instances.AzureContainerInstancesOperator"
         ),
     },
-    'azure_cosmos_operator': {
-        'AzureCosmosInsertDocumentOperator': (
-            'airflow.providers.microsoft.azure.operators.cosmos.AzureCosmosInsertDocumentOperator'
+    "azure_cosmos_operator": {
+        "AzureCosmosInsertDocumentOperator": (
+            "airflow.providers.microsoft.azure.operators.cosmos.AzureCosmosInsertDocumentOperator"
         ),
     },
-    'bigquery_check_operator': {
-        'BigQueryCheckOperator': 'airflow.providers.google.cloud.operators.bigquery.BigQueryCheckOperator',
-        'BigQueryIntervalCheckOperator': (
-            'airflow.providers.google.cloud.operators.bigquery.BigQueryIntervalCheckOperator'
+    "bigquery_check_operator": {
+        "BigQueryCheckOperator": "airflow.providers.google.cloud.operators.bigquery.BigQueryCheckOperator",
+        "BigQueryIntervalCheckOperator": (
+            "airflow.providers.google.cloud.operators.bigquery.BigQueryIntervalCheckOperator"
         ),
-        'BigQueryValueCheckOperator': (
-            'airflow.providers.google.cloud.operators.bigquery.BigQueryValueCheckOperator'
+        "BigQueryValueCheckOperator": (
+            "airflow.providers.google.cloud.operators.bigquery.BigQueryValueCheckOperator"
         ),
     },
-    'bigquery_get_data': {
-        'BigQueryGetDataOperator': (
-            'airflow.providers.google.cloud.operators.bigquery.BigQueryGetDataOperator'
+    "bigquery_get_data": {
+        "BigQueryGetDataOperator": (
+            "airflow.providers.google.cloud.operators.bigquery.BigQueryGetDataOperator"
         ),
     },
-    'bigquery_operator': {
-        'BigQueryCreateEmptyDatasetOperator': (
-            'airflow.providers.google.cloud.operators.bigquery.BigQueryCreateEmptyDatasetOperator'
+    "bigquery_operator": {
+        "BigQueryCreateEmptyDatasetOperator": (
+            "airflow.providers.google.cloud.operators.bigquery.BigQueryCreateEmptyDatasetOperator"
         ),
-        'BigQueryCreateEmptyTableOperator': (
-            'airflow.providers.google.cloud.operators.bigquery.BigQueryCreateEmptyTableOperator'
+        "BigQueryCreateEmptyTableOperator": (
+            "airflow.providers.google.cloud.operators.bigquery.BigQueryCreateEmptyTableOperator"
         ),
-        'BigQueryCreateExternalTableOperator': (
-            'airflow.providers.google.cloud.operators.bigquery.BigQueryCreateExternalTableOperator'
+        "BigQueryCreateExternalTableOperator": (
+            "airflow.providers.google.cloud.operators.bigquery.BigQueryCreateExternalTableOperator"
         ),
-        'BigQueryDeleteDatasetOperator': (
-            'airflow.providers.google.cloud.operators.bigquery.BigQueryDeleteDatasetOperator'
+        "BigQueryDeleteDatasetOperator": (
+            "airflow.providers.google.cloud.operators.bigquery.BigQueryDeleteDatasetOperator"
         ),
-        'BigQueryExecuteQueryOperator': (
-            'airflow.providers.google.cloud.operators.bigquery.BigQueryExecuteQueryOperator'
+        "BigQueryExecuteQueryOperator": (
+            "airflow.providers.google.cloud.operators.bigquery.BigQueryExecuteQueryOperator"
         ),
-        'BigQueryGetDatasetOperator': (
-            'airflow.providers.google.cloud.operators.bigquery.BigQueryGetDatasetOperator'
+        "BigQueryGetDatasetOperator": (
+            "airflow.providers.google.cloud.operators.bigquery.BigQueryGetDatasetOperator"
         ),
-        'BigQueryGetDatasetTablesOperator': (
-            'airflow.providers.google.cloud.operators.bigquery.BigQueryGetDatasetTablesOperator'
+        "BigQueryGetDatasetTablesOperator": (
+            "airflow.providers.google.cloud.operators.bigquery.BigQueryGetDatasetTablesOperator"
         ),
-        'BigQueryPatchDatasetOperator': (
-            'airflow.providers.google.cloud.operators.bigquery.BigQueryPatchDatasetOperator'
+        "BigQueryPatchDatasetOperator": (
+            "airflow.providers.google.cloud.operators.bigquery.BigQueryPatchDatasetOperator"
         ),
-        'BigQueryUpdateDatasetOperator': (
-            'airflow.providers.google.cloud.operators.bigquery.BigQueryUpdateDatasetOperator'
+        "BigQueryUpdateDatasetOperator": (
+            "airflow.providers.google.cloud.operators.bigquery.BigQueryUpdateDatasetOperator"
         ),
-        'BigQueryUpsertTableOperator': (
-            'airflow.providers.google.cloud.operators.bigquery.BigQueryUpsertTableOperator'
+        "BigQueryUpsertTableOperator": (
+            "airflow.providers.google.cloud.operators.bigquery.BigQueryUpsertTableOperator"
         ),
-        'BigQueryOperator': 'airflow.providers.google.cloud.operators.bigquery.BigQueryExecuteQueryOperator',
+        "BigQueryOperator": "airflow.providers.google.cloud.operators.bigquery.BigQueryExecuteQueryOperator",
     },
-    'bigquery_table_delete_operator': {
-        'BigQueryDeleteTableOperator': (
-            'airflow.providers.google.cloud.operators.bigquery.BigQueryDeleteTableOperator'
+    "bigquery_table_delete_operator": {
+        "BigQueryDeleteTableOperator": (
+            "airflow.providers.google.cloud.operators.bigquery.BigQueryDeleteTableOperator"
         ),
-        'BigQueryTableDeleteOperator': (
-            'airflow.providers.google.cloud.operators.bigquery.BigQueryDeleteTableOperator'
+        "BigQueryTableDeleteOperator": (
+            "airflow.providers.google.cloud.operators.bigquery.BigQueryDeleteTableOperator"
         ),
     },
-    'bigquery_to_bigquery': {
-        'BigQueryToBigQueryOperator': (
-            'airflow.providers.google.cloud.transfers.bigquery_to_bigquery.BigQueryToBigQueryOperator'
+    "bigquery_to_bigquery": {
+        "BigQueryToBigQueryOperator": (
+            "airflow.providers.google.cloud.transfers.bigquery_to_bigquery.BigQueryToBigQueryOperator"
         ),
     },
-    'bigquery_to_gcs': {
-        'BigQueryToGCSOperator': (
-            'airflow.providers.google.cloud.transfers.bigquery_to_gcs.BigQueryToGCSOperator'
+    "bigquery_to_gcs": {
+        "BigQueryToGCSOperator": (
+            "airflow.providers.google.cloud.transfers.bigquery_to_gcs.BigQueryToGCSOperator"
         ),
-        'BigQueryToCloudStorageOperator': (
-            'airflow.providers.google.cloud.transfers.bigquery_to_gcs.BigQueryToGCSOperator'
+        "BigQueryToCloudStorageOperator": (
+            "airflow.providers.google.cloud.transfers.bigquery_to_gcs.BigQueryToGCSOperator"
         ),
     },
-    'bigquery_to_mysql_operator': {
-        'BigQueryToMySqlOperator': (
-            'airflow.providers.google.cloud.transfers.bigquery_to_mysql.BigQueryToMySqlOperator'
+    "bigquery_to_mysql_operator": {
+        "BigQueryToMySqlOperator": (
+            "airflow.providers.google.cloud.transfers.bigquery_to_mysql.BigQueryToMySqlOperator"
         ),
     },
-    'cassandra_to_gcs': {
-        'CassandraToGCSOperator': (
-            'airflow.providers.google.cloud.transfers.cassandra_to_gcs.CassandraToGCSOperator'
+    "cassandra_to_gcs": {
+        "CassandraToGCSOperator": (
+            "airflow.providers.google.cloud.transfers.cassandra_to_gcs.CassandraToGCSOperator"
         ),
-        'CassandraToGoogleCloudStorageOperator': (
-            'airflow.providers.google.cloud.transfers.cassandra_to_gcs.CassandraToGCSOperator'
+        "CassandraToGoogleCloudStorageOperator": (
+            "airflow.providers.google.cloud.transfers.cassandra_to_gcs.CassandraToGCSOperator"
         ),
     },
-    'databricks_operator': {
-        'DatabricksRunNowOperator': (
-            'airflow.providers.databricks.operators.databricks.DatabricksRunNowOperator'
+    "databricks_operator": {
+        "DatabricksRunNowOperator": (
+            "airflow.providers.databricks.operators.databricks.DatabricksRunNowOperator"
         ),
-        'DatabricksSubmitRunOperator': (
-            'airflow.providers.databricks.operators.databricks.DatabricksSubmitRunOperator'
+        "DatabricksSubmitRunOperator": (
+            "airflow.providers.databricks.operators.databricks.DatabricksSubmitRunOperator"
         ),
     },
-    'dataflow_operator': {
-        'DataflowCreateJavaJobOperator': (
-            'airflow.providers.google.cloud.operators.dataflow.DataflowCreateJavaJobOperator'
+    "dataflow_operator": {
+        "DataflowCreateJavaJobOperator": (
+            "airflow.providers.google.cloud.operators.dataflow.DataflowCreateJavaJobOperator"
         ),
-        'DataflowCreatePythonJobOperator': (
-            'airflow.providers.google.cloud.operators.dataflow.DataflowCreatePythonJobOperator'
+        "DataflowCreatePythonJobOperator": (
+            "airflow.providers.google.cloud.operators.dataflow.DataflowCreatePythonJobOperator"
         ),
-        'DataflowTemplatedJobStartOperator': (
-            'airflow.providers.google.cloud.operators.dataflow.DataflowTemplatedJobStartOperator'
+        "DataflowTemplatedJobStartOperator": (
+            "airflow.providers.google.cloud.operators.dataflow.DataflowTemplatedJobStartOperator"
         ),
-        'DataFlowJavaOperator': (
-            'airflow.providers.google.cloud.operators.dataflow.DataflowCreateJavaJobOperator'
+        "DataFlowJavaOperator": (
+            "airflow.providers.google.cloud.operators.dataflow.DataflowCreateJavaJobOperator"
         ),
-        'DataFlowPythonOperator': (
-            'airflow.providers.google.cloud.operators.dataflow.DataflowCreatePythonJobOperator'
+        "DataFlowPythonOperator": (
+            "airflow.providers.google.cloud.operators.dataflow.DataflowCreatePythonJobOperator"
         ),
-        'DataflowTemplateOperator': (
-            'airflow.providers.google.cloud.operators.dataflow.DataflowTemplatedJobStartOperator'
+        "DataflowTemplateOperator": (
+            "airflow.providers.google.cloud.operators.dataflow.DataflowTemplatedJobStartOperator"
         ),
     },
-    'dataproc_operator': {
-        'DataprocCreateClusterOperator': (
-            'airflow.providers.google.cloud.operators.dataproc.DataprocCreateClusterOperator'
+    "dataproc_operator": {
+        "DataprocCreateClusterOperator": (
+            "airflow.providers.google.cloud.operators.dataproc.DataprocCreateClusterOperator"
         ),
-        'DataprocDeleteClusterOperator': (
-            'airflow.providers.google.cloud.operators.dataproc.DataprocDeleteClusterOperator'
+        "DataprocDeleteClusterOperator": (
+            "airflow.providers.google.cloud.operators.dataproc.DataprocDeleteClusterOperator"
         ),
-        'DataprocInstantiateInlineWorkflowTemplateOperator':
-            'airflow.providers.google.cloud.operators.dataproc.'
-            'DataprocInstantiateInlineWorkflowTemplateOperator',
-        'DataprocInstantiateWorkflowTemplateOperator': (
-            'airflow.providers.google.cloud.operators.dataproc.DataprocInstantiateWorkflowTemplateOperator'
+        "DataprocInstantiateInlineWorkflowTemplateOperator":
+            "airflow.providers.google.cloud.operators.dataproc."
+            "DataprocInstantiateInlineWorkflowTemplateOperator",
+        "DataprocInstantiateWorkflowTemplateOperator": (
+            "airflow.providers.google.cloud.operators.dataproc.DataprocInstantiateWorkflowTemplateOperator"
         ),
-        'DataprocJobBaseOperator': (
-            'airflow.providers.google.cloud.operators.dataproc.DataprocJobBaseOperator'
+        "DataprocJobBaseOperator": (
+            "airflow.providers.google.cloud.operators.dataproc.DataprocJobBaseOperator"
         ),
-        'DataprocScaleClusterOperator': (
-            'airflow.providers.google.cloud.operators.dataproc.DataprocScaleClusterOperator'
+        "DataprocScaleClusterOperator": (
+            "airflow.providers.google.cloud.operators.dataproc.DataprocScaleClusterOperator"
         ),
-        'DataprocSubmitHadoopJobOperator': (
-            'airflow.providers.google.cloud.operators.dataproc.DataprocSubmitHadoopJobOperator'
+        "DataprocSubmitHadoopJobOperator": (
+            "airflow.providers.google.cloud.operators.dataproc.DataprocSubmitHadoopJobOperator"
         ),
-        'DataprocSubmitHiveJobOperator': (
-            'airflow.providers.google.cloud.operators.dataproc.DataprocSubmitHiveJobOperator'
+        "DataprocSubmitHiveJobOperator": (
+            "airflow.providers.google.cloud.operators.dataproc.DataprocSubmitHiveJobOperator"
         ),
-        'DataprocSubmitPigJobOperator': (
-            'airflow.providers.google.cloud.operators.dataproc.DataprocSubmitPigJobOperator'
+        "DataprocSubmitPigJobOperator": (
+            "airflow.providers.google.cloud.operators.dataproc.DataprocSubmitPigJobOperator"
         ),
-        'DataprocSubmitPySparkJobOperator': (
-            'airflow.providers.google.cloud.operators.dataproc.DataprocSubmitPySparkJobOperator'
+        "DataprocSubmitPySparkJobOperator": (
+            "airflow.providers.google.cloud.operators.dataproc.DataprocSubmitPySparkJobOperator"
         ),
-        'DataprocSubmitSparkJobOperator': (
-            'airflow.providers.google.cloud.operators.dataproc.DataprocSubmitSparkJobOperator'
+        "DataprocSubmitSparkJobOperator": (
+            "airflow.providers.google.cloud.operators.dataproc.DataprocSubmitSparkJobOperator"
         ),
-        'DataprocSubmitSparkSqlJobOperator': (
-            'airflow.providers.google.cloud.operators.dataproc.DataprocSubmitSparkSqlJobOperator'
+        "DataprocSubmitSparkSqlJobOperator": (
+            "airflow.providers.google.cloud.operators.dataproc.DataprocSubmitSparkSqlJobOperator"
         ),
-        'DataprocClusterCreateOperator': (
-            'airflow.providers.google.cloud.operators.dataproc.DataprocCreateClusterOperator'
+        "DataprocClusterCreateOperator": (
+            "airflow.providers.google.cloud.operators.dataproc.DataprocCreateClusterOperator"
         ),
-        'DataprocClusterDeleteOperator': (
-            'airflow.providers.google.cloud.operators.dataproc.DataprocDeleteClusterOperator'
+        "DataprocClusterDeleteOperator": (
+            "airflow.providers.google.cloud.operators.dataproc.DataprocDeleteClusterOperator"
         ),
-        'DataprocClusterScaleOperator': (
-            'airflow.providers.google.cloud.operators.dataproc.DataprocScaleClusterOperator'
+        "DataprocClusterScaleOperator": (
+            "airflow.providers.google.cloud.operators.dataproc.DataprocScaleClusterOperator"
         ),
-        'DataProcHadoopOperator': (
-            'airflow.providers.google.cloud.operators.dataproc.DataprocSubmitHadoopJobOperator'
+        "DataProcHadoopOperator": (
+            "airflow.providers.google.cloud.operators.dataproc.DataprocSubmitHadoopJobOperator"
         ),
-        'DataProcHiveOperator': (
-            'airflow.providers.google.cloud.operators.dataproc.DataprocSubmitHiveJobOperator'
+        "DataProcHiveOperator": (
+            "airflow.providers.google.cloud.operators.dataproc.DataprocSubmitHiveJobOperator"
         ),
-        'DataProcJobBaseOperator': (
-            'airflow.providers.google.cloud.operators.dataproc.DataprocJobBaseOperator'
+        "DataProcJobBaseOperator": (
+            "airflow.providers.google.cloud.operators.dataproc.DataprocJobBaseOperator"
         ),
-        'DataProcPigOperator': (
-            'airflow.providers.google.cloud.operators.dataproc.DataprocSubmitPigJobOperator'
+        "DataProcPigOperator": (
+            "airflow.providers.google.cloud.operators.dataproc.DataprocSubmitPigJobOperator"
         ),
-        'DataProcPySparkOperator': (
-            'airflow.providers.google.cloud.operators.dataproc.DataprocSubmitPySparkJobOperator'
+        "DataProcPySparkOperator": (
+            "airflow.providers.google.cloud.operators.dataproc.DataprocSubmitPySparkJobOperator"
         ),
-        'DataProcSparkOperator': (
-            'airflow.providers.google.cloud.operators.dataproc.DataprocSubmitSparkJobOperator'
+        "DataProcSparkOperator": (
+            "airflow.providers.google.cloud.operators.dataproc.DataprocSubmitSparkJobOperator"
         ),
-        'DataProcSparkSqlOperator': (
-            'airflow.providers.google.cloud.operators.dataproc.DataprocSubmitSparkSqlJobOperator'
+        "DataProcSparkSqlOperator": (
+            "airflow.providers.google.cloud.operators.dataproc.DataprocSubmitSparkSqlJobOperator"
         ),
-        'DataprocWorkflowTemplateInstantiateInlineOperator':
-            'airflow.providers.google.cloud.operators.dataproc.'
-            'DataprocInstantiateInlineWorkflowTemplateOperator',
-        'DataprocWorkflowTemplateInstantiateOperator': (
-            'airflow.providers.google.cloud.operators.dataproc.DataprocInstantiateWorkflowTemplateOperator'
+        "DataprocWorkflowTemplateInstantiateInlineOperator":
+            "airflow.providers.google.cloud.operators.dataproc."
+            "DataprocInstantiateInlineWorkflowTemplateOperator",
+        "DataprocWorkflowTemplateInstantiateOperator": (
+            "airflow.providers.google.cloud.operators.dataproc.DataprocInstantiateWorkflowTemplateOperator"
         ),
     },
-    'datastore_export_operator': {
-        'CloudDatastoreExportEntitiesOperator': (
-            'airflow.providers.google.cloud.operators.datastore.CloudDatastoreExportEntitiesOperator'
+    "datastore_export_operator": {
+        "CloudDatastoreExportEntitiesOperator": (
+            "airflow.providers.google.cloud.operators.datastore.CloudDatastoreExportEntitiesOperator"
         ),
-        'DatastoreExportOperator': (
-            'airflow.providers.google.cloud.operators.datastore.CloudDatastoreExportEntitiesOperator'
+        "DatastoreExportOperator": (
+            "airflow.providers.google.cloud.operators.datastore.CloudDatastoreExportEntitiesOperator"
         ),
     },
-    'datastore_import_operator': {
-        'CloudDatastoreImportEntitiesOperator': (
-            'airflow.providers.google.cloud.operators.datastore.CloudDatastoreImportEntitiesOperator'
+    "datastore_import_operator": {
+        "CloudDatastoreImportEntitiesOperator": (
+            "airflow.providers.google.cloud.operators.datastore.CloudDatastoreImportEntitiesOperator"
         ),
-        'DatastoreImportOperator': (
-            'airflow.providers.google.cloud.operators.datastore.CloudDatastoreImportEntitiesOperator'
+        "DatastoreImportOperator": (
+            "airflow.providers.google.cloud.operators.datastore.CloudDatastoreImportEntitiesOperator"
         ),
     },
-    'dingding_operator': {
-        'DingdingOperator': 'airflow.providers.dingding.operators.dingding.DingdingOperator',
+    "dingding_operator": {
+        "DingdingOperator": "airflow.providers.dingding.operators.dingding.DingdingOperator",
     },
-    'discord_webhook_operator': {
-        'DiscordWebhookOperator': (
-            'airflow.providers.discord.operators.discord_webhook.DiscordWebhookOperator'
+    "discord_webhook_operator": {
+        "DiscordWebhookOperator": (
+            "airflow.providers.discord.operators.discord_webhook.DiscordWebhookOperator"
         ),
     },
-    'docker_swarm_operator': {
-        'DockerSwarmOperator': 'airflow.providers.docker.operators.docker_swarm.DockerSwarmOperator',
+    "docker_swarm_operator": {
+        "DockerSwarmOperator": "airflow.providers.docker.operators.docker_swarm.DockerSwarmOperator",
     },
-    'druid_operator': {
-        'DruidOperator': 'airflow.providers.apache.druid.operators.druid.DruidOperator',
+    "druid_operator": {
+        "DruidOperator": "airflow.providers.apache.druid.operators.druid.DruidOperator",
     },
-    'dynamodb_to_s3': {
-        'DynamoDBToS3Operator': 'airflow.providers.amazon.aws.transfers.dynamodb_to_s3.DynamoDBToS3Operator',
+    "dynamodb_to_s3": {
+        "DynamoDBToS3Operator": "airflow.providers.amazon.aws.transfers.dynamodb_to_s3.DynamoDBToS3Operator",
     },
-    'ecs_operator': {
-        'EcsProtocol': 'airflow.providers.amazon.aws.hooks.ecs.EcsProtocol',
-        'EcsRunTaskOperator': 'airflow.providers.amazon.aws.operators.ecs.EcsRunTaskOperator',
-        'EcsOperator': 'airflow.providers.amazon.aws.operators.ecs.EcsRunTaskOperator',
+    "ecs_operator": {
+        "EcsProtocol": "airflow.providers.amazon.aws.hooks.ecs.EcsProtocol",
+        "EcsRunTaskOperator": "airflow.providers.amazon.aws.operators.ecs.EcsRunTaskOperator",
+        "EcsOperator": "airflow.providers.amazon.aws.operators.ecs.EcsRunTaskOperator",
     },
-    'file_to_gcs': {
-        'LocalFilesystemToGCSOperator': (
-            'airflow.providers.google.cloud.transfers.local_to_gcs.LocalFilesystemToGCSOperator'
+    "file_to_gcs": {
+        "LocalFilesystemToGCSOperator": (
+            "airflow.providers.google.cloud.transfers.local_to_gcs.LocalFilesystemToGCSOperator"
         ),
-        'FileToGoogleCloudStorageOperator': (
-            'airflow.providers.google.cloud.transfers.local_to_gcs.LocalFilesystemToGCSOperator'
+        "FileToGoogleCloudStorageOperator": (
+            "airflow.providers.google.cloud.transfers.local_to_gcs.LocalFilesystemToGCSOperator"
         ),
     },
-    'file_to_wasb': {
-        'LocalFilesystemToWasbOperator': (
-            'airflow.providers.microsoft.azure.transfers.local_to_wasb.LocalFilesystemToWasbOperator'
+    "file_to_wasb": {
+        "LocalFilesystemToWasbOperator": (
+            "airflow.providers.microsoft.azure.transfers.local_to_wasb.LocalFilesystemToWasbOperator"
         ),
-        'FileToWasbOperator': (
-            'airflow.providers.microsoft.azure.transfers.local_to_wasb.LocalFilesystemToWasbOperator'
+        "FileToWasbOperator": (
+            "airflow.providers.microsoft.azure.transfers.local_to_wasb.LocalFilesystemToWasbOperator"
         ),
     },
-    'gcp_bigtable_operator': {
-        'BigtableCreateInstanceOperator': (
-            'airflow.providers.google.cloud.operators.bigtable.BigtableCreateInstanceOperator'
+    "gcp_bigtable_operator": {
+        "BigtableCreateInstanceOperator": (
+            "airflow.providers.google.cloud.operators.bigtable.BigtableCreateInstanceOperator"
         ),
-        'BigtableCreateTableOperator': (
-            'airflow.providers.google.cloud.operators.bigtable.BigtableCreateTableOperator'
+        "BigtableCreateTableOperator": (
+            "airflow.providers.google.cloud.operators.bigtable.BigtableCreateTableOperator"
         ),
-        'BigtableDeleteInstanceOperator': (
-            'airflow.providers.google.cloud.operators.bigtable.BigtableDeleteInstanceOperator'
+        "BigtableDeleteInstanceOperator": (
+            "airflow.providers.google.cloud.operators.bigtable.BigtableDeleteInstanceOperator"
         ),
-        'BigtableDeleteTableOperator': (
-            'airflow.providers.google.cloud.operators.bigtable.BigtableDeleteTableOperator'
+        "BigtableDeleteTableOperator": (
+            "airflow.providers.google.cloud.operators.bigtable.BigtableDeleteTableOperator"
         ),
-        'BigtableUpdateClusterOperator': (
-            'airflow.providers.google.cloud.operators.bigtable.BigtableUpdateClusterOperator'
+        "BigtableUpdateClusterOperator": (
+            "airflow.providers.google.cloud.operators.bigtable.BigtableUpdateClusterOperator"
         ),
-        'BigtableTableReplicationCompletedSensor': (
-            'airflow.providers.google.cloud.sensors.bigtable.BigtableTableReplicationCompletedSensor'
+        "BigtableTableReplicationCompletedSensor": (
+            "airflow.providers.google.cloud.sensors.bigtable.BigtableTableReplicationCompletedSensor"
         ),
-        'BigtableClusterUpdateOperator': (
-            'airflow.providers.google.cloud.operators.bigtable.BigtableUpdateClusterOperator'
+        "BigtableClusterUpdateOperator": (
+            "airflow.providers.google.cloud.operators.bigtable.BigtableUpdateClusterOperator"
         ),
-        'BigtableInstanceCreateOperator': (
-            'airflow.providers.google.cloud.operators.bigtable.BigtableCreateInstanceOperator'
+        "BigtableInstanceCreateOperator": (
+            "airflow.providers.google.cloud.operators.bigtable.BigtableCreateInstanceOperator"
         ),
-        'BigtableInstanceDeleteOperator': (
-            'airflow.providers.google.cloud.operators.bigtable.BigtableDeleteInstanceOperator'
+        "BigtableInstanceDeleteOperator": (
+            "airflow.providers.google.cloud.operators.bigtable.BigtableDeleteInstanceOperator"
         ),
-        'BigtableTableCreateOperator': (
-            'airflow.providers.google.cloud.operators.bigtable.BigtableCreateTableOperator'
+        "BigtableTableCreateOperator": (
+            "airflow.providers.google.cloud.operators.bigtable.BigtableCreateTableOperator"
         ),
-        'BigtableTableDeleteOperator': (
-            'airflow.providers.google.cloud.operators.bigtable.BigtableDeleteTableOperator'
+        "BigtableTableDeleteOperator": (
+            "airflow.providers.google.cloud.operators.bigtable.BigtableDeleteTableOperator"
         ),
-        'BigtableTableWaitForReplicationSensor': (
-            'airflow.providers.google.cloud.sensors.bigtable.BigtableTableReplicationCompletedSensor'
+        "BigtableTableWaitForReplicationSensor": (
+            "airflow.providers.google.cloud.sensors.bigtable.BigtableTableReplicationCompletedSensor"
         ),
     },
-    'gcp_cloud_build_operator': {
-        'CloudBuildCreateBuildOperator': (
-            'airflow.providers.google.cloud.operators.cloud_build.CloudBuildCreateBuildOperator'
+    "gcp_cloud_build_operator": {
+        "CloudBuildCreateBuildOperator": (
+            "airflow.providers.google.cloud.operators.cloud_build.CloudBuildCreateBuildOperator"
         ),
     },
-    'gcp_compute_operator': {
-        'ComputeEngineBaseOperator': (
-            'airflow.providers.google.cloud.operators.compute.ComputeEngineBaseOperator'
+    "gcp_compute_operator": {
+        "ComputeEngineBaseOperator": (
+            "airflow.providers.google.cloud.operators.compute.ComputeEngineBaseOperator"
         ),
-        'ComputeEngineCopyInstanceTemplateOperator': (
-            'airflow.providers.google.cloud.operators.compute.ComputeEngineCopyInstanceTemplateOperator'
+        "ComputeEngineCopyInstanceTemplateOperator": (
+            "airflow.providers.google.cloud.operators.compute.ComputeEngineCopyInstanceTemplateOperator"
         ),
-        'ComputeEngineInstanceGroupUpdateManagerTemplateOperator':
-            'airflow.providers.google.cloud.operators.compute.'
-            'ComputeEngineInstanceGroupUpdateManagerTemplateOperator',
-        'ComputeEngineSetMachineTypeOperator': (
-            'airflow.providers.google.cloud.operators.compute.ComputeEngineSetMachineTypeOperator'
+        "ComputeEngineInstanceGroupUpdateManagerTemplateOperator":
+            "airflow.providers.google.cloud.operators.compute."
+            "ComputeEngineInstanceGroupUpdateManagerTemplateOperator",
+        "ComputeEngineSetMachineTypeOperator": (
+            "airflow.providers.google.cloud.operators.compute.ComputeEngineSetMachineTypeOperator"
         ),
-        'ComputeEngineStartInstanceOperator': (
-            'airflow.providers.google.cloud.operators.compute.ComputeEngineStartInstanceOperator'
+        "ComputeEngineStartInstanceOperator": (
+            "airflow.providers.google.cloud.operators.compute.ComputeEngineStartInstanceOperator"
         ),
-        'ComputeEngineStopInstanceOperator': (
-            'airflow.providers.google.cloud.operators.compute.ComputeEngineStopInstanceOperator'
+        "ComputeEngineStopInstanceOperator": (
+            "airflow.providers.google.cloud.operators.compute.ComputeEngineStopInstanceOperator"
         ),
-        'GceBaseOperator': 'airflow.providers.google.cloud.operators.compute.ComputeEngineBaseOperator',
-        'GceInstanceGroupManagerUpdateTemplateOperator':
-            'airflow.providers.google.cloud.operators.compute.'
-            'ComputeEngineInstanceGroupUpdateManagerTemplateOperator',
-        'GceInstanceStartOperator': (
-            'airflow.providers.google.cloud.operators.compute.ComputeEngineStartInstanceOperator'
+        "GceBaseOperator": "airflow.providers.google.cloud.operators.compute.ComputeEngineBaseOperator",
+        "GceInstanceGroupManagerUpdateTemplateOperator":
+            "airflow.providers.google.cloud.operators.compute."
+            "ComputeEngineInstanceGroupUpdateManagerTemplateOperator",
+        "GceInstanceStartOperator": (
+            "airflow.providers.google.cloud.operators.compute.ComputeEngineStartInstanceOperator"
         ),
-        'GceInstanceStopOperator': (
-            'airflow.providers.google.cloud.operators.compute.ComputeEngineStopInstanceOperator'
+        "GceInstanceStopOperator": (
+            "airflow.providers.google.cloud.operators.compute.ComputeEngineStopInstanceOperator"
         ),
-        'GceInstanceTemplateCopyOperator': (
-            'airflow.providers.google.cloud.operators.compute.ComputeEngineCopyInstanceTemplateOperator'
+        "GceInstanceTemplateCopyOperator": (
+            "airflow.providers.google.cloud.operators.compute.ComputeEngineCopyInstanceTemplateOperator"
         ),
-        'GceSetMachineTypeOperator': (
-            'airflow.providers.google.cloud.operators.compute.ComputeEngineSetMachineTypeOperator'
+        "GceSetMachineTypeOperator": (
+            "airflow.providers.google.cloud.operators.compute.ComputeEngineSetMachineTypeOperator"
         ),
     },
-    'gcp_container_operator': {
-        'GKECreateClusterOperator': (
-            'airflow.providers.google.cloud.operators.kubernetes_engine.GKECreateClusterOperator'
+    "gcp_container_operator": {
+        "GKECreateClusterOperator": (
+            "airflow.providers.google.cloud.operators.kubernetes_engine.GKECreateClusterOperator"
         ),
-        'GKEDeleteClusterOperator': (
-            'airflow.providers.google.cloud.operators.kubernetes_engine.GKEDeleteClusterOperator'
+        "GKEDeleteClusterOperator": (
+            "airflow.providers.google.cloud.operators.kubernetes_engine.GKEDeleteClusterOperator"
         ),
-        'GKEStartPodOperator': (
-            'airflow.providers.google.cloud.operators.kubernetes_engine.GKEStartPodOperator'
+        "GKEStartPodOperator": (
+            "airflow.providers.google.cloud.operators.kubernetes_engine.GKEStartPodOperator"
         ),
-        'GKEClusterCreateOperator': (
-            'airflow.providers.google.cloud.operators.kubernetes_engine.GKECreateClusterOperator'
+        "GKEClusterCreateOperator": (
+            "airflow.providers.google.cloud.operators.kubernetes_engine.GKECreateClusterOperator"
         ),
-        'GKEClusterDeleteOperator': (
-            'airflow.providers.google.cloud.operators.kubernetes_engine.GKEDeleteClusterOperator'
+        "GKEClusterDeleteOperator": (
+            "airflow.providers.google.cloud.operators.kubernetes_engine.GKEDeleteClusterOperator"
         ),
-        'GKEPodOperator': 'airflow.providers.google.cloud.operators.kubernetes_engine.GKEStartPodOperator',
+        "GKEPodOperator": "airflow.providers.google.cloud.operators.kubernetes_engine.GKEStartPodOperator",
     },
-    'gcp_dlp_operator': {
-        'CloudDLPCancelDLPJobOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPCancelDLPJobOperator'
+    "gcp_dlp_operator": {
+        "CloudDLPCancelDLPJobOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPCancelDLPJobOperator"
         ),
-        'CloudDLPCreateDeidentifyTemplateOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPCreateDeidentifyTemplateOperator'
+        "CloudDLPCreateDeidentifyTemplateOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPCreateDeidentifyTemplateOperator"
         ),
-        'CloudDLPCreateDLPJobOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPCreateDLPJobOperator'
+        "CloudDLPCreateDLPJobOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPCreateDLPJobOperator"
         ),
-        'CloudDLPCreateInspectTemplateOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPCreateInspectTemplateOperator'
+        "CloudDLPCreateInspectTemplateOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPCreateInspectTemplateOperator"
         ),
-        'CloudDLPCreateJobTriggerOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPCreateJobTriggerOperator'
+        "CloudDLPCreateJobTriggerOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPCreateJobTriggerOperator"
         ),
-        'CloudDLPCreateStoredInfoTypeOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPCreateStoredInfoTypeOperator'
+        "CloudDLPCreateStoredInfoTypeOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPCreateStoredInfoTypeOperator"
         ),
-        'CloudDLPDeidentifyContentOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPDeidentifyContentOperator'
+        "CloudDLPDeidentifyContentOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPDeidentifyContentOperator"
         ),
-        'CloudDLPDeleteDeidentifyTemplateOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPDeleteDeidentifyTemplateOperator'
+        "CloudDLPDeleteDeidentifyTemplateOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPDeleteDeidentifyTemplateOperator"
         ),
-        'CloudDLPDeleteDLPJobOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPDeleteDLPJobOperator'
+        "CloudDLPDeleteDLPJobOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPDeleteDLPJobOperator"
         ),
-        'CloudDLPDeleteInspectTemplateOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPDeleteInspectTemplateOperator'
+        "CloudDLPDeleteInspectTemplateOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPDeleteInspectTemplateOperator"
         ),
-        'CloudDLPDeleteJobTriggerOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPDeleteJobTriggerOperator'
+        "CloudDLPDeleteJobTriggerOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPDeleteJobTriggerOperator"
         ),
-        'CloudDLPDeleteStoredInfoTypeOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPDeleteStoredInfoTypeOperator'
+        "CloudDLPDeleteStoredInfoTypeOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPDeleteStoredInfoTypeOperator"
         ),
-        'CloudDLPGetDeidentifyTemplateOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPGetDeidentifyTemplateOperator'
+        "CloudDLPGetDeidentifyTemplateOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPGetDeidentifyTemplateOperator"
         ),
-        'CloudDLPGetDLPJobOperator': 'airflow.providers.google.cloud.operators.dlp.CloudDLPGetDLPJobOperator',
-        'CloudDLPGetDLPJobTriggerOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPGetDLPJobTriggerOperator'
+        "CloudDLPGetDLPJobOperator": "airflow.providers.google.cloud.operators.dlp.CloudDLPGetDLPJobOperator",
+        "CloudDLPGetDLPJobTriggerOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPGetDLPJobTriggerOperator"
         ),
-        'CloudDLPGetInspectTemplateOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPGetInspectTemplateOperator'
+        "CloudDLPGetInspectTemplateOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPGetInspectTemplateOperator"
         ),
-        'CloudDLPGetStoredInfoTypeOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPGetStoredInfoTypeOperator'
+        "CloudDLPGetStoredInfoTypeOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPGetStoredInfoTypeOperator"
         ),
-        'CloudDLPInspectContentOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPInspectContentOperator'
+        "CloudDLPInspectContentOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPInspectContentOperator"
         ),
-        'CloudDLPListDeidentifyTemplatesOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPListDeidentifyTemplatesOperator'
+        "CloudDLPListDeidentifyTemplatesOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPListDeidentifyTemplatesOperator"
         ),
-        'CloudDLPListDLPJobsOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPListDLPJobsOperator'
+        "CloudDLPListDLPJobsOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPListDLPJobsOperator"
         ),
-        'CloudDLPListInfoTypesOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPListInfoTypesOperator'
+        "CloudDLPListInfoTypesOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPListInfoTypesOperator"
         ),
-        'CloudDLPListInspectTemplatesOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPListInspectTemplatesOperator'
+        "CloudDLPListInspectTemplatesOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPListInspectTemplatesOperator"
         ),
-        'CloudDLPListJobTriggersOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPListJobTriggersOperator'
+        "CloudDLPListJobTriggersOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPListJobTriggersOperator"
         ),
-        'CloudDLPListStoredInfoTypesOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPListStoredInfoTypesOperator'
+        "CloudDLPListStoredInfoTypesOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPListStoredInfoTypesOperator"
         ),
-        'CloudDLPRedactImageOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPRedactImageOperator'
+        "CloudDLPRedactImageOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPRedactImageOperator"
         ),
-        'CloudDLPReidentifyContentOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPReidentifyContentOperator'
+        "CloudDLPReidentifyContentOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPReidentifyContentOperator"
         ),
-        'CloudDLPUpdateDeidentifyTemplateOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPUpdateDeidentifyTemplateOperator'
+        "CloudDLPUpdateDeidentifyTemplateOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPUpdateDeidentifyTemplateOperator"
         ),
-        'CloudDLPUpdateInspectTemplateOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPUpdateInspectTemplateOperator'
+        "CloudDLPUpdateInspectTemplateOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPUpdateInspectTemplateOperator"
         ),
-        'CloudDLPUpdateJobTriggerOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPUpdateJobTriggerOperator'
+        "CloudDLPUpdateJobTriggerOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPUpdateJobTriggerOperator"
         ),
-        'CloudDLPUpdateStoredInfoTypeOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPUpdateStoredInfoTypeOperator'
+        "CloudDLPUpdateStoredInfoTypeOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPUpdateStoredInfoTypeOperator"
         ),
-        'CloudDLPDeleteDlpJobOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPDeleteDLPJobOperator'
+        "CloudDLPDeleteDlpJobOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPDeleteDLPJobOperator"
         ),
-        'CloudDLPGetDlpJobOperator': 'airflow.providers.google.cloud.operators.dlp.CloudDLPGetDLPJobOperator',
-        'CloudDLPGetJobTripperOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPGetDLPJobTriggerOperator'
+        "CloudDLPGetDlpJobOperator": "airflow.providers.google.cloud.operators.dlp.CloudDLPGetDLPJobOperator",
+        "CloudDLPGetJobTripperOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPGetDLPJobTriggerOperator"
         ),
-        'CloudDLPListDlpJobsOperator': (
-            'airflow.providers.google.cloud.operators.dlp.CloudDLPListDLPJobsOperator'
+        "CloudDLPListDlpJobsOperator": (
+            "airflow.providers.google.cloud.operators.dlp.CloudDLPListDLPJobsOperator"
         ),
     },
-    'gcp_function_operator': {
-        'CloudFunctionDeleteFunctionOperator': (
-            'airflow.providers.google.cloud.operators.functions.CloudFunctionDeleteFunctionOperator'
+    "gcp_function_operator": {
+        "CloudFunctionDeleteFunctionOperator": (
+            "airflow.providers.google.cloud.operators.functions.CloudFunctionDeleteFunctionOperator"
         ),
-        'CloudFunctionDeployFunctionOperator': (
-            'airflow.providers.google.cloud.operators.functions.CloudFunctionDeployFunctionOperator'
+        "CloudFunctionDeployFunctionOperator": (
+            "airflow.providers.google.cloud.operators.functions.CloudFunctionDeployFunctionOperator"
         ),
-        'GcfFunctionDeleteOperator': (
-            'airflow.providers.google.cloud.operators.functions.CloudFunctionDeleteFunctionOperator'
+        "GcfFunctionDeleteOperator": (
+            "airflow.providers.google.cloud.operators.functions.CloudFunctionDeleteFunctionOperator"
         ),
-        'GcfFunctionDeployOperator': (
-            'airflow.providers.google.cloud.operators.functions.CloudFunctionDeployFunctionOperator'
+        "GcfFunctionDeployOperator": (
+            "airflow.providers.google.cloud.operators.functions.CloudFunctionDeployFunctionOperator"
         ),
     },
-    'gcp_natural_language_operator': {
-        'CloudNaturalLanguageAnalyzeEntitiesOperator':
-            'airflow.providers.google.cloud.operators.natural_language.'
-            'CloudNaturalLanguageAnalyzeEntitiesOperator',
-        'CloudNaturalLanguageAnalyzeEntitySentimentOperator':
-            'airflow.providers.google.cloud.operators.natural_language.'
-            'CloudNaturalLanguageAnalyzeEntitySentimentOperator',
-        'CloudNaturalLanguageAnalyzeSentimentOperator':
-            'airflow.providers.google.cloud.operators.natural_language.'
-            'CloudNaturalLanguageAnalyzeSentimentOperator',
-        'CloudNaturalLanguageClassifyTextOperator':
-            'airflow.providers.google.cloud.operators.natural_language.'
-            'CloudNaturalLanguageClassifyTextOperator',
-        'CloudLanguageAnalyzeEntitiesOperator':
-            'airflow.providers.google.cloud.operators.natural_language.'
-            'CloudNaturalLanguageAnalyzeEntitiesOperator',
-        'CloudLanguageAnalyzeEntitySentimentOperator':
-            'airflow.providers.google.cloud.operators.natural_language.'
-            'CloudNaturalLanguageAnalyzeEntitySentimentOperator',
-        'CloudLanguageAnalyzeSentimentOperator':
-            'airflow.providers.google.cloud.operators.natural_language.'
-            'CloudNaturalLanguageAnalyzeSentimentOperator',
-        'CloudLanguageClassifyTextOperator':
-            'airflow.providers.google.cloud.operators.natural_language.'
-            'CloudNaturalLanguageClassifyTextOperator',
+    "gcp_natural_language_operator": {
+        "CloudNaturalLanguageAnalyzeEntitiesOperator":
+            "airflow.providers.google.cloud.operators.natural_language."
+            "CloudNaturalLanguageAnalyzeEntitiesOperator",
+        "CloudNaturalLanguageAnalyzeEntitySentimentOperator":
+            "airflow.providers.google.cloud.operators.natural_language."
+            "CloudNaturalLanguageAnalyzeEntitySentimentOperator",
+        "CloudNaturalLanguageAnalyzeSentimentOperator":
+            "airflow.providers.google.cloud.operators.natural_language."
+            "CloudNaturalLanguageAnalyzeSentimentOperator",
+        "CloudNaturalLanguageClassifyTextOperator":
+            "airflow.providers.google.cloud.operators.natural_language."
+            "CloudNaturalLanguageClassifyTextOperator",
+        "CloudLanguageAnalyzeEntitiesOperator":
+            "airflow.providers.google.cloud.operators.natural_language."
+            "CloudNaturalLanguageAnalyzeEntitiesOperator",
+        "CloudLanguageAnalyzeEntitySentimentOperator":
+            "airflow.providers.google.cloud.operators.natural_language."
+            "CloudNaturalLanguageAnalyzeEntitySentimentOperator",
+        "CloudLanguageAnalyzeSentimentOperator":
+            "airflow.providers.google.cloud.operators.natural_language."
+            "CloudNaturalLanguageAnalyzeSentimentOperator",
+        "CloudLanguageClassifyTextOperator":
+            "airflow.providers.google.cloud.operators.natural_language."
+            "CloudNaturalLanguageClassifyTextOperator",
     },
-    'gcp_spanner_operator': {
-        'SpannerDeleteDatabaseInstanceOperator': (
-            'airflow.providers.google.cloud.operators.spanner.SpannerDeleteDatabaseInstanceOperator'
+    "gcp_spanner_operator": {
+        "SpannerDeleteDatabaseInstanceOperator": (
+            "airflow.providers.google.cloud.operators.spanner.SpannerDeleteDatabaseInstanceOperator"
         ),
-        'SpannerDeleteInstanceOperator': (
-            'airflow.providers.google.cloud.operators.spanner.SpannerDeleteInstanceOperator'
+        "SpannerDeleteInstanceOperator": (
+            "airflow.providers.google.cloud.operators.spanner.SpannerDeleteInstanceOperator"
         ),
-        'SpannerDeployDatabaseInstanceOperator': (
-            'airflow.providers.google.cloud.operators.spanner.SpannerDeployDatabaseInstanceOperator'
+        "SpannerDeployDatabaseInstanceOperator": (
+            "airflow.providers.google.cloud.operators.spanner.SpannerDeployDatabaseInstanceOperator"
         ),
-        'SpannerDeployInstanceOperator': (
-            'airflow.providers.google.cloud.operators.spanner.SpannerDeployInstanceOperator'
+        "SpannerDeployInstanceOperator": (
+            "airflow.providers.google.cloud.operators.spanner.SpannerDeployInstanceOperator"
         ),
-        'SpannerQueryDatabaseInstanceOperator': (
-            'airflow.providers.google.cloud.operators.spanner.SpannerQueryDatabaseInstanceOperator'
+        "SpannerQueryDatabaseInstanceOperator": (
+            "airflow.providers.google.cloud.operators.spanner.SpannerQueryDatabaseInstanceOperator"
         ),
-        'SpannerUpdateDatabaseInstanceOperator': (
-            'airflow.providers.google.cloud.operators.spanner.SpannerUpdateDatabaseInstanceOperator'
+        "SpannerUpdateDatabaseInstanceOperator": (
+            "airflow.providers.google.cloud.operators.spanner.SpannerUpdateDatabaseInstanceOperator"
         ),
-        'CloudSpannerInstanceDatabaseDeleteOperator': (
-            'airflow.providers.google.cloud.operators.spanner.SpannerDeleteDatabaseInstanceOperator'
+        "CloudSpannerInstanceDatabaseDeleteOperator": (
+            "airflow.providers.google.cloud.operators.spanner.SpannerDeleteDatabaseInstanceOperator"
         ),
-        'CloudSpannerInstanceDatabaseDeployOperator': (
-            'airflow.providers.google.cloud.operators.spanner.SpannerDeployDatabaseInstanceOperator'
+        "CloudSpannerInstanceDatabaseDeployOperator": (
+            "airflow.providers.google.cloud.operators.spanner.SpannerDeployDatabaseInstanceOperator"
         ),
-        'CloudSpannerInstanceDatabaseQueryOperator': (
-            'airflow.providers.google.cloud.operators.spanner.SpannerQueryDatabaseInstanceOperator'
+        "CloudSpannerInstanceDatabaseQueryOperator": (
+            "airflow.providers.google.cloud.operators.spanner.SpannerQueryDatabaseInstanceOperator"
         ),
-        'CloudSpannerInstanceDatabaseUpdateOperator': (
-            'airflow.providers.google.cloud.operators.spanner.SpannerUpdateDatabaseInstanceOperator'
+        "CloudSpannerInstanceDatabaseUpdateOperator": (
+            "airflow.providers.google.cloud.operators.spanner.SpannerUpdateDatabaseInstanceOperator"
         ),
-        'CloudSpannerInstanceDeleteOperator': (
-            'airflow.providers.google.cloud.operators.spanner.SpannerDeleteInstanceOperator'
+        "CloudSpannerInstanceDeleteOperator": (
+            "airflow.providers.google.cloud.operators.spanner.SpannerDeleteInstanceOperator"
         ),
-        'CloudSpannerInstanceDeployOperator': (
-            'airflow.providers.google.cloud.operators.spanner.SpannerDeployInstanceOperator'
+        "CloudSpannerInstanceDeployOperator": (
+            "airflow.providers.google.cloud.operators.spanner.SpannerDeployInstanceOperator"
         ),
     },
-    'gcp_speech_to_text_operator': {
-        'CloudSpeechToTextRecognizeSpeechOperator': (
-            'airflow.providers.google.cloud.operators.speech_to_text.CloudSpeechToTextRecognizeSpeechOperator'
+    "gcp_speech_to_text_operator": {
+        "CloudSpeechToTextRecognizeSpeechOperator": (
+            "airflow.providers.google.cloud.operators.speech_to_text.CloudSpeechToTextRecognizeSpeechOperator"
         ),
-        'GcpSpeechToTextRecognizeSpeechOperator': (
-            'airflow.providers.google.cloud.operators.speech_to_text.CloudSpeechToTextRecognizeSpeechOperator'
+        "GcpSpeechToTextRecognizeSpeechOperator": (
+            "airflow.providers.google.cloud.operators.speech_to_text.CloudSpeechToTextRecognizeSpeechOperator"
         ),
     },
-    'gcp_sql_operator': {
-        'CloudSQLBaseOperator': 'airflow.providers.google.cloud.operators.cloud_sql.CloudSQLBaseOperator',
-        'CloudSQLCreateInstanceDatabaseOperator': (
-            'airflow.providers.google.cloud.operators.cloud_sql.CloudSQLCreateInstanceDatabaseOperator'
+    "gcp_sql_operator": {
+        "CloudSQLBaseOperator": "airflow.providers.google.cloud.operators.cloud_sql.CloudSQLBaseOperator",
+        "CloudSQLCreateInstanceDatabaseOperator": (
+            "airflow.providers.google.cloud.operators.cloud_sql.CloudSQLCreateInstanceDatabaseOperator"
         ),
-        'CloudSQLCreateInstanceOperator': (
-            'airflow.providers.google.cloud.operators.cloud_sql.CloudSQLCreateInstanceOperator'
+        "CloudSQLCreateInstanceOperator": (
+            "airflow.providers.google.cloud.operators.cloud_sql.CloudSQLCreateInstanceOperator"
         ),
-        'CloudSQLDeleteInstanceDatabaseOperator': (
-            'airflow.providers.google.cloud.operators.cloud_sql.CloudSQLDeleteInstanceDatabaseOperator'
+        "CloudSQLDeleteInstanceDatabaseOperator": (
+            "airflow.providers.google.cloud.operators.cloud_sql.CloudSQLDeleteInstanceDatabaseOperator"
         ),
-        'CloudSQLDeleteInstanceOperator': (
-            'airflow.providers.google.cloud.operators.cloud_sql.CloudSQLDeleteInstanceOperator'
+        "CloudSQLDeleteInstanceOperator": (
+            "airflow.providers.google.cloud.operators.cloud_sql.CloudSQLDeleteInstanceOperator"
         ),
-        'CloudSQLExecuteQueryOperator': (
-            'airflow.providers.google.cloud.operators.cloud_sql.CloudSQLExecuteQueryOperator'
+        "CloudSQLExecuteQueryOperator": (
+            "airflow.providers.google.cloud.operators.cloud_sql.CloudSQLExecuteQueryOperator"
         ),
-        'CloudSQLExportInstanceOperator': (
-            'airflow.providers.google.cloud.operators.cloud_sql.CloudSQLExportInstanceOperator'
+        "CloudSQLExportInstanceOperator": (
+            "airflow.providers.google.cloud.operators.cloud_sql.CloudSQLExportInstanceOperator"
         ),
-        'CloudSQLImportInstanceOperator': (
-            'airflow.providers.google.cloud.operators.cloud_sql.CloudSQLImportInstanceOperator'
+        "CloudSQLImportInstanceOperator": (
+            "airflow.providers.google.cloud.operators.cloud_sql.CloudSQLImportInstanceOperator"
         ),
-        'CloudSQLInstancePatchOperator': (
-            'airflow.providers.google.cloud.operators.cloud_sql.CloudSQLInstancePatchOperator'
+        "CloudSQLInstancePatchOperator": (
+            "airflow.providers.google.cloud.operators.cloud_sql.CloudSQLInstancePatchOperator"
         ),
-        'CloudSQLPatchInstanceDatabaseOperator': (
-            'airflow.providers.google.cloud.operators.cloud_sql.CloudSQLPatchInstanceDatabaseOperator'
+        "CloudSQLPatchInstanceDatabaseOperator": (
+            "airflow.providers.google.cloud.operators.cloud_sql.CloudSQLPatchInstanceDatabaseOperator"
         ),
-        'CloudSqlBaseOperator': 'airflow.providers.google.cloud.operators.cloud_sql.CloudSQLBaseOperator',
-        'CloudSqlInstanceCreateOperator': (
-            'airflow.providers.google.cloud.operators.cloud_sql.CloudSQLCreateInstanceOperator'
+        "CloudSqlBaseOperator": "airflow.providers.google.cloud.operators.cloud_sql.CloudSQLBaseOperator",
+        "CloudSqlInstanceCreateOperator": (
+            "airflow.providers.google.cloud.operators.cloud_sql.CloudSQLCreateInstanceOperator"
         ),
-        'CloudSqlInstanceDatabaseCreateOperator': (
-            'airflow.providers.google.cloud.operators.cloud_sql.CloudSQLCreateInstanceDatabaseOperator'
+        "CloudSqlInstanceDatabaseCreateOperator": (
+            "airflow.providers.google.cloud.operators.cloud_sql.CloudSQLCreateInstanceDatabaseOperator"
         ),
-        'CloudSqlInstanceDatabaseDeleteOperator': (
-            'airflow.providers.google.cloud.operators.cloud_sql.CloudSQLDeleteInstanceDatabaseOperator'
+        "CloudSqlInstanceDatabaseDeleteOperator": (
+            "airflow.providers.google.cloud.operators.cloud_sql.CloudSQLDeleteInstanceDatabaseOperator"
         ),
-        'CloudSqlInstanceDatabasePatchOperator': (
-            'airflow.providers.google.cloud.operators.cloud_sql.CloudSQLPatchInstanceDatabaseOperator'
+        "CloudSqlInstanceDatabasePatchOperator": (
+            "airflow.providers.google.cloud.operators.cloud_sql.CloudSQLPatchInstanceDatabaseOperator"
         ),
-        'CloudSqlInstanceDeleteOperator': (
-            'airflow.providers.google.cloud.operators.cloud_sql.CloudSQLDeleteInstanceOperator'
+        "CloudSqlInstanceDeleteOperator": (
+            "airflow.providers.google.cloud.operators.cloud_sql.CloudSQLDeleteInstanceOperator"
         ),
-        'CloudSqlInstanceExportOperator': (
-            'airflow.providers.google.cloud.operators.cloud_sql.CloudSQLExportInstanceOperator'
+        "CloudSqlInstanceExportOperator": (
+            "airflow.providers.google.cloud.operators.cloud_sql.CloudSQLExportInstanceOperator"
         ),
-        'CloudSqlInstanceImportOperator': (
-            'airflow.providers.google.cloud.operators.cloud_sql.CloudSQLImportInstanceOperator'
+        "CloudSqlInstanceImportOperator": (
+            "airflow.providers.google.cloud.operators.cloud_sql.CloudSQLImportInstanceOperator"
         ),
-        'CloudSqlInstancePatchOperator': (
-            'airflow.providers.google.cloud.operators.cloud_sql.CloudSQLInstancePatchOperator'
+        "CloudSqlInstancePatchOperator": (
+            "airflow.providers.google.cloud.operators.cloud_sql.CloudSQLInstancePatchOperator"
         ),
-        'CloudSqlQueryOperator': (
-            'airflow.providers.google.cloud.operators.cloud_sql.CloudSQLExecuteQueryOperator'
+        "CloudSqlQueryOperator": (
+            "airflow.providers.google.cloud.operators.cloud_sql.CloudSQLExecuteQueryOperator"
         ),
     },
-    'gcp_tasks_operator': {
-        'CloudTasksQueueCreateOperator': (
-            'airflow.providers.google.cloud.operators.tasks.CloudTasksQueueCreateOperator'
+    "gcp_tasks_operator": {
+        "CloudTasksQueueCreateOperator": (
+            "airflow.providers.google.cloud.operators.tasks.CloudTasksQueueCreateOperator"
         ),
-        'CloudTasksQueueDeleteOperator': (
-            'airflow.providers.google.cloud.operators.tasks.CloudTasksQueueDeleteOperator'
-        ),
-        'CloudTasksQueueGetOperator': (
-            'airflow.providers.google.cloud.operators.tasks.CloudTasksQueueGetOperator'
-        ),
-        'CloudTasksQueuePauseOperator': (
-            'airflow.providers.google.cloud.operators.tasks.CloudTasksQueuePauseOperator'
-        ),
-        'CloudTasksQueuePurgeOperator': (
-            'airflow.providers.google.cloud.operators.tasks.CloudTasksQueuePurgeOperator'
-        ),
-        'CloudTasksQueueResumeOperator': (
-            'airflow.providers.google.cloud.operators.tasks.CloudTasksQueueResumeOperator'
-        ),
-        'CloudTasksQueuesListOperator': (
-            'airflow.providers.google.cloud.operators.tasks.CloudTasksQueuesListOperator'
-        ),
-        'CloudTasksQueueUpdateOperator': (
-            'airflow.providers.google.cloud.operators.tasks.CloudTasksQueueUpdateOperator'
-        ),
-        'CloudTasksTaskCreateOperator': (
-            'airflow.providers.google.cloud.operators.tasks.CloudTasksTaskCreateOperator'
-        ),
-        'CloudTasksTaskDeleteOperator': (
-            'airflow.providers.google.cloud.operators.tasks.CloudTasksTaskDeleteOperator'
-        ),
-        'CloudTasksTaskGetOperator': (
-            'airflow.providers.google.cloud.operators.tasks.CloudTasksTaskGetOperator'
-        ),
-        'CloudTasksTaskRunOperator': (
-            'airflow.providers.google.cloud.operators.tasks.CloudTasksTaskRunOperator'
-        ),
-        'CloudTasksTasksListOperator': (
-            'airflow.providers.google.cloud.operators.tasks.CloudTasksTasksListOperator'
-        ),
-    },
-    'gcp_text_to_speech_operator': {
-        'CloudTextToSpeechSynthesizeOperator': (
-            'airflow.providers.google.cloud.operators.text_to_speech.CloudTextToSpeechSynthesizeOperator'
-        ),
-        'GcpTextToSpeechSynthesizeOperator': (
-            'airflow.providers.google.cloud.operators.text_to_speech.CloudTextToSpeechSynthesizeOperator'
-        ),
-    },
-    'gcp_transfer_operator': {
-        'CloudDataTransferServiceCancelOperationOperator':
-            'airflow.providers.google.cloud.operators.cloud_storage_transfer_service.'
-            'CloudDataTransferServiceCancelOperationOperator',
-        'CloudDataTransferServiceCreateJobOperator':
-            'airflow.providers.google.cloud.operators.cloud_storage_transfer_service.'
-            'CloudDataTransferServiceCreateJobOperator',
-        'CloudDataTransferServiceDeleteJobOperator':
-            'airflow.providers.google.cloud.operators.cloud_storage_transfer_service.'
-            'CloudDataTransferServiceDeleteJobOperator',
-        'CloudDataTransferServiceGCSToGCSOperator':
-            'airflow.providers.google.cloud.operators.cloud_storage_transfer_service.'
-            'CloudDataTransferServiceGCSToGCSOperator',
-        'CloudDataTransferServiceGetOperationOperator':
-            'airflow.providers.google.cloud.operators.cloud_storage_transfer_service.'
-            'CloudDataTransferServiceGetOperationOperator',
-        'CloudDataTransferServiceListOperationsOperator':
-            'airflow.providers.google.cloud.operators.cloud_storage_transfer_service.'
-            'CloudDataTransferServiceListOperationsOperator',
-        'CloudDataTransferServicePauseOperationOperator':
-            'airflow.providers.google.cloud.operators.cloud_storage_transfer_service.'
-            'CloudDataTransferServicePauseOperationOperator',
-        'CloudDataTransferServiceResumeOperationOperator':
-            'airflow.providers.google.cloud.operators.cloud_storage_transfer_service.'
-            'CloudDataTransferServiceResumeOperationOperator',
-        'CloudDataTransferServiceS3ToGCSOperator':
-            'airflow.providers.google.cloud.operators.cloud_storage_transfer_service.'
-            'CloudDataTransferServiceS3ToGCSOperator',
-        'CloudDataTransferServiceUpdateJobOperator':
-            'airflow.providers.google.cloud.operators.cloud_storage_transfer_service.'
-            'CloudDataTransferServiceUpdateJobOperator',
-        'GcpTransferServiceJobCreateOperator':
-            'airflow.providers.google.cloud.operators.cloud_storage_transfer_service.'
-            'CloudDataTransferServiceCreateJobOperator',
-        'GcpTransferServiceJobDeleteOperator':
-            'airflow.providers.google.cloud.operators.cloud_storage_transfer_service.'
-            'CloudDataTransferServiceDeleteJobOperator',
-        'GcpTransferServiceJobUpdateOperator':
-            'airflow.providers.google.cloud.operators.cloud_storage_transfer_service.'
-            'CloudDataTransferServiceUpdateJobOperator',
-        'GcpTransferServiceOperationCancelOperator':
-            'airflow.providers.google.cloud.operators.cloud_storage_transfer_service.'
-            'CloudDataTransferServiceCancelOperationOperator',
-        'GcpTransferServiceOperationGetOperator':
-            'airflow.providers.google.cloud.operators.cloud_storage_transfer_service.'
-            'CloudDataTransferServiceGetOperationOperator',
-        'GcpTransferServiceOperationPauseOperator':
-            'airflow.providers.google.cloud.operators.cloud_storage_transfer_service.'
-            'CloudDataTransferServicePauseOperationOperator',
-        'GcpTransferServiceOperationResumeOperator':
-            'airflow.providers.google.cloud.operators.cloud_storage_transfer_service.'
-            'CloudDataTransferServiceResumeOperationOperator',
-        'GcpTransferServiceOperationsListOperator':
-            'airflow.providers.google.cloud.operators.cloud_storage_transfer_service.'
-            'CloudDataTransferServiceListOperationsOperator',
-        'GoogleCloudStorageToGoogleCloudStorageTransferOperator':
-            'airflow.providers.google.cloud.operators.cloud_storage_transfer_service.'
-            'CloudDataTransferServiceGCSToGCSOperator',
-        'S3ToGoogleCloudStorageTransferOperator':
-            'airflow.providers.google.cloud.operators.cloud_storage_transfer_service.'
-            'CloudDataTransferServiceS3ToGCSOperator',
-    },
-    'gcp_translate_operator': {
-        'CloudTranslateTextOperator': (
-            'airflow.providers.google.cloud.operators.translate.CloudTranslateTextOperator'
-        ),
-    },
-    'gcp_translate_speech_operator': {
-        'CloudTranslateSpeechOperator': (
-            'airflow.providers.google.cloud.operators.translate_speech.CloudTranslateSpeechOperator'
-        ),
-        'GcpTranslateSpeechOperator': (
-            'airflow.providers.google.cloud.operators.translate_speech.CloudTranslateSpeechOperator'
-        ),
-    },
-    'gcp_video_intelligence_operator': {
-        'CloudVideoIntelligenceDetectVideoExplicitContentOperator':
-            'airflow.providers.google.cloud.operators.video_intelligence.'
-            'CloudVideoIntelligenceDetectVideoExplicitContentOperator',
-        'CloudVideoIntelligenceDetectVideoLabelsOperator':
-            'airflow.providers.google.cloud.operators.video_intelligence.'
-            'CloudVideoIntelligenceDetectVideoLabelsOperator',
-        'CloudVideoIntelligenceDetectVideoShotsOperator':
-            'airflow.providers.google.cloud.operators.video_intelligence.'
-            'CloudVideoIntelligenceDetectVideoShotsOperator',
-    },
-    'gcp_vision_operator': {
-        'CloudVisionAddProductToProductSetOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionAddProductToProductSetOperator'
-        ),
-        'CloudVisionCreateProductOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionCreateProductOperator'
-        ),
-        'CloudVisionCreateProductSetOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionCreateProductSetOperator'
-        ),
-        'CloudVisionCreateReferenceImageOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionCreateReferenceImageOperator'
-        ),
-        'CloudVisionDeleteProductOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionDeleteProductOperator'
-        ),
-        'CloudVisionDeleteProductSetOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionDeleteProductSetOperator'
-        ),
-        'CloudVisionDetectImageLabelsOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionDetectImageLabelsOperator'
-        ),
-        'CloudVisionDetectImageSafeSearchOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionDetectImageSafeSearchOperator'
-        ),
-        'CloudVisionDetectTextOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionDetectTextOperator'
+        "CloudTasksQueueDeleteOperator": (
+            "airflow.providers.google.cloud.operators.tasks.CloudTasksQueueDeleteOperator"
+        ),
+        "CloudTasksQueueGetOperator": (
+            "airflow.providers.google.cloud.operators.tasks.CloudTasksQueueGetOperator"
+        ),
+        "CloudTasksQueuePauseOperator": (
+            "airflow.providers.google.cloud.operators.tasks.CloudTasksQueuePauseOperator"
+        ),
+        "CloudTasksQueuePurgeOperator": (
+            "airflow.providers.google.cloud.operators.tasks.CloudTasksQueuePurgeOperator"
+        ),
+        "CloudTasksQueueResumeOperator": (
+            "airflow.providers.google.cloud.operators.tasks.CloudTasksQueueResumeOperator"
+        ),
+        "CloudTasksQueuesListOperator": (
+            "airflow.providers.google.cloud.operators.tasks.CloudTasksQueuesListOperator"
+        ),
+        "CloudTasksQueueUpdateOperator": (
+            "airflow.providers.google.cloud.operators.tasks.CloudTasksQueueUpdateOperator"
+        ),
+        "CloudTasksTaskCreateOperator": (
+            "airflow.providers.google.cloud.operators.tasks.CloudTasksTaskCreateOperator"
+        ),
+        "CloudTasksTaskDeleteOperator": (
+            "airflow.providers.google.cloud.operators.tasks.CloudTasksTaskDeleteOperator"
+        ),
+        "CloudTasksTaskGetOperator": (
+            "airflow.providers.google.cloud.operators.tasks.CloudTasksTaskGetOperator"
+        ),
+        "CloudTasksTaskRunOperator": (
+            "airflow.providers.google.cloud.operators.tasks.CloudTasksTaskRunOperator"
+        ),
+        "CloudTasksTasksListOperator": (
+            "airflow.providers.google.cloud.operators.tasks.CloudTasksTasksListOperator"
+        ),
+    },
+    "gcp_text_to_speech_operator": {
+        "CloudTextToSpeechSynthesizeOperator": (
+            "airflow.providers.google.cloud.operators.text_to_speech.CloudTextToSpeechSynthesizeOperator"
+        ),
+        "GcpTextToSpeechSynthesizeOperator": (
+            "airflow.providers.google.cloud.operators.text_to_speech.CloudTextToSpeechSynthesizeOperator"
+        ),
+    },
+    "gcp_transfer_operator": {
+        "CloudDataTransferServiceCancelOperationOperator":
+            "airflow.providers.google.cloud.operators.cloud_storage_transfer_service."
+            "CloudDataTransferServiceCancelOperationOperator",
+        "CloudDataTransferServiceCreateJobOperator":
+            "airflow.providers.google.cloud.operators.cloud_storage_transfer_service."
+            "CloudDataTransferServiceCreateJobOperator",
+        "CloudDataTransferServiceDeleteJobOperator":
+            "airflow.providers.google.cloud.operators.cloud_storage_transfer_service."
+            "CloudDataTransferServiceDeleteJobOperator",
+        "CloudDataTransferServiceGCSToGCSOperator":
+            "airflow.providers.google.cloud.operators.cloud_storage_transfer_service."
+            "CloudDataTransferServiceGCSToGCSOperator",
+        "CloudDataTransferServiceGetOperationOperator":
+            "airflow.providers.google.cloud.operators.cloud_storage_transfer_service."
+            "CloudDataTransferServiceGetOperationOperator",
+        "CloudDataTransferServiceListOperationsOperator":
+            "airflow.providers.google.cloud.operators.cloud_storage_transfer_service."
+            "CloudDataTransferServiceListOperationsOperator",
+        "CloudDataTransferServicePauseOperationOperator":
+            "airflow.providers.google.cloud.operators.cloud_storage_transfer_service."
+            "CloudDataTransferServicePauseOperationOperator",
+        "CloudDataTransferServiceResumeOperationOperator":
+            "airflow.providers.google.cloud.operators.cloud_storage_transfer_service."
+            "CloudDataTransferServiceResumeOperationOperator",
+        "CloudDataTransferServiceS3ToGCSOperator":
+            "airflow.providers.google.cloud.operators.cloud_storage_transfer_service."
+            "CloudDataTransferServiceS3ToGCSOperator",
+        "CloudDataTransferServiceUpdateJobOperator":
+            "airflow.providers.google.cloud.operators.cloud_storage_transfer_service."
+            "CloudDataTransferServiceUpdateJobOperator",
+        "GcpTransferServiceJobCreateOperator":
+            "airflow.providers.google.cloud.operators.cloud_storage_transfer_service."
+            "CloudDataTransferServiceCreateJobOperator",
+        "GcpTransferServiceJobDeleteOperator":
+            "airflow.providers.google.cloud.operators.cloud_storage_transfer_service."
+            "CloudDataTransferServiceDeleteJobOperator",
+        "GcpTransferServiceJobUpdateOperator":
+            "airflow.providers.google.cloud.operators.cloud_storage_transfer_service."
+            "CloudDataTransferServiceUpdateJobOperator",
+        "GcpTransferServiceOperationCancelOperator":
+            "airflow.providers.google.cloud.operators.cloud_storage_transfer_service."
+            "CloudDataTransferServiceCancelOperationOperator",
+        "GcpTransferServiceOperationGetOperator":
+            "airflow.providers.google.cloud.operators.cloud_storage_transfer_service."
+            "CloudDataTransferServiceGetOperationOperator",
+        "GcpTransferServiceOperationPauseOperator":
+            "airflow.providers.google.cloud.operators.cloud_storage_transfer_service."
+            "CloudDataTransferServicePauseOperationOperator",
+        "GcpTransferServiceOperationResumeOperator":
+            "airflow.providers.google.cloud.operators.cloud_storage_transfer_service."
+            "CloudDataTransferServiceResumeOperationOperator",
+        "GcpTransferServiceOperationsListOperator":
+            "airflow.providers.google.cloud.operators.cloud_storage_transfer_service."
+            "CloudDataTransferServiceListOperationsOperator",
+        "GoogleCloudStorageToGoogleCloudStorageTransferOperator":
+            "airflow.providers.google.cloud.operators.cloud_storage_transfer_service."
+            "CloudDataTransferServiceGCSToGCSOperator",
+        "S3ToGoogleCloudStorageTransferOperator":
+            "airflow.providers.google.cloud.operators.cloud_storage_transfer_service."
+            "CloudDataTransferServiceS3ToGCSOperator",
+    },
+    "gcp_translate_operator": {
+        "CloudTranslateTextOperator": (
+            "airflow.providers.google.cloud.operators.translate.CloudTranslateTextOperator"
+        ),
+    },
+    "gcp_translate_speech_operator": {
+        "CloudTranslateSpeechOperator": (
+            "airflow.providers.google.cloud.operators.translate_speech.CloudTranslateSpeechOperator"
+        ),
+        "GcpTranslateSpeechOperator": (
+            "airflow.providers.google.cloud.operators.translate_speech.CloudTranslateSpeechOperator"
+        ),
+    },
+    "gcp_video_intelligence_operator": {
+        "CloudVideoIntelligenceDetectVideoExplicitContentOperator":
+            "airflow.providers.google.cloud.operators.video_intelligence."
+            "CloudVideoIntelligenceDetectVideoExplicitContentOperator",
+        "CloudVideoIntelligenceDetectVideoLabelsOperator":
+            "airflow.providers.google.cloud.operators.video_intelligence."
+            "CloudVideoIntelligenceDetectVideoLabelsOperator",
+        "CloudVideoIntelligenceDetectVideoShotsOperator":
+            "airflow.providers.google.cloud.operators.video_intelligence."
+            "CloudVideoIntelligenceDetectVideoShotsOperator",
+    },
+    "gcp_vision_operator": {
+        "CloudVisionAddProductToProductSetOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionAddProductToProductSetOperator"
+        ),
+        "CloudVisionCreateProductOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionCreateProductOperator"
+        ),
+        "CloudVisionCreateProductSetOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionCreateProductSetOperator"
+        ),
+        "CloudVisionCreateReferenceImageOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionCreateReferenceImageOperator"
+        ),
+        "CloudVisionDeleteProductOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionDeleteProductOperator"
+        ),
+        "CloudVisionDeleteProductSetOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionDeleteProductSetOperator"
+        ),
+        "CloudVisionDetectImageLabelsOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionDetectImageLabelsOperator"
+        ),
+        "CloudVisionDetectImageSafeSearchOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionDetectImageSafeSearchOperator"
+        ),
+        "CloudVisionDetectTextOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionDetectTextOperator"
         ),
-        'CloudVisionGetProductOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionGetProductOperator'
+        "CloudVisionGetProductOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionGetProductOperator"
         ),
-        'CloudVisionGetProductSetOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionGetProductSetOperator'
+        "CloudVisionGetProductSetOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionGetProductSetOperator"
         ),
-        'CloudVisionImageAnnotateOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionImageAnnotateOperator'
+        "CloudVisionImageAnnotateOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionImageAnnotateOperator"
         ),
-        'CloudVisionRemoveProductFromProductSetOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionRemoveProductFromProductSetOperator'
+        "CloudVisionRemoveProductFromProductSetOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionRemoveProductFromProductSetOperator"
         ),
-        'CloudVisionTextDetectOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionTextDetectOperator'
+        "CloudVisionTextDetectOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionTextDetectOperator"
         ),
-        'CloudVisionUpdateProductOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionUpdateProductOperator'
+        "CloudVisionUpdateProductOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionUpdateProductOperator"
         ),
-        'CloudVisionUpdateProductSetOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionUpdateProductSetOperator'
+        "CloudVisionUpdateProductSetOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionUpdateProductSetOperator"
         ),
-        'CloudVisionAnnotateImageOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionImageAnnotateOperator'
+        "CloudVisionAnnotateImageOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionImageAnnotateOperator"
         ),
-        'CloudVisionDetectDocumentTextOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionTextDetectOperator'
+        "CloudVisionDetectDocumentTextOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionTextDetectOperator"
         ),
-        'CloudVisionProductCreateOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionCreateProductOperator'
+        "CloudVisionProductCreateOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionCreateProductOperator"
         ),
-        'CloudVisionProductDeleteOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionDeleteProductOperator'
+        "CloudVisionProductDeleteOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionDeleteProductOperator"
         ),
-        'CloudVisionProductGetOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionGetProductOperator'
+        "CloudVisionProductGetOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionGetProductOperator"
         ),
-        'CloudVisionProductSetCreateOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionCreateProductSetOperator'
+        "CloudVisionProductSetCreateOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionCreateProductSetOperator"
         ),
-        'CloudVisionProductSetDeleteOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionDeleteProductSetOperator'
+        "CloudVisionProductSetDeleteOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionDeleteProductSetOperator"
         ),
-        'CloudVisionProductSetGetOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionGetProductSetOperator'
+        "CloudVisionProductSetGetOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionGetProductSetOperator"
         ),
-        'CloudVisionProductSetUpdateOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionUpdateProductSetOperator'
+        "CloudVisionProductSetUpdateOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionUpdateProductSetOperator"
         ),
-        'CloudVisionProductUpdateOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionUpdateProductOperator'
+        "CloudVisionProductUpdateOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionUpdateProductOperator"
         ),
-        'CloudVisionReferenceImageCreateOperator': (
-            'airflow.providers.google.cloud.operators.vision.CloudVisionCreateReferenceImageOperator'
+        "CloudVisionReferenceImageCreateOperator": (
+            "airflow.providers.google.cloud.operators.vision.CloudVisionCreateReferenceImageOperator"
         ),
     },
-    'gcs_acl_operator': {
-        'GCSBucketCreateAclEntryOperator': (
-            'airflow.providers.google.cloud.operators.gcs.GCSBucketCreateAclEntryOperator'
+    "gcs_acl_operator": {
+        "GCSBucketCreateAclEntryOperator": (
+            "airflow.providers.google.cloud.operators.gcs.GCSBucketCreateAclEntryOperator"
         ),
-        'GCSObjectCreateAclEntryOperator': (
-            'airflow.providers.google.cloud.operators.gcs.GCSObjectCreateAclEntryOperator'
+        "GCSObjectCreateAclEntryOperator": (
+            "airflow.providers.google.cloud.operators.gcs.GCSObjectCreateAclEntryOperator"
         ),
-        'GoogleCloudStorageBucketCreateAclEntryOperator': (
-            'airflow.providers.google.cloud.operators.gcs.GCSBucketCreateAclEntryOperator'
+        "GoogleCloudStorageBucketCreateAclEntryOperator": (
+            "airflow.providers.google.cloud.operators.gcs.GCSBucketCreateAclEntryOperator"
         ),
-        'GoogleCloudStorageObjectCreateAclEntryOperator': (
-            'airflow.providers.google.cloud.operators.gcs.GCSObjectCreateAclEntryOperator'
+        "GoogleCloudStorageObjectCreateAclEntryOperator": (
+            "airflow.providers.google.cloud.operators.gcs.GCSObjectCreateAclEntryOperator"
         ),
     },
-    'gcs_delete_operator': {
-        'GCSDeleteObjectsOperator': 'airflow.providers.google.cloud.operators.gcs.GCSDeleteObjectsOperator',
-        'GoogleCloudStorageDeleteOperator': (
-            'airflow.providers.google.cloud.operators.gcs.GCSDeleteObjectsOperator'
+    "gcs_delete_operator": {
+        "GCSDeleteObjectsOperator": "airflow.providers.google.cloud.operators.gcs.GCSDeleteObjectsOperator",
+        "GoogleCloudStorageDeleteOperator": (
+            "airflow.providers.google.cloud.operators.gcs.GCSDeleteObjectsOperator"
         ),
     },
-    'gcs_download_operator': {
-        'GCSToLocalFilesystemOperator': (
-            'airflow.providers.google.cloud.transfers.gcs_to_local.GCSToLocalFilesystemOperator'
+    "gcs_download_operator": {
+        "GCSToLocalFilesystemOperator": (
+            "airflow.providers.google.cloud.transfers.gcs_to_local.GCSToLocalFilesystemOperator"
         ),
-        'GoogleCloudStorageDownloadOperator': (
-            'airflow.providers.google.cloud.transfers.gcs_to_local.GCSToLocalFilesystemOperator'
+        "GoogleCloudStorageDownloadOperator": (
+            "airflow.providers.google.cloud.transfers.gcs_to_local.GCSToLocalFilesystemOperator"
         ),
     },
-    'gcs_list_operator': {
-        'GCSListObjectsOperator': 'airflow.providers.google.cloud.operators.gcs.GCSListObjectsOperator',
-        'GoogleCloudStorageListOperator': (
-            'airflow.providers.google.cloud.operators.gcs.GCSListObjectsOperator'
+    "gcs_list_operator": {
+        "GCSListObjectsOperator": "airflow.providers.google.cloud.operators.gcs.GCSListObjectsOperator",
+        "GoogleCloudStorageListOperator": (
+            "airflow.providers.google.cloud.operators.gcs.GCSListObjectsOperator"
         ),
     },
-    'gcs_operator': {
-        'GCSCreateBucketOperator': 'airflow.providers.google.cloud.operators.gcs.GCSCreateBucketOperator',
-        'GoogleCloudStorageCreateBucketOperator': (
-            'airflow.providers.google.cloud.operators.gcs.GCSCreateBucketOperator'
+    "gcs_operator": {
+        "GCSCreateBucketOperator": "airflow.providers.google.cloud.operators.gcs.GCSCreateBucketOperator",
+        "GoogleCloudStorageCreateBucketOperator": (
+            "airflow.providers.google.cloud.operators.gcs.GCSCreateBucketOperator"
         ),
     },
-    'gcs_to_bq': {
-        'GCSToBigQueryOperator': (
-            'airflow.providers.google.cloud.transfers.gcs_to_bigquery.GCSToBigQueryOperator'
+    "gcs_to_bq": {
+        "GCSToBigQueryOperator": (
+            "airflow.providers.google.cloud.transfers.gcs_to_bigquery.GCSToBigQueryOperator"
         ),
-        'GoogleCloudStorageToBigQueryOperator': (
-            'airflow.providers.google.cloud.transfers.gcs_to_bigquery.GCSToBigQueryOperator'
+        "GoogleCloudStorageToBigQueryOperator": (
+            "airflow.providers.google.cloud.transfers.gcs_to_bigquery.GCSToBigQueryOperator"
         ),
     },
-    'gcs_to_gcs': {
-        'GCSToGCSOperator': 'airflow.providers.google.cloud.transfers.gcs_to_gcs.GCSToGCSOperator',
-        'GoogleCloudStorageToGoogleCloudStorageOperator': (
-            'airflow.providers.google.cloud.transfers.gcs_to_gcs.GCSToGCSOperator'
+    "gcs_to_gcs": {
+        "GCSToGCSOperator": "airflow.providers.google.cloud.transfers.gcs_to_gcs.GCSToGCSOperator",
+        "GoogleCloudStorageToGoogleCloudStorageOperator": (
+            "airflow.providers.google.cloud.transfers.gcs_to_gcs.GCSToGCSOperator"
         ),
     },
-    'gcs_to_gdrive_operator': {
-        'GCSToGoogleDriveOperator': (
-            'airflow.providers.google.suite.transfers.gcs_to_gdrive.GCSToGoogleDriveOperator'
+    "gcs_to_gdrive_operator": {
+        "GCSToGoogleDriveOperator": (
+            "airflow.providers.google.suite.transfers.gcs_to_gdrive.GCSToGoogleDriveOperator"
         ),
     },
-    'gcs_to_s3': {
-        'GCSToS3Operator': 'airflow.providers.amazon.aws.transfers.gcs_to_s3.GCSToS3Operator',
-        'GoogleCloudStorageToS3Operator': 'airflow.providers.amazon.aws.transfers.gcs_to_s3.GCSToS3Operator',
+    "gcs_to_s3": {
+        "GCSToS3Operator": "airflow.providers.amazon.aws.transfers.gcs_to_s3.GCSToS3Operator",
+        "GoogleCloudStorageToS3Operator": "airflow.providers.amazon.aws.transfers.gcs_to_s3.GCSToS3Operator",
     },
-    'grpc_operator': {
-        'GrpcOperator': 'airflow.providers.grpc.operators.grpc.GrpcOperator',
+    "grpc_operator": {
+        "GrpcOperator": "airflow.providers.grpc.operators.grpc.GrpcOperator",
     },
-    'hive_to_dynamodb': {
-        'HiveToDynamoDBOperator': (
-            'airflow.providers.amazon.aws.transfers.hive_to_dynamodb.HiveToDynamoDBOperator'
+    "hive_to_dynamodb": {
+        "HiveToDynamoDBOperator": (
+            "airflow.providers.amazon.aws.transfers.hive_to_dynamodb.HiveToDynamoDBOperator"
         ),
     },
-    'imap_attachment_to_s3_operator': {
-        'ImapAttachmentToS3Operator': (
-            'airflow.providers.amazon.aws.transfers.imap_attachment_to_s3.ImapAttachmentToS3Operator'
+    "imap_attachment_to_s3_operator": {
+        "ImapAttachmentToS3Operator": (
+            "airflow.providers.amazon.aws.transfers.imap_attachment_to_s3.ImapAttachmentToS3Operator"
         ),
     },
-    'jenkins_job_trigger_operator': {
-        'JenkinsJobTriggerOperator': (
-            'airflow.providers.jenkins.operators.jenkins_job_trigger.JenkinsJobTriggerOperator'
+    "jenkins_job_trigger_operator": {
+        "JenkinsJobTriggerOperator": (
+            "airflow.providers.jenkins.operators.jenkins_job_trigger.JenkinsJobTriggerOperator"
         ),
     },
-    'jira_operator': {
-        'JiraOperator': 'airflow.providers.atlassian.jira.operators.jira.JiraOperator',
+    "jira_operator": {
+        "JiraOperator": "airflow.providers.atlassian.jira.operators.jira.JiraOperator",
     },
-    'kubernetes_pod_operator': {
-        'KubernetesPodOperator': (
-            'airflow.providers.cncf.kubernetes.operators.pod.KubernetesPodOperator'
+    "kubernetes_pod_operator": {
+        "KubernetesPodOperator": (
+            "airflow.providers.cncf.kubernetes.operators.pod.KubernetesPodOperator"
         ),
     },
-    'mlengine_operator': {
-        'MLEngineManageModelOperator': (
-            'airflow.providers.google.cloud.operators.mlengine.MLEngineManageModelOperator'
+    "mlengine_operator": {
+        "MLEngineManageModelOperator": (
+            "airflow.providers.google.cloud.operators.mlengine.MLEngineManageModelOperator"
         ),
-        'MLEngineManageVersionOperator': (
-            'airflow.providers.google.cloud.operators.mlengine.MLEngineManageVersionOperator'
+        "MLEngineManageVersionOperator": (
+            "airflow.providers.google.cloud.operators.mlengine.MLEngineManageVersionOperator"
         ),
-        'MLEngineStartBatchPredictionJobOperator': (
-            'airflow.providers.google.cloud.operators.mlengine.MLEngineStartBatchPredictionJobOperator'
+        "MLEngineStartBatchPredictionJobOperator": (
+            "airflow.providers.google.cloud.operators.mlengine.MLEngineStartBatchPredictionJobOperator"
         ),
-        'MLEngineStartTrainingJobOperator': (
-            'airflow.providers.google.cloud.operators.mlengine.MLEngineStartTrainingJobOperator'
+        "MLEngineStartTrainingJobOperator": (
+            "airflow.providers.google.cloud.operators.mlengine.MLEngineStartTrainingJobOperator"
         ),
-        'MLEngineBatchPredictionOperator': (
-            'airflow.providers.google.cloud.operators.mlengine.MLEngineStartBatchPredictionJobOperator'
+        "MLEngineBatchPredictionOperator": (
+            "airflow.providers.google.cloud.operators.mlengine.MLEngineStartBatchPredictionJobOperator"
         ),
-        'MLEngineModelOperator': (
-            'airflow.providers.google.cloud.operators.mlengine.MLEngineManageModelOperator'
+        "MLEngineModelOperator": (
+            "airflow.providers.google.cloud.operators.mlengine.MLEngineManageModelOperator"
         ),
-        'MLEngineTrainingOperator': (
-            'airflow.providers.google.cloud.operators.mlengine.MLEngineStartTrainingJobOperator'
+        "MLEngineTrainingOperator": (
+            "airflow.providers.google.cloud.operators.mlengine.MLEngineStartTrainingJobOperator"
         ),
-        'MLEngineVersionOperator': (
-            'airflow.providers.google.cloud.operators.mlengine.MLEngineManageVersionOperator'
+        "MLEngineVersionOperator": (
+            "airflow.providers.google.cloud.operators.mlengine.MLEngineManageVersionOperator"
         ),
     },
-    'mongo_to_s3': {
-        'MongoToS3Operator': 'airflow.providers.amazon.aws.transfers.mongo_to_s3.MongoToS3Operator',
+    "mongo_to_s3": {
+        "MongoToS3Operator": "airflow.providers.amazon.aws.transfers.mongo_to_s3.MongoToS3Operator",
     },
-    'mssql_to_gcs': {
-        'MSSQLToGCSOperator': 'airflow.providers.google.cloud.transfers.mssql_to_gcs.MSSQLToGCSOperator',
-        'MsSqlToGoogleCloudStorageOperator': (
-            'airflow.providers.google.cloud.transfers.mssql_to_gcs.MSSQLToGCSOperator'
+    "mssql_to_gcs": {
+        "MSSQLToGCSOperator": "airflow.providers.google.cloud.transfers.mssql_to_gcs.MSSQLToGCSOperator",
+        "MsSqlToGoogleCloudStorageOperator": (
+            "airflow.providers.google.cloud.transfers.mssql_to_gcs.MSSQLToGCSOperator"
         ),
     },
-    'mysql_to_gcs': {
-        'MySQLToGCSOperator': 'airflow.providers.google.cloud.transfers.mysql_to_gcs.MySQLToGCSOperator',
-        'MySqlToGoogleCloudStorageOperator': (
-            'airflow.providers.google.cloud.transfers.mysql_to_gcs.MySQLToGCSOperator'
+    "mysql_to_gcs": {
+        "MySQLToGCSOperator": "airflow.providers.google.cloud.transfers.mysql_to_gcs.MySQLToGCSOperator",
+        "MySqlToGoogleCloudStorageOperator": (
+            "airflow.providers.google.cloud.transfers.mysql_to_gcs.MySQLToGCSOperator"
         ),
     },
-    'opsgenie_alert_operator': {
-        'OpsgenieCreateAlertOperator': (
-            'airflow.providers.opsgenie.operators.opsgenie.OpsgenieCreateAlertOperator'
+    "opsgenie_alert_operator": {
+        "OpsgenieCreateAlertOperator": (
+            "airflow.providers.opsgenie.operators.opsgenie.OpsgenieCreateAlertOperator"
         ),
-        'OpsgenieAlertOperator': 'airflow.providers.opsgenie.operators.opsgenie.OpsgenieCreateAlertOperator',
+        "OpsgenieAlertOperator": "airflow.providers.opsgenie.operators.opsgenie.OpsgenieCreateAlertOperator",
     },
-    'oracle_to_azure_data_lake_transfer': {
-        'OracleToAzureDataLakeOperator':
-            'airflow.providers.microsoft.azure.transfers.'
-            'oracle_to_azure_data_lake.OracleToAzureDataLakeOperator',
+    "oracle_to_azure_data_lake_transfer": {
+        "OracleToAzureDataLakeOperator":
+            "airflow.providers.microsoft.azure.transfers."
+            "oracle_to_azure_data_lake.OracleToAzureDataLakeOperator",
     },
-    'oracle_to_oracle_transfer': {
-        'OracleToOracleOperator': (
-            'airflow.providers.oracle.transfers.oracle_to_oracle.OracleToOracleOperator'
+    "oracle_to_oracle_transfer": {
+        "OracleToOracleOperator": (
+            "airflow.providers.oracle.transfers.oracle_to_oracle.OracleToOracleOperator"
         ),
-        'OracleToOracleTransfer': (
-            'airflow.providers.oracle.transfers.oracle_to_oracle.OracleToOracleOperator'
+        "OracleToOracleTransfer": (
+            "airflow.providers.oracle.transfers.oracle_to_oracle.OracleToOracleOperator"
         ),
     },
-    'postgres_to_gcs_operator': {
-        'PostgresToGCSOperator': (
-            'airflow.providers.google.cloud.transfers.postgres_to_gcs.PostgresToGCSOperator'
+    "postgres_to_gcs_operator": {
+        "PostgresToGCSOperator": (
+            "airflow.providers.google.cloud.transfers.postgres_to_gcs.PostgresToGCSOperator"
         ),
-        'PostgresToGoogleCloudStorageOperator': (
-            'airflow.providers.google.cloud.transfers.postgres_to_gcs.PostgresToGCSOperator'
+        "PostgresToGoogleCloudStorageOperator": (
+            "airflow.providers.google.cloud.transfers.postgres_to_gcs.PostgresToGCSOperator"
         ),
     },
-    'pubsub_operator': {
-        'PubSubCreateSubscriptionOperator': (
-            'airflow.providers.google.cloud.operators.pubsub.PubSubCreateSubscriptionOperator'
+    "pubsub_operator": {
+        "PubSubCreateSubscriptionOperator": (
+            "airflow.providers.google.cloud.operators.pubsub.PubSubCreateSubscriptionOperator"
         ),
-        'PubSubCreateTopicOperator': (
-            'airflow.providers.google.cloud.operators.pubsub.PubSubCreateTopicOperator'
+        "PubSubCreateTopicOperator": (
+            "airflow.providers.google.cloud.operators.pubsub.PubSubCreateTopicOperator"
         ),
-        'PubSubDeleteSubscriptionOperator': (
-            'airflow.providers.google.cloud.operators.pubsub.PubSubDeleteSubscriptionOperator'
+        "PubSubDeleteSubscriptionOperator": (
+            "airflow.providers.google.cloud.operators.pubsub.PubSubDeleteSubscriptionOperator"
         ),
-        'PubSubDeleteTopicOperator': (
-            'airflow.providers.google.cloud.operators.pubsub.PubSubDeleteTopicOperator'
+        "PubSubDeleteTopicOperator": (
+            "airflow.providers.google.cloud.operators.pubsub.PubSubDeleteTopicOperator"
         ),
-        'PubSubPublishMessageOperator': (
-            'airflow.providers.google.cloud.operators.pubsub.PubSubPublishMessageOperator'
+        "PubSubPublishMessageOperator": (
+            "airflow.providers.google.cloud.operators.pubsub.PubSubPublishMessageOperator"
         ),
-        'PubSubPublishOperator': (
-            'airflow.providers.google.cloud.operators.pubsub.PubSubPublishMessageOperator'
+        "PubSubPublishOperator": (
+            "airflow.providers.google.cloud.operators.pubsub.PubSubPublishMessageOperator"
         ),
-        'PubSubSubscriptionCreateOperator': (
-            'airflow.providers.google.cloud.operators.pubsub.PubSubCreateSubscriptionOperator'
+        "PubSubSubscriptionCreateOperator": (
+            "airflow.providers.google.cloud.operators.pubsub.PubSubCreateSubscriptionOperator"
         ),
-        'PubSubSubscriptionDeleteOperator': (
-            'airflow.providers.google.cloud.operators.pubsub.PubSubDeleteSubscriptionOperator'
+        "PubSubSubscriptionDeleteOperator": (
+            "airflow.providers.google.cloud.operators.pubsub.PubSubDeleteSubscriptionOperator"
         ),
-        'PubSubTopicCreateOperator': (
-            'airflow.providers.google.cloud.operators.pubsub.PubSubCreateTopicOperator'
+        "PubSubTopicCreateOperator": (
+            "airflow.providers.google.cloud.operators.pubsub.PubSubCreateTopicOperator"
         ),
-        'PubSubTopicDeleteOperator': (
-            'airflow.providers.google.cloud.operators.pubsub.PubSubDeleteTopicOperator'
+        "PubSubTopicDeleteOperator": (
+            "airflow.providers.google.cloud.operators.pubsub.PubSubDeleteTopicOperator"
         ),
     },
-    'qubole_check_operator': {
-        'QuboleCheckOperator': 'airflow.providers.qubole.operators.qubole_check.QuboleCheckOperator',
-        'QuboleValueCheckOperator': (
-            'airflow.providers.qubole.operators.qubole_check.QuboleValueCheckOperator'
+    "qubole_check_operator": {
+        "QuboleCheckOperator": "airflow.providers.qubole.operators.qubole_check.QuboleCheckOperator",
+        "QuboleValueCheckOperator": (
+            "airflow.providers.qubole.operators.qubole_check.QuboleValueCheckOperator"
         ),
     },
-    'qubole_operator': {
-        'QuboleOperator': 'airflow.providers.qubole.operators.qubole.QuboleOperator',
+    "qubole_operator": {
+        "QuboleOperator": "airflow.providers.qubole.operators.qubole.QuboleOperator",
     },
-    'redis_publish_operator': {
-        'RedisPublishOperator': 'airflow.providers.redis.operators.redis_publish.RedisPublishOperator',
+    "redis_publish_operator": {
+        "RedisPublishOperator": "airflow.providers.redis.operators.redis_publish.RedisPublishOperator",
     },
-    's3_to_gcs_operator': {
-        'S3ToGCSOperator': 'airflow.providers.google.cloud.transfers.s3_to_gcs.S3ToGCSOperator',
+    "s3_to_gcs_operator": {
+        "S3ToGCSOperator": "airflow.providers.google.cloud.transfers.s3_to_gcs.S3ToGCSOperator",
     },
-    's3_to_gcs_transfer_operator': {
-        'CloudDataTransferServiceS3ToGCSOperator':
-            'airflow.providers.google.cloud.operators.cloud_storage_transfer_service.'
-            'CloudDataTransferServiceS3ToGCSOperator',
+    "s3_to_gcs_transfer_operator": {
+        "CloudDataTransferServiceS3ToGCSOperator":
+            "airflow.providers.google.cloud.operators.cloud_storage_transfer_service."
+            "CloudDataTransferServiceS3ToGCSOperator",
     },
-    's3_to_sftp_operator': {
-        'S3ToSFTPOperator': 'airflow.providers.amazon.aws.transfers.s3_to_sftp.S3ToSFTPOperator',
+    "s3_to_sftp_operator": {
+        "S3ToSFTPOperator": "airflow.providers.amazon.aws.transfers.s3_to_sftp.S3ToSFTPOperator",
     },
-    'segment_track_event_operator': {
-        'SegmentTrackEventOperator': (
-            'airflow.providers.segment.operators.segment_track_event.SegmentTrackEventOperator'
+    "segment_track_event_operator": {
+        "SegmentTrackEventOperator": (
+            "airflow.providers.segment.operators.segment_track_event.SegmentTrackEventOperator"
         ),
     },
-    'sftp_operator': {
-        'SFTPOperator': 'airflow.providers.sftp.operators.sftp.SFTPOperator',
+    "sftp_operator": {
+        "SFTPOperator": "airflow.providers.sftp.operators.sftp.SFTPOperator",
     },
-    'sftp_to_s3_operator': {
-        'SFTPToS3Operator': 'airflow.providers.amazon.aws.transfers.sftp_to_s3.SFTPToS3Operator',
+    "sftp_to_s3_operator": {
+        "SFTPToS3Operator": "airflow.providers.amazon.aws.transfers.sftp_to_s3.SFTPToS3Operator",
     },
-    'slack_webhook_operator': {
-        'SlackWebhookOperator': 'airflow.providers.slack.operators.slack_webhook.SlackWebhookOperator',
+    "slack_webhook_operator": {
+        "SlackWebhookOperator": "airflow.providers.slack.operators.slack_webhook.SlackWebhookOperator",
     },
-    'snowflake_operator': {
-        'SnowflakeOperator': 'airflow.providers.snowflake.operators.snowflake.SnowflakeOperator',
+    "snowflake_operator": {
+        "SnowflakeOperator": "airflow.providers.snowflake.operators.snowflake.SnowflakeOperator",
     },
-    'sns_publish_operator': {
-        'SnsPublishOperator': 'airflow.providers.amazon.aws.operators.sns.SnsPublishOperator',
+    "sns_publish_operator": {
+        "SnsPublishOperator": "airflow.providers.amazon.aws.operators.sns.SnsPublishOperator",
     },
-    'spark_jdbc_operator': {
-        'SparkJDBCOperator': 'airflow.providers.apache.spark.operators.spark_jdbc.SparkJDBCOperator',
-        'SparkSubmitOperator': 'airflow.providers.apache.spark.operators.spark_jdbc.SparkSubmitOperator',
+    "spark_jdbc_operator": {
+        "SparkJDBCOperator": "airflow.providers.apache.spark.operators.spark_jdbc.SparkJDBCOperator",
+        "SparkSubmitOperator": "airflow.providers.apache.spark.operators.spark_jdbc.SparkSubmitOperator",
     },
-    'spark_sql_operator': {
-        'SparkSqlOperator': 'airflow.providers.apache.spark.operators.spark_sql.SparkSqlOperator',
+    "spark_sql_operator": {
+        "SparkSqlOperator": "airflow.providers.apache.spark.operators.spark_sql.SparkSqlOperator",
     },
-    'spark_submit_operator': {
-        'SparkSubmitOperator': 'airflow.providers.apache.spark.operators.spark_submit.SparkSubmitOperator',
+    "spark_submit_operator": {
+        "SparkSubmitOperator": "airflow.providers.apache.spark.operators.spark_submit.SparkSubmitOperator",
     },
-    'sql_to_gcs': {
-        'BaseSQLToGCSOperator': 'airflow.providers.google.cloud.transfers.sql_to_gcs.BaseSQLToGCSOperator',
-        'BaseSQLToGoogleCloudStorageOperator': (
-            'airflow.providers.google.cloud.transfers.sql_to_gcs.BaseSQLToGCSOperator'
+    "sql_to_gcs": {
+        "BaseSQLToGCSOperator": "airflow.providers.google.cloud.transfers.sql_to_gcs.BaseSQLToGCSOperator",
+        "BaseSQLToGoogleCloudStorageOperator": (
+            "airflow.providers.google.cloud.transfers.sql_to_gcs.BaseSQLToGCSOperator"
         ),
     },
-    'sqoop_operator': {
-        'SqoopOperator': 'airflow.providers.apache.sqoop.operators.sqoop.SqoopOperator',
+    "sqoop_operator": {
+        "SqoopOperator": "airflow.providers.apache.sqoop.operators.sqoop.SqoopOperator",
     },
-    'ssh_operator': {
-        'SSHOperator': 'airflow.providers.ssh.operators.ssh.SSHOperator',
+    "ssh_operator": {
+        "SSHOperator": "airflow.providers.ssh.operators.ssh.SSHOperator",
     },
-    'vertica_operator': {
-        'VerticaOperator': 'airflow.providers.vertica.operators.vertica.VerticaOperator',
+    "vertica_operator": {
+        "VerticaOperator": "airflow.providers.vertica.operators.vertica.VerticaOperator",
     },
-    'vertica_to_hive': {
-        'VerticaToHiveOperator': (
-            'airflow.providers.apache.hive.transfers.vertica_to_hive.VerticaToHiveOperator'
+    "vertica_to_hive": {
+        "VerticaToHiveOperator": (
+            "airflow.providers.apache.hive.transfers.vertica_to_hive.VerticaToHiveOperator"
         ),
-        'VerticaToHiveTransfer': (
-            'airflow.providers.apache.hive.transfers.vertica_to_hive.VerticaToHiveOperator'
+        "VerticaToHiveTransfer": (
+            "airflow.providers.apache.hive.transfers.vertica_to_hive.VerticaToHiveOperator"
         ),
     },
-    'vertica_to_mysql': {
-        'VerticaToMySqlOperator': 'airflow.providers.mysql.transfers.vertica_to_mysql.VerticaToMySqlOperator',
-        'VerticaToMySqlTransfer': 'airflow.providers.mysql.transfers.vertica_to_mysql.VerticaToMySqlOperator',
+    "vertica_to_mysql": {
+        "VerticaToMySqlOperator": "airflow.providers.mysql.transfers.vertica_to_mysql.VerticaToMySqlOperator",
+        "VerticaToMySqlTransfer": "airflow.providers.mysql.transfers.vertica_to_mysql.VerticaToMySqlOperator",
     },
-    'wasb_delete_blob_operator': {
-        'WasbDeleteBlobOperator': (
-            'airflow.providers.microsoft.azure.operators.wasb_delete_blob.WasbDeleteBlobOperator'
+    "wasb_delete_blob_operator": {
+        "WasbDeleteBlobOperator": (
+            "airflow.providers.microsoft.azure.operators.wasb_delete_blob.WasbDeleteBlobOperator"
         ),
     },
-    'winrm_operator': {
-        'WinRMOperator': 'airflow.providers.microsoft.winrm.operators.winrm.WinRMOperator',
+    "winrm_operator": {
+        "WinRMOperator": "airflow.providers.microsoft.winrm.operators.winrm.WinRMOperator",
     },
 }
 
diff --git a/airflow/contrib/secrets/__init__.py b/airflow/contrib/secrets/__init__.py
index 72df9f65433f4..7498cf0fc540a 100644
--- a/airflow/contrib/secrets/__init__.py
+++ b/airflow/contrib/secrets/__init__.py
@@ -30,27 +30,27 @@
 )
 
 __deprecated_classes = {
-    'aws_secrets_manager': {
-        'SecretsManagerBackend': 'airflow.providers.amazon.aws.secrets.secrets_manager.SecretsManagerBackend',
+    "aws_secrets_manager": {
+        "SecretsManagerBackend": "airflow.providers.amazon.aws.secrets.secrets_manager.SecretsManagerBackend",
     },
-    'aws_systems_manager': {
-        'SystemsManagerParameterStoreBackend': (
-            'airflow.providers.amazon.aws.secrets.systems_manager.SystemsManagerParameterStoreBackend'
+    "aws_systems_manager": {
+        "SystemsManagerParameterStoreBackend": (
+            "airflow.providers.amazon.aws.secrets.systems_manager.SystemsManagerParameterStoreBackend"
         ),
     },
-    'azure_key_vault': {
-        'AzureKeyVaultBackend': 'airflow.providers.microsoft.azure.secrets.key_vault.AzureKeyVaultBackend',
+    "azure_key_vault": {
+        "AzureKeyVaultBackend": "airflow.providers.microsoft.azure.secrets.key_vault.AzureKeyVaultBackend",
     },
-    'gcp_secrets_manager': {
-        'CloudSecretManagerBackend': (
-            'airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend'
+    "gcp_secrets_manager": {
+        "CloudSecretManagerBackend": (
+            "airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend"
         ),
-        'CloudSecretsManagerBackend': (
-            'airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend'
+        "CloudSecretsManagerBackend": (
+            "airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend"
         ),
     },
-    'hashicorp_vault': {
-        'VaultBackend': 'airflow.providers.hashicorp.secrets.vault.VaultBackend',
+    "hashicorp_vault": {
+        "VaultBackend": "airflow.providers.hashicorp.secrets.vault.VaultBackend",
     },
 }
 add_deprecated_classes(__deprecated_classes, __name__)
diff --git a/airflow/contrib/sensors/__init__.py b/airflow/contrib/sensors/__init__.py
index 664a860cc6263..9da2c3684578d 100644
--- a/airflow/contrib/sensors/__init__.py
+++ b/airflow/contrib/sensors/__init__.py
@@ -30,130 +30,130 @@
 )
 
 __deprecated_classes = {
-    'aws_athena_sensor': {
-        'AthenaSensor': 'airflow.providers.amazon.aws.sensors.athena.AthenaSensor',
+    "aws_athena_sensor": {
+        "AthenaSensor": "airflow.providers.amazon.aws.sensors.athena.AthenaSensor",
     },
-    'aws_glue_catalog_partition_sensor': {
-        'AwsGlueCatalogPartitionSensor': (
-            'airflow.providers.amazon.aws.sensors.glue_catalog_partition.GlueCatalogPartitionSensor'
+    "aws_glue_catalog_partition_sensor": {
+        "AwsGlueCatalogPartitionSensor": (
+            "airflow.providers.amazon.aws.sensors.glue_catalog_partition.GlueCatalogPartitionSensor"
         ),
     },
-    'aws_redshift_cluster_sensor': {
-        'AwsRedshiftClusterSensor': (
-            'airflow.providers.amazon.aws.sensors.redshift_cluster.RedshiftClusterSensor'
+    "aws_redshift_cluster_sensor": {
+        "AwsRedshiftClusterSensor": (
+            "airflow.providers.amazon.aws.sensors.redshift_cluster.RedshiftClusterSensor"
         ),
     },
-    'aws_sqs_sensor': {
-        'SqsSensor': 'airflow.providers.amazon.aws.sensors.sqs.SqsSensor',
-        'SQSSensor': 'airflow.providers.amazon.aws.sensors.sqs.SqsSensor',
+    "aws_sqs_sensor": {
+        "SqsSensor": "airflow.providers.amazon.aws.sensors.sqs.SqsSensor",
+        "SQSSensor": "airflow.providers.amazon.aws.sensors.sqs.SqsSensor",
     },
-    'azure_cosmos_sensor': {
-        'AzureCosmosDocumentSensor': (
-            'airflow.providers.microsoft.azure.sensors.cosmos.AzureCosmosDocumentSensor'
+    "azure_cosmos_sensor": {
+        "AzureCosmosDocumentSensor": (
+            "airflow.providers.microsoft.azure.sensors.cosmos.AzureCosmosDocumentSensor"
         ),
     },
-    'bash_sensor': {
-        'STDOUT': 'airflow.sensors.bash.STDOUT',
-        'BashSensor': 'airflow.sensors.bash.BashSensor',
-        'Popen': 'airflow.sensors.bash.Popen',
-        'TemporaryDirectory': 'airflow.sensors.bash.TemporaryDirectory',
-        'gettempdir': 'airflow.sensors.bash.gettempdir',
+    "bash_sensor": {
+        "STDOUT": "airflow.sensors.bash.STDOUT",
+        "BashSensor": "airflow.sensors.bash.BashSensor",
+        "Popen": "airflow.sensors.bash.Popen",
+        "TemporaryDirectory": "airflow.sensors.bash.TemporaryDirectory",
+        "gettempdir": "airflow.sensors.bash.gettempdir",
     },
-    'bigquery_sensor': {
-        'BigQueryTableExistenceSensor': (
-            'airflow.providers.google.cloud.sensors.bigquery.BigQueryTableExistenceSensor'
+    "bigquery_sensor": {
+        "BigQueryTableExistenceSensor": (
+            "airflow.providers.google.cloud.sensors.bigquery.BigQueryTableExistenceSensor"
         ),
-        'BigQueryTableSensor': 'airflow.providers.google.cloud.sensors.bigquery.BigQueryTableExistenceSensor',
+        "BigQueryTableSensor": "airflow.providers.google.cloud.sensors.bigquery.BigQueryTableExistenceSensor",
     },
-    'cassandra_record_sensor': {
-        'CassandraRecordSensor': 'airflow.providers.apache.cassandra.sensors.record.CassandraRecordSensor',
+    "cassandra_record_sensor": {
+        "CassandraRecordSensor": "airflow.providers.apache.cassandra.sensors.record.CassandraRecordSensor",
     },
-    'cassandra_table_sensor': {
-        'CassandraTableSensor': 'airflow.providers.apache.cassandra.sensors.table.CassandraTableSensor',
+    "cassandra_table_sensor": {
+        "CassandraTableSensor": "airflow.providers.apache.cassandra.sensors.table.CassandraTableSensor",
     },
-    'celery_queue_sensor': {
-        'CeleryQueueSensor': 'airflow.providers.celery.sensors.celery_queue.CeleryQueueSensor',
+    "celery_queue_sensor": {
+        "CeleryQueueSensor": "airflow.providers.celery.sensors.celery_queue.CeleryQueueSensor",
     },
-    'datadog_sensor': {
-        'DatadogSensor': 'airflow.providers.datadog.sensors.datadog.DatadogSensor',
+    "datadog_sensor": {
+        "DatadogSensor": "airflow.providers.datadog.sensors.datadog.DatadogSensor",
     },
-    'file_sensor': {
-        'FileSensor': 'airflow.sensors.filesystem.FileSensor',
+    "file_sensor": {
+        "FileSensor": "airflow.sensors.filesystem.FileSensor",
     },
-    'ftp_sensor': {
-        'FTPSensor': 'airflow.providers.ftp.sensors.ftp.FTPSensor',
-        'FTPSSensor': 'airflow.providers.ftp.sensors.ftp.FTPSSensor',
+    "ftp_sensor": {
+        "FTPSensor": "airflow.providers.ftp.sensors.ftp.FTPSensor",
+        "FTPSSensor": "airflow.providers.ftp.sensors.ftp.FTPSSensor",
     },
-    'gcp_transfer_sensor': {
-        'CloudDataTransferServiceJobStatusSensor':
-            'airflow.providers.google.cloud.sensors.cloud_storage_transfer_service.'
-            'CloudDataTransferServiceJobStatusSensor',
-        'GCPTransferServiceWaitForJobStatusSensor':
-            'airflow.providers.google.cloud.sensors.cloud_storage_transfer_service.'
-            'CloudDataTransferServiceJobStatusSensor',
+    "gcp_transfer_sensor": {
+        "CloudDataTransferServiceJobStatusSensor":
+            "airflow.providers.google.cloud.sensors.cloud_storage_transfer_service."
+            "CloudDataTransferServiceJobStatusSensor",
+        "GCPTransferServiceWaitForJobStatusSensor":
+            "airflow.providers.google.cloud.sensors.cloud_storage_transfer_service."
+            "CloudDataTransferServiceJobStatusSensor",
     },
-    'gcs_sensor': {
-        'GCSObjectExistenceSensor': 'airflow.providers.google.cloud.sensors.gcs.GCSObjectExistenceSensor',
-        'GCSObjectsWithPrefixExistenceSensor': (
-            'airflow.providers.google.cloud.sensors.gcs.GCSObjectsWithPrefixExistenceSensor'
+    "gcs_sensor": {
+        "GCSObjectExistenceSensor": "airflow.providers.google.cloud.sensors.gcs.GCSObjectExistenceSensor",
+        "GCSObjectsWithPrefixExistenceSensor": (
+            "airflow.providers.google.cloud.sensors.gcs.GCSObjectsWithPrefixExistenceSensor"
         ),
-        'GCSObjectUpdateSensor': 'airflow.providers.google.cloud.sensors.gcs.GCSObjectUpdateSensor',
-        'GCSUploadSessionCompleteSensor': (
-            'airflow.providers.google.cloud.sensors.gcs.GCSUploadSessionCompleteSensor'
+        "GCSObjectUpdateSensor": "airflow.providers.google.cloud.sensors.gcs.GCSObjectUpdateSensor",
+        "GCSUploadSessionCompleteSensor": (
+            "airflow.providers.google.cloud.sensors.gcs.GCSUploadSessionCompleteSensor"
         ),
-        'GoogleCloudStorageObjectSensor': (
-            'airflow.providers.google.cloud.sensors.gcs.GCSObjectExistenceSensor'
+        "GoogleCloudStorageObjectSensor": (
+            "airflow.providers.google.cloud.sensors.gcs.GCSObjectExistenceSensor"
         ),
-        'GoogleCloudStorageObjectUpdatedSensor': (
-            'airflow.providers.google.cloud.sensors.gcs.GCSObjectUpdateSensor'
+        "GoogleCloudStorageObjectUpdatedSensor": (
+            "airflow.providers.google.cloud.sensors.gcs.GCSObjectUpdateSensor"
         ),
-        'GoogleCloudStoragePrefixSensor': (
-            'airflow.providers.google.cloud.sensors.gcs.GCSObjectsWithPrefixExistenceSensor'
+        "GoogleCloudStoragePrefixSensor": (
+            "airflow.providers.google.cloud.sensors.gcs.GCSObjectsWithPrefixExistenceSensor"
         ),
-        'GoogleCloudStorageUploadSessionCompleteSensor': (
-            'airflow.providers.google.cloud.sensors.gcs.GCSUploadSessionCompleteSensor'
+        "GoogleCloudStorageUploadSessionCompleteSensor": (
+            "airflow.providers.google.cloud.sensors.gcs.GCSUploadSessionCompleteSensor"
         ),
     },
-    'imap_attachment_sensor': {
-        'ImapAttachmentSensor': 'airflow.providers.imap.sensors.imap_attachment.ImapAttachmentSensor',
+    "imap_attachment_sensor": {
+        "ImapAttachmentSensor": "airflow.providers.imap.sensors.imap_attachment.ImapAttachmentSensor",
     },
-    'jira_sensor': {
-        'JiraSensor': 'airflow.providers.atlassian.jira.sensors.jira.JiraSensor',
-        'JiraTicketSensor': 'airflow.providers.atlassian.jira.sensors.jira.JiraTicketSensor',
+    "jira_sensor": {
+        "JiraSensor": "airflow.providers.atlassian.jira.sensors.jira.JiraSensor",
+        "JiraTicketSensor": "airflow.providers.atlassian.jira.sensors.jira.JiraTicketSensor",
     },
-    'mongo_sensor': {
-        'MongoSensor': 'airflow.providers.mongo.sensors.mongo.MongoSensor',
+    "mongo_sensor": {
+        "MongoSensor": "airflow.providers.mongo.sensors.mongo.MongoSensor",
     },
-    'pubsub_sensor': {
-        'PubSubPullSensor': 'airflow.providers.google.cloud.sensors.pubsub.PubSubPullSensor',
+    "pubsub_sensor": {
+        "PubSubPullSensor": "airflow.providers.google.cloud.sensors.pubsub.PubSubPullSensor",
     },
-    'python_sensor': {
-        'PythonSensor': 'airflow.sensors.python.PythonSensor',
+    "python_sensor": {
+        "PythonSensor": "airflow.sensors.python.PythonSensor",
     },
-    'qubole_sensor': {
-        'QuboleFileSensor': 'airflow.providers.qubole.sensors.qubole.QuboleFileSensor',
-        'QubolePartitionSensor': 'airflow.providers.qubole.sensors.qubole.QubolePartitionSensor',
-        'QuboleSensor': 'airflow.providers.qubole.sensors.qubole.QuboleSensor',
+    "qubole_sensor": {
+        "QuboleFileSensor": "airflow.providers.qubole.sensors.qubole.QuboleFileSensor",
+        "QubolePartitionSensor": "airflow.providers.qubole.sensors.qubole.QubolePartitionSensor",
+        "QuboleSensor": "airflow.providers.qubole.sensors.qubole.QuboleSensor",
     },
-    'redis_key_sensor': {
-        'RedisKeySensor': 'airflow.providers.redis.sensors.redis_key.RedisKeySensor',
+    "redis_key_sensor": {
+        "RedisKeySensor": "airflow.providers.redis.sensors.redis_key.RedisKeySensor",
     },
-    'redis_pub_sub_sensor': {
-        'RedisPubSubSensor': 'airflow.providers.redis.sensors.redis_pub_sub.RedisPubSubSensor',
+    "redis_pub_sub_sensor": {
+        "RedisPubSubSensor": "airflow.providers.redis.sensors.redis_pub_sub.RedisPubSubSensor",
     },
-    'sagemaker_training_sensor': {
-        'SageMakerHook': 'airflow.providers.amazon.aws.sensors.sagemaker.SageMakerHook',
-        'SageMakerTrainingSensor': 'airflow.providers.amazon.aws.sensors.sagemaker.SageMakerTrainingSensor',
+    "sagemaker_training_sensor": {
+        "SageMakerHook": "airflow.providers.amazon.aws.sensors.sagemaker.SageMakerHook",
+        "SageMakerTrainingSensor": "airflow.providers.amazon.aws.sensors.sagemaker.SageMakerTrainingSensor",
     },
-    'sftp_sensor': {
-        'SFTPSensor': 'airflow.providers.sftp.sensors.sftp.SFTPSensor',
+    "sftp_sensor": {
+        "SFTPSensor": "airflow.providers.sftp.sensors.sftp.SFTPSensor",
     },
-    'wasb_sensor': {
-        'WasbBlobSensor': 'airflow.providers.microsoft.azure.sensors.wasb.WasbBlobSensor',
-        'WasbPrefixSensor': 'airflow.providers.microsoft.azure.sensors.wasb.WasbPrefixSensor',
+    "wasb_sensor": {
+        "WasbBlobSensor": "airflow.providers.microsoft.azure.sensors.wasb.WasbBlobSensor",
+        "WasbPrefixSensor": "airflow.providers.microsoft.azure.sensors.wasb.WasbPrefixSensor",
     },
-    'weekday_sensor': {
-        'DayOfWeekSensor': 'airflow.sensors.weekday.DayOfWeekSensor',
+    "weekday_sensor": {
+        "DayOfWeekSensor": "airflow.sensors.weekday.DayOfWeekSensor",
     },
 }
 
diff --git a/airflow/contrib/task_runner/__init__.py b/airflow/contrib/task_runner/__init__.py
index d956469e0ceab..88257f1cba91a 100644
--- a/airflow/contrib/task_runner/__init__.py
+++ b/airflow/contrib/task_runner/__init__.py
@@ -28,8 +28,8 @@
 )
 
 __deprecated_classes = {
-    'cgroup_task_runner': {
-        'CgroupTaskRunner': 'airflow.task.task_runner.cgroup_task_runner.CgroupTaskRunner',
+    "cgroup_task_runner": {
+        "CgroupTaskRunner": "airflow.task.task_runner.cgroup_task_runner.CgroupTaskRunner",
     },
 }
 
diff --git a/airflow/contrib/utils/__init__.py b/airflow/contrib/utils/__init__.py
index 0facd9b77c0f3..c24b7a24e9846 100644
--- a/airflow/contrib/utils/__init__.py
+++ b/airflow/contrib/utils/__init__.py
@@ -30,35 +30,35 @@
 )
 
 __deprecated_classes = {
-    'gcp_field_sanitizer': {
-        'GcpBodyFieldSanitizer': 'airflow.providers.google.cloud.utils.field_sanitizer.GcpBodyFieldSanitizer',
-        'GcpFieldSanitizerException': (
-            'airflow.providers.google.cloud.utils.field_sanitizer.GcpFieldSanitizerException'
+    "gcp_field_sanitizer": {
+        "GcpBodyFieldSanitizer": "airflow.providers.google.cloud.utils.field_sanitizer.GcpBodyFieldSanitizer",
+        "GcpFieldSanitizerException": (
+            "airflow.providers.google.cloud.utils.field_sanitizer.GcpFieldSanitizerException"
         ),
     },
-    'gcp_field_validator': {
-        'GcpBodyFieldValidator': 'airflow.providers.google.cloud.utils.field_validator.GcpBodyFieldValidator',
-        'GcpFieldValidationException': (
-            'airflow.providers.google.cloud.utils.field_validator.GcpFieldValidationException'
+    "gcp_field_validator": {
+        "GcpBodyFieldValidator": "airflow.providers.google.cloud.utils.field_validator.GcpBodyFieldValidator",
+        "GcpFieldValidationException": (
+            "airflow.providers.google.cloud.utils.field_validator.GcpFieldValidationException"
         ),
-        'GcpValidationSpecificationException': (
-            'airflow.providers.google.cloud.utils.field_validator.GcpValidationSpecificationException'
+        "GcpValidationSpecificationException": (
+            "airflow.providers.google.cloud.utils.field_validator.GcpValidationSpecificationException"
         ),
     },
-    'mlengine_operator_utils': {
-        'create_evaluate_ops': (
-            'airflow.providers.google.cloud.utils.mlengine_operator_utils.create_evaluate_ops'
+    "mlengine_operator_utils": {
+        "create_evaluate_ops": (
+            "airflow.providers.google.cloud.utils.mlengine_operator_utils.create_evaluate_ops"
         ),
     },
-    'mlengine_prediction_summary': {
-        'JsonCoder': 'airflow.providers.google.cloud.utils.mlengine_prediction_summary.JsonCoder',
-        'MakeSummary': 'airflow.providers.google.cloud.utils.mlengine_prediction_summary.MakeSummary',
+    "mlengine_prediction_summary": {
+        "JsonCoder": "airflow.providers.google.cloud.utils.mlengine_prediction_summary.JsonCoder",
+        "MakeSummary": "airflow.providers.google.cloud.utils.mlengine_prediction_summary.MakeSummary",
     },
-    'sendgrid': {
-        'import_string': 'airflow.utils.module_loading.import_string',
+    "sendgrid": {
+        "import_string": "airflow.utils.module_loading.import_string",
     },
-    'weekday': {
-        'WeekDay': 'airflow.utils.weekday.WeekDay',
+    "weekday": {
+        "WeekDay": "airflow.utils.weekday.WeekDay",
     },
 }
 
diff --git a/airflow/contrib/utils/log/__init__.py b/airflow/contrib/utils/log/__init__.py
index e4a188cf0f5aa..e6af71dfefb71 100644
--- a/airflow/contrib/utils/log/__init__.py
+++ b/airflow/contrib/utils/log/__init__.py
@@ -24,9 +24,9 @@
 warnings.warn("This module is deprecated. Please use `airflow.utils.log`.", DeprecationWarning, stacklevel=2)
 
 __deprecated_classes = {
-    'task_handler_with_custom_formatter': {
-        'TaskHandlerWithCustomFormatter': (
-            'airflow.utils.log.task_handler_with_custom_formatter.TaskHandlerWithCustomFormatter'
+    "task_handler_with_custom_formatter": {
+        "TaskHandlerWithCustomFormatter": (
+            "airflow.utils.log.task_handler_with_custom_formatter.TaskHandlerWithCustomFormatter"
         ),
     },
 }
diff --git a/airflow/dag_processing/manager.py b/airflow/dag_processing/manager.py
index 5a92af893bd85..040968c47fa72 100644
--- a/airflow/dag_processing/manager.py
+++ b/airflow/dag_processing/manager.py
@@ -607,16 +607,12 @@ def _run_parsing_loop(self):
                 continue
 
             for sentinel in ready:
-                if sentinel is self._direct_scheduler_conn:
-                    continue
-
-                processor = self.waitables.get(sentinel)
-                if not processor:
-                    continue
-
-                self._collect_results_from_processor(processor)
-                self.waitables.pop(sentinel)
-                self._processors.pop(processor.file_path)
+                if sentinel is not self._direct_scheduler_conn:
+                    processor = self.waitables.get(sentinel)
+                    if processor:
+                        self._collect_results_from_processor(processor)
+                        self.waitables.pop(sentinel)
+                        self._processors.pop(processor.file_path)
 
             if self.standalone_dag_processor:
                 self._fetch_callbacks(max_callbacks_per_loop)
@@ -851,9 +847,7 @@ def _log_file_processing_stats(self, known_file_paths):
             last_runtime = self.get_last_runtime(file_path)
             num_dags = self.get_last_dag_count(file_path)
             num_errors = self.get_last_error_count(file_path)
-            file_name = os.path.basename(file_path)
-            file_name = os.path.splitext(file_name)[0].replace(os.sep, ".")
-
+            file_name = Path(file_path).stem
             processor_pid = self.get_pid(file_path)
             processor_start_time = self.get_start_time(file_path)
             runtime = (now - processor_start_time) if processor_start_time else None
@@ -865,7 +859,7 @@ def _log_file_processing_stats(self, known_file_paths):
             rows.append((file_path, processor_pid, runtime, num_dags, num_errors, last_runtime, last_run))
 
         # Sort by longest last runtime. (Can't sort None values in python3)
-        rows = sorted(rows, key=lambda x: x[3] or 0.0)
+        rows.sort(key=lambda x: x[3] or 0.0)
 
         formatted_rows = []
         for file_path, pid, runtime, num_dags, num_errors, last_runtime, last_run in rows:
@@ -1043,8 +1037,7 @@ def _collect_results_from_processor(self, processor) -> None:
             run_count=self.get_run_count(processor.file_path) + 1,
         )
         self._file_stats[processor.file_path] = stat
-
-        file_name = os.path.splitext(os.path.basename(processor.file_path))[0].replace(os.sep, ".")
+        file_name = Path(processor.file_path).stem
         Stats.timing(f"dag_processing.last_duration.{file_name}", last_duration)
         Stats.timing("dag_processing.last_duration", last_duration, tags={"file_name": file_name})
 
@@ -1055,12 +1048,11 @@ def collect_results(self) -> None:
         )
 
         for sentinel in ready:
-            if sentinel is self._direct_scheduler_conn:
-                continue
-            processor = cast(DagFileProcessorProcess, self.waitables[sentinel])
-            self.waitables.pop(processor.waitable_handle)
-            self._processors.pop(processor.file_path)
-            self._collect_results_from_processor(processor)
+            if sentinel is not self._direct_scheduler_conn:
+                processor = cast(DagFileProcessorProcess, self.waitables[sentinel])
+                self.waitables.pop(processor.waitable_handle)
+                self._processors.pop(processor.file_path)
+                self._collect_results_from_processor(processor)
 
         self.log.debug("%s/%s DAG parsing processes running", len(self._processors), self._parallelism)
 
@@ -1083,7 +1075,7 @@ def start_new_processes(self):
         # needs to be done before this process is forked to create the DAG parsing processes.
         SecretCache.init()
 
-        while self._parallelism - len(self._processors) > 0 and self._file_path_queue:
+        while self._parallelism > len(self._processors) and self._file_path_queue:
             file_path = self._file_path_queue.popleft()
             # Stop creating duplicate processor i.e. processor with the same filepath
             if file_path in self._processors:
@@ -1167,7 +1159,7 @@ def prepare_file_path_queue(self):
         if is_mtime_mode:
             file_paths = sorted(files_with_mtime, key=files_with_mtime.get, reverse=True)
         elif list_mode == "alphabetical":
-            file_paths = sorted(file_paths)
+            file_paths.sort()
         elif list_mode == "random_seeded_by_host":
             # Shuffle the list seeded by hostname so multiple schedulers can work on different
             # set of files. Since we set the seed, the sort order will remain same per host
diff --git a/airflow/dag_processing/processor.py b/airflow/dag_processing/processor.py
index 162fc5889c89d..61e7010f80ef6 100644
--- a/airflow/dag_processing/processor.py
+++ b/airflow/dag_processing/processor.py
@@ -566,8 +566,8 @@ def manage_slas(cls, dag_folder, dag_id: str, session: Session = NEW_SESSION) ->
                     cls.logger().warning(
                         "Task %s doesn't exist in DAG anymore, skipping SLA miss notification.", sla.task_id
                     )
-                    continue
-                tasks_missed_sla.append(task)
+                else:
+                    tasks_missed_sla.append(task)
 
             emails: set[str] = set()
             for task in tasks_missed_sla:
@@ -628,7 +628,7 @@ def update_import_errors(
         for filename, stacktrace in import_errors.items():
             if filename in existing_import_error_files:
                 session.query(errors.ImportError).filter(errors.ImportError.filename == filename).update(
-                    dict(filename=filename, timestamp=timezone.utcnow(), stacktrace=stacktrace),
+                    {"filename": filename, "timestamp": timezone.utcnow(), "stacktrace": stacktrace},
                     synchronize_session="fetch",
                 )
             else:
@@ -835,7 +835,7 @@ def process_file(
             Stats.incr("dag_file_refresh_error", 1, 1, tags={"file_path": file_path})
             return 0, 0
 
-        if len(dagbag.dags) > 0:
+        if dagbag.dags:
             self.log.info("DAG(s) %s retrieved from %s", dagbag.dags.keys(), file_path)
         else:
             self.log.warning("No viable dags retrieved from %s", file_path)
diff --git a/airflow/decorators/base.py b/airflow/decorators/base.py
index fa3d76584a56d..d1d04d79b8665 100644
--- a/airflow/decorators/base.py
+++ b/airflow/decorators/base.py
@@ -41,7 +41,7 @@
 import typing_extensions
 from sqlalchemy.orm import Session
 
-from airflow import Dataset
+from airflow.datasets import Dataset
 from airflow.exceptions import AirflowException
 from airflow.models.abstractoperator import DEFAULT_RETRIES, DEFAULT_RETRY_DELAY
 from airflow.models.baseoperator import (
@@ -102,10 +102,11 @@ def _validate_arg_names(self, func: ValidationSource, kwargs: dict[str, Any]) ->
         kwargs_left = kwargs.copy()
         for arg_name in self._mappable_function_argument_names:
             value = kwargs_left.pop(arg_name, NOTSET)
-            if func != "expand" or value is NOTSET or is_mappable(value):
-                continue
-            tname = type(value).__name__
-            raise ValueError(f"expand() got an unexpected type {tname!r} for keyword argument {arg_name!r}")
+            if func == "expand" and value is not NOTSET and not is_mappable(value):
+                tname = type(value).__name__
+                raise ValueError(
+                    f"expand() got an unexpected type {tname!r} for keyword argument {arg_name!r}"
+                )
         if len(kwargs_left) == 1:
             raise TypeError(f"{func}() got an unexpected keyword argument {next(iter(kwargs_left))!r}")
         elif kwargs_left:
@@ -147,9 +148,8 @@ def _find_id_suffixes(dag: DAG) -> Iterator[int]:
         prefix = re2.split(r"__\d+$", tg_task_id)[0]
         for task_id in dag.task_ids:
             match = re2.match(rf"^{prefix}__(\d+)$", task_id)
-            if match is None:
-                continue
-            yield int(match.group(1))
+            if match:
+                yield int(match.group(1))
         yield 0  # Default if there's no matching task ID.
 
     core = re2.split(r"__\d+$", task_id)[0]
@@ -330,7 +330,7 @@ def fake():
         except TypeError:  # Can't evaluate return type.
             return False
         ttype = getattr(return_type, "__origin__", return_type)
-        return ttype == dict or ttype == Dict
+        return ttype is dict or ttype is Dict
 
     def __attrs_post_init__(self):
         if "self" in self.function_signature.parameters:
@@ -523,7 +523,8 @@ def __attrs_post_init__(self):
 
     def _expand_mapped_kwargs(self, context: Context, session: Session) -> tuple[Mapping[str, Any], set[int]]:
         # We only use op_kwargs_expand_input so this must always be empty.
-        assert self.expand_input is EXPAND_INPUT_EMPTY
+        if self.expand_input is not EXPAND_INPUT_EMPTY:
+            raise AssertionError(f"unexpected expand_input: {self.expand_input}")
         op_kwargs, resolved_oids = super()._expand_mapped_kwargs(context, session)
         return {"op_kwargs": op_kwargs}, resolved_oids
 
diff --git a/airflow/example_dags/example_bash_operator.py b/airflow/example_dags/example_bash_operator.py
index 2f0343e1584d4..a855ce9859ee4 100644
--- a/airflow/example_dags/example_bash_operator.py
+++ b/airflow/example_dags/example_bash_operator.py
@@ -50,7 +50,7 @@
 
     for i in range(3):
         task = BashOperator(
-            task_id="runme_" + str(i),
+            task_id=f"runme_{i}",
             bash_command='echo "{{ task_instance_key_str }}" && sleep 1',
         )
         task >> run_this
diff --git a/airflow/example_dags/example_params_trigger_ui.py b/airflow/example_dags/example_params_trigger_ui.py
index b7554a446306f..564861f52bec0 100644
--- a/airflow/example_dags/example_params_trigger_ui.py
+++ b/airflow/example_dags/example_params_trigger_ui.py
@@ -33,7 +33,7 @@
 
 with DAG(
     dag_id=Path(__file__).stem,
-    description=__doc__[0 : __doc__.find(".")],
+    description=__doc__.partition(".")[0],
     doc_md=__doc__,
     schedule=None,
     start_date=datetime.datetime(2022, 3, 4),
diff --git a/airflow/example_dags/example_params_ui_tutorial.py b/airflow/example_dags/example_params_ui_tutorial.py
index cb25b1b4084d6..9af4e0ba4af92 100644
--- a/airflow/example_dags/example_params_ui_tutorial.py
+++ b/airflow/example_dags/example_params_ui_tutorial.py
@@ -35,7 +35,7 @@
 
 with DAG(
     dag_id=Path(__file__).stem,
-    description=__doc__[0 : __doc__.find(".")],
+    description=__doc__.partition(".")[0],
     doc_md=__doc__,
     schedule=None,
     start_date=datetime.datetime(2022, 3, 4),
diff --git a/airflow/example_dags/example_short_circuit_decorator.py b/airflow/example_dags/example_short_circuit_decorator.py
index 30f6cd0e012bb..79a8c6904b17e 100644
--- a/airflow/example_dags/example_short_circuit_decorator.py
+++ b/airflow/example_dags/example_short_circuit_decorator.py
@@ -32,8 +32,8 @@ def example_short_circuit_decorator():
     def check_condition(condition):
         return condition
 
-    ds_true = [EmptyOperator(task_id="true_" + str(i)) for i in [1, 2]]
-    ds_false = [EmptyOperator(task_id="false_" + str(i)) for i in [1, 2]]
+    ds_true = [EmptyOperator(task_id=f"true_{i}") for i in [1, 2]]
+    ds_false = [EmptyOperator(task_id=f"false_{i}") for i in [1, 2]]
 
     condition_is_true = check_condition.override(task_id="condition_is_true")(condition=True)
     condition_is_false = check_condition.override(task_id="condition_is_false")(condition=False)
diff --git a/airflow/example_dags/example_short_circuit_operator.py b/airflow/example_dags/example_short_circuit_operator.py
index 77f976c502a16..5a35f0b49b83a 100644
--- a/airflow/example_dags/example_short_circuit_operator.py
+++ b/airflow/example_dags/example_short_circuit_operator.py
@@ -42,8 +42,8 @@
         python_callable=lambda: False,
     )
 
-    ds_true = [EmptyOperator(task_id="true_" + str(i)) for i in [1, 2]]
-    ds_false = [EmptyOperator(task_id="false_" + str(i)) for i in [1, 2]]
+    ds_true = [EmptyOperator(task_id=f"true_{i}") for i in [1, 2]]
+    ds_false = [EmptyOperator(task_id=f"false_{i}") for i in [1, 2]]
 
     chain(cond_true, *ds_true)
     chain(cond_false, *ds_false)
diff --git a/airflow/example_dags/plugins/workday.py b/airflow/example_dags/plugins/workday.py
index 20363a69e7a4b..84879536e43a9 100644
--- a/airflow/example_dags/plugins/workday.py
+++ b/airflow/example_dags/plugins/workday.py
@@ -41,15 +41,14 @@ class AfterWorkdayTimetable(Timetable):
     def get_next_workday(self, d: DateTime, incr=1) -> DateTime:
         next_start = d
         while True:
-            if next_start.weekday() in (5, 6):  # If next start is in the weekend go to next day
-                next_start = next_start + incr * timedelta(days=1)
-                continue
-            if holiday_calendar is not None:
-                holidays = holiday_calendar.holidays(start=next_start, end=next_start).to_pydatetime()
-                if next_start in holidays:  # If next start is a holiday go to next day
-                    next_start = next_start + incr * timedelta(days=1)
-                    continue
-            break
+            if next_start.weekday() not in (5, 6):  # not on weekend
+                if holiday_calendar is None:
+                    holidays = set()
+                else:
+                    holidays = holiday_calendar.holidays(start=next_start, end=next_start).to_pydatetime()
+                if next_start not in holidays:
+                    break
+            next_start = next_start.add(days=incr)
         return next_start
 
     # [START howto_timetable_infer_manual_data_interval]
diff --git a/airflow/executors/base_executor.py b/airflow/executors/base_executor.py
index d7f08ad93536e..b9c2991d24c58 100644
--- a/airflow/executors/base_executor.py
+++ b/airflow/executors/base_executor.py
@@ -308,7 +308,7 @@ def change_state(self, key: TaskInstanceKey, state: TaskInstanceState, info=None
         try:
             self.running.remove(key)
         except KeyError:
-            self.log.debug("Could not find key: %s", str(key))
+            self.log.debug("Could not find key: %s", key)
         self.event_buffer[key] = state, info
 
     def fail(self, key: TaskInstanceKey, info=None) -> None:
diff --git a/airflow/executors/debug_executor.py b/airflow/executors/debug_executor.py
index 8a46d6cda0dd1..be2b657b7556e 100644
--- a/airflow/executors/debug_executor.py
+++ b/airflow/executors/debug_executor.py
@@ -71,15 +71,12 @@ def sync(self) -> None:
                 self.log.info("Setting %s to %s", ti.key, TaskInstanceState.UPSTREAM_FAILED)
                 ti.set_state(TaskInstanceState.UPSTREAM_FAILED)
                 self.change_state(ti.key, TaskInstanceState.UPSTREAM_FAILED)
-                continue
-
-            if self._terminated.is_set():
+            elif self._terminated.is_set():
                 self.log.info("Executor is terminated! Stopping %s to %s", ti.key, TaskInstanceState.FAILED)
                 ti.set_state(TaskInstanceState.FAILED)
                 self.change_state(ti.key, TaskInstanceState.FAILED)
-                continue
-
-            task_succeeded = self._run_task(ti)
+            else:
+                task_succeeded = self._run_task(ti)
 
     def _run_task(self, ti: TaskInstance) -> bool:
         self.log.debug("Executing task: %s", ti)
@@ -92,7 +89,7 @@ def _run_task(self, ti: TaskInstance) -> bool:
         except Exception as e:
             ti.set_state(TaskInstanceState.FAILED)
             self.change_state(key, TaskInstanceState.FAILED)
-            self.log.exception("Failed to execute task: %s.", str(e))
+            self.log.exception("Failed to execute task: %s.", e)
             return False
 
     def queue_task_instance(
diff --git a/airflow/executors/local_executor.py b/airflow/executors/local_executor.py
index cf88ca13b2f5e..8621aa9b131f8 100644
--- a/airflow/executors/local_executor.py
+++ b/airflow/executors/local_executor.py
@@ -24,6 +24,7 @@
 """
 from __future__ import annotations
 
+import contextlib
 import logging
 import os
 import subprocess
@@ -99,7 +100,7 @@ def _execute_work_in_subprocess(self, command: CommandType) -> TaskInstanceState
             subprocess.check_call(command, close_fds=True)
             return TaskInstanceState.SUCCESS
         except subprocess.CalledProcessError as e:
-            self.log.error("Failed to execute task %s.", str(e))
+            self.log.error("Failed to execute task %s.", e)
             return TaskInstanceState.FAILED
 
     def _execute_work_in_fork(self, command: CommandType) -> TaskInstanceState:
@@ -329,15 +330,13 @@ def execute_async(
 
         def sync(self):
             """Sync will get called periodically by the heartbeat method."""
-            while True:
-                try:
+            with contextlib.suppress(Empty):
+                while True:
                     results = self.executor.result_queue.get_nowait()
                     try:
                         self.executor.change_state(*results)
                     finally:
                         self.executor.result_queue.task_done()
-                except Empty:
-                    break
 
         def end(self):
             """
diff --git a/airflow/executors/sequential_executor.py b/airflow/executors/sequential_executor.py
index 2715edad6ea21..8ea3e42dc5b68 100644
--- a/airflow/executors/sequential_executor.py
+++ b/airflow/executors/sequential_executor.py
@@ -78,7 +78,7 @@ def sync(self) -> None:
                 self.change_state(key, TaskInstanceState.SUCCESS)
             except subprocess.CalledProcessError as e:
                 self.change_state(key, TaskInstanceState.FAILED)
-                self.log.error("Failed to execute task %s.", str(e))
+                self.log.error("Failed to execute task %s.", e)
 
         self.commands_to_run = []
 
diff --git a/airflow/jobs/backfill_job_runner.py b/airflow/jobs/backfill_job_runner.py
index f199ce698256b..7eaa4f9624c27 100644
--- a/airflow/jobs/backfill_job_runner.py
+++ b/airflow/jobs/backfill_job_runner.py
@@ -652,8 +652,6 @@ def _per_task_process(key, ti: TaskInstance, session):
                             _per_task_process(key, ti, session)
                             try:
                                 session.commit()
-                                # break the retry loop
-                                break
                             except OperationalError:
                                 self.log.error(
                                     "Failed to commit task state due to operational error. "
@@ -665,6 +663,9 @@ def _per_task_process(key, ti: TaskInstance, session):
                                 if i == max_attempts - 1:
                                     raise
                                 # retry the loop
+                            else:
+                                # break the retry loop
+                                break
             except (NoAvailablePoolSlot, DagConcurrencyLimitReached, TaskConcurrencyLimitReached) as e:
                 self.log.debug(e)
 
@@ -742,7 +743,7 @@ def tabulate_ti_keys_set(ti_keys: Iterable[TaskInstanceKey]) -> str:
 
             if all(key.map_index == -1 for key in ti_keys):
                 headers = ["DAG ID", "Task ID", "Run ID", "Try number"]
-                sorted_ti_keys = map(lambda k: k[0:4], sorted_ti_keys)
+                sorted_ti_keys = (k[0:4] for k in sorted_ti_keys)
             else:
                 headers = ["DAG ID", "Task ID", "Run ID", "Map Index", "Try number"]
 
@@ -784,7 +785,7 @@ def tabulate_ti_keys_set(ti_keys: Iterable[TaskInstanceKey]) -> str:
             yield tabulate_ti_keys_set([ti.key for ti in ti_status.deadlocked])
 
     def _get_dag_with_subdags(self) -> list[DAG]:
-        return [self.dag] + self.dag.subdags
+        return [self.dag, *self.dag.subdags]
 
     @provide_session
     def _execute_dagruns(
@@ -811,11 +812,10 @@ def _execute_dagruns(
         for dagrun_info in dagrun_infos:
             for dag in self._get_dag_with_subdags():
                 dag_run = self._get_dag_run(dagrun_info, dag, session=session)
-                if dag_run is None:
-                    continue
-                tis_map = self._task_instances_for_dag_run(dag, dag_run, session=session)
-                ti_status.active_runs.append(dag_run)
-                ti_status.to_run.update(tis_map or {})
+                if dag_run is not None:
+                    tis_map = self._task_instances_for_dag_run(dag, dag_run, session=session)
+                    ti_status.active_runs.append(dag_run)
+                    ti_status.to_run.update(tis_map or {})
 
         processed_dag_run_dates = self._process_backfill_task_instances(
             ti_status=ti_status,
diff --git a/airflow/jobs/job.py b/airflow/jobs/job.py
index f20808868db1d..63afa896fb6ae 100644
--- a/airflow/jobs/job.py
+++ b/airflow/jobs/job.py
@@ -153,7 +153,7 @@ def kill(self, session: Session = NEW_SESSION) -> NoReturn:
         try:
             self.on_kill()
         except Exception as e:
-            self.log.error("on_kill() method failed: %s", str(e))
+            self.log.error("on_kill() method failed: %s", e)
         session.merge(job)
         session.commit()
         raise AirflowException("Job shut down externally.")
@@ -190,7 +190,7 @@ def heartbeat(
             session.merge(self)
             previous_heartbeat = self.latest_heartbeat
 
-            if self.state in (JobState.SHUTDOWN, JobState.RESTARTING):
+            if self.state == JobState.RESTARTING:
                 # TODO: Make sure it is AIP-44 compliant
                 self.kill()
 
diff --git a/airflow/jobs/local_task_job_runner.py b/airflow/jobs/local_task_job_runner.py
index d04af55dcedc3..f20a8943614f9 100644
--- a/airflow/jobs/local_task_job_runner.py
+++ b/airflow/jobs/local_task_job_runner.py
@@ -285,7 +285,7 @@ def heartbeat_callback(self, session: Session = NEW_SESSION) -> None:
                 else:
                     dagrun_timeout = None
                 if dagrun_timeout and execution_time > dagrun_timeout:
-                    self.log.warning("DagRun timed out after %s.", str(execution_time))
+                    self.log.warning("DagRun timed out after %s.", execution_time)
 
             # potential race condition, the _run_raw_task commits `success` or other state
             # but task_runner does not exit right away due to slow process shutdown or any other reasons
diff --git a/airflow/jobs/scheduler_job_runner.py b/airflow/jobs/scheduler_job_runner.py
index 52ed72269a179..c92ff805cb42c 100644
--- a/airflow/jobs/scheduler_job_runner.py
+++ b/airflow/jobs/scheduler_job_runner.py
@@ -891,15 +891,13 @@ def _update_dag_run_state_for_paused_dags(self, session: Session = NEW_SESSION)
             )
             for dag_run in paused_runs:
                 dag = self.dagbag.get_dag(dag_run.dag_id, session=session)
-                if dag is None:
-                    continue
-
-                dag_run.dag = dag
-                _, callback_to_run = dag_run.update_state(execute_callbacks=False, session=session)
-                if callback_to_run:
-                    self._send_dag_callbacks_to_processor(dag, callback_to_run)
+                if dag is not None:
+                    dag_run.dag = dag
+                    _, callback_to_run = dag_run.update_state(execute_callbacks=False, session=session)
+                    if callback_to_run:
+                        self._send_dag_callbacks_to_processor(dag, callback_to_run)
         except Exception as e:  # should not fail the scheduler
-            self.log.exception("Failed to update dag run state for paused dags due to %s", str(e))
+            self.log.exception("Failed to update dag run state for paused dags due to %s", e)
 
     def _run_scheduler_loop(self) -> None:
         """
@@ -1067,13 +1065,12 @@ def _do_scheduling(self, session: Session) -> int:
         )
         for dag_run, callback_to_run in callback_tuples:
             dag = cached_get_dag(dag_run.dag_id)
-
-            if not dag:
+            if dag:
+                # Sending callbacks there as in standalone_dag_processor they are adding to the database,
+                # so it must be done outside of prohibit_commit.
+                self._send_dag_callbacks_to_processor(dag, callback_to_run)
+            else:
                 self.log.error("DAG '%s' not found in serialized_dag table", dag_run.dag_id)
-                continue
-            # Sending callbacks there as in standalone_dag_processor they are adding to the database,
-            # so it must be done outside of prohibit_commit.
-            self._send_dag_callbacks_to_processor(dag, callback_to_run)
 
         with prohibit_commit(session) as guard:
             # Without this, the session has an invalid view of the DB
@@ -1186,7 +1183,11 @@ def _create_dag_runs(self, dag_models: Collection[DagModel], session: Session) -
                 )
                 active_runs_of_dags[dag.dag_id] += 1
             if self._should_update_dag_next_dagruns(
-                dag, dag_model, active_runs_of_dags[dag.dag_id], session=session
+                dag,
+                dag_model,
+                last_dag_run=None,
+                total_active_runs=active_runs_of_dags[dag.dag_id],
+                session=session,
             ):
                 dag_model.calculate_dagrun_date_fields(dag, data_interval)
         # TODO[HA]: Should we do a session.flush() so we don't have to keep lots of state/object in
@@ -1294,9 +1295,22 @@ def _create_dag_runs_dataset_triggered(
                 )
 
     def _should_update_dag_next_dagruns(
-        self, dag: DAG, dag_model: DagModel, total_active_runs: int | None = None, *, session: Session
+        self,
+        dag: DAG,
+        dag_model: DagModel,
+        *,
+        last_dag_run: DagRun | None = None,
+        total_active_runs: int | None = None,
+        session: Session,
     ) -> bool:
         """Check if the dag's next_dagruns_create_after should be updated."""
+        # If last_dag_run is defined, the update was triggered by a scheduling decision in this DAG run.
+        # In such case, schedule next only if last_dag_run is finished and was an automated run.
+        if last_dag_run and not (
+            last_dag_run.state in State.finished_dr_states
+            and last_dag_run.run_type in [DagRunType.SCHEDULED, DagRunType.BACKFILL_JOB]
+        ):
+            return False
         # If the DAG never schedules skip save runtime
         if not dag.timetable.can_be_scheduled:
             return False
@@ -1431,8 +1445,8 @@ def _schedule_dag_run(
                 session.merge(task_instance)
             session.flush()
             self.log.info("Run %s of %s has timed-out", dag_run.run_id, dag_run.dag_id)
-            # Work out if we should allow creating a new DagRun now?
-            if self._should_update_dag_next_dagruns(dag, dag_model, session=session):
+
+            if self._should_update_dag_next_dagruns(dag, dag_model, last_dag_run=dag_run, session=session):
                 dag_model.calculate_dagrun_date_fields(dag, dag.get_run_data_interval(dag_run))
 
             callback_to_execute = DagCallbackRequest(
@@ -1459,11 +1473,9 @@ def _schedule_dag_run(
             return callback
         # TODO[HA]: Rename update_state -> schedule_dag_run, ?? something else?
         schedulable_tis, callback_to_run = dag_run.update_state(session=session, execute_callbacks=False)
-        # Check if DAG not scheduled then skip interval calculation to same scheduler runtime
-        if dag_run.state in State.finished_dr_states:
-            # Work out if we should allow creating a new DagRun now?
-            if self._should_update_dag_next_dagruns(dag, dag_model, session=session):
-                dag_model.calculate_dagrun_date_fields(dag, dag.get_run_data_interval(dag_run))
+
+        if self._should_update_dag_next_dagruns(dag, dag_model, last_dag_run=dag_run, session=session):
+            dag_model.calculate_dagrun_date_fields(dag, dag.get_run_data_interval(dag_run))
         # This will do one query per dag run. We "could" build up a complex
         # query to update all the TIs across all the execution dates and dag
         # IDs in a single query, but it turns out that can be _very very slow_
diff --git a/airflow/jobs/triggerer_job_runner.py b/airflow/jobs/triggerer_job_runner.py
index 95950c391e128..de2e549434aca 100644
--- a/airflow/jobs/triggerer_job_runner.py
+++ b/airflow/jobs/triggerer_job_runner.py
@@ -460,8 +460,8 @@ async def arun(self):
         """
         watchdog = asyncio.create_task(self.block_watchdog())
         last_status = time.time()
-        while not self.stop:
-            try:
+        try:
+            while not self.stop:
                 # Run core logic
                 await self.create_triggers()
                 await self.cancel_triggers()
@@ -473,9 +473,9 @@ async def arun(self):
                     count = len(self.triggers)
                     self.log.info("%i triggers currently running", count)
                     last_status = time.time()
-            except Exception:
-                self.stop = True
-                raise
+        except Exception:
+            self.stop = True
+            raise
         # Wait for watchdog to complete
         await watchdog
 
@@ -680,8 +680,7 @@ def update_triggers(self, requested_trigger_ids: set[int]):
             self.set_trigger_logging_metadata(new_trigger_orm.task_instance, new_id, new_trigger_instance)
             self.to_create.append((new_id, new_trigger_instance))
         # Enqueue orphaned triggers for cancellation
-        for old_id in cancel_trigger_ids:
-            self.to_cancel.append(old_id)
+        self.to_cancel.extend(cancel_trigger_ids)
 
     def set_trigger_logging_metadata(self, ti: TaskInstance, trigger_id, trigger):
         """
diff --git a/airflow/kubernetes/pre_7_4_0_compatibility/pod_generator.py b/airflow/kubernetes/pre_7_4_0_compatibility/pod_generator.py
index 1fe8d50d76c43..021dd36687108 100644
--- a/airflow/kubernetes/pre_7_4_0_compatibility/pod_generator.py
+++ b/airflow/kubernetes/pre_7_4_0_compatibility/pod_generator.py
@@ -363,9 +363,10 @@ def reconcile_containers(
         client_container = extend_object_field(base_container, client_container, "volume_devices")
         client_container = merge_objects(base_container, client_container)
 
-        return [client_container] + PodGenerator.reconcile_containers(
-            base_containers[1:], client_containers[1:]
-        )
+        return [
+            client_container,
+            *PodGenerator.reconcile_containers(base_containers[1:], client_containers[1:]),
+        ]
 
     @classmethod
     def construct_pod(
@@ -491,9 +492,9 @@ def build_selector_for_k8s_executor_pod(
             airflow_worker=airflow_worker,
         )
         label_strings = [f"{label_id}={label}" for label_id, label in sorted(labels.items())]
-        selector = ",".join(label_strings)
         if not airflow_worker:  # this filters out KPO pods even when we don't know the scheduler job id
-            selector += ",airflow-worker"
+            label_strings.append("airflow-worker")
+        selector = ",".join(label_strings)
         return selector
 
     @classmethod
diff --git a/airflow/listeners/listener.py b/airflow/listeners/listener.py
index dd5481cba1b34..eb738c3e918bf 100644
--- a/airflow/listeners/listener.py
+++ b/airflow/listeners/listener.py
@@ -46,7 +46,7 @@ def __init__(self):
 
     @property
     def has_listeners(self) -> bool:
-        return len(self.pm.get_plugins()) > 0
+        return bool(self.pm.get_plugins())
 
     @property
     def hook(self) -> _HookRelay:
diff --git a/airflow/metrics/validators.py b/airflow/metrics/validators.py
index 501229578d2b0..8bd6dd4476eb8 100644
--- a/airflow/metrics/validators.py
+++ b/airflow/metrics/validators.py
@@ -70,9 +70,12 @@ class MetricNameLengthExemptionWarning(Warning):
     r"^pool\.open_slots\.(?P<pool_name>.*)$",
     r"^pool\.queued_slots\.(?P<pool_name>.*)$",
     r"^pool\.running_slots\.(?P<pool_name>.*)$",
+    r"^pool\.deferred_slots\.(?P<pool_name>.*)$",
     r"^pool\.starving_tasks\.(?P<pool_name>.*)$",
     r"^dagrun\.dependency-check\.(?P<dag_id>.*)$",
     r"^dag\.(?P<dag_id>.*)\.(?P<task_id>.*)\.duration$",
+    r"^dag\.(?P<dag_id>.*)\.(?P<task_id>.*)\.queued_duration$",
+    r"^dag\.(?P<dag_id>.*)\.(?P<task_id>.*)\.scheduled_duration$",
     r"^dag_processing\.last_duration\.(?P<dag_file>.*)$",
     r"^dagrun\.duration\.success\.(?P<dag_id>.*)$",
     r"^dagrun\.duration\.failed\.(?P<dag_id>.*)$",
@@ -178,7 +181,7 @@ def stat_name_default_handler(
         raise InvalidStatsNameException(
             f"The stat_name ({stat_name}) has to be less than {max_length} characters."
         )
-    if not all((c in allowed_chars) for c in stat_name):
+    if any(c not in allowed_chars for c in stat_name):
         raise InvalidStatsNameException(
             f"The stat name ({stat_name}) has to be composed of ASCII "
             f"alphabets, numbers, or the underscore, dot, or dash characters."
diff --git a/airflow/models/baseoperator.py b/airflow/models/baseoperator.py
index fbf158ceefe74..48c7855ac1702 100644
--- a/airflow/models/baseoperator.py
+++ b/airflow/models/baseoperator.py
@@ -391,7 +391,7 @@ def apply_defaults(self: BaseOperator, *args: Any, **kwargs: Any) -> Any:
             from airflow.models.dag import DagContext
             from airflow.utils.task_group import TaskGroupContext
 
-            if len(args) > 0:
+            if args:
                 raise AirflowException("Use keyword arguments when initializing operators")
 
             instantiated_from_mapped = kwargs.pop(
@@ -1102,9 +1102,7 @@ def dag(self, dag: DAG | None):
 
         if self.__from_mapped:
             pass  # Don't add to DAG -- the mapped task takes the place.
-        elif self.task_id not in dag.task_dict:
-            dag.add_task(self)
-        elif self.task_id in dag.task_dict and dag.task_dict[self.task_id] is not self:
+        elif dag.task_dict.get(self.task_id) is not self:
             dag.add_task(self)
 
         self._dag = dag
diff --git a/airflow/models/dag.py b/airflow/models/dag.py
index b5f31f536fa91..3e27b6a795f99 100644
--- a/airflow/models/dag.py
+++ b/airflow/models/dag.py
@@ -87,6 +87,7 @@
     AirflowSkipException,
     DuplicateTaskIdFound,
     FailStopDagInvalidTriggerRule,
+    ParamValidationError,
     RemovedInAirflow3Warning,
     TaskNotFound,
 )
@@ -99,7 +100,13 @@
 from airflow.models.dagrun import RUN_ID_REGEX, DagRun
 from airflow.models.operator import Operator
 from airflow.models.param import DagParam, ParamsDict
-from airflow.models.taskinstance import Context, TaskInstance, TaskInstanceKey, clear_task_instances
+from airflow.models.taskinstance import (
+    Context,
+    TaskInstance,
+    TaskInstanceKey,
+    TaskReturnCode,
+    clear_task_instances,
+)
 from airflow.secrets.local_filesystem import LocalFilesystemBackend
 from airflow.security import permissions
 from airflow.stats import Stats
@@ -274,6 +281,14 @@ def get_dataset_triggered_next_run_info(
     }
 
 
+class _StopDagTest(Exception):
+    """
+    Raise when DAG.test should stop immediately.
+
+    :meta private:
+    """
+
+
 @functools.total_ordering
 class DAG(LoggingMixin):
     """
@@ -303,7 +318,8 @@ class DAG(LoggingMixin):
     :param description: The description for the DAG to e.g. be shown on the webserver
     :param schedule: Defines the rules according to which DAG runs are scheduled. Can
         accept cron string, timedelta object, Timetable, or list of Dataset objects.
-        See also :doc:`/howto/timetable`.
+        If this is not provided, the DAG will be set to the default
+        schedule ``timedelta(days=1)``. See also :doc:`/howto/timetable`.
     :param start_date: The timestamp from which the scheduler will
         attempt to backfill
     :param end_date: A date beyond which your DAG won't run, leave to None
@@ -777,7 +793,7 @@ def _upgrade_outdated_dag_access_control(access_control=None):
         will be replaced with 'can_read', in {'role2': {'can_dag_read', 'can_dag_edit'}}
         'can_dag_edit' will be replaced with 'can_edit', etc.
         """
-        if not access_control:
+        if access_control is None:
             return None
         new_perm_mapping = {
             permissions.DEPRECATED_ACTION_CAN_DAG_READ: permissions.ACTION_CAN_READ,
@@ -1591,7 +1607,7 @@ def get_task_instances_before(
             .limit(num)
         ).all()
 
-        if len(execution_dates) == 0:
+        if not execution_dates:
             return self.get_task_instances(start_date=base_date, end_date=base_date, session=session)
 
         min_date: datetime | None = execution_dates[-1]._mapping.get(
@@ -1706,7 +1722,7 @@ def _get_task_instances(
         if include_subdags:
             # Crafting the right filter for dag_id and task_ids combo
             conditions = []
-            for dag in self.subdags + [self]:
+            for dag in [*self.subdags, self]:
                 conditions.append(
                     (TaskInstance.dag_id == dag.dag_id) & TaskInstance.task_id.in_(dag.task_ids)
                 )
@@ -2755,7 +2771,17 @@ def add_logger_if_needed(ti: TaskInstance):
                 try:
                     add_logger_if_needed(ti)
                     ti.task = tasks[ti.task_id]
-                    _run_task(ti, session=session)
+                    ret = _run_task(ti, session=session)
+                    if ret is TaskReturnCode.DEFERRED:
+                        if not _triggerer_is_healthy():
+                            raise _StopDagTest(
+                                "Task has deferred but triggerer component is not running. "
+                                "You can start the triggerer by running `airflow triggerer` in a terminal."
+                            )
+                except _StopDagTest:
+                    # Let this exception bubble out and not be swallowed by the
+                    # except block below.
+                    raise
                 except Exception:
                     self.log.exception("Task failed; ti=%s", ti)
         if conn_file_path or variable_file_path:
@@ -3155,7 +3181,7 @@ def deactivate_unknown_dags(active_dag_ids, session=NEW_SESSION):
         :param active_dag_ids: list of DAG IDs that are active
         :return: None
         """
-        if len(active_dag_ids) == 0:
+        if not active_dag_ids:
             return
         for dag in session.scalars(select(DagModel).where(~DagModel.dag_id.in_(active_dag_ids))).all():
             dag.is_active = False
@@ -3275,20 +3301,20 @@ def set_edge_info(self, upstream_task_id: str, downstream_task_id: str, info: Ed
 
     def validate_schedule_and_params(self):
         """
-        Validate Param values when the schedule_interval is not None.
+        Validate Param values when the DAG has schedule defined.
 
-        Raise exception if there are any Params in the DAG which neither have a default value nor
-        have the null in schema['type'] list, but the DAG have a schedule_interval which is not None.
+        Raise exception if there are any Params which can not be resolved by their schema definition.
         """
         if not self.timetable.can_be_scheduled:
             return
 
-        for k, v in self.params.items():
-            # As type can be an array, we would check if `null` is an allowed type or not
-            if not v.has_value and ("type" not in v.schema or "null" not in v.schema["type"]):
-                raise AirflowException(
-                    "DAG Schedule must be None, if there are any required params without default values"
-                )
+        try:
+            self.params.validate()
+        except ParamValidationError as pverr:
+            raise AirflowException(
+                "DAG is not allowed to define a Schedule, "
+                "if there are any required params without default values or default values are not valid."
+            ) from pverr
 
     def iter_invalid_owner_links(self) -> Iterator[tuple[str, str]]:
         """
@@ -3883,7 +3909,14 @@ def get_current_dag(cls) -> DAG | None:
             return None
 
 
-def _run_task(ti: TaskInstance, session):
+def _triggerer_is_healthy():
+    from airflow.jobs.triggerer_job_runner import TriggererJobRunner
+
+    job = TriggererJobRunner.most_recent_job()
+    return job and job.is_alive()
+
+
+def _run_task(ti: TaskInstance, session) -> TaskReturnCode | None:
     """
     Run a single task instance, and push result to Xcom for downstream tasks.
 
@@ -3893,18 +3926,20 @@ def _run_task(ti: TaskInstance, session):
     Args:
         ti: TaskInstance to run
     """
+    ret = None
     log.info("*****************************************************")
     if ti.map_index > 0:
         log.info("Running task %s index %d", ti.task_id, ti.map_index)
     else:
         log.info("Running task %s", ti.task_id)
     try:
-        ti._run_raw_task(session=session)
+        ret = ti._run_raw_task(session=session)
         session.flush()
         log.info("%s ran successfully!", ti.task_id)
     except AirflowSkipException:
         log.info("Task Skipped, continuing")
     log.info("*****************************************************")
+    return ret
 
 
 def _get_or_create_dagrun(
diff --git a/airflow/models/dagbag.py b/airflow/models/dagbag.py
index 8608bcd13824d..151adcba9f203 100644
--- a/airflow/models/dagbag.py
+++ b/airflow/models/dagbag.py
@@ -28,6 +28,7 @@
 import warnings
 import zipfile
 from datetime import datetime, timedelta
+from pathlib import Path
 from typing import TYPE_CHECKING, NamedTuple
 
 from sqlalchemy.exc import OperationalError
@@ -56,8 +57,6 @@
 from airflow.utils.types import NOTSET, ArgNotSet
 
 if TYPE_CHECKING:
-    import pathlib
-
     from airflow.models.dag import DAG
 
 
@@ -93,7 +92,7 @@ class DagBag(LoggingMixin):
 
     def __init__(
         self,
-        dag_folder: str | pathlib.Path | None = None,
+        dag_folder: str | Path | None = None,
         include_examples: bool | ArgNotSet = NOTSET,
         safe_mode: bool | ArgNotSet = NOTSET,
         read_dags_from_db: bool = False,
@@ -325,8 +324,8 @@ def _load_modules_from_file(self, filepath, safe_mode):
             return []
 
         self.log.debug("Importing %s", filepath)
-        org_mod_name, _ = os.path.splitext(os.path.split(filepath)[-1])
         path_hash = hashlib.sha1(filepath.encode("utf-8")).hexdigest()
+        org_mod_name = Path(filepath).stem
         mod_name = f"unusual_prefix_{path_hash}_{org_mod_name}"
 
         if mod_name in sys.modules:
@@ -378,15 +377,12 @@ def _load_modules_from_zip(self, filepath, safe_mode):
         mods = []
         with zipfile.ZipFile(filepath) as current_zip_file:
             for zip_info in current_zip_file.infolist():
-                head, _ = os.path.split(zip_info.filename)
-                mod_name, ext = os.path.splitext(zip_info.filename)
-                if ext not in [".py", ".pyc"]:
-                    continue
-                if head:
+                zip_path = Path(zip_info.filename)
+                if zip_path.suffix not in [".py", ".pyc"] or len(zip_path.parts) > 1:
                     continue
 
-                if mod_name == "__init__":
-                    self.log.warning("Found __init__.%s at root of %s", ext, filepath)
+                if zip_path.stem == "__init__":
+                    self.log.warning("Found %s at root of %s", zip_path.name, filepath)
 
                 self.log.debug("Reading %s from %s", zip_info.filename, filepath)
 
@@ -400,6 +396,7 @@ def _load_modules_from_zip(self, filepath, safe_mode):
                         )
                     continue
 
+                mod_name = zip_path.stem
                 if mod_name in sys.modules:
                     del sys.modules[mod_name]
 
@@ -516,7 +513,7 @@ def _bag_dag(self, *, dag, root_dag, recursive):
 
     def collect_dags(
         self,
-        dag_folder: str | pathlib.Path | None = None,
+        dag_folder: str | Path | None = None,
         only_if_updated: bool = True,
         include_examples: bool = conf.getboolean("core", "LOAD_EXAMPLES"),
         safe_mode: bool = conf.getboolean("core", "DAG_DISCOVERY_SAFE_MODE"),
diff --git a/airflow/models/dagrun.py b/airflow/models/dagrun.py
index 98d9b8e781474..3b1cc66d925ce 100644
--- a/airflow/models/dagrun.py
+++ b/airflow/models/dagrun.py
@@ -303,7 +303,7 @@ def active_runs_of_dags(
         else:
             query = query.where(cls.state.in_((DagRunState.RUNNING, DagRunState.QUEUED)))
         query = query.group_by(cls.dag_id)
-        return {dag_id: count for dag_id, count in session.execute(query)}
+        return dict(iter(session.execute(query)))
 
     @classmethod
     def next_dagruns_to_examine(
@@ -1406,7 +1406,11 @@ class DagRunNote(Base):
 
     __tablename__ = "dag_run_note"
 
-    user_id = Column(Integer, nullable=True)
+    user_id = Column(
+        Integer,
+        ForeignKey("ab_user.id", name="dag_run_note_user_fkey"),
+        nullable=True,
+    )
     dag_run_id = Column(Integer, primary_key=True, nullable=False)
     content = Column(String(1000).with_variant(Text(1000), "mysql"))
     created_at = Column(UtcDateTime, default=timezone.utcnow, nullable=False)
@@ -1422,11 +1426,6 @@ class DagRunNote(Base):
             name="dag_run_note_dr_fkey",
             ondelete="CASCADE",
         ),
-        ForeignKeyConstraint(
-            (user_id,),
-            ["ab_user.id"],
-            name="dag_run_note_user_fkey",
-        ),
     )
 
     def __init__(self, content, user_id=None):
diff --git a/airflow/models/mappedoperator.py b/airflow/models/mappedoperator.py
index cbdc8ca056345..2a20ef8917790 100644
--- a/airflow/models/mappedoperator.py
+++ b/airflow/models/mappedoperator.py
@@ -29,7 +29,6 @@
 import pendulum
 from sqlalchemy.orm.session import Session
 
-from airflow import settings
 from airflow.compat.functools import cache
 from airflow.exceptions import AirflowException, UnmappableOperator
 from airflow.models.abstractoperator import (
@@ -64,6 +63,7 @@
 from airflow.utils.context import Context, context_update_for_unmapped
 from airflow.utils.helpers import is_container, prevent_duplicates
 from airflow.utils.operator_resources import Resources
+from airflow.utils.task_instance_session import get_current_task_instance_session
 from airflow.utils.trigger_rule import TriggerRule
 from airflow.utils.types import NOTSET
 from airflow.utils.xcom import XCOM_RETURN_KEY
@@ -714,12 +714,13 @@ def render_template_fields(
         if not jinja_env:
             jinja_env = self.get_template_env()
 
-        # Ideally we'd like to pass in session as an argument to this function,
-        # but we can't easily change this function signature since operators
-        # could override this. We can't use @provide_session since it closes and
-        # expunges everything, which we don't want to do when we are so "deep"
-        # in the weeds here. We don't close this session for the same reason.
-        session = settings.Session()
+        # We retrieve the session here, stored by _run_raw_task in set_current_task_session
+        # context manager - we cannot pass the session via @provide_session because the signature
+        # of render_template_fields is defined by BaseOperator and there are already many subclasses
+        # overriding it, so changing the signature is not an option. However render_template_fields is
+        # always executed within "_run_raw_task" so we make sure that _run_raw_task uses the
+        # set_current_task_session context manager to store the session in the current task.
+        session = get_current_task_instance_session()
 
         mapped_kwargs, seen_oids = self._expand_mapped_kwargs(context, session)
         unmapped_task = self.unmap(mapped_kwargs)
diff --git a/airflow/models/taskinstance.py b/airflow/models/taskinstance.py
index 0bd9d3d79d2a3..c8d4aae752d6e 100644
--- a/airflow/models/taskinstance.py
+++ b/airflow/models/taskinstance.py
@@ -43,6 +43,7 @@
     Column,
     DateTime,
     Float,
+    ForeignKey,
     ForeignKeyConstraint,
     Index,
     Integer,
@@ -124,6 +125,7 @@
 )
 from airflow.utils.state import DagRunState, JobState, State, TaskInstanceState
 from airflow.utils.task_group import MappedTaskGroup
+from airflow.utils.task_instance_session import set_current_task_instance_session
 from airflow.utils.timeout import timeout
 from airflow.utils.xcom import XCOM_RETURN_KEY
 
@@ -1507,98 +1509,98 @@ def _run_raw_task(
                 count=0,
                 tags={**self.stats_tags, "state": str(state)},
             )
+        with set_current_task_instance_session(session=session):
+            self.task = self.task.prepare_for_execution()
+            context = self.get_template_context(ignore_param_exceptions=False)
 
-        self.task = self.task.prepare_for_execution()
-        context = self.get_template_context(ignore_param_exceptions=False)
-
-        try:
-            if not mark_success:
-                self._execute_task_with_callbacks(context, test_mode, session=session)
-            if not test_mode:
-                self.refresh_from_db(lock_for_update=True, session=session)
-            self.state = TaskInstanceState.SUCCESS
-        except TaskDeferred as defer:
-            # The task has signalled it wants to defer execution based on
-            # a trigger.
-            self._defer_task(defer=defer, session=session)
-            self.log.info(
-                "Pausing task as DEFERRED. dag_id=%s, task_id=%s, execution_date=%s, start_date=%s",
-                self.dag_id,
-                self.task_id,
-                self._date_or_empty("execution_date"),
-                self._date_or_empty("start_date"),
-            )
-            if not test_mode:
-                session.add(Log(self.state, self))
-                session.merge(self)
-                session.commit()
-            return TaskReturnCode.DEFERRED
-        except AirflowSkipException as e:
-            # Recording SKIP
-            # log only if exception has any arguments to prevent log flooding
-            if e.args:
-                self.log.info(e)
-            if not test_mode:
-                self.refresh_from_db(lock_for_update=True, session=session)
-            self.state = TaskInstanceState.SKIPPED
-        except AirflowRescheduleException as reschedule_exception:
-            self._handle_reschedule(actual_start_date, reschedule_exception, test_mode, session=session)
-            session.commit()
-            return None
-        except (AirflowFailException, AirflowSensorTimeout) as e:
-            # If AirflowFailException is raised, task should not retry.
-            # If a sensor in reschedule mode reaches timeout, task should not retry.
-            self.handle_failure(e, test_mode, context, force_fail=True, session=session)
-            session.commit()
-            raise
-        except AirflowException as e:
-            if not test_mode:
-                self.refresh_from_db(lock_for_update=True, session=session)
-            # for case when task is marked as success/failed externally
-            # or dagrun timed out and task is marked as skipped
-            # current behavior doesn't hit the callbacks
-            if self.state in State.finished:
-                self.clear_next_method_args()
-                session.merge(self)
+            try:
+                if not mark_success:
+                    self._execute_task_with_callbacks(context, test_mode, session=session)
+                if not test_mode:
+                    self.refresh_from_db(lock_for_update=True, session=session)
+                self.state = TaskInstanceState.SUCCESS
+            except TaskDeferred as defer:
+                # The task has signalled it wants to defer execution based on
+                # a trigger.
+                self._defer_task(defer=defer, session=session)
+                self.log.info(
+                    "Pausing task as DEFERRED. dag_id=%s, task_id=%s, execution_date=%s, start_date=%s",
+                    self.dag_id,
+                    self.task_id,
+                    self._date_or_empty("execution_date"),
+                    self._date_or_empty("start_date"),
+                )
+                if not test_mode:
+                    session.add(Log(self.state, self))
+                    session.merge(self)
+                    session.commit()
+                return TaskReturnCode.DEFERRED
+            except AirflowSkipException as e:
+                # Recording SKIP
+                # log only if exception has any arguments to prevent log flooding
+                if e.args:
+                    self.log.info(e)
+                if not test_mode:
+                    self.refresh_from_db(lock_for_update=True, session=session)
+                self.state = TaskInstanceState.SKIPPED
+            except AirflowRescheduleException as reschedule_exception:
+                self._handle_reschedule(actual_start_date, reschedule_exception, test_mode, session=session)
                 session.commit()
                 return None
-            else:
+            except (AirflowFailException, AirflowSensorTimeout) as e:
+                # If AirflowFailException is raised, task should not retry.
+                # If a sensor in reschedule mode reaches timeout, task should not retry.
+                self.handle_failure(e, test_mode, context, force_fail=True, session=session)
+                session.commit()
+                raise
+            except AirflowException as e:
+                if not test_mode:
+                    self.refresh_from_db(lock_for_update=True, session=session)
+                # for case when task is marked as success/failed externally
+                # or dagrun timed out and task is marked as skipped
+                # current behavior doesn't hit the callbacks
+                if self.state in State.finished:
+                    self.clear_next_method_args()
+                    session.merge(self)
+                    session.commit()
+                    return None
+                else:
+                    self.handle_failure(e, test_mode, context, session=session)
+                    session.commit()
+                    raise
+            except (Exception, KeyboardInterrupt) as e:
                 self.handle_failure(e, test_mode, context, session=session)
                 session.commit()
                 raise
-        except (Exception, KeyboardInterrupt) as e:
-            self.handle_failure(e, test_mode, context, session=session)
-            session.commit()
-            raise
-        finally:
-            Stats.incr(f"ti.finish.{self.dag_id}.{self.task_id}.{self.state}", tags=self.stats_tags)
-            # Same metric with tagging
-            Stats.incr("ti.finish", tags={**self.stats_tags, "state": str(self.state)})
+            finally:
+                Stats.incr(f"ti.finish.{self.dag_id}.{self.task_id}.{self.state}", tags=self.stats_tags)
+                # Same metric with tagging
+                Stats.incr("ti.finish", tags={**self.stats_tags, "state": str(self.state)})
+
+            # Recording SKIPPED or SUCCESS
+            self.clear_next_method_args()
+            self.end_date = timezone.utcnow()
+            self._log_state()
+            self.set_duration()
+
+            # run on_success_callback before db committing
+            # otherwise, the LocalTaskJob sees the state is changed to `success`,
+            # but the task_runner is still running, LocalTaskJob then treats the state is set externally!
+            self._run_finished_callback(self.task.on_success_callback, context, "on_success")
 
-        # Recording SKIPPED or SUCCESS
-        self.clear_next_method_args()
-        self.end_date = timezone.utcnow()
-        self._log_state()
-        self.set_duration()
-
-        # run on_success_callback before db committing
-        # otherwise, the LocalTaskJob sees the state is changed to `success`,
-        # but the task_runner is still running, LocalTaskJob then treats the state is set externally!
-        self._run_finished_callback(self.task.on_success_callback, context, "on_success")
-
-        if not test_mode:
-            session.add(Log(self.state, self))
-            session.merge(self).task = self.task
-            if self.state == TaskInstanceState.SUCCESS:
-                self._register_dataset_changes(session=session)
+            if not test_mode:
+                session.add(Log(self.state, self))
+                session.merge(self).task = self.task
+                if self.state == TaskInstanceState.SUCCESS:
+                    self._register_dataset_changes(session=session)
 
-            session.commit()
-            if self.state == TaskInstanceState.SUCCESS:
-                get_listener_manager().hook.on_task_instance_success(
-                    previous_state=TaskInstanceState.RUNNING, task_instance=self, session=session
-                )
+                session.commit()
+                if self.state == TaskInstanceState.SUCCESS:
+                    get_listener_manager().hook.on_task_instance_success(
+                        previous_state=TaskInstanceState.RUNNING, task_instance=self, session=session
+                    )
 
-        return None
+            return None
 
     def _register_dataset_changes(self, *, session: Session) -> None:
         for obj in self.task.outlets or []:
@@ -2141,7 +2143,7 @@ def get_prev_ds() -> str | None:
             execution_date = get_prev_execution_date()
             if execution_date is None:
                 return None
-            return execution_date.strftime(r"%Y-%m-%d")
+            return execution_date.strftime("%Y-%m-%d")
 
         def get_prev_ds_nodash() -> str | None:
             prev_ds = get_prev_ds()
@@ -3014,7 +3016,7 @@ class TaskInstanceNote(Base):
 
     __tablename__ = "task_instance_note"
 
-    user_id = Column(Integer, nullable=True)
+    user_id = Column(Integer, ForeignKey("ab_user.id", name="task_instance_note_user_fkey"), nullable=True)
     task_id = Column(StringID(), primary_key=True, nullable=False)
     dag_id = Column(StringID(), primary_key=True, nullable=False)
     run_id = Column(StringID(), primary_key=True, nullable=False)
@@ -3040,11 +3042,6 @@ class TaskInstanceNote(Base):
             name="task_instance_note_ti_fkey",
             ondelete="CASCADE",
         ),
-        ForeignKeyConstraint(
-            (user_id,),
-            ["ab_user.id"],
-            name="task_instance_note_user_fkey",
-        ),
     )
 
     def __init__(self, content, user_id=None):
diff --git a/airflow/operators/__init__.py b/airflow/operators/__init__.py
index f4acbe0ebf883..f79046e5aeb9d 100644
--- a/airflow/operators/__init__.py
+++ b/airflow/operators/__init__.py
@@ -22,172 +22,172 @@
 from airflow.utils.deprecation_tools import add_deprecated_classes
 
 __deprecated_classes = {
-    'bash_operator': {
-        'BashOperator': 'airflow.operators.bash.BashOperator',
+    "bash_operator": {
+        "BashOperator": "airflow.operators.bash.BashOperator",
     },
-    'branch_operator': {
-        'BaseBranchOperator': 'airflow.operators.branch.BaseBranchOperator',
+    "branch_operator": {
+        "BaseBranchOperator": "airflow.operators.branch.BaseBranchOperator",
     },
-    'check_operator': {
-        'SQLCheckOperator': 'airflow.providers.common.sql.operators.sql.SQLCheckOperator',
-        'SQLIntervalCheckOperator': 'airflow.providers.common.sql.operators.sql.SQLIntervalCheckOperator',
-        'SQLThresholdCheckOperator': 'airflow.providers.common.sql.operators.sql.SQLThresholdCheckOperator',
-        'SQLValueCheckOperator': 'airflow.providers.common.sql.operators.sql.SQLValueCheckOperator',
-        'CheckOperator': 'airflow.providers.common.sql.operators.sql.SQLCheckOperator',
-        'IntervalCheckOperator': 'airflow.providers.common.sql.operators.sql.SQLIntervalCheckOperator',
-        'ThresholdCheckOperator': 'airflow.providers.common.sql.operators.sql.SQLThresholdCheckOperator',
-        'ValueCheckOperator': 'airflow.providers.common.sql.operators.sql.SQLValueCheckOperator',
+    "check_operator": {
+        "SQLCheckOperator": "airflow.providers.common.sql.operators.sql.SQLCheckOperator",
+        "SQLIntervalCheckOperator": "airflow.providers.common.sql.operators.sql.SQLIntervalCheckOperator",
+        "SQLThresholdCheckOperator": "airflow.providers.common.sql.operators.sql.SQLThresholdCheckOperator",
+        "SQLValueCheckOperator": "airflow.providers.common.sql.operators.sql.SQLValueCheckOperator",
+        "CheckOperator": "airflow.providers.common.sql.operators.sql.SQLCheckOperator",
+        "IntervalCheckOperator": "airflow.providers.common.sql.operators.sql.SQLIntervalCheckOperator",
+        "ThresholdCheckOperator": "airflow.providers.common.sql.operators.sql.SQLThresholdCheckOperator",
+        "ValueCheckOperator": "airflow.providers.common.sql.operators.sql.SQLValueCheckOperator",
     },
-    'dagrun_operator': {
-        'TriggerDagRunLink': 'airflow.operators.trigger_dagrun.TriggerDagRunLink',
-        'TriggerDagRunOperator': 'airflow.operators.trigger_dagrun.TriggerDagRunOperator',
+    "dagrun_operator": {
+        "TriggerDagRunLink": "airflow.operators.trigger_dagrun.TriggerDagRunLink",
+        "TriggerDagRunOperator": "airflow.operators.trigger_dagrun.TriggerDagRunOperator",
     },
-    'docker_operator': {
-        'DockerOperator': 'airflow.providers.docker.operators.docker.DockerOperator',
+    "docker_operator": {
+        "DockerOperator": "airflow.providers.docker.operators.docker.DockerOperator",
     },
-    'druid_check_operator': {
-        'DruidCheckOperator': 'airflow.providers.apache.druid.operators.druid_check.DruidCheckOperator',
+    "druid_check_operator": {
+        "DruidCheckOperator": "airflow.providers.apache.druid.operators.druid_check.DruidCheckOperator",
     },
-    'dummy': {
-        'EmptyOperator': 'airflow.operators.empty.EmptyOperator',
-        'DummyOperator': 'airflow.operators.empty.EmptyOperator',
+    "dummy": {
+        "EmptyOperator": "airflow.operators.empty.EmptyOperator",
+        "DummyOperator": "airflow.operators.empty.EmptyOperator",
     },
-    'dummy_operator': {
-        'EmptyOperator': 'airflow.operators.empty.EmptyOperator',
-        'DummyOperator': 'airflow.operators.empty.EmptyOperator',
+    "dummy_operator": {
+        "EmptyOperator": "airflow.operators.empty.EmptyOperator",
+        "DummyOperator": "airflow.operators.empty.EmptyOperator",
     },
-    'email_operator': {
-        'EmailOperator': 'airflow.operators.email.EmailOperator',
+    "email_operator": {
+        "EmailOperator": "airflow.operators.email.EmailOperator",
     },
-    'gcs_to_s3': {
-        'GCSToS3Operator': 'airflow.providers.amazon.aws.transfers.gcs_to_s3.GCSToS3Operator',
+    "gcs_to_s3": {
+        "GCSToS3Operator": "airflow.providers.amazon.aws.transfers.gcs_to_s3.GCSToS3Operator",
     },
-    'google_api_to_s3_transfer': {
-        'GoogleApiToS3Operator': (
-            'airflow.providers.amazon.aws.transfers.google_api_to_s3.GoogleApiToS3Operator'
+    "google_api_to_s3_transfer": {
+        "GoogleApiToS3Operator": (
+            "airflow.providers.amazon.aws.transfers.google_api_to_s3.GoogleApiToS3Operator"
         ),
-        'GoogleApiToS3Transfer': (
-            'airflow.providers.amazon.aws.transfers.google_api_to_s3.GoogleApiToS3Operator'
+        "GoogleApiToS3Transfer": (
+            "airflow.providers.amazon.aws.transfers.google_api_to_s3.GoogleApiToS3Operator"
         ),
     },
-    'hive_operator': {
-        'HiveOperator': 'airflow.providers.apache.hive.operators.hive.HiveOperator',
+    "hive_operator": {
+        "HiveOperator": "airflow.providers.apache.hive.operators.hive.HiveOperator",
     },
-    'hive_stats_operator': {
-        'HiveStatsCollectionOperator': (
-            'airflow.providers.apache.hive.operators.hive_stats.HiveStatsCollectionOperator'
+    "hive_stats_operator": {
+        "HiveStatsCollectionOperator": (
+            "airflow.providers.apache.hive.operators.hive_stats.HiveStatsCollectionOperator"
         ),
     },
-    'hive_to_druid': {
-        'HiveToDruidOperator': 'airflow.providers.apache.druid.transfers.hive_to_druid.HiveToDruidOperator',
-        'HiveToDruidTransfer': 'airflow.providers.apache.druid.transfers.hive_to_druid.HiveToDruidOperator',
+    "hive_to_druid": {
+        "HiveToDruidOperator": "airflow.providers.apache.druid.transfers.hive_to_druid.HiveToDruidOperator",
+        "HiveToDruidTransfer": "airflow.providers.apache.druid.transfers.hive_to_druid.HiveToDruidOperator",
     },
-    'hive_to_mysql': {
-        'HiveToMySqlOperator': 'airflow.providers.apache.hive.transfers.hive_to_mysql.HiveToMySqlOperator',
-        'HiveToMySqlTransfer': 'airflow.providers.apache.hive.transfers.hive_to_mysql.HiveToMySqlOperator',
+    "hive_to_mysql": {
+        "HiveToMySqlOperator": "airflow.providers.apache.hive.transfers.hive_to_mysql.HiveToMySqlOperator",
+        "HiveToMySqlTransfer": "airflow.providers.apache.hive.transfers.hive_to_mysql.HiveToMySqlOperator",
     },
-    'hive_to_samba_operator': {
-        'HiveToSambaOperator': 'airflow.providers.apache.hive.transfers.hive_to_samba.HiveToSambaOperator',
+    "hive_to_samba_operator": {
+        "HiveToSambaOperator": "airflow.providers.apache.hive.transfers.hive_to_samba.HiveToSambaOperator",
     },
-    'http_operator': {
-        'SimpleHttpOperator': 'airflow.providers.http.operators.http.SimpleHttpOperator',
+    "http_operator": {
+        "SimpleHttpOperator": "airflow.providers.http.operators.http.SimpleHttpOperator",
     },
-    'jdbc_operator': {
-        'JdbcOperator': 'airflow.providers.jdbc.operators.jdbc.JdbcOperator',
+    "jdbc_operator": {
+        "JdbcOperator": "airflow.providers.jdbc.operators.jdbc.JdbcOperator",
     },
-    'latest_only_operator': {
-        'LatestOnlyOperator': 'airflow.operators.latest_only.LatestOnlyOperator',
+    "latest_only_operator": {
+        "LatestOnlyOperator": "airflow.operators.latest_only.LatestOnlyOperator",
     },
-    'mssql_operator': {
-        'MsSqlOperator': 'airflow.providers.microsoft.mssql.operators.mssql.MsSqlOperator',
+    "mssql_operator": {
+        "MsSqlOperator": "airflow.providers.microsoft.mssql.operators.mssql.MsSqlOperator",
     },
-    'mssql_to_hive': {
-        'MsSqlToHiveOperator': 'airflow.providers.apache.hive.transfers.mssql_to_hive.MsSqlToHiveOperator',
-        'MsSqlToHiveTransfer': 'airflow.providers.apache.hive.transfers.mssql_to_hive.MsSqlToHiveOperator',
+    "mssql_to_hive": {
+        "MsSqlToHiveOperator": "airflow.providers.apache.hive.transfers.mssql_to_hive.MsSqlToHiveOperator",
+        "MsSqlToHiveTransfer": "airflow.providers.apache.hive.transfers.mssql_to_hive.MsSqlToHiveOperator",
     },
-    'mysql_operator': {
-        'MySqlOperator': 'airflow.providers.mysql.operators.mysql.MySqlOperator',
+    "mysql_operator": {
+        "MySqlOperator": "airflow.providers.mysql.operators.mysql.MySqlOperator",
     },
-    'mysql_to_hive': {
-        'MySqlToHiveOperator': 'airflow.providers.apache.hive.transfers.mysql_to_hive.MySqlToHiveOperator',
-        'MySqlToHiveTransfer': 'airflow.providers.apache.hive.transfers.mysql_to_hive.MySqlToHiveOperator',
+    "mysql_to_hive": {
+        "MySqlToHiveOperator": "airflow.providers.apache.hive.transfers.mysql_to_hive.MySqlToHiveOperator",
+        "MySqlToHiveTransfer": "airflow.providers.apache.hive.transfers.mysql_to_hive.MySqlToHiveOperator",
     },
-    'oracle_operator': {
-        'OracleOperator': 'airflow.providers.oracle.operators.oracle.OracleOperator',
+    "oracle_operator": {
+        "OracleOperator": "airflow.providers.oracle.operators.oracle.OracleOperator",
     },
-    'papermill_operator': {
-        'PapermillOperator': 'airflow.providers.papermill.operators.papermill.PapermillOperator',
+    "papermill_operator": {
+        "PapermillOperator": "airflow.providers.papermill.operators.papermill.PapermillOperator",
     },
-    'pig_operator': {
-        'PigOperator': 'airflow.providers.apache.pig.operators.pig.PigOperator',
+    "pig_operator": {
+        "PigOperator": "airflow.providers.apache.pig.operators.pig.PigOperator",
     },
-    'postgres_operator': {
-        'Mapping': 'airflow.providers.postgres.operators.postgres.Mapping',
-        'PostgresOperator': 'airflow.providers.postgres.operators.postgres.PostgresOperator',
+    "postgres_operator": {
+        "Mapping": "airflow.providers.postgres.operators.postgres.Mapping",
+        "PostgresOperator": "airflow.providers.postgres.operators.postgres.PostgresOperator",
     },
-    'presto_check_operator': {
-        'SQLCheckOperator': 'airflow.providers.common.sql.operators.sql.SQLCheckOperator',
-        'SQLIntervalCheckOperator': 'airflow.providers.common.sql.operators.sql.SQLIntervalCheckOperator',
-        'SQLValueCheckOperator': 'airflow.providers.common.sql.operators.sql.SQLValueCheckOperator',
-        'PrestoCheckOperator': 'airflow.providers.common.sql.operators.sql.SQLCheckOperator',
-        'PrestoIntervalCheckOperator': 'airflow.providers.common.sql.operators.sql.SQLIntervalCheckOperator',
-        'PrestoValueCheckOperator': 'airflow.providers.common.sql.operators.sql.SQLValueCheckOperator',
+    "presto_check_operator": {
+        "SQLCheckOperator": "airflow.providers.common.sql.operators.sql.SQLCheckOperator",
+        "SQLIntervalCheckOperator": "airflow.providers.common.sql.operators.sql.SQLIntervalCheckOperator",
+        "SQLValueCheckOperator": "airflow.providers.common.sql.operators.sql.SQLValueCheckOperator",
+        "PrestoCheckOperator": "airflow.providers.common.sql.operators.sql.SQLCheckOperator",
+        "PrestoIntervalCheckOperator": "airflow.providers.common.sql.operators.sql.SQLIntervalCheckOperator",
+        "PrestoValueCheckOperator": "airflow.providers.common.sql.operators.sql.SQLValueCheckOperator",
     },
-    'presto_to_mysql': {
-        'PrestoToMySqlOperator': 'airflow.providers.mysql.transfers.presto_to_mysql.PrestoToMySqlOperator',
-        'PrestoToMySqlTransfer': 'airflow.providers.mysql.transfers.presto_to_mysql.PrestoToMySqlOperator',
+    "presto_to_mysql": {
+        "PrestoToMySqlOperator": "airflow.providers.mysql.transfers.presto_to_mysql.PrestoToMySqlOperator",
+        "PrestoToMySqlTransfer": "airflow.providers.mysql.transfers.presto_to_mysql.PrestoToMySqlOperator",
     },
-    'python_operator': {
-        'BranchPythonOperator': 'airflow.operators.python.BranchPythonOperator',
-        'PythonOperator': 'airflow.operators.python.PythonOperator',
-        'PythonVirtualenvOperator': 'airflow.operators.python.PythonVirtualenvOperator',
-        'ShortCircuitOperator': 'airflow.operators.python.ShortCircuitOperator',
+    "python_operator": {
+        "BranchPythonOperator": "airflow.operators.python.BranchPythonOperator",
+        "PythonOperator": "airflow.operators.python.PythonOperator",
+        "PythonVirtualenvOperator": "airflow.operators.python.PythonVirtualenvOperator",
+        "ShortCircuitOperator": "airflow.operators.python.ShortCircuitOperator",
     },
-    'redshift_to_s3_operator': {
-        'RedshiftToS3Operator': 'airflow.providers.amazon.aws.transfers.redshift_to_s3.RedshiftToS3Operator',
-        'RedshiftToS3Transfer': 'airflow.providers.amazon.aws.transfers.redshift_to_s3.RedshiftToS3Operator',
+    "redshift_to_s3_operator": {
+        "RedshiftToS3Operator": "airflow.providers.amazon.aws.transfers.redshift_to_s3.RedshiftToS3Operator",
+        "RedshiftToS3Transfer": "airflow.providers.amazon.aws.transfers.redshift_to_s3.RedshiftToS3Operator",
     },
-    's3_file_transform_operator': {
-        'S3FileTransformOperator': (
-            'airflow.providers.amazon.aws.operators.s3_file_transform.S3FileTransformOperator'
+    "s3_file_transform_operator": {
+        "S3FileTransformOperator": (
+            "airflow.providers.amazon.aws.operators.s3_file_transform.S3FileTransformOperator"
         ),
     },
-    's3_to_hive_operator': {
-        'S3ToHiveOperator': 'airflow.providers.apache.hive.transfers.s3_to_hive.S3ToHiveOperator',
-        'S3ToHiveTransfer': 'airflow.providers.apache.hive.transfers.s3_to_hive.S3ToHiveOperator',
-    },
-    's3_to_redshift_operator': {
-        'S3ToRedshiftOperator': 'airflow.providers.amazon.aws.transfers.s3_to_redshift.S3ToRedshiftOperator',
-        'S3ToRedshiftTransfer': 'airflow.providers.amazon.aws.transfers.s3_to_redshift.S3ToRedshiftOperator',
-    },
-    'slack_operator': {
-        'SlackAPIOperator': 'airflow.providers.slack.operators.slack.SlackAPIOperator',
-        'SlackAPIPostOperator': 'airflow.providers.slack.operators.slack.SlackAPIPostOperator',
-    },
-    'sql': {
-        'BaseSQLOperator': 'airflow.providers.common.sql.operators.sql.BaseSQLOperator',
-        'BranchSQLOperator': 'airflow.providers.common.sql.operators.sql.BranchSQLOperator',
-        'SQLCheckOperator': 'airflow.providers.common.sql.operators.sql.SQLCheckOperator',
-        'SQLColumnCheckOperator': 'airflow.providers.common.sql.operators.sql.SQLColumnCheckOperator',
-        'SQLIntervalCheckOperator': 'airflow.providers.common.sql.operators.sql.SQLIntervalCheckOperator',
-        'SQLTableCheckOperator': 'airflow.providers.common.sql.operators.sql.SQLTableCheckOperator',
-        'SQLThresholdCheckOperator': 'airflow.providers.common.sql.operators.sql.SQLThresholdCheckOperator',
-        'SQLValueCheckOperator': 'airflow.providers.common.sql.operators.sql.SQLValueCheckOperator',
-        '_convert_to_float_if_possible': (
-            'airflow.providers.common.sql.operators.sql._convert_to_float_if_possible'
+    "s3_to_hive_operator": {
+        "S3ToHiveOperator": "airflow.providers.apache.hive.transfers.s3_to_hive.S3ToHiveOperator",
+        "S3ToHiveTransfer": "airflow.providers.apache.hive.transfers.s3_to_hive.S3ToHiveOperator",
+    },
+    "s3_to_redshift_operator": {
+        "S3ToRedshiftOperator": "airflow.providers.amazon.aws.transfers.s3_to_redshift.S3ToRedshiftOperator",
+        "S3ToRedshiftTransfer": "airflow.providers.amazon.aws.transfers.s3_to_redshift.S3ToRedshiftOperator",
+    },
+    "slack_operator": {
+        "SlackAPIOperator": "airflow.providers.slack.operators.slack.SlackAPIOperator",
+        "SlackAPIPostOperator": "airflow.providers.slack.operators.slack.SlackAPIPostOperator",
+    },
+    "sql": {
+        "BaseSQLOperator": "airflow.providers.common.sql.operators.sql.BaseSQLOperator",
+        "BranchSQLOperator": "airflow.providers.common.sql.operators.sql.BranchSQLOperator",
+        "SQLCheckOperator": "airflow.providers.common.sql.operators.sql.SQLCheckOperator",
+        "SQLColumnCheckOperator": "airflow.providers.common.sql.operators.sql.SQLColumnCheckOperator",
+        "SQLIntervalCheckOperator": "airflow.providers.common.sql.operators.sql.SQLIntervalCheckOperator",
+        "SQLTableCheckOperator": "airflow.providers.common.sql.operators.sql.SQLTableCheckOperator",
+        "SQLThresholdCheckOperator": "airflow.providers.common.sql.operators.sql.SQLThresholdCheckOperator",
+        "SQLValueCheckOperator": "airflow.providers.common.sql.operators.sql.SQLValueCheckOperator",
+        "_convert_to_float_if_possible": (
+            "airflow.providers.common.sql.operators.sql._convert_to_float_if_possible"
         ),
-        'parse_boolean': 'airflow.providers.common.sql.operators.sql.parse_boolean',
+        "parse_boolean": "airflow.providers.common.sql.operators.sql.parse_boolean",
     },
-    'sql_branch_operator': {
-        'BranchSQLOperator': 'airflow.providers.common.sql.operators.sql.BranchSQLOperator',
-        'BranchSqlOperator': 'airflow.providers.common.sql.operators.sql.BranchSQLOperator',
+    "sql_branch_operator": {
+        "BranchSQLOperator": "airflow.providers.common.sql.operators.sql.BranchSQLOperator",
+        "BranchSqlOperator": "airflow.providers.common.sql.operators.sql.BranchSQLOperator",
     },
-    'sqlite_operator': {
-        'SqliteOperator': 'airflow.providers.sqlite.operators.sqlite.SqliteOperator',
+    "sqlite_operator": {
+        "SqliteOperator": "airflow.providers.sqlite.operators.sqlite.SqliteOperator",
     },
-    'subdag_operator': {
-        'SkippedStatePropagationOptions': 'airflow.operators.subdag.SkippedStatePropagationOptions',
-        'SubDagOperator': 'airflow.operators.subdag.SubDagOperator',
+    "subdag_operator": {
+        "SkippedStatePropagationOptions": "airflow.operators.subdag.SkippedStatePropagationOptions",
+        "SubDagOperator": "airflow.operators.subdag.SubDagOperator",
     },
 }
 
diff --git a/airflow/operators/python.py b/airflow/operators/python.py
index e12e9bc4e9e1c..aa4a53a8c0096 100644
--- a/airflow/operators/python.py
+++ b/airflow/operators/python.py
@@ -419,7 +419,7 @@ def __deepcopy__(self, memo):
         return super().__deepcopy__(memo)
 
     def _execute_python_callable_in_subprocess(self, python_path: Path, tmp_dir: Path):
-        op_kwargs: dict[str, Any] = {k: v for k, v in self.op_kwargs.items()}
+        op_kwargs: dict[str, Any] = dict(self.op_kwargs)
         if self.templates_dict:
             op_kwargs["templates_dict"] = self.templates_dict
         input_path = tmp_dir / "script.in"
@@ -430,14 +430,14 @@ def _execute_python_callable_in_subprocess(self, python_path: Path, tmp_dir: Pat
         self._write_args(input_path)
         self._write_string_args(string_args_path)
         write_python_script(
-            jinja_context=dict(
-                op_args=self.op_args,
-                op_kwargs=op_kwargs,
-                expect_airflow=self.expect_airflow,
-                pickling_library=self.pickling_library.__name__,
-                python_callable=self.python_callable.__name__,
-                python_callable_source=self.get_python_source(),
-            ),
+            jinja_context={
+                "op_args": self.op_args,
+                "op_kwargs": op_kwargs,
+                "expect_airflow": self.expect_airflow,
+                "pickling_library": self.pickling_library.__name__,
+                "python_callable": self.python_callable.__name__,
+                "python_callable_source": self.get_python_source(),
+            },
             filename=os.fspath(script_path),
             render_template_as_native_obj=self.dag.render_template_as_native_obj,
         )
@@ -529,7 +529,7 @@ def __init__(
         *,
         python_callable: Callable,
         requirements: None | Iterable[str] | str = None,
-        python_version: str | int | float | None = None,
+        python_version: str | None = None,
         use_dill: bool = False,
         system_site_packages: bool = True,
         pip_install_options: list[str] | None = None,
@@ -552,6 +552,13 @@ def __init__(
                 "major versions for PythonVirtualenvOperator. Please use string_args."
                 f"Sys version: {sys.version_info}. Venv version: {python_version}"
             )
+        if python_version is not None and not isinstance(python_version, str):
+            warnings.warn(
+                "Passing non-string types (e.g. int or float) as python_version "
+                "is deprecated. Please use string value instead.",
+                RemovedInAirflow3Warning,
+                stacklevel=2,
+            )
         if not is_venv_installed():
             raise AirflowException("PythonVirtualenvOperator requires virtualenv, please install it.")
         if not requirements:
diff --git a/airflow/plugins_manager.py b/airflow/plugins_manager.py
index 1b117101d7f65..ef51175b532e3 100644
--- a/airflow/plugins_manager.py
+++ b/airflow/plugins_manager.py
@@ -26,6 +26,7 @@
 import os
 import sys
 import types
+from pathlib import Path
 from typing import TYPE_CHECKING, Any, Iterable
 
 try:
@@ -252,11 +253,10 @@ def load_plugins_from_plugin_directory():
     log.debug("Loading plugins from directory: %s", settings.PLUGINS_FOLDER)
 
     for file_path in find_path_from_directory(settings.PLUGINS_FOLDER, ".airflowignore"):
-        if not os.path.isfile(file_path):
-            continue
-        mod_name, file_ext = os.path.splitext(os.path.split(file_path)[-1])
-        if file_ext != ".py":
+        path = Path(file_path)
+        if not path.is_file() or path.suffix != ".py":
             continue
+        mod_name = path.stem
 
         try:
             loader = importlib.machinery.SourceFileLoader(mod_name, file_path)
@@ -286,13 +286,12 @@ def load_providers_plugins():
 
         try:
             plugin_instance = import_string(plugin.plugin_class)
-            if not is_valid_plugin(plugin_instance):
+            if is_valid_plugin(plugin_instance):
+                register_plugin(plugin_instance)
+            else:
                 log.warning("Plugin %s is not a valid plugin", plugin.name)
-                continue
-            register_plugin(plugin_instance)
         except ImportError:
             log.exception("Failed to load plugin %s from class name %s", plugin.name, plugin.plugin_class)
-            continue
 
 
 def make_module(name: str, objects: list[Any]):
@@ -342,9 +341,8 @@ def ensure_plugins_loaded():
         for plugin in plugins:
             registered_hooks.extend(plugin.hooks)
 
-    num_loaded = len(plugins)
-    if num_loaded > 0:
-        log.debug("Loading %d plugin(s) took %.2f seconds", num_loaded, timer.duration)
+    if plugins:
+        log.debug("Loading %d plugin(s) took %.2f seconds", len(plugins), timer.duration)
 
 
 def initialize_web_ui_plugins():
diff --git a/airflow/policies.py b/airflow/policies.py
index f37703fe2a250..6b40b5ac5f3a3 100644
--- a/airflow/policies.py
+++ b/airflow/policies.py
@@ -171,7 +171,7 @@ def _make_shim_fn(name, desired_sig, target):
         #
         codestr = textwrap.dedent(
             f"""
-            def {name}_name_mismatch_shim{str(desired_sig)}:
+            def {name}_name_mismatch_shim{desired_sig}:
                 return __target({' ,'.join(desired_sig.parameters)})
             """
         )
diff --git a/airflow/providers/amazon/aws/hooks/base_aws.py b/airflow/providers/amazon/aws/hooks/base_aws.py
index a908882e89ba2..735285418d4bd 100644
--- a/airflow/providers/amazon/aws/hooks/base_aws.py
+++ b/airflow/providers/amazon/aws/hooks/base_aws.py
@@ -33,7 +33,6 @@
 import warnings
 from copy import deepcopy
 from functools import cached_property, wraps
-from os import PathLike
 from pathlib import Path
 from typing import TYPE_CHECKING, Any, Callable, Generic, TypeVar, Union
 
@@ -827,7 +826,7 @@ def test_connection(self):
             return False, str(f"{type(e).__name__!r} error occurred while testing connection: {e}")
 
     @cached_property
-    def waiter_path(self) -> PathLike[str] | None:
+    def waiter_path(self) -> os.PathLike[str] | None:
         filename = self.client_type if self.client_type else self.resource_type
         path = Path(__file__).parents[1].joinpath(f"waiters/{filename}.json").resolve()
         return path if path.exists() else None
diff --git a/airflow/providers/amazon/aws/hooks/batch_client.py b/airflow/providers/amazon/aws/hooks/batch_client.py
index 5e5c8f75a2d08..81bf3f781df5c 100644
--- a/airflow/providers/amazon/aws/hooks/batch_client.py
+++ b/airflow/providers/amazon/aws/hooks/batch_client.py
@@ -27,9 +27,9 @@
 from __future__ import annotations
 
 import itertools
-from random import uniform
+import random
 from time import sleep
-from typing import Callable
+from typing import TYPE_CHECKING, Callable
 
 import botocore.client
 import botocore.exceptions
@@ -37,9 +37,11 @@
 
 from airflow.exceptions import AirflowException
 from airflow.providers.amazon.aws.hooks.base_aws import AwsBaseHook
-from airflow.providers.amazon.aws.utils.task_log_fetcher import AwsTaskLogFetcher
 from airflow.typing_compat import Protocol, runtime_checkable
 
+if TYPE_CHECKING:
+    from airflow.providers.amazon.aws.utils.task_log_fetcher import AwsTaskLogFetcher
+
 
 @runtime_checkable
 class BatchProtocol(Protocol):
@@ -527,7 +529,7 @@ def add_jitter(delay: int | float, width: int | float = 1, minima: int | float =
         minima = abs(minima)
         lower = max(minima, delay - width)
         upper = delay + width
-        return uniform(lower, upper)
+        return random.uniform(lower, upper)
 
     @staticmethod
     def delay(delay: int | float | None = None) -> None:
@@ -544,7 +546,7 @@ def delay(delay: int | float | None = None) -> None:
             when many concurrent tasks request job-descriptions.
         """
         if delay is None:
-            delay = uniform(BatchClientHook.DEFAULT_DELAY_MIN, BatchClientHook.DEFAULT_DELAY_MAX)
+            delay = random.uniform(BatchClientHook.DEFAULT_DELAY_MIN, BatchClientHook.DEFAULT_DELAY_MAX)
         else:
             delay = BatchClientHook.add_jitter(delay)
         sleep(delay)
@@ -593,4 +595,4 @@ def exp(tries):
         max_interval = 600.0  # results in 3 to 10 minute delay
         delay = 1 + pow(tries * 0.6, 2)
         delay = min(max_interval, delay)
-        return uniform(delay / 3, delay)
+        return random.uniform(delay / 3, delay)
diff --git a/airflow/providers/amazon/aws/hooks/datasync.py b/airflow/providers/amazon/aws/hooks/datasync.py
index 32fc7621531f3..0373fdc6933a4 100644
--- a/airflow/providers/amazon/aws/hooks/datasync.py
+++ b/airflow/providers/amazon/aws/hooks/datasync.py
@@ -57,9 +57,10 @@ def __init__(self, wait_interval_seconds: int = 30, *args, **kwargs) -> None:
         self.locations: list = []
         self.tasks: list = []
         # wait_interval_seconds = 0 is used during unit tests
-        if wait_interval_seconds < 0 or wait_interval_seconds > 15 * 60:
+        if 0 <= wait_interval_seconds <= 15 * 60:
+            self.wait_interval_seconds = wait_interval_seconds
+        else:
             raise ValueError(f"Invalid wait_interval_seconds {wait_interval_seconds}")
-        self.wait_interval_seconds = wait_interval_seconds
 
     def create_location(self, location_uri: str, **create_location_kwargs) -> str:
         """
diff --git a/airflow/providers/amazon/aws/hooks/dynamodb.py b/airflow/providers/amazon/aws/hooks/dynamodb.py
index db38b401af7f3..957730a754c06 100644
--- a/airflow/providers/amazon/aws/hooks/dynamodb.py
+++ b/airflow/providers/amazon/aws/hooks/dynamodb.py
@@ -68,4 +68,4 @@ def write_batch_data(self, items: Iterable) -> bool:
                     batch.put_item(Item=item)
             return True
         except Exception as general_error:
-            raise AirflowException(f"Failed to insert items in dynamodb, error: {str(general_error)}")
+            raise AirflowException(f"Failed to insert items in dynamodb, error: {general_error}")
diff --git a/airflow/providers/amazon/aws/hooks/sagemaker.py b/airflow/providers/amazon/aws/hooks/sagemaker.py
index b8247d9de97bb..364e073b1a8d3 100644
--- a/airflow/providers/amazon/aws/hooks/sagemaker.py
+++ b/airflow/providers/amazon/aws/hooks/sagemaker.py
@@ -128,10 +128,8 @@ def secondary_training_status_message(
     status_strs = []
     for transition in transitions_to_print:
         message = transition["StatusMessage"]
-        time_str = timezone.convert_to_utc(cast(datetime, job_description["LastModifiedTime"])).strftime(
-            "%Y-%m-%d %H:%M:%S"
-        )
-        status_strs.append(f"{time_str} {transition['Status']} - {message}")
+        time_utc = timezone.convert_to_utc(cast(datetime, job_description["LastModifiedTime"]))
+        status_strs.append(f"{time_utc:%Y-%m-%d %H:%M:%S} {transition['Status']} - {message}")
 
     return "\n".join(status_strs)
 
diff --git a/airflow/providers/amazon/aws/log/cloudwatch_task_handler.py b/airflow/providers/amazon/aws/log/cloudwatch_task_handler.py
index 5d1074b8402a6..96b0fd3068021 100644
--- a/airflow/providers/amazon/aws/log/cloudwatch_task_handler.py
+++ b/airflow/providers/amazon/aws/log/cloudwatch_task_handler.py
@@ -96,7 +96,7 @@ def _read(self, task_instance, try_number, metadata=None):
         except Exception as e:
             log = (
                 f"*** Unable to read remote logs from Cloudwatch (log_group: {self.log_group}, log_stream: "
-                f"{stream_name})\n*** {str(e)}\n\n"
+                f"{stream_name})\n*** {e}\n\n"
             )
             self.log.error(log)
             local_log, metadata = super()._read(task_instance, try_number, metadata)
diff --git a/airflow/providers/amazon/aws/operators/glue.py b/airflow/providers/amazon/aws/operators/glue.py
index 265d057de51ae..8680d052f78bb 100644
--- a/airflow/providers/amazon/aws/operators/glue.py
+++ b/airflow/providers/amazon/aws/operators/glue.py
@@ -17,7 +17,7 @@
 # under the License.
 from __future__ import annotations
 
-import os.path
+import os
 import urllib.parse
 from functools import cached_property
 from typing import TYPE_CHECKING, Sequence
diff --git a/airflow/providers/amazon/aws/sensors/sqs.py b/airflow/providers/amazon/aws/sensors/sqs.py
index da7f7e513e5c3..47e3cea5b0250 100644
--- a/airflow/providers/amazon/aws/sensors/sqs.py
+++ b/airflow/providers/amazon/aws/sensors/sqs.py
@@ -174,9 +174,7 @@ def poke(self, context: Context):
                 response = self.hook.conn.delete_message_batch(QueueUrl=self.sqs_queue, Entries=entries)
 
                 if "Successful" not in response:
-                    raise AirflowException(
-                        "Delete SQS Messages failed " + str(response) + " for messages " + str(messages)
-                    )
+                    raise AirflowException(f"Delete SQS Messages failed {response} for messages {messages}")
         if not len(message_batch):
             return False
 
diff --git a/airflow/providers/amazon/aws/transfers/dynamodb_to_s3.py b/airflow/providers/amazon/aws/transfers/dynamodb_to_s3.py
index a41ccc2dae108..b83ff48906d05 100644
--- a/airflow/providers/amazon/aws/transfers/dynamodb_to_s3.py
+++ b/airflow/providers/amazon/aws/transfers/dynamodb_to_s3.py
@@ -19,11 +19,11 @@
 from __future__ import annotations
 
 import json
+import os
 from copy import copy
 from datetime import datetime
 from decimal import Decimal
 from functools import cached_property
-from os.path import getsize
 from tempfile import NamedTemporaryFile
 from typing import IO, TYPE_CHECKING, Any, Callable, Sequence
 from uuid import uuid4
@@ -197,7 +197,7 @@ def _scan_dynamodb_and_upload_to_s3(self, temp_file: IO, scan_kwargs: dict, tabl
             scan_kwargs["ExclusiveStartKey"] = last_evaluated_key
 
             # Upload the file to S3 if reach file size limit
-            if getsize(temp_file.name) >= self.file_size:
+            if os.path.getsize(temp_file.name) >= self.file_size:
                 _upload_file_to_s3(temp_file, self.s3_bucket_name, self.s3_key_prefix, self.dest_aws_conn_id)
                 temp_file.close()
 
diff --git a/airflow/providers/apache/hive/hooks/hive.py b/airflow/providers/apache/hive/hooks/hive.py
index 5d4d33c9a0717..9a7d3f77b3838 100644
--- a/airflow/providers/apache/hive/hooks/hive.py
+++ b/airflow/providers/apache/hive/hooks/hive.py
@@ -176,7 +176,7 @@ def _validate_beeline_parameters(self, conn):
             )
         try:
             int_port = int(conn.port)
-            if int_port <= 0 or int_port > 65535:
+            if not 0 < int_port <= 65535:
                 raise Exception(f"The port used in beeline command ({conn.port}) should be in range 0-65535)")
         except (ValueError, TypeError) as e:
             raise Exception(f"The port used in beeline command ({conn.port}) should be a valid integer: {e})")
diff --git a/airflow/providers/apache/livy/triggers/livy.py b/airflow/providers/apache/livy/triggers/livy.py
index c7b4e572bcf92..a5ad66d1d25ca 100644
--- a/airflow/providers/apache/livy/triggers/livy.py
+++ b/airflow/providers/apache/livy/triggers/livy.py
@@ -101,7 +101,7 @@ async def run(self) -> AsyncIterator[TriggerEvent]:
                 {
                     "status": "error",
                     "batch_id": self._batch_id,
-                    "response": f"Batch {self._batch_id} did not succeed with {str(exc)}",
+                    "response": f"Batch {self._batch_id} did not succeed with {exc}",
                     "log_lines": None,
                 }
             )
diff --git a/airflow/providers/arangodb/hooks/arangodb.py b/airflow/providers/arangodb/hooks/arangodb.py
index 1495c598a5faa..21d5fdd22e4a2 100644
--- a/airflow/providers/arangodb/hooks/arangodb.py
+++ b/airflow/providers/arangodb/hooks/arangodb.py
@@ -108,7 +108,7 @@ def query(self, query, **kwargs) -> Cursor:
                     f"Failed to execute AQLQuery, error connecting to database: {self.database}"
                 )
         except AQLQueryExecuteError as error:
-            raise AirflowException(f"Failed to execute AQLQuery, error: {str(error)}")
+            raise AirflowException(f"Failed to execute AQLQuery, error: {error}")
 
     def create_collection(self, name):
         if not self.db_conn.has_collection(name):
diff --git a/airflow/providers/cncf/kubernetes/executors/kubernetes_executor.py b/airflow/providers/cncf/kubernetes/executors/kubernetes_executor.py
index 5889f25f53983..fbc836f322392 100644
--- a/airflow/providers/cncf/kubernetes/executors/kubernetes_executor.py
+++ b/airflow/providers/cncf/kubernetes/executors/kubernetes_executor.py
@@ -509,7 +509,7 @@ def get_task_log(self, ti: TaskInstance, try_number: int) -> tuple[list[str], li
             if log:
                 messages.append("Found logs through kube API")
         except Exception as e:
-            messages.append(f"Reading from k8s pod logs failed: {str(e)}")
+            messages.append(f"Reading from k8s pod logs failed: {e}")
         return messages, ["\n".join(log)]
 
     def try_adopt_task_instances(self, tis: Sequence[TaskInstance]) -> Sequence[TaskInstance]:
diff --git a/airflow/providers/cncf/kubernetes/pod_launcher_deprecated.py b/airflow/providers/cncf/kubernetes/pod_launcher_deprecated.py
index 9fc964cdb6e06..045c42e9ffa85 100644
--- a/airflow/providers/cncf/kubernetes/pod_launcher_deprecated.py
+++ b/airflow/providers/cncf/kubernetes/pod_launcher_deprecated.py
@@ -185,16 +185,14 @@ def parse_log_line(self, line: str) -> tuple[str | None, str]:
         :param line: k8s log line
         :return: timestamp and log message
         """
-        split_at = line.find(" ")
-        if split_at == -1:
+        timestamp, sep, message = line.strip().partition(" ")
+        if not sep:
             self.log.error(
                 "Error parsing timestamp (no timestamp in message: %r). "
                 "Will continue execution but won't update timestamp",
                 line,
             )
             return None, line
-        timestamp = line[:split_at]
-        message = line[split_at + 1 :].rstrip()
         return timestamp, message
 
     def _task_status(self, event):
diff --git a/airflow/providers/cncf/kubernetes/utils/pod_manager.py b/airflow/providers/cncf/kubernetes/utils/pod_manager.py
index ce9b5a7dca661..a150da3ba1b2a 100644
--- a/airflow/providers/cncf/kubernetes/utils/pod_manager.py
+++ b/airflow/providers/cncf/kubernetes/utils/pod_manager.py
@@ -524,16 +524,14 @@ def parse_log_line(self, line: str) -> tuple[DateTime | None, str]:
         :param line: k8s log line
         :return: timestamp and log message
         """
-        split_at = line.find(" ")
-        if split_at == -1:
+        timestamp, sep, message = line.strip().partition(" ")
+        if not sep:
             self.log.error(
                 "Error parsing timestamp (no timestamp in message %r). "
                 "Will continue execution but won't update timestamp",
                 line,
             )
             return None, line
-        timestamp = line[:split_at]
-        message = line[split_at + 1 :].rstrip()
         try:
             last_log_time = cast(DateTime, pendulum.parse(timestamp))
         except ParserError:
diff --git a/airflow/providers/databricks/hooks/databricks_sql.py b/airflow/providers/databricks/hooks/databricks_sql.py
index 90b17d8ab042f..172ce394f177a 100644
--- a/airflow/providers/databricks/hooks/databricks_sql.py
+++ b/airflow/providers/databricks/hooks/databricks_sql.py
@@ -18,15 +18,17 @@
 
 from contextlib import closing
 from copy import copy
-from typing import Any, Callable, Iterable, Mapping, TypeVar, overload
+from typing import TYPE_CHECKING, Any, Callable, Iterable, Mapping, TypeVar, overload
 
 from databricks import sql  # type: ignore[attr-defined]
-from databricks.sql.client import Connection  # type: ignore[attr-defined]
 
 from airflow.exceptions import AirflowException
 from airflow.providers.common.sql.hooks.sql import DbApiHook, return_single_query_results
 from airflow.providers.databricks.hooks.databricks_base import BaseDatabricksHook
 
+if TYPE_CHECKING:
+    from databricks.sql.client import Connection
+
 LIST_SQL_ENDPOINTS_ENDPOINT = ("GET", "api/2.0/sql/endpoints")
 
 
@@ -91,10 +93,12 @@ def _get_sql_endpoint_by_name(self, endpoint_name) -> dict[str, Any]:
         result = self._do_api_call(LIST_SQL_ENDPOINTS_ENDPOINT)
         if "endpoints" not in result:
             raise AirflowException("Can't list Databricks SQL endpoints")
-        lst = [endpoint for endpoint in result["endpoints"] if endpoint["name"] == endpoint_name]
-        if not lst:
-            raise AirflowException(f"Can't f Databricks SQL endpoint with name '{endpoint_name}'")
-        return lst[0]
+        try:
+            endpoint = next(endpoint for endpoint in result["endpoints"] if endpoint["name"] == endpoint_name)
+        except StopIteration:
+            raise AirflowException(f"Can't find Databricks SQL endpoint with name '{endpoint_name}'")
+        else:
+            return endpoint
 
     def get_conn(self) -> Connection:
         """Returns a Databricks SQL connection object."""
diff --git a/airflow/providers/databricks/operators/databricks_repos.py b/airflow/providers/databricks/operators/databricks_repos.py
index 64735cadbff53..ad9be926a0e3a 100644
--- a/airflow/providers/databricks/operators/databricks_repos.py
+++ b/airflow/providers/databricks/operators/databricks_repos.py
@@ -105,11 +105,8 @@ def __init__(
     def __detect_repo_provider__(url):
         provider = None
         try:
-            netloc = urlsplit(url).netloc
-            idx = netloc.rfind("@")
-            if idx != -1:
-                netloc = netloc[(idx + 1) :]
-            netloc = netloc.lower()
+            netloc = urlsplit(url).netloc.lower()
+            _, _, netloc = netloc.rpartition("@")
             provider = DatabricksReposCreateOperator.__git_providers__.get(netloc)
             if provider is None and DatabricksReposCreateOperator.__aws_code_commit_regexp__.match(netloc):
                 provider = "awsCodeCommit"
diff --git a/airflow/providers/dbt/cloud/hooks/dbt.py b/airflow/providers/dbt/cloud/hooks/dbt.py
index 8c589970ab620..4a9785da3eff8 100644
--- a/airflow/providers/dbt/cloud/hooks/dbt.py
+++ b/airflow/providers/dbt/cloud/hooks/dbt.py
@@ -254,7 +254,7 @@ async def get_job_status(
             Valid values are "trigger", "job", "repository", and "environment".
         """
         try:
-            self.log.info("Getting the status of job run %s.", str(run_id))
+            self.log.info("Getting the status of job run %s.", run_id)
             response = await self.get_job_details(
                 run_id, account_id=account_id, include_related=include_related
             )
@@ -490,14 +490,12 @@ def get_job_run_status(self, run_id: int, account_id: int | None = None) -> int:
         :param account_id: Optional. The ID of a dbt Cloud account.
         :return: The status of a dbt Cloud job run.
         """
-        self.log.info("Getting the status of job run %s.", str(run_id))
+        self.log.info("Getting the status of job run %s.", run_id)
 
         job_run = self.get_job_run(account_id=account_id, run_id=run_id)
         job_run_status = job_run.json()["data"]["status"]
 
-        self.log.info(
-            "Current status of job run %s: %s", str(run_id), DbtCloudJobRunStatus(job_run_status).name
-        )
+        self.log.info("Current status of job run %s: %s", run_id, DbtCloudJobRunStatus(job_run_status).name)
 
         return job_run_status
 
diff --git a/airflow/providers/docker/operators/docker.py b/airflow/providers/docker/operators/docker.py
index 96f78baa9b5d7..d034e1ff320ed 100644
--- a/airflow/providers/docker/operators/docker.py
+++ b/airflow/providers/docker/operators/docker.py
@@ -486,7 +486,7 @@ def format_command(command: list[str] | str | None) -> list[str] | str | None:
 
         :return: the command (or commands)
         """
-        if isinstance(command, str) and command.strip().find("[") == 0:
+        if isinstance(command, str) and command.strip().startswith("["):
             command = ast.literal_eval(command)
         return command
 
diff --git a/airflow/providers/elasticsearch/log/es_json_formatter.py b/airflow/providers/elasticsearch/log/es_json_formatter.py
index 7ac543c0a3a0d..cf77896a9218e 100644
--- a/airflow/providers/elasticsearch/log/es_json_formatter.py
+++ b/airflow/providers/elasticsearch/log/es_json_formatter.py
@@ -31,11 +31,7 @@ class ElasticsearchJSONFormatter(JSONFormatter):
     def formatTime(self, record, datefmt=None):
         """Return the creation time of the LogRecord in ISO 8601 date/time format in the local time zone."""
         dt = pendulum.from_timestamp(record.created, tz=pendulum.local_timezone())
-        if datefmt:
-            s = dt.strftime(datefmt)
-        else:
-            s = dt.strftime(self.default_time_format)
-
+        s = dt.strftime(datefmt or self.default_time_format)
         if self.default_msec_format:
             s = self.default_msec_format % (s, record.msecs)
         if self.default_tz_format:
diff --git a/airflow/providers/ftp/hooks/ftp.py b/airflow/providers/ftp/hooks/ftp.py
index 26080aaa69f57..ea94b32c47d47 100644
--- a/airflow/providers/ftp/hooks/ftp.py
+++ b/airflow/providers/ftp/hooks/ftp.py
@@ -19,7 +19,7 @@
 
 import datetime
 import ftplib
-import os.path
+import os
 from typing import Any, Callable
 
 from airflow.hooks.base import BaseHook
diff --git a/airflow/providers/ftp/sensors/ftp.py b/airflow/providers/ftp/sensors/ftp.py
index 92710aeb21b05..4ec7cf75169a9 100644
--- a/airflow/providers/ftp/sensors/ftp.py
+++ b/airflow/providers/ftp/sensors/ftp.py
@@ -73,10 +73,10 @@ def poke(self, context: Context) -> bool:
             self.log.info("Poking for %s", self.path)
             try:
                 mod_time = hook.get_mod_time(self.path)
-                self.log.info("Found File %s last modified: %s", str(self.path), str(mod_time))
+                self.log.info("Found File %s last modified: %s", self.path, mod_time)
 
             except ftplib.error_perm as e:
-                self.log.error("Ftp error encountered: %s", str(e))
+                self.log.error("Ftp error encountered: %s", e)
                 error_code = self._get_error_code(e)
                 if (error_code != 550) and (
                     self.fail_on_transient_errors or (error_code not in self.transient_errors)
diff --git a/airflow/providers/github/operators/github.py b/airflow/providers/github/operators/github.py
index 82c9ab3b77abf..e7e305808f85f 100644
--- a/airflow/providers/github/operators/github.py
+++ b/airflow/providers/github/operators/github.py
@@ -74,6 +74,6 @@ def execute(self, context: Context) -> Any:
             return github_result
 
         except GithubException as github_error:
-            raise AirflowException(f"Failed to execute GithubOperator, error: {str(github_error)}")
+            raise AirflowException(f"Failed to execute GithubOperator, error: {github_error}")
         except Exception as e:
-            raise AirflowException(f"GitHub operator error: {str(e)}")
+            raise AirflowException(f"GitHub operator error: {e}")
diff --git a/airflow/providers/github/sensors/github.py b/airflow/providers/github/sensors/github.py
index eb9caad5aeed4..db943cd0ea0f3 100644
--- a/airflow/providers/github/sensors/github.py
+++ b/airflow/providers/github/sensors/github.py
@@ -136,9 +136,9 @@ def tag_checker(self, repo: Any) -> bool | None:
                 result = self.tag_name in all_tags
 
         except GithubException as github_error:  # type: ignore[misc]
-            raise AirflowException(f"Failed to execute GithubSensor, error: {str(github_error)}")
+            raise AirflowException(f"Failed to execute GithubSensor, error: {github_error}")
         except Exception as e:
-            raise AirflowException(f"GitHub operator error: {str(e)}")
+            raise AirflowException(f"GitHub operator error: {e}")
 
         if result is True:
             self.log.info("Tag %s exists in %s repository, Success.", self.tag_name, self.repository_name)
diff --git a/airflow/providers/google/cloud/example_dags/example_cloud_sql_query.py b/airflow/providers/google/cloud/example_dags/example_cloud_sql_query.py
index 870da1653cc49..0b34297d51cf2 100644
--- a/airflow/providers/google/cloud/example_dags/example_cloud_sql_query.py
+++ b/airflow/providers/google/cloud/example_dags/example_cloud_sql_query.py
@@ -40,7 +40,7 @@
 import os
 import subprocess
 from datetime import datetime
-from os.path import expanduser
+from pathlib import Path
 from urllib.parse import quote_plus
 
 from airflow import models
@@ -87,17 +87,14 @@
 
 # [START howto_operator_cloudsql_query_connections]
 
-HOME_DIR = expanduser("~")
+HOME_DIR = Path.home()
 
 
 def get_absolute_path(path):
     """
     Returns absolute path.
     """
-    if path.startswith("/"):
-        return path
-    else:
-        return os.path.join(HOME_DIR, path)
+    return os.fspath(HOME_DIR / path)
 
 
 postgres_kwargs = dict(
diff --git a/airflow/providers/google/cloud/hooks/cloud_sql.py b/airflow/providers/google/cloud/hooks/cloud_sql.py
index ebd03b69bbb68..dabaf5dce304d 100644
--- a/airflow/providers/google/cloud/hooks/cloud_sql.py
+++ b/airflow/providers/google/cloud/hooks/cloud_sql.py
@@ -21,7 +21,6 @@
 import errno
 import json
 import os
-import os.path
 import platform
 import random
 import re
@@ -887,7 +886,7 @@ def _generate_unique_path() -> str:
         random.seed()
         while True:
             candidate = os.path.join(
-                gettempdir(), "".join(random.choice(string.ascii_lowercase + string.digits) for _ in range(8))
+                gettempdir(), "".join(random.choices(string.ascii_lowercase + string.digits, k=8))
             )
             if not os.path.exists(candidate):
                 return candidate
diff --git a/airflow/providers/google/cloud/hooks/gcs.py b/airflow/providers/google/cloud/hooks/gcs.py
index f489c9200bf42..e1605d2f2423a 100644
--- a/airflow/providers/google/cloud/hooks/gcs.py
+++ b/airflow/providers/google/cloud/hooks/gcs.py
@@ -29,7 +29,6 @@
 from datetime import datetime
 from functools import partial
 from io import BytesIO
-from os import path
 from tempfile import NamedTemporaryFile
 from typing import IO, Any, Callable, Generator, Sequence, TypeVar, cast, overload
 from urllib.parse import urlsplit
@@ -1294,7 +1293,7 @@ def _calculate_sync_destination_path(
         self, blob: storage.Blob, destination_object: str | None, source_object_prefix_len: int
     ) -> str:
         return (
-            path.join(destination_object, blob.name[source_object_prefix_len:])
+            os.path.join(destination_object, blob.name[source_object_prefix_len:])
             if destination_object
             else blob.name[source_object_prefix_len:]
         )
diff --git a/airflow/providers/google/cloud/hooks/mlengine.py b/airflow/providers/google/cloud/hooks/mlengine.py
index ff13546685c17..aabe2b88ae023 100644
--- a/airflow/providers/google/cloud/hooks/mlengine.py
+++ b/airflow/providers/google/cloud/hooks/mlengine.py
@@ -65,13 +65,13 @@ def _poll_with_exponential_delay(
                 log.info("Operation is done: %s", response)
                 return response
 
-            time.sleep((2**i) + (random.randint(0, 1000) / 1000))
+            time.sleep((2**i) + random.random())
         except HttpError as e:
             if e.resp.status != 429:
                 log.info("Something went wrong. Not retrying: %s", format(e))
                 raise
             else:
-                time.sleep((2**i) + (random.randint(0, 1000) / 1000))
+                time.sleep((2**i) + random.random())
 
     raise ValueError(f"Connection could not be established after {max_n} retries.")
 
diff --git a/airflow/providers/google/cloud/log/gcs_task_handler.py b/airflow/providers/google/cloud/log/gcs_task_handler.py
index 121a668857b29..79055f0847f78 100644
--- a/airflow/providers/google/cloud/log/gcs_task_handler.py
+++ b/airflow/providers/google/cloud/log/gcs_task_handler.py
@@ -247,7 +247,7 @@ def gcs_write(self, log, remote_log_location) -> bool:
                 pass
             else:
                 log += self._add_message(
-                    f"Error checking for previous log; if exists, may be overwritten: {str(e)}"
+                    f"Error checking for previous log; if exists, may be overwritten: {e}"
                 )
                 self.log.warning("Error checking for previous log: %s", e)
         try:
diff --git a/airflow/providers/google/cloud/operators/bigquery_dts.py b/airflow/providers/google/cloud/operators/bigquery_dts.py
index 9edae0b659782..c9f6b488ca8c2 100644
--- a/airflow/providers/google/cloud/operators/bigquery_dts.py
+++ b/airflow/providers/google/cloud/operators/bigquery_dts.py
@@ -355,7 +355,7 @@ def execute(self, context: Context):
         )
 
     def _wait_for_transfer_to_be_done(self, run_id: str, transfer_config_id: str, interval: int = 10):
-        if interval < 0:
+        if interval <= 0:
             raise ValueError("Interval must be > 0")
 
         while True:
diff --git a/airflow/providers/google/cloud/operators/datafusion.py b/airflow/providers/google/cloud/operators/datafusion.py
index e43420d3be7e3..5dce5ba290984 100644
--- a/airflow/providers/google/cloud/operators/datafusion.py
+++ b/airflow/providers/google/cloud/operators/datafusion.py
@@ -44,7 +44,7 @@ class DataFusionPipelineLinkHelper:
     @staticmethod
     def get_project_id(instance):
         instance = instance["name"]
-        project_id = [x for x in instance.split("/") if x.startswith("airflow")][0]
+        project_id = next(x for x in instance.split("/") if x.startswith("airflow"))
         return project_id
 
 
diff --git a/airflow/providers/google/cloud/operators/dataproc.py b/airflow/providers/google/cloud/operators/dataproc.py
index 423ebf988f935..e0045aae00875 100644
--- a/airflow/providers/google/cloud/operators/dataproc.py
+++ b/airflow/providers/google/cloud/operators/dataproc.py
@@ -1566,8 +1566,7 @@ class DataprocSubmitPySparkJobOperator(DataprocJobBaseOperator):
 
     @staticmethod
     def _generate_temp_filename(filename):
-        date = time.strftime("%Y%m%d%H%M%S")
-        return f"{date}_{str(uuid.uuid4())[:8]}_{ntpath.basename(filename)}"
+        return f"{time:%Y%m%d%H%M%S}_{str(uuid.uuid4())[:8]}_{ntpath.basename(filename)}"
 
     def _upload_file_temp(self, bucket, local_file):
         """Upload a local file to a Google Cloud Storage bucket."""
diff --git a/airflow/providers/google/cloud/operators/mlengine.py b/airflow/providers/google/cloud/operators/mlengine.py
index b391041372273..30d1225c0561e 100644
--- a/airflow/providers/google/cloud/operators/mlengine.py
+++ b/airflow/providers/google/cloud/operators/mlengine.py
@@ -278,7 +278,7 @@ def check_existing_job(existing_job):
         )
 
         if finished_prediction_job["state"] != "SUCCEEDED":
-            self.log.error("MLEngine batch prediction job failed: %s", str(finished_prediction_job))
+            self.log.error("MLEngine batch prediction job failed: %s", finished_prediction_job)
             raise RuntimeError(finished_prediction_job["errorMessage"])
 
         return finished_prediction_job["predictionOutput"]
@@ -1153,7 +1153,7 @@ def __init__(
 
     def _handle_job_error(self, finished_training_job) -> None:
         if finished_training_job["state"] != "SUCCEEDED":
-            self.log.error("MLEngine training job failed: %s", str(finished_training_job))
+            self.log.error("MLEngine training job failed: %s", finished_training_job)
             raise RuntimeError(finished_training_job["errorMessage"])
 
     def execute(self, context: Context):
diff --git a/airflow/providers/google/cloud/sensors/dataproc_metastore.py b/airflow/providers/google/cloud/sensors/dataproc_metastore.py
index fb895abba33dc..f1c25c3f5fe99 100644
--- a/airflow/providers/google/cloud/sensors/dataproc_metastore.py
+++ b/airflow/providers/google/cloud/sensors/dataproc_metastore.py
@@ -113,4 +113,4 @@ def poke(self, context: Context) -> bool:
 
         # Return True if we got all requested partitions.
         # If no partitions were given in the request, then we expect to find at least one.
-        return found_partitions > 0 and found_partitions >= len(set(self.partitions))
+        return found_partitions >= max(1, len(set(self.partitions)))
diff --git a/airflow/providers/google/cloud/sensors/tasks.py b/airflow/providers/google/cloud/sensors/tasks.py
index f90154e7feace..a361931d984ef 100644
--- a/airflow/providers/google/cloud/sensors/tasks.py
+++ b/airflow/providers/google/cloud/sensors/tasks.py
@@ -83,6 +83,6 @@ def poke(self, context: Context) -> bool:
             # page_size=1
         )
 
-        self.log.info("tasks exhausted in cloud task queue?: %s" % (len(tasks) == 0))
+        self.log.info("tasks exhausted in cloud task queue?: %s", (len(tasks) == 0))
 
         return len(tasks) == 0
diff --git a/airflow/providers/google/cloud/transfers/cassandra_to_gcs.py b/airflow/providers/google/cloud/transfers/cassandra_to_gcs.py
index 408977d7ccfa4..620edfbe1558f 100644
--- a/airflow/providers/google/cloud/transfers/cassandra_to_gcs.py
+++ b/airflow/providers/google/cloud/transfers/cassandra_to_gcs.py
@@ -284,7 +284,7 @@ def convert_value(self, value: Any | None) -> Any | None:
         elif isinstance(value, OrderedMapSerializedKey):
             return self.convert_map_type(value)
         else:
-            raise AirflowException("Unexpected value: " + str(value))
+            raise AirflowException(f"Unexpected value: {value}")
 
     def convert_array_types(self, value: list[Any] | SortedSet) -> list[Any]:
         """Maps convert_value over array."""
@@ -308,7 +308,7 @@ def convert_tuple_type(self, values: tuple[Any]) -> dict[str, Any]:
         will be named 'field_<index>', where index is determined by the order
         of the tuple elements defined in cassandra.
         """
-        names = ["field_" + str(i) for i in range(len(values))]
+        names = [f"field_{i}" for i in range(len(values))]
         return self.generate_data_dict(names, values)
 
     def convert_map_type(self, value: OrderedMapSerializedKey) -> list[dict[str, Any]]:
@@ -351,7 +351,7 @@ def get_bq_fields(cls, type_: Any) -> list[dict[str, Any]]:
             types = type_.subtypes
 
         if types and not names and type_.cassname == "TupleType":
-            names = ["field_" + str(i) for i in range(len(types))]
+            names = [f"field_{i}" for i in range(len(types))]
         elif types and not names and type_.cassname == "MapType":
             names = ["key", "value"]
 
diff --git a/airflow/providers/google/cloud/transfers/facebook_ads_to_gcs.py b/airflow/providers/google/cloud/transfers/facebook_ads_to_gcs.py
index 30e7f61860b4e..9273553e1bc17 100644
--- a/airflow/providers/google/cloud/transfers/facebook_ads_to_gcs.py
+++ b/airflow/providers/google/cloud/transfers/facebook_ads_to_gcs.py
@@ -141,11 +141,11 @@ def execute(self, context: Context):
                         account_id=account_id,
                     )
                 else:
-                    self.log.warning("account_id: %s returned empty report", str(account_id))
+                    self.log.warning("account_id: %s returned empty report", account_id)
         else:
             message = (
                 "Facebook Ads Hook returned different type than expected. Expected return types should be "
-                "List or Dict. Actual return type of the Hook: " + str(type(bulk_report))
+                f"List or Dict. Actual return type of the Hook: {type(bulk_report)}"
             )
             raise AirflowException(message)
         total_row_count = self._decide_and_flush(converted_rows_with_action=converted_rows_with_action)
diff --git a/airflow/providers/google/cloud/transfers/gcs_to_gcs.py b/airflow/providers/google/cloud/transfers/gcs_to_gcs.py
index d4c3bd679f700..fc062b4de7c90 100644
--- a/airflow/providers/google/cloud/transfers/gcs_to_gcs.py
+++ b/airflow/providers/google/cloud/transfers/gcs_to_gcs.py
@@ -307,7 +307,7 @@ def _ignore_existing_files(self, hook, prefix, **kwargs):
             ]
 
         objects = set(objects) - set(existing_objects)
-        if len(objects) > 0:
+        if objects:
             self.log.info("%s files are going to be synced: %s.", len(objects), objects)
         else:
             self.log.info("There are no new files to sync. Have a nice day!")
diff --git a/airflow/providers/google/cloud/triggers/bigquery_dts.py b/airflow/providers/google/cloud/triggers/bigquery_dts.py
index 3a5ab2267f97a..d5a920a762a2c 100644
--- a/airflow/providers/google/cloud/triggers/bigquery_dts.py
+++ b/airflow/providers/google/cloud/triggers/bigquery_dts.py
@@ -133,7 +133,7 @@ async def run(self) -> AsyncIterator[TriggerEvent]:
                 yield TriggerEvent(
                     {
                         "status": "failed",
-                        "message": f"Trigger failed with exception: {str(e)}",
+                        "message": f"Trigger failed with exception: {e}",
                     }
                 )
                 return
diff --git a/airflow/providers/google/cloud/utils/credentials_provider.py b/airflow/providers/google/cloud/utils/credentials_provider.py
index b6d7bcc385d84..18c00b0844ec7 100644
--- a/airflow/providers/google/cloud/utils/credentials_provider.py
+++ b/airflow/providers/google/cloud/utils/credentials_provider.py
@@ -21,7 +21,7 @@
 
 import json
 import logging
-import os.path
+import os
 import tempfile
 from contextlib import ExitStack, contextmanager
 from typing import Collection, Generator, Sequence
diff --git a/airflow/providers/grpc/hooks/grpc.py b/airflow/providers/grpc/hooks/grpc.py
index c42262f914e12..b7b0344a4fc9e 100644
--- a/airflow/providers/grpc/hooks/grpc.py
+++ b/airflow/providers/grpc/hooks/grpc.py
@@ -112,7 +112,7 @@ def get_conn(self) -> grpc.Channel:
         else:
             raise AirflowConfigException(
                 "auth_type not supported or not provided, channel cannot be established, "
-                f"given value: {str(auth_type)}"
+                f"given value: {auth_type}"
             )
 
         if self.interceptors:
diff --git a/airflow/providers/microsoft/azure/hooks/synapse.py b/airflow/providers/microsoft/azure/hooks/synapse.py
index 881f918b60d76..84475a2f38e3d 100644
--- a/airflow/providers/microsoft/azure/hooks/synapse.py
+++ b/airflow/providers/microsoft/azure/hooks/synapse.py
@@ -183,7 +183,7 @@ def wait_for_job_run_status(
                 )
 
             # Wait to check the status of the job run based on the ``check_interval`` configured.
-            self.log.info("Sleeping for %s seconds", str(check_interval))
+            self.log.info("Sleeping for %s seconds", check_interval)
             time.sleep(check_interval)
 
             job_run_status = self.get_job_run_status()
diff --git a/airflow/providers/microsoft/azure/triggers/data_factory.py b/airflow/providers/microsoft/azure/triggers/data_factory.py
index e3dd38ad6646a..1ce5484008f9c 100644
--- a/airflow/providers/microsoft/azure/triggers/data_factory.py
+++ b/airflow/providers/microsoft/azure/triggers/data_factory.py
@@ -233,7 +233,7 @@ async def run(self) -> AsyncIterator[TriggerEvent]:
                         resource_group_name=self.resource_group_name,
                         factory_name=self.factory_name,
                     )
-                    self.log.info("Unexpected error %s caught. Cancel pipeline run %s", str(e), self.run_id)
+                    self.log.info("Unexpected error %s caught. Cancel pipeline run %s", e, self.run_id)
                 except Exception as err:
                     yield TriggerEvent({"status": "error", "message": str(err), "run_id": self.run_id})
             yield TriggerEvent({"status": "error", "message": str(e), "run_id": self.run_id})
diff --git a/airflow/providers/microsoft/winrm/operators/winrm.py b/airflow/providers/microsoft/winrm/operators/winrm.py
index 7aef926173c08..b8562fd58807d 100644
--- a/airflow/providers/microsoft/winrm/operators/winrm.py
+++ b/airflow/providers/microsoft/winrm/operators/winrm.py
@@ -141,7 +141,7 @@ def execute(self, context: Context) -> list | str:
             self.winrm_hook.winrm_protocol.close_shell(winrm_client)  # type: ignore[attr-defined]
 
         except Exception as e:
-            raise AirflowException(f"WinRM operator error: {str(e)}")
+            raise AirflowException(f"WinRM operator error: {e}")
 
         if return_code == 0:
             # returning output if do_xcom_push is set
diff --git a/airflow/providers/oracle/hooks/oracle.py b/airflow/providers/oracle/hooks/oracle.py
index 38f1878964c4d..3ff2cedcdfc1f 100644
--- a/airflow/providers/oracle/hooks/oracle.py
+++ b/airflow/providers/oracle/hooks/oracle.py
@@ -303,9 +303,7 @@ def insert_rows(
                 elif numpy and isinstance(cell, numpy.datetime64):
                     lst.append("'" + str(cell) + "'")
                 elif isinstance(cell, datetime):
-                    lst.append(
-                        "to_date('" + cell.strftime("%Y-%m-%d %H:%M:%S") + "','YYYY-MM-DD HH24:MI:SS')"
-                    )
+                    lst.append(f"to_date('{cell:%Y-%m-%d %H:%M:%S}','YYYY-MM-DD HH24:MI:SS')")
                 else:
                     lst.append(str(cell))
             values = tuple(lst)
@@ -349,7 +347,7 @@ def bulk_insert_rows(
         prepared_stm = "insert into {tablename} {columns} values ({values})".format(
             tablename=table,
             columns="({})".format(", ".join(target_fields)) if target_fields else "",
-            values=", ".join(":%s" % i for i in range(1, len(values_base) + 1)),
+            values=", ".join(f":{i}" for i in range(1, len(values_base) + 1)),
         )
         row_count = 0
         # Chunk the rows
diff --git a/airflow/providers/sftp/operators/sftp.py b/airflow/providers/sftp/operators/sftp.py
index 8da4b3f332930..106105b34387e 100644
--- a/airflow/providers/sftp/operators/sftp.py
+++ b/airflow/providers/sftp/operators/sftp.py
@@ -188,7 +188,7 @@ def execute(self, context: Any) -> str | list[str] | None:
                     self.sftp_hook.store_file(_remote_filepath, _local_filepath, confirm=self.confirm)
 
         except Exception as e:
-            raise AirflowException(f"Error while transferring {file_msg}, error: {str(e)}")
+            raise AirflowException(f"Error while transferring {file_msg}, error: {e}")
 
         return self.local_filepath
 
diff --git a/airflow/providers/sftp/sensors/sftp.py b/airflow/providers/sftp/sensors/sftp.py
index 82baab2bce5ad..f6a1278c18a11 100644
--- a/airflow/providers/sftp/sensors/sftp.py
+++ b/airflow/providers/sftp/sensors/sftp.py
@@ -87,7 +87,7 @@ def poke(self, context: Context) -> PokeReturnValue | bool:
         for actual_file_to_check in actual_files_to_check:
             try:
                 mod_time = self.hook.get_mod_time(actual_file_to_check)
-                self.log.info("Found File %s last modified: %s", str(actual_file_to_check), str(mod_time))
+                self.log.info("Found File %s last modified: %s", actual_file_to_check, mod_time)
             except OSError as e:
                 if e.errno != SFTP_NO_SUCH_FILE:
                     raise e
diff --git a/airflow/providers/singularity/operators/singularity.py b/airflow/providers/singularity/operators/singularity.py
index c8c90b9e76618..dbc2796daa7a5 100644
--- a/airflow/providers/singularity/operators/singularity.py
+++ b/airflow/providers/singularity/operators/singularity.py
@@ -167,7 +167,7 @@ def execute(self, context: Context) -> None:
         self.log.info("Output from command %s", result["message"])
 
     def _get_command(self) -> Any | None:
-        if self.command is not None and self.command.strip().find("[") == 0:  # type: ignore
+        if self.command is not None and self.command.strip().startswith("["):  # type: ignore
             commands = ast.literal_eval(self.command)
         else:
             commands = self.command
diff --git a/airflow/providers/snowflake/utils/sql_api_generate_jwt.py b/airflow/providers/snowflake/utils/sql_api_generate_jwt.py
index 553d84caf7c85..f1eb2ed6c2bef 100644
--- a/airflow/providers/snowflake/utils/sql_api_generate_jwt.py
+++ b/airflow/providers/snowflake/utils/sql_api_generate_jwt.py
@@ -102,14 +102,10 @@ def prepare_account_name_for_jwt(self, raw_account: str) -> str:
         account = raw_account
         if ".global" not in account:
             # Handle the general case.
-            idx = account.find(".")
-            if idx > 0:
-                account = account[0:idx]
+            account = account.partition(".")[0]
         else:
             # Handle the replication case.
-            idx = account.find("-")
-            if idx > 0:
-                account = account[0:idx]  # pragma: no cover
+            account = account.partition("-")[0]
         # Use uppercase for the account identifier.
         return account.upper()
 
diff --git a/airflow/providers_manager.py b/airflow/providers_manager.py
index deda61293e2f7..9799ca82f6b4b 100644
--- a/airflow/providers_manager.py
+++ b/airflow/providers_manager.py
@@ -587,10 +587,9 @@ def _discover_all_airflow_builtin_providers_from_local_sources(self) -> None:
                 # The same path can appear in the __path__ twice, under non-normalized paths (ie.
                 # /path/to/repo/airflow/providers and /path/to/repo/./airflow/providers)
                 path = os.path.realpath(path)
-                if path in seen:
-                    continue
-                seen.add(path)
-                self._add_provider_info_from_local_source_files_on_path(path)
+                if path not in seen:
+                    seen.add(path)
+                    self._add_provider_info_from_local_source_files_on_path(path)
             except Exception as e:
                 log.warning(f"Error when loading 'provider.yaml' files from {path} airflow sources: {e}")
 
@@ -957,15 +956,15 @@ def _add_widgets(self, package_name: str, hook_class: type, widgets: dict[str, A
                     hook_class.__name__,
                 )
                 # In case of inherited hooks this might be happening several times
-                continue
-            self._connection_form_widgets[prefixed_field_name] = ConnectionFormWidgetInfo(
-                hook_class.__name__,
-                package_name,
-                field,
-                field_identifier,
-                hasattr(field.field_class.widget, "input_type")
-                and field.field_class.widget.input_type == "password",
-            )
+            else:
+                self._connection_form_widgets[prefixed_field_name] = ConnectionFormWidgetInfo(
+                    hook_class.__name__,
+                    package_name,
+                    field,
+                    field_identifier,
+                    hasattr(field.field_class.widget, "input_type")
+                    and field.field_class.widget.input_type == "password",
+                )
 
     def _add_customized_fields(self, package_name: str, hook_class: type, customized_fields: dict):
         try:
diff --git a/airflow/sensors/__init__.py b/airflow/sensors/__init__.py
index 17cabf43be368..e987f6ef61efd 100644
--- a/airflow/sensors/__init__.py
+++ b/airflow/sensors/__init__.py
@@ -22,47 +22,47 @@
 from airflow.utils.deprecation_tools import add_deprecated_classes
 
 __deprecated_classes = {
-    'base_sensor_operator': {
-        'BaseSensorOperator': 'airflow.sensors.base.BaseSensorOperator',
+    "base_sensor_operator": {
+        "BaseSensorOperator": "airflow.sensors.base.BaseSensorOperator",
     },
-    'date_time_sensor': {
-        'DateTimeSensor': 'airflow.sensors.date_time.DateTimeSensor',
+    "date_time_sensor": {
+        "DateTimeSensor": "airflow.sensors.date_time.DateTimeSensor",
     },
-    'external_task_sensor': {
-        'ExternalTaskMarker': 'airflow.sensors.external_task.ExternalTaskMarker',
-        'ExternalTaskSensor': 'airflow.sensors.external_task.ExternalTaskSensor',
-        'ExternalTaskSensorLink': 'airflow.sensors.external_task.ExternalTaskSensorLink',
+    "external_task_sensor": {
+        "ExternalTaskMarker": "airflow.sensors.external_task.ExternalTaskMarker",
+        "ExternalTaskSensor": "airflow.sensors.external_task.ExternalTaskSensor",
+        "ExternalTaskSensorLink": "airflow.sensors.external_task.ExternalTaskSensorLink",
     },
-    'hive_partition_sensor': {
-        'HivePartitionSensor': 'airflow.providers.apache.hive.sensors.hive_partition.HivePartitionSensor',
+    "hive_partition_sensor": {
+        "HivePartitionSensor": "airflow.providers.apache.hive.sensors.hive_partition.HivePartitionSensor",
     },
-    'http_sensor': {
-        'HttpSensor': 'airflow.providers.http.sensors.http.HttpSensor',
+    "http_sensor": {
+        "HttpSensor": "airflow.providers.http.sensors.http.HttpSensor",
     },
-    'metastore_partition_sensor': {
-        'MetastorePartitionSensor': (
-            'airflow.providers.apache.hive.sensors.metastore_partition.MetastorePartitionSensor'
+    "metastore_partition_sensor": {
+        "MetastorePartitionSensor": (
+            "airflow.providers.apache.hive.sensors.metastore_partition.MetastorePartitionSensor"
         ),
     },
-    'named_hive_partition_sensor': {
-        'NamedHivePartitionSensor': (
-            'airflow.providers.apache.hive.sensors.named_hive_partition.NamedHivePartitionSensor'
+    "named_hive_partition_sensor": {
+        "NamedHivePartitionSensor": (
+            "airflow.providers.apache.hive.sensors.named_hive_partition.NamedHivePartitionSensor"
         ),
     },
-    's3_key_sensor': {
-        'S3KeySensor': 'airflow.providers.amazon.aws.sensors.s3.S3KeySensor',
+    "s3_key_sensor": {
+        "S3KeySensor": "airflow.providers.amazon.aws.sensors.s3.S3KeySensor",
     },
-    'sql': {
-        'SqlSensor': 'airflow.providers.common.sql.sensors.sql.SqlSensor',
+    "sql": {
+        "SqlSensor": "airflow.providers.common.sql.sensors.sql.SqlSensor",
     },
-    'sql_sensor': {
-        'SqlSensor': 'airflow.providers.common.sql.sensors.sql.SqlSensor',
+    "sql_sensor": {
+        "SqlSensor": "airflow.providers.common.sql.sensors.sql.SqlSensor",
     },
-    'time_delta_sensor': {
-        'TimeDeltaSensor': 'airflow.sensors.time_delta.TimeDeltaSensor',
+    "time_delta_sensor": {
+        "TimeDeltaSensor": "airflow.sensors.time_delta.TimeDeltaSensor",
     },
-    'web_hdfs_sensor': {
-        'WebHdfsSensor': 'airflow.providers.apache.hdfs.sensors.web_hdfs.WebHdfsSensor',
+    "web_hdfs_sensor": {
+        "WebHdfsSensor": "airflow.providers.apache.hdfs.sensors.web_hdfs.WebHdfsSensor",
     },
 }
 
diff --git a/airflow/sensors/bash.py b/airflow/sensors/bash.py
index c99421c982527..25c4a547b809a 100644
--- a/airflow/sensors/bash.py
+++ b/airflow/sensors/bash.py
@@ -68,44 +68,45 @@ def poke(self, context: Context):
         """Execute the bash command in a temporary directory."""
         bash_command = self.bash_command
         self.log.info("Tmp dir root location: %s", gettempdir())
-        with TemporaryDirectory(prefix="airflowtmp") as tmp_dir:
-            with NamedTemporaryFile(dir=tmp_dir, prefix=self.task_id) as f:
-                f.write(bytes(bash_command, "utf_8"))
-                f.flush()
-                fname = f.name
-                script_location = tmp_dir + "/" + fname
-                self.log.info("Temporary script location: %s", script_location)
-                self.log.info("Running command: %s", bash_command)
+        with TemporaryDirectory(prefix="airflowtmp") as tmp_dir, NamedTemporaryFile(
+            dir=tmp_dir, prefix=self.task_id
+        ) as f:
+            f.write(bytes(bash_command, "utf_8"))
+            f.flush()
+            fname = f.name
+            script_location = tmp_dir + "/" + fname
+            self.log.info("Temporary script location: %s", script_location)
+            self.log.info("Running command: %s", bash_command)
 
-                with Popen(
-                    ["bash", fname],
-                    stdout=PIPE,
-                    stderr=STDOUT,
-                    close_fds=True,
-                    cwd=tmp_dir,
-                    env=self.env,
-                    preexec_fn=os.setsid,
-                ) as resp:
-                    if resp.stdout:
-                        self.log.info("Output:")
-                        for line in iter(resp.stdout.readline, b""):
-                            self.log.info(line.decode(self.output_encoding).strip())
-                    resp.wait()
-                    self.log.info("Command exited with return code %s", resp.returncode)
+            with Popen(
+                ["bash", fname],
+                stdout=PIPE,
+                stderr=STDOUT,
+                close_fds=True,
+                cwd=tmp_dir,
+                env=self.env,
+                preexec_fn=os.setsid,
+            ) as resp:
+                if resp.stdout:
+                    self.log.info("Output:")
+                    for line in iter(resp.stdout.readline, b""):
+                        self.log.info(line.decode(self.output_encoding).strip())
+                resp.wait()
+                self.log.info("Command exited with return code %s", resp.returncode)
 
-                    # zero code means success, the sensor can go green
-                    if resp.returncode == 0:
-                        return True
+                # zero code means success, the sensor can go green
+                if resp.returncode == 0:
+                    return True
 
-                    # we have a retry exit code, sensor retries if return code matches, otherwise error
-                    elif self.retry_exit_code is not None:
-                        if resp.returncode == self.retry_exit_code:
-                            self.log.info("Return code matches retry code, will retry later")
-                            return False
-                        else:
-                            raise AirflowFailException(f"Command exited with return code {resp.returncode}")
-
-                    # backwards compatibility: sensor retries no matter the error code
-                    else:
-                        self.log.info("Non-zero return code and no retry code set, will retry later")
+                # we have a retry exit code, sensor retries if return code matches, otherwise error
+                elif self.retry_exit_code is not None:
+                    if resp.returncode == self.retry_exit_code:
+                        self.log.info("Return code matches retry code, will retry later")
                         return False
+                    else:
+                        raise AirflowFailException(f"Command exited with return code {resp.returncode}")
+
+                # backwards compatibility: sensor retries no matter the error code
+                else:
+                    self.log.info("Non-zero return code and no retry code set, will retry later")
+                    return False
diff --git a/airflow/sensors/filesystem.py b/airflow/sensors/filesystem.py
index dea1643d9ae21..d2d006818f93f 100644
--- a/airflow/sensors/filesystem.py
+++ b/airflow/sensors/filesystem.py
@@ -66,10 +66,10 @@ def poke(self, context: Context):
         for path in glob(full_path, recursive=self.recursive):
             if os.path.isfile(path):
                 mod_time = datetime.datetime.fromtimestamp(os.path.getmtime(path)).strftime("%Y%m%d%H%M%S")
-                self.log.info("Found File %s last modified: %s", str(path), mod_time)
+                self.log.info("Found File %s last modified: %s", path, mod_time)
                 return True
 
             for _, _, files in os.walk(path):
-                if len(files) > 0:
+                if files:
                     return True
         return False
diff --git a/airflow/serialization/serialized_objects.py b/airflow/serialization/serialized_objects.py
index 26dd817862296..53858368fc2bf 100644
--- a/airflow/serialization/serialized_objects.py
+++ b/airflow/serialization/serialized_objects.py
@@ -476,7 +476,7 @@ def serialize(
         elif isinstance(var, XComArg):
             return cls._encode(serialize_xcom_arg(var), type_=DAT.XCOM_REF)
         elif isinstance(var, Dataset):
-            return cls._encode(dict(uri=var.uri, extra=var.extra), type_=DAT.DATASET)
+            return cls._encode({"uri": var.uri, "extra": var.extra}, type_=DAT.DATASET)
         elif isinstance(var, SimpleTaskInstance):
             return cls._encode(
                 cls.serialize(var.__dict__, strict=strict, use_pydantic_models=use_pydantic_models),
@@ -616,12 +616,12 @@ def _value_is_hardcoded_default(cls, attrname: str, value: Any, instance: Any) -
 
     @classmethod
     def _serialize_param(cls, param: Param):
-        return dict(
-            __class=f"{param.__module__}.{param.__class__.__name__}",
-            default=cls.serialize(param.value),
-            description=cls.serialize(param.description),
-            schema=cls.serialize(param.schema),
-        )
+        return {
+            "__class": f"{param.__module__}.{param.__class__.__name__}",
+            "default": cls.serialize(param.value),
+            "description": cls.serialize(param.description),
+            "schema": cls.serialize(param.schema),
+        }
 
     @classmethod
     def _deserialize_param(cls, param_dict: dict):
@@ -645,13 +645,10 @@ def is_serialized(val):
             return False
 
         for attr in attrs:
-            if attr not in param_dict:
-                continue
-            val = param_dict[attr]
-            if is_serialized(val):
-                deserialized_val = cls.deserialize(param_dict[attr])
-                kwargs[attr] = deserialized_val
-            else:
+            if attr in param_dict:
+                val = param_dict[attr]
+                if is_serialized(val):
+                    val = cls.deserialize(val)
                 kwargs[attr] = val
         return class_(**kwargs)
 
@@ -988,9 +985,11 @@ def populate_operator(cls, op: Operator, encoded_op: dict[str, Any]) -> None:
                 v = {arg: cls.deserialize(value) for arg, value in v.items()}
             elif k in {"expand_input", "op_kwargs_expand_input"}:
                 v = _ExpandInputRef(v["type"], cls.deserialize(v["value"]))
-            elif k in cls._decorated_fields or k not in op.get_serialized_fields():
-                v = cls.deserialize(v)
-            elif k in ("outlets", "inlets"):
+            elif (
+                k in cls._decorated_fields
+                or k not in op.get_serialized_fields()
+                or k in ("outlets", "inlets")
+            ):
                 v = cls.deserialize(v)
             elif k == "on_failure_fail_dagrun":
                 k = "_on_failure_fail_dagrun"
@@ -1388,6 +1387,14 @@ def deserialize_dag(cls, encoded_dag: dict[str, Any]) -> SerializedDAG:
 
         return dag
 
+    @classmethod
+    def _is_excluded(cls, var: Any, attrname: str, op: DAGNode):
+        # {} is explicitly different from None in the case of DAG-level access control
+        # and as a result we need to preserve empty dicts through serialization for this field
+        if attrname == "_access_control" and var is not None:
+            return False
+        return super()._is_excluded(var, attrname, op)
+
     @classmethod
     def to_dict(cls, var: Any) -> dict:
         """Stringifies DAGs and operators contained by var and returns a dict of var."""
diff --git a/airflow/serialization/serializers/datetime.py b/airflow/serialization/serializers/datetime.py
index bdb9a6cb6c5a6..49f0899a5918f 100644
--- a/airflow/serialization/serializers/datetime.py
+++ b/airflow/serialization/serializers/datetime.py
@@ -19,6 +19,10 @@
 
 from typing import TYPE_CHECKING
 
+from airflow.serialization.serializers.timezone import (
+    deserialize as deserialize_timezone,
+    serialize as serialize_timezone,
+)
 from airflow.utils.module_loading import qualname
 from airflow.utils.timezone import convert_to_utc, is_naive
 
@@ -27,7 +31,7 @@
 
     from airflow.serialization.serde import U
 
-__version__ = 1
+__version__ = 2
 
 serializers = ["datetime.date", "datetime.datetime", "datetime.timedelta", "pendulum.datetime.DateTime"]
 deserializers = serializers
@@ -44,7 +48,7 @@ def serialize(o: object) -> tuple[U, str, int, bool]:
         if is_naive(o):
             o = convert_to_utc(o)
 
-        tz = o.tzname()
+        tz = serialize_timezone(o.tzinfo)
 
         return {TIMESTAMP: o.timestamp(), TIMEZONE: tz}, qn, __version__, True
 
@@ -61,13 +65,31 @@ def deserialize(classname: str, version: int, data: dict | str) -> datetime.date
     import datetime
 
     from pendulum import DateTime
-    from pendulum.tz import timezone
+    from pendulum.tz import fixed_timezone, timezone
+
+    tz: datetime.tzinfo | None = None
+    if isinstance(data, dict) and TIMEZONE in data:
+        if version == 1:
+            # try to deserialize unsupported timezones
+            timezone_mapping = {
+                "EDT": fixed_timezone(-4 * 3600),
+                "CDT": fixed_timezone(-5 * 3600),
+                "MDT": fixed_timezone(-6 * 3600),
+                "PDT": fixed_timezone(-7 * 3600),
+                "CEST": timezone("CET"),
+            }
+            if data[TIMEZONE] in timezone_mapping:
+                tz = timezone_mapping[data[TIMEZONE]]
+            else:
+                tz = timezone(data[TIMEZONE])
+        else:
+            tz = deserialize_timezone(data[TIMEZONE][1], data[TIMEZONE][2], data[TIMEZONE][0])
 
     if classname == qualname(datetime.datetime) and isinstance(data, dict):
-        return datetime.datetime.fromtimestamp(float(data[TIMESTAMP]), tz=timezone(data[TIMEZONE]))
+        return datetime.datetime.fromtimestamp(float(data[TIMESTAMP]), tz=tz)
 
     if classname == qualname(DateTime) and isinstance(data, dict):
-        return DateTime.fromtimestamp(float(data[TIMESTAMP]), tz=timezone(data[TIMEZONE]))
+        return DateTime.fromtimestamp(float(data[TIMESTAMP]), tz=tz)
 
     if classname == qualname(datetime.timedelta) and isinstance(data, (str, float)):
         return datetime.timedelta(seconds=float(data))
diff --git a/airflow/serialization/serializers/timezone.py b/airflow/serialization/serializers/timezone.py
index b55b51610b41b..23901b9d444e8 100644
--- a/airflow/serialization/serializers/timezone.py
+++ b/airflow/serialization/serializers/timezone.py
@@ -17,17 +17,28 @@
 # under the License.
 from __future__ import annotations
 
-from typing import TYPE_CHECKING
+import datetime
+import sys
+from typing import TYPE_CHECKING, Any, cast
 
 from airflow.utils.module_loading import qualname
 
 if TYPE_CHECKING:
-    from pendulum.tz.timezone import Timezone
-
     from airflow.serialization.serde import U
 
 
-serializers = ["pendulum.tz.timezone.FixedTimezone", "pendulum.tz.timezone.Timezone"]
+serializers = [
+    "pendulum.tz.timezone.FixedTimezone",
+    "pendulum.tz.timezone.Timezone",
+]
+
+PY39 = sys.version_info >= (3, 9)
+
+if PY39:
+    serializers.append("zoneinfo.ZoneInfo")
+else:
+    serializers.append("backports.zoneinfo.ZoneInfo")
+
 deserializers = serializers
 
 __version__ = 1
@@ -43,21 +54,26 @@ def serialize(o: object) -> tuple[U, str, int, bool]:
     0 without the special case), but passing 0 into ``pendulum.timezone`` does
     not give us UTC (but ``+00:00``).
     """
-    from pendulum.tz.timezone import FixedTimezone, Timezone
+    from pendulum.tz.timezone import FixedTimezone
 
     name = qualname(o)
+
     if isinstance(o, FixedTimezone):
         if o.offset == 0:
             return "UTC", name, __version__, True
         return o.offset, name, __version__, True
 
-    if isinstance(o, Timezone):
-        return o.name, name, __version__, True
+    tz_name = _get_tzinfo_name(cast(datetime.tzinfo, o))
+    if tz_name is not None:
+        return tz_name, name, __version__, True
+
+    if cast(datetime.tzinfo, o).utcoffset(None) == datetime.timedelta(0):
+        return "UTC", qualname(FixedTimezone), __version__, True
 
     return "", "", 0, False
 
 
-def deserialize(classname: str, version: int, data: object) -> Timezone:
+def deserialize(classname: str, version: int, data: object) -> Any:
     from pendulum.tz import fixed_timezone, timezone
 
     if not isinstance(data, (str, int)):
@@ -69,4 +85,30 @@ def deserialize(classname: str, version: int, data: object) -> Timezone:
     if isinstance(data, int):
         return fixed_timezone(data)
 
+    if "zoneinfo.ZoneInfo" in classname:
+        try:
+            from zoneinfo import ZoneInfo
+        except ImportError:
+            from backports.zoneinfo import ZoneInfo
+
+        return ZoneInfo(data)
+
     return timezone(data)
+
+
+# ported from pendulum.tz.timezone._get_tzinfo_name
+def _get_tzinfo_name(tzinfo: datetime.tzinfo | None) -> str | None:
+    if tzinfo is None:
+        return None
+
+    if hasattr(tzinfo, "key"):
+        # zoneinfo timezone
+        return tzinfo.key
+    elif hasattr(tzinfo, "name"):
+        # Pendulum timezone
+        return tzinfo.name
+    elif hasattr(tzinfo, "zone"):
+        # pytz timezone
+        return tzinfo.zone  # type: ignore[no-any-return]
+
+    return None
diff --git a/airflow/settings.py b/airflow/settings.py
index 4ba9e80bd760f..941b58e5b8c83 100644
--- a/airflow/settings.py
+++ b/airflow/settings.py
@@ -47,8 +47,6 @@
 
 log = logging.getLogger(__name__)
 
-
-TIMEZONE = pendulum.tz.timezone("UTC")
 try:
     tz = conf.get_mandatory_value("core", "default_timezone")
     if tz == "system":
@@ -56,7 +54,8 @@
     else:
         TIMEZONE = pendulum.tz.timezone(tz)
 except Exception:
-    pass
+    TIMEZONE = pendulum.tz.timezone("UTC")
+
 log.info("Configured default timezone %s", TIMEZONE)
 
 
@@ -100,7 +99,6 @@
     "restarting": "violet",
     "running": "lime",
     "scheduled": "tan",
-    "shutdown": "blue",
     "skipped": "hotpink",
     "success": "green",
     "up_for_reschedule": "turquoise",
@@ -311,7 +309,7 @@ def prepare_engine_args(disable_connection_pool=False, pool_class=None):
         # Typically, this is a simple statement like "SELECT 1", but may also make use
         # of some DBAPI-specific method to test the connection for liveness.
         # More information here:
-        # https://docs.sqlalchemy.org/en/13/core/pooling.html#disconnect-handling-pessimistic
+        # https://docs.sqlalchemy.org/en/14/core/pooling.html#disconnect-handling-pessimistic
         pool_pre_ping = conf.getboolean("database", "SQL_ALCHEMY_POOL_PRE_PING", fallback=True)
 
         log.debug(
diff --git a/airflow/stats.py b/airflow/stats.py
index 5b84def6db76a..93c70deab5ae9 100644
--- a/airflow/stats.py
+++ b/airflow/stats.py
@@ -62,14 +62,10 @@ def __init__(cls, *args, **kwargs) -> None:
     @classmethod
     def get_constant_tags(cls) -> list[str]:
         """Get constant DataDog tags to add to all stats."""
-        tags: list[str] = []
         tags_in_string = conf.get("metrics", "statsd_datadog_tags", fallback=None)
-        if tags_in_string is None or tags_in_string == "":
-            return tags
-        else:
-            for key_value in tags_in_string.split(","):
-                tags.append(key_value)
-            return tags
+        if not tags_in_string:
+            return []
+        return tags_in_string.split(",")
 
 
 if TYPE_CHECKING:
diff --git a/airflow/task/task_runner/cgroup_task_runner.py b/airflow/task/task_runner/cgroup_task_runner.py
index 2ab011471377a..14354453bc62a 100644
--- a/airflow/task/task_runner/cgroup_task_runner.py
+++ b/airflow/task/task_runner/cgroup_task_runner.py
@@ -134,7 +134,7 @@ def start(self):
             return
 
         # Create a unique cgroup name
-        cgroup_name = f"airflow/{datetime.datetime.utcnow().strftime('%Y-%m-%d')}/{str(uuid.uuid4())}"
+        cgroup_name = f"airflow/{datetime.datetime.utcnow():%Y-%m-%d}/{uuid.uuid4()}"
 
         self.mem_cgroup_name = f"memory/{cgroup_name}"
         self.cpu_cgroup_name = f"cpu/{cgroup_name}"
diff --git a/airflow/template/templater.py b/airflow/template/templater.py
index 19eb3f59965f8..103f5a2873ea8 100644
--- a/airflow/template/templater.py
+++ b/airflow/template/templater.py
@@ -68,9 +68,7 @@ def resolve_template_files(self) -> None:
         if self.template_ext:
             for field in self.template_fields:
                 content = getattr(self, field, None)
-                if content is None:
-                    continue
-                elif isinstance(content, str) and content.endswith(tuple(self.template_ext)):
+                if isinstance(content, str) and content.endswith(tuple(self.template_ext)):
                     env = self.get_template_env()
                     try:
                         setattr(self, field, env.loader.get_source(env, content)[0])  # type: ignore
diff --git a/airflow/ti_deps/deps/trigger_rule_dep.py b/airflow/ti_deps/deps/trigger_rule_dep.py
index 609f3b539ed1d..0359880538541 100644
--- a/airflow/ti_deps/deps/trigger_rule_dep.py
+++ b/airflow/ti_deps/deps/trigger_rule_dep.py
@@ -470,20 +470,7 @@ def _evaluate_direct_relatives() -> Iterator[TIDepStatus]:
                             f"upstream_task_ids={task.upstream_task_ids}"
                         )
                     )
-            elif trigger_rule == TR.NONE_FAILED:
-                num_failures = upstream - success - skipped
-                if ti.map_index > -1:
-                    num_failures -= removed
-                if num_failures > 0:
-                    yield self._failing_status(
-                        reason=(
-                            f"Task's trigger rule '{trigger_rule}' requires all upstream tasks to have "
-                            f"succeeded or been skipped, but found {num_failures} non-success(es). "
-                            f"upstream_states={upstream_states}, "
-                            f"upstream_task_ids={task.upstream_task_ids}"
-                        )
-                    )
-            elif trigger_rule == TR.NONE_FAILED_MIN_ONE_SUCCESS:
+            elif trigger_rule == TR.NONE_FAILED or trigger_rule == TR.NONE_FAILED_MIN_ONE_SUCCESS:
                 num_failures = upstream - success - skipped
                 if ti.map_index > -1:
                     num_failures -= removed
diff --git a/airflow/timetables/events.py b/airflow/timetables/events.py
index a59f4fc5b2077..ce8fa9527f787 100644
--- a/airflow/timetables/events.py
+++ b/airflow/timetables/events.py
@@ -52,7 +52,7 @@ def __init__(
         self.event_dates = list(event_dates)  # Must be reversible and indexable
         if not presorted:
             # For long lists this could take a while, so only want to do it once
-            self.event_dates = sorted(self.event_dates)
+            self.event_dates.sort()
         self.restrict_to_events = restrict_to_events
         if description is None:
             self.description = (
diff --git a/airflow/triggers/external_task.py b/airflow/triggers/external_task.py
index 431d91a15e025..2a205d1f91010 100644
--- a/airflow/triggers/external_task.py
+++ b/airflow/triggers/external_task.py
@@ -90,8 +90,8 @@ async def run(self) -> typing.AsyncIterator[TriggerEvent]:
         If dag with specified name was not in the running state after _timeout_sec seconds
         after starting execution process of the trigger, terminate with status 'timeout'.
         """
-        while True:
-            try:
+        try:
+            while True:
                 delta = utcnow() - self.trigger_start_time
                 if delta.total_seconds() < self._timeout_sec:
                     # mypy confuses typing here
@@ -107,9 +107,8 @@ async def run(self) -> typing.AsyncIterator[TriggerEvent]:
                     return
                 self.log.info("Task is still running, sleeping for %s seconds...", self.poll_interval)
                 await asyncio.sleep(self.poll_interval)
-            except Exception:
-                yield TriggerEvent({"status": "failed"})
-                return
+        except Exception:
+            yield TriggerEvent({"status": "failed"})
 
     @sync_to_async
     @provide_session
diff --git a/airflow/triggers/file.py b/airflow/triggers/file.py
index 12b2d0e8272e5..93880407e5360 100644
--- a/airflow/triggers/file.py
+++ b/airflow/triggers/file.py
@@ -65,9 +65,9 @@ async def run(self) -> typing.AsyncIterator[TriggerEvent]:
                 if os.path.isfile(path):
                     mod_time_f = os.path.getmtime(path)
                     mod_time = datetime.datetime.fromtimestamp(mod_time_f).strftime("%Y%m%d%H%M%S")
-                    self.log.info("Found File %s last modified: %s", str(path), str(mod_time))
+                    self.log.info("Found File %s last modified: %s", path, mod_time)
                     yield TriggerEvent(True)
                 for _, _, files in os.walk(self.filepath):
-                    if len(files) > 0:
+                    if files:
                         yield TriggerEvent(True)
             await asyncio.sleep(self.poll_interval)
diff --git a/airflow/utils/code_utils.py b/airflow/utils/code_utils.py
index f43a6ce41d059..01eb0c8da040a 100644
--- a/airflow/utils/code_utils.py
+++ b/airflow/utils/code_utils.py
@@ -19,6 +19,7 @@
 import functools
 import inspect
 import os
+from pathlib import Path
 from typing import Any
 
 
@@ -61,21 +62,18 @@ def prepare_code_snippet(file_path: str, line_no: int, context_lines_count: int
     :param context_lines_count: The number of lines that will be cut before and after.
     :return: str
     """
-    with open(file_path) as text_file:
-        # Highlight code
-        code = text_file.read()
-        code_lines = code.split("\n")
-        # Prepend line number
-        code_lines = [
-            f">{lno:3} | {line}" if line_no == lno else f"{lno:4} | {line}"
-            for lno, line in enumerate(code_lines, 1)
-        ]
-        # # Cut out the snippet
-        start_line_no = max(0, line_no - context_lines_count - 1)
-        end_line_no = line_no + context_lines_count
-        code_lines = code_lines[start_line_no:end_line_no]
-        # Join lines
-        code = "\n".join(code_lines)
+    code_lines = Path(file_path).read_text().splitlines()
+    # Prepend line number
+    code_lines = [
+        f">{lno:3} | {line}" if line_no == lno else f"{lno:4} | {line}"
+        for lno, line in enumerate(code_lines, 1)
+    ]
+    # # Cut out the snippet
+    start_line_no = max(0, line_no - context_lines_count - 1)
+    end_line_no = line_no + context_lines_count
+    code_lines = code_lines[start_line_no:end_line_no]
+    # Join lines
+    code = "\n".join(code_lines)
     return code
 
 
diff --git a/airflow/utils/dag_edges.py b/airflow/utils/dag_edges.py
index 7e31762ad91bb..17e596e15bc65 100644
--- a/airflow/utils/dag_edges.py
+++ b/airflow/utils/dag_edges.py
@@ -111,10 +111,9 @@ def collect_edges(task_group):
                 edge = (task.task_id, child.task_id)
                 if task.is_setup and child.is_teardown:
                     setup_teardown_edges.add(edge)
-                if edge in edges:
-                    continue
-                edges.add(edge)
-                tasks_to_trace_next.append(child)
+                if edge not in edges:
+                    edges.add(edge)
+                    tasks_to_trace_next.append(child)
         tasks_to_trace = tasks_to_trace_next
 
     result = []
diff --git a/airflow/utils/dates.py b/airflow/utils/dates.py
index c97e99aaba40b..b4eecdcb56515 100644
--- a/airflow/utils/dates.py
+++ b/airflow/utils/dates.py
@@ -243,12 +243,14 @@ def infer_time_unit(time_seconds_arr: Collection[float]) -> TimeUnit:
 def scale_time_units(time_seconds_arr: Collection[float], unit: TimeUnit) -> Collection[float]:
     """Convert an array of time durations in seconds to the specified time unit."""
     if unit == "minutes":
-        return list(map(lambda x: x / 60, time_seconds_arr))
+        factor = 60
     elif unit == "hours":
-        return list(map(lambda x: x / (60 * 60), time_seconds_arr))
+        factor = 60 * 60
     elif unit == "days":
-        return list(map(lambda x: x / (24 * 60 * 60), time_seconds_arr))
-    return time_seconds_arr
+        factor = 24 * 60 * 60
+    else:
+        factor = 1
+    return [x / factor for x in time_seconds_arr]
 
 
 def days_ago(n, hour=0, minute=0, second=0, microsecond=0):
diff --git a/airflow/utils/db.py b/airflow/utils/db.py
index 4429cb8dfe893..80dd788688e67 100644
--- a/airflow/utils/db.py
+++ b/airflow/utils/db.py
@@ -1446,10 +1446,8 @@ class BadReferenceConfig:
 
         dangling_table_name = _format_airflow_moved_table_name(source_table.name, change_version, "dangling")
         if dangling_table_name in existing_table_names:
-            invalid_row_count = bad_rows_query.count()
-            if invalid_row_count <= 0:
-                continue
-            else:
+            invalid_row_count = get_query_count(bad_rows_query, session=session)
+            if invalid_row_count:
                 yield _format_dangling_error(
                     source_table=source_table.name,
                     target_table=dangling_table_name,
@@ -1651,10 +1649,9 @@ def resetdb(session: Session = NEW_SESSION, skip_init: bool = False):
 
     connection = settings.engine.connect()
 
-    with create_global_lock(session=session, lock=DBLocks.MIGRATIONS):
-        with connection.begin():
-            drop_airflow_models(connection)
-            drop_airflow_moved_tables(connection)
+    with create_global_lock(session=session, lock=DBLocks.MIGRATIONS), connection.begin():
+        drop_airflow_models(connection)
+        drop_airflow_moved_tables(connection)
 
     if not skip_init:
         initdb(session=session)
diff --git a/airflow/utils/db_cleanup.py b/airflow/utils/db_cleanup.py
index 4c82f90ab3814..90d7aba91dc1d 100644
--- a/airflow/utils/db_cleanup.py
+++ b/airflow/utils/db_cleanup.py
@@ -83,13 +83,13 @@ def __lt__(self, other):
 
     @property
     def readable_config(self):
-        return dict(
-            table=self.orm_model.name,
-            recency_column=str(self.recency_column),
-            keep_last=self.keep_last,
-            keep_last_filters=[str(x) for x in self.keep_last_filters] if self.keep_last_filters else None,
-            keep_last_group_by=str(self.keep_last_group_by),
-        )
+        return {
+            "table": self.orm_model.name,
+            "recency_column": str(self.recency_column),
+            "keep_last": self.keep_last,
+            "keep_last_filters": [str(x) for x in self.keep_last_filters] if self.keep_last_filters else None,
+            "keep_last_group_by": str(self.keep_last_group_by),
+        }
 
 
 config_list: list[_TableConfig] = [
@@ -431,19 +431,19 @@ def run_cleanup(
         _confirm_delete(date=clean_before_timestamp, tables=sorted(effective_table_names))
     existing_tables = reflect_tables(tables=None, session=session).tables
     for table_name, table_config in effective_config_dict.items():
-        if table_name not in existing_tables:
+        if table_name in existing_tables:
+            with _suppress_with_logging(table_name, session):
+                _cleanup_table(
+                    clean_before_timestamp=clean_before_timestamp,
+                    dry_run=dry_run,
+                    verbose=verbose,
+                    **table_config.__dict__,
+                    skip_archive=skip_archive,
+                    session=session,
+                )
+                session.commit()
+        else:
             logger.warning("Table %s not found.  Skipping.", table_name)
-            continue
-        with _suppress_with_logging(table_name, session):
-            _cleanup_table(
-                clean_before_timestamp=clean_before_timestamp,
-                dry_run=dry_run,
-                verbose=verbose,
-                **table_config.__dict__,
-                skip_archive=skip_archive,
-                session=session,
-            )
-            session.commit()
 
 
 @provide_session
diff --git a/airflow/utils/dot_renderer.py b/airflow/utils/dot_renderer.py
index 7b895f739f97e..b6e2cdb7b0944 100644
--- a/airflow/utils/dot_renderer.py
+++ b/airflow/utils/dot_renderer.py
@@ -120,7 +120,7 @@ def _draw_nodes(
     node: DependencyMixin, parent_graph: graphviz.Digraph, states_by_task_id: dict[str, str] | None
 ) -> None:
     """Draw the node and its children on the given parent_graph recursively."""
-    if isinstance(node, BaseOperator) or isinstance(node, MappedOperator):
+    if isinstance(node, (BaseOperator, MappedOperator)):
         _draw_task(node, parent_graph, states_by_task_id)
     else:
         if not isinstance(node, TaskGroup):
diff --git a/airflow/utils/email.py b/airflow/utils/email.py
index 2957e5e1d3f64..659c3bdb0f192 100644
--- a/airflow/utils/email.py
+++ b/airflow/utils/email.py
@@ -271,18 +271,17 @@ def send_mime_email(
             try:
                 smtp_conn = _get_smtp_connection(smtp_host, smtp_port, smtp_timeout, smtp_ssl)
             except smtplib.SMTPServerDisconnected:
-                if attempt < smtp_retry_limit:
-                    continue
-                raise
-
-            if smtp_starttls:
-                smtp_conn.starttls()
-            if smtp_user and smtp_password:
-                smtp_conn.login(smtp_user, smtp_password)
-            log.info("Sent an alert email to %s", e_to)
-            smtp_conn.sendmail(e_from, e_to, mime_msg.as_string())
-            smtp_conn.quit()
-            break
+                if attempt == smtp_retry_limit:
+                    raise
+            else:
+                if smtp_starttls:
+                    smtp_conn.starttls()
+                if smtp_user and smtp_password:
+                    smtp_conn.login(smtp_user, smtp_password)
+                log.info("Sent an alert email to %s", e_to)
+                smtp_conn.sendmail(e_from, e_to, mime_msg.as_string())
+                smtp_conn.quit()
+                break
 
 
 def get_email_address_list(addresses: str | Iterable[str]) -> list[str]:
diff --git a/airflow/utils/file.py b/airflow/utils/file.py
index 9178fa4af5541..f885e57b37f88 100644
--- a/airflow/utils/file.py
+++ b/airflow/utils/file.py
@@ -244,12 +244,10 @@ def _find_path_from_directory(
             patterns_by_dir.update({dirpath: patterns.copy()})
 
         for file in files:
-            if file == ignore_file_name:
-                continue
-            abs_file_path = Path(root) / file
-            if ignore_rule_type.match(abs_file_path, patterns):
-                continue
-            yield str(abs_file_path)
+            if file != ignore_file_name:
+                abs_file_path = Path(root) / file
+                if not ignore_rule_type.match(abs_file_path, patterns):
+                    yield str(abs_file_path)
 
 
 def find_path_from_directory(
@@ -310,16 +308,11 @@ def find_dag_file_paths(directory: str | os.PathLike[str], safe_mode: bool) -> l
     file_paths = []
 
     for file_path in find_path_from_directory(directory, ".airflowignore"):
+        path = Path(file_path)
         try:
-            if not os.path.isfile(file_path):
-                continue
-            _, file_ext = os.path.splitext(os.path.split(file_path)[-1])
-            if file_ext != ".py" and not zipfile.is_zipfile(file_path):
-                continue
-            if not might_contain_dag(file_path, safe_mode):
-                continue
-
-            file_paths.append(file_path)
+            if path.is_file() and (path.suffix == ".py" or zipfile.is_zipfile(path)):
+                if might_contain_dag(file_path, safe_mode):
+                    file_paths.append(file_path)
         except Exception:
             log.exception("Error while examining %s", file_path)
 
diff --git a/airflow/utils/log/__init__.py b/airflow/utils/log/__init__.py
index 54ed77139f629..13d03762d1850 100644
--- a/airflow/utils/log/__init__.py
+++ b/airflow/utils/log/__init__.py
@@ -21,29 +21,29 @@
 from airflow.utils.deprecation_tools import add_deprecated_classes
 
 __deprecated_classes = {
-    'cloudwatch_task_handler': {
-        'CloudwatchTaskHandler': (
-            'airflow.providers.amazon.aws.log.cloudwatch_task_handler.CloudwatchTaskHandler'
+    "cloudwatch_task_handler": {
+        "CloudwatchTaskHandler": (
+            "airflow.providers.amazon.aws.log.cloudwatch_task_handler.CloudwatchTaskHandler"
         ),
     },
-    'es_task_handler': {
-        'ElasticsearchTaskHandler': (
-            'airflow.providers.elasticsearch.log.es_task_handler.ElasticsearchTaskHandler'
+    "es_task_handler": {
+        "ElasticsearchTaskHandler": (
+            "airflow.providers.elasticsearch.log.es_task_handler.ElasticsearchTaskHandler"
         ),
     },
-    'gcs_task_handler': {
-        'GCSTaskHandler': 'airflow.providers.google.cloud.log.gcs_task_handler.GCSTaskHandler',
+    "gcs_task_handler": {
+        "GCSTaskHandler": "airflow.providers.google.cloud.log.gcs_task_handler.GCSTaskHandler",
     },
-    's3_task_handler': {
-        'S3TaskHandler': 'airflow.providers.amazon.aws.log.s3_task_handler.S3TaskHandler',
+    "s3_task_handler": {
+        "S3TaskHandler": "airflow.providers.amazon.aws.log.s3_task_handler.S3TaskHandler",
     },
-    'stackdriver_task_handler': {
-        'StackdriverTaskHandler': (
-            'airflow.providers.google.cloud.log.stackdriver_task_handler.StackdriverTaskHandler'
+    "stackdriver_task_handler": {
+        "StackdriverTaskHandler": (
+            "airflow.providers.google.cloud.log.stackdriver_task_handler.StackdriverTaskHandler"
         ),
     },
-    'wasb_task_handler': {
-        'WasbTaskHandler': 'airflow.providers.microsoft.azure.log.wasb_task_handler.WasbTaskHandler',
+    "wasb_task_handler": {
+        "WasbTaskHandler": "airflow.providers.microsoft.azure.log.wasb_task_handler.WasbTaskHandler",
     },
 }
 
diff --git a/airflow/utils/log/file_task_handler.py b/airflow/utils/log/file_task_handler.py
index 1314cd7ff9b85..25b664074efc9 100644
--- a/airflow/utils/log/file_task_handler.py
+++ b/airflow/utils/log/file_task_handler.py
@@ -109,14 +109,13 @@ def _parse_timestamps_in_log_file(lines: Iterable[str]):
     timestamp = None
     next_timestamp = None
     for idx, line in enumerate(lines):
-        if not line:
-            continue
-        with suppress(Exception):
-            # next_timestamp unchanged if line can't be parsed
-            next_timestamp = _parse_timestamp(line)
-        if next_timestamp:
-            timestamp = next_timestamp
-        yield timestamp, idx, line
+        if line:
+            with suppress(Exception):
+                # next_timestamp unchanged if line can't be parsed
+                next_timestamp = _parse_timestamp(line)
+            if next_timestamp:
+                timestamp = next_timestamp
+            yield timestamp, idx, line
 
 
 def _interleave_logs(*logs):
@@ -520,7 +519,7 @@ def _read_from_logs_server(self, ti, worker_log_rel_path) -> tuple[list[str], li
                 messages.append(f"Found logs served from host {url}")
                 logs.append(response.text)
         except Exception as e:
-            messages.append(f"Could not read served logs: {str(e)}")
+            messages.append(f"Could not read served logs: {e}")
             logger.exception("Could not read served logs")
         return messages, logs
 
diff --git a/airflow/utils/log/json_formatter.py b/airflow/utils/log/json_formatter.py
index d191e69a20f20..eb19fe8969437 100644
--- a/airflow/utils/log/json_formatter.py
+++ b/airflow/utils/log/json_formatter.py
@@ -37,7 +37,7 @@ def __init__(self, fmt=None, datefmt=None, style="%", json_fields=None, extras=N
         self.extras = extras
 
     def usesTime(self):
-        return self.json_fields.count("asctime") > 0
+        return "asctime" in self.json_fields
 
     def format(self, record):
         super().format(record)
diff --git a/airflow/utils/log/secrets_masker.py b/airflow/utils/log/secrets_masker.py
index a0f0da847c1b5..844c44df6c50b 100644
--- a/airflow/utils/log/secrets_masker.py
+++ b/airflow/utils/log/secrets_masker.py
@@ -176,7 +176,7 @@ def _record_attrs_to_ignore(self) -> Iterable[str]:
             __file__,
             1,
             "",
-            tuple(),
+            (),
             exc_info=None,
             func="funcname",
         )
@@ -205,9 +205,8 @@ def filter(self, record) -> bool:
 
         if self.replacer:
             for k, v in record.__dict__.items():
-                if k in self._record_attrs_to_ignore:
-                    continue
-                record.__dict__[k] = self.redact(v)
+                if k not in self._record_attrs_to_ignore:
+                    record.__dict__[k] = self.redact(v)
             if record.exc_info and record.exc_info[1] is not None:
                 exc = record.exc_info[1]
                 self._redact_exception_with_context(exc)
diff --git a/airflow/utils/log/timezone_aware.py b/airflow/utils/log/timezone_aware.py
index 999ccda5a722a..ae96a11116a1f 100644
--- a/airflow/utils/log/timezone_aware.py
+++ b/airflow/utils/log/timezone_aware.py
@@ -40,11 +40,7 @@ def formatTime(self, record, datefmt=None):
         date and time format in the local time zone.
         """
         dt = pendulum.from_timestamp(record.created, tz=pendulum.local_timezone())
-        if datefmt:
-            s = dt.strftime(datefmt)
-        else:
-            s = dt.strftime(self.default_time_format)
-
+        s = dt.strftime(datefmt or self.default_time_format)
         if self.default_msec_format:
             s = self.default_msec_format % (s, record.msecs)
         if self.default_tz_format:
diff --git a/airflow/utils/log/trigger_handler.py b/airflow/utils/log/trigger_handler.py
index 54f8ace65e746..39d69e0565c4d 100644
--- a/airflow/utils/log/trigger_handler.py
+++ b/airflow/utils/log/trigger_handler.py
@@ -111,7 +111,7 @@ def close_one(self, trigger_id):
             del self.handlers[trigger_id]
 
     def flush(self):
-        for _, h in self.handlers.items():
+        for h in self.handlers.values():
             h.flush()
 
     def close(self):
diff --git a/airflow/utils/python_virtualenv.py b/airflow/utils/python_virtualenv.py
index a9f7b5eeb1241..cb1ea37a90dad 100644
--- a/airflow/utils/python_virtualenv.py
+++ b/airflow/utils/python_virtualenv.py
@@ -40,15 +40,13 @@ def _generate_virtualenv_cmd(tmp_dir: str, python_bin: str, system_site_packages
 def _generate_pip_install_cmd_from_file(
     tmp_dir: str, requirements_file_path: str, pip_install_options: list[str]
 ) -> list[str]:
-    cmd = [f"{tmp_dir}/bin/pip", "install"] + pip_install_options + ["-r"]
-    return cmd + [requirements_file_path]
+    return [f"{tmp_dir}/bin/pip", "install", *pip_install_options, "-r", requirements_file_path]
 
 
 def _generate_pip_install_cmd_from_list(
     tmp_dir: str, requirements: list[str], pip_install_options: list[str]
 ) -> list[str]:
-    cmd = [f"{tmp_dir}/bin/pip", "install"] + pip_install_options
-    return cmd + requirements
+    return [f"{tmp_dir}/bin/pip", "install", *pip_install_options, *requirements]
 
 
 def remove_task_decorator(python_source: str, task_decorator_name: str) -> str:
diff --git a/airflow/utils/setup_teardown.py b/airflow/utils/setup_teardown.py
index f1de3b4092a08..c61bc4c4a1acc 100644
--- a/airflow/utils/setup_teardown.py
+++ b/airflow/utils/setup_teardown.py
@@ -168,7 +168,7 @@ def push_setup_teardown_task(cls, operator: AbstractOperator | list[AbstractOper
     @classmethod
     def _push_tasks(cls, operator: AbstractOperator | list[AbstractOperator], setup: bool = False):
         if isinstance(operator, list):
-            if not all(task.is_setup == operator[0].is_setup for task in operator):
+            if any(task.is_setup != operator[0].is_setup for task in operator):
                 cls.error("All tasks in the list must be either setup or teardown tasks")
         if setup:
             cls.push_context_managed_setup_task(operator)
diff --git a/airflow/utils/state.py b/airflow/utils/state.py
index 6da7dacc75ce4..1061970c46735 100644
--- a/airflow/utils/state.py
+++ b/airflow/utils/state.py
@@ -25,7 +25,6 @@ class JobState(str, Enum):
 
     RUNNING = "running"
     SUCCESS = "success"
-    SHUTDOWN = "shutdown"
     RESTARTING = "restarting"
     FAILED = "failed"
 
@@ -51,7 +50,6 @@ class TaskInstanceState(str, Enum):
     QUEUED = "queued"  # Executor has enqueued the task
     RUNNING = "running"  # Task is executing
     SUCCESS = "success"  # Task completed
-    SHUTDOWN = "shutdown"  # External request to shut down (e.g. marked failed when running)
     RESTARTING = "restarting"  # External request to restart (e.g. cleared when running)
     FAILED = "failed"  # Task errored out
     UP_FOR_RETRY = "up_for_retry"  # Task failed but has retries left
@@ -60,6 +58,14 @@ class TaskInstanceState(str, Enum):
     SKIPPED = "skipped"  # Skipped by branching or some other mechanism
     DEFERRED = "deferred"  # Deferrable operator waiting on a trigger
 
+    # Not used anymore, kept for compatibility.
+    # TODO: Remove in Airflow 3.0.
+    SHUTDOWN = "shutdown"
+    """The task instance is being shut down.
+
+    :meta private:
+    """
+
     def __str__(self) -> str:
         return self.value
 
@@ -82,7 +88,7 @@ def __str__(self) -> str:
 
 
 class State:
-    """Static class with task instance state constants and color methods to avoid hardcoding."""
+    """Static class with task instance state constants and color methods to avoid hard-coding."""
 
     # Backwards-compat constants for code that does not yet use the enum
     # These first three are shared by DagState and TaskState
@@ -95,7 +101,6 @@ class State:
     REMOVED = TaskInstanceState.REMOVED
     SCHEDULED = TaskInstanceState.SCHEDULED
     QUEUED = TaskInstanceState.QUEUED
-    SHUTDOWN = TaskInstanceState.SHUTDOWN
     RESTARTING = TaskInstanceState.RESTARTING
     UP_FOR_RETRY = TaskInstanceState.UP_FOR_RETRY
     UP_FOR_RESCHEDULE = TaskInstanceState.UP_FOR_RESCHEDULE
@@ -103,10 +108,18 @@ class State:
     SKIPPED = TaskInstanceState.SKIPPED
     DEFERRED = TaskInstanceState.DEFERRED
 
+    # Not used anymore, kept for compatibility.
+    # TODO: Remove in Airflow 3.0.
+    SHUTDOWN = TaskInstanceState.SHUTDOWN
+    """The task instance is being shut down.
+
+    :meta private:
+    """
+
     finished_dr_states: frozenset[DagRunState] = frozenset([DagRunState.SUCCESS, DagRunState.FAILED])
     unfinished_dr_states: frozenset[DagRunState] = frozenset([DagRunState.QUEUED, DagRunState.RUNNING])
 
-    task_states: tuple[TaskInstanceState | None, ...] = (None,) + tuple(TaskInstanceState)
+    task_states: tuple[TaskInstanceState | None, ...] = (None, *TaskInstanceState)
 
     dag_states: tuple[DagRunState, ...] = (
         DagRunState.QUEUED,
@@ -120,7 +133,6 @@ class State:
         TaskInstanceState.QUEUED: "gray",
         TaskInstanceState.RUNNING: "lime",
         TaskInstanceState.SUCCESS: "green",
-        TaskInstanceState.SHUTDOWN: "blue",
         TaskInstanceState.RESTARTING: "violet",
         TaskInstanceState.FAILED: "red",
         TaskInstanceState.UP_FOR_RETRY: "gold",
@@ -169,7 +181,6 @@ def color_fg(cls, state):
             TaskInstanceState.SCHEDULED,
             TaskInstanceState.QUEUED,
             TaskInstanceState.RUNNING,
-            TaskInstanceState.SHUTDOWN,
             TaskInstanceState.RESTARTING,
             TaskInstanceState.UP_FOR_RETRY,
             TaskInstanceState.UP_FOR_RESCHEDULE,
@@ -195,9 +206,13 @@ def color_fg(cls, state):
     A list of states indicating that a task or dag is a success state.
     """
 
+    # Kept for compatibility. DO NOT USE.
+    # TODO: Remove in Airflow 3.0.
     terminating_states = frozenset([TaskInstanceState.SHUTDOWN, TaskInstanceState.RESTARTING])
     """
     A list of states indicating that a task has been terminated.
+
+    :meta private:
     """
 
     adoptable_states = frozenset(
diff --git a/airflow/utils/strings.py b/airflow/utils/strings.py
index 421c47fce5ff3..e2ad9ddfcf641 100644
--- a/airflow/utils/strings.py
+++ b/airflow/utils/strings.py
@@ -17,13 +17,13 @@
 """Common utility functions with strings."""
 from __future__ import annotations
 
+import random
 import string
-from random import choice
 
 
 def get_random_string(length=8, choices=string.ascii_letters + string.digits):
     """Generate random string."""
-    return "".join(choice(choices) for _ in range(length))
+    return "".join(random.choices(choices, k=length))
 
 
 TRUE_LIKE_VALUES = {"on", "t", "true", "y", "yes", "1"}
diff --git a/airflow/utils/task_instance_session.py b/airflow/utils/task_instance_session.py
new file mode 100644
index 0000000000000..9d4dd958347c3
--- /dev/null
+++ b/airflow/utils/task_instance_session.py
@@ -0,0 +1,60 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+from __future__ import annotations
+
+import contextlib
+import logging
+import traceback
+from typing import TYPE_CHECKING
+
+from airflow.utils.session import create_session
+
+if TYPE_CHECKING:
+    from sqlalchemy.orm import Session
+
+__current_task_instance_session: Session | None = None
+
+log = logging.getLogger(__name__)
+
+
+def get_current_task_instance_session() -> Session:
+    global __current_task_instance_session
+    if not __current_task_instance_session:
+        log.warning("No task session set for this task. Continuing but this likely causes a resource leak.")
+        log.warning("Please report this and stacktrace below to https://github.com/apache/airflow/issues")
+        for filename, line_number, name, line in traceback.extract_stack():
+            log.warning('File: "%s", %s , in %s', filename, line_number, name)
+            if line:
+                log.warning("  %s", line.strip())
+        __current_task_instance_session = create_session()
+    return __current_task_instance_session
+
+
+@contextlib.contextmanager
+def set_current_task_instance_session(session: Session):
+    global __current_task_instance_session
+    if __current_task_instance_session:
+        raise RuntimeError(
+            "Session already set for this task. "
+            "You can only have one 'set_current_task_session' context manager active at a time."
+        )
+    __current_task_instance_session = session
+    try:
+        yield
+    finally:
+        __current_task_instance_session = None
diff --git a/airflow/www/api/experimental/endpoints.py b/airflow/www/api/experimental/endpoints.py
index ccf024543f328..0b7d9a91348f6 100644
--- a/airflow/www/api/experimental/endpoints.py
+++ b/airflow/www/api/experimental/endpoints.py
@@ -19,9 +19,9 @@
 
 import logging
 from functools import wraps
-from typing import Callable, TypeVar, cast
+from typing import TYPE_CHECKING, Callable, TypeVar, cast
 
-from flask import Blueprint, Response, current_app, g, jsonify, request, url_for
+from flask import Blueprint, current_app, g, jsonify, request, url_for
 
 from airflow import models
 from airflow.api.common.experimental import delete_dag as delete, pool as pool_api, trigger_dag as trigger
@@ -37,6 +37,9 @@
 from airflow.utils.strings import to_boolean
 from airflow.version import version
 
+if TYPE_CHECKING:
+    from flask import Response
+
 log = logging.getLogger(__name__)
 
 T = TypeVar("T", bound=Callable)
diff --git a/airflow/www/decorators.py b/airflow/www/decorators.py
index 94c1c34921ce3..38aed59de94d0 100644
--- a/airflow/www/decorators.py
+++ b/airflow/www/decorators.py
@@ -102,7 +102,7 @@ def wrapper(*args, **kwargs):
                 if event and event.startswith("connection."):
                     extra_fields = _mask_connection_fields(extra_fields)
 
-                params = {k: v for k, v in itertools.chain(request.values.items(), request.view_args.items())}
+                params = {**request.values, **request.view_args}
 
                 log = Log(
                     event=event or f.__name__,
diff --git a/airflow/www/extensions/init_appbuilder.py b/airflow/www/extensions/init_appbuilder.py
index bbc6343fcf05a..2f8fe473aa846 100644
--- a/airflow/www/extensions/init_appbuilder.py
+++ b/airflow/www/extensions/init_appbuilder.py
@@ -20,9 +20,10 @@
 
 import logging
 from functools import reduce
+from typing import TYPE_CHECKING
 
 from flask import Blueprint, current_app, url_for
-from flask_appbuilder import BaseView, __version__
+from flask_appbuilder import __version__
 from flask_appbuilder.babel.manager import BabelManager
 from flask_appbuilder.const import (
     LOGMSG_ERR_FAB_ADD_PERMISSION_MENU,
@@ -35,14 +36,17 @@
 )
 from flask_appbuilder.filters import TemplateFilters
 from flask_appbuilder.menu import Menu
-from flask_appbuilder.security.manager import BaseSecurityManager
 from flask_appbuilder.views import IndexView, UtilView
-from sqlalchemy.orm import Session
 
 from airflow import settings
 from airflow.configuration import conf
 from airflow.www.extensions.init_auth_manager import get_auth_manager
 
+if TYPE_CHECKING:
+    from flask_appbuilder import BaseView
+    from flask_appbuilder.security.manager import BaseSecurityManager
+    from sqlalchemy.orm import Session
+
 # This product contains a modified portion of 'Flask App Builder' developed by Daniel Vaz Gaspar.
 # (https://github.com/dpgaspar/Flask-AppBuilder).
 # Copyright 2013, Daniel Vaz Gaspar
@@ -65,7 +69,7 @@ def dynamic_class_import(class_path):
         return reduce(getattr, tmp[1:], package)
     except Exception as e:
         log.exception(e)
-        log.error(LOGMSG_ERR_FAB_ADDON_IMPORT.format(class_path, e))
+        log.error(LOGMSG_ERR_FAB_ADDON_IMPORT, class_path, e)
 
 
 class AirflowAppBuilder:
@@ -348,10 +352,10 @@ def _add_addon_views(self):
                     addon_class.register_views()
                     addon_class.post_process()
                     self.addon_managers[addon] = addon_class
-                    log.info(LOGMSG_INF_FAB_ADDON_ADDED.format(str(addon)))
+                    log.info(LOGMSG_INF_FAB_ADDON_ADDED, addon)
                 except Exception as e:
                     log.exception(e)
-                    log.error(LOGMSG_ERR_FAB_ADDON_PROCESS.format(addon, e))
+                    log.error(LOGMSG_ERR_FAB_ADDON_PROCESS, addon, e)
 
     def _check_and_init(self, baseview):
         if hasattr(baseview, "datamodel"):
@@ -439,7 +443,7 @@ def add_view(
             appbuilder.add_link("google", href="www.google.com", icon = "fa-google-plus")
         """
         baseview = self._check_and_init(baseview)
-        log.info(LOGMSG_INF_FAB_ADD_VIEW.format(baseview.__class__.__name__, name))
+        log.info(LOGMSG_INF_FAB_ADD_VIEW, baseview.__class__.__name__, name)
 
         if not self._view_exists(baseview):
             baseview.appbuilder = self
@@ -540,7 +544,7 @@ def add_view_no_menu(self, baseview, endpoint=None, static_folder=None):
         :param baseview: A BaseView type class instantiated.
         """
         baseview = self._check_and_init(baseview)
-        log.info(LOGMSG_INF_FAB_ADD_VIEW.format(baseview.__class__.__name__, ""))
+        log.info(LOGMSG_INF_FAB_ADD_VIEW, baseview.__class__.__name__, "")
 
         if not self._view_exists(baseview):
             baseview.appbuilder = self
@@ -550,7 +554,7 @@ def add_view_no_menu(self, baseview, endpoint=None, static_folder=None):
                 self.register_blueprint(baseview, endpoint=endpoint, static_folder=static_folder)
                 self._add_permission(baseview)
         else:
-            log.warning(LOGMSG_WAR_FAB_VIEW_EXISTS.format(baseview.__class__.__name__))
+            log.warning(LOGMSG_WAR_FAB_VIEW_EXISTS, baseview.__class__.__name__)
         return baseview
 
     def security_cleanup(self):
@@ -616,7 +620,7 @@ def _add_permission(self, baseview, update_perms=False):
                 self.sm.add_permissions_view(baseview.base_permissions, baseview.class_permission_name)
             except Exception as e:
                 log.exception(e)
-                log.error(LOGMSG_ERR_FAB_ADD_PERMISSION_VIEW.format(str(e)))
+                log.error(LOGMSG_ERR_FAB_ADD_PERMISSION_VIEW, e)
 
     def _add_permissions_menu(self, name, update_perms=False):
         if self.update_perms or update_perms:
@@ -624,7 +628,7 @@ def _add_permissions_menu(self, name, update_perms=False):
                 self.sm.add_permissions_menu(name)
             except Exception as e:
                 log.exception(e)
-                log.error(LOGMSG_ERR_FAB_ADD_PERMISSION_MENU.format(str(e)))
+                log.error(LOGMSG_ERR_FAB_ADD_PERMISSION_MENU, e)
 
     def _add_menu_permissions(self, update_perms=False):
         if self.update_perms or update_perms:
@@ -641,10 +645,7 @@ def register_blueprint(self, baseview, endpoint=None, static_folder=None):
         )
 
     def _view_exists(self, view):
-        for baseview in self.baseviews:
-            if baseview.__class__ == view.__class__:
-                return True
-        return False
+        return any(baseview.__class__ == view.__class__ for baseview in self.baseviews)
 
     def _process_inner_views(self):
         for view in self.baseviews:
diff --git a/airflow/www/extensions/init_jinja_globals.py b/airflow/www/extensions/init_jinja_globals.py
index 13baeea7bc67e..ff5481dd468f6 100644
--- a/airflow/www/extensions/init_jinja_globals.py
+++ b/airflow/www/extensions/init_jinja_globals.py
@@ -74,7 +74,7 @@ def prepare_jinja_globals():
         }
 
         backends = conf.get("api", "auth_backends")
-        if len(backends) > 0 and backends[0] != "airflow.api.auth.backend.deny_all":
+        if backends and backends[0] != "airflow.api.auth.backend.deny_all":
             extra_globals["rest_api_enabled"] = True
 
         if "analytics_tool" in conf.getsection("webserver"):
diff --git a/airflow/www/extensions/init_manifest_files.py b/airflow/www/extensions/init_manifest_files.py
index 2ce60194a60a9..4d491786a81fc 100644
--- a/airflow/www/extensions/init_manifest_files.py
+++ b/airflow/www/extensions/init_manifest_files.py
@@ -56,4 +56,4 @@ def get_url_for_asset():
         static/dist folder. This template tag reads the asset name in
         ``manifest.json`` and returns the appropriate file.
         """
-        return dict(url_for_asset=get_asset_url)
+        return {"url_for_asset": get_asset_url}
diff --git a/airflow/www/extensions/init_security.py b/airflow/www/extensions/init_security.py
index 41a8dc6afc17f..390c7bc2baf75 100644
--- a/airflow/www/extensions/init_security.py
+++ b/airflow/www/extensions/init_security.py
@@ -56,14 +56,14 @@ def init_api_experimental_auth(app):
         pass
 
     app.api_auth = []
-    for backend in auth_backends.split(","):
-        try:
+    try:
+        for backend in auth_backends.split(","):
             auth = import_module(backend.strip())
             auth.init_app(app)
             app.api_auth.append(auth)
-        except ImportError as err:
-            log.critical("Cannot import %s for API authentication due to: %s", backend, err)
-            raise AirflowException(err)
+    except ImportError as err:
+        log.critical("Cannot import %s for API authentication due to: %s", backend, err)
+        raise AirflowException(err)
 
 
 def init_check_user_active(app):
diff --git a/airflow/www/extensions/init_views.py b/airflow/www/extensions/init_views.py
index 492f325bb9c99..bb3c04608132a 100644
--- a/airflow/www/extensions/init_views.py
+++ b/airflow/www/extensions/init_views.py
@@ -17,14 +17,16 @@
 from __future__ import annotations
 
 import logging
+import os
 import warnings
 from functools import cached_property
-from os import path
+from pathlib import Path
+from typing import TYPE_CHECKING
 
 from connexion import FlaskApi, ProblemException, Resolver
 from connexion.decorators.validation import RequestBodyValidator
 from connexion.exceptions import BadRequestProblem
-from flask import Flask, request
+from flask import request
 
 from airflow.api_connexion.exceptions import common_error_handler
 from airflow.configuration import conf
@@ -32,10 +34,13 @@
 from airflow.security import permissions
 from airflow.utils.yaml import safe_load
 
+if TYPE_CHECKING:
+    from flask import Flask
+
 log = logging.getLogger(__name__)
 
 # airflow/www/extensions/init_views.py => airflow/
-ROOT_APP_DIR = path.abspath(path.join(path.dirname(__file__), path.pardir, path.pardir))
+ROOT_APP_DIR = Path(__file__).parents[2].resolve()
 
 
 def init_flash_views(app):
@@ -249,7 +254,7 @@ def _handle_method_not_allowed(ex):
         else:
             return views.method_not_allowed(ex)
 
-    with open(path.join(ROOT_APP_DIR, "api_connexion", "openapi", "v1.yaml")) as f:
+    with ROOT_APP_DIR.joinpath("api_connexion", "openapi", "v1.yaml").open() as f:
         specification = safe_load(f)
     api_bp = FlaskApi(
         specification=specification,
@@ -257,7 +262,7 @@ def _handle_method_not_allowed(ex):
         base_path=base_path,
         options={
             "swagger_ui": conf.getboolean("webserver", "enable_swagger_ui", fallback=True),
-            "swagger_path": path.join(ROOT_APP_DIR, "www", "static", "dist", "swagger-ui"),
+            "swagger_path": os.fspath(ROOT_APP_DIR.joinpath("www", "static", "dist", "swagger-ui")),
         },
         strict_validation=True,
         validate_responses=True,
@@ -275,7 +280,7 @@ def init_api_internal(app: Flask, standalone_api: bool = False) -> None:
     if not standalone_api and not conf.getboolean("webserver", "run_internal_api", fallback=False):
         return
 
-    with open(path.join(ROOT_APP_DIR, "api_internal", "openapi", "internal_api_v1.yaml")) as f:
+    with ROOT_APP_DIR.joinpath("api_internal", "openapi", "internal_api_v1.yaml").open() as f:
         specification = safe_load(f)
     api_bp = FlaskApi(
         specification=specification,
diff --git a/airflow/www/extensions/init_wsgi_middlewares.py b/airflow/www/extensions/init_wsgi_middlewares.py
index 37d4a074b4d18..27368e71eed9b 100644
--- a/airflow/www/extensions/init_wsgi_middlewares.py
+++ b/airflow/www/extensions/init_wsgi_middlewares.py
@@ -20,7 +20,6 @@
 from typing import TYPE_CHECKING, Iterable
 from urllib.parse import urlsplit
 
-from flask import Flask
 from werkzeug.middleware.dispatcher import DispatcherMiddleware
 from werkzeug.middleware.proxy_fix import ProxyFix
 
@@ -29,6 +28,7 @@
 
 if TYPE_CHECKING:
     from _typeshed.wsgi import StartResponse, WSGIEnvironment
+    from flask import Flask
 
 
 def _root_app(env: WSGIEnvironment, resp: StartResponse) -> Iterable[bytes]:
diff --git a/airflow/www/fab_security/manager.py b/airflow/www/fab_security/manager.py
index b3aee13ea490b..7b5eb6fced3d8 100644
--- a/airflow/www/fab_security/manager.py
+++ b/airflow/www/fab_security/manager.py
@@ -22,12 +22,11 @@
 import datetime
 import json
 import logging
-from typing import Any
+from typing import TYPE_CHECKING, Any
 from uuid import uuid4
 
 import re2
-from flask import Flask, g, session, url_for
-from flask_appbuilder import AppBuilder
+from flask import g, session, url_for
 from flask_appbuilder.const import (
     AUTH_DB,
     AUTH_LDAP,
@@ -69,10 +68,15 @@
 from flask_limiter.util import get_remote_address
 from werkzeug.security import check_password_hash
 
-from airflow.auth.managers.fab.models import Action, Permission, RegisterUser, Resource, Role, User
 from airflow.configuration import conf
 from airflow.www.extensions.init_auth_manager import get_auth_manager
 
+if TYPE_CHECKING:
+    from flask import Flask
+    from flask_appbuilder import AppBuilder
+
+    from airflow.auth.managers.fab.models import Action, Permission, RegisterUser, Resource, Role, User
+
 # This product contains a modified portion of 'Flask App Builder' developed by Daniel Vaz Gaspar.
 # (https://github.com/dpgaspar/Flask-AppBuilder).
 # Copyright 2013, Daniel Vaz Gaspar
@@ -486,7 +490,7 @@ def my_oauth_user_info(sm, provider, response=None):
         def wraps(provider, response=None):
             ret = f(self, provider, response=response)
             # Checks if decorator is well behaved and returns a dict as supposed.
-            if not type(ret) == dict:
+            if not isinstance(ret, dict):
                 log.error("OAuth user info decorated function did not returned a dict, but: %s", type(ret))
                 return {}
             return ret
@@ -720,7 +724,7 @@ def auth_user_db(self, username, password):
                 "c0976a03d2f18f680bfff877c9a965db9eedc51bc0be87c",
                 "password",
             )
-            log.info(LOGMSG_WAR_SEC_LOGIN_FAILED.format(username))
+            log.info(LOGMSG_WAR_SEC_LOGIN_FAILED, username)
             return None
         elif check_password_hash(user.password, password):
             self._rotate_session_id()
@@ -728,7 +732,7 @@ def auth_user_db(self, username, password):
             return user
         else:
             self.update_user_auth_stat(user, False)
-            log.info(LOGMSG_WAR_SEC_LOGIN_FAILED.format(username))
+            log.info(LOGMSG_WAR_SEC_LOGIN_FAILED, username)
             return None
 
     def _search_ldap(self, ldap, con, username):
@@ -755,7 +759,7 @@ def _search_ldap(self, ldap, con, username):
             self.auth_ldap_lastname_field,
             self.auth_ldap_email_field,
         ]
-        if len(self.auth_roles_mapping) > 0:
+        if self.auth_roles_mapping:
             request_fields.append(self.auth_ldap_group_field)
 
         # perform the LDAP search
@@ -795,7 +799,7 @@ def _ldap_calculate_user_roles(self, user_attributes: dict[str, list[bytes]]) ->
         user_role_objects = set()
 
         # apply AUTH_ROLES_MAPPING
-        if len(self.auth_roles_mapping) > 0:
+        if self.auth_roles_mapping:
             user_role_keys = self.ldap_extract_list(user_attributes, self.auth_ldap_group_field)
             user_role_objects.update(self.get_roles_from_keys(user_role_keys))
 
@@ -908,7 +912,7 @@ def auth_user_ldap(self, username, password):
                 try:
                     con.start_tls_s()
                 except Exception:
-                    log.error(LOGMSG_ERR_SEC_AUTH_LDAP_TLS.format(self.auth_ldap_server))
+                    log.error(LOGMSG_ERR_SEC_AUTH_LDAP_TLS, self.auth_ldap_server)
                     return None
 
             # Define variables, so we can check if they are set in later steps
@@ -936,7 +940,7 @@ def auth_user_ldap(self, username, password):
 
                 # If search failed, go away
                 if user_dn is None:
-                    log.info(LOGMSG_WAR_SEC_NOLDAP_OBJ.format(username))
+                    log.info(LOGMSG_WAR_SEC_NOLDAP_OBJ, username)
                     return None
 
                 # Bind with user_dn/password (validates credentials)
@@ -945,7 +949,7 @@ def auth_user_ldap(self, username, password):
                         self.update_user_auth_stat(user, False)
 
                     # Invalid credentials, go away
-                    log.info(LOGMSG_WAR_SEC_LOGIN_FAILED.format(username))
+                    log.info(LOGMSG_WAR_SEC_LOGIN_FAILED, username)
                     return None
 
             # Flow 2 - (Direct Search Bind):
@@ -976,7 +980,7 @@ def auth_user_ldap(self, username, password):
                         self.update_user_auth_stat(user, False)
 
                     # Invalid credentials, go away
-                    log.info(LOGMSG_WAR_SEC_LOGIN_FAILED.format(bind_username))
+                    log.info(LOGMSG_WAR_SEC_LOGIN_FAILED, bind_username)
                     return None
 
                 # Search for `username` (if AUTH_LDAP_SEARCH is set)
@@ -990,7 +994,7 @@ def auth_user_ldap(self, username, password):
 
                     # If search failed, go away
                     if user_dn is None:
-                        log.info(LOGMSG_WAR_SEC_NOLDAP_OBJ.format(username))
+                        log.info(LOGMSG_WAR_SEC_NOLDAP_OBJ, username)
                         return None
 
             # Sync the user's roles
@@ -1015,7 +1019,7 @@ def auth_user_ldap(self, username, password):
 
                 # If user registration failed, go away
                 if not user:
-                    log.info(LOGMSG_ERR_SEC_ADD_REGISTER_USER.format(username))
+                    log.info(LOGMSG_ERR_SEC_ADD_REGISTER_USER, username)
                     return None
 
             # LOGIN SUCCESS (only if user is now registered)
@@ -1031,7 +1035,7 @@ def auth_user_ldap(self, username, password):
             if isinstance(e, dict):
                 msg = getattr(e, "message", None)
             if (msg is not None) and ("desc" in msg):
-                log.error(LOGMSG_ERR_SEC_AUTH_LDAP.format(e.message["desc"]))
+                log.error(LOGMSG_ERR_SEC_AUTH_LDAP, e.message["desc"])
                 return None
             else:
                 log.error(e)
@@ -1045,7 +1049,7 @@ def auth_user_oid(self, email):
         """
         user = self.find_user(email=email)
         if user is None or (not user.is_active):
-            log.info(LOGMSG_WAR_SEC_LOGIN_FAILED.format(email))
+            log.info(LOGMSG_WAR_SEC_LOGIN_FAILED, email)
             return None
         else:
             self._rotate_session_id()
@@ -1075,7 +1079,7 @@ def auth_user_remote_user(self, username):
         # If user does not exist on the DB and not auto user registration,
         # or user is inactive, go away.
         elif user is None or (not user.is_active):
-            log.info(LOGMSG_WAR_SEC_LOGIN_FAILED.format(username))
+            log.info(LOGMSG_WAR_SEC_LOGIN_FAILED, username)
             return None
 
         self._rotate_session_id()
@@ -1086,7 +1090,7 @@ def _oauth_calculate_user_roles(self, userinfo) -> list[str]:
         user_role_objects = set()
 
         # apply AUTH_ROLES_MAPPING
-        if len(self.auth_roles_mapping) > 0:
+        if self.auth_roles_mapping:
             user_role_keys = userinfo.get("role_keys", [])
             user_role_objects.update(self.get_roles_from_keys(user_role_keys))
 
diff --git a/airflow/www/fab_security/sqla/manager.py b/airflow/www/fab_security/sqla/manager.py
index 83e2119492e65..59291d513fd9f 100644
--- a/airflow/www/fab_security/sqla/manager.py
+++ b/airflow/www/fab_security/sqla/manager.py
@@ -537,10 +537,7 @@ def delete_permission(self, action_name: str, resource_name: str) -> None:
             self.get_session.rollback()
 
     def perms_include_action(self, perms, action_name):
-        for perm in perms:
-            if perm.action and perm.action.name == action_name:
-                return True
-        return False
+        return any(perm.action and perm.action.name == action_name for perm in perms)
 
     def add_permission_to_role(self, role: Role, permission: Permission | None) -> None:
         """
diff --git a/airflow/www/jest-setup.js b/airflow/www/jest-setup.js
index b2e403c25ef9f..48b4e190699ca 100644
--- a/airflow/www/jest-setup.js
+++ b/airflow/www/jest-setup.js
@@ -49,7 +49,6 @@ global.stateColors = {
   restarting: "violet",
   running: "lime",
   scheduled: "tan",
-  shutdown: "blue",
   skipped: "hotpink",
   success: "green",
   up_for_reschedule: "turquoise",
@@ -60,3 +59,5 @@ global.stateColors = {
 global.defaultDagRunDisplayNumber = 245;
 
 global.moment = moment;
+
+global.standaloneDagProcessor = true;
diff --git a/airflow/www/security.py b/airflow/www/security.py
index d415f6d4855f4..28d938d052dc0 100644
--- a/airflow/www/security.py
+++ b/airflow/www/security.py
@@ -21,7 +21,7 @@
 
 from flask import g
 from sqlalchemy import or_
-from sqlalchemy.orm import Session, joinedload
+from sqlalchemy.orm import joinedload
 
 from airflow.auth.managers.fab.models import Permission, Resource, Role, User
 from airflow.auth.managers.fab.views.user_details import CustomUserDBModelView
@@ -57,11 +57,21 @@
 }
 
 if TYPE_CHECKING:
+    from sqlalchemy.orm import Session
+
     SecurityManagerOverride: type = object
 else:
     # Fetch the security manager override from the auth manager
     SecurityManagerOverride = get_auth_manager().get_security_manager_override_class()
 
+EXISTING_ROLES = {
+    "Admin",
+    "Viewer",
+    "User",
+    "Op",
+    "Public",
+}
+
 
 class AirflowSecurityManager(SecurityManagerOverride, SecurityManager, LoggingMixin):
     """Custom security manager, which introduces a permission model adapted to Airflow."""
@@ -624,7 +634,7 @@ def create_dag_specific_permissions(self) -> None:
                 if (action_name, dag_resource_name) not in perms:
                     self._merge_perm(action_name, dag_resource_name)
 
-            if dag.access_control:
+            if dag.access_control is not None:
                 self.sync_perm_for_dag(dag_resource_name, dag.access_control)
 
     def update_admin_permission(self) -> None:
@@ -702,10 +712,10 @@ def sync_perm_for_dag(
             self.create_permission(dag_action_name, dag_resource_name)
 
         if access_control is not None:
-            self.log.info("Syncing DAG-level permissions for DAG '%s'", dag_resource_name)
+            self.log.debug("Syncing DAG-level permissions for DAG '%s'", dag_resource_name)
             self._sync_dag_view_permissions(dag_resource_name, access_control)
         else:
-            self.log.info(
+            self.log.debug(
                 "Not syncing DAG-level permissions for DAG '%s' as access control is unset.",
                 dag_resource_name,
             )
diff --git a/airflow/www/session.py b/airflow/www/session.py
index 4e23d212fe2ea..763b909ae0d94 100644
--- a/airflow/www/session.py
+++ b/airflow/www/session.py
@@ -21,7 +21,7 @@
 from flask_session.sessions import SqlAlchemySessionInterface
 
 
-class SesssionExemptMixin:
+class SessionExemptMixin:
     """Exempt certain blueprints/paths from autogenerated sessions."""
 
     def save_session(self, *args, **kwargs):
@@ -33,9 +33,9 @@ def save_session(self, *args, **kwargs):
         return super().save_session(*args, **kwargs)
 
 
-class AirflowDatabaseSessionInterface(SesssionExemptMixin, SqlAlchemySessionInterface):
+class AirflowDatabaseSessionInterface(SessionExemptMixin, SqlAlchemySessionInterface):
     """Session interface that exempts some routes and stores session data in the database."""
 
 
-class AirflowSecureCookieSessionInterface(SesssionExemptMixin, SecureCookieSessionInterface):
+class AirflowSecureCookieSessionInterface(SessionExemptMixin, SecureCookieSessionInterface):
     """Session interface that exempts some routes and stores session data in a signed cookie."""
diff --git a/airflow/www/static/css/main.css b/airflow/www/static/css/main.css
index c625061c4863e..54395603f501b 100644
--- a/airflow/www/static/css/main.css
+++ b/airflow/www/static/css/main.css
@@ -102,9 +102,11 @@ div.container {
   }
 }
 
-.navbar-brand:hover .brand-logo-pinwheel {
-  transform-origin: 17.66px 17.66px;
-  animation: pinSpin 1.5s linear infinite;
+@media (prefers-reduced-motion: no-preference) {
+  .navbar-brand:hover .brand-logo-pinwheel {
+    transform-origin: 17.66px 17.66px;
+    animation: pinSpin 1.5s linear;
+  }
 }
 
 .navbar-user-icon {
diff --git a/airflow/www/static/js/cluster-activity/index.test.tsx b/airflow/www/static/js/cluster-activity/index.test.tsx
index c35a8bb41b602..5689c69293bdd 100644
--- a/airflow/www/static/js/cluster-activity/index.test.tsx
+++ b/airflow/www/static/js/cluster-activity/index.test.tsx
@@ -50,7 +50,6 @@ const mockHistoricalMetricsData = {
     restarting: 0,
     running: 0,
     scheduled: 0,
-    shutdown: 0,
     skipped: 0,
     success: 1634,
     up_for_reschedule: 0,
diff --git a/airflow/www/static/js/cluster-activity/live-metrics/Health.tsx b/airflow/www/static/js/cluster-activity/live-metrics/Health.tsx
index 438ce24c21008..b311f1a57afa6 100644
--- a/airflow/www/static/js/cluster-activity/live-metrics/Health.tsx
+++ b/airflow/www/static/js/cluster-activity/live-metrics/Health.tsx
@@ -81,7 +81,6 @@ const HealthSection = ({
 
 const Health = (props: CenterProps) => {
   const { data, isError } = useHealth();
-
   return (
     <Center {...props}>
       <LoadingWrapper hasData={!!data} isError={isError}>
@@ -105,13 +104,17 @@ const Health = (props: CenterProps) => {
               title="Triggerer"
               status={data?.triggerer?.status}
               latestHeartbeat={data?.triggerer?.latestTriggererHeartbeat}
-              mb={3}
-            />
-            <HealthSection
-              title="Dag Processor"
-              status={data?.dagProcessor?.status}
-              latestHeartbeat={data?.dagProcessor?.latestDagProcessorHeartbeat}
             />
+            {!!standaloneDagProcessor && (
+              <HealthSection
+                title="Dag Processor"
+                status={data?.dagProcessor?.status}
+                latestHeartbeat={
+                  data?.dagProcessor?.latestDagProcessorHeartbeat
+                }
+                mt={3}
+              />
+            )}
           </CardBody>
         </Card>
       </LoadingWrapper>
diff --git a/airflow/www/static/js/dag/Main.tsx b/airflow/www/static/js/dag/Main.tsx
index 99620a731be68..86955792ec531 100644
--- a/airflow/www/static/js/dag/Main.tsx
+++ b/airflow/www/static/js/dag/Main.tsx
@@ -28,7 +28,8 @@ import { hoverDelay } from "src/utils";
 
 import ShortcutCheatSheet from "src/components/ShortcutCheatSheet";
 import { useKeysPress } from "src/utils/useKeysPress";
-import Details from "./details";
+import { useSearchParams } from "react-router-dom";
+import Details, { TAB_PARAM } from "./details";
 import Grid from "./grid";
 import FilterBar from "./nav/FilterBar";
 import LegendRow from "./nav/LegendRow";
@@ -66,11 +67,14 @@ const Main = () => {
     isLoading,
   } = useGridData();
   const [isGridCollapsed, setIsGridCollapsed] = useState(false);
+  const [searchParams] = useSearchParams();
   const resizeRef = useRef<HTMLDivElement>(null);
   const gridRef = useRef<HTMLDivElement>(null);
   const gridScrollRef = useRef<HTMLDivElement>(null);
   const ganttScrollRef = useRef<HTMLDivElement>(null);
-  const isPanelOpen = localStorage.getItem(detailsPanelKey) !== "true";
+  const isPanelOpen =
+    localStorage.getItem(detailsPanelKey) !== "true" ||
+    !!searchParams.get(TAB_PARAM);
   const { isOpen, onToggle } = useDisclosure({ defaultIsOpen: isPanelOpen });
   const [hoveredTaskState, setHoveredTaskState] = useState<
     string | null | undefined
diff --git a/airflow/www/static/js/dag/details/gantt/Row.tsx b/airflow/www/static/js/dag/details/gantt/Row.tsx
index 304fb83e22559..bf1ce7ac60a25 100644
--- a/airflow/www/static/js/dag/details/gantt/Row.tsx
+++ b/airflow/www/static/js/dag/details/gantt/Row.tsx
@@ -53,7 +53,7 @@ const Row = ({
   const instance = task.instances.find((ti) => ti.runId === runId);
   const isSelected = taskId === instance?.taskId;
   const hasQueuedDttm = !!instance?.queuedDttm;
-  const isOpen = openGroupIds.includes(task.label || "");
+  const isOpen = openGroupIds.includes(task.id || "");
 
   // Calculate durations in ms
   const taskDuration = getDuration(instance?.startDate, instance?.endDate);
diff --git a/airflow/www/static/js/dag/details/graph/utils.ts b/airflow/www/static/js/dag/details/graph/utils.ts
index 3d85053619258..ac940d46c7847 100644
--- a/airflow/www/static/js/dag/details/graph/utils.ts
+++ b/airflow/www/static/js/dag/details/graph/utils.ts
@@ -79,9 +79,9 @@ export const flattenNodes = ({
         onToggleCollapse: () => {
           let newGroupIds = [];
           if (!node.value.isOpen) {
-            newGroupIds = [...openGroupIds, node.value.label];
+            newGroupIds = [...openGroupIds, node.id];
           } else {
-            newGroupIds = openGroupIds.filter((g) => g !== node.value.label);
+            newGroupIds = openGroupIds.filter((g) => g !== node.id);
           }
           onToggleGroups(newGroupIds);
         },
diff --git a/airflow/www/static/js/dag/details/index.tsx b/airflow/www/static/js/dag/details/index.tsx
index 00496ccecd27c..b476d61950ee3 100644
--- a/airflow/www/static/js/dag/details/index.tsx
+++ b/airflow/www/static/js/dag/details/index.tsx
@@ -109,7 +109,7 @@ const indexToTab = (
   }
 };
 
-const TAB_PARAM = "tab";
+export const TAB_PARAM = "tab";
 
 const Details = ({
   openGroupIds,
diff --git a/airflow/www/static/js/dag/grid/TaskName.test.tsx b/airflow/www/static/js/dag/grid/TaskName.test.tsx
index f7a4c7267d1f2..8002ab78ca038 100644
--- a/airflow/www/static/js/dag/grid/TaskName.test.tsx
+++ b/airflow/www/static/js/dag/grid/TaskName.test.tsx
@@ -29,7 +29,7 @@ import TaskName from "./TaskName";
 describe("Test TaskName", () => {
   test("Displays a normal task name", () => {
     const { getByText } = render(
-      <TaskName label="test" onToggle={() => {}} />,
+      <TaskName label="test" id="test" onToggle={() => {}} />,
       { wrapper: ChakraWrapper }
     );
 
@@ -38,7 +38,13 @@ describe("Test TaskName", () => {
 
   test("Displays a mapped task name", () => {
     const { getByText } = render(
-      <TaskName level={0} label="test" isMapped onToggle={() => {}} />,
+      <TaskName
+        level={0}
+        label="test"
+        id="test"
+        isMapped
+        onToggle={() => {}}
+      />,
       { wrapper: ChakraWrapper }
     );
 
@@ -47,7 +53,7 @@ describe("Test TaskName", () => {
 
   test("Displays a group task name", () => {
     const { getByText, getByTestId } = render(
-      <TaskName level={0} label="test" isGroup onToggle={() => {}} />,
+      <TaskName level={0} label="test" id="test" isGroup onToggle={() => {}} />,
       { wrapper: ChakraWrapper }
     );
 
diff --git a/airflow/www/static/js/dag/grid/TaskName.tsx b/airflow/www/static/js/dag/grid/TaskName.tsx
index 030767212fd4d..ce2de10bf69b8 100644
--- a/airflow/www/static/js/dag/grid/TaskName.tsx
+++ b/airflow/www/static/js/dag/grid/TaskName.tsx
@@ -28,6 +28,7 @@ interface Props {
   isOpen?: boolean;
   level?: number;
   label: string;
+  id: string;
 }
 
 const TaskName = ({
@@ -37,11 +38,13 @@ const TaskName = ({
   isOpen = false,
   level = 0,
   label,
+  id,
 }: Props) => (
   <Flex
     as={isGroup ? "button" : "div"}
     onClick={onToggle}
     aria-label={label}
+    data-testid={id}
     title={label}
     mr={4}
     width="100%"
diff --git a/airflow/www/static/js/dag/grid/ToggleGroups.tsx b/airflow/www/static/js/dag/grid/ToggleGroups.tsx
index 1473dd13aa830..730e2e61a45a6 100644
--- a/airflow/www/static/js/dag/grid/ToggleGroups.tsx
+++ b/airflow/www/static/js/dag/grid/ToggleGroups.tsx
@@ -28,7 +28,7 @@ const getGroupIds = (groups: Task[]) => {
   const checkTasks = (tasks: Task[]) =>
     tasks.forEach((task) => {
       if (task.children) {
-        groupIds.push(task.label!);
+        groupIds.push(task.id!);
         checkTasks(task.children);
       }
     });
diff --git a/airflow/www/static/js/dag/grid/dagRuns/Bar.tsx b/airflow/www/static/js/dag/grid/dagRuns/Bar.tsx
index 95fc1cd11d8e2..8b71126b53cab 100644
--- a/airflow/www/static/js/dag/grid/dagRuns/Bar.tsx
+++ b/airflow/www/static/js/dag/grid/dagRuns/Bar.tsx
@@ -26,9 +26,14 @@ import { Flex, Box, Tooltip, Text, VStack, useTheme } from "@chakra-ui/react";
 import { useContainerRef } from "src/context/containerRef";
 import Time from "src/components/Time";
 import type { SelectionProps } from "src/dag/useSelection";
-import { hoverDelay, getStatusBackgroundColor } from "src/utils";
+import {
+  hoverDelay,
+  getStatusBackgroundColor,
+  getDagRunLabel,
+} from "src/utils";
 import RunTypeIcon from "src/components/RunTypeIcon";
 
+import { useGridData } from "src/api";
 import DagRunTooltip from "./Tooltip";
 import type { RunWithDuration } from ".";
 
@@ -51,7 +56,7 @@ const DagRunBar = ({
   isSelected,
   onSelect,
 }: Props) => {
-  const { runType, runId, duration, state, executionDate } = run;
+  const { runType, runId, duration, state } = run;
   const containerRef = useContainerRef();
   const { colors } = useTheme();
   const hoverBlue = `${colors.blue[100]}50`;
@@ -86,6 +91,10 @@ const DagRunBar = ({
     inverseIndex === 4 || (inverseIndex > 4 && (inverseIndex - 4) % 10 === 0);
 
   const color = stateColors[state];
+  const {
+    data: { ordering },
+  } = useGridData();
+  const dagRun = run;
 
   return (
     <Box
@@ -159,7 +168,10 @@ const DagRunBar = ({
             transform="rotate(-30deg) translateX(28px)"
             mt="-23px !important"
           >
-            <Time dateTime={executionDate} format="MMM DD, HH:mm" />
+            <Time
+              dateTime={getDagRunLabel({ dagRun, ordering })}
+              format="MMM DD, HH:mm"
+            />
           </Text>
           <Box borderLeftWidth={1} opacity={0.7} height="100px" zIndex={0} />
         </VStack>
diff --git a/airflow/www/static/js/dag/grid/index.test.tsx b/airflow/www/static/js/dag/grid/index.test.tsx
index 66e1cafaeb401..5cc6e7178885d 100644
--- a/airflow/www/static/js/dag/grid/index.test.tsx
+++ b/airflow/www/static/js/dag/grid/index.test.tsx
@@ -86,6 +86,55 @@ const mockGridData = {
           },
         ],
       },
+      {
+        id: "group_2",
+        label: "group_2",
+        instances: [
+          {
+            endDate: "2021-10-26T15:42:03.391939+00:00",
+            runId: "run1",
+            startDate: "2021-10-26T15:42:03.391917+00:00",
+            state: "success",
+            taskId: "group_1",
+            tryNumber: 1,
+          },
+        ],
+        children: [
+          {
+            id: "group_2.task_1",
+            operator: "DummyOperator",
+            label: "task_1",
+            instances: [
+              {
+                endDate: "2021-10-26T15:42:03.391939+00:00",
+                runId: "run1",
+                startDate: "2021-10-26T15:42:03.391917+00:00",
+                state: "success",
+                taskId: "group_1.task_1",
+                tryNumber: 1,
+              },
+            ],
+            children: [
+              {
+                id: "group_2.task_1.sub_task_1",
+                label: "sub_task_1",
+                extraLinks: [],
+                operator: "DummyOperator",
+                instances: [
+                  {
+                    endDate: "2021-10-26T15:42:03.391939+00:00",
+                    runId: "run1",
+                    startDate: "2021-10-26T15:42:03.391917+00:00",
+                    state: "success",
+                    taskId: "group_2.task_1.sub_task_1",
+                    tryNumber: 1,
+                  },
+                ],
+              },
+            ],
+          },
+        ],
+      },
     ],
     instances: [],
   },
@@ -144,16 +193,18 @@ describe("Test ToggleGroups", () => {
   });
 
   test("Group defaults to closed", () => {
-    const { getByTestId, getByText, getAllByTestId } = render(
+    const { queryAllByTestId, getByText, getAllByTestId } = render(
       <Grid openGroupIds={[]} onToggleGroups={() => {}} />,
       { wrapper: Wrapper }
     );
 
-    const groupName = getByText("group_1");
+    const groupName1 = getByText("group_1");
+    const groupName2 = getByText("group_2");
 
-    expect(getAllByTestId("task-instance")).toHaveLength(1);
-    expect(groupName).toBeInTheDocument();
-    expect(getByTestId("open-group")).toBeInTheDocument();
+    expect(getAllByTestId("task-instance")).toHaveLength(2);
+    expect(groupName1).toBeInTheDocument();
+    expect(groupName2).toBeInTheDocument();
+    expect(queryAllByTestId("open-group")).toHaveLength(2);
   });
 
   test("Buttons are disabled if all groups are expanded or collapsed", () => {
@@ -168,12 +219,12 @@ describe("Test ToggleGroups", () => {
     expect(collapseButton).toBeDisabled();
 
     const taskElements = queryAllByTestId("task-instance");
-    expect(taskElements).toHaveLength(1);
+    expect(taskElements).toHaveLength(2);
 
     fireEvent.click(expandButton);
 
     const newTaskElements = queryAllByTestId("task-instance");
-    expect(newTaskElements).toHaveLength(3);
+    expect(newTaskElements).toHaveLength(6);
 
     expect(collapseButton).toBeEnabled();
     expect(expandButton).toBeDisabled();
@@ -188,41 +239,71 @@ describe("Test ToggleGroups", () => {
     const expandButton = getByTitle(EXPAND);
     const collapseButton = getByTitle(COLLAPSE);
 
-    const groupName = getByText("group_1");
+    const groupName1 = getByText("group_1");
+    const groupName2 = getByText("group_2");
 
-    expect(queryAllByTestId("task-instance")).toHaveLength(3);
-    expect(groupName).toBeInTheDocument();
+    expect(queryAllByTestId("task-instance")).toHaveLength(6);
+    expect(groupName1).toBeInTheDocument();
+    expect(groupName2).toBeInTheDocument();
 
-    expect(queryAllByTestId("close-group")).toHaveLength(2);
+    expect(queryAllByTestId("close-group")).toHaveLength(4);
     expect(queryAllByTestId("open-group")).toHaveLength(0);
 
     fireEvent.click(collapseButton);
 
     await waitFor(() =>
-      expect(queryAllByTestId("task-instance")).toHaveLength(1)
+      expect(queryAllByTestId("task-instance")).toHaveLength(2)
     );
     expect(queryAllByTestId("close-group")).toHaveLength(0);
-    // Since the groups are nested, only the parent row is rendered
-    expect(queryAllByTestId("open-group")).toHaveLength(1);
+    // Since the groups are nested, only the parent rows is rendered
+    expect(queryAllByTestId("open-group")).toHaveLength(2);
+
+    fireEvent.click(expandButton);
+
+    await waitFor(() =>
+      expect(queryAllByTestId("task-instance")).toHaveLength(6)
+    );
+    expect(queryAllByTestId("close-group")).toHaveLength(4);
+    expect(queryAllByTestId("open-group")).toHaveLength(0);
+  });
+
+  test("Toggling a group does not affect groups with the same label", async () => {
+    const { getByTitle, getByTestId, queryAllByTestId } = render(
+      <GridWithGroups />,
+      { wrapper: Wrapper }
+    );
+
+    const expandButton = getByTitle(EXPAND);
 
     fireEvent.click(expandButton);
 
     await waitFor(() =>
-      expect(queryAllByTestId("task-instance")).toHaveLength(3)
+      expect(queryAllByTestId("task-instance")).toHaveLength(6)
     );
-    expect(queryAllByTestId("close-group")).toHaveLength(2);
+    expect(queryAllByTestId("close-group")).toHaveLength(4);
     expect(queryAllByTestId("open-group")).toHaveLength(0);
+
+    const group2Task1 = getByTestId("group_2.task_1");
+
+    fireEvent.click(group2Task1);
+
+    // We only expect group_2.task_1 to be affected, not group_1.task_1
+    await waitFor(() =>
+      expect(queryAllByTestId("task-instance")).toHaveLength(5)
+    );
+    expect(queryAllByTestId("close-group")).toHaveLength(3);
+    expect(queryAllByTestId("open-group")).toHaveLength(1);
   });
 
   test("Hovered effect on task state", async () => {
-    const openGroupIds = ["group_1", "task_1"];
+    const openGroupIds = ["group_1", "group_1.task_1"];
     const { rerender, queryAllByTestId } = render(
       <Grid openGroupIds={openGroupIds} onToggleGroups={() => {}} />,
       { wrapper: Wrapper }
     );
 
     const taskElements = queryAllByTestId("task-instance");
-    expect(taskElements).toHaveLength(3);
+    expect(taskElements).toHaveLength(4);
 
     taskElements.forEach((taskElement) => {
       expect(taskElement).toHaveStyle("opacity: 1");
diff --git a/airflow/www/static/js/dag/grid/index.tsx b/airflow/www/static/js/dag/grid/index.tsx
index a67305994a266..638f4268c04bb 100644
--- a/airflow/www/static/js/dag/grid/index.tsx
+++ b/airflow/www/static/js/dag/grid/index.tsx
@@ -153,7 +153,7 @@ const Grid = ({
           zIndex={2}
           top={-8}
           onClick={onPanelToggle}
-          title={`${isPanelOpen ? "Hide " : "Show "} Details Panel`}
+          title={`${isPanelOpen ? "Hide" : "Show"} Details Panel`}
           aria-label={isPanelOpen ? "Show Details" : "Hide Details"}
           icon={<MdDoubleArrow />}
           transform={isPanelOpen ? undefined : "rotateZ(180deg)"}
diff --git a/airflow/www/static/js/dag/grid/renderTaskRows.tsx b/airflow/www/static/js/dag/grid/renderTaskRows.tsx
index c661eba6775ce..181186b172db9 100644
--- a/airflow/www/static/js/dag/grid/renderTaskRows.tsx
+++ b/airflow/www/static/js/dag/grid/renderTaskRows.tsx
@@ -122,20 +122,20 @@ const Row = (props: RowProps) => {
   const isGroup = !!task.children;
   const isSelected = selected.taskId === task.id;
 
-  const isOpen = openGroupIds.some((g) => g === task.label);
+  const isOpen = openGroupIds.some((g) => g === task.id);
 
   // assure the function is the same across renders
   const memoizedToggle = useCallback(() => {
-    if (isGroup && task.label) {
+    if (isGroup && task.id) {
       let newGroupIds = [];
       if (!isOpen) {
-        newGroupIds = [...openGroupIds, task.label];
+        newGroupIds = [...openGroupIds, task.id];
       } else {
-        newGroupIds = openGroupIds.filter((g) => g !== task.label);
+        newGroupIds = openGroupIds.filter((g) => g !== task.id);
       }
       onToggleGroups(newGroupIds);
     }
-  }, [isGroup, isOpen, task.label, openGroupIds, onToggleGroups]);
+  }, [isGroup, isOpen, task.id, openGroupIds, onToggleGroups]);
 
   // check if the group's parents are all open, if not, return null
   if (level !== openParentCount) return null;
@@ -168,6 +168,7 @@ const Row = (props: RowProps) => {
               isGroup={isGroup}
               isMapped={task.isMapped && !isParentMapped}
               label={task.label || task.id || ""}
+              id={task.id || ""}
               isOpen={isOpen}
               level={level}
             />
diff --git a/airflow/www/static/js/index.d.ts b/airflow/www/static/js/index.d.ts
index fbe96f7a7265a..b19840526b90d 100644
--- a/airflow/www/static/js/index.d.ts
+++ b/airflow/www/static/js/index.d.ts
@@ -22,6 +22,7 @@ import type { DepEdge, DepNode } from "./types";
 // define global variables that come from FAB
 declare global {
   const autoRefreshInterval: number | undefined;
+  const standaloneDagProcessor: boolean | undefined;
   const stateColors: {
     [key: string]: string;
   };
diff --git a/airflow/www/static/js/types/api-generated.ts b/airflow/www/static/js/types/api-generated.ts
index 8dead88fc7ed8..9477c87db3f4e 100644
--- a/airflow/www/static/js/types/api-generated.ts
+++ b/airflow/www/static/js/types/api-generated.ts
@@ -1908,7 +1908,7 @@ export interface components {
        * @description If set, don't actually run this operation. The response will contain the task instance
        * planned to be affected, but won't be modified in any way.
        *
-       * @default false
+       * @default true
        */
       dry_run?: boolean;
       /**
diff --git a/airflow/www/static/js/types/index.ts b/airflow/www/static/js/types/index.ts
index fc3634d9eb836..a75c1ace23ca0 100644
--- a/airflow/www/static/js/types/index.ts
+++ b/airflow/www/static/js/types/index.ts
@@ -34,7 +34,6 @@ type TaskState =
   | RunState
   | "removed"
   | "scheduled"
-  | "shutdown"
   | "restarting"
   | "up_for_retry"
   | "up_for_reschedule"
diff --git a/airflow/www/static/js/utils/graph.ts b/airflow/www/static/js/utils/graph.ts
index 08d541583331b..1f77990930356 100644
--- a/airflow/www/static/js/utils/graph.ts
+++ b/airflow/www/static/js/utils/graph.ts
@@ -117,7 +117,7 @@ const generateGraph = ({
     height?: number;
   } => {
     const { id, value, children } = node;
-    const isOpen = openGroupIds?.includes(value.label);
+    const isOpen = openGroupIds?.includes(id);
     const childCount =
       children?.filter((c: DepNode) => !c.id.includes("join_id")).length || 0;
     const childIds = children?.length ? getNestedChildIds(children) : [];
@@ -170,7 +170,7 @@ const generateGraph = ({
           sourceId: childIds.indexOf(e.sourceId) > -1 ? node.id : e.sourceId,
           targetId: childIds.indexOf(e.targetId) > -1 ? node.id : e.targetId,
         }));
-      closedGroupIds.push(value.label);
+      closedGroupIds.push(id);
     }
     return {
       id,
diff --git a/airflow/www/templates/airflow/cluster_activity.html b/airflow/www/templates/airflow/cluster_activity.html
index 03ba1fe34fbcb..0f99b186955a9 100644
--- a/airflow/www/templates/airflow/cluster_activity.html
+++ b/airflow/www/templates/airflow/cluster_activity.html
@@ -43,6 +43,7 @@
   <script>
     const stateColors = {{ state_color_mapping|tojson }};
     const autoRefreshInterval = {{ auto_refresh_interval }};
+    const standaloneDagProcessor = {{ standalone_dag_processor|tojson }} === true ;
   </script>
   <script src="{{ url_for_asset('clusterActivity.js') }}"></script>
 {% endblock %}
diff --git a/airflow/www/utils.py b/airflow/www/utils.py
index a8638d328c26f..00a3bd11b2f30 100644
--- a/airflow/www/utils.py
+++ b/airflow/www/utils.py
@@ -27,19 +27,16 @@
 from flask.helpers import flash
 from flask_appbuilder.forms import FieldConverter
 from flask_appbuilder.models.filters import BaseFilter
-from flask_appbuilder.models.sqla import Model, filters as fab_sqlafilters
+from flask_appbuilder.models.sqla import filters as fab_sqlafilters
 from flask_appbuilder.models.sqla.filters import get_field_setup_query, set_value_to_type
 from flask_appbuilder.models.sqla.interface import SQLAInterface
 from flask_babel import lazy_gettext
 from markdown_it import MarkdownIt
 from markupsafe import Markup
-from pendulum.datetime import DateTime
 from pygments import highlight, lexers
 from pygments.formatters import HtmlFormatter
-from pygments.lexer import Lexer
 from sqlalchemy import delete, func, select, types
 from sqlalchemy.ext.associationproxy import AssociationProxy
-from sqlalchemy.sql import Select
 
 from airflow.exceptions import RemovedInAirflow3Warning
 from airflow.models import errors
@@ -56,7 +53,11 @@
 from airflow.www.widgets import AirflowDateTimePickerWidget
 
 if TYPE_CHECKING:
+    from flask_appbuilder.models.sqla import Model
+    from pendulum.datetime import DateTime
+    from pygments.lexer import Lexer
     from sqlalchemy.orm.session import Session
+    from sqlalchemy.sql import Select
     from sqlalchemy.sql.operators import ColumnOperators
 
     from airflow.www.fab_security.sqla.manager import SecurityManager
@@ -107,7 +108,6 @@ def get_try_count(try_number: int, state: State):
     TaskInstanceState.SCHEDULED,
     TaskInstanceState.DEFERRED,
     TaskInstanceState.RUNNING,
-    TaskInstanceState.SHUTDOWN,
     TaskInstanceState.RESTARTING,
     None,
     TaskInstanceState.SUCCESS,
@@ -339,7 +339,7 @@ def generate_pages(
 
     output.append(previous_node.format(href_link=page_link, disabled=is_disabled))
 
-    mid = int(window / 2)
+    mid = window // 2
     last_page = num_of_pages - 1
 
     if current_page <= mid or num_of_pages < window:
@@ -775,7 +775,8 @@ class AirflowFilterConverter(fab_sqlafilters.SQLAFilterConverter):
             "is_extendedjson",
             [],
         ),
-    ) + fab_sqlafilters.SQLAFilterConverter.conversion_table
+        *fab_sqlafilters.SQLAFilterConverter.conversion_table,
+    )
 
     def __init__(self, datamodel):
         super().__init__(datamodel)
@@ -877,7 +878,8 @@ def delete_all(self, items: list[Model]) -> bool:
 # place
 FieldConverter.conversion_table = (
     ("is_utcdatetime", DateTimeWithTimezoneField, AirflowDateTimePickerWidget),
-) + FieldConverter.conversion_table
+    *FieldConverter.conversion_table,
+)
 
 
 class UIAlert:
diff --git a/airflow/www/views.py b/airflow/www/views.py
index ebf6813526407..b55af8ff40480 100644
--- a/airflow/www/views.py
+++ b/airflow/www/views.py
@@ -31,7 +31,7 @@
 from collections import defaultdict
 from functools import cached_property, wraps
 from json import JSONDecodeError
-from typing import Any, Callable, Collection, Iterator, Mapping, MutableMapping, Sequence
+from typing import TYPE_CHECKING, Any, Callable, Collection, Iterator, Mapping, MutableMapping, Sequence
 from urllib.parse import unquote, urljoin, urlsplit
 
 import configupdater
@@ -69,7 +69,7 @@
 from pendulum.parsing.exceptions import ParserError
 from sqlalchemy import Date, and_, case, desc, func, inspect, select, union_all
 from sqlalchemy.exc import IntegrityError
-from sqlalchemy.orm import Session, joinedload
+from sqlalchemy.orm import joinedload
 from wtforms import BooleanField, validators
 
 import airflow
@@ -96,12 +96,10 @@
 from airflow.jobs.scheduler_job_runner import SchedulerJobRunner
 from airflow.jobs.triggerer_job_runner import TriggererJobRunner
 from airflow.models import Connection, DagModel, DagTag, Log, SlaMiss, TaskFail, Trigger, XCom, errors
-from airflow.models.abstractoperator import AbstractOperator
-from airflow.models.dag import DAG, get_dataset_triggered_next_run_info
+from airflow.models.dag import get_dataset_triggered_next_run_info
 from airflow.models.dagrun import RUN_ID_REGEX, DagRun, DagRunType
 from airflow.models.dataset import DagScheduleDatasetReference, DatasetDagRunQueue, DatasetEvent, DatasetModel
 from airflow.models.mappedoperator import MappedOperator
-from airflow.models.operator import Operator
 from airflow.models.serialized_dag import SerializedDagModel
 from airflow.models.taskinstance import TaskInstance, TaskInstanceNote
 from airflow.providers_manager import ProvidersManager
@@ -123,7 +121,7 @@
 from airflow.utils.session import NEW_SESSION, create_session, provide_session
 from airflow.utils.state import DagRunState, State, TaskInstanceState
 from airflow.utils.strings import to_boolean
-from airflow.utils.task_group import MappedTaskGroup, TaskGroup, task_group_to_dict
+from airflow.utils.task_group import TaskGroup, task_group_to_dict
 from airflow.utils.timezone import td_format, utcnow
 from airflow.version import version
 from airflow.www import auth, utils as wwwutils
@@ -138,6 +136,13 @@
 )
 from airflow.www.widgets import AirflowModelListWidget, AirflowVariableShowWidget
 
+if TYPE_CHECKING:
+    from sqlalchemy.orm import Session
+
+    from airflow.models.abstractoperator import AbstractOperator
+    from airflow.models.dag import DAG
+    from airflow.models.operator import Operator
+
 PAGE_SIZE = conf.getint("webserver", "page_size")
 FILTER_TAGS_COOKIE = "tags_filter"
 FILTER_STATUS_COOKIE = "dag_status_filter"
@@ -319,9 +324,15 @@ def dag_to_grid(dag: DagModel, dag_runs: Sequence[DagRun], session: Session):
 
     sort_order = conf.get("webserver", "grid_view_sorting_order", fallback="topological")
     if sort_order == "topological":
-        sort_children_fn = lambda task_group: task_group.topological_sort()
+
+        def sort_children_fn(task_group):
+            return task_group.topological_sort()
+
     elif sort_order == "hierarchical_alphabetical":
-        sort_children_fn = lambda task_group: task_group.hierarchical_alphabetical_sort()
+
+        def sort_children_fn(task_group):
+            return task_group.hierarchical_alphabetical_sort()
+
     else:
         raise AirflowConfigException(f"Unsupported grid_view_sorting_order: {sort_order}")
 
@@ -416,7 +427,7 @@ def set_overall_state(record):
 
         # Task Group
         task_group = item
-        group_is_mapped = isinstance(task_group, MappedTaskGroup)
+        group_is_mapped = next(task_group.iter_mapped_task_groups(), None) is not None
 
         children = [
             task_group_to_grid(child, grouped_tis, is_parent_mapped=group_is_mapped)
@@ -550,7 +561,7 @@ def get_key_paths(input_dict):
     for key, value in input_dict.items():
         if isinstance(value, dict):
             for sub_key in get_key_paths(value):
-                yield ".".join((key, sub_key))
+                yield f"{key}.{sub_key}"
         else:
             yield key
 
@@ -829,9 +840,7 @@ def index(self):
 
             is_paused_count = dict(
                 session.execute(
-                    all_dags.with_only_columns([DagModel.is_paused, func.count()]).group_by(
-                        DagModel.is_paused
-                    )
+                    select(DagModel.is_paused, func.count(DagModel.dag_id)).group_by(DagModel.is_paused)
                 ).all()
             )
 
@@ -1053,10 +1062,12 @@ def cluster_activity(self):
         """Cluster Activity view."""
         state_color_mapping = State.state_color.copy()
         state_color_mapping["no_status"] = state_color_mapping.pop(None)
+        standalone_dag_processor = conf.getboolean("scheduler", "standalone_dag_processor")
         return self.render_template(
             "airflow/cluster_activity.html",
             auto_refresh_interval=conf.getint("webserver", "auto_refresh_interval"),
             state_color_mapping=state_color_mapping,
+            standalone_dag_processor=standalone_dag_processor,
         )
 
     @expose("/next_run_datasets_summary", methods=["POST"])
@@ -1078,8 +1089,8 @@ def next_run_datasets_summary(self, session: Session = NEW_SESSION):
             filter_dag_ids = allowed_dag_ids
 
         dataset_triggered_dag_ids = [
-            dag.dag_id
-            for dag in (
+            dag_id
+            for dag_id in (
                 session.scalars(
                     select(DagModel.dag_id)
                     .where(DagModel.dag_id.in_(filter_dag_ids))
@@ -1519,16 +1530,16 @@ def rendered_templates(self, session):
                     for key, value in content.items():
                         renderer = task.template_fields_renderers.get(key, key)
                         if renderer in renderers:
-                            html_dict[".".join([template_field, key])] = (
+                            html_dict[f"{template_field}.{key}"] = (
                                 renderers[renderer](value) if not no_dagrun else ""
                             )
                         else:
-                            html_dict[".".join([template_field, key])] = Markup(
+                            html_dict[f"{template_field}.{key}"] = Markup(
                                 "<pre><code>{}</pre></code>"
                             ).format(pformat(value) if not no_dagrun else "")
                 else:
                     for dict_keys in get_key_paths(content):
-                        template_path = ".".join((template_field, dict_keys))
+                        template_path = f"{template_field}.{dict_keys}"
                         renderer = task.template_fields_renderers.get(template_path, template_path)
                         if renderer in renderers:
                             content_value = get_value_from_path(dict_keys, content)
@@ -1696,7 +1707,7 @@ def get_logs_with_metadata(self, session: Session = NEW_SESSION):
                 headers={"Content-Disposition": f"attachment; filename={attachment_filename}"},
             )
         except AttributeError as e:
-            error_messages = [f"Task log handler does not support read logs.\n{str(e)}\n"]
+            error_messages = [f"Task log handler does not support read logs.\n{e}\n"]
             metadata["end_of_log"] = True
             return {"message": error_messages, "error": True, "metadata": metadata}
 
@@ -2278,7 +2289,11 @@ def _clear_dag_tis(
         except AirflowException as ex:
             return redirect_or_json(origin, msg=str(ex), status="error", status_code=500)
 
-        assert isinstance(tis, collections.abc.Iterable)
+        if not isinstance(tis, collections.abc.Iterable):
+            raise AssertionError(
+                f"Expected dag.clear() to return an iterable for dry runs, got {tis} instead."
+            )
+
         details = [str(t) for t in tis]
 
         if not details:
@@ -2301,7 +2316,7 @@ def _clear_dag_tis(
     @auth.has_access(
         [
             (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_DAG),
-            (permissions.ACTION_CAN_DELETE, permissions.RESOURCE_TASK_INSTANCE),
+            (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_TASK_INSTANCE),
         ]
     )
     @action_logging
@@ -2396,7 +2411,7 @@ def clear(self, *, session: Session = NEW_SESSION):
     @auth.has_access(
         [
             (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_DAG),
-            (permissions.ACTION_CAN_DELETE, permissions.RESOURCE_TASK_INSTANCE),
+            (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_TASK_INSTANCE),
         ]
     )
     @action_logging
@@ -3787,11 +3802,11 @@ def historical_metrics_data(self):
             data = {
                 "dag_run_types": {
                     **{dag_run_type.value: 0 for dag_run_type in DagRunType},
-                    **{run_type: sum_value for run_type, sum_value in dag_run_types},
+                    **dict(dag_run_types),
                 },
                 "dag_run_states": {
                     **{dag_run_state.value: 0 for dag_run_state in DagRunState},
-                    **{run_state: sum_value for run_state, sum_value in dag_run_states},
+                    **dict(dag_run_states),
                 },
                 "task_instance_states": {
                     "no_status": 0,
@@ -3861,7 +3876,7 @@ def dataset_dependencies(self):
 
         for dag, dependencies in SerializedDagModel.get_dag_dependencies().items():
             dag_node_id = f"dag:{dag}"
-            if dag_node_id not in nodes_dict and len(dependencies) > 0:
+            if dag_node_id not in nodes_dict:
                 for dep in dependencies:
                     if dep.dependency_type == "dag" or dep.dependency_type == "dataset":
                         nodes_dict[dag_node_id] = node_dict(dag_node_id, dag, "dag")
@@ -4176,7 +4191,7 @@ def apply(self, query, func):
 
 class AirflowModelView(ModelView):
     """
-    Airflow Mode View.
+    Airflow Model View.
 
     Overridden `__getattribute__` to wraps REST methods with action_logger
     """
@@ -4256,7 +4271,7 @@ def check_dag_edit_acl_for_actions(
             dag_ids: set[str] = set()
         elif isinstance(items, list):
             dag_ids = {item.dag_id for item in items if item is not None}
-        elif isinstance(items, TaskInstance) or isinstance(items, DagRun):
+        elif isinstance(items, (TaskInstance, DagRun)):
             dag_ids = {items.dag_id}
         else:
             raise ValueError(
@@ -4638,7 +4653,7 @@ def action_mulduplicate(self, connections, session: Session = NEW_SESSION):
                 select(Connection.conn_id).where(Connection.conn_id.in_(potential_connection_ids))
             )
 
-            found_conn_id_set = {conn_id for conn_id in query}
+            found_conn_id_set = set(query)
 
             possible_conn_id_iter = (
                 connection_id
@@ -5216,6 +5231,8 @@ class DagRunModelView(AirflowPrivilegeVerifierModelView):
 
     class_permission_name = permissions.RESOURCE_DAG_RUN
     method_permission_name = {
+        "delete": "delete",
+        "edit": "edit",
         "list": "read",
         "action_clear": "edit",
         "action_muldelete": "delete",
@@ -5594,6 +5611,7 @@ class TaskInstanceModelView(AirflowPrivilegeVerifierModelView):
     class_permission_name = permissions.RESOURCE_TASK_INSTANCE
     method_permission_name = {
         "list": "read",
+        "delete": "delete",
         "action_clear": "edit",
         "action_muldelete": "delete",
         "action_set_running": "edit",
diff --git a/dev/README_RELEASE_AIRFLOW.md b/dev/README_RELEASE_AIRFLOW.md
index ab5cf1f28390f..27133fca7a326 100644
--- a/dev/README_RELEASE_AIRFLOW.md
+++ b/dev/README_RELEASE_AIRFLOW.md
@@ -129,9 +129,7 @@ branch you can run:
 ./dev/airflow-github compare 2.1.2 --unmerged
 ```
 
-Be careful and verify the hash commit specified. This is a 'best effort' to find it, and
-could be inaccurate if the PR was referenced in other commits after it was merged. You can start
-cherry picking from the bottom of the list. (older commits first)
+You can start cherry picking from the bottom of the list. (older commits first)
 
 When you cherry-pick, pick in chronological order onto the `vX-Y-test` release branch.
 You'll move them over to be on `vX-Y-stable` once the release is cut. Use the `-x` option
@@ -817,7 +815,7 @@ Documentation for providers can be found in the ``/docs/apache-airflow`` directo
 
     ```shell script
     breeze release-management publish-docs --package-filter apache-airflow --package-filter docker-stack
-    breeze release-management add-back-references --gen-type airflow
+    breeze release-management add-back-references apache-airflow
     git add .
     git commit -m "Add documentation for Apache Airflow ${VERSION}"
     git push
diff --git a/dev/README_RELEASE_HELM_CHART.md b/dev/README_RELEASE_HELM_CHART.md
index 01994e6241a00..7e0f65f9bcb98 100644
--- a/dev/README_RELEASE_HELM_CHART.md
+++ b/dev/README_RELEASE_HELM_CHART.md
@@ -633,7 +633,7 @@ between the two repositories to be able to build the documentation.
   Regenerate `index.yaml` so it can be added to the Airflow website to allow: `helm repo add https://airflow.apache.org`.
 
     ```shell
-    breeze release-management add-back-references --gen-type helm
+    breeze release-management add-back-references helm-chart
     curl https://dist.apache.org/repos/dist/dev/airflow/helm-chart/$RC/index.yaml -o index.yaml
     cp ${AIRFLOW_SVN_RELEASE_HELM}/${VERSION}/airflow-${VERSION}.tgz .
     helm repo index --merge ./index.yaml . --url "https://downloads.apache.org/airflow/helm-chart/$VERSION"
diff --git a/dev/README_RELEASE_PROVIDER_PACKAGES.md b/dev/README_RELEASE_PROVIDER_PACKAGES.md
index 091408729c31b..9c4d06c750c4f 100644
--- a/dev/README_RELEASE_PROVIDER_PACKAGES.md
+++ b/dev/README_RELEASE_PROVIDER_PACKAGES.md
@@ -392,7 +392,7 @@ breeze release-management publish-docs \
     --package-filter 'apache-airflow-providers-*' \
     --override-versioned
 
-breeze release-management add-back-references --gen-type providers
+breeze release-management add-back-references all-providers
 ```
 
 If you see `ModuleNotFoundError: No module named 'docs'`, set:
diff --git a/dev/airflow-github b/dev/airflow-github
index 8109521e4ab60..5a8a17cbf708d 100755
--- a/dev/airflow-github
+++ b/dev/airflow-github
@@ -266,7 +266,9 @@ def compare(target_version, github_token, previous_version=None, show_uncherrypi
             url="URL",
         )
     )
-
+    milestone_issues = sorted(
+        milestone_issues, key=lambda x: x.closed_at if x.closed_at else x.created_at, reverse=True
+    )
     for issue in milestone_issues:
         commit_in_main = get_commit_in_main_associated_with_pr(repo, issue)
         status = issue.state.capitalize()
diff --git a/dev/assign_cherry_picked_prs_with_milestone.py b/dev/assign_cherry_picked_prs_with_milestone.py
index 0d761b6f1a45a..9007e74739d4e 100755
--- a/dev/assign_cherry_picked_prs_with_milestone.py
+++ b/dev/assign_cherry_picked_prs_with_milestone.py
@@ -226,7 +226,7 @@ def get_changes(verbose: bool, previous_release: str, current_release: str) -> l
         cwd=SOURCE_DIR_PATH,
         text=True,
     )
-    return [get_change_from_line(line) for line in change_strings.split("\n")]
+    return [get_change_from_line(line) for line in change_strings.splitlines()]
 
 
 def update_milestone(r: Repository, pr: PullRequest, m: Milestone):
@@ -261,7 +261,7 @@ def assign_prs(
     output_folder: str,
 ):
     changes = get_changes(verbose, previous_release, current_release)
-    changes = list(filter(lambda change: change.pr is not None, changes))
+    changes = [change for change in changes if change.pr is not None]
     prs = [change.pr for change in changes]
 
     g = Github(github_token)
diff --git a/dev/breeze/README.md b/dev/breeze/README.md
index 7751502524513..12278aaf9ad53 100644
--- a/dev/breeze/README.md
+++ b/dev/breeze/README.md
@@ -52,6 +52,6 @@ PLEASE DO NOT MODIFY THE HASH BELOW! IT IS AUTOMATICALLY UPDATED BY PRE-COMMIT.
 
 ---------------------------------------------------------------------------------------------------------
 
-Package config hash: 9d095d522c9f6fcf0c5834fcdc050bc98231d17fad07ec054c4e437580129d547b693b66b61442757f81fc1a505483da5267cc973dbf86babba7cd2c11697708
+Package config hash: 782a39916ea95eedd0cd81f76c9dbf3bbb5cbdc5c03271621a8dd3805324ee6868fbead2b95ac653d9efea0225db85de46b17c6f0e3b07923c7d18de666d236e
 
 ---------------------------------------------------------------------------------------------------------
diff --git a/dev/breeze/setup.cfg b/dev/breeze/setup.cfg
index 735962b801627..95b8df62e32db 100644
--- a/dev/breeze/setup.cfg
+++ b/dev/breeze/setup.cfg
@@ -56,7 +56,7 @@ install_requires =
     filelock
     inputimeout
     jinja2
-    packaging
+    packaging==23.1
     pendulum
     pre-commit
     psutil
diff --git a/dev/breeze/src/airflow_breeze/commands/developer_commands.py b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
index 4a694cac2e712..a71723f30bc5c 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
@@ -34,7 +34,7 @@
     DEFAULT_PYTHON_MAJOR_MINOR_VERSION,
     DOCKER_DEFAULT_PLATFORM,
     MOUNT_SELECTED,
-    get_available_documentation_provider_packages,
+    get_available_documentation_packages,
 )
 from airflow_breeze.params.build_ci_params import BuildCiParams
 from airflow_breeze.params.doc_build_params import DocBuildParams
@@ -51,6 +51,7 @@
     option_celery_broker,
     option_celery_flower,
     option_db_reset,
+    option_downgrade_sqlalchemy,
     option_dry_run,
     option_executor,
     option_force_build,
@@ -70,6 +71,7 @@
     option_platform_single,
     option_postgres_version,
     option_python,
+    option_upgrade_boto,
     option_use_airflow_version,
     option_use_packages_from_dist,
     option_verbose,
@@ -77,7 +79,6 @@
 from airflow_breeze.utils.console import get_console
 from airflow_breeze.utils.custom_param_types import BetterChoice, NotVerifiedBetterChoice
 from airflow_breeze.utils.docker_command_utils import (
-    DOCKER_COMPOSE_COMMAND,
     check_docker_resources,
     get_env_variables_for_docker_commands,
     get_extra_docker_flags,
@@ -162,6 +163,8 @@ def run(self):
 @option_image_tag_for_running
 @option_max_time
 @option_include_mypy_volume
+@option_upgrade_boto
+@option_downgrade_sqlalchemy
 @option_verbose
 @option_dry_run
 @option_github_repository
@@ -197,6 +200,8 @@ def shell(
     celery_broker: str,
     celery_flower: bool,
     extra_args: tuple,
+    upgrade_boto: bool,
+    downgrade_sqlalchemy: bool,
 ):
     """Enter breeze environment. this is the default command use when no other is selected."""
     if get_verbose() or get_dry_run():
@@ -234,6 +239,8 @@ def shell(
         executor=executor,
         celery_broker=celery_broker,
         celery_flower=celery_flower,
+        upgrade_boto=upgrade_boto,
+        downgrade_sqlalchemy=downgrade_sqlalchemy,
     )
     sys.exit(result.returncode)
 
@@ -362,7 +369,7 @@ def start_airflow(
 @click.option(
     "--package-filter",
     help="List of packages to consider.",
-    type=NotVerifiedBetterChoice(get_available_documentation_provider_packages()),
+    type=NotVerifiedBetterChoice(get_available_documentation_packages()),
     multiple=True,
 )
 @click.option(
@@ -655,7 +662,7 @@ def compile_www_assets(dev: bool):
 @option_dry_run
 def down(preserve_volumes: bool, cleanup_mypy_cache: bool):
     perform_environment_checks()
-    command_to_execute = [*DOCKER_COMPOSE_COMMAND, "down", "--remove-orphans"]
+    command_to_execute = ["docker", "compose", "down", "--remove-orphans"]
     if not preserve_volumes:
         command_to_execute.append("--volumes")
     shell_params = ShellParams(backend="all", include_mypy_volume=True)
@@ -726,7 +733,7 @@ def enter_shell(**kwargs) -> RunCommandResult:
     if shell_params.include_mypy_volume:
         create_mypy_volume_if_needed()
     shell_params.print_badge_info()
-    cmd = [*DOCKER_COMPOSE_COMMAND, "run", "--service-ports", "-e", "BREEZE", "--rm", "airflow"]
+    cmd = ["docker", "compose", "run", "--service-ports", "-e", "BREEZE", "--rm", "airflow"]
     cmd_added = shell_params.command_passed
     env_variables = get_env_variables_for_docker_commands(shell_params)
     if cmd_added is not None:
@@ -766,7 +773,7 @@ def find_airflow_container() -> str | None:
     check_docker_resources(exec_shell_params.airflow_image_name)
     exec_shell_params.print_badge_info()
     env_variables = get_env_variables_for_docker_commands(exec_shell_params)
-    cmd = [*DOCKER_COMPOSE_COMMAND, "ps", "--all", "--filter", "status=running", "airflow"]
+    cmd = ["docker", "compose", "ps", "--all", "--filter", "status=running", "airflow"]
     docker_compose_ps_command = run_command(
         cmd, text=True, capture_output=True, env=env_variables, check=False
     )
diff --git a/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py b/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py
index 81c99e793f954..9ef4f8ca96d63 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands_config.py
@@ -99,6 +99,13 @@
                 "--package-format",
             ],
         },
+        {
+            "name": "Upgrading/downgrading selected packages",
+            "options": [
+                "--upgrade-boto",
+                "--downgrade-sqlalchemy",
+            ],
+        },
     ],
     "breeze compile-www-assets": [
         {
diff --git a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
index b96829539aa3f..08e06da5d3156 100644
--- a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
@@ -385,9 +385,7 @@ def _delete_cluster(python: str, kubernetes_version: str, output: Output | None)
 
 def _delete_all_clusters():
     clusters = list(K8S_CLUSTERS_PATH.iterdir())
-    if len(clusters) == 0:
-        get_console().print("\n[warning]No clusters.\n")
-    else:
+    if clusters:
         get_console().print("\n[info]Deleting clusters")
         for cluster_name in clusters:
             resolved_path = cluster_name.resolve()
@@ -407,6 +405,8 @@ def _delete_all_clusters():
                     shutil.rmtree(cluster_name.resolve(), ignore_errors=True)
                 else:
                     resolved_path.unlink()
+    else:
+        get_console().print("\n[warning]No clusters.\n")
 
 
 @kubernetes_group.command(
@@ -508,10 +508,7 @@ def status(kubernetes_version: str, python: str, wait_time_in_seconds: int, all:
     make_sure_kubernetes_tools_are_installed()
     if all:
         clusters = list(K8S_CLUSTERS_PATH.iterdir())
-        if len(clusters) == 0:
-            get_console().print("\n[warning]No clusters.\n")
-            sys.exit(1)
-        else:
+        if clusters:
             failed = False
             get_console().print("[info]\nCluster status:\n")
             for cluster_name in clusters:
@@ -529,6 +526,9 @@ def status(kubernetes_version: str, python: str, wait_time_in_seconds: int, all:
             if failed:
                 get_console().print("\n[error]Some clusters are not healthy!\n")
                 sys.exit(1)
+        else:
+            get_console().print("\n[warning]No clusters.\n")
+            sys.exit(1)
     else:
         if not _status(
             python=python,
@@ -1217,10 +1217,7 @@ def _logs(python: str, kubernetes_version: str):
 def logs(python: str, kubernetes_version: str, all: bool):
     if all:
         clusters = list(K8S_CLUSTERS_PATH.iterdir())
-        if len(clusters) == 0:
-            get_console().print("\n[warning]No clusters.\n")
-            sys.exit(1)
-        else:
+        if clusters:
             get_console().print("[info]\nDumping cluster logs:\n")
             for cluster_name in clusters:
                 name = cluster_name.name
@@ -1229,6 +1226,9 @@ def logs(python: str, kubernetes_version: str, all: bool):
                     get_console().print(f"[warning]\nCould not get cluster from {name}. Skipping.\n")
                     continue
                 _logs(python=found_python, kubernetes_version=found_kubernetes_version)
+        else:
+            get_console().print("\n[warning]No clusters.\n")
+            sys.exit(1)
     else:
         _logs(python=python, kubernetes_version=kubernetes_version)
 
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 bd3303215f410..254697863183d 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -43,16 +43,16 @@
     MOUNT_ALL,
     MOUNT_SELECTED,
     MULTI_PLATFORM,
-    get_available_documentation_provider_packages,
+    get_available_documentation_packages,
 )
 from airflow_breeze.params.shell_params import ShellParams
 from airflow_breeze.utils.add_back_references import (
-    GenerationType,
     start_generating_back_references,
 )
 from airflow_breeze.utils.ci_group import ci_group
 from airflow_breeze.utils.common_options import (
     argument_packages,
+    argument_packages_plus_all_providers,
     option_airflow_constraints_mode_ci,
     option_airflow_constraints_reference,
     option_airflow_extras,
@@ -783,7 +783,7 @@ def alias_image(image_from: str, image_to: str):
 @click.option(
     "--package-filter",
     help="List of packages to consider.",
-    type=NotVerifiedBetterChoice(get_available_documentation_provider_packages()),
+    type=NotVerifiedBetterChoice(get_available_documentation_packages()),
     multiple=True,
 )
 @option_verbose
@@ -815,7 +815,7 @@ def publish_docs(
 
 @release_management.command(
     name="add-back-references",
-    help="Command to add back references for documentation to make it backward compatible",
+    help="Command to add back references for documentation to make it backward compatible.",
 )
 @click.option(
     "-a",
@@ -825,23 +825,12 @@ def publish_docs(
     help="Local directory path of cloned airflow-site repo.",
     required=True,
 )
-@click.option(
-    "-g",
-    "--gen-type",
-    show_default=True,
-    help="Type of back references to generate. Forced to providers if providers specified as arguments.",
-    type=BetterChoice(
-        [e.name for e in GenerationType],
-    ),
-    default=GenerationType.airflow.name,
-)
-@argument_packages
+@argument_packages_plus_all_providers
 @option_verbose
 @option_dry_run
 def add_back_references(
     airflow_site_directory: str,
-    gen_type: str,
-    packages: list[str],
+    packages_plus_all_providers: tuple[str],
 ):
     """Adds back references for documentation generated by build-docs and publish-docs"""
     site_path = Path(airflow_site_directory)
@@ -851,22 +840,16 @@ def add_back_references(
             "Provide the path of cloned airflow-site repo\n"
         )
         sys.exit(1)
-    if len(packages) != 0 and gen_type != GenerationType.providers.name:
+    if not packages_plus_all_providers:
         get_console().print(
-            [
-                f"[warning]Forcing gen type to "
-                f"{GenerationType.providers} as some provider_packages are selected."
-            ]
-        )
-        gen_type = GenerationType.providers.name
-    gen = GenerationType[gen_type]
-    if gen not in GenerationType:
-        get_console().print(
-            "\n[error]invalid type of doc generation required. Pass one of [airflow | providers | helm]\n"
+            "\n[error]You need to specify at least one package to generate back references for\n"
         )
         sys.exit(1)
-
-    start_generating_back_references(gen, site_path, packages)
+    packages = list(packages_plus_all_providers)
+    if "all-providers" in packages_plus_all_providers:
+        packages.remove("all-providers")
+        packages.extend(get_available_documentation_packages(only_providers=True, short_version=True))
+    start_generating_back_references(site_path, packages)
 
 
 @release_management.command(
@@ -1032,26 +1015,32 @@ def release_prod_images(
                     f"{dockerhub_repo}:{airflow_version}-python{python}",
                     f"{dockerhub_repo}:latest-python{python}",
                 )
-        if slim_images:
-            alias_image(
-                f"{dockerhub_repo}:slim-{airflow_version}",
-                f"{dockerhub_repo}:slim-latest",
-            )
-        else:
-            alias_image(
-                f"{dockerhub_repo}:{airflow_version}",
-                f"{dockerhub_repo}:latest",
-            )
+        if python == DEFAULT_PYTHON_MAJOR_MINOR_VERSION:
+            # only tag latest  "default" image when we build default python version
+            # otherwise if the non-default images complete before the default one, their jobs will fail
+            if slim_images:
+                alias_image(
+                    f"{dockerhub_repo}:slim-{airflow_version}",
+                    f"{dockerhub_repo}:slim-latest",
+                )
+            else:
+                alias_image(
+                    f"{dockerhub_repo}:{airflow_version}",
+                    f"{dockerhub_repo}:latest",
+                )
 
 
 def is_package_in_dist(dist_files: list[str], package: str) -> bool:
     """Check if package has been prepared in dist folder."""
-    for file in dist_files:
-        if file.startswith(f'apache_airflow_providers_{package.replace(".", "_")}') or file.startswith(
-            f'apache-airflow-providers-{package.replace(".", "-")}'
-        ):
-            return True
-    return False
+    return any(
+        file.startswith(
+            (
+                f'apache_airflow_providers_{package.replace(".", "_")}',
+                f'apache-airflow-providers-{package.replace(".", "-")}',
+            )
+        )
+        for file in dist_files
+    )
 
 
 def get_prs_for_package(package_id: str) -> list[int]:
@@ -1162,7 +1151,7 @@ class ProviderPRInfo(NamedTuple):
                 )
                 continue
             prs = get_prs_for_package(package_id)
-            provider_prs[package_id] = list(filter(lambda pr: pr not in excluded_prs, prs))
+            provider_prs[package_id] = [pr for pr in prs if pr not in excluded_prs]
             all_prs.update(provider_prs[package_id])
         g = Github(github_token)
         repo = g.get_repo("apache/airflow")
@@ -1216,7 +1205,7 @@ class ProviderPRInfo(NamedTuple):
         get_console().print()
         get_console().print(
             "Issue title: [yellow]Status of testing Providers that were "
-            f"prepared on {datetime.now().strftime('%B %d, %Y')}[/]"
+            f"prepared on {datetime.now():%B %d, %Y}[/]"
         )
         get_console().print()
         syntax = Syntax(issue_content, "markdown", theme="ansi_dark")
@@ -1433,7 +1422,7 @@ def update_constraints(
     updated_constraint: tuple[str],
 ) -> None:
     airflow_versions_array = airflow_versions.split(",")
-    if len(airflow_versions_array) == 0:
+    if not airflow_versions_array:
         get_console().print("[error]No airflow versions specified - you provided empty string[/]")
         sys.exit(1)
 
diff --git a/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py b/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
index dcea189896c71..43321586b41be 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
@@ -174,7 +174,7 @@
     "breeze release-management add-back-references": [
         {
             "name": "Add Back References to Docs",
-            "options": ["--airflow-site-directory", "--gen-type"],
+            "options": ["--airflow-site-directory"],
         },
     ],
     "breeze release-management generate-issue-content-providers": [
diff --git a/dev/breeze/src/airflow_breeze/commands/setup_commands.py b/dev/breeze/src/airflow_breeze/commands/setup_commands.py
index 5a20427e26a4c..61e1f5ac7b57c 100644
--- a/dev/breeze/src/airflow_breeze/commands/setup_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/setup_commands.py
@@ -410,7 +410,7 @@ def get_command_hash_dict(hash_file_content: str) -> dict[str, str]:
     results = {}
     for line in hash_file_content.splitlines():
         strip_line = line.strip()
-        if strip_line.strip() == "" or strip_line.startswith("#"):
+        if not strip_line or strip_line.startswith("#"):
             continue
         command = ":".join(strip_line.split(":")[:-1])
         the_hash = strip_line.split(":")[-1]
diff --git a/dev/breeze/src/airflow_breeze/commands/testing_commands.py b/dev/breeze/src/airflow_breeze/commands/testing_commands.py
index d892727ee48dc..606bdee7ed8bf 100644
--- a/dev/breeze/src/airflow_breeze/commands/testing_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/testing_commands.py
@@ -38,6 +38,7 @@
     option_backend,
     option_db_reset,
     option_debug_resources,
+    option_downgrade_sqlalchemy,
     option_dry_run,
     option_github_repository,
     option_image_name,
@@ -52,13 +53,13 @@
     option_python,
     option_run_in_parallel,
     option_skip_cleanup,
+    option_upgrade_boto,
     option_use_airflow_version,
     option_verbose,
 )
 from airflow_breeze.utils.console import Output, get_console
 from airflow_breeze.utils.custom_param_types import BetterChoice, NotVerifiedBetterChoice
 from airflow_breeze.utils.docker_command_utils import (
-    DOCKER_COMPOSE_COMMAND,
     get_env_variables_for_docker_commands,
     perform_environment_checks,
     remove_docker_networks,
@@ -170,7 +171,8 @@ def _run_test(
     # This is needed for Docker-compose 1 compatibility
     env_variables["COMPOSE_PROJECT_NAME"] = compose_project_name
     down_cmd = [
-        *DOCKER_COMPOSE_COMMAND,
+        "docker",
+        "compose",
         "--project-name",
         compose_project_name,
         "down",
@@ -178,7 +180,8 @@ def _run_test(
     ]
     run_command(down_cmd, env=env_variables, output=output, check=False)
     run_cmd = [
-        *DOCKER_COMPOSE_COMMAND,
+        "docker",
+        "compose",
         "--project-name",
         compose_project_name,
         "run",
@@ -226,7 +229,8 @@ def _run_test(
         if not skip_docker_compose_down:
             run_command(
                 [
-                    *DOCKER_COMPOSE_COMMAND,
+                    "docker",
+                    "compose",
                     "--project-name",
                     compose_project_name,
                     "rm",
@@ -367,12 +371,8 @@ def run_tests_in_parallel(
     show_default=True,
     envvar="PARALLEL_TEST_TYPES",
 )
-@click.option(
-    "--upgrade-boto",
-    help="Remove aiobotocore and upgrade botocore and boto to the latest version.",
-    is_flag=True,
-    envvar="UPGRADE_BOTO",
-)
+@option_upgrade_boto
+@option_downgrade_sqlalchemy
 @click.option(
     "--collect-only",
     help="Collect tests only, do not run them.",
@@ -416,6 +416,7 @@ def command_for_tests(
     mount_sources: str,
     extra_pytest_args: tuple,
     upgrade_boto: bool,
+    downgrade_sqlalchemy: bool,
     collect_only: bool,
     remove_arm_packages: bool,
     github_repository: str,
@@ -436,6 +437,7 @@ def command_for_tests(
         forward_ports=False,
         test_type=test_type,
         upgrade_boto=upgrade_boto,
+        downgrade_sqlalchemy=downgrade_sqlalchemy,
         collect_only=collect_only,
         remove_arm_packages=remove_arm_packages,
         github_repository=github_repository,
@@ -587,7 +589,6 @@ def helm_tests(
         env_variables["HELM_TEST_PACKAGE"] = helm_test_package
     perform_environment_checks()
     cleanup_python_generated_files()
-    cmd = [*DOCKER_COMPOSE_COMMAND, "run", "--service-ports", "--rm", "airflow"]
-    cmd.extend(list(extra_pytest_args))
+    cmd = ["docker", "compose", "run", "--service-ports", "--rm", "airflow", *extra_pytest_args]
     result = run_command(cmd, env=env_variables, check=False, output_outside_the_group=True)
     sys.exit(result.returncode)
diff --git a/dev/breeze/src/airflow_breeze/commands/testing_commands_config.py b/dev/breeze/src/airflow_breeze/commands/testing_commands_config.py
index 908843c224de2..84d0d2b6ec0c8 100644
--- a/dev/breeze/src/airflow_breeze/commands/testing_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/testing_commands_config.py
@@ -56,6 +56,7 @@
                 "--use-airflow-version",
                 "--mount-sources",
                 "--upgrade-boto",
+                "--downgrade-sqlalchemy",
                 "--remove-arm-packages",
                 "--skip-docker-compose-down",
             ],
diff --git a/dev/breeze/src/airflow_breeze/global_constants.py b/dev/breeze/src/airflow_breeze/global_constants.py
index 2d4870c0585b9..f4f6c9b7e2044 100644
--- a/dev/breeze/src/airflow_breeze/global_constants.py
+++ b/dev/breeze/src/airflow_breeze/global_constants.py
@@ -146,18 +146,20 @@ def all_helm_test_packages() -> list[str]:
 ALL_HISTORICAL_PYTHON_VERSIONS = ["3.6", "3.7", "3.8", "3.9", "3.10", "3.11"]
 
 
-def get_available_documentation_provider_packages(short_version=False) -> list[str]:
+def get_available_documentation_packages(short_version=False, only_providers: bool = False) -> list[str]:
     provider_names: list[str] = list(json.loads(PROVIDER_DEPENDENCIES_JSON_FILE_PATH.read_text()).keys())
     doc_provider_names = [provider_name.replace(".", "-") for provider_name in provider_names]
-    available_packages = [f"apache-airflow-providers-{doc_provider}" for doc_provider in doc_provider_names]
-    available_packages.extend(["apache-airflow", "docker-stack", "helm-chart"])
-    available_packages.sort()
+    available_packages = []
+    if not only_providers:
+        available_packages.extend(["apache-airflow", "docker-stack", "helm-chart"])
+    all_providers = [f"apache-airflow-providers-{doc_provider}" for doc_provider in doc_provider_names]
+    all_providers.sort()
+    available_packages.extend(all_providers)
     if short_version:
         prefix_len = len("apache-airflow-providers-")
         available_packages = [
-            package[prefix_len:].replace("-", ".")
+            package[prefix_len:].replace("-", ".") if len(package) > prefix_len else package
             for package in available_packages
-            if len(package) > prefix_len
         ]
     return available_packages
 
@@ -295,7 +297,7 @@ def get_airflow_extras():
     "statsd",
     "trino",
 ]
-ALL_PROVIDER_YAML_FILES = Path(AIRFLOW_SOURCES_ROOT).glob("airflow/providers/**/provider.yaml")
+ALL_PROVIDER_YAML_FILES = Path(AIRFLOW_SOURCES_ROOT, "airflow", "providers").rglob("provider.yaml")
 
 with Path(AIRFLOW_SOURCES_ROOT, "generated", "provider_dependencies.json").open() as f:
     PROVIDER_DEPENDENCIES = json.load(f)
@@ -333,8 +335,8 @@ def get_airflow_extras():
 ISSUE_ID = ""
 NUM_RUNS = ""
 
-MIN_DOCKER_VERSION = "20.10.0"
-MIN_DOCKER_COMPOSE_VERSION = "1.29.0"
+MIN_DOCKER_VERSION = "23.0.0"
+MIN_DOCKER_COMPOSE_VERSION = "2.14.0"
 
 AIRFLOW_SOURCES_FROM = "."
 AIRFLOW_SOURCES_TO = "/opt/airflow"
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 74a6d5bb64714..a713c280b54d9 100644
--- a/dev/breeze/src/airflow_breeze/params/build_ci_params.py
+++ b/dev/breeze/src/airflow_breeze/params/build_ci_params.py
@@ -55,7 +55,7 @@ def extra_docker_build_flags(self) -> list[str]:
         extra_ci_flags.extend(
             ["--build-arg", f"AIRFLOW_CONSTRAINTS_REFERENCE={self.airflow_constraints_reference}"]
         )
-        if self.airflow_constraints_location is not None and len(self.airflow_constraints_location) > 0:
+        if self.airflow_constraints_location:
             extra_ci_flags.extend(
                 ["--build-arg", f"AIRFLOW_CONSTRAINTS_LOCATION={self.airflow_constraints_location}"]
             )
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 96c3a9397c9ef..585c7dc0c9690 100644
--- a/dev/breeze/src/airflow_breeze/params/build_prod_params.py
+++ b/dev/breeze/src/airflow_breeze/params/build_prod_params.py
@@ -113,7 +113,7 @@ def args_for_remote_install(self) -> list:
     @property
     def extra_docker_build_flags(self) -> list[str]:
         extra_build_flags = []
-        if len(self.install_airflow_reference) > 0:
+        if self.install_airflow_reference:
             AIRFLOW_INSTALLATION_METHOD = (
                 "https://github.com/apache/airflow/archive/"
                 + self.install_airflow_reference
@@ -126,7 +126,7 @@ def extra_docker_build_flags(self) -> list[str]:
                 ]
             )
             extra_build_flags.extend(self.args_for_remote_install)
-        elif len(self.install_airflow_version) > 0:
+        elif self.install_airflow_version:
             if not re.match(r"^[0-9\.]+((a|b|rc|alpha|beta|pre)[0-9]+)?$", self.install_airflow_version):
                 get_console().print(
                     f"\n[error]ERROR: Bad value for install-airflow-version:{self.install_airflow_version}"
diff --git a/dev/breeze/src/airflow_breeze/params/doc_build_params.py b/dev/breeze/src/airflow_breeze/params/doc_build_params.py
index 158e93964534d..961291b7a0ea9 100644
--- a/dev/breeze/src/airflow_breeze/params/doc_build_params.py
+++ b/dev/breeze/src/airflow_breeze/params/doc_build_params.py
@@ -42,7 +42,7 @@ def args_doc_builder(self) -> list[str]:
             doc_args.append("--one-pass-only")
         if AIRFLOW_BRANCH != "main":
             doc_args.append("--disable-provider-checks")
-        if self.package_filter and len(self.package_filter) > 0:
+        if self.package_filter:
             for single_filter in self.package_filter:
                 doc_args.extend(["--package-filter", single_filter])
         return doc_args
diff --git a/dev/breeze/src/airflow_breeze/params/shell_params.py b/dev/breeze/src/airflow_breeze/params/shell_params.py
index 405fc7bcfb2a7..b2240a42c991c 100644
--- a/dev/breeze/src/airflow_breeze/params/shell_params.py
+++ b/dev/breeze/src/airflow_breeze/params/shell_params.py
@@ -120,6 +120,7 @@ class ShellParams:
     dry_run: bool = False
     verbose: bool = False
     upgrade_boto: bool = False
+    downgrade_sqlalchemy: bool = False
     executor: str = START_AIRFLOW_DEFAULT_ALLOWED_EXECUTORS
     celery_broker: str = DEFAULT_CELERY_BROKER
     celery_flower: bool = False
@@ -261,9 +262,8 @@ def compose_file(self) -> str:
             integrations = ALL_INTEGRATIONS
         else:
             integrations = self.integration
-        if len(integrations) > 0:
-            for integration in integrations:
-                compose_file_list.append(DOCKER_COMPOSE_DIR / f"integration-{integration}.yml")
+        for integration in integrations:
+            compose_file_list.append(DOCKER_COMPOSE_DIR / f"integration-{integration}.yml")
         if "trino" in integrations and "kerberos" not in integrations:
             get_console().print(
                 "[warning]Adding `kerberos` integration as it is implicitly needed by trino",
@@ -273,9 +273,7 @@ def compose_file(self) -> str:
 
     @property
     def command_passed(self):
-        cmd = None
-        if len(self.extra_args) > 0:
-            cmd = str(self.extra_args[0])
+        cmd = str(self.extra_args[0]) if self.extra_args else None
         return cmd
 
     @property
diff --git a/dev/breeze/src/airflow_breeze/pre_commit_ids.py b/dev/breeze/src/airflow_breeze/pre_commit_ids.py
index f4db1949f7f8c..8bd2a30975ab4 100644
--- a/dev/breeze/src/airflow_breeze/pre_commit_ids.py
+++ b/dev/breeze/src/airflow_breeze/pre_commit_ids.py
@@ -124,5 +124,6 @@
     "update-supported-versions",
     "update-vendored-in-k8s-json-schema",
     "update-version",
+    "validate-pyproject",
     "yamllint",
 ]
diff --git a/dev/breeze/src/airflow_breeze/utils/add_back_references.py b/dev/breeze/src/airflow_breeze/utils/add_back_references.py
index 0b7c2abfe8907..ebc0032acdd5e 100644
--- a/dev/breeze/src/airflow_breeze/utils/add_back_references.py
+++ b/dev/breeze/src/airflow_breeze/utils/add_back_references.py
@@ -16,7 +16,6 @@
 # under the License.
 from __future__ import annotations
 
-import enum
 import os
 import re
 import tempfile
@@ -26,7 +25,7 @@
 
 from rich import print
 
-from airflow_breeze.global_constants import get_available_documentation_provider_packages
+from airflow_breeze.utils.console import get_console
 
 airflow_redirects_link = (
     "https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/redirects.txt"
@@ -34,13 +33,6 @@
 helm_redirects_link = "https://raw.githubusercontent.com/apache/airflow/main/docs/helm-chart/redirects.txt"
 
 
-# types of generations supported
-class GenerationType(enum.Enum):
-    airflow = 1
-    helm = 2
-    providers = 3
-
-
 def download_file(url):
     try:
         temp_dir = Path(tempfile.mkdtemp(prefix="temp_dir", suffix=""))
@@ -149,26 +141,23 @@ def generate_back_references(link: str, base_path: Path):
                 create_back_reference_html(relative_path, dest_file_path)
 
 
-def start_generating_back_references(
-    gen_type: GenerationType, airflow_site_directory: Path, short_provider_package_ids: list[str]
-):
-    # Either packages or gen_type should be provided
+def start_generating_back_references(airflow_site_directory: Path, short_provider_package_ids: list[str]):
     docs_archive_path = airflow_site_directory / "docs-archive"
     airflow_docs_path = docs_archive_path / "apache-airflow"
     helm_docs_path = docs_archive_path / "helm-chart"
-
-    if gen_type == GenerationType.airflow:
+    if "apache-airflow" in short_provider_package_ids:
         generate_back_references(airflow_redirects_link, airflow_docs_path)
-    elif gen_type == GenerationType.helm:
+        short_provider_package_ids.remove("apache-airflow")
+    if "helm-chart" in short_provider_package_ids:
         generate_back_references(helm_redirects_link, helm_docs_path)
-    elif gen_type == GenerationType.providers:
-        if short_provider_package_ids:
-            all_providers = [
-                f"apache-airflow-providers-{package.replace('.','-')}"
-                for package in short_provider_package_ids
-            ]
-        else:
-            all_providers = get_available_documentation_provider_packages()
+        short_provider_package_ids.remove("helm-chart")
+    if "docker-stack" in short_provider_package_ids:
+        get_console().print("[info]Skipping docker-stack package. No back-reference needed.")
+        short_provider_package_ids.remove("docker-stack")
+    if short_provider_package_ids:
+        all_providers = [
+            f"apache-airflow-providers-{package.replace('.','-')}" for package in short_provider_package_ids
+        ]
         for p in all_providers:
             print(f"Processing airflow provider: {p}")
             generate_back_references(get_github_redirects_url(p), docs_archive_path / p)
diff --git a/dev/breeze/src/airflow_breeze/utils/coertions.py b/dev/breeze/src/airflow_breeze/utils/coertions.py
index 0f80dd57e3a9e..415b9472c23d1 100644
--- a/dev/breeze/src/airflow_breeze/utils/coertions.py
+++ b/dev/breeze/src/airflow_breeze/utils/coertions.py
@@ -30,4 +30,4 @@ def coerce_bool_value(value: str | bool) -> bool:
 
 
 def one_or_none_set(iterable: Iterable[bool]) -> bool:
-    return len([i for i in iterable if i]) in (0, 1)
+    return 0 <= sum(1 for i in iterable if i) <= 1
diff --git a/dev/breeze/src/airflow_breeze/utils/common_options.py b/dev/breeze/src/airflow_breeze/utils/common_options.py
index f1697790166d2..5e8e50da61d99 100644
--- a/dev/breeze/src/airflow_breeze/utils/common_options.py
+++ b/dev/breeze/src/airflow_breeze/utils/common_options.py
@@ -44,7 +44,7 @@
     SINGLE_PLATFORMS,
     START_AIRFLOW_ALLOWED_EXECUTORS,
     START_AIRFLOW_DEFAULT_ALLOWED_EXECUTORS,
-    get_available_documentation_provider_packages,
+    get_available_documentation_packages,
 )
 from airflow_breeze.utils.custom_param_types import (
     AnswerChoice,
@@ -443,7 +443,13 @@ def _set_default_from_parent(ctx: click.core.Context, option: click.core.Option,
     "packages",
     nargs=-1,
     required=False,
-    type=BetterChoice(get_available_documentation_provider_packages(short_version=True)),
+    type=BetterChoice(get_available_documentation_packages(short_version=True)),
+)
+argument_packages_plus_all_providers = click.argument(
+    "packages_plus_all_providers",
+    nargs=-1,
+    required=False,
+    type=BetterChoice(["all-providers"] + get_available_documentation_packages(short_version=True)),
 )
 option_airflow_constraints_reference = click.option(
     "--airflow-constraints-reference",
@@ -595,3 +601,15 @@ def _set_default_from_parent(ctx: click.core.Context, option: click.core.Option,
     help="Optional additional requirements to upgrade eagerly to avoid backtracking "
     "(see `breeze ci find-backtracking-candidates`).",
 )
+option_upgrade_boto = click.option(
+    "--upgrade-boto",
+    help="Remove aiobotocore and upgrade botocore and boto to the latest version.",
+    is_flag=True,
+    envvar="UPGRADE_BOTO",
+)
+option_downgrade_sqlalchemy = click.option(
+    "--downgrade-sqlalchemy",
+    help="Downgrade SQLAlchemy to minimum supported version.",
+    is_flag=True,
+    envvar="DOWNGRADE_SQLALCHEMY",
+)
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 1fdb96968db65..1b85afea5ab22 100644
--- a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
@@ -17,11 +17,12 @@
 """Various utils to prepare docker and docker compose commands."""
 from __future__ import annotations
 
+import copy
+import json
 import os
+import random
 import re
 import sys
-from copy import deepcopy
-from random import randint
 from subprocess import DEVNULL, CalledProcessError, CompletedProcess
 
 from airflow_breeze.params.build_ci_params import BuildCiParams
@@ -143,6 +144,16 @@ def get_extra_docker_flags(mount_sources: str, include_mypy_volume: bool = False
     return extra_docker_flags
 
 
+def is_docker_rootless():
+    response = run_command(
+        ["docker", "info", "-f", "{{println .SecurityOptions}}"], capture_output=True, check=True, text=True
+    )
+    if "rootless" in response.stdout.strip():
+        get_console().print("[info]Docker is running in rootless mode.[/]\n")
+        return True
+    return False
+
+
 def check_docker_resources(airflow_image_name: str) -> RunCommandResult:
     """
     Check if we have enough resources to run docker. This is done via running script embedded in our image.
@@ -250,6 +261,7 @@ def check_docker_version():
 [warning]install docker at least: {MIN_DOCKER_VERSION} version.[/]
 """
             )
+            sys.exit(1)
         else:
             good_version = compare_version(docker_version, MIN_DOCKER_VERSION)
             if good_version:
@@ -257,10 +269,12 @@ def check_docker_version():
             else:
                 get_console().print(
                     f"""
-[warning]Your version of docker is too old:{docker_version}.
-Please upgrade to at least {MIN_DOCKER_VERSION}[/]
+[error]Your version of docker is too old: {docker_version}.\n[/]
+[warning]Please upgrade to at least {MIN_DOCKER_VERSION}.\n[/]
+You can find installation instructions here: https://docs.docker.com/engine/install/
 """
                 )
+                sys.exit(1)
 
 
 def check_remote_ghcr_io_commands():
@@ -306,9 +320,6 @@ def check_remote_ghcr_io_commands():
             sys.exit(1)
 
 
-DOCKER_COMPOSE_COMMAND = ["docker", "compose"]
-
-
 def check_docker_compose_version():
     """Checks if the docker compose version is as expected.
 
@@ -328,43 +339,40 @@ def check_docker_compose_version():
             dry_run_override=False,
         )
     except Exception:
-        docker_compose_version_command = ["docker-compose", "--version"]
-        docker_compose_version_result = run_command(
-            docker_compose_version_command,
-            no_output_dump_on_exception=True,
-            capture_output=True,
-            text=True,
-            dry_run_override=False,
+        get_console().print(
+            "[error]You either do not have docker-composer or have docker-compose v1 installed.[/]\n"
+            "[warning]Breeze does not support docker-compose v1 any more as it has been replaced by v2.[/]\n"
+            "Follow https://docs.docker.com/compose/migrate/ to migrate to v2"
         )
-        DOCKER_COMPOSE_COMMAND.clear()
-        DOCKER_COMPOSE_COMMAND.append("docker-compose")
+        sys.exit(1)
     if docker_compose_version_result.returncode == 0:
         docker_compose_version = docker_compose_version_result.stdout
         version_extracted = version_pattern.search(docker_compose_version)
         if version_extracted is not None:
-            docker_version = ".".join(version_extracted.groups())
-            good_version = compare_version(docker_version, MIN_DOCKER_COMPOSE_VERSION)
+            docker_compose_version = ".".join(version_extracted.groups())
+            good_version = compare_version(docker_compose_version, MIN_DOCKER_COMPOSE_VERSION)
             if good_version:
-                get_console().print(f"[success]Good version of docker-compose: {docker_version}[/]")
+                get_console().print(f"[success]Good version of docker-compose: {docker_compose_version}[/]")
             else:
                 get_console().print(
                     f"""
-[warning]You have too old version of docker-compose: {docker_version}! At least 1.29 needed! Please upgrade!
-"""
-                )
-                get_console().print(
-                    """
-See https://docs.docker.com/compose/install/ for instructions.
-Make sure docker-compose you install is first on the PATH variable of yours.
+[error]You have too old version of docker-compose: {docker_compose_version}!\n[/]
+[warning]At least {MIN_DOCKER_COMPOSE_VERSION} needed! Please upgrade!\n[/]
+See https://docs.docker.com/compose/install/ for installation instructions.\n
+Make sure docker-compose you install is first on the PATH variable of yours.\n
 """
                 )
+                sys.exit(1)
     else:
         get_console().print(
-            """
-[warning]Unknown docker-compose version. At least 1.29 is needed![/]
-[warning]If Breeze fails upgrade to latest available docker-compose version.[/]
+            f"""
+[error]Unknown docker-compose version.[/]
+[warning]At least {MIN_DOCKER_COMPOSE_VERSION} needed! Please upgrade!\n[/]
+See https://docs.docker.com/compose/install/ for installation instructions.\n
+Make sure docker-compose you install is first on the PATH variable of yours.\n
 """
         )
+        sys.exit(1)
 
 
 def get_env_variable_value(arg_name: str, params: CommonBuildParams | ShellParams):
@@ -373,7 +381,7 @@ def get_env_variable_value(arg_name: str, params: CommonBuildParams | ShellParam
     value = "true" if raw_value is True else value
     value = "false" if raw_value is False else value
     if arg_name == "upgrade_to_newer_dependencies" and value == "true":
-        value = f"{randint(0, 2**32):x}"
+        value = f"{random.randrange(2**32):x}"
     return value
 
 
@@ -399,7 +407,7 @@ def prepare_arguments_for_docker_build_command(image_params: CommonBuildParams)
         )
     for optional_arg in image_params.optional_image_args:
         param_value = get_env_variable_value(optional_arg, params=image_params)
-        if len(param_value) > 0:
+        if param_value:
             args_command.append("--build-arg")
             args_command.append(optional_arg.upper() + "=" + param_value)
     args_command.extend(image_params.docker_cache_directive)
@@ -510,7 +518,7 @@ def construct_docker_push_command(
 def build_cache(image_params: CommonBuildParams, output: Output | None) -> RunCommandResult:
     build_command_result: CompletedProcess | CalledProcessError = CompletedProcess(args=[], returncode=0)
     for platform in image_params.platforms:
-        platform_image_params = deepcopy(image_params)
+        platform_image_params = copy.deepcopy(image_params)
         # override the platform in the copied params to only be single platform per run
         # as a workaround to https://github.com/docker/buildx/issues/1044
         platform_image_params.platform = platform
@@ -572,6 +580,7 @@ def update_expected_environment_variables(env: dict[str, str]) -> None:
     set_value_to_default_if_not_set(env, "COLLECT_ONLY", "false")
     set_value_to_default_if_not_set(env, "DB_RESET", "false")
     set_value_to_default_if_not_set(env, "DEFAULT_BRANCH", AIRFLOW_BRANCH)
+    set_value_to_default_if_not_set(env, "DOCKER_IS_ROOTLESS", "false")
     set_value_to_default_if_not_set(env, "ENABLED_SYSTEMS", "")
     set_value_to_default_if_not_set(env, "ENABLE_TEST_COVERAGE", "false")
     set_value_to_default_if_not_set(env, "HELM_TEST_PACKAGE", "")
@@ -597,6 +606,7 @@ def update_expected_environment_variables(env: dict[str, str]) -> None:
     set_value_to_default_if_not_set(env, "TEST_TYPE", "")
     set_value_to_default_if_not_set(env, "TEST_TIMEOUT", "60")
     set_value_to_default_if_not_set(env, "UPGRADE_BOTO", "false")
+    set_value_to_default_if_not_set(env, "DOWNGRADE_SQLALCHEMY", "false")
     set_value_to_default_if_not_set(env, "UPGRADE_TO_NEWER_DEPENDENCIES", "false")
     set_value_to_default_if_not_set(env, "USE_PACKAGES_FROM_DIST", "false")
     set_value_to_default_if_not_set(env, "VERBOSE", "false")
@@ -644,6 +654,7 @@ def update_expected_environment_variables(env: dict[str, str]) -> None:
     "SQLITE_URL": "sqlite_url",
     "START_AIRFLOW": "start_airflow",
     "UPGRADE_BOTO": "upgrade_boto",
+    "DOWNGRADE_SQLALCHEMY": "downgrade_sqlalchemy",
     "USE_AIRFLOW_VERSION": "use_airflow_version",
     "USE_PACKAGES_FROM_DIST": "use_packages_from_dist",
     "VERSION_SUFFIX_FOR_PYPI": "version_suffix_for_pypi",
@@ -705,6 +716,8 @@ def prepare_broker_url(params, env_variables):
 def perform_environment_checks():
     check_docker_is_running()
     check_docker_version()
+    if is_docker_rootless():
+        os.environ["DOCKER_IS_ROOTLESS"] = "true"
     check_docker_compose_version()
 
 
@@ -722,7 +735,7 @@ def warm_up_docker_builder(image_params: CommonBuildParams):
         return
     docker_syntax = get_docker_syntax_version()
     get_console().print(f"[info]Warming up the {docker_context} builder for syntax: {docker_syntax}")
-    warm_up_image_param = deepcopy(image_params)
+    warm_up_image_param = copy.deepcopy(image_params)
     warm_up_image_param.image_tag = "warmup"
     warm_up_image_param.push = False
     build_command = prepare_base_build_command(image_params=warm_up_image_param)
@@ -804,23 +817,36 @@ def autodetect_docker_context():
 
     :return: name of the docker context to use
     """
-    output = run_command(["docker", "context", "ls", "-q"], capture_output=True, check=False, text=True)
-    if output.returncode != 0:
+    result = run_command(
+        ["docker", "context", "ls", "--format=json"],
+        capture_output=True,
+        check=False,
+        text=True,
+    )
+    if result.returncode != 0:
         get_console().print("[warning]Could not detect docker builder. Using default.[/]")
         return "default"
-    context_list = output.stdout.splitlines()
-    if len(context_list) == 0:
+    try:
+        context_dicts = json.loads(result.stdout)
+        if isinstance(context_dicts, dict):
+            context_dicts = [context_dicts]
+    except json.decoder.JSONDecodeError:
+        context_dicts = (json.loads(line) for line in result.stdout.splitlines() if line.strip())
+    known_contexts = {info["Name"]: info for info in context_dicts}
+    if not known_contexts:
         get_console().print("[warning]Could not detect docker builder. Using default.[/]")
         return "default"
-    if len(context_list) == 1:
-        get_console().print(f"[info]Using {context_list[0]} as context.[/]")
-        return context_list[0]
-    if len(context_list) > 1:
-        for preferred_context in PREFERRED_CONTEXTS:
-            if preferred_context in context_list:
-                get_console().print(f"[info]Using {preferred_context} as context.[/]")
-                return preferred_context
-    fallback_context = context_list[0]
+    for preferred_context_name in PREFERRED_CONTEXTS:
+        try:
+            context = known_contexts[preferred_context_name]
+        except KeyError:
+            continue
+        # On Windows, some contexts are used for WSL2. We don't want to use those.
+        if context["DockerEndpoint"] == "npipe:////./pipe/dockerDesktopLinuxEngine":
+            continue
+        get_console().print(f"[info]Using {preferred_context_name} as context.[/]")
+        return preferred_context_name
+    fallback_context = next(iter(known_contexts))
     get_console().print(
         f"[warning]Could not use any of the preferred docker contexts {PREFERRED_CONTEXTS}.\n"
         f"Using {fallback_context} as context.[/]"
diff --git a/dev/breeze/src/airflow_breeze/utils/github.py b/dev/breeze/src/airflow_breeze/utils/github.py
index 59982c2d04697..0ec410889c32b 100644
--- a/dev/breeze/src/airflow_breeze/utils/github.py
+++ b/dev/breeze/src/airflow_breeze/utils/github.py
@@ -100,7 +100,7 @@ def get_active_airflow_versions(confirm: bool = True) -> list[str]:
         match = ACTIVE_TAG_MATCH.match(tag)
         if match and match.group(1) == "2":
             all_active_tags.append(tag)
-    airflow_versions = sorted(all_active_tags, key=lambda x: Version(x))
+    airflow_versions = sorted(all_active_tags, key=Version)
     if confirm:
         get_console().print(f"All Airflow 2 versions: {all_active_tags}")
         answer = user_confirm(
diff --git a/dev/breeze/src/airflow_breeze/utils/parallel.py b/dev/breeze/src/airflow_breeze/utils/parallel.py
index 70f5ec737eecb..22036cc359f01 100644
--- a/dev/breeze/src/airflow_breeze/utils/parallel.py
+++ b/dev/breeze/src/airflow_breeze/utils/parallel.py
@@ -357,7 +357,7 @@ def print_async_summary(completed_list: list[ApplyResult]) -> None:
 
 def get_completed_result_list(results: list[ApplyResult]) -> list[ApplyResult]:
     """Return completed results from the list."""
-    return list(filter(lambda result: result.ready(), results))
+    return [result for result in results if result.ready()]
 
 
 class SummarizeAfter(Enum):
diff --git a/dev/breeze/src/airflow_breeze/utils/run_utils.py b/dev/breeze/src/airflow_breeze/utils/run_utils.py
index 133e512347e44..f792631d8b307 100644
--- a/dev/breeze/src/airflow_breeze/utils/run_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/run_utils.py
@@ -97,7 +97,7 @@ def exclude_command(_index: int, _arg: str) -> bool:
             return False
         if _arg.startswith("-"):
             return True
-        if len(_arg) == 0:
+        if not _arg:
             return True
         if _arg.startswith("/"):
             # Skip any absolute paths
@@ -361,10 +361,7 @@ def commit_sha():
 
 def filter_out_none(**kwargs) -> dict:
     """Filters out all None values from parameters passed."""
-    for key in list(kwargs):
-        if kwargs[key] is None:
-            kwargs.pop(key)
-    return kwargs
+    return {key: val for key, val in kwargs.items() if val is not None}
 
 
 def check_if_image_exists(image: str) -> bool:
diff --git a/dev/breeze/src/airflow_breeze/utils/selective_checks.py b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
index 18e8bafa1c644..a60a4d1fdc2dd 100644
--- a/dev/breeze/src/airflow_breeze/utils/selective_checks.py
+++ b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
@@ -275,7 +275,7 @@ def find_all_providers_affected(
             get_console().print(
                 "[info]This PR had `allow suspended provider changes` label set so it will continue"
             )
-    if len(all_providers) == 0:
+    if not all_providers:
         return None
     for provider in list(all_providers):
         all_providers.update(
@@ -356,7 +356,7 @@ def full_tests_needed(self) -> bool:
         if self._github_event in [GithubEvents.PUSH, GithubEvents.SCHEDULE, GithubEvents.WORKFLOW_DISPATCH]:
             get_console().print(f"[warning]Full tests needed because event is {self._github_event}[/]")
             return True
-        if len(self._matching_files(FileGroupForCi.ENVIRONMENT_FILES, CI_FILE_GROUP_MATCHES)) > 0:
+        if self._matching_files(FileGroupForCi.ENVIRONMENT_FILES, CI_FILE_GROUP_MATCHES):
             get_console().print("[warning]Running everything because env files changed[/]")
             return True
         if FULL_TESTS_NEEDED_LABEL in self._pr_labels:
@@ -496,7 +496,7 @@ def _should_be_run(self, source_area: FileGroupForCi) -> bool:
             get_console().print(f"[warning]{source_area} enabled because we are running everything[/]")
             return True
         matched_files = self._matching_files(source_area, CI_FILE_GROUP_MATCHES)
-        if len(matched_files) > 0:
+        if matched_files:
             get_console().print(
                 f"[warning]{source_area} enabled because it matched {len(matched_files)} changed files[/]"
             )
@@ -621,7 +621,7 @@ def _get_test_types_to_run(self) -> list[str]:
             get_console().print(
                 "[warning]There are no core/other files. Only tests relevant to the changed files are run.[/]"
             )
-        sorted_candidate_test_types = list(sorted(candidate_test_types))
+        sorted_candidate_test_types = sorted(candidate_test_types)
         get_console().print("[warning]Selected test type candidates to run:[/]")
         get_console().print(sorted_candidate_test_types)
         return sorted_candidate_test_types
@@ -676,20 +676,9 @@ def parallel_test_types_list_as_string(self) -> str | None:
 
         # this should be hard-coded as we want to have very specific sequence of tests
         sorting_order = ["Core", "Providers[-amazon,google]", "Other", "Providers[amazon]", "WWW"]
-
-        def sort_key(t: str) -> str:
-            # Put the test types in the order we want them to run
-            if t in sorting_order:
-                return str(sorting_order.index(t))
-            else:
-                return str(len(sorting_order)) + t
-
-        return " ".join(
-            sorted(
-                current_test_types,
-                key=sort_key,
-            )
-        )
+        sort_key = {item: i for i, item in enumerate(sorting_order)}
+        # Put the test types in the order we want them to run
+        return " ".join(sorted(current_test_types, key=lambda x: (sort_key.get(x, len(sorting_order)), x)))
 
     @cached_property
     def basic_checks_only(self) -> bool:
@@ -725,15 +714,13 @@ def docs_filter_list_as_string(self) -> str | None:
         ):
             return _ALL_DOCS_LIST
         packages = []
-        if any(
-            [file.startswith("airflow/") or file.startswith("docs/apache-airflow/") for file in self._files]
-        ):
+        if any(file.startswith(("airflow/", "docs/apache-airflow/")) for file in self._files):
             packages.append("apache-airflow")
-        if any([file.startswith("docs/apache-airflow-providers/") for file in self._files]):
+        if any(file.startswith("docs/apache-airflow-providers/") for file in self._files):
             packages.append("apache-airflow-providers")
-        if any([file.startswith("chart/") or file.startswith("docs/helm-chart") for file in self._files]):
+        if any(file.startswith(("chart/", "docs/helm-chart")) for file in self._files):
             packages.append("helm-chart")
-        if any([file.startswith("docs/docker-stack/") for file in self._files]):
+        if any(file.startswith("docs/docker-stack/") for file in self._files):
             packages.append("docker-stack")
         if providers_affected:
             for provider in providers_affected:
diff --git a/dev/breeze/src/airflow_breeze/utils/suspended_providers.py b/dev/breeze/src/airflow_breeze/utils/suspended_providers.py
index df849129c210d..19db6381d95f0 100644
--- a/dev/breeze/src/airflow_breeze/utils/suspended_providers.py
+++ b/dev/breeze/src/airflow_breeze/utils/suspended_providers.py
@@ -27,7 +27,7 @@ def get_suspended_providers_folders() -> list[str]:
     skipped when running tests (without any prefix - for example apache/beam, yandex, google etc.).
     """
     suspended_providers = []
-    for provider_path in AIRFLOW_PROVIDERS_ROOT.glob("**/provider.yaml"):
+    for provider_path in AIRFLOW_PROVIDERS_ROOT.rglob("provider.yaml"):
         provider_yaml = yaml.safe_load(provider_path.read_text())
         if provider_yaml.get("suspended"):
             suspended_providers.append(
@@ -43,7 +43,7 @@ def get_suspended_provider_ids() -> list[str]:
     Yields the ids of suspended providers.
     """
     suspended_provider_ids = []
-    for provider_path in AIRFLOW_PROVIDERS_ROOT.glob("**/provider.yaml"):
+    for provider_path in AIRFLOW_PROVIDERS_ROOT.rglob("provider.yaml"):
         provider_yaml = yaml.safe_load(provider_path.read_text())
         if provider_yaml.get("suspended"):
             suspended_provider_ids.append(
diff --git a/dev/breeze/tests/test_docker_command_utils.py b/dev/breeze/tests/test_docker_command_utils.py
index 83081ad770668..00749ccbc01ad 100644
--- a/dev/breeze/tests/test_docker_command_utils.py
+++ b/dev/breeze/tests/test_docker_command_utils.py
@@ -36,7 +36,9 @@ def test_check_docker_version_unknown(
     mock_get_console, mock_run_command, mock_check_docker_permission_denied
 ):
     mock_check_docker_permission_denied.return_value = False
-    check_docker_version()
+    with pytest.raises(SystemExit) as e:
+        check_docker_version()
+    assert e.value.code == 1
     expected_run_command_calls = [
         call(
             ["docker", "version", "--format", "{{.Client.Version}}"],
@@ -51,7 +53,7 @@ def test_check_docker_version_unknown(
     mock_get_console.return_value.print.assert_called_with(
         """
 [warning]Your version of docker is unknown. If the scripts fail, please make sure to[/]
-[warning]install docker at least: 20.10.0 version.[/]
+[warning]install docker at least: 23.0.0 version.[/]
 """
     )
 
@@ -65,7 +67,9 @@ def test_check_docker_version_too_low(
     mock_check_docker_permission_denied.return_value = False
     mock_run_command.return_value.returncode = 0
     mock_run_command.return_value.stdout = "0.9"
-    check_docker_version()
+    with pytest.raises(SystemExit) as e:
+        check_docker_version()
+    assert e.value.code == 1
     mock_check_docker_permission_denied.assert_called()
     mock_run_command.assert_called_with(
         ["docker", "version", "--format", "{{.Client.Version}}"],
@@ -77,7 +81,8 @@ def test_check_docker_version_too_low(
     )
     mock_get_console.return_value.print.assert_called_with(
         """
-[warning]Your version of docker is too old:0.9.\nPlease upgrade to at least 20.10.0[/]
+[error]Your version of docker is too old: 0.9.\n[/]\n[warning]Please upgrade to at least 23.0.0.\n[/]\n\
+You can find installation instructions here: https://docs.docker.com/engine/install/
 """
     )
 
@@ -88,7 +93,7 @@ def test_check_docker_version_too_low(
 def test_check_docker_version_ok(mock_get_console, mock_run_command, mock_check_docker_permission_denied):
     mock_check_docker_permission_denied.return_value = False
     mock_run_command.return_value.returncode = 0
-    mock_run_command.return_value.stdout = "20.10.0"
+    mock_run_command.return_value.stdout = "23.0.0"
     check_docker_version()
     mock_check_docker_permission_denied.assert_called()
     mock_run_command.assert_called_with(
@@ -99,7 +104,7 @@ def test_check_docker_version_ok(mock_get_console, mock_run_command, mock_check_
         check=False,
         dry_run_override=False,
     )
-    mock_get_console.return_value.print.assert_called_with("[success]Good version of Docker: 20.10.0.[/]")
+    mock_get_console.return_value.print.assert_called_with("[success]Good version of Docker: 23.0.0.[/]")
 
 
 @mock.patch("airflow_breeze.utils.docker_command_utils.check_docker_permission_denied")
@@ -108,7 +113,7 @@ def test_check_docker_version_ok(mock_get_console, mock_run_command, mock_check_
 def test_check_docker_version_higher(mock_get_console, mock_run_command, mock_check_docker_permission_denied):
     mock_check_docker_permission_denied.return_value = False
     mock_run_command.return_value.returncode = 0
-    mock_run_command.return_value.stdout = "21.10.0"
+    mock_run_command.return_value.stdout = "24.0.0"
     check_docker_version()
     mock_check_docker_permission_denied.assert_called()
     mock_run_command.assert_called_with(
@@ -119,13 +124,15 @@ def test_check_docker_version_higher(mock_get_console, mock_run_command, mock_ch
         check=False,
         dry_run_override=False,
     )
-    mock_get_console.return_value.print.assert_called_with("[success]Good version of Docker: 21.10.0.[/]")
+    mock_get_console.return_value.print.assert_called_with("[success]Good version of Docker: 24.0.0.[/]")
 
 
 @mock.patch("airflow_breeze.utils.docker_command_utils.run_command")
 @mock.patch("airflow_breeze.utils.docker_command_utils.get_console")
 def test_check_docker_compose_version_unknown(mock_get_console, mock_run_command):
-    check_docker_compose_version()
+    with pytest.raises(SystemExit) as e:
+        check_docker_compose_version()
+    assert e.value.code == 1
     expected_run_command_calls = [
         call(
             ["docker", "compose", "version"],
@@ -138,8 +145,9 @@ def test_check_docker_compose_version_unknown(mock_get_console, mock_run_command
     mock_run_command.assert_has_calls(expected_run_command_calls)
     mock_get_console.return_value.print.assert_called_with(
         """
-[warning]Unknown docker-compose version. At least 1.29 is needed![/]
-[warning]If Breeze fails upgrade to latest available docker-compose version.[/]
+[error]Unknown docker-compose version.[/]\n[warning]At least 2.14.0 needed! Please upgrade!\n[/]
+See https://docs.docker.com/compose/install/ for installation instructions.\n
+Make sure docker-compose you install is first on the PATH variable of yours.\n
 """
     )
 
@@ -149,7 +157,9 @@ def test_check_docker_compose_version_unknown(mock_get_console, mock_run_command
 def test_check_docker_compose_version_low(mock_get_console, mock_run_command):
     mock_run_command.return_value.returncode = 0
     mock_run_command.return_value.stdout = "1.28.5"
-    check_docker_compose_version()
+    with pytest.raises(SystemExit) as e:
+        check_docker_compose_version()
+    assert e.value.code == 1
     mock_run_command.assert_called_with(
         ["docker", "compose", "version"],
         no_output_dump_on_exception=True,
@@ -157,27 +167,21 @@ def test_check_docker_compose_version_low(mock_get_console, mock_run_command):
         text=True,
         dry_run_override=False,
     )
-    expected_print_calls = [
-        call(
-            """
-[warning]You have too old version of docker-compose: 1.28.5! At least 1.29 needed! Please upgrade!
-"""
-        ),
-        call(
-            """
-See https://docs.docker.com/compose/install/ for instructions.
-Make sure docker-compose you install is first on the PATH variable of yours.
+    mock_get_console.return_value.print.assert_called_with(
+        """
+[error]You have too old version of docker-compose: 1.28.5!\n[/]
+[warning]At least 2.14.0 needed! Please upgrade!\n[/]
+See https://docs.docker.com/compose/install/ for installation instructions.\n
+Make sure docker-compose you install is first on the PATH variable of yours.\n
 """
-        ),
-    ]
-    mock_get_console.return_value.print.assert_has_calls(expected_print_calls)
+    )
 
 
 @mock.patch("airflow_breeze.utils.docker_command_utils.run_command")
 @mock.patch("airflow_breeze.utils.docker_command_utils.get_console")
 def test_check_docker_compose_version_ok(mock_get_console, mock_run_command):
     mock_run_command.return_value.returncode = 0
-    mock_run_command.return_value.stdout = "1.29.0"
+    mock_run_command.return_value.stdout = "2.14.0"
     check_docker_compose_version()
     mock_run_command.assert_called_with(
         ["docker", "compose", "version"],
@@ -187,23 +191,53 @@ def test_check_docker_compose_version_ok(mock_get_console, mock_run_command):
         dry_run_override=False,
     )
     mock_get_console.return_value.print.assert_called_with(
-        "[success]Good version of docker-compose: 1.29.0[/]"
+        "[success]Good version of docker-compose: 2.14.0[/]"
     )
 
 
+def _fake_ctx_output(*names: str) -> str:
+    return "\n".join(json.dumps({"Name": name, "DockerEndpoint": f"unix://{name}"}) for name in names)
+
+
 @pytest.mark.parametrize(
     "context_output, selected_context, console_output",
     [
         (
+            _fake_ctx_output("default"),
             "default",
+            "[info]Using default as context",
+        ),
+        ("\n", "default", "[warning]Could not detect docker builder"),
+        (
+            _fake_ctx_output("a", "b"),
+            "a",
+            "[warning]Could not use any of the preferred docker contexts",
+        ),
+        (
+            _fake_ctx_output("a", "desktop-linux"),
+            "desktop-linux",
+            "[info]Using desktop-linux as context",
+        ),
+        (
+            _fake_ctx_output("a", "default"),
             "default",
             "[info]Using default as context",
         ),
-        ("", "default", "[warning]Could not detect docker builder"),
-        ("a\nb", "a", "[warning]Could not use any of the preferred docker contexts"),
-        ("a\ndesktop-linux", "desktop-linux", "[info]Using desktop-linux as context"),
-        ("a\ndefault", "default", "[info]Using default as context"),
-        ("a\ndefault\ndesktop-linux", "desktop-linux", "[info]Using desktop-linux as context"),
+        (
+            _fake_ctx_output("a", "default", "desktop-linux"),
+            "desktop-linux",
+            "[info]Using desktop-linux as context",
+        ),
+        (
+            _fake_ctx_output("a", "default", "desktop-linux"),
+            "desktop-linux",
+            "[info]Using desktop-linux as context",
+        ),
+        (
+            '[{"Name": "desktop-linux", "DockerEndpoint": "unix://desktop-linux"}]',
+            "desktop-linux",
+            "[info]Using desktop-linux as context",
+        ),
     ],
 )
 def test_autodetect_docker_context(context_output: str, selected_context: str, console_output: str):
diff --git a/dev/breeze/tests/test_exclude_from_matrix.py b/dev/breeze/tests/test_exclude_from_matrix.py
index 7280e0dd550ac..d5721fc949a40 100644
--- a/dev/breeze/tests/test_exclude_from_matrix.py
+++ b/dev/breeze/tests/test_exclude_from_matrix.py
@@ -43,4 +43,4 @@ def test_exclude_from_matrix(
     exclusion_list = excluded_combos(list_1, list_2)
     assert representative_list == expected_representative_list
     assert len(representative_list) == len(list_1) * len(list_2) - len(exclusion_list)
-    assert len(set(representative_list) & set(exclusion_list)) == 0
+    assert not set(representative_list).intersection(exclusion_list)
diff --git a/dev/breeze/tests/test_global_constants.py b/dev/breeze/tests/test_global_constants.py
index f9878f7914423..ee0f72888ef1f 100644
--- a/dev/breeze/tests/test_global_constants.py
+++ b/dev/breeze/tests/test_global_constants.py
@@ -16,12 +16,12 @@
 # under the License.
 from __future__ import annotations
 
-from airflow_breeze.global_constants import get_available_documentation_provider_packages
+from airflow_breeze.global_constants import get_available_documentation_packages
 
 AVAILABLE_PACKAGES_STARTING_LIST = ("apache-airflow", "helm-chart", "docker-stack")
 
 
 def test_get_available_packages():
-    assert len(get_available_documentation_provider_packages()) > 70
-    for package in get_available_documentation_provider_packages():
+    assert len(get_available_documentation_packages()) > 70
+    for package in get_available_documentation_packages():
         assert package.startswith(AVAILABLE_PACKAGES_STARTING_LIST)
diff --git a/dev/check_files.py b/dev/check_files.py
index f50875cc015c5..e1fb029af724d 100644
--- a/dev/check_files.py
+++ b/dev/check_files.py
@@ -65,7 +65,7 @@ def get_packages() -> list[tuple[str, str]]:
     # e.g. https://pypi.org/project/apache-airflow-providers-airbyte/3.1.0rc1/
 
     packages = []
-    for line in content.split("\n"):
+    for line in content.splitlines():
         if not line:
             continue
         name, version = line.rstrip("/").split("/")[-2:]
diff --git a/dev/example_dags/update_example_dags_paths.py b/dev/example_dags/update_example_dags_paths.py
index 36eea37158053..265a9e98e9fbb 100755
--- a/dev/example_dags/update_example_dags_paths.py
+++ b/dev/example_dags/update_example_dags_paths.py
@@ -102,19 +102,17 @@ def find_matches(_file: Path, provider: str, version: str):
 
 if __name__ == "__main__":
     curdir: Path = Path(os.curdir).resolve()
-    dirs: list[Path] = list(filter(os.path.isdir, curdir.iterdir()))
+    dirs: list[Path] = [p for p in curdir.iterdir() if p.is_dir()]
     with Progress(console=console) as progress:
         task = progress.add_task(f"Updating {len(dirs)}", total=len(dirs))
         for directory in dirs:
             if directory.name.startswith("apache-airflow-providers-"):
                 provider = directory.name[len("apache-airflow-providers-") :]
                 console.print(f"[bright_blue] Processing {directory}")
-                version_dirs = list(filter(os.path.isdir, directory.iterdir()))
-                for version_dir in version_dirs:
-                    version = version_dir.name
-                    console.print(version)
-                    for file in version_dir.rglob("*.html"):
-                        candidate_file = file
-                        if candidate_file.exists():
-                            find_matches(candidate_file, provider, version)
+                for version_dir in directory.iterdir():
+                    if version_dir.is_dir():
+                        console.print(version_dir.name)
+                        for candidate_file in version_dir.rglob("*.html"):
+                            if candidate_file.exists():
+                                find_matches(candidate_file, provider, version_dir.name)
             progress.advance(task)
diff --git a/dev/prepare_release_issue.py b/dev/prepare_release_issue.py
index de50e910ebfb2..9417600e20585 100755
--- a/dev/prepare_release_issue.py
+++ b/dev/prepare_release_issue.py
@@ -169,7 +169,7 @@ def get_changes(
         cwd=SOURCE_DIR_PATH,
         text=True,
     )
-    return [get_change_from_line(line) for line in change_strings.split("\n")]
+    return [get_change_from_line(line) for line in change_strings.splitlines()]
 
 
 def render_template(
@@ -301,7 +301,7 @@ def generate_issue_content(
             # GitHub does not have linked issues in PR - but we quite rigorously add Fixes/Closes
             # Relate so we can find those from the body
             if pr.body:
-                body = pr.body.replace("\n", " ").replace("\r", " ")
+                body = " ".join(pr.body.splitlines())
                 linked_issue_numbers = {
                     int(issue_match.group(1)) for issue_match in ISSUE_MATCH_IN_BODY.finditer(body)
                 }
diff --git a/dev/provider_packages/prepare_provider_packages.py b/dev/provider_packages/prepare_provider_packages.py
index f9cff84e1945e..8919acb84c063 100755
--- a/dev/provider_packages/prepare_provider_packages.py
+++ b/dev/provider_packages/prepare_provider_packages.py
@@ -26,6 +26,7 @@
 import json
 import logging
 import os
+import random
 import re
 import shutil
 import subprocess
@@ -37,9 +38,7 @@
 from datetime import datetime, timedelta
 from enum import Enum
 from functools import lru_cache
-from os.path import dirname, relpath
 from pathlib import Path
-from random import choice
 from shutil import copyfile
 from typing import Any, Generator, Iterable, NamedTuple
 
@@ -261,7 +260,7 @@ def get_target_folder() -> str:
 
     :return: the folder path
     """
-    return os.path.abspath(os.path.join(dirname(__file__), os.pardir, os.pardir, "provider_packages"))
+    return os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, "provider_packages"))
 
 
 def get_target_providers_folder() -> str:
@@ -483,7 +482,7 @@ def convert_git_changes_to_table(
     """
     from tabulate import tabulate
 
-    lines = changes.split("\n")
+    lines = changes.splitlines()
     headers = ["Commit", "Committed", "Subject"]
     table_data = []
     changes_list: list[Change] = []
@@ -1058,7 +1057,7 @@ def get_all_changes_for_package(
     changes_table += changes_table_for_version
     if verbose:
         print_changes_table(changes_table)
-    return True, list_of_list_of_changes if len(list_of_list_of_changes) > 0 else None, changes_table
+    return True, list_of_list_of_changes or None, changes_table
 
 
 def get_provider_details(provider_package_id: str) -> ProviderPackageDetails:
@@ -1156,7 +1155,7 @@ def get_provider_jinja_context(
         "PIP_REQUIREMENTS_TABLE": pip_requirements_table,
         "PIP_REQUIREMENTS_TABLE_RST": pip_requirements_table_rst,
         "PROVIDER_INFO": provider_info,
-        "CHANGELOG_RELATIVE_PATH": relpath(
+        "CHANGELOG_RELATIVE_PATH": os.path.relpath(
             provider_details.source_provider_package_path,
             provider_details.documentation_provider_package_path,
         ),
@@ -1216,7 +1215,7 @@ def get_type_of_changes(answer: str | None) -> TypeOfChange:
     given_answer = ""
     if answer and answer.lower() in ["yes", "y"]:
         # Simulate all possible non-terminal answers
-        return choice(
+        return random.choice(
             [
                 TypeOfChange.DOCUMENTATION,
                 TypeOfChange.BUGFIX,
@@ -1337,7 +1336,7 @@ def update_release_notes(
         version_suffix=version_suffix,
     )
     jinja_context["DETAILED_CHANGES_RST"] = changes
-    jinja_context["DETAILED_CHANGES_PRESENT"] = len(changes) > 0
+    jinja_context["DETAILED_CHANGES_PRESENT"] = bool(changes)
     update_changelog_rst(
         jinja_context,
         provider_package_id,
diff --git a/dev/provider_packages/publish_provider_documentation.sh b/dev/provider_packages/publish_provider_documentation.sh
index bf8eaca1fb577..0616a824905a8 100755
--- a/dev/provider_packages/publish_provider_documentation.sh
+++ b/dev/provider_packages/publish_provider_documentation.sh
@@ -30,4 +30,6 @@ done
 
 breeze build-docs "${provider_filters[@]}"
 
+breeze release-management add-back-references "${@}"
+
 cd "${AIRFLOW_SITE_DIRECTORY}"
diff --git a/dev/stats/calculate_statistics_provider_testing_issues.py b/dev/stats/calculate_statistics_provider_testing_issues.py
index 7172c2beefdb9..ba570b6f37905 100755
--- a/dev/stats/calculate_statistics_provider_testing_issues.py
+++ b/dev/stats/calculate_statistics_provider_testing_issues.py
@@ -78,7 +78,7 @@ class Stats:
     users_commented: set[str]
 
     def percent_tested(self) -> int:
-        return int(100.0 * self.tested_issues / self.num_issues)
+        return 100 * self.tested_issues // self.num_issues
 
     def num_involved_users_who_commented(self) -> int:
         return len(self.users_involved.intersection(self.users_commented))
@@ -87,7 +87,7 @@ def num_commenting_not_involved(self) -> int:
         return len(self.users_commented - self.users_involved)
 
     def percent_commented_among_involved(self) -> int:
-        return int(100.0 * self.num_involved_users_who_commented() / len(self.users_involved))
+        return 100 * self.num_involved_users_who_commented() // len(self.users_involved)
 
     def __str__(self):
         return (
diff --git a/dev/validate_version_added_fields_in_config.py b/dev/validate_version_added_fields_in_config.py
index d68ce36a0de3a..7ee0fb16b2dcb 100755
--- a/dev/validate_version_added_fields_in_config.py
+++ b/dev/validate_version_added_fields_in_config.py
@@ -114,9 +114,8 @@ def read_local_config_options() -> set[tuple[str, str, str]]:
     computed_option_new_section.update(options)
 
 # 1. Prepare versions to checks
-airflow_version = fetch_pypi_versions()
-airflow_version = sorted(airflow_version, key=semver.VersionInfo.parse)
-to_check_versions: list[str] = [d for d in airflow_version if d.startswith("2.")]
+to_check_versions: list[str] = [d for d in fetch_pypi_versions() if d.startswith("2.")]
+to_check_versions.sort(key=semver.VersionInfo.parse)
 
 # 2. Compute expected options set with version added fields
 expected_computed_options: set[tuple[str, str, str]] = set()
diff --git a/docs/apache-airflow-providers-odbc/connections/odbc.rst b/docs/apache-airflow-providers-odbc/connections/odbc.rst
index 11d382eeb661b..3c53870f8eece 100644
--- a/docs/apache-airflow-providers-odbc/connections/odbc.rst
+++ b/docs/apache-airflow-providers-odbc/connections/odbc.rst
@@ -73,7 +73,7 @@ Extra (optional)
           this config from env vars, use ``AIRFLOW__PROVIDERS_ODBC__ALLOW_DRIVER_IN_EXTRA=true``.
 
     .. note::
-        If setting ``allow_driver_extra``to True, this allows users to set the driver via the Airflow Connection's
+        If setting ``allow_driver_extra`` to True, this allows users to set the driver via the Airflow Connection's
         ``extra`` field.  By default this is not allowed.  If enabling this functionality, you should make sure
         that you trust the users who can edit connections in the UI to not use it maliciously.
 
diff --git a/docs/apache-airflow/administration-and-deployment/cluster-policies.rst b/docs/apache-airflow/administration-and-deployment/cluster-policies.rst
index c664d0b5037c9..de99113231dfc 100644
--- a/docs/apache-airflow/administration-and-deployment/cluster-policies.rst
+++ b/docs/apache-airflow/administration-and-deployment/cluster-policies.rst
@@ -67,8 +67,6 @@ There are two ways to configure cluster policies:
 
    .. versionadded:: 2.6
 
-   .. note:: |experimental|
-
    This method is more advanced and for people who are already comfortable with python packaging.
 
    First create your policy function in a module:
diff --git a/docs/apache-airflow/administration-and-deployment/listeners.rst b/docs/apache-airflow/administration-and-deployment/listeners.rst
index 2847eb514d0fd..4182d135a1476 100644
--- a/docs/apache-airflow/administration-and-deployment/listeners.rst
+++ b/docs/apache-airflow/administration-and-deployment/listeners.rst
@@ -31,6 +31,15 @@ Lifecycle Events
 
 Lifecycle events allow you to react to start and stop events for an Airflow ``Job``, like  ``SchedulerJob`` or ``BackfillJob``.
 
+DagRun State Change Events
+--------------------------
+
+- ``on_dag_run_running``
+- ``on_dag_run_success``
+- ``on_dag_run_failed``
+
+DagRun state change events occur when a ``DagRun`` changes state.
+
 TaskInstance State Change Events
 --------------------------------
 
diff --git a/docs/apache-airflow/administration-and-deployment/logging-monitoring/metrics.rst b/docs/apache-airflow/administration-and-deployment/logging-monitoring/metrics.rst
index f8eee430f47d4..ec4558baf88a9 100644
--- a/docs/apache-airflow/administration-and-deployment/logging-monitoring/metrics.rst
+++ b/docs/apache-airflow/administration-and-deployment/logging-monitoring/metrics.rst
@@ -231,7 +231,7 @@ Name                                                Description
 ``dag.<dag_id>.<task_id>.queued_duration``          Seconds a task spends in the Queued state, before being Running
 ``dag_processing.last_duration.<dag_file>``         Seconds taken to load the given DAG file
 ``dagrun.duration.success.<dag_id>``                Seconds taken for a DagRun to reach success state
-``dagrun.duration.failed.<dag_id>``                 Milliseconds taken for a DagRun to reach failed state
+``dagrun.duration.failed.<dag_id>``                 Seconds taken for a DagRun to reach failed state
 ``dagrun.schedule_delay.<dag_id>``                  Seconds of delay between the scheduled DagRun
                                                     start date and the actual DagRun start date
 ``scheduler.critical_section_duration``             Milliseconds spent in the critical section of scheduler loop --
diff --git a/docs/apache-airflow/authoring-and-scheduling/datasets.rst b/docs/apache-airflow/authoring-and-scheduling/datasets.rst
index 605635a4e1d08..60268bedff4e6 100644
--- a/docs/apache-airflow/authoring-and-scheduling/datasets.rst
+++ b/docs/apache-airflow/authoring-and-scheduling/datasets.rst
@@ -197,3 +197,42 @@ Notes on schedules
 The ``schedule`` parameter to your DAG can take either a list of datasets to consume or a timetable-based option. The two cannot currently be mixed.
 
 When using datasets, in this first release (v2.4) waiting for all datasets in the list to be updated is the only option when multiple datasets are consumed by a DAG. A later release may introduce more fine-grained options allowing for greater flexibility.
+
+Fetching information from a Triggering Dataset Event
+----------------------------------------------------
+
+A triggered DAG can fetch information from the Dataset that triggered it using the ``triggering_dataset_events`` template or parameter.
+See more at :ref:`templates-ref`.
+
+Example:
+
+.. code-block:: python
+
+    example_snowflake_dataset = Dataset("snowflake://my_db.my_schema.my_table")
+
+    with DAG(dag_id="load_snowflake_data", schedule="@hourly", ...):
+        SQLExecuteQueryOperator(
+            task_id="load", conn_id="snowflake_default", outlets=[example_snowflake_dataset], ...
+        )
+
+    with DAG(dag_id="query_snowflake_data", schedule=[example_snowflake_dataset], ...):
+        SQLExecuteQueryOperator(
+            task_id="query",
+            conn_id="snowflake_default",
+            sql="""
+              SELECT *
+              FROM my_db.my_schema.my_table
+              WHERE "updated_at" >= '{{ (triggering_dataset_events.values() | first | first).source_dag_run.data_interval_start }}'
+              AND "updated_at" < '{{ (triggering_dataset_events.values() | first | first).source_dag_run.data_interval_end }}';
+            """,
+        )
+
+        @task
+        def print_triggering_dataset_events(triggering_dataset_events=None):
+            for dataset, dataset_list in triggering_dataset_events.items():
+                print(dataset, dataset_list, dataset_list[dataset])
+                print(dataset_list[dataset][0].source_dag_run.dag_run_id)
+
+        print_triggering_dataset_events()
+
+Note that this example is using `(.values() | first | first) <https://jinja.palletsprojects.com/en/3.1.x/templates/#jinja-filters.first>`_ to fetch the first of one Dataset given to the DAG, and the first of one DatasetEvent for that Dataset. An implementation may be quite complex if you have multiple Datasets, potentially with multiple DatasetEvents.
diff --git a/docs/apache-airflow/authoring-and-scheduling/timezone.rst b/docs/apache-airflow/authoring-and-scheduling/timezone.rst
index 86ea468534e5d..6475a8abfc3f7 100644
--- a/docs/apache-airflow/authoring-and-scheduling/timezone.rst
+++ b/docs/apache-airflow/authoring-and-scheduling/timezone.rst
@@ -40,6 +40,10 @@ The time zone is set in ``airflow.cfg``. By default it is set to UTC, but you ch
 an arbitrary IANA time zone, e.g. ``Europe/Amsterdam``. It is dependent on ``pendulum``, which is more accurate than ``pytz``.
 Pendulum is installed when you install Airflow.
 
+.. note::
+     Pendulum relies by default on its own timezone database, which is not updated as frequently as the IANA database.
+     You can make Pendulum rely on the system's database by setting the ``PYTZDATA_TZDATADIR`` environment variable
+     to your system's database, e.g. ``/usr/share/zoneinfo``.
 
 Web UI
 ------
diff --git a/docs/apache-airflow/best-practices.rst b/docs/apache-airflow/best-practices.rst
index a150da936c55b..50aa44a57dc90 100644
--- a/docs/apache-airflow/best-practices.rst
+++ b/docs/apache-airflow/best-practices.rst
@@ -23,7 +23,7 @@ Best Practices
 Creating a new DAG is a three-step process:
 
 - writing Python code to create a DAG object,
-- testing if the code meets our expectations,
+- testing if the code meets your expectations,
 - configuring environment dependencies to run your DAG
 
 This tutorial will introduce you to the best practices for these three steps.
diff --git a/docs/apache-airflow/configurations-ref.rst b/docs/apache-airflow/configurations-ref.rst
index c92a9975e3580..6f4a5b1d62e15 100644
--- a/docs/apache-airflow/configurations-ref.rst
+++ b/docs/apache-airflow/configurations-ref.rst
@@ -42,6 +42,7 @@ in the provider's documentation. The pre-installed providers that you may want t
 * :doc:`Configuration Reference for IMAP Provider <apache-airflow-providers-imap:configurations-ref>`
 * :doc:`Configuration Reference for OpenLineage Provider <apache-airflow-providers-openlineage:configurations-ref>`
 * :doc:`Configuration Reference for Elasticsearch Provider <apache-airflow-providers-elasticsearch:configurations-ref>`
+* :doc:`Configuration Reference for Amazon Provider <apache-airflow-providers-amazon:configurations-ref>`
 
 .. note::
     For more information see :doc:`/howto/set-config`.
diff --git a/docs/apache-airflow/core-concepts/params.rst b/docs/apache-airflow/core-concepts/params.rst
index 4159231505b5b..e5bf04ae62343 100644
--- a/docs/apache-airflow/core-concepts/params.rst
+++ b/docs/apache-airflow/core-concepts/params.rst
@@ -21,8 +21,9 @@ Params
 ======
 
 Params enable you to provide runtime configuration to tasks. You can configure default Params in your DAG
-code and supply additional Params, or overwrite Param values, at runtime when you trigger a DAG. Param values
-are validated with JSON Schema. For scheduled DAG runs, default Param values are used.
+code and supply additional Params, or overwrite Param values, at runtime when you trigger a DAG.
+:class:`~airflow.models.param.Param` values are validated with JSON Schema. For scheduled DAG runs,
+default :class:`~airflow.models.param.Param` values are used.
 
 Also defined Params are used to render a nice UI when triggering manually.
 When you trigger a DAG manually, you can modify its Params before the dagrun starts.
@@ -98,7 +99,7 @@ You can change this by setting ``render_template_as_native_obj=True`` while init
     ):
 
 
-This way, the Param's type is respected when it's provided to your task:
+This way, the :class:`~airflow.models.param.Param`'s type is respected when it's provided to your task:
 
 .. code-block::
 
@@ -130,7 +131,7 @@ Another way to access your param is via a task's ``context`` kwarg.
 JSON Schema Validation
 ----------------------
 
-:class:`~airflow.modules.param.Param` makes use of `JSON Schema <https://json-schema.org/>`_, so you can use the full JSON Schema specifications mentioned at https://json-schema.org/draft/2020-12/json-schema-validation.html to define ``Param`` objects.
+:class:`~airflow.models.param.Param` makes use of `JSON Schema <https://json-schema.org/>`_, so you can use the full JSON Schema specifications mentioned at https://json-schema.org/draft/2020-12/json-schema-validation.html to define ``Param`` objects.
 
 .. code-block::
 
@@ -159,58 +160,151 @@ JSON Schema Validation
     ):
 
 .. note::
-    As of now, for security reasons, one can not use Param objects derived out of custom classes. We are
-    planning to have a registration system for custom Param classes, just like we've for Operator ExtraLinks.
+    As of now, for security reasons, one can not use :class:`~airflow.models.param.Param` objects derived out of custom classes. We are
+    planning to have a registration system for custom :class:`~airflow.models.param.Param` classes, just like we've for Operator ExtraLinks.
 
 Use Params to Provide a Trigger UI Form
 ---------------------------------------
 
 :class:`~airflow.models.dag.DAG` level params are used to render a user friendly trigger form.
-This form is provided when a user clicks on the "Trigger DAG w/ config" button.
+This form is provided when a user clicks on the "Trigger DAG" button.
 
-The Trigger UI Form is rendered based on the pre-defined DAG Prams. If the DAG has no params defined, a JSON entry mask is shown.
-The form elements can be defined with the :class:`~airflow.modules.param.Param` class and attributes define how a form field is displayed.
+The Trigger UI Form is rendered based on the pre-defined DAG Params. If the DAG has no params defined, the trigger form is skipped.
+The form elements can be defined with the :class:`~airflow.models.param.Param` class and attributes define how a form field is displayed.
 
 The following features are supported in the Trigger UI Form:
 
-- Direct scalar values (boolean, int, string, lists, dicts) from top-level DAG params are interpreted and render a corresponding field type.
-  The name of the param is used as label and no further validation is made, all values are treated as optional.
-- If you use the :class:`~airflow.modules.param.Param` class as definition of the param value, the following parameters can be added:
+- Direct scalar values (boolean, int, string, lists, dicts) from top-level DAG params are auto-boxed into :class:`~airflow.models.param.Param` objects.
+  From the native Python data type the ``type`` attribute is auto detected. So these simple types render to a corresponding field type.
+  The name of the parameter is used as label and no further validation is made, all values are treated as optional.
+- If you use the :class:`~airflow.models.param.Param` class as definition of the parameter value, the following attributes can be added:
 
-  - The Param attribute ``title`` is used to render the form field label of the entry box
-  - The Param attribute ``description`` is rendered below an entry field as help text in gray color.
-    Note that if you want to provide HTML tags for special formatting or links you need to use the Param attribute
+  - The :class:`~airflow.models.param.Param` attribute ``title`` is used to render the form field label of the entry box.
+    If no ``title`` is defined the parameter name/key is used instead.
+  - The :class:`~airflow.models.param.Param` attribute ``description`` is rendered below an entry field as help text in gray color.
+    If you want to provide HTML tags for special formatting or links you need to use the Param attribute
     ``description_html``, see tutorial DAG ``example_params_ui_tutorial`` for an example.
-  - The Param attribute ``type`` influences how a field is rendered. The following types are supported:
-
-    - ``string``: Generates a text box to edit text.
-      You can add the parameters ``minLength`` and ``maxLength`` to restrict the text length.
-    - ``number`` or ``integer``: Generates a field which restricts adding numeric values only.
-      You can add the parameters ``minimum`` and ``maximum`` to restrict number range accepted.
-    - ``boolean``: Generates a toggle button to be used as ``True`` or ``False``.
-    - ``date``, ``datetime`` and ``time``: Generate date and/or time picker
-    - ``array``: Generates a HTML multi line text field, every line edited will be made into a string array as value.
-      If you add the attribute ``example`` with a list, a multi-value select option will be generated.
-      If you add the attribute ``items``, a JSON entry field will be generated for more array types
-      and additional type validation as described in
-      `JSON Schema Array Items <https://json-schema.org/understanding-json-schema/reference/array.html#items>`_.
-    - ``object``: Generates a JSON entry field
-    - Note: Per default if you specify a type, a field will be made required with input - because of JSON validation.
-      If you want to have a field value being added optional only, you must allow JSON schema validation allowing null values via:
-      ``type=["null", "string"]``
-
-- The Param attribute ``enum`` generates a drop-down select list for scalar values. As of JSON validation, a value must be selected or
-  the field must be marked as optional explicit.
-- If you want to present proposals for scalar values (not restricting the user to a fixed ``enum`` as above) you can make use of
-  ``examples`` which is a list of items.
-- For select drop-downs generated via ``enum`` or multi-value selects you can add the attribute ``values_display`` with a dict and
-  map data values to display labels.
+  - The :class:`~airflow.models.param.Param` attribute ``type`` influences how a field is rendered. The following types are supported:
+
+      .. list-table::
+        :header-rows: 1
+
+        * - Param type
+          - Form element type
+          - Additional supported attributes
+          - Example
+
+        * - ``string``
+          - Generates a single-line text box to edit text.
+          - * ``minLength``: Minimum text length
+            * ``maxLength``: Maximum text length
+            * | ``format="date"``: Generate a date-picker
+              | with calendar pop-up
+            * | ``format="datetime"``: Generate a date and
+              | time-picker with calendar pop-up
+            * ``format="time"``: Generate a time-picker
+            * | ``enum=["a", "b", "c"]``: Generates a
+              | drop-down select list for scalar values.
+              | As of JSON validation, a value must be
+              | selected or the field must be marked as
+              | optional explicit. See also details inside
+              | the  `JSON Schema Description for Enum <https://json-schema.org/understanding-json-schema/reference/generic.html#enumerated-values>`_.
+            * | ``values_display={"a": "Alpha", "b": "Beta"}``:
+              | For select drop-downs generated via
+              | ``enum`` you can add the attribute
+              | ``values_display`` with a dict and map data
+              | values to display labels.
+            * | ``examples=["One", "Two", "Three"]``: If you
+              | want to present proposals for values
+              | (not restricting the user to a fixed ``enum``
+              | as above) you can make use of ``examples``
+              | which is a list of items.
+
+            | Also see
+            | `further JSON Schema string type validation options <https://json-schema.org/understanding-json-schema/reference/string.html>`_
+            | which are checked before DAG trigger in the backend.
+          - ``Param("default", type="string", maxLength=10)``
+
+            ``Param(f"{datetime.date.today()}", type="string", format="date")``
+
+        * - ``number`` or
+
+            ``integer``
+          - | Generates a field which restricts adding
+            | numeric values only. The HTML browser
+            | typically also adds a spinner on the
+            | right side to increase or decrease the
+            | value. ``integer`` only permits int
+            | numbers, ``number`` allows also
+            | fractional values.
+          - * ``minimum``: Minimum number value
+            * ``maximum``: Maximum number value
+
+            | Also see
+            | `further JSON Schema numeric type validation options <https://json-schema.org/understanding-json-schema/reference/numeric.html>`_
+            | which are checked before DAG trigger in the backend.
+          - ``Param(42, type="integer", minimum=14, multipleOf=7)``
+
+        * - ``boolean``
+          - | Generates a toggle button to be used
+            | as ``True`` or ``False``.
+          - none.
+          - ``Param(True, type="boolean")``
+
+        * - ``array``
+          - | Generates a HTML multi line text field,
+            | every line edited will be made into a
+            | string array as value.
+          - * | If you add the attribute ``examples``
+              | with a list, a multi-value select option
+              | will be generated instead of a free text field.
+            * | ``values_display={"a": "Alpha", "b": "Beta"}``:
+              | For multi-value selects ``examples`` you can add
+              | the attribute ``values_display`` with a dict and
+              | map data values to display labels.
+            * | If you add the attribute ``items``, a JSON entry
+              | field will be generated for more array types and
+              | additional type validation as described in
+              | `JSON Schema Array Items <https://json-schema.org/understanding-json-schema/reference/array.html#items>`_.
+          - ``Param(["a", "b", "c"], type="array")``
+
+            ``Param(["two", "three"], type="array", examples=["one", "two", "three", "four", "five"])``
+
+        * - ``object``
+          - | Generates a JSON entry field with
+            | text validation.
+          - | The HTML form does only validate the syntax of the
+            | JSON input. In order to validate the content for
+            | specific structures take a look to the
+            | `JSON Schema Object details <https://json-schema.org/understanding-json-schema/reference/object.html>`_.
+          - ``Param({"key": "value"}, type=["object", "null"])``
+
+        * - ``null``
+          - | Specifies that no content is expected.
+            | Standalone this does not make much sense
+            | but it is useful for type combinations
+            | like ``type=["null", "string"]`` as the
+            | type attribute also accepts a list of
+            | types.
+
+            | Per default if you specify a type, a
+            | field will be made required with
+            | input - because of JSON validation.
+            | If you want to have a field value being
+            | added optional only, you must allow
+            | JSON schema validation allowing null
+            | values.
+          -
+          - ``Param(None, type=["null", "string"])``
+
+
 - If a form field is left empty, it is passed as ``None`` value to the params dict.
-- Form fields are rendered in the order of definition.
-- If you want to add sections to the Form, add the parameter ``section`` to each field. The text will be used as section label.
+- Form fields are rendered in the order of definition of ``params`` in the DAG.
+- If you want to add sections to the Form, add the attribute ``section`` to each field. The text will be used as section label.
   Fields w/o ``section`` will be rendered in the default area.
   Additional sections will be collapsed per default.
 - If you want to have params not being displayed, use the ``const`` attribute. These Params will be submitted but hidden in the Form.
+  The ``const`` value must match the default value to pass `JSON Schema validation <https://json-schema.org/understanding-json-schema/reference/generic.html#constant-values>`_.
 - On the bottom of the form the generated JSON configuration can be expanded.
   If you want to change values manually, the JSON configuration can be adjusted. Changes are overridden when form fields change.
 - If you want to render custom HTML as form on top of the provided features, you can use the ``custom_html_form`` attribute.
@@ -219,6 +313,11 @@ For examples also please take a look to two example DAGs provided: ``example_par
 
 .. image:: ../img/trigger-dag-tutorial-form.png
 
+.. versionadded:: 2.7.0
+
+The trigger form can also be forced to be displayed also if no params are defined using the configuration switch
+``webserver.show_trigger_form_if_no_params``.
+
 Disabling Runtime Param Modification
 ------------------------------------
 
diff --git a/docs/apache-airflow/core-concepts/tasks.rst b/docs/apache-airflow/core-concepts/tasks.rst
index faafa296543a4..5e305e2fe83e5 100644
--- a/docs/apache-airflow/core-concepts/tasks.rst
+++ b/docs/apache-airflow/core-concepts/tasks.rst
@@ -76,7 +76,6 @@ The possible states for a Task Instance are:
 * ``queued``: The task has been assigned to an Executor and is awaiting a worker
 * ``running``: The task is running on a worker (or on a local/synchronous executor)
 * ``success``: The task finished running without errors
-* ``shutdown``: The task was externally requested to shut down when it was running
 * ``restarting``: The task was externally requested to restart when it was running
 * ``failed``: The task had an error during execution and failed to run
 * ``skipped``: The task was skipped due to branching, LatestOnly, or similar.
diff --git a/docs/apache-airflow/core-concepts/xcoms.rst b/docs/apache-airflow/core-concepts/xcoms.rst
index 8cc3ebaf4b107..b4685b4cb0b09 100644
--- a/docs/apache-airflow/core-concepts/xcoms.rst
+++ b/docs/apache-airflow/core-concepts/xcoms.rst
@@ -25,9 +25,23 @@ XComs (short for "cross-communications") are a mechanism that let :doc:`tasks` t
 
 An XCom is identified by a ``key`` (essentially its name), as well as the ``task_id`` and ``dag_id`` it came from. They can have any (serializable) value, but they are only designed for small amounts of data; do not use them to pass around large values, like dataframes.
 
-XComs are explicitly "pushed" and "pulled" to/from their storage using the ``xcom_push`` and ``xcom_pull`` methods on Task Instances. Many operators will auto-push their results into an XCom key called ``return_value`` if the ``do_xcom_push`` argument is set to ``True`` (as it is by default), and ``@task`` functions do this as well.
+XComs are explicitly "pushed" and "pulled" to/from their storage using the ``xcom_push`` and ``xcom_pull`` methods on Task Instances.
 
-``xcom_pull`` defaults to using this key if no key is passed to it, meaning it's possible to write code like this::
+To push a value within a task called **"task-1"** that will be used by another task:
+
+.. code-block:: python
+
+    # pushes data in any_serializable_value into xcom with key "identifier as string"
+    task_instance.xcom_push(key="identifier as a string", value=any_serializable_value)
+
+To pull the value that was pushed in the code above in a different task:
+
+.. code-block:: python
+
+    # pulls the xcom variable with key "identifier as string" that was pushed from within task-1
+    task_instance.xcom_pull(key="identifier as string", task_ids="task-1")
+
+Many operators will auto-push their results into an XCom key called ``return_value`` if the ``do_xcom_push`` argument is set to ``True`` (as it is by default), and ``@task`` functions do this as well. ``xcom_pull`` defaults to using ``return_value`` as key if no key is passed to it, meaning it's possible to write code like this::
 
     # Pulls the return_value XCOM from "pushing_task"
     value = task_instance.xcom_pull(task_ids='pushing_task')
diff --git a/docs/apache-airflow/deprecated-rest-api-ref.rst b/docs/apache-airflow/deprecated-rest-api-ref.rst
index c0af5b90f6500..276175f97f0eb 100644
--- a/docs/apache-airflow/deprecated-rest-api-ref.rst
+++ b/docs/apache-airflow/deprecated-rest-api-ref.rst
@@ -21,7 +21,7 @@ Deprecated REST API
 .. warning::
 
   This REST API is deprecated since version 2.0. Please consider using the :doc:`stable REST API <stable-rest-api-ref>`.
-  For more information on migration, see `UPDATING.md <https://github.com/apache/airflow/blob/main/UPDATING.md>`_
+  For more information on migration, see `UPDATING.md <https://airflow.apache.org/docs/apache-airflow/stable/howto/upgrading-from-1-10/>`_
 
 Before Airflow 2.0 this REST API was known as the "experimental" API, but now that the :doc:`stable REST API <stable-rest-api-ref>` is available, it has been renamed.
 
diff --git a/docs/apache-airflow/howto/customize-ui.rst b/docs/apache-airflow/howto/customize-ui.rst
index 15b7c94b40397..e72444fcee3f6 100644
--- a/docs/apache-airflow/howto/customize-ui.rst
+++ b/docs/apache-airflow/howto/customize-ui.rst
@@ -43,7 +43,6 @@ following steps:
           "restarting": "violet",
           "running": "#01FF70",
           "scheduled": "tan",
-          "shutdown": "blue",
           "skipped": "darkorchid",
           "success": "#2ECC40",
           "up_for_reschedule": "turquoise",
diff --git a/docs/apache-airflow/howto/operator/file.rst b/docs/apache-airflow/howto/operator/file.rst
index 6ecdfa5f78af1..81077cc25ff4e 100644
--- a/docs/apache-airflow/howto/operator/file.rst
+++ b/docs/apache-airflow/howto/operator/file.rst
@@ -22,7 +22,7 @@
 FileSensor
 ==========
 
-Use the :class:`~airflow.sensors.filesystem.FileSensor` to detect files appearing your local
+Use the :class:`~airflow.sensors.filesystem.FileSensor` to detect files appearing in your local
 filesystem. You need to have connection defined to use it (pass connection id via ``fs_conn_id``).
 Default connection is ``fs_default``.
 
diff --git a/docs/apache-airflow/howto/set-up-database.rst b/docs/apache-airflow/howto/set-up-database.rst
index 870c9edfb21d7..c5cab0a2e5e34 100644
--- a/docs/apache-airflow/howto/set-up-database.rst
+++ b/docs/apache-airflow/howto/set-up-database.rst
@@ -27,14 +27,14 @@ The document below describes the database engine configurations, the necessary c
 Choosing database backend
 -------------------------
 
-If you want to take a real test drive of Airflow, you should consider setting up a database backend to **PostgreSQL**, **MySQL**, or **MSSQL**.
+If you want to take a real test drive of Airflow, you should consider setting up a database backend to **PostgreSQL** or **MySQL**.
 By default, Airflow uses **SQLite**, which is intended for development purposes only.
 
 Airflow supports the following database engine versions, so make sure which version you have. Old versions may not support all SQL statements.
 
 * PostgreSQL: 11, 12, 13, 14, 15
 * MySQL: 5.7, 8
-* MSSQL (Experimental): 2017, 2019
+* MSSQL (Experimental, **Discontinued soon**): 2017, 2019
 * SQLite: 3.15.0+
 
 If you plan on running more than one scheduler, you have to meet additional requirements.
@@ -217,7 +217,7 @@ If you use a current Postgres user with custom search_path, search_path can be c
 
    ALTER USER airflow_user SET search_path = public;
 
-For more information regarding setup of the PostgreSQL connection, see `PostgreSQL dialect <https://docs.sqlalchemy.org/en/13/dialects/postgresql.html>`__ in SQLAlchemy documentation.
+For more information regarding setup of the PostgreSQL connection, see `PostgreSQL dialect <https://docs.sqlalchemy.org/en/14/dialects/postgresql.html>`__ in SQLAlchemy documentation.
 
 .. note::
 
@@ -311,7 +311,7 @@ The connection string in this case should look like:
 
    mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
 
-If you want to use other drivers visit the `MySQL Dialect <https://docs.sqlalchemy.org/en/13/dialects/mysql.html>`__  in SQLAlchemy documentation for more information regarding download
+If you want to use other drivers visit the `MySQL Dialect <https://docs.sqlalchemy.org/en/14/dialects/mysql.html>`__  in SQLAlchemy documentation for more information regarding download
 and setup of the SqlAlchemy connection.
 
 In addition, you also should pay particular attention to MySQL's encoding. Although the ``utf8mb4`` character set is more and more popular for MySQL (actually, ``utf8mb4`` becomes default character set in MySQL8.0), using the ``utf8mb4`` encoding requires additional setting in Airflow 2+ (See more details in `#7570 <https://github.com/apache/airflow/pull/7570>`__.). If you use ``utf8mb4`` as character set, you should also set ``sql_engine_collation_for_ids=utf8mb3_bin``.
@@ -323,6 +323,14 @@ In addition, you also should pay particular attention to MySQL's encoding. Altho
 Setting up a MsSQL Database
 ---------------------------
 
+.. warning::
+
+    After `discussion <https://lists.apache.org/thread/r06j306hldg03g2my1pd4nyjxg78b3h4>`__
+    and a `voting process <https://lists.apache.org/thread/pgcgmhf6560k8jbsmz8nlyoxosvltph2>`__,
+    the Airflow's PMC and Committers have reached a resolution to no longer maintain MsSQL as a supported Database Backend.
+
+    For new Airflow installations, it is advised against using MsSQL as the database backend.
+
 You need to create a database and a database user that Airflow will use to access this database.
 In the example below, a database ``airflow_db`` and user  with username ``airflow_user`` with password ``airflow_pass`` will be created.
 Note, that in case of MsSQL, Airflow uses ``READ COMMITTED`` transaction isolation and it must have
diff --git a/docs/apache-airflow/howto/upgrading-from-1-10/index.rst b/docs/apache-airflow/howto/upgrading-from-1-10/index.rst
index 96dca4e4333c3..ad5723eb3bb52 100644
--- a/docs/apache-airflow/howto/upgrading-from-1-10/index.rst
+++ b/docs/apache-airflow/howto/upgrading-from-1-10/index.rst
@@ -1062,7 +1062,7 @@ Old command                                          New command
 ``airflow flower [-ba, --basic_auth]``               ``airflow celery flower [-A, --basic-auth]``
 ==================================================== ====================================================
 
-For Airflow long option, use [kebab-case](https://en.wikipedia.org/wiki/Letter_case) instead of [snake_case](https://en.wikipedia.org/wiki/Snake_case)
+For Airflow long option, use `kebab-case <https://en.wikipedia.org/wiki/Letter_case>`_ instead of `snake_case <https://en.wikipedia.org/wiki/Snake_case>`_
 
 ================================== ===================================
 Old option                         New option
diff --git a/docs/apache-airflow/img/mapping-simple-graph.png b/docs/apache-airflow/img/mapping-simple-graph.png
index 36ec7f9bc10e7..4bd16876c49e7 100644
Binary files a/docs/apache-airflow/img/mapping-simple-graph.png and b/docs/apache-airflow/img/mapping-simple-graph.png differ
diff --git a/docs/apache-airflow/img/task_lifecycle_diagram.png b/docs/apache-airflow/img/task_lifecycle_diagram.png
index 810942fc74001..2114d7f5d7234 100644
Binary files a/docs/apache-airflow/img/task_lifecycle_diagram.png and b/docs/apache-airflow/img/task_lifecycle_diagram.png differ
diff --git a/docs/apache-airflow/installation/supported-versions.rst b/docs/apache-airflow/installation/supported-versions.rst
index 0482986e376ef..236d46ecb1651 100644
--- a/docs/apache-airflow/installation/supported-versions.rst
+++ b/docs/apache-airflow/installation/supported-versions.rst
@@ -29,7 +29,7 @@ Apache Airflow™ version life cycle:
 =========  =====================  =========  ===============  =================  ================
 Version    Current Patch/Minor    State      First Release    Limited Support    EOL/Terminated
 =========  =====================  =========  ===============  =================  ================
-2          2.7.1                  Supported  Dec 17, 2020     TBD                TBD
+2          2.7.2                  Supported  Dec 17, 2020     TBD                TBD
 1.10       1.10.15                EOL        Aug 27, 2018     Dec 17, 2020       June 17, 2021
 1.9        1.9.0                  EOL        Jan 03, 2018     Aug 27, 2018       Aug 27, 2018
 1.8        1.8.2                  EOL        Mar 19, 2017     Jan 03, 2018       Jan 03, 2018
diff --git a/docs/apache-airflow/public-airflow-interface.rst b/docs/apache-airflow/public-airflow-interface.rst
index e63ac8fdca39d..534cc0d0e63c3 100644
--- a/docs/apache-airflow/public-airflow-interface.rst
+++ b/docs/apache-airflow/public-airflow-interface.rst
@@ -59,8 +59,8 @@ DAGs
 
 The DAG is Airflow's core entity that represents a recurring workflow. You can create a DAG by
 instantiating the :class:`~airflow.models.dag.DAG` class in your DAG file. You can also instantiate
-them via :class::`~airflow.models.dagbag.DagBag` class that reads DAGs from a file or a folder. DAGs
-can also have parameters specified via :class::`~airflow.models.param.Param` class.
+them via :class:`~airflow.models.dagbag.DagBag` class that reads DAGs from a file or a folder. DAGs
+can also have parameters specified via :class:`~airflow.models.param.Param` class.
 
 Airflow has a set of example DAGs that you can use to learn how to write DAGs
 
@@ -222,6 +222,16 @@ exposes:
 
   _api/airflow/exceptions/index
 
+Public Utility classes
+----------------------
+
+.. toctree::
+  :includehidden:
+  :glob:
+  :maxdepth: 1
+
+  _api/airflow/utils/state/index
+
 
 Using Public Interface to extend Airflow capabilities
 =====================================================
diff --git a/docs/apache-airflow/security/audit_logs.rst b/docs/apache-airflow/security/audit_logs.rst
index be38a29438db2..9ce51377868d4 100644
--- a/docs/apache-airflow/security/audit_logs.rst
+++ b/docs/apache-airflow/security/audit_logs.rst
@@ -16,7 +16,7 @@
     under the License.
 
 Audit Logs in Airflow
-========================
+=====================
 
 
 Overview
@@ -28,6 +28,8 @@ They provide a way to track user actions and system events, which can be used to
 In Airflow, audit logs are used to track user actions and system events that occur during the execution of DAGs and tasks.
 They are stored in a database and can be accessed through the Airflow UI.
 
+To be able to see audit logs, a user needs to have the ``Audit Logs.can_read`` permission. Such user will be able to see all audit logs, independently of the DAGs permissions applied.
+
 
 Level of Audit Logs
 --------------------
diff --git a/docs/apache-airflow/security/releasing_security_patches.rst b/docs/apache-airflow/security/releasing_security_patches.rst
index f35ed4d6698c1..f98e464dfe542 100644
--- a/docs/apache-airflow/security/releasing_security_patches.rst
+++ b/docs/apache-airflow/security/releasing_security_patches.rst
@@ -25,7 +25,7 @@ separately from security patches in Airflow core package).
 Releasing Airflow with security patches
 ---------------------------------------
 
-Apache Airflow uses a strict [SemVer](https://semver.org) versioning policy, which means that we strive for
+Apache Airflow uses a strict `SemVer <https://semver.org>`_ versioning policy, which means that we strive for
 any release of a given ``MAJOR`` Version (version "2" currently) to be backwards compatible. When we
 release a ``MINOR`` version, the development continues in the ``main`` branch where we prepare the next
 ``MINOR`` version, but we release ``PATCHLEVEL`` releases with selected bugfixes (including security
diff --git a/docs/apache-airflow/security/sbom.rst b/docs/apache-airflow/security/sbom.rst
new file mode 100644
index 0000000000000..273c16c79cecd
--- /dev/null
+++ b/docs/apache-airflow/security/sbom.rst
@@ -0,0 +1,31 @@
+ .. 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.
+
+SBOM
+====
+
+Software Bill Of Materials (SBOM) files are critical assets used for transparency, providing a clear inventory of all the components
+used in Apache Airflow (name, version, supplier and transitive dependencies). They are an exhaustive representation
+of the software dependencies.
+
+The general use case for such files is to help assess and manage risks. For instance a quick lookup against your SBOM files can help identify if a CVE (Common Vulnerabilities and Exposures) in a
+library is affecting you.
+
+By default, Apache Airflow SBOM files are generated for airflow core with all providers. In the near future we aim at generating SBOM files per provider and also provide them for docker standard images.
+
+Each airflow version has its own SBOM files, one for each supported python version.
+You can find them `here <https://airflow.apache.org/docs/apache-airflow/stable/sbom>`_.
diff --git a/docs/apache-airflow/security/security_model.rst b/docs/apache-airflow/security/security_model.rst
index 0e22674acb27b..6c9e3da15102b 100644
--- a/docs/apache-airflow/security/security_model.rst
+++ b/docs/apache-airflow/security/security_model.rst
@@ -90,7 +90,9 @@ capabilities authenticated users may have:
    create a Webserver Denial of Service situation and should be trusted
    not to misuse this capability.
 
-4. **Normal Users**: They can view and interact with the UI and API.
+4. **Audit log users**: They can view audit events for the whole Airflow installation.
+
+5. **Normal Users**: They can view and interact with the UI and API.
    They are able to view and edit DAGs, task instances, and DAG runs, and view task logs.
 
 For more information on the capabilities of authenticated UI users, see :doc:`/security/access-control`.
@@ -98,7 +100,21 @@ For more information on the capabilities of authenticated UI users, see :doc:`/s
 Responsibilities of Deployment Managers
 ---------------------------------------
 
-Deployment Managers determine access levels and must understand the potential
+Deployment Managers are responsible for deploying airflow and make it accessible to the users
+in the way that follows best practices of secure deployment applicable to the organization where
+Airflow is deployed. This includes but is not limited to:
+
+* protecting communication using TLS/VPC and whatever network security is required by the organization
+  that is deploying Airflow
+* applying rate-limiting and other forms of protections that is usually applied to web applications
+* applying authentication and authorization to the web application so that only known and authorized
+  users can have access to Airflow
+* any kind of detection of unusual activity and protection against it
+
+Airflow does not implement any of those feature natively, and delegates it to the deployment managers
+to deploy all the necessary infrastructure to protect the deployment - as external infrastructure components.
+
+Deployment Managers also determine access levels and must understand the potential
 damage users can cause. Some Deployment Managers may further limit
 access through fine-grained privileges for the **Authenticated UI
 users**. However, these limitations are outside the basic Airflow's
diff --git a/docs/apache-airflow/security/webserver.rst b/docs/apache-airflow/security/webserver.rst
index d990afa4d4536..bf7991ac8a679 100644
--- a/docs/apache-airflow/security/webserver.rst
+++ b/docs/apache-airflow/security/webserver.rst
@@ -113,7 +113,7 @@ and leverage the REMOTE_USER method:
     from typing import Any, Callable
 
     from flask import current_app
-    from airflow.www.fab_security.manager import AUTH_REMOTE_USER
+    from flask_appbuilder.const import AUTH_REMOTE_USER
 
 
     class CustomMiddleware:
diff --git a/docs/apache-airflow/start.rst b/docs/apache-airflow/start.rst
index 5ed97ae4d782c..ee95f1391ddc5 100644
--- a/docs/apache-airflow/start.rst
+++ b/docs/apache-airflow/start.rst
@@ -24,8 +24,7 @@ This quick start guide will help you bootstrap an Airflow standalone instance on
 
 .. note::
 
-   Successful installation requires a Python 3 environment. Starting with Airflow 2.3.0, Airflow is tested with Python 3.8, 3.9, 3.10.
-   Note that Python 3.11 is not yet supported.
+   Successful installation requires a Python 3 environment. Starting with Airflow 2.7.0, Airflow supports Python 3.8, 3.9, 3.10 and 3.11.
 
    Only ``pip`` installation is currently officially supported.
 
@@ -61,7 +60,8 @@ constraint files to enable reproducible installation, so using ``pip`` and const
 
       AIRFLOW_VERSION=|version|
 
-      # Extract the version of Python you have installed. If you're currently using Python 3.11 you may want to set this manually as noted above, Python 3.11 is not yet supported.
+      # Extract the version of Python you have installed. If you're currently using a Python version that is not supported by Airflow, you may want to set this manually.
+      # See above for supported versions.
       PYTHON_VERSION="$(python --version | cut -d " " -f 2 | cut -d "." -f 1-2)"
 
       CONSTRAINT_URL="https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-${PYTHON_VERSION}.txt"
diff --git a/docs/apache-airflow/templates-ref.rst b/docs/apache-airflow/templates-ref.rst
index bfb3cad9eb5c6..763d3550fdc8e 100644
--- a/docs/apache-airflow/templates-ref.rst
+++ b/docs/apache-airflow/templates-ref.rst
@@ -74,6 +74,10 @@ Variable                                    Type                  Description
 ``{{ expanded_ti_count }}``                 int | ``None``        | Number of task instances that a mapped task was expanded into. If
                                                                   | the current task is not mapped, this should be ``None``.
                                                                   | Added in version 2.5.
+``{{ triggering_dataset_events }}``         dict[str,             | If in a Dataset Scheduled DAG, a map of Dataset URI to a list of triggering :class:`~airflow.models.dataset.DatasetEvent`
+                                            list[DatasetEvent]]   | (there may be more than one, if there are multiple Datasets with different frequencies).
+                                                                  | Read more here :doc:`Datasets <authoring-and-scheduling/datasets>`.
+                                                                  | Added in version 2.4.
 =========================================== ===================== ===================================================================
 
 .. note::
@@ -116,7 +120,7 @@ You can access them as either plain-text or JSON. If you use JSON, you are
 also able to walk nested structures, such as dictionaries like:
 ``{{ var.json.my_dict_var.key1 }}``.
 
-It is also possible to fetch a variable by string if needed with
+It is also possible to fetch a variable by string if needed (for example your variable key contains dots) with
 ``{{ var.value.get('my.var', 'fallback') }}`` or
 ``{{ var.json.get('my.dict.var', {'key1': 'val1'}) }}``. Defaults can be
 supplied in case the variable does not exist.
diff --git a/docs/apache-airflow/ui.rst b/docs/apache-airflow/ui.rst
index 87f20d7a881a1..7afe26cf3d719 100644
--- a/docs/apache-airflow/ui.rst
+++ b/docs/apache-airflow/ui.rst
@@ -166,9 +166,9 @@ DAG over many runs.
 
 Landing Times
 .............
-Airflow landing times are calculated from the task's scheduled time to
-the time the task finishes, either with success or another state (see
-:ref:`concepts:task-instances`).
+
+The landing time for a task instance is the delta between the dag run's data interval end
+(typically this means, when the dag "should" run) and the task instance completion time.
 
 ------------
 
diff --git a/docs/conf.py b/docs/conf.py
index 0618a4401d338..d26edb6c82788 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -40,7 +40,7 @@
 from typing import Any
 
 import yaml
-from packaging.version import parse as parse_version
+from packaging.version import Version, parse as parse_version
 
 import airflow
 from airflow.configuration import AirflowConfigParser, retrieve_configuration_description
@@ -236,7 +236,9 @@ def _get_rst_filepath_from_path(filepath: pathlib.Path):
         "triggers",
         "utils",
     }
-    browsable_utils: set[str] = set()
+    browsable_utils: set[str] = {
+        "state.py",
+    }
 
     models_included: set[str] = {
         "baseoperator.py",
@@ -257,7 +259,7 @@ def _get_rst_filepath_from_path(filepath: pathlib.Path):
         if path.is_dir() and path.name not in browsable_packages:
             exclude_patterns.append(f"_api/airflow/{path.name}")
 
-    # Don't include all of utils, just the specific ones we decoded to include
+    # Don't include all of utils, just the specific ones we decided to include
     for path in (root / "utils").iterdir():
         if path.name not in browsable_utils:
             exclude_patterns.append(_get_rst_filepath_from_path(path))
@@ -269,7 +271,7 @@ def _get_rst_filepath_from_path(filepath: pathlib.Path):
 
 elif PACKAGE_NAME != "docker-stack":
     exclude_patterns.extend(
-        _get_rst_filepath_from_path(f) for f in pathlib.Path(PACKAGE_DIR).glob("**/example_dags")
+        _get_rst_filepath_from_path(f) for f in pathlib.Path(PACKAGE_DIR).rglob("example_dags")
     )
 
 # Add any paths that contain templates here, relative to this directory.
@@ -410,6 +412,7 @@ def _get_rst_filepath_from_path(filepath: pathlib.Path):
 
 def get_configs_and_deprecations(
     package_name: str,
+    package_version: Version,
 ) -> tuple[dict[str, dict[str, tuple[str, str, str]]], dict[str, dict[str, tuple[str, str, str]]]]:
     deprecated_options: dict[str, dict[str, tuple[str, str, str]]] = defaultdict(dict)
     for (section, key), (
@@ -438,7 +441,7 @@ def get_configs_and_deprecations(
                 if option[key] and "{{" in option[key]:
                     option[key] = option[key].replace("{{", "{").replace("}}", "}")
             version_added = option["version_added"]
-            if version_added is not None and parse_version(version_added) > airflow_version:
+            if version_added is not None and parse_version(version_added) > package_version:
                 del conf_section["options"][option_name]
 
     # Sort options, config and deprecated options for JINJA variables to display
@@ -452,7 +455,7 @@ def get_configs_and_deprecations(
 
 # Jinja context
 if PACKAGE_NAME == "apache-airflow":
-    configs, deprecated_options = get_configs_and_deprecations(PACKAGE_NAME)
+    configs, deprecated_options = get_configs_and_deprecations(PACKAGE_NAME, airflow_version)
     jinja_contexts = {
         "config_ctx": {"configs": configs, "deprecated_options": deprecated_options},
         "quick_start_ctx": {
@@ -465,7 +468,7 @@ def get_configs_and_deprecations(
         },
     }
 elif PACKAGE_NAME.startswith("apache-airflow-providers-"):
-    configs, deprecated_options = get_configs_and_deprecations(PACKAGE_NAME)
+    configs, deprecated_options = get_configs_and_deprecations(PACKAGE_NAME, parse_version(PACKAGE_VERSION))
     jinja_contexts = {
         "config_ctx": {
             "configs": configs,
diff --git a/docs/docker-stack/README.md b/docs/docker-stack/README.md
index 3e1115d92aab2..10129d80feea5 100644
--- a/docs/docker-stack/README.md
+++ b/docs/docker-stack/README.md
@@ -31,12 +31,12 @@ Every time a new version of Airflow is released, the images are prepared in the
 [apache/airflow DockerHub](https://hub.docker.com/r/apache/airflow)
 for all the supported Python versions.
 
-You can find the following images there (Assuming Airflow version `2.7.1`):
+You can find the following images there (Assuming Airflow version `2.7.2`):
 
 * `apache/airflow:latest` - the latest released Airflow image with default Python version (3.8 currently)
 * `apache/airflow:latest-pythonX.Y` - the latest released Airflow image with specific Python version
-* `apache/airflow:2.7.1` - the versioned Airflow image with default Python version (3.8 currently)
-* `apache/airflow:2.7.1-pythonX.Y` - the versioned Airflow image with specific Python version
+* `apache/airflow:2.7.2` - the versioned Airflow image with default Python version (3.8 currently)
+* `apache/airflow:2.7.2-pythonX.Y` - the versioned Airflow image with specific Python version
 
 Those are "reference" regular images. They contain the most common set of extras, dependencies and providers that are
 often used by the users and they are good to "try-things-out" when you want to just take Airflow for a spin,
@@ -47,8 +47,8 @@ via [Building the image](https://airflow.apache.org/docs/docker-stack/build.html
 
 * `apache/airflow:slim-latest`              - the latest released Airflow image with default Python version (3.8 currently)
 * `apache/airflow:slim-latest-pythonX.Y`    - the latest released Airflow image with specific Python version
-* `apache/airflow:slim-2.7.1`           - the versioned Airflow image with default Python version (3.8 currently)
-* `apache/airflow:slim-2.7.1-pythonX.Y` - the versioned Airflow image with specific Python version
+* `apache/airflow:slim-2.7.2`           - the versioned Airflow image with default Python version (3.8 currently)
+* `apache/airflow:slim-2.7.2-pythonX.Y` - the versioned Airflow image with specific Python version
 
 The Apache Airflow image provided as convenience package is optimized for size, and
 it provides just a bare minimal set of the extras and dependencies installed and in most cases
diff --git a/docs/docker-stack/docker-examples/extending/add-airflow-configuration/Dockerfile b/docs/docker-stack/docker-examples/extending/add-airflow-configuration/Dockerfile
index f37f16b9619f2..6888723306d78 100644
--- a/docs/docker-stack/docker-examples/extending/add-airflow-configuration/Dockerfile
+++ b/docs/docker-stack/docker-examples/extending/add-airflow-configuration/Dockerfile
@@ -15,7 +15,7 @@
 
 # This is an example Dockerfile. It is not intended for PRODUCTION use
 # [START Dockerfile]
-FROM apache/airflow:2.7.1
+FROM apache/airflow:2.7.2
 ENV AIRFLOW__CORE__LOAD_EXAMPLES=True
 ENV AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=my_conn_string
 # [END Dockerfile]
diff --git a/docs/docker-stack/docker-examples/extending/add-apt-packages/Dockerfile b/docs/docker-stack/docker-examples/extending/add-apt-packages/Dockerfile
index 6a034764360df..31c4d91d540eb 100644
--- a/docs/docker-stack/docker-examples/extending/add-apt-packages/Dockerfile
+++ b/docs/docker-stack/docker-examples/extending/add-apt-packages/Dockerfile
@@ -15,7 +15,7 @@
 
 # This is an example Dockerfile. It is not intended for PRODUCTION use
 # [START Dockerfile]
-FROM apache/airflow:2.7.1
+FROM apache/airflow:2.7.2
 USER root
 RUN apt-get update \
   && apt-get install -y --no-install-recommends \
diff --git a/docs/docker-stack/docker-examples/extending/add-build-essential-extend/Dockerfile b/docs/docker-stack/docker-examples/extending/add-build-essential-extend/Dockerfile
index fc7f3a74e3131..2baf12487ff39 100644
--- a/docs/docker-stack/docker-examples/extending/add-build-essential-extend/Dockerfile
+++ b/docs/docker-stack/docker-examples/extending/add-build-essential-extend/Dockerfile
@@ -15,7 +15,7 @@
 
 # This is an example Dockerfile. It is not intended for PRODUCTION use
 # [START Dockerfile]
-FROM apache/airflow:2.7.1
+FROM apache/airflow:2.7.2
 USER root
 RUN apt-get update \
   && apt-get install -y --no-install-recommends \
diff --git a/docs/docker-stack/docker-examples/extending/add-providers/Dockerfile b/docs/docker-stack/docker-examples/extending/add-providers/Dockerfile
index 94870a3019d17..34490290d90af 100644
--- a/docs/docker-stack/docker-examples/extending/add-providers/Dockerfile
+++ b/docs/docker-stack/docker-examples/extending/add-providers/Dockerfile
@@ -15,7 +15,7 @@
 
 # This is an example Dockerfile. It is not intended for PRODUCTION use
 # [START Dockerfile]
-FROM apache/airflow:2.7.1
+FROM apache/airflow:2.7.2
 USER root
 RUN apt-get update \
   && apt-get install -y --no-install-recommends \
diff --git a/docs/docker-stack/docker-examples/extending/add-pypi-packages/Dockerfile b/docs/docker-stack/docker-examples/extending/add-pypi-packages/Dockerfile
index 7cca44228e42a..baf4c1f30a4f7 100644
--- a/docs/docker-stack/docker-examples/extending/add-pypi-packages/Dockerfile
+++ b/docs/docker-stack/docker-examples/extending/add-pypi-packages/Dockerfile
@@ -15,6 +15,6 @@
 
 # This is an example Dockerfile. It is not intended for PRODUCTION use
 # [START Dockerfile]
-FROM apache/airflow:2.7.1
+FROM apache/airflow:2.7.2
 RUN pip install --no-cache-dir "apache-airflow==${AIRFLOW_VERSION}" lxml
 # [END Dockerfile]
diff --git a/docs/docker-stack/docker-examples/extending/add-requirement-packages/Dockerfile b/docs/docker-stack/docker-examples/extending/add-requirement-packages/Dockerfile
index 525296b91e240..1704f64173d65 100644
--- a/docs/docker-stack/docker-examples/extending/add-requirement-packages/Dockerfile
+++ b/docs/docker-stack/docker-examples/extending/add-requirement-packages/Dockerfile
@@ -15,7 +15,7 @@
 
 # This is an example Dockerfile. It is not intended for PRODUCTION use
 # [START Dockerfile]
-FROM apache/airflow:2.7.1
+FROM apache/airflow:2.7.2
 COPY requirements.txt /
 RUN pip install --no-cache-dir "apache-airflow==${AIRFLOW_VERSION}" -r /requirements.txt
 # [END Dockerfile]
diff --git a/docs/docker-stack/docker-examples/extending/custom-providers/Dockerfile b/docs/docker-stack/docker-examples/extending/custom-providers/Dockerfile
index 0b7f2eca7e239..73c62e6a9a1a2 100644
--- a/docs/docker-stack/docker-examples/extending/custom-providers/Dockerfile
+++ b/docs/docker-stack/docker-examples/extending/custom-providers/Dockerfile
@@ -15,6 +15,6 @@
 
 # This is an example Dockerfile. It is not intended for PRODUCTION use
 # [START Dockerfile]
-FROM apache/airflow:2.7.1
+FROM apache/airflow:2.7.2
 RUN pip install "apache-airflow==${AIRFLOW_VERSION}" --no-cache-dir apache-airflow-providers-docker==2.5.1
 # [END Dockerfile]
diff --git a/docs/docker-stack/docker-examples/extending/embedding-dags/Dockerfile b/docs/docker-stack/docker-examples/extending/embedding-dags/Dockerfile
index bce131ee7375f..b82de6e70d433 100644
--- a/docs/docker-stack/docker-examples/extending/embedding-dags/Dockerfile
+++ b/docs/docker-stack/docker-examples/extending/embedding-dags/Dockerfile
@@ -15,7 +15,7 @@
 
 # This is an example Dockerfile. It is not intended for PRODUCTION use
 # [START Dockerfile]
-FROM apache/airflow:2.7.1
+FROM apache/airflow:2.7.2
 
 COPY --chown=airflow:root test_dag.py /opt/airflow/dags
 
diff --git a/docs/docker-stack/docker-examples/extending/writable-directory/Dockerfile b/docs/docker-stack/docker-examples/extending/writable-directory/Dockerfile
index 5721fa4ba4531..516628daaba0e 100644
--- a/docs/docker-stack/docker-examples/extending/writable-directory/Dockerfile
+++ b/docs/docker-stack/docker-examples/extending/writable-directory/Dockerfile
@@ -15,7 +15,7 @@
 
 # This is an example Dockerfile. It is not intended for PRODUCTION use
 # [START Dockerfile]
-FROM apache/airflow:2.7.1
+FROM apache/airflow:2.7.2
 RUN umask 0002; \
     mkdir -p ~/writeable-directory
 # [END Dockerfile]
diff --git a/docs/docker-stack/entrypoint.rst b/docs/docker-stack/entrypoint.rst
index 3ee6119f10666..25fb2ec62680d 100644
--- a/docs/docker-stack/entrypoint.rst
+++ b/docs/docker-stack/entrypoint.rst
@@ -132,7 +132,7 @@ if you specify extra arguments. For example:
 
 .. code-block:: bash
 
-  docker run -it apache/airflow:2.7.1-python3.8 bash -c "ls -la"
+  docker run -it apache/airflow:2.7.2-python3.8 bash -c "ls -la"
   total 16
   drwxr-xr-x 4 airflow root 4096 Jun  5 18:12 .
   drwxr-xr-x 1 root    root 4096 Jun  5 18:12 ..
@@ -144,7 +144,7 @@ you pass extra parameters. For example:
 
 .. code-block:: bash
 
-  > docker run -it apache/airflow:2.7.1-python3.8 python -c "print('test')"
+  > docker run -it apache/airflow:2.7.2-python3.8 python -c "print('test')"
   test
 
 If first argument equals to "airflow" - the rest of the arguments is treated as an airflow command
@@ -152,13 +152,13 @@ to execute. Example:
 
 .. code-block:: bash
 
-   docker run -it apache/airflow:2.7.1-python3.8 airflow webserver
+   docker run -it apache/airflow:2.7.2-python3.8 airflow webserver
 
 If there are any other arguments - they are simply passed to the "airflow" command
 
 .. code-block:: bash
 
-  > docker run -it apache/airflow:2.7.1-python3.8 help
+  > docker run -it apache/airflow:2.7.2-python3.8 help
     usage: airflow [-h] GROUP_OR_COMMAND ...
 
     positional arguments:
@@ -363,7 +363,7 @@ database and creating an ``admin/admin`` Admin user with the following command:
     --env "_AIRFLOW_DB_MIGRATE=true" \
     --env "_AIRFLOW_WWW_USER_CREATE=true" \
     --env "_AIRFLOW_WWW_USER_PASSWORD=admin" \
-      apache/airflow:2.7.1-python3.8 webserver
+      apache/airflow:2.7.2-python3.8 webserver
 
 
 .. code-block:: bash
@@ -372,7 +372,7 @@ database and creating an ``admin/admin`` Admin user with the following command:
     --env "_AIRFLOW_DB_MIGRATE=true" \
     --env "_AIRFLOW_WWW_USER_CREATE=true" \
     --env "_AIRFLOW_WWW_USER_PASSWORD_CMD=echo admin" \
-      apache/airflow:2.7.1-python3.8 webserver
+      apache/airflow:2.7.2-python3.8 webserver
 
 The commands above perform initialization of the SQLite database, create admin user with admin password
 and Admin role. They also forward local port ``8080`` to the webserver port and finally start the webserver.
@@ -412,6 +412,6 @@ Example:
     --env "_AIRFLOW_DB_MIGRATE=true" \
     --env "_AIRFLOW_WWW_USER_CREATE=true" \
     --env "_AIRFLOW_WWW_USER_PASSWORD_CMD=echo admin" \
-      apache/airflow:2.7.1-python3.8 webserver
+      apache/airflow:2.7.2-python3.8 webserver
 
 This method is only available starting from Docker image of Airflow 2.1.1 and above.
diff --git a/docs/exts/docs_build/code_utils.py b/docs/exts/docs_build/code_utils.py
index 1f520553b84b6..c7eef91c7d993 100644
--- a/docs/exts/docs_build/code_utils.py
+++ b/docs/exts/docs_build/code_utils.py
@@ -66,7 +66,7 @@ def guess_lexer_for_filename(filename):
                 code=code, formatter=TerminalFormatter(), lexer=guess_lexer_for_filename(file_path)
             )
 
-        code_lines = code.split("\n")
+        code_lines = code.splitlines()
         # Prepend line number
         code_lines = [f"{line_no:4} | {line}" for line_no, line in enumerate(code_lines, 1)]
         # # Cut out the snippet
diff --git a/docs/exts/docs_build/dev_index_generator.py b/docs/exts/docs_build/dev_index_generator.py
index 055384e764471..0b9e9072ab57c 100644
--- a/docs/exts/docs_build/dev_index_generator.py
+++ b/docs/exts/docs_build/dev_index_generator.py
@@ -19,7 +19,7 @@
 import argparse
 import os
 import sys
-from glob import glob
+from pathlib import Path
 
 import jinja2
 
@@ -45,24 +45,16 @@ def _render_template(template_name, **kwargs):
 
 
 def _render_content():
-    provider_packages = [
-        os.path.basename(os.path.dirname(p)) for p in glob(f"{BUILD_DIR}/docs/apache-airflow-providers-*/")
-    ]
     providers = []
-    for package_name in provider_packages:
+    provider_yamls = {p["package-name"]: p for p in ALL_PROVIDER_YAMLS}
+    for path in sorted(Path(BUILD_DIR).glob("docs/apache-airflow-providers-*/")):
+        package_name = path.name
         try:
-            current_provider = next(
-                provider_yaml
-                for provider_yaml in ALL_PROVIDER_YAMLS
-                if provider_yaml["package-name"] == package_name
-            )
-            providers.append(current_provider)
-        except StopIteration:
+            providers.append(provider_yamls[package_name])
+        except KeyError:
             print(f"WARNING! Could not find provider.yaml file for package: {package_name}")
 
-    content = _render_template(
-        "dev_index_template.html.jinja2", providers=sorted(providers, key=lambda k: k["package-name"])
-    )
+    content = _render_template("dev_index_template.html.jinja2", providers=providers)
     return content
 
 
diff --git a/docs/exts/docs_build/errors.py b/docs/exts/docs_build/errors.py
index 321379896ca87..0abfc8fe573f3 100644
--- a/docs/exts/docs_build/errors.py
+++ b/docs/exts/docs_build/errors.py
@@ -95,7 +95,7 @@ def parse_sphinx_warnings(warning_text: str, docs_dir: str) -> list[DocBuildErro
     :return: list of DocBuildErrors.
     """
     sphinx_build_errors = []
-    for sphinx_warning in warning_text.split("\n"):
+    for sphinx_warning in warning_text.splitlines():
         if not sphinx_warning:
             continue
         warning_parts = sphinx_warning.split(":", 2)
diff --git a/docs/exts/docs_build/spelling_checks.py b/docs/exts/docs_build/spelling_checks.py
index bbaa9fa5dde79..2e3f7d409f741 100644
--- a/docs/exts/docs_build/spelling_checks.py
+++ b/docs/exts/docs_build/spelling_checks.py
@@ -90,7 +90,7 @@ def parse_spelling_warnings(warning_text: str, docs_dir: str) -> list[SpellingEr
     :return: list of SpellingError.
     """
     sphinx_spelling_errors = []
-    for sphinx_warning in warning_text.split("\n"):
+    for sphinx_warning in warning_text.splitlines():
         if not sphinx_warning:
             continue
         warning_parts = None
diff --git a/docs/exts/exampleinclude.py b/docs/exts/exampleinclude.py
index 7a4498d4e7a1a..eade660515db1 100644
--- a/docs/exts/exampleinclude.py
+++ b/docs/exts/exampleinclude.py
@@ -20,8 +20,8 @@
 from __future__ import annotations
 
 """Nice formatted include for examples"""
+import os
 import traceback
-from os import path
 
 from docutils import nodes
 
@@ -227,8 +227,8 @@ def doctree_read(app, doctree):
 
     for objnode in doctree.traverse(ExampleHeader):
         filepath = objnode.get("filename")
-        relative_path = path.relpath(
-            filepath, path.commonprefix([app.config.exampleinclude_sourceroot, filepath])
+        relative_path = os.path.relpath(
+            filepath, os.path.commonprefix([app.config.exampleinclude_sourceroot, filepath])
         )
         modname = relative_path.replace("/", ".")[:-3]
         show_button = register_source(app, env, modname)
diff --git a/docs/spelling_wordlist.txt b/docs/spelling_wordlist.txt
index fbca728f8ed22..f8f613dfc3c87 100644
--- a/docs/spelling_wordlist.txt
+++ b/docs/spelling_wordlist.txt
@@ -375,6 +375,8 @@ Dataproc
 dataproc
 Dataset
 dataset
+DatasetEvent
+DatasetEvents
 datasetId
 Datasets
 datasets
diff --git a/generated/PYPI_README.md b/generated/PYPI_README.md
index 9bb8767a19ecf..f0ecd7cb5fdab 100644
--- a/generated/PYPI_README.md
+++ b/generated/PYPI_README.md
@@ -47,18 +47,20 @@ Use Airflow to author workflows as directed acyclic graphs (DAGs) of tasks. The
 
 Apache Airflow is tested with:
 
-|             | Main version (dev)     | Stable version (2.7.1) |
-|-------------|------------------------|------------------------|
-| Python      | 3.8, 3.9, 3.10, 3.11   | 3.8, 3.9, 3.10, 3.11   |
-| Platform    | AMD64/ARM64(\*)        | AMD64/ARM64(\*)        |
-| Kubernetes  | 1.24, 1.25, 1.26, 1.27 | 1.24, 1.25, 1.26, 1.27 |
-| PostgreSQL  | 11, 12, 13, 14, 15     | 11, 12, 13, 14, 15     |
-| MySQL       | 5.7, 8.0, 8.1          | 5.7, 8.0, 8.1          |
-| SQLite      | 3.15.0+                | 3.15.0+                |
-| MSSQL       | 2017(\*), 2019(\*)     | 2017(\*), 2019(\*)     |
+|             | Main version (dev)           | Stable version (2.7.2) |
+|-------------|------------------------------|------------------------|
+| Python      | 3.8, 3.9, 3.10, 3.11         | 3.8, 3.9, 3.10, 3.11   |
+| Platform    | AMD64/ARM64(\*)              | AMD64/ARM64(\*)        |
+| Kubernetes  | 1.24, 1.25, 1.26, 1.27, 1.28 | 1.24, 1.25, 1.26, 1.27 |
+| PostgreSQL  | 11, 12, 13, 14, 15           | 11, 12, 13, 14, 15     |
+| MySQL       | 5.7, 8.0, 8.1                | 5.7, 8.0               |
+| SQLite      | 3.15.0+                      | 3.15.0+                |
+| MSSQL       | 2017(\*\*), 2019(\*\*)       | 2017(\*), 2019(\*)     |
 
 \* Experimental
 
+\*\* **Discontinued soon**, not recommended for the new installation
+
 **Note**: MySQL 5.x versions are unable to or have limitations with
 running multiple schedulers -- please see the [Scheduler docs](https://airflow.apache.org/docs/apache-airflow/stable/scheduler.html).
 MariaDB is not tested/recommended.
@@ -124,15 +126,15 @@ them to the appropriate format and workflow that your tool requires.
 
 
 ```bash
-pip install 'apache-airflow==2.7.1' \
- --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.7.1/constraints-3.8.txt"
+pip install 'apache-airflow==2.7.2' \
+ --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.7.2/constraints-3.8.txt"
 ```
 
 2. Installing with extras (i.e., postgres, google)
 
 ```bash
-pip install 'apache-airflow[postgres,google]==2.7.1' \
- --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.7.1/constraints-3.8.txt"
+pip install 'apache-airflow[postgres,google]==2.7.2' \
+ --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.7.2/constraints-3.8.txt"
 ```
 
 For information on installing provider packages, check
diff --git a/images/breeze/output-commands-hash.txt b/images/breeze/output-commands-hash.txt
index 016f0c6207ceb..09b6278bf9419 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -2,7 +2,7 @@
 # Please do not solve it but run `breeze setup regenerate-command-images`.
 # This command should fix the conflict and regenerate help images that you have conflict with.
 main:344261ca3aa7ff31e098b1d88280566a
-build-docs:b468701e6c15875fb421a1874fa0c8a2
+build-docs:9b540ef8f8c2bd942647595d1e250cae
 ci:find-backtracking-candidates:17fe56b867a745e5032a08dfcd3f73ee
 ci:fix-ownership:3e5a73533cc96045e72cb258783cfc96
 ci:free-space:49af17b032039c05c41a7a8283f365cc
@@ -36,22 +36,22 @@ prod-image:build:789f32a07099033b49936d4cfbeb5322
 prod-image:pull:76f1f27e6119928412abecf153fce4bb
 prod-image:verify:bd2b78738a7c388dbad6076c41a9f906
 prod-image:2946a9cee30c8ad7bd738ea3c77bff55
-release-management:add-back-references:9ea36780057c822432f0a5c370c3a2fe
+release-management:add-back-references:9c565c08edd57ab2b484efc2be53672e
 release-management:create-minor-branch:a3834afc4aa5d1e98002c9e9e7a9931d
 release-management:generate-constraints:b8fcaf8f0acd35ed5dbd48659bdb6485
-release-management:generate-issue-content-providers:9e1c3e1072465e79f698ce675a1564cd
+release-management:generate-issue-content-providers:71fccecb5187faf66aaada89f3db9091
 release-management:generate-providers-metadata:d4e8e5cfaa024e3963af02d7a873048d
 release-management:install-provider-packages:7a5aa75736387c442c05163581543cbc
 release-management:prepare-airflow-package:85d01c57e5b5ee0fb9e5f9d9706ed3b5
-release-management:prepare-provider-documentation:cb925862b46fb2fa01cd1e5723d422b1
-release-management:prepare-provider-packages:75fdc618a4a8c37ed4713f9b90020814
-release-management:publish-docs:e40d0fbf7dcc6ca8e2dd4728fc279257
+release-management:prepare-provider-documentation:a87bae187db8bb988f4cace124b23171
+release-management:prepare-provider-packages:cd39b58b8c1b46d6ce26ad53e3577aa4
+release-management:publish-docs:1eb6f4721cd52be497d1623d37170175
 release-management:release-prod-images:cfbfe8b19fee91fd90718f98ef2fd078
 release-management:start-rc-process:b27bd524dd3c89f50a747b60a7e892c1
 release-management:start-release:419f48f6a4ff4457cb9de7ff496aebbe
 release-management:update-constraints:596d970210f9a71cf6b688995797c0e2
 release-management:verify-provider-packages:2bfa1015b2a4682f7b098587e09026d4
-release-management:008ced5173e6b860764536d4f82da565
+release-management:394f619fa3803bf148f200c9f0213c5d
 sbom:generate-provider-requirements:230cea8fb70cb4fddd73583d82ca4ede
 sbom:update-sbom-information:0ce56884e5f842e3e80d6619df1ccc64
 sbom:531007d8e9f8415e6c17b7b04dd89b9d
@@ -62,11 +62,11 @@ setup:regenerate-command-images:d5e29ec6acb1a6af7d83772c2962f89d
 setup:self-upgrade:4af905a147fcd6670a0e33d3d369a94b
 setup:version:be116d90a21c2afe01087f7609774e1e
 setup:8de3ed2645928e8f9f89c58f0ccd2a60
-shell:30a9271ff59a0fe756dda402cc165683
+shell:1e901a677a6df6ba1d64d3fe79b42587
 start-airflow:ff0f63e20b9ff454e5d3c7b9ba9080d7
-static-checks:2fab0d0dbf419b6c8c7bd7b271277722
+static-checks:d319b1c7972a6623bc8ee1b174cacb48
 testing:docker-compose-tests:0c810047fc66a0cfe91119e2d08b3507
 testing:helm-tests:8e491da2e01ebd815322c37562059d77
 testing:integration-tests:486e4d91449ecdb7630ef2a470d705a3
-testing:tests:3c202e65824e405269e78f58936980e0
-testing:68a089bc30e0e60f834f205df1e9f086
+testing:tests:b3b921fd5a7d3435a0ad34e90b75cb2f
+testing:13325e047fc32d9e40b51bfd15212a91
diff --git a/images/breeze/output_build-docs.svg b/images/breeze/output_build-docs.svg
index 1f6576180e788..ca2fb11fc3485 100644
--- a/images/breeze/output_build-docs.svg
+++ b/images/breeze/output_build-docs.svg
@@ -249,47 +249,47 @@
 </text><text class="breeze-build-docs-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-9)">│</text><text class="breeze-build-docs-r2" x="329.4" y="239.6" textLength="1110.2" clip-path="url(#breeze-build-docs-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="239.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-9)">│</text><text class="breeze-build-docs-r2" x="1464" y="239.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-9)">
 </text><text class="breeze-build-docs-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-build-docs-line-10)">│</text><text class="breeze-build-docs-r4" x="24.4" y="264" textLength="12.2" clip-path="url(#breeze-build-docs-line-10)">-</text><text class="breeze-build-docs-r4" x="36.6" y="264" textLength="48.8" clip-path="url(#breeze-build-docs-line-10)">-one</text><text class="breeze-build-docs-r4" x="85.4" y="264" textLength="122" clip-path="url(#breeze-build-docs-line-10)">-pass-only</text><text class="breeze-build-docs-r2" x="329.4" y="264" textLength="1000.4" clip-path="url(#breeze-build-docs-line-10)">Builds&#160;documentation&#160;in&#160;one&#160;pass&#160;only.&#160;This&#160;is&#160;useful&#160;for&#160;debugging&#160;sphinx&#160;errors.</text><text class="breeze-build-docs-r5" x="1451.8" y="264" textLength="12.2" clip-path="url(#breeze-build-docs-line-10)">│</text><text class="breeze-build-docs-r2" x="1464" y="264" textLength="12.2" clip-path="url(#breeze-build-docs-line-10)">
 </text><text class="breeze-build-docs-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-11)">│</text><text class="breeze-build-docs-r4" x="24.4" y="288.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-11)">-</text><text class="breeze-build-docs-r4" x="36.6" y="288.4" textLength="97.6" clip-path="url(#breeze-build-docs-line-11)">-package</text><text class="breeze-build-docs-r4" x="134.2" y="288.4" textLength="85.4" clip-path="url(#breeze-build-docs-line-11)">-filter</text><text class="breeze-build-docs-r2" x="329.4" y="288.4" textLength="1110.2" clip-path="url(#breeze-build-docs-line-11)">List&#160;of&#160;packages&#160;to&#160;consider.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-build-docs-r5" x="1451.8" y="288.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-11)">│</text><text class="breeze-build-docs-r2" x="1464" y="288.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-11)">
-</text><text class="breeze-build-docs-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-12)">│</text><text class="breeze-build-docs-r7" x="329.4" y="312.8" textLength="1110.2" clip-path="url(#breeze-build-docs-line-12)">(apache-airflow&#160;|&#160;apache-airflow-providers-airbyte&#160;|&#160;apache-airflow-providers-alibaba&#160;|&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="312.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-12)">│</text><text class="breeze-build-docs-r2" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-12)">
-</text><text class="breeze-build-docs-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-13)">│</text><text class="breeze-build-docs-r7" x="329.4" y="337.2" textLength="1110.2" clip-path="url(#breeze-build-docs-line-13)">apache-airflow-providers-amazon&#160;|&#160;apache-airflow-providers-apache-beam&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="337.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-13)">│</text><text class="breeze-build-docs-r2" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-13)">
-</text><text class="breeze-build-docs-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-14)">│</text><text class="breeze-build-docs-r7" x="329.4" y="361.6" textLength="1110.2" clip-path="url(#breeze-build-docs-line-14)">apache-airflow-providers-apache-cassandra&#160;|&#160;apache-airflow-providers-apache-drill&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="361.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-14)">│</text><text class="breeze-build-docs-r2" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-14)">
-</text><text class="breeze-build-docs-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-build-docs-line-15)">│</text><text class="breeze-build-docs-r7" x="329.4" y="386" textLength="1110.2" clip-path="url(#breeze-build-docs-line-15)">apache-airflow-providers-apache-druid&#160;|&#160;apache-airflow-providers-apache-flink&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="386" textLength="12.2" clip-path="url(#breeze-build-docs-line-15)">│</text><text class="breeze-build-docs-r2" x="1464" y="386" textLength="12.2" clip-path="url(#breeze-build-docs-line-15)">
-</text><text class="breeze-build-docs-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-16)">│</text><text class="breeze-build-docs-r7" x="329.4" y="410.4" textLength="1110.2" clip-path="url(#breeze-build-docs-line-16)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="410.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-16)">│</text><text class="breeze-build-docs-r2" x="1464" y="410.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-16)">
-</text><text class="breeze-build-docs-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-17)">│</text><text class="breeze-build-docs-r7" x="329.4" y="434.8" textLength="1110.2" clip-path="url(#breeze-build-docs-line-17)">apache-airflow-providers-apache-impala&#160;|&#160;apache-airflow-providers-apache-kafka&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="434.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-17)">│</text><text class="breeze-build-docs-r2" x="1464" y="434.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-17)">
-</text><text class="breeze-build-docs-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-18)">│</text><text class="breeze-build-docs-r7" x="329.4" y="459.2" textLength="1110.2" clip-path="url(#breeze-build-docs-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;</text><text class="breeze-build-docs-r5" x="1451.8" y="459.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-18)">│</text><text class="breeze-build-docs-r2" x="1464" y="459.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-18)">
-</text><text class="breeze-build-docs-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-19)">│</text><text class="breeze-build-docs-r7" x="329.4" y="483.6" textLength="1110.2" clip-path="url(#breeze-build-docs-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;</text><text class="breeze-build-docs-r5" x="1451.8" y="483.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-19)">│</text><text class="breeze-build-docs-r2" x="1464" y="483.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-19)">
-</text><text class="breeze-build-docs-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-build-docs-line-20)">│</text><text class="breeze-build-docs-r7" x="329.4" y="508" textLength="1110.2" clip-path="url(#breeze-build-docs-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;</text><text class="breeze-build-docs-r5" x="1451.8" y="508" textLength="12.2" clip-path="url(#breeze-build-docs-line-20)">│</text><text class="breeze-build-docs-r2" x="1464" y="508" textLength="12.2" clip-path="url(#breeze-build-docs-line-20)">
-</text><text class="breeze-build-docs-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-21)">│</text><text class="breeze-build-docs-r7" x="329.4" y="532.4" textLength="1110.2" clip-path="url(#breeze-build-docs-line-21)">apache-airflow-providers-apprise&#160;|&#160;apache-airflow-providers-arangodb&#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="breeze-build-docs-r5" x="1451.8" y="532.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-21)">│</text><text class="breeze-build-docs-r2" x="1464" y="532.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-21)">
-</text><text class="breeze-build-docs-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-22)">│</text><text class="breeze-build-docs-r7" x="329.4" y="556.8" textLength="1110.2" clip-path="url(#breeze-build-docs-line-22)">apache-airflow-providers-asana&#160;|&#160;apache-airflow-providers-atlassian-jira&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="556.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-22)">│</text><text class="breeze-build-docs-r2" x="1464" y="556.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-22)">
-</text><text class="breeze-build-docs-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-23)">│</text><text class="breeze-build-docs-r7" x="329.4" y="581.2" textLength="1110.2" clip-path="url(#breeze-build-docs-line-23)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="581.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-23)">│</text><text class="breeze-build-docs-r2" x="1464" y="581.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-23)">
-</text><text class="breeze-build-docs-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-24)">│</text><text class="breeze-build-docs-r7" x="329.4" y="605.6" textLength="1110.2" clip-path="url(#breeze-build-docs-line-24)">apache-airflow-providers-cncf-kubernetes&#160;|&#160;apache-airflow-providers-common-sql&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="605.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-24)">│</text><text class="breeze-build-docs-r2" x="1464" y="605.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-24)">
-</text><text class="breeze-build-docs-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-build-docs-line-25)">│</text><text class="breeze-build-docs-r7" x="329.4" y="630" textLength="1110.2" clip-path="url(#breeze-build-docs-line-25)">apache-airflow-providers-daskexecutor&#160;|&#160;apache-airflow-providers-databricks&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="630" textLength="12.2" clip-path="url(#breeze-build-docs-line-25)">│</text><text class="breeze-build-docs-r2" x="1464" y="630" textLength="12.2" clip-path="url(#breeze-build-docs-line-25)">
-</text><text class="breeze-build-docs-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-26)">│</text><text class="breeze-build-docs-r7" x="329.4" y="654.4" textLength="1110.2" clip-path="url(#breeze-build-docs-line-26)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="654.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-26)">│</text><text class="breeze-build-docs-r2" x="1464" y="654.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-26)">
-</text><text class="breeze-build-docs-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-27)">│</text><text class="breeze-build-docs-r7" x="329.4" y="678.8" textLength="1110.2" clip-path="url(#breeze-build-docs-line-27)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="678.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-27)">│</text><text class="breeze-build-docs-r2" x="1464" y="678.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-27)">
-</text><text class="breeze-build-docs-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-28)">│</text><text class="breeze-build-docs-r7" x="329.4" y="703.2" textLength="1110.2" clip-path="url(#breeze-build-docs-line-28)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="703.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-28)">│</text><text class="breeze-build-docs-r2" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-28)">
-</text><text class="breeze-build-docs-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-29)">│</text><text class="breeze-build-docs-r7" x="329.4" y="727.6" textLength="1110.2" clip-path="url(#breeze-build-docs-line-29)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="727.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-29)">│</text><text class="breeze-build-docs-r2" x="1464" y="727.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-29)">
-</text><text class="breeze-build-docs-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-build-docs-line-30)">│</text><text class="breeze-build-docs-r7" x="329.4" y="752" textLength="1110.2" clip-path="url(#breeze-build-docs-line-30)">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="breeze-build-docs-r5" x="1451.8" y="752" textLength="12.2" clip-path="url(#breeze-build-docs-line-30)">│</text><text class="breeze-build-docs-r2" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-build-docs-line-30)">
-</text><text class="breeze-build-docs-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-31)">│</text><text class="breeze-build-docs-r7" x="329.4" y="776.4" textLength="1110.2" clip-path="url(#breeze-build-docs-line-31)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="776.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-31)">│</text><text class="breeze-build-docs-r2" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-31)">
-</text><text class="breeze-build-docs-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-32)">│</text><text class="breeze-build-docs-r7" x="329.4" y="800.8" textLength="1110.2" clip-path="url(#breeze-build-docs-line-32)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="800.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-32)">│</text><text class="breeze-build-docs-r2" x="1464" y="800.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-32)">
-</text><text class="breeze-build-docs-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-33)">│</text><text class="breeze-build-docs-r7" x="329.4" y="825.2" textLength="1110.2" clip-path="url(#breeze-build-docs-line-33)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="825.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-33)">│</text><text class="breeze-build-docs-r2" x="1464" y="825.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-33)">
-</text><text class="breeze-build-docs-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-34)">│</text><text class="breeze-build-docs-r7" x="329.4" y="849.6" textLength="1110.2" clip-path="url(#breeze-build-docs-line-34)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="849.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-34)">│</text><text class="breeze-build-docs-r2" x="1464" y="849.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-34)">
-</text><text class="breeze-build-docs-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-build-docs-line-35)">│</text><text class="breeze-build-docs-r7" x="329.4" y="874" textLength="1110.2" clip-path="url(#breeze-build-docs-line-35)">apache-airflow-providers-microsoft-azure&#160;|&#160;apache-airflow-providers-microsoft-mssql&#160;|&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="874" textLength="12.2" clip-path="url(#breeze-build-docs-line-35)">│</text><text class="breeze-build-docs-r2" x="1464" y="874" textLength="12.2" clip-path="url(#breeze-build-docs-line-35)">
-</text><text class="breeze-build-docs-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-36)">│</text><text class="breeze-build-docs-r7" x="329.4" y="898.4" textLength="1110.2" clip-path="url(#breeze-build-docs-line-36)">apache-airflow-providers-microsoft-psrp&#160;|&#160;apache-airflow-providers-microsoft-winrm&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="898.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-36)">│</text><text class="breeze-build-docs-r2" x="1464" y="898.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-36)">
-</text><text class="breeze-build-docs-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-37)">│</text><text class="breeze-build-docs-r7" x="329.4" y="922.8" textLength="1110.2" clip-path="url(#breeze-build-docs-line-37)">apache-airflow-providers-mongo&#160;|&#160;apache-airflow-providers-mysql&#160;|&#160;&#160;&#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="breeze-build-docs-r5" x="1451.8" y="922.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-37)">│</text><text class="breeze-build-docs-r2" x="1464" y="922.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-37)">
-</text><text class="breeze-build-docs-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-38)">│</text><text class="breeze-build-docs-r7" x="329.4" y="947.2" textLength="1110.2" clip-path="url(#breeze-build-docs-line-38)">apache-airflow-providers-neo4j&#160;|&#160;apache-airflow-providers-odbc&#160;|&#160;&#160;&#160;&#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="breeze-build-docs-r5" x="1451.8" y="947.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-38)">│</text><text class="breeze-build-docs-r2" x="1464" y="947.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-38)">
-</text><text class="breeze-build-docs-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-39)">│</text><text class="breeze-build-docs-r7" x="329.4" y="971.6" textLength="1110.2" clip-path="url(#breeze-build-docs-line-39)">apache-airflow-providers-openfaas&#160;|&#160;apache-airflow-providers-openlineage&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="971.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-39)">│</text><text class="breeze-build-docs-r2" x="1464" y="971.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-39)">
-</text><text class="breeze-build-docs-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-build-docs-line-40)">│</text><text class="breeze-build-docs-r7" x="329.4" y="996" textLength="1110.2" clip-path="url(#breeze-build-docs-line-40)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="996" textLength="12.2" clip-path="url(#breeze-build-docs-line-40)">│</text><text class="breeze-build-docs-r2" x="1464" y="996" textLength="12.2" clip-path="url(#breeze-build-docs-line-40)">
-</text><text class="breeze-build-docs-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-41)">│</text><text class="breeze-build-docs-r7" x="329.4" y="1020.4" textLength="1110.2" clip-path="url(#breeze-build-docs-line-41)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="1020.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-41)">│</text><text class="breeze-build-docs-r2" x="1464" y="1020.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-41)">
-</text><text class="breeze-build-docs-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-42)">│</text><text class="breeze-build-docs-r7" x="329.4" y="1044.8" textLength="1110.2" clip-path="url(#breeze-build-docs-line-42)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="1044.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-42)">│</text><text class="breeze-build-docs-r2" x="1464" y="1044.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-42)">
-</text><text class="breeze-build-docs-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-43)">│</text><text class="breeze-build-docs-r7" x="329.4" y="1069.2" textLength="1110.2" clip-path="url(#breeze-build-docs-line-43)">apache-airflow-providers-presto&#160;|&#160;apache-airflow-providers-redis&#160;|&#160;&#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="breeze-build-docs-r5" x="1451.8" y="1069.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-43)">│</text><text class="breeze-build-docs-r2" x="1464" y="1069.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-43)">
-</text><text class="breeze-build-docs-r5" x="0" y="1093.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-44)">│</text><text class="breeze-build-docs-r7" x="329.4" y="1093.6" textLength="1110.2" clip-path="url(#breeze-build-docs-line-44)">apache-airflow-providers-salesforce&#160;|&#160;apache-airflow-providers-samba&#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="breeze-build-docs-r5" x="1451.8" y="1093.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-44)">│</text><text class="breeze-build-docs-r2" x="1464" y="1093.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-44)">
-</text><text class="breeze-build-docs-r5" x="0" y="1118" textLength="12.2" clip-path="url(#breeze-build-docs-line-45)">│</text><text class="breeze-build-docs-r7" x="329.4" y="1118" textLength="1110.2" clip-path="url(#breeze-build-docs-line-45)">apache-airflow-providers-segment&#160;|&#160;apache-airflow-providers-sendgrid&#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="breeze-build-docs-r5" x="1451.8" y="1118" textLength="12.2" clip-path="url(#breeze-build-docs-line-45)">│</text><text class="breeze-build-docs-r2" x="1464" y="1118" textLength="12.2" clip-path="url(#breeze-build-docs-line-45)">
-</text><text class="breeze-build-docs-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-46)">│</text><text class="breeze-build-docs-r7" x="329.4" y="1142.4" textLength="1110.2" clip-path="url(#breeze-build-docs-line-46)">apache-airflow-providers-sftp&#160;|&#160;apache-airflow-providers-singularity&#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="breeze-build-docs-r5" x="1451.8" y="1142.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-46)">│</text><text class="breeze-build-docs-r2" x="1464" y="1142.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-46)">
-</text><text class="breeze-build-docs-r5" x="0" y="1166.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-47)">│</text><text class="breeze-build-docs-r7" x="329.4" y="1166.8" textLength="1110.2" clip-path="url(#breeze-build-docs-line-47)">apache-airflow-providers-slack&#160;|&#160;apache-airflow-providers-smtp&#160;|&#160;&#160;&#160;&#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="breeze-build-docs-r5" x="1451.8" y="1166.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-47)">│</text><text class="breeze-build-docs-r2" x="1464" y="1166.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-47)">
-</text><text class="breeze-build-docs-r5" x="0" y="1191.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-48)">│</text><text class="breeze-build-docs-r7" x="329.4" y="1191.2" textLength="1110.2" clip-path="url(#breeze-build-docs-line-48)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="1191.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-48)">│</text><text class="breeze-build-docs-r2" x="1464" y="1191.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-48)">
-</text><text class="breeze-build-docs-r5" x="0" y="1215.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-49)">│</text><text class="breeze-build-docs-r7" x="329.4" y="1215.6" textLength="1110.2" clip-path="url(#breeze-build-docs-line-49)">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="breeze-build-docs-r5" x="1451.8" y="1215.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-49)">│</text><text class="breeze-build-docs-r2" x="1464" y="1215.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-49)">
-</text><text class="breeze-build-docs-r5" x="0" y="1240" textLength="12.2" clip-path="url(#breeze-build-docs-line-50)">│</text><text class="breeze-build-docs-r7" x="329.4" y="1240" textLength="1110.2" clip-path="url(#breeze-build-docs-line-50)">apache-airflow-providers-tabular&#160;|&#160;apache-airflow-providers-telegram&#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="breeze-build-docs-r5" x="1451.8" y="1240" textLength="12.2" clip-path="url(#breeze-build-docs-line-50)">│</text><text class="breeze-build-docs-r2" x="1464" y="1240" textLength="12.2" clip-path="url(#breeze-build-docs-line-50)">
-</text><text class="breeze-build-docs-r5" x="0" y="1264.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-51)">│</text><text class="breeze-build-docs-r7" x="329.4" y="1264.4" textLength="1110.2" clip-path="url(#breeze-build-docs-line-51)">apache-airflow-providers-trino&#160;|&#160;apache-airflow-providers-vertica&#160;|&#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="breeze-build-docs-r5" x="1451.8" y="1264.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-51)">│</text><text class="breeze-build-docs-r2" x="1464" y="1264.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-51)">
-</text><text class="breeze-build-docs-r5" x="0" y="1288.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-52)">│</text><text class="breeze-build-docs-r7" x="329.4" y="1288.8" textLength="1110.2" clip-path="url(#breeze-build-docs-line-52)">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;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="1288.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-52)">│</text><text class="breeze-build-docs-r2" x="1464" y="1288.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-52)">
+</text><text class="breeze-build-docs-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-12)">│</text><text class="breeze-build-docs-r7" x="329.4" y="312.8" textLength="1110.2" clip-path="url(#breeze-build-docs-line-12)">(apache-airflow&#160;|&#160;docker-stack&#160;|&#160;helm-chart&#160;|&#160;apache-airflow-providers-airbyte&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="312.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-12)">│</text><text class="breeze-build-docs-r2" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-12)">
+</text><text class="breeze-build-docs-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-13)">│</text><text class="breeze-build-docs-r7" x="329.4" y="337.2" textLength="1110.2" clip-path="url(#breeze-build-docs-line-13)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="337.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-13)">│</text><text class="breeze-build-docs-r2" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-13)">
+</text><text class="breeze-build-docs-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-14)">│</text><text class="breeze-build-docs-r7" x="329.4" y="361.6" textLength="1110.2" clip-path="url(#breeze-build-docs-line-14)">apache-airflow-providers-apache-beam&#160;|&#160;apache-airflow-providers-apache-cassandra&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="361.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-14)">│</text><text class="breeze-build-docs-r2" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-14)">
+</text><text class="breeze-build-docs-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-build-docs-line-15)">│</text><text class="breeze-build-docs-r7" x="329.4" y="386" textLength="1110.2" clip-path="url(#breeze-build-docs-line-15)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="386" textLength="12.2" clip-path="url(#breeze-build-docs-line-15)">│</text><text class="breeze-build-docs-r2" x="1464" y="386" textLength="12.2" clip-path="url(#breeze-build-docs-line-15)">
+</text><text class="breeze-build-docs-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-16)">│</text><text class="breeze-build-docs-r7" x="329.4" y="410.4" textLength="1110.2" clip-path="url(#breeze-build-docs-line-16)">apache-airflow-providers-apache-flink&#160;|&#160;apache-airflow-providers-apache-hdfs&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="410.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-16)">│</text><text class="breeze-build-docs-r2" x="1464" y="410.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-16)">
+</text><text class="breeze-build-docs-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-17)">│</text><text class="breeze-build-docs-r7" x="329.4" y="434.8" textLength="1110.2" clip-path="url(#breeze-build-docs-line-17)">apache-airflow-providers-apache-hive&#160;|&#160;apache-airflow-providers-apache-impala&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="434.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-17)">│</text><text class="breeze-build-docs-r2" x="1464" y="434.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-17)">
+</text><text class="breeze-build-docs-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-18)">│</text><text class="breeze-build-docs-r7" x="329.4" y="459.2" textLength="1110.2" clip-path="url(#breeze-build-docs-line-18)">apache-airflow-providers-apache-kafka&#160;|&#160;apache-airflow-providers-apache-kylin&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="459.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-18)">│</text><text class="breeze-build-docs-r2" x="1464" y="459.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-18)">
+</text><text class="breeze-build-docs-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-19)">│</text><text class="breeze-build-docs-r7" x="329.4" y="483.6" textLength="1110.2" clip-path="url(#breeze-build-docs-line-19)">apache-airflow-providers-apache-livy&#160;|&#160;apache-airflow-providers-apache-pig&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="483.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-19)">│</text><text class="breeze-build-docs-r2" x="1464" y="483.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-19)">
+</text><text class="breeze-build-docs-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-build-docs-line-20)">│</text><text class="breeze-build-docs-r7" x="329.4" y="508" textLength="1110.2" clip-path="url(#breeze-build-docs-line-20)">apache-airflow-providers-apache-pinot&#160;|&#160;apache-airflow-providers-apache-spark&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="508" textLength="12.2" clip-path="url(#breeze-build-docs-line-20)">│</text><text class="breeze-build-docs-r2" x="1464" y="508" textLength="12.2" clip-path="url(#breeze-build-docs-line-20)">
+</text><text class="breeze-build-docs-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-21)">│</text><text class="breeze-build-docs-r7" x="329.4" y="532.4" textLength="1110.2" clip-path="url(#breeze-build-docs-line-21)">apache-airflow-providers-apache-sqoop&#160;|&#160;apache-airflow-providers-apprise&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="532.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-21)">│</text><text class="breeze-build-docs-r2" x="1464" y="532.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-21)">
+</text><text class="breeze-build-docs-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-22)">│</text><text class="breeze-build-docs-r7" x="329.4" y="556.8" textLength="1110.2" clip-path="url(#breeze-build-docs-line-22)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="556.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-22)">│</text><text class="breeze-build-docs-r2" x="1464" y="556.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-22)">
+</text><text class="breeze-build-docs-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-23)">│</text><text class="breeze-build-docs-r7" x="329.4" y="581.2" textLength="1110.2" clip-path="url(#breeze-build-docs-line-23)">apache-airflow-providers-atlassian-jira&#160;|&#160;apache-airflow-providers-celery&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="581.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-23)">│</text><text class="breeze-build-docs-r2" x="1464" y="581.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-23)">
+</text><text class="breeze-build-docs-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-24)">│</text><text class="breeze-build-docs-r7" x="329.4" y="605.6" textLength="1110.2" clip-path="url(#breeze-build-docs-line-24)">apache-airflow-providers-cloudant&#160;|&#160;apache-airflow-providers-cncf-kubernetes&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="605.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-24)">│</text><text class="breeze-build-docs-r2" x="1464" y="605.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-24)">
+</text><text class="breeze-build-docs-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-build-docs-line-25)">│</text><text class="breeze-build-docs-r7" x="329.4" y="630" textLength="1110.2" clip-path="url(#breeze-build-docs-line-25)">apache-airflow-providers-common-sql&#160;|&#160;apache-airflow-providers-daskexecutor&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="630" textLength="12.2" clip-path="url(#breeze-build-docs-line-25)">│</text><text class="breeze-build-docs-r2" x="1464" y="630" textLength="12.2" clip-path="url(#breeze-build-docs-line-25)">
+</text><text class="breeze-build-docs-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-26)">│</text><text class="breeze-build-docs-r7" x="329.4" y="654.4" textLength="1110.2" clip-path="url(#breeze-build-docs-line-26)">apache-airflow-providers-databricks&#160;|&#160;apache-airflow-providers-datadog&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="654.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-26)">│</text><text class="breeze-build-docs-r2" x="1464" y="654.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-26)">
+</text><text class="breeze-build-docs-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-27)">│</text><text class="breeze-build-docs-r7" x="329.4" y="678.8" textLength="1110.2" clip-path="url(#breeze-build-docs-line-27)">apache-airflow-providers-dbt-cloud&#160;|&#160;apache-airflow-providers-dingding&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="678.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-27)">│</text><text class="breeze-build-docs-r2" x="1464" y="678.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-27)">
+</text><text class="breeze-build-docs-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-28)">│</text><text class="breeze-build-docs-r7" x="329.4" y="703.2" textLength="1110.2" clip-path="url(#breeze-build-docs-line-28)">apache-airflow-providers-discord&#160;|&#160;apache-airflow-providers-docker&#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="breeze-build-docs-r5" x="1451.8" y="703.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-28)">│</text><text class="breeze-build-docs-r2" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-28)">
+</text><text class="breeze-build-docs-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-29)">│</text><text class="breeze-build-docs-r7" x="329.4" y="727.6" textLength="1110.2" clip-path="url(#breeze-build-docs-line-29)">apache-airflow-providers-elasticsearch&#160;|&#160;apache-airflow-providers-exasol&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="727.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-29)">│</text><text class="breeze-build-docs-r2" x="1464" y="727.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-29)">
+</text><text class="breeze-build-docs-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-build-docs-line-30)">│</text><text class="breeze-build-docs-r7" x="329.4" y="752" textLength="1110.2" clip-path="url(#breeze-build-docs-line-30)">apache-airflow-providers-facebook&#160;|&#160;apache-airflow-providers-ftp&#160;|&#160;&#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="breeze-build-docs-r5" x="1451.8" y="752" textLength="12.2" clip-path="url(#breeze-build-docs-line-30)">│</text><text class="breeze-build-docs-r2" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-build-docs-line-30)">
+</text><text class="breeze-build-docs-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-31)">│</text><text class="breeze-build-docs-r7" x="329.4" y="776.4" textLength="1110.2" clip-path="url(#breeze-build-docs-line-31)">apache-airflow-providers-github&#160;|&#160;apache-airflow-providers-google&#160;|&#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="breeze-build-docs-r5" x="1451.8" y="776.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-31)">│</text><text class="breeze-build-docs-r2" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-31)">
+</text><text class="breeze-build-docs-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-32)">│</text><text class="breeze-build-docs-r7" x="329.4" y="800.8" textLength="1110.2" clip-path="url(#breeze-build-docs-line-32)">apache-airflow-providers-grpc&#160;|&#160;apache-airflow-providers-hashicorp&#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="breeze-build-docs-r5" x="1451.8" y="800.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-32)">│</text><text class="breeze-build-docs-r2" x="1464" y="800.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-32)">
+</text><text class="breeze-build-docs-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-33)">│</text><text class="breeze-build-docs-r7" x="329.4" y="825.2" textLength="1110.2" clip-path="url(#breeze-build-docs-line-33)">apache-airflow-providers-http&#160;|&#160;apache-airflow-providers-imap&#160;|&#160;&#160;&#160;&#160;&#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="breeze-build-docs-r5" x="1451.8" y="825.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-33)">│</text><text class="breeze-build-docs-r2" x="1464" y="825.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-33)">
+</text><text class="breeze-build-docs-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-34)">│</text><text class="breeze-build-docs-r7" x="329.4" y="849.6" textLength="1110.2" clip-path="url(#breeze-build-docs-line-34)">apache-airflow-providers-influxdb&#160;|&#160;apache-airflow-providers-jdbc&#160;|&#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="breeze-build-docs-r5" x="1451.8" y="849.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-34)">│</text><text class="breeze-build-docs-r2" x="1464" y="849.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-34)">
+</text><text class="breeze-build-docs-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-build-docs-line-35)">│</text><text class="breeze-build-docs-r7" x="329.4" y="874" textLength="1110.2" clip-path="url(#breeze-build-docs-line-35)">apache-airflow-providers-jenkins&#160;|&#160;apache-airflow-providers-microsoft-azure&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="874" textLength="12.2" clip-path="url(#breeze-build-docs-line-35)">│</text><text class="breeze-build-docs-r2" x="1464" y="874" textLength="12.2" clip-path="url(#breeze-build-docs-line-35)">
+</text><text class="breeze-build-docs-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-36)">│</text><text class="breeze-build-docs-r7" x="329.4" y="898.4" textLength="1110.2" clip-path="url(#breeze-build-docs-line-36)">apache-airflow-providers-microsoft-mssql&#160;|&#160;apache-airflow-providers-microsoft-psrp&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="898.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-36)">│</text><text class="breeze-build-docs-r2" x="1464" y="898.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-36)">
+</text><text class="breeze-build-docs-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-37)">│</text><text class="breeze-build-docs-r7" x="329.4" y="922.8" textLength="1110.2" clip-path="url(#breeze-build-docs-line-37)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="922.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-37)">│</text><text class="breeze-build-docs-r2" x="1464" y="922.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-37)">
+</text><text class="breeze-build-docs-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-38)">│</text><text class="breeze-build-docs-r7" x="329.4" y="947.2" textLength="1110.2" clip-path="url(#breeze-build-docs-line-38)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="947.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-38)">│</text><text class="breeze-build-docs-r2" x="1464" y="947.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-38)">
+</text><text class="breeze-build-docs-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-39)">│</text><text class="breeze-build-docs-r7" x="329.4" y="971.6" textLength="1110.2" clip-path="url(#breeze-build-docs-line-39)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="971.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-39)">│</text><text class="breeze-build-docs-r2" x="1464" y="971.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-39)">
+</text><text class="breeze-build-docs-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-build-docs-line-40)">│</text><text class="breeze-build-docs-r7" x="329.4" y="996" textLength="1110.2" clip-path="url(#breeze-build-docs-line-40)">apache-airflow-providers-openlineage&#160;|&#160;apache-airflow-providers-opsgenie&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-build-docs-r5" x="1451.8" y="996" textLength="12.2" clip-path="url(#breeze-build-docs-line-40)">│</text><text class="breeze-build-docs-r2" x="1464" y="996" textLength="12.2" clip-path="url(#breeze-build-docs-line-40)">
+</text><text class="breeze-build-docs-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-41)">│</text><text class="breeze-build-docs-r7" x="329.4" y="1020.4" textLength="1110.2" clip-path="url(#breeze-build-docs-line-41)">apache-airflow-providers-oracle&#160;|&#160;apache-airflow-providers-pagerduty&#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="breeze-build-docs-r5" x="1451.8" y="1020.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-41)">│</text><text class="breeze-build-docs-r2" x="1464" y="1020.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-41)">
+</text><text class="breeze-build-docs-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-42)">│</text><text class="breeze-build-docs-r7" x="329.4" y="1044.8" textLength="1110.2" clip-path="url(#breeze-build-docs-line-42)">apache-airflow-providers-papermill&#160;|&#160;apache-airflow-providers-plexus&#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="breeze-build-docs-r5" x="1451.8" y="1044.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-42)">│</text><text class="breeze-build-docs-r2" x="1464" y="1044.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-42)">
+</text><text class="breeze-build-docs-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-43)">│</text><text class="breeze-build-docs-r7" x="329.4" y="1069.2" textLength="1110.2" clip-path="url(#breeze-build-docs-line-43)">apache-airflow-providers-postgres&#160;|&#160;apache-airflow-providers-presto&#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="breeze-build-docs-r5" x="1451.8" y="1069.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-43)">│</text><text class="breeze-build-docs-r2" x="1464" y="1069.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-43)">
+</text><text class="breeze-build-docs-r5" x="0" y="1093.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-44)">│</text><text class="breeze-build-docs-r7" x="329.4" y="1093.6" textLength="1110.2" clip-path="url(#breeze-build-docs-line-44)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="1093.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-44)">│</text><text class="breeze-build-docs-r2" x="1464" y="1093.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-44)">
+</text><text class="breeze-build-docs-r5" x="0" y="1118" textLength="12.2" clip-path="url(#breeze-build-docs-line-45)">│</text><text class="breeze-build-docs-r7" x="329.4" y="1118" textLength="1110.2" clip-path="url(#breeze-build-docs-line-45)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="1118" textLength="12.2" clip-path="url(#breeze-build-docs-line-45)">│</text><text class="breeze-build-docs-r2" x="1464" y="1118" textLength="12.2" clip-path="url(#breeze-build-docs-line-45)">
+</text><text class="breeze-build-docs-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-46)">│</text><text class="breeze-build-docs-r7" x="329.4" y="1142.4" textLength="1110.2" clip-path="url(#breeze-build-docs-line-46)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="1142.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-46)">│</text><text class="breeze-build-docs-r2" x="1464" y="1142.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-46)">
+</text><text class="breeze-build-docs-r5" x="0" y="1166.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-47)">│</text><text class="breeze-build-docs-r7" x="329.4" y="1166.8" textLength="1110.2" clip-path="url(#breeze-build-docs-line-47)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="1166.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-47)">│</text><text class="breeze-build-docs-r2" x="1464" y="1166.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-47)">
+</text><text class="breeze-build-docs-r5" x="0" y="1191.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-48)">│</text><text class="breeze-build-docs-r7" x="329.4" y="1191.2" textLength="1110.2" clip-path="url(#breeze-build-docs-line-48)">apache-airflow-providers-smtp&#160;|&#160;apache-airflow-providers-snowflake&#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="breeze-build-docs-r5" x="1451.8" y="1191.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-48)">│</text><text class="breeze-build-docs-r2" x="1464" y="1191.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-48)">
+</text><text class="breeze-build-docs-r5" x="0" y="1215.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-49)">│</text><text class="breeze-build-docs-r7" x="329.4" y="1215.6" textLength="1110.2" clip-path="url(#breeze-build-docs-line-49)">apache-airflow-providers-sqlite&#160;|&#160;apache-airflow-providers-ssh&#160;|&#160;&#160;&#160;&#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="breeze-build-docs-r5" x="1451.8" y="1215.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-49)">│</text><text class="breeze-build-docs-r2" x="1464" y="1215.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-49)">
+</text><text class="breeze-build-docs-r5" x="0" y="1240" textLength="12.2" clip-path="url(#breeze-build-docs-line-50)">│</text><text class="breeze-build-docs-r7" x="329.4" y="1240" textLength="1110.2" clip-path="url(#breeze-build-docs-line-50)">apache-airflow-providers-tableau&#160;|&#160;apache-airflow-providers-tabular&#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="breeze-build-docs-r5" x="1451.8" y="1240" textLength="12.2" clip-path="url(#breeze-build-docs-line-50)">│</text><text class="breeze-build-docs-r2" x="1464" y="1240" textLength="12.2" clip-path="url(#breeze-build-docs-line-50)">
+</text><text class="breeze-build-docs-r5" x="0" y="1264.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-51)">│</text><text class="breeze-build-docs-r7" x="329.4" y="1264.4" textLength="1110.2" clip-path="url(#breeze-build-docs-line-51)">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;</text><text class="breeze-build-docs-r5" x="1451.8" y="1264.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-51)">│</text><text class="breeze-build-docs-r2" x="1464" y="1264.4" textLength="12.2" clip-path="url(#breeze-build-docs-line-51)">
+</text><text class="breeze-build-docs-r5" x="0" y="1288.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-52)">│</text><text class="breeze-build-docs-r7" x="329.4" y="1288.8" textLength="1110.2" clip-path="url(#breeze-build-docs-line-52)">apache-airflow-providers-vertica&#160;|&#160;apache-airflow-providers-zendesk)&#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="breeze-build-docs-r5" x="1451.8" y="1288.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-52)">│</text><text class="breeze-build-docs-r2" x="1464" y="1288.8" textLength="12.2" clip-path="url(#breeze-build-docs-line-52)">
 </text><text class="breeze-build-docs-r5" x="0" y="1313.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-53)">│</text><text class="breeze-build-docs-r4" x="24.4" y="1313.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-53)">-</text><text class="breeze-build-docs-r4" x="36.6" y="1313.2" textLength="85.4" clip-path="url(#breeze-build-docs-line-53)">-github</text><text class="breeze-build-docs-r4" x="122" y="1313.2" textLength="134.2" clip-path="url(#breeze-build-docs-line-53)">-repository</text><text class="breeze-build-docs-r6" x="280.6" y="1313.2" textLength="24.4" clip-path="url(#breeze-build-docs-line-53)">-g</text><text class="breeze-build-docs-r2" x="329.4" y="1313.2" textLength="585.6" clip-path="url(#breeze-build-docs-line-53)">GitHub&#160;repository&#160;used&#160;to&#160;pull,&#160;push&#160;run&#160;images.</text><text class="breeze-build-docs-r7" x="927.2" y="1313.2" textLength="73.2" clip-path="url(#breeze-build-docs-line-53)">(TEXT)</text><text class="breeze-build-docs-r5" x="1012.6" y="1313.2" textLength="305" clip-path="url(#breeze-build-docs-line-53)">[default:&#160;apache/airflow]</text><text class="breeze-build-docs-r5" x="1451.8" y="1313.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-53)">│</text><text class="breeze-build-docs-r2" x="1464" y="1313.2" textLength="12.2" clip-path="url(#breeze-build-docs-line-53)">
 </text><text class="breeze-build-docs-r5" x="0" y="1337.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-54)">│</text><text class="breeze-build-docs-r4" x="24.4" y="1337.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-54)">-</text><text class="breeze-build-docs-r4" x="36.6" y="1337.6" textLength="97.6" clip-path="url(#breeze-build-docs-line-54)">-builder</text><text class="breeze-build-docs-r2" x="329.4" y="1337.6" textLength="756.4" clip-path="url(#breeze-build-docs-line-54)">Buildx&#160;builder&#160;used&#160;to&#160;perform&#160;`docker&#160;buildx&#160;build`&#160;commands.</text><text class="breeze-build-docs-r7" x="1098" y="1337.6" textLength="73.2" clip-path="url(#breeze-build-docs-line-54)">(TEXT)</text><text class="breeze-build-docs-r5" x="1183.4" y="1337.6" textLength="256.2" clip-path="url(#breeze-build-docs-line-54)">[default:&#160;autodetect]</text><text class="breeze-build-docs-r5" x="1451.8" y="1337.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-54)">│</text><text class="breeze-build-docs-r2" x="1464" y="1337.6" textLength="12.2" clip-path="url(#breeze-build-docs-line-54)">
 </text><text class="breeze-build-docs-r5" x="0" y="1362" textLength="1464" clip-path="url(#breeze-build-docs-line-55)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-build-docs-r2" x="1464" y="1362" textLength="12.2" clip-path="url(#breeze-build-docs-line-55)">
diff --git a/images/breeze/output_release-management.svg b/images/breeze/output_release-management.svg
index 35c092afae4e0..fad73508b9b50 100644
--- a/images/breeze/output_release-management.svg
+++ b/images/breeze/output_release-management.svg
@@ -170,9 +170,9 @@
 </text><text class="breeze-release-management-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-line-21)">│</text><text class="breeze-release-management-r4" x="24.4" y="532.4" textLength="439.2" clip-path="url(#breeze-release-management-line-21)">generate-issue-content-providers&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-r2" x="488" y="532.4" textLength="951.6" clip-path="url(#breeze-release-management-line-21)">Generates&#160;content&#160;for&#160;issue&#160;to&#160;test&#160;the&#160;release.&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-release-management-r5" x="1451.8" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-line-21)">│</text><text class="breeze-release-management-r2" x="1464" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-line-21)">
 </text><text class="breeze-release-management-r5" x="0" y="556.8" textLength="1464" clip-path="url(#breeze-release-management-line-22)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-r2" x="1464" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-line-22)">
 </text><text class="breeze-release-management-r5" x="0" y="581.2" textLength="24.4" clip-path="url(#breeze-release-management-line-23)">╭─</text><text class="breeze-release-management-r5" x="24.4" y="581.2" textLength="292.8" clip-path="url(#breeze-release-management-line-23)">&#160;Other&#160;release&#160;commands&#160;</text><text class="breeze-release-management-r5" x="317.2" y="581.2" textLength="1122.4" clip-path="url(#breeze-release-management-line-23)">────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-release-management-r5" x="1439.6" y="581.2" textLength="24.4" clip-path="url(#breeze-release-management-line-23)">─╮</text><text class="breeze-release-management-r2" x="1464" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-line-23)">
-</text><text class="breeze-release-management-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-line-24)">│</text><text class="breeze-release-management-r4" x="24.4" y="605.6" textLength="292.8" clip-path="url(#breeze-release-management-line-24)">publish-docs&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-r2" x="341.6" y="605.6" textLength="1098" clip-path="url(#breeze-release-management-line-24)">Command&#160;to&#160;publish&#160;generated&#160;documentation&#160;to&#160;airflow-site&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-release-management-r5" x="1451.8" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-line-24)">│</text><text class="breeze-release-management-r2" x="1464" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-line-24)">
-</text><text class="breeze-release-management-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-line-25)">│</text><text class="breeze-release-management-r4" x="24.4" y="630" textLength="292.8" clip-path="url(#breeze-release-management-line-25)">generate-constraints&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-r2" x="341.6" y="630" textLength="1098" clip-path="url(#breeze-release-management-line-25)">Generates&#160;pinned&#160;constraint&#160;files&#160;with&#160;all&#160;extras&#160;from&#160;setup.py&#160;in&#160;parallel.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-r5" x="1451.8" y="630" textLength="12.2" clip-path="url(#breeze-release-management-line-25)">│</text><text class="breeze-release-management-r2" x="1464" y="630" textLength="12.2" clip-path="url(#breeze-release-management-line-25)">
-</text><text class="breeze-release-management-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-line-26)">│</text><text class="breeze-release-management-r4" x="24.4" y="654.4" textLength="292.8" clip-path="url(#breeze-release-management-line-26)">add-back-references&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-r2" x="341.6" y="654.4" textLength="1098" clip-path="url(#breeze-release-management-line-26)">Command&#160;to&#160;add&#160;back&#160;references&#160;for&#160;documentation&#160;to&#160;make&#160;it&#160;backward&#160;compatible&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-r5" x="1451.8" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-line-26)">│</text><text class="breeze-release-management-r2" x="1464" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-line-26)">
+</text><text class="breeze-release-management-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-line-24)">│</text><text class="breeze-release-management-r4" x="24.4" y="605.6" textLength="280.6" clip-path="url(#breeze-release-management-line-24)">publish-docs&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-r2" x="329.4" y="605.6" textLength="1110.2" clip-path="url(#breeze-release-management-line-24)">Command&#160;to&#160;publish&#160;generated&#160;documentation&#160;to&#160;airflow-site&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-release-management-r5" x="1451.8" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-line-24)">│</text><text class="breeze-release-management-r2" x="1464" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-line-24)">
+</text><text class="breeze-release-management-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-line-25)">│</text><text class="breeze-release-management-r4" x="24.4" y="630" textLength="280.6" clip-path="url(#breeze-release-management-line-25)">generate-constraints&#160;&#160;&#160;</text><text class="breeze-release-management-r2" x="329.4" y="630" textLength="1110.2" clip-path="url(#breeze-release-management-line-25)">Generates&#160;pinned&#160;constraint&#160;files&#160;with&#160;all&#160;extras&#160;from&#160;setup.py&#160;in&#160;parallel.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-r5" x="1451.8" y="630" textLength="12.2" clip-path="url(#breeze-release-management-line-25)">│</text><text class="breeze-release-management-r2" x="1464" y="630" textLength="12.2" clip-path="url(#breeze-release-management-line-25)">
+</text><text class="breeze-release-management-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-line-26)">│</text><text class="breeze-release-management-r4" x="24.4" y="654.4" textLength="280.6" clip-path="url(#breeze-release-management-line-26)">add-back-references&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-r2" x="329.4" y="654.4" textLength="1110.2" clip-path="url(#breeze-release-management-line-26)">Command&#160;to&#160;add&#160;back&#160;references&#160;for&#160;documentation&#160;to&#160;make&#160;it&#160;backward&#160;compatible.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-r5" x="1451.8" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-line-26)">│</text><text class="breeze-release-management-r2" x="1464" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-line-26)">
 </text><text class="breeze-release-management-r5" x="0" y="678.8" textLength="1464" clip-path="url(#breeze-release-management-line-27)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-r2" x="1464" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-line-27)">
 </text><text class="breeze-release-management-r5" x="0" y="703.2" textLength="24.4" clip-path="url(#breeze-release-management-line-28)">╭─</text><text class="breeze-release-management-r5" x="24.4" y="703.2" textLength="122" clip-path="url(#breeze-release-management-line-28)">&#160;Commands&#160;</text><text class="breeze-release-management-r5" x="146.4" y="703.2" textLength="1293.2" clip-path="url(#breeze-release-management-line-28)">──────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-release-management-r5" x="1439.6" y="703.2" textLength="24.4" clip-path="url(#breeze-release-management-line-28)">─╮</text><text class="breeze-release-management-r2" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-line-28)">
 </text><text class="breeze-release-management-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-line-29)">│</text><text class="breeze-release-management-r4" x="24.4" y="727.6" textLength="390.4" clip-path="url(#breeze-release-management-line-29)">update-constraints&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-r2" x="439.2" y="727.6" textLength="1000.4" clip-path="url(#breeze-release-management-line-29)">Update&#160;released&#160;constraints&#160;with&#160;manual&#160;changes.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-release-management-r5" x="1451.8" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-line-29)">│</text><text class="breeze-release-management-r2" x="1464" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-line-29)">
diff --git a/images/breeze/output_release-management_add-back-references.svg b/images/breeze/output_release-management_add-back-references.svg
index 4b11252146575..a5de4dafee89b 100644
--- a/images/breeze/output_release-management_add-back-references.svg
+++ b/images/breeze/output_release-management_add-back-references.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 830.8" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 757.5999999999999" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -45,7 +45,7 @@
 
     <defs>
     <clipPath id="breeze-release-management-add-back-references-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="779.8" />
+      <rect x="0" y="0" width="1463.0" height="706.5999999999999" />
     </clipPath>
     <clipPath id="breeze-release-management-add-back-references-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -131,18 +131,9 @@
 <clipPath id="breeze-release-management-add-back-references-line-27">
     <rect x="0" y="660.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="breeze-release-management-add-back-references-line-28">
-    <rect x="0" y="684.7" width="1464" height="24.65"/>
-            </clipPath>
-<clipPath id="breeze-release-management-add-back-references-line-29">
-    <rect x="0" y="709.1" width="1464" height="24.65"/>
-            </clipPath>
-<clipPath id="breeze-release-management-add-back-references-line-30">
-    <rect x="0" y="733.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="828.8" rx="8"/><text class="breeze-release-management-add-back-references-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;release-management&#160;add-back-references</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="755.6" rx="8"/><text class="breeze-release-management-add-back-references-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;release-management&#160;add-back-references</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -153,37 +144,34 @@
     
     <g class="breeze-release-management-add-back-references-matrix">
     <text class="breeze-release-management-add-back-references-r2" x="1464" y="20" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-0)">
-</text><text class="breeze-release-management-add-back-references-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#breeze-release-management-add-back-references-line-1)">Usage:&#160;</text><text class="breeze-release-management-add-back-references-r1" x="97.6" y="44.4" textLength="573.4" clip-path="url(#breeze-release-management-add-back-references-line-1)">breeze&#160;release-management&#160;add-back-references&#160;[</text><text class="breeze-release-management-add-back-references-r4" x="671" y="44.4" textLength="85.4" clip-path="url(#breeze-release-management-add-back-references-line-1)">OPTIONS</text><text class="breeze-release-management-add-back-references-r1" x="756.4" y="44.4" textLength="549" clip-path="url(#breeze-release-management-add-back-references-line-1)">]&#160;[airbyte&#160;|&#160;alibaba&#160;|&#160;amazon&#160;|&#160;apache.beam&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-1)">
-</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="68.8" textLength="1415.2" clip-path="url(#breeze-release-management-add-back-references-line-2)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.cassandra&#160;|&#160;apache.drill&#160;|&#160;apache.druid&#160;|&#160;apache.flink&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-2)">
-</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="93.2" textLength="1354.2" clip-path="url(#breeze-release-management-add-back-references-line-3)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.hdfs&#160;|&#160;apache.hive&#160;|&#160;apache.impala&#160;|&#160;apache.kafka&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-3)">
-</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="117.6" textLength="1329.8" clip-path="url(#breeze-release-management-add-back-references-line-4)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.kylin&#160;|&#160;apache.livy&#160;|&#160;apache.pig&#160;|&#160;apache.pinot&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-4)">
-</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="142" textLength="1354.2" clip-path="url(#breeze-release-management-add-back-references-line-5)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.spark&#160;|&#160;apache.sqoop&#160;|&#160;apprise&#160;|&#160;arangodb&#160;|&#160;asana&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="142" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-5)">
-</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="166.4" textLength="1439.6" clip-path="url(#breeze-release-management-add-back-references-line-6)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;atlassian.jira&#160;|&#160;celery&#160;|&#160;cloudant&#160;|&#160;cncf.kubernetes&#160;|&#160;common.sql</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="166.4" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-6)">
-</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="190.8" textLength="1403" clip-path="url(#breeze-release-management-add-back-references-line-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;|&#160;daskexecutor&#160;|&#160;databricks&#160;|&#160;datadog&#160;|&#160;dbt.cloud&#160;|&#160;dingding&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-7)">
-</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="215.2" textLength="1378.6" clip-path="url(#breeze-release-management-add-back-references-line-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;discord&#160;|&#160;docker&#160;|&#160;elasticsearch&#160;|&#160;exasol&#160;|&#160;facebook&#160;|&#160;ftp&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="215.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-8)">
-</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="239.6" textLength="1390.8" clip-path="url(#breeze-release-management-add-back-references-line-9)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;github&#160;|&#160;google&#160;|&#160;grpc&#160;|&#160;hashicorp&#160;|&#160;http&#160;|&#160;imap&#160;|&#160;influxdb&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="239.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-9)">
-</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="264" textLength="1281" clip-path="url(#breeze-release-management-add-back-references-line-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;jdbc&#160;|&#160;jenkins&#160;|&#160;microsoft.azure&#160;|&#160;microsoft.mssql&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="264" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-10)">
-</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="288.4" textLength="1439.6" clip-path="url(#breeze-release-management-add-back-references-line-11)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;microsoft.psrp&#160;|&#160;microsoft.winrm&#160;|&#160;mongo&#160;|&#160;mysql&#160;|&#160;neo4j&#160;|&#160;odbc&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="288.4" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-11)">
-</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="312.8" textLength="1329.8" clip-path="url(#breeze-release-management-add-back-references-line-12)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;openfaas&#160;|&#160;openlineage&#160;|&#160;opsgenie&#160;|&#160;oracle&#160;|&#160;pagerduty&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-12)">
-</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="337.2" textLength="1390.8" clip-path="url(#breeze-release-management-add-back-references-line-13)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;papermill&#160;|&#160;plexus&#160;|&#160;postgres&#160;|&#160;presto&#160;|&#160;redis&#160;|&#160;salesforce&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-13)">
-</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="361.6" textLength="1427.4" clip-path="url(#breeze-release-management-add-back-references-line-14)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;samba&#160;|&#160;segment&#160;|&#160;sendgrid&#160;|&#160;sftp&#160;|&#160;singularity&#160;|&#160;slack&#160;|&#160;smtp&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-14)">
-</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="386" textLength="1439.6" clip-path="url(#breeze-release-management-add-back-references-line-15)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;snowflake&#160;|&#160;sqlite&#160;|&#160;ssh&#160;|&#160;tableau&#160;|&#160;tabular&#160;|&#160;telegram&#160;|&#160;trino&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="386" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-15)">
-</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="410.4" textLength="902.8" clip-path="url(#breeze-release-management-add-back-references-line-16)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;vertica&#160;|&#160;zendesk]...</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-16)">
-</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-17)">
-</text><text class="breeze-release-management-add-back-references-r2" x="12.2" y="459.2" textLength="963.8" clip-path="url(#breeze-release-management-add-back-references-line-18)">Command&#160;to&#160;add&#160;back&#160;references&#160;for&#160;documentation&#160;to&#160;make&#160;it&#160;backward&#160;compatible</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-18)">
-</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-19)">
-</text><text class="breeze-release-management-add-back-references-r5" x="0" y="508" textLength="24.4" clip-path="url(#breeze-release-management-add-back-references-line-20)">╭─</text><text class="breeze-release-management-add-back-references-r5" x="24.4" y="508" textLength="353.8" clip-path="url(#breeze-release-management-add-back-references-line-20)">&#160;Add&#160;Back&#160;References&#160;to&#160;Docs&#160;</text><text class="breeze-release-management-add-back-references-r5" x="378.2" y="508" textLength="1061.4" clip-path="url(#breeze-release-management-add-back-references-line-20)">───────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-release-management-add-back-references-r5" x="1439.6" y="508" textLength="24.4" clip-path="url(#breeze-release-management-add-back-references-line-20)">─╮</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="508" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-20)">
-</text><text class="breeze-release-management-add-back-references-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-21)">│</text><text class="breeze-release-management-add-back-references-r6" x="24.4" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-21)">*</text><text class="breeze-release-management-add-back-references-r4" x="61" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-21)">-</text><text class="breeze-release-management-add-back-references-r4" x="73.2" y="532.4" textLength="97.6" clip-path="url(#breeze-release-management-add-back-references-line-21)">-airflow</text><text class="breeze-release-management-add-back-references-r4" x="170.8" y="532.4" textLength="183" clip-path="url(#breeze-release-management-add-back-references-line-21)">-site-directory</text><text class="breeze-release-management-add-back-references-r7" x="378.2" y="532.4" textLength="24.4" clip-path="url(#breeze-release-management-add-back-references-line-21)">-a</text><text class="breeze-release-management-add-back-references-r2" x="427" y="532.4" textLength="597.8" clip-path="url(#breeze-release-management-add-back-references-line-21)">Local&#160;directory&#160;path&#160;of&#160;cloned&#160;airflow-site&#160;repo.</text><text class="breeze-release-management-add-back-references-r8" x="1037" y="532.4" textLength="134.2" clip-path="url(#breeze-release-management-add-back-references-line-21)">(DIRECTORY)</text><text class="breeze-release-management-add-back-references-r9" x="1183.4" y="532.4" textLength="122" clip-path="url(#breeze-release-management-add-back-references-line-21)">[required]</text><text class="breeze-release-management-add-back-references-r5" x="1451.8" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-21)">│</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-21)">
-</text><text class="breeze-release-management-add-back-references-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-22)">│</text><text class="breeze-release-management-add-back-references-r4" x="61" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-22)">-</text><text class="breeze-release-management-add-back-references-r4" x="73.2" y="556.8" textLength="48.8" clip-path="url(#breeze-release-management-add-back-references-line-22)">-gen</text><text class="breeze-release-management-add-back-references-r4" x="122" y="556.8" textLength="61" clip-path="url(#breeze-release-management-add-back-references-line-22)">-type</text><text class="breeze-release-management-add-back-references-r7" x="378.2" y="556.8" textLength="24.4" clip-path="url(#breeze-release-management-add-back-references-line-22)">-g</text><text class="breeze-release-management-add-back-references-r2" x="427" y="556.8" textLength="1012.6" clip-path="url(#breeze-release-management-add-back-references-line-22)">Type&#160;of&#160;back&#160;references&#160;to&#160;generate.&#160;Forced&#160;to&#160;providers&#160;if&#160;providers&#160;specified&#160;as&#160;</text><text class="breeze-release-management-add-back-references-r5" x="1451.8" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-22)">│</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-22)">
-</text><text class="breeze-release-management-add-back-references-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-23)">│</text><text class="breeze-release-management-add-back-references-r2" x="427" y="581.2" textLength="1012.6" clip-path="url(#breeze-release-management-add-back-references-line-23)">arguments.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-release-management-add-back-references-r5" x="1451.8" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-23)">│</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-23)">
-</text><text class="breeze-release-management-add-back-references-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-24)">│</text><text class="breeze-release-management-add-back-references-r8" x="427" y="605.6" textLength="1012.6" clip-path="url(#breeze-release-management-add-back-references-line-24)">(airflow&#160;|&#160;helm&#160;|&#160;providers)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-release-management-add-back-references-r5" x="1451.8" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-24)">│</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-24)">
-</text><text class="breeze-release-management-add-back-references-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-25)">│</text><text class="breeze-release-management-add-back-references-r5" x="427" y="630" textLength="1012.6" clip-path="url(#breeze-release-management-add-back-references-line-25)">[default:&#160;airflow]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-release-management-add-back-references-r5" x="1451.8" y="630" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-25)">│</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="630" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-25)">
-</text><text class="breeze-release-management-add-back-references-r5" x="0" y="654.4" textLength="1464" clip-path="url(#breeze-release-management-add-back-references-line-26)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-26)">
-</text><text class="breeze-release-management-add-back-references-r5" x="0" y="678.8" textLength="24.4" clip-path="url(#breeze-release-management-add-back-references-line-27)">╭─</text><text class="breeze-release-management-add-back-references-r5" x="24.4" y="678.8" textLength="195.2" clip-path="url(#breeze-release-management-add-back-references-line-27)">&#160;Common&#160;options&#160;</text><text class="breeze-release-management-add-back-references-r5" x="219.6" y="678.8" textLength="1220" clip-path="url(#breeze-release-management-add-back-references-line-27)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-release-management-add-back-references-r5" x="1439.6" y="678.8" textLength="24.4" clip-path="url(#breeze-release-management-add-back-references-line-27)">─╮</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-27)">
-</text><text class="breeze-release-management-add-back-references-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-28)">│</text><text class="breeze-release-management-add-back-references-r4" x="24.4" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-28)">-</text><text class="breeze-release-management-add-back-references-r4" x="36.6" y="703.2" textLength="97.6" clip-path="url(#breeze-release-management-add-back-references-line-28)">-verbose</text><text class="breeze-release-management-add-back-references-r7" x="158.6" y="703.2" textLength="24.4" clip-path="url(#breeze-release-management-add-back-references-line-28)">-v</text><text class="breeze-release-management-add-back-references-r2" x="207.4" y="703.2" textLength="585.6" clip-path="url(#breeze-release-management-add-back-references-line-28)">Print&#160;verbose&#160;information&#160;about&#160;performed&#160;steps.</text><text class="breeze-release-management-add-back-references-r5" x="1451.8" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-28)">│</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-28)">
-</text><text class="breeze-release-management-add-back-references-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-29)">│</text><text class="breeze-release-management-add-back-references-r4" x="24.4" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-29)">-</text><text class="breeze-release-management-add-back-references-r4" x="36.6" y="727.6" textLength="48.8" clip-path="url(#breeze-release-management-add-back-references-line-29)">-dry</text><text class="breeze-release-management-add-back-references-r4" x="85.4" y="727.6" textLength="48.8" clip-path="url(#breeze-release-management-add-back-references-line-29)">-run</text><text class="breeze-release-management-add-back-references-r7" x="158.6" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-29)">-</text><text class="breeze-release-management-add-back-references-r4" x="170.8" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-29)">D</text><text class="breeze-release-management-add-back-references-r2" x="207.4" y="727.6" textLength="719.8" clip-path="url(#breeze-release-management-add-back-references-line-29)">If&#160;dry-run&#160;is&#160;set,&#160;commands&#160;are&#160;only&#160;printed,&#160;not&#160;executed.</text><text class="breeze-release-management-add-back-references-r5" x="1451.8" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-29)">│</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-29)">
-</text><text class="breeze-release-management-add-back-references-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-30)">│</text><text class="breeze-release-management-add-back-references-r4" x="24.4" y="752" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-30)">-</text><text class="breeze-release-management-add-back-references-r4" x="36.6" y="752" textLength="61" clip-path="url(#breeze-release-management-add-back-references-line-30)">-help</text><text class="breeze-release-management-add-back-references-r7" x="158.6" y="752" textLength="24.4" clip-path="url(#breeze-release-management-add-back-references-line-30)">-h</text><text class="breeze-release-management-add-back-references-r2" x="207.4" y="752" textLength="329.4" clip-path="url(#breeze-release-management-add-back-references-line-30)">Show&#160;this&#160;message&#160;and&#160;exit.</text><text class="breeze-release-management-add-back-references-r5" x="1451.8" y="752" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-30)">│</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-30)">
-</text><text class="breeze-release-management-add-back-references-r5" x="0" y="776.4" textLength="1464" clip-path="url(#breeze-release-management-add-back-references-line-31)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-31)">
+</text><text class="breeze-release-management-add-back-references-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#breeze-release-management-add-back-references-line-1)">Usage:&#160;</text><text class="breeze-release-management-add-back-references-r1" x="97.6" y="44.4" textLength="573.4" clip-path="url(#breeze-release-management-add-back-references-line-1)">breeze&#160;release-management&#160;add-back-references&#160;[</text><text class="breeze-release-management-add-back-references-r4" x="671" y="44.4" textLength="85.4" clip-path="url(#breeze-release-management-add-back-references-line-1)">OPTIONS</text><text class="breeze-release-management-add-back-references-r1" x="756.4" y="44.4" textLength="683.2" clip-path="url(#breeze-release-management-add-back-references-line-1)">]&#160;[all-providers&#160;|&#160;apache-airflow&#160;|&#160;docker-stack&#160;|&#160;helm-</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-1)">
+</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="68.8" textLength="1256.6" clip-path="url(#breeze-release-management-add-back-references-line-2)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;chart&#160;|&#160;airbyte&#160;|&#160;alibaba&#160;|&#160;amazon&#160;|&#160;apache.beam&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-2)">
+</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="93.2" textLength="1415.2" clip-path="url(#breeze-release-management-add-back-references-line-3)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.cassandra&#160;|&#160;apache.drill&#160;|&#160;apache.druid&#160;|&#160;apache.flink&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-3)">
+</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="117.6" textLength="1354.2" clip-path="url(#breeze-release-management-add-back-references-line-4)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.hdfs&#160;|&#160;apache.hive&#160;|&#160;apache.impala&#160;|&#160;apache.kafka&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-4)">
+</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="142" textLength="1329.8" clip-path="url(#breeze-release-management-add-back-references-line-5)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.kylin&#160;|&#160;apache.livy&#160;|&#160;apache.pig&#160;|&#160;apache.pinot&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="142" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-5)">
+</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="166.4" textLength="1354.2" clip-path="url(#breeze-release-management-add-back-references-line-6)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.spark&#160;|&#160;apache.sqoop&#160;|&#160;apprise&#160;|&#160;arangodb&#160;|&#160;asana&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="166.4" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-6)">
+</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="190.8" textLength="1439.6" clip-path="url(#breeze-release-management-add-back-references-line-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;atlassian.jira&#160;|&#160;celery&#160;|&#160;cloudant&#160;|&#160;cncf.kubernetes&#160;|&#160;common.sql</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-7)">
+</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="215.2" textLength="1403" clip-path="url(#breeze-release-management-add-back-references-line-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;|&#160;daskexecutor&#160;|&#160;databricks&#160;|&#160;datadog&#160;|&#160;dbt.cloud&#160;|&#160;dingding&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="215.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-8)">
+</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="239.6" textLength="1378.6" clip-path="url(#breeze-release-management-add-back-references-line-9)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;discord&#160;|&#160;docker&#160;|&#160;elasticsearch&#160;|&#160;exasol&#160;|&#160;facebook&#160;|&#160;ftp&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="239.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-9)">
+</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="264" textLength="1390.8" clip-path="url(#breeze-release-management-add-back-references-line-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;github&#160;|&#160;google&#160;|&#160;grpc&#160;|&#160;hashicorp&#160;|&#160;http&#160;|&#160;imap&#160;|&#160;influxdb&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="264" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-10)">
+</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="288.4" textLength="1281" clip-path="url(#breeze-release-management-add-back-references-line-11)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;jdbc&#160;|&#160;jenkins&#160;|&#160;microsoft.azure&#160;|&#160;microsoft.mssql&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="288.4" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-11)">
+</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="312.8" textLength="1439.6" clip-path="url(#breeze-release-management-add-back-references-line-12)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;microsoft.psrp&#160;|&#160;microsoft.winrm&#160;|&#160;mongo&#160;|&#160;mysql&#160;|&#160;neo4j&#160;|&#160;odbc&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-12)">
+</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="337.2" textLength="1329.8" clip-path="url(#breeze-release-management-add-back-references-line-13)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;openfaas&#160;|&#160;openlineage&#160;|&#160;opsgenie&#160;|&#160;oracle&#160;|&#160;pagerduty&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-13)">
+</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="361.6" textLength="1390.8" clip-path="url(#breeze-release-management-add-back-references-line-14)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;papermill&#160;|&#160;plexus&#160;|&#160;postgres&#160;|&#160;presto&#160;|&#160;redis&#160;|&#160;salesforce&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-14)">
+</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="386" textLength="1427.4" clip-path="url(#breeze-release-management-add-back-references-line-15)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;samba&#160;|&#160;segment&#160;|&#160;sendgrid&#160;|&#160;sftp&#160;|&#160;singularity&#160;|&#160;slack&#160;|&#160;smtp&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="386" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-15)">
+</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="410.4" textLength="1439.6" clip-path="url(#breeze-release-management-add-back-references-line-16)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;snowflake&#160;|&#160;sqlite&#160;|&#160;ssh&#160;|&#160;tableau&#160;|&#160;tabular&#160;|&#160;telegram&#160;|&#160;trino&#160;|</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-16)">
+</text><text class="breeze-release-management-add-back-references-r1" x="12.2" y="434.8" textLength="902.8" clip-path="url(#breeze-release-management-add-back-references-line-17)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;vertica&#160;|&#160;zendesk]...</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-17)">
+</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-18)">
+</text><text class="breeze-release-management-add-back-references-r2" x="12.2" y="483.6" textLength="976" clip-path="url(#breeze-release-management-add-back-references-line-19)">Command&#160;to&#160;add&#160;back&#160;references&#160;for&#160;documentation&#160;to&#160;make&#160;it&#160;backward&#160;compatible.</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-19)">
+</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="508" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-20)">
+</text><text class="breeze-release-management-add-back-references-r5" x="0" y="532.4" textLength="24.4" clip-path="url(#breeze-release-management-add-back-references-line-21)">╭─</text><text class="breeze-release-management-add-back-references-r5" x="24.4" y="532.4" textLength="353.8" clip-path="url(#breeze-release-management-add-back-references-line-21)">&#160;Add&#160;Back&#160;References&#160;to&#160;Docs&#160;</text><text class="breeze-release-management-add-back-references-r5" x="378.2" y="532.4" textLength="1061.4" clip-path="url(#breeze-release-management-add-back-references-line-21)">───────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-release-management-add-back-references-r5" x="1439.6" y="532.4" textLength="24.4" clip-path="url(#breeze-release-management-add-back-references-line-21)">─╮</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-21)">
+</text><text class="breeze-release-management-add-back-references-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-22)">│</text><text class="breeze-release-management-add-back-references-r6" x="24.4" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-22)">*</text><text class="breeze-release-management-add-back-references-r4" x="61" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-22)">-</text><text class="breeze-release-management-add-back-references-r4" x="73.2" y="556.8" textLength="97.6" clip-path="url(#breeze-release-management-add-back-references-line-22)">-airflow</text><text class="breeze-release-management-add-back-references-r4" x="170.8" y="556.8" textLength="183" clip-path="url(#breeze-release-management-add-back-references-line-22)">-site-directory</text><text class="breeze-release-management-add-back-references-r7" x="378.2" y="556.8" textLength="24.4" clip-path="url(#breeze-release-management-add-back-references-line-22)">-a</text><text class="breeze-release-management-add-back-references-r2" x="427" y="556.8" textLength="597.8" clip-path="url(#breeze-release-management-add-back-references-line-22)">Local&#160;directory&#160;path&#160;of&#160;cloned&#160;airflow-site&#160;repo.</text><text class="breeze-release-management-add-back-references-r8" x="1037" y="556.8" textLength="134.2" clip-path="url(#breeze-release-management-add-back-references-line-22)">(DIRECTORY)</text><text class="breeze-release-management-add-back-references-r9" x="1183.4" y="556.8" textLength="122" clip-path="url(#breeze-release-management-add-back-references-line-22)">[required]</text><text class="breeze-release-management-add-back-references-r5" x="1451.8" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-22)">│</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-22)">
+</text><text class="breeze-release-management-add-back-references-r5" x="0" y="581.2" textLength="1464" clip-path="url(#breeze-release-management-add-back-references-line-23)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-23)">
+</text><text class="breeze-release-management-add-back-references-r5" x="0" y="605.6" textLength="24.4" clip-path="url(#breeze-release-management-add-back-references-line-24)">╭─</text><text class="breeze-release-management-add-back-references-r5" x="24.4" y="605.6" textLength="195.2" clip-path="url(#breeze-release-management-add-back-references-line-24)">&#160;Common&#160;options&#160;</text><text class="breeze-release-management-add-back-references-r5" x="219.6" y="605.6" textLength="1220" clip-path="url(#breeze-release-management-add-back-references-line-24)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-release-management-add-back-references-r5" x="1439.6" y="605.6" textLength="24.4" clip-path="url(#breeze-release-management-add-back-references-line-24)">─╮</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-24)">
+</text><text class="breeze-release-management-add-back-references-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-25)">│</text><text class="breeze-release-management-add-back-references-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-25)">-</text><text class="breeze-release-management-add-back-references-r4" x="36.6" y="630" textLength="97.6" clip-path="url(#breeze-release-management-add-back-references-line-25)">-verbose</text><text class="breeze-release-management-add-back-references-r7" x="158.6" y="630" textLength="24.4" clip-path="url(#breeze-release-management-add-back-references-line-25)">-v</text><text class="breeze-release-management-add-back-references-r2" x="207.4" y="630" textLength="585.6" clip-path="url(#breeze-release-management-add-back-references-line-25)">Print&#160;verbose&#160;information&#160;about&#160;performed&#160;steps.</text><text class="breeze-release-management-add-back-references-r5" x="1451.8" y="630" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-25)">│</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="630" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-25)">
+</text><text class="breeze-release-management-add-back-references-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-26)">│</text><text class="breeze-release-management-add-back-references-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-26)">-</text><text class="breeze-release-management-add-back-references-r4" x="36.6" y="654.4" textLength="48.8" clip-path="url(#breeze-release-management-add-back-references-line-26)">-dry</text><text class="breeze-release-management-add-back-references-r4" x="85.4" y="654.4" textLength="48.8" clip-path="url(#breeze-release-management-add-back-references-line-26)">-run</text><text class="breeze-release-management-add-back-references-r7" x="158.6" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-26)">-</text><text class="breeze-release-management-add-back-references-r4" x="170.8" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-26)">D</text><text class="breeze-release-management-add-back-references-r2" x="207.4" y="654.4" textLength="719.8" clip-path="url(#breeze-release-management-add-back-references-line-26)">If&#160;dry-run&#160;is&#160;set,&#160;commands&#160;are&#160;only&#160;printed,&#160;not&#160;executed.</text><text class="breeze-release-management-add-back-references-r5" x="1451.8" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-26)">│</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-26)">
+</text><text class="breeze-release-management-add-back-references-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-27)">│</text><text class="breeze-release-management-add-back-references-r4" x="24.4" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-27)">-</text><text class="breeze-release-management-add-back-references-r4" x="36.6" y="678.8" textLength="61" clip-path="url(#breeze-release-management-add-back-references-line-27)">-help</text><text class="breeze-release-management-add-back-references-r7" x="158.6" y="678.8" textLength="24.4" clip-path="url(#breeze-release-management-add-back-references-line-27)">-h</text><text class="breeze-release-management-add-back-references-r2" x="207.4" y="678.8" textLength="329.4" clip-path="url(#breeze-release-management-add-back-references-line-27)">Show&#160;this&#160;message&#160;and&#160;exit.</text><text class="breeze-release-management-add-back-references-r5" x="1451.8" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-27)">│</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-27)">
+</text><text class="breeze-release-management-add-back-references-r5" x="0" y="703.2" textLength="1464" clip-path="url(#breeze-release-management-add-back-references-line-28)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-add-back-references-r2" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-add-back-references-line-28)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output_release-management_generate-issue-content-providers.svg b/images/breeze/output_release-management_generate-issue-content-providers.svg
index d05113afb0488..989a890e5f035 100644
--- a/images/breeze/output_release-management_generate-issue-content-providers.svg
+++ b/images/breeze/output_release-management_generate-issue-content-providers.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 952.8" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 977.1999999999999" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath id="breeze-release-management-generate-issue-content-providers-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="901.8" />
+      <rect x="0" y="0" width="1463.0" height="926.1999999999999" />
     </clipPath>
     <clipPath id="breeze-release-management-generate-issue-content-providers-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -153,9 +153,12 @@
 <clipPath id="breeze-release-management-generate-issue-content-providers-line-35">
     <rect x="0" y="855.5" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-release-management-generate-issue-content-providers-line-36">
+    <rect x="0" y="879.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="950.8" rx="8"/><text class="breeze-release-management-generate-issue-content-providers-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;release-management&#160;generate-issue-content-providers</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="975.2" rx="8"/><text class="breeze-release-management-generate-issue-content-providers-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;release-management&#160;generate-issue-content-providers</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -166,42 +169,43 @@
     
     <g class="breeze-release-management-generate-issue-content-providers-matrix">
     <text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="20" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-0)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-1)">Usage:&#160;</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="97.6" y="44.4" textLength="732" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-1)">breeze&#160;release-management&#160;generate-issue-content-providers&#160;[</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="829.6" y="44.4" textLength="85.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-1)">OPTIONS</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="915" y="44.4" textLength="524.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-1)">]&#160;[airbyte&#160;|&#160;alibaba&#160;|&#160;amazon&#160;|&#160;apache.beam</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-1)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="68.8" textLength="1415.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-2)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;|&#160;apache.cassandra&#160;|&#160;apache.drill&#160;|&#160;apache.druid&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-2)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="93.2" textLength="1317.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-3)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.flink&#160;|&#160;apache.hdfs&#160;|&#160;apache.hive&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-3)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="117.6" textLength="1354.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-4)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.impala&#160;|&#160;apache.kafka&#160;|&#160;apache.kylin&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-4)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="142" textLength="1305.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-5)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.livy&#160;|&#160;apache.pig&#160;|&#160;apache.pinot&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="142" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-5)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="166.4" textLength="1415.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-6)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.spark&#160;|&#160;apache.sqoop&#160;|&#160;apprise&#160;|&#160;arangodb&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="166.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-6)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="190.8" textLength="1342" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;asana&#160;|&#160;atlassian.jira&#160;|&#160;celery&#160;|&#160;cloudant&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-7)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="215.2" textLength="1354.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;cncf.kubernetes&#160;|&#160;common.sql&#160;|&#160;daskexecutor&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="215.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-8)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="239.6" textLength="1354.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-9)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;databricks&#160;|&#160;datadog&#160;|&#160;dbt.cloud&#160;|&#160;dingding&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="239.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-9)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="264" textLength="1439.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;discord&#160;|&#160;docker&#160;|&#160;elasticsearch&#160;|&#160;exasol&#160;|&#160;facebook</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="264" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-10)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="288.4" textLength="1427.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-11)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;|&#160;ftp&#160;|&#160;github&#160;|&#160;google&#160;|&#160;grpc&#160;|&#160;hashicorp&#160;|&#160;http&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="288.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-11)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="312.8" textLength="1439.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-12)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;imap&#160;|&#160;influxdb&#160;|&#160;jdbc&#160;|&#160;jenkins&#160;|&#160;microsoft.azure&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-12)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="337.2" textLength="1439.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-13)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;microsoft.mssql&#160;|&#160;microsoft.psrp&#160;|&#160;microsoft.winrm&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-13)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="361.6" textLength="1305.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-14)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;mongo&#160;|&#160;mysql&#160;|&#160;neo4j&#160;|&#160;odbc&#160;|&#160;openfaas&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-14)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="386" textLength="1354.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-15)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;openlineage&#160;|&#160;opsgenie&#160;|&#160;oracle&#160;|&#160;pagerduty&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="386" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-15)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="410.4" textLength="1390.8" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-16)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;papermill&#160;|&#160;plexus&#160;|&#160;postgres&#160;|&#160;presto&#160;|&#160;redis&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-16)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="434.8" textLength="1390.8" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-17)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;salesforce&#160;|&#160;samba&#160;|&#160;segment&#160;|&#160;sendgrid&#160;|&#160;sftp&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-17)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="459.2" textLength="1403" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-18)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;singularity&#160;|&#160;slack&#160;|&#160;smtp&#160;|&#160;snowflake&#160;|&#160;sqlite&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-18)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="483.6" textLength="1439.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-19)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ssh&#160;|&#160;tableau&#160;|&#160;tabular&#160;|&#160;telegram&#160;|&#160;trino&#160;|&#160;vertica</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-19)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="508" textLength="963.8" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-20)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;|&#160;zendesk]...</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="508" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-20)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-21)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="12.2" y="556.8" textLength="585.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-22)">Generates&#160;content&#160;for&#160;issue&#160;to&#160;test&#160;the&#160;release.</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-22)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-23)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="605.6" textLength="24.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-24)">╭─</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="24.4" y="605.6" textLength="366" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-24)">&#160;Generate&#160;issue&#160;content&#160;flags&#160;</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="390.4" y="605.6" textLength="1049.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-24)">──────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="1439.6" y="605.6" textLength="24.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-24)">─╮</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-24)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-25)">│</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-25)">-</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="36.6" y="630" textLength="85.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-25)">-github</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="122" y="630" textLength="73.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-25)">-token</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="366" y="630" textLength="817.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-25)">GitHub&#160;token&#160;used&#160;to&#160;authenticate.&#160;You&#160;can&#160;set&#160;omit&#160;it&#160;if&#160;you&#160;have&#160;</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="1183.4" y="630" textLength="146.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-25)">GITHUB_TOKEN</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1329.8" y="630" textLength="109.8" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-25)">&#160;env&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="1451.8" y="630" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-25)">│</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="630" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-25)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-26)">│</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="366" y="654.4" textLength="1073.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-26)">variable&#160;set.&#160;Can&#160;be&#160;generated&#160;with:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-release-management-generate-issue-content-providers-r5" x="1451.8" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-26)">│</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-26)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-27)">│</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="366" y="678.8" textLength="1073.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-27)">https://github.com/settings/tokens/new?description=Read%20sssues&amp;scopes=repo:status&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="1451.8" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-27)">│</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-27)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-28)">│</text><text class="breeze-release-management-generate-issue-content-providers-r6" x="366" y="703.2" textLength="1073.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-release-management-generate-issue-content-providers-r5" x="1451.8" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-28)">│</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-28)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-29)">│</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="24.4" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-29)">-</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="36.6" y="727.6" textLength="85.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-29)">-suffix</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="366" y="727.6" textLength="451.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-29)">Suffix&#160;to&#160;add&#160;to&#160;the&#160;version&#160;prepared</text><text class="breeze-release-management-generate-issue-content-providers-r6" x="829.6" y="727.6" textLength="73.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-29)">(TEXT)</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="1451.8" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-29)">│</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-29)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-30)">│</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="24.4" y="752" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-30)">-</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="36.6" y="752" textLength="61" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-30)">-only</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="97.6" y="752" textLength="219.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-30)">-available-in-dist</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="366" y="752" textLength="817.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-30)">Only&#160;consider&#160;package&#160;ids&#160;with&#160;packages&#160;prepared&#160;in&#160;the&#160;dist&#160;folder</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="1451.8" y="752" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-30)">│</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-30)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-31)">│</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="24.4" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-31)">-</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="36.6" y="776.4" textLength="109.8" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-31)">-excluded</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="146.4" y="776.4" textLength="97.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-31)">-pr-list</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="366" y="776.4" textLength="646.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-31)">Coma-separated&#160;list&#160;of&#160;PRs&#160;to&#160;exclude&#160;from&#160;the&#160;issue.</text><text class="breeze-release-management-generate-issue-content-providers-r6" x="1024.8" y="776.4" textLength="73.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-31)">(TEXT)</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="1451.8" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-31)">│</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-31)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-32)">│</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="24.4" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-32)">-</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="36.6" y="800.8" textLength="97.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-32)">-disable</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="134.2" y="800.8" textLength="109.8" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-32)">-progress</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="366" y="800.8" textLength="244" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-32)">Disable&#160;progress&#160;bar</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="1451.8" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-32)">│</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-32)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="825.2" textLength="1464" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-33)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-33)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="849.6" textLength="24.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-34)">╭─</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="24.4" y="849.6" textLength="195.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-34)">&#160;Common&#160;options&#160;</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="219.6" y="849.6" textLength="1220" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-34)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="1439.6" y="849.6" textLength="24.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-34)">─╮</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-34)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-35)">│</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="24.4" y="874" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-35)">-</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="36.6" y="874" textLength="61" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-35)">-help</text><text class="breeze-release-management-generate-issue-content-providers-r7" x="122" y="874" textLength="24.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-35)">-h</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="170.8" y="874" textLength="329.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-35)">Show&#160;this&#160;message&#160;and&#160;exit.</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="1451.8" y="874" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-35)">│</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="874" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-35)">
-</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="898.4" textLength="1464" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-36)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-36)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-1)">Usage:&#160;</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="97.6" y="44.4" textLength="732" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-1)">breeze&#160;release-management&#160;generate-issue-content-providers&#160;[</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="829.6" y="44.4" textLength="85.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-1)">OPTIONS</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="915" y="44.4" textLength="488" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-1)">]&#160;[apache-airflow&#160;|&#160;docker-stack&#160;|&#160;helm-</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-1)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="68.8" textLength="1415.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-2)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;chart&#160;|&#160;airbyte&#160;|&#160;alibaba&#160;|&#160;amazon&#160;|&#160;apache.beam&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-2)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="93.2" textLength="1390.8" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-3)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.cassandra&#160;|&#160;apache.drill&#160;|&#160;apache.druid&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-3)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="117.6" textLength="1317.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-4)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.flink&#160;|&#160;apache.hdfs&#160;|&#160;apache.hive&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-4)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="142" textLength="1354.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-5)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.impala&#160;|&#160;apache.kafka&#160;|&#160;apache.kylin&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="142" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-5)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="166.4" textLength="1305.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-6)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.livy&#160;|&#160;apache.pig&#160;|&#160;apache.pinot&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="166.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-6)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="190.8" textLength="1415.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.spark&#160;|&#160;apache.sqoop&#160;|&#160;apprise&#160;|&#160;arangodb&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-7)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="215.2" textLength="1342" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;asana&#160;|&#160;atlassian.jira&#160;|&#160;celery&#160;|&#160;cloudant&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="215.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-8)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="239.6" textLength="1354.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-9)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;cncf.kubernetes&#160;|&#160;common.sql&#160;|&#160;daskexecutor&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="239.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-9)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="264" textLength="1354.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;databricks&#160;|&#160;datadog&#160;|&#160;dbt.cloud&#160;|&#160;dingding&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="264" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-10)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="288.4" textLength="1439.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-11)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;discord&#160;|&#160;docker&#160;|&#160;elasticsearch&#160;|&#160;exasol&#160;|&#160;facebook</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="288.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-11)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="312.8" textLength="1427.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-12)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;|&#160;ftp&#160;|&#160;github&#160;|&#160;google&#160;|&#160;grpc&#160;|&#160;hashicorp&#160;|&#160;http&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-12)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="337.2" textLength="1439.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-13)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;imap&#160;|&#160;influxdb&#160;|&#160;jdbc&#160;|&#160;jenkins&#160;|&#160;microsoft.azure&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-13)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="361.6" textLength="1439.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-14)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;microsoft.mssql&#160;|&#160;microsoft.psrp&#160;|&#160;microsoft.winrm&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-14)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="386" textLength="1305.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-15)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;mongo&#160;|&#160;mysql&#160;|&#160;neo4j&#160;|&#160;odbc&#160;|&#160;openfaas&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="386" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-15)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="410.4" textLength="1354.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-16)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;openlineage&#160;|&#160;opsgenie&#160;|&#160;oracle&#160;|&#160;pagerduty&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-16)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="434.8" textLength="1390.8" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-17)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;papermill&#160;|&#160;plexus&#160;|&#160;postgres&#160;|&#160;presto&#160;|&#160;redis&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-17)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="459.2" textLength="1390.8" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-18)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;salesforce&#160;|&#160;samba&#160;|&#160;segment&#160;|&#160;sendgrid&#160;|&#160;sftp&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-18)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="483.6" textLength="1403" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-19)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;singularity&#160;|&#160;slack&#160;|&#160;smtp&#160;|&#160;snowflake&#160;|&#160;sqlite&#160;|</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-19)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="508" textLength="1439.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-20)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ssh&#160;|&#160;tableau&#160;|&#160;tabular&#160;|&#160;telegram&#160;|&#160;trino&#160;|&#160;vertica</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="508" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-20)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r1" x="12.2" y="532.4" textLength="963.8" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-21)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;|&#160;zendesk]...</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-21)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-22)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="12.2" y="581.2" textLength="585.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-23)">Generates&#160;content&#160;for&#160;issue&#160;to&#160;test&#160;the&#160;release.</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-23)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-24)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="630" textLength="24.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-25)">╭─</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="24.4" y="630" textLength="366" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-25)">&#160;Generate&#160;issue&#160;content&#160;flags&#160;</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="390.4" y="630" textLength="1049.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-25)">──────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="1439.6" y="630" textLength="24.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-25)">─╮</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="630" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-25)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-26)">│</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-26)">-</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="36.6" y="654.4" textLength="85.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-26)">-github</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="122" y="654.4" textLength="73.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-26)">-token</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="366" y="654.4" textLength="817.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-26)">GitHub&#160;token&#160;used&#160;to&#160;authenticate.&#160;You&#160;can&#160;set&#160;omit&#160;it&#160;if&#160;you&#160;have&#160;</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="1183.4" y="654.4" textLength="146.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-26)">GITHUB_TOKEN</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1329.8" y="654.4" textLength="109.8" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-26)">&#160;env&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="1451.8" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-26)">│</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-26)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-27)">│</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="366" y="678.8" textLength="1073.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-27)">variable&#160;set.&#160;Can&#160;be&#160;generated&#160;with:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-release-management-generate-issue-content-providers-r5" x="1451.8" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-27)">│</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-27)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-28)">│</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="366" y="703.2" textLength="1073.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-28)">https://github.com/settings/tokens/new?description=Read%20sssues&amp;scopes=repo:status&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="1451.8" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-28)">│</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-28)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-29)">│</text><text class="breeze-release-management-generate-issue-content-providers-r6" x="366" y="727.6" textLength="1073.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-29)">(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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-release-management-generate-issue-content-providers-r5" x="1451.8" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-29)">│</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-29)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-30)">│</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="24.4" y="752" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-30)">-</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="36.6" y="752" textLength="85.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-30)">-suffix</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="366" y="752" textLength="451.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-30)">Suffix&#160;to&#160;add&#160;to&#160;the&#160;version&#160;prepared</text><text class="breeze-release-management-generate-issue-content-providers-r6" x="829.6" y="752" textLength="73.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-30)">(TEXT)</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="1451.8" y="752" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-30)">│</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-30)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-31)">│</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="24.4" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-31)">-</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="36.6" y="776.4" textLength="61" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-31)">-only</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="97.6" y="776.4" textLength="219.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-31)">-available-in-dist</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="366" y="776.4" textLength="817.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-31)">Only&#160;consider&#160;package&#160;ids&#160;with&#160;packages&#160;prepared&#160;in&#160;the&#160;dist&#160;folder</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="1451.8" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-31)">│</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-31)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-32)">│</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="24.4" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-32)">-</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="36.6" y="800.8" textLength="109.8" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-32)">-excluded</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="146.4" y="800.8" textLength="97.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-32)">-pr-list</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="366" y="800.8" textLength="646.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-32)">Coma-separated&#160;list&#160;of&#160;PRs&#160;to&#160;exclude&#160;from&#160;the&#160;issue.</text><text class="breeze-release-management-generate-issue-content-providers-r6" x="1024.8" y="800.8" textLength="73.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-32)">(TEXT)</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="1451.8" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-32)">│</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-32)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-33)">│</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="24.4" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-33)">-</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="36.6" y="825.2" textLength="97.6" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-33)">-disable</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="134.2" y="825.2" textLength="109.8" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-33)">-progress</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="366" y="825.2" textLength="244" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-33)">Disable&#160;progress&#160;bar</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="1451.8" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-33)">│</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-33)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="849.6" textLength="1464" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-34)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-34)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="874" textLength="24.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-35)">╭─</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="24.4" y="874" textLength="195.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-35)">&#160;Common&#160;options&#160;</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="219.6" y="874" textLength="1220" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-35)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="1439.6" y="874" textLength="24.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-35)">─╮</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="874" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-35)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-36)">│</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="24.4" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-36)">-</text><text class="breeze-release-management-generate-issue-content-providers-r4" x="36.6" y="898.4" textLength="61" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-36)">-help</text><text class="breeze-release-management-generate-issue-content-providers-r7" x="122" y="898.4" textLength="24.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-36)">-h</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="170.8" y="898.4" textLength="329.4" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-36)">Show&#160;this&#160;message&#160;and&#160;exit.</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="1451.8" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-36)">│</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-36)">
+</text><text class="breeze-release-management-generate-issue-content-providers-r5" x="0" y="922.8" textLength="1464" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-37)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-generate-issue-content-providers-r2" x="1464" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-issue-content-providers-line-37)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output_release-management_prepare-provider-documentation.svg b/images/breeze/output_release-management_prepare-provider-documentation.svg
index 2aa427860fb61..facbba997717f 100644
--- a/images/breeze/output_release-management_prepare-provider-documentation.svg
+++ b/images/breeze/output_release-management_prepare-provider-documentation.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1026.0" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1050.4" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath id="breeze-release-management-prepare-provider-documentation-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="975.0" />
+      <rect x="0" y="0" width="1463.0" height="999.4" />
     </clipPath>
     <clipPath id="breeze-release-management-prepare-provider-documentation-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -162,9 +162,12 @@
 <clipPath id="breeze-release-management-prepare-provider-documentation-line-38">
     <rect x="0" y="928.7" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-release-management-prepare-provider-documentation-line-39">
+    <rect x="0" y="953.1" width="1464" height="24.65"/>
+            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1024" rx="8"/><text class="breeze-release-management-prepare-provider-documentation-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;release-management&#160;prepare-provider-documentation</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1048.4" rx="8"/><text class="breeze-release-management-prepare-provider-documentation-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;release-management&#160;prepare-provider-documentation</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -175,45 +178,46 @@
     
     <g class="breeze-release-management-prepare-provider-documentation-matrix">
     <text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="20" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-0)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-1)">Usage:&#160;</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="97.6" y="44.4" textLength="707.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-1)">breeze&#160;release-management&#160;prepare-provider-documentation&#160;[</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="805.2" y="44.4" textLength="85.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-1)">OPTIONS</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="890.6" y="44.4" textLength="549" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-1)">]&#160;[airbyte&#160;|&#160;alibaba&#160;|&#160;amazon&#160;|&#160;apache.beam&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-1)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="68.8" textLength="1366.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-2)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.cassandra&#160;|&#160;apache.drill&#160;|&#160;apache.druid&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-2)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="93.2" textLength="1293.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-3)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.flink&#160;|&#160;apache.hdfs&#160;|&#160;apache.hive&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-3)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="117.6" textLength="1329.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-4)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.impala&#160;|&#160;apache.kafka&#160;|&#160;apache.kylin&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-4)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="142" textLength="1439.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-5)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.livy&#160;|&#160;apache.pig&#160;|&#160;apache.pinot&#160;|&#160;apache.spark</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="142" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-5)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="166.4" textLength="1329.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-6)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;|&#160;apache.sqoop&#160;|&#160;apprise&#160;|&#160;arangodb&#160;|&#160;asana&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="166.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-6)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="190.8" textLength="1439.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;atlassian.jira&#160;|&#160;celery&#160;|&#160;cloudant&#160;|&#160;cncf.kubernetes&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-7)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="215.2" textLength="1390.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;common.sql&#160;|&#160;daskexecutor&#160;|&#160;databricks&#160;|&#160;datadog&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="215.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-8)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="239.6" textLength="1281" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-9)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;dbt.cloud&#160;|&#160;dingding&#160;|&#160;discord&#160;|&#160;docker&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="239.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-9)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="264" textLength="1390.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;elasticsearch&#160;|&#160;exasol&#160;|&#160;facebook&#160;|&#160;ftp&#160;|&#160;github&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="264" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-10)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="288.4" textLength="1415.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-11)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;google&#160;|&#160;grpc&#160;|&#160;hashicorp&#160;|&#160;http&#160;|&#160;imap&#160;|&#160;influxdb&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="288.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-11)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="312.8" textLength="1415.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-12)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;jdbc&#160;|&#160;jenkins&#160;|&#160;microsoft.azure&#160;|&#160;microsoft.mssql&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-12)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="337.2" textLength="1390.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-13)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;microsoft.psrp&#160;|&#160;microsoft.winrm&#160;|&#160;mongo&#160;|&#160;mysql&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-13)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="361.6" textLength="1390.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-14)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;neo4j&#160;|&#160;odbc&#160;|&#160;openfaas&#160;|&#160;openlineage&#160;|&#160;opsgenie&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-14)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="386" textLength="1415.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-15)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;oracle&#160;|&#160;pagerduty&#160;|&#160;papermill&#160;|&#160;plexus&#160;|&#160;postgres&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="386" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-15)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="410.4" textLength="1354.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-16)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;presto&#160;|&#160;redis&#160;|&#160;salesforce&#160;|&#160;samba&#160;|&#160;segment&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-16)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="434.8" textLength="1342" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-17)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;sendgrid&#160;|&#160;sftp&#160;|&#160;singularity&#160;|&#160;slack&#160;|&#160;smtp&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-17)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="459.2" textLength="1342" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-18)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;snowflake&#160;|&#160;sqlite&#160;|&#160;ssh&#160;|&#160;tableau&#160;|&#160;tabular&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-18)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="483.6" textLength="1268.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-19)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;telegram&#160;|&#160;trino&#160;|&#160;vertica&#160;|&#160;zendesk]...</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-19)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="508" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-20)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="12.2" y="532.4" textLength="97.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-21)">Prepare&#160;</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="109.8" y="532.4" textLength="109.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-21)">CHANGELOG</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="219.6" y="532.4" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-21)">,&#160;</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="244" y="532.4" textLength="73.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-21)">README</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="317.2" y="532.4" textLength="61" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-21)">&#160;and&#160;</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="378.2" y="532.4" textLength="85.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-21)">COMMITS</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="463.6" y="532.4" textLength="329.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-21)">&#160;information&#160;for&#160;providers.</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-21)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-22)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="581.2" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-23)">╭─</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="24.4" y="581.2" textLength="512.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-23)">&#160;Provider&#160;documentation&#160;preparation&#160;flags&#160;</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="536.8" y="581.2" textLength="902.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-23)">──────────────────────────────────────────────────────────────────────────</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="1439.6" y="581.2" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-23)">─╮</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-23)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-24)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-24)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y="605.6" textLength="73.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-24)">-debug</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="402.6" y="605.6" textLength="878.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-24)">Drop&#160;user&#160;in&#160;shell&#160;instead&#160;of&#160;running&#160;the&#160;command.&#160;Useful&#160;for&#160;debugging.</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-24)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-24)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-25)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-25)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y="630" textLength="85.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-25)">-github</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="122" y="630" textLength="134.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-25)">-repository</text><text class="breeze-release-management-prepare-provider-documentation-r6" x="353.8" y="630" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-25)">-g</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="402.6" y="630" textLength="585.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-25)">GitHub&#160;repository&#160;used&#160;to&#160;pull,&#160;push&#160;run&#160;images.</text><text class="breeze-release-management-prepare-provider-documentation-r7" x="1000.4" y="630" textLength="73.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-25)">(TEXT)</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="1085.8" y="630" textLength="305" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-25)">[default:&#160;apache/airflow]</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="630" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-25)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="630" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-25)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-26)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-26)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y="654.4" textLength="61" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-26)">-base</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="97.6" y="654.4" textLength="85.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-26)">-branch</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="402.6" y="654.4" textLength="1037" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-26)">Base&#160;branch&#160;to&#160;use&#160;as&#160;diff&#160;for&#160;documentation&#160;generation&#160;(used&#160;for&#160;releasing&#160;from&#160;old&#160;</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-26)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-26)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-27)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="402.6" y="678.8" textLength="1037" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-27)">branch)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-27)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-27)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-28)">│</text><text class="breeze-release-management-prepare-provider-documentation-r7" x="402.6" y="703.2" textLength="1037" clip-path="url(#breeze-release-management-prepare-provider-documentation-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-28)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-28)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-29)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-29)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y="727.6" textLength="61" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-29)">-only</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="97.6" y="727.6" textLength="231.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-29)">-min-version-update</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="402.6" y="727.6" textLength="1037" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-29)">Only&#160;update&#160;minimum&#160;version&#160;in&#160;__init__.py&#160;files&#160;and&#160;regenerate&#160;corresponding&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-29)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-29)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-30)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="402.6" y="752" textLength="1037" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-30)">documentation&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="752" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-30)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-30)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-31)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-31)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y="776.4" textLength="134.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-31)">-regenerate</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="170.8" y="776.4" textLength="158.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-31)">-missing-docs</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="402.6" y="776.4" textLength="1037" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-31)">Only&#160;regenerate&#160;missing&#160;documentation,&#160;do&#160;not&#160;bump&#160;version.&#160;Useful&#160;if&#160;templates&#160;were&#160;</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-31)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-31)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-32)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="402.6" y="800.8" textLength="1037" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-32)">added&#160;and&#160;you&#160;need&#160;to&#160;regenerate&#160;documentation.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-32)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-32)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="825.2" textLength="1464" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-33)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-33)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="849.6" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-34)">╭─</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="24.4" y="849.6" textLength="195.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-34)">&#160;Common&#160;options&#160;</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="219.6" y="849.6" textLength="1220" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-34)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="1439.6" y="849.6" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-34)">─╮</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-34)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-35)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="874" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-35)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y="874" textLength="97.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-35)">-verbose</text><text class="breeze-release-management-prepare-provider-documentation-r6" x="158.6" y="874" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-35)">-v</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="207.4" y="874" textLength="585.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-35)">Print&#160;verbose&#160;information&#160;about&#160;performed&#160;steps.</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="874" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-35)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="874" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-35)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-36)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-36)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y="898.4" textLength="48.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-36)">-dry</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="85.4" y="898.4" textLength="48.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-36)">-run</text><text class="breeze-release-management-prepare-provider-documentation-r6" x="158.6" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-36)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="170.8" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-36)">D</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="207.4" y="898.4" textLength="719.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-36)">If&#160;dry-run&#160;is&#160;set,&#160;commands&#160;are&#160;only&#160;printed,&#160;not&#160;executed.</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-36)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-36)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-37)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-37)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y="922.8" textLength="85.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-37)">-answer</text><text class="breeze-release-management-prepare-provider-documentation-r6" x="158.6" y="922.8" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-37)">-a</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="207.4" y="922.8" textLength="317.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-37)">Force&#160;answer&#160;to&#160;questions.</text><text class="breeze-release-management-prepare-provider-documentation-r7" x="536.8" y="922.8" textLength="353.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-37)">(y&#160;|&#160;n&#160;|&#160;q&#160;|&#160;yes&#160;|&#160;no&#160;|&#160;quit)</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-37)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-37)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-38)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="947.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-38)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y="947.2" textLength="61" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-38)">-help</text><text class="breeze-release-management-prepare-provider-documentation-r6" x="158.6" y="947.2" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-38)">-h</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="207.4" y="947.2" textLength="329.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-38)">Show&#160;this&#160;message&#160;and&#160;exit.</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="947.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-38)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="947.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-38)">
-</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="971.6" textLength="1464" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-39)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="971.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-39)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-1)">Usage:&#160;</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="97.6" y="44.4" textLength="707.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-1)">breeze&#160;release-management&#160;prepare-provider-documentation&#160;[</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="805.2" y="44.4" textLength="85.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-1)">OPTIONS</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="890.6" y="44.4" textLength="549" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-1)">]&#160;[apache-airflow&#160;|&#160;docker-stack&#160;|&#160;helm-chart</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-1)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="68.8" textLength="1317.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-2)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;|&#160;airbyte&#160;|&#160;alibaba&#160;|&#160;amazon&#160;|&#160;apache.beam&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-2)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="93.2" textLength="1366.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-3)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.cassandra&#160;|&#160;apache.drill&#160;|&#160;apache.druid&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-3)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="117.6" textLength="1293.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-4)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.flink&#160;|&#160;apache.hdfs&#160;|&#160;apache.hive&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-4)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="142" textLength="1329.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-5)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.impala&#160;|&#160;apache.kafka&#160;|&#160;apache.kylin&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="142" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-5)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="166.4" textLength="1439.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-6)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.livy&#160;|&#160;apache.pig&#160;|&#160;apache.pinot&#160;|&#160;apache.spark</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="166.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-6)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="190.8" textLength="1329.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;|&#160;apache.sqoop&#160;|&#160;apprise&#160;|&#160;arangodb&#160;|&#160;asana&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-7)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="215.2" textLength="1439.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;atlassian.jira&#160;|&#160;celery&#160;|&#160;cloudant&#160;|&#160;cncf.kubernetes&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="215.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-8)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="239.6" textLength="1390.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-9)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;common.sql&#160;|&#160;daskexecutor&#160;|&#160;databricks&#160;|&#160;datadog&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="239.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-9)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="264" textLength="1281" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;dbt.cloud&#160;|&#160;dingding&#160;|&#160;discord&#160;|&#160;docker&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="264" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-10)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="288.4" textLength="1390.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-11)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;elasticsearch&#160;|&#160;exasol&#160;|&#160;facebook&#160;|&#160;ftp&#160;|&#160;github&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="288.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-11)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="312.8" textLength="1415.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-12)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;google&#160;|&#160;grpc&#160;|&#160;hashicorp&#160;|&#160;http&#160;|&#160;imap&#160;|&#160;influxdb&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-12)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="337.2" textLength="1415.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-13)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;jdbc&#160;|&#160;jenkins&#160;|&#160;microsoft.azure&#160;|&#160;microsoft.mssql&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-13)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="361.6" textLength="1390.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-14)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;microsoft.psrp&#160;|&#160;microsoft.winrm&#160;|&#160;mongo&#160;|&#160;mysql&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-14)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="386" textLength="1390.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-15)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;neo4j&#160;|&#160;odbc&#160;|&#160;openfaas&#160;|&#160;openlineage&#160;|&#160;opsgenie&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="386" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-15)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="410.4" textLength="1415.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-16)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;oracle&#160;|&#160;pagerduty&#160;|&#160;papermill&#160;|&#160;plexus&#160;|&#160;postgres&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-16)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="434.8" textLength="1354.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-17)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;presto&#160;|&#160;redis&#160;|&#160;salesforce&#160;|&#160;samba&#160;|&#160;segment&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-17)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="459.2" textLength="1342" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-18)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;sendgrid&#160;|&#160;sftp&#160;|&#160;singularity&#160;|&#160;slack&#160;|&#160;smtp&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-18)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="483.6" textLength="1342" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-19)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;snowflake&#160;|&#160;sqlite&#160;|&#160;ssh&#160;|&#160;tableau&#160;|&#160;tabular&#160;|</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-19)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r1" x="12.2" y="508" textLength="1268.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-20)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;telegram&#160;|&#160;trino&#160;|&#160;vertica&#160;|&#160;zendesk]...</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="508" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-20)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-21)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="12.2" y="556.8" textLength="97.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-22)">Prepare&#160;</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="109.8" y="556.8" textLength="109.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-22)">CHANGELOG</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="219.6" y="556.8" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-22)">,&#160;</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="244" y="556.8" textLength="73.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-22)">README</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="317.2" y="556.8" textLength="61" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-22)">&#160;and&#160;</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="378.2" y="556.8" textLength="85.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-22)">COMMITS</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="463.6" y="556.8" textLength="329.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-22)">&#160;information&#160;for&#160;providers.</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-22)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-23)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="605.6" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-24)">╭─</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="24.4" y="605.6" textLength="512.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-24)">&#160;Provider&#160;documentation&#160;preparation&#160;flags&#160;</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="536.8" y="605.6" textLength="902.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-24)">──────────────────────────────────────────────────────────────────────────</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="1439.6" y="605.6" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-24)">─╮</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-24)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-25)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-25)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y="630" textLength="73.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-25)">-debug</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="402.6" y="630" textLength="878.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-25)">Drop&#160;user&#160;in&#160;shell&#160;instead&#160;of&#160;running&#160;the&#160;command.&#160;Useful&#160;for&#160;debugging.</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="630" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-25)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="630" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-25)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-26)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-26)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y="654.4" textLength="85.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-26)">-github</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="122" y="654.4" textLength="134.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-26)">-repository</text><text class="breeze-release-management-prepare-provider-documentation-r6" x="353.8" y="654.4" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-26)">-g</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="402.6" y="654.4" textLength="585.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-26)">GitHub&#160;repository&#160;used&#160;to&#160;pull,&#160;push&#160;run&#160;images.</text><text class="breeze-release-management-prepare-provider-documentation-r7" x="1000.4" y="654.4" textLength="73.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-26)">(TEXT)</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="1085.8" y="654.4" textLength="305" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-26)">[default:&#160;apache/airflow]</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-26)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-26)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-27)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-27)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y="678.8" textLength="61" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-27)">-base</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="97.6" y="678.8" textLength="85.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-27)">-branch</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="402.6" y="678.8" textLength="1037" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-27)">Base&#160;branch&#160;to&#160;use&#160;as&#160;diff&#160;for&#160;documentation&#160;generation&#160;(used&#160;for&#160;releasing&#160;from&#160;old&#160;</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-27)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-27)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-28)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="402.6" y="703.2" textLength="1037" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-28)">branch)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-28)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-28)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-29)">│</text><text class="breeze-release-management-prepare-provider-documentation-r7" x="402.6" y="727.6" textLength="1037" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-29)">(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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-29)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-29)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-30)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="752" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-30)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y="752" textLength="61" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-30)">-only</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="97.6" y="752" textLength="231.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-30)">-min-version-update</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="402.6" y="752" textLength="1037" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-30)">Only&#160;update&#160;minimum&#160;version&#160;in&#160;__init__.py&#160;files&#160;and&#160;regenerate&#160;corresponding&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="752" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-30)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-30)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-31)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="402.6" y="776.4" textLength="1037" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-31)">documentation&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-31)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-31)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-32)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-32)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y="800.8" textLength="134.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-32)">-regenerate</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="170.8" y="800.8" textLength="158.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-32)">-missing-docs</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="402.6" y="800.8" textLength="1037" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-32)">Only&#160;regenerate&#160;missing&#160;documentation,&#160;do&#160;not&#160;bump&#160;version.&#160;Useful&#160;if&#160;templates&#160;were&#160;</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-32)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-32)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-33)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="402.6" y="825.2" textLength="1037" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-33)">added&#160;and&#160;you&#160;need&#160;to&#160;regenerate&#160;documentation.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-33)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-33)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="849.6" textLength="1464" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-34)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-34)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="874" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-35)">╭─</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="24.4" y="874" textLength="195.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-35)">&#160;Common&#160;options&#160;</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="219.6" y="874" textLength="1220" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-35)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="1439.6" y="874" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-35)">─╮</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="874" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-35)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-36)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-36)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y="898.4" textLength="97.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-36)">-verbose</text><text class="breeze-release-management-prepare-provider-documentation-r6" x="158.6" y="898.4" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-36)">-v</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="207.4" y="898.4" textLength="585.6" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-36)">Print&#160;verbose&#160;information&#160;about&#160;performed&#160;steps.</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-36)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-36)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-37)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-37)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y="922.8" textLength="48.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-37)">-dry</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="85.4" y="922.8" textLength="48.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-37)">-run</text><text class="breeze-release-management-prepare-provider-documentation-r6" x="158.6" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-37)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="170.8" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-37)">D</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="207.4" y="922.8" textLength="719.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-37)">If&#160;dry-run&#160;is&#160;set,&#160;commands&#160;are&#160;only&#160;printed,&#160;not&#160;executed.</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-37)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-37)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-38)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="947.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-38)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y="947.2" textLength="85.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-38)">-answer</text><text class="breeze-release-management-prepare-provider-documentation-r6" x="158.6" y="947.2" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-38)">-a</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="207.4" y="947.2" textLength="317.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-38)">Force&#160;answer&#160;to&#160;questions.</text><text class="breeze-release-management-prepare-provider-documentation-r7" x="536.8" y="947.2" textLength="353.8" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-38)">(y&#160;|&#160;n&#160;|&#160;q&#160;|&#160;yes&#160;|&#160;no&#160;|&#160;quit)</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="947.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-38)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="947.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-38)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-39)">│</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="24.4" y="971.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-39)">-</text><text class="breeze-release-management-prepare-provider-documentation-r4" x="36.6" y="971.6" textLength="61" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-39)">-help</text><text class="breeze-release-management-prepare-provider-documentation-r6" x="158.6" y="971.6" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-39)">-h</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="207.4" y="971.6" textLength="329.4" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-39)">Show&#160;this&#160;message&#160;and&#160;exit.</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="1451.8" y="971.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-39)">│</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="971.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-39)">
+</text><text class="breeze-release-management-prepare-provider-documentation-r5" x="0" y="996" textLength="1464" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-40)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-prepare-provider-documentation-r2" x="1464" y="996" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-documentation-line-40)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output_release-management_prepare-provider-packages.svg b/images/breeze/output_release-management_prepare-provider-packages.svg
index 419a2ecb8d551..de3df76b2d2b8 100644
--- a/images/breeze/output_release-management_prepare-provider-packages.svg
+++ b/images/breeze/output_release-management_prepare-provider-packages.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 855.1999999999999" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 879.5999999999999" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath id="breeze-release-management-prepare-provider-packages-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="804.1999999999999" />
+      <rect x="0" y="0" width="1463.0" height="828.5999999999999" />
     </clipPath>
     <clipPath id="breeze-release-management-prepare-provider-packages-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -141,9 +141,12 @@
 <clipPath id="breeze-release-management-prepare-provider-packages-line-31">
     <rect x="0" y="757.9" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-release-management-prepare-provider-packages-line-32">
+    <rect x="0" y="782.3" width="1464" height="24.65"/>
+            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="853.2" rx="8"/><text class="breeze-release-management-prepare-provider-packages-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;release-management&#160;prepare-provider-packages</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="877.6" rx="8"/><text class="breeze-release-management-prepare-provider-packages-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;release-management&#160;prepare-provider-packages</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -154,38 +157,39 @@
     
     <g class="breeze-release-management-prepare-provider-packages-matrix">
     <text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="20" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-0)">
-</text><text class="breeze-release-management-prepare-provider-packages-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-1)">Usage:&#160;</text><text class="breeze-release-management-prepare-provider-packages-r1" x="97.6" y="44.4" textLength="646.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-1)">breeze&#160;release-management&#160;prepare-provider-packages&#160;[</text><text class="breeze-release-management-prepare-provider-packages-r4" x="744.2" y="44.4" textLength="85.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-1)">OPTIONS</text><text class="breeze-release-management-prepare-provider-packages-r1" x="829.6" y="44.4" textLength="549" clip-path="url(#breeze-release-management-prepare-provider-packages-line-1)">]&#160;[airbyte&#160;|&#160;alibaba&#160;|&#160;amazon&#160;|&#160;apache.beam&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-1)">
-</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="68.8" textLength="1305.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-2)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.cassandra&#160;|&#160;apache.drill&#160;|&#160;apache.druid&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-2)">
-</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="93.2" textLength="1427.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-3)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.flink&#160;|&#160;apache.hdfs&#160;|&#160;apache.hive&#160;|&#160;apache.impala&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-3)">
-</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="117.6" textLength="1403" clip-path="url(#breeze-release-management-prepare-provider-packages-line-4)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.kafka&#160;|&#160;apache.kylin&#160;|&#160;apache.livy&#160;|&#160;apache.pig&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-4)">
-</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="142" textLength="1378.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-5)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.pinot&#160;|&#160;apache.spark&#160;|&#160;apache.sqoop&#160;|&#160;apprise&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="142" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-5)">
-</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="166.4" textLength="1390.8" clip-path="url(#breeze-release-management-prepare-provider-packages-line-6)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;arangodb&#160;|&#160;asana&#160;|&#160;atlassian.jira&#160;|&#160;celery&#160;|&#160;cloudant&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="166.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-6)">
-</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="190.8" textLength="1427.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;cncf.kubernetes&#160;|&#160;common.sql&#160;|&#160;daskexecutor&#160;|&#160;databricks&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-7)">
-</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="215.2" textLength="1342" clip-path="url(#breeze-release-management-prepare-provider-packages-line-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;datadog&#160;|&#160;dbt.cloud&#160;|&#160;dingding&#160;|&#160;discord&#160;|&#160;docker&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="215.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-8)">
-</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="239.6" textLength="1439.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-9)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;elasticsearch&#160;|&#160;exasol&#160;|&#160;facebook&#160;|&#160;ftp&#160;|&#160;github&#160;|&#160;google&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="239.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-9)">
-</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="264" textLength="1427.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;grpc&#160;|&#160;hashicorp&#160;|&#160;http&#160;|&#160;imap&#160;|&#160;influxdb&#160;|&#160;jdbc&#160;|&#160;jenkins</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="264" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-10)">
-</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="288.4" textLength="1378.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-11)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;|&#160;microsoft.azure&#160;|&#160;microsoft.mssql&#160;|&#160;microsoft.psrp&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="288.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-11)">
-</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="312.8" textLength="1439.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-12)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;microsoft.winrm&#160;|&#160;mongo&#160;|&#160;mysql&#160;|&#160;neo4j&#160;|&#160;odbc&#160;|&#160;openfaas&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-12)">
-</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="337.2" textLength="1415.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-13)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;openlineage&#160;|&#160;opsgenie&#160;|&#160;oracle&#160;|&#160;pagerduty&#160;|&#160;papermill&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-13)">
-</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="361.6" textLength="1415.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-14)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;plexus&#160;|&#160;postgres&#160;|&#160;presto&#160;|&#160;redis&#160;|&#160;salesforce&#160;|&#160;samba&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-14)">
-</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="386" textLength="1403" clip-path="url(#breeze-release-management-prepare-provider-packages-line-15)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;segment&#160;|&#160;sendgrid&#160;|&#160;sftp&#160;|&#160;singularity&#160;|&#160;slack&#160;|&#160;smtp&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="386" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-15)">
-</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="410.4" textLength="1415.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-16)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;snowflake&#160;|&#160;sqlite&#160;|&#160;ssh&#160;|&#160;tableau&#160;|&#160;tabular&#160;|&#160;telegram&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-16)">
-</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="434.8" textLength="1073.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-17)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;trino&#160;|&#160;vertica&#160;|&#160;zendesk]...</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-17)">
-</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-18)">
-</text><text class="breeze-release-management-prepare-provider-packages-r2" x="12.2" y="483.6" textLength="585.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-19)">Prepare&#160;sdist/whl&#160;packages&#160;of&#160;Airflow&#160;Providers.</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-19)">
-</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="508" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-20)">
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="532.4" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-21)">╭─</text><text class="breeze-release-management-prepare-provider-packages-r5" x="24.4" y="532.4" textLength="183" clip-path="url(#breeze-release-management-prepare-provider-packages-line-21)">&#160;Package&#160;flags&#160;</text><text class="breeze-release-management-prepare-provider-packages-r5" x="207.4" y="532.4" textLength="1232.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-21)">─────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-release-management-prepare-provider-packages-r5" x="1439.6" y="532.4" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-21)">─╮</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-21)">
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-22)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-22)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="556.8" textLength="97.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-22)">-package</text><text class="breeze-release-management-prepare-provider-packages-r4" x="134.2" y="556.8" textLength="85.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-22)">-format</text><text class="breeze-release-management-prepare-provider-packages-r2" x="402.6" y="556.8" textLength="231.8" clip-path="url(#breeze-release-management-prepare-provider-packages-line-22)">Format&#160;of&#160;packages.</text><text class="breeze-release-management-prepare-provider-packages-r6" x="646.6" y="556.8" textLength="268.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-22)">(wheel&#160;|&#160;sdist&#160;|&#160;both)</text><text class="breeze-release-management-prepare-provider-packages-r5" x="927.2" y="556.8" textLength="195.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-22)">[default:&#160;wheel]</text><text class="breeze-release-management-prepare-provider-packages-r5" x="1451.8" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-22)">│</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-22)">
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-23)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-23)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="581.2" textLength="97.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-23)">-version</text><text class="breeze-release-management-prepare-provider-packages-r4" x="134.2" y="581.2" textLength="195.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-23)">-suffix-for-pypi</text><text class="breeze-release-management-prepare-provider-packages-r2" x="402.6" y="581.2" textLength="768.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-23)">Version&#160;suffix&#160;used&#160;for&#160;PyPI&#160;packages&#160;(alpha,&#160;beta,&#160;rc1,&#160;etc.).</text><text class="breeze-release-management-prepare-provider-packages-r6" x="1183.4" y="581.2" textLength="73.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-23)">(TEXT)</text><text class="breeze-release-management-prepare-provider-packages-r5" x="1451.8" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-23)">│</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-23)">
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-24)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-24)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="605.6" textLength="97.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-24)">-package</text><text class="breeze-release-management-prepare-provider-packages-r4" x="134.2" y="605.6" textLength="122" clip-path="url(#breeze-release-management-prepare-provider-packages-line-24)">-list-file</text><text class="breeze-release-management-prepare-provider-packages-r2" x="402.6" y="605.6" textLength="732" clip-path="url(#breeze-release-management-prepare-provider-packages-line-24)">Read&#160;list&#160;of&#160;packages&#160;from&#160;text&#160;file&#160;(one&#160;package&#160;per&#160;line).</text><text class="breeze-release-management-prepare-provider-packages-r6" x="1146.8" y="605.6" textLength="122" clip-path="url(#breeze-release-management-prepare-provider-packages-line-24)">(FILENAME)</text><text class="breeze-release-management-prepare-provider-packages-r5" x="1451.8" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-24)">│</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-24)">
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-25)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-25)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="630" textLength="73.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-25)">-debug</text><text class="breeze-release-management-prepare-provider-packages-r2" x="402.6" y="630" textLength="878.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-25)">Drop&#160;user&#160;in&#160;shell&#160;instead&#160;of&#160;running&#160;the&#160;command.&#160;Useful&#160;for&#160;debugging.</text><text class="breeze-release-management-prepare-provider-packages-r5" x="1451.8" y="630" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-25)">│</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="630" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-25)">
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-26)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-26)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="654.4" textLength="85.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-26)">-github</text><text class="breeze-release-management-prepare-provider-packages-r4" x="122" y="654.4" textLength="134.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-26)">-repository</text><text class="breeze-release-management-prepare-provider-packages-r7" x="353.8" y="654.4" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-26)">-g</text><text class="breeze-release-management-prepare-provider-packages-r2" x="402.6" y="654.4" textLength="585.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-26)">GitHub&#160;repository&#160;used&#160;to&#160;pull,&#160;push&#160;run&#160;images.</text><text class="breeze-release-management-prepare-provider-packages-r6" x="1000.4" y="654.4" textLength="73.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-26)">(TEXT)</text><text class="breeze-release-management-prepare-provider-packages-r5" x="1085.8" y="654.4" textLength="305" clip-path="url(#breeze-release-management-prepare-provider-packages-line-26)">[default:&#160;apache/airflow]</text><text class="breeze-release-management-prepare-provider-packages-r5" x="1451.8" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-26)">│</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-26)">
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="678.8" textLength="1464" clip-path="url(#breeze-release-management-prepare-provider-packages-line-27)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-27)">
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="703.2" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-28)">╭─</text><text class="breeze-release-management-prepare-provider-packages-r5" x="24.4" y="703.2" textLength="195.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-28)">&#160;Common&#160;options&#160;</text><text class="breeze-release-management-prepare-provider-packages-r5" x="219.6" y="703.2" textLength="1220" clip-path="url(#breeze-release-management-prepare-provider-packages-line-28)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-release-management-prepare-provider-packages-r5" x="1439.6" y="703.2" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-28)">─╮</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-28)">
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-29)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-29)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="727.6" textLength="97.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-29)">-verbose</text><text class="breeze-release-management-prepare-provider-packages-r7" x="158.6" y="727.6" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-29)">-v</text><text class="breeze-release-management-prepare-provider-packages-r2" x="207.4" y="727.6" textLength="585.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-29)">Print&#160;verbose&#160;information&#160;about&#160;performed&#160;steps.</text><text class="breeze-release-management-prepare-provider-packages-r5" x="1451.8" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-29)">│</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-29)">
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-30)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="752" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-30)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="752" textLength="48.8" clip-path="url(#breeze-release-management-prepare-provider-packages-line-30)">-dry</text><text class="breeze-release-management-prepare-provider-packages-r4" x="85.4" y="752" textLength="48.8" clip-path="url(#breeze-release-management-prepare-provider-packages-line-30)">-run</text><text class="breeze-release-management-prepare-provider-packages-r7" x="158.6" y="752" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-30)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="170.8" y="752" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-30)">D</text><text class="breeze-release-management-prepare-provider-packages-r2" x="207.4" y="752" textLength="719.8" clip-path="url(#breeze-release-management-prepare-provider-packages-line-30)">If&#160;dry-run&#160;is&#160;set,&#160;commands&#160;are&#160;only&#160;printed,&#160;not&#160;executed.</text><text class="breeze-release-management-prepare-provider-packages-r5" x="1451.8" y="752" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-30)">│</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-30)">
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-31)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-31)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="776.4" textLength="61" clip-path="url(#breeze-release-management-prepare-provider-packages-line-31)">-help</text><text class="breeze-release-management-prepare-provider-packages-r7" x="158.6" y="776.4" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-31)">-h</text><text class="breeze-release-management-prepare-provider-packages-r2" x="207.4" y="776.4" textLength="329.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-31)">Show&#160;this&#160;message&#160;and&#160;exit.</text><text class="breeze-release-management-prepare-provider-packages-r5" x="1451.8" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-31)">│</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-31)">
-</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="800.8" textLength="1464" clip-path="url(#breeze-release-management-prepare-provider-packages-line-32)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-32)">
+</text><text class="breeze-release-management-prepare-provider-packages-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-1)">Usage:&#160;</text><text class="breeze-release-management-prepare-provider-packages-r1" x="97.6" y="44.4" textLength="646.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-1)">breeze&#160;release-management&#160;prepare-provider-packages&#160;[</text><text class="breeze-release-management-prepare-provider-packages-r4" x="744.2" y="44.4" textLength="85.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-1)">OPTIONS</text><text class="breeze-release-management-prepare-provider-packages-r1" x="829.6" y="44.4" textLength="573.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-1)">]&#160;[apache-airflow&#160;|&#160;docker-stack&#160;|&#160;helm-chart&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-1)">
+</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="68.8" textLength="1439.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-2)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;airbyte&#160;|&#160;alibaba&#160;|&#160;amazon&#160;|&#160;apache.beam&#160;|&#160;apache.cassandra</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-2)">
+</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="93.2" textLength="1427.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-3)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;|&#160;apache.drill&#160;|&#160;apache.druid&#160;|&#160;apache.flink&#160;|&#160;apache.hdfs</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-3)">
+</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="117.6" textLength="1439.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-4)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;|&#160;apache.hive&#160;|&#160;apache.impala&#160;|&#160;apache.kafka&#160;|&#160;apache.kylin</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-4)">
+</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="142" textLength="1427.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-5)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;|&#160;apache.livy&#160;|&#160;apache.pig&#160;|&#160;apache.pinot&#160;|&#160;apache.spark&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="142" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-5)">
+</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="166.4" textLength="1427.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-6)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache.sqoop&#160;|&#160;apprise&#160;|&#160;arangodb&#160;|&#160;asana&#160;|&#160;atlassian.jira</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="166.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-6)">
+</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="190.8" textLength="1354.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;|&#160;celery&#160;|&#160;cloudant&#160;|&#160;cncf.kubernetes&#160;|&#160;common.sql&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-7)">
+</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="215.2" textLength="1427.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;daskexecutor&#160;|&#160;databricks&#160;|&#160;datadog&#160;|&#160;dbt.cloud&#160;|&#160;dingding</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="215.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-8)">
+</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="239.6" textLength="1403" clip-path="url(#breeze-release-management-prepare-provider-packages-line-9)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;|&#160;discord&#160;|&#160;docker&#160;|&#160;elasticsearch&#160;|&#160;exasol&#160;|&#160;facebook&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="239.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-9)">
+</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="264" textLength="1403" clip-path="url(#breeze-release-management-prepare-provider-packages-line-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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ftp&#160;|&#160;github&#160;|&#160;google&#160;|&#160;grpc&#160;|&#160;hashicorp&#160;|&#160;http&#160;|&#160;imap&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="264" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-10)">
+</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="288.4" textLength="1268.8" clip-path="url(#breeze-release-management-prepare-provider-packages-line-11)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;influxdb&#160;|&#160;jdbc&#160;|&#160;jenkins&#160;|&#160;microsoft.azure&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="288.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-11)">
+</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="312.8" textLength="1427.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-12)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;microsoft.mssql&#160;|&#160;microsoft.psrp&#160;|&#160;microsoft.winrm&#160;|&#160;mongo</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-12)">
+</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="337.2" textLength="1427.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-13)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;|&#160;mysql&#160;|&#160;neo4j&#160;|&#160;odbc&#160;|&#160;openfaas&#160;|&#160;openlineage&#160;|&#160;opsgenie</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-13)">
+</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="361.6" textLength="1378.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-14)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;|&#160;oracle&#160;|&#160;pagerduty&#160;|&#160;papermill&#160;|&#160;plexus&#160;|&#160;postgres&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-14)">
+</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="386" textLength="1427.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-15)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;presto&#160;|&#160;redis&#160;|&#160;salesforce&#160;|&#160;samba&#160;|&#160;segment&#160;|&#160;sendgrid&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="386" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-15)">
+</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="410.4" textLength="1403" clip-path="url(#breeze-release-management-prepare-provider-packages-line-16)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;sftp&#160;|&#160;singularity&#160;|&#160;slack&#160;|&#160;smtp&#160;|&#160;snowflake&#160;|&#160;sqlite&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-16)">
+</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="434.8" textLength="1378.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-17)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ssh&#160;|&#160;tableau&#160;|&#160;tabular&#160;|&#160;telegram&#160;|&#160;trino&#160;|&#160;vertica&#160;|</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-17)">
+</text><text class="breeze-release-management-prepare-provider-packages-r1" x="12.2" y="459.2" textLength="854" clip-path="url(#breeze-release-management-prepare-provider-packages-line-18)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;zendesk]...</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-18)">
+</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-19)">
+</text><text class="breeze-release-management-prepare-provider-packages-r2" x="12.2" y="508" textLength="585.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-20)">Prepare&#160;sdist/whl&#160;packages&#160;of&#160;Airflow&#160;Providers.</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="508" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-20)">
+</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-21)">
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="556.8" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-22)">╭─</text><text class="breeze-release-management-prepare-provider-packages-r5" x="24.4" y="556.8" textLength="183" clip-path="url(#breeze-release-management-prepare-provider-packages-line-22)">&#160;Package&#160;flags&#160;</text><text class="breeze-release-management-prepare-provider-packages-r5" x="207.4" y="556.8" textLength="1232.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-22)">─────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-release-management-prepare-provider-packages-r5" x="1439.6" y="556.8" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-22)">─╮</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-22)">
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-23)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-23)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="581.2" textLength="97.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-23)">-package</text><text class="breeze-release-management-prepare-provider-packages-r4" x="134.2" y="581.2" textLength="85.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-23)">-format</text><text class="breeze-release-management-prepare-provider-packages-r2" x="402.6" y="581.2" textLength="231.8" clip-path="url(#breeze-release-management-prepare-provider-packages-line-23)">Format&#160;of&#160;packages.</text><text class="breeze-release-management-prepare-provider-packages-r6" x="646.6" y="581.2" textLength="268.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-23)">(wheel&#160;|&#160;sdist&#160;|&#160;both)</text><text class="breeze-release-management-prepare-provider-packages-r5" x="927.2" y="581.2" textLength="195.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-23)">[default:&#160;wheel]</text><text class="breeze-release-management-prepare-provider-packages-r5" x="1451.8" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-23)">│</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-23)">
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-24)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-24)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="605.6" textLength="97.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-24)">-version</text><text class="breeze-release-management-prepare-provider-packages-r4" x="134.2" y="605.6" textLength="195.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-24)">-suffix-for-pypi</text><text class="breeze-release-management-prepare-provider-packages-r2" x="402.6" y="605.6" textLength="768.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-24)">Version&#160;suffix&#160;used&#160;for&#160;PyPI&#160;packages&#160;(alpha,&#160;beta,&#160;rc1,&#160;etc.).</text><text class="breeze-release-management-prepare-provider-packages-r6" x="1183.4" y="605.6" textLength="73.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-24)">(TEXT)</text><text class="breeze-release-management-prepare-provider-packages-r5" x="1451.8" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-24)">│</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-24)">
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-25)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-25)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="630" textLength="97.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-25)">-package</text><text class="breeze-release-management-prepare-provider-packages-r4" x="134.2" y="630" textLength="122" clip-path="url(#breeze-release-management-prepare-provider-packages-line-25)">-list-file</text><text class="breeze-release-management-prepare-provider-packages-r2" x="402.6" y="630" textLength="732" clip-path="url(#breeze-release-management-prepare-provider-packages-line-25)">Read&#160;list&#160;of&#160;packages&#160;from&#160;text&#160;file&#160;(one&#160;package&#160;per&#160;line).</text><text class="breeze-release-management-prepare-provider-packages-r6" x="1146.8" y="630" textLength="122" clip-path="url(#breeze-release-management-prepare-provider-packages-line-25)">(FILENAME)</text><text class="breeze-release-management-prepare-provider-packages-r5" x="1451.8" y="630" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-25)">│</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="630" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-25)">
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-26)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-26)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="654.4" textLength="73.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-26)">-debug</text><text class="breeze-release-management-prepare-provider-packages-r2" x="402.6" y="654.4" textLength="878.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-26)">Drop&#160;user&#160;in&#160;shell&#160;instead&#160;of&#160;running&#160;the&#160;command.&#160;Useful&#160;for&#160;debugging.</text><text class="breeze-release-management-prepare-provider-packages-r5" x="1451.8" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-26)">│</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-26)">
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-27)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-27)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="678.8" textLength="85.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-27)">-github</text><text class="breeze-release-management-prepare-provider-packages-r4" x="122" y="678.8" textLength="134.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-27)">-repository</text><text class="breeze-release-management-prepare-provider-packages-r7" x="353.8" y="678.8" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-27)">-g</text><text class="breeze-release-management-prepare-provider-packages-r2" x="402.6" y="678.8" textLength="585.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-27)">GitHub&#160;repository&#160;used&#160;to&#160;pull,&#160;push&#160;run&#160;images.</text><text class="breeze-release-management-prepare-provider-packages-r6" x="1000.4" y="678.8" textLength="73.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-27)">(TEXT)</text><text class="breeze-release-management-prepare-provider-packages-r5" x="1085.8" y="678.8" textLength="305" clip-path="url(#breeze-release-management-prepare-provider-packages-line-27)">[default:&#160;apache/airflow]</text><text class="breeze-release-management-prepare-provider-packages-r5" x="1451.8" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-27)">│</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-27)">
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="703.2" textLength="1464" clip-path="url(#breeze-release-management-prepare-provider-packages-line-28)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-28)">
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="727.6" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-29)">╭─</text><text class="breeze-release-management-prepare-provider-packages-r5" x="24.4" y="727.6" textLength="195.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-29)">&#160;Common&#160;options&#160;</text><text class="breeze-release-management-prepare-provider-packages-r5" x="219.6" y="727.6" textLength="1220" clip-path="url(#breeze-release-management-prepare-provider-packages-line-29)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-release-management-prepare-provider-packages-r5" x="1439.6" y="727.6" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-29)">─╮</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-29)">
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-30)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="752" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-30)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="752" textLength="97.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-30)">-verbose</text><text class="breeze-release-management-prepare-provider-packages-r7" x="158.6" y="752" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-30)">-v</text><text class="breeze-release-management-prepare-provider-packages-r2" x="207.4" y="752" textLength="585.6" clip-path="url(#breeze-release-management-prepare-provider-packages-line-30)">Print&#160;verbose&#160;information&#160;about&#160;performed&#160;steps.</text><text class="breeze-release-management-prepare-provider-packages-r5" x="1451.8" y="752" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-30)">│</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-30)">
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-31)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-31)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="776.4" textLength="48.8" clip-path="url(#breeze-release-management-prepare-provider-packages-line-31)">-dry</text><text class="breeze-release-management-prepare-provider-packages-r4" x="85.4" y="776.4" textLength="48.8" clip-path="url(#breeze-release-management-prepare-provider-packages-line-31)">-run</text><text class="breeze-release-management-prepare-provider-packages-r7" x="158.6" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-31)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="170.8" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-31)">D</text><text class="breeze-release-management-prepare-provider-packages-r2" x="207.4" y="776.4" textLength="719.8" clip-path="url(#breeze-release-management-prepare-provider-packages-line-31)">If&#160;dry-run&#160;is&#160;set,&#160;commands&#160;are&#160;only&#160;printed,&#160;not&#160;executed.</text><text class="breeze-release-management-prepare-provider-packages-r5" x="1451.8" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-31)">│</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-31)">
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-32)">│</text><text class="breeze-release-management-prepare-provider-packages-r4" x="24.4" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-32)">-</text><text class="breeze-release-management-prepare-provider-packages-r4" x="36.6" y="800.8" textLength="61" clip-path="url(#breeze-release-management-prepare-provider-packages-line-32)">-help</text><text class="breeze-release-management-prepare-provider-packages-r7" x="158.6" y="800.8" textLength="24.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-32)">-h</text><text class="breeze-release-management-prepare-provider-packages-r2" x="207.4" y="800.8" textLength="329.4" clip-path="url(#breeze-release-management-prepare-provider-packages-line-32)">Show&#160;this&#160;message&#160;and&#160;exit.</text><text class="breeze-release-management-prepare-provider-packages-r5" x="1451.8" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-32)">│</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-32)">
+</text><text class="breeze-release-management-prepare-provider-packages-r5" x="0" y="825.2" textLength="1464" clip-path="url(#breeze-release-management-prepare-provider-packages-line-33)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-prepare-provider-packages-r2" x="1464" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-prepare-provider-packages-line-33)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output_release-management_publish-docs.svg b/images/breeze/output_release-management_publish-docs.svg
index 536433c233053..5aacbea522178 100644
--- a/images/breeze/output_release-management_publish-docs.svg
+++ b/images/breeze/output_release-management_publish-docs.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1440.8" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1416.3999999999999" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -45,7 +45,7 @@
 
     <defs>
     <clipPath id="breeze-release-management-publish-docs-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="1389.8" />
+      <rect x="0" y="0" width="1463.0" height="1365.3999999999999" />
     </clipPath>
     <clipPath id="breeze-release-management-publish-docs-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -212,12 +212,9 @@
 <clipPath id="breeze-release-management-publish-docs-line-54">
     <rect x="0" y="1319.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="breeze-release-management-publish-docs-line-55">
-    <rect x="0" y="1343.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="1438.8" rx="8"/><text class="breeze-release-management-publish-docs-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;release-management&#160;publish-docs</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1414.4" rx="8"/><text class="breeze-release-management-publish-docs-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;release-management&#160;publish-docs</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -235,7 +232,7 @@
 </text><text class="breeze-release-management-publish-docs-r5" x="0" y="142" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-5)">╭─</text><text class="breeze-release-management-publish-docs-r5" x="24.4" y="142" textLength="170.8" clip-path="url(#breeze-release-management-publish-docs-line-5)">&#160;Publish&#160;Docs&#160;</text><text class="breeze-release-management-publish-docs-r5" x="195.2" y="142" textLength="1244.4" clip-path="url(#breeze-release-management-publish-docs-line-5)">──────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-release-management-publish-docs-r5" x="1439.6" y="142" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-5)">─╮</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="142" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-5)">
 </text><text class="breeze-release-management-publish-docs-r5" x="0" y="166.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-6)">│</text><text class="breeze-release-management-publish-docs-r4" x="61" y="166.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-6)">-</text><text class="breeze-release-management-publish-docs-r4" x="73.2" y="166.4" textLength="109.8" clip-path="url(#breeze-release-management-publish-docs-line-6)">-override</text><text class="breeze-release-management-publish-docs-r4" x="183" y="166.4" textLength="122" clip-path="url(#breeze-release-management-publish-docs-line-6)">-versioned</text><text class="breeze-release-management-publish-docs-r6" x="378.2" y="166.4" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-6)">-s</text><text class="breeze-release-management-publish-docs-r2" x="427" y="166.4" textLength="390.4" clip-path="url(#breeze-release-management-publish-docs-line-6)">Overrides&#160;versioned&#160;directories.</text><text class="breeze-release-management-publish-docs-r5" x="1451.8" y="166.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-6)">│</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="166.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-6)">
 </text><text class="breeze-release-management-publish-docs-r5" x="0" y="190.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-7)">│</text><text class="breeze-release-management-publish-docs-r4" x="61" y="190.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-7)">-</text><text class="breeze-release-management-publish-docs-r4" x="73.2" y="190.8" textLength="97.6" clip-path="url(#breeze-release-management-publish-docs-line-7)">-package</text><text class="breeze-release-management-publish-docs-r4" x="170.8" y="190.8" textLength="85.4" clip-path="url(#breeze-release-management-publish-docs-line-7)">-filter</text><text class="breeze-release-management-publish-docs-r2" x="427" y="190.8" textLength="1012.6" clip-path="url(#breeze-release-management-publish-docs-line-7)">List&#160;of&#160;packages&#160;to&#160;consider.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-release-management-publish-docs-r5" x="1451.8" y="190.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-7)">│</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="190.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-7)">
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-8)">│</text><text class="breeze-release-management-publish-docs-r7" x="427" y="215.2" textLength="1012.6" clip-path="url(#breeze-release-management-publish-docs-line-8)">(apache-airflow&#160;|&#160;apache-airflow-providers-airbyte&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-release-management-publish-docs-r5" x="1451.8" y="215.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-8)">│</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="215.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-8)">
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-8)">│</text><text class="breeze-release-management-publish-docs-r7" x="427" y="215.2" textLength="1012.6" clip-path="url(#breeze-release-management-publish-docs-line-8)">(apache-airflow&#160;|&#160;docker-stack&#160;|&#160;helm-chart&#160;|&#160;apache-airflow-providers-airbyte&#160;|&#160;&#160;&#160;</text><text class="breeze-release-management-publish-docs-r5" x="1451.8" y="215.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-8)">│</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="215.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-8)">
 </text><text class="breeze-release-management-publish-docs-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-9)">│</text><text class="breeze-release-management-publish-docs-r7" x="427" y="239.6" textLength="1012.6" clip-path="url(#breeze-release-management-publish-docs-line-9)">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;</text><text class="breeze-release-management-publish-docs-r5" x="1451.8" y="239.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-9)">│</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="239.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-9)">
 </text><text class="breeze-release-management-publish-docs-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-10)">│</text><text class="breeze-release-management-publish-docs-r7" x="427" y="264" textLength="1012.6" clip-path="url(#breeze-release-management-publish-docs-line-10)">apache-airflow-providers-apache-beam&#160;|&#160;apache-airflow-providers-apache-cassandra&#160;|&#160;</text><text class="breeze-release-management-publish-docs-r5" x="1451.8" y="264" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-10)">│</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="264" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-10)">
 </text><text class="breeze-release-management-publish-docs-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-11)">│</text><text class="breeze-release-management-publish-docs-r7" x="427" y="288.4" textLength="1012.6" clip-path="url(#breeze-release-management-publish-docs-line-11)">apache-airflow-providers-apache-drill&#160;|&#160;apache-airflow-providers-apache-druid&#160;|&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-publish-docs-r5" x="1451.8" y="288.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-11)">│</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="288.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-11)">
@@ -275,15 +272,14 @@
 </text><text class="breeze-release-management-publish-docs-r5" x="0" y="1118" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-45)">│</text><text class="breeze-release-management-publish-docs-r7" x="427" y="1118" textLength="1012.6" clip-path="url(#breeze-release-management-publish-docs-line-45)">apache-airflow-providers-sqlite&#160;|&#160;apache-airflow-providers-ssh&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-publish-docs-r5" x="1451.8" y="1118" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-45)">│</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="1118" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-45)">
 </text><text class="breeze-release-management-publish-docs-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-46)">│</text><text class="breeze-release-management-publish-docs-r7" x="427" y="1142.4" textLength="1012.6" clip-path="url(#breeze-release-management-publish-docs-line-46)">apache-airflow-providers-tableau&#160;|&#160;apache-airflow-providers-tabular&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-publish-docs-r5" x="1451.8" y="1142.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-46)">│</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="1142.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-46)">
 </text><text class="breeze-release-management-publish-docs-r5" x="0" y="1166.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-47)">│</text><text class="breeze-release-management-publish-docs-r7" x="427" y="1166.8" textLength="1012.6" clip-path="url(#breeze-release-management-publish-docs-line-47)">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;</text><text class="breeze-release-management-publish-docs-r5" x="1451.8" y="1166.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-47)">│</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="1166.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-47)">
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="1191.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-48)">│</text><text class="breeze-release-management-publish-docs-r7" x="427" y="1191.2" textLength="1012.6" clip-path="url(#breeze-release-management-publish-docs-line-48)">apache-airflow-providers-vertica&#160;|&#160;apache-airflow-providers-zendesk&#160;|&#160;docker-stack&#160;</text><text class="breeze-release-management-publish-docs-r5" x="1451.8" y="1191.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-48)">│</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="1191.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-48)">
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="1215.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-49)">│</text><text class="breeze-release-management-publish-docs-r7" x="427" y="1215.6" textLength="1012.6" clip-path="url(#breeze-release-management-publish-docs-line-49)">|&#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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-release-management-publish-docs-r5" x="1451.8" y="1215.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-49)">│</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="1215.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-49)">
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="1240" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-50)">│</text><text class="breeze-release-management-publish-docs-r8" x="24.4" y="1240" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-50)">*</text><text class="breeze-release-management-publish-docs-r4" x="61" y="1240" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-50)">-</text><text class="breeze-release-management-publish-docs-r4" x="73.2" y="1240" textLength="97.6" clip-path="url(#breeze-release-management-publish-docs-line-50)">-airflow</text><text class="breeze-release-management-publish-docs-r4" x="170.8" y="1240" textLength="183" clip-path="url(#breeze-release-management-publish-docs-line-50)">-site-directory</text><text class="breeze-release-management-publish-docs-r6" x="378.2" y="1240" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-50)">-a</text><text class="breeze-release-management-publish-docs-r2" x="427" y="1240" textLength="597.8" clip-path="url(#breeze-release-management-publish-docs-line-50)">Local&#160;directory&#160;path&#160;of&#160;cloned&#160;airflow-site&#160;repo.</text><text class="breeze-release-management-publish-docs-r7" x="1037" y="1240" textLength="73.2" clip-path="url(#breeze-release-management-publish-docs-line-50)">(TEXT)</text><text class="breeze-release-management-publish-docs-r9" x="1122.4" y="1240" textLength="122" clip-path="url(#breeze-release-management-publish-docs-line-50)">[required]</text><text class="breeze-release-management-publish-docs-r5" x="1451.8" y="1240" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-50)">│</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="1240" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-50)">
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="1264.4" textLength="1464" clip-path="url(#breeze-release-management-publish-docs-line-51)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="1264.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-51)">
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="1288.8" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-52)">╭─</text><text class="breeze-release-management-publish-docs-r5" x="24.4" y="1288.8" textLength="195.2" clip-path="url(#breeze-release-management-publish-docs-line-52)">&#160;Common&#160;options&#160;</text><text class="breeze-release-management-publish-docs-r5" x="219.6" y="1288.8" textLength="1220" clip-path="url(#breeze-release-management-publish-docs-line-52)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-release-management-publish-docs-r5" x="1439.6" y="1288.8" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-52)">─╮</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="1288.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-52)">
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="1313.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-53)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="1313.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-53)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="1313.2" textLength="97.6" clip-path="url(#breeze-release-management-publish-docs-line-53)">-verbose</text><text class="breeze-release-management-publish-docs-r6" x="158.6" y="1313.2" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-53)">-v</text><text class="breeze-release-management-publish-docs-r2" x="207.4" y="1313.2" textLength="585.6" clip-path="url(#breeze-release-management-publish-docs-line-53)">Print&#160;verbose&#160;information&#160;about&#160;performed&#160;steps.</text><text class="breeze-release-management-publish-docs-r5" x="1451.8" y="1313.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-53)">│</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="1313.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-53)">
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="1337.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-54)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="1337.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-54)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="1337.6" textLength="48.8" clip-path="url(#breeze-release-management-publish-docs-line-54)">-dry</text><text class="breeze-release-management-publish-docs-r4" x="85.4" y="1337.6" textLength="48.8" clip-path="url(#breeze-release-management-publish-docs-line-54)">-run</text><text class="breeze-release-management-publish-docs-r6" x="158.6" y="1337.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-54)">-</text><text class="breeze-release-management-publish-docs-r4" x="170.8" y="1337.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-54)">D</text><text class="breeze-release-management-publish-docs-r2" x="207.4" y="1337.6" textLength="719.8" clip-path="url(#breeze-release-management-publish-docs-line-54)">If&#160;dry-run&#160;is&#160;set,&#160;commands&#160;are&#160;only&#160;printed,&#160;not&#160;executed.</text><text class="breeze-release-management-publish-docs-r5" x="1451.8" y="1337.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-54)">│</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="1337.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-54)">
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="1362" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-55)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="1362" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-55)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="1362" textLength="61" clip-path="url(#breeze-release-management-publish-docs-line-55)">-help</text><text class="breeze-release-management-publish-docs-r6" x="158.6" y="1362" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-55)">-h</text><text class="breeze-release-management-publish-docs-r2" x="207.4" y="1362" textLength="329.4" clip-path="url(#breeze-release-management-publish-docs-line-55)">Show&#160;this&#160;message&#160;and&#160;exit.</text><text class="breeze-release-management-publish-docs-r5" x="1451.8" y="1362" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-55)">│</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="1362" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-55)">
-</text><text class="breeze-release-management-publish-docs-r5" x="0" y="1386.4" textLength="1464" clip-path="url(#breeze-release-management-publish-docs-line-56)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="1386.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-56)">
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="1191.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-48)">│</text><text class="breeze-release-management-publish-docs-r7" x="427" y="1191.2" textLength="1012.6" clip-path="url(#breeze-release-management-publish-docs-line-48)">apache-airflow-providers-vertica&#160;|&#160;apache-airflow-providers-zendesk)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-release-management-publish-docs-r5" x="1451.8" y="1191.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-48)">│</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="1191.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-48)">
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="1215.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-49)">│</text><text class="breeze-release-management-publish-docs-r8" x="24.4" y="1215.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-49)">*</text><text class="breeze-release-management-publish-docs-r4" x="61" y="1215.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-49)">-</text><text class="breeze-release-management-publish-docs-r4" x="73.2" y="1215.6" textLength="97.6" clip-path="url(#breeze-release-management-publish-docs-line-49)">-airflow</text><text class="breeze-release-management-publish-docs-r4" x="170.8" y="1215.6" textLength="183" clip-path="url(#breeze-release-management-publish-docs-line-49)">-site-directory</text><text class="breeze-release-management-publish-docs-r6" x="378.2" y="1215.6" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-49)">-a</text><text class="breeze-release-management-publish-docs-r2" x="427" y="1215.6" textLength="597.8" clip-path="url(#breeze-release-management-publish-docs-line-49)">Local&#160;directory&#160;path&#160;of&#160;cloned&#160;airflow-site&#160;repo.</text><text class="breeze-release-management-publish-docs-r7" x="1037" y="1215.6" textLength="73.2" clip-path="url(#breeze-release-management-publish-docs-line-49)">(TEXT)</text><text class="breeze-release-management-publish-docs-r9" x="1122.4" y="1215.6" textLength="122" clip-path="url(#breeze-release-management-publish-docs-line-49)">[required]</text><text class="breeze-release-management-publish-docs-r5" x="1451.8" y="1215.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-49)">│</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="1215.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-49)">
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="1240" textLength="1464" clip-path="url(#breeze-release-management-publish-docs-line-50)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="1240" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-50)">
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="1264.4" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-51)">╭─</text><text class="breeze-release-management-publish-docs-r5" x="24.4" y="1264.4" textLength="195.2" clip-path="url(#breeze-release-management-publish-docs-line-51)">&#160;Common&#160;options&#160;</text><text class="breeze-release-management-publish-docs-r5" x="219.6" y="1264.4" textLength="1220" clip-path="url(#breeze-release-management-publish-docs-line-51)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-release-management-publish-docs-r5" x="1439.6" y="1264.4" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-51)">─╮</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="1264.4" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-51)">
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="1288.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-52)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="1288.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-52)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="1288.8" textLength="97.6" clip-path="url(#breeze-release-management-publish-docs-line-52)">-verbose</text><text class="breeze-release-management-publish-docs-r6" x="158.6" y="1288.8" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-52)">-v</text><text class="breeze-release-management-publish-docs-r2" x="207.4" y="1288.8" textLength="585.6" clip-path="url(#breeze-release-management-publish-docs-line-52)">Print&#160;verbose&#160;information&#160;about&#160;performed&#160;steps.</text><text class="breeze-release-management-publish-docs-r5" x="1451.8" y="1288.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-52)">│</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="1288.8" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-52)">
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="1313.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-53)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="1313.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-53)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="1313.2" textLength="48.8" clip-path="url(#breeze-release-management-publish-docs-line-53)">-dry</text><text class="breeze-release-management-publish-docs-r4" x="85.4" y="1313.2" textLength="48.8" clip-path="url(#breeze-release-management-publish-docs-line-53)">-run</text><text class="breeze-release-management-publish-docs-r6" x="158.6" y="1313.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-53)">-</text><text class="breeze-release-management-publish-docs-r4" x="170.8" y="1313.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-53)">D</text><text class="breeze-release-management-publish-docs-r2" x="207.4" y="1313.2" textLength="719.8" clip-path="url(#breeze-release-management-publish-docs-line-53)">If&#160;dry-run&#160;is&#160;set,&#160;commands&#160;are&#160;only&#160;printed,&#160;not&#160;executed.</text><text class="breeze-release-management-publish-docs-r5" x="1451.8" y="1313.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-53)">│</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="1313.2" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-53)">
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="1337.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-54)">│</text><text class="breeze-release-management-publish-docs-r4" x="24.4" y="1337.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-54)">-</text><text class="breeze-release-management-publish-docs-r4" x="36.6" y="1337.6" textLength="61" clip-path="url(#breeze-release-management-publish-docs-line-54)">-help</text><text class="breeze-release-management-publish-docs-r6" x="158.6" y="1337.6" textLength="24.4" clip-path="url(#breeze-release-management-publish-docs-line-54)">-h</text><text class="breeze-release-management-publish-docs-r2" x="207.4" y="1337.6" textLength="329.4" clip-path="url(#breeze-release-management-publish-docs-line-54)">Show&#160;this&#160;message&#160;and&#160;exit.</text><text class="breeze-release-management-publish-docs-r5" x="1451.8" y="1337.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-54)">│</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="1337.6" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-54)">
+</text><text class="breeze-release-management-publish-docs-r5" x="0" y="1362" textLength="1464" clip-path="url(#breeze-release-management-publish-docs-line-55)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-publish-docs-r2" x="1464" y="1362" textLength="12.2" clip-path="url(#breeze-release-management-publish-docs-line-55)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output_shell.svg b/images/breeze/output_shell.svg
index a8dd2ecd2eda6..7c8b47ed1147e 100644
--- a/images/breeze/output_shell.svg
+++ b/images/breeze/output_shell.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1611.6" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1709.1999999999998" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath id="breeze-shell-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="1560.6" />
+      <rect x="0" y="0" width="1463.0" height="1658.1999999999998" />
     </clipPath>
     <clipPath id="breeze-shell-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -234,9 +234,21 @@
 <clipPath id="breeze-shell-line-62">
     <rect x="0" y="1514.3" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-shell-line-63">
+    <rect x="0" y="1538.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-shell-line-64">
+    <rect x="0" y="1563.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-shell-line-65">
+    <rect x="0" y="1587.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-shell-line-66">
+    <rect x="0" y="1611.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="1609.6" rx="8"/><text class="breeze-shell-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;shell</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1707.2" rx="8"/><text class="breeze-shell-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;shell</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -304,12 +316,16 @@
 </text><text class="breeze-shell-r5" x="0" y="1362" textLength="12.2" clip-path="url(#breeze-shell-line-55)">│</text><text class="breeze-shell-r4" x="24.4" y="1362" textLength="12.2" clip-path="url(#breeze-shell-line-55)">-</text><text class="breeze-shell-r4" x="36.6" y="1362" textLength="97.6" clip-path="url(#breeze-shell-line-55)">-package</text><text class="breeze-shell-r4" x="134.2" y="1362" textLength="85.4" clip-path="url(#breeze-shell-line-55)">-format</text><text class="breeze-shell-r2" x="451.4" y="1362" textLength="658.8" clip-path="url(#breeze-shell-line-55)">Format&#160;of&#160;packages&#160;that&#160;should&#160;be&#160;installed&#160;from&#160;dist.</text><text class="breeze-shell-r7" x="1122.4" y="1362" textLength="183" clip-path="url(#breeze-shell-line-55)">(wheel&#160;|&#160;sdist)</text><text class="breeze-shell-r5" x="1451.8" y="1362" textLength="12.2" clip-path="url(#breeze-shell-line-55)">│</text><text class="breeze-shell-r2" x="1464" y="1362" textLength="12.2" clip-path="url(#breeze-shell-line-55)">
 </text><text class="breeze-shell-r5" x="0" y="1386.4" textLength="12.2" clip-path="url(#breeze-shell-line-56)">│</text><text class="breeze-shell-r5" x="451.4" y="1386.4" textLength="658.8" clip-path="url(#breeze-shell-line-56)">[default:&#160;wheel]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-shell-r5" x="1451.8" y="1386.4" textLength="12.2" clip-path="url(#breeze-shell-line-56)">│</text><text class="breeze-shell-r2" x="1464" y="1386.4" textLength="12.2" clip-path="url(#breeze-shell-line-56)">
 </text><text class="breeze-shell-r5" x="0" y="1410.8" textLength="1464" clip-path="url(#breeze-shell-line-57)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r2" x="1464" y="1410.8" textLength="12.2" clip-path="url(#breeze-shell-line-57)">
-</text><text class="breeze-shell-r5" x="0" y="1435.2" textLength="24.4" clip-path="url(#breeze-shell-line-58)">╭─</text><text class="breeze-shell-r5" x="24.4" y="1435.2" textLength="195.2" clip-path="url(#breeze-shell-line-58)">&#160;Common&#160;options&#160;</text><text class="breeze-shell-r5" x="219.6" y="1435.2" textLength="1220" clip-path="url(#breeze-shell-line-58)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-shell-r5" x="1439.6" y="1435.2" textLength="24.4" clip-path="url(#breeze-shell-line-58)">─╮</text><text class="breeze-shell-r2" x="1464" y="1435.2" textLength="12.2" clip-path="url(#breeze-shell-line-58)">
-</text><text class="breeze-shell-r5" x="0" y="1459.6" textLength="12.2" clip-path="url(#breeze-shell-line-59)">│</text><text class="breeze-shell-r4" x="24.4" y="1459.6" textLength="12.2" clip-path="url(#breeze-shell-line-59)">-</text><text class="breeze-shell-r4" x="36.6" y="1459.6" textLength="97.6" clip-path="url(#breeze-shell-line-59)">-verbose</text><text class="breeze-shell-r6" x="158.6" y="1459.6" textLength="24.4" clip-path="url(#breeze-shell-line-59)">-v</text><text class="breeze-shell-r2" x="207.4" y="1459.6" textLength="585.6" clip-path="url(#breeze-shell-line-59)">Print&#160;verbose&#160;information&#160;about&#160;performed&#160;steps.</text><text class="breeze-shell-r5" x="1451.8" y="1459.6" textLength="12.2" clip-path="url(#breeze-shell-line-59)">│</text><text class="breeze-shell-r2" x="1464" y="1459.6" textLength="12.2" clip-path="url(#breeze-shell-line-59)">
-</text><text class="breeze-shell-r5" x="0" y="1484" textLength="12.2" clip-path="url(#breeze-shell-line-60)">│</text><text class="breeze-shell-r4" x="24.4" y="1484" textLength="12.2" clip-path="url(#breeze-shell-line-60)">-</text><text class="breeze-shell-r4" x="36.6" y="1484" textLength="48.8" clip-path="url(#breeze-shell-line-60)">-dry</text><text class="breeze-shell-r4" x="85.4" y="1484" textLength="48.8" clip-path="url(#breeze-shell-line-60)">-run</text><text class="breeze-shell-r6" x="158.6" y="1484" textLength="12.2" clip-path="url(#breeze-shell-line-60)">-</text><text class="breeze-shell-r4" x="170.8" y="1484" textLength="12.2" clip-path="url(#breeze-shell-line-60)">D</text><text class="breeze-shell-r2" x="207.4" y="1484" textLength="719.8" clip-path="url(#breeze-shell-line-60)">If&#160;dry-run&#160;is&#160;set,&#160;commands&#160;are&#160;only&#160;printed,&#160;not&#160;executed.</text><text class="breeze-shell-r5" x="1451.8" y="1484" textLength="12.2" clip-path="url(#breeze-shell-line-60)">│</text><text class="breeze-shell-r2" x="1464" y="1484" textLength="12.2" clip-path="url(#breeze-shell-line-60)">
-</text><text class="breeze-shell-r5" x="0" y="1508.4" textLength="12.2" clip-path="url(#breeze-shell-line-61)">│</text><text class="breeze-shell-r4" x="24.4" y="1508.4" textLength="12.2" clip-path="url(#breeze-shell-line-61)">-</text><text class="breeze-shell-r4" x="36.6" y="1508.4" textLength="85.4" clip-path="url(#breeze-shell-line-61)">-answer</text><text class="breeze-shell-r6" x="158.6" y="1508.4" textLength="24.4" clip-path="url(#breeze-shell-line-61)">-a</text><text class="breeze-shell-r2" x="207.4" y="1508.4" textLength="317.2" clip-path="url(#breeze-shell-line-61)">Force&#160;answer&#160;to&#160;questions.</text><text class="breeze-shell-r7" x="536.8" y="1508.4" textLength="353.8" clip-path="url(#breeze-shell-line-61)">(y&#160;|&#160;n&#160;|&#160;q&#160;|&#160;yes&#160;|&#160;no&#160;|&#160;quit)</text><text class="breeze-shell-r5" x="1451.8" y="1508.4" textLength="12.2" clip-path="url(#breeze-shell-line-61)">│</text><text class="breeze-shell-r2" x="1464" y="1508.4" textLength="12.2" clip-path="url(#breeze-shell-line-61)">
-</text><text class="breeze-shell-r5" x="0" y="1532.8" textLength="12.2" clip-path="url(#breeze-shell-line-62)">│</text><text class="breeze-shell-r4" x="24.4" y="1532.8" textLength="12.2" clip-path="url(#breeze-shell-line-62)">-</text><text class="breeze-shell-r4" x="36.6" y="1532.8" textLength="61" clip-path="url(#breeze-shell-line-62)">-help</text><text class="breeze-shell-r6" x="158.6" y="1532.8" textLength="24.4" clip-path="url(#breeze-shell-line-62)">-h</text><text class="breeze-shell-r2" x="207.4" y="1532.8" textLength="329.4" clip-path="url(#breeze-shell-line-62)">Show&#160;this&#160;message&#160;and&#160;exit.</text><text class="breeze-shell-r5" x="1451.8" y="1532.8" textLength="12.2" clip-path="url(#breeze-shell-line-62)">│</text><text class="breeze-shell-r2" x="1464" y="1532.8" textLength="12.2" clip-path="url(#breeze-shell-line-62)">
-</text><text class="breeze-shell-r5" x="0" y="1557.2" textLength="1464" clip-path="url(#breeze-shell-line-63)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r2" x="1464" y="1557.2" textLength="12.2" clip-path="url(#breeze-shell-line-63)">
+</text><text class="breeze-shell-r5" x="0" y="1435.2" textLength="24.4" clip-path="url(#breeze-shell-line-58)">╭─</text><text class="breeze-shell-r5" x="24.4" y="1435.2" textLength="500.2" clip-path="url(#breeze-shell-line-58)">&#160;Upgrading/downgrading&#160;selected&#160;packages&#160;</text><text class="breeze-shell-r5" x="524.6" y="1435.2" textLength="915" clip-path="url(#breeze-shell-line-58)">───────────────────────────────────────────────────────────────────────────</text><text class="breeze-shell-r5" x="1439.6" y="1435.2" textLength="24.4" clip-path="url(#breeze-shell-line-58)">─╮</text><text class="breeze-shell-r2" x="1464" y="1435.2" textLength="12.2" clip-path="url(#breeze-shell-line-58)">
+</text><text class="breeze-shell-r5" x="0" y="1459.6" textLength="12.2" clip-path="url(#breeze-shell-line-59)">│</text><text class="breeze-shell-r4" x="24.4" y="1459.6" textLength="12.2" clip-path="url(#breeze-shell-line-59)">-</text><text class="breeze-shell-r4" x="36.6" y="1459.6" textLength="97.6" clip-path="url(#breeze-shell-line-59)">-upgrade</text><text class="breeze-shell-r4" x="134.2" y="1459.6" textLength="61" clip-path="url(#breeze-shell-line-59)">-boto</text><text class="breeze-shell-r2" x="341.6" y="1459.6" textLength="866.2" clip-path="url(#breeze-shell-line-59)">Remove&#160;aiobotocore&#160;and&#160;upgrade&#160;botocore&#160;and&#160;boto&#160;to&#160;the&#160;latest&#160;version.</text><text class="breeze-shell-r5" x="1451.8" y="1459.6" textLength="12.2" clip-path="url(#breeze-shell-line-59)">│</text><text class="breeze-shell-r2" x="1464" y="1459.6" textLength="12.2" clip-path="url(#breeze-shell-line-59)">
+</text><text class="breeze-shell-r5" x="0" y="1484" textLength="12.2" clip-path="url(#breeze-shell-line-60)">│</text><text class="breeze-shell-r4" x="24.4" y="1484" textLength="12.2" clip-path="url(#breeze-shell-line-60)">-</text><text class="breeze-shell-r4" x="36.6" y="1484" textLength="122" clip-path="url(#breeze-shell-line-60)">-downgrade</text><text class="breeze-shell-r4" x="158.6" y="1484" textLength="134.2" clip-path="url(#breeze-shell-line-60)">-sqlalchemy</text><text class="breeze-shell-r2" x="341.6" y="1484" textLength="610" clip-path="url(#breeze-shell-line-60)">Downgrade&#160;SQLAlchemy&#160;to&#160;minimum&#160;supported&#160;version.</text><text class="breeze-shell-r5" x="1451.8" y="1484" textLength="12.2" clip-path="url(#breeze-shell-line-60)">│</text><text class="breeze-shell-r2" x="1464" y="1484" textLength="12.2" clip-path="url(#breeze-shell-line-60)">
+</text><text class="breeze-shell-r5" x="0" y="1508.4" textLength="1464" clip-path="url(#breeze-shell-line-61)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r2" x="1464" y="1508.4" textLength="12.2" clip-path="url(#breeze-shell-line-61)">
+</text><text class="breeze-shell-r5" x="0" y="1532.8" textLength="24.4" clip-path="url(#breeze-shell-line-62)">╭─</text><text class="breeze-shell-r5" x="24.4" y="1532.8" textLength="195.2" clip-path="url(#breeze-shell-line-62)">&#160;Common&#160;options&#160;</text><text class="breeze-shell-r5" x="219.6" y="1532.8" textLength="1220" clip-path="url(#breeze-shell-line-62)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-shell-r5" x="1439.6" y="1532.8" textLength="24.4" clip-path="url(#breeze-shell-line-62)">─╮</text><text class="breeze-shell-r2" x="1464" y="1532.8" textLength="12.2" clip-path="url(#breeze-shell-line-62)">
+</text><text class="breeze-shell-r5" x="0" y="1557.2" textLength="12.2" clip-path="url(#breeze-shell-line-63)">│</text><text class="breeze-shell-r4" x="24.4" y="1557.2" textLength="12.2" clip-path="url(#breeze-shell-line-63)">-</text><text class="breeze-shell-r4" x="36.6" y="1557.2" textLength="97.6" clip-path="url(#breeze-shell-line-63)">-verbose</text><text class="breeze-shell-r6" x="158.6" y="1557.2" textLength="24.4" clip-path="url(#breeze-shell-line-63)">-v</text><text class="breeze-shell-r2" x="207.4" y="1557.2" textLength="585.6" clip-path="url(#breeze-shell-line-63)">Print&#160;verbose&#160;information&#160;about&#160;performed&#160;steps.</text><text class="breeze-shell-r5" x="1451.8" y="1557.2" textLength="12.2" clip-path="url(#breeze-shell-line-63)">│</text><text class="breeze-shell-r2" x="1464" y="1557.2" textLength="12.2" clip-path="url(#breeze-shell-line-63)">
+</text><text class="breeze-shell-r5" x="0" y="1581.6" textLength="12.2" clip-path="url(#breeze-shell-line-64)">│</text><text class="breeze-shell-r4" x="24.4" y="1581.6" textLength="12.2" clip-path="url(#breeze-shell-line-64)">-</text><text class="breeze-shell-r4" x="36.6" y="1581.6" textLength="48.8" clip-path="url(#breeze-shell-line-64)">-dry</text><text class="breeze-shell-r4" x="85.4" y="1581.6" textLength="48.8" clip-path="url(#breeze-shell-line-64)">-run</text><text class="breeze-shell-r6" x="158.6" y="1581.6" textLength="12.2" clip-path="url(#breeze-shell-line-64)">-</text><text class="breeze-shell-r4" x="170.8" y="1581.6" textLength="12.2" clip-path="url(#breeze-shell-line-64)">D</text><text class="breeze-shell-r2" x="207.4" y="1581.6" textLength="719.8" clip-path="url(#breeze-shell-line-64)">If&#160;dry-run&#160;is&#160;set,&#160;commands&#160;are&#160;only&#160;printed,&#160;not&#160;executed.</text><text class="breeze-shell-r5" x="1451.8" y="1581.6" textLength="12.2" clip-path="url(#breeze-shell-line-64)">│</text><text class="breeze-shell-r2" x="1464" y="1581.6" textLength="12.2" clip-path="url(#breeze-shell-line-64)">
+</text><text class="breeze-shell-r5" x="0" y="1606" textLength="12.2" clip-path="url(#breeze-shell-line-65)">│</text><text class="breeze-shell-r4" x="24.4" y="1606" textLength="12.2" clip-path="url(#breeze-shell-line-65)">-</text><text class="breeze-shell-r4" x="36.6" y="1606" textLength="85.4" clip-path="url(#breeze-shell-line-65)">-answer</text><text class="breeze-shell-r6" x="158.6" y="1606" textLength="24.4" clip-path="url(#breeze-shell-line-65)">-a</text><text class="breeze-shell-r2" x="207.4" y="1606" textLength="317.2" clip-path="url(#breeze-shell-line-65)">Force&#160;answer&#160;to&#160;questions.</text><text class="breeze-shell-r7" x="536.8" y="1606" textLength="353.8" clip-path="url(#breeze-shell-line-65)">(y&#160;|&#160;n&#160;|&#160;q&#160;|&#160;yes&#160;|&#160;no&#160;|&#160;quit)</text><text class="breeze-shell-r5" x="1451.8" y="1606" textLength="12.2" clip-path="url(#breeze-shell-line-65)">│</text><text class="breeze-shell-r2" x="1464" y="1606" textLength="12.2" clip-path="url(#breeze-shell-line-65)">
+</text><text class="breeze-shell-r5" x="0" y="1630.4" textLength="12.2" clip-path="url(#breeze-shell-line-66)">│</text><text class="breeze-shell-r4" x="24.4" y="1630.4" textLength="12.2" clip-path="url(#breeze-shell-line-66)">-</text><text class="breeze-shell-r4" x="36.6" y="1630.4" textLength="61" clip-path="url(#breeze-shell-line-66)">-help</text><text class="breeze-shell-r6" x="158.6" y="1630.4" textLength="24.4" clip-path="url(#breeze-shell-line-66)">-h</text><text class="breeze-shell-r2" x="207.4" y="1630.4" textLength="329.4" clip-path="url(#breeze-shell-line-66)">Show&#160;this&#160;message&#160;and&#160;exit.</text><text class="breeze-shell-r5" x="1451.8" y="1630.4" textLength="12.2" clip-path="url(#breeze-shell-line-66)">│</text><text class="breeze-shell-r2" x="1464" y="1630.4" textLength="12.2" clip-path="url(#breeze-shell-line-66)">
+</text><text class="breeze-shell-r5" x="0" y="1654.8" textLength="1464" clip-path="url(#breeze-shell-line-67)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r2" x="1464" y="1654.8" textLength="12.2" clip-path="url(#breeze-shell-line-67)">
 </text>
     </g>
     </g>
diff --git a/images/breeze/output_static-checks.svg b/images/breeze/output_static-checks.svg
index eeb4ec03b732c..55f4badd95a5b 100644
--- a/images/breeze/output_static-checks.svg
+++ b/images/breeze/output_static-checks.svg
@@ -328,7 +328,7 @@
 </text><text class="breeze-static-checks-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-43)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1069.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-43)">update-local-yml-file&#160;|&#160;update-migration-references&#160;|&#160;&#160;&#160;&#160;&#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="breeze-static-checks-r5" x="1451.8" y="1069.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-43)">│</text><text class="breeze-static-checks-r2" x="1464" y="1069.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-43)">
 </text><text class="breeze-static-checks-r5" x="0" y="1093.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-44)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1093.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-44)">update-providers-dependencies&#160;|&#160;update-spelling-wordlist-to-be-sorted&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1093.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-44)">│</text><text class="breeze-static-checks-r2" x="1464" y="1093.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-44)">
 </text><text class="breeze-static-checks-r5" x="0" y="1118" textLength="12.2" clip-path="url(#breeze-static-checks-line-45)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1118" textLength="988.2" clip-path="url(#breeze-static-checks-line-45)">update-supported-versions&#160;|&#160;update-vendored-in-k8s-json-schema&#160;|&#160;update-version&#160;|</text><text class="breeze-static-checks-r5" x="1451.8" y="1118" textLength="12.2" clip-path="url(#breeze-static-checks-line-45)">│</text><text class="breeze-static-checks-r2" x="1464" y="1118" textLength="12.2" clip-path="url(#breeze-static-checks-line-45)">
-</text><text class="breeze-static-checks-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-46)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1142.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-46)">yamllint)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-static-checks-r5" x="1451.8" y="1142.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-46)">│</text><text class="breeze-static-checks-r2" x="1464" y="1142.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-46)">
+</text><text class="breeze-static-checks-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-46)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1142.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-46)">validate-pyproject&#160;|&#160;yamllint)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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="breeze-static-checks-r5" x="1451.8" y="1142.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-46)">│</text><text class="breeze-static-checks-r2" x="1464" y="1142.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-46)">
 </text><text class="breeze-static-checks-r5" x="0" y="1166.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-47)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1166.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-47)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1166.8" textLength="61" clip-path="url(#breeze-static-checks-line-47)">-show</text><text class="breeze-static-checks-r4" x="97.6" y="1166.8" textLength="195.2" clip-path="url(#breeze-static-checks-line-47)">-diff-on-failure</text><text class="breeze-static-checks-r6" x="402.6" y="1166.8" textLength="24.4" clip-path="url(#breeze-static-checks-line-47)">-s</text><text class="breeze-static-checks-r2" x="451.4" y="1166.8" textLength="524.6" clip-path="url(#breeze-static-checks-line-47)">Show&#160;diff&#160;for&#160;files&#160;modified&#160;by&#160;the&#160;checks.</text><text class="breeze-static-checks-r5" x="1451.8" y="1166.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-47)">│</text><text class="breeze-static-checks-r2" x="1464" y="1166.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-47)">
 </text><text class="breeze-static-checks-r5" x="0" y="1191.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-48)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1191.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-48)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1191.2" textLength="134.2" clip-path="url(#breeze-static-checks-line-48)">-initialize</text><text class="breeze-static-checks-r4" x="170.8" y="1191.2" textLength="146.4" clip-path="url(#breeze-static-checks-line-48)">-environment</text><text class="breeze-static-checks-r2" x="451.4" y="1191.2" textLength="549" clip-path="url(#breeze-static-checks-line-48)">Initialize&#160;environment&#160;before&#160;running&#160;checks.</text><text class="breeze-static-checks-r5" x="1451.8" y="1191.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-48)">│</text><text class="breeze-static-checks-r2" x="1464" y="1191.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-48)">
 </text><text class="breeze-static-checks-r5" x="0" y="1215.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-49)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1215.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-49)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1215.6" textLength="48.8" clip-path="url(#breeze-static-checks-line-49)">-max</text><text class="breeze-static-checks-r4" x="85.4" y="1215.6" textLength="292.8" clip-path="url(#breeze-static-checks-line-49)">-initialization-attempts</text><text class="breeze-static-checks-r2" x="451.4" y="1215.6" textLength="854" clip-path="url(#breeze-static-checks-line-49)">Maximum&#160;number&#160;of&#160;attempts&#160;to&#160;initialize&#160;environment&#160;before&#160;giving&#160;up.</text><text class="breeze-static-checks-r5" x="1451.8" y="1215.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-49)">│</text><text class="breeze-static-checks-r2" x="1464" y="1215.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-49)">
diff --git a/images/breeze/output_testing_tests.svg b/images/breeze/output_testing_tests.svg
index ec3da499fa7f6..9cf14a8662ff8 100644
--- a/images/breeze/output_testing_tests.svg
+++ b/images/breeze/output_testing_tests.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1489.6" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1514.0" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath id="breeze-testing-tests-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="1438.6" />
+      <rect x="0" y="0" width="1463.0" height="1463.0" />
     </clipPath>
     <clipPath id="breeze-testing-tests-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -219,9 +219,12 @@
 <clipPath id="breeze-testing-tests-line-57">
     <rect x="0" y="1392.3" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-testing-tests-line-58">
+    <rect x="0" y="1416.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="1487.6" rx="8"/><text class="breeze-testing-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;testing&#160;tests</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1512" rx="8"/><text class="breeze-testing-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;testing&#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"/>
@@ -282,14 +285,15 @@
 </text><text class="breeze-testing-tests-r5" x="0" y="1191.2" textLength="12.2" clip-path="url(#breeze-testing-tests-line-48)">│</text><text class="breeze-testing-tests-r7" x="414.8" y="1191.2" textLength="1024.8" clip-path="url(#breeze-testing-tests-line-48)">(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;&#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="breeze-testing-tests-r5" x="1451.8" y="1191.2" textLength="12.2" clip-path="url(#breeze-testing-tests-line-48)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1191.2" textLength="12.2" clip-path="url(#breeze-testing-tests-line-48)">
 </text><text class="breeze-testing-tests-r5" x="0" y="1215.6" textLength="12.2" clip-path="url(#breeze-testing-tests-line-49)">│</text><text class="breeze-testing-tests-r5" x="414.8" y="1215.6" textLength="1024.8" clip-path="url(#breeze-testing-tests-line-49)">[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;&#160;&#160;&#160;&#160;&#160;&#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="breeze-testing-tests-r5" x="1451.8" y="1215.6" textLength="12.2" clip-path="url(#breeze-testing-tests-line-49)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1215.6" textLength="12.2" clip-path="url(#breeze-testing-tests-line-49)">
 </text><text class="breeze-testing-tests-r5" x="0" y="1240" textLength="12.2" clip-path="url(#breeze-testing-tests-line-50)">│</text><text class="breeze-testing-tests-r4" x="24.4" y="1240" textLength="12.2" clip-path="url(#breeze-testing-tests-line-50)">-</text><text class="breeze-testing-tests-r4" x="36.6" y="1240" textLength="97.6" clip-path="url(#breeze-testing-tests-line-50)">-upgrade</text><text class="breeze-testing-tests-r4" x="134.2" y="1240" textLength="61" clip-path="url(#breeze-testing-tests-line-50)">-boto</text><text class="breeze-testing-tests-r2" x="414.8" y="1240" textLength="866.2" clip-path="url(#breeze-testing-tests-line-50)">Remove&#160;aiobotocore&#160;and&#160;upgrade&#160;botocore&#160;and&#160;boto&#160;to&#160;the&#160;latest&#160;version.</text><text class="breeze-testing-tests-r5" x="1451.8" y="1240" textLength="12.2" clip-path="url(#breeze-testing-tests-line-50)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1240" textLength="12.2" clip-path="url(#breeze-testing-tests-line-50)">
-</text><text class="breeze-testing-tests-r5" x="0" y="1264.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-51)">│</text><text class="breeze-testing-tests-r4" x="24.4" y="1264.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-51)">-</text><text class="breeze-testing-tests-r4" x="36.6" y="1264.4" textLength="85.4" clip-path="url(#breeze-testing-tests-line-51)">-remove</text><text class="breeze-testing-tests-r4" x="122" y="1264.4" textLength="158.6" clip-path="url(#breeze-testing-tests-line-51)">-arm-packages</text><text class="breeze-testing-tests-r2" x="414.8" y="1264.4" textLength="573.4" clip-path="url(#breeze-testing-tests-line-51)">Removes&#160;arm&#160;packages&#160;from&#160;the&#160;image&#160;to&#160;test&#160;if&#160;</text><text class="breeze-testing-tests-r4" x="988.2" y="1264.4" textLength="36.6" clip-path="url(#breeze-testing-tests-line-51)">ARM</text><text class="breeze-testing-tests-r2" x="1024.8" y="1264.4" textLength="207.4" clip-path="url(#breeze-testing-tests-line-51)">&#160;collection&#160;works</text><text class="breeze-testing-tests-r5" x="1451.8" y="1264.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-51)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1264.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-51)">
-</text><text class="breeze-testing-tests-r5" x="0" y="1288.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-52)">│</text><text class="breeze-testing-tests-r4" x="24.4" y="1288.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-52)">-</text><text class="breeze-testing-tests-r4" x="36.6" y="1288.8" textLength="61" clip-path="url(#breeze-testing-tests-line-52)">-skip</text><text class="breeze-testing-tests-r4" x="97.6" y="1288.8" textLength="244" clip-path="url(#breeze-testing-tests-line-52)">-docker-compose-down</text><text class="breeze-testing-tests-r2" x="414.8" y="1288.8" textLength="549" clip-path="url(#breeze-testing-tests-line-52)">Skips&#160;running&#160;docker-compose&#160;down&#160;after&#160;tests</text><text class="breeze-testing-tests-r5" x="1451.8" y="1288.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-52)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1288.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-52)">
-</text><text class="breeze-testing-tests-r5" x="0" y="1313.2" textLength="1464" clip-path="url(#breeze-testing-tests-line-53)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-tests-r2" x="1464" y="1313.2" textLength="12.2" clip-path="url(#breeze-testing-tests-line-53)">
-</text><text class="breeze-testing-tests-r5" x="0" y="1337.6" textLength="24.4" clip-path="url(#breeze-testing-tests-line-54)">╭─</text><text class="breeze-testing-tests-r5" x="24.4" y="1337.6" textLength="195.2" clip-path="url(#breeze-testing-tests-line-54)">&#160;Common&#160;options&#160;</text><text class="breeze-testing-tests-r5" x="219.6" y="1337.6" textLength="1220" clip-path="url(#breeze-testing-tests-line-54)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-testing-tests-r5" x="1439.6" y="1337.6" textLength="24.4" clip-path="url(#breeze-testing-tests-line-54)">─╮</text><text class="breeze-testing-tests-r2" x="1464" y="1337.6" textLength="12.2" clip-path="url(#breeze-testing-tests-line-54)">
-</text><text class="breeze-testing-tests-r5" x="0" y="1362" textLength="12.2" clip-path="url(#breeze-testing-tests-line-55)">│</text><text class="breeze-testing-tests-r4" x="24.4" y="1362" textLength="12.2" clip-path="url(#breeze-testing-tests-line-55)">-</text><text class="breeze-testing-tests-r4" x="36.6" y="1362" textLength="97.6" clip-path="url(#breeze-testing-tests-line-55)">-verbose</text><text class="breeze-testing-tests-r6" x="158.6" y="1362" textLength="24.4" clip-path="url(#breeze-testing-tests-line-55)">-v</text><text class="breeze-testing-tests-r2" x="207.4" y="1362" textLength="585.6" clip-path="url(#breeze-testing-tests-line-55)">Print&#160;verbose&#160;information&#160;about&#160;performed&#160;steps.</text><text class="breeze-testing-tests-r5" x="1451.8" y="1362" textLength="12.2" clip-path="url(#breeze-testing-tests-line-55)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1362" textLength="12.2" clip-path="url(#breeze-testing-tests-line-55)">
-</text><text class="breeze-testing-tests-r5" x="0" y="1386.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-56)">│</text><text class="breeze-testing-tests-r4" x="24.4" y="1386.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-56)">-</text><text class="breeze-testing-tests-r4" x="36.6" y="1386.4" textLength="48.8" clip-path="url(#breeze-testing-tests-line-56)">-dry</text><text class="breeze-testing-tests-r4" x="85.4" y="1386.4" textLength="48.8" clip-path="url(#breeze-testing-tests-line-56)">-run</text><text class="breeze-testing-tests-r6" x="158.6" y="1386.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-56)">-</text><text class="breeze-testing-tests-r4" x="170.8" y="1386.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-56)">D</text><text class="breeze-testing-tests-r2" x="207.4" y="1386.4" textLength="719.8" clip-path="url(#breeze-testing-tests-line-56)">If&#160;dry-run&#160;is&#160;set,&#160;commands&#160;are&#160;only&#160;printed,&#160;not&#160;executed.</text><text class="breeze-testing-tests-r5" x="1451.8" y="1386.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-56)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1386.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-56)">
-</text><text class="breeze-testing-tests-r5" x="0" y="1410.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-57)">│</text><text class="breeze-testing-tests-r4" x="24.4" y="1410.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-57)">-</text><text class="breeze-testing-tests-r4" x="36.6" y="1410.8" textLength="61" clip-path="url(#breeze-testing-tests-line-57)">-help</text><text class="breeze-testing-tests-r6" x="158.6" y="1410.8" textLength="24.4" clip-path="url(#breeze-testing-tests-line-57)">-h</text><text class="breeze-testing-tests-r2" x="207.4" y="1410.8" textLength="329.4" clip-path="url(#breeze-testing-tests-line-57)">Show&#160;this&#160;message&#160;and&#160;exit.</text><text class="breeze-testing-tests-r5" x="1451.8" y="1410.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-57)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1410.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-57)">
-</text><text class="breeze-testing-tests-r5" x="0" y="1435.2" textLength="1464" clip-path="url(#breeze-testing-tests-line-58)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-tests-r2" x="1464" y="1435.2" textLength="12.2" clip-path="url(#breeze-testing-tests-line-58)">
+</text><text class="breeze-testing-tests-r5" x="0" y="1264.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-51)">│</text><text class="breeze-testing-tests-r4" x="24.4" y="1264.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-51)">-</text><text class="breeze-testing-tests-r4" x="36.6" y="1264.4" textLength="122" clip-path="url(#breeze-testing-tests-line-51)">-downgrade</text><text class="breeze-testing-tests-r4" x="158.6" y="1264.4" textLength="134.2" clip-path="url(#breeze-testing-tests-line-51)">-sqlalchemy</text><text class="breeze-testing-tests-r2" x="414.8" y="1264.4" textLength="610" clip-path="url(#breeze-testing-tests-line-51)">Downgrade&#160;SQLAlchemy&#160;to&#160;minimum&#160;supported&#160;version.</text><text class="breeze-testing-tests-r5" x="1451.8" y="1264.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-51)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1264.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-51)">
+</text><text class="breeze-testing-tests-r5" x="0" y="1288.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-52)">│</text><text class="breeze-testing-tests-r4" x="24.4" y="1288.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-52)">-</text><text class="breeze-testing-tests-r4" x="36.6" y="1288.8" textLength="85.4" clip-path="url(#breeze-testing-tests-line-52)">-remove</text><text class="breeze-testing-tests-r4" x="122" y="1288.8" textLength="158.6" clip-path="url(#breeze-testing-tests-line-52)">-arm-packages</text><text class="breeze-testing-tests-r2" x="414.8" y="1288.8" textLength="573.4" clip-path="url(#breeze-testing-tests-line-52)">Removes&#160;arm&#160;packages&#160;from&#160;the&#160;image&#160;to&#160;test&#160;if&#160;</text><text class="breeze-testing-tests-r4" x="988.2" y="1288.8" textLength="36.6" clip-path="url(#breeze-testing-tests-line-52)">ARM</text><text class="breeze-testing-tests-r2" x="1024.8" y="1288.8" textLength="207.4" clip-path="url(#breeze-testing-tests-line-52)">&#160;collection&#160;works</text><text class="breeze-testing-tests-r5" x="1451.8" y="1288.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-52)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1288.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-52)">
+</text><text class="breeze-testing-tests-r5" x="0" y="1313.2" textLength="12.2" clip-path="url(#breeze-testing-tests-line-53)">│</text><text class="breeze-testing-tests-r4" x="24.4" y="1313.2" textLength="12.2" clip-path="url(#breeze-testing-tests-line-53)">-</text><text class="breeze-testing-tests-r4" x="36.6" y="1313.2" textLength="61" clip-path="url(#breeze-testing-tests-line-53)">-skip</text><text class="breeze-testing-tests-r4" x="97.6" y="1313.2" textLength="244" clip-path="url(#breeze-testing-tests-line-53)">-docker-compose-down</text><text class="breeze-testing-tests-r2" x="414.8" y="1313.2" textLength="549" clip-path="url(#breeze-testing-tests-line-53)">Skips&#160;running&#160;docker-compose&#160;down&#160;after&#160;tests</text><text class="breeze-testing-tests-r5" x="1451.8" y="1313.2" textLength="12.2" clip-path="url(#breeze-testing-tests-line-53)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1313.2" textLength="12.2" clip-path="url(#breeze-testing-tests-line-53)">
+</text><text class="breeze-testing-tests-r5" x="0" y="1337.6" textLength="1464" clip-path="url(#breeze-testing-tests-line-54)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-tests-r2" x="1464" y="1337.6" textLength="12.2" clip-path="url(#breeze-testing-tests-line-54)">
+</text><text class="breeze-testing-tests-r5" x="0" y="1362" textLength="24.4" clip-path="url(#breeze-testing-tests-line-55)">╭─</text><text class="breeze-testing-tests-r5" x="24.4" y="1362" textLength="195.2" clip-path="url(#breeze-testing-tests-line-55)">&#160;Common&#160;options&#160;</text><text class="breeze-testing-tests-r5" x="219.6" y="1362" textLength="1220" clip-path="url(#breeze-testing-tests-line-55)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-testing-tests-r5" x="1439.6" y="1362" textLength="24.4" clip-path="url(#breeze-testing-tests-line-55)">─╮</text><text class="breeze-testing-tests-r2" x="1464" y="1362" textLength="12.2" clip-path="url(#breeze-testing-tests-line-55)">
+</text><text class="breeze-testing-tests-r5" x="0" y="1386.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-56)">│</text><text class="breeze-testing-tests-r4" x="24.4" y="1386.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-56)">-</text><text class="breeze-testing-tests-r4" x="36.6" y="1386.4" textLength="97.6" clip-path="url(#breeze-testing-tests-line-56)">-verbose</text><text class="breeze-testing-tests-r6" x="158.6" y="1386.4" textLength="24.4" clip-path="url(#breeze-testing-tests-line-56)">-v</text><text class="breeze-testing-tests-r2" x="207.4" y="1386.4" textLength="585.6" clip-path="url(#breeze-testing-tests-line-56)">Print&#160;verbose&#160;information&#160;about&#160;performed&#160;steps.</text><text class="breeze-testing-tests-r5" x="1451.8" y="1386.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-56)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1386.4" textLength="12.2" clip-path="url(#breeze-testing-tests-line-56)">
+</text><text class="breeze-testing-tests-r5" x="0" y="1410.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-57)">│</text><text class="breeze-testing-tests-r4" x="24.4" y="1410.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-57)">-</text><text class="breeze-testing-tests-r4" x="36.6" y="1410.8" textLength="48.8" clip-path="url(#breeze-testing-tests-line-57)">-dry</text><text class="breeze-testing-tests-r4" x="85.4" y="1410.8" textLength="48.8" clip-path="url(#breeze-testing-tests-line-57)">-run</text><text class="breeze-testing-tests-r6" x="158.6" y="1410.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-57)">-</text><text class="breeze-testing-tests-r4" x="170.8" y="1410.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-57)">D</text><text class="breeze-testing-tests-r2" x="207.4" y="1410.8" textLength="719.8" clip-path="url(#breeze-testing-tests-line-57)">If&#160;dry-run&#160;is&#160;set,&#160;commands&#160;are&#160;only&#160;printed,&#160;not&#160;executed.</text><text class="breeze-testing-tests-r5" x="1451.8" y="1410.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-57)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1410.8" textLength="12.2" clip-path="url(#breeze-testing-tests-line-57)">
+</text><text class="breeze-testing-tests-r5" x="0" y="1435.2" textLength="12.2" clip-path="url(#breeze-testing-tests-line-58)">│</text><text class="breeze-testing-tests-r4" x="24.4" y="1435.2" textLength="12.2" clip-path="url(#breeze-testing-tests-line-58)">-</text><text class="breeze-testing-tests-r4" x="36.6" y="1435.2" textLength="61" clip-path="url(#breeze-testing-tests-line-58)">-help</text><text class="breeze-testing-tests-r6" x="158.6" y="1435.2" textLength="24.4" clip-path="url(#breeze-testing-tests-line-58)">-h</text><text class="breeze-testing-tests-r2" x="207.4" y="1435.2" textLength="329.4" clip-path="url(#breeze-testing-tests-line-58)">Show&#160;this&#160;message&#160;and&#160;exit.</text><text class="breeze-testing-tests-r5" x="1451.8" y="1435.2" textLength="12.2" clip-path="url(#breeze-testing-tests-line-58)">│</text><text class="breeze-testing-tests-r2" x="1464" y="1435.2" textLength="12.2" clip-path="url(#breeze-testing-tests-line-58)">
+</text><text class="breeze-testing-tests-r5" x="0" y="1459.6" textLength="1464" clip-path="url(#breeze-testing-tests-line-59)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-testing-tests-r2" x="1464" y="1459.6" textLength="12.2" clip-path="url(#breeze-testing-tests-line-59)">
 </text>
     </g>
     </g>
diff --git a/kubernetes_tests/test_base.py b/kubernetes_tests/test_base.py
index 5b45969c3d287..98c2e978c7480 100644
--- a/kubernetes_tests/test_base.py
+++ b/kubernetes_tests/test_base.py
@@ -102,7 +102,7 @@ def _describe_resources(self, namespace: str):
     @staticmethod
     def _num_pods_in_namespace(namespace):
         air_pod = check_output(["kubectl", "get", "pods", "-n", namespace]).decode()
-        air_pod = air_pod.split("\n")
+        air_pod = air_pod.splitlines()
         names = [re2.compile(r"\s+").split(x)[0] for x in air_pod if "airflow" in x]
         return len(names)
 
@@ -110,7 +110,7 @@ def _num_pods_in_namespace(namespace):
     def _delete_airflow_pod(name=""):
         suffix = "-" + name if name else ""
         air_pod = check_output(["kubectl", "get", "pods"]).decode()
-        air_pod = air_pod.split("\n")
+        air_pod = air_pod.splitlines()
         names = [re2.compile(r"\s+").split(x)[0] for x in air_pod if "airflow" + suffix in x]
         if names:
             check_call(["kubectl", "delete", "pod", names[0]])
diff --git a/kubernetes_tests/test_kubernetes_pod_operator.py b/kubernetes_tests/test_kubernetes_pod_operator.py
index ec6ad5e503f19..ceeb06bd62bc4 100644
--- a/kubernetes_tests/test_kubernetes_pod_operator.py
+++ b/kubernetes_tests/test_kubernetes_pod_operator.py
@@ -78,7 +78,7 @@ def kubeconfig_path():
 
 @pytest.fixture
 def test_label(request):
-    label = "".join(filter(str.isalnum, f"{request.node.cls.__name__}.{request.node.name}")).lower()
+    label = "".join(c for c in f"{request.node.cls.__name__}.{request.node.name}" if c.isalnum()).lower()
     return label[-63:]
 
 
@@ -266,7 +266,7 @@ def test_already_checked_on_failure(self, mock_get_connection):
             k.execute(context)
         actual_pod = k.find_pod("default", context, exclude_checked=False)
         actual_pod = self.api_client.sanitize_for_serialization(actual_pod)
-        status = next(iter(filter(lambda x: x["name"] == "base", actual_pod["status"]["containerStatuses"])))
+        status = next(x for x in actual_pod["status"]["containerStatuses"] if x["name"] == "base")
         assert status["state"]["terminated"]["reason"] == "Error"
         assert actual_pod["metadata"]["labels"]["already_checked"] == "True"
 
diff --git a/pyproject.toml b/pyproject.toml
index 630d44cf0514a..238e32bdf8851 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -16,7 +16,7 @@
 # under the License.
 [tool.black]
 line-length = 110
-target-version = ['py37', 'py38', 'py39', 'py310']
+target-version = ['py38', 'py39', 'py310', 'py311']
 
 # Editable installs are currently broken using setuptools 64.0.0 and above. The problem is tracked in
 # https://github.com/pypa/setuptools/issues/3548. We're also discussing how we could potentially fix
@@ -28,10 +28,8 @@ target-version = ['py37', 'py38', 'py39', 'py310']
 requires = ['setuptools==67.2.0']
 build-backend = "setuptools.build_meta"
 
-[project]
-requires-python = ">=3.8"
-
 [tool.ruff]
+target-version = "py38"
 typing-modules = ["airflow.typing_compat"]
 line-length = 110
 extend-exclude = [
diff --git a/scripts/ci/docker-compose/_docker.env b/scripts/ci/docker-compose/_docker.env
index 2cd4bc0f7de15..f0efac7768fc4 100644
--- a/scripts/ci/docker-compose/_docker.env
+++ b/scripts/ci/docker-compose/_docker.env
@@ -37,6 +37,7 @@ DB_RESET
 DEFAULT_BRANCH
 DEFAULT_CONSTRAINTS_BRANCH
 DEV_MODE
+DOCKER_IS_ROOTLESS
 ENABLED_SYSTEMS
 ENABLE_TEST_COVERAGE
 GITHUB_ACTIONS
@@ -75,6 +76,7 @@ TEST_TIMEOUT
 TEST_TYPE
 UPGRADE_BOTO
 UPGRADE_TO_NEWER_DEPENDENCIES
+DOWNGRADE_SQLALCHEMY
 VERBOSE
 VERBOSE_COMMANDS
 VERSION_SUFFIX_FOR_PYPI
diff --git a/scripts/ci/docker-compose/base.yml b/scripts/ci/docker-compose/base.yml
index 160e8feec04e8..f3b4742a31687 100644
--- a/scripts/ci/docker-compose/base.yml
+++ b/scripts/ci/docker-compose/base.yml
@@ -48,6 +48,7 @@ services:
       - DEFAULT_BRANCH=${DEFAULT_BRANCH}
       - DEFAULT_CONSTRAINTS_BRANCH=${DEFAULT_CONSTRAINTS_BRANCH}
       - DEV_MODE=${DEV_MODE}
+      - DOCKER_IS_ROOTLESS=${DOCKER_IS_ROOTLESS}
       - ENABLED_SYSTEMS=${ENABLED_SYSTEMS}
       - ENABLE_TEST_COVERAGE=${ENABLE_TEST_COVERAGE}
       - GITHUB_ACTIONS=${GITHUB_ACTIONS}
@@ -85,6 +86,7 @@ services:
       - TEST_TYPE=${TEST_TYPE}
       - TEST_TIMEOUT=${TEST_TIMEOUT}
       - UPGRADE_BOTO=${UPGRADE_BOTO}
+      - DOWNGRADE_SQLALCHEMY=${DOWNGRADE_SQLALCHEMY}
       - UPGRADE_TO_NEWER_DEPENDENCIES=${UPGRADE_TO_NEWER_DEPENDENCIES}
       - VERBOSE=${VERBOSE}
       - VERBOSE_COMMANDS=${VERBOSE_COMMANDS}
diff --git a/scripts/ci/docker-compose/devcontainer.env b/scripts/ci/docker-compose/devcontainer.env
index d66767fa02c92..a297d7579cb1b 100644
--- a/scripts/ci/docker-compose/devcontainer.env
+++ b/scripts/ci/docker-compose/devcontainer.env
@@ -35,6 +35,7 @@ DB_RESET="false"
 DEFAULT_BRANCH="main"
 DEFAULT_CONSTRAINTS_BRANCH="constraints-main"
 DEV_MODE="true"
+DOCKER_IS_ROOTLESS="false"
 ENABLED_SYSTEMS=
 ENABLE_TEST_COVERAGE="false"
 GITHUB_ACTIONS="false"
@@ -69,6 +70,7 @@ START_AIRFLOW="false"
 SUSPENDED_PROVIDERS_FOLDERS=""
 TEST_TYPE=
 UPGRADE_BOTO="false"
+DOWNGRADE_SQLALCHEMY="false"
 UPGRADE_TO_NEWER_DEPENDENCIES="false"
 VERBOSE="false"
 VERBOSE_COMMANDS="false"
diff --git a/scripts/ci/install_breeze.sh b/scripts/ci/install_breeze.sh
index e73f6c28b64cb..7a0e7a927b6b7 100755
--- a/scripts/ci/install_breeze.sh
+++ b/scripts/ci/install_breeze.sh
@@ -19,6 +19,6 @@ set -euxo pipefail
 
 cd "$( dirname "${BASH_SOURCE[0]}" )/../../"
 
-python -m pip install pipx
+python -m pip install pipx packaging==23.1
 python -m pipx install --editable ./dev/breeze/ --force
 echo '/home/runner/.local/bin' >> "${GITHUB_PATH}"
diff --git a/scripts/ci/pre_commit/pre_commit_check_order_setup.py b/scripts/ci/pre_commit/pre_commit_check_order_setup.py
index 05b8136e4bcb3..38bc2048d76ed 100755
--- a/scripts/ci/pre_commit/pre_commit_check_order_setup.py
+++ b/scripts/ci/pre_commit/pre_commit_check_order_setup.py
@@ -26,15 +26,14 @@
 import re
 import sys
 import textwrap
-from os.path import abspath, dirname
+from pathlib import Path
 
 from rich import print
 
 errors: list[str] = []
 
-MY_DIR_PATH = os.path.dirname(__file__)
-SOURCE_DIR_PATH = os.path.abspath(os.path.join(MY_DIR_PATH, os.pardir, os.pardir, os.pardir))
-sys.path.insert(0, SOURCE_DIR_PATH)
+SOURCE_DIR_PATH = Path(__file__).parents[3].resolve()
+sys.path.insert(0, os.fspath(SOURCE_DIR_PATH))
 
 
 class ConsoleDiff(difflib.Differ):
@@ -124,7 +123,7 @@ def check_install_and_setup_requires() -> None:
 
     from setuptools.config import read_configuration
 
-    path = abspath(os.path.join(dirname(__file__), os.pardir, os.pardir, os.pardir, "setup.cfg"))
+    path = os.fspath(SOURCE_DIR_PATH / "setup.cfg")
     config = read_configuration(path)
 
     pattern_dependent_version = re.compile("[~|><=;].*")
diff --git a/scripts/ci/pre_commit/pre_commit_check_setup_extra_packages_ref.py b/scripts/ci/pre_commit/pre_commit_check_setup_extra_packages_ref.py
index 04b707f30ac83..df8e95e5e3868 100755
--- a/scripts/ci/pre_commit/pre_commit_check_setup_extra_packages_ref.py
+++ b/scripts/ci/pre_commit/pre_commit_check_setup_extra_packages_ref.py
@@ -24,18 +24,18 @@
 import os
 import re
 import sys
-from os.path import dirname
+from pathlib import Path
 
 from rich import print
 from rich.console import Console
 from rich.table import Table
 
-AIRFLOW_SOURCES_DIR = os.path.join(dirname(__file__), os.pardir, os.pardir, os.pardir)
+AIRFLOW_SOURCES_DIR = Path(__file__).parents[3].resolve()
 SETUP_PY_FILE = "setup.py"
 DOCS_FILE = os.path.join("docs", "apache-airflow", "extra-packages-ref.rst")
 PY_IDENTIFIER = r"[a-zA-Z_][a-zA-Z0-9_\.]*"
 
-sys.path.insert(0, AIRFLOW_SOURCES_DIR)
+sys.path.insert(0, os.fspath(AIRFLOW_SOURCES_DIR))
 
 os.environ["_SKIP_PYTHON_VERSION_CHECK"] = "true"
 
@@ -49,9 +49,8 @@
 
 
 def get_file_content(*path_elements: str) -> str:
-    file_path = os.path.join(AIRFLOW_SOURCES_DIR, *path_elements)
-    with open(file_path) as file_to_read:
-        return file_to_read.read()
+    file_path = AIRFLOW_SOURCES_DIR.joinpath(*path_elements)
+    return file_path.read_text()
 
 
 def get_extras_from_setup() -> set[str]:
diff --git a/scripts/ci/pre_commit/pre_commit_inline_scripts_in_docker.py b/scripts/ci/pre_commit/pre_commit_inline_scripts_in_docker.py
index 31f6142b5a86e..ece43801e1db1 100755
--- a/scripts/ci/pre_commit/pre_commit_inline_scripts_in_docker.py
+++ b/scripts/ci/pre_commit/pre_commit_inline_scripts_in_docker.py
@@ -17,7 +17,6 @@
 # under the License.
 from __future__ import annotations
 
-from os import listdir
 from pathlib import Path
 
 AIRFLOW_SOURCES_DIR = Path(__file__).parents[3].resolve()
@@ -45,16 +44,16 @@ def insert_content(file_path: Path, content: list[str], header: str, footer: str
     SCRIPTS_DOCKER_DIR = AIRFLOW_SOURCES_DIR / "scripts" / "docker"
 
     for file in [DOCKERFILE_FILE, DOCKERFILE_CI_FILE]:
-        for script in listdir(SCRIPTS_DOCKER_DIR):
-            script_content = (SCRIPTS_DOCKER_DIR / script).read_text().splitlines(keepends=True)
+        for script in SCRIPTS_DOCKER_DIR.iterdir():
+            script_content = script.read_text().splitlines(keepends=True)
             no_comments_script_content = [
                 line for line in script_content if not line.startswith("#") or line.startswith("#!")
             ]
-            no_comments_script_content.insert(0, f'COPY <<"EOF" /{script}\n')
+            no_comments_script_content.insert(0, f'COPY <<"EOF" /{script.name}\n')
             insert_content(
                 file_path=file,
                 content=no_comments_script_content,
                 header="# The content below is automatically copied from scripts/docker/",
                 footer="EOF",
-                file_name=script,
+                file_name=script.name,
             )
diff --git a/scripts/ci/pre_commit/pre_commit_sort_in_the_wild.py b/scripts/ci/pre_commit/pre_commit_sort_in_the_wild.py
index a04d7d18d01d1..cfe2047236be9 100755
--- a/scripts/ci/pre_commit/pre_commit_sort_in_the_wild.py
+++ b/scripts/ci/pre_commit/pre_commit_sort_in_the_wild.py
@@ -68,5 +68,5 @@ def stable_sort(x):
                 line = "1." + line.split(".", maxsplit=1)[1]
                 print(f"{old_line.strip()} => {line.strip()}")
             companies.append(line)
-    companies = sorted(companies, key=stable_sort)
+    companies.sort(key=stable_sort)
     inthewild_path.write_text("".join(header) + "\n" + "".join(companies))
diff --git a/scripts/ci/pre_commit/pre_commit_supported_versions.py b/scripts/ci/pre_commit/pre_commit_supported_versions.py
index c1b964cc56c58..0f526e644238b 100755
--- a/scripts/ci/pre_commit/pre_commit_supported_versions.py
+++ b/scripts/ci/pre_commit/pre_commit_supported_versions.py
@@ -27,7 +27,7 @@
 HEADERS = ("Version", "Current Patch/Minor", "State", "First Release", "Limited Support", "EOL/Terminated")
 
 SUPPORTED_VERSIONS = (
-    ("2", "2.7.1", "Supported", "Dec 17, 2020", "TBD", "TBD"),
+    ("2", "2.7.2", "Supported", "Dec 17, 2020", "TBD", "TBD"),
     ("1.10", "1.10.15", "EOL", "Aug 27, 2018", "Dec 17, 2020", "June 17, 2021"),
     ("1.9", "1.9.0", "EOL", "Jan 03, 2018", "Aug 27, 2018", "Aug 27, 2018"),
     ("1.8", "1.8.2", "EOL", "Mar 19, 2017", "Jan 03, 2018", "Jan 03, 2018"),
diff --git a/scripts/ci/pre_commit/pre_commit_unittest_testcase.py b/scripts/ci/pre_commit/pre_commit_unittest_testcase.py
index c13c9a99258e2..3ed21c8edcd17 100755
--- a/scripts/ci/pre_commit/pre_commit_unittest_testcase.py
+++ b/scripts/ci/pre_commit/pre_commit_unittest_testcase.py
@@ -29,18 +29,18 @@ def check_test_file(file: str) -> int:
     classes = [c for c in node.body if isinstance(c, ast.ClassDef)]
     for c in classes:
         # Some classes are returned as an ast.Attribute, some as an ast.Name object. Not quite sure why
-        parent_classes = [base.attr for base in c.bases if isinstance(base, ast.Attribute)]
-        parent_classes.extend([base.id for base in c.bases if isinstance(base, ast.Name)])
-
-        if "TestCase" in parent_classes:
+        if any(
+            (isinstance(base, ast.Attribute) and base.attr == "TestCase")
+            or (isinstance(base, ast.Name) and base.id == "TestCase")
+            for base in c.bases
+        ):
             found += 1
             print(f"The class {c.name} inherits from TestCase, please use pytest instead")
-
     return found
 
 
 def main(*args: str) -> int:
-    return sum([check_test_file(file) for file in args[1:]])
+    return sum(check_test_file(file) for file in args[1:])
 
 
 if __name__ == "__main__":
diff --git a/scripts/ci/pre_commit/pre_commit_update_common_sql_api_stubs.py b/scripts/ci/pre_commit/pre_commit_update_common_sql_api_stubs.py
index b8fead2861d5e..c26f7b7bb1d59 100755
--- a/scripts/ci/pre_commit/pre_commit_update_common_sql_api_stubs.py
+++ b/scripts/ci/pre_commit/pre_commit_update_common_sql_api_stubs.py
@@ -319,7 +319,7 @@ def compare_stub_files(generated_stub_path: Path, force_override: bool) -> tuple
     shutil.rmtree(OUT_DIR, ignore_errors=True)
 
     subprocess.run(
-        ["stubgen", *[os.fspath(path) for path in COMMON_SQL_ROOT.rglob("**/*.py")]],
+        ["stubgen", *[os.fspath(path) for path in COMMON_SQL_ROOT.rglob("*.py")]],
         cwd=AIRFLOW_SOURCES_ROOT_PATH,
     )
     total_removals, total_additions = 0, 0
@@ -327,9 +327,9 @@ def compare_stub_files(generated_stub_path: Path, force_override: bool) -> tuple
     if _force_override:
         console.print("\n[yellow]The committed stub APIs are force-updated\n")
     # reformat the generated stubs first
-    for stub_path in OUT_DIR.rglob("**/*.pyi"):
+    for stub_path in OUT_DIR.rglob("*.pyi"):
         write_pyi_file(stub_path, stub_path.read_text(encoding="utf-8"))
-    for stub_path in OUT_DIR.rglob("**/*.pyi"):
+    for stub_path in OUT_DIR.rglob("*.pyi"):
         _new_removals, _new_additions = compare_stub_files(stub_path, force_override=_force_override)
         total_removals += _new_removals
         total_additions += _new_additions
diff --git a/scripts/ci/testing/summarize_junit_failures.py b/scripts/ci/testing/summarize_junit_failures.py
index 2adb857891574..9c51c8ca6df0a 100755
--- a/scripts/ci/testing/summarize_junit_failures.py
+++ b/scripts/ci/testing/summarize_junit_failures.py
@@ -83,25 +83,19 @@ def summarize_file(input, test_type, backend):
 
     testsuite = root.find(".//testsuite")
 
-    fail_message = ""
-
-    num = int(testsuite.get("failures"))
-    if num:
-        fail_message = f"{num} failure"
-        if num != 1:
-            fail_message += "s"
-
-    num = int(testsuite.get("errors"))
-    if num:
-        if fail_message:
-            fail_message += ", "
-        fail_message += f"{num} error"
-        if num != 1:
-            fail_message += "s"
-
-    if not fail_message:
+    fail_message_parts = []
+
+    num_failures = int(testsuite.get("failures"))
+    if num_failures:
+        fail_message_parts.append(f"{num_failures} failure{'' if num_failures == 1 else 's'}")
+
+    num_errors = int(testsuite.get("errors"))
+    if num_errors:
+        fail_message_parts.append(f"{num_errors} error{'' if num_errors == 1 else 's'}")
+
+    if not fail_message_parts:
         return
-    print(f"\n{TEXT_RED}==== {test_type} {backend}: {fail_message} ===={TEXT_RESET}\n")
+    print(f"\n{TEXT_RED}==== {test_type} {backend}: {', '.join(fail_message_parts)} ===={TEXT_RESET}\n")
 
     for testcase in testsuite.findall(".//testcase[error]"):
         case_name = translate_name(testcase)
diff --git a/scripts/docker/entrypoint_ci.sh b/scripts/docker/entrypoint_ci.sh
index 73b8a20deb3f3..87e573d114f28 100755
--- a/scripts/docker/entrypoint_ci.sh
+++ b/scripts/docker/entrypoint_ci.sh
@@ -326,6 +326,22 @@ fi
 # Remove pytest.ini from the current directory if it exists. It has been removed from the source tree
 # but may still be present in the local directory if the user has old breeze image
 rm -f "${AIRFLOW_SOURCES}/pytest.ini"
+if [[ ${UPGRADE_BOTO=} == "true" ]]; then
+    echo
+    echo "${COLOR_BLUE}Upgrading boto3, botocore to latest version to run Amazon tests with them${COLOR_RESET}"
+    echo
+    pip uninstall --root-user-action ignore aiobotocore -y || true
+    pip install --root-user-action ignore --upgrade boto3 botocore
+    pip check
+fi
+if [[ ${DOWNGRADE_SQLALCHEMY=} == "true" ]]; then
+    min_sqlalchemy_version=$(grep "sqlalchemy>=" setup.cfg | sed "s/.*>=\([0-9\.]*\).*/\1/")
+    echo
+    echo "${COLOR_BLUE}Downgrading sqlalchemy to minimum supported version: ${min_sqlalchemy_version}${COLOR_RESET}"
+    echo
+    pip install --root-user-action ignore "sqlalchemy==${min_sqlalchemy_version}"
+    pip check
+fi
 
 set +u
 # If we do not want to run tests, we simply drop into bash
@@ -558,13 +574,6 @@ else
         exit 1
     fi
 fi
-if [[ ${UPGRADE_BOTO=} == "true" ]]; then
-    echo
-    echo "${COLOR_BLUE}Upgrading boto3, botocore to latest version to run Amazon tests with them${COLOR_RESET}"
-    echo
-    pip uninstall aiobotocore -y || true
-    pip install --upgrade boto3 botocore
-fi
 readonly SELECTED_TESTS CLI_TESTS API_TESTS PROVIDERS_TESTS CORE_TESTS WWW_TESTS \
     ALL_TESTS ALL_PRESELECTED_TESTS
 
diff --git a/scripts/in_container/_in_container_utils.sh b/scripts/in_container/_in_container_utils.sh
index 2ed267dd543c3..c962856827abe 100644
--- a/scripts/in_container/_in_container_utils.sh
+++ b/scripts/in_container/_in_container_utils.sh
@@ -66,6 +66,10 @@ function in_container_script_start() {
 #
 function in_container_fix_ownership() {
     if [[ ${HOST_OS:=} == "linux" ]]; then
+        if [[ ${DOCKER_IS_ROOTLESS=} == "true" ]]; then
+             echo "${COLOR_YELLOW}Skip fixing ownership of generated files: Docker is rootless${COLOR_RESET}"
+             return
+        fi
         DIRECTORIES_TO_FIX=(
             "/dist"
             "/files"
diff --git a/scripts/in_container/run_migration_reference.py b/scripts/in_container/run_migration_reference.py
index 47b8dbed25eeb..5d1e0b8c45560 100755
--- a/scripts/in_container/run_migration_reference.py
+++ b/scripts/in_container/run_migration_reference.py
@@ -135,22 +135,18 @@ def update_docs(revisions: Iterable[Script]):
     )
 
 
-def num_to_prefix(idx: int) -> str:
-    return f"000{idx+1}"[-4:] + "_"
-
-
 def ensure_mod_prefix(mod_name, idx, version):
-    prefix = num_to_prefix(idx) + "_".join(version) + "_"
+    parts = [f"{idx + 1:04}", *version]
     match = re.match(r"([0-9]+)_([0-9]+)_([0-9]+)_([0-9]+)_(.+)", mod_name)
     if match:
         # previously standardized file, rebuild the name
-        mod_name = match.group(5)
+        parts.append(match.group(5))
     else:
         # new migration file, standard format
         match = re.match(r"([a-z0-9]+)_(.+)", mod_name)
         if match:
-            mod_name = match.group(2)
-    return prefix + mod_name
+            parts.append(match.group(2))
+    return "_".join(parts)
 
 
 def ensure_filenames_are_sorted(revisions):
diff --git a/scripts/in_container/run_provider_yaml_files_check.py b/scripts/in_container/run_provider_yaml_files_check.py
index 3b5b3211352cc..1bc692d46be5c 100755
--- a/scripts/in_container/run_provider_yaml_files_check.py
+++ b/scripts/in_container/run_provider_yaml_files_check.py
@@ -261,14 +261,13 @@ def check_duplicates_in_integrations_names_of_hooks_sensors_operators(yaml_files
         yaml_files.items(), ["sensors", "operators", "hooks", "triggers"]
     ):
         resource_data = provider_data.get(resource_type, [])
-        current_integrations = [r.get("integration-name", "") for r in resource_data]
-        if len(current_integrations) != len(set(current_integrations)):
-            for integration in current_integrations:
-                if current_integrations.count(integration) > 1:
-                    errors.append(
-                        f"Duplicated content of '{resource_type}/integration-name/{integration}' "
-                        f"in file: {yaml_file_path}"
-                    )
+        count_integrations = Counter(r.get("integration-name", "") for r in resource_data)
+        for integration, count in count_integrations.items():
+            if count > 1:
+                errors.append(
+                    f"Duplicated content of '{resource_type}/integration-name/{integration}' "
+                    f"in file: {yaml_file_path}"
+                )
 
 
 def check_completeness_of_list_of_transfers(yaml_files: dict[str, dict]):
@@ -343,19 +342,18 @@ def check_duplicates_in_list_of_transfers(yaml_files: dict[str, dict]):
     for yaml_file_path, provider_data in yaml_files.items():
         resource_data = provider_data.get(resource_type, [])
 
-        source_target_integrations = [
+        count_integrations = Counter(
             (r.get("source-integration-name", ""), r.get("target-integration-name", ""))
             for r in resource_data
-        ]
-        if len(source_target_integrations) != len(set(source_target_integrations)):
-            for integration_couple in source_target_integrations:
-                if source_target_integrations.count(integration_couple) > 1:
-                    errors.append(
-                        f"Duplicated content of \n"
-                        f" '{resource_type}/source-integration-name/{integration_couple[0]}' "
-                        f" '{resource_type}/target-integration-name/{integration_couple[1]}' "
-                        f"in file: {yaml_file_path}"
-                    )
+        )
+        for (source, target), count in count_integrations.items():
+            if count > 1:
+                errors.append(
+                    f"Duplicated content of \n"
+                    f" '{resource_type}/source-integration-name/{source}' "
+                    f" '{resource_type}/target-integration-name/{target}' "
+                    f"in file: {yaml_file_path}"
+                )
 
 
 def check_invalid_integration(yaml_files: dict[str, dict]):
@@ -429,7 +427,7 @@ def check_doc_files(yaml_files: dict[str, dict]):
     console.print(suspended_logos)
     expected_logo_urls = {
         f"/{f.relative_to(DOCS_DIR).as_posix()}"
-        for f in DOCS_DIR.glob("integration-logos/**/*")
+        for f in (DOCS_DIR / "integration-logos").rglob("*")
         if f.is_file() and not f"/{f.relative_to(DOCS_DIR).as_posix()}".startswith(tuple(suspended_logos))
     }
 
@@ -445,8 +443,8 @@ def check_doc_files(yaml_files: dict[str, dict]):
 
 
 def check_unique_provider_name(yaml_files: dict[str, dict]):
-    provider_names = [d["name"] for d in yaml_files.values()]
-    duplicates = {x for x in provider_names if provider_names.count(x) > 1}
+    name_counter = Counter(d["name"] for d in yaml_files.values())
+    duplicates = {k for k, v in name_counter.items() if v > 1}
     if duplicates:
         errors.append(f"Provider name must be unique. Duplicates: {duplicates}")
 
@@ -492,7 +490,7 @@ def check_providers_have_all_documentation_files(yaml_files: dict[str, dict]):
     ProvidersManager().initialize_providers_configuration()
     architecture = Architecture.get_current()
     console.print(f"Verifying packages on {architecture} architecture. Platform: {platform.machine()}.")
-    provider_files_pattern = pathlib.Path(ROOT_DIR).glob("airflow/providers/**/provider.yaml")
+    provider_files_pattern = pathlib.Path(ROOT_DIR, "airflow", "providers").rglob("provider.yaml")
     all_provider_files = sorted(str(path) for path in provider_files_pattern)
     if len(sys.argv) > 1:
         paths = [os.fspath(ROOT_DIR / f) for f in sorted(sys.argv[1:])]
diff --git a/scripts/in_container/update_quarantined_test_status.py b/scripts/in_container/update_quarantined_test_status.py
index a9c155106cd89..ba9992b0bfca3 100755
--- a/scripts/in_container/update_quarantined_test_status.py
+++ b/scripts/in_container/update_quarantined_test_status.py
@@ -21,7 +21,7 @@
 import re
 import sys
 from datetime import datetime
-from os.path import dirname, join, realpath
+from pathlib import Path
 from typing import NamedTuple
 from urllib.parse import urlsplit
 
@@ -152,7 +152,7 @@ def get_history_status(history: TestHistory):
         return "Stable"
     if all(history.states[0 : num_runs - 1]):
         return "Just one more"
-    if all(history.states[0 : int(num_runs / 2)]):
+    if all(history.states[0 : num_runs // 2]):
         return "Almost there"
     return "Flaky"
 
@@ -234,7 +234,7 @@ def get_table(history_map: dict[str, TestHistory]) -> str:
     print()
     print(table)
     print()
-    with open(join(dirname(realpath(__file__)), "quarantine_issue_header.md")) as f:
+    with Path(__file__).resolve().with_name("quarantine_issue_header.md").open() as f:
         header = jinja2.Template(f.read(), autoescape=True, undefined=StrictUndefined).render(
             DATE_UTC_NOW=datetime.utcnow()
         )
diff --git a/scripts/in_container/verify_providers.py b/scripts/in_container/verify_providers.py
index 78f8c0430cf13..f232fbc8a7e2d 100755
--- a/scripts/in_container/verify_providers.py
+++ b/scripts/in_container/verify_providers.py
@@ -548,7 +548,7 @@ def is_camel_case_with_acronyms(s: str):
         s = s[1:]
     if not s:
         return True
-    return s != s.lower() and s != s.upper() and "_" not in s and s[0].upper() == s[0]
+    return s[0].isupper() and not (s.islower() or s.isupper() or "_" in s)
 
 
 def check_if_classes_are_properly_named(
diff --git a/scripts/tools/generate-integrations-json.py b/scripts/tools/generate-integrations-json.py
index 94725da1df1a0..e66c28d9c0c72 100755
--- a/scripts/tools/generate-integrations-json.py
+++ b/scripts/tools/generate-integrations-json.py
@@ -67,7 +67,7 @@
             result["logo"] = logo
         result_integrations.append(result)
 
-result_integrations = sorted(result_integrations, key=lambda x: x["name"].lower())
+result_integrations.sort(key=lambda x: x["name"].lower())
 with open(os.path.join(AIRFLOW_SITE_DIR, "landing-pages/site/static/integrations.json"), "w") as f:
     f.write(
         json.dumps(
diff --git a/setup.cfg b/setup.cfg
index 367924d82ddce..26c8cb2e0312a 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -142,7 +142,7 @@ install_requires =
     # See https://sqlalche.me/e/b8d9 for details of deprecated features
     # you can set environment variable SQLALCHEMY_WARN_20=1 to show all deprecation warnings.
     # The issue tracking it is https://github.com/apache/airflow/issues/28723
-    sqlalchemy>=1.4.24,<2.0
+    sqlalchemy>=1.4.28,<2.0
     sqlalchemy_jsonfield>=1.0
     tabulate>=0.7.5
     tenacity>=6.2.0,!=8.2.0
diff --git a/setup.py b/setup.py
index 6058ab3c2a90e..21509cb167882 100644
--- a/setup.py
+++ b/setup.py
@@ -30,7 +30,6 @@
 import sys
 import unittest
 from copy import deepcopy
-from os.path import relpath
 from pathlib import Path
 from textwrap import wrap
 from typing import Iterable
@@ -300,7 +299,9 @@ def write_version(filename: str = str(AIRFLOW_SOURCES_ROOT / "airflow" / "git_ve
     "requests>=2.26.0",
 ]
 doc = [
-    "astroid>=2.12.3",
+    # sphinx-autoapi fails with astroid 3.0, see: https://github.com/readthedocs/sphinx-autoapi/issues/407
+    # This was fixed in sphinx-autoapi 3.0, however it has requirement sphinx>=6.1, but we stuck on 5.x
+    "astroid>=2.12.3, <3.0",
     "checksumdir",
     # click 8.1.4 and 8.1.5 generate mypy errors due to typing issue in the upstream package:
     # https://github.com/pallets/click/issues/2558
@@ -461,6 +462,7 @@ def write_version(filename: str = str(AIRFLOW_SOURCES_ROOT / "airflow" / "git_ve
 
 _devel_only_tests = [
     "aioresponses",
+    "backports.zoneinfo>=0.2.1;python_version<'3.9'",
     "beautifulsoup4>=4.7.1",
     "coverage>=7.2",
     "pytest",
@@ -648,9 +650,8 @@ def add_extras_for_all_deprecated_aliases() -> None:
     """
     for alias, extra in EXTRAS_DEPRECATED_ALIASES.items():
         dependencies = EXTRAS_DEPENDENCIES.get(extra) if extra != "" else []
-        if dependencies is None:
-            continue
-        EXTRAS_DEPENDENCIES[alias] = dependencies
+        if dependencies is not None:
+            EXTRAS_DEPENDENCIES[alias] = dependencies
 
 
 def add_all_deprecated_provider_packages() -> None:
@@ -661,9 +662,8 @@ def add_all_deprecated_provider_packages() -> None:
     {"kubernetes": ["apache-airflow-provider-cncf-kubernetes"]}
     """
     for alias, provider in EXTRAS_DEPRECATED_ALIASES.items():
-        if alias in EXTRAS_DEPRECATED_ALIASES_NOT_PROVIDERS:
-            continue
-        replace_extra_dependencies_with_provider_packages(alias, [provider])
+        if alias not in EXTRAS_DEPRECATED_ALIASES_NOT_PROVIDERS:
+            replace_extra_dependencies_with_provider_packages(alias, [provider])
 
 
 add_extras_for_all_deprecated_aliases()
@@ -703,10 +703,9 @@ def add_all_deprecated_provider_packages() -> None:
 def get_all_db_dependencies() -> list[str]:
     _all_db_reqs: set[str] = set()
     for provider in ALL_DB_PROVIDERS:
-        if provider not in PROVIDER_DEPENDENCIES:
-            continue
-        for req in PROVIDER_DEPENDENCIES[provider][DEPS]:
-            _all_db_reqs.add(req)
+        if provider in PROVIDER_DEPENDENCIES:
+            for req in PROVIDER_DEPENDENCIES[provider][DEPS]:
+                _all_db_reqs.add(req)
     return list(_all_db_reqs)
 
 
@@ -720,9 +719,7 @@ def get_all_db_dependencies() -> list[str]:
 # to separately add providers dependencies - they have been already added as 'providers' extras above
 _all_dependencies = get_unique_dependency_list(EXTRAS_DEPENDENCIES.values())
 
-_all_dependencies_without_airflow_providers = list(
-    filter(lambda k: "apache-airflow-" not in k, _all_dependencies)
-)
+_all_dependencies_without_airflow_providers = [k for k in _all_dependencies if "apache-airflow-" not in k]
 
 # All user extras here
 # all is purely development extra and it should contain only direct dependencies of Airflow
@@ -869,7 +866,9 @@ def parse_config_files(self, *args, **kwargs) -> None:
             ]
             provider_yaml_files = glob.glob("airflow/providers/**/provider.yaml", recursive=True)
             for provider_yaml_file in provider_yaml_files:
-                provider_relative_path = relpath(provider_yaml_file, str(AIRFLOW_SOURCES_ROOT / "airflow"))
+                provider_relative_path = os.path.relpath(
+                    provider_yaml_file, str(AIRFLOW_SOURCES_ROOT / "airflow")
+                )
                 self.package_data["airflow"].append(provider_relative_path)
         else:
             self.install_requires.extend(
diff --git a/tests/always/test_example_dags.py b/tests/always/test_example_dags.py
index 9e3f7b4099178..6ffc923792c12 100644
--- a/tests/always/test_example_dags.py
+++ b/tests/always/test_example_dags.py
@@ -38,7 +38,7 @@ def get_suspended_providers_folders() -> list[str]:
     skipped when running tests (without any prefix - for example apache/beam, yandex, google etc.).
     """
     suspended_providers = []
-    for provider_path in AIRFLOW_PROVIDERS_ROOT.glob("**/provider.yaml"):
+    for provider_path in AIRFLOW_PROVIDERS_ROOT.rglob("provider.yaml"):
         provider_yaml = yaml.safe_load(provider_path.read_text())
         if provider_yaml.get("suspended"):
             suspended_providers.append(
diff --git a/tests/api_connexion/endpoints/test_config_endpoint.py b/tests/api_connexion/endpoints/test_config_endpoint.py
index c8d309b0bdf62..17a159a4fb8a4 100644
--- a/tests/api_connexion/endpoints/test_config_endpoint.py
+++ b/tests/api_connexion/endpoints/test_config_endpoint.py
@@ -247,17 +247,26 @@ def test_should_respond_200_text_plain(self, mock_as_dict):
         return_value=MOCK_CONF_WITH_SENSITIVE_VALUE,
     )
     @conf_vars({("webserver", "expose_config"): "non-sensitive-only"})
-    def test_should_respond_200_text_plain_with_non_sensitive_only(self, mock_as_dict):
+    @pytest.mark.parametrize(
+        "section, option",
+        [
+            ("core", "sql_alchemy_conn"),
+            ("core", "SQL_ALCHEMY_CONN"),
+            ("corE", "sql_alchemy_conn"),
+            ("CORE", "sql_alchemy_conn"),
+        ],
+    )
+    def test_should_respond_200_text_plain_with_non_sensitive_only(self, mock_as_dict, section, option):
         response = self.client.get(
-            "/api/v1/config/section/core/option/sql_alchemy_conn",
+            f"/api/v1/config/section/{section}/option/{option}",
             headers={"Accept": "text/plain"},
             environ_overrides={"REMOTE_USER": "test"},
         )
         assert response.status_code == 200
         expected = textwrap.dedent(
-            """\
-        [core]
-        sql_alchemy_conn = < hidden >
+            f"""\
+        [{section}]
+        {option} = < hidden >
         """
         )
         assert expected == response.data.decode()
diff --git a/tests/api_connexion/endpoints/test_connection_endpoint.py b/tests/api_connexion/endpoints/test_connection_endpoint.py
index de0b7aad973fd..24180b5052bc7 100644
--- a/tests/api_connexion/endpoints/test_connection_endpoint.py
+++ b/tests/api_connexion/endpoints/test_connection_endpoint.py
@@ -351,7 +351,7 @@ def test_should_return_conf_max_if_req_max_above_conf(self, session):
 
     def _create_connections(self, count):
         return [
-            Connection(conn_id="TEST_CONN_ID" + str(i), conn_type="TEST_CONN_TYPE" + str(i))
+            Connection(conn_id=f"TEST_CONN_ID{i}", conn_type=f"TEST_CONN_TYPE{i}")
             for i in range(1, count + 1)
         ]
 
diff --git a/tests/api_connexion/endpoints/test_dag_run_endpoint.py b/tests/api_connexion/endpoints/test_dag_run_endpoint.py
index 434511b9e9560..e66139a289fe9 100644
--- a/tests/api_connexion/endpoints/test_dag_run_endpoint.py
+++ b/tests/api_connexion/endpoints/test_dag_run_endpoint.py
@@ -137,7 +137,7 @@ def _create_test_dag_run(self, state="running", extra_dag=False, commit=True, id
                 dags.append(DagModel(dag_id="TEST_DAG_ID", is_active=True))
             dagrun_model = DagRun(
                 dag_id="TEST_DAG_ID",
-                run_id="TEST_DAG_RUN_ID_" + str(i),
+                run_id=f"TEST_DAG_RUN_ID_{i}",
                 run_type=DagRunType.MANUAL,
                 execution_date=timezone.parse(self.default_time) + timedelta(days=i - 1),
                 start_date=timezone.parse(self.default_time),
@@ -148,11 +148,11 @@ def _create_test_dag_run(self, state="running", extra_dag=False, commit=True, id
 
         if extra_dag:
             for i in range(idx_start + 2, idx_start + 4):
-                dags.append(DagModel(dag_id="TEST_DAG_ID_" + str(i)))
+                dags.append(DagModel(dag_id=f"TEST_DAG_ID_{i}"))
                 dag_runs.append(
                     DagRun(
-                        dag_id="TEST_DAG_ID_" + str(i),
-                        run_id="TEST_DAG_RUN_ID_" + str(i),
+                        dag_id=f"TEST_DAG_ID_{i}",
+                        run_id=f"TEST_DAG_RUN_ID_{i}",
                         run_type=DagRunType.MANUAL,
                         execution_date=timezone.parse(self.default_time_2),
                         start_date=timezone.parse(self.default_time),
@@ -496,7 +496,7 @@ def _create_dag_runs(self, count):
         dag_runs = [
             DagRun(
                 dag_id="TEST_DAG_ID",
-                run_id="TEST_DAG_RUN_ID" + str(i),
+                run_id=f"TEST_DAG_RUN_ID{i}",
                 run_type=DagRunType.MANUAL,
                 execution_date=timezone.parse(self.default_time) + timedelta(minutes=i),
                 start_date=timezone.parse(self.default_time),
@@ -581,7 +581,7 @@ def _create_dag_runs(self):
         return [
             DagRun(
                 dag_id="TEST_DAG_ID",
-                run_id="TEST_START_EXEC_DAY_1" + str(i),
+                run_id=f"TEST_START_EXEC_DAY_1{i}",
                 run_type=DagRunType.MANUAL,
                 execution_date=timezone.parse(dates[i]),
                 start_date=timezone.parse(dates[i]),
@@ -872,7 +872,7 @@ def _create_dag_runs(self, count):
         dag_runs = [
             DagRun(
                 dag_id="TEST_DAG_ID",
-                run_id="TEST_DAG_RUN_ID" + str(i),
+                run_id=f"TEST_DAG_RUN_ID{i}",
                 state="running",
                 run_type=DagRunType.MANUAL,
                 execution_date=timezone.parse(self.default_time) + timedelta(minutes=i),
@@ -956,7 +956,7 @@ def _create_dag_runs(self):
         dag_runs = [
             DagRun(
                 dag_id="TEST_DAG_ID",
-                run_id="TEST_START_EXEC_DAY_1" + str(i),
+                run_id=f"TEST_START_EXEC_DAY_1{i}",
                 run_type=DagRunType.MANUAL,
                 execution_date=timezone.parse(dates[i]),
                 start_date=timezone.parse(dates[i]),
diff --git a/tests/api_connexion/endpoints/test_dag_warning_endpoint.py b/tests/api_connexion/endpoints/test_dag_warning_endpoint.py
index 621b04366702b..041a61634eb0c 100644
--- a/tests/api_connexion/endpoints/test_dag_warning_endpoint.py
+++ b/tests/api_connexion/endpoints/test_dag_warning_endpoint.py
@@ -35,14 +35,27 @@ def configured_app(minimal_app_for_api):
         app,  # type:ignore
         username="test",
         role_name="Test",
-        permissions=[(permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_WARNING)],  # type: ignore
+        permissions=[
+            (permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_WARNING),
+            (permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG),
+        ],  # type: ignore
     )
     create_user(app, username="test_no_permissions", role_name="TestNoPermissions")  # type: ignore
+    create_user(
+        app,  # type:ignore
+        username="test_with_dag2_read",
+        role_name="TestWithDag2Read",
+        permissions=[
+            (permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_WARNING),
+            (permissions.ACTION_CAN_READ, f"{permissions.RESOURCE_DAG_PREFIX}dag2"),
+        ],  # type: ignore
+    )
 
     yield minimal_app_for_api
 
     delete_user(app, username="test")  # type: ignore
     delete_user(app, username="test_no_permissions")  # type: ignore
+    delete_user(app, username="test_with_dag2_read")  # type: ignore
 
 
 class TestBaseDagWarning:
@@ -147,3 +160,11 @@ def test_should_raise_403_forbidden(self):
             "/api/v1/dagWarnings", environ_overrides={"REMOTE_USER": "test_no_permissions"}
         )
         assert response.status_code == 403
+
+    def test_should_raise_403_forbidden_when_user_has_no_dag_read_permission(self):
+        response = self.client.get(
+            "/api/v1/dagWarnings",
+            environ_overrides={"REMOTE_USER": "test_with_dag2_read"},
+            query_string={"dag_id": "dag1"},
+        )
+        assert response.status_code == 403
diff --git a/tests/api_connexion/endpoints/test_event_log_endpoint.py b/tests/api_connexion/endpoints/test_event_log_endpoint.py
index 18439f8a92128..ee1efba55bd62 100644
--- a/tests/api_connexion/endpoints/test_event_log_endpoint.py
+++ b/tests/api_connexion/endpoints/test_event_log_endpoint.py
@@ -319,4 +319,4 @@ def test_should_return_conf_max_if_req_max_above_conf(self, task_instance, sessi
         assert len(response.json["event_logs"]) == 150
 
     def _create_event_logs(self, task_instance, count):
-        return [Log(event="TEST_EVENT_" + str(i), task_instance=task_instance) for i in range(1, count + 1)]
+        return [Log(event=f"TEST_EVENT_{i}", task_instance=task_instance) for i in range(1, count + 1)]
diff --git a/tests/api_connexion/endpoints/test_task_instance_endpoint.py b/tests/api_connexion/endpoints/test_task_instance_endpoint.py
index f39fad6d6e974..5056f7736dcec 100644
--- a/tests/api_connexion/endpoints/test_task_instance_endpoint.py
+++ b/tests/api_connexion/endpoints/test_task_instance_endpoint.py
@@ -24,6 +24,7 @@
 import pytest
 from sqlalchemy.orm import contains_eager
 
+from airflow.api_connexion.exceptions import EXCEPTIONS_LINK_MAP
 from airflow.jobs.job import Job
 from airflow.jobs.triggerer_job_runner import TriggererJobRunner
 from airflow.models import DagRun, SlaMiss, TaskInstance, Trigger
@@ -82,6 +83,25 @@ def configured_app(minimal_app_for_api):
             (permissions.ACTION_CAN_READ, permissions.RESOURCE_TASK_INSTANCE),
         ],
     )
+    create_user(
+        app,  # type: ignore
+        username="test_read_only_one_dag",
+        role_name="TestReadOnlyOneDag",
+        permissions=[
+            (permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_RUN),
+            (permissions.ACTION_CAN_READ, permissions.RESOURCE_TASK_INSTANCE),
+        ],
+    )
+    # For some reason, "DAG:example_python_operator" is not synced when in the above list of perms,
+    # so do it manually here:
+    app.appbuilder.sm.bulk_sync_roles(
+        [
+            {
+                "role": "TestReadOnlyOneDag",
+                "perms": [(permissions.ACTION_CAN_READ, "DAG:example_python_operator")],
+            }
+        ]
+    )
     create_user(app, username="test_no_permissions", role_name="TestNoPermissions")  # type: ignore
 
     yield app
@@ -90,6 +110,7 @@ def configured_app(minimal_app_for_api):
     delete_user(app, username="test_dag_read_only")  # type: ignore
     delete_user(app, username="test_task_read_only")  # type: ignore
     delete_user(app, username="test_no_permissions")  # type: ignore
+    delete_user(app, username="test_read_only_one_dag")  # type: ignore
     delete_roles(app)
 
 
@@ -905,6 +926,24 @@ def test_should_raise_403_forbidden(self):
         )
         assert response.status_code == 403
 
+    def test_returns_403_forbidden_when_user_has_access_to_only_some_dags(self, session):
+        self.create_task_instances(session=session)
+        self.create_task_instances(session=session, dag_id="example_skip_dag")
+        payload = {"dag_ids": ["example_python_operator", "example_skip_dag"]}
+
+        response = self.client.post(
+            "/api/v1/dags/~/dagRuns/~/taskInstances/list",
+            environ_overrides={"REMOTE_USER": "test_read_only_one_dag"},
+            json=payload,
+        )
+        assert response.status_code == 403
+        assert response.json == {
+            "detail": "User not allowed to access these DAGs: ['example_skip_dag']",
+            "status": 403,
+            "title": "Forbidden",
+            "type": EXCEPTIONS_LINK_MAP[403],
+        }
+
     def test_should_raise_400_for_no_json(self):
         response = self.client.post(
             "/api/v1/dags/~/dagRuns/~/taskInstances/list",
@@ -1733,6 +1772,27 @@ def test_should_update_task_instance_state(self, session):
         assert response2.status_code == 200
         assert response2.json["state"] == NEW_STATE
 
+    def test_should_update_task_instance_state_default_dry_run_to_true(self, session):
+        self.create_task_instances(session)
+
+        NEW_STATE = "running"
+
+        self.client.patch(
+            self.ENDPOINT_URL,
+            environ_overrides={"REMOTE_USER": "test"},
+            json={
+                "new_state": NEW_STATE,
+            },
+        )
+
+        response2 = self.client.get(
+            self.ENDPOINT_URL,
+            environ_overrides={"REMOTE_USER": "test"},
+            json={},
+        )
+        assert response2.status_code == 200
+        assert response2.json["state"] == NEW_STATE
+
     def test_should_update_mapped_task_instance_state(self, session):
         NEW_STATE = "failed"
         map_index = 1
diff --git a/tests/api_connexion/endpoints/test_user_endpoint.py b/tests/api_connexion/endpoints/test_user_endpoint.py
index f29f998a84910..ac0c48f689212 100644
--- a/tests/api_connexion/endpoints/test_user_endpoint.py
+++ b/tests/api_connexion/endpoints/test_user_endpoint.py
@@ -617,7 +617,7 @@ def test_required_fields(
             environ_overrides={"REMOTE_USER": "test"},
         )
         assert response.status_code == 400, response.json
-        assert response.json["detail"] == "{'%s': ['Missing data for required field.']}" % field
+        assert response.json["detail"] == f"{{'{field}': ['Missing data for required field.']}}"
 
     @pytest.mark.usefixtures("autoclean_admin_user")
     def test_username_can_be_updated(self, autoclean_user_payload, autoclean_username):
diff --git a/tests/api_experimental/common/experimental/test_pool.py b/tests/api_experimental/common/experimental/test_pool.py
index d00f318ffac9e..249a3dec8c2fd 100644
--- a/tests/api_experimental/common/experimental/test_pool.py
+++ b/tests/api_experimental/common/experimental/test_pool.py
@@ -100,7 +100,7 @@ def test_create_pool_name_too_long(self):
         long_name = "".join(random.choices(string.ascii_lowercase, k=300))
         column_length = models.Pool.pool.property.columns[0].type.length
         with pytest.raises(
-            AirflowBadRequest, match="^Pool name can't be more than %d characters$" % column_length
+            AirflowBadRequest, match=f"^Pool name can't be more than {column_length} characters$"
         ):
             pool_api.create_pool(
                 name=long_name,
diff --git a/tests/cli/commands/test_config_command.py b/tests/cli/commands/test_config_command.py
index c1e2924bfc274..52db863cf66be 100644
--- a/tests/cli/commands/test_config_command.py
+++ b/tests/cli/commands/test_config_command.py
@@ -78,7 +78,7 @@ def test_cli_show_config_should_only_show_comments_when_no_defaults(self):
         with contextlib.redirect_stdout(io.StringIO()) as temp_stdout:
             config_command.show_config(self.parser.parse_args(["config", "list", "--color", "off"]))
         output = temp_stdout.getvalue()
-        lines = output.split("\n")
+        lines = output.splitlines()
         assert all(not line.startswith("#") or line.endswith("= ") for line in lines if line)
 
     def test_cli_show_config_shows_descriptions(self):
@@ -87,7 +87,7 @@ def test_cli_show_config_shows_descriptions(self):
                 self.parser.parse_args(["config", "list", "--color", "off", "--include-descriptions"])
             )
         output = temp_stdout.getvalue()
-        lines = output.split("\n")
+        lines = output.splitlines()
         # comes from metrics description
         assert all(not line.startswith("# Source: ") for line in lines if line)
         assert any(line.startswith("# StatsD") for line in lines if line)
@@ -100,7 +100,7 @@ def test_cli_show_config_shows_examples(self):
                 self.parser.parse_args(["config", "list", "--color", "off", "--include-examples"])
             )
         output = temp_stdout.getvalue()
-        lines = output.split("\n")
+        lines = output.splitlines()
         assert all(not line.startswith("# Source: ") for line in lines if line)
         assert all(not line.startswith("# StatsD") for line in lines if line)
         assert any(line.startswith("# Example:") for line in lines if line)
@@ -112,7 +112,7 @@ def test_cli_show_config_shows_variables(self):
                 self.parser.parse_args(["config", "list", "--color", "off", "--include-env-vars"])
             )
         output = temp_stdout.getvalue()
-        lines = output.split("\n")
+        lines = output.splitlines()
         assert all(not line.startswith("# Source: ") for line in lines if line)
         assert all(not line.startswith("# StatsD") for line in lines if line)
         assert all(not line.startswith("# Example:") for line in lines if line)
@@ -124,7 +124,7 @@ def test_cli_show_config_shows_sources(self):
                 self.parser.parse_args(["config", "list", "--color", "off", "--include-sources"])
             )
         output = temp_stdout.getvalue()
-        lines = output.split("\n")
+        lines = output.splitlines()
         assert any(line.startswith("# Source: ") for line in lines if line)
         assert all(not line.startswith("# StatsD") for line in lines if line)
         assert all(not line.startswith("# Example:") for line in lines if line)
@@ -136,7 +136,7 @@ def test_cli_show_config_defaults(self):
                 self.parser.parse_args(["config", "list", "--color", "off", "--defaults"])
             )
         output = temp_stdout.getvalue()
-        lines = output.split("\n")
+        lines = output.splitlines()
         assert all(not line.startswith("# Source: ") for line in lines if line)
         assert any(line.startswith("# StatsD") for line in lines if line)
         assert any(not line.startswith("# Example:") for line in lines if line)
@@ -151,7 +151,7 @@ def test_cli_show_config_defaults_not_show_conf_changes(self):
                 self.parser.parse_args(["config", "list", "--color", "off", "--defaults"])
             )
         output = temp_stdout.getvalue()
-        lines = output.split("\n")
+        lines = output.splitlines()
         assert any(line.startswith("# task_runner = StandardTaskRunner") for line in lines if line)
 
     @mock.patch("os.environ", {"AIRFLOW__CORE__TASK_RUNNER": "test-env-runner"})
@@ -161,7 +161,7 @@ def test_cli_show_config_defaults_do_not_show_env_changes(self):
                 self.parser.parse_args(["config", "list", "--color", "off", "--defaults"])
             )
         output = temp_stdout.getvalue()
-        lines = output.split("\n")
+        lines = output.splitlines()
         assert any(line.startswith("# task_runner = StandardTaskRunner") for line in lines if line)
 
     @conf_vars({("core", "task_runner"): "test-runner"})
@@ -169,7 +169,7 @@ def test_cli_show_changed_defaults_when_overridden_in_conf(self):
         with contextlib.redirect_stdout(io.StringIO()) as temp_stdout:
             config_command.show_config(self.parser.parse_args(["config", "list", "--color", "off"]))
         output = temp_stdout.getvalue()
-        lines = output.split("\n")
+        lines = output.splitlines()
         assert any(line.startswith("task_runner = test-runner") for line in lines if line)
 
     @mock.patch("os.environ", {"AIRFLOW__CORE__TASK_RUNNER": "test-env-runner"})
@@ -177,14 +177,14 @@ def test_cli_show_changed_defaults_when_overridden_in_env(self):
         with contextlib.redirect_stdout(io.StringIO()) as temp_stdout:
             config_command.show_config(self.parser.parse_args(["config", "list", "--color", "off"]))
         output = temp_stdout.getvalue()
-        lines = output.split("\n")
+        lines = output.splitlines()
         assert any(line.startswith("task_runner = test-env-runner") for line in lines if line)
 
     def test_cli_has_providers(self):
         with contextlib.redirect_stdout(io.StringIO()) as temp_stdout:
             config_command.show_config(self.parser.parse_args(["config", "list", "--color", "off"]))
         output = temp_stdout.getvalue()
-        lines = output.split("\n")
+        lines = output.splitlines()
         assert any(line.startswith("celery_config_options") for line in lines if line)
 
     def test_cli_comment_out_everything(self):
@@ -193,7 +193,7 @@ def test_cli_comment_out_everything(self):
                 self.parser.parse_args(["config", "list", "--color", "off", "--comment-out-everything"])
             )
         output = temp_stdout.getvalue()
-        lines = output.split("\n")
+        lines = output.splitlines()
         assert all(not line.strip() or line.startswith(("#", "[")) for line in lines if line)
 
 
diff --git a/tests/cli/commands/test_dag_command.py b/tests/cli/commands/test_dag_command.py
index f45e877840833..2387eebcb41f4 100644
--- a/tests/cli/commands/test_dag_command.py
+++ b/tests/cli/commands/test_dag_command.py
@@ -34,9 +34,13 @@
 from airflow.api_connexion.schemas.dag_schema import DAGSchema
 from airflow.cli import cli_parser
 from airflow.cli.commands import dag_command
+from airflow.decorators import task
 from airflow.exceptions import AirflowException
 from airflow.models import DagBag, DagModel, DagRun
+from airflow.models.baseoperator import BaseOperator
+from airflow.models.dag import _StopDagTest
 from airflow.models.serialized_dag import SerializedDagModel
+from airflow.triggers.temporal import TimeDeltaTrigger
 from airflow.utils import timezone
 from airflow.utils.session import create_session
 from airflow.utils.types import DagRunType
@@ -680,7 +684,7 @@ def test_trigger_dag_output_as_json(self):
         with contextlib.redirect_stdout(io.StringIO()) as temp_stdout:
             dag_command.dag_trigger(args)
             # get the last line from the logs ignoring all logging lines
-            out = temp_stdout.getvalue().strip().split("\n")[-1]
+            out = temp_stdout.getvalue().strip().splitlines()[-1]
         parsed_out = json.loads(out)
 
         assert 1 == len(parsed_out)
@@ -816,3 +820,36 @@ def test_dag_test_with_custom_timetable(self, mock__get_or_create_dagrun, _):
         )
         dag_command.dag_test(cli_args)
         assert "data_interval" in mock__get_or_create_dagrun.call_args.kwargs
+
+    def test_dag_test_no_triggerer(self, dag_maker):
+        with dag_maker() as dag:
+
+            @task
+            def one():
+                return 1
+
+            @task
+            def two(val):
+                return val + 1
+
+            class MyOp(BaseOperator):
+                template_fields = ("tfield",)
+
+                def __init__(self, tfield, **kwargs):
+                    self.tfield = tfield
+                    super().__init__(**kwargs)
+
+                def execute(self, context, event=None):
+                    if event is None:
+                        print("I AM DEFERRING")
+                        self.defer(trigger=TimeDeltaTrigger(timedelta(seconds=20)), method_name="execute")
+                        return
+                    print("RESUMING")
+                    return self.tfield + 1
+
+            task_one = one()
+            task_two = two(task_one)
+            op = MyOp(task_id="abc", tfield=str(task_two))
+            task_two >> op
+        with pytest.raises(_StopDagTest, match="Task has deferred but triggerer component is not running"):
+            dag.test()
diff --git a/tests/cli/commands/test_jobs_command.py b/tests/cli/commands/test_jobs_command.py
index 0ec89149040cd..54d642d7e5aee 100644
--- a/tests/cli/commands/test_jobs_command.py
+++ b/tests/cli/commands/test_jobs_command.py
@@ -26,7 +26,7 @@
 from airflow.jobs.job import Job
 from airflow.jobs.scheduler_job_runner import SchedulerJobRunner
 from airflow.utils.session import create_session
-from airflow.utils.state import State
+from airflow.utils.state import JobState, State
 from tests.test_utils.db import clear_db_jobs
 
 
@@ -109,7 +109,7 @@ def test_should_ignore_not_running_jobs(self):
             for _ in range(3):
                 scheduler_job = Job()
                 job_runner = SchedulerJobRunner(job=scheduler_job)
-                scheduler_job.state = State.SHUTDOWN
+                scheduler_job.state = JobState.FAILED
                 session.add(scheduler_job)
                 scheduler_jobs.append(scheduler_job)
                 job_runners.append(job_runner)
diff --git a/tests/cli/commands/test_task_command.py b/tests/cli/commands/test_task_command.py
index eac5fe6802523..0b4250af03682 100644
--- a/tests/cli/commands/test_task_command.py
+++ b/tests/cli/commands/test_task_command.py
@@ -818,7 +818,7 @@ def test_run_task_with_pool(self):
             session.commit()
 
             assert session.query(TaskInstance).filter_by(pool=pool_name).first() is None
-            task_command.task_run(self.parser.parse_args(self.task_args + ["--pool", pool_name]))
+            task_command.task_run(self.parser.parse_args([*self.task_args, "--pool", pool_name]))
             assert session.query(TaskInstance).filter_by(pool=pool_name).first() is not None
 
             session.delete(pool)
diff --git a/tests/core/test_configuration.py b/tests/core/test_configuration.py
index e957df689d074..103e8929b994f 100644
--- a/tests/core/test_configuration.py
+++ b/tests/core/test_configuration.py
@@ -1570,7 +1570,7 @@ def test_get_sections_including_defaults(self):
         all_sections_including_defaults = airflow_cfg.get_sections_including_defaults()
         assert "core" in all_sections_including_defaults
         assert "test-section" in all_sections_including_defaults
-        assert len([section for section in all_sections_including_defaults if section == "core"]) == 1
+        assert sum(1 for section in all_sections_including_defaults if section == "core") == 1
 
     def test_get_options_including_defaults(self):
         airflow_cfg = AirflowConfigParser()
@@ -1594,7 +1594,7 @@ def test_get_options_including_defaults(self):
         assert "dags_folder" in all_core_options_including_defaults
         assert "test-value" == airflow_cfg.get("core", "new-test-key")
         assert "test-runner" == airflow_cfg.get("core", "task_runner")
-        assert len([option for option in all_core_options_including_defaults if option == "task_runner"]) == 1
+        assert sum(1 for option in all_core_options_including_defaults if option == "task_runner") == 1
 
 
 def test_sensitive_values():
diff --git a/tests/core/test_otel_logger.py b/tests/core/test_otel_logger.py
index 1f04edd1bfe68..ba19e3c9a2fe8 100644
--- a/tests/core/test_otel_logger.py
+++ b/tests/core/test_otel_logger.py
@@ -66,9 +66,9 @@ def test_is_up_down_counter_negative(self):
         assert not _is_up_down_counter("this_is_not_a_udc")
 
     def test_exemption_list_has_not_grown(self):
-        assert len(BACK_COMPAT_METRIC_NAMES) <= 23, (
+        assert len(BACK_COMPAT_METRIC_NAMES) <= 26, (
             "This test exists solely to ensure that nobody is adding names to the exemption list. "
-            "There are 23 names which are potentially too long for OTel and that number should "
+            "There are 26 names which are potentially too long for OTel and that number should "
             "only ever go down as these names are deprecated.  If this test is failing, please "
             "adjust your new stat's name; do not add as exemption without a very good reason."
         )
diff --git a/tests/dag_processing/test_job_runner.py b/tests/dag_processing/test_job_runner.py
index e300eb9866157..481b740ca68b2 100644
--- a/tests/dag_processing/test_job_runner.py
+++ b/tests/dag_processing/test_job_runner.py
@@ -29,7 +29,6 @@
 import time
 from datetime import datetime, timedelta
 from logging.config import dictConfig
-from tempfile import TemporaryDirectory
 from textwrap import dedent
 from unittest import mock
 from unittest.mock import MagicMock, PropertyMock
@@ -145,12 +144,11 @@ def run_processor_manager_one_loop(self, manager, parent_pipe):
             raise RuntimeError("Shouldn't get here - nothing to read, but manager not finished!")
 
     @conf_vars({("core", "load_examples"): "False"})
-    def test_remove_file_clears_import_error(self, tmpdir):
-        filename_to_parse = tmpdir / "temp_dag.py"
+    def test_remove_file_clears_import_error(self, tmp_path):
+        path_to_parse = tmp_path / "temp_dag.py"
 
         # Generate original import error
-        with open(filename_to_parse, "w") as file_to_parse:
-            file_to_parse.writelines("an invalid airflow DAG")
+        path_to_parse.write_text("an invalid airflow DAG")
 
         child_pipe, parent_pipe = multiprocessing.Pipe()
 
@@ -158,7 +156,7 @@ def test_remove_file_clears_import_error(self, tmpdir):
         manager = DagProcessorJobRunner(
             job=Job(),
             processor=DagFileProcessorManager(
-                dag_directory=tmpdir,
+                dag_directory=path_to_parse.parent,
                 max_runs=1,
                 processor_timeout=timedelta(days=365),
                 signal_conn=child_pipe,
@@ -174,7 +172,7 @@ def test_remove_file_clears_import_error(self, tmpdir):
             import_errors = session.query(errors.ImportError).all()
             assert len(import_errors) == 1
 
-            filename_to_parse.remove()
+            path_to_parse.unlink()
 
             # Rerun the scheduler once the dag file has been removed
             self.run_processor_manager_one_loop(manager, parent_pipe)
@@ -187,25 +185,24 @@ def test_remove_file_clears_import_error(self, tmpdir):
         parent_pipe.close()
 
     @conf_vars({("core", "load_examples"): "False"})
-    def test_max_runs_when_no_files(self):
+    def test_max_runs_when_no_files(self, tmp_path):
         child_pipe, parent_pipe = multiprocessing.Pipe()
 
-        with TemporaryDirectory(prefix="empty-airflow-dags-") as dags_folder:
-            async_mode = "sqlite" not in conf.get("database", "sql_alchemy_conn")
-            manager = DagProcessorJobRunner(
-                job=Job(),
-                processor=DagFileProcessorManager(
-                    dag_directory=dags_folder,
-                    max_runs=1,
-                    processor_timeout=timedelta(days=365),
-                    signal_conn=child_pipe,
-                    dag_ids=[],
-                    pickle_dags=False,
-                    async_mode=async_mode,
-                ),
-            )
+        async_mode = "sqlite" not in conf.get("database", "sql_alchemy_conn")
+        manager = DagProcessorJobRunner(
+            job=Job(),
+            processor=DagFileProcessorManager(
+                dag_directory=os.fspath(tmp_path),
+                max_runs=1,
+                processor_timeout=timedelta(days=365),
+                signal_conn=child_pipe,
+                dag_ids=[],
+                pickle_dags=False,
+                async_mode=async_mode,
+            ),
+        )
 
-            self.run_processor_manager_one_loop(manager, parent_pipe)
+        self.run_processor_manager_one_loop(manager, parent_pipe)
         child_pipe.close()
         parent_pipe.close()
 
@@ -502,7 +499,7 @@ def test_add_new_file_to_parsing_queue(
             ["file_3.py", "file_2.py", "file_1.py"]
         )
 
-        manager.processor.set_file_paths(dag_files + ["file_4.py"])
+        manager.processor.set_file_paths([*dag_files, "file_4.py"])
         manager.processor.add_new_file_path_to_queue()
         assert manager.processor._file_path_queue == collections.deque(
             ["file_4.py", "file_3.py", "file_2.py", "file_1.py"]
@@ -893,16 +890,15 @@ def fake_processor_(*args, **kwargs):
 
     @conf_vars({("core", "load_examples"): "False"})
     @mock.patch("airflow.dag_processing.manager.Stats.timing")
-    def test_send_file_processing_statsd_timing(self, statsd_timing_mock, tmpdir):
-        filename_to_parse = tmpdir / "temp_dag.py"
+    def test_send_file_processing_statsd_timing(self, statsd_timing_mock, tmp_path):
+        path_to_parse = tmp_path / "temp_dag.py"
         dag_code = dedent(
             """
         from airflow import DAG
         dag = DAG(dag_id='temp_dag', schedule='0 0 * * *')
         """
         )
-        with open(filename_to_parse, "w") as file_to_parse:
-            file_to_parse.writelines(dag_code)
+        path_to_parse.write_text(dag_code)
 
         child_pipe, parent_pipe = multiprocessing.Pipe()
 
@@ -910,7 +906,7 @@ def test_send_file_processing_statsd_timing(self, statsd_timing_mock, tmpdir):
         manager = DagProcessorJobRunner(
             job=Job(),
             processor=DagFileProcessorManager(
-                dag_directory=tmpdir,
+                dag_directory=path_to_parse.parent,
                 max_runs=1,
                 processor_timeout=timedelta(days=365),
                 signal_conn=child_pipe,
@@ -938,7 +934,7 @@ def test_send_file_processing_statsd_timing(self, statsd_timing_mock, tmpdir):
             any_order=True,
         )
 
-    def test_refresh_dags_dir_doesnt_delete_zipped_dags(self, tmpdir):
+    def test_refresh_dags_dir_doesnt_delete_zipped_dags(self, tmp_path):
         """Test DagProcessorJobRunner._refresh_dag_dir method"""
         manager = DagProcessorJobRunner(
             job=Job(),
@@ -952,7 +948,7 @@ def test_refresh_dags_dir_doesnt_delete_zipped_dags(self, tmpdir):
                 async_mode=True,
             ),
         )
-        dagbag = DagBag(dag_folder=tmpdir, include_examples=False)
+        dagbag = DagBag(dag_folder=tmp_path, include_examples=False)
         zipped_dag_path = os.path.join(TEST_DAGS_FOLDER, "test_zip.zip")
         dagbag.process_file(zipped_dag_path)
         dag = dagbag.get_dag("test_zip_dag")
@@ -967,7 +963,7 @@ def test_refresh_dags_dir_doesnt_delete_zipped_dags(self, tmpdir):
         # assert dag still active
         assert dag.get_is_active()
 
-    def test_refresh_dags_dir_deactivates_deleted_zipped_dags(self, tmpdir):
+    def test_refresh_dags_dir_deactivates_deleted_zipped_dags(self, tmp_path):
         """Test DagProcessorJobRunner._refresh_dag_dir method"""
         manager = DagProcessorJobRunner(
             job=Job(),
@@ -981,7 +977,7 @@ def test_refresh_dags_dir_deactivates_deleted_zipped_dags(self, tmpdir):
                 async_mode=True,
             ),
         )
-        dagbag = DagBag(dag_folder=tmpdir, include_examples=False)
+        dagbag = DagBag(dag_folder=tmp_path, include_examples=False)
         zipped_dag_path = os.path.join(TEST_DAGS_FOLDER, "test_zip.zip")
         dagbag.process_file(zipped_dag_path)
         dag = dagbag.get_dag("test_zip_dag")
@@ -1000,10 +996,10 @@ def test_refresh_dags_dir_deactivates_deleted_zipped_dags(self, tmpdir):
         # assert dag deactivated
         assert not dag.get_is_active()
 
-    def test_refresh_dags_dir_does_not_interfer_with_dags_outside_its_subdir(self, tmpdir):
+    def test_refresh_dags_dir_does_not_interfer_with_dags_outside_its_subdir(self, tmp_path):
         """Test DagProcessorJobRunner._refresh_dag_dir should not update dags outside its processor_subdir"""
 
-        dagbag = DagBag(dag_folder=tmpdir, include_examples=False)
+        dagbag = DagBag(dag_folder=tmp_path, include_examples=False)
         dag_path = os.path.join(TEST_DAGS_FOLDER, "test_miscellaneous.py")
         dagbag.process_file(dag_path)
         dag = dagbag.get_dag("miscellaneous_test_dag")
@@ -1040,7 +1036,7 @@ def test_refresh_dags_dir_does_not_interfer_with_dags_outside_its_subdir(self, t
             ("scheduler", "standalone_dag_processor"): "True",
         }
     )
-    def test_fetch_callbacks_from_database(self, tmpdir):
+    def test_fetch_callbacks_from_database(self, tmp_path):
         """Test DagProcessorJobRunner._fetch_callbacks method"""
         dag_filepath = TEST_DAG_FOLDER / "test_on_failure_callback_dag.py"
 
@@ -1048,20 +1044,20 @@ def test_fetch_callbacks_from_database(self, tmpdir):
             dag_id="test_start_date_scheduling",
             full_filepath=str(dag_filepath),
             is_failure_callback=True,
-            processor_subdir=str(tmpdir),
+            processor_subdir=os.fspath(tmp_path),
             run_id="123",
         )
         callback2 = DagCallbackRequest(
             dag_id="test_start_date_scheduling",
             full_filepath=str(dag_filepath),
             is_failure_callback=True,
-            processor_subdir=str(tmpdir),
+            processor_subdir=os.fspath(tmp_path),
             run_id="456",
         )
         callback3 = SlaCallbackRequest(
             dag_id="test_start_date_scheduling",
             full_filepath=str(dag_filepath),
-            processor_subdir=str(tmpdir),
+            processor_subdir=os.fspath(tmp_path),
         )
 
         with create_session() as session:
@@ -1073,7 +1069,7 @@ def test_fetch_callbacks_from_database(self, tmpdir):
         manager = DagProcessorJobRunner(
             job=Job(),
             processor=DagFileProcessorManager(
-                dag_directory=str(tmpdir),
+                dag_directory=os.fspath(tmp_path),
                 max_runs=1,
                 processor_timeout=timedelta(days=365),
                 signal_conn=child_pipe,
@@ -1093,7 +1089,7 @@ def test_fetch_callbacks_from_database(self, tmpdir):
             ("scheduler", "standalone_dag_processor"): "True",
         }
     )
-    def test_fetch_callbacks_for_current_dag_directory_only(self, tmpdir):
+    def test_fetch_callbacks_for_current_dag_directory_only(self, tmp_path):
         """Test DagProcessorJobRunner._fetch_callbacks method"""
         dag_filepath = TEST_DAG_FOLDER / "test_on_failure_callback_dag.py"
 
@@ -1101,7 +1097,7 @@ def test_fetch_callbacks_for_current_dag_directory_only(self, tmpdir):
             dag_id="test_start_date_scheduling",
             full_filepath=str(dag_filepath),
             is_failure_callback=True,
-            processor_subdir=str(tmpdir),
+            processor_subdir=os.fspath(tmp_path),
             run_id="123",
         )
         callback2 = DagCallbackRequest(
@@ -1120,7 +1116,7 @@ def test_fetch_callbacks_for_current_dag_directory_only(self, tmpdir):
         manager = DagProcessorJobRunner(
             job=Job(),
             processor=DagFileProcessorManager(
-                dag_directory=tmpdir,
+                dag_directory=tmp_path,
                 max_runs=1,
                 processor_timeout=timedelta(days=365),
                 signal_conn=child_pipe,
@@ -1141,7 +1137,7 @@ def test_fetch_callbacks_for_current_dag_directory_only(self, tmpdir):
             ("core", "load_examples"): "False",
         }
     )
-    def test_fetch_callbacks_from_database_max_per_loop(self, tmpdir):
+    def test_fetch_callbacks_from_database_max_per_loop(self, tmp_path):
         """Test DagProcessorJobRunner._fetch_callbacks method"""
         dag_filepath = TEST_DAG_FOLDER / "test_on_failure_callback_dag.py"
 
@@ -1152,7 +1148,7 @@ def test_fetch_callbacks_from_database_max_per_loop(self, tmpdir):
                     full_filepath=str(dag_filepath),
                     is_failure_callback=True,
                     run_id=str(i),
-                    processor_subdir=str(tmpdir),
+                    processor_subdir=os.fspath(tmp_path),
                 )
                 session.add(DbCallbackRequest(callback=callback, priority_weight=i))
 
@@ -1160,7 +1156,7 @@ def test_fetch_callbacks_from_database_max_per_loop(self, tmpdir):
         manager = DagProcessorJobRunner(
             job=Job(),
             processor=DagFileProcessorManager(
-                dag_directory=str(tmpdir),
+                dag_directory=str(tmp_path),
                 max_runs=1,
                 processor_timeout=timedelta(days=365),
                 signal_conn=child_pipe,
@@ -1184,7 +1180,7 @@ def test_fetch_callbacks_from_database_max_per_loop(self, tmpdir):
             ("core", "load_examples"): "False",
         }
     )
-    def test_fetch_callbacks_from_database_not_standalone(self, tmpdir):
+    def test_fetch_callbacks_from_database_not_standalone(self, tmp_path):
         dag_filepath = TEST_DAG_FOLDER / "test_on_failure_callback_dag.py"
 
         with create_session() as session:
@@ -1192,7 +1188,7 @@ def test_fetch_callbacks_from_database_not_standalone(self, tmpdir):
                 dag_id="test_start_date_scheduling",
                 full_filepath=str(dag_filepath),
                 is_failure_callback=True,
-                processor_subdir=str(tmpdir),
+                processor_subdir=str(tmp_path),
                 run_id="123",
             )
             session.add(DbCallbackRequest(callback=callback, priority_weight=10))
@@ -1201,7 +1197,7 @@ def test_fetch_callbacks_from_database_not_standalone(self, tmpdir):
         manager = DagProcessorJobRunner(
             job=Job(),
             processor=DagFileProcessorManager(
-                dag_directory=tmpdir,
+                dag_directory=tmp_path,
                 max_runs=1,
                 processor_timeout=timedelta(days=365),
                 signal_conn=child_pipe,
@@ -1219,7 +1215,7 @@ def test_fetch_callbacks_from_database_not_standalone(self, tmpdir):
         with create_session() as session:
             assert session.query(DbCallbackRequest).count() == 1
 
-    def test_callback_queue(self, tmpdir):
+    def test_callback_queue(self, tmp_path):
         # given
         manager = DagProcessorJobRunner(
             job=Job(),
@@ -1239,7 +1235,7 @@ def test_callback_queue(self, tmpdir):
             dag_id="dag1",
             run_id="run1",
             is_failure_callback=False,
-            processor_subdir=tmpdir,
+            processor_subdir=tmp_path,
             msg=None,
         )
         dag1_req2 = DagCallbackRequest(
@@ -1247,18 +1243,18 @@ def test_callback_queue(self, tmpdir):
             dag_id="dag1",
             run_id="run1",
             is_failure_callback=False,
-            processor_subdir=tmpdir,
+            processor_subdir=tmp_path,
             msg=None,
         )
         dag1_sla1 = SlaCallbackRequest(
             full_filepath="/green_eggs/ham/file1.py",
             dag_id="dag1",
-            processor_subdir=tmpdir,
+            processor_subdir=tmp_path,
         )
         dag1_sla2 = SlaCallbackRequest(
             full_filepath="/green_eggs/ham/file1.py",
             dag_id="dag1",
-            processor_subdir=tmpdir,
+            processor_subdir=tmp_path,
         )
 
         dag2_req1 = DagCallbackRequest(
@@ -1266,14 +1262,14 @@ def test_callback_queue(self, tmpdir):
             dag_id="dag2",
             run_id="run1",
             is_failure_callback=False,
-            processor_subdir=tmpdir,
+            processor_subdir=tmp_path,
             msg=None,
         )
 
         dag3_sla1 = SlaCallbackRequest(
             full_filepath="/green_eggs/ham/file3.py",
             dag_id="dag3",
-            processor_subdir=tmpdir,
+            processor_subdir=tmp_path,
         )
 
         # when
diff --git a/tests/dags/test_example_bash_operator.py b/tests/dags/test_example_bash_operator.py
index 3036487b66490..1678799f4b196 100644
--- a/tests/dags/test_example_bash_operator.py
+++ b/tests/dags/test_example_bash_operator.py
@@ -38,7 +38,7 @@
 
 for i in range(3):
     task = BashOperator(
-        task_id="runme_" + str(i), bash_command='echo "{{ task_instance_key_str }}" && sleep 1', dag=dag
+        task_id=f"runme_{i}", bash_command='echo "{{ task_instance_key_str }}" && sleep 1', dag=dag
     )
     task.set_downstream(run_this)
 
diff --git a/tests/dags/test_miscellaneous.py b/tests/dags/test_miscellaneous.py
index 587d33e69281c..cad59dda1e349 100644
--- a/tests/dags/test_miscellaneous.py
+++ b/tests/dags/test_miscellaneous.py
@@ -55,7 +55,7 @@
 
 for i in range(3):
     task = BashOperator(
-        task_id="runme_" + str(i),
+        task_id=f"runme_{i}",
         bash_command='echo "{{ task_instance_key_str }}" && sleep 1',
         dag=dag,
     )
diff --git a/tests/dags_corrupted/test_impersonation_custom.py b/tests/dags_corrupted/test_impersonation_custom.py
index 7fc9980d6cc63..d52342c65868f 100644
--- a/tests/dags_corrupted/test_impersonation_custom.py
+++ b/tests/dags_corrupted/test_impersonation_custom.py
@@ -40,7 +40,7 @@
 
 def print_today():
     date_time = FakeDatetime.utcnow()
-    print(f"Today is {date_time.strftime('%Y-%m-%d')}")
+    print(f"Today is {date_time:%Y-%m-%d}")
 
 
 def check_hive_conf():
diff --git a/tests/decorators/test_python.py b/tests/decorators/test_python.py
index f1c84721b4ef7..c2a21eadb6132 100644
--- a/tests/decorators/test_python.py
+++ b/tests/decorators/test_python.py
@@ -36,6 +36,7 @@
 from airflow.utils import timezone
 from airflow.utils.state import State
 from airflow.utils.task_group import TaskGroup
+from airflow.utils.task_instance_session import set_current_task_instance_session
 from airflow.utils.trigger_rule import TriggerRule
 from airflow.utils.types import DagRunType
 from airflow.utils.xcom import XCOM_RETURN_KEY
@@ -744,36 +745,37 @@ def test_mapped_render_template_fields(dag_maker, session):
     def fn(arg1, arg2):
         ...
 
-    with dag_maker(session=session):
-        task1 = BaseOperator(task_id="op1")
-        mapped = fn.partial(arg2="{{ ti.task_id }}").expand(arg1=task1.output)
+    with set_current_task_instance_session(session=session):
+        with dag_maker(session=session):
+            task1 = BaseOperator(task_id="op1")
+            mapped = fn.partial(arg2="{{ ti.task_id }}").expand(arg1=task1.output)
 
-    dr = dag_maker.create_dagrun()
-    ti: TaskInstance = dr.get_task_instance(task1.task_id, session=session)
-
-    ti.xcom_push(key=XCOM_RETURN_KEY, value=["{{ ds }}"], session=session)
-
-    session.add(
-        TaskMap(
-            dag_id=dr.dag_id,
-            task_id=task1.task_id,
-            run_id=dr.run_id,
-            map_index=-1,
-            length=1,
-            keys=None,
+        dr = dag_maker.create_dagrun()
+        ti: TaskInstance = dr.get_task_instance(task1.task_id, session=session)
+
+        ti.xcom_push(key=XCOM_RETURN_KEY, value=["{{ ds }}"], session=session)
+
+        session.add(
+            TaskMap(
+                dag_id=dr.dag_id,
+                task_id=task1.task_id,
+                run_id=dr.run_id,
+                map_index=-1,
+                length=1,
+                keys=None,
+            )
         )
-    )
-    session.flush()
+        session.flush()
 
-    mapped_ti: TaskInstance = dr.get_task_instance(mapped.operator.task_id, session=session)
-    mapped_ti.map_index = 0
+        mapped_ti: TaskInstance = dr.get_task_instance(mapped.operator.task_id, session=session)
+        mapped_ti.map_index = 0
 
-    assert isinstance(mapped_ti.task, MappedOperator)
-    mapped.operator.render_template_fields(context=mapped_ti.get_template_context(session=session))
-    assert isinstance(mapped_ti.task, BaseOperator)
+        assert isinstance(mapped_ti.task, MappedOperator)
+        mapped.operator.render_template_fields(context=mapped_ti.get_template_context(session=session))
+        assert isinstance(mapped_ti.task, BaseOperator)
 
-    assert mapped_ti.task.op_kwargs["arg1"] == "{{ ds }}"
-    assert mapped_ti.task.op_kwargs["arg2"] == "fn"
+        assert mapped_ti.task.op_kwargs["arg1"] == "{{ ds }}"
+        assert mapped_ti.task.op_kwargs["arg2"] == "fn"
 
 
 def test_task_decorator_has_wrapped_attr():
diff --git a/tests/decorators/test_setup_teardown.py b/tests/decorators/test_setup_teardown.py
index 567ac5c9abdf9..4ec8376a07a3e 100644
--- a/tests/decorators/test_setup_teardown.py
+++ b/tests/decorators/test_setup_teardown.py
@@ -255,7 +255,7 @@ def mytask2():
             mytask2()
 
         assert len(dag.task_group.children) == 6
-        assert [x for x in dag.tasks if not x.downstream_list]  # no deps have been set
+        assert sum(1 for x in dag.tasks if not x.downstream_list) == 6
         assert dag.task_group.children["setuptask"].is_setup
         assert dag.task_group.children["teardowntask"].is_teardown
         assert dag.task_group.children["setuptask2"].is_setup
diff --git a/tests/jobs/test_scheduler_job.py b/tests/jobs/test_scheduler_job.py
index d1612a84f3cab..dd9b0d9635152 100644
--- a/tests/jobs/test_scheduler_job.py
+++ b/tests/jobs/test_scheduler_job.py
@@ -59,7 +59,7 @@
 from airflow.utils import timezone
 from airflow.utils.file import list_py_file_paths
 from airflow.utils.session import create_session, provide_session
-from airflow.utils.state import DagRunState, State, TaskInstanceState
+from airflow.utils.state import DagRunState, JobState, State, TaskInstanceState
 from airflow.utils.types import DagRunType
 from tests.listeners import dag_listener
 from tests.listeners.test_listeners import get_listener_manager
@@ -601,7 +601,7 @@ def test_find_executable_task_instances_pool(self, dag_maker):
             dr2.get_task_instance(task_id_1, session=session),
             dr2.get_task_instance(task_id_2, session=session),
         ]
-        tis = sorted(tis, key=lambda ti: ti.key)
+        tis.sort(key=lambda ti: ti.key)
         for ti in tis:
             ti.state = State.SCHEDULED
             session.merge(ti)
@@ -1755,10 +1755,7 @@ def test_runs_are_created_after_max_active_runs_was_reached(self, dag_maker, ses
             # Need to use something that doesn't immediately get marked as success by the scheduler
             BashOperator(task_id="task", bash_command="true")
 
-        dag_run = dag_maker.create_dagrun(
-            state=State.RUNNING,
-            session=session,
-        )
+        dag_run = dag_maker.create_dagrun(state=State.RUNNING, session=session, run_type=DagRunType.SCHEDULED)
 
         # Reach max_active_runs
         for _ in range(3):
@@ -3459,7 +3456,50 @@ def test_should_update_dag_next_dagruns(self, schedule, number_running, excepted
         self.job_runner = SchedulerJobRunner(job=scheduler_job)
 
         assert excepted is self.job_runner._should_update_dag_next_dagruns(
-            dag, dag_model, number_running, session=session
+            dag, dag_model, total_active_runs=number_running, session=session
+        )
+
+    @pytest.mark.parametrize(
+        "run_type, should_update",
+        [
+            (DagRunType.MANUAL, False),
+            (DagRunType.SCHEDULED, True),
+            (DagRunType.BACKFILL_JOB, True),
+            (DagRunType.DATASET_TRIGGERED, False),
+        ],
+        ids=[
+            DagRunType.MANUAL.name,
+            DagRunType.SCHEDULED.name,
+            DagRunType.BACKFILL_JOB.name,
+            DagRunType.DATASET_TRIGGERED.name,
+        ],
+    )
+    def test_should_update_dag_next_dagruns_after_run_type(self, run_type, should_update, session, dag_maker):
+        """Test that whether next dagrun is updated depends on run type"""
+        with dag_maker(
+            dag_id="test_should_update_dag_next_dagruns_after_run_type",
+            schedule="*/1 * * * *",
+            max_active_runs=10,
+        ) as dag:
+            EmptyOperator(task_id="dummy")
+
+        dag_model = dag_maker.dag_model
+
+        run = dag_maker.create_dagrun(
+            run_id="run",
+            run_type=run_type,
+            execution_date=DEFAULT_DATE,
+            start_date=timezone.utcnow(),
+            state=State.SUCCESS,
+            session=session,
+        )
+
+        session.flush()
+        scheduler_job = Job(executor=self.null_exec)
+        self.job_runner = SchedulerJobRunner(job=scheduler_job)
+
+        assert should_update is self.job_runner._should_update_dag_next_dagruns(
+            dag, dag_model, last_dag_run=run, total_active_runs=0, session=session
         )
 
     def test_create_dag_runs(self, dag_maker):
@@ -4559,7 +4599,7 @@ def test_find_zombies(self, load_examples):
 
                 local_job = Job(dag_id=ti.dag_id)
                 LocalTaskJobRunner(job=local_job, task_instance=ti)
-                local_job.state = State.SHUTDOWN
+                local_job.state = TaskInstanceState.FAILED
 
                 session.add(local_job)
                 session.flush()
@@ -4622,7 +4662,7 @@ def test_zombie_message(self, load_examples):
                 ti.queued_by_job_id = 999
 
                 local_job = Job(dag_id=ti.dag_id)
-                local_job.state = State.SHUTDOWN
+                local_job.state = TaskInstanceState.FAILED
 
                 session.add(local_job)
                 session.flush()
@@ -4683,7 +4723,7 @@ def test_find_zombies_handle_failure_callbacks_are_correctly_passed_to_dag_proce
 
             local_job = Job(dag_id=ti.dag_id)
             LocalTaskJobRunner(job=local_job, task_instance=ti)
-            local_job.state = State.SHUTDOWN
+            local_job.state = JobState.FAILED
             session.add(local_job)
             session.flush()
 
diff --git a/tests/jobs/test_triggerer_job.py b/tests/jobs/test_triggerer_job.py
index e79202d6f60d2..b31a0510cf44d 100644
--- a/tests/jobs/test_triggerer_job.py
+++ b/tests/jobs/test_triggerer_job.py
@@ -557,7 +557,7 @@ def test_trigger_failing(session):
         for _ in range(30):
             if job_runner.trigger_runner.failed_triggers:
                 assert len(job_runner.trigger_runner.failed_triggers) == 1
-                trigger_id, exc = list(job_runner.trigger_runner.failed_triggers)[0]
+                trigger_id, exc = next(iter(job_runner.trigger_runner.failed_triggers))
                 assert trigger_id == 1
                 assert isinstance(exc, ValueError)
                 assert exc.args[0] == "Deliberate trigger failure"
diff --git a/tests/models/test_cleartasks.py b/tests/models/test_cleartasks.py
index ec504ba186db8..01fbb85e403ba 100644
--- a/tests/models/test_cleartasks.py
+++ b/tests/models/test_cleartasks.py
@@ -18,6 +18,7 @@
 from __future__ import annotations
 
 import datetime
+import random
 
 import pytest
 
@@ -532,11 +533,11 @@ def test_dags_clear(self):
         num_of_dags = 5
         for i in range(num_of_dags):
             dag = DAG(
-                "test_dag_clear_" + str(i),
+                f"test_dag_clear_{i}",
                 start_date=DEFAULT_DATE,
                 end_date=DEFAULT_DATE + datetime.timedelta(days=10),
             )
-            task = EmptyOperator(task_id="test_task_clear_" + str(i), owner="test", dag=dag)
+            task = EmptyOperator(task_id=f"test_task_clear_{i}", owner="test", dag=dag)
 
             dr = dag.create_dagrun(
                 execution_date=DEFAULT_DATE,
@@ -580,25 +581,23 @@ def test_dags_clear(self):
             assert tis[i].max_tries == 1
 
         # test only_failed
-        from random import randint
-
-        failed_dag_idx = randint(0, len(tis) - 1)
-        tis[failed_dag_idx].state = State.FAILED
-        session.merge(tis[failed_dag_idx])
+        failed_dag = random.choice(tis)
+        failed_dag.state = State.FAILED
+        session.merge(failed_dag)
         session.commit()
 
         DAG.clear_dags(dags, only_failed=True)
 
-        for i in range(num_of_dags):
-            tis[i].refresh_from_db()
-            if i != failed_dag_idx:
-                assert tis[i].state == State.SUCCESS
-                assert tis[i].try_number == 3
-                assert tis[i].max_tries == 1
+        for ti in tis:
+            ti.refresh_from_db()
+            if ti is failed_dag:
+                assert ti.state == State.NONE
+                assert ti.try_number == 3
+                assert ti.max_tries == 2
             else:
-                assert tis[i].state == State.NONE
-                assert tis[i].try_number == 3
-                assert tis[i].max_tries == 2
+                assert ti.state == State.SUCCESS
+                assert ti.try_number == 3
+                assert ti.max_tries == 1
 
     def test_operator_clear(self, dag_maker):
         with dag_maker(
diff --git a/tests/models/test_dag.py b/tests/models/test_dag.py
index 35ed9c0fc5f18..4c518db59ad07 100644
--- a/tests/models/test_dag.py
+++ b/tests/models/test_dag.py
@@ -1368,7 +1368,7 @@ def test_tree_view(self):
                 dag.tree_view()
                 stdout = stdout.getvalue()
 
-            stdout_lines = stdout.split("\n")
+            stdout_lines = stdout.splitlines()
             assert "t1" in stdout_lines[0]
             assert "t2" in stdout_lines[1]
             assert "t3" in stdout_lines[2]
diff --git a/tests/models/test_dagcode.py b/tests/models/test_dagcode.py
index 1ae47b1df8900..d3b38761ca381 100644
--- a/tests/models/test_dagcode.py
+++ b/tests/models/test_dagcode.py
@@ -81,7 +81,7 @@ def test_bulk_sync_to_db_half_files(self):
         """Dg code can be bulk written into database."""
         example_dags = make_example_dags(example_dags_module)
         files = [dag.fileloc for dag in example_dags.values()]
-        half_files = files[: int(len(files) / 2)]
+        half_files = files[: len(files) // 2]
         with create_session() as session:
             DagCode.bulk_sync_to_db(half_files, session=session)
             session.commit()
diff --git a/tests/models/test_dagrun.py b/tests/models/test_dagrun.py
index 5d809333c82e4..e789a2ef2be22 100644
--- a/tests/models/test_dagrun.py
+++ b/tests/models/test_dagrun.py
@@ -336,8 +336,8 @@ def test_dagrun_deadlock(self, session):
         dr.update_state(session=session)
         assert dr.state == DagRunState.FAILED
 
-    def test_dagrun_no_deadlock_with_shutdown(self, session):
-        dag = DAG("test_dagrun_no_deadlock_with_shutdown", start_date=DEFAULT_DATE)
+    def test_dagrun_no_deadlock_with_restarting(self, session):
+        dag = DAG("test_dagrun_no_deadlock_with_restarting", start_date=DEFAULT_DATE)
         with dag:
             op1 = EmptyOperator(task_id="upstream_task")
             op2 = EmptyOperator(task_id="downstream_task")
@@ -351,7 +351,7 @@ def test_dagrun_no_deadlock_with_shutdown(self, session):
             start_date=DEFAULT_DATE,
         )
         upstream_ti = dr.get_task_instance(task_id="upstream_task")
-        upstream_ti.set_state(TaskInstanceState.SHUTDOWN, session=session)
+        upstream_ti.set_state(TaskInstanceState.RESTARTING, session=session)
 
         dr.update_state()
         assert dr.state == DagRunState.RUNNING
diff --git a/tests/models/test_mappedoperator.py b/tests/models/test_mappedoperator.py
index 8366acf0b7ea7..636225a29b1a3 100644
--- a/tests/models/test_mappedoperator.py
+++ b/tests/models/test_mappedoperator.py
@@ -39,6 +39,7 @@
 from airflow.utils.context import Context
 from airflow.utils.state import TaskInstanceState
 from airflow.utils.task_group import TaskGroup
+from airflow.utils.task_instance_session import set_current_task_instance_session
 from airflow.utils.trigger_rule import TriggerRule
 from airflow.utils.xcom import XCOM_RETURN_KEY
 from tests.models import DEFAULT_DATE
@@ -400,109 +401,114 @@ def test_mapped_expand_against_params(dag_maker, dag_params, task_params, expect
 
 
 def test_mapped_render_template_fields_validating_operator(dag_maker, session):
-    class MyOperator(BaseOperator):
-        template_fields = ("partial_template", "map_template", "file_template")
-        template_ext = (".ext",)
-
-        def __init__(
-            self, partial_template, partial_static, map_template, map_static, file_template, **kwargs
-        ):
-            for value in [partial_template, partial_static, map_template, map_static, file_template]:
-                assert isinstance(value, str), "value should have been resolved before unmapping"
-            super().__init__(**kwargs)
-            self.partial_template = partial_template
-            self.partial_static = partial_static
-            self.map_template = map_template
-            self.map_static = map_static
-            self.file_template = file_template
+    with set_current_task_instance_session(session=session):
+
+        class MyOperator(BaseOperator):
+            template_fields = ("partial_template", "map_template", "file_template")
+            template_ext = (".ext",)
+
+            def __init__(
+                self, partial_template, partial_static, map_template, map_static, file_template, **kwargs
+            ):
+                for value in [partial_template, partial_static, map_template, map_static, file_template]:
+                    assert isinstance(value, str), "value should have been resolved before unmapping"
+                    super().__init__(**kwargs)
+                    self.partial_template = partial_template
+                self.partial_static = partial_static
+                self.map_template = map_template
+                self.map_static = map_static
+                self.file_template = file_template
 
         def execute(self, context):
             pass
 
-    with dag_maker(session=session):
-        task1 = BaseOperator(task_id="op1")
-        output1 = task1.output
-        mapped = MyOperator.partial(
-            task_id="a", partial_template="{{ ti.task_id }}", partial_static="{{ ti.task_id }}"
-        ).expand(map_template=output1, map_static=output1, file_template=["/path/to/file.ext"])
+        with dag_maker(session=session):
+            task1 = BaseOperator(task_id="op1")
+            output1 = task1.output
+            mapped = MyOperator.partial(
+                task_id="a", partial_template="{{ ti.task_id }}", partial_static="{{ ti.task_id }}"
+            ).expand(map_template=output1, map_static=output1, file_template=["/path/to/file.ext"])
+
+        dr = dag_maker.create_dagrun()
+        ti: TaskInstance = dr.get_task_instance(task1.task_id, session=session)
+
+        ti.xcom_push(key=XCOM_RETURN_KEY, value=["{{ ds }}"], session=session)
+
+        session.add(
+            TaskMap(
+                dag_id=dr.dag_id,
+                task_id=task1.task_id,
+                run_id=dr.run_id,
+                map_index=-1,
+                length=1,
+                keys=None,
+            )
+        )
+        session.flush()
 
-    dr = dag_maker.create_dagrun()
-    ti: TaskInstance = dr.get_task_instance(task1.task_id, session=session)
+        mapped_ti: TaskInstance = dr.get_task_instance(mapped.task_id, session=session)
+        mapped_ti.map_index = 0
 
-    ti.xcom_push(key=XCOM_RETURN_KEY, value=["{{ ds }}"], session=session)
+        assert isinstance(mapped_ti.task, MappedOperator)
+        with patch("builtins.open", mock.mock_open(read_data=b"loaded data")), patch(
+            "os.path.isfile", return_value=True
+        ), patch("os.path.getmtime", return_value=0):
+            mapped.render_template_fields(context=mapped_ti.get_template_context(session=session))
+        assert isinstance(mapped_ti.task, MyOperator)
 
-    session.add(
-        TaskMap(
-            dag_id=dr.dag_id,
-            task_id=task1.task_id,
-            run_id=dr.run_id,
-            map_index=-1,
-            length=1,
-            keys=None,
-        )
-    )
-    session.flush()
+        assert mapped_ti.task.partial_template == "a", "Should be templated!"
+        assert mapped_ti.task.partial_static == "{{ ti.task_id }}", "Should not be templated!"
+        assert mapped_ti.task.map_template == "{{ ds }}", "Should not be templated!"
+        assert mapped_ti.task.map_static == "{{ ds }}", "Should not be templated!"
+        assert mapped_ti.task.file_template == "loaded data", "Should be templated!"
 
-    mapped_ti: TaskInstance = dr.get_task_instance(mapped.task_id, session=session)
-    mapped_ti.map_index = 0
 
-    assert isinstance(mapped_ti.task, MappedOperator)
-    with patch("builtins.open", mock.mock_open(read_data=b"loaded data")), patch(
-        "os.path.isfile", return_value=True
-    ), patch("os.path.getmtime", return_value=0):
-        mapped.render_template_fields(context=mapped_ti.get_template_context(session=session))
-    assert isinstance(mapped_ti.task, MyOperator)
+def test_mapped_expand_kwargs_render_template_fields_validating_operator(dag_maker, session):
 
-    assert mapped_ti.task.partial_template == "a", "Should be templated!"
-    assert mapped_ti.task.partial_static == "{{ ti.task_id }}", "Should not be templated!"
-    assert mapped_ti.task.map_template == "{{ ds }}", "Should not be templated!"
-    assert mapped_ti.task.map_static == "{{ ds }}", "Should not be templated!"
-    assert mapped_ti.task.file_template == "loaded data", "Should be templated!"
+    with set_current_task_instance_session(session=session):
 
+        class MyOperator(BaseOperator):
+            template_fields = ("partial_template", "map_template", "file_template")
+            template_ext = (".ext",)
 
-def test_mapped_expand_kwargs_render_template_fields_validating_operator(dag_maker, session):
-    class MyOperator(BaseOperator):
-        template_fields = ("partial_template", "map_template", "file_template")
-        template_ext = (".ext",)
-
-        def __init__(
-            self, partial_template, partial_static, map_template, map_static, file_template, **kwargs
-        ):
-            for value in [partial_template, partial_static, map_template, map_static, file_template]:
-                assert isinstance(value, str), "value should have been resolved before unmapping"
-            super().__init__(**kwargs)
-            self.partial_template = partial_template
-            self.partial_static = partial_static
-            self.map_template = map_template
-            self.map_static = map_static
-            self.file_template = file_template
+            def __init__(
+                self, partial_template, partial_static, map_template, map_static, file_template, **kwargs
+            ):
+                for value in [partial_template, partial_static, map_template, map_static, file_template]:
+                    assert isinstance(value, str), "value should have been resolved before unmapping"
+                super().__init__(**kwargs)
+                self.partial_template = partial_template
+                self.partial_static = partial_static
+                self.map_template = map_template
+                self.map_static = map_static
+                self.file_template = file_template
 
-        def execute(self, context):
-            pass
+            def execute(self, context):
+                pass
 
-    with dag_maker(session=session):
-        mapped = MyOperator.partial(
-            task_id="a", partial_template="{{ ti.task_id }}", partial_static="{{ ti.task_id }}"
-        ).expand_kwargs(
-            [{"map_template": "{{ ds }}", "map_static": "{{ ds }}", "file_template": "/path/to/file.ext"}]
-        )
+        with dag_maker(session=session):
+            mapped = MyOperator.partial(
+                task_id="a", partial_template="{{ ti.task_id }}", partial_static="{{ ti.task_id }}"
+            ).expand_kwargs(
+                [{"map_template": "{{ ds }}", "map_static": "{{ ds }}", "file_template": "/path/to/file.ext"}]
+            )
 
-    dr = dag_maker.create_dagrun()
+        dr = dag_maker.create_dagrun()
 
-    mapped_ti: TaskInstance = dr.get_task_instance(mapped.task_id, session=session, map_index=0)
+        mapped_ti: TaskInstance = dr.get_task_instance(mapped.task_id, session=session, map_index=0)
 
-    assert isinstance(mapped_ti.task, MappedOperator)
-    with patch("builtins.open", mock.mock_open(read_data=b"loaded data")), patch(
-        "os.path.isfile", return_value=True
-    ), patch("os.path.getmtime", return_value=0):
-        mapped.render_template_fields(context=mapped_ti.get_template_context(session=session))
-    assert isinstance(mapped_ti.task, MyOperator)
+        assert isinstance(mapped_ti.task, MappedOperator)
+        with patch("builtins.open", mock.mock_open(read_data=b"loaded data")), patch(
+            "os.path.isfile", return_value=True
+        ), patch("os.path.getmtime", return_value=0):
+            mapped.render_template_fields(context=mapped_ti.get_template_context(session=session))
+        assert isinstance(mapped_ti.task, MyOperator)
 
-    assert mapped_ti.task.partial_template == "a", "Should be templated!"
-    assert mapped_ti.task.partial_static == "{{ ti.task_id }}", "Should not be templated!"
-    assert mapped_ti.task.map_template == "2016-01-01", "Should be templated!"
-    assert mapped_ti.task.map_static == "{{ ds }}", "Should not be templated!"
-    assert mapped_ti.task.file_template == "loaded data", "Should be templated!"
+        assert mapped_ti.task.partial_template == "a", "Should be templated!"
+        assert mapped_ti.task.partial_static == "{{ ti.task_id }}", "Should not be templated!"
+        assert mapped_ti.task.map_template == "2016-01-01", "Should be templated!"
+        assert mapped_ti.task.map_static == "{{ ds }}", "Should not be templated!"
+        assert mapped_ti.task.file_template == "loaded data", "Should be templated!"
 
 
 def test_mapped_render_nested_template_fields(dag_maker, session):
@@ -604,35 +610,36 @@ def test_expand_kwargs_mapped_task_instance(dag_maker, session, num_existing_tis
     ],
 )
 def test_expand_kwargs_render_template_fields_validating_operator(dag_maker, session, map_index, expected):
-    with dag_maker(session=session):
-        task1 = BaseOperator(task_id="op1")
-        mapped = MockOperator.partial(task_id="a", arg2="{{ ti.task_id }}").expand_kwargs(task1.output)
-
-    dr = dag_maker.create_dagrun()
-    ti: TaskInstance = dr.get_task_instance(task1.task_id, session=session)
-
-    ti.xcom_push(key=XCOM_RETURN_KEY, value=[{"arg1": "{{ ds }}"}, {"arg1": 2}], session=session)
-
-    session.add(
-        TaskMap(
-            dag_id=dr.dag_id,
-            task_id=task1.task_id,
-            run_id=dr.run_id,
-            map_index=-1,
-            length=2,
-            keys=None,
+    with set_current_task_instance_session(session=session):
+        with dag_maker(session=session):
+            task1 = BaseOperator(task_id="op1")
+            mapped = MockOperator.partial(task_id="a", arg2="{{ ti.task_id }}").expand_kwargs(task1.output)
+
+        dr = dag_maker.create_dagrun()
+        ti: TaskInstance = dr.get_task_instance(task1.task_id, session=session)
+
+        ti.xcom_push(key=XCOM_RETURN_KEY, value=[{"arg1": "{{ ds }}"}, {"arg1": 2}], session=session)
+
+        session.add(
+            TaskMap(
+                dag_id=dr.dag_id,
+                task_id=task1.task_id,
+                run_id=dr.run_id,
+                map_index=-1,
+                length=2,
+                keys=None,
+            )
         )
-    )
-    session.flush()
-
-    ti: TaskInstance = dr.get_task_instance(mapped.task_id, session=session)
-    ti.refresh_from_task(mapped)
-    ti.map_index = map_index
-    assert isinstance(ti.task, MappedOperator)
-    mapped.render_template_fields(context=ti.get_template_context(session=session))
-    assert isinstance(ti.task, MockOperator)
-    assert ti.task.arg1 == expected
-    assert ti.task.arg2 == "a"
+        session.flush()
+
+        ti: TaskInstance = dr.get_task_instance(mapped.task_id, session=session)
+        ti.refresh_from_task(mapped)
+        ti.map_index = map_index
+        assert isinstance(ti.task, MappedOperator)
+        mapped.render_template_fields(context=ti.get_template_context(session=session))
+        assert isinstance(ti.task, MockOperator)
+        assert ti.task.arg1 == expected
+        assert ti.task.arg2 == "a"
 
 
 def test_xcomarg_property_of_mapped_operator(dag_maker):
diff --git a/tests/models/test_renderedtifields.py b/tests/models/test_renderedtifields.py
index 7a312a4c67c38..12fc108ce0124 100644
--- a/tests/models/test_renderedtifields.py
+++ b/tests/models/test_renderedtifields.py
@@ -29,6 +29,7 @@
 from airflow.models import Variable
 from airflow.models.renderedtifields import RenderedTaskInstanceFields as RTIF
 from airflow.operators.bash import BashOperator
+from airflow.utils.task_instance_session import set_current_task_instance_session
 from airflow.utils.timezone import datetime
 from tests.test_utils.asserts import assert_queries_count
 from tests.test_utils.db import clear_db_dags, clear_db_runs, clear_rendered_ti_fields
@@ -153,44 +154,46 @@ def test_get_templated_fields(self, templated_field, expected_rendered_field, da
         ],
     )
     def test_delete_old_records(
-        self, rtif_num, num_to_keep, remaining_rtifs, expected_query_count, dag_maker
+        self, rtif_num, num_to_keep, remaining_rtifs, expected_query_count, dag_maker, session
     ):
         """
         Test that old records are deleted from rendered_task_instance_fields table
         for a given task_id and dag_id.
         """
-        session = settings.Session()
-        with dag_maker("test_delete_old_records") as dag:
-            task = BashOperator(task_id="test", bash_command="echo {{ ds }}")
-        rtif_list = []
-        for num in range(rtif_num):
-            dr = dag_maker.create_dagrun(run_id=str(num), execution_date=dag.start_date + timedelta(days=num))
-            ti = dr.task_instances[0]
-            ti.task = task
-            rtif_list.append(RTIF(ti))
-
-        session.add_all(rtif_list)
-        session.flush()
-
-        result = session.query(RTIF).filter(RTIF.dag_id == dag.dag_id, RTIF.task_id == task.task_id).all()
-
-        for rtif in rtif_list:
-            assert rtif in result
-
-        assert rtif_num == len(result)
-
-        # Verify old records are deleted and only 'num_to_keep' records are kept
-        # For other DBs,an extra query is fired in RenderedTaskInstanceFields.delete_old_records
-        expected_query_count_based_on_db = (
-            expected_query_count + 1
-            if session.bind.dialect.name == "mssql" and expected_query_count != 0
-            else expected_query_count
-        )
+        with set_current_task_instance_session(session=session):
+            with dag_maker("test_delete_old_records") as dag:
+                task = BashOperator(task_id="test", bash_command="echo {{ ds }}")
+            rtif_list = []
+            for num in range(rtif_num):
+                dr = dag_maker.create_dagrun(
+                    run_id=str(num), execution_date=dag.start_date + timedelta(days=num)
+                )
+                ti = dr.task_instances[0]
+                ti.task = task
+                rtif_list.append(RTIF(ti))
+
+            session.add_all(rtif_list)
+            session.flush()
+
+            result = session.query(RTIF).filter(RTIF.dag_id == dag.dag_id, RTIF.task_id == task.task_id).all()
+
+            for rtif in rtif_list:
+                assert rtif in result
+
+            assert rtif_num == len(result)
+
+            # Verify old records are deleted and only 'num_to_keep' records are kept
+            # For other DBs,an extra query is fired in RenderedTaskInstanceFields.delete_old_records
+            expected_query_count_based_on_db = (
+                expected_query_count + 1
+                if session.bind.dialect.name == "mssql" and expected_query_count != 0
+                else expected_query_count
+            )
 
-        with assert_queries_count(expected_query_count_based_on_db):
-            RTIF.delete_old_records(task_id=task.task_id, dag_id=task.dag_id, num_to_keep=num_to_keep)
-        result = session.query(RTIF).filter(RTIF.dag_id == dag.dag_id, RTIF.task_id == task.task_id).all()
-        assert remaining_rtifs == len(result)
+            with assert_queries_count(expected_query_count_based_on_db):
+                RTIF.delete_old_records(task_id=task.task_id, dag_id=task.dag_id, num_to_keep=num_to_keep)
+            result = session.query(RTIF).filter(RTIF.dag_id == dag.dag_id, RTIF.task_id == task.task_id).all()
+            assert remaining_rtifs == len(result)
 
     @pytest.mark.parametrize(
         "num_runs, num_to_keep, remaining_rtifs, expected_query_count",
@@ -207,40 +210,41 @@ def test_delete_old_records_mapped(
         Test that old records are deleted from rendered_task_instance_fields table
         for a given task_id and dag_id with mapped tasks.
         """
-        with dag_maker("test_delete_old_records", session=session) as dag:
-            mapped = BashOperator.partial(task_id="mapped").expand(bash_command=["a", "b"])
-        for num in range(num_runs):
-            dr = dag_maker.create_dagrun(
-                run_id=f"run_{num}", execution_date=dag.start_date + timedelta(days=num)
+        with set_current_task_instance_session(session=session):
+            with dag_maker("test_delete_old_records", session=session) as dag:
+                mapped = BashOperator.partial(task_id="mapped").expand(bash_command=["a", "b"])
+            for num in range(num_runs):
+                dr = dag_maker.create_dagrun(
+                    run_id=f"run_{num}", execution_date=dag.start_date + timedelta(days=num)
+                )
+
+                mapped.expand_mapped_task(dr.run_id, session=dag_maker.session)
+                session.refresh(dr)
+                for ti in dr.task_instances:
+                    ti.task = dag.get_task(ti.task_id)
+                    session.add(RTIF(ti))
+            session.flush()
+
+            result = session.query(RTIF).filter(RTIF.dag_id == dag.dag_id).all()
+            assert len(result) == num_runs * 2
+
+            # Verify old records are deleted and only 'num_to_keep' records are kept
+            # For other DBs,an extra query is fired in RenderedTaskInstanceFields.delete_old_records
+            expected_query_count_based_on_db = (
+                expected_query_count + 1
+                if session.bind.dialect.name == "mssql" and expected_query_count != 0
+                else expected_query_count
             )
 
-            mapped.expand_mapped_task(dr.run_id, session=dag_maker.session)
-            session.refresh(dr)
-            for ti in dr.task_instances:
-                ti.task = dag.get_task(ti.task_id)
-                session.add(RTIF(ti))
-        session.flush()
-
-        result = session.query(RTIF).filter(RTIF.dag_id == dag.dag_id).all()
-        assert len(result) == num_runs * 2
-
-        # Verify old records are deleted and only 'num_to_keep' records are kept
-        # For other DBs,an extra query is fired in RenderedTaskInstanceFields.delete_old_records
-        expected_query_count_based_on_db = (
-            expected_query_count + 1
-            if session.bind.dialect.name == "mssql" and expected_query_count != 0
-            else expected_query_count
-        )
-
-        with assert_queries_count(expected_query_count_based_on_db):
-            RTIF.delete_old_records(
-                task_id=mapped.task_id, dag_id=dr.dag_id, num_to_keep=num_to_keep, session=session
-            )
-        result = session.query(RTIF).filter_by(dag_id=dag.dag_id, task_id=mapped.task_id).all()
-        rtif_num_runs = Counter(rtif.run_id for rtif in result)
-        assert len(rtif_num_runs) == remaining_rtifs
-        # Check that we have _all_ the data for each row
-        assert len(result) == remaining_rtifs * 2
+            with assert_queries_count(expected_query_count_based_on_db):
+                RTIF.delete_old_records(
+                    task_id=mapped.task_id, dag_id=dr.dag_id, num_to_keep=num_to_keep, session=session
+                )
+            result = session.query(RTIF).filter_by(dag_id=dag.dag_id, task_id=mapped.task_id).all()
+            rtif_num_runs = Counter(rtif.run_id for rtif in result)
+            assert len(rtif_num_runs) == remaining_rtifs
+            # Check that we have _all_ the data for each row
+            assert len(result) == remaining_rtifs * 2
 
     def test_write(self, dag_maker):
         """
diff --git a/tests/models/test_xcom_arg_map.py b/tests/models/test_xcom_arg_map.py
index 92e14da567688..d512ad445b783 100644
--- a/tests/models/test_xcom_arg_map.py
+++ b/tests/models/test_xcom_arg_map.py
@@ -41,7 +41,7 @@ def pull(value):
     # The function passed to "map" is *NOT* a task.
     assert set(dag.task_dict) == {"push", "pull"}
 
-    dr = dag_maker.create_dagrun()
+    dr = dag_maker.create_dagrun(session=session)
 
     # Run "push".
     decision = dr.task_instance_scheduling_decisions(session=session)
@@ -79,7 +79,7 @@ def c_to_none(v):
 
         pull.expand(value=push().map(c_to_none))
 
-    dr = dag_maker.create_dagrun()
+    dr = dag_maker.create_dagrun(session=session)
 
     # Run "push".
     decision = dr.task_instance_scheduling_decisions(session=session)
@@ -113,7 +113,7 @@ def c_to_none(v):
 
         pull.expand_kwargs(push().map(c_to_none))
 
-    dr = dag_maker.create_dagrun()
+    dr = dag_maker.create_dagrun(session=session)
 
     # Run "push".
     decision = dr.task_instance_scheduling_decisions(session=session)
@@ -158,7 +158,7 @@ def does_not_work_with_c(v):
 
         pull.expand_kwargs(push().map(does_not_work_with_c))
 
-    dr = dag_maker.create_dagrun()
+    dr = dag_maker.create_dagrun(session=session)
 
     # The "push" task should not fail.
     decision = dr.task_instance_scheduling_decisions(session=session)
@@ -211,7 +211,7 @@ def skip_c(v):
 
         collect(value=forward.expand_kwargs(push().map(skip_c)))
 
-    dr = dag_maker.create_dagrun()
+    dr = dag_maker.create_dagrun(session=session)
 
     # Run "push".
     decision = dr.task_instance_scheduling_decisions(session=session)
@@ -246,7 +246,7 @@ def pull(value):
         converted = push().map(lambda v: v * 2).map(lambda v: {"value": v})
         pull.expand_kwargs(converted)
 
-    dr = dag_maker.create_dagrun()
+    dr = dag_maker.create_dagrun(session=session)
 
     # Run "push".
     decision = dr.task_instance_scheduling_decisions(session=session)
@@ -292,7 +292,7 @@ def convert_zipped(zipped):
 
         pull.expand(value=combined.map(convert_zipped))
 
-    dr = dag_maker.create_dagrun()
+    dr = dag_maker.create_dagrun(session=session)
 
     # Run "push_letters" and "push_numbers".
     decision = dr.task_instance_scheduling_decisions(session=session)
diff --git a/tests/operators/test_bash.py b/tests/operators/test_bash.py
index 43d637540947b..3c7c7d4748802 100644
--- a/tests/operators/test_bash.py
+++ b/tests/operators/test_bash.py
@@ -204,7 +204,7 @@ def test_bash_operator_multi_byte_output(self):
     def test_bash_operator_kill(self, dag_maker):
         import psutil
 
-        sleep_time = "100%d" % os.getpid()
+        sleep_time = f"100{os.getpid()}"
         with dag_maker():
             op = BashOperator(
                 task_id="test_bash_operator_kill",
diff --git a/tests/operators/test_python.py b/tests/operators/test_python.py
index 28c70537ae7e4..6a9a4058cee30 100644
--- a/tests/operators/test_python.py
+++ b/tests/operators/test_python.py
@@ -963,7 +963,7 @@ def f():
                 return
             raise Exception
 
-        self.run_as_task(f, python_version=3, use_dill=False, requirements=["dill"])
+        self.run_as_task(f, python_version="3", use_dill=False, requirements=["dill"])
 
     def test_without_dill(self):
         def f(a):
diff --git a/tests/providers/amazon/aws/hooks/test_batch_client.py b/tests/providers/amazon/aws/hooks/test_batch_client.py
index ea04cb2080cc5..e501da3c067d7 100644
--- a/tests/providers/amazon/aws/hooks/test_batch_client.py
+++ b/tests/providers/amazon/aws/hooks/test_batch_client.py
@@ -426,7 +426,7 @@ def test_add_jitter(self):
         assert result >= minima
         assert result <= width
 
-    @mock.patch("airflow.providers.amazon.aws.hooks.batch_client.uniform")
+    @mock.patch("airflow.providers.amazon.aws.hooks.batch_client.random.uniform")
     @mock.patch("airflow.providers.amazon.aws.hooks.batch_client.sleep")
     def test_delay_defaults(self, mock_sleep, mock_uniform):
         assert BatchClientHook.DEFAULT_DELAY_MIN == 1
@@ -438,21 +438,21 @@ def test_delay_defaults(self, mock_sleep, mock_uniform):
         )
         mock_sleep.assert_called_once_with(0)
 
-    @mock.patch("airflow.providers.amazon.aws.hooks.batch_client.uniform")
+    @mock.patch("airflow.providers.amazon.aws.hooks.batch_client.random.uniform")
     @mock.patch("airflow.providers.amazon.aws.hooks.batch_client.sleep")
     def test_delay_with_zero(self, mock_sleep, mock_uniform):
         self.batch_client.delay(0)
         mock_uniform.assert_called_once_with(0, 1)  # in add_jitter
         mock_sleep.assert_called_once_with(mock_uniform.return_value)
 
-    @mock.patch("airflow.providers.amazon.aws.hooks.batch_client.uniform")
+    @mock.patch("airflow.providers.amazon.aws.hooks.batch_client.random.uniform")
     @mock.patch("airflow.providers.amazon.aws.hooks.batch_client.sleep")
     def test_delay_with_int(self, mock_sleep, mock_uniform):
         self.batch_client.delay(5)
         mock_uniform.assert_called_once_with(4, 6)  # in add_jitter
         mock_sleep.assert_called_once_with(mock_uniform.return_value)
 
-    @mock.patch("airflow.providers.amazon.aws.hooks.batch_client.uniform")
+    @mock.patch("airflow.providers.amazon.aws.hooks.batch_client.random.uniform")
     @mock.patch("airflow.providers.amazon.aws.hooks.batch_client.sleep")
     def test_delay_with_float(self, mock_sleep, mock_uniform):
         self.batch_client.delay(5.0)
diff --git a/tests/providers/amazon/aws/hooks/test_eks.py b/tests/providers/amazon/aws/hooks/test_eks.py
index ae9c6c59d555d..e91c54bae9a88 100644
--- a/tests/providers/amazon/aws/hooks/test_eks.py
+++ b/tests/providers/amazon/aws/hooks/test_eks.py
@@ -1166,15 +1166,15 @@ def test_create_fargate_selectors(self, cluster_builder, selectors, expected_mes
 
         test_inputs = dict(
             deepcopy(
-                # Required Constants
-                [POD_EXECUTION_ROLE_ARN]
-                # Required Variables
-                + [
+                [
+                    # Required Constants
+                    POD_EXECUTION_ROLE_ARN,
+                    # Required Variables
                     (ClusterAttributes.CLUSTER_NAME, cluster_name),
                     (FargateProfileAttributes.FARGATE_PROFILE_NAME, fargate_profile_name),
+                    # Test Case Values
+                    (FargateProfileAttributes.SELECTORS, selectors),
                 ]
-                # Test Case Values
-                + [(FargateProfileAttributes.SELECTORS, selectors)]
             )
         )
 
diff --git a/tests/providers/amazon/aws/secrets/test_systems_manager.py b/tests/providers/amazon/aws/secrets/test_systems_manager.py
index 9b303a14e1ae2..1f40b560b3462 100644
--- a/tests/providers/amazon/aws/secrets/test_systems_manager.py
+++ b/tests/providers/amazon/aws/secrets/test_systems_manager.py
@@ -157,11 +157,11 @@ def test_get_variable_non_existent_key(self):
     @mock.patch("airflow.providers.amazon.aws.hooks.base_aws.SessionFactory")
     def test_passing_client_kwargs(self, mock_session_factory):
         backends = initialize_secrets_backends()
-        systems_manager = [
+        systems_manager = next(
             backend
             for backend in backends
             if backend.__class__.__name__ == "SystemsManagerParameterStoreBackend"
-        ][0]
+        )
 
         # Mock SessionFactory, session and client
         mock_session_factory_instance = mock_session_factory.return_value
diff --git a/tests/providers/amazon/aws/utils/eks_test_utils.py b/tests/providers/amazon/aws/utils/eks_test_utils.py
index ffab5d7fbfc38..7a403eb855740 100644
--- a/tests/providers/amazon/aws/utils/eks_test_utils.py
+++ b/tests/providers/amazon/aws/utils/eks_test_utils.py
@@ -92,7 +92,7 @@ def generate_clusters(eks_hook: EksHook, num_clusters: int, minimal: bool) -> li
     """
     # Generates N clusters named cluster0, cluster1, .., clusterN
     return [
-        eks_hook.create_cluster(name=f"cluster{str(count)}", **_input_builder(ClusterInputs, minimal))[
+        eks_hook.create_cluster(name=f"cluster{count}", **_input_builder(ClusterInputs, minimal))[
             ResponseAttributes.CLUSTER
         ][ClusterAttributes.NAME]
         for count in range(num_clusters)
@@ -114,7 +114,7 @@ def generate_fargate_profiles(
     # Generates N Fargate profiles named profile0, profile1, .., profileN
     return [
         eks_hook.create_fargate_profile(
-            fargateProfileName=f"profile{str(count)}",
+            fargateProfileName=f"profile{count}",
             clusterName=cluster_name,
             **_input_builder(FargateProfileInputs, minimal),
         )[ResponseAttributes.FARGATE_PROFILE][FargateProfileAttributes.FARGATE_PROFILE_NAME]
@@ -137,7 +137,7 @@ def generate_nodegroups(
     # Generates N nodegroups named nodegroup0, nodegroup1, .., nodegroupN
     return [
         eks_hook.create_nodegroup(
-            nodegroupName=f"nodegroup{str(count)}",
+            nodegroupName=f"nodegroup{count}",
             clusterName=cluster_name,
             **_input_builder(NodegroupInputs, minimal),
         )[ResponseAttributes.NODEGROUP][NodegroupAttributes.NODEGROUP_NAME]
@@ -235,7 +235,7 @@ def convert_keys(original: dict) -> dict:
 
 
 def iso_date(input_datetime: datetime.datetime) -> str:
-    return input_datetime.strftime("%Y-%m-%dT%H:%M:%S") + "Z"
+    return f"{input_datetime:%Y-%m-%dT%H:%M:%S}Z"
 
 
 def generate_dict(prefix, count) -> dict:
diff --git a/tests/providers/apache/kylin/operators/test_kylin_cube.py b/tests/providers/apache/kylin/operators/test_kylin_cube.py
index baa61ad80fc4a..58c1832a0cdd6 100644
--- a/tests/providers/apache/kylin/operators/test_kylin_cube.py
+++ b/tests/providers/apache/kylin/operators/test_kylin_cube.py
@@ -37,8 +37,8 @@ class TestKylinCubeOperator:
         "project": "learn_kylin",
         "cube": "kylin_sales_cube",
         "command": "build",
-        "start_time": datetime(2012, 1, 2, 0, 0).strftime("%s") + "000",
-        "end_time": datetime(2012, 1, 3, 0, 0).strftime("%s") + "000",
+        "start_time": str(int(datetime(2012, 1, 2, 0, 0).timestamp() * 1000)),
+        "end_time": str(int(datetime(2012, 1, 3, 0, 0).timestamp() * 1000)),
     }
     cube_command = [
         "fullbuild",
diff --git a/tests/providers/cncf/kubernetes/executors/test_kubernetes_executor.py b/tests/providers/cncf/kubernetes/executors/test_kubernetes_executor.py
index f0d77d5c18c70..14b69f707595e 100644
--- a/tests/providers/cncf/kubernetes/executors/test_kubernetes_executor.py
+++ b/tests/providers/cncf/kubernetes/executors/test_kubernetes_executor.py
@@ -92,7 +92,7 @@ def _cases(self):
     @staticmethod
     def _is_valid_pod_id(name):
         regex = r"^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$"
-        return len(name) <= 253 and all(ch.lower() == ch for ch in name) and re.match(regex, name)
+        return len(name) <= 253 and name.islower() and re.match(regex, name)
 
     @staticmethod
     def _is_safe_label_value(value):
@@ -437,7 +437,7 @@ def test_invalid_executor_config(self, mock_get_kube_client, mock_kubernetes_job
                 ),
             )
 
-            assert list(executor.event_buffer.values())[0][1] == "Invalid executor_config passed"
+            assert next(iter(executor.event_buffer.values()))[1] == "Invalid executor_config passed"
         finally:
             executor.end()
 
diff --git a/tests/providers/cncf/kubernetes/models/test_secret.py b/tests/providers/cncf/kubernetes/models/test_secret.py
index d6b8a38c2d16e..556a5cc30a7f2 100644
--- a/tests/providers/cncf/kubernetes/models/test_secret.py
+++ b/tests/providers/cncf/kubernetes/models/test_secret.py
@@ -113,7 +113,7 @@ def test_attach_to_pod(self, mock_rand_str, mock_uuid):
                         "volumeMounts": [
                             {
                                 "mountPath": "/etc/foo",
-                                "name": "secretvol" + str(static_uuid),
+                                "name": f"secretvol{static_uuid}",
                                 "readOnly": True,
                             },
                         ],
@@ -123,7 +123,7 @@ def test_attach_to_pod(self, mock_rand_str, mock_uuid):
                 "imagePullSecrets": [{"name": "pull_secret_a"}, {"name": "pull_secret_b"}],
                 "securityContext": {"fsGroup": 2000, "runAsUser": 1000},
                 "volumes": [
-                    {"name": "secretvol" + str(static_uuid), "secret": {"secretName": "secret_b"}},
+                    {"name": f"secretvol{static_uuid}", "secret": {"secretName": "secret_b"}},
                 ],
             },
         }
diff --git a/tests/providers/cncf/kubernetes/test_pod_generator.py b/tests/providers/cncf/kubernetes/test_pod_generator.py
index 0945d87e4e574..bf12a4a3fdfaf 100644
--- a/tests/providers/cncf/kubernetes/test_pod_generator.py
+++ b/tests/providers/cncf/kubernetes/test_pod_generator.py
@@ -818,7 +818,8 @@ def test_build_labels_for_k8s_executor_pod(self, extra, extra_expected):
         )
         labels = PodGenerator.build_labels_for_k8s_executor_pod(**kwargs, **extra)
         assert labels == {**expected, **extra_expected}
-        exp_selector = ",".join([f"{k}={v}" for k, v in sorted(labels.items())])
+        items = [f"{k}={v}" for k, v in sorted(labels.items())]
         if "airflow_worker" not in extra:
-            exp_selector += ",airflow-worker"
+            items.append("airflow-worker")
+        exp_selector = ",".join(items)
         assert PodGenerator.build_selector_for_k8s_executor_pod(**kwargs, **extra) == exp_selector
diff --git a/tests/providers/elasticsearch/log/elasticmock/utilities/__init__.py b/tests/providers/elasticsearch/log/elasticmock/utilities/__init__.py
index cb2d91f4ce61b..e145b81818ddd 100644
--- a/tests/providers/elasticsearch/log/elasticmock/utilities/__init__.py
+++ b/tests/providers/elasticsearch/log/elasticmock/utilities/__init__.py
@@ -54,7 +54,7 @@
 
 def get_random_id(size=DEFAULT_ELASTICSEARCH_ID_SIZE):
     """Returns random if for elasticsearch"""
-    return "".join(random.choice(CHARSET_FOR_ELASTICSEARCH_ID) for _ in range(size))
+    return "".join(random.choices(CHARSET_FOR_ELASTICSEARCH_ID, k=size))
 
 
 def query_params(*es_query_params, **kwargs):
diff --git a/tests/providers/google/cloud/operators/test_bigquery.py b/tests/providers/google/cloud/operators/test_bigquery.py
index d17f5498e27c6..3a68b3dad8a70 100644
--- a/tests/providers/google/cloud/operators/test_bigquery.py
+++ b/tests/providers/google/cloud/operators/test_bigquery.py
@@ -685,7 +685,7 @@ def test_bigquery_operator_extra_serialized_field_when_single_query(
         ]
 
         # Check DeSerialized version of operator link
-        assert isinstance(list(simple_task.operator_extra_links)[0], BigQueryConsoleLink)
+        assert isinstance(next(iter(simple_task.operator_extra_links)), BigQueryConsoleLink)
 
         ti.xcom_push("job_id_path", TEST_FULL_JOB_ID)
 
@@ -723,7 +723,7 @@ def test_bigquery_operator_extra_serialized_field_when_multiple_queries(
         ]
 
         # Check DeSerialized version of operator link
-        assert isinstance(list(simple_task.operator_extra_links)[0], BigQueryConsoleIndexableLink)
+        assert isinstance(next(iter(simple_task.operator_extra_links)), BigQueryConsoleIndexableLink)
 
         ti.xcom_push(key="job_id_path", value=[TEST_FULL_JOB_ID, TEST_FULL_JOB_ID_2])
 
diff --git a/tests/providers/google/cloud/operators/test_datafusion.py b/tests/providers/google/cloud/operators/test_datafusion.py
index 2950fceb7d78c..fd5ed2d648dd4 100644
--- a/tests/providers/google/cloud/operators/test_datafusion.py
+++ b/tests/providers/google/cloud/operators/test_datafusion.py
@@ -238,7 +238,7 @@ def test_execute_check_hook_call_should_execute_successfully(self, mock_hook):
         )
 
         mock_hook.return_value.wait_for_pipeline_state.assert_called_once_with(
-            success_states=SUCCESS_STATES + [PipelineStates.RUNNING],
+            success_states=[*SUCCESS_STATES, PipelineStates.RUNNING],
             pipeline_id=PIPELINE_ID,
             pipeline_name=PIPELINE_NAME,
             namespace=NAMESPACE,
diff --git a/tests/providers/google/cloud/operators/test_dataprep_system.py b/tests/providers/google/cloud/operators/test_dataprep_system.py
index f2838efb8eda8..fcba01fe599cc 100644
--- a/tests/providers/google/cloud/operators/test_dataprep_system.py
+++ b/tests/providers/google/cloud/operators/test_dataprep_system.py
@@ -18,7 +18,7 @@
 from __future__ import annotations
 
 import json
-from os import environ
+import os
 
 import pytest
 
@@ -27,7 +27,7 @@
 from tests.test_utils.db import clear_db_connections
 from tests.test_utils.gcp_system_helpers import CLOUD_DAG_FOLDER, GoogleSystemTest
 
-TOKEN = environ.get("DATAPREP_TOKEN")
+TOKEN = os.environ.get("DATAPREP_TOKEN")
 EXTRA = {"token": TOKEN}
 
 
diff --git a/tests/providers/google/cloud/operators/test_dataproc.py b/tests/providers/google/cloud/operators/test_dataproc.py
index 38e4ffeef5fdf..5896a634d4b2f 100644
--- a/tests/providers/google/cloud/operators/test_dataproc.py
+++ b/tests/providers/google/cloud/operators/test_dataproc.py
@@ -461,7 +461,8 @@ def test_execute(self, mock_hook, to_dict_mock):
             "labels": LABELS,
             "virtual_cluster_config": None,
         }
-        expected_calls = self.extra_links_expected_calls_base + [
+        expected_calls = [
+            *self.extra_links_expected_calls_base,
             call.hook().create_cluster(**create_cluster_args),
         ]
 
@@ -510,7 +511,8 @@ def test_execute_in_gke(self, mock_hook, to_dict_mock):
             "labels": LABELS,
             "virtual_cluster_config": VIRTUAL_CLUSTER_CONFIG,
         }
-        expected_calls = self.extra_links_expected_calls_base + [
+        expected_calls = [
+            *self.extra_links_expected_calls_base,
             call.hook().create_cluster(**create_cluster_args),
         ]
 
@@ -784,8 +786,9 @@ def test_execute(self, mock_hook):
             "graceful_decommission_timeout": {"seconds": 600},
             "update_mask": UPDATE_MASK,
         }
-        expected_calls = self.extra_links_expected_calls_base + [
-            call.hook().update_cluster(**update_cluster_args)
+        expected_calls = [
+            *self.extra_links_expected_calls_base,
+            call.hook().update_cluster(**update_cluster_args),
         ]
 
         op = DataprocScaleClusterOperator(
@@ -1224,8 +1227,9 @@ def test_execute(self, mock_hook):
             "timeout": TIMEOUT,
             "metadata": METADATA,
         }
-        expected_calls = self.extra_links_expected_calls_base + [
-            call.hook().update_cluster(**update_cluster_args)
+        expected_calls = [
+            *self.extra_links_expected_calls_base,
+            call.hook().update_cluster(**update_cluster_args),
         ]
 
         op = DataprocUpdateClusterOperator(
diff --git a/tests/providers/http/sensors/test_http.py b/tests/providers/http/sensors/test_http.py
index da070d91c2a93..b2fe5921a0a84 100644
--- a/tests/providers/http/sensors/test_http.py
+++ b/tests/providers/http/sensors/test_http.py
@@ -244,9 +244,7 @@ def test_sensor(self):
             endpoint="/search",
             request_params={"client": "ubuntu", "q": "airflow", "date": "{{ds}}"},
             headers={},
-            response_check=lambda response: (
-                "apache/airflow/" + DEFAULT_DATE.strftime("%Y-%m-%d") in response.text
-            ),
+            response_check=lambda response: f"apache/airflow/{DEFAULT_DATE:%Y-%m-%d}" in response.text,
             poke_interval=5,
             timeout=15,
             dag=self.dag,
diff --git a/tests/providers/microsoft/azure/hooks/test_asb.py b/tests/providers/microsoft/azure/hooks/test_asb.py
index 61ce05a0b90b2..a9a3851561623 100644
--- a/tests/providers/microsoft/azure/hooks/test_asb.py
+++ b/tests/providers/microsoft/azure/hooks/test_asb.py
@@ -30,7 +30,7 @@
 from airflow.providers.microsoft.azure.hooks.asb import AdminClientHook, MessageHook
 
 MESSAGE = "Test Message"
-MESSAGE_LIST = [MESSAGE + " " + str(n) for n in range(0, 10)]
+MESSAGE_LIST = [f"{MESSAGE} {n}" for n in range(0, 10)]
 
 
 class TestAdminClientHook:
diff --git a/tests/providers/oracle/operators/test_oracle.py b/tests/providers/oracle/operators/test_oracle.py
index e23f2c663fe14..f4311362b0cf1 100644
--- a/tests/providers/oracle/operators/test_oracle.py
+++ b/tests/providers/oracle/operators/test_oracle.py
@@ -16,8 +16,8 @@
 # under the License.
 from __future__ import annotations
 
+import random
 import re
-from random import randrange
 from unittest import mock
 
 import oracledb
@@ -90,7 +90,7 @@ def test_push_oracle_exit_to_xcom(self, mock_callproc, request, dag_maker):
         oracle_conn_id = "oracle_default"
         parameters = {"parameter": "value"}
         task_id = "test_push"
-        ora_exit_code = "%05d" % randrange(10**5)
+        ora_exit_code = f"{random.randrange(10**5):05}"
         error = f"ORA-{ora_exit_code}: This is a five-digit ORA error code"
         mock_callproc.side_effect = oracledb.DatabaseError(error)
 
diff --git a/tests/providers/ssh/hooks/test_ssh.py b/tests/providers/ssh/hooks/test_ssh.py
index d735092bbe5f6..352b6692dad41 100644
--- a/tests/providers/ssh/hooks/test_ssh.py
+++ b/tests/providers/ssh/hooks/test_ssh.py
@@ -77,7 +77,7 @@ def generate_host_key(pkey: paramiko.PKey):
 TEST_CMD_TIMEOUT_NOT_SET = "NOT SET"
 TEST_CMD_TIMEOUT_EXTRA = 15
 
-PASSPHRASE = "".join(random.choice(string.ascii_letters) for i in range(10))
+PASSPHRASE = "".join(random.choices(string.ascii_letters, k=10))
 TEST_ENCRYPTED_PRIVATE_KEY = generate_key_string(pkey=TEST_PKEY, passphrase=PASSPHRASE)
 
 TEST_DISABLED_ALGORITHMS = {"pubkeys": ["rsa-sha2-256", "rsa-sha2-512"]}
diff --git a/tests/providers/ssh/operators/test_ssh.py b/tests/providers/ssh/operators/test_ssh.py
index 866cf5b96b881..401dc38dd571e 100644
--- a/tests/providers/ssh/operators/test_ssh.py
+++ b/tests/providers/ssh/operators/test_ssh.py
@@ -17,7 +17,7 @@
 # under the License.
 from __future__ import annotations
 
-from random import randrange
+import random
 from unittest import mock
 
 import pytest
@@ -217,7 +217,7 @@ def test_command_errored(self):
     def test_push_ssh_exit_to_xcom(self, request, dag_maker):
         # Test pulls the value previously pushed to xcom and checks if it's the same
         command = "not_a_real_command"
-        ssh_exit_code = randrange(1, 100)
+        ssh_exit_code = random.randrange(1, 100)
         self.exec_ssh_client_command.return_value = (ssh_exit_code, b"", b"ssh output")
 
         with dag_maker(dag_id=f"dag_{request.node.name}"):
diff --git a/tests/sensors/test_external_task_sensor.py b/tests/sensors/test_external_task_sensor.py
index 4422cbe48c87f..1cc5f200b1dc0 100644
--- a/tests/sensors/test_external_task_sensor.py
+++ b/tests/sensors/test_external_task_sensor.py
@@ -1344,7 +1344,7 @@ def dag_bag_multiple():
             task_id=f"{daily_task.task_id}_{i}",
             external_dag_id=daily_dag.dag_id,
             external_task_id=daily_task.task_id,
-            execution_date="{{ macros.ds_add(ds, -1 * %s) }}" % i,
+            execution_date=f"{{{{ macros.ds_add(ds, -1 * {i}) }}}}",
             dag=agg_dag,
         )
         begin >> task
diff --git a/tests/serialization/serializers/test_serializers.py b/tests/serialization/serializers/test_serializers.py
index e9805d4d777ff..4e7b26788409b 100644
--- a/tests/serialization/serializers/test_serializers.py
+++ b/tests/serialization/serializers/test_serializers.py
@@ -23,16 +23,22 @@
 import pandas as pd
 import pendulum.tz
 import pytest
+from dateutil.tz import tzutc
 from pendulum import DateTime
 
+from airflow import PY39
 from airflow.models.param import Param, ParamsDict
 from airflow.serialization.serde import DATA, deserialize, serialize
 
+if PY39:
+    from zoneinfo import ZoneInfo
+else:
+    from backports.zoneinfo import ZoneInfo
+
 
 class TestSerializers:
     def test_datetime(self):
         i = datetime.datetime(2022, 7, 10, 22, 10, 43, microsecond=0, tzinfo=pendulum.tz.UTC)
-
         s = serialize(i)
         d = deserialize(s)
         assert i.timestamp() == d.timestamp()
@@ -52,6 +58,76 @@ def test_datetime(self):
         d = deserialize(s)
         assert i == d
 
+        i = datetime.datetime(
+            2022, 7, 10, 22, 10, 43, microsecond=0, tzinfo=pendulum.timezone("America/New_York")
+        )
+        s = serialize(i)
+        d = deserialize(s)
+        assert i.timestamp() == d.timestamp()
+
+        i = DateTime(2022, 7, 10, tzinfo=pendulum.timezone("America/New_York"))
+        s = serialize(i)
+        d = deserialize(s)
+        assert i.timestamp() == d.timestamp()
+
+        i = DateTime(2022, 7, 10, tzinfo=tzutc())
+        s = serialize(i)
+        d = deserialize(s)
+        assert i.timestamp() == d.timestamp()
+
+        i = DateTime(2022, 7, 10, tzinfo=ZoneInfo("Europe/Paris"))
+        s = serialize(i)
+        d = deserialize(s)
+        assert i.timestamp() == d.timestamp()
+
+    def test_deserialize_datetime_v1(self):
+        s = {
+            "__classname__": "pendulum.datetime.DateTime",
+            "__version__": 1,
+            "__data__": {"timestamp": 1657505443.0, "tz": "UTC"},
+        }
+        d = deserialize(s)
+        assert d.timestamp() == 1657505443.0
+        assert d.tzinfo.name == "UTC"
+
+        s["__data__"]["tz"] = "Europe/Paris"
+        d = deserialize(s)
+        assert d.timestamp() == 1657505443.0
+        assert d.tzinfo.name == "Europe/Paris"
+
+        s["__data__"]["tz"] = "America/New_York"
+        d = deserialize(s)
+        assert d.timestamp() == 1657505443.0
+        assert d.tzinfo.name == "America/New_York"
+
+        s["__data__"]["tz"] = "EDT"
+        d = deserialize(s)
+        assert d.timestamp() == 1657505443.0
+        assert d.tzinfo.name == "-04:00"
+        # assert that it's serializable with the new format
+        assert deserialize(serialize(d)) == d
+
+        s["__data__"]["tz"] = "CDT"
+        d = deserialize(s)
+        assert d.timestamp() == 1657505443.0
+        assert d.tzinfo.name == "-05:00"
+        # assert that it's serializable with the new format
+        assert deserialize(serialize(d)) == d
+
+        s["__data__"]["tz"] = "MDT"
+        d = deserialize(s)
+        assert d.timestamp() == 1657505443.0
+        assert d.tzinfo.name == "-06:00"
+        # assert that it's serializable with the new format
+        assert deserialize(serialize(d)) == d
+
+        s["__data__"]["tz"] = "PDT"
+        d = deserialize(s)
+        assert d.timestamp() == 1657505443.0
+        assert d.tzinfo.name == "-07:00"
+        # assert that it's serializable with the new format
+        assert deserialize(serialize(d)) == d
+
     @pytest.mark.parametrize(
         "expr, expected",
         [("1", "1"), ("52e4", "520000"), ("2e0", "2"), ("12e-2", "0.12"), ("12.34", "12.34")],
diff --git a/tests/serialization/test_dag_serialization.py b/tests/serialization/test_dag_serialization.py
index 5338579e01044..425751da9aaf4 100644
--- a/tests/serialization/test_dag_serialization.py
+++ b/tests/serialization/test_dag_serialization.py
@@ -427,6 +427,15 @@ def test_dag_serialization_to_timetable(self, timetable, serialized_timetable):
                 print(task["task_id"], k, v)
         assert actual == expected
 
+    def test_dag_serialization_preserves_empty_access_roles(self):
+        """Verify that an explicitly empty access_control dict is preserved."""
+        dag = collect_dags(["airflow/example_dags"])["simple_dag"]
+        dag.access_control = {}
+        serialized_dag = SerializedDAG.to_dict(dag)
+        SerializedDAG.validate_schema(serialized_dag)
+
+        assert serialized_dag["dag"]["_access_control"] == {"__type": "dict", "__var": {}}
+
     def test_dag_serialization_unregistered_custom_timetable(self):
         """Verify serialization fails without timetable registration."""
         dag = get_timetable_based_simple_dag(CustomSerializationTimetable("bar"))
@@ -1472,7 +1481,7 @@ class DummyTriggerRule(BaseTIDep):
             pass
 
         class DummyTask(BaseOperator):
-            deps = frozenset(list(BaseOperator.deps) + [DummyTriggerRule()])
+            deps = frozenset([*BaseOperator.deps, DummyTriggerRule()])
 
         execution_date = datetime(2020, 1, 1)
         with DAG(dag_id="test_error_on_unregistered_ti_dep_serialization", start_date=execution_date) as dag:
@@ -1499,7 +1508,7 @@ def test_serialize_and_deserialize_custom_ti_deps(self):
         from test_plugin import CustomTestTriggerRule
 
         class DummyTask(BaseOperator):
-            deps = frozenset(list(BaseOperator.deps) + [CustomTestTriggerRule()])
+            deps = frozenset([*BaseOperator.deps, CustomTestTriggerRule()])
 
         execution_date = datetime(2020, 1, 1)
         with DAG(dag_id="test_serialize_custom_ti_deps", start_date=execution_date) as dag:
diff --git a/tests/system/providers/amazon/aws/example_google_api_sheets_to_s3.py b/tests/system/providers/amazon/aws/example_google_api_sheets_to_s3.py
index 926ab55f8f0c3..b8c5c5f69591b 100644
--- a/tests/system/providers/amazon/aws/example_google_api_sheets_to_s3.py
+++ b/tests/system/providers/amazon/aws/example_google_api_sheets_to_s3.py
@@ -20,8 +20,8 @@
 """
 from __future__ import annotations
 
+import os
 from datetime import datetime
-from os import getenv
 
 from airflow import DAG
 from airflow.models.baseoperator import chain
@@ -34,9 +34,9 @@
 
 DAG_ID = "example_google_api_sheets_to_s3"
 
-GOOGLE_SHEET_ID = getenv("GOOGLE_SHEET_ID", "test-google-sheet-id")
-GOOGLE_SHEET_RANGE = getenv("GOOGLE_SHEET_RANGE", "test-google-sheet-range")
-S3_DESTINATION_KEY = getenv("S3_DESTINATION_KEY", "s3://test-bucket/key.json")
+GOOGLE_SHEET_ID = os.getenv("GOOGLE_SHEET_ID", "test-google-sheet-id")
+GOOGLE_SHEET_RANGE = os.getenv("GOOGLE_SHEET_RANGE", "test-google-sheet-range")
+S3_DESTINATION_KEY = os.getenv("S3_DESTINATION_KEY", "s3://test-bucket/key.json")
 
 with DAG(
     dag_id=DAG_ID,
diff --git a/tests/system/providers/amazon/aws/utils/__init__.py b/tests/system/providers/amazon/aws/utils/__init__.py
index f7dd65fdfd363..819d21549a0df 100644
--- a/tests/system/providers/amazon/aws/utils/__init__.py
+++ b/tests/system/providers/amazon/aws/utils/__init__.py
@@ -20,7 +20,7 @@
 import json
 import logging
 import os
-from os.path import basename, splitext
+from pathlib import Path
 from time import sleep
 from uuid import uuid4
 
@@ -64,10 +64,10 @@ def _get_test_name() -> str:
     """
     # The exact layer of the stack will depend on if this is called directly
     # or from another helper, but the test will always contain the identifier.
-    test_filename: str = [
+    test_filename: str = next(
         frame.filename for frame in inspect.stack() if TEST_FILE_IDENTIFIER in frame.filename
-    ][0]
-    return splitext(basename(test_filename))[0]
+    )
+    return Path(test_filename).stem
 
 
 def _validate_env_id(env_id: str) -> str:
diff --git a/tests/system/providers/apache/kafka/example_dag_event_listener.py b/tests/system/providers/apache/kafka/example_dag_event_listener.py
index f7023ec4e2f6e..e42f28eb7284c 100644
--- a/tests/system/providers/apache/kafka/example_dag_event_listener.py
+++ b/tests/system/providers/apache/kafka/example_dag_event_listener.py
@@ -69,8 +69,7 @@ def _producer_function():
 
 
 def _generate_uuid():
-    letters = string.ascii_lowercase
-    return "".join(random.choice(letters) for i in range(6))
+    return "".join(random.choices(string.ascii_lowercase, k=6))
 
 
 with DAG(
diff --git a/tests/system/providers/github/example_github.py b/tests/system/providers/github/example_github.py
index a791a5bd71010..658fcc470f0a6 100644
--- a/tests/system/providers/github/example_github.py
+++ b/tests/system/providers/github/example_github.py
@@ -61,9 +61,9 @@ def tag_checker(repo: Any, tag_name: str) -> bool | None:
                 result = tag_name in all_tags
 
         except GithubException as github_error:  # type: ignore[misc]
-            raise AirflowException(f"Failed to execute GithubSensor, error: {str(github_error)}")
+            raise AirflowException(f"Failed to execute GithubSensor, error: {github_error}")
         except Exception as e:
-            raise AirflowException(f"GitHub operator error: {str(e)}")
+            raise AirflowException(f"GitHub operator error: {e}")
         return result
 
     github_sensor = GithubSensor(
diff --git a/tests/system/providers/google/cloud/dataplex/resources/spark_example_pi.py b/tests/system/providers/google/cloud/dataplex/resources/spark_example_pi.py
index 77a7cb9e6ca41..be477d202adc7 100644
--- a/tests/system/providers/google/cloud/dataplex/resources/spark_example_pi.py
+++ b/tests/system/providers/google/cloud/dataplex/resources/spark_example_pi.py
@@ -17,9 +17,9 @@
 
 from __future__ import annotations
 
+import random
 import sys
 from operator import add
-from random import random
 
 from pyspark.sql import SparkSession
 
@@ -33,8 +33,8 @@
     n = 100000 * partitions
 
     def f(_: int) -> float:
-        x = random() * 2 - 1
-        y = random() * 2 - 1
+        x = random.random() * 2 - 1
+        y = random.random() * 2 - 1
         return 1 if x**2 + y**2 <= 1 else 0
 
     count = spark.sparkContext.parallelize(range(1, n + 1), partitions).map(f).reduce(add)
diff --git a/tests/system/providers/microsoft/azure/example_azure_service_bus.py b/tests/system/providers/microsoft/azure/example_azure_service_bus.py
index 7c4a99786d820..1507e6281e2de 100644
--- a/tests/system/providers/microsoft/azure/example_azure_service_bus.py
+++ b/tests/system/providers/microsoft/azure/example_azure_service_bus.py
@@ -45,7 +45,7 @@
 CLIENT_ID = os.getenv("CLIENT_ID", "")
 QUEUE_NAME = "sb_mgmt_queue_test"
 MESSAGE = "Test Message"
-MESSAGE_LIST = [MESSAGE + " " + str(n) for n in range(0, 10)]
+MESSAGE_LIST = [f"{MESSAGE} {n}" for n in range(0, 10)]
 TOPIC_NAME = "sb_mgmt_topic_test"
 SUBSCRIPTION_NAME = "sb_mgmt_subscription"
 
diff --git a/tests/test_utils/azure_system_helpers.py b/tests/test_utils/azure_system_helpers.py
index a4d0dfa05f4d7..85c700537a27d 100644
--- a/tests/test_utils/azure_system_helpers.py
+++ b/tests/test_utils/azure_system_helpers.py
@@ -146,7 +146,7 @@ def prepare_share(cls, share_name: str, azure_fileshare_conn_id: str, file_name:
         cls.create_directory(
             share_name=share_name, azure_fileshare_conn_id=azure_fileshare_conn_id, directory=directory
         )
-        string_data = "".join(random.choice(string.ascii_letters) for _ in range(1024))
+        string_data = "".join(random.choices(string.ascii_letters, k=1024))
         cls.upload_file_from_string(
             string_data=string_data,
             share_name=share_name,
diff --git a/tests/test_utils/terraform.py b/tests/test_utils/terraform.py
index 265b8c11ea771..bbb68b60c1a8b 100644
--- a/tests/test_utils/terraform.py
+++ b/tests/test_utils/terraform.py
@@ -28,7 +28,7 @@ def setup_method(self) -> None:
         self.execute_cmd(["terraform", "apply", "-input=false", "-auto-approve", self.TERRAFORM_DIR])
 
     def get_tf_output(self, name):
-        return self.check_output(["terraform", "output", name]).decode("utf-8").replace("\r\n", "")
+        return "".join(self.check_output(["terraform", "output", name]).decode("utf-8").splitlines())
 
     def teardown_method(self) -> None:
         self.execute_cmd(["terraform", "plan", "-destroy", "-input=false", self.TERRAFORM_DIR])
diff --git a/tests/utils/test_db.py b/tests/utils/test_db.py
index 915e4b52388a5..aa4ad1d89dedb 100644
--- a/tests/utils/test_db.py
+++ b/tests/utils/test_db.py
@@ -31,13 +31,15 @@
 from alembic.migration import MigrationContext
 from alembic.runtime.environment import EnvironmentContext
 from alembic.script import ScriptDirectory
-from sqlalchemy import MetaData
+from sqlalchemy import MetaData, Table
+from sqlalchemy.sql import Select
 
 from airflow.exceptions import AirflowException
 from airflow.models import Base as airflow_base
 from airflow.settings import engine
 from airflow.utils.db import (
     _get_alembic_config,
+    check_bad_references,
     check_migrations,
     compare_server_default,
     compare_type,
@@ -49,6 +51,7 @@
     resetdb,
     upgradedb,
 )
+from airflow.utils.session import NEW_SESSION
 
 
 class TestDb:
@@ -57,7 +60,7 @@ def test_database_schema_and_sqlalchemy_model_are_in_sync(self):
 
         airflow.models.import_all_models()
         all_meta_data = MetaData()
-        for (table_name, table) in airflow_base.metadata.tables.items():
+        for table_name, table in airflow_base.metadata.tables.items():
             all_meta_data._add_table(table_name, table.schema, table)
 
         # create diff between database schema and SQLAlchemy model
@@ -251,3 +254,82 @@ def test_alembic_configuration(self):
         import airflow
 
         assert config.config_file_name == os.path.join(os.path.dirname(airflow.__file__), "alembic.ini")
+
+    @mock.patch("airflow.utils.db._move_dangling_data_to_new_table")
+    @mock.patch("airflow.utils.db.get_query_count")
+    @mock.patch("airflow.utils.db._dangling_against_task_instance")
+    @mock.patch("airflow.utils.db._dangling_against_dag_run")
+    @mock.patch("airflow.utils.db.reflect_tables")
+    @mock.patch("airflow.utils.db.inspect")
+    def test_check_bad_references(
+        self,
+        mock_inspect: MagicMock,
+        mock_reflect_tables: MagicMock,
+        mock_dangling_against_dag_run: MagicMock,
+        mock_dangling_against_task_instance: MagicMock,
+        mock_get_query_count: MagicMock,
+        mock_move_dangling_data_to_new_table: MagicMock,
+    ):
+        from airflow.models.dagrun import DagRun
+        from airflow.models.renderedtifields import RenderedTaskInstanceFields
+        from airflow.models.taskfail import TaskFail
+        from airflow.models.taskinstance import TaskInstance
+        from airflow.models.taskreschedule import TaskReschedule
+        from airflow.models.xcom import XCom
+
+        mock_session = MagicMock(spec=NEW_SESSION)
+        mock_bind = MagicMock()
+        mock_session.get_bind.return_value = mock_bind
+        task_instance_table = MagicMock(spec=Table)
+        task_instance_table.name = TaskInstance.__tablename__
+        dag_run_table = MagicMock(spec=Table)
+        task_fail_table = MagicMock(spec=Table)
+        task_fail_table.name = TaskFail.__tablename__
+
+        mock_reflect_tables.return_value = MagicMock(
+            tables={
+                DagRun.__tablename__: dag_run_table,
+                TaskInstance.__tablename__: task_instance_table,
+                TaskFail.__tablename__: task_fail_table,
+            }
+        )
+
+        # Simulate that there is a moved `task_instance` table from the
+        # previous run, but no moved `task_fail` table
+        dangling_task_instance_table_name = f"_airflow_moved__2_2__dangling__{task_instance_table.name}"
+        dangling_task_fail_table_name = f"_airflow_moved__2_3__dangling__{task_fail_table.name}"
+        mock_get_table_names = MagicMock(
+            return_value=[
+                TaskInstance.__tablename__,
+                DagRun.__tablename__,
+                TaskFail.__tablename__,
+                dangling_task_instance_table_name,
+            ]
+        )
+        mock_inspect.return_value = MagicMock(
+            get_table_names=mock_get_table_names,
+        )
+        mock_select = MagicMock(spec=Select)
+        mock_dangling_against_dag_run.return_value = mock_select
+        mock_dangling_against_task_instance.return_value = mock_select
+        mock_get_query_count.return_value = 1
+
+        # Should return a single error related to the dangling `task_instance` table
+        errs = list(check_bad_references(session=mock_session))
+        assert len(errs) == 1
+        assert dangling_task_instance_table_name in errs[0]
+
+        mock_reflect_tables.assert_called_once_with(
+            [TaskInstance, TaskReschedule, RenderedTaskInstanceFields, TaskFail, XCom, DagRun, TaskInstance],
+            mock_session,
+        )
+        mock_inspect.assert_called_once_with(mock_bind)
+        mock_get_table_names.assert_called_once()
+        mock_dangling_against_dag_run.assert_called_once_with(
+            mock_session, task_instance_table, dag_run=dag_run_table
+        )
+        mock_get_query_count.assert_called_once_with(mock_select, session=mock_session)
+        mock_move_dangling_data_to_new_table.assert_called_once_with(
+            mock_session, task_fail_table, mock_select, dangling_task_fail_table_name
+        )
+        mock_session.rollback.assert_called_once()
diff --git a/tests/utils/test_edgemodifier.py b/tests/utils/test_edgemodifier.py
index 4d92f075b85f6..3070025d474ee 100644
--- a/tests/utils/test_edgemodifier.py
+++ b/tests/utils/test_edgemodifier.py
@@ -45,7 +45,7 @@ def f(task_id):
         return f"OP:{task_id}"
 
     with DAG(dag_id="test_xcom_dag", default_args=DEFAULT_ARGS) as dag:
-        operators = [PythonOperator(python_callable=f, task_id="test_op_%i" % i) for i in range(4)]
+        operators = [PythonOperator(python_callable=f, task_id=f"test_op_{i}") for i in range(4)]
         return dag, operators
 
 
diff --git a/tests/utils/test_file.py b/tests/utils/test_file.py
index 448ddf31c7a9c..60f56c82fa9b8 100644
--- a/tests/utils/test_file.py
+++ b/tests/utils/test_file.py
@@ -18,7 +18,6 @@
 from __future__ import annotations
 
 import os
-import os.path
 import zipfile
 from pathlib import Path
 from unittest import mock
diff --git a/tests/utils/test_helpers.py b/tests/utils/test_helpers.py
index c3c370060a665..46462c30d12b7 100644
--- a/tests/utils/test_helpers.py
+++ b/tests/utils/test_helpers.py
@@ -80,9 +80,9 @@ def test_chunks(self):
         assert list(helpers.chunks([1, 2, 3], 2)) == [[1, 2], [3]]
 
     def test_reduce_in_chunks(self):
-        assert helpers.reduce_in_chunks(lambda x, y: x + [y], [1, 2, 3, 4, 5], []) == [[1, 2, 3, 4, 5]]
+        assert helpers.reduce_in_chunks(lambda x, y: [*x, y], [1, 2, 3, 4, 5], []) == [[1, 2, 3, 4, 5]]
 
-        assert helpers.reduce_in_chunks(lambda x, y: x + [y], [1, 2, 3, 4, 5], [], 2) == [[1, 2], [3, 4], [5]]
+        assert helpers.reduce_in_chunks(lambda x, y: [*x, y], [1, 2, 3, 4, 5], [], 2) == [[1, 2], [3, 4], [5]]
 
         assert helpers.reduce_in_chunks(lambda x, y: x + y[0] * y[1], [1, 2, 3, 4], 0, 2) == 14
 
diff --git a/tests/utils/test_python_virtualenv.py b/tests/utils/test_python_virtualenv.py
index 6b492d8a1ccdd..5bc30d60bd811 100644
--- a/tests/utils/test_python_virtualenv.py
+++ b/tests/utils/test_python_virtualenv.py
@@ -61,7 +61,7 @@ def test_pip_install_options(self, mock_execute_in_subprocess):
             [sys.executable, "-m", "virtualenv", "/VENV", "--system-site-packages", "--python=pythonVER"]
         )
         mock_execute_in_subprocess.assert_called_with(
-            ["/VENV/bin/pip", "install"] + pip_install_options + ["apache-beam[gcp]"]
+            ["/VENV/bin/pip", "install", *pip_install_options, "apache-beam[gcp]"]
         )
 
     @mock.patch("airflow.utils.python_virtualenv.execute_in_subprocess")
diff --git a/tests/www/test_utils.py b/tests/www/test_utils.py
index 46fa055e8c51f..24c5fde01ac17 100644
--- a/tests/www/test_utils.py
+++ b/tests/www/test_utils.py
@@ -69,7 +69,7 @@ def check_generate_pages_html(
         assert min(window, total_pages) + extra_links == len(ulist_items)
 
         page_items = ulist_items[2:-2]
-        mid = int(len(page_items) / 2)
+        mid = len(page_items) // 2
         all_nodes = []
         pages = []
 
diff --git a/tests/www/views/test_views_base.py b/tests/www/views/test_views_base.py
index 2ba8795cf1bbe..4f3ccaeac7bb9 100644
--- a/tests/www/views/test_views_base.py
+++ b/tests/www/views/test_views_base.py
@@ -251,7 +251,7 @@ def test_views_get(request, url, client, content):
 
 
 def _check_task_stats_json(resp):
-    return set(list(resp.json.items())[0][1][0].keys()) == {"state", "count"}
+    return set(next(iter(resp.json.items()))[1][0]) == {"state", "count"}
 
 
 @pytest.mark.parametrize(
diff --git a/tests/www/views/test_views_dataset.py b/tests/www/views/test_views_dataset.py
index 2a48cb75c4983..f2968faea19d7 100644
--- a/tests/www/views/test_views_dataset.py
+++ b/tests/www/views/test_views_dataset.py
@@ -440,3 +440,14 @@ def test_should_return_max_if_req_above(self, admin_client, session):
 
         assert response.status_code == 200
         assert len(response.json["datasets"]) == 50
+
+
+class TestGetDatasetNextRunSummary(TestDatasetEndpoint):
+    def test_next_run_dataset_summary(self, dag_maker, admin_client):
+        with dag_maker(dag_id="upstream", schedule=[Dataset(uri="s3://bucket/key/1")], serialized=True):
+            EmptyOperator(task_id="task1")
+
+        response = admin_client.post("/next_run_datasets_summary", data={"dag_ids": ["upstream"]})
+
+        assert response.status_code == 200
+        assert response.json == {"upstream": {"ready": 0, "total": 1, "uri": "s3://bucket/key/1"}}
diff --git a/tests/www/views/test_views_home.py b/tests/www/views/test_views_home.py
index 874596b682ed5..cafff3a54c24d 100644
--- a/tests/www/views/test_views_home.py
+++ b/tests/www/views/test_views_home.py
@@ -57,7 +57,7 @@ def test_home(capture_templates, admin_client):
             '"null": "lightblue", "queued": "gray", '
             '"removed": "lightgrey", "restarting": "violet", "running": "lime", '
             '"scheduled": "tan", '
-            '"shutdown": "blue", "skipped": "hotpink", '
+            '"skipped": "hotpink", '
             '"success": "green", "up_for_reschedule": "turquoise", '
             '"up_for_retry": "gold", "upstream_failed": "orange"};'
         )
