This is an automated email from the ASF dual-hosted git repository.
eladkal 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 1b428e65829 Apply correct release date in changelog for providers
(#55970)
1b428e65829 is described below
commit 1b428e6582964232f848cf05547130de41b3b45b
Author: GPK <[email protected]>
AuthorDate: Tue Sep 23 17:50:59 2025 +0100
Apply correct release date in changelog for providers (#55970)
---
.../templates/CHANGELOG_TEMPLATE.rst.jinja2 | 3 --
.../extra_provider_files_with_substitutions.py | 53 +++++++++++-----------
2 files changed, 26 insertions(+), 30 deletions(-)
diff --git
a/dev/breeze/src/airflow_breeze/templates/CHANGELOG_TEMPLATE.rst.jinja2
b/dev/breeze/src/airflow_breeze/templates/CHANGELOG_TEMPLATE.rst.jinja2
index 0f1466d67e0..a9b55b2312b 100644
--- a/dev/breeze/src/airflow_breeze/templates/CHANGELOG_TEMPLATE.rst.jinja2
+++ b/dev/breeze/src/airflow_breeze/templates/CHANGELOG_TEMPLATE.rst.jinja2
@@ -21,9 +21,6 @@
{{ version_header }}
-Release Date: ``|PypiReleaseDate|``
-
-
{%- if min_airflow_version_bump %}
.. note::
diff --git
a/devel-common/src/sphinx_exts/extra_provider_files_with_substitutions.py
b/devel-common/src/sphinx_exts/extra_provider_files_with_substitutions.py
index 6526b1e3bef..a7a6a61300d 100644
--- a/devel-common/src/sphinx_exts/extra_provider_files_with_substitutions.py
+++ b/devel-common/src/sphinx_exts/extra_provider_files_with_substitutions.py
@@ -23,37 +23,21 @@ from pathlib import Path
from packaging.version import Version
-def _get_rc_matching_version(releases: dict, version: str):
- """
- Get the latest release candidate version matching the given version.
- """
-
- matching_versions = (v for v in releases.keys() if Version(v).base_version
== version)
- latest_version = max(matching_versions, key=Version, default=None)
-
- return releases.get(latest_version, []) if latest_version else []
-
-
-def get_release_date(package_name: str, version) -> str:
- """Get the release date of the current version."""
- if package_name == "":
- return ""
+def _get_all_versions(package_name: str):
import requests
+ versions_with_dates = []
resp = requests.get(f"https://pypi.org/pypi/{package_name}/json")
+
resp_json = resp.json()
releases = resp_json.get("releases", {})
- release_info = releases.get(version, [])
-
- # If no exact version found, try to find the latest release candidate
version
- if not release_info and len(releases) > 0:
- release_info = _get_rc_matching_version(releases, version)
-
- if release_info:
- release_date =
datetime.fromisoformat(release_info[0].get("upload_time")).date()
- return str(release_date)
-
- return "Release date unknown"
+ for version, release_data in releases.items():
+ base_version = Version(version).base_version
+ if release_data:
+ upload_time = release_data[0].get("upload_time")
+ release_date = datetime.fromisoformat(upload_time).date()
+ versions_with_dates.append((base_version, str(release_date)))
+ return versions_with_dates
def _manual_substitution(line: str, replacements: dict[str, str]) -> str:
@@ -71,17 +55,32 @@ def fix_provider_references(app, exception):
substitutions = {
"|version|": app.config.version,
- "|PypiReleaseDate|":
get_release_date(os.environ.get("AIRFLOW_PACKAGE_NAME", ""),
app.config.version),
}
+ versions_dates = _get_all_versions(os.environ.get("AIRFLOW_PACKAGE_NAME",
""))
# Replace `|version|` in the files that require manual substitution
for path in Path(app.outdir).rglob("*.html"):
+ is_changelog = str(path).endswith("changelog.html")
+
if path.exists():
lines = path.read_text().splitlines(True)
with path.open("w") as output_file:
for line in lines:
+ # Check if |PypiReleaseDate| format is in the line and
skip it, old changelog has this template format
+ if "|PypiReleaseDate|" in line:
+ continue
+
output_file.write(_manual_substitution(line,
substitutions))
+ if is_changelog:
+ for version_date in versions_dates:
+ if line.startswith(f"<h2>{version_date[0]}<a"):
+ output_file.write(
+ f"""<p>Release Date: <code class="docutils
literal notranslate"><span class="pre">{version_date[1]}</span></code></p>"""
+ )
+ versions_dates.remove(version_date)
+ break
+
def setup(app):
"""Setup plugin"""