32
32
"""
33
33
34
34
from bisect import bisect_left as bisect
35
+ from collections import namedtuple
35
36
from contextlib import contextmanager , suppress
36
37
import filecmp
37
38
import logging
64
65
("3.10" , "master" , True ),
65
66
]
66
67
67
- LANGUAGES = ["en" , "es" , "fr" , "id" , "ja" , "ko" , "pt-br" , "zh-cn" , "zh-tw" ]
68
-
69
- SPHINXOPTS = {
70
- "ja" : [
71
- "-D latex_engine=platex" ,
72
- "-D latex_elements.inputenc=" ,
73
- "-D latex_elements.fontenc=" ,
74
- ],
75
- "ko" : [
76
- "-D latex_engine=xelatex" ,
77
- "-D latex_elements.inputenc=" ,
78
- "-D latex_elements.fontenc=" ,
79
- r"-D latex_elements.preamble=\\usepackage{kotex}\\setmainhangulfont{UnBatang}\\setsanshangulfont{UnDotum}\\setmonohangulfont{UnTaza}" ,
80
- ],
81
- "pt-br" : [
82
- "-D latex_engine=xelatex" ,
83
- "-D latex_elements.inputenc=" ,
84
- "-D latex_elements.fontenc=" ,
85
- ],
86
- "fr" : [
87
- "-D latex_engine=xelatex" ,
88
- "-D latex_elements.inputenc=" ,
89
- r"-D latex_elements.fontenc=\\usepackage{fontspec}" ,
90
- ],
91
- "en" : [
92
- "-D latex_engine=xelatex" ,
93
- "-D latex_elements.inputenc=" ,
94
- "-D latex_elements.fontenc=" ,
95
- ],
96
- "es" : [
97
- "-D latex_engine=xelatex" ,
98
- "-D latex_elements.inputenc=" ,
99
- r"-D latex_elements.fontenc=\\usepackage{fontspec}" ,
100
- ],
101
- "zh-cn" : [
102
- "-D latex_engine=xelatex" ,
103
- "-D latex_elements.inputenc=" ,
104
- r"-D latex_elements.fontenc=\\usepackage{xeCJK}" ,
105
- ],
106
- "zh-tw" : [
107
- "-D latex_engine=xelatex" ,
108
- "-D latex_elements.inputenc=" ,
109
- r"-D latex_elements.fontenc=\\usepackage{xeCJK}" ,
110
- ],
111
- "id" : [
112
- "-D latex_engine=xelatex" ,
113
- "-D latex_elements.inputenc=" ,
114
- "-D latex_elements.fontenc=" ,
115
- ],
68
+
69
+ Language = namedtuple (
70
+ "Language" , ["tag" , "iso639_tag" , "name" , "in_prod" , "sphinxopts" ]
71
+ )
72
+
73
+ XELATEX_DEFAULT = (
74
+ "-D latex_engine=xelatex" ,
75
+ "-D latex_elements.inputenc=" ,
76
+ "-D latex_elements.fontenc=" ,
77
+ )
78
+
79
+ PLATEX_DEFAULT = (
80
+ "-D latex_engine=platex" ,
81
+ "-D latex_elements.inputenc=" ,
82
+ "-D latex_elements.fontenc=" ,
83
+ )
84
+
85
+ XELATEX_WITH_FONTSPEC = (
86
+ "-D latex_engine=xelatex" ,
87
+ "-D latex_elements.inputenc=" ,
88
+ r"-D latex_elements.fontenc=\\usepackage{fontspec}" ,
89
+ )
90
+
91
+ XELATEX_FOR_KOREAN = (
92
+ "-D latex_engine=xelatex" ,
93
+ "-D latex_elements.inputenc=" ,
94
+ "-D latex_elements.fontenc=" ,
95
+ r"-D latex_elements.preamble=\\usepackage{kotex}\\setmainhangulfont{UnBatang}\\setsanshangulfont{UnDotum}\\setmonohangulfont{UnTaza}" ,
96
+ )
97
+
98
+ XELATEX_WITH_CJK = (
99
+ "-D latex_engine=xelatex" ,
100
+ "-D latex_elements.inputenc=" ,
101
+ r"-D latex_elements.fontenc=\\usepackage{xeCJK}" ,
102
+ )
103
+
104
+ LANGUAGES = {
105
+ Language ("en" , "en" , "English" , True , XELATEX_DEFAULT ),
106
+ Language ("es" , "es" , "Spanish" , False , XELATEX_WITH_FONTSPEC ),
107
+ Language ("fr" , "fr" , "French" , True , XELATEX_WITH_FONTSPEC ),
108
+ Language ("id" , "id" , "Indonesian" , False , XELATEX_DEFAULT ),
109
+ Language ("ja" , "ja" , "Japanese" , True , PLATEX_DEFAULT ),
110
+ Language ("ko" , "ko" , "Korean" , True , XELATEX_FOR_KOREAN ),
111
+ Language ("pt-br" , "pt_BR" , "Brazilian Portuguese" , True , XELATEX_DEFAULT ),
112
+ Language ("zh-cn" , "zh_CN" , "Simplified Chinese" , True , XELATEX_WITH_CJK ),
113
+ Language ("zh-tw" , "zh_TW" , "Traditional Chinese" , True , XELATEX_WITH_CJK ),
116
114
}
117
115
116
+ DEFAULT_LANGUAGES_SET = {language .tag for language in LANGUAGES if language .in_prod }
117
+
118
118
119
119
def shell_out (cmd , shell = False , logfile = None ):
120
120
logging .debug ("Running command %r" , cmd )
@@ -191,17 +191,6 @@ def git_clone(repository, directory, branch=None):
191
191
shell_out (["git" , "-C" , directory , "checkout" , branch ])
192
192
193
193
194
- def pep_545_tag_to_gettext_tag (tag ):
195
- """Transforms PEP 545 language tags like "pt-br" to gettext language
196
- tags like "pt_BR". (Note that none of those are IETF language tags
197
- like "pt-BR").
198
- """
199
- if "-" not in tag :
200
- return tag
201
- language , region = tag .split ("-" )
202
- return language + "_" + region .upper ()
203
-
204
-
205
194
def locate_nearest_version (available_versions , target_version ):
206
195
"""Look for the nearest version of target_version in available_versions.
207
196
Versions are to be given as tuples, like (3, 7) for 3.7.
@@ -297,27 +286,22 @@ def build_one(
297
286
quick ,
298
287
venv ,
299
288
build_root ,
300
- group = "docs" ,
301
- log_directory = "/var/log/docsbuild/" ,
302
- language = None ,
289
+ group ,
290
+ log_directory ,
291
+ language : Language ,
303
292
):
304
- if not language :
305
- language = "en"
306
- if sentry_sdk :
307
- with sentry_sdk .configure_scope () as scope :
308
- scope .set_tag ("version" , version )
309
- scope .set_tag ("language" , language )
310
- checkout = os .path .join (build_root , version , "cpython-{lang}" .format (lang = language ))
311
- logging .info ("Build start for version: %s, language: %s" , version , language )
312
- sphinxopts = SPHINXOPTS [language ].copy ()
293
+ checkout = os .path .join (
294
+ build_root , version , "cpython-{lang}" .format (lang = language .tag )
295
+ )
296
+ logging .info ("Build start for version: %s, language: %s" , version , language .tag )
297
+ sphinxopts = list (language .sphinxopts )
313
298
sphinxopts .extend (["-q" ])
314
- if language != "en" :
315
- gettext_language_tag = pep_545_tag_to_gettext_tag (language )
299
+ if language .tag != "en" :
316
300
locale_dirs = os .path .join (build_root , version , "locale" )
317
- locale_clone_dir = os .path .join (
318
- locale_dirs , gettext_language_tag , "LC_MESSAGES"
301
+ locale_clone_dir = os .path .join (locale_dirs , language .iso639_tag , "LC_MESSAGES" )
302
+ locale_repo = "https://github.com/python/python-docs-{}.git" .format (
303
+ language .tag
319
304
)
320
- locale_repo = "https://github.com/python/python-docs-{}.git" .format (language )
321
305
git_clone (
322
306
locale_repo ,
323
307
locale_clone_dir ,
@@ -326,7 +310,7 @@ def build_one(
326
310
sphinxopts .extend (
327
311
(
328
312
"-D locale_dirs={}" .format (locale_dirs ),
329
- "-D language={}" .format (gettext_language_tag ),
313
+ "-D language={}" .format (language . iso639_tag ),
330
314
"-D gettext_compact=0" ,
331
315
)
332
316
)
@@ -335,7 +319,7 @@ def build_one(
335
319
"autobuild-" + ("dev" if isdev else "stable" ) + ("-html" if quick else "" )
336
320
)
337
321
logging .info ("Running make %s" , maketarget )
338
- logname = "cpython-{lang}-{version}.log" .format (lang = language , version = version )
322
+ logname = "cpython-{lang}-{version}.log" .format (lang = language . tag , version = version )
339
323
python = os .path .join (venv , "bin/python" )
340
324
sphinxbuild = os .path .join (venv , "bin/sphinx-build" )
341
325
blurb = os .path .join (venv , "bin/blurb" )
@@ -365,20 +349,30 @@ def build_one(
365
349
)
366
350
shell_out (["chgrp" , "-R" , group , log_directory ])
367
351
setup_switchers (os .path .join (checkout , "Doc" , "build" , "html" ))
368
- logging .info ("Build done for version: %s, language: %s" , version , language )
352
+ logging .info ("Build done for version: %s, language: %s" , version , language . tag )
369
353
370
354
371
355
def copy_build_to_webroot (
372
- build_root , version , language , group , quick , skip_cache_invalidation , www_root
356
+ build_root ,
357
+ version ,
358
+ language : Language ,
359
+ group ,
360
+ quick ,
361
+ skip_cache_invalidation ,
362
+ www_root ,
373
363
):
374
364
"""Copy a given build to the appropriate webroot with appropriate rights.
375
365
"""
376
- logging .info ("Publishing start for version: %s, language: %s" , version , language )
377
- checkout = os .path .join (build_root , version , "cpython-{lang}" .format (lang = language ))
378
- if language == "en" :
366
+ logging .info (
367
+ "Publishing start for version: %s, language: %s" , version , language .tag
368
+ )
369
+ checkout = os .path .join (
370
+ build_root , version , "cpython-{lang}" .format (lang = language .tag )
371
+ )
372
+ if language .tag == "en" :
379
373
target = os .path .join (www_root , version )
380
374
else :
381
- language_dir = os .path .join (www_root , language )
375
+ language_dir = os .path .join (www_root , language . tag )
382
376
os .makedirs (language_dir , exist_ok = True )
383
377
try :
384
378
shell_out (["chgrp" , "-R" , group , language_dir ])
@@ -460,7 +454,7 @@ def copy_build_to_webroot(
460
454
shell_out (
461
455
["curl" , "-XPURGE" , "https://docs.python.org/{%s}" % "," .join (to_purge )]
462
456
)
463
- logging .info ("Publishing done for version: %s, language: %s" , version , language )
457
+ logging .info ("Publishing done for version: %s, language: %s" , version , language . tag )
464
458
465
459
466
460
def head (lines , n = 10 ):
@@ -551,7 +545,7 @@ def parse_args():
551
545
parser .add_argument (
552
546
"--languages" ,
553
547
nargs = "*" ,
554
- default = LANGUAGES ,
548
+ default = DEFAULT_LANGUAGES_SET ,
555
549
help = "Language translation, as a PEP 545 language tag like" " 'fr' or 'pt-br'." ,
556
550
metavar = "fr" ,
557
551
)
@@ -577,6 +571,7 @@ def setup_logging(log_directory):
577
571
578
572
def main ():
579
573
args = parse_args ()
574
+ languages_dict = {language .tag : language for language in LANGUAGES }
580
575
if args .version :
581
576
version_info ()
582
577
exit (0 )
@@ -596,17 +591,21 @@ def main():
596
591
]
597
592
else :
598
593
branches_to_do = BRANCHES
599
- if not args .languages :
594
+ if args .languages :
595
+ languages = [languages_dict [tag ] for tag in args .languages ]
596
+ else :
600
597
# Allow "--languages" to build all languages (as if not given)
601
598
# instead of none. "--languages en" builds *no* translation,
602
599
# as "en" is the untranslated one.
603
- args .languages = LANGUAGES
600
+ languages = [
601
+ language for language in LANGUAGES if language .tag in DEFAULT_LANGUAGES_SET
602
+ ]
604
603
for version , git_branch , devel in branches_to_do :
605
- for language in args . languages :
604
+ for language in languages :
606
605
if sentry_sdk :
607
606
with sentry_sdk .configure_scope () as scope :
608
607
scope .set_tag ("version" , version )
609
- scope .set_tag ("language" , language if language else "en" )
608
+ scope .set_tag ("language" , language . tag )
610
609
try :
611
610
build_one (
612
611
version ,
@@ -631,7 +630,7 @@ def main():
631
630
except Exception as err :
632
631
logging .error (
633
632
"Exception while building %s version %s: %s" ,
634
- language ,
633
+ language . tag ,
635
634
version ,
636
635
err ,
637
636
)
0 commit comments