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 fe15f590e0 Add generating recommended actions for projects and
dependency depth (#41920)
fe15f590e0 is described below
commit fe15f590e0cb564f8f09a5c946152a3cf29ff303
Author: Jarek Potiuk <[email protected]>
AuthorDate: Sun Sep 1 01:17:13 2024 +0200
Add generating recommended actions for projects and dependency depth
(#41920)
The SBON export dependencies command now supports generating
recommended actions and dependency depth information. recommended
actions and dependency depth information.
---
dev/breeze/doc/images/output-commands.svg | 42 +-
.../output_sbom_export-dependency-information.svg | 54 +-
.../output_sbom_export-dependency-information.txt | 2 +-
.../src/airflow_breeze/commands/sbom_commands.py | 46 +-
.../commands/sbom_commands_config.py | 1 +
dev/breeze/src/airflow_breeze/utils/cdxgen.py | 52 +-
generated/README.md | 14 +
generated/dep_tree.txt | 579 +++++++++++++++++++++
generated/dependency_depth.json | 146 ++++++
scripts/in_container/get_dependency_status.py | 46 ++
10 files changed, 926 insertions(+), 56 deletions(-)
diff --git a/dev/breeze/doc/images/output-commands.svg
b/dev/breeze/doc/images/output-commands.svg
index 1556dfef6f..e5150fbab5 100644
--- a/dev/breeze/doc/images/output-commands.svg
+++ b/dev/breeze/doc/images/output-commands.svg
@@ -301,53 +301,53 @@
</text><text class="breeze-help-r2" x="12.2" y="44.4" textLength="73.2"
clip-path="url(#breeze-help-line-1)">Usage:</text><text class="breeze-help-r3"
x="97.6" y="44.4" textLength="73.2"
clip-path="url(#breeze-help-line-1)">breeze</text><text class="breeze-help-r1"
x="183" y="44.4" textLength="12.2"
clip-path="url(#breeze-help-line-1)">[</text><text class="breeze-help-r4"
x="195.2" y="44.4" textLength="85.4"
clip-path="url(#breeze-help-line-1)">OPTIONS</text><text class="breeze-help-r1"
[...]
</text><text class="breeze-help-r1" x="1464" y="68.8" textLength="12.2"
clip-path="url(#breeze-help-line-2)">
</text><text class="breeze-help-r5" x="0" y="93.2" textLength="24.4"
clip-path="url(#breeze-help-line-3)">╭─</text><text class="breeze-help-r5"
x="24.4" y="93.2" textLength="195.2"
clip-path="url(#breeze-help-line-3)"> Execution mode </text><text
class="breeze-help-r5" x="219.6" y="93.2" textLength="1220"
clip-path="url(#breeze-help-line-3)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
class="breeze-help-r [...]
-</text><text class="breeze-help-r5" x="0" y="117.6" textLength="12.2"
clip-path="url(#breeze-help-line-4)">│</text><text class="breeze-help-r4"
x="24.4" y="117.6" textLength="12.2"
clip-path="url(#breeze-help-line-4)">-</text><text class="breeze-help-r4"
x="36.6" y="117.6" textLength="85.4"
clip-path="url(#breeze-help-line-4)">-python</text><text class="breeze-help-r6"
x="366" y="117.6" textLength="24.4"
clip-path="url(#breeze-help-line-4)">-p</text><text class="breeze-help-r1"
x="414.8" [...]
+</text><text class="breeze-help-r5" x="0" y="117.6" textLength="12.2"
clip-path="url(#breeze-help-line-4)">│</text><text class="breeze-help-r4"
x="24.4" y="117.6" textLength="97.6"
clip-path="url(#breeze-help-line-4)">--python</text><text
class="breeze-help-r6" x="366" y="117.6" textLength="24.4"
clip-path="url(#breeze-help-line-4)">-p</text><text class="breeze-help-r1"
x="414.8" y="117.6" textLength="732"
clip-path="url(#breeze-help-line-4)">Python major/minor version use
[...]
</text><text class="breeze-help-r5" x="0" y="142" textLength="12.2"
clip-path="url(#breeze-help-line-5)">│</text><text class="breeze-help-r7"
x="414.8" y="142" textLength="732"
clip-path="url(#breeze-help-line-5)">(>3.8< | 3.9 | 3.10 | 3.11 | 3.12)                          </text><text
class="breeze-help-r5" x="145 [...]
</text><text class="breeze-help-r5" x="0" y="166.4" textLength="12.2"
clip-path="url(#breeze-help-line-6)">│</text><text class="breeze-help-r5"
x="414.8" y="166.4" textLength="732"
clip-path="url(#breeze-help-line-6)">[default: 3.8]                                          
[...]
-</text><text class="breeze-help-r5" x="0" y="190.8" textLength="12.2"
clip-path="url(#breeze-help-line-7)">│</text><text class="breeze-help-r4"
x="24.4" y="190.8" textLength="12.2"
clip-path="url(#breeze-help-line-7)">-</text><text class="breeze-help-r4"
x="36.6" y="190.8" textLength="146.4"
clip-path="url(#breeze-help-line-7)">-integration</text><text
class="breeze-help-r1" x="414.8" y="190.8" textLength="1024.8"
clip-path="url(#breeze-help-line-7)">Integration(s) to enable [...]
+</text><text class="breeze-help-r5" x="0" y="190.8" textLength="12.2"
clip-path="url(#breeze-help-line-7)">│</text><text class="breeze-help-r4"
x="24.4" y="190.8" textLength="158.6"
clip-path="url(#breeze-help-line-7)">--integration</text><text
class="breeze-help-r1" x="414.8" y="190.8" textLength="1024.8"
clip-path="url(#breeze-help-line-7)">Integration(s) to enable when running (can be more than one).       
[...]
</text><text class="breeze-help-r5" x="0" y="215.2" textLength="12.2"
clip-path="url(#breeze-help-line-8)">│</text><text class="breeze-help-r7"
x="414.8" y="215.2" textLength="1024.8"
clip-path="url(#breeze-help-line-8)">(all | all-testable | cassandra | celery | drill | kafka | kerberos | mongo | mssql </text><text
class="breeze-help-r5" x="1451.8" y="215.2" textLength="12.2"
clip-path="url(#breeze-help [...]
</text><text class="breeze-help-r5" x="0" y="239.6" textLength="12.2"
clip-path="url(#breeze-help-line-9)">│</text><text class="breeze-help-r7"
x="414.8" y="239.6" textLength="1024.8"
clip-path="url(#breeze-help-line-9)">| openlineage | otel | pinot | qdrant | redis | statsd | trino | ydb)               </text><text
class="breeze-help-r5" x [...]
-</text><text class="breeze-help-r5" x="0" y="264" textLength="12.2"
clip-path="url(#breeze-help-line-10)">│</text><text class="breeze-help-r4"
x="24.4" y="264" textLength="12.2"
clip-path="url(#breeze-help-line-10)">-</text><text class="breeze-help-r4"
x="36.6" y="264" textLength="134.2"
clip-path="url(#breeze-help-line-10)">-standalone</text><text
class="breeze-help-r4" x="170.8" y="264" textLength="170.8"
clip-path="url(#breeze-help-line-10)">-dag-processor</text><text
class="breeze-he [...]
-</text><text class="breeze-help-r5" x="0" y="288.4" textLength="12.2"
clip-path="url(#breeze-help-line-11)">│</text><text class="breeze-help-r4"
x="24.4" y="288.4" textLength="12.2"
clip-path="url(#breeze-help-line-11)">-</text><text class="breeze-help-r4"
x="36.6" y="288.4" textLength="109.8"
clip-path="url(#breeze-help-line-11)">-database</text><text
class="breeze-help-r4" x="146.4" y="288.4" textLength="122"
clip-path="url(#breeze-help-line-11)">-isolation</text><text class="breeze-he
[...]
+</text><text class="breeze-help-r5" x="0" y="264" textLength="12.2"
clip-path="url(#breeze-help-line-10)">│</text><text class="breeze-help-r4"
x="24.4" y="264" textLength="317.2"
clip-path="url(#breeze-help-line-10)">--standalone-dag-processor</text><text
class="breeze-help-r1" x="414.8" y="264" textLength="573.4"
clip-path="url(#breeze-help-line-10)">Run standalone dag processor for start-airflow.</text><text
class="breeze-help-r5" x="1451.8" y="264" textLength= [...]
+</text><text class="breeze-help-r5" x="0" y="288.4" textLength="12.2"
clip-path="url(#breeze-help-line-11)">│</text><text class="breeze-help-r4"
x="24.4" y="288.4" textLength="244"
clip-path="url(#breeze-help-line-11)">--database-isolation</text><text
class="breeze-help-r1" x="414.8" y="288.4" textLength="475.8"
clip-path="url(#breeze-help-line-11)">Run airflow in database isolation mode.</text><text
class="breeze-help-r5" x="1451.8" y="288.4" textLength="12.2" c [...]
</text><text class="breeze-help-r5" x="0" y="312.8" textLength="1464"
clip-path="url(#breeze-help-line-12)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-help-r1" x="1464" y="312.8" textLength="12.2"
clip-path="url(#breeze-help-line-12)">
</text><text class="breeze-help-r5" x="0" y="337.2" textLength="24.4"
clip-path="url(#breeze-help-line-13)">╭─</text><text class="breeze-help-r5"
x="24.4" y="337.2" textLength="463.6"
clip-path="url(#breeze-help-line-13)"> Docker Compose selection and cleanup </text><text
class="breeze-help-r5" x="488" y="337.2" textLength="951.6"
clip-path="url(#breeze-help-line-13)">──────────────────────────────────────────────────────────────────────────────</text><text
[...]
-</text><text class="breeze-help-r5" x="0" y="361.6" textLength="12.2"
clip-path="url(#breeze-help-line-14)">│</text><text class="breeze-help-r4"
x="24.4" y="361.6" textLength="12.2"
clip-path="url(#breeze-help-line-14)">-</text><text class="breeze-help-r4"
x="36.6" y="361.6" textLength="97.6"
clip-path="url(#breeze-help-line-14)">-project</text><text
class="breeze-help-r4" x="134.2" y="361.6" textLength="61"
clip-path="url(#breeze-help-line-14)">-name</text><text class="breeze-help-r1"
x [...]
-</text><text class="breeze-help-r5" x="0" y="386" textLength="12.2"
clip-path="url(#breeze-help-line-15)">│</text><text class="breeze-help-r1"
x="244" y="386" textLength="512.4"
clip-path="url(#breeze-help-line-15)">project name and you can use `breeze down </text><text
class="breeze-help-r4" x="756.4" y="386" textLength="12.2"
clip-path="url(#breeze-help-line-15)">-</text><text class="breeze-help-r4"
x="768.6" y="386" textLength="97.6" clip-path=" [...]
+</text><text class="breeze-help-r5" x="0" y="361.6" textLength="12.2"
clip-path="url(#breeze-help-line-14)">│</text><text class="breeze-help-r4"
x="24.4" y="361.6" textLength="170.8"
clip-path="url(#breeze-help-line-14)">--project-name</text><text
class="breeze-help-r1" x="244" y="361.6" textLength="1195.6"
clip-path="url(#breeze-help-line-14)">Name of the docker-compose project to bring down. The `docker-compose` is for legacy&
[...]
+</text><text class="breeze-help-r5" x="0" y="386" textLength="12.2"
clip-path="url(#breeze-help-line-15)">│</text><text class="breeze-help-r1"
x="244" y="386" textLength="512.4"
clip-path="url(#breeze-help-line-15)">project name and you can use `breeze down </text><text
class="breeze-help-r4" x="756.4" y="386" textLength="170.8"
clip-path="url(#breeze-help-line-15)">--project-name</text><text
class="breeze-help-r1" x="927.2" y="386" textLength="512 [...]
</text><text class="breeze-help-r5" x="0" y="410.4" textLength="12.2"
clip-path="url(#breeze-help-line-16)">│</text><text class="breeze-help-r1"
x="244" y="410.4" textLength="1195.6"
clip-path="url(#breeze-help-line-16)">belonging to it.                                         
[...]
</text><text class="breeze-help-r5" x="0" y="434.8" textLength="12.2"
clip-path="url(#breeze-help-line-17)">│</text><text class="breeze-help-r7"
x="244" y="434.8" textLength="1195.6"
clip-path="url(#breeze-help-line-17)">(breeze | pre-commit | docker-compose)                                   
[...]
</text><text class="breeze-help-r5" x="0" y="459.2" textLength="12.2"
clip-path="url(#breeze-help-line-18)">│</text><text class="breeze-help-r5"
x="244" y="459.2" textLength="1195.6"
clip-path="url(#breeze-help-line-18)">[default: breeze]                                         
[...]
-</text><text class="breeze-help-r5" x="0" y="483.6" textLength="12.2"
clip-path="url(#breeze-help-line-19)">│</text><text class="breeze-help-r4"
x="24.4" y="483.6" textLength="12.2"
clip-path="url(#breeze-help-line-19)">-</text><text class="breeze-help-r4"
x="36.6" y="483.6" textLength="85.4"
clip-path="url(#breeze-help-line-19)">-docker</text><text
class="breeze-help-r4" x="122" y="483.6" textLength="61"
clip-path="url(#breeze-help-line-19)">-host</text><text class="breeze-help-r1"
x="2 [...]
+</text><text class="breeze-help-r5" x="0" y="483.6" textLength="12.2"
clip-path="url(#breeze-help-line-19)">│</text><text class="breeze-help-r4"
x="24.4" y="483.6" textLength="158.6"
clip-path="url(#breeze-help-line-19)">--docker-host</text><text
class="breeze-help-r1" x="244" y="483.6" textLength="915"
clip-path="url(#breeze-help-line-19)">Optional - docker host to use when running docker commands. When set, the `</text><t
[...]
</text><text class="breeze-help-r5" x="0" y="508" textLength="12.2"
clip-path="url(#breeze-help-line-20)">│</text><text class="breeze-help-r1"
x="244" y="508" textLength="1195.6"
clip-path="url(#breeze-help-line-20)">ignored when building images.                                      
[...]
</text><text class="breeze-help-r5" x="0" y="532.4" textLength="12.2"
clip-path="url(#breeze-help-line-21)">│</text><text class="breeze-help-r7"
x="244" y="532.4" textLength="1195.6"
clip-path="url(#breeze-help-line-21)">(TEXT)                                            &
[...]
</text><text class="breeze-help-r5" x="0" y="556.8" textLength="1464"
clip-path="url(#breeze-help-line-22)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-help-r1" x="1464" y="556.8" textLength="12.2"
clip-path="url(#breeze-help-line-22)">
</text><text class="breeze-help-r5" x="0" y="581.2" textLength="24.4"
clip-path="url(#breeze-help-line-23)">╭─</text><text class="breeze-help-r5"
x="24.4" y="581.2" textLength="122"
clip-path="url(#breeze-help-line-23)"> Database </text><text
class="breeze-help-r5" x="146.4" y="581.2" textLength="1293.2"
clip-path="url(#breeze-help-line-23)">──────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
class="breeze-help- [...]
-</text><text class="breeze-help-r5" x="0" y="605.6" textLength="12.2"
clip-path="url(#breeze-help-line-24)">│</text><text class="breeze-help-r4"
x="24.4" y="605.6" textLength="12.2"
clip-path="url(#breeze-help-line-24)">-</text><text class="breeze-help-r4"
x="36.6" y="605.6" textLength="97.6"
clip-path="url(#breeze-help-line-24)">-backend</text><text
class="breeze-help-r6" x="268.4" y="605.6" textLength="24.4"
clip-path="url(#breeze-help-line-24)">-b</text><text class="breeze-help-r1" x=
[...]
+</text><text class="breeze-help-r5" x="0" y="605.6" textLength="12.2"
clip-path="url(#breeze-help-line-24)">│</text><text class="breeze-help-r4"
x="24.4" y="605.6" textLength="109.8"
clip-path="url(#breeze-help-line-24)">--backend</text><text
class="breeze-help-r6" x="268.4" y="605.6" textLength="24.4"
clip-path="url(#breeze-help-line-24)">-b</text><text class="breeze-help-r1"
x="317.2" y="605.6" textLength="1122.4"
clip-path="url(#breeze-help-line-24)">Database backend to  [...]
</text><text class="breeze-help-r5" x="0" y="630" textLength="12.2"
clip-path="url(#breeze-help-line-25)">│</text><text class="breeze-help-r1"
x="317.2" y="630" textLength="1122.4"
clip-path="url(#breeze-help-line-25)">configuration, meaning there will be no database available, and any attempts to connect to  </text><text
class="breeze-help-r5" x="1451.8" y="630" textLength="12.2"
clip-path="url(#breeze-help-line- [...]
</text><text class="breeze-help-r5" x="0" y="654.4" textLength="12.2"
clip-path="url(#breeze-help-line-26)">│</text><text class="breeze-help-r1"
x="317.2" y="654.4" textLength="1122.4"
clip-path="url(#breeze-help-line-26)">the Airflow database will fail.                                    &#
[...]
</text><text class="breeze-help-r5" x="0" y="678.8" textLength="12.2"
clip-path="url(#breeze-help-line-27)">│</text><text class="breeze-help-r7"
x="317.2" y="678.8" textLength="1122.4"
clip-path="url(#breeze-help-line-27)">(>sqlite< | mysql | postgres | none)                                 
[...]
</text><text class="breeze-help-r5" x="0" y="703.2" textLength="12.2"
clip-path="url(#breeze-help-line-28)">│</text><text class="breeze-help-r5"
x="317.2" y="703.2" textLength="1122.4"
clip-path="url(#breeze-help-line-28)">[default: sqlite]                                         &
[...]
-</text><text class="breeze-help-r5" x="0" y="727.6" textLength="12.2"
clip-path="url(#breeze-help-line-29)">│</text><text class="breeze-help-r4"
x="24.4" y="727.6" textLength="12.2"
clip-path="url(#breeze-help-line-29)">-</text><text class="breeze-help-r4"
x="36.6" y="727.6" textLength="109.8"
clip-path="url(#breeze-help-line-29)">-postgres</text><text
class="breeze-help-r4" x="146.4" y="727.6" textLength="97.6"
clip-path="url(#breeze-help-line-29)">-version</text><text class="breeze-hel
[...]
-</text><text class="breeze-help-r5" x="0" y="752" textLength="12.2"
clip-path="url(#breeze-help-line-30)">│</text><text class="breeze-help-r4"
x="24.4" y="752" textLength="12.2"
clip-path="url(#breeze-help-line-30)">-</text><text class="breeze-help-r4"
x="36.6" y="752" textLength="73.2"
clip-path="url(#breeze-help-line-30)">-mysql</text><text class="breeze-help-r4"
x="109.8" y="752" textLength="97.6"
clip-path="url(#breeze-help-line-30)">-version</text><text
class="breeze-help-r6" x="268 [...]
-</text><text class="breeze-help-r5" x="0" y="776.4" textLength="12.2"
clip-path="url(#breeze-help-line-31)">│</text><text class="breeze-help-r4"
x="24.4" y="776.4" textLength="12.2"
clip-path="url(#breeze-help-line-31)">-</text><text class="breeze-help-r4"
x="36.6" y="776.4" textLength="36.6"
clip-path="url(#breeze-help-line-31)">-db</text><text class="breeze-help-r4"
x="73.2" y="776.4" textLength="73.2"
clip-path="url(#breeze-help-line-31)">-reset</text><text class="breeze-help-r6"
x="2 [...]
+</text><text class="breeze-help-r5" x="0" y="727.6" textLength="12.2"
clip-path="url(#breeze-help-line-29)">│</text><text class="breeze-help-r4"
x="24.4" y="727.6" textLength="219.6"
clip-path="url(#breeze-help-line-29)">--postgres-version</text><text
class="breeze-help-r6" x="268.4" y="727.6" textLength="24.4"
clip-path="url(#breeze-help-line-29)">-P</text><text class="breeze-help-r1"
x="317.2" y="727.6" textLength="305"
clip-path="url(#breeze-help-line-29)">Version of Postgre [...]
+</text><text class="breeze-help-r5" x="0" y="752" textLength="12.2"
clip-path="url(#breeze-help-line-30)">│</text><text class="breeze-help-r4"
x="24.4" y="752" textLength="183"
clip-path="url(#breeze-help-line-30)">--mysql-version</text><text
class="breeze-help-r6" x="268.4" y="752" textLength="24.4"
clip-path="url(#breeze-help-line-30)">-M</text><text class="breeze-help-r1"
x="317.2" y="752" textLength="268.4"
clip-path="url(#breeze-help-line-30)">Version of MySQL used.</
[...]
+</text><text class="breeze-help-r5" x="0" y="776.4" textLength="12.2"
clip-path="url(#breeze-help-line-31)">│</text><text class="breeze-help-r4"
x="24.4" y="776.4" textLength="122"
clip-path="url(#breeze-help-line-31)">--db-reset</text><text
class="breeze-help-r6" x="268.4" y="776.4" textLength="24.4"
clip-path="url(#breeze-help-line-31)">-d</text><text class="breeze-help-r1"
x="317.2" y="776.4" textLength="451.4"
clip-path="url(#breeze-help-line-31)">Reset DB when enterin [...]
</text><text class="breeze-help-r5" x="0" y="800.8" textLength="1464"
clip-path="url(#breeze-help-line-32)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-help-r1" x="1464" y="800.8" textLength="12.2"
clip-path="url(#breeze-help-line-32)">
</text><text class="breeze-help-r5" x="0" y="825.2" textLength="24.4"
clip-path="url(#breeze-help-line-33)">╭─</text><text class="breeze-help-r5"
x="24.4" y="825.2" textLength="488"
clip-path="url(#breeze-help-line-33)"> Build CI image (before entering shell) </text><text
class="breeze-help-r5" x="512.4" y="825.2" textLength="927.2"
clip-path="url(#breeze-help-line-33)">────────────────────────────────────────────────────────────────────────────</text><
[...]
-</text><text class="breeze-help-r5" x="0" y="849.6" textLength="12.2"
clip-path="url(#breeze-help-line-34)">│</text><text class="breeze-help-r4"
x="24.4" y="849.6" textLength="12.2"
clip-path="url(#breeze-help-line-34)">-</text><text class="breeze-help-r4"
x="36.6" y="849.6" textLength="85.4"
clip-path="url(#breeze-help-line-34)">-github</text><text
class="breeze-help-r4" x="122" y="849.6" textLength="134.2"
clip-path="url(#breeze-help-line-34)">-repository</text><text
class="breeze-help [...]
-</text><text class="breeze-help-r5" x="0" y="874" textLength="12.2"
clip-path="url(#breeze-help-line-35)">│</text><text class="breeze-help-r4"
x="24.4" y="874" textLength="12.2"
clip-path="url(#breeze-help-line-35)">-</text><text class="breeze-help-r4"
x="36.6" y="874" textLength="97.6"
clip-path="url(#breeze-help-line-35)">-builder</text><text
class="breeze-help-r1" x="341.6" y="874" textLength="756.4"
clip-path="url(#breeze-help-line-35)">Buildx builder used to perf
[...]
+</text><text class="breeze-help-r5" x="0" y="849.6" textLength="12.2"
clip-path="url(#breeze-help-line-34)">│</text><text class="breeze-help-r4"
x="24.4" y="849.6" textLength="231.8"
clip-path="url(#breeze-help-line-34)">--github-repository</text><text
class="breeze-help-r6" x="292.8" y="849.6" textLength="24.4"
clip-path="url(#breeze-help-line-34)">-g</text><text class="breeze-help-r1"
x="341.6" y="849.6" textLength="585.6"
clip-path="url(#breeze-help-line-34)">GitHub repository [...]
+</text><text class="breeze-help-r5" x="0" y="874" textLength="12.2"
clip-path="url(#breeze-help-line-35)">│</text><text class="breeze-help-r4"
x="24.4" y="874" textLength="109.8"
clip-path="url(#breeze-help-line-35)">--builder</text><text
class="breeze-help-r1" x="341.6" y="874" textLength="756.4"
clip-path="url(#breeze-help-line-35)">Buildx builder used to perform `docker buildx build` commands.</text><text
class="breeze-help-r7" x="1110.2" y="874 [...]
</text><text class="breeze-help-r5" x="0" y="898.4" textLength="12.2"
clip-path="url(#breeze-help-line-36)">│</text><text class="breeze-help-r5"
x="341.6" y="898.4" textLength="756.4"
clip-path="url(#breeze-help-line-36)">[default: autodetect]                                        
[...]
-</text><text class="breeze-help-r5" x="0" y="922.8" textLength="12.2"
clip-path="url(#breeze-help-line-37)">│</text><text class="breeze-help-r4"
x="24.4" y="922.8" textLength="12.2"
clip-path="url(#breeze-help-line-37)">-</text><text class="breeze-help-r4"
x="36.6" y="922.8" textLength="48.8"
clip-path="url(#breeze-help-line-37)">-use</text><text class="breeze-help-r4"
x="85.4" y="922.8" textLength="36.6"
clip-path="url(#breeze-help-line-37)">-uv</text><text class="breeze-help-r1"
x="122 [...]
-</text><text class="breeze-help-r5" x="0" y="947.2" textLength="12.2"
clip-path="url(#breeze-help-line-38)">│</text><text class="breeze-help-r4"
x="24.4" y="947.2" textLength="12.2"
clip-path="url(#breeze-help-line-38)">-</text><text class="breeze-help-r4"
x="36.6" y="947.2" textLength="36.6"
clip-path="url(#breeze-help-line-38)">-uv</text><text class="breeze-help-r4"
x="73.2" y="947.2" textLength="158.6"
clip-path="url(#breeze-help-line-38)">-http-timeout</text><text
class="breeze-help- [...]
+</text><text class="breeze-help-r5" x="0" y="922.8" textLength="12.2"
clip-path="url(#breeze-help-line-37)">│</text><text class="breeze-help-r4"
x="24.4" y="922.8" textLength="97.6"
clip-path="url(#breeze-help-line-37)">--use-uv</text><text
class="breeze-help-r1" x="122" y="922.8" textLength="12.2"
clip-path="url(#breeze-help-line-37)">/</text><text class="breeze-help-r4"
x="134.2" y="922.8" textLength="134.2"
clip-path="url(#breeze-help-line-37)">--no-use-uv</text><text class="breeze-he
[...]
+</text><text class="breeze-help-r5" x="0" y="947.2" textLength="12.2"
clip-path="url(#breeze-help-line-38)">│</text><text class="breeze-help-r4"
x="24.4" y="947.2" textLength="207.4"
clip-path="url(#breeze-help-line-38)">--uv-http-timeout</text><text
class="breeze-help-r1" x="341.6" y="947.2" textLength="829.6"
clip-path="url(#breeze-help-line-38)">Timeout for requests that UV makes (only used in case of UV builds).</text><text
[...]
</text><text class="breeze-help-r5" x="0" y="971.6" textLength="12.2"
clip-path="url(#breeze-help-line-39)">│</text><text class="breeze-help-r5"
x="341.6" y="971.6" textLength="829.6"
clip-path="url(#breeze-help-line-39)">[default: 300; x>=1]                                       
[...]
</text><text class="breeze-help-r5" x="0" y="996" textLength="1464"
clip-path="url(#breeze-help-line-40)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-help-r1" x="1464" y="996" textLength="12.2"
clip-path="url(#breeze-help-line-40)">
</text><text class="breeze-help-r5" x="0" y="1020.4" textLength="24.4"
clip-path="url(#breeze-help-line-41)">╭─</text><text class="breeze-help-r5"
x="24.4" y="1020.4" textLength="183"
clip-path="url(#breeze-help-line-41)"> Other options </text><text
class="breeze-help-r5" x="207.4" y="1020.4" textLength="1232.2"
clip-path="url(#breeze-help-line-41)">─────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
class="bree [...]
-</text><text class="breeze-help-r5" x="0" y="1044.8" textLength="12.2"
clip-path="url(#breeze-help-line-42)">│</text><text class="breeze-help-r4"
x="24.4" y="1044.8" textLength="12.2"
clip-path="url(#breeze-help-line-42)">-</text><text class="breeze-help-r4"
x="36.6" y="1044.8" textLength="97.6"
clip-path="url(#breeze-help-line-42)">-forward</text><text
class="breeze-help-r4" x="134.2" y="1044.8" textLength="146.4"
clip-path="url(#breeze-help-line-42)">-credentials</text><text class="bre [...]
-</text><text class="breeze-help-r5" x="0" y="1069.2" textLength="12.2"
clip-path="url(#breeze-help-line-43)">│</text><text class="breeze-help-r4"
x="24.4" y="1069.2" textLength="12.2"
clip-path="url(#breeze-help-line-43)">-</text><text class="breeze-help-r4"
x="36.6" y="1069.2" textLength="48.8"
clip-path="url(#breeze-help-line-43)">-max</text><text class="breeze-help-r4"
x="85.4" y="1069.2" textLength="61"
clip-path="url(#breeze-help-line-43)">-time</text><text class="breeze-help-r1"
x= [...]
+</text><text class="breeze-help-r5" x="0" y="1044.8" textLength="12.2"
clip-path="url(#breeze-help-line-42)">│</text><text class="breeze-help-r4"
x="24.4" y="1044.8" textLength="256.2"
clip-path="url(#breeze-help-line-42)">--forward-credentials</text><text
class="breeze-help-r6" x="305" y="1044.8" textLength="24.4"
clip-path="url(#breeze-help-line-42)">-f</text><text class="breeze-help-r1"
x="353.8" y="1044.8" textLength="634.4"
clip-path="url(#breeze-help-line-42)">Forward local [...]
+</text><text class="breeze-help-r5" x="0" y="1069.2" textLength="12.2"
clip-path="url(#breeze-help-line-43)">│</text><text class="breeze-help-r4"
x="24.4" y="1069.2" textLength="122"
clip-path="url(#breeze-help-line-43)">--max-time</text><text
class="breeze-help-r1" x="353.8" y="1069.2" textLength="1049.2"
clip-path="url(#breeze-help-line-43)">Maximum time that the command should take - if it takes longer, the command 
[...]
</text><text class="breeze-help-r5" x="0" y="1093.6" textLength="12.2"
clip-path="url(#breeze-help-line-44)">│</text><text class="breeze-help-r7"
x="353.8" y="1093.6" textLength="1049.2"
clip-path="url(#breeze-help-line-44)">(INTEGER RANGE)                                         &
[...]
</text><text class="breeze-help-r5" x="0" y="1118" textLength="1464"
clip-path="url(#breeze-help-line-45)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-help-r1" x="1464" y="1118" textLength="12.2"
clip-path="url(#breeze-help-line-45)">
</text><text class="breeze-help-r5" x="0" y="1142.4" textLength="24.4"
clip-path="url(#breeze-help-line-46)">╭─</text><text class="breeze-help-r5"
x="24.4" y="1142.4" textLength="195.2"
clip-path="url(#breeze-help-line-46)"> Common options </text><text
class="breeze-help-r5" x="219.6" y="1142.4" textLength="1220"
clip-path="url(#breeze-help-line-46)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
class="bree [...]
-</text><text class="breeze-help-r5" x="0" y="1166.8" textLength="12.2"
clip-path="url(#breeze-help-line-47)">│</text><text class="breeze-help-r4"
x="24.4" y="1166.8" textLength="12.2"
clip-path="url(#breeze-help-line-47)">-</text><text class="breeze-help-r4"
x="36.6" y="1166.8" textLength="85.4"
clip-path="url(#breeze-help-line-47)">-answer</text><text
class="breeze-help-r6" x="158.6" y="1166.8" textLength="24.4"
clip-path="url(#breeze-help-line-47)">-a</text><text class="breeze-help-r1"
[...]
-</text><text class="breeze-help-r5" x="0" y="1191.2" textLength="12.2"
clip-path="url(#breeze-help-line-48)">│</text><text class="breeze-help-r4"
x="24.4" y="1191.2" textLength="12.2"
clip-path="url(#breeze-help-line-48)">-</text><text class="breeze-help-r4"
x="36.6" y="1191.2" textLength="48.8"
clip-path="url(#breeze-help-line-48)">-dry</text><text class="breeze-help-r4"
x="85.4" y="1191.2" textLength="48.8"
clip-path="url(#breeze-help-line-48)">-run</text><text class="breeze-help-r6" x
[...]
-</text><text class="breeze-help-r5" x="0" y="1215.6" textLength="12.2"
clip-path="url(#breeze-help-line-49)">│</text><text class="breeze-help-r4"
x="24.4" y="1215.6" textLength="12.2"
clip-path="url(#breeze-help-line-49)">-</text><text class="breeze-help-r4"
x="36.6" y="1215.6" textLength="97.6"
clip-path="url(#breeze-help-line-49)">-verbose</text><text
class="breeze-help-r6" x="158.6" y="1215.6" textLength="24.4"
clip-path="url(#breeze-help-line-49)">-v</text><text class="breeze-help-r1 [...]
-</text><text class="breeze-help-r5" x="0" y="1240" textLength="12.2"
clip-path="url(#breeze-help-line-50)">│</text><text class="breeze-help-r4"
x="24.4" y="1240" textLength="12.2"
clip-path="url(#breeze-help-line-50)">-</text><text class="breeze-help-r4"
x="36.6" y="1240" textLength="61"
clip-path="url(#breeze-help-line-50)">-help</text><text class="breeze-help-r6"
x="158.6" y="1240" textLength="24.4"
clip-path="url(#breeze-help-line-50)">-h</text><text class="breeze-help-r1"
x="207.4" y [...]
+</text><text class="breeze-help-r5" x="0" y="1166.8" textLength="12.2"
clip-path="url(#breeze-help-line-47)">│</text><text class="breeze-help-r4"
x="24.4" y="1166.8" textLength="97.6"
clip-path="url(#breeze-help-line-47)">--answer</text><text
class="breeze-help-r6" x="158.6" y="1166.8" textLength="24.4"
clip-path="url(#breeze-help-line-47)">-a</text><text class="breeze-help-r1"
x="207.4" y="1166.8" textLength="317.2"
clip-path="url(#breeze-help-line-47)">Force answer to qu [...]
+</text><text class="breeze-help-r5" x="0" y="1191.2" textLength="12.2"
clip-path="url(#breeze-help-line-48)">│</text><text class="breeze-help-r4"
x="24.4" y="1191.2" textLength="109.8"
clip-path="url(#breeze-help-line-48)">--dry-run</text><text
class="breeze-help-r6" x="158.6" y="1191.2" textLength="24.4"
clip-path="url(#breeze-help-line-48)">-D</text><text class="breeze-help-r1"
x="207.4" y="1191.2" textLength="719.8"
clip-path="url(#breeze-help-line-48)">If dry-run is se [...]
+</text><text class="breeze-help-r5" x="0" y="1215.6" textLength="12.2"
clip-path="url(#breeze-help-line-49)">│</text><text class="breeze-help-r4"
x="24.4" y="1215.6" textLength="109.8"
clip-path="url(#breeze-help-line-49)">--verbose</text><text
class="breeze-help-r6" x="158.6" y="1215.6" textLength="24.4"
clip-path="url(#breeze-help-line-49)">-v</text><text class="breeze-help-r1"
x="207.4" y="1215.6" textLength="585.6"
clip-path="url(#breeze-help-line-49)">Print verbose informa [...]
+</text><text class="breeze-help-r5" x="0" y="1240" textLength="12.2"
clip-path="url(#breeze-help-line-50)">│</text><text class="breeze-help-r4"
x="24.4" y="1240" textLength="73.2"
clip-path="url(#breeze-help-line-50)">--help</text><text class="breeze-help-r6"
x="158.6" y="1240" textLength="24.4"
clip-path="url(#breeze-help-line-50)">-h</text><text class="breeze-help-r1"
x="207.4" y="1240" textLength="329.4"
clip-path="url(#breeze-help-line-50)">Show this message and e
[...]
</text><text class="breeze-help-r5" x="0" y="1264.4" textLength="1464"
clip-path="url(#breeze-help-line-51)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-help-r1" x="1464" y="1264.4" textLength="12.2"
clip-path="url(#breeze-help-line-51)">
</text><text class="breeze-help-r5" x="0" y="1288.8" textLength="24.4"
clip-path="url(#breeze-help-line-52)">╭─</text><text class="breeze-help-r5"
x="24.4" y="1288.8" textLength="244"
clip-path="url(#breeze-help-line-52)"> Developer commands </text><text
class="breeze-help-r5" x="268.4" y="1288.8" textLength="1171.2"
clip-path="url(#breeze-help-line-52)">────────────────────────────────────────────────────────────────────────────────────────────────</text><text
class="bree [...]
</text><text class="breeze-help-r5" x="0" y="1313.2" textLength="12.2"
clip-path="url(#breeze-help-line-53)">│</text><text class="breeze-help-r4"
x="24.4" y="1313.2" textLength="280.6"
clip-path="url(#breeze-help-line-53)">start-airflow          </text><text
class="breeze-help-r1" x="329.4" y="1313.2" textLength="1110.2"
clip-path="url(#breeze-help-line-53)">Enter breeze environment and starts all Airflow
[...]
diff --git
a/dev/breeze/doc/images/output_sbom_export-dependency-information.svg
b/dev/breeze/doc/images/output_sbom_export-dependency-information.svg
index 0f525cd60a..e191e88155 100644
--- a/dev/breeze/doc/images/output_sbom_export-dependency-information.svg
+++ b/dev/breeze/doc/images/output_sbom_export-dependency-information.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 879.5999999999999"
xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 904.0"
xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -45,7 +45,7 @@
<defs>
<clipPath id="breeze-sbom-export-dependency-information-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="828.5999999999999" />
+ <rect x="0" y="0" width="1463.0" height="853.0" />
</clipPath>
<clipPath id="breeze-sbom-export-dependency-information-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -146,9 +146,12 @@
<clipPath id="breeze-sbom-export-dependency-information-line-32">
<rect x="0" y="782.3" width="1464" height="24.65"/>
</clipPath>
+<clipPath id="breeze-sbom-export-dependency-information-line-33">
+ <rect x="0" y="806.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="877.6" rx="8"/><text
class="breeze-sbom-export-dependency-information-title" fill="#c5c8c6"
text-anchor="middle" x="740"
y="27">Command: sbom export-dependency-information</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1"
x="1" y="1" width="1480" height="902" rx="8"/><text
class="breeze-sbom-export-dependency-information-title" fill="#c5c8c6"
text-anchor="middle" x="740"
y="27">Command: sbom export-dependency-information</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -170,28 +173,29 @@
</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="239.6" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-9)">│</text><text
class="breeze-sbom-export-dependency-information-r5" x="475.8" y="239.6"
textLength="732"
clip-path="url(#breeze-sbom-export-dependency-information-line-9)">[default: 3.8]                      
[...]
</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="264" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-10)">│</text><text
class="breeze-sbom-export-dependency-information-r4" x="61" y="264"
textLength="341.6"
clip-path="url(#breeze-sbom-export-dependency-information-line-10)">--include-open-psf-scorecard</text><text
class="breeze-sbom-export-dependency-information-r7" x="427" y="264"
textLength="24.4" clip-path="url(#breeze-sbom-e [...]
</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="288.4" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-11)">│</text><text
class="breeze-sbom-export-dependency-information-r4" x="61" y="288.4"
textLength="268.4"
clip-path="url(#breeze-sbom-export-dependency-information-line-11)">--include-github-stats</text><text
class="breeze-sbom-export-dependency-information-r7" x="427" y="288.4"
textLength="24.4" clip-path="url(#breeze-sbom-e [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="312.8" textLength="1464"
clip-path="url(#breeze-sbom-export-dependency-information-line-12)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-export-dependency-information-r1" x="1464" y="312.8"
textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-12)">
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="337.2" textLength="24.4"
clip-path="url(#breeze-sbom-export-dependency-information-line-13)">╭─</text><text
class="breeze-sbom-export-dependency-information-r5" x="24.4" y="337.2"
textLength="134.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-13)"> CSV flags </text><text
class="breeze-sbom-export-dependency-information-r5" x="158.6" y="337.2"
textLength="1281" clip-path="url(#bree [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="361.6" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-14)">│</text><text
class="breeze-sbom-export-dependency-information-r4" x="24.4" y="361.6"
textLength="122"
clip-path="url(#breeze-sbom-export-dependency-information-line-14)">--csv-file</text><text
class="breeze-sbom-export-dependency-information-r7" x="170.8" y="361.6"
textLength="24.4" clip-path="url(#breeze-sbom-export-depe [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="386" textLength="1464"
clip-path="url(#breeze-sbom-export-dependency-information-line-15)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-export-dependency-information-r1" x="1464" y="386"
textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-15)">
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="410.4" textLength="24.4"
clip-path="url(#breeze-sbom-export-dependency-information-line-16)">╭─</text><text
class="breeze-sbom-export-dependency-information-r5" x="24.4" y="410.4"
textLength="231.8"
clip-path="url(#breeze-sbom-export-dependency-information-line-16)"> Github auth flags </text><text
class="breeze-sbom-export-dependency-information-r5" x="256.2" y="410.4"
textLength="1183.4" clip- [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="434.8" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-17)">│</text><text
class="breeze-sbom-export-dependency-information-r4" x="24.4" y="434.8"
textLength="170.8"
clip-path="url(#breeze-sbom-export-dependency-information-line-17)">--github-token</text><text
class="breeze-sbom-export-dependency-information-r1" x="244" y="434.8"
textLength="500.2" clip-path="url(#breeze-sbom-export [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="459.2" textLength="1464"
clip-path="url(#breeze-sbom-export-dependency-information-line-18)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-export-dependency-information-r1" x="1464" y="459.2"
textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-18)">
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="483.6" textLength="24.4"
clip-path="url(#breeze-sbom-export-dependency-information-line-19)">╭─</text><text
class="breeze-sbom-export-dependency-information-r5" x="24.4" y="483.6"
textLength="317.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-19)"> Google spreadsheet flags </text><text
class="breeze-sbom-export-dependency-information-r5" x="341.6" y="483.6"
textLength="1098" [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="508" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-20)">│</text><text
class="breeze-sbom-export-dependency-information-r4" x="24.4" y="508"
textLength="280.6"
clip-path="url(#breeze-sbom-export-dependency-information-line-20)">--json-credentials-file</text><text
class="breeze-sbom-export-dependency-information-r1" x="378.2" y="508"
textLength="915" clip-path="url(#breeze-sbom-exp [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="532.4" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-21)">│</text><text
class="breeze-sbom-export-dependency-information-r4" x="24.4" y="532.4"
textLength="280.6"
clip-path="url(#breeze-sbom-export-dependency-information-line-21)">--google-spreadsheet-id</text><text
class="breeze-sbom-export-dependency-information-r7" x="329.4" y="532.4"
textLength="24.4" clip-path="url(#breeze-s [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="556.8" textLength="1464"
clip-path="url(#breeze-sbom-export-dependency-information-line-22)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-export-dependency-information-r1" x="1464" y="556.8"
textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-22)">
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="581.2" textLength="24.4"
clip-path="url(#breeze-sbom-export-dependency-information-line-23)">╭─</text><text
class="breeze-sbom-export-dependency-information-r5" x="24.4" y="581.2"
textLength="207.4"
clip-path="url(#breeze-sbom-export-dependency-information-line-23)"> Debugging flags </text><text
class="breeze-sbom-export-dependency-information-r5" x="231.8" y="581.2"
textLength="1207.8" clip-path="u [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="605.6" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-24)">│</text><text
class="breeze-sbom-export-dependency-information-r4" x="24.4" y="605.6"
textLength="170.8"
clip-path="url(#breeze-sbom-export-dependency-information-line-24)">--limit-output</text><text
class="breeze-sbom-export-dependency-information-r7" x="219.6" y="605.6"
textLength="24.4" clip-path="url(#breeze-sbom-expor [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="630" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-25)">│</text><text
class="breeze-sbom-export-dependency-information-r1" x="268.4" y="630"
textLength="1171.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-25)">to output all dependencies, do not specify this option.         
[...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="654.4" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-26)">│</text><text
class="breeze-sbom-export-dependency-information-r8" x="268.4" y="654.4"
textLength="1171.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-26)">(INTEGER)                       &#
[...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="678.8" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-27)">│</text><text
class="breeze-sbom-export-dependency-information-r4" x="24.4" y="678.8"
textLength="170.8"
clip-path="url(#breeze-sbom-export-dependency-information-line-27)">--project-name</text><text
class="breeze-sbom-export-dependency-information-r1" x="268.4" y="678.8"
textLength="1012.6" clip-path="url(#breeze-sbom-exp [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="703.2" textLength="1464"
clip-path="url(#breeze-sbom-export-dependency-information-line-28)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-export-dependency-information-r1" x="1464" y="703.2"
textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-28)">
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="727.6" textLength="24.4"
clip-path="url(#breeze-sbom-export-dependency-information-line-29)">╭─</text><text
class="breeze-sbom-export-dependency-information-r5" x="24.4" y="727.6"
textLength="195.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-29)"> Common options </text><text
class="breeze-sbom-export-dependency-information-r5" x="219.6" y="727.6"
textLength="1220" clip-path="url( [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="752" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-30)">│</text><text
class="breeze-sbom-export-dependency-information-r4" x="24.4" y="752"
textLength="109.8"
clip-path="url(#breeze-sbom-export-dependency-information-line-30)">--dry-run</text><text
class="breeze-sbom-export-dependency-information-r7" x="158.6" y="752"
textLength="24.4" clip-path="url(#breeze-sbom-export-dependenc [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="776.4" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-31)">│</text><text
class="breeze-sbom-export-dependency-information-r4" x="24.4" y="776.4"
textLength="97.6"
clip-path="url(#breeze-sbom-export-dependency-information-line-31)">--answer</text><text
class="breeze-sbom-export-dependency-information-r7" x="158.6" y="776.4"
textLength="24.4" clip-path="url(#breeze-sbom-export-depen [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="800.8" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-32)">│</text><text
class="breeze-sbom-export-dependency-information-r4" x="24.4" y="800.8"
textLength="73.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-32)">--help</text><text
class="breeze-sbom-export-dependency-information-r7" x="158.6" y="800.8"
textLength="24.4" clip-path="url(#breeze-sbom-export-depende [...]
-</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="825.2" textLength="1464"
clip-path="url(#breeze-sbom-export-dependency-information-line-33)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-export-dependency-information-r1" x="1464" y="825.2"
textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-33)">
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="312.8" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-12)">│</text><text
class="breeze-sbom-export-dependency-information-r4" x="61" y="312.8"
textLength="207.4"
clip-path="url(#breeze-sbom-export-dependency-information-line-12)">--include-actions</text><text
class="breeze-sbom-export-dependency-information-r1" x="475.8" y="312.8"
textLength="524.6" clip-path="url(#breeze-sbom-exp [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="337.2" textLength="1464"
clip-path="url(#breeze-sbom-export-dependency-information-line-13)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-export-dependency-information-r1" x="1464" y="337.2"
textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-13)">
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="361.6" textLength="24.4"
clip-path="url(#breeze-sbom-export-dependency-information-line-14)">╭─</text><text
class="breeze-sbom-export-dependency-information-r5" x="24.4" y="361.6"
textLength="134.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-14)"> CSV flags </text><text
class="breeze-sbom-export-dependency-information-r5" x="158.6" y="361.6"
textLength="1281" clip-path="url(#bree [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="386" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-15)">│</text><text
class="breeze-sbom-export-dependency-information-r4" x="24.4" y="386"
textLength="122"
clip-path="url(#breeze-sbom-export-dependency-information-line-15)">--csv-file</text><text
class="breeze-sbom-export-dependency-information-r7" x="170.8" y="386"
textLength="24.4" clip-path="url(#breeze-sbom-export-dependency [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="410.4" textLength="1464"
clip-path="url(#breeze-sbom-export-dependency-information-line-16)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-export-dependency-information-r1" x="1464" y="410.4"
textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-16)">
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="434.8" textLength="24.4"
clip-path="url(#breeze-sbom-export-dependency-information-line-17)">╭─</text><text
class="breeze-sbom-export-dependency-information-r5" x="24.4" y="434.8"
textLength="231.8"
clip-path="url(#breeze-sbom-export-dependency-information-line-17)"> Github auth flags </text><text
class="breeze-sbom-export-dependency-information-r5" x="256.2" y="434.8"
textLength="1183.4" clip- [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="459.2" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-18)">│</text><text
class="breeze-sbom-export-dependency-information-r4" x="24.4" y="459.2"
textLength="170.8"
clip-path="url(#breeze-sbom-export-dependency-information-line-18)">--github-token</text><text
class="breeze-sbom-export-dependency-information-r1" x="244" y="459.2"
textLength="500.2" clip-path="url(#breeze-sbom-export [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="483.6" textLength="1464"
clip-path="url(#breeze-sbom-export-dependency-information-line-19)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-export-dependency-information-r1" x="1464" y="483.6"
textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-19)">
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="508" textLength="24.4"
clip-path="url(#breeze-sbom-export-dependency-information-line-20)">╭─</text><text
class="breeze-sbom-export-dependency-information-r5" x="24.4" y="508"
textLength="317.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-20)"> Google spreadsheet flags </text><text
class="breeze-sbom-export-dependency-information-r5" x="341.6" y="508"
textLength="1098" clip-p [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="532.4" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-21)">│</text><text
class="breeze-sbom-export-dependency-information-r4" x="24.4" y="532.4"
textLength="280.6"
clip-path="url(#breeze-sbom-export-dependency-information-line-21)">--json-credentials-file</text><text
class="breeze-sbom-export-dependency-information-r1" x="378.2" y="532.4"
textLength="915" clip-path="url(#breeze-sb [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="556.8" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-22)">│</text><text
class="breeze-sbom-export-dependency-information-r4" x="24.4" y="556.8"
textLength="280.6"
clip-path="url(#breeze-sbom-export-dependency-information-line-22)">--google-spreadsheet-id</text><text
class="breeze-sbom-export-dependency-information-r7" x="329.4" y="556.8"
textLength="24.4" clip-path="url(#breeze-s [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="581.2" textLength="1464"
clip-path="url(#breeze-sbom-export-dependency-information-line-23)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-export-dependency-information-r1" x="1464" y="581.2"
textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-23)">
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="605.6" textLength="24.4"
clip-path="url(#breeze-sbom-export-dependency-information-line-24)">╭─</text><text
class="breeze-sbom-export-dependency-information-r5" x="24.4" y="605.6"
textLength="207.4"
clip-path="url(#breeze-sbom-export-dependency-information-line-24)"> Debugging flags </text><text
class="breeze-sbom-export-dependency-information-r5" x="231.8" y="605.6"
textLength="1207.8" clip-path="u [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="630" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-25)">│</text><text
class="breeze-sbom-export-dependency-information-r4" x="24.4" y="630"
textLength="170.8"
clip-path="url(#breeze-sbom-export-dependency-information-line-25)">--limit-output</text><text
class="breeze-sbom-export-dependency-information-r7" x="219.6" y="630"
textLength="24.4" clip-path="url(#breeze-sbom-export-depe [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="654.4" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-26)">│</text><text
class="breeze-sbom-export-dependency-information-r1" x="268.4" y="654.4"
textLength="1171.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-26)">to output all dependencies, do not specify this option.         
[...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="678.8" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-27)">│</text><text
class="breeze-sbom-export-dependency-information-r8" x="268.4" y="678.8"
textLength="1171.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-27)">(INTEGER)                       &#
[...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="703.2" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-28)">│</text><text
class="breeze-sbom-export-dependency-information-r4" x="24.4" y="703.2"
textLength="170.8"
clip-path="url(#breeze-sbom-export-dependency-information-line-28)">--project-name</text><text
class="breeze-sbom-export-dependency-information-r1" x="268.4" y="703.2"
textLength="1012.6" clip-path="url(#breeze-sbom-exp [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="727.6" textLength="1464"
clip-path="url(#breeze-sbom-export-dependency-information-line-29)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-export-dependency-information-r1" x="1464" y="727.6"
textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-29)">
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="752" textLength="24.4"
clip-path="url(#breeze-sbom-export-dependency-information-line-30)">╭─</text><text
class="breeze-sbom-export-dependency-information-r5" x="24.4" y="752"
textLength="195.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-30)"> Common options </text><text
class="breeze-sbom-export-dependency-information-r5" x="219.6" y="752"
textLength="1220" clip-path="url(#breez [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="776.4" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-31)">│</text><text
class="breeze-sbom-export-dependency-information-r4" x="24.4" y="776.4"
textLength="109.8"
clip-path="url(#breeze-sbom-export-dependency-information-line-31)">--dry-run</text><text
class="breeze-sbom-export-dependency-information-r7" x="158.6" y="776.4"
textLength="24.4" clip-path="url(#breeze-sbom-export-dep [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="800.8" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-32)">│</text><text
class="breeze-sbom-export-dependency-information-r4" x="24.4" y="800.8"
textLength="97.6"
clip-path="url(#breeze-sbom-export-dependency-information-line-32)">--answer</text><text
class="breeze-sbom-export-dependency-information-r7" x="158.6" y="800.8"
textLength="24.4" clip-path="url(#breeze-sbom-export-depen [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="825.2" textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-33)">│</text><text
class="breeze-sbom-export-dependency-information-r4" x="24.4" y="825.2"
textLength="73.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-33)">--help</text><text
class="breeze-sbom-export-dependency-information-r7" x="158.6" y="825.2"
textLength="24.4" clip-path="url(#breeze-sbom-export-depende [...]
+</text><text class="breeze-sbom-export-dependency-information-r5" x="0"
y="849.6" textLength="1464"
clip-path="url(#breeze-sbom-export-dependency-information-line-34)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-export-dependency-information-r1" x="1464" y="849.6"
textLength="12.2"
clip-path="url(#breeze-sbom-export-dependency-information-line-34)">
</text>
</g>
</g>
diff --git
a/dev/breeze/doc/images/output_sbom_export-dependency-information.txt
b/dev/breeze/doc/images/output_sbom_export-dependency-information.txt
index 0097771912..af7e5bcc29 100644
--- a/dev/breeze/doc/images/output_sbom_export-dependency-information.txt
+++ b/dev/breeze/doc/images/output_sbom_export-dependency-information.txt
@@ -1 +1 @@
-04ba24ba16920575bec41722d612f0a4
+b66a78c14ba8a90c256d630d5246fc5d
diff --git a/dev/breeze/src/airflow_breeze/commands/sbom_commands.py
b/dev/breeze/src/airflow_breeze/commands/sbom_commands.py
index db17120fda..1cc9a21c23 100644
--- a/dev/breeze/src/airflow_breeze/commands/sbom_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/sbom_commands.py
@@ -72,7 +72,11 @@ from airflow_breeze.utils.parallel import (
check_async_run_results,
run_with_pool,
)
-from airflow_breeze.utils.path_utils import FILES_SBOM_DIR,
PROVIDER_METADATA_JSON_FILE_PATH
+from airflow_breeze.utils.path_utils import (
+ AIRFLOW_SOURCES_ROOT,
+ FILES_SBOM_DIR,
+ PROVIDER_METADATA_JSON_FILE_PATH,
+)
from airflow_breeze.utils.recording import generating_command_images
from airflow_breeze.utils.shared_options import get_dry_run
@@ -662,7 +666,7 @@ def generate_providers_requirements(
@option_github_token
@click.option(
"--json-credentials-file",
- type=click.Path(file_okay=True, dir_okay=False, path_type=Path,
writable=False),
+ type=click.Path(file_okay=True, dir_okay=False, path_type=Path,
writable=False, exists=False),
help="Gsheet JSON credentials file (defaults to
~/.config/gsheet/credentials.json",
envvar="JSON_CREDENTIALS_FILE",
default=Path.home() / ".config" / "gsheet" / "credentials.json"
@@ -684,6 +688,12 @@ def generate_providers_requirements(
is_flag=True,
default=False,
)
[email protected](
+ "--include-actions",
+ help="Include Actions recommended for the project",
+ is_flag=True,
+ default=False,
+)
@click.option(
"-l",
"--limit-output",
@@ -709,6 +719,7 @@ def export_dependency_information(
json_credentials_file: Path,
include_open_psf_scorecard: bool,
include_github_stats: bool,
+ include_actions: bool,
limit_output: int | None,
project_name: str | None,
):
@@ -721,7 +732,14 @@ def export_dependency_information(
if google_spreadsheet_id and not json_credentials_file.exists():
get_console().print(
f"[error]The JSON credentials file {json_credentials_file} does
not exist. "
- "Please specify a valid path to the JSON credentials file."
+ "Please specify a valid path to the JSON credentials file.[/]\n"
+ "You can download credentials file from your google developer
console:"
+ "https://console.cloud.google.com/apis/credentials after creating
a Desktop Client ID."
+ )
+ sys.exit(1)
+ if include_actions and not include_open_psf_scorecard:
+ get_console().print(
+ "[error]You cannot specify --include-actions without
--include-open-psf-scorecard"
)
sys.exit(1)
import requests
@@ -744,13 +762,18 @@ def export_dependency_information(
full_sbom=full_sbom,
include_open_psf_scorecard=include_open_psf_scorecard,
include_github_stats=include_github_stats,
+ include_actions=include_actions,
limit_output=limit_output,
github_token=github_token,
project_name=project_name,
)
all_dependency_value_dicts = sorted(all_dependency_value_dicts,
key=sort_deps_key)
- fieldnames = get_field_names(include_open_psf_scorecard,
include_github_stats)
+ fieldnames = get_field_names(
+ include_open_psf_scorecard=include_open_psf_scorecard,
+ include_github_stats=include_github_stats,
+ include_actions=include_actions,
+ )
if csv_file:
write_to_csv_file(
@@ -762,6 +785,7 @@ def export_dependency_information(
json_credentials_file=json_credentials_file,
all_dependencies=all_dependency_value_dicts,
fieldnames=fieldnames,
+ include_opsf_scorecard=include_open_psf_scorecard,
)
@@ -801,6 +825,7 @@ def write_to_google_spreadsheet(
json_credentials_file: Path,
all_dependencies: list[dict[str, Any]],
fieldnames: list[str],
+ include_opsf_scorecard: bool = False,
):
token_path = Path.home() / ".config" / "gsheet" / "token.json"
@@ -814,7 +839,8 @@ def write_to_google_spreadsheet(
]
num_rows = update_field_values(all_dependencies, cell_field_names,
google_spreadsheet_id, sheet)
- update_opsf_detailed_comments(all_dependencies, fieldnames, num_rows,
google_spreadsheet_id, sheet)
+ if include_opsf_scorecard:
+ update_opsf_detailed_comments(all_dependencies, fieldnames, num_rows,
google_spreadsheet_id, sheet)
def update_opsf_detailed_comments(
@@ -935,6 +961,7 @@ def convert_all_sbom_to_value_dictionaries(
full_sbom: dict[str, Any],
include_open_psf_scorecard: bool,
include_github_stats: bool,
+ include_actions: bool,
limit_output: int | None,
github_token: str | None = None,
project_name: str | None = None,
@@ -943,6 +970,11 @@ def convert_all_sbom_to_value_dictionaries(
dev_deps = set(normalize_package_name(name) for name in
DEVEL_DEPS_PATH.read_text().splitlines())
num_deps = 0
all_dependency_value_dicts = []
+ dependency_depth: dict[str, int] = json.loads(
+ (AIRFLOW_SOURCES_ROOT / "generated" /
"dependency_depth.json").read_text()
+ )
+ for key, value in dependency_depth.items():
+ dependency_depth[normalize_package_name(key)] = value
for dependency in core_sbom["components"]:
normalized_name = normalize_package_name(dependency["name"])
if project_name and normalized_name != project_name:
@@ -951,10 +983,12 @@ def convert_all_sbom_to_value_dictionaries(
is_devel = normalized_name in dev_deps
value_dict = convert_sbom_entry_to_dict(
dependency,
+ dependency_depth=dependency_depth,
is_core=True,
is_devel=is_devel,
include_open_psf_scorecard=include_open_psf_scorecard,
include_github_stats=include_github_stats,
+ include_actions=include_actions,
github_token=github_token,
)
if value_dict:
@@ -970,10 +1004,12 @@ def convert_all_sbom_to_value_dictionaries(
is_devel = normalized_name in dev_deps
value_dict = convert_sbom_entry_to_dict(
dependency,
+ dependency_depth=dependency_depth,
is_core=False,
is_devel=is_devel,
include_open_psf_scorecard=include_open_psf_scorecard,
include_github_stats=include_github_stats,
+ include_actions=include_actions,
github_token=github_token,
)
if value_dict:
diff --git a/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py
b/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py
index bb0936b99b..0e1b6d5fb8 100644
--- a/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py
@@ -100,6 +100,7 @@ SBOM_PARAMETERS: dict[str, list[dict[str, str |
list[str]]]] = {
"--python",
"--include-open-psf-scorecard",
"--include-github-stats",
+ "--include-actions",
],
},
{
diff --git a/dev/breeze/src/airflow_breeze/utils/cdxgen.py
b/dev/breeze/src/airflow_breeze/utils/cdxgen.py
index 00256f8f10..06476df396 100644
--- a/dev/breeze/src/airflow_breeze/utils/cdxgen.py
+++ b/dev/breeze/src/airflow_breeze/utils/cdxgen.py
@@ -638,6 +638,8 @@ RELATIONSHIP_PROJECT = [
"universal-pathlib",
]
+CONTACTED_PROJECTS: list[str] = []
+
def get_github_stats(vcs: str, project_name: str, github_token: str | None) ->
dict[str, Any]:
import requests
@@ -725,12 +727,23 @@ def get_governance(vcs: str | None):
return "Loose community/ Single Person"
+ACTIONS: dict[str, tuple[int, str]] = {
+ "Security-Policy": (9, "Add Security Policy to the repository"),
+ "Vulnerabilities": (10, "Follow up with vulnerabilities"),
+ "Packaging": (10, "Propose Trusted Publishing"),
+ "Dangerous-Workflow": (10, "Follow up with dangerous workflow"),
+ "Code-Review": (7, "Propose mandatory code review"),
+}
+
+
def convert_sbom_entry_to_dict(
dependency: dict[str, Any],
+ dependency_depth: dict[str, int],
is_core: bool,
is_devel: bool,
include_open_psf_scorecard: bool,
include_github_stats: bool,
+ include_actions: bool,
github_token: str | None,
) -> dict[str, Any] | None:
"""
@@ -745,13 +758,15 @@ def convert_sbom_entry_to_dict(
name = dependency.get("name", "")
if name.startswith("apache-airflow"):
return None
+ normalized_name = normalize_package_name(dependency.get("name", ""))
row = {
- "Name": normalize_package_name(dependency.get("name", "")),
+ "Name": normalized_name,
"Author": dependency.get("author", ""),
"Version": dependency.get("version", ""),
"Description": dependency.get("description"),
"Core": is_core,
"Devel": is_devel,
+ "Depth": dependency_depth.get(normalized_name, "Extra"),
"Licenses": convert_licenses(dependency.get("licenses", [])),
"Purl": dependency.get("purl"),
"Pypi": get_pypi_link(dependency),
@@ -766,11 +781,35 @@ def convert_sbom_entry_to_dict(
row.update(github_stats)
if name in RELATIONSHIP_PROJECT:
row["Relationship"] = "Yes"
+ if include_actions:
+ if name in CONTACTED_PROJECTS:
+ row["Contacted"] = "Yes"
+ num_actions = 0
+ for action, (threshold, action_text) in ACTIONS.items():
+ opsf_action = "OPSF-" + action
+ if opsf_action in row and int(row[opsf_action]) < threshold:
+ row[action_text] = "Yes"
+ num_actions += 1
+ row["Num Actions"] = num_actions
return row
-def get_field_names(include_open_psf_scorecard: bool, include_github_stats:
bool) -> list[str]:
- names = ["Name", "Author", "Version", "Description", "Core", "Devel",
"Licenses", "Purl", "Pypi", "Vcs"]
+def get_field_names(
+ include_open_psf_scorecard: bool, include_github_stats: bool,
include_actions: bool
+) -> list[str]:
+ names = [
+ "Name",
+ "Author",
+ "Version",
+ "Description",
+ "Core",
+ "Devel",
+ "Depth",
+ "Licenses",
+ "Purl",
+ "Pypi",
+ "Vcs",
+ ]
if include_open_psf_scorecard:
names.append("OPSF-Score")
for check in OPEN_PSF_CHECKS:
@@ -781,7 +820,12 @@ def get_field_names(include_open_psf_scorecard: bool,
include_github_stats: bool
names.extend(["Lifecycle status", "Unpatched Vulns"])
if include_github_stats:
names.append("Industry importance")
- names.append("Relationship")
+ if include_actions:
+ names.append("Relationship")
+ names.append("Contacted")
+ for action in ACTIONS.values():
+ names.append(action[1])
+ names.append("Num Actions")
return names
diff --git a/generated/README.md b/generated/README.md
index 6544ce34d2..a52ac1934d 100644
--- a/generated/README.md
+++ b/generated/README.md
@@ -39,3 +39,17 @@ You can read more about pre-commit hooks
[here](../contributing-docs/08_static_c
* `devel_deps.txt` is a file containing development-only dependencies of
Airflow. They were generated
for Airflow 2.9.3 by running `./dev/get_devel_deps.sh` script.
+
+* `dep_tree.txt` is a file containing the dependency tree of Airflow. It was
generated for Airflow 2.9.3
+ by running this inside breeze:
+
+```bash
+uv tree --no-dedupe > /opt/airflow/generated/dep_tree.txt
+```
+
+* `dependency_depth.json` is a fie containing the dependency depth of Airflow.
It was generated for Airflow 2.9.3
+ by running this inside breeze:
+
+```bash
+cat /opt/airflow/generated/dep_tree.txt | python
/opt/airflow/scripts/in_container/get_dependency_status.py
>/opt/airflow/generated/dependency_depth.json
+```
diff --git a/generated/dep_tree.txt b/generated/dep_tree.txt
new file mode 100644
index 0000000000..a2c2f59f5b
--- /dev/null
+++ b/generated/dep_tree.txt
@@ -0,0 +1,579 @@
+apache-airflow v3.0.0.dev0
+├── aiohttp v3.10.5
+│ ├── aiohappyeyeballs v2.4.0
+│ ├── aiosignal v1.3.1
+│ │ └── frozenlist v1.4.1
+│ ├── async-timeout v4.0.3
+│ ├── attrs v24.2.0
+│ ├── frozenlist v1.4.1
+│ ├── multidict v6.0.5
+│ └── yarl v1.9.6
+│ ├── idna v3.8
+│ └── multidict v6.0.5
+├── alembic v1.13.2
+│ ├── importlib-metadata v8.4.0
+│ │ └── zipp v3.20.1
+│ ├── importlib-resources v6.4.4
+│ │ └── zipp v3.20.1
+│ ├── mako v1.3.5
+│ │ └── markupsafe v2.1.5
+│ ├── sqlalchemy v1.4.53
+│ │ └── greenlet v3.0.3
+│ └── typing-extensions v4.12.2
+├── argcomplete v3.5.0
+├── asgiref v3.8.1
+│ └── typing-extensions v4.12.2
+├── attrs v24.2.0
+├── blinker v1.8.2
+├── colorlog v6.8.2
+├── configupdater v3.2
+├── connexion[flask] v2.14.2
+│ ├── clickclick v20.10.2
+│ │ ├── click v8.1.7
+│ │ └── pyyaml v6.0.2
+│ ├── flask v2.2.5
+│ │ ├── click v8.1.7
+│ │ ├── importlib-metadata v8.4.0
+│ │ │ └── zipp v3.20.1
+│ │ ├── itsdangerous v2.2.0
+│ │ ├── jinja2 v3.1.4
+│ │ │ └── markupsafe v2.1.5
+│ │ └── werkzeug v2.2.3
+│ │ └── markupsafe v2.1.5
+│ ├── inflection v0.5.1
+│ ├── itsdangerous v2.2.0
+│ ├── jsonschema v4.23.0
+│ │ ├── attrs v24.2.0
+│ │ ├── importlib-resources v6.4.4
+│ │ │ └── zipp v3.20.1
+│ │ ├── jsonschema-specifications v2023.12.1
+│ │ │ ├── importlib-resources v6.4.4
+│ │ │ │ └── zipp v3.20.1
+│ │ │ └── referencing v0.35.1
+│ │ │ ├── attrs v24.2.0
+│ │ │ └── rpds-py v0.20.0
+│ │ ├── pkgutil-resolve-name v1.3.10
+│ │ ├── referencing v0.35.1
+│ │ │ ├── attrs v24.2.0
+│ │ │ └── rpds-py v0.20.0
+│ │ └── rpds-py v0.20.0
+│ ├── packaging v24.1
+│ ├── pyyaml v6.0.2
+│ ├── requests v2.32.3
+│ │ ├── certifi v2024.8.30
+│ │ ├── charset-normalizer v3.3.2
+│ │ ├── idna v3.8
+│ │ └── urllib3 v2.2.2
+│ ├── werkzeug v2.2.3
+│ │ └── markupsafe v2.1.5
+│ ├── flask v2.2.5 (extra: flask)
+│ │ ├── click v8.1.7
+│ │ ├── importlib-metadata v8.4.0
+│ │ │ └── zipp v3.20.1
+│ │ ├── itsdangerous v2.2.0
+│ │ ├── jinja2 v3.1.4
+│ │ │ └── markupsafe v2.1.5
+│ │ └── werkzeug v2.2.3
+│ │ └── markupsafe v2.1.5
+│ └── itsdangerous v2.2.0 (extra: flask)
+├── cron-descriptor v1.4.5
+├── croniter v3.0.3
+│ ├── python-dateutil v2.9.0.post0
+│ │ └── six v1.16.0
+│ └── pytz v2024.1
+├── cryptography v43.0.0
+│ └── cffi v1.17.0
+│ └── pycparser v2.22
+├── deprecated v1.2.14
+│ └── wrapt v1.16.0
+├── dill v0.3.8
+├── fastapi[standard] v0.112.2
+│ ├── pydantic v2.8.2
+│ │ ├── annotated-types v0.7.0
+│ │ │ └── typing-extensions v4.12.2
+│ │ ├── pydantic-core v2.20.1
+│ │ │ └── typing-extensions v4.12.2
+│ │ └── typing-extensions v4.12.2
+│ ├── starlette v0.38.2
+│ │ ├── anyio v4.4.0
+│ │ │ ├── exceptiongroup v1.2.2
+│ │ │ ├── idna v3.8
+│ │ │ ├── sniffio v1.3.1
+│ │ │ └── typing-extensions v4.12.2
+│ │ └── typing-extensions v4.12.2
+│ ├── typing-extensions v4.12.2
+│ ├── email-validator v2.2.0 (extra: standard)
+│ │ ├── dnspython v2.6.1
+│ │ └── idna v3.8
+│ ├── fastapi-cli[standard] v0.0.5 (extra: standard)
+│ │ ├── typer v0.12.5
+│ │ │ ├── click v8.1.7
+│ │ │ ├── rich v13.8.0
+│ │ │ │ ├── markdown-it-py v3.0.0
+│ │ │ │ │ └── mdurl v0.1.2
+│ │ │ │ ├── pygments v2.18.0
+│ │ │ │ └── typing-extensions v4.12.2
+│ │ │ ├── shellingham v1.5.4
+│ │ │ └── typing-extensions v4.12.2
+│ │ ├── uvicorn[standard] v0.30.6
+│ │ │ ├── click v8.1.7
+│ │ │ ├── h11 v0.14.0
+│ │ │ ├── typing-extensions v4.12.2
+│ │ │ ├── httptools v0.6.1 (extra: standard)
+│ │ │ ├── python-dotenv v1.0.1 (extra: standard)
+│ │ │ ├── pyyaml v6.0.2 (extra: standard)
+│ │ │ ├── uvloop v0.20.0 (extra: standard)
+│ │ │ ├── watchfiles v0.24.0 (extra: standard)
+│ │ │ │ └── anyio v4.4.0
+│ │ │ │ ├── exceptiongroup v1.2.2
+│ │ │ │ ├── idna v3.8
+│ │ │ │ ├── sniffio v1.3.1
+│ │ │ │ └── typing-extensions v4.12.2
+│ │ │ └── websockets v13.0.1 (extra: standard)
+│ │ └── uvicorn[standard] v0.30.6 (extra: standard)
+│ │ ├── click v8.1.7
+│ │ ├── h11 v0.14.0
+│ │ ├── typing-extensions v4.12.2
+│ │ ├── httptools v0.6.1 (extra: standard)
+│ │ ├── python-dotenv v1.0.1 (extra: standard)
+│ │ ├── pyyaml v6.0.2 (extra: standard)
+│ │ ├── uvloop v0.20.0 (extra: standard)
+│ │ ├── watchfiles v0.24.0 (extra: standard)
+│ │ │ └── anyio v4.4.0
+│ │ │ ├── exceptiongroup v1.2.2
+│ │ │ ├── idna v3.8
+│ │ │ ├── sniffio v1.3.1
+│ │ │ └── typing-extensions v4.12.2
+│ │ └── websockets v13.0.1 (extra: standard)
+│ ├── httpx v0.27.2 (extra: standard)
+│ │ ├── anyio v4.4.0
+│ │ │ ├── exceptiongroup v1.2.2
+│ │ │ ├── idna v3.8
+│ │ │ ├── sniffio v1.3.1
+│ │ │ └── typing-extensions v4.12.2
+│ │ ├── certifi v2024.8.30
+│ │ ├── httpcore v1.0.5
+│ │ │ ├── certifi v2024.8.30
+│ │ │ └── h11 v0.14.0
+│ │ ├── idna v3.8
+│ │ └── sniffio v1.3.1
+│ ├── jinja2 v3.1.4 (extra: standard)
+│ │ └── markupsafe v2.1.5
+│ ├── python-multipart v0.0.9 (extra: standard)
+│ └── uvicorn[standard] v0.30.6 (extra: standard)
+│ ├── click v8.1.7
+│ ├── h11 v0.14.0
+│ ├── typing-extensions v4.12.2
+│ ├── httptools v0.6.1 (extra: standard)
+│ ├── python-dotenv v1.0.1 (extra: standard)
+│ ├── pyyaml v6.0.2 (extra: standard)
+│ ├── uvloop v0.20.0 (extra: standard)
+│ ├── watchfiles v0.24.0 (extra: standard)
+│ │ └── anyio v4.4.0
+│ │ ├── exceptiongroup v1.2.2
+│ │ ├── idna v3.8
+│ │ ├── sniffio v1.3.1
+│ │ └── typing-extensions v4.12.2
+│ └── websockets v13.0.1 (extra: standard)
+├── flask v2.2.5
+│ ├── click v8.1.7
+│ ├── importlib-metadata v8.4.0
+│ │ └── zipp v3.20.1
+│ ├── itsdangerous v2.2.0
+│ ├── jinja2 v3.1.4
+│ │ └── markupsafe v2.1.5
+│ └── werkzeug v2.2.3
+│ └── markupsafe v2.1.5
+├── flask-appbuilder v4.5.0
+│ ├── apispec[yaml] v6.6.1
+│ │ ├── packaging v24.1
+│ │ └── pyyaml v6.0.2 (extra: yaml)
+│ ├── click v8.1.7
+│ ├── colorama v0.4.6
+│ ├── email-validator v2.2.0
+│ │ ├── dnspython v2.6.1
+│ │ └── idna v3.8
+│ ├── flask v2.2.5
+│ │ ├── click v8.1.7
+│ │ ├── importlib-metadata v8.4.0
+│ │ │ └── zipp v3.20.1
+│ │ ├── itsdangerous v2.2.0
+│ │ ├── jinja2 v3.1.4
+│ │ │ └── markupsafe v2.1.5
+│ │ └── werkzeug v2.2.3
+│ │ └── markupsafe v2.1.5
+│ ├── flask-babel v2.0.0
+│ │ ├── babel v2.16.0
+│ │ │ └── pytz v2024.1
+│ │ ├── flask v2.2.5
+│ │ │ ├── click v8.1.7
+│ │ │ ├── importlib-metadata v8.4.0
+│ │ │ │ └── zipp v3.20.1
+│ │ │ ├── itsdangerous v2.2.0
+│ │ │ ├── jinja2 v3.1.4
+│ │ │ │ └── markupsafe v2.1.5
+│ │ │ └── werkzeug v2.2.3
+│ │ │ └── markupsafe v2.1.5
+│ │ ├── jinja2 v3.1.4
+│ │ │ └── markupsafe v2.1.5
+│ │ └── pytz v2024.1
+│ ├── flask-jwt-extended v4.6.0
+│ │ ├── flask v2.2.5
+│ │ │ ├── click v8.1.7
+│ │ │ ├── importlib-metadata v8.4.0
+│ │ │ │ └── zipp v3.20.1
+│ │ │ ├── itsdangerous v2.2.0
+│ │ │ ├── jinja2 v3.1.4
+│ │ │ │ └── markupsafe v2.1.5
+│ │ │ └── werkzeug v2.2.3
+│ │ │ └── markupsafe v2.1.5
+│ │ ├── pyjwt v2.9.0
+│ │ └── werkzeug v2.2.3
+│ │ └── markupsafe v2.1.5
+│ ├── flask-limiter v3.8.0
+│ │ ├── flask v2.2.5
+│ │ │ ├── click v8.1.7
+│ │ │ ├── importlib-metadata v8.4.0
+│ │ │ │ └── zipp v3.20.1
+│ │ │ ├── itsdangerous v2.2.0
+│ │ │ ├── jinja2 v3.1.4
+│ │ │ │ └── markupsafe v2.1.5
+│ │ │ └── werkzeug v2.2.3
+│ │ │ └── markupsafe v2.1.5
+│ │ ├── limits v3.13.0
+│ │ │ ├── deprecated v1.2.14
+│ │ │ │ └── wrapt v1.16.0
+│ │ │ ├── importlib-resources v6.4.4
+│ │ │ │ └── zipp v3.20.1
+│ │ │ ├── packaging v24.1
+│ │ │ └── typing-extensions v4.12.2
+│ │ ├── ordered-set v4.1.0
+│ │ ├── rich v13.8.0
+│ │ │ ├── markdown-it-py v3.0.0
+│ │ │ │ └── mdurl v0.1.2
+│ │ │ ├── pygments v2.18.0
+│ │ │ └── typing-extensions v4.12.2
+│ │ └── typing-extensions v4.12.2
+│ ├── flask-login v0.6.3
+│ │ ├── flask v2.2.5
+│ │ │ ├── click v8.1.7
+│ │ │ ├── importlib-metadata v8.4.0
+│ │ │ │ └── zipp v3.20.1
+│ │ │ ├── itsdangerous v2.2.0
+│ │ │ ├── jinja2 v3.1.4
+│ │ │ │ └── markupsafe v2.1.5
+│ │ │ └── werkzeug v2.2.3
+│ │ │ └── markupsafe v2.1.5
+│ │ └── werkzeug v2.2.3
+│ │ └── markupsafe v2.1.5
+│ ├── flask-sqlalchemy v2.5.1
+│ │ ├── flask v2.2.5
+│ │ │ ├── click v8.1.7
+│ │ │ ├── importlib-metadata v8.4.0
+│ │ │ │ └── zipp v3.20.1
+│ │ │ ├── itsdangerous v2.2.0
+│ │ │ ├── jinja2 v3.1.4
+│ │ │ │ └── markupsafe v2.1.5
+│ │ │ └── werkzeug v2.2.3
+│ │ │ └── markupsafe v2.1.5
+│ │ └── sqlalchemy v1.4.53
+│ │ └── greenlet v3.0.3
+│ ├── flask-wtf v1.2.1
+│ │ ├── flask v2.2.5
+│ │ │ ├── click v8.1.7
+│ │ │ ├── importlib-metadata v8.4.0
+│ │ │ │ └── zipp v3.20.1
+│ │ │ ├── itsdangerous v2.2.0
+│ │ │ ├── jinja2 v3.1.4
+│ │ │ │ └── markupsafe v2.1.5
+│ │ │ └── werkzeug v2.2.3
+│ │ │ └── markupsafe v2.1.5
+│ │ ├── itsdangerous v2.2.0
+│ │ └── wtforms v3.1.2
+│ │ └── markupsafe v2.1.5
+│ ├── jsonschema v4.23.0
+│ │ ├── attrs v24.2.0
+│ │ ├── importlib-resources v6.4.4
+│ │ │ └── zipp v3.20.1
+│ │ ├── jsonschema-specifications v2023.12.1
+│ │ │ ├── importlib-resources v6.4.4
+│ │ │ │ └── zipp v3.20.1
+│ │ │ └── referencing v0.35.1
+│ │ │ ├── attrs v24.2.0
+│ │ │ └── rpds-py v0.20.0
+│ │ ├── pkgutil-resolve-name v1.3.10
+│ │ ├── referencing v0.35.1
+│ │ │ ├── attrs v24.2.0
+│ │ │ └── rpds-py v0.20.0
+│ │ └── rpds-py v0.20.0
+│ ├── marshmallow v3.22.0
+│ │ └── packaging v24.1
+│ ├── marshmallow-sqlalchemy v0.28.2
+│ │ ├── marshmallow v3.22.0
+│ │ │ └── packaging v24.1
+│ │ ├── packaging v24.1
+│ │ └── sqlalchemy v1.4.53
+│ │ └── greenlet v3.0.3
+│ ├── prison v0.2.1
+│ │ └── six v1.16.0
+│ ├── pyjwt v2.9.0
+│ ├── python-dateutil v2.9.0.post0
+│ │ └── six v1.16.0
+│ ├── sqlalchemy v1.4.53
+│ │ └── greenlet v3.0.3
+│ ├── sqlalchemy-utils v0.41.2
+│ │ └── sqlalchemy v1.4.53
+│ │ └── greenlet v3.0.3
+│ ├── werkzeug v2.2.3
+│ │ └── markupsafe v2.1.5
+│ └── wtforms v3.1.2
+│ └── markupsafe v2.1.5
+├── flask-caching v2.3.0
+│ ├── cachelib v0.9.0
+│ └── flask v2.2.5
+│ ├── click v8.1.7
+│ ├── importlib-metadata v8.4.0
+│ │ └── zipp v3.20.1
+│ ├── itsdangerous v2.2.0
+│ ├── jinja2 v3.1.4
+│ │ └── markupsafe v2.1.5
+│ └── werkzeug v2.2.3
+│ └── markupsafe v2.1.5
+├── flask-login v0.6.3
+│ ├── flask v2.2.5
+│ │ ├── click v8.1.7
+│ │ ├── importlib-metadata v8.4.0
+│ │ │ └── zipp v3.20.1
+│ │ ├── itsdangerous v2.2.0
+│ │ ├── jinja2 v3.1.4
+│ │ │ └── markupsafe v2.1.5
+│ │ └── werkzeug v2.2.3
+│ │ └── markupsafe v2.1.5
+│ └── werkzeug v2.2.3
+│ └── markupsafe v2.1.5
+├── flask-session v0.5.0
+│ ├── cachelib v0.9.0
+│ └── flask v2.2.5
+│ ├── click v8.1.7
+│ ├── importlib-metadata v8.4.0
+│ │ └── zipp v3.20.1
+│ ├── itsdangerous v2.2.0
+│ ├── jinja2 v3.1.4
+│ │ └── markupsafe v2.1.5
+│ └── werkzeug v2.2.3
+│ └── markupsafe v2.1.5
+├── flask-wtf v1.2.1
+│ ├── flask v2.2.5
+│ │ ├── click v8.1.7
+│ │ ├── importlib-metadata v8.4.0
+│ │ │ └── zipp v3.20.1
+│ │ ├── itsdangerous v2.2.0
+│ │ ├── jinja2 v3.1.4
+│ │ │ └── markupsafe v2.1.5
+│ │ └── werkzeug v2.2.3
+│ │ └── markupsafe v2.1.5
+│ ├── itsdangerous v2.2.0
+│ └── wtforms v3.1.2
+│ └── markupsafe v2.1.5
+├── fsspec v2024.6.1
+├── google-re2 v1.1.20240702
+├── gunicorn v23.0.0
+│ └── packaging v24.1
+├── httpx v0.27.2
+│ ├── anyio v4.4.0
+│ │ ├── exceptiongroup v1.2.2
+│ │ ├── idna v3.8
+│ │ ├── sniffio v1.3.1
+│ │ └── typing-extensions v4.12.2
+│ ├── certifi v2024.8.30
+│ ├── httpcore v1.0.5
+│ │ ├── certifi v2024.8.30
+│ │ └── h11 v0.14.0
+│ ├── idna v3.8
+│ └── sniffio v1.3.1
+├── importlib-metadata v8.4.0
+│ └── zipp v3.20.1
+├── importlib-resources v6.4.4
+│ └── zipp v3.20.1
+├── itsdangerous v2.2.0
+├── jinja2 v3.1.4
+│ └── markupsafe v2.1.5
+├── jmespath v1.0.1
+├── jsonschema v4.23.0
+│ ├── attrs v24.2.0
+│ ├── importlib-resources v6.4.4
+│ │ └── zipp v3.20.1
+│ ├── jsonschema-specifications v2023.12.1
+│ │ ├── importlib-resources v6.4.4
+│ │ │ └── zipp v3.20.1
+│ │ └── referencing v0.35.1
+│ │ ├── attrs v24.2.0
+│ │ └── rpds-py v0.20.0
+│ ├── pkgutil-resolve-name v1.3.10
+│ ├── referencing v0.35.1
+│ │ ├── attrs v24.2.0
+│ │ └── rpds-py v0.20.0
+│ └── rpds-py v0.20.0
+├── lazy-object-proxy v1.10.0
+├── linkify-it-py v2.0.3
+│ └── uc-micro-py v1.0.3
+├── lockfile v0.12.2
+├── markdown-it-py v3.0.0
+│ └── mdurl v0.1.2
+├── markupsafe v2.1.5
+├── marshmallow-oneofschema v3.1.1
+│ └── marshmallow v3.22.0
+│ └── packaging v24.1
+├── mdit-py-plugins v0.4.1
+│ └── markdown-it-py v3.0.0
+│ └── mdurl v0.1.2
+├── methodtools v0.4.7
+│ └── wirerope v0.4.7
+│ └── six v1.16.0
+├── more-itertools v10.4.0
+├── opentelemetry-api v1.27.0
+│ ├── deprecated v1.2.14
+│ │ └── wrapt v1.16.0
+│ └── importlib-metadata v8.4.0
+│ └── zipp v3.20.1
+├── opentelemetry-exporter-otlp v1.27.0
+│ ├── opentelemetry-exporter-otlp-proto-grpc v1.27.0
+│ │ ├── deprecated v1.2.14
+│ │ │ └── wrapt v1.16.0
+│ │ ├── googleapis-common-protos v1.65.0
+│ │ │ └── protobuf v4.25.4
+│ │ ├── grpcio v1.66.1
+│ │ ├── opentelemetry-api v1.27.0
+│ │ │ ├── deprecated v1.2.14
+│ │ │ │ └── wrapt v1.16.0
+│ │ │ └── importlib-metadata v8.4.0
+│ │ │ └── zipp v3.20.1
+│ │ ├── opentelemetry-exporter-otlp-proto-common v1.27.0
+│ │ │ └── opentelemetry-proto v1.27.0
+│ │ │ └── protobuf v4.25.4
+│ │ ├── opentelemetry-proto v1.27.0
+│ │ │ └── protobuf v4.25.4
+│ │ └── opentelemetry-sdk v1.27.0
+│ │ ├── opentelemetry-api v1.27.0
+│ │ │ ├── deprecated v1.2.14
+│ │ │ │ └── wrapt v1.16.0
+│ │ │ └── importlib-metadata v8.4.0
+│ │ │ └── zipp v3.20.1
+│ │ ├── opentelemetry-semantic-conventions v0.48b0
+│ │ │ ├── deprecated v1.2.14
+│ │ │ │ └── wrapt v1.16.0
+│ │ │ └── opentelemetry-api v1.27.0
+│ │ │ ├── deprecated v1.2.14
+│ │ │ │ └── wrapt v1.16.0
+│ │ │ └── importlib-metadata v8.4.0
+│ │ │ └── zipp v3.20.1
+│ │ └── typing-extensions v4.12.2
+│ └── opentelemetry-exporter-otlp-proto-http v1.27.0
+│ ├── deprecated v1.2.14
+│ │ └── wrapt v1.16.0
+│ ├── googleapis-common-protos v1.65.0
+│ │ └── protobuf v4.25.4
+│ ├── opentelemetry-api v1.27.0
+│ │ ├── deprecated v1.2.14
+│ │ │ └── wrapt v1.16.0
+│ │ └── importlib-metadata v8.4.0
+│ │ └── zipp v3.20.1
+│ ├── opentelemetry-exporter-otlp-proto-common v1.27.0
+│ │ └── opentelemetry-proto v1.27.0
+│ │ └── protobuf v4.25.4
+│ ├── opentelemetry-proto v1.27.0
+│ │ └── protobuf v4.25.4
+│ ├── opentelemetry-sdk v1.27.0
+│ │ ├── opentelemetry-api v1.27.0
+│ │ │ ├── deprecated v1.2.14
+│ │ │ │ └── wrapt v1.16.0
+│ │ │ └── importlib-metadata v8.4.0
+│ │ │ └── zipp v3.20.1
+│ │ ├── opentelemetry-semantic-conventions v0.48b0
+│ │ │ ├── deprecated v1.2.14
+│ │ │ │ └── wrapt v1.16.0
+│ │ │ └── opentelemetry-api v1.27.0
+│ │ │ ├── deprecated v1.2.14
+│ │ │ │ └── wrapt v1.16.0
+│ │ │ └── importlib-metadata v8.4.0
+│ │ │ └── zipp v3.20.1
+│ │ └── typing-extensions v4.12.2
+│ └── requests v2.32.3
+│ ├── certifi v2024.8.30
+│ ├── charset-normalizer v3.3.2
+│ ├── idna v3.8
+│ └── urllib3 v2.2.2
+├── packaging v24.1
+├── pathspec v0.12.1
+├── pendulum v3.0.0
+│ ├── backports-zoneinfo v0.2.1
+│ ├── importlib-resources v6.4.4
+│ │ └── zipp v3.20.1
+│ ├── python-dateutil v2.9.0.post0
+│ │ └── six v1.16.0
+│ ├── time-machine v2.15.0
+│ │ └── python-dateutil v2.9.0.post0
+│ │ └── six v1.16.0
+│ └── tzdata v2024.1
+├── pluggy v1.5.0
+├── psutil v6.0.0
+├── pydantic v2.8.2
+│ ├── annotated-types v0.7.0
+│ │ └── typing-extensions v4.12.2
+│ ├── pydantic-core v2.20.1
+│ │ └── typing-extensions v4.12.2
+│ └── typing-extensions v4.12.2
+├── pygments v2.18.0
+├── pyjwt v2.9.0
+├── python-daemon v3.0.1
+│ ├── docutils v0.20.1
+│ ├── lockfile v0.12.2
+│ └── setuptools v74.0.0
+├── python-dateutil v2.9.0.post0
+│ └── six v1.16.0
+├── python-nvd3 v0.16.0
+│ ├── jinja2 v3.1.4
+│ │ └── markupsafe v2.1.5
+│ └── python-slugify v8.0.4
+│ └── text-unidecode v1.3
+├── python-slugify v8.0.4
+│ └── text-unidecode v1.3
+├── requests v2.32.3
+│ ├── certifi v2024.8.30
+│ ├── charset-normalizer v3.3.2
+│ ├── idna v3.8
+│ └── urllib3 v2.2.2
+├── requests-toolbelt v1.0.0
+│ └── requests v2.32.3
+│ ├── certifi v2024.8.30
+│ ├── charset-normalizer v3.3.2
+│ ├── idna v3.8
+│ └── urllib3 v2.2.2
+├── rfc3339-validator v0.1.4
+│ └── six v1.16.0
+├── rich v13.8.0
+│ ├── markdown-it-py v3.0.0
+│ │ └── mdurl v0.1.2
+│ ├── pygments v2.18.0
+│ └── typing-extensions v4.12.2
+├── rich-argparse v1.5.2
+│ └── rich v13.8.0
+│ ├── markdown-it-py v3.0.0
+│ │ └── mdurl v0.1.2
+│ ├── pygments v2.18.0
+│ └── typing-extensions v4.12.2
+├── setproctitle v1.3.3
+├── sqlalchemy v1.4.53
+│ └── greenlet v3.0.3
+├── sqlalchemy-jsonfield v1.0.2
+│ └── sqlalchemy v1.4.53
+│ └── greenlet v3.0.3
+├── sqlparse v0.5.1
+├── tabulate v0.9.0
+├── tenacity v9.0.0
+├── termcolor v2.4.0
+├── unicodecsv v0.14.1
+├── universal-pathlib v0.2.2
+│ └── fsspec v2024.6.1
+└── werkzeug v2.2.3
+ └── markupsafe v2.1.5
diff --git a/generated/dependency_depth.json b/generated/dependency_depth.json
new file mode 100644
index 0000000000..593e791ae0
--- /dev/null
+++ b/generated/dependency_depth.json
@@ -0,0 +1,146 @@
+{
+ "apache-airflow": 0,
+ "aiohttp": 1,
+ "aiohappyeyeballs": 2,
+ "aiosignal": 2,
+ "frozenlist": 3,
+ "async-timeout": 2,
+ "attrs": 2,
+ "multidict": 2,
+ "yarl": 2,
+ "idna": 2,
+ "alembic": 1,
+ "importlib-metadata": 2,
+ "zipp": 3,
+ "importlib-resources": 2,
+ "mako": 2,
+ "markupsafe": 3,
+ "sqlalchemy": 2,
+ "greenlet": 3,
+ "typing-extensions": 2,
+ "argcomplete": 1,
+ "asgiref": 1,
+ "blinker": 1,
+ "colorlog": 1,
+ "configupdater": 1,
+ "connexion[flask]": 1,
+ "clickclick": 2,
+ "click": 3,
+ "pyyaml": 3,
+ "flask": 2,
+ "itsdangerous": 3,
+ "jinja2": 3,
+ "werkzeug": 3,
+ "inflection": 2,
+ "jsonschema": 2,
+ "jsonschema-specifications": 3,
+ "referencing": 4,
+ "rpds-py": 4,
+ "pkgutil-resolve-name": 3,
+ "packaging": 2,
+ "requests": 2,
+ "certifi": 3,
+ "charset-normalizer": 3,
+ "urllib3": 3,
+ "(extra:": 4,
+ "cron-descriptor": 1,
+ "croniter": 1,
+ "python-dateutil": 2,
+ "six": 3,
+ "pytz": 2,
+ "cryptography": 1,
+ "cffi": 2,
+ "pycparser": 2,
+ "deprecated": 1,
+ "wrapt": 2,
+ "dill": 1,
+ "fastapi[standard]": 1,
+ "pydantic": 2,
+ "annotated-types": 3,
+ "pydantic-core": 3,
+ "starlette": 2,
+ "anyio": 3,
+ "exceptiongroup": 4,
+ "sniffio": 4,
+ "dnspython": 3,
+ "typer": 3,
+ "rich": 4,
+ "markdown-it-py": 5,
+ "mdurl": 6,
+ "pygments": 5,
+ "shellingham": 4,
+ "uvicorn[standard]": 3,
+ "h11": 4,
+ "httpcore": 3,
+ "flask-appbuilder": 1,
+ "apispec[yaml]": 2,
+ "colorama": 2,
+ "email-validator": 2,
+ "flask-babel": 2,
+ "babel": 3,
+ "flask-jwt-extended": 2,
+ "pyjwt": 3,
+ "flask-limiter": 2,
+ "limits": 3,
+ "ordered-set": 3,
+ "flask-login": 2,
+ "flask-sqlalchemy": 2,
+ "flask-wtf": 2,
+ "wtforms": 3,
+ "marshmallow": 2,
+ "marshmallow-sqlalchemy": 2,
+ "prison": 2,
+ "sqlalchemy-utils": 2,
+ "flask-caching": 1,
+ "cachelib": 2,
+ "flask-session": 1,
+ "fsspec": 1,
+ "google-re2": 1,
+ "gunicorn": 1,
+ "httpx": 1,
+ "jmespath": 1,
+ "lazy-object-proxy": 1,
+ "linkify-it-py": 1,
+ "uc-micro-py": 2,
+ "lockfile": 1,
+ "marshmallow-oneofschema": 1,
+ "mdit-py-plugins": 1,
+ "methodtools": 1,
+ "wirerope": 2,
+ "more-itertools": 1,
+ "opentelemetry-api": 1,
+ "opentelemetry-exporter-otlp": 1,
+ "opentelemetry-exporter-otlp-proto-grpc": 2,
+ "googleapis-common-protos": 3,
+ "protobuf": 4,
+ "grpcio": 3,
+ "opentelemetry-exporter-otlp-proto-common": 3,
+ "opentelemetry-proto": 4,
+ "opentelemetry-sdk": 3,
+ "opentelemetry-semantic-conventions": 3,
+ "opentelemetry-exporter-otlp-proto-http": 2,
+ "pathspec": 1,
+ "pendulum": 1,
+ "backports-zoneinfo": 2,
+ "time-machine": 2,
+ "tzdata": 2,
+ "pluggy": 1,
+ "psutil": 1,
+ "python-daemon": 1,
+ "docutils": 2,
+ "setuptools": 2,
+ "python-nvd3": 1,
+ "python-slugify": 2,
+ "text-unidecode": 2,
+ "requests-toolbelt": 1,
+ "rfc3339-validator": 1,
+ "rich-argparse": 1,
+ "setproctitle": 1,
+ "sqlalchemy-jsonfield": 1,
+ "sqlparse": 1,
+ "tabulate": 1,
+ "tenacity": 1,
+ "termcolor": 1,
+ "unicodecsv": 1,
+ "universal-pathlib": 1
+}
diff --git a/scripts/in_container/get_dependency_status.py
b/scripts/in_container/get_dependency_status.py
new file mode 100644
index 0000000000..961f66d8d6
--- /dev/null
+++ b/scripts/in_container/get_dependency_status.py
@@ -0,0 +1,46 @@
+#!/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 json
+import sys
+
+
+def read_input():
+ input_data = sys.stdin.read()
+ return input_data
+
+
+DEPS_DEPTH: dict[str, int] = {}
+
+
+def get_dep_level(line: str):
+ split_line = line.split()
+ level = len(split_line) - 2
+ package = split_line[level]
+ if package not in DEPS_DEPTH:
+ DEPS_DEPTH[package] = level
+
+
+if __name__ == "__main__":
+ input_data = read_input()
+ lines = input_data.splitlines()
+ for line in lines:
+ get_dep_level(line)
+
+ print(json.dumps(DEPS_DEPTH, indent=4))