From a8786b765ffd273433eee5543fcb5403275ab592 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sun, 20 Nov 2022 22:48:26 +0200 Subject: [PATCH 01/20] Generate release cycle chart and CSV --- Makefile | 17 ++++- _static/devguide_overrides.css | 65 ++++++++++++++++ conf.py | 1 + generate-release-cycle.py | 131 +++++++++++++++++++++++++++++++++ include/branches.csv | 14 ++-- include/end-of-life.csv | 20 ++--- include/release-cycle.json | 122 ++++++++++++++++++++++++++++++ include/release-cycle.mmd | 49 ++++++++++++ requirements.txt | 3 +- versions.rst | 6 ++ 10 files changed, 409 insertions(+), 19 deletions(-) create mode 100644 generate-release-cycle.py create mode 100644 include/release-cycle.json create mode 100644 include/release-cycle.mmd diff --git a/Makefile b/Makefile index b64aecc45..7458b568d 100644 --- a/Makefile +++ b/Makefile @@ -38,6 +38,7 @@ help: @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" @echo " check to run a check for frequent markup errors" + @echo " versions to update release cycle after changing release-cycle.json" .PHONY: clean clean: clean-venv @@ -66,7 +67,7 @@ ensure-venv: fi .PHONY: html -html: ensure-venv +html: ensure-venv versions $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." @@ -186,3 +187,17 @@ check: ensure-venv serve: @echo "The 'serve' target was removed, use 'htmlview' instead" \ "(see https://github.com/python/cpython/issues/80510)" + +# TODO make.bat +include/branches.csv: include/release-cycle.json + $(PYTHON) generate-release-cycle.py + +include/end-of-life.csv: include/release-cycle.json + $(PYTHON) generate-release-cycle.py + +include/release-cycle.mmd: include/release-cycle.json + $(PYTHON) generate-release-cycle.py + +.PHONY: versions +versions: include/branches.csv include/end-of-life.csv include/release-cycle.mmd + @echo Release cycle data generated. diff --git a/_static/devguide_overrides.css b/_static/devguide_overrides.css index 8cafebebf..c34f47133 100644 --- a/_static/devguide_overrides.css +++ b/_static/devguide_overrides.css @@ -5,3 +5,68 @@ width: 111px; height: 110px; } + +/* Release cycle chart */ +#python-release-cycle .mermaid .active0, +#python-release-cycle .mermaid .active1, +#python-release-cycle .mermaid .active2, +#python-release-cycle .mermaid .active3 { + fill: #00dd00; + stroke: darkgreen; +} + +#python-release-cycle .mermaid .done0, +#python-release-cycle .mermaid .done1, +#python-release-cycle .mermaid .done2, +#python-release-cycle .mermaid .done3 { + fill: orange; + stroke: darkorange; +} + +#python-release-cycle .mermaid .task0, +#python-release-cycle .mermaid .task1, +#python-release-cycle .mermaid .task2, +#python-release-cycle .mermaid .task3 { + fill: #007acc; + stroke: #004455; +} + +#python-release-cycle .mermaid .section0, +#python-release-cycle .mermaid .section2 { + fill: darkgrey; +} + +/* Set master colours */ +:root { + --mermaid-section1-3: white; + --mermaid-text-color: black; +} + +@media (prefers-color-scheme: dark) { + body[data-theme=auto] { + --mermaid-section1-3: black; + --mermaid-text-color: #ffffffcc; + } +} +body[data-theme=dark] { + --mermaid-section1-3: black; + --mermaid-text-color: #ffffffcc; +} + +#python-release-cycle .mermaid .section1, +#python-release-cycle .mermaid .section3 { + fill: var(--mermaid-section1-3); +} + +#python-release-cycle .mermaid .grid .tick text, +#python-release-cycle .mermaid .sectionTitle0, +#python-release-cycle .mermaid .sectionTitle1, +#python-release-cycle .mermaid .sectionTitle2, +#python-release-cycle .mermaid .sectionTitle3, +#python-release-cycle .mermaid .taskTextOutside0, +#python-release-cycle .mermaid .taskTextOutside1, +#python-release-cycle .mermaid .taskTextOutside2, +#python-release-cycle .mermaid .taskTextOutside3, +#python-release-cycle .mermaid .titleText { + fill: var(--mermaid-text-color); +} diff --git a/conf.py b/conf.py index c914ccc1e..aa6e7edd8 100644 --- a/conf.py +++ b/conf.py @@ -10,6 +10,7 @@ 'sphinx.ext.intersphinx', 'sphinx.ext.todo', 'sphinx_copybutton', + 'sphinxcontrib.mermaid', 'sphinxext.rediraffe', ] diff --git a/generate-release-cycle.py b/generate-release-cycle.py new file mode 100644 index 000000000..16dd23b8d --- /dev/null +++ b/generate-release-cycle.py @@ -0,0 +1,131 @@ +""" +Read in a JSON and generate two CSVs and a Mermaid file +""" +from __future__ import annotations + +import csv +import datetime as dt +import json + +MERMAID_HEADER = """ +gantt + dateFormat YYYY-MM-DD + title Python release cycle + axisFormat %Y +""".lstrip() + +MERMAID_SECTION = """ + section Python {cycle} + {release_status} :{mermaid_status} python{cycle}, {release_date},{eol} +""" # noqa: E501 + +MERMAID_STATUS_MAPPING = { + "features": "", + "bugfix": "active,", + "security": "done,", + "end-of-life": "crit,", +} + +CSV_HEADER = ( + "Branch", + "Schedule", + "Status", + "First release", + "End-of-life", + "Release manager", +) + + +def cycle(branch: str) -> str: + """Convert branch name to version number""" + return "3.12" if branch == "main" else branch + + +def pep(number: int) -> str: + """Format PEP number with Sphinx role""" + return f":pep:`{number}`" + + +def csv_date(date_str: str, now_str: str) -> str: + """Format a date for CSV""" + if date_str > now_str: + # Future, add italics + return f"*{date_str}*" + return date_str + + +def mermaid_date(date_str: str) -> str: + """Format a date for Mermaid""" + if len(date_str) == len("yyyy-mm"): + # Mermaid needs a full yyyy-mm-dd, so let's approximate + date_str = f"{date_str}-01" + return date_str + + +class Versions: + """For converting JSON to CSV and Mermaid""" + + def __init__(self) -> None: + with open("include/release-cycle.json") as f: + self.versions = json.load(f) + + def save_csv(self) -> None: + """Output CSV files""" + now_str = str(dt.datetime.utcnow()) + + with ( + open("include/branches.csv", "w", newline="") as file_branches, + open("include/end-of-life.csv", "w", newline="") as file_eol, + ): + csv_branches = csv.writer(file_branches, quoting=csv.QUOTE_MINIMAL) + csv_eol = csv.writer(file_eol, quoting=csv.QUOTE_MINIMAL) + + csv_branches.writerow(CSV_HEADER) + csv_eol.writerow(CSV_HEADER) + + sorted_versions = sorted( + self.versions, + key=lambda d: int(cycle(d["cycle"]).replace(".", "")), + reverse=True, + ) + for version in sorted_versions: + row = ( + version["cycle"], + pep(version["pep"]), + version["status"], + csv_date(version["releaseDate"], now_str), + csv_date(version["eol"], now_str), + version["releaseManager"], + ) + + if version["status"] == "end-of-life": + csv_eol.writerow(row) + else: + csv_branches.writerow(row) + + def save_mermaid(self) -> None: + """Output Mermaid file""" + out = [MERMAID_HEADER] + + for version in reversed(self.versions): + v = MERMAID_SECTION.format( + cycle=cycle(version["cycle"]), + release_date=version["releaseDate"], + eol=mermaid_date(version["eol"]), + release_status=version["status"], + mermaid_status=MERMAID_STATUS_MAPPING[version["status"]], + ) + out.append(v) + + with open("include/release-cycle.mmd", "w") as f: + f.writelines(out) + + +def main() -> None: + versions = Versions() + versions.save_csv() + versions.save_mermaid() + + +if __name__ == "__main__": + main() diff --git a/include/branches.csv b/include/branches.csv index 565f0e25e..66e59fe96 100644 --- a/include/branches.csv +++ b/include/branches.csv @@ -1,7 +1,7 @@ -Branch,Schedule,Status,First release,End-of-life,Release manager -main,:pep:`693`,features,*2023-10-02*,*2028-10*,Thomas Wouters -3.11,:pep:`664`,bugfix,2022-10-24,*2027-10*,Pablo Galindo Salgado -3.10,:pep:`619`,bugfix,2021-10-04,*2026-10*,Pablo Galindo Salgado -3.9,:pep:`596`,security,2020-10-05,*2025-10*,Łukasz Langa -3.8,:pep:`569`,security,2019-10-14,*2024-10*,Łukasz Langa -3.7,:pep:`537`,security,2018-06-27,*2023-06-27*,Ned Deily +Branch,Schedule,Status,First release,End-of-life,Release manager +main,:pep:`693`,features,*2023-10-02*,*2028-10*,Thomas Wouters +3.11,:pep:`664`,bugfix,2022-10-24,*2027-10*,Pablo Galindo Salgado +3.10,:pep:`619`,bugfix,2021-10-04,*2026-10*,Pablo Galindo Salgado +3.9,:pep:`596`,security,2020-10-05,*2025-10*,Łukasz Langa +3.8,:pep:`569`,security,2019-10-14,*2024-10*,Łukasz Langa +3.7,:pep:`537`,security,2018-06-27,*2023-06-27*,Ned Deily diff --git a/include/end-of-life.csv b/include/end-of-life.csv index 44bb3cc16..c3ca8ed9b 100644 --- a/include/end-of-life.csv +++ b/include/end-of-life.csv @@ -1,10 +1,10 @@ -Branch,Schedule,Status,First release,End-of-life,Release manager -3.6,:pep:`494`,end-of-life,2016-12-23,2021-12-23,Ned Deily -3.5,:pep:`478`,end-of-life,2015-09-13,2020-09-30,Larry Hastings -3.4,:pep:`429`,end-of-life,2014-03-16,2019-03-18,Larry Hastings -3.3,:pep:`398`,end-of-life,2012-09-29,2017-09-29,"Georg Brandl, Ned Deily (3.3.7+)" -3.2,:pep:`392`,end-of-life,2011-02-20,2016-02-20,Georg Brandl -3.1,:pep:`375`,end-of-life,2009-06-27,2012-04-09,Benjamin Peterson -3.0,:pep:`361`,end-of-life,2008-12-03,2009-06-27,Barry Warsaw -2.7,:pep:`373`,end-of-life,2010-07-03,2020-01-01,Benjamin Peterson -2.6,:pep:`361`,end-of-life,2008-10-01,2013-10-29,Barry Warsaw +Branch,Schedule,Status,First release,End-of-life,Release manager +3.6,:pep:`494`,end-of-life,2016-12-23,2021-12-23,Ned Deily +3.5,:pep:`478`,end-of-life,2015-09-13,2020-09-30,Larry Hastings +3.4,:pep:`429`,end-of-life,2014-03-16,2019-03-18,Larry Hastings +3.3,:pep:`398`,end-of-life,2012-09-29,2017-09-29,"Georg Brandl, Ned Deily (3.3.7+)" +3.2,:pep:`392`,end-of-life,2011-02-20,2016-02-20,Georg Brandl +3.1,:pep:`375`,end-of-life,2009-06-27,2012-04-09,Benjamin Peterson +3.0,:pep:`361`,end-of-life,2008-12-03,2009-06-27,Barry Warsaw +2.7,:pep:`373`,end-of-life,2010-07-03,2020-01-01,Benjamin Peterson +2.6,:pep:`361`,end-of-life,2008-10-01,2013-10-29,Barry Warsaw diff --git a/include/release-cycle.json b/include/release-cycle.json new file mode 100644 index 000000000..976300dcc --- /dev/null +++ b/include/release-cycle.json @@ -0,0 +1,122 @@ +[ + { + "cycle": "main", + "pep": 693, + "status": "features", + "releaseManager": "Thomas Wouters", + "releaseDate": "2023-10-02", + "eol": "2028-10" + }, + { + "cycle": "3.11", + "pep": 664, + "status": "bugfix", + "releaseManager": "Pablo Galindo Salgado", + "releaseDate": "2022-10-24", + "eol": "2027-10" + }, + { + "cycle": "3.10", + "pep": 619, + "status": "bugfix", + "releaseManager": "Pablo Galindo Salgado", + "releaseDate": "2021-10-04", + "eol": "2026-10" + }, + { + "cycle": "3.9", + "pep": 596, + "status": "security", + "releaseManager": "Łukasz Langa", + "releaseDate": "2020-10-05", + "eol": "2025-10" + }, + { + "cycle": "3.8", + "pep": 569, + "status": "security", + "releaseManager": "Łukasz Langa", + "releaseDate": "2019-10-14", + "eol": "2024-10" + }, + { + "cycle": "3.7", + "pep": 537, + "status": "security", + "releaseManager": "Ned Deily", + "releaseDate": "2018-06-27", + "eol": "2023-06-27" + }, + { + "cycle": "3.6", + "pep": 494, + "status": "end-of-life", + "releaseManager": "Ned Deily", + "releaseDate": "2016-12-23", + "eol": "2021-12-23" + }, + { + "cycle": "3.5", + "pep": 478, + "status": "end-of-life", + "releaseManager": "Larry Hastings", + "releaseDate": "2015-09-13", + "eol": "2020-09-30" + }, + { + "cycle": "3.4", + "pep": 429, + "status": "end-of-life", + "releaseManager": "Larry Hastings", + "releaseDate": "2014-03-16", + "eol": "2019-03-18" + }, + { + "cycle": "3.3", + "pep": 398, + "status": "end-of-life", + "releaseManager": "Georg Brandl, Ned Deily (3.3.7+)", + "releaseDate": "2012-09-29", + "eol": "2017-09-29" + }, + { + "cycle": "3.2", + "pep": 392, + "status": "end-of-life", + "releaseManager": "Georg Brandl", + "releaseDate": "2011-02-20", + "eol": "2016-02-20" + }, + { + "cycle": "2.7", + "pep": 373, + "status": "end-of-life", + "releaseManager": "Benjamin Peterson", + "releaseDate": "2010-07-03", + "eol": "2020-01-01" + }, + { + "cycle": "3.1", + "pep": 375, + "status": "end-of-life", + "releaseManager": "Benjamin Peterson", + "releaseDate": "2009-06-27", + "eol": "2012-04-09" + }, + { + "cycle": "3.0", + "pep": 361, + "status": "end-of-life", + "releaseManager": "Barry Warsaw", + "releaseDate": "2008-12-03", + "eol": "2009-06-27" + }, + { + "cycle": "2.6", + "pep": 361, + "status": "end-of-life", + "releaseManager": "Barry Warsaw", + "releaseDate": "2008-10-01", + "eol": "2013-10-29" + } +] diff --git a/include/release-cycle.mmd b/include/release-cycle.mmd new file mode 100644 index 000000000..572e9eda4 --- /dev/null +++ b/include/release-cycle.mmd @@ -0,0 +1,49 @@ +gantt + dateFormat YYYY-MM-DD + title Python release cycle + axisFormat %Y + + section Python 2.6 + end-of-life :crit, python2.6, 2008-10-01,2013-10-29 + + section Python 3.0 + end-of-life :crit, python3.0, 2008-12-03,2009-06-27 + + section Python 3.1 + end-of-life :crit, python3.1, 2009-06-27,2012-04-09 + + section Python 2.7 + end-of-life :crit, python2.7, 2010-07-03,2020-01-01 + + section Python 3.2 + end-of-life :crit, python3.2, 2011-02-20,2016-02-20 + + section Python 3.3 + end-of-life :crit, python3.3, 2012-09-29,2017-09-29 + + section Python 3.4 + end-of-life :crit, python3.4, 2014-03-16,2019-03-18 + + section Python 3.5 + end-of-life :crit, python3.5, 2015-09-13,2020-09-30 + + section Python 3.6 + end-of-life :crit, python3.6, 2016-12-23,2021-12-23 + + section Python 3.7 + security :done, python3.7, 2018-06-27,2023-06-27 + + section Python 3.8 + security :done, python3.8, 2019-10-14,2024-10-01 + + section Python 3.9 + security :done, python3.9, 2020-10-05,2025-10-01 + + section Python 3.10 + bugfix :active, python3.10, 2021-10-04,2026-10-01 + + section Python 3.11 + bugfix :active, python3.11, 2022-10-24,2027-10-01 + + section Python 3.12 + features : python3.12, 2023-10-02,2028-10-01 diff --git a/requirements.txt b/requirements.txt index 8bdf76e8a..e4cbf39d3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,6 @@ Sphinx==5.3.0 furo>=2022.6.4 -sphinx_copybutton>=0.3.3 sphinx-lint==0.6.7 +sphinx_copybutton>=0.3.3 +sphinxcontrib-mermaid sphinxext-rediraffe diff --git a/versions.rst b/versions.rst index c4e1b049f..8c8e57a2e 100644 --- a/versions.rst +++ b/versions.rst @@ -32,6 +32,12 @@ Unsupported Versions :file: include/end-of-life.csv +Python Release Cycle +==================== + +.. mermaid:: include/release-cycle.mmd + + Status Key ========== From b853e396351010a5f4f2bf828c24e9df34219dc1 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Mon, 21 Nov 2022 08:42:27 +0200 Subject: [PATCH 02/20] Add encoding and newlines for consistent cross-platform Unicode support Co-authored-by: C.A.M. Gerlach --- generate-release-cycle.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/generate-release-cycle.py b/generate-release-cycle.py index 16dd23b8d..105a0716e 100644 --- a/generate-release-cycle.py +++ b/generate-release-cycle.py @@ -74,8 +74,12 @@ def save_csv(self) -> None: now_str = str(dt.datetime.utcnow()) with ( - open("include/branches.csv", "w", newline="") as file_branches, - open("include/end-of-life.csv", "w", newline="") as file_eol, + open( + "include/branches.csv", "w", encoding="UTF-8", newline="" + ) as file_branches, + open( + "include/end-of-life.csv", "w", encoding="UTF-8", newline="" + ) as file_eol, ): csv_branches = csv.writer(file_branches, quoting=csv.QUOTE_MINIMAL) csv_eol = csv.writer(file_eol, quoting=csv.QUOTE_MINIMAL) @@ -117,7 +121,9 @@ def save_mermaid(self) -> None: ) out.append(v) - with open("include/release-cycle.mmd", "w") as f: + with open( + "include/release-cycle.mmd", "w", encoding="UTF-8", newline="\n" + ) as f: f.writelines(out) From a63e46c288defa4e208bb24e325686eb3460d764 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Mon, 21 Nov 2022 14:04:53 +0200 Subject: [PATCH 03/20] Write CSV with '\n' instead of '\r\n' line terminators --- generate-release-cycle.py | 8 ++++++-- include/branches.csv | 14 +++++++------- include/end-of-life.csv | 20 ++++++++++---------- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/generate-release-cycle.py b/generate-release-cycle.py index 105a0716e..f747aaf3c 100644 --- a/generate-release-cycle.py +++ b/generate-release-cycle.py @@ -81,8 +81,12 @@ def save_csv(self) -> None: "include/end-of-life.csv", "w", encoding="UTF-8", newline="" ) as file_eol, ): - csv_branches = csv.writer(file_branches, quoting=csv.QUOTE_MINIMAL) - csv_eol = csv.writer(file_eol, quoting=csv.QUOTE_MINIMAL) + csv_branches = csv.writer( + file_branches, quoting=csv.QUOTE_MINIMAL, lineterminator="\n" + ) + csv_eol = csv.writer( + file_eol, quoting=csv.QUOTE_MINIMAL, lineterminator="\n" + ) csv_branches.writerow(CSV_HEADER) csv_eol.writerow(CSV_HEADER) diff --git a/include/branches.csv b/include/branches.csv index 66e59fe96..565f0e25e 100644 --- a/include/branches.csv +++ b/include/branches.csv @@ -1,7 +1,7 @@ -Branch,Schedule,Status,First release,End-of-life,Release manager -main,:pep:`693`,features,*2023-10-02*,*2028-10*,Thomas Wouters -3.11,:pep:`664`,bugfix,2022-10-24,*2027-10*,Pablo Galindo Salgado -3.10,:pep:`619`,bugfix,2021-10-04,*2026-10*,Pablo Galindo Salgado -3.9,:pep:`596`,security,2020-10-05,*2025-10*,Łukasz Langa -3.8,:pep:`569`,security,2019-10-14,*2024-10*,Łukasz Langa -3.7,:pep:`537`,security,2018-06-27,*2023-06-27*,Ned Deily +Branch,Schedule,Status,First release,End-of-life,Release manager +main,:pep:`693`,features,*2023-10-02*,*2028-10*,Thomas Wouters +3.11,:pep:`664`,bugfix,2022-10-24,*2027-10*,Pablo Galindo Salgado +3.10,:pep:`619`,bugfix,2021-10-04,*2026-10*,Pablo Galindo Salgado +3.9,:pep:`596`,security,2020-10-05,*2025-10*,Łukasz Langa +3.8,:pep:`569`,security,2019-10-14,*2024-10*,Łukasz Langa +3.7,:pep:`537`,security,2018-06-27,*2023-06-27*,Ned Deily diff --git a/include/end-of-life.csv b/include/end-of-life.csv index c3ca8ed9b..44bb3cc16 100644 --- a/include/end-of-life.csv +++ b/include/end-of-life.csv @@ -1,10 +1,10 @@ -Branch,Schedule,Status,First release,End-of-life,Release manager -3.6,:pep:`494`,end-of-life,2016-12-23,2021-12-23,Ned Deily -3.5,:pep:`478`,end-of-life,2015-09-13,2020-09-30,Larry Hastings -3.4,:pep:`429`,end-of-life,2014-03-16,2019-03-18,Larry Hastings -3.3,:pep:`398`,end-of-life,2012-09-29,2017-09-29,"Georg Brandl, Ned Deily (3.3.7+)" -3.2,:pep:`392`,end-of-life,2011-02-20,2016-02-20,Georg Brandl -3.1,:pep:`375`,end-of-life,2009-06-27,2012-04-09,Benjamin Peterson -3.0,:pep:`361`,end-of-life,2008-12-03,2009-06-27,Barry Warsaw -2.7,:pep:`373`,end-of-life,2010-07-03,2020-01-01,Benjamin Peterson -2.6,:pep:`361`,end-of-life,2008-10-01,2013-10-29,Barry Warsaw +Branch,Schedule,Status,First release,End-of-life,Release manager +3.6,:pep:`494`,end-of-life,2016-12-23,2021-12-23,Ned Deily +3.5,:pep:`478`,end-of-life,2015-09-13,2020-09-30,Larry Hastings +3.4,:pep:`429`,end-of-life,2014-03-16,2019-03-18,Larry Hastings +3.3,:pep:`398`,end-of-life,2012-09-29,2017-09-29,"Georg Brandl, Ned Deily (3.3.7+)" +3.2,:pep:`392`,end-of-life,2011-02-20,2016-02-20,Georg Brandl +3.1,:pep:`375`,end-of-life,2009-06-27,2012-04-09,Benjamin Peterson +3.0,:pep:`361`,end-of-life,2008-12-03,2009-06-27,Barry Warsaw +2.7,:pep:`373`,end-of-life,2010-07-03,2020-01-01,Benjamin Peterson +2.6,:pep:`361`,end-of-life,2008-10-01,2013-10-29,Barry Warsaw From c1f2c66151a01ef0837790072cd18233a8167012 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Tue, 22 Nov 2022 11:34:44 +0200 Subject: [PATCH 04/20] Move diagram above tables --- versions.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/versions.rst b/versions.rst index 8c8e57a2e..8c5242ebd 100644 --- a/versions.rst +++ b/versions.rst @@ -10,6 +10,12 @@ branch that accepts new features. The latest release for each Python version can be found on the `download page `_. +Python Release Cycle +==================== + +.. mermaid:: include/release-cycle.mmd + + Supported Versions ================== @@ -32,12 +38,6 @@ Unsupported Versions :file: include/end-of-life.csv -Python Release Cycle -==================== - -.. mermaid:: include/release-cycle.mmd - - Status Key ========== From a46648f7606b4d3c83f910ae80b9fac65fd6a237 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Tue, 22 Nov 2022 11:41:01 +0200 Subject: [PATCH 05/20] Wording: features -> feature --- generate-release-cycle.py | 2 +- include/branches.csv | 2 +- include/release-cycle.json | 2 +- include/release-cycle.mmd | 2 +- versions.rst | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/generate-release-cycle.py b/generate-release-cycle.py index f747aaf3c..d601469a3 100644 --- a/generate-release-cycle.py +++ b/generate-release-cycle.py @@ -20,7 +20,7 @@ """ # noqa: E501 MERMAID_STATUS_MAPPING = { - "features": "", + "feature": "", "bugfix": "active,", "security": "done,", "end-of-life": "crit,", diff --git a/include/branches.csv b/include/branches.csv index 565f0e25e..04cea51b2 100644 --- a/include/branches.csv +++ b/include/branches.csv @@ -1,5 +1,5 @@ Branch,Schedule,Status,First release,End-of-life,Release manager -main,:pep:`693`,features,*2023-10-02*,*2028-10*,Thomas Wouters +main,:pep:`693`,feature,*2023-10-02*,*2028-10*,Thomas Wouters 3.11,:pep:`664`,bugfix,2022-10-24,*2027-10*,Pablo Galindo Salgado 3.10,:pep:`619`,bugfix,2021-10-04,*2026-10*,Pablo Galindo Salgado 3.9,:pep:`596`,security,2020-10-05,*2025-10*,Łukasz Langa diff --git a/include/release-cycle.json b/include/release-cycle.json index 976300dcc..531368a2f 100644 --- a/include/release-cycle.json +++ b/include/release-cycle.json @@ -2,7 +2,7 @@ { "cycle": "main", "pep": 693, - "status": "features", + "status": "feature", "releaseManager": "Thomas Wouters", "releaseDate": "2023-10-02", "eol": "2028-10" diff --git a/include/release-cycle.mmd b/include/release-cycle.mmd index 572e9eda4..fc437ab59 100644 --- a/include/release-cycle.mmd +++ b/include/release-cycle.mmd @@ -46,4 +46,4 @@ gantt bugfix :active, python3.11, 2022-10-24,2027-10-01 section Python 3.12 - features : python3.12, 2023-10-02,2028-10-01 + feature : python3.12, 2023-10-02,2028-10-01 diff --git a/versions.rst b/versions.rst index 8c5242ebd..2d08ac027 100644 --- a/versions.rst +++ b/versions.rst @@ -41,7 +41,7 @@ Unsupported Versions Status Key ========== -:features: new features, bugfixes, and security fixes are accepted. +:feature: new features, bugfixes, and security fixes are accepted. :prerelease: feature fixes, bugfixes, and security fixes are accepted for the upcoming feature release. :bugfix: bugfixes and security fixes are accepted, new binaries are still From 4be979ea84a75501b5a1698c765936ebc5e59b52 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Tue, 22 Nov 2022 11:42:32 +0200 Subject: [PATCH 06/20] Wording: End-of-life -> End of life --- generate-release-cycle.py | 2 +- include/branches.csv | 2 +- include/end-of-life.csv | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/generate-release-cycle.py b/generate-release-cycle.py index d601469a3..e52d1a917 100644 --- a/generate-release-cycle.py +++ b/generate-release-cycle.py @@ -31,7 +31,7 @@ "Schedule", "Status", "First release", - "End-of-life", + "End of life", "Release manager", ) diff --git a/include/branches.csv b/include/branches.csv index 04cea51b2..bfec9da84 100644 --- a/include/branches.csv +++ b/include/branches.csv @@ -1,4 +1,4 @@ -Branch,Schedule,Status,First release,End-of-life,Release manager +Branch,Schedule,Status,First release,End of life,Release manager main,:pep:`693`,feature,*2023-10-02*,*2028-10*,Thomas Wouters 3.11,:pep:`664`,bugfix,2022-10-24,*2027-10*,Pablo Galindo Salgado 3.10,:pep:`619`,bugfix,2021-10-04,*2026-10*,Pablo Galindo Salgado diff --git a/include/end-of-life.csv b/include/end-of-life.csv index 44bb3cc16..be9fe1b72 100644 --- a/include/end-of-life.csv +++ b/include/end-of-life.csv @@ -1,4 +1,4 @@ -Branch,Schedule,Status,First release,End-of-life,Release manager +Branch,Schedule,Status,First release,End of life,Release manager 3.6,:pep:`494`,end-of-life,2016-12-23,2021-12-23,Ned Deily 3.5,:pep:`478`,end-of-life,2015-09-13,2020-09-30,Larry Hastings 3.4,:pep:`429`,end-of-life,2014-03-16,2019-03-18,Larry Hastings From 568e3dd82539085d3996570986b01f4cde9569aa Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Wed, 23 Nov 2022 15:39:01 +0200 Subject: [PATCH 07/20] Put version as JSON key with branch name as a value --- generate-release-cycle.py | 41 +++++++++++------------- include/release-cycle.json | 64 +++++++++++++++++++------------------- 2 files changed, 50 insertions(+), 55 deletions(-) diff --git a/generate-release-cycle.py b/generate-release-cycle.py index e52d1a917..057e7239c 100644 --- a/generate-release-cycle.py +++ b/generate-release-cycle.py @@ -15,8 +15,8 @@ """.lstrip() MERMAID_SECTION = """ - section Python {cycle} - {release_status} :{mermaid_status} python{cycle}, {release_date},{eol} + section Python {version} + {release_status} :{mermaid_status} python{version}, {release_date},{eol} """ # noqa: E501 MERMAID_STATUS_MAPPING = { @@ -36,11 +36,6 @@ ) -def cycle(branch: str) -> str: - """Convert branch name to version number""" - return "3.12" if branch == "main" else branch - - def pep(number: int) -> str: """Format PEP number with Sphinx role""" return f":pep:`{number}`" @@ -92,21 +87,21 @@ def save_csv(self) -> None: csv_eol.writerow(CSV_HEADER) sorted_versions = sorted( - self.versions, - key=lambda d: int(cycle(d["cycle"]).replace(".", "")), + self.versions.items(), + key=lambda k: int(k[0].replace(".", "")), reverse=True, ) - for version in sorted_versions: + for version, details in sorted_versions: row = ( - version["cycle"], - pep(version["pep"]), - version["status"], - csv_date(version["releaseDate"], now_str), - csv_date(version["eol"], now_str), - version["releaseManager"], + details["branch"], + pep(details["pep"]), + details["status"], + csv_date(details["releaseDate"], now_str), + csv_date(details["eol"], now_str), + details["releaseManager"], ) - if version["status"] == "end-of-life": + if details["status"] == "end-of-life": csv_eol.writerow(row) else: csv_branches.writerow(row) @@ -115,13 +110,13 @@ def save_mermaid(self) -> None: """Output Mermaid file""" out = [MERMAID_HEADER] - for version in reversed(self.versions): + for version, details in reversed(self.versions.items()): v = MERMAID_SECTION.format( - cycle=cycle(version["cycle"]), - release_date=version["releaseDate"], - eol=mermaid_date(version["eol"]), - release_status=version["status"], - mermaid_status=MERMAID_STATUS_MAPPING[version["status"]], + version=version, + release_date=details["releaseDate"], + eol=mermaid_date(details["eol"]), + release_status=details["status"], + mermaid_status=MERMAID_STATUS_MAPPING[details["status"]], ) out.append(v) diff --git a/include/release-cycle.json b/include/release-cycle.json index 531368a2f..7668ff85f 100644 --- a/include/release-cycle.json +++ b/include/release-cycle.json @@ -1,122 +1,122 @@ -[ - { - "cycle": "main", +{ + "3.12": { + "branch": "main", "pep": 693, "status": "feature", "releaseManager": "Thomas Wouters", "releaseDate": "2023-10-02", "eol": "2028-10" }, - { - "cycle": "3.11", + "3.11": { + "branch": "3.11", "pep": 664, "status": "bugfix", "releaseManager": "Pablo Galindo Salgado", "releaseDate": "2022-10-24", "eol": "2027-10" }, - { - "cycle": "3.10", + "3.10": { + "branch": "3.10", "pep": 619, "status": "bugfix", "releaseManager": "Pablo Galindo Salgado", "releaseDate": "2021-10-04", "eol": "2026-10" }, - { - "cycle": "3.9", + "3.9": { + "branch": "3.9", "pep": 596, "status": "security", "releaseManager": "Łukasz Langa", "releaseDate": "2020-10-05", "eol": "2025-10" }, - { - "cycle": "3.8", + "3.8": { + "branch": "3.8", "pep": 569, "status": "security", "releaseManager": "Łukasz Langa", "releaseDate": "2019-10-14", "eol": "2024-10" }, - { - "cycle": "3.7", + "3.7": { + "branch": "3.7", "pep": 537, "status": "security", "releaseManager": "Ned Deily", "releaseDate": "2018-06-27", "eol": "2023-06-27" }, - { - "cycle": "3.6", + "3.6": { + "branch": "3.6", "pep": 494, "status": "end-of-life", "releaseManager": "Ned Deily", "releaseDate": "2016-12-23", "eol": "2021-12-23" }, - { - "cycle": "3.5", + "3.5": { + "branch": "3.5", "pep": 478, "status": "end-of-life", "releaseManager": "Larry Hastings", "releaseDate": "2015-09-13", "eol": "2020-09-30" }, - { - "cycle": "3.4", + "3.4": { + "branch": "3.4", "pep": 429, "status": "end-of-life", "releaseManager": "Larry Hastings", "releaseDate": "2014-03-16", "eol": "2019-03-18" }, - { - "cycle": "3.3", + "3.3": { + "branch": "3.3", "pep": 398, "status": "end-of-life", "releaseManager": "Georg Brandl, Ned Deily (3.3.7+)", "releaseDate": "2012-09-29", "eol": "2017-09-29" }, - { - "cycle": "3.2", + "3.2": { + "branch": "3.2", "pep": 392, "status": "end-of-life", "releaseManager": "Georg Brandl", "releaseDate": "2011-02-20", "eol": "2016-02-20" }, - { - "cycle": "2.7", + "2.7": { + "branch": "2.7", "pep": 373, "status": "end-of-life", "releaseManager": "Benjamin Peterson", "releaseDate": "2010-07-03", "eol": "2020-01-01" }, - { - "cycle": "3.1", + "3.1": { + "branch": "3.1", "pep": 375, "status": "end-of-life", "releaseManager": "Benjamin Peterson", "releaseDate": "2009-06-27", "eol": "2012-04-09" }, - { - "cycle": "3.0", + "3.0": { + "branch": "3.0", "pep": 361, "status": "end-of-life", "releaseManager": "Barry Warsaw", "releaseDate": "2008-12-03", "eol": "2009-06-27" }, - { - "cycle": "2.6", + "2.6": { + "branch": "2.6", "pep": 361, "status": "end-of-life", "releaseManager": "Barry Warsaw", "releaseDate": "2008-10-01", "eol": "2013-10-29" } -] +} From 54c1e75e65c889ee837aeb52f910384872fff0c7 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Wed, 23 Nov 2022 15:43:11 +0200 Subject: [PATCH 08/20] JSON keys in snake_case --- generate-release-cycle.py | 6 ++-- include/release-cycle.json | 60 +++++++++++++++++++------------------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/generate-release-cycle.py b/generate-release-cycle.py index 057e7239c..8aafad338 100644 --- a/generate-release-cycle.py +++ b/generate-release-cycle.py @@ -96,9 +96,9 @@ def save_csv(self) -> None: details["branch"], pep(details["pep"]), details["status"], - csv_date(details["releaseDate"], now_str), + csv_date(details["release_date"], now_str), csv_date(details["eol"], now_str), - details["releaseManager"], + details["release_manager"], ) if details["status"] == "end-of-life": @@ -113,7 +113,7 @@ def save_mermaid(self) -> None: for version, details in reversed(self.versions.items()): v = MERMAID_SECTION.format( version=version, - release_date=details["releaseDate"], + release_date=details["release_date"], eol=mermaid_date(details["eol"]), release_status=details["status"], mermaid_status=MERMAID_STATUS_MAPPING[details["status"]], diff --git a/include/release-cycle.json b/include/release-cycle.json index 7668ff85f..7e327d5c9 100644 --- a/include/release-cycle.json +++ b/include/release-cycle.json @@ -3,120 +3,120 @@ "branch": "main", "pep": 693, "status": "feature", - "releaseManager": "Thomas Wouters", - "releaseDate": "2023-10-02", + "release_manager": "Thomas Wouters", + "release_date": "2023-10-02", "eol": "2028-10" }, "3.11": { "branch": "3.11", "pep": 664, "status": "bugfix", - "releaseManager": "Pablo Galindo Salgado", - "releaseDate": "2022-10-24", + "release_manager": "Pablo Galindo Salgado", + "release_date": "2022-10-24", "eol": "2027-10" }, "3.10": { "branch": "3.10", "pep": 619, "status": "bugfix", - "releaseManager": "Pablo Galindo Salgado", - "releaseDate": "2021-10-04", + "release_manager": "Pablo Galindo Salgado", + "release_date": "2021-10-04", "eol": "2026-10" }, "3.9": { "branch": "3.9", "pep": 596, "status": "security", - "releaseManager": "Łukasz Langa", - "releaseDate": "2020-10-05", + "release_manager": "Łukasz Langa", + "release_date": "2020-10-05", "eol": "2025-10" }, "3.8": { "branch": "3.8", "pep": 569, "status": "security", - "releaseManager": "Łukasz Langa", - "releaseDate": "2019-10-14", + "release_manager": "Łukasz Langa", + "release_date": "2019-10-14", "eol": "2024-10" }, "3.7": { "branch": "3.7", "pep": 537, "status": "security", - "releaseManager": "Ned Deily", - "releaseDate": "2018-06-27", + "release_manager": "Ned Deily", + "release_date": "2018-06-27", "eol": "2023-06-27" }, "3.6": { "branch": "3.6", "pep": 494, "status": "end-of-life", - "releaseManager": "Ned Deily", - "releaseDate": "2016-12-23", + "release_manager": "Ned Deily", + "release_date": "2016-12-23", "eol": "2021-12-23" }, "3.5": { "branch": "3.5", "pep": 478, "status": "end-of-life", - "releaseManager": "Larry Hastings", - "releaseDate": "2015-09-13", + "release_manager": "Larry Hastings", + "release_date": "2015-09-13", "eol": "2020-09-30" }, "3.4": { "branch": "3.4", "pep": 429, "status": "end-of-life", - "releaseManager": "Larry Hastings", - "releaseDate": "2014-03-16", + "release_manager": "Larry Hastings", + "release_date": "2014-03-16", "eol": "2019-03-18" }, "3.3": { "branch": "3.3", "pep": 398, "status": "end-of-life", - "releaseManager": "Georg Brandl, Ned Deily (3.3.7+)", - "releaseDate": "2012-09-29", + "release_manager": "Georg Brandl, Ned Deily (3.3.7+)", + "release_date": "2012-09-29", "eol": "2017-09-29" }, "3.2": { "branch": "3.2", "pep": 392, "status": "end-of-life", - "releaseManager": "Georg Brandl", - "releaseDate": "2011-02-20", + "release_manager": "Georg Brandl", + "release_date": "2011-02-20", "eol": "2016-02-20" }, "2.7": { "branch": "2.7", "pep": 373, "status": "end-of-life", - "releaseManager": "Benjamin Peterson", - "releaseDate": "2010-07-03", + "release_manager": "Benjamin Peterson", + "release_date": "2010-07-03", "eol": "2020-01-01" }, "3.1": { "branch": "3.1", "pep": 375, "status": "end-of-life", - "releaseManager": "Benjamin Peterson", - "releaseDate": "2009-06-27", + "release_manager": "Benjamin Peterson", + "release_date": "2009-06-27", "eol": "2012-04-09" }, "3.0": { "branch": "3.0", "pep": 361, "status": "end-of-life", - "releaseManager": "Barry Warsaw", - "releaseDate": "2008-12-03", + "release_manager": "Barry Warsaw", + "release_date": "2008-12-03", "eol": "2009-06-27" }, "2.6": { "branch": "2.6", "pep": 361, "status": "end-of-life", - "releaseManager": "Barry Warsaw", - "releaseDate": "2008-10-01", + "release_manager": "Barry Warsaw", + "release_date": "2008-10-01", "eol": "2013-10-29" } } From 00f6d0d5bbbe063c205875e93edc5c55b1d902c4 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sun, 27 Nov 2022 18:50:09 +0200 Subject: [PATCH 09/20] Add missing encoding and use a more descriptive filename Co-authored-by: C.A.M. Gerlach --- generate-release-cycle.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/generate-release-cycle.py b/generate-release-cycle.py index 8aafad338..f8f91014e 100644 --- a/generate-release-cycle.py +++ b/generate-release-cycle.py @@ -61,8 +61,8 @@ class Versions: """For converting JSON to CSV and Mermaid""" def __init__(self) -> None: - with open("include/release-cycle.json") as f: - self.versions = json.load(f) + with open("include/release-cycle.json", encoding="UTF-8") as in_file: + self.versions = json.load(in_file) def save_csv(self) -> None: """Output CSV files""" From 3fb82cad3954a38953f38b29f0285006dcaf7209 Mon Sep 17 00:00:00 2001 From: "C.A.M. Gerlach" Date: Sat, 26 Nov 2022 16:28:55 -0600 Subject: [PATCH 10/20] Modify generate-release-cycle script to use DictWriter --- generate-release-cycle.py | 74 +++++++++++++-------------------------- 1 file changed, 24 insertions(+), 50 deletions(-) diff --git a/generate-release-cycle.py b/generate-release-cycle.py index f8f91014e..518449cc8 100644 --- a/generate-release-cycle.py +++ b/generate-release-cycle.py @@ -26,20 +26,6 @@ "end-of-life": "crit,", } -CSV_HEADER = ( - "Branch", - "Schedule", - "Status", - "First release", - "End of life", - "Release manager", -) - - -def pep(number: int) -> str: - """Format PEP number with Sphinx role""" - return f":pep:`{number}`" - def csv_date(date_str: str, now_str: str) -> str: """Format a date for CSV""" @@ -63,48 +49,36 @@ class Versions: def __init__(self) -> None: with open("include/release-cycle.json", encoding="UTF-8") as in_file: self.versions = json.load(in_file) + self.sorted_versions = sorted( + self.versions.items(), + key=lambda k: [int(i) for i in k.split(".")], + reverse=True, + ) def save_csv(self) -> None: """Output CSV files""" now_str = str(dt.datetime.utcnow()) - with ( - open( - "include/branches.csv", "w", encoding="UTF-8", newline="" - ) as file_branches, - open( - "include/end-of-life.csv", "w", encoding="UTF-8", newline="" - ) as file_eol, - ): - csv_branches = csv.writer( - file_branches, quoting=csv.QUOTE_MINIMAL, lineterminator="\n" - ) - csv_eol = csv.writer( - file_eol, quoting=csv.QUOTE_MINIMAL, lineterminator="\n" - ) - - csv_branches.writerow(CSV_HEADER) - csv_eol.writerow(CSV_HEADER) - - sorted_versions = sorted( - self.versions.items(), - key=lambda k: int(k[0].replace(".", "")), - reverse=True, - ) - for version, details in sorted_versions: - row = ( - details["branch"], - pep(details["pep"]), - details["status"], - csv_date(details["release_date"], now_str), - csv_date(details["eol"], now_str), - details["release_manager"], + versions_bycategory = {"branches": {}, "end-of-life": {}} + for version, details in self.sorted_versions.items(): + row = { + "Branch": details["branch"], + "Schedule": f":pep:`{details['pep']}`", + "Status": details["status"], + "First release": csv_date(details["release_date"], now_str), + "End of life": csv_date(details["eol"], now_str), + "Release manager": details["release_manager"], + } + cat = "end-of-life" if details["status"] == "end-of-life" else "branches" + versions_bycategory[cat][version] = row + + for cat, versions in versions_bycategory.items(): + with open(f"include/{cat}.csv", "w", encoding="UTF-8", newline="") as file: + csv_file = csv.DictWriter( + file, fieldnames=versions.keys(), lineterminator="\n" ) - - if details["status"] == "end-of-life": - csv_eol.writerow(row) - else: - csv_branches.writerow(row) + csv_file.writeheader() + row = csv_file.writerows(versions.values()) def save_mermaid(self) -> None: """Output Mermaid file""" From 44d0a46398042dd11b7de35fdc2f7eb651c78df8 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sun, 27 Nov 2022 18:59:49 +0200 Subject: [PATCH 11/20] Updates for DictWriter --- generate-release-cycle.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/generate-release-cycle.py b/generate-release-cycle.py index 518449cc8..c6b810650 100644 --- a/generate-release-cycle.py +++ b/generate-release-cycle.py @@ -51,7 +51,7 @@ def __init__(self) -> None: self.versions = json.load(in_file) self.sorted_versions = sorted( self.versions.items(), - key=lambda k: [int(i) for i in k.split(".")], + key=lambda k: [int(i) for i in k[0].split(".")], reverse=True, ) @@ -59,8 +59,9 @@ def save_csv(self) -> None: """Output CSV files""" now_str = str(dt.datetime.utcnow()) - versions_bycategory = {"branches": {}, "end-of-life": {}} - for version, details in self.sorted_versions.items(): + versions_by_category = {"branches": {}, "end-of-life": {}} + headers = None + for version, details in self.sorted_versions: row = { "Branch": details["branch"], "Schedule": f":pep:`{details['pep']}`", @@ -69,16 +70,15 @@ def save_csv(self) -> None: "End of life": csv_date(details["eol"], now_str), "Release manager": details["release_manager"], } + headers = row.keys() cat = "end-of-life" if details["status"] == "end-of-life" else "branches" - versions_bycategory[cat][version] = row + versions_by_category[cat][version] = row - for cat, versions in versions_bycategory.items(): + for cat, versions in versions_by_category.items(): with open(f"include/{cat}.csv", "w", encoding="UTF-8", newline="") as file: - csv_file = csv.DictWriter( - file, fieldnames=versions.keys(), lineterminator="\n" - ) + csv_file = csv.DictWriter(file, fieldnames=headers, lineterminator="\n") csv_file.writeheader() - row = csv_file.writerows(versions.values()) + csv_file.writerows(versions.values()) def save_mermaid(self) -> None: """Output Mermaid file""" From 0edc4c4485a9b2dfcb9389bbc36a9e2f4af95379 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sun, 27 Nov 2022 19:07:44 +0200 Subject: [PATCH 12/20] Rename with underscores --- Makefile | 6 +++--- generate-release-cycle.py => generate_release_cycle.py | 0 2 files changed, 3 insertions(+), 3 deletions(-) rename generate-release-cycle.py => generate_release_cycle.py (100%) diff --git a/Makefile b/Makefile index 7458b568d..43015e4e2 100644 --- a/Makefile +++ b/Makefile @@ -190,13 +190,13 @@ serve: # TODO make.bat include/branches.csv: include/release-cycle.json - $(PYTHON) generate-release-cycle.py + $(PYTHON) generate_release_cycle.py include/end-of-life.csv: include/release-cycle.json - $(PYTHON) generate-release-cycle.py + $(PYTHON) generate_release_cycle.py include/release-cycle.mmd: include/release-cycle.json - $(PYTHON) generate-release-cycle.py + $(PYTHON) generate_release_cycle.py .PHONY: versions versions: include/branches.csv include/end-of-life.csv include/release-cycle.mmd diff --git a/generate-release-cycle.py b/generate_release_cycle.py similarity index 100% rename from generate-release-cycle.py rename to generate_release_cycle.py From 2a7ee88e6596ae621cc22ec6bfae9da6d8f76bba Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sun, 27 Nov 2022 19:07:59 +0200 Subject: [PATCH 13/20] Rename save_ to write_ --- generate_release_cycle.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/generate_release_cycle.py b/generate_release_cycle.py index c6b810650..bd7621f4a 100644 --- a/generate_release_cycle.py +++ b/generate_release_cycle.py @@ -55,7 +55,7 @@ def __init__(self) -> None: reverse=True, ) - def save_csv(self) -> None: + def write_csv(self) -> None: """Output CSV files""" now_str = str(dt.datetime.utcnow()) @@ -80,7 +80,7 @@ def save_csv(self) -> None: csv_file.writeheader() csv_file.writerows(versions.values()) - def save_mermaid(self) -> None: + def write_mermaid(self) -> None: """Output Mermaid file""" out = [MERMAID_HEADER] @@ -102,8 +102,8 @@ def save_mermaid(self) -> None: def main() -> None: versions = Versions() - versions.save_csv() - versions.save_mermaid() + versions.write_csv() + versions.write_mermaid() if __name__ == "__main__": From 59db2e0acb05479b232f09aa87680f4ff101299f Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Mon, 28 Nov 2022 20:19:16 +0200 Subject: [PATCH 14/20] Rename/reorder data keys --- generate_release_cycle.py | 10 ++--- include/release-cycle.json | 90 +++++++++++++++++++------------------- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/generate_release_cycle.py b/generate_release_cycle.py index bd7621f4a..abb932549 100644 --- a/generate_release_cycle.py +++ b/generate_release_cycle.py @@ -16,7 +16,7 @@ MERMAID_SECTION = """ section Python {version} - {release_status} :{mermaid_status} python{version}, {release_date},{eol} + {release_status} :{mermaid_status} python{version}, {first_release},{eol} """ # noqa: E501 MERMAID_STATUS_MAPPING = { @@ -66,8 +66,8 @@ def write_csv(self) -> None: "Branch": details["branch"], "Schedule": f":pep:`{details['pep']}`", "Status": details["status"], - "First release": csv_date(details["release_date"], now_str), - "End of life": csv_date(details["eol"], now_str), + "First release": csv_date(details["first_release"], now_str), + "End of life": csv_date(details["end_of_life"], now_str), "Release manager": details["release_manager"], } headers = row.keys() @@ -87,8 +87,8 @@ def write_mermaid(self) -> None: for version, details in reversed(self.versions.items()): v = MERMAID_SECTION.format( version=version, - release_date=details["release_date"], - eol=mermaid_date(details["eol"]), + first_release=details["first_release"], + eol=mermaid_date(details["end_of_life"]), release_status=details["status"], mermaid_status=MERMAID_STATUS_MAPPING[details["status"]], ) diff --git a/include/release-cycle.json b/include/release-cycle.json index 7e327d5c9..df82e64ed 100644 --- a/include/release-cycle.json +++ b/include/release-cycle.json @@ -3,120 +3,120 @@ "branch": "main", "pep": 693, "status": "feature", - "release_manager": "Thomas Wouters", - "release_date": "2023-10-02", - "eol": "2028-10" + "first_release": "2023-10-02", + "end_of_life": "2028-10", + "release_manager": "Thomas Wouters" }, "3.11": { "branch": "3.11", "pep": 664, "status": "bugfix", - "release_manager": "Pablo Galindo Salgado", - "release_date": "2022-10-24", - "eol": "2027-10" + "first_release": "2022-10-24", + "end_of_life": "2027-10", + "release_manager": "Pablo Galindo Salgado" }, "3.10": { "branch": "3.10", "pep": 619, "status": "bugfix", - "release_manager": "Pablo Galindo Salgado", - "release_date": "2021-10-04", - "eol": "2026-10" + "first_release": "2021-10-04", + "end_of_life": "2026-10", + "release_manager": "Pablo Galindo Salgado" }, "3.9": { "branch": "3.9", "pep": 596, "status": "security", - "release_manager": "Łukasz Langa", - "release_date": "2020-10-05", - "eol": "2025-10" + "first_release": "2020-10-05", + "end_of_life": "2025-10", + "release_manager": "Łukasz Langa" }, "3.8": { "branch": "3.8", "pep": 569, "status": "security", - "release_manager": "Łukasz Langa", - "release_date": "2019-10-14", - "eol": "2024-10" + "first_release": "2019-10-14", + "end_of_life": "2024-10", + "release_manager": "Łukasz Langa" }, "3.7": { "branch": "3.7", "pep": 537, "status": "security", - "release_manager": "Ned Deily", - "release_date": "2018-06-27", - "eol": "2023-06-27" + "first_release": "2018-06-27", + "end_of_life": "2023-06-27", + "release_manager": "Ned Deily" }, "3.6": { "branch": "3.6", "pep": 494, "status": "end-of-life", - "release_manager": "Ned Deily", - "release_date": "2016-12-23", - "eol": "2021-12-23" + "first_release": "2016-12-23", + "end_of_life": "2021-12-23", + "release_manager": "Ned Deily" }, "3.5": { "branch": "3.5", "pep": 478, "status": "end-of-life", - "release_manager": "Larry Hastings", - "release_date": "2015-09-13", - "eol": "2020-09-30" + "first_release": "2015-09-13", + "end_of_life": "2020-09-30", + "release_manager": "Larry Hastings" }, "3.4": { "branch": "3.4", "pep": 429, "status": "end-of-life", - "release_manager": "Larry Hastings", - "release_date": "2014-03-16", - "eol": "2019-03-18" + "first_release": "2014-03-16", + "end_of_life": "2019-03-18", + "release_manager": "Larry Hastings" }, "3.3": { "branch": "3.3", "pep": 398, "status": "end-of-life", - "release_manager": "Georg Brandl, Ned Deily (3.3.7+)", - "release_date": "2012-09-29", - "eol": "2017-09-29" + "first_release": "2012-09-29", + "end_of_life": "2017-09-29", + "release_manager": "Georg Brandl, Ned Deily (3.3.7+)" }, "3.2": { "branch": "3.2", "pep": 392, "status": "end-of-life", - "release_manager": "Georg Brandl", - "release_date": "2011-02-20", - "eol": "2016-02-20" + "first_release": "2011-02-20", + "end_of_life": "2016-02-20", + "release_manager": "Georg Brandl" }, "2.7": { "branch": "2.7", "pep": 373, "status": "end-of-life", - "release_manager": "Benjamin Peterson", - "release_date": "2010-07-03", - "eol": "2020-01-01" + "first_release": "2010-07-03", + "end_of_life": "2020-01-01", + "release_manager": "Benjamin Peterson" }, "3.1": { "branch": "3.1", "pep": 375, "status": "end-of-life", - "release_manager": "Benjamin Peterson", - "release_date": "2009-06-27", - "eol": "2012-04-09" + "first_release": "2009-06-27", + "end_of_life": "2012-04-09", + "release_manager": "Benjamin Peterson" }, "3.0": { "branch": "3.0", "pep": 361, "status": "end-of-life", - "release_manager": "Barry Warsaw", - "release_date": "2008-12-03", - "eol": "2009-06-27" + "first_release": "2008-12-03", + "end_of_life": "2009-06-27", + "release_manager": "Barry Warsaw" }, "2.6": { "branch": "2.6", "pep": 361, "status": "end-of-life", - "release_manager": "Barry Warsaw", - "release_date": "2008-10-01", - "eol": "2013-10-29" + "first_release": "2008-10-01", + "end_of_life": "2013-10-29", + "release_manager": "Barry Warsaw" } } From a5141380c285fcd0528fad27f7c01a1b9ea735f5 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Tue, 29 Nov 2022 09:07:09 +0200 Subject: [PATCH 15/20] Move into _tools, add to Windows make.bat --- Makefile | 7 +++---- .../generate_release_cycle.py | 0 make.bat | 8 ++++++++ 3 files changed, 11 insertions(+), 4 deletions(-) rename generate_release_cycle.py => _tools/generate_release_cycle.py (100%) diff --git a/Makefile b/Makefile index 43015e4e2..6e5ee1693 100644 --- a/Makefile +++ b/Makefile @@ -188,15 +188,14 @@ serve: @echo "The 'serve' target was removed, use 'htmlview' instead" \ "(see https://github.com/python/cpython/issues/80510)" -# TODO make.bat include/branches.csv: include/release-cycle.json - $(PYTHON) generate_release_cycle.py + $(PYTHON) _tools/generate_release_cycle.py include/end-of-life.csv: include/release-cycle.json - $(PYTHON) generate_release_cycle.py + $(PYTHON) _tools/generate_release_cycle.py include/release-cycle.mmd: include/release-cycle.json - $(PYTHON) generate_release_cycle.py + $(PYTHON) _tools/generate_release_cycle.py .PHONY: versions versions: include/branches.csv include/end-of-life.csv include/release-cycle.mmd diff --git a/generate_release_cycle.py b/_tools/generate_release_cycle.py similarity index 100% rename from generate_release_cycle.py rename to _tools/generate_release_cycle.py diff --git a/make.bat b/make.bat index 5fe9f98d7..432b7f361 100644 --- a/make.bat +++ b/make.bat @@ -223,6 +223,14 @@ goto end (see https://github.com/python/cpython/issues/80510) goto end +if "%1" == "versions" ( + %PYTHON% _tools/generate_release_cycle.py + if errorlevel 1 exit /b 1 + echo. + echo Release cycle data generated. + goto end +) + :end popd endlocal From 8f9c03c62560fe6444a8da3cf52321c7456769e2 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Tue, 29 Nov 2022 11:48:12 +0200 Subject: [PATCH 16/20] Test generating release cycle --- .github/workflows/release-cycle.yml | 34 +++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .github/workflows/release-cycle.yml diff --git a/.github/workflows/release-cycle.yml b/.github/workflows/release-cycle.yml new file mode 100644 index 000000000..62c5962f2 --- /dev/null +++ b/.github/workflows/release-cycle.yml @@ -0,0 +1,34 @@ +name: Test release cycle + +on: [pull_request, push, workflow_dispatch] + +env: + FORCE_COLOR: 1 + +jobs: + test: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [windows-latest, ubuntu-latest] + + steps: + - uses: actions/checkout@v3 + + - name: Silence Windows warnings + run: | + git config core.eol lf + git config core.autocrlf true + + - uses: actions/setup-python@v4 + with: + python-version: "3" + + - name: Generate release cycle output + run: python _tools/generate_release_cycle.py + + - name: Check for differences + run: | + git status --porcelain + test $(git status --porcelain | wc -l) = 0 From 0927c400f6fae74acf1b2cb52270f5626e0d5378 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Tue, 29 Nov 2022 11:51:41 +0200 Subject: [PATCH 17/20] PEP 257 docstrings --- _tools/generate_release_cycle.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/_tools/generate_release_cycle.py b/_tools/generate_release_cycle.py index abb932549..7e9e69ad8 100644 --- a/_tools/generate_release_cycle.py +++ b/_tools/generate_release_cycle.py @@ -1,6 +1,4 @@ -""" -Read in a JSON and generate two CSVs and a Mermaid file -""" +"""Read in a JSON and generate two CSVs and a Mermaid file.""" from __future__ import annotations import csv @@ -28,7 +26,7 @@ def csv_date(date_str: str, now_str: str) -> str: - """Format a date for CSV""" + """Format a date for CSV.""" if date_str > now_str: # Future, add italics return f"*{date_str}*" @@ -36,7 +34,7 @@ def csv_date(date_str: str, now_str: str) -> str: def mermaid_date(date_str: str) -> str: - """Format a date for Mermaid""" + """Format a date for Mermaid.""" if len(date_str) == len("yyyy-mm"): # Mermaid needs a full yyyy-mm-dd, so let's approximate date_str = f"{date_str}-01" @@ -44,7 +42,7 @@ def mermaid_date(date_str: str) -> str: class Versions: - """For converting JSON to CSV and Mermaid""" + """For converting JSON to CSV and Mermaid.""" def __init__(self) -> None: with open("include/release-cycle.json", encoding="UTF-8") as in_file: @@ -56,7 +54,7 @@ def __init__(self) -> None: ) def write_csv(self) -> None: - """Output CSV files""" + """Output CSV files.""" now_str = str(dt.datetime.utcnow()) versions_by_category = {"branches": {}, "end-of-life": {}} @@ -81,7 +79,7 @@ def write_csv(self) -> None: csv_file.writerows(versions.values()) def write_mermaid(self) -> None: - """Output Mermaid file""" + """Output Mermaid file.""" out = [MERMAID_HEADER] for version, details in reversed(self.versions.items()): From d4d01ba20454096fefda4c79991af82365b19e03 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Wed, 30 Nov 2022 08:12:54 +0200 Subject: [PATCH 18/20] Update CI: Windows line-endings, add runtime checks, update Git checks Co-authored-by: C.A.M. Gerlach --- .github/workflows/release-cycle.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release-cycle.yml b/.github/workflows/release-cycle.yml index 62c5962f2..7ab6174af 100644 --- a/.github/workflows/release-cycle.yml +++ b/.github/workflows/release-cycle.yml @@ -19,16 +19,17 @@ jobs: - name: Silence Windows warnings run: | git config core.eol lf - git config core.autocrlf true + git config core.autocrlf input - uses: actions/setup-python@v4 with: python-version: "3" - name: Generate release cycle output - run: python _tools/generate_release_cycle.py + run: python -I -bb -X dev -X warn_default_encoding -W error _tools/generate_release_cycle.py - name: Check for differences run: | - git status --porcelain + git status + git diff test $(git status --porcelain | wc -l) = 0 From a87279dc382c040a828e7a044e52b930b6b9c35f Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Wed, 30 Nov 2022 08:30:38 +0200 Subject: [PATCH 19/20] Set Git config for Windows before checkout --- .github/workflows/release-cycle.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release-cycle.yml b/.github/workflows/release-cycle.yml index 7ab6174af..e554ec2ce 100644 --- a/.github/workflows/release-cycle.yml +++ b/.github/workflows/release-cycle.yml @@ -14,12 +14,12 @@ jobs: os: [windows-latest, ubuntu-latest] steps: - - uses: actions/checkout@v3 - - name: Silence Windows warnings run: | - git config core.eol lf - git config core.autocrlf input + git config --global core.eol lf + git config --global core.autocrlf input + + - uses: actions/checkout@v3 - uses: actions/setup-python@v4 with: From 3f918f0f28580a84a9b07deb8a0d71397451ac62 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Wed, 30 Nov 2022 08:39:58 +0200 Subject: [PATCH 20/20] CI: "git add ." instead of line ending config Co-authored-by: C.A.M. Gerlach --- .github/workflows/release-cycle.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release-cycle.yml b/.github/workflows/release-cycle.yml index e554ec2ce..8b676d78a 100644 --- a/.github/workflows/release-cycle.yml +++ b/.github/workflows/release-cycle.yml @@ -14,11 +14,6 @@ jobs: os: [windows-latest, ubuntu-latest] steps: - - name: Silence Windows warnings - run: | - git config --global core.eol lf - git config --global core.autocrlf input - - uses: actions/checkout@v3 - uses: actions/setup-python@v4 @@ -30,6 +25,7 @@ jobs: - name: Check for differences run: | + git add . git status - git diff + git diff --staged test $(git status --porcelain | wc -l) = 0