1010
1111-q selects "quick build", which means to build only HTML.
1212
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.
1616
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.
1918Modified by Benjamin Peterson to do CDN cache invalidation.
2019Modified by Julien Palard to build translations.
2120
6968
7069@total_ordering
7170class Version :
72- """Represents a cpython version and its documentation builds dependencies."""
71+ """Represents a CPython version and its documentation build dependencies."""
7372
7473 STATUSES = {"EOL" , "security-fixes" , "stable" , "pre-release" , "in development" }
7574
@@ -147,7 +146,7 @@ def filter(versions, branch=None):
147146
148147 If *branch* is given, only *versions* matching *branch* are returned.
149148
150- Else all live version are returned (this mean no EOL and no
149+ Else all live versions are returned (this means no EOL and no
151150 security-fixes branches).
152151 """
153152 if branch :
@@ -156,12 +155,12 @@ def filter(versions, branch=None):
156155
157156 @staticmethod
158157 def current_stable (versions ):
159- """Find the current stable cPython version."""
158+ """Find the current stable CPython version."""
160159 return max ((v for v in versions if v .status == "stable" ), key = Version .as_tuple )
161160
162161 @staticmethod
163162 def current_dev (versions ):
164- """Find the current de cPython version."""
163+ """Find the current CPython version in development ."""
165164 return max (versions , key = Version .as_tuple )
166165
167166 @property
@@ -360,7 +359,7 @@ def locate_nearest_version(available_versions, target_version):
360359def edit (file : Path ):
361360 """Context manager to edit a file "in place", use it as:
362361
363- with edit("/etc/hosts") as i, o:
362+ with edit("/etc/hosts") as ( i, o) :
364363 for line in i:
365364 o.write(line.replace("localhoat", "localhost"))
366365 """
@@ -376,7 +375,7 @@ def edit(file: Path):
376375def setup_switchers (
377376 versions : Iterable [Version ], languages : Iterable [Language ], html_root : Path
378377):
379- """Setup cross-links between cpython versions:
378+ """Setup cross-links between CPython versions:
380379 - Cross-link various languages in a language switcher
381380 - Cross-link various versions in a version switcher
382381 """
@@ -437,7 +436,7 @@ def build_robots_txt(
437436):
438437 """Disallow crawl of EOL versions in robots.txt."""
439438 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 )." )
441440 return
442441 robots_file = www_root / "robots.txt"
443442 with open (HERE / "templates" / "robots.txt" , encoding = "UTF-8" ) as template_file :
@@ -457,7 +456,7 @@ def build_sitemap(
457456):
458457 """Build a sitemap with all live versions and translations."""
459458 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 )." )
461460 return
462461 with open (HERE / "templates" / "sitemap.xml" , encoding = "UTF-8" ) as template_file :
463462 template = jinja2 .Template (template_file .read ())
@@ -472,7 +471,7 @@ def build_sitemap(
472471def build_404 (www_root : Path , group ):
473472 """Build a nice 404 error page to display in case PDFs are not built yet."""
474473 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 )." )
476475 return
477476 not_found_file = www_root / "404.html"
478477 shutil .copyfile (HERE / "templates" / "404.html" , not_found_file )
@@ -550,7 +549,7 @@ def parse_args():
550549 )
551550 parser .add_argument (
552551 "--skip-cache-invalidation" ,
553- help = "Skip fastly cache invalidation." ,
552+ help = "Skip Fastly cache invalidation." ,
554553 action = "store_true" ,
555554 )
556555 parser .add_argument (
@@ -580,7 +579,7 @@ def parse_args():
580579 parser .add_argument (
581580 "--theme" ,
582581 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:"
584583 " --theme git+https://github.com/obulat/python-docs-theme@master" ,
585584 )
586585 args = parser .parse_args ()
@@ -598,7 +597,7 @@ def parse_args():
598597
599598
600599def 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."""
602601 if sys .stderr .isatty ():
603602 logging .basicConfig (
604603 format = "%(asctime)s %(levelname)s: %(message)s" , stream = sys .stderr
@@ -615,7 +614,7 @@ def setup_logging(log_directory: Path):
615614
616615@dataclass
617616class DocBuilder :
618- """Builder for a cpython version and a language."""
617+ """Builder for a CPython version and a language."""
619618
620619 version : Version
621620 versions : Iterable [Version ]
@@ -634,7 +633,7 @@ class DocBuilder:
634633 def full_build (self ):
635634 """Tell if a full build is needed.
636635
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
638637 archives everything.
639638
640639 A partial build only builds HTML and does not archive, it's
@@ -664,7 +663,7 @@ def run(self) -> bool:
664663
665664 @property
666665 def checkout (self ) -> Path :
667- """Path to cpython git clone."""
666+ """Path to CPython git clone."""
668667 return self .build_root / "cpython"
669668
670669 def clone_translation (self ):
@@ -687,7 +686,7 @@ def translation_repo(self):
687686
688687 @property
689688 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
691690 too new.
692691
693692 This function looks for remote branches on the given repo, and
@@ -745,7 +744,7 @@ def build(self):
745744 python = self .venv / "bin" / "python"
746745 sphinxbuild = self .venv / "bin" / "sphinx-build"
747746 blurb = self .venv / "bin" / "blurb"
748- # Disable cpython switchers, we handle them now:
747+ # Disable CPython switchers, we handle them now:
749748
750749 def is_mac ():
751750 return platform .system () == 'Darwin'
@@ -790,6 +789,7 @@ def build_venv(self):
790789 run ([sys .executable , "-m" , "venv" , venv_path ])
791790 run (
792791 [venv_path / "bin" / "python" , "-m" , "pip" , "install" , "--upgrade" ]
792+ + ["--upgrade-strategy=eager" ]
793793 + [self .theme ]
794794 + self .version .requirements ,
795795 cwd = self .checkout / "Doc" ,
@@ -955,7 +955,7 @@ def load_state(self) -> dict:
955955 return {}
956956
957957 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.
959959
960960 Using this we can deduce if a rebuild is needed or not.
961961 """
@@ -979,7 +979,7 @@ def save_state(self, build_duration: float):
979979
980980def symlink (www_root : Path , language : Language , directory : str , name : str , group : str , skip_cache_invalidation : bool ):
981981 """Used by major_symlinks and dev_symlink to maintain symlinks."""
982- if language .tag == "en" : # english is rooted on /, no /en/
982+ if language .tag == "en" : # English is rooted on /, no /en/
983983 path = www_root
984984 else :
985985 path = www_root / language .tag
@@ -1000,7 +1000,7 @@ def symlink(www_root: Path, language: Language, directory: str, name: str, group
10001000def major_symlinks (
10011001 www_root : Path , group , versions : Iterable [Version ], languages : Iterable [Language ], skip_cache_invalidation : bool
10021002):
1003- """Maintains the /2/ and /3/ symlinks for each languages .
1003+ """Maintains the /2/ and /3/ symlinks for each language .
10041004
10051005 Like:
10061006 - /3/ → /3.9/
@@ -1014,7 +1014,7 @@ def major_symlinks(
10141014
10151015
10161016def dev_symlink (www_root : Path , group , versions , languages , skip_cache_invalidation : bool ):
1017- """Maintains the /dev/ symlinks for each languages .
1017+ """Maintains the /dev/ symlinks for each language .
10181018
10191019 Like:
10201020 - /dev/ → /3.11/
@@ -1029,7 +1029,7 @@ def dev_symlink(www_root: Path, group, versions, languages, skip_cache_invalidat
10291029def purge (* paths ):
10301030 """Remove one or many paths from docs.python.org's CDN.
10311031
1032- To be used when a file change , so the CDN fetch the new one.
1032+ To be used when a file changes , so the CDN fetches the new one.
10331033 """
10341034 base = "https://docs.python.org/"
10351035 for path in paths :
@@ -1041,7 +1041,7 @@ def purge(*paths):
10411041def purge_path (www_root : Path , path : Path ):
10421042 """Recursively remove a path from docs.python.org's CDN.
10431043
1044- To be used when a directory change , so the CDN fetch the new one.
1044+ To be used when a directory changes , so the CDN fetches the new one.
10451045 """
10461046 purge (* [file .relative_to (www_root ) for file in path .glob ("**/*" )])
10471047 purge (path .relative_to (www_root ))
@@ -1103,7 +1103,7 @@ def parse_languages_from_config():
11031103
11041104
11051105def build_docs (args ) -> bool :
1106- """Build all docs (each languages and each versions )."""
1106+ """Build all docs (each language and each version )."""
11071107 versions = parse_versions_from_devguide ()
11081108 languages = parse_languages_from_config ()
11091109 todo = [
@@ -1125,10 +1125,10 @@ def build_docs(args) -> bool:
11251125 )
11261126 )
11271127 if sentry_sdk :
1128- with sentry_sdk .configure_scope () as scope :
1129- scope .set_tag ("version" , version .name )
1130- scope .set_tag ("language" , language .tag )
1131- cpython_repo .update ()
1128+ scope = sentry_sdk .get_isolation_scope ()
1129+ scope .set_tag ("version" , version .name )
1130+ scope .set_tag ("language" , language .tag )
1131+ cpython_repo .update ()
11321132 builder = DocBuilder (
11331133 version , versions , language , languages , cpython_repo , ** vars (args )
11341134 )
0 commit comments