From 87837badd2de342bcc6e046285d9b434274552e7 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 12 Mar 2025 14:54:53 -0400 Subject: [PATCH 01/11] Python version status: show when bugfix releases become security releases --- _tools/generate_release_cycle.py | 3 +- _tools/release_cycle_template.svg.jinja | 100 +++++++++++++++++++----- 2 files changed, 83 insertions(+), 20 deletions(-) diff --git a/_tools/generate_release_cycle.py b/_tools/generate_release_cycle.py index 3a8fefec02..38b365cfd7 100644 --- a/_tools/generate_release_cycle.py +++ b/_tools/generate_release_cycle.py @@ -35,7 +35,8 @@ def __init__(self) -> None: # Generate a few additional fields for key, version in self.versions.items(): version["key"] = key - version["first_release_date"] = parse_date(version["first_release"]) + version["first_release_date"] = r1 = parse_date(version["first_release"]) + version["start_security_date"] = r1 + dt.timedelta(days=2 * 365) version["end_of_life_date"] = parse_date(version["end_of_life"]) self.sorted_versions = sorted( self.versions.values(), diff --git a/_tools/release_cycle_template.svg.jinja b/_tools/release_cycle_template.svg.jinja index 5d39d307a5..6c3b6129d6 100644 --- a/_tools/release_cycle_template.svg.jinja +++ b/_tools/release_cycle_template.svg.jinja @@ -58,25 +58,87 @@ {% set start_x = date_to_x(version.first_release_date) %} {% set end_x = date_to_x(version.end_of_life_date) %} - {% set mid_x = (start_x + end_x) / 2 %} - - - {{ version.status }} - + + {% if version.status == "bugfix" %} + + {% set half_x = date_to_x(version.start_security_date) %} + {% set height = 1.25 * SCALE %} + {% set left_width = (half_x - start_x) * SCALE %} + {% set right_width = (end_x - half_x) * SCALE %} + {% set left_x = start_x * SCALE %} + {% set middle_x = half_x * SCALE %} + {% set right_x = half_x * SCALE %} + {% set recty = (y - 1) * SCALE %} + {% set radius_value = 0.25 * SCALE %} + + + + bugfix + + + + + security + + {% else %} + + + + {{ version.status }} + + {% endif %} {% endfor %} From 0f24453a46dae05e4a86b675dd93c46c3b31e83d Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Thu, 13 Mar 2025 11:08:43 +0100 Subject: [PATCH 02/11] Make them look all the same --- _static/devguide_overrides.css | 58 +++++--- _tools/release_cycle_template.svg.jinja | 170 ++++++++++++++---------- 2 files changed, 140 insertions(+), 88 deletions(-) diff --git a/_static/devguide_overrides.css b/_static/devguide_overrides.css index 8e2c7c6fca..a92243205d 100644 --- a/_static/devguide_overrides.css +++ b/_static/devguide_overrides.css @@ -45,38 +45,60 @@ .release-cycle-chart .release-cycle-blob-label { /* white looks good on both light & dark */ - fill: white; + fill: var(--color-foreground-primary); } -.release-cycle-chart .release-cycle-blob-label.release-cycle-blob-security, -.release-cycle-chart .release-cycle-blob-label.release-cycle-blob-bugfix { +.release-cycle-chart .release-cycle-blob-label.release-cycle-status-security, +.release-cycle-chart .release-cycle-blob-label.release-cycle-status-bugfix { /* but use black to improve contrast for lighter backgrounds */ fill: black; } -.release-cycle-chart .release-cycle-blob.release-cycle-blob-end-of-life { - fill: #DD2200; - stroke: #FF8888; +.release-cycle-chart .release-cycle-status-end-of-life { + --status-bg-color: #DD2200; + --status-border-color: #FF8888; +} + +.release-cycle-chart .release-cycle-status-security { + --status-bg-color: #FFDD44; + --status-border-color: #FF8800; } -.release-cycle-chart .release-cycle-blob.release-cycle-blob-security { - fill: #FFDD44; - stroke: #FF8800; +.release-cycle-chart .release-cycle-status-bugfix { + --status-bg-color: #00DD22; + --status-border-color: #008844; } -.release-cycle-chart .release-cycle-blob.release-cycle-blob-bugfix { - fill: #00DD22; - stroke: #008844; +.release-cycle-chart .release-cycle-status-prerelease { + --status-bg-color: teal; + --status-border-color: darkgreen; } -.release-cycle-chart .release-cycle-blob.release-cycle-blob-prerelease { - fill: teal; - stroke: darkgreen; +.release-cycle-chart .release-cycle-status-feature { + --status-bg-color: #2222EE; + --status-border-color: #008888; +} + +.release-cycle-chart .release-cycle-blob { + fill: var(--status-bg-color); + stroke: transparent; } -.release-cycle-chart .release-cycle-blob.release-cycle-blob-feature { - fill: #2222EE; - stroke: #008888; +.release-cycle-chart .release-cycle-border { + fill: transparent; + stroke: var(--status-border-color); + stroke-width: 1.6px; +} + +.release-cycle-chart .release-cycle-shade { + fill: transparent; + stroke: transparent; + opacity: 50%; + + &.release-cycle-status-end-of-life, + &.release-cycle-status-feature { + fill: var(--color-background-primary); + } } .good pre { diff --git a/_tools/release_cycle_template.svg.jinja b/_tools/release_cycle_template.svg.jinja index 6c3b6129d6..6e6325c906 100644 --- a/_tools/release_cycle_template.svg.jinja +++ b/_tools/release_cycle_template.svg.jinja @@ -59,86 +59,116 @@ {% set start_x = date_to_x(version.first_release_date) %} {% set end_x = date_to_x(version.end_of_life_date) %} - {% if version.status == "bugfix" %} - - {% set half_x = date_to_x(version.start_security_date) %} - {% set height = 1.25 * SCALE %} - {% set left_width = (half_x - start_x) * SCALE %} - {% set right_width = (end_x - half_x) * SCALE %} - {% set left_x = start_x * SCALE %} - {% set middle_x = half_x * SCALE %} - {% set right_x = half_x * SCALE %} - {% set recty = (y - 1) * SCALE %} - {% set radius_value = 0.25 * SCALE %} + + {% set half_x = [end_x, date_to_x(version.start_security_date)]|min %} + {% set height = 1.25 * SCALE %} + {% set left_width = (half_x - start_x) * SCALE %} + {% set right_width = (end_x - half_x) * SCALE %} + {% set left_x = start_x * SCALE %} + {% set middle_x = half_x * SCALE %} + {% set right_x = half_x * SCALE %} + {% set recty = (y - 1) * SCALE %} + {% set radius_value = 0.25 * SCALE %} - - - bugfix - + - - - security - - {% else %} - - - - {{ version.status }} - + " + /> {% endif %} + + {% if version.status == "bugfix" %} + + bugfix + + {% elif version.status == "security" %} + + security + + {% elif version.status == "end-of-life" %} + + end-of-life + + {% elif version.status == "feature" %} + + feature + + {% endif %} + + {% endfor %} From 2926a88441da6b14f8c32313dd870e639e725952 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Thu, 13 Mar 2025 11:24:51 +0100 Subject: [PATCH 03/11] Show EOL ones as red --- _static/devguide_overrides.css | 14 ++- _tools/release_cycle_template.svg.jinja | 144 ++++++++++++------------ 2 files changed, 81 insertions(+), 77 deletions(-) diff --git a/_static/devguide_overrides.css b/_static/devguide_overrides.css index a92243205d..ac8f9489a5 100644 --- a/_static/devguide_overrides.css +++ b/_static/devguide_overrides.css @@ -45,7 +45,7 @@ .release-cycle-chart .release-cycle-blob-label { /* white looks good on both light & dark */ - fill: var(--color-foreground-primary); + fill: white; } .release-cycle-chart .release-cycle-blob-label.release-cycle-status-security, @@ -54,6 +54,11 @@ fill: black; } +.release-cycle-chart .release-cycle-blob-label.release-cycle-status-feature { + /* and FG when it's not in a pill */ + fill: var(--color-foreground-primary); +} + .release-cycle-chart .release-cycle-status-end-of-life { --status-bg-color: #DD2200; --status-border-color: #FF8888; @@ -93,11 +98,14 @@ .release-cycle-chart .release-cycle-shade { fill: transparent; stroke: transparent; - opacity: 50%; - &.release-cycle-status-end-of-life, + &.release-cycle-status-end-of-life { + fill: #DD2200; + stroke: #FF8888; + } &.release-cycle-status-feature { fill: var(--color-background-primary); + opacity: 50%; } } diff --git a/_tools/release_cycle_template.svg.jinja b/_tools/release_cycle_template.svg.jinja index 6e6325c906..030de987fd 100644 --- a/_tools/release_cycle_template.svg.jinja +++ b/_tools/release_cycle_template.svg.jinja @@ -73,83 +73,33 @@ {% set recty = (y - 1) * SCALE %} {% set radius_value = 0.25 * SCALE %} - - - {% if version.key != "3.0" %} - + - {% endif %} - - {% if version.status == "bugfix" %} - - bugfix - - {% elif version.status == "security" %} - - security - - {% elif version.status == "end-of-life" %} - - end-of-life - - {% elif version.status == "feature" %} - - feature - + " + /> + {% endif %} + {% if version.status == "bugfix" %} + + bugfix + + {% elif version.status == "security" %} + + security + + {% elif version.status == "end-of-life" %} + + end-of-life + + {% elif version.status == "feature" %} + + feature + + {% endif %} {% endfor %} From dc4f2792b0813df3af3949ff3506f5f5be380a2e Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Thu, 13 Mar 2025 11:43:59 +0100 Subject: [PATCH 04/11] Two graphs --- .gitignore | 1 + Makefile | 1 + _tools/generate_release_cycle.py | 27 +++++++++++++++++++++++---- make.ps1 | 3 ++- versions.rst | 16 ++++++++++++---- 5 files changed, 39 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index df4dc9415a..b712492014 100644 --- a/.gitignore +++ b/.gitignore @@ -91,3 +91,4 @@ celerybeat-schedule include/branches.csv include/end-of-life.csv include/release-cycle.svg +include/release-cycle-all.svg diff --git a/Makefile b/Makefile index 5a33d50897..6baf33b325 100644 --- a/Makefile +++ b/Makefile @@ -22,6 +22,7 @@ REQUIREMENTS = requirements.txt _ALL_SPHINX_OPTS = --jobs $(JOBS) $(SPHINXOPTS) _RELEASE_CYCLE = include/branches.csv \ include/end-of-life.csv \ + include/release-cycle-all.svg \ include/release-cycle.svg .PHONY: help diff --git a/_tools/generate_release_cycle.py b/_tools/generate_release_cycle.py index 38b365cfd7..e92ccdf384 100644 --- a/_tools/generate_release_cycle.py +++ b/_tools/generate_release_cycle.py @@ -28,7 +28,7 @@ def parse_date(date_str: str) -> dt.date: class Versions: """For converting JSON to CSV and SVG.""" - def __init__(self) -> None: + def __init__(self, limit_to_active=False) -> None: with open("include/release-cycle.json", encoding="UTF-8") as in_file: self.versions = json.load(in_file) @@ -38,6 +38,20 @@ def __init__(self) -> None: version["first_release_date"] = r1 = parse_date(version["first_release"]) version["start_security_date"] = r1 + dt.timedelta(days=2 * 365) version["end_of_life_date"] = parse_date(version["end_of_life"]) + + if limit_to_active: + cutoff = min( + version["first_release_date"] + for version in self.versions.values() + if version["status"] != 'end-of-life' + ) + self.versions = { + key: version + for key, version in self.versions.items() + if version["end_of_life_date"] >= cutoff + } + + self.sorted_versions = sorted( self.versions.values(), key=lambda v: [int(i) for i in v["key"].split(".")], @@ -69,7 +83,7 @@ def write_csv(self) -> None: csv_file.writeheader() csv_file.writerows(versions.values()) - def write_svg(self, today: str) -> None: + def write_svg(self, today: str, out_path: str) -> None: """Output SVG file.""" env = jinja2.Environment( loader=jinja2.FileSystemLoader("_tools/"), @@ -117,7 +131,7 @@ def format_year(year: int) -> str: return f"'{year % 100:02}" with open( - "include/release-cycle.svg", "w", encoding="UTF-8", newline="\n" + out_path, "w", encoding="UTF-8", newline="\n" ) as f: template.stream( SCALE=SCALE, @@ -146,8 +160,13 @@ def main() -> None: args = parser.parse_args() versions = Versions() + print(versions.versions.keys()) + assert len(versions.versions) > 10 versions.write_csv() - versions.write_svg(args.today) + versions.write_svg(args.today, "include/release-cycle-all.svg") + + versions = Versions(limit_to_active=True) + versions.write_svg(args.today, "include/release-cycle.svg") if __name__ == "__main__": diff --git a/make.ps1 b/make.ps1 index 71a8f56f4c..4cdc6b20cf 100644 --- a/make.ps1 +++ b/make.ps1 @@ -64,7 +64,8 @@ if ($target -Eq "clean") { $ToClean = @( $BUILDDIR, $_VENV_DIR, - "include/branches.csv", "include/end-of-life.csv", "include/release-cycle.svg" + "include/branches.csv", "include/end-of-life.csv", + "include/release-cycle.svg", "include/release-cycle-all.svg" ) foreach ($item in $ToClean) { if (Test-Path -Path $item) { diff --git a/versions.rst b/versions.rst index db7f946829..d6aac12b3d 100644 --- a/versions.rst +++ b/versions.rst @@ -10,13 +10,12 @@ branch that accepts new features. The latest release for each Python version can be found on the `download page `_. -Python release cycle -==================== - .. raw:: html :file: include/release-cycle.svg -Another useful visualization is `endoflife.date/python `_. +(See :ref:`below ` for a chart with older versions. +Another useful visualization is `endoflife.date/python `_.) + Supported versions ================== @@ -40,6 +39,15 @@ Unsupported versions :file: include/end-of-life.csv +.. _versions-chart-all: + +Full chart +========== + +.. raw:: html + :file: include/release-cycle-all.svg + + Status key ========== From 8850c25e50d80a454a4475a714349754373c14a4 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Thu, 13 Mar 2025 11:48:49 +0100 Subject: [PATCH 05/11] Remove unacceptable newline --- _tools/generate_release_cycle.py | 1 - 1 file changed, 1 deletion(-) diff --git a/_tools/generate_release_cycle.py b/_tools/generate_release_cycle.py index e92ccdf384..7e0e330057 100644 --- a/_tools/generate_release_cycle.py +++ b/_tools/generate_release_cycle.py @@ -51,7 +51,6 @@ def __init__(self, limit_to_active=False) -> None: if version["end_of_life_date"] >= cutoff } - self.sorted_versions = sorted( self.versions.values(), key=lambda v: [int(i) for i in v["key"].split(".")], From 223f1782031d8af8f0e8b5607ca07a2e8a66eb87 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Thu, 13 Mar 2025 11:52:34 +0100 Subject: [PATCH 06/11] Join an unacceptably split line --- _tools/generate_release_cycle.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/_tools/generate_release_cycle.py b/_tools/generate_release_cycle.py index 7e0e330057..ecc1c300de 100644 --- a/_tools/generate_release_cycle.py +++ b/_tools/generate_release_cycle.py @@ -129,9 +129,7 @@ def format_year(year: int) -> str: """Format year number for display""" return f"'{year % 100:02}" - with open( - out_path, "w", encoding="UTF-8", newline="\n" - ) as f: + with open(out_path, "w", encoding="UTF-8", newline="\n") as f: template.stream( SCALE=SCALE, diagram_width=DIAGRAM_WIDTH, From 5813c1cd071419bbc75aba2f962cafb1c0e9942d Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Thu, 13 Mar 2025 13:16:44 +0100 Subject: [PATCH 07/11] Hide the starts of EOL versions --- _static/devguide_overrides.css | 3 +- _tools/generate_release_cycle.py | 15 ++++++-- _tools/release_cycle_template.svg.jinja | 48 +++++++++++++++++++------ 3 files changed, 52 insertions(+), 14 deletions(-) diff --git a/_static/devguide_overrides.css b/_static/devguide_overrides.css index ac8f9489a5..a048e1c360 100644 --- a/_static/devguide_overrides.css +++ b/_static/devguide_overrides.css @@ -54,8 +54,9 @@ fill: black; } +.release-cycle-chart .release-cycle-blob-label.release-cycle-status-end-of-life, .release-cycle-chart .release-cycle-blob-label.release-cycle-status-feature { - /* and FG when it's not in a pill */ + /* and FG when it's not in a blob */ fill: var(--color-foreground-primary); } diff --git a/_tools/generate_release_cycle.py b/_tools/generate_release_cycle.py index ecc1c300de..f1a16407e8 100644 --- a/_tools/generate_release_cycle.py +++ b/_tools/generate_release_cycle.py @@ -39,8 +39,10 @@ def __init__(self, limit_to_active=False) -> None: version["start_security_date"] = r1 + dt.timedelta(days=2 * 365) version["end_of_life_date"] = parse_date(version["end_of_life"]) + self.cutoff = min(ver["first_release_date"] for ver in self.versions.values()) + if limit_to_active: - cutoff = min( + self.cutoff = min( version["first_release_date"] for version in self.versions.values() if version["status"] != 'end-of-life' @@ -48,8 +50,11 @@ def __init__(self, limit_to_active=False) -> None: self.versions = { key: version for key, version in self.versions.items() - if version["end_of_life_date"] >= cutoff + if version["end_of_life_date"] >= self.cutoff } + self.id_key='active' + else: + self.id_key='all' self.sorted_versions = sorted( self.versions.values(), @@ -57,6 +62,7 @@ def __init__(self, limit_to_active=False) -> None: reverse=True, ) + def write_csv(self) -> None: """Output CSV files.""" now_str = str(dt.datetime.now(dt.timezone.utc)) @@ -110,7 +116,7 @@ def write_svg(self, today: str, out_path: str) -> None: # some positioning numbers in the template as well. LINE_HEIGHT = 1.5 - first_date = min(ver["first_release_date"] for ver in self.sorted_versions) + first_date = self.cutoff last_date = max(ver["end_of_life_date"] for ver in self.sorted_versions) def date_to_x(date: dt.date) -> float: @@ -136,11 +142,14 @@ def format_year(year: int) -> str: diagram_height=(len(self.sorted_versions) + 2) * LINE_HEIGHT, years=range(first_date.year, last_date.year + 1), LINE_HEIGHT=LINE_HEIGHT, + LEGEND_WIDTH=LEGEND_WIDTH, + RIGHT_MARGIN=RIGHT_MARGIN, versions=list(reversed(self.sorted_versions)), today=dt.datetime.strptime(today, "%Y-%m-%d").date(), year_to_x=year_to_x, date_to_x=date_to_x, format_year=format_year, + id_key=self.id_key, ).dump(f) diff --git a/_tools/release_cycle_template.svg.jinja b/_tools/release_cycle_template.svg.jinja index 030de987fd..f7b38ea67f 100644 --- a/_tools/release_cycle_template.svg.jinja +++ b/_tools/release_cycle_template.svg.jinja @@ -4,6 +4,12 @@ class="release-cycle-chart" viewBox="0 0 {{ diagram_width * SCALE }} {{ diagram_height * SCALE }}" > + + + + + + {% for version in versions %} {% set y = loop.index * LINE_HEIGHT %} @@ -42,6 +48,31 @@ {% endif %} {% endfor %} + + + + + + + {% for version in versions %} {% set y = loop.index * LINE_HEIGHT %} @@ -74,7 +105,7 @@ {% set radius_value = 0.25 * SCALE %} {% if version.status != "end-of-life" %} - + {% if version.status == "bugfix" %} end-of-life - {% elif version.status == "feature" %} + {% else %} - feature + {{ version.status }} {% endif %} {% endfor %} From 2cc3a3517645bd1b54b0332d8ca6e78eec0eaa19 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Thu, 13 Mar 2025 14:26:01 +0100 Subject: [PATCH 08/11] Special-case 2.7 --- _tools/generate_release_cycle.py | 18 +++++++++++++++--- _tools/release_cycle_template.svg.jinja | 6 +++--- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/_tools/generate_release_cycle.py b/_tools/generate_release_cycle.py index f1a16407e8..87b4f39a02 100644 --- a/_tools/generate_release_cycle.py +++ b/_tools/generate_release_cycle.py @@ -28,7 +28,7 @@ def parse_date(date_str: str) -> dt.date: class Versions: """For converting JSON to CSV and SVG.""" - def __init__(self, limit_to_active=False) -> None: + def __init__(self, limit_to_active=False, special_py27=False) -> None: with open("include/release-cycle.json", encoding="UTF-8") as in_file: self.versions = json.load(in_file) @@ -47,10 +47,13 @@ def __init__(self, limit_to_active=False) -> None: for version in self.versions.values() if version["status"] != 'end-of-life' ) + if special_py27: + self.cutoff = min(self.cutoff, dt.date(2019, 8, 1)) self.versions = { key: version for key, version in self.versions.items() if version["end_of_life_date"] >= self.cutoff + or (special_py27 and key == '2.7') } self.id_key='active' else: @@ -62,6 +65,15 @@ def __init__(self, limit_to_active=False) -> None: reverse=True, ) + # Set the row (y-coordinate) for the chart, to allow a gap between 2.7 + # and the rest + y = len(self.sorted_versions) + (1 if special_py27 else 0) + for version in self.sorted_versions: + if special_py27 and version["key"] == '2.7': + y -= 1 + version["y"] = y + y -= 1 + def write_csv(self) -> None: """Output CSV files.""" @@ -139,7 +151,7 @@ def format_year(year: int) -> str: template.stream( SCALE=SCALE, diagram_width=DIAGRAM_WIDTH, - diagram_height=(len(self.sorted_versions) + 2) * LINE_HEIGHT, + diagram_height=(self.sorted_versions[0]["y"] + 2) * LINE_HEIGHT, years=range(first_date.year, last_date.year + 1), LINE_HEIGHT=LINE_HEIGHT, LEGEND_WIDTH=LEGEND_WIDTH, @@ -171,7 +183,7 @@ def main() -> None: versions.write_csv() versions.write_svg(args.today, "include/release-cycle-all.svg") - versions = Versions(limit_to_active=True) + versions = Versions(limit_to_active=True, special_py27=True) versions.write_svg(args.today, "include/release-cycle.svg") diff --git a/_tools/release_cycle_template.svg.jinja b/_tools/release_cycle_template.svg.jinja index f7b38ea67f..5fa1f825e3 100644 --- a/_tools/release_cycle_template.svg.jinja +++ b/_tools/release_cycle_template.svg.jinja @@ -12,9 +12,9 @@ {% for version in versions %} - {% set y = loop.index * LINE_HEIGHT %} + {% set y = version.y * LINE_HEIGHT %} - {% if loop.index % 2 %} + {% if version.y % 2 %} {% for version in versions %} - {% set y = loop.index * LINE_HEIGHT %} + {% set y = version.y * LINE_HEIGHT %} Date: Thu, 13 Mar 2025 14:27:20 +0100 Subject: [PATCH 09/11] Remove 3.5 --- _tools/generate_release_cycle.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_tools/generate_release_cycle.py b/_tools/generate_release_cycle.py index 87b4f39a02..4457dacf99 100644 --- a/_tools/generate_release_cycle.py +++ b/_tools/generate_release_cycle.py @@ -47,14 +47,14 @@ def __init__(self, limit_to_active=False, special_py27=False) -> None: for version in self.versions.values() if version["status"] != 'end-of-life' ) - if special_py27: - self.cutoff = min(self.cutoff, dt.date(2019, 8, 1)) self.versions = { key: version for key, version in self.versions.items() if version["end_of_life_date"] >= self.cutoff or (special_py27 and key == '2.7') } + if special_py27: + self.cutoff = min(self.cutoff, dt.date(2019, 8, 1)) self.id_key='active' else: self.id_key='all' From d2e56e6720d555ff90c2f14e4b42a517991f8033 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Thu, 13 Mar 2025 14:28:33 +0100 Subject: [PATCH 10/11] Format --- _tools/generate_release_cycle.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/_tools/generate_release_cycle.py b/_tools/generate_release_cycle.py index 4457dacf99..0c401ebbef 100644 --- a/_tools/generate_release_cycle.py +++ b/_tools/generate_release_cycle.py @@ -55,9 +55,9 @@ def __init__(self, limit_to_active=False, special_py27=False) -> None: } if special_py27: self.cutoff = min(self.cutoff, dt.date(2019, 8, 1)) - self.id_key='active' + self.id_key = 'active' else: - self.id_key='all' + self.id_key = 'all' self.sorted_versions = sorted( self.versions.values(), @@ -74,7 +74,6 @@ def __init__(self, limit_to_active=False, special_py27=False) -> None: version["y"] = y y -= 1 - def write_csv(self) -> None: """Output CSV files.""" now_str = str(dt.datetime.now(dt.timezone.utc)) From 3a4fe83b4ce48dee9135531c5cd73754f1e1842d Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Thu, 13 Mar 2025 15:22:27 +0100 Subject: [PATCH 11/11] Put labels on top, if the mask doesn't work --- _tools/release_cycle_template.svg.jinja | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/_tools/release_cycle_template.svg.jinja b/_tools/release_cycle_template.svg.jinja index 5fa1f825e3..b39d425f8e 100644 --- a/_tools/release_cycle_template.svg.jinja +++ b/_tools/release_cycle_template.svg.jinja @@ -76,16 +76,6 @@ {% for version in versions %} {% set y = version.y * LINE_HEIGHT %} - - - Python {{ version.key }} - - {% set start_x = date_to_x(version.first_release_date) %} {% set end_x = date_to_x(version.end_of_life_date) %} @@ -193,6 +183,16 @@ {{ version.status }} {% endif %} + + + + Python {{ version.key }} + {% endfor %}