This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v3-2-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/v3-2-test by this push:
new 336bda7e17e [v3-2-test] Shift constraints-version-check staleness
coloring by --cooldown-days (#65233) (#65252)
336bda7e17e is described below
commit 336bda7e17e48081f05f708b1e014665fda44d9b
Author: Jarek Potiuk <[email protected]>
AuthorDate: Tue Apr 14 21:18:23 2026 +0200
[v3-2-test] Shift constraints-version-check staleness coloring by
--cooldown-days (#65233) (#65252)
Package time spent inside the cooldown window no longer counts against
staleness, so a release that just cleared the cooldown is still reported
as "new" instead of flipping to "warning" immediately. The shifted
thresholds are reflected in the row status labels and footer summary.
(cherry picked from commit 0e0aaedc4d46b12a87334183c0731fd3ca361e8b)
---
.../utils/constraints_version_check.py | 30 ++++++++++++++++------
1 file changed, 22 insertions(+), 8 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 aea56854f85..676e6b26d6e 100755
--- a/dev/breeze/src/airflow_breeze/utils/constraints_version_check.py
+++ b/dev/breeze/src/airflow_breeze/utils/constraints_version_check.py
@@ -98,9 +98,14 @@ def count_versions_between(releases: dict[str, Any],
current_version: str, lates
return len(versions_between)
-def get_status_emoji(constraint_date, latest_date, is_latest_version):
+def get_status_emoji(constraint_date, latest_date, is_latest_version,
cooldown_days: int = 0):
"""Determine status emoji based on how outdated the package is.
+ The ``cooldown_days`` value shifts the thresholds so that time a package
+ spent in the cooldown window is not counted against its staleness — a
+ package that was released just after the cooldown period should still be
+ reported as "new" rather than immediately as "warning".
+
All emojis used here (✅, 📢, 🔶, 🚨) are single Python chars with ~2 visual
cells,
so ljust produces consistent alignment without any offset workarounds.
@@ -111,15 +116,17 @@ def get_status_emoji(constraint_date, latest_date,
is_latest_version):
if is_latest_version:
return "✅ OK".ljust(col_target), "ok"
+ new_threshold = 5 + cooldown_days
+ warning_threshold = 30 + cooldown_days
try:
constraint_dt = datetime.strptime(constraint_date, "%Y-%m-%d")
latest_dt = datetime.strptime(latest_date, "%Y-%m-%d")
days_diff = (latest_dt - constraint_dt).days
- if days_diff <= 5:
- return "📢 <5d".ljust(col_target), "new"
- if days_diff <= 30:
- return "🔶 <30d".ljust(col_target), "warning"
+ if days_diff <= new_threshold:
+ return f"📢 <{new_threshold}d".ljust(col_target), "new"
+ if days_diff <= warning_threshold:
+ return f"🔶 <{warning_threshold}d".ljust(col_target), "warning"
return f"🚨 >{days_diff}d".ljust(col_target), "critical"
except Exception:
return "📢 N/A".ljust(col_target), "new"
@@ -257,6 +264,7 @@ def constraints_version_check(
skipped_count=skipped_count,
mode=diff_mode,
status_counts=status_counts,
+ cooldown_days=cooldown_days,
)
if explain_why and explanations:
print_explanations(explanations)
@@ -333,13 +341,16 @@ def print_table_footer(
skipped_count: int,
mode: str,
status_counts: dict[str, int],
+ cooldown_days: int = 0,
):
+ new_threshold = 5 + cooldown_days
+ warning_threshold = 30 + cooldown_days
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" [magenta]🔶 Warning (<30d):[/]
[white]{status_counts['warning']}[/]")
- console_print(f" [red]🚨 Critical (>30d):[/]
[white]{status_counts['critical']}[/]")
+ console_print(f" [yellow]📢 New (<{new_threshold}d):[/]
[white]{status_counts['new']}[/]")
+ console_print(f" [magenta]🔶 Warning (<{warning_threshold}d):[/]
[white]{status_counts['warning']}[/]")
+ console_print(f" [red]🚨 Critical (>{warning_threshold}d):[/]
[white]{status_counts['critical']}[/]")
console_print(f"[bold yellow]Outdated packages found:[/]
[white]{outdated_count}[/]")
if mode == "diff-constraints":
console_print(
@@ -436,6 +447,7 @@ def process_packages(
format_str=format_str,
is_latest_version=is_latest_version,
versions_behind_str=versions_behind_str,
+ cooldown_days=cooldown_days,
)
status_counts[status_category] += 1
if not is_latest_version:
@@ -473,12 +485,14 @@ def print_package_table_row(
format_str: str,
is_latest_version: bool,
versions_behind_str: str,
+ cooldown_days: int = 0,
) -> str:
first_newer_date_str = get_first_newer_release_date_str(releases,
pinned_version)
status, status_category = get_status_emoji(
first_newer_date_str or constraint_release_date,
datetime.now().strftime("%Y-%m-%d"),
is_latest_version,
+ cooldown_days=cooldown_days,
)
days_stale_str = get_days_stale(latest_release_date)
pypi_link = f"https://pypi.org/project/{pkg}/{latest_version}"