10
10
11
11
-q selects "quick build", which means to build only HTML.
12
12
13
- Translations are fetched from github repositories according to PEP
14
- 545. `--languages` allows to select translations, like `--languages
15
- en` to just build the english documents.
13
+ Translations are fetched from GitHub repositories according to PEP
14
+ 545. `--languages` allows selecting translations, like `--languages
15
+ en` to just build the English documents.
16
16
17
- This script was originally created and by Georg Brandl in March
18
- 2010.
17
+ This script was originally created by Georg Brandl in March 2010.
19
18
Modified by Benjamin Peterson to do CDN cache invalidation.
20
19
Modified by Julien Palard to build translations.
21
20
68
67
69
68
@total_ordering
70
69
class Version :
71
- """Represents a cpython version and its documentation builds dependencies."""
70
+ """Represents a CPython version and its documentation build dependencies."""
72
71
73
72
STATUSES = {"EOL" , "security-fixes" , "stable" , "pre-release" , "in development" }
74
73
@@ -146,7 +145,7 @@ def filter(versions, branch=None):
146
145
147
146
If *branch* is given, only *versions* matching *branch* are returned.
148
147
149
- Else all live version are returned (this mean no EOL and no
148
+ Else all live versions are returned (this means no EOL and no
150
149
security-fixes branches).
151
150
"""
152
151
if branch :
@@ -155,12 +154,12 @@ def filter(versions, branch=None):
155
154
156
155
@staticmethod
157
156
def current_stable (versions ):
158
- """Find the current stable cPython version."""
157
+ """Find the current stable CPython version."""
159
158
return max ((v for v in versions if v .status == "stable" ), key = Version .as_tuple )
160
159
161
160
@staticmethod
162
161
def current_dev (versions ):
163
- """Find the current de cPython version."""
162
+ """Find the current CPython version in development ."""
164
163
return max (versions , key = Version .as_tuple )
165
164
166
165
@property
@@ -359,7 +358,7 @@ def locate_nearest_version(available_versions, target_version):
359
358
def edit (file : Path ):
360
359
"""Context manager to edit a file "in place", use it as:
361
360
362
- with edit("/etc/hosts") as i, o:
361
+ with edit("/etc/hosts") as ( i, o) :
363
362
for line in i:
364
363
o.write(line.replace("localhoat", "localhost"))
365
364
"""
@@ -375,7 +374,7 @@ def edit(file: Path):
375
374
def setup_switchers (
376
375
versions : Iterable [Version ], languages : Iterable [Language ], html_root : Path
377
376
):
378
- """Setup cross-links between cpython versions:
377
+ """Setup cross-links between CPython versions:
379
378
- Cross-link various languages in a language switcher
380
379
- Cross-link various versions in a version switcher
381
380
"""
@@ -437,7 +436,7 @@ def build_robots_txt(
437
436
) -> None :
438
437
"""Disallow crawl of EOL versions in robots.txt."""
439
438
if not www_root .exists ():
440
- logging .info ("Skipping robots.txt generation (www root does not even exists )." )
439
+ logging .info ("Skipping robots.txt generation (www root does not even exist )." )
441
440
return
442
441
robots_file = www_root / "robots.txt"
443
442
with open (HERE / "templates" / "robots.txt" , encoding = "UTF-8" ) as template_file :
@@ -457,7 +456,7 @@ def build_sitemap(
457
456
):
458
457
"""Build a sitemap with all live versions and translations."""
459
458
if not www_root .exists ():
460
- logging .info ("Skipping sitemap generation (www root does not even exists )." )
459
+ logging .info ("Skipping sitemap generation (www root does not even exist )." )
461
460
return
462
461
with open (HERE / "templates" / "sitemap.xml" , encoding = "UTF-8" ) as template_file :
463
462
template = jinja2 .Template (template_file .read ())
@@ -472,7 +471,7 @@ def build_sitemap(
472
471
def build_404 (www_root : Path , group ):
473
472
"""Build a nice 404 error page to display in case PDFs are not built yet."""
474
473
if not www_root .exists ():
475
- logging .info ("Skipping 404 page generation (www root does not even exists )." )
474
+ logging .info ("Skipping 404 page generation (www root does not even exist )." )
476
475
return
477
476
not_found_file = www_root / "404.html"
478
477
shutil .copyfile (HERE / "templates" / "404.html" , not_found_file )
@@ -550,7 +549,7 @@ def parse_args():
550
549
)
551
550
parser .add_argument (
552
551
"--skip-cache-invalidation" ,
553
- help = "Skip fastly cache invalidation." ,
552
+ help = "Skip Fastly cache invalidation." ,
554
553
action = "store_true" ,
555
554
)
556
555
parser .add_argument (
@@ -580,7 +579,7 @@ def parse_args():
580
579
parser .add_argument (
581
580
"--theme" ,
582
581
default = "python-docs-theme" ,
583
- help = "Python package to use for python-docs-theme: Usefull to test branches:"
582
+ help = "Python package to use for python-docs-theme: Useful to test branches:"
584
583
" --theme git+https://github.com/obulat/python-docs-theme@master" ,
585
584
)
586
585
args = parser .parse_args ()
@@ -598,7 +597,7 @@ def parse_args():
598
597
599
598
600
599
def setup_logging (log_directory : Path ):
601
- """Setup logging to stderr if ran by a human, or to a file if ran from a cron."""
600
+ """Setup logging to stderr if run by a human, or to a file if run from a cron."""
602
601
if sys .stderr .isatty ():
603
602
logging .basicConfig (
604
603
format = "%(asctime)s %(levelname)s: %(message)s" , stream = sys .stderr
@@ -615,7 +614,7 @@ def setup_logging(log_directory: Path):
615
614
616
615
@dataclass
617
616
class DocBuilder :
618
- """Builder for a cpython version and a language."""
617
+ """Builder for a CPython version and a language."""
619
618
620
619
version : Version
621
620
versions : Iterable [Version ]
@@ -634,7 +633,7 @@ class DocBuilder:
634
633
def full_build (self ):
635
634
"""Tell if a full build is needed.
636
635
637
- A full build is slow, it builds pdf, txt, epub, texinfo, and
636
+ A full build is slow; it builds pdf, txt, epub, texinfo, and
638
637
archives everything.
639
638
640
639
A partial build only builds HTML and does not archive, it's
@@ -664,7 +663,7 @@ def run(self, http: urllib3.PoolManager) -> bool:
664
663
665
664
@property
666
665
def checkout (self ) -> Path :
667
- """Path to cpython git clone."""
666
+ """Path to CPython git clone."""
668
667
return self .build_root / "cpython"
669
668
670
669
def clone_translation (self ):
@@ -687,7 +686,7 @@ def translation_repo(self):
687
686
688
687
@property
689
688
def translation_branch (self ):
690
- """Some cpython versions may be untranslated, being either too old or
689
+ """Some CPython versions may be untranslated, being either too old or
691
690
too new.
692
691
693
692
This function looks for remote branches on the given repo, and
@@ -745,7 +744,7 @@ def build(self):
745
744
python = self .venv / "bin" / "python"
746
745
sphinxbuild = self .venv / "bin" / "sphinx-build"
747
746
blurb = self .venv / "bin" / "blurb"
748
- # Disable cpython switchers, we handle them now:
747
+ # Disable CPython switchers, we handle them now:
749
748
750
749
def is_mac ():
751
750
return platform .system () == 'Darwin'
@@ -790,6 +789,7 @@ def build_venv(self):
790
789
run ([sys .executable , "-m" , "venv" , venv_path ])
791
790
run (
792
791
[venv_path / "bin" / "python" , "-m" , "pip" , "install" , "--upgrade" ]
792
+ + ["--upgrade-strategy=eager" ]
793
793
+ [self .theme ]
794
794
+ self .version .requirements ,
795
795
cwd = self .checkout / "Doc" ,
@@ -955,7 +955,7 @@ def load_state(self) -> dict:
955
955
return {}
956
956
957
957
def save_state (self , build_duration : float ):
958
- """Save current cpython sha1 and current translation sha1.
958
+ """Save current CPython sha1 and current translation sha1.
959
959
960
960
Using this we can deduce if a rebuild is needed or not.
961
961
"""
@@ -987,7 +987,7 @@ def symlink(
987
987
http : urllib3 .PoolManager ,
988
988
) -> None :
989
989
"""Used by major_symlinks and dev_symlink to maintain symlinks."""
990
- if language .tag == "en" : # english is rooted on /, no /en/
990
+ if language .tag == "en" : # English is rooted on /, no /en/
991
991
path = www_root
992
992
else :
993
993
path = www_root / language .tag
@@ -1013,7 +1013,7 @@ def major_symlinks(
1013
1013
skip_cache_invalidation : bool ,
1014
1014
http : urllib3 .PoolManager ,
1015
1015
) -> None :
1016
- """Maintains the /2/ and /3/ symlinks for each languages .
1016
+ """Maintains the /2/ and /3/ symlinks for each language .
1017
1017
1018
1018
Like:
1019
1019
- /3/ → /3.9/
@@ -1042,7 +1042,7 @@ def dev_symlink(
1042
1042
skip_cache_invalidation : bool ,
1043
1043
http : urllib3 .PoolManager ,
1044
1044
) -> None :
1045
- """Maintains the /dev/ symlinks for each languages .
1045
+ """Maintains the /dev/ symlinks for each language .
1046
1046
1047
1047
Like:
1048
1048
- /dev/ → /3.11/
@@ -1065,7 +1065,7 @@ def dev_symlink(
1065
1065
def purge (http : urllib3 .PoolManager , * paths : Path | str ) -> None :
1066
1066
"""Remove one or many paths from docs.python.org's CDN.
1067
1067
1068
- To be used when a file change , so the CDN fetch the new one.
1068
+ To be used when a file changes , so the CDN fetches the new one.
1069
1069
"""
1070
1070
base = "https://docs.python.org/"
1071
1071
for path in paths :
@@ -1077,7 +1077,7 @@ def purge(http: urllib3.PoolManager, *paths: Path | str) -> None:
1077
1077
def purge_path (http : urllib3 .PoolManager , www_root : Path , path : Path ) -> None :
1078
1078
"""Recursively remove a path from docs.python.org's CDN.
1079
1079
1080
- To be used when a directory change , so the CDN fetch the new one.
1080
+ To be used when a directory changes , so the CDN fetches the new one.
1081
1081
"""
1082
1082
purge (http , * [file .relative_to (www_root ) for file in path .glob ("**/*" )])
1083
1083
purge (http , path .relative_to (www_root ))
@@ -1118,7 +1118,9 @@ def parse_versions_from_devguide(http: urllib3.PoolManager) -> list[Version]:
1118
1118
"python/devguide/main/include/release-cycle.json" ,
1119
1119
timeout = 30 ,
1120
1120
).json ()
1121
- return [Version .from_json (name , release ) for name , release in releases .items ()]
1121
+ versions = [Version .from_json (name , release ) for name , release in releases .items ()]
1122
+ versions .sort (key = Version .as_tuple )
1123
+ return versions
1122
1124
1123
1125
1124
1126
def parse_languages_from_config ():
@@ -1164,9 +1166,9 @@ def build_docs(args) -> bool:
1164
1166
)
1165
1167
)
1166
1168
if sentry_sdk :
1167
- with sentry_sdk .configure_scope () as scope :
1168
- scope .set_tag ("version" , version .name )
1169
- scope .set_tag ("language" , language .tag )
1169
+ scope = sentry_sdk .get_isolation_scope ()
1170
+ scope .set_tag ("version" , version .name )
1171
+ scope .set_tag ("language" , language .tag )
1170
1172
builder = DocBuilder (
1171
1173
version , versions , language , languages , cpython_repo , ** vars (args )
1172
1174
)
0 commit comments