This is an automated email from the ASF dual-hosted git repository. jedcunningham pushed a commit to branch v2-9-test in repository https://gitbox.apache.org/repos/asf/airflow.git
commit d2ae8c97550eaeaefca309d4b5878546d66895c9 Author: Andrey Anshin <andrey.ans...@taragol.is> AuthorDate: Thu Apr 25 17:44:22 2024 +0400 Force to use Airflow Deprecation warnings categories on `@deprecated` decorator (#39205) * Force to use Airflow Deprecation warnings categories on @deprecated decorator * Catch warning in Experimental API test (cherry picked from commit c2ef1daea65885db04610eaa7e02555500aec0e0) --- .pre-commit-config.yaml | 7 + airflow/api/common/experimental/get_code.py | 6 +- .../api/common/experimental/get_dag_run_state.py | 3 +- airflow/api/common/experimental/get_task.py | 3 +- .../api/common/experimental/get_task_instance.py | 4 +- airflow/api/common/experimental/pool.py | 10 +- airflow/auth/managers/fab/fab_auth_manager.py | 5 +- .../auth/managers/fab/security_manager/override.py | 4 +- airflow/www/security.py | 4 +- contributing-docs/08_static_code_checks.rst | 2 + dev/breeze/doc/images/output_static-checks.svg | 152 ++++++++-------- dev/breeze/doc/images/output_static-checks.txt | 2 +- dev/breeze/src/airflow_breeze/pre_commit_ids.py | 1 + scripts/ci/pre_commit/check_deprecations.py | 194 +++++++++++++++++++++ .../auth/backend/test_basic_auth.py | 6 +- 15 files changed, 313 insertions(+), 90 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b2f998afa9..308d63a615 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -987,6 +987,13 @@ repos: pass_filenames: true files: ^airflow/.*\.py$ exclude: ^.*/.*_vendor/ + - id: check-code-deprecations + name: Check deprecations categories in decorators + entry: ./scripts/ci/pre_commit/check_deprecations.py + language: python + pass_filenames: true + files: ^airflow/.*\.py$ + exclude: ^.*/.*_vendor/ - id: lint-chart-schema name: Lint chart/values.schema.json file entry: ./scripts/ci/pre_commit/chart_schema.py diff --git a/airflow/api/common/experimental/get_code.py b/airflow/api/common/experimental/get_code.py index f618690a92..96aadc441b 100644 --- a/airflow/api/common/experimental/get_code.py +++ b/airflow/api/common/experimental/get_code.py @@ -22,11 +22,13 @@ from __future__ import annotations from deprecated import deprecated from airflow.api.common.experimental import check_and_get_dag -from airflow.exceptions import AirflowException, DagCodeNotFound +from airflow.exceptions import AirflowException, DagCodeNotFound, RemovedInAirflow3Warning from airflow.models.dagcode import DagCode -@deprecated(reason="Use DagCode().get_code_by_fileloc() instead", version="2.2.4") +@deprecated( + reason="Use DagCode().get_code_by_fileloc() instead", version="2.2.4", category=RemovedInAirflow3Warning +) def get_code(dag_id: str) -> str: """Return python code of a given dag_id. diff --git a/airflow/api/common/experimental/get_dag_run_state.py b/airflow/api/common/experimental/get_dag_run_state.py index 8905aa4f04..6c7cd96c2b 100644 --- a/airflow/api/common/experimental/get_dag_run_state.py +++ b/airflow/api/common/experimental/get_dag_run_state.py @@ -24,12 +24,13 @@ from typing import TYPE_CHECKING from deprecated import deprecated from airflow.api.common.experimental import check_and_get_dag, check_and_get_dagrun +from airflow.exceptions import RemovedInAirflow3Warning if TYPE_CHECKING: from datetime import datetime -@deprecated(reason="Use DagRun().get_state() instead", version="2.2.4") +@deprecated(reason="Use DagRun().get_state() instead", version="2.2.4", category=RemovedInAirflow3Warning) def get_dag_run_state(dag_id: str, execution_date: datetime) -> dict[str, str]: """Return the Dag Run state identified by the given dag_id and execution_date. diff --git a/airflow/api/common/experimental/get_task.py b/airflow/api/common/experimental/get_task.py index 6bc58d0328..7e25ff4ffd 100644 --- a/airflow/api/common/experimental/get_task.py +++ b/airflow/api/common/experimental/get_task.py @@ -24,12 +24,13 @@ from typing import TYPE_CHECKING from deprecated import deprecated from airflow.api.common.experimental import check_and_get_dag +from airflow.exceptions import RemovedInAirflow3Warning if TYPE_CHECKING: from airflow.models import TaskInstance -@deprecated(reason="Use DAG().get_task", version="2.2.4") +@deprecated(reason="Use DAG().get_task", version="2.2.4", category=RemovedInAirflow3Warning) def get_task(dag_id: str, task_id: str) -> TaskInstance: """Return the task object identified by the given dag_id and task_id.""" dag = check_and_get_dag(dag_id, task_id) diff --git a/airflow/api/common/experimental/get_task_instance.py b/airflow/api/common/experimental/get_task_instance.py index 8a22e2c24e..722120534d 100644 --- a/airflow/api/common/experimental/get_task_instance.py +++ b/airflow/api/common/experimental/get_task_instance.py @@ -24,14 +24,14 @@ from typing import TYPE_CHECKING from deprecated import deprecated from airflow.api.common.experimental import check_and_get_dag, check_and_get_dagrun -from airflow.exceptions import TaskInstanceNotFound +from airflow.exceptions import RemovedInAirflow3Warning, TaskInstanceNotFound from airflow.models import TaskInstance if TYPE_CHECKING: from datetime import datetime -@deprecated(version="2.2.4", reason="Use DagRun.get_task_instance instead") +@deprecated(version="2.2.4", reason="Use DagRun.get_task_instance instead", category=RemovedInAirflow3Warning) def get_task_instance(dag_id: str, task_id: str, execution_date: datetime) -> TaskInstance: """Return the task instance identified by the given dag_id, task_id and execution_date.""" dag = check_and_get_dag(dag_id, task_id) diff --git a/airflow/api/common/experimental/pool.py b/airflow/api/common/experimental/pool.py index cfa1ffcc71..e3d99be8c1 100644 --- a/airflow/api/common/experimental/pool.py +++ b/airflow/api/common/experimental/pool.py @@ -24,7 +24,7 @@ from typing import TYPE_CHECKING from deprecated import deprecated from sqlalchemy import select -from airflow.exceptions import AirflowBadRequest, PoolNotFound +from airflow.exceptions import AirflowBadRequest, PoolNotFound, RemovedInAirflow3Warning from airflow.models import Pool from airflow.utils.session import NEW_SESSION, provide_session @@ -32,7 +32,7 @@ if TYPE_CHECKING: from sqlalchemy.orm import Session -@deprecated(reason="Use Pool.get_pool() instead", version="2.2.4") +@deprecated(reason="Use Pool.get_pool() instead", version="2.2.4", category=RemovedInAirflow3Warning) @provide_session def get_pool(name, session: Session = NEW_SESSION): """Get pool by a given name.""" @@ -46,14 +46,14 @@ def get_pool(name, session: Session = NEW_SESSION): return pool -@deprecated(reason="Use Pool.get_pools() instead", version="2.2.4") +@deprecated(reason="Use Pool.get_pools() instead", version="2.2.4", category=RemovedInAirflow3Warning) @provide_session def get_pools(session: Session = NEW_SESSION): """Get all pools.""" return session.scalars(select(Pool)).all() -@deprecated(reason="Use Pool.create_pool() instead", version="2.2.4") +@deprecated(reason="Use Pool.create_pool() instead", version="2.2.4", category=RemovedInAirflow3Warning) @provide_session def create_pool(name, slots, description, session: Session = NEW_SESSION): """Create a pool with given parameters.""" @@ -84,7 +84,7 @@ def create_pool(name, slots, description, session: Session = NEW_SESSION): return pool -@deprecated(reason="Use Pool.delete_pool() instead", version="2.2.4") +@deprecated(reason="Use Pool.delete_pool() instead", version="2.2.4", category=RemovedInAirflow3Warning) @provide_session def delete_pool(name, session: Session = NEW_SESSION): """Delete pool by a given name.""" diff --git a/airflow/auth/managers/fab/fab_auth_manager.py b/airflow/auth/managers/fab/fab_auth_manager.py index ffbda9c808..aa77656639 100644 --- a/airflow/auth/managers/fab/fab_auth_manager.py +++ b/airflow/auth/managers/fab/fab_auth_manager.py @@ -19,11 +19,14 @@ from __future__ import annotations from deprecated import deprecated +from airflow.exceptions import RemovedInAirflow3Warning from airflow.providers.fab.auth_manager.fab_auth_manager import FabAuthManager as FabAuthManagerProvider @deprecated( - reason="Use airflow.providers.fab.auth_manager.fab_auth_manager.FabAuthManager instead", version="2.9.0" + reason="Use airflow.providers.fab.auth_manager.fab_auth_manager.FabAuthManager instead", + version="2.9.0", + category=RemovedInAirflow3Warning, ) class FabAuthManager(FabAuthManagerProvider): """ diff --git a/airflow/auth/managers/fab/security_manager/override.py b/airflow/auth/managers/fab/security_manager/override.py index 96b98a268b..cae7da7e92 100644 --- a/airflow/auth/managers/fab/security_manager/override.py +++ b/airflow/auth/managers/fab/security_manager/override.py @@ -19,6 +19,7 @@ from __future__ import annotations from deprecated import deprecated +from airflow.exceptions import RemovedInAirflow3Warning from airflow.providers.fab.auth_manager.security_manager.override import ( FabAirflowSecurityManagerOverride as FabProviderAirflowSecurityManagerOverride, ) @@ -27,7 +28,8 @@ from airflow.providers.fab.auth_manager.security_manager.override import ( @deprecated( reason="If you want to override the security manager, you should inherit from " "`airflow.providers.fab.auth_manager.security_manager.override.FabAirflowSecurityManagerOverride` " - "instead" + "instead", + category=RemovedInAirflow3Warning, ) class FabAirflowSecurityManagerOverride(FabProviderAirflowSecurityManagerOverride): """ diff --git a/airflow/www/security.py b/airflow/www/security.py index 9cb21cf45a..69c90d65eb 100644 --- a/airflow/www/security.py +++ b/airflow/www/security.py @@ -18,6 +18,7 @@ from __future__ import annotations from deprecated import deprecated +from airflow.exceptions import RemovedInAirflow3Warning from airflow.providers.fab.auth_manager.security_manager.override import FabAirflowSecurityManagerOverride EXISTING_ROLES = { @@ -32,7 +33,8 @@ EXISTING_ROLES = { @deprecated( reason="If you want to override the security manager, you should inherit from " "`airflow.providers.fab.auth_manager.security_manager.override.FabAirflowSecurityManagerOverride` " - "instead" + "instead", + category=RemovedInAirflow3Warning, ) class AirflowSecurityManager(FabAirflowSecurityManagerOverride): """Placeholder, just here to avoid breaking the code of users who inherit from this. diff --git a/contributing-docs/08_static_code_checks.rst b/contributing-docs/08_static_code_checks.rst index b02c8749a7..e3fcf28ed4 100644 --- a/contributing-docs/08_static_code_checks.rst +++ b/contributing-docs/08_static_code_checks.rst @@ -146,6 +146,8 @@ require Breeze Docker image to be built locally. +-----------------------------------------------------------+--------------------------------------------------------------+---------+ | check-cncf-k8s-only-for-executors | Check cncf.kubernetes imports used for executors only | | +-----------------------------------------------------------+--------------------------------------------------------------+---------+ +| check-code-deprecations | Check deprecations categories in decorators | | ++-----------------------------------------------------------+--------------------------------------------------------------+---------+ | check-compat-cache-on-methods | Check that compat cache do not use on class methods | | +-----------------------------------------------------------+--------------------------------------------------------------+---------+ | check-core-deprecation-classes | Verify usage of Airflow deprecation classes in core | | diff --git a/dev/breeze/doc/images/output_static-checks.svg b/dev/breeze/doc/images/output_static-checks.svg index a4c1734c30..f1d369044a 100644 --- a/dev/breeze/doc/images/output_static-checks.svg +++ b/dev/breeze/doc/images/output_static-checks.svg @@ -1,4 +1,4 @@ -<svg class="rich-terminal" viewBox="0 0 1482 2099.6" xmlns="http://www.w3.org/2000/svg"> +<svg class="rich-terminal" viewBox="0 0 1482 2124.0" xmlns="http://www.w3.org/2000/svg"> <!-- Generated with Rich https://www.textualize.io --> <style> @@ -43,7 +43,7 @@ <defs> <clipPath id="breeze-static-checks-clip-terminal"> - <rect x="0" y="0" width="1463.0" height="2048.6" /> + <rect x="0" y="0" width="1463.0" height="2073.0" /> </clipPath> <clipPath id="breeze-static-checks-line-0"> <rect x="0" y="1.5" width="1464" height="24.65"/> @@ -294,9 +294,12 @@ <clipPath id="breeze-static-checks-line-82"> <rect x="0" y="2002.3" width="1464" height="24.65"/> </clipPath> +<clipPath id="breeze-static-checks-line-83"> + <rect x="0" y="2026.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="2097.6" rx="8"/><text class="breeze-static-checks-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: static-checks</text> + <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="2122" rx="8"/><text class="breeze-static-checks-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: static-checks</text> <g transform="translate(26,22)"> <circle cx="0" cy="0" r="7" fill="#ff5f57"/> <circle cx="22" cy="0" r="7" fill="#febc2e"/> @@ -319,77 +322,78 @@ </text><text class="breeze-static-checks-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-static-checks-line-10)">│</text><text class="breeze-static-checks-r7" x="451.4" y="264" textLength="988.2" clip-path="url(#breeze-static-checks-line-10)">check-base-operator-partial-arguments | check-base-operator-usage |              </text><text class="breeze-static-checks-r5" x="1451.8" y="264" textLeng [...] </text><text class="breeze-static-checks-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-11)">│</text><text class="breeze-static-checks-r7" x="451.4" y="288.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-11)">check-boring-cyborg-configuration | check-breeze-top-dependencies-limited |      </text><text class="breeze-static-checks-r5" x="1451.8" y="288.4" textLength="12.2" clip-path="url(#breeze-s [...] </text><text class="breeze-static-checks-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-12)">│</text><text class="breeze-static-checks-r7" x="451.4" y="312.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-12)">check-builtin-literals | check-changelog-has-no-duplicates |                     </text><text class="breeze-static [...] -</text><text class="breeze-static-checks-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-13)">│</text><text class="breeze-static-checks-r7" x="451.4" y="337.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-13)">check-cncf-k8s-only-for-executors | check-compat-cache-on-methods |              </text><text class="breeze-static-checks-r5" x="1451.8" y="337.2" te [...] -</text><text class="breeze-static-checks-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-14)">│</text><text class="breeze-static-checks-r7" x="451.4" y="361.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-14)">check-core-deprecation-classes | check-daysago-import-from-utils |               </text><text class="breeze-static-checks-r5" x="1451.8" y="361. [...] -</text><text class="breeze-static-checks-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-static-checks-line-15)">│</text><text class="breeze-static-checks-r7" x="451.4" y="386" textLength="988.2" clip-path="url(#breeze-static-checks-line-15)">check-decorated-operator-implements-custom-name | check-deferrable-default-value </text><text class="breeze-static-checks-r5" x="1451.8" y="386" textLength="12.2" clip-path="url(#breeze-static-checks-line-15)">│</text><text [...] -</text><text class="breeze-static-checks-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-16)">│</text><text class="breeze-static-checks-r7" x="451.4" y="410.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-16)">| check-docstring-param-types | check-example-dags-urls |                        </text><text [...] -</text><text class="breeze-static-checks-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-17)">│</text><text class="breeze-static-checks-r7" x="451.4" y="434.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-17)">check-executables-have-shebangs | check-extra-packages-references |              </text><text class="breeze-static-checks-r5" x="1451.8" y="434.8" te [...] -</text><text class="breeze-static-checks-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-18)">│</text><text class="breeze-static-checks-r7" x="451.4" y="459.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-18)">check-extras-order | check-fab-migrations | check-for-inclusive-language |       </text><text class="breeze-static-checks-r5" x="1451.8" y="459.2" textLength="12.2" clip-path [...] -</text><text class="breeze-static-checks-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-19)">│</text><text class="breeze-static-checks-r7" x="451.4" y="483.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-19)">check-google-re2-as-dependency | check-hatch-build-order | check-hooks-apply |   </text><text class="breeze-static-checks-r5" x="1451.8" y="483.6" textLength="12.2" clip-path="url(#breeze-static [...] -</text><text class="breeze-static-checks-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-static-checks-line-20)">│</text><text class="breeze-static-checks-r7" x="451.4" y="508" textLength="988.2" clip-path="url(#breeze-static-checks-line-20)">check-incorrect-use-of-LoggingMixin | check-init-decorator-arguments |           </text><text class="breeze-static-checks-r5" x="1451.8" y="508" textLength="12.2" clip- [...] -</text><text class="breeze-static-checks-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-21)">│</text><text class="breeze-static-checks-r7" x="451.4" y="532.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-21)">check-integrations-list-consistent | check-lazy-logging |                        </text><text class [...] -</text><text class="breeze-static-checks-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-22)">│</text><text class="breeze-static-checks-r7" x="451.4" y="556.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-22)">check-links-to-example-dags-do-not-use-hardcoded-versions | check-merge-conflict </text><text class="breeze-static-checks-r5" x="1451.8" y="556.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-22)">│</text [...] -</text><text class="breeze-static-checks-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-23)">│</text><text class="breeze-static-checks-r7" x="451.4" y="581.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-23)">| check-newsfragments-are-valid | check-no-airflow-deprecation-in-providers |    </text><text class="breeze-static-checks-r5" x="1451.8" y="581.2" textLength="12.2" clip-path="url(#breeze-static [...] -</text><text class="breeze-static-checks-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-24)">│</text><text class="breeze-static-checks-r7" x="451.4" y="605.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-24)">check-no-providers-in-core-examples | check-only-new-session-with-provide-session</text><text class="breeze-static-checks-r5" x="1451.8" y="605.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-24)">│</text><tex [...] -</text><text class="breeze-static-checks-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-static-checks-line-25)">│</text><text class="breeze-static-checks-r7" x="451.4" y="630" textLength="988.2" clip-path="url(#breeze-static-checks-line-25)">| check-persist-credentials-disabled-in-github-workflows |                       </text><text class="breeze-stati [...] -</text><text class="breeze-static-checks-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-26)">│</text><text class="breeze-static-checks-r7" x="451.4" y="654.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-26)">check-pre-commit-information-consistent | check-provide-create-sessions-imports |</text><text class="breeze-static-checks-r5" x="1451.8" y="654.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-26)">│</text [...] -</text><text class="breeze-static-checks-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-27)">│</text><text class="breeze-static-checks-r7" x="451.4" y="678.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-27)">check-provider-docs-valid | check-provider-yaml-valid |                          </text>< [...] -</text><text class="breeze-static-checks-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-28)">│</text><text class="breeze-static-checks-r7" x="451.4" y="703.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-28)">check-providers-init-file-missing | check-providers-subpackages-init-file-exist |</text><text class="breeze-static-checks-r5" x="1451.8" y="703.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-28)">│</text [...] -</text><text class="breeze-static-checks-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-29)">│</text><text class="breeze-static-checks-r7" x="451.4" y="727.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-29)">check-pydevd-left-in-code | check-revision-heads-map |                           </t [...] -</text><text class="breeze-static-checks-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-static-checks-line-30)">│</text><text class="breeze-static-checks-r7" x="451.4" y="752" textLength="988.2" clip-path="url(#breeze-static-checks-line-30)">check-safe-filter-usage-in-html | check-sql-dependency-common-data-structure |   </text><text class="breeze-static-checks-r5" x="1451.8" y="752" textLength="12.2" clip-path="url(#breeze-static-checks-line-30) [...] -</text><text class="breeze-static-checks-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-31)">│</text><text class="breeze-static-checks-r7" x="451.4" y="776.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-31)">check-start-date-not-used-in-defaults | check-system-tests-present |             </text><text class="breeze-static-checks-r5" x="1451.8" y="776.4" textLen [...] -</text><text class="breeze-static-checks-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-32)">│</text><text class="breeze-static-checks-r7" x="451.4" y="800.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-32)">check-system-tests-tocs | check-tests-in-the-right-folders |                     </text><text class="breeze-static [...] -</text><text class="breeze-static-checks-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-33)">│</text><text class="breeze-static-checks-r7" x="451.4" y="825.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-33)">check-tests-unittest-testcase | check-urlparse-usage-in-code |                   </text><text class="breeze-static-checks-r5 [...] -</text><text class="breeze-static-checks-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-34)">│</text><text class="breeze-static-checks-r7" x="451.4" y="849.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-34)">check-usage-of-re2-over-re | check-xml | codespell | compile-www-assets |        </text><text class="breeze-static-checks-r5" x="1451.8" y="849.6" textLength=" [...] -</text><text class="breeze-static-checks-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-static-checks-line-35)">│</text><text class="breeze-static-checks-r7" x="451.4" y="874" textLength="988.2" clip-path="url(#breeze-static-checks-line-35)">compile-www-assets-dev | create-missing-init-py-files-tests | debug-statements | </text><text class="breeze-static-checks-r5" x="1451.8" y="874" textLength="12.2" clip-path="url(#breeze-static-checks-line-35) [...] -</text><text class="breeze-static-checks-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-36)">│</text><text class="breeze-static-checks-r7" x="451.4" y="898.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-36)">detect-private-key | doctoc | end-of-file-fixer | fix-encoding-pragma | flynt |  </text><text class="breeze-static-checks-r5" x="1451.8" y="898.4" textLength="12.2" clip-path="url [...] -</text><text class="breeze-static-checks-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-37)">│</text><text class="breeze-static-checks-r7" x="451.4" y="922.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-37)">generate-airflow-diagrams | generate-pypi-readme | identity | insert-license |   </text><text class="breeze-static-checks-r5" x="1451.8" y="922.8" textLength="12.2" clip-path="url(#bre [...] -</text><text class="breeze-static-checks-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-38)">│</text><text class="breeze-static-checks-r7" x="451.4" y="947.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-38)">kubeconform | lint-chart-schema | lint-css | lint-dockerfile | lint-helm-chart | </text><text class="breeze-static-checks-r5" x="1451.8" y="947.2" textLength="12.2" clip-path="url(#bre [...] -</text><text class="breeze-static-checks-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-39)">│</text><text class="breeze-static-checks-r7" x="451.4" y="971.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-39)">lint-json-schema | lint-markdown | lint-openapi | mixed-line-ending |            </text><text class="breeze-static-checks-r5" x="1451.8" y= [...] -</text><text class="breeze-static-checks-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-static-checks-line-40)">│</text><text class="breeze-static-checks-r7" x="451.4" y="996" textLength="988.2" clip-path="url(#breeze-static-checks-line-40)">mypy-airflow | mypy-dev | mypy-docs | mypy-providers | pretty-format-json |      </text><text class="breeze-static-checks-r5" x="1451.8" y="996" textLength="12.2" [...] -</text><text class="breeze-static-checks-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-41)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1020.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-41)">pylint | python-no-log-warn | replace-bad-characters | rst-backticks | ruff |    </text><text class="breeze-static-checks-r5" x="1451.8" y="1020.4" textLength="12.2" c [...] -</text><text class="breeze-static-checks-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-42)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1044.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-42)">ruff-format | shellcheck | trailing-whitespace | ts-compile-format-lint-www |    </text><text class="breeze-static-checks-r5" x="1451.8" y="1044.8" textLength="12.2" clip-path=" [...] -</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-black-version | update-breeze-cmd-output |                             [...] -</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-breeze-readme-config-hash | update-build-dependencies |                   </text><text class="breeze-static-checks- [...] -</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-chart-dependencies | update-common-sql-api-stubs | update-er-diagram |    </text><text class="breeze-static-checks-r5" x="1451.8" y="1118" textLength="12.2" clip-path="url(#breeze-stat [...] -</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)">update-extras | update-in-the-wild-to-be-sorted |                             [...] -</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-r7" x="451.4" y="1166.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-47)">update-inlined-dockerfile-scripts | update-installed-providers-to-be-sorted |    </text><text class="breeze-static-checks-r5" x="1451.8" y="1166.8" textLength="12.2" clip-path="url(#breeze-static-c [...] -</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-r7" x="451.4" y="1191.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-48)">update-installers | update-local-yml-file | update-migration-references |        </text><text class="breeze-static-checks-r5" x="1451.8" y="1191.2" textLength="12.2" c [...] -</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-r7" x="451.4" y="1215.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-49)">update-providers-dependencies | update-reproducible-source-date-epoch |          </text><text class="breeze-static-checks-r5" x="1451.8" y="1215.6" textLength="12.2" c [...] -</text><text class="breeze-static-checks-r5" x="0" y="1240" textLength="12.2" clip-path="url(#breeze-static-checks-line-50)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1240" textLength="988.2" clip-path="url(#breeze-static-checks-line-50)">update-spelling-wordlist-to-be-sorted | update-supported-versions |              </text><text class="breeze-static-checks-r5" x="1451.8" y="1240" textL [...] -</text><text class="breeze-static-checks-r5" x="0" y="1264.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-51)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1264.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-51)">update-vendored-in-k8s-json-schema | update-version | validate-operators-init |  </text><text class="breeze-static-checks-r5" x="1451.8" y="1264.4" textLength="12.2" clip-path="url(#breeze-static-c [...] -</text><text class="breeze-static-checks-r5" x="0" y="1288.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-52)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1288.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-52)">yamllint)                                     & [...] -</text><text class="breeze-static-checks-r5" x="0" y="1313.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-53)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1313.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-53)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1313.2" textLength="61" clip-path="url(#breeze-static-checks-line-53)">-show</text><text class="breeze-static-checks-r4" x="97.6" y="1313.2" textLength="195.2" clip-path="url(# [...] -</text><text class="breeze-static-checks-r5" x="0" y="1337.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-54)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1337.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-54)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1337.6" textLength="134.2" clip-path="url(#breeze-static-checks-line-54)">-initialize</text><text class="breeze-static-checks-r4" x="170.8" y="1337.6" textLength="146.4" clip-p [...] -</text><text class="breeze-static-checks-r5" x="0" y="1362" textLength="12.2" clip-path="url(#breeze-static-checks-line-55)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1362" textLength="12.2" clip-path="url(#breeze-static-checks-line-55)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1362" textLength="48.8" clip-path="url(#breeze-static-checks-line-55)">-max</text><text class="breeze-static-checks-r4" x="85.4" y="1362" textLength="292.8" clip-path="url(#breeze- [...] -</text><text class="breeze-static-checks-r5" x="0" y="1386.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-56)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1386.4" textLength="854" clip-path="url(#breeze-static-checks-line-56)">(INTEGER RANGE)                                    [...] -</text><text class="breeze-static-checks-r5" x="0" y="1410.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-57)">│</text><text class="breeze-static-checks-r5" x="451.4" y="1410.8" textLength="854" clip-path="url(#breeze-static-checks-line-57)">[default: 3; 1<=x<=10]                                 [...] -</text><text class="breeze-static-checks-r5" x="0" y="1435.2" textLength="1464" clip-path="url(#breeze-static-checks-line-58)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-static-checks-r1" x="1464" y="1435.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-58)"> -</text><text class="breeze-static-checks-r5" x="0" y="1459.6" textLength="24.4" clip-path="url(#breeze-static-checks-line-59)">╭─</text><text class="breeze-static-checks-r5" x="24.4" y="1459.6" textLength="463.6" clip-path="url(#breeze-static-checks-line-59)"> Selecting files to run the checks on </text><text class="breeze-static-checks-r5" x="488" y="1459.6" textLength="951.6" clip-path="url(#breeze-static-checks-line-59)">──────────────────────── [...] -</text><text class="breeze-static-checks-r5" x="0" y="1484" textLength="12.2" clip-path="url(#breeze-static-checks-line-60)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1484" textLength="12.2" clip-path="url(#breeze-static-checks-line-60)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1484" textLength="61" clip-path="url(#breeze-static-checks-line-60)">-file</text><text class="breeze-static-checks-r6" x="256.2" y="1484" textLength="24.4" clip-path="url(#breeze-s [...] -</text><text class="breeze-static-checks-r5" x="0" y="1508.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-61)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1508.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-61)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1508.4" textLength="48.8" clip-path="url(#breeze-static-checks-line-61)">-all</text><text class="breeze-static-checks-r4" x="85.4" y="1508.4" textLength="73.2" clip-path="url(# [...] -</text><text class="breeze-static-checks-r5" x="0" y="1532.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-62)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1532.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-62)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1532.8" textLength="85.4" clip-path="url(#breeze-static-checks-line-62)">-commit</text><text class="breeze-static-checks-r4" x="122" y="1532.8" textLength="48.8" clip-path="url [...] -</text><text class="breeze-static-checks-r5" x="0" y="1557.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-63)">│</text><text class="breeze-static-checks-r1" x="305" y="1557.2" textLength="183" clip-path="url(#breeze-static-checks-line-63)">exclusive with </text><text class="breeze-static-checks-r4" x="488" y="1557.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-63)">-</text><text class="breeze-static-checks-r4" x="500.2" y="1557.2" textLength="61" [...] -</text><text class="breeze-static-checks-r5" x="0" y="1581.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-64)">│</text><text class="breeze-static-checks-r7" x="305" y="1581.6" textLength="1134.6" clip-path="url(#breeze-static-checks-line-64)">(TEXT)                                       [...] -</text><text class="breeze-static-checks-r5" x="0" y="1606" textLength="12.2" clip-path="url(#breeze-static-checks-line-65)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1606" textLength="12.2" clip-path="url(#breeze-static-checks-line-65)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1606" textLength="61" clip-path="url(#breeze-static-checks-line-65)">-last</text><text class="breeze-static-checks-r4" x="97.6" y="1606" textLength="85.4" clip-path="url(#breeze-st [...] -</text><text class="breeze-static-checks-r5" x="0" y="1630.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-66)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1630.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-66)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1630.4" textLength="61" clip-path="url(#breeze-static-checks-line-66)">-only</text><text class="breeze-static-checks-r4" x="97.6" y="1630.4" textLength="134.2" clip-path="url(# [...] -</text><text class="breeze-static-checks-r5" x="0" y="1654.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-67)">│</text><text class="breeze-static-checks-r1" x="305" y="1654.8" textLength="1134.6" clip-path="url(#breeze-static-checks-line-67)">branch and HEAD of your branch.                              [...] -</text><text class="breeze-static-checks-r5" x="0" y="1679.2" textLength="1464" clip-path="url(#breeze-static-checks-line-68)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-static-checks-r1" x="1464" y="1679.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-68)"> -</text><text class="breeze-static-checks-r5" x="0" y="1703.6" textLength="24.4" clip-path="url(#breeze-static-checks-line-69)">╭─</text><text class="breeze-static-checks-r5" x="24.4" y="1703.6" textLength="463.6" clip-path="url(#breeze-static-checks-line-69)"> Building image before running checks </text><text class="breeze-static-checks-r5" x="488" y="1703.6" textLength="951.6" clip-path="url(#breeze-static-checks-line-69)">────────────────────────────────── [...] -</text><text class="breeze-static-checks-r5" x="0" y="1728" textLength="12.2" clip-path="url(#breeze-static-checks-line-70)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1728" textLength="12.2" clip-path="url(#breeze-static-checks-line-70)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1728" textLength="61" clip-path="url(#breeze-static-checks-line-70)">-skip</text><text class="breeze-static-checks-r4" x="97.6" y="1728" textLength="244" clip-path="url(#breeze-sta [...] -</text><text class="breeze-static-checks-r5" x="0" y="1752.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-71)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1752.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-71)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1752.4" textLength="73.2" clip-path="url(#breeze-static-checks-line-71)">-force</text><text class="breeze-static-checks-r4" x="109.8" y="1752.4" textLength="73.2" clip-path="ur [...] -</text><text class="breeze-static-checks-r5" x="0" y="1776.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-72)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1776.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-72)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1776.8" textLength="73.2" clip-path="url(#breeze-static-checks-line-72)">-image</text><text class="breeze-static-checks-r4" x="109.8" y="1776.8" textLength="48.8" clip-path="ur [...] -</text><text class="breeze-static-checks-r5" x="0" y="1801.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-73)">│</text><text class="breeze-static-checks-r7" x="414.8" y="1801.2" textLength="963.8" clip-path="url(#breeze-static-checks-line-73)">(TEXT)                                      [...] -</text><text class="breeze-static-checks-r5" x="0" y="1825.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-74)">│</text><text class="breeze-static-checks-r5" x="414.8" y="1825.6" textLength="963.8" clip-path="url(#breeze-static-checks-line-74)">[default: latest]                                    [...] -</text><text class="breeze-static-checks-r5" x="0" y="1850" textLength="12.2" clip-path="url(#breeze-static-checks-line-75)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1850" textLength="12.2" clip-path="url(#breeze-static-checks-line-75)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1850" textLength="85.4" clip-path="url(#breeze-static-checks-line-75)">-github</text><text class="breeze-static-checks-r4" x="122" y="1850" textLength="134.2" clip-path="url(#breez [...] -</text><text class="breeze-static-checks-r5" x="0" y="1874.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-76)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1874.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-76)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1874.4" textLength="97.6" clip-path="url(#breeze-static-checks-line-76)">-builder</text><text class="breeze-static-checks-r1" x="414.8" y="1874.4" textLength="756.4" clip-path= [...] -</text><text class="breeze-static-checks-r5" x="0" y="1898.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-77)">│</text><text class="breeze-static-checks-r5" x="414.8" y="1898.8" textLength="756.4" clip-path="url(#breeze-static-checks-line-77)">[default: autodetect]                                  &# [...] -</text><text class="breeze-static-checks-r5" x="0" y="1923.2" textLength="1464" clip-path="url(#breeze-static-checks-line-78)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-static-checks-r1" x="1464" y="1923.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-78)"> -</text><text class="breeze-static-checks-r5" x="0" y="1947.6" textLength="24.4" clip-path="url(#breeze-static-checks-line-79)">╭─</text><text class="breeze-static-checks-r5" x="24.4" y="1947.6" textLength="195.2" clip-path="url(#breeze-static-checks-line-79)"> Common options </text><text class="breeze-static-checks-r5" x="219.6" y="1947.6" textLength="1220" clip-path="url(#breeze-static-checks-line-79)">────────────────────────────────────────────────────────────────────── [...] -</text><text class="breeze-static-checks-r5" x="0" y="1972" textLength="12.2" clip-path="url(#breeze-static-checks-line-80)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1972" textLength="12.2" clip-path="url(#breeze-static-checks-line-80)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1972" textLength="48.8" clip-path="url(#breeze-static-checks-line-80)">-dry</text><text class="breeze-static-checks-r4" x="85.4" y="1972" textLength="48.8" clip-path="url(#breeze-s [...] -</text><text class="breeze-static-checks-r5" x="0" y="1996.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-81)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1996.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-81)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1996.4" textLength="97.6" clip-path="url(#breeze-static-checks-line-81)">-verbose</text><text class="breeze-static-checks-r6" x="158.6" y="1996.4" textLength="24.4" clip-path=" [...] -</text><text class="breeze-static-checks-r5" x="0" y="2020.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-82)">│</text><text class="breeze-static-checks-r4" x="24.4" y="2020.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-82)">-</text><text class="breeze-static-checks-r4" x="36.6" y="2020.8" textLength="61" clip-path="url(#breeze-static-checks-line-82)">-help</text><text class="breeze-static-checks-r6" x="158.6" y="2020.8" textLength="24.4" clip-path="url(# [...] -</text><text class="breeze-static-checks-r5" x="0" y="2045.2" textLength="1464" clip-path="url(#breeze-static-checks-line-83)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-static-checks-r1" x="1464" y="2045.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-83)"> +</text><text class="breeze-static-checks-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-13)">│</text><text class="breeze-static-checks-r7" x="451.4" y="337.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-13)">check-cncf-k8s-only-for-executors | check-code-deprecations |                    </text><text class="breeze-static-chec [...] +</text><text class="breeze-static-checks-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-14)">│</text><text class="breeze-static-checks-r7" x="451.4" y="361.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-14)">check-compat-cache-on-methods | check-core-deprecation-classes |                 </text><text class="breeze-static-checks-r5" x="1451. [...] +</text><text class="breeze-static-checks-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-static-checks-line-15)">│</text><text class="breeze-static-checks-r7" x="451.4" y="386" textLength="988.2" clip-path="url(#breeze-static-checks-line-15)">check-daysago-import-from-utils | check-decorated-operator-implements-custom-name</text><text class="breeze-static-checks-r5" x="1451.8" y="386" textLength="12.2" clip-path="url(#breeze-static-checks-line-15)">│</text><text clas [...] +</text><text class="breeze-static-checks-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-16)">│</text><text class="breeze-static-checks-r7" x="451.4" y="410.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-16)">| check-deferrable-default-value | check-docstring-param-types |                 </text><text class="breeze-static-checks-r5" x=" [...] +</text><text class="breeze-static-checks-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-17)">│</text><text class="breeze-static-checks-r7" x="451.4" y="434.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-17)">check-example-dags-urls | check-executables-have-shebangs |                      </text><text class="breeze-s [...] +</text><text class="breeze-static-checks-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-18)">│</text><text class="breeze-static-checks-r7" x="451.4" y="459.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-18)">check-extra-packages-references | check-extras-order | check-fab-migrations |    </text><text class="breeze-static-checks-r5" x="1451.8" y="459.2" textLength="12.2" clip-path="url(#breeze-s [...] +</text><text class="breeze-static-checks-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-19)">│</text><text class="breeze-static-checks-r7" x="451.4" y="483.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-19)">check-for-inclusive-language | check-google-re2-as-dependency |                  </text><text class="breeze-static-checks-r5" x=" [...] +</text><text class="breeze-static-checks-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-static-checks-line-20)">│</text><text class="breeze-static-checks-r7" x="451.4" y="508" textLength="988.2" clip-path="url(#breeze-static-checks-line-20)">check-hatch-build-order | check-hooks-apply | check-incorrect-use-of-LoggingMixin</text><text class="breeze-static-checks-r5" x="1451.8" y="508" textLength="12.2" clip-path="url(#breeze-static-checks-line-20)">│</text> [...] +</text><text class="breeze-static-checks-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-21)">│</text><text class="breeze-static-checks-r7" x="451.4" y="532.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-21)">| check-init-decorator-arguments | check-integrations-list-consistent |          </text><text class="breeze-static-checks-r5" x="1451.8" y="532.4" textLength="12.2" [...] +</text><text class="breeze-static-checks-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-22)">│</text><text class="breeze-static-checks-r7" x="451.4" y="556.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-22)">check-lazy-logging | check-links-to-example-dags-do-not-use-hardcoded-versions | </text><text class="breeze-static-checks-r5" x="1451.8" y="556.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-22)">│< [...] +</text><text class="breeze-static-checks-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-23)">│</text><text class="breeze-static-checks-r7" x="451.4" y="581.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-23)">check-merge-conflict | check-newsfragments-are-valid |                           </t [...] +</text><text class="breeze-static-checks-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-24)">│</text><text class="breeze-static-checks-r7" x="451.4" y="605.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-24)">check-no-airflow-deprecation-in-providers | check-no-providers-in-core-examples |</text><text class="breeze-static-checks-r5" x="1451.8" y="605.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-24)">│</text [...] +</text><text class="breeze-static-checks-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-static-checks-line-25)">│</text><text class="breeze-static-checks-r7" x="451.4" y="630" textLength="988.2" clip-path="url(#breeze-static-checks-line-25)">check-only-new-session-with-provide-session |                               &# [...] +</text><text class="breeze-static-checks-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-26)">│</text><text class="breeze-static-checks-r7" x="451.4" y="654.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-26)">check-persist-credentials-disabled-in-github-workflows |                         </text><text class="bre [...] +</text><text class="breeze-static-checks-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-27)">│</text><text class="breeze-static-checks-r7" x="451.4" y="678.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-27)">check-pre-commit-information-consistent | check-provide-create-sessions-imports |</text><text class="breeze-static-checks-r5" x="1451.8" y="678.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-27)">│</text [...] +</text><text class="breeze-static-checks-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-28)">│</text><text class="breeze-static-checks-r7" x="451.4" y="703.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-28)">check-provider-docs-valid | check-provider-yaml-valid |                          </text>< [...] +</text><text class="breeze-static-checks-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-29)">│</text><text class="breeze-static-checks-r7" x="451.4" y="727.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-29)">check-providers-init-file-missing | check-providers-subpackages-init-file-exist |</text><text class="breeze-static-checks-r5" x="1451.8" y="727.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-29)">│</text [...] +</text><text class="breeze-static-checks-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-static-checks-line-30)">│</text><text class="breeze-static-checks-r7" x="451.4" y="752" textLength="988.2" clip-path="url(#breeze-static-checks-line-30)">check-pydevd-left-in-code | check-revision-heads-map |                           </text> [...] +</text><text class="breeze-static-checks-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-31)">│</text><text class="breeze-static-checks-r7" x="451.4" y="776.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-31)">check-safe-filter-usage-in-html | check-sql-dependency-common-data-structure |   </text><text class="breeze-static-checks-r5" x="1451.8" y="776.4" textLength="12.2" clip-path="url(#breeze-static-checks-li [...] +</text><text class="breeze-static-checks-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-32)">│</text><text class="breeze-static-checks-r7" x="451.4" y="800.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-32)">check-start-date-not-used-in-defaults | check-system-tests-present |             </text><text class="breeze-static-checks-r5" x="1451.8" y="800.8" textLen [...] +</text><text class="breeze-static-checks-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-33)">│</text><text class="breeze-static-checks-r7" x="451.4" y="825.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-33)">check-system-tests-tocs | check-tests-in-the-right-folders |                     </text><text class="breeze-static [...] +</text><text class="breeze-static-checks-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-34)">│</text><text class="breeze-static-checks-r7" x="451.4" y="849.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-34)">check-tests-unittest-testcase | check-urlparse-usage-in-code |                   </text><text class="breeze-static-checks-r5 [...] +</text><text class="breeze-static-checks-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-static-checks-line-35)">│</text><text class="breeze-static-checks-r7" x="451.4" y="874" textLength="988.2" clip-path="url(#breeze-static-checks-line-35)">check-usage-of-re2-over-re | check-xml | codespell | compile-www-assets |        </text><text class="breeze-static-checks-r5" x="1451.8" y="874" textLength="12.2" [...] +</text><text class="breeze-static-checks-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-36)">│</text><text class="breeze-static-checks-r7" x="451.4" y="898.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-36)">compile-www-assets-dev | create-missing-init-py-files-tests | debug-statements | </text><text class="breeze-static-checks-r5" x="1451.8" y="898.4" textLength="12.2" clip-path="url(#breeze-static-checks-li [...] +</text><text class="breeze-static-checks-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-37)">│</text><text class="breeze-static-checks-r7" x="451.4" y="922.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-37)">detect-private-key | doctoc | end-of-file-fixer | fix-encoding-pragma | flynt |  </text><text class="breeze-static-checks-r5" x="1451.8" y="922.8" textLength="12.2" clip-path="url [...] +</text><text class="breeze-static-checks-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-38)">│</text><text class="breeze-static-checks-r7" x="451.4" y="947.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-38)">generate-airflow-diagrams | generate-pypi-readme | identity | insert-license |   </text><text class="breeze-static-checks-r5" x="1451.8" y="947.2" textLength="12.2" clip-path="url(#bre [...] +</text><text class="breeze-static-checks-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-39)">│</text><text class="breeze-static-checks-r7" x="451.4" y="971.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-39)">kubeconform | lint-chart-schema | lint-css | lint-dockerfile | lint-helm-chart | </text><text class="breeze-static-checks-r5" x="1451.8" y="971.6" textLength="12.2" clip-path="url(#bre [...] +</text><text class="breeze-static-checks-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-static-checks-line-40)">│</text><text class="breeze-static-checks-r7" x="451.4" y="996" textLength="988.2" clip-path="url(#breeze-static-checks-line-40)">lint-json-schema | lint-markdown | lint-openapi | mixed-line-ending |            </text><text class="breeze-static-checks-r5" x="1451.8" y="996 [...] +</text><text class="breeze-static-checks-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-41)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1020.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-41)">mypy-airflow | mypy-dev | mypy-docs | mypy-providers | pretty-format-json |      </text><text class="breeze-static-checks-r5" x="1451.8" y="1020.4" textLengt [...] +</text><text class="breeze-static-checks-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-42)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1044.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-42)">pylint | python-no-log-warn | replace-bad-characters | rst-backticks | ruff |    </text><text class="breeze-static-checks-r5" x="1451.8" y="1044.8" textLength="12.2" c [...] +</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)">ruff-format | shellcheck | trailing-whitespace | ts-compile-format-lint-www |    </text><text class="breeze-static-checks-r5" x="1451.8" y="1069.2" textLength="12.2" clip-path=" [...] +</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-black-version | update-breeze-cmd-output |                             [...] +</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-breeze-readme-config-hash | update-build-dependencies |                   </text><text class="breeze-static-checks-r5" [...] +</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)">update-chart-dependencies | update-common-sql-api-stubs | update-er-diagram |    </text><text class="breeze-static-checks-r5" x="1451.8" y="1142.4" textLength="12.2" clip-path="url(#breez [...] +</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-r7" x="451.4" y="1166.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-47)">update-extras | update-in-the-wild-to-be-sorted |                             [...] +</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-r7" x="451.4" y="1191.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-48)">update-inlined-dockerfile-scripts | update-installed-providers-to-be-sorted |    </text><text class="breeze-static-checks-r5" x="1451.8" y="1191.2" textLength="12.2" clip-path="url(#breeze-static-c [...] +</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-r7" x="451.4" y="1215.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-49)">update-installers | update-local-yml-file | update-migration-references |        </text><text class="breeze-static-checks-r5" x="1451.8" y="1215.6" textLength="12.2" c [...] +</text><text class="breeze-static-checks-r5" x="0" y="1240" textLength="12.2" clip-path="url(#breeze-static-checks-line-50)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1240" textLength="988.2" clip-path="url(#breeze-static-checks-line-50)">update-providers-dependencies | update-reproducible-source-date-epoch |          </text><text class="breeze-static-checks-r5" x="1451.8" y="1240" textLength="12.2" clip-pa [...] +</text><text class="breeze-static-checks-r5" x="0" y="1264.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-51)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1264.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-51)">update-spelling-wordlist-to-be-sorted | update-supported-versions |              </text><text class="breeze-static-checks-r5" x="1451.8" y="1264.4" [...] +</text><text class="breeze-static-checks-r5" x="0" y="1288.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-52)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1288.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-52)">update-vendored-in-k8s-json-schema | update-version | validate-operators-init |  </text><text class="breeze-static-checks-r5" x="1451.8" y="1288.8" textLength="12.2" clip-path="url(#breeze-static-c [...] +</text><text class="breeze-static-checks-r5" x="0" y="1313.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-53)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1313.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-53)">yamllint)                                     & [...] +</text><text class="breeze-static-checks-r5" x="0" y="1337.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-54)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1337.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-54)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1337.6" textLength="61" clip-path="url(#breeze-static-checks-line-54)">-show</text><text class="breeze-static-checks-r4" x="97.6" y="1337.6" textLength="195.2" clip-path="url(# [...] +</text><text class="breeze-static-checks-r5" x="0" y="1362" textLength="12.2" clip-path="url(#breeze-static-checks-line-55)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1362" textLength="12.2" clip-path="url(#breeze-static-checks-line-55)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1362" textLength="134.2" clip-path="url(#breeze-static-checks-line-55)">-initialize</text><text class="breeze-static-checks-r4" x="170.8" y="1362" textLength="146.4" clip-path="url [...] +</text><text class="breeze-static-checks-r5" x="0" y="1386.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-56)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1386.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-56)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1386.4" textLength="48.8" clip-path="url(#breeze-static-checks-line-56)">-max</text><text class="breeze-static-checks-r4" x="85.4" y="1386.4" textLength="292.8" clip-path="url( [...] +</text><text class="breeze-static-checks-r5" x="0" y="1410.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-57)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1410.8" textLength="854" clip-path="url(#breeze-static-checks-line-57)">(INTEGER RANGE)                                    [...] +</text><text class="breeze-static-checks-r5" x="0" y="1435.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-58)">│</text><text class="breeze-static-checks-r5" x="451.4" y="1435.2" textLength="854" clip-path="url(#breeze-static-checks-line-58)">[default: 3; 1<=x<=10]                                 [...] +</text><text class="breeze-static-checks-r5" x="0" y="1459.6" textLength="1464" clip-path="url(#breeze-static-checks-line-59)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-static-checks-r1" x="1464" y="1459.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-59)"> +</text><text class="breeze-static-checks-r5" x="0" y="1484" textLength="24.4" clip-path="url(#breeze-static-checks-line-60)">╭─</text><text class="breeze-static-checks-r5" x="24.4" y="1484" textLength="463.6" clip-path="url(#breeze-static-checks-line-60)"> Selecting files to run the checks on </text><text class="breeze-static-checks-r5" x="488" y="1484" textLength="951.6" clip-path="url(#breeze-static-checks-line-60)">────────────────────────────── [...] +</text><text class="breeze-static-checks-r5" x="0" y="1508.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-61)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1508.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-61)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1508.4" textLength="61" clip-path="url(#breeze-static-checks-line-61)">-file</text><text class="breeze-static-checks-r6" x="256.2" y="1508.4" textLength="24.4" clip-path="url(# [...] +</text><text class="breeze-static-checks-r5" x="0" y="1532.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-62)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1532.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-62)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1532.8" textLength="48.8" clip-path="url(#breeze-static-checks-line-62)">-all</text><text class="breeze-static-checks-r4" x="85.4" y="1532.8" textLength="73.2" clip-path="url(# [...] +</text><text class="breeze-static-checks-r5" x="0" y="1557.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-63)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1557.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-63)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1557.2" textLength="85.4" clip-path="url(#breeze-static-checks-line-63)">-commit</text><text class="breeze-static-checks-r4" x="122" y="1557.2" textLength="48.8" clip-path="url [...] +</text><text class="breeze-static-checks-r5" x="0" y="1581.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-64)">│</text><text class="breeze-static-checks-r1" x="305" y="1581.6" textLength="183" clip-path="url(#breeze-static-checks-line-64)">exclusive with </text><text class="breeze-static-checks-r4" x="488" y="1581.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-64)">-</text><text class="breeze-static-checks-r4" x="500.2" y="1581.6" textLength="61" [...] +</text><text class="breeze-static-checks-r5" x="0" y="1606" textLength="12.2" clip-path="url(#breeze-static-checks-line-65)">│</text><text class="breeze-static-checks-r7" x="305" y="1606" textLength="1134.6" clip-path="url(#breeze-static-checks-line-65)">(TEXT)                                       [...] +</text><text class="breeze-static-checks-r5" x="0" y="1630.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-66)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1630.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-66)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1630.4" textLength="61" clip-path="url(#breeze-static-checks-line-66)">-last</text><text class="breeze-static-checks-r4" x="97.6" y="1630.4" textLength="85.4" clip-path="url(#b [...] +</text><text class="breeze-static-checks-r5" x="0" y="1654.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-67)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1654.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-67)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1654.8" textLength="61" clip-path="url(#breeze-static-checks-line-67)">-only</text><text class="breeze-static-checks-r4" x="97.6" y="1654.8" textLength="134.2" clip-path="url(# [...] +</text><text class="breeze-static-checks-r5" x="0" y="1679.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-68)">│</text><text class="breeze-static-checks-r1" x="305" y="1679.2" textLength="1134.6" clip-path="url(#breeze-static-checks-line-68)">branch and HEAD of your branch.                              [...] +</text><text class="breeze-static-checks-r5" x="0" y="1703.6" textLength="1464" clip-path="url(#breeze-static-checks-line-69)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-static-checks-r1" x="1464" y="1703.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-69)"> +</text><text class="breeze-static-checks-r5" x="0" y="1728" textLength="24.4" clip-path="url(#breeze-static-checks-line-70)">╭─</text><text class="breeze-static-checks-r5" x="24.4" y="1728" textLength="463.6" clip-path="url(#breeze-static-checks-line-70)"> Building image before running checks </text><text class="breeze-static-checks-r5" x="488" y="1728" textLength="951.6" clip-path="url(#breeze-static-checks-line-70)">──────────────────────────────────────── [...] +</text><text class="breeze-static-checks-r5" x="0" y="1752.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-71)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1752.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-71)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1752.4" textLength="61" clip-path="url(#breeze-static-checks-line-71)">-skip</text><text class="breeze-static-checks-r4" x="97.6" y="1752.4" textLength="244" clip-path="url(#br [...] +</text><text class="breeze-static-checks-r5" x="0" y="1776.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-72)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1776.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-72)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1776.8" textLength="73.2" clip-path="url(#breeze-static-checks-line-72)">-force</text><text class="breeze-static-checks-r4" x="109.8" y="1776.8" textLength="73.2" clip-path="ur [...] +</text><text class="breeze-static-checks-r5" x="0" y="1801.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-73)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1801.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-73)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1801.2" textLength="73.2" clip-path="url(#breeze-static-checks-line-73)">-image</text><text class="breeze-static-checks-r4" x="109.8" y="1801.2" textLength="48.8" clip-path="ur [...] +</text><text class="breeze-static-checks-r5" x="0" y="1825.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-74)">│</text><text class="breeze-static-checks-r7" x="414.8" y="1825.6" textLength="963.8" clip-path="url(#breeze-static-checks-line-74)">(TEXT)                                      [...] +</text><text class="breeze-static-checks-r5" x="0" y="1850" textLength="12.2" clip-path="url(#breeze-static-checks-line-75)">│</text><text class="breeze-static-checks-r5" x="414.8" y="1850" textLength="963.8" clip-path="url(#breeze-static-checks-line-75)">[default: latest]                                    [...] +</text><text class="breeze-static-checks-r5" x="0" y="1874.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-76)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1874.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-76)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1874.4" textLength="85.4" clip-path="url(#breeze-static-checks-line-76)">-github</text><text class="breeze-static-checks-r4" x="122" y="1874.4" textLength="134.2" clip-path="ur [...] +</text><text class="breeze-static-checks-r5" x="0" y="1898.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-77)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1898.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-77)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1898.8" textLength="97.6" clip-path="url(#breeze-static-checks-line-77)">-builder</text><text class="breeze-static-checks-r1" x="414.8" y="1898.8" textLength="756.4" clip-path= [...] +</text><text class="breeze-static-checks-r5" x="0" y="1923.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-78)">│</text><text class="breeze-static-checks-r5" x="414.8" y="1923.2" textLength="756.4" clip-path="url(#breeze-static-checks-line-78)">[default: autodetect]                                  &# [...] +</text><text class="breeze-static-checks-r5" x="0" y="1947.6" textLength="1464" clip-path="url(#breeze-static-checks-line-79)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-static-checks-r1" x="1464" y="1947.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-79)"> +</text><text class="breeze-static-checks-r5" x="0" y="1972" textLength="24.4" clip-path="url(#breeze-static-checks-line-80)">╭─</text><text class="breeze-static-checks-r5" x="24.4" y="1972" textLength="195.2" clip-path="url(#breeze-static-checks-line-80)"> Common options </text><text class="breeze-static-checks-r5" x="219.6" y="1972" textLength="1220" clip-path="url(#breeze-static-checks-line-80)">──────────────────────────────────────────────────────────────────────────── [...] +</text><text class="breeze-static-checks-r5" x="0" y="1996.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-81)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1996.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-81)">-</text><text class="breeze-static-checks-r4" x="36.6" y="1996.4" textLength="48.8" clip-path="url(#breeze-static-checks-line-81)">-dry</text><text class="breeze-static-checks-r4" x="85.4" y="1996.4" textLength="48.8" clip-path="url(# [...] +</text><text class="breeze-static-checks-r5" x="0" y="2020.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-82)">│</text><text class="breeze-static-checks-r4" x="24.4" y="2020.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-82)">-</text><text class="breeze-static-checks-r4" x="36.6" y="2020.8" textLength="97.6" clip-path="url(#breeze-static-checks-line-82)">-verbose</text><text class="breeze-static-checks-r6" x="158.6" y="2020.8" textLength="24.4" clip-path=" [...] +</text><text class="breeze-static-checks-r5" x="0" y="2045.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-83)">│</text><text class="breeze-static-checks-r4" x="24.4" y="2045.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-83)">-</text><text class="breeze-static-checks-r4" x="36.6" y="2045.2" textLength="61" clip-path="url(#breeze-static-checks-line-83)">-help</text><text class="breeze-static-checks-r6" x="158.6" y="2045.2" textLength="24.4" clip-path="url(# [...] +</text><text class="breeze-static-checks-r5" x="0" y="2069.6" textLength="1464" clip-path="url(#breeze-static-checks-line-84)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-static-checks-r1" x="1464" y="2069.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-84)"> </text> </g> </g> diff --git a/dev/breeze/doc/images/output_static-checks.txt b/dev/breeze/doc/images/output_static-checks.txt index ebec23568e..78b9775ad8 100644 --- a/dev/breeze/doc/images/output_static-checks.txt +++ b/dev/breeze/doc/images/output_static-checks.txt @@ -1 +1 @@ -e83bbc2b97062b42c940992d0c2d80f6 +bff57d0c14fb8cd14a682610c408b8fd diff --git a/dev/breeze/src/airflow_breeze/pre_commit_ids.py b/dev/breeze/src/airflow_breeze/pre_commit_ids.py index eb5c46e1ab..2ca41946e1 100644 --- a/dev/breeze/src/airflow_breeze/pre_commit_ids.py +++ b/dev/breeze/src/airflow_breeze/pre_commit_ids.py @@ -38,6 +38,7 @@ PRE_COMMIT_LIST = [ "check-builtin-literals", "check-changelog-has-no-duplicates", "check-cncf-k8s-only-for-executors", + "check-code-deprecations", "check-compat-cache-on-methods", "check-core-deprecation-classes", "check-daysago-import-from-utils", diff --git a/scripts/ci/pre_commit/check_deprecations.py b/scripts/ci/pre_commit/check_deprecations.py new file mode 100755 index 0000000000..aa01e56065 --- /dev/null +++ b/scripts/ci/pre_commit/check_deprecations.py @@ -0,0 +1,194 @@ +#!/usr/bin/env python +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# 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 ast +import sys +from functools import lru_cache +from pathlib import Path + +allowed_warnings: dict[str, tuple[str, ...]] = { + "airflow": ( + "airflow.exceptions.RemovedInAirflow3Warning", + "airflow.utils.context.AirflowContextDeprecationWarning", + ), + "providers": ("airflow.exceptions.AirflowProviderDeprecationWarning",), +} +compatible_decorators: frozenset[tuple[str, ...]] = frozenset( + [ + # PEP 702 decorators + ("warnings", "deprecated"), + ("typing_extensions", "deprecated"), + # `Deprecated` package decorators + ("deprecated", "deprecated"), + ("deprecated", "classic", "deprecated"), + ] +) + + +@lru_cache(maxsize=None) +def allowed_group_warnings(group: str) -> tuple[str, tuple[str, ...]]: + group_warnings = allowed_warnings[group] + if len(group_warnings) == 1: + return f"expected {group_warnings[0]} type", group_warnings + else: + return f"expected one of {', '.join(group_warnings)} types", group_warnings + + +def built_import_from(import_from: ast.ImportFrom) -> list[str]: + result: list[str] = [] + module_name = import_from.module + if not module_name: + return result + + imports_levels = module_name.count(".") + 1 + for import_path in compatible_decorators: + if imports_levels >= len(import_path): + continue + if module_name != ".".join(import_path[:imports_levels]): + continue + for name in import_from.names: + if name.name == import_path[imports_levels]: + alias: str = name.asname or name.name + remaining_part = len(import_path) - imports_levels - 1 + if remaining_part > 0: + alias = ".".join([alias, *import_path[-remaining_part:]]) + result.append(alias) + return result + + +def built_import(import_clause: ast.Import) -> list[str]: + result = [] + for name in import_clause.names: + module_name = name.name + imports_levels = module_name.count(".") + 1 + for import_path in compatible_decorators: + if imports_levels > len(import_path): + continue + if module_name != ".".join(import_path[:imports_levels]): + continue + + alias: str = name.asname or module_name + remaining_part = len(import_path) - imports_levels + if remaining_part > 0: + alias = ".".join([alias, *import_path[-remaining_part:]]) + result.append(alias) + return result + + +def found_compatible_decorators(mod: ast.Module) -> tuple[str, ...]: + result = [] + for node in mod.body: + if not isinstance(node, (ast.ImportFrom, ast.Import)): + continue + result.extend(built_import_from(node) if isinstance(node, ast.ImportFrom) else built_import(node)) + return tuple(sorted(set(result))) + + +def resolve_name(obj: ast.Attribute | ast.Name) -> str: + name = "" + while True: + if isinstance(obj, ast.Name): + name = f"{obj.id}.{name}" if name else obj.id + break + elif isinstance(obj, ast.Attribute): + name = f"{obj.attr}.{name}" if name else obj.attr + obj = obj.value # type: ignore[assignment] + else: + msg = f"Expected to got ast.Name or ast.Attribute but got {type(obj).__name__!r}." + raise SystemExit(msg) + + return name + + +def resolve_decorator_name(obj: ast.Call | ast.Attribute | ast.Name) -> str: + return resolve_name(obj.func if isinstance(obj, ast.Call) else obj) # type: ignore[arg-type] + + +def check_decorators(mod: ast.Module, file: str, file_group: str) -> int: + if not (decorators_names := found_compatible_decorators(mod)): + # There are no expected decorators into module, exit early + return 0 + + errors = 0 + for node in ast.walk(mod): + if not hasattr(node, "decorator_list"): + continue + + for decorator in node.decorator_list: + decorator_name = resolve_decorator_name(decorator) + if decorator_name not in decorators_names: + continue + + expected_types, warns_types = allowed_group_warnings(file_group) + category_keyword: ast.keyword | None = next( + filter(lambda k: k and k.arg == "category", decorator.keywords), None + ) + if category_keyword is None: + errors += 1 + print( + f"{file}:{decorator.lineno}: Missing `category` keyword on decorator @{decorator_name}, " + f"{expected_types}" + ) + continue + elif not hasattr(category_keyword, "value"): + continue + category_value_ast = category_keyword.value + + warns_types = allowed_warnings[file_group] + if isinstance(category_value_ast, (ast.Name, ast.Attribute)): + category_value = resolve_name(category_value_ast) + if not any(cv.endswith(category_value) for cv in warns_types): + errors += 1 + print( + f"{file}:{category_keyword.lineno}: " + f"category={category_value}, but {expected_types}" + ) + elif isinstance(category_value_ast, ast.Constant): + errors += 1 + print( + f"{file}:{category_keyword.lineno}: " + f"category=Literal[{category_value_ast.value!r}], but {expected_types}" + ) + + return errors + + +def check_file(file: str) -> int: + file_path = Path(file) + if not file_path.as_posix().startswith("airflow"): + # Not expected file, exit early + return 0 + file_group = "providers" if file_path.as_posix().startswith("airflow/providers") else "airflow" + ast_module = ast.parse(file_path.read_text("utf-8"), file) + errors = 0 + errors += check_decorators(ast_module, file, file_group) + return errors + + +def main(*args: str) -> int: + errors = sum(check_file(file) for file in args[1:]) + if not errors: + return 0 + print(f"Found {errors} error{'s' if errors > 1 else ''}.") + return 1 + + +if __name__ == "__main__": + sys.exit(main(*sys.argv)) diff --git a/tests/api_experimental/auth/backend/test_basic_auth.py b/tests/api_experimental/auth/backend/test_basic_auth.py index 0d84465dd0..a7f7a2a1cd 100644 --- a/tests/api_experimental/auth/backend/test_basic_auth.py +++ b/tests/api_experimental/auth/backend/test_basic_auth.py @@ -21,6 +21,7 @@ from base64 import b64encode import pytest from flask_login import current_user +from airflow.exceptions import RemovedInAirflow3Warning from tests.test_utils.db import clear_db_pools pytestmark = pytest.mark.db_test @@ -49,7 +50,10 @@ class TestBasicAuth: clear_db_pools() with self.app.test_client() as test_client: - response = test_client.get("/api/experimental/pools", headers={"Authorization": token}) + with pytest.warns(RemovedInAirflow3Warning, match=r"Use Pool.get_pools\(\) instead"): + # Experimental client itself deprecated, no reason to change to actual methods + # It should be removed in the same time: Airflow 3.0 + response = test_client.get("/api/experimental/pools", headers={"Authorization": token}) assert current_user.email == "t...@fab.org" assert response.status_code == 200