46
46
from typing import Iterable
47
47
from urllib .parse import urljoin
48
48
49
- import zc .lockfile
50
49
import jinja2
51
- import requests
52
50
import tomlkit
53
-
51
+ import urllib3
52
+ import zc .lockfile
54
53
55
54
try :
56
55
from os import EX_OK , EX_SOFTWARE as EX_FAILURE
@@ -434,7 +433,7 @@ def build_robots_txt(
434
433
www_root : Path ,
435
434
group ,
436
435
skip_cache_invalidation ,
437
- session : requests . Session ,
436
+ http : urllib3 . PoolManager ,
438
437
) -> None :
439
438
"""Disallow crawl of EOL versions in robots.txt."""
440
439
if not www_root .exists ():
@@ -450,7 +449,7 @@ def build_robots_txt(
450
449
robots_file .chmod (0o775 )
451
450
run (["chgrp" , group , robots_file ])
452
451
if not skip_cache_invalidation :
453
- purge (session , "robots.txt" )
452
+ purge (http , "robots.txt" )
454
453
455
454
456
455
def build_sitemap (
@@ -643,7 +642,7 @@ def full_build(self):
643
642
"""
644
643
return not self .quick and not self .language .html_only
645
644
646
- def run (self , session : requests . Session ) -> bool :
645
+ def run (self , http : urllib3 . PoolManager ) -> bool :
647
646
"""Build and publish a Python doc, for a language, and a version."""
648
647
start_time = perf_counter ()
649
648
logging .info ("Running." )
@@ -654,7 +653,7 @@ def run(self, session: requests.Session) -> bool:
654
653
if self .should_rebuild ():
655
654
self .build_venv ()
656
655
self .build ()
657
- self .copy_build_to_webroot (session )
656
+ self .copy_build_to_webroot (http )
658
657
self .save_state (build_duration = perf_counter () - start_time )
659
658
except Exception as err :
660
659
logging .exception ("Badly handled exception, human, please help." )
@@ -798,7 +797,7 @@ def build_venv(self):
798
797
run ([venv_path / "bin" / "python" , "-m" , "pip" , "freeze" , "--all" ])
799
798
self .venv = venv_path
800
799
801
- def copy_build_to_webroot (self , session : requests . Session ) -> None :
800
+ def copy_build_to_webroot (self , http : urllib3 . PoolManager ) -> None :
802
801
"""Copy a given build to the appropriate webroot with appropriate rights."""
803
802
logging .info ("Publishing start." )
804
803
self .www_root .mkdir (parents = True , exist_ok = True )
@@ -910,9 +909,9 @@ def copy_build_to_webroot(self, session: requests.Session) -> None:
910
909
prefixes = run (["find" , "-L" , targets_dir , "-samefile" , target ]).stdout
911
910
prefixes = prefixes .replace (targets_dir + "/" , "" )
912
911
prefixes = [prefix + "/" for prefix in prefixes .split ("\n " ) if prefix ]
913
- purge (session , * prefixes )
912
+ purge (http , * prefixes )
914
913
for prefix in prefixes :
915
- purge (session , * [prefix + p for p in changed ])
914
+ purge (http , * [prefix + p for p in changed ])
916
915
logging .info ("Publishing done" )
917
916
918
917
def should_rebuild (self ):
@@ -985,7 +984,7 @@ def symlink(
985
984
name : str ,
986
985
group : str ,
987
986
skip_cache_invalidation : bool ,
988
- session : requests . Session ,
987
+ http : urllib3 . PoolManager ,
989
988
) -> None :
990
989
"""Used by major_symlinks and dev_symlink to maintain symlinks."""
991
990
if language .tag == "en" : # english is rooted on /, no /en/
@@ -1003,7 +1002,7 @@ def symlink(
1003
1002
link .symlink_to (directory )
1004
1003
run (["chown" , "-h" , ":" + group , str (link )])
1005
1004
if not skip_cache_invalidation :
1006
- purge_path (session , www_root , link )
1005
+ purge_path (http , www_root , link )
1007
1006
1008
1007
1009
1008
def major_symlinks (
@@ -1012,7 +1011,7 @@ def major_symlinks(
1012
1011
versions : Iterable [Version ],
1013
1012
languages : Iterable [Language ],
1014
1013
skip_cache_invalidation : bool ,
1015
- session : requests . Session ,
1014
+ http : urllib3 . PoolManager ,
1016
1015
) -> None :
1017
1016
"""Maintains the /2/ and /3/ symlinks for each languages.
1018
1017
@@ -1030,9 +1029,9 @@ def major_symlinks(
1030
1029
"3" ,
1031
1030
group ,
1032
1031
skip_cache_invalidation ,
1033
- session ,
1032
+ http ,
1034
1033
)
1035
- symlink (www_root , language , "2.7" , "2" , group , skip_cache_invalidation , session )
1034
+ symlink (www_root , language , "2.7" , "2" , group , skip_cache_invalidation , http )
1036
1035
1037
1036
1038
1037
def dev_symlink (
@@ -1041,7 +1040,7 @@ def dev_symlink(
1041
1040
versions ,
1042
1041
languages ,
1043
1042
skip_cache_invalidation : bool ,
1044
- session : requests . Session ,
1043
+ http : urllib3 . PoolManager ,
1045
1044
) -> None :
1046
1045
"""Maintains the /dev/ symlinks for each languages.
1047
1046
@@ -1059,11 +1058,11 @@ def dev_symlink(
1059
1058
"dev" ,
1060
1059
group ,
1061
1060
skip_cache_invalidation ,
1062
- session ,
1061
+ http ,
1063
1062
)
1064
1063
1065
1064
1066
- def purge (session : requests . Session , * paths : Path | str ) -> None :
1065
+ def purge (http : urllib3 . PoolManager , * paths : Path | str ) -> None :
1067
1066
"""Remove one or many paths from docs.python.org's CDN.
1068
1067
1069
1068
To be used when a file change, so the CDN fetch the new one.
@@ -1072,21 +1071,21 @@ def purge(session: requests.Session, *paths: Path | str) -> None:
1072
1071
for path in paths :
1073
1072
url = urljoin (base , str (path ))
1074
1073
logging .debug ("Purging %s from CDN" , url )
1075
- session .request ("PURGE" , url , timeout = 30 )
1074
+ http .request ("PURGE" , url , timeout = 30 )
1076
1075
1077
1076
1078
- def purge_path (session : requests . Session , www_root : Path , path : Path ) -> None :
1077
+ def purge_path (http : urllib3 . PoolManager , www_root : Path , path : Path ) -> None :
1079
1078
"""Recursively remove a path from docs.python.org's CDN.
1080
1079
1081
1080
To be used when a directory change, so the CDN fetch the new one.
1082
1081
"""
1083
- purge (session , * [file .relative_to (www_root ) for file in path .glob ("**/*" )])
1084
- purge (session , path .relative_to (www_root ))
1085
- purge (session , str (path .relative_to (www_root )) + "/" )
1082
+ purge (http , * [file .relative_to (www_root ) for file in path .glob ("**/*" )])
1083
+ purge (http , path .relative_to (www_root ))
1084
+ purge (http , str (path .relative_to (www_root )) + "/" )
1086
1085
1087
1086
1088
1087
def proofread_canonicals (
1089
- www_root : Path , skip_cache_invalidation : bool , session : requests . Session
1088
+ www_root : Path , skip_cache_invalidation : bool , http : urllib3 . PoolManager
1090
1089
) -> None :
1091
1090
"""In www_root we check that all canonical links point to existing contents.
1092
1091
@@ -1109,11 +1108,12 @@ def proofread_canonicals(
1109
1108
html = html .replace (canonical .group (0 ), "" )
1110
1109
file .write_text (html , encoding = "UTF-8" , errors = "surrogateescape" )
1111
1110
if not skip_cache_invalidation :
1112
- purge (session , str (file ).replace ("/srv/docs.python.org/" , "" ))
1111
+ purge (http , str (file ).replace ("/srv/docs.python.org/" , "" ))
1113
1112
1114
1113
1115
- def parse_versions_from_devguide (session : requests .Session ) -> list [Version ]:
1116
- releases = session .get (
1114
+ def parse_versions_from_devguide (http : urllib3 .PoolManager ) -> list [Version ]:
1115
+ releases = http .request (
1116
+ "GET" ,
1117
1117
"https://raw.githubusercontent.com/"
1118
1118
"python/devguide/main/include/release-cycle.json" ,
1119
1119
timeout = 30 ,
@@ -1141,8 +1141,8 @@ def parse_languages_from_config():
1141
1141
1142
1142
def build_docs (args ) -> bool :
1143
1143
"""Build all docs (each language and each version)."""
1144
- session = requests . Session ()
1145
- versions = parse_versions_from_devguide (session )
1144
+ http = urllib3 . PoolManager ()
1145
+ versions = parse_versions_from_devguide (http )
1146
1146
languages = parse_languages_from_config ()
1147
1147
todo = [
1148
1148
(version , language )
@@ -1170,7 +1170,7 @@ def build_docs(args) -> bool:
1170
1170
builder = DocBuilder (
1171
1171
version , versions , language , languages , cpython_repo , ** vars (args )
1172
1172
)
1173
- all_built_successfully &= builder .run (session )
1173
+ all_built_successfully &= builder .run (http )
1174
1174
logging .root .handlers [0 ].setFormatter (
1175
1175
logging .Formatter ("%(asctime)s %(levelname)s: %(message)s" )
1176
1176
)
@@ -1183,25 +1183,25 @@ def build_docs(args) -> bool:
1183
1183
args .www_root ,
1184
1184
args .group ,
1185
1185
args .skip_cache_invalidation ,
1186
- session ,
1186
+ http ,
1187
1187
)
1188
1188
major_symlinks (
1189
1189
args .www_root ,
1190
1190
args .group ,
1191
1191
versions ,
1192
1192
languages ,
1193
1193
args .skip_cache_invalidation ,
1194
- session ,
1194
+ http ,
1195
1195
)
1196
1196
dev_symlink (
1197
1197
args .www_root ,
1198
1198
args .group ,
1199
1199
versions ,
1200
1200
<
B2B2
div class="diff-text-inner"> languages ,
1201
1201
args .skip_cache_invalidation ,
1202
- session ,
1202
+ http ,
1203
1203
)
1204
- proofread_canonicals (args .www_root , args .skip_cache_invalidation , session )
1204
+ proofread_canonicals (args .www_root , args .skip_cache_invalidation , http )
1205
1205
1206
1206
return all_built_successfully
1207
1207
0 commit comments