You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by po...@apache.org on 2022/07/08 11:02:50 UTC

[airflow] branch main updated: Automatically detect if non-lazy logging interpolation is used (#24910)

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

potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new acaa0635c8 Automatically detect if non-lazy logging interpolation is used (#24910)
acaa0635c8 is described below

commit acaa0635c8477c98ab78da9f6d86e6f1bad2737d
Author: Jarek Potiuk <ja...@polidea.com>
AuthorDate: Fri Jul 8 13:02:28 2022 +0200

    Automatically detect if non-lazy logging interpolation is used (#24910)
    
    We used to have pylint check that was preventing it but since
    we have no pylint, we need to do some intelligent guessing
    based on AST of the python code.
---
 .pre-commit-config.yaml                            |   8 +
 STATIC_CODE_CHECKS.rst                             |   2 +
 .../providers/databricks/operators/databricks.py   |   6 +-
 .../providers/google/cloud/operators/bigquery.py   |   2 +-
 airflow/providers/sftp/hooks/sftp.py               |   4 +-
 airflow/providers/sftp/sensors/sftp.py             |   2 +-
 dev/breeze/src/airflow_breeze/pre_commit_ids.py    |   1 +
 images/breeze/output-commands-hash.txt             |   2 +-
 images/breeze/output-static-checks.svg             | 220 ++++++++++-----------
 .../ci/pre_commit/pre_commit_check_lazy_logging.py |  79 ++++++++
 10 files changed, 208 insertions(+), 118 deletions(-)

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index ae4b39b4bd..9d80c2cfec 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -798,6 +798,14 @@ repos:
         pass_filenames: true
         files: ^docs/apache-airflow-providers-[^/]*/index\.rst$
         additional_dependencies: ['rich>=12.4.4', 'pyyaml']
+      - id: check-lazy-logging
+        name: Check that all logging methods are lazy
+        entry: ./scripts/ci/pre_commit/pre_commit_check_lazy_logging.py
+        language: python
+        pass_filenames: true
+        files: \.py$
+        exclude: ^airflow/_vendor/
+        additional_dependencies: ['rich>=12.4.4', 'astor']
       - id: create-missing-init-py-files-tests
         name: Create missing init.py files in tests
         entry: ./scripts/ci/pre_commit/pre_commit_check_init_in_tests.py
diff --git a/STATIC_CODE_CHECKS.rst b/STATIC_CODE_CHECKS.rst
index 966dd134f6..1b18aa659d 100644
--- a/STATIC_CODE_CHECKS.rst
+++ b/STATIC_CODE_CHECKS.rst
@@ -175,6 +175,8 @@ require Breeze Docker image to be build locally.
 +--------------------------------------------------------+------------------------------------------------------------------+---------+
 | check-integrations-are-consistent                      | Check if integration list is consistent in various places        |         |
 +--------------------------------------------------------+------------------------------------------------------------------+---------+
+| check-lazy-logging                                     | Check that all logging methods are lazy                          |         |
++--------------------------------------------------------+------------------------------------------------------------------+---------+
 | check-merge-conflict                                   | Check that merge conflicts are not being committed               |         |
 +--------------------------------------------------------+------------------------------------------------------------------+---------+
 | check-newsfragments-are-valid                          | Check newsfragments are valid                                    |         |
diff --git a/airflow/providers/databricks/operators/databricks.py b/airflow/providers/databricks/operators/databricks.py
index 6c70601198..28bdf33226 100644
--- a/airflow/providers/databricks/operators/databricks.py
+++ b/airflow/providers/databricks/operators/databricks.py
@@ -85,12 +85,12 @@ def _handle_deferrable_databricks_operator_execution(operator, hook, log, contex
     """
     if operator.do_xcom_push and context is not None:
         context['ti'].xcom_push(key=XCOM_RUN_ID_KEY, value=operator.run_id)
-    log.info(f'Run submitted with run_id: {operator.run_id}')
+    log.info('Run submitted with run_id: %s', operator.run_id)
 
     run_page_url = hook.get_run_page_url(operator.run_id)
     if operator.do_xcom_push and context is not None:
         context['ti'].xcom_push(key=XCOM_RUN_PAGE_URL_KEY, value=run_page_url)
-    log.info(f'View run status, Spark UI, and logs at {run_page_url}')
+    log.info('View run status, Spark UI, and logs at %s', run_page_url)
 
     if operator.wait_for_termination:
         operator.defer(
@@ -107,7 +107,7 @@ def _handle_deferrable_databricks_operator_completion(event: dict, log: Logger)
     validate_trigger_event(event)
     run_state = RunState.from_json(event['run_state'])
     run_page_url = event['run_page_url']
-    log.info(f'View run status, Spark UI, and logs at {run_page_url}')
+    log.info('View run status, Spark UI, and logs at %s', run_page_url)
 
     if run_state.is_successful:
         log.info('Job run completed successfully.')
diff --git a/airflow/providers/google/cloud/operators/bigquery.py b/airflow/providers/google/cloud/operators/bigquery.py
index 6bbe50e5b3..81cce5ca2b 100644
--- a/airflow/providers/google/cloud/operators/bigquery.py
+++ b/airflow/providers/google/cloud/operators/bigquery.py
@@ -2152,7 +2152,7 @@ class BigQueryInsertJobOperator(BaseOperator):
         )
 
         try:
-            self.log.info(f"Executing: {self.configuration}")
+            self.log.info("Executing: %s'", self.configuration)
             job = self._submit_job(hook, job_id)
             self._handle_job_error(job)
         except Conflict:
diff --git a/airflow/providers/sftp/hooks/sftp.py b/airflow/providers/sftp/hooks/sftp.py
index b6037c9a55..a7565a2c46 100644
--- a/airflow/providers/sftp/hooks/sftp.py
+++ b/airflow/providers/sftp/hooks/sftp.py
@@ -202,7 +202,7 @@ class SFTPHook(SSHHook):
         """
         conn = self.get_conn()
         if self.isdir(path):
-            self.log.info(f"{path} already exists")
+            self.log.info("%s already exists", path)
             return
         elif self.isfile(path):
             raise AirflowException(f"{path} already exists and is a file")
@@ -211,7 +211,7 @@ class SFTPHook(SSHHook):
             if dirname and not self.isdir(dirname):
                 self.create_directory(dirname, mode)
             if basename:
-                self.log.info(f"Creating {path}")
+                self.log.info("Creating %s", path)
                 conn.mkdir(path, mode=mode)
 
     def delete_directory(self, path: str) -> None:
diff --git a/airflow/providers/sftp/sensors/sftp.py b/airflow/providers/sftp/sensors/sftp.py
index 45c387609a..d35e2ed57a 100644
--- a/airflow/providers/sftp/sensors/sftp.py
+++ b/airflow/providers/sftp/sensors/sftp.py
@@ -62,7 +62,7 @@ class SFTPSensor(BaseSensorOperator):
 
     def poke(self, context: 'Context') -> bool:
         self.hook = SFTPHook(self.sftp_conn_id)
-        self.log.info(f"Poking for {self.path}, with pattern {self.file_pattern}")
+        self.log.info("Poking for %s, with pattern %s", self.path, self.file_pattern)
 
         if self.file_pattern:
             file_from_pattern = self.hook.get_file_by_pattern(self.path, self.file_pattern)
diff --git a/dev/breeze/src/airflow_breeze/pre_commit_ids.py b/dev/breeze/src/airflow_breeze/pre_commit_ids.py
index b5c39036e7..4b36d48e33 100644
--- a/dev/breeze/src/airflow_breeze/pre_commit_ids.py
+++ b/dev/breeze/src/airflow_breeze/pre_commit_ids.py
@@ -44,6 +44,7 @@ PRE_COMMIT_LIST = [
     'check-hooks-apply',
     'check-incorrect-use-of-LoggingMixin',
     'check-integrations-are-consistent',
+    'check-lazy-logging',
     'check-merge-conflict',
     'check-newsfragments-are-valid',
     'check-no-providers-in-core-examples',
diff --git a/images/breeze/output-commands-hash.txt b/images/breeze/output-commands-hash.txt
index 4dac256558..04a400d9c4 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -28,7 +28,7 @@ self-upgrade:b5437c0a1a91533a11ee9d0a9692369c
 setup-autocomplete:355b72dee171c2fcba46fc90ac7c97b0
 shell:4680295fdd8a276d51518d29360c365c
 start-airflow:92cf775a952439a32d409cd2536da507
-static-checks:bc6b9a121ea38404ac5f28e727146b90
+static-checks:8b4c0a3891e1d65ddf832ec4f5b71491
 stop:8ebd8a42f1003495d37b884de5ac7ce6
 tests:e39111ecbd33a65ababb3cbfbac2b069
 verify-image:a6b3c70957aea96a5d4d261f23359a2d
diff --git a/images/breeze/output-static-checks.svg b/images/breeze/output-static-checks.svg
index a1c8f7560e..1a1d0b17ac 100644
--- a/images/breeze/output-static-checks.svg
+++ b/images/breeze/output-static-checks.svg
@@ -19,237 +19,237 @@
         font-weight: 700;
     }
 
-    .terminal-2165150644-matrix {
+    .terminal-1899075791-matrix {
         font-family: Fira Code, monospace;
         font-size: 20px;
         line-height: 24.4px;
         font-variant-east-asian: full-width;
     }
 
-    .terminal-2165150644-title {
+    .terminal-1899075791-title {
         font-size: 18px;
         font-weight: bold;
         font-family: arial;
     }
 
-    .terminal-2165150644-r1 { fill: #c5c8c6;font-weight: bold }
-.terminal-2165150644-r2 { fill: #c5c8c6 }
-.terminal-2165150644-r3 { fill: #d0b344;font-weight: bold }
-.terminal-2165150644-r4 { fill: #868887 }
-.terminal-2165150644-r5 { fill: #68a0b3;font-weight: bold }
-.terminal-2165150644-r6 { fill: #98a84b;font-weight: bold }
-.terminal-2165150644-r7 { fill: #8d7b39 }
+    .terminal-1899075791-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-1899075791-r2 { fill: #c5c8c6 }
+.terminal-1899075791-r3 { fill: #d0b344;font-weight: bold }
+.terminal-1899075791-r4 { fill: #868887 }
+.terminal-1899075791-r5 { fill: #68a0b3;font-weight: bold }
+.terminal-1899075791-r6 { fill: #98a84b;font-weight: bold }
+.terminal-1899075791-r7 { fill: #8d7b39 }
     </style>
 
     <defs>
-    <clipPath id="terminal-2165150644-clip-terminal">
+    <clipPath id="terminal-1899075791-clip-terminal">
       <rect x="0" y="0" width="1463.0" height="1194.6" />
     </clipPath>
-    <clipPath id="terminal-2165150644-line-0">
+    <clipPath id="terminal-1899075791-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-1">
+<clipPath id="terminal-1899075791-line-1">
     <rect x="0" y="25.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-2">
+<clipPath id="terminal-1899075791-line-2">
     <rect x="0" y="50.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-3">
+<clipPath id="terminal-1899075791-line-3">
     <rect x="0" y="74.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-4">
+<clipPath id="terminal-1899075791-line-4">
     <rect x="0" y="99.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-5">
+<clipPath id="terminal-1899075791-line-5">
     <rect x="0" y="123.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-6">
+<clipPath id="terminal-1899075791-line-6">
     <rect x="0" y="147.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-7">
+<clipPath id="terminal-1899075791-line-7">
     <rect x="0" y="172.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-8">
+<clipPath id="terminal-1899075791-line-8">
     <rect x="0" y="196.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-9">
+<clipPath id="terminal-1899075791-line-9">
     <rect x="0" y="221.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-10">
+<clipPath id="terminal-1899075791-line-10">
     <rect x="0" y="245.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-11">
+<clipPath id="terminal-1899075791-line-11">
     <rect x="0" y="269.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-12">
+<clipPath id="terminal-1899075791-line-12">
     <rect x="0" y="294.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-13">
+<clipPath id="terminal-1899075791-line-13">
     <rect x="0" y="318.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-14">
+<clipPath id="terminal-1899075791-line-14">
     <rect x="0" y="343.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-15">
+<clipPath id="terminal-1899075791-line-15">
     <rect x="0" y="367.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-16">
+<clipPath id="terminal-1899075791-line-16">
     <rect x="0" y="391.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-17">
+<clipPath id="terminal-1899075791-line-17">
     <rect x="0" y="416.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-18">
+<clipPath id="terminal-1899075791-line-18">
     <rect x="0" y="440.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-19">
+<clipPath id="terminal-1899075791-line-19">
     <rect x="0" y="465.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-20">
+<clipPath id="terminal-1899075791-line-20">
     <rect x="0" y="489.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-21">
+<clipPath id="terminal-1899075791-line-21">
     <rect x="0" y="513.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-22">
+<clipPath id="terminal-1899075791-line-22">
     <rect x="0" y="538.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-23">
+<clipPath id="terminal-1899075791-line-23">
     <rect x="0" y="562.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-24">
+<clipPath id="terminal-1899075791-line-24">
     <rect x="0" y="587.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-25">
+<clipPath id="terminal-1899075791-line-25">
     <rect x="0" y="611.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-26">
+<clipPath id="terminal-1899075791-line-26">
     <rect x="0" y="635.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-27">
+<clipPath id="terminal-1899075791-line-27">
     <rect x="0" y="660.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-28">
+<clipPath id="terminal-1899075791-line-28">
     <rect x="0" y="684.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-29">
+<clipPath id="terminal-1899075791-line-29">
     <rect x="0" y="709.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-30">
+<clipPath id="terminal-1899075791-line-30">
     <rect x="0" y="733.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-31">
+<clipPath id="terminal-1899075791-line-31">
     <rect x="0" y="757.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-32">
+<clipPath id="terminal-1899075791-line-32">
     <rect x="0" y="782.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-33">
+<clipPath id="terminal-1899075791-line-33">
     <rect x="0" y="806.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-34">
+<clipPath id="terminal-1899075791-line-34">
     <rect x="0" y="831.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-35">
+<clipPath id="terminal-1899075791-line-35">
     <rect x="0" y="855.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-36">
+<clipPath id="terminal-1899075791-line-36">
     <rect x="0" y="879.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-37">
+<clipPath id="terminal-1899075791-line-37">
     <rect x="0" y="904.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-38">
+<clipPath id="terminal-1899075791-line-38">
     <rect x="0" y="928.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-39">
+<clipPath id="terminal-1899075791-line-39">
     <rect x="0" y="953.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-40">
+<clipPath id="terminal-1899075791-line-40">
     <rect x="0" y="977.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-41">
+<clipPath id="terminal-1899075791-line-41">
     <rect x="0" y="1001.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-42">
+<clipPath id="terminal-1899075791-line-42">
     <rect x="0" y="1026.3" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-43">
+<clipPath id="terminal-1899075791-line-43">
     <rect x="0" y="1050.7" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-44">
+<clipPath id="terminal-1899075791-line-44">
     <rect x="0" y="1075.1" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-45">
+<clipPath id="terminal-1899075791-line-45">
     <rect x="0" y="1099.5" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-46">
+<clipPath id="terminal-1899075791-line-46">
     <rect x="0" y="1123.9" width="1464" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2165150644-line-47">
+<clipPath id="terminal-1899075791-line-47">
     <rect x="0" y="1148.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="1243.6" rx="8"/><text class="terminal-2165150644-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;static-checks</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1243.6" rx="8"/><text class="terminal-1899075791-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;static-checks</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
             <circle cx="44" cy="0" r="7" fill="#28c840"/>
             </g>
         
-    <g transform="translate(9, 41)" clip-path="url(#terminal-2165150644-clip-terminal)">
+    <g transform="translate(9, 41)" clip-path="url(#terminal-1899075791-clip-terminal)">
     
-    <g class="terminal-2165150644-matrix">
-    <text class="terminal-2165150644-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-2165150644-line-0)">
-</text><text class="terminal-2165150644-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-2165150644-line-1)">Usage:&#160;</text><text class="terminal-2165150644-r1" x="97.6" y="44.4" textLength="610" clip-path="url(#terminal-2165150644-line-1)">breeze&#160;static-checks&#160;[OPTIONS]&#160;[PRECOMMIT_ARGS]...</text><text class="terminal-2165150644-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-2165150644-line-1)">
-</text><text class="terminal-2165150644-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-2165150644-line-2)">
-</text><text class="terminal-2165150644-r2" x="12.2" y="93.2" textLength="219.6" clip-path="url(#terminal-2165150644-line-3)">Run&#160;static&#160;checks.</text><text class="terminal-2165150644-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-2165150644-line-3)">
-</text><text class="terminal-2165150644-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-2165150644-line-4)">
-</text><text class="terminal-2165150644-r4" x="0" y="142" textLength="24.4" clip-path="url(#terminal-2165150644-line-5)">╭─</text><text class="terminal-2165150644-r4" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-2165150644-line-5)">&#160;Pre-commit&#160;flags&#160;──────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-2165150644-r4" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-216515 [...]
-</text><text class="terminal-2165150644-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-2165150644-line-6)">│</text><text class="terminal-2165150644-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-2165150644-line-6)">-</text><text class="terminal-2165150644-r5" x="36.6" y="166.4" textLength="61" clip-path="url(#terminal-2165150644-line-6)">-type</text><text class="terminal-2165150644-r6" x="317.2" y="166.4" textLength="24.4" clip-path="url(#terminal-21651 [...]
-</text><text class="terminal-2165150644-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-2165150644-line-7)">│</text><text class="terminal-2165150644-r7" x="366" y="190.8" textLength="1073.6" clip-path="url(#terminal-2165150644-line-7)">(all&#160;|&#160;black&#160;|&#160;blacken-docs&#160;|&#160;check-airflow-2-2-compatibility&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
-</text><text class="terminal-2165150644-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-2165150644-line-8)">│</text><text class="terminal-2165150644-r7" x="366" y="215.2" textLength="1073.6" clip-path="url(#terminal-2165150644-line-8)">check-airflow-config-yaml-consistent&#160;|&#160;check-apache-license-rat&#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="ter [...]
-</text><text class="terminal-2165150644-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-2165150644-line-9)">│</text><text class="terminal-2165150644-r7" x="366" y="239.6" textLength="1073.6" clip-path="url(#terminal-2165150644-line-9)">check-base-operator-partial-arguments&#160;|&#160;check-base-operator-usage&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2165 [...]
-</text><text class="terminal-2165150644-r4" x="0" y="264" textLength="12.2" clip-path="url(#terminal-2165150644-line-10)">│</text><text class="terminal-2165150644-r7" x="366" y="264" textLength="1073.6" clip-path="url(#terminal-2165150644-line-10)">check-boring-cyborg-configuration&#160;|&#160;check-breeze-top-dependencies-limited&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2165150644-r4" x="1451.8" y="264" textLength=" [...]
-</text><text class="terminal-2165150644-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-2165150644-line-11)">│</text><text class="terminal-2165150644-r7" x="366" y="288.4" textLength="1073.6" clip-path="url(#terminal-2165150644-line-11)">check-builtin-literals&#160;|&#160;check-changelog-has-no-duplicates&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
-</text><text class="terminal-2165150644-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-2165150644-line-12)">│</text><text class="terminal-2165150644-r7" x="366" y="312.8" textLength="1073.6" clip-path="url(#terminal-2165150644-line-12)">check-daysago-import-from-utils&#160;|&#160;check-docstring-param-types&#160;|&#160;check-example-dags-urls&#160;</text><text class="terminal-2165150644-r4" x="1451.8" y="312.8" textLength="12.2" clip-path="url(#terminal-2165150644-line-12 [...]
-</text><text class="terminal-2165150644-r4" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-2165150644-line-13)">│</text><text class="terminal-2165150644-r7" x="366" y="337.2" textLength="1073.6" clip-path="url(#terminal-2165150644-line-13)">|&#160;check-executables-have-shebangs&#160;|&#160;check-extra-packages-references&#160;|&#160;check-extras-order</text><text class="terminal-2165150644-r4" x="1451.8" y="337.2" textLength="12.2" clip-path="url(#terminal-2165150644-line-13 [...]
-</text><text class="terminal-2165150644-r4" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-2165150644-line-14)">│</text><text class="terminal-2165150644-r7" x="366" y="361.6" textLength="1073.6" clip-path="url(#terminal-2165150644-line-14)">|&#160;check-for-inclusive-language&#160;|&#160;check-hooks-apply&#160;|&#160;check-incorrect-use-of-LoggingMixin</text><text class="terminal-2165150644-r4" x="1451.8" y="361.6" textLength="12.2" clip-path="url(#terminal-2165150644-line-14 [...]
-</text><text class="terminal-2165150644-r4" x="0" y="386" textLength="12.2" clip-path="url(#terminal-2165150644-line-15)">│</text><text class="terminal-2165150644-r7" x="366" y="386" textLength="1073.6" clip-path="url(#terminal-2165150644-line-15)">|&#160;check-integrations-are-consistent&#160;|&#160;check-merge-conflict&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="terminal-2165150644-r4" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-2165150644-line-16)">│</text><text class="terminal-2165150644-r7" x="366" y="410.4" textLength="1073.6" clip-path="url(#terminal-2165150644-line-16)">check-newsfragments-are-valid&#160;|&#160;check-no-providers-in-core-examples&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2165150644-r [...]
-</text><text class="terminal-2165150644-r4" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-2165150644-line-17)">│</text><text class="terminal-2165150644-r7" x="366" y="434.8" textLength="1073.6" clip-path="url(#terminal-2165150644-line-17)">check-no-relative-imports&#160;|&#160;check-persist-credentials-disabled-in-github-workflows&#160;|&#160;&#160;&#160;&#160;</text><text class="terminal-2165150644-r4" x="1451.8" y="434.8" textLength="12.2" clip-path="url(#terminal-21651506 [...]
-</text><text class="terminal-2165150644-r4" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-2165150644-line-18)">│</text><text class="terminal-2165150644-r7" x="366" y="459.2" textLength="1073.6" clip-path="url(#terminal-2165150644-line-18)">check-pre-commit-information-consistent&#160;|&#160;check-provide-create-sessions-imports&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2165150644-r4" x="1451.8" y="459.2" textLength="12.2" clip-path="url(#te [...]
-</text><text class="terminal-2165150644-r4" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-2165150644-line-19)">│</text><text class="terminal-2165150644-r7" x="366" y="483.6" textLength="1073.6" clip-path="url(#terminal-2165150644-line-19)">check-provider-yaml-valid&#160;|&#160;check-providers-init-file-missing&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><tex [...]
-</text><text class="terminal-2165150644-r4" x="0" y="508" textLength="12.2" clip-path="url(#terminal-2165150644-line-20)">│</text><text class="terminal-2165150644-r7" x="366" y="508" textLength="1073.6" clip-path="url(#terminal-2165150644-line-20)">check-providers-subpackages-init-file-exist&#160;|&#160;check-pydevd-left-in-code&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2165150644-r4" x="1451.8" y="508" te [...]
-</text><text class="terminal-2165150644-r4" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-2165150644-line-21)">│</text><text class="terminal-2165150644-r7" x="366" y="532.4" textLength="1073.6" clip-path="url(#terminal-2165150644-line-21)">check-revision-heads-map&#160;|&#160;check-safe-filter-usage-in-html&#160;|&#160;check-setup-order&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2165150644-r4" x="1451.8" y="532.4" textLength="12.2" cli [...]
-</text><text class="terminal-2165150644-r4" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-2165150644-line-22)">│</text><text class="terminal-2165150644-r7" x="366" y="556.8" textLength="1073.6" clip-path="url(#terminal-2165150644-line-22)">check-start-date-not-used-in-defaults&#160;|&#160;check-system-tests-present&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2165150 [...]
-</text><text class="terminal-2165150644-r4" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-2165150644-line-23)">│</text><text class="terminal-2165150644-r7" x="366" y="581.2" textLength="1073.6" clip-path="url(#terminal-2165150644-line-23)">check-system-tests-tocs&#160;|&#160;check-xml&#160;|&#160;codespell&#160;|&#160;create-missing-init-py-files-tests&#160;|&#160;&#160;</text><text class="terminal-2165150644-r4" x="1451.8" y="581.2" textLength="12.2" clip-path="url(#termina [...]
-</text><text class="terminal-2165150644-r4" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-2165150644-line-24)">│</text><text class="terminal-2165150644-r7" x="366" y="605.6" textLength="1073.6" clip-path="url(#terminal-2165150644-line-24)">debug-statements&#160;|&#160;detect-private-key&#160;|&#160;doctoc&#160;|&#160;end-of-file-fixer&#160;|&#160;fix-encoding-pragma</text><text class="terminal-2165150644-r4" x="1451.8" y="605.6" textLength="12.2" clip-path="url(#terminal-216 [...]
-</text><text class="terminal-2165150644-r4" x="0" y="630" textLength="12.2" clip-path="url(#terminal-2165150644-line-25)">│</text><text class="terminal-2165150644-r7" x="366" y="630" textLength="1073.6" clip-path="url(#terminal-2165150644-line-25)">|&#160;flynt&#160;|&#160;identity&#160;|&#160;insert-license&#160;|&#160;isort&#160;|&#160;lint-chart-schema&#160;|&#160;lint-css&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-216515 [...]
-</text><text class="terminal-2165150644-r4" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-2165150644-line-26)">│</text><text class="terminal-2165150644-r7" x="366" y="654.4" textLength="1073.6" clip-path="url(#terminal-2165150644-line-26)">lint-dockerfile&#160;|&#160;lint-helm-chart&#160;|&#160;lint-javascript&#160;|&#160;lint-json-schema&#160;|&#160;lint-markdown&#160;|</text><text class="terminal-2165150644-r4" x="1451.8" y="654.4" textLength="12.2" clip-path="url(#termina [...]
-</text><text class="terminal-2165150644-r4" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-2165150644-line-27)">│</text><text class="terminal-2165150644-r7" x="366" y="678.8" textLength="1073.6" clip-path="url(#terminal-2165150644-line-27)">lint-openapi&#160;|&#160;mixed-line-ending&#160;|&#160;pretty-format-json&#160;|&#160;pydocstyle&#160;|&#160;python-no-log-warn&#160;</text><text class="terminal-2165150644-r4" x="1451.8" y="678.8" textLength="12.2" clip-path="url(#termina [...]
-</text><text class="terminal-2165150644-r4" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-2165150644-line-28)">│</text><text class="terminal-2165150644-r7" x="366" y="703.2" textLength="1073.6" clip-path="url(#terminal-2165150644-line-28)">|&#160;pyupgrade&#160;|&#160;replace-bad-characters&#160;|&#160;rst-backticks&#160;|&#160;run-flake8&#160;|&#160;run-mypy&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2165150644-r4" x="1451 [...]
-</text><text class="terminal-2165150644-r4" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-2165150644-line-29)">│</text><text class="terminal-2165150644-r7" x="366" y="727.6" textLength="1073.6" clip-path="url(#terminal-2165150644-line-29)">run-shellcheck&#160;|&#160;static-check-autoflake&#160;|&#160;trailing-whitespace&#160;|&#160;update-breeze-cmd-output</text><text class="terminal-2165150644-r4" x="1451.8" y="727.6" textLength="12.2" clip-path="url(#terminal-2165150644-li [...]
-</text><text class="terminal-2165150644-r4" x="0" y="752" textLength="12.2" clip-path="url(#terminal-2165150644-line-30)">│</text><text class="terminal-2165150644-r7" x="366" y="752" textLength="1073.6" clip-path="url(#terminal-2165150644-line-30)">|&#160;update-breeze-readme-config-hash&#160;|&#160;update-extras&#160;|&#160;update-in-the-wild-to-be-sorted&#160;|&#160;&#160;</text><text class="terminal-2165150644-r4" x="1451.8" y="752" textLength="12.2" clip-path="url(#terminal-216515064 [...]
-</text><text class="terminal-2165150644-r4" x="0" y="776.4" textLength="12.2" clip-path="url(#terminal-2165150644-line-31)">│</text><text class="terminal-2165150644-r7" x="366" y="776.4" textLength="1073.6" clip-path="url(#terminal-2165150644-line-31)">update-inlined-dockerfile-scripts&#160;|&#160;update-local-yml-file&#160;|&#160;update-migration-references&#160;</text><text class="terminal-2165150644-r4" x="1451.8" y="776.4" textLength="12.2" clip-path="url(#terminal-2165150644-line-31 [...]
-</text><text class="terminal-2165150644-r4" x="0" y="800.8" textLength="12.2" clip-path="url(#terminal-2165150644-line-32)">│</text><text class="terminal-2165150644-r7" x="366" y="800.8" textLength="1073.6" clip-path="url(#terminal-2165150644-line-32)">|&#160;update-providers-dependencies&#160;|&#160;update-setup-cfg-file&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
-</text><text class="terminal-2165150644-r4" x="0" y="825.2" textLength="12.2" clip-path="url(#terminal-2165150644-line-33)">│</text><text class="terminal-2165150644-r7" x="366" y="825.2" textLength="1073.6" clip-path="url(#terminal-2165150644-line-33)">update-spelling-wordlist-to-be-sorted&#160;|&#160;update-supported-versions&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-21 [...]
-</text><text class="terminal-2165150644-r4" x="0" y="849.6" textLength="12.2" clip-path="url(#terminal-2165150644-line-34)">│</text><text class="terminal-2165150644-r7" x="366" y="849.6" textLength="1073.6" clip-path="url(#terminal-2165150644-line-34)">update-vendored-in-k8s-json-schema&#160;|&#160;update-version&#160;|&#160;yamllint&#160;|&#160;yesqa)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2165150 [...]
-</text><text class="terminal-2165150644-r4" x="0" y="874" textLength="12.2" clip-path="url(#terminal-2165150644-line-35)">│</text><text class="terminal-2165150644-r5" x="24.4" y="874" textLength="12.2" clip-path="url(#terminal-2165150644-line-35)">-</text><text class="terminal-2165150644-r5" x="36.6" y="874" textLength="61" clip-path="url(#terminal-2165150644-line-35)">-file</text><text class="terminal-2165150644-r6" x="317.2" y="874" textLength="24.4" clip-path="url(#terminal-2165150644 [...]
-</text><text class="terminal-2165150644-r4" x="0" y="898.4" textLength="12.2" clip-path="url(#terminal-2165150644-line-36)">│</text><text class="terminal-2165150644-r5" x="24.4" y="898.4" textLength="12.2" clip-path="url(#terminal-2165150644-line-36)">-</text><text class="terminal-2165150644-r5" x="36.6" y="898.4" textLength="48.8" clip-path="url(#terminal-2165150644-line-36)">-all</text><text class="terminal-2165150644-r5" x="85.4" y="898.4" textLength="73.2" clip-path="url(#terminal-21 [...]
-</text><text class="terminal-2165150644-r4" x="0" y="922.8" textLength="12.2" clip-path="url(#terminal-2165150644-line-37)">│</text><text class="terminal-2165150644-r5" x="24.4" y="922.8" textLength="12.2" clip-path="url(#terminal-2165150644-line-37)">-</text><text class="terminal-2165150644-r5" x="36.6" y="922.8" textLength="61" clip-path="url(#terminal-2165150644-line-37)">-show</text><text class="terminal-2165150644-r5" x="97.6" y="922.8" textLength="195.2" clip-path="url(#terminal-21 [...]
-</text><text class="terminal-2165150644-r4" x="0" y="947.2" textLength="12.2" clip-path="url(#terminal-2165150644-line-38)">│</text><text class="terminal-2165150644-r5" x="24.4" y="947.2" textLength="12.2" clip-path="url(#terminal-2165150644-line-38)">-</text><text class="terminal-2165150644-r5" x="36.6" y="947.2" textLength="61" clip-path="url(#terminal-2165150644-line-38)">-last</text><text class="terminal-2165150644-r5" x="97.6" y="947.2" textLength="85.4" clip-path="url(#terminal-216 [...]
-</text><text class="terminal-2165150644-r4" x="0" y="971.6" textLength="1464" clip-path="url(#terminal-2165150644-line-39)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2165150644-r2" x="1464" y="971.6" textLength="12.2" clip-path="url(#terminal-2165150644-line-39)">
-</text><text class="terminal-2165150644-r4" x="0" y="996" textLength="24.4" clip-path="url(#terminal-2165150644-line-40)">╭─</text><text class="terminal-2165150644-r4" x="24.4" y="996" textLength="1415.2" clip-path="url(#terminal-2165150644-line-40)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-2165150644-r4" x="1439.6" y="996" textLength="24.4" clip-path="url(#terminal-216515064 [...]
-</text><text class="terminal-2165150644-r4" x="0" y="1020.4" textLength="12.2" clip-path="url(#terminal-2165150644-line-41)">│</text><text class="terminal-2165150644-r5" x="24.4" y="1020.4" textLength="12.2" clip-path="url(#terminal-2165150644-line-41)">-</text><text class="terminal-2165150644-r5" x="36.6" y="1020.4" textLength="85.4" clip-path="url(#terminal-2165150644-line-41)">-commit</text><text class="terminal-2165150644-r5" x="122" y="1020.4" textLength="48.8" clip-path="url(#termi [...]
-</text><text class="terminal-2165150644-r4" x="0" y="1044.8" textLength="12.2" clip-path="url(#terminal-2165150644-line-42)">│</text><text class="terminal-2165150644-r2" x="329.4" y="1044.8" textLength="183" clip-path="url(#terminal-2165150644-line-42)">exclusive&#160;with&#160;</text><text class="terminal-2165150644-r5" x="512.4" y="1044.8" textLength="12.2" clip-path="url(#terminal-2165150644-line-42)">-</text><text class="terminal-2165150644-r5" x="524.6" y="1044.8" textLength="61" cl [...]
-</text><text class="terminal-2165150644-r4" x="0" y="1069.2" textLength="12.2" clip-path="url(#terminal-2165150644-line-43)">│</text><text class="terminal-2165150644-r7" x="329.4" y="1069.2" textLength="1110.2" clip-path="url(#terminal-2165150644-line-43)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
-</text><text class="terminal-2165150644-r4" x="0" y="1093.6" textLength="12.2" clip-path="url(#terminal-2165150644-line-44)">│</text><text class="terminal-2165150644-r5" x="24.4" y="1093.6" textLength="12.2" clip-path="url(#terminal-2165150644-line-44)">-</text><text class="terminal-2165150644-r5" x="36.6" y="1093.6" textLength="97.6" clip-path="url(#terminal-2165150644-line-44)">-verbose</text><text class="terminal-2165150644-r6" x="280.6" y="1093.6" textLength="24.4" clip-path="url(#te [...]
-</text><text class="terminal-2165150644-r4" x="0" y="1118" textLength="12.2" clip-path="url(#terminal-2165150644-line-45)">│</text><text class="terminal-2165150644-r5" x="24.4" y="1118" textLength="12.2" clip-path="url(#terminal-2165150644-line-45)">-</text><text class="terminal-2165150644-r5" x="36.6" y="1118" textLength="48.8" clip-path="url(#terminal-2165150644-line-45)">-dry</text><text class="terminal-2165150644-r5" x="85.4" y="1118" textLength="48.8" clip-path="url(#terminal-216515 [...]
-</text><text class="terminal-2165150644-r4" x="0" y="1142.4" textLength="12.2" clip-path="url(#terminal-2165150644-line-46)">│</text><text class="terminal-2165150644-r5" x="24.4" y="1142.4" textLength="12.2" clip-path="url(#terminal-2165150644-line-46)">-</text><text class="terminal-2165150644-r5" x="36.6" y="1142.4" textLength="85.4" clip-path="url(#terminal-2165150644-line-46)">-github</text><text class="terminal-2165150644-r5" x="122" y="1142.4" textLength="134.2" clip-path="url(#term [...]
-</text><text class="terminal-2165150644-r4" x="0" y="1166.8" textLength="12.2" clip-path="url(#terminal-2165150644-line-47)">│</text><text class="terminal-2165150644-r5" x="24.4" y="1166.8" textLength="12.2" clip-path="url(#terminal-2165150644-line-47)">-</text><text class="terminal-2165150644-r5" x="36.6" y="1166.8" textLength="61" clip-path="url(#terminal-2165150644-line-47)">-help</text><text class="terminal-2165150644-r6" x="280.6" y="1166.8" textLength="24.4" clip-path="url(#termina [...]
-</text><text class="terminal-2165150644-r4" x="0" y="1191.2" textLength="1464" clip-path="url(#terminal-2165150644-line-48)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2165150644-r2" x="1464" y="1191.2" textLength="12.2" clip-path="url(#terminal-2165150644-line-48)">
+    <g class="terminal-1899075791-matrix">
+    <text class="terminal-1899075791-r2" x="1464" y="20" textLength="12.2" clip-path="url(#terminal-1899075791-line-0)">
+</text><text class="terminal-1899075791-r3" x="12.2" y="44.4" textLength="85.4" clip-path="url(#terminal-1899075791-line-1)">Usage:&#160;</text><text class="terminal-1899075791-r1" x="97.6" y="44.4" textLength="610" clip-path="url(#terminal-1899075791-line-1)">breeze&#160;static-checks&#160;[OPTIONS]&#160;[PRECOMMIT_ARGS]...</text><text class="terminal-1899075791-r2" x="1464" y="44.4" textLength="12.2" clip-path="url(#terminal-1899075791-line-1)">
+</text><text class="terminal-1899075791-r2" x="1464" y="68.8" textLength="12.2" clip-path="url(#terminal-1899075791-line-2)">
+</text><text class="terminal-1899075791-r2" x="12.2" y="93.2" textLength="219.6" clip-path="url(#terminal-1899075791-line-3)">Run&#160;static&#160;checks.</text><text class="terminal-1899075791-r2" x="1464" y="93.2" textLength="12.2" clip-path="url(#terminal-1899075791-line-3)">
+</text><text class="terminal-1899075791-r2" x="1464" y="117.6" textLength="12.2" clip-path="url(#terminal-1899075791-line-4)">
+</text><text class="terminal-1899075791-r4" x="0" y="142" textLength="24.4" clip-path="url(#terminal-1899075791-line-5)">╭─</text><text class="terminal-1899075791-r4" x="24.4" y="142" textLength="1415.2" clip-path="url(#terminal-1899075791-line-5)">&#160;Pre-commit&#160;flags&#160;──────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-1899075791-r4" x="1439.6" y="142" textLength="24.4" clip-path="url(#terminal-189907 [...]
+</text><text class="terminal-1899075791-r4" x="0" y="166.4" textLength="12.2" clip-path="url(#terminal-1899075791-line-6)">│</text><text class="terminal-1899075791-r5" x="24.4" y="166.4" textLength="12.2" clip-path="url(#terminal-1899075791-line-6)">-</text><text class="terminal-1899075791-r5" x="36.6" y="166.4" textLength="61" clip-path="url(#terminal-1899075791-line-6)">-type</text><text class="terminal-1899075791-r6" x="317.2" y="166.4" textLength="24.4" clip-path="url(#terminal-18990 [...]
+</text><text class="terminal-1899075791-r4" x="0" y="190.8" textLength="12.2" clip-path="url(#terminal-1899075791-line-7)">│</text><text class="terminal-1899075791-r7" x="366" y="190.8" textLength="1073.6" clip-path="url(#terminal-1899075791-line-7)">(all&#160;|&#160;black&#160;|&#160;blacken-docs&#160;|&#160;check-airflow-2-2-compatibility&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160 [...]
+</text><text class="terminal-1899075791-r4" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-1899075791-line-8)">│</text><text class="terminal-1899075791-r7" x="366" y="215.2" textLength="1073.6" clip-path="url(#terminal-1899075791-line-8)">check-airflow-config-yaml-consistent&#160;|&#160;check-apache-license-rat&#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="ter [...]
+</text><text class="terminal-1899075791-r4" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-1899075791-line-9)">│</text><text class="terminal-1899075791-r7" x="366" y="239.6" textLength="1073.6" clip-path="url(#terminal-1899075791-line-9)">check-base-operator-partial-arguments&#160;|&#160;check-base-operator-usage&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1899 [...]
+</text><text class="terminal-1899075791-r4" x="0" y="264" textLength="12.2" clip-path="url(#terminal-1899075791-line-10)">│</text><text class="terminal-1899075791-r7" x="366" y="264" textLength="1073.6" clip-path="url(#terminal-1899075791-line-10)">check-boring-cyborg-configuration&#160;|&#160;check-breeze-top-dependencies-limited&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1899075791-r4" x="1451.8" y="264" textLength=" [...]
+</text><text class="terminal-1899075791-r4" x="0" y="288.4" textLength="12.2" clip-path="url(#terminal-1899075791-line-11)">│</text><text class="terminal-1899075791-r7" x="366" y="288.4" textLength="1073.6" clip-path="url(#terminal-1899075791-line-11)">check-builtin-literals&#160;|&#160;check-changelog-has-no-duplicates&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&# [...]
+</text><text class="terminal-1899075791-r4" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-1899075791-line-12)">│</text><text class="terminal-1899075791-r7" x="366" y="312.8" textLength="1073.6" clip-path="url(#terminal-1899075791-line-12)">check-daysago-import-from-utils&#160;|&#160;check-docstring-param-types&#160;|&#160;check-example-dags-urls&#160;</text><text class="terminal-1899075791-r4" x="1451.8" y="312.8" textLength="12.2" clip-path="url(#terminal-1899075791-line-12 [...]
+</text><text class="terminal-1899075791-r4" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-1899075791-line-13)">│</text><text class="terminal-1899075791-r7" x="366" y="337.2" textLength="1073.6" clip-path="url(#terminal-1899075791-line-13)">|&#160;check-executables-have-shebangs&#160;|&#160;check-extra-packages-references&#160;|&#160;check-extras-order</text><text class="terminal-1899075791-r4" x="1451.8" y="337.2" textLength="12.2" clip-path="url(#terminal-1899075791-line-13 [...]
+</text><text class="terminal-1899075791-r4" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-1899075791-line-14)">│</text><text class="terminal-1899075791-r7" x="366" y="361.6" textLength="1073.6" clip-path="url(#terminal-1899075791-line-14)">|&#160;check-for-inclusive-language&#160;|&#160;check-hooks-apply&#160;|&#160;check-incorrect-use-of-LoggingMixin</text><text class="terminal-1899075791-r4" x="1451.8" y="361.6" textLength="12.2" clip-path="url(#terminal-1899075791-line-14 [...]
+</text><text class="terminal-1899075791-r4" x="0" y="386" textLength="12.2" clip-path="url(#terminal-1899075791-line-15)">│</text><text class="terminal-1899075791-r7" x="366" y="386" textLength="1073.6" clip-path="url(#terminal-1899075791-line-15)">|&#160;check-integrations-are-consistent&#160;|&#160;check-lazy-logging&#160;|&#160;check-merge-conflict&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1899075791-r4" x="1451.8" y="386" textLength="12.2" clip-path [...]
+</text><text class="terminal-1899075791-r4" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-1899075791-line-16)">│</text><text class="terminal-1899075791-r7" x="366" y="410.4" textLength="1073.6" clip-path="url(#terminal-1899075791-line-16)">check-newsfragments-are-valid&#160;|&#160;check-no-providers-in-core-examples&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1899075791-r [...]
+</text><text class="terminal-1899075791-r4" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-1899075791-line-17)">│</text><text class="terminal-1899075791-r7" x="366" y="434.8" textLength="1073.6" clip-path="url(#terminal-1899075791-line-17)">check-no-relative-imports&#160;|&#160;check-persist-credentials-disabled-in-github-workflows&#160;|&#160;&#160;&#160;&#160;</text><text class="terminal-1899075791-r4" x="1451.8" y="434.8" textLength="12.2" clip-path="url(#terminal-18990757 [...]
+</text><text class="terminal-1899075791-r4" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-1899075791-line-18)">│</text><text class="terminal-1899075791-r7" x="366" y="459.2" textLength="1073.6" clip-path="url(#terminal-1899075791-line-18)">check-pre-commit-information-consistent&#160;|&#160;check-provide-create-sessions-imports&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1899075791-r4" x="1451.8" y="459.2" textLength="12.2" clip-path="url(#te [...]
+</text><text class="terminal-1899075791-r4" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-1899075791-line-19)">│</text><text class="terminal-1899075791-r7" x="366" y="483.6" textLength="1073.6" clip-path="url(#terminal-1899075791-line-19)">check-provider-yaml-valid&#160;|&#160;check-providers-init-file-missing&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><tex [...]
+</text><text class="terminal-1899075791-r4" x="0" y="508" textLength="12.2" clip-path="url(#terminal-1899075791-line-20)">│</text><text class="terminal-1899075791-r7" x="366" y="508" textLength="1073.6" clip-path="url(#terminal-1899075791-line-20)">check-providers-subpackages-init-file-exist&#160;|&#160;check-pydevd-left-in-code&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1899075791-r4" x="1451.8" y="508" te [...]
+</text><text class="terminal-1899075791-r4" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-1899075791-line-21)">│</text><text class="terminal-1899075791-r7" x="366" y="532.4" textLength="1073.6" clip-path="url(#terminal-1899075791-line-21)">check-revision-heads-map&#160;|&#160;check-safe-filter-usage-in-html&#160;|&#160;check-setup-order&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1899075791-r4" x="1451.8" y="532.4" textLength="12.2" cli [...]
+</text><text class="terminal-1899075791-r4" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-1899075791-line-22)">│</text><text class="terminal-1899075791-r7" x="366" y="556.8" textLength="1073.6" clip-path="url(#terminal-1899075791-line-22)">check-start-date-not-used-in-defaults&#160;|&#160;check-system-tests-present&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1899075 [...]
+</text><text class="terminal-1899075791-r4" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-1899075791-line-23)">│</text><text class="terminal-1899075791-r7" x="366" y="581.2" textLength="1073.6" clip-path="url(#terminal-1899075791-line-23)">check-system-tests-tocs&#160;|&#160;check-xml&#160;|&#160;codespell&#160;|&#160;create-missing-init-py-files-tests&#160;|&#160;&#160;</text><text class="terminal-1899075791-r4" x="1451.8" y="581.2" textLength="12.2" clip-path="url(#termina [...]
+</text><text class="terminal-1899075791-r4" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-1899075791-line-24)">│</text><text class="terminal-1899075791-r7" x="366" y="605.6" textLength="1073.6" clip-path="url(#terminal-1899075791-line-24)">debug-statements&#160;|&#160;detect-private-key&#160;|&#160;doctoc&#160;|&#160;end-of-file-fixer&#160;|&#160;fix-encoding-pragma</text><text class="terminal-1899075791-r4" x="1451.8" y="605.6" textLength="12.2" clip-path="url(#terminal-189 [...]
+</text><text class="terminal-1899075791-r4" x="0" y="630" textLength="12.2" clip-path="url(#terminal-1899075791-line-25)">│</text><text class="terminal-1899075791-r7" x="366" y="630" textLength="1073.6" clip-path="url(#terminal-1899075791-line-25)">|&#160;flynt&#160;|&#160;identity&#160;|&#160;insert-license&#160;|&#160;isort&#160;|&#160;lint-chart-schema&#160;|&#160;lint-css&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-189907 [...]
+</text><text class="terminal-1899075791-r4" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-1899075791-line-26)">│</text><text class="terminal-1899075791-r7" x="366" y="654.4" textLength="1073.6" clip-path="url(#terminal-1899075791-line-26)">lint-dockerfile&#160;|&#160;lint-helm-chart&#160;|&#160;lint-javascript&#160;|&#160;lint-json-schema&#160;|&#160;lint-markdown&#160;|</text><text class="terminal-1899075791-r4" x="1451.8" y="654.4" textLength="12.2" clip-path="url(#termina [...]
+</text><text class="terminal-1899075791-r4" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-1899075791-line-27)">│</text><text class="terminal-1899075791-r7" x="366" y="678.8" textLength="1073.6" clip-path="url(#terminal-1899075791-line-27)">lint-openapi&#160;|&#160;mixed-line-ending&#160;|&#160;pretty-format-json&#160;|&#160;pydocstyle&#160;|&#160;python-no-log-warn&#160;</text><text class="terminal-1899075791-r4" x="1451.8" y="678.8" textLength="12.2" clip-path="url(#termina [...]
+</text><text class="terminal-1899075791-r4" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-1899075791-line-28)">│</text><text class="terminal-1899075791-r7" x="366" y="703.2" textLength="1073.6" clip-path="url(#terminal-1899075791-line-28)">|&#160;pyupgrade&#160;|&#160;replace-bad-characters&#160;|&#160;rst-backticks&#160;|&#160;run-flake8&#160;|&#160;run-mypy&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1899075791-r4" x="1451 [...]
+</text><text class="terminal-1899075791-r4" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-1899075791-line-29)">│</text><text class="terminal-1899075791-r7" x="366" y="727.6" textLength="1073.6" clip-path="url(#terminal-1899075791-line-29)">run-shellcheck&#160;|&#160;static-check-autoflake&#160;|&#160;trailing-whitespace&#160;|&#160;update-breeze-cmd-output</text><text class="terminal-1899075791-r4" x="1451.8" y="727.6" textLength="12.2" clip-path="url(#terminal-1899075791-li [...]
+</text><text class="terminal-1899075791-r4" x="0" y="752" textLength="12.2" clip-path="url(#terminal-1899075791-line-30)">│</text><text class="terminal-1899075791-r7" x="366" y="752" textLength="1073.6" clip-path="url(#terminal-1899075791-line-30)">|&#160;update-breeze-readme-config-hash&#160;|&#160;update-extras&#160;|&#160;update-in-the-wild-to-be-sorted&#160;|&#160;&#160;</text><text class="terminal-1899075791-r4" x="1451.8" y="752" textLength="12.2" clip-path="url(#terminal-189907579 [...]
+</text><text class="terminal-1899075791-r4" x="0" y="776.4" textLength="12.2" clip-path="url(#terminal-1899075791-line-31)">│</text><text class="terminal-1899075791-r7" x="366" y="776.4" textLength="1073.6" clip-path="url(#terminal-1899075791-line-31)">update-inlined-dockerfile-scripts&#160;|&#160;update-local-yml-file&#160;|&#160;update-migration-references&#160;</text><text class="terminal-1899075791-r4" x="1451.8" y="776.4" textLength="12.2" clip-path="url(#terminal-1899075791-line-31 [...]
+</text><text class="terminal-1899075791-r4" x="0" y="800.8" textLength="12.2" clip-path="url(#terminal-1899075791-line-32)">│</text><text class="terminal-1899075791-r7" x="366" y="800.8" textLength="1073.6" clip-path="url(#terminal-1899075791-line-32)">|&#160;update-providers-dependencies&#160;|&#160;update-setup-cfg-file&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]
+</text><text class="terminal-1899075791-r4" x="0" y="825.2" textLength="12.2" clip-path="url(#terminal-1899075791-line-33)">│</text><text class="terminal-1899075791-r7" x="366" y="825.2" textLength="1073.6" clip-path="url(#terminal-1899075791-line-33)">update-spelling-wordlist-to-be-sorted&#160;|&#160;update-supported-versions&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-18 [...]
+</text><text class="terminal-1899075791-r4" x="0" y="849.6" textLength="12.2" clip-path="url(#terminal-1899075791-line-34)">│</text><text class="terminal-1899075791-r7" x="366" y="849.6" textLength="1073.6" clip-path="url(#terminal-1899075791-line-34)">update-vendored-in-k8s-json-schema&#160;|&#160;update-version&#160;|&#160;yamllint&#160;|&#160;yesqa)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1899075 [...]
+</text><text class="terminal-1899075791-r4" x="0" y="874" textLength="12.2" clip-path="url(#terminal-1899075791-line-35)">│</text><text class="terminal-1899075791-r5" x="24.4" y="874" textLength="12.2" clip-path="url(#terminal-1899075791-line-35)">-</text><text class="terminal-1899075791-r5" x="36.6" y="874" textLength="61" clip-path="url(#terminal-1899075791-line-35)">-file</text><text class="terminal-1899075791-r6" x="317.2" y="874" textLength="24.4" clip-path="url(#terminal-1899075791 [...]
+</text><text class="terminal-1899075791-r4" x="0" y="898.4" textLength="12.2" clip-path="url(#terminal-1899075791-line-36)">│</text><text class="terminal-1899075791-r5" x="24.4" y="898.4" textLength="12.2" clip-path="url(#terminal-1899075791-line-36)">-</text><text class="terminal-1899075791-r5" x="36.6" y="898.4" textLength="48.8" clip-path="url(#terminal-1899075791-line-36)">-all</text><text class="terminal-1899075791-r5" x="85.4" y="898.4" textLength="73.2" clip-path="url(#terminal-18 [...]
+</text><text class="terminal-1899075791-r4" x="0" y="922.8" textLength="12.2" clip-path="url(#terminal-1899075791-line-37)">│</text><text class="terminal-1899075791-r5" x="24.4" y="922.8" textLength="12.2" clip-path="url(#terminal-1899075791-line-37)">-</text><text class="terminal-1899075791-r5" x="36.6" y="922.8" textLength="61" clip-path="url(#terminal-1899075791-line-37)">-show</text><text class="terminal-1899075791-r5" x="97.6" y="922.8" textLength="195.2" clip-path="url(#terminal-18 [...]
+</text><text class="terminal-1899075791-r4" x="0" y="947.2" textLength="12.2" clip-path="url(#terminal-1899075791-line-38)">│</text><text class="terminal-1899075791-r5" x="24.4" y="947.2" textLength="12.2" clip-path="url(#terminal-1899075791-line-38)">-</text><text class="terminal-1899075791-r5" x="36.6" y="947.2" textLength="61" clip-path="url(#terminal-1899075791-line-38)">-last</text><text class="terminal-1899075791-r5" x="97.6" y="947.2" textLength="85.4" clip-path="url(#terminal-189 [...]
+</text><text class="terminal-1899075791-r4" x="0" y="971.6" textLength="1464" clip-path="url(#terminal-1899075791-line-39)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1899075791-r2" x="1464" y="971.6" textLength="12.2" clip-path="url(#terminal-1899075791-line-39)">
+</text><text class="terminal-1899075791-r4" x="0" y="996" textLength="24.4" clip-path="url(#terminal-1899075791-line-40)">╭─</text><text class="terminal-1899075791-r4" x="24.4" y="996" textLength="1415.2" clip-path="url(#terminal-1899075791-line-40)">&#160;Options&#160;───────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="terminal-1899075791-r4" x="1439.6" y="996" textLength="24.4" clip-path="url(#terminal-189907579 [...]
+</text><text class="terminal-1899075791-r4" x="0" y="1020.4" textLength="12.2" clip-path="url(#terminal-1899075791-line-41)">│</text><text class="terminal-1899075791-r5" x="24.4" y="1020.4" textLength="12.2" clip-path="url(#terminal-1899075791-line-41)">-</text><text class="terminal-1899075791-r5" x="36.6" y="1020.4" textLength="85.4" clip-path="url(#terminal-1899075791-line-41)">-commit</text><text class="terminal-1899075791-r5" x="122" y="1020.4" textLength="48.8" clip-path="url(#termi [...]
+</text><text class="terminal-1899075791-r4" x="0" y="1044.8" textLength="12.2" clip-path="url(#terminal-1899075791-line-42)">│</text><text class="terminal-1899075791-r2" x="329.4" y="1044.8" textLength="183" clip-path="url(#terminal-1899075791-line-42)">exclusive&#160;with&#160;</text><text class="terminal-1899075791-r5" x="512.4" y="1044.8" textLength="12.2" clip-path="url(#terminal-1899075791-line-42)">-</text><text class="terminal-1899075791-r5" x="524.6" y="1044.8" textLength="61" cl [...]
+</text><text class="terminal-1899075791-r4" x="0" y="1069.2" textLength="12.2" clip-path="url(#terminal-1899075791-line-43)">│</text><text class="terminal-1899075791-r7" x="329.4" y="1069.2" textLength="1110.2" clip-path="url(#terminal-1899075791-line-43)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;& [...]
+</text><text class="terminal-1899075791-r4" x="0" y="1093.6" textLength="12.2" clip-path="url(#terminal-1899075791-line-44)">│</text><text class="terminal-1899075791-r5" x="24.4" y="1093.6" textLength="12.2" clip-path="url(#terminal-1899075791-line-44)">-</text><text class="terminal-1899075791-r5" x="36.6" y="1093.6" textLength="97.6" clip-path="url(#terminal-1899075791-line-44)">-verbose</text><text class="terminal-1899075791-r6" x="280.6" y="1093.6" textLength="24.4" clip-path="url(#te [...]
+</text><text class="terminal-1899075791-r4" x="0" y="1118" textLength="12.2" clip-path="url(#terminal-1899075791-line-45)">│</text><text class="terminal-1899075791-r5" x="24.4" y="1118" textLength="12.2" clip-path="url(#terminal-1899075791-line-45)">-</text><text class="terminal-1899075791-r5" x="36.6" y="1118" textLength="48.8" clip-path="url(#terminal-1899075791-line-45)">-dry</text><text class="terminal-1899075791-r5" x="85.4" y="1118" textLength="48.8" clip-path="url(#terminal-189907 [...]
+</text><text class="terminal-1899075791-r4" x="0" y="1142.4" textLength="12.2" clip-path="url(#terminal-1899075791-line-46)">│</text><text class="terminal-1899075791-r5" x="24.4" y="1142.4" textLength="12.2" clip-path="url(#terminal-1899075791-line-46)">-</text><text class="terminal-1899075791-r5" x="36.6" y="1142.4" textLength="85.4" clip-path="url(#terminal-1899075791-line-46)">-github</text><text class="terminal-1899075791-r5" x="122" y="1142.4" textLength="134.2" clip-path="url(#term [...]
+</text><text class="terminal-1899075791-r4" x="0" y="1166.8" textLength="12.2" clip-path="url(#terminal-1899075791-line-47)">│</text><text class="terminal-1899075791-r5" x="24.4" y="1166.8" textLength="12.2" clip-path="url(#terminal-1899075791-line-47)">-</text><text class="terminal-1899075791-r5" x="36.6" y="1166.8" textLength="61" clip-path="url(#terminal-1899075791-line-47)">-help</text><text class="terminal-1899075791-r6" x="280.6" y="1166.8" textLength="24.4" clip-path="url(#termina [...]
+</text><text class="terminal-1899075791-r4" x="0" y="1191.2" textLength="1464" clip-path="url(#terminal-1899075791-line-48)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1899075791-r2" x="1464" y="1191.2" textLength="12.2" clip-path="url(#terminal-1899075791-line-48)">
 </text>
     </g>
     </g>
diff --git a/scripts/ci/pre_commit/pre_commit_check_lazy_logging.py b/scripts/ci/pre_commit/pre_commit_check_lazy_logging.py
new file mode 100755
index 0000000000..4929e72436
--- /dev/null
+++ b/scripts/ci/pre_commit/pre_commit_check_lazy_logging.py
@@ -0,0 +1,79 @@
+#!/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 pathlib
+import re
+import sys
+
+import astor as astor
+from rich.console import Console
+
+console = Console(color_system="standard", width=200)
+
+LOGGIN_MATCHER = re.compile(r'^log.?[a-z]*\.[a-z]*\(f.*["\']')
+SELF_LOG_MATCHER = re.compile(r'^self\.log\.[a-z]*\(f.*["\']')
+
+
+class LogFinder(astor.TreeWalk):
+    module_printed: bool = False
+    name: str = ''
+    error_count = 0
+
+    def pre_Call(self):
+        if isinstance(self.cur_node.func, ast.Attribute) and (
+            isinstance(self.cur_node.func.value, ast.Name)
+            and (
+                self.cur_node.func.value.id == "logger"
+                or self.cur_node.func.value.id == "logging"
+                or self.cur_node.func.value.id == "log"
+            )
+            or (self.cur_node.func.attr in ['log', 'debug', 'warning', 'info', "error", "critical"])
+        ):
+            line = astor.to_source(self.cur_node, add_line_information=True)
+            if LOGGIN_MATCHER.match(line) or SELF_LOG_MATCHER.match(line):
+                if not self.module_printed:
+                    self.module_printed = True
+                    console.print(f"[red]Error:[/] {self.name}")
+                console.print(f"{self.name}:{self.cur_node.lineno} -> {line}", end="")
+                self.error_count += 1
+
+
+def check_logging() -> int:
+    total_error_count = 0
+    for file_name in sys.argv[1:]:
+        file_path = pathlib.Path(file_name)
+        module = ast.parse(file_path.read_text("utf-8"), str(file_path))
+        finder = LogFinder()
+        finder.name = file_name
+        finder.walk(node=module)
+        total_error_count += finder.error_count
+    if total_error_count > 0:
+        console.print(
+            "\n[yellow]Please convert all the logging instructions above "
+            "to use '%-formatting' rather than f-strings."
+        )
+        console.print("Why?: https://docs.python.org/3/howto/logging.html#logging-variable-data\n")
+    return 1 if total_error_count else 0
+
+
+if __name__ == "__main__":
+    sys.exit(check_logging())