@@ -143,16 +143,6 @@ def current_dev(self) -> Version:
143
143
"""Find the current CPython version in development."""
144
144
return max (self , key = Version .as_tuple )
145
145
146
- def setup_indexsidebar (self , current : Version , dest_path : Path ) -> None :
147
- """Build indexsidebar.html for Sphinx."""
148
- template_path = HERE / "templates" / "indexsidebar.html"
149
- template = jinja2 .Template (template_path .read_text (encoding = "UTF-8" ))
150
- rendered_template = template .render (
151
- current_version = current ,
152
- versions = list (reversed (self )),
153
- )
154
- dest_path .write_text (rendered_template , encoding = "UTF-8" )
155
-
156
146
157
147
@dataclasses .dataclass (frozen = True , kw_only = True , slots = True )
158
148
class Version :
@@ -529,9 +519,9 @@ class DocBuilder:
529
519
"""Builder for a CPython version and a language."""
530
520
531
521
version : Version
532
- versions : Versions
533
522
language : Language
534
523
cpython_repo : Repository
524
+ indexsidebar_content : bytes
535
525
switchers_content : bytes
536
526
build_root : Path
537
527
www_root : Path
@@ -667,10 +657,8 @@ def build(self) -> None:
667
657
text = text .replace (" -A switchers=1" , "" )
668
658
(self .checkout / "Doc" / "Makefile" ).write_text (text , encoding = "utf-8" )
669
659
670
- self .versions .setup_indexsidebar (
671
- self .version ,
672
- self .checkout / "Doc" / "tools" / "templates" / "indexsidebar.html" ,
673
- )
660
+ indexsidebar_path = self .checkout / "Doc/tools/templates/indexsidebar.html"
661
+ indexsidebar_path .write_bytes (self .indexsidebar_content )
674
662
run_with_logging ([
675
663
"make" ,
676
664
"-C" ,
@@ -1099,6 +1087,7 @@ def build_docs(args: argparse.Namespace) -> int:
1099
1087
force_build = args .force
1100
1088
del args .force
1101
1089
1090
+ isb_content , eol_isb_content = render_indexsidebar (versions )
1102
1091
switchers_content = render_switchers (versions , languages )
1103
1092
1104
1093
build_succeeded = set ()
@@ -1118,12 +1107,14 @@ def build_docs(args: argparse.Namespace) -> int:
1118
1107
scope = sentry_sdk .get_isolation_scope ()
1119
1108
scope .set_tag ("version" , version .name )
1120
1109
scope .set_tag ("language" , language .tag )
1121
- cpython_repo .update ()
1110
+ cpython_repo .update ()
1111
+ v_isb_content = isb_content if version .status != "EOL" else eol_isb_content
1122
1112
builder = DocBuilder (
1123
1113
version ,
1124
1114
versions ,
1125
1115
language ,
1126
1116
cpython_repo ,
1117
+ v_isb_content ,
1127
1118
switchers_content ,
1128
1119
** vars (args ),
1129
1120
)
@@ -1179,6 +1170,23 @@ def parse_languages_from_config() -> Languages:
1179
1170
return Languages .from_json (config ["defaults" ], config ["languages" ])
1180
1171
1181
1172
1173
+ def render_indexsidebar (versions : Versions ) -> tuple [bytes , bytes ]:
1174
+ """Pre-render indexsidebar.html for Sphinx."""
1175
+ docs_by_version = f"""\
1176
+ <h3>{{% trans %}}Docs by version{{% endtrans %}}</h3>
1177
+ <ul>
1178
+ { "\n " .join ([f' <li><a href="{ v .url } ">{ v .title } </a></li>' for v in reversed (versions )])}
1179
+ <li><a href="https://www.python.org/doc/versions/">{{% trans %}}All versions{{% endtrans %}}</a></li>
1180
+ </ul>
1181
+ """
1182
+
1183
+ template_path = HERE / "templates" / "indexsidebar.html"
1184
+ template = Template (template_path .read_text (encoding = "UTF-8" ))
1185
+ rendered_template = template .substitute (DOCS_BY_VERSION = docs_by_version ).encode ()
1186
+ eol_template = template .substitute (DOCS_BY_VERSION = "" ).encode ()
1187
+ return rendered_template , eol_template
1188
+
1189
+
1182
1190
def render_switchers (versions : Versions , languages : Languages ) -> bytes :
1183
1191
language_pairs = sorted ((l .tag , l .switcher_label ) for l in languages if l .in_prod ) # NoQA: E741
1184
1192
version_pairs = [(v .name , v .picker_label ) for v in reversed (versions )]
0 commit comments