3232"""
3333
3434from bisect import bisect_left as bisect
35- from collections import namedtuple
35+ from collections import namedtuple , OrderedDict
3636from contextlib import contextmanager , suppress
3737import filecmp
3838import json
@@ -197,6 +197,14 @@ def git_clone(repository, directory, branch=None):
197197 shell_out (["git" , "-C" , directory , "checkout" , branch ])
198198
199199
200+ def version_to_tuple (version ):
201+ return tuple (int (part ) for part in version .split ("." ))
202+
203+
204+ def tuple_to_version (version_tuple ):
205+ return "." .join (str (part ) for part in version_tuple )
206+
207+
200208def locate_nearest_version (available_versions , target_version ):
201209 """Look for the nearest version of target_version in available_versions.
202210 Versions are to be given as tuples, like (3, 7) for 3.7.
@@ -213,12 +221,6 @@ def locate_nearest_version(available_versions, target_version):
213221 '3.7'
214222 """
215223
216- def version_to_tuple (version ):
217- return tuple (int (part ) for part in version .split ("." ))
218-
219- def tuple_to_version (version_tuple ):
220- return "." .join (str (part ) for part in version_tuple )
221-
222224 available_versions_tuples = sorted (
223225 [
224226 version_to_tuple (available_version )
@@ -267,6 +269,14 @@ def edit(file):
267269 os .rename (temporary , file )
268270
269271
272+ def picker_label (version ):
273+ if version .status == "in development" :
274+ return "dev ({})" .format (version .name )
275+ if version .status == "pre-release" :
276+ return "pre ({})" .format (version .name )
277+ return version .name
278+
279+
270280def setup_switchers (html_root ):
271281 """Setup cross-links between cpython versions:
272282 - Cross-link various languages in a language switcher
@@ -281,18 +291,36 @@ def setup_switchers(html_root):
281291 template .safe_substitute (
282292 {
283293 "LANGUAGES" : json .dumps (
284- {
285- language .tag : language .name
286- for language in LANGUAGES
287- if language .in_prod
288- }
289- )
294+ OrderedDict (
295+ sorted (
296+ [
297+ (language .tag , language .name )
298+ for language in LANGUAGES
299+ if language .in_prod
300+ ]
301+ )
302+ )
303+ ),
304+ "VERSIONS" : json .dumps (
305+ OrderedDict (
306+ [
307+ (version .name , picker_label (version ))
308+ for version in sorted (
309+ VERSIONS ,
310+ key = lambda v : version_to_tuple (v .name ),
311+ reverse = True ,
312+ )
313+ ]
314+ )
315+ ),
290316 }
291317 )
292318 )
293319 for file in Path (html_root ).glob ("**/*.html" ):
294320 depth = len (file .relative_to (html_root ).parts ) - 1
295- script = f""" <script type="text/javascript" src="{ '../' * depth } _static/switchers.js"></script>\n """
321+ script = """ <script type="text/javascript" src="{}_static/switchers.js"></script>\n """ .format (
322+ "../" * depth
323+ )
296324 with edit (file ) as (i , o ):
297325 for line in i :
298326 if line == script :
@@ -385,13 +413,13 @@ def copy_build_to_webroot(
385413 """Copy a given build to the appropriate webroot with appropriate rights.
386414 """
387415 logging .info (
388- "Publishing start for version: %s, language: %s" , version , language .tag
416+ "Publishing start for version: %s, language: %s" , version . name , language .tag
389417 )
390418 checkout = os .path .join (
391- build_root , version , "cpython-{lang}" .format (lang = language .tag )
419+ build_root , version . name , "cpython-{lang}" .format (lang = language .tag )
392420 )
393421 if language .tag == "en" :
394- target = os .path .join (www_root , version )
422+ target = os .path .join (www_root , version . name )
395423 else :
396424 language_dir = os .path .join (www_root , language .tag )
397425 os .makedirs (language_dir , exist_ok = True )
@@ -400,7 +428,7 @@ def copy_build_to_webroot(
400428 except subprocess .CalledProcessError as err :
401429 logging .warning ("Can't change group of %s: %s" , language_dir , str (err ))
402430 os .chmod (language_dir , 0o775 )
403- target = os .path .join (language_dir , version )
431+ target = os .path .join (language_dir , version . name )
404432
405433 os .makedirs (target , exist_ok = True )
406434 try :
@@ -475,7 +503,9 @@ def copy_build_to_webroot(
475503 shell_out (
476504 ["curl" , "-XPURGE" , "https://docs.python.org/{%s}" % "," .join (to_purge )]
477505 )
478- logging .info ("Publishing done for version: %s, language: %s" , version , language .tag )
506+ logging .info (
507+ "Publishing done for version: %s, language: %s" , version .name , language .tag
508+ )
479509
480510
481511def head (lines , n = 10 ):
@@ -491,7 +521,7 @@ def version_info():
491521 subprocess .check_output (["xelatex" , "--version" ], universal_newlines = True ), n = 2
492522 )
493523 print (
494- f """build_docs: { VERSION }
524+ """build_docs: {VERSION}
495525
496526# platex
497527
@@ -501,7 +531,11 @@ def version_info():
501531# xelatex
502532
503533{xelatex_version}
504- """
534+ """ .format (
535+ VERSION = VERSION ,
536+ platex_version = platex_version ,
537+ xelatex_version = xelatex_version ,
538+ )
505539 )
506540
507541
0 commit comments