2626 "end-of-life" : "crit," ,
2727}
2828
29- CSV_HEADER = (
30- "Branch" ,
31- "Schedule" ,
32- "Status" ,
33- "First release" ,
34- "End of life" ,
35- "Release manager" ,
36- )
37-
38-
39- def pep (number : int ) -> str :
40- """Format PEP number with Sphinx role"""
41- return f":pep:`{ number } `"
42-
4329
4430def csv_date (date_str : str , now_str : str ) -> str :
4531 """Format a date for CSV"""
@@ -63,48 +49,36 @@ class Versions:
6349 def __init__ (self ) -> None :
6450 with open ("include/release-cycle.json" ) as f :
6551 self .versions = json .load (f )
52+ self .sorted_versions = sorted (
53+ self .versions .items (),
54+ key = lambda k : [int (i ) for i in k .split ("." )],
55+ reverse = True ,
56+ )
6657
6758 def save_csv (self ) -> None :
6859 """Output CSV files"""
6960 now_str = str (dt .datetime .utcnow ())
7061
71- with (
72- open (
73- "include/branches.csv" , "w" , encoding = "UTF-8" , newline = ""
74- ) as file_branches ,
75- open (
76- "include/end-of-life.csv" , "w" , encoding = "UTF-8" , newline = ""
77- ) as file_eol ,
78- ):
79- csv_branches = csv .writer (
80- file_branches , quoting = csv .QUOTE_MINIMAL , lineterminator = "\n "
81- )
82- csv_eol = csv .writer (
83- file_eol , quoting = csv .QUOTE_MINIMAL , lineterminator = "\n "
84- )
85-
86- csv_branches .writerow (CSV_HEADER )
87- csv_eol .writerow (CSV_HEADER )
88-
89- sorted_versions = sorted (
90- self .versions .items (),
91- key = lambda k : int (k [0 ].replace ("." , "" )),
92- reverse = True ,
93- )
94- for version , details in sorted_versions :
95- row = (
96- details ["branch" ],
97- pep (details ["pep" ]),
98- details ["status" ],
99- csv_date (details ["release_date" ], now_str ),
100- csv_date (details ["eol" ], now_str ),
101- details ["release_manager" ],
62+ versions_bycategory = {"branches" : {}, "end-of-life" : {}}
63+ for version , details in self .sorted_versions .items ():
64+ row = {
65+ "Branch" : details ["branch" ],
66+ "Schedule" : f":pep:`{ details ['pep' ]} `" ,
67+ "Status" : details ["status" ],
68+ "First release" : csv_date (details ["release_date" ], now_str ),
69+ "End of life" : csv_date (details ["eol" ], now_str ),
70+ "Release manager" : details ["release_manager" ],
71+ }
72+ cat = "end-of-life" if details ["status" ] == "end-of-life" else "branches"
73+ versions_bycategory [cat ][version ] = row
74+
75+ for cat , versions in versions_bycategory .items ():
76+ with open (f"include/{ cat } .csv" , "w" , encoding = "UTF-8" , newline = "" ) as file :
77+ csv_file = csv .DictWriter (
78+ file , fieldnames = versions .keys (), lineterminator = "\n "
10279 )
103-
104- if details ["status" ] == "end-of-life" :
105- csv_eol .writerow (row )
106- else :
107- csv_branches .writerow (row )
80+ csv_file .writeheader ()
81+ row = csv_file .writerows (versions .values ())
10882
10983 def save_mermaid (self ) -> None :
11084 """Output Mermaid file"""
0 commit comments