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

rahulvats pushed a commit to branch py-client-sync
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 784440337ced3ff5e5fbf2ac49784d7de2720a12
Author: Elad Kalif <[email protected]>
AuthorDate: Mon Mar 23 22:47:21 2026 +0200

    update footer summary table for constraints version check script (#64117)
---
 .../utils/constraints_version_check.py             | 42 +++++++++++++++-------
 1 file changed, 30 insertions(+), 12 deletions(-)

diff --git a/dev/breeze/src/airflow_breeze/utils/constraints_version_check.py 
b/dev/breeze/src/airflow_breeze/utils/constraints_version_check.py
index 900186e2f4a..d445481f18c 100755
--- a/dev/breeze/src/airflow_breeze/utils/constraints_version_check.py
+++ b/dev/breeze/src/airflow_breeze/utils/constraints_version_check.py
@@ -103,10 +103,13 @@ def get_status_emoji(constraint_date, latest_date, 
is_latest_version):
 
     All emojis used here (✅, 📢, 🔶, 🚨) are single Python chars with ~2 visual 
cells,
     so ljust produces consistent alignment without any offset workarounds.
+
+    Returns a tuple of (formatted_status_string, status_category) where 
status_category
+    is one of "ok", "new", "warning", "critical".
     """
     col_target = 16
     if is_latest_version:
-        return "✅ OK".ljust(col_target)
+        return "✅ OK".ljust(col_target), "ok"
 
     try:
         constraint_dt = datetime.strptime(constraint_date, "%Y-%m-%d")
@@ -114,12 +117,12 @@ def get_status_emoji(constraint_date, latest_date, 
is_latest_version):
         days_diff = (latest_dt - constraint_dt).days
 
         if days_diff <= 5:
-            return "📢 <5d".ljust(col_target)
+            return "📢 <5d".ljust(col_target), "new"
         if days_diff <= 30:
-            return "🔶 <30d".ljust(col_target)
-        return f"🚨 >{days_diff}d".ljust(col_target)
+            return "🔶 <30d".ljust(col_target), "warning"
+        return f"🚨 >{days_diff}d".ljust(col_target), "critical"
     except Exception:
-        return "📢 N/A".ljust(col_target)
+        return "📢 N/A".ljust(col_target), "new"
 
 
 def get_max_package_length(packages: list[tuple[str, str]]) -> int:
@@ -223,7 +226,7 @@ def constraints_version_check(
     col_widths, format_str, headers, total_width = get_table_format(packages)
     print_table_header(format_str, headers, total_width)
 
-    outdated_count, skipped_count, explanations = process_packages(
+    outdated_count, skipped_count, explanations, status_counts = 
process_packages(
         packages=packages,
         constraints_date=constraints_date,
         mode=diff_mode,
@@ -241,6 +244,7 @@ def constraints_version_check(
         outdated_count=outdated_count,
         skipped_count=skipped_count,
         mode=diff_mode,
+        status_counts=status_counts,
     )
     if explain_why and explanations:
         print_explanations(explanations)
@@ -307,9 +311,20 @@ def print_table_header(format_str: str, headers: 
list[str], total_width: int):
     console_print(f"[magenta]{'=' * total_width}[/]")
 
 
-def print_table_footer(total_width: int, total_pkgs: int, outdated_count: int, 
skipped_count: int, mode: str):
+def print_table_footer(
+    total_width: int,
+    total_pkgs: int,
+    outdated_count: int,
+    skipped_count: int,
+    mode: str,
+    status_counts: dict[str, int],
+):
     console_print(f"[magenta]{'=' * total_width}[/]")
     console_print(f"[bold cyan]\nTotal packages checked:[/] 
[white]{total_pkgs}[/]")
+    console_print(f"  [green]✅ Up to date:[/] [white]{status_counts['ok']}[/]")
+    console_print(f"  [yellow]📢 New (<5d):[/] 
[white]{status_counts['new']}[/]")
+    console_print(f"  [yellow]🔶 Warning (<30d):[/] 
[white]{status_counts['warning']}[/]")
+    console_print(f"  [red]🚨 Critical (>30d):[/] 
[white]{status_counts['critical']}[/]")
     console_print(f"[bold yellow]Outdated packages found:[/] 
[white]{outdated_count}[/]")
     if mode == "diff-constraints":
         console_print(
@@ -356,7 +371,7 @@ def process_packages(
     python_version: str,
     airflow_constraints_mode: str,
     github_repository: str | None,
-) -> tuple[int, int, list[str]]:
+) -> tuple[int, int, list[str], dict[str, int]]:
     @contextmanager
     def preserve_pyproject_file(pyproject_path: Path):
         original_content = pyproject_path.read_text()
@@ -382,6 +397,7 @@ def process_packages(
     outdated_count = 0
     skipped_count = 0
     explanations = []
+    status_counts: dict[str, int] = {"ok": 0, "new": 0, "warning": 0, 
"critical": 0}
 
     for pkg, pinned_version in packages:
         try:
@@ -394,7 +410,7 @@ def process_packages(
             versions_behind = count_versions_between(releases, pinned_version, 
latest_version)
             versions_behind_str = str(versions_behind) if versions_behind > 0 
else ""
             if should_show_package(releases, latest_version, constraints_date, 
mode, is_latest_version):
-                print_package_table_row(
+                status_category = print_package_table_row(
                     pkg=pkg,
                     pinned_version=pinned_version,
                     constraint_release_date=constraint_release_date,
@@ -406,6 +422,7 @@ def process_packages(
                     is_latest_version=is_latest_version,
                     versions_behind_str=versions_behind_str,
                 )
+                status_counts[status_category] += 1
                 if not is_latest_version:
                     outdated_count += 1
             else:
@@ -427,7 +444,7 @@ def process_packages(
         except URLError as e:
             console_print(f"[bold red]Error fetching {pkg} from PyPI: 
{e.reason}[/]")
             continue
-    return outdated_count, skipped_count, explanations
+    return outdated_count, skipped_count, explanations, status_counts
 
 
 def print_package_table_row(
@@ -441,9 +458,9 @@ def print_package_table_row(
     format_str: str,
     is_latest_version: bool,
     versions_behind_str: str,
-):
+) -> str:
     first_newer_date_str = get_first_newer_release_date_str(releases, 
pinned_version)
-    status = get_status_emoji(
+    status, status_category = get_status_emoji(
         first_newer_date_str or constraint_release_date,
         datetime.now().strftime("%Y-%m-%d"),
         is_latest_version,
@@ -465,6 +482,7 @@ def print_package_table_row(
         pypi_link,
     )
     console_print(f"[{color}]{string_to_print}[/]")
+    return status_category
 
 
 def explain_package_upgrade(

Reply via email to