|
21 | 21 | """
|
22 | 22 |
|
23 | 23 | from argparse import ArgumentParser
|
| 24 | +from collections.abc import Sequence |
24 | 25 | from contextlib import suppress, contextmanager
|
25 | 26 | from dataclasses import dataclass
|
26 | 27 | import filecmp
|
|
36 | 37 | import subprocess
|
37 | 38 | import sys
|
38 | 39 | from bisect import bisect_left as bisect
|
39 |
| -from collections import OrderedDict |
40 | 40 | from datetime import datetime as dt, timezone
|
41 | 41 | from pathlib import Path
|
42 | 42 | from string import Template
|
@@ -181,9 +181,7 @@ def setup_indexsidebar(self, versions, dest_path):
|
181 | 181 | sidebar_file.write(
|
182 | 182 | sidebar_template.render(
|
183 | 183 | current_version=self,
|
184 |
| - versions=sorted( |
185 |
| - versions, key=lambda v: version_to_tuple(v.name), reverse=True |
186 |
| - ), |
| 184 | + versions=versions[::-1], |
187 | 185 | )
|
188 | 186 | )
|
189 | 187 |
|
@@ -338,12 +336,7 @@ def locate_nearest_version(available_versions, target_version):
|
338 | 336 | '3.7'
|
339 | 337 | """
|
340 | 338 |
|
341 |
| - available_versions_tuples = sorted( |
342 |
| - [ |
343 |
| - version_to_tuple(available_version) |
344 |
| - for available_version in set(available_versions) |
345 |
| - ] |
346 |
| - ) |
| 339 | + available_versions_tuples = sorted(map(version_to_tuple, set(available_versions))) |
347 | 340 | target_version_tuple = version_to_tuple(target_version)
|
348 | 341 | try:
|
349 | 342 | found = available_versions_tuples[
|
@@ -372,44 +365,24 @@ def edit(file: Path):
|
372 | 365 |
|
373 | 366 |
|
374 | 367 | def setup_switchers(
|
375 |
| - versions: Iterable[Version], languages: Iterable[Language], html_root: Path |
| 368 | + versions: Sequence[Version], languages: Sequence[Language], html_root: Path |
376 | 369 | ):
|
377 | 370 | """Setup cross-links between CPython versions:
|
378 | 371 | - Cross-link various languages in a language switcher
|
379 | 372 | - Cross-link various versions in a version switcher
|
380 | 373 | """
|
| 374 | + languages_map = dict(sorted((l.tag, l.name) for l in languages if l.in_prod)) |
| 375 | + versions_map = {v.name: v.picker_label for v in reversed(versions)} |
| 376 | + |
381 | 377 | with open(
|
382 | 378 | HERE / "templates" / "switchers.js", encoding="UTF-8"
|
383 | 379 | ) as switchers_template_file:
|
384 | 380 | template = Template(switchers_template_file.read())
|
385 | 381 | switchers_path = html_root / "_static" / "switchers.js"
|
386 | 382 | switchers_path.write_text(
|
387 | 383 | template.safe_substitute(
|
388 |
| - { |
389 |
| - "LANGUAGES": json.dumps( |
390 |
| - OrderedDict( |
391 |
| - sorted( |
392 |
| - [ |
393 |
| - (language.tag, language.name) |
394 |
| - for language in languages |
395 |
| - if language.in_prod |
396 |
| - ] |
397 |
| - ) |
398 |
| - ) |
399 |
| - ), |
400 |
| - "VERSIONS": json.dumps( |
401 |
| - OrderedDict( |
402 |
| - [ |
403 |
| - (version.name, version.picker_label) |
404 |
| - for version in sorted( |
405 |
| - versions, |
406 |
| - key=lambda v: version_to_tuple(v.name), |
407 |
| - reverse=True, |
408 |
| - ) |
409 |
| - ] |
410 |
| - ) |
411 |
| - ), |
412 |
| - } |
| 384 | + LANGUAGES=json.dumps(languages_map), |
| 385 | + VERSIONS=json.dumps(versions_map), |
413 | 386 | ),
|
414 | 387 | encoding="UTF-8",
|
415 | 388 | )
|
@@ -617,9 +590,9 @@ class DocBuilder:
|
617 | 590 | """Builder for a CPython version and a language."""
|
618 | 591 |
|
619 | 592 | version: Version
|
620 |
| - versions: Iterable[Version] |
| 593 | + versions: Sequence[Version] |
621 | 594 | language: Language
|
622 |
| - languages: Iterable[Language] |
| 595 | + languages: Sequence[Language] |
623 | 596 | cpython_repo: Repository
|
624 | 597 | build_root: Path
|
625 | 598 | www_root: Path
|
@@ -1127,7 +1100,7 @@ def parse_versions_from_devguide(http: urllib3.PoolManager) -> list[Version]:
|
1127 | 1100 | return versions
|
1128 | 1101 |
|
1129 | 1102 |
|
1130 |
| -def parse_languages_from_config(): |
| 1103 | +def parse_languages_from_config() -> list[Language]: |
1131 | 1104 | """Read config.toml to discover languages to build."""
|
1132 | 1105 | config = tomlkit.parse((HERE / "config.toml").read_text(encoding="UTF-8"))
|
1133 | 1106 | languages = []
|
@@ -1166,10 +1139,13 @@ def build_docs(args) -> bool:
|
1166 | 1139 | http = urllib3.PoolManager()
|
1167 | 1140 | versions = parse_versions_from_devguide(http)
|
1168 | 1141 | languages = parse_languages_from_config()
|
| 1142 | + # Reverse languages but not versions, because we take version-language |
| 1143 | + # pairs from the end of the list, effectively reversing it. |
| 1144 | + # This runs languages in config.toml order and versions newest first. |
1169 | 1145 | todo = [
|
1170 | 1146 | (version, language)
|
1171 | 1147 | for version in Version.filter(versions, args.branch)
|
1172 |
| - for language in Language.filter(languages, args.languages) |
| 1148 | + for language in reversed(Language.filter(languages, args.languages)) |
1173 | 1149 | ]
|
1174 | 1150 | del args.branch
|
1175 | 1151 | del args.languages
|
|
0 commit comments