2
2
import pathlib
3
3
import shutil
4
4
import nox
5
+ import sys
6
+ import subprocess
7
+
8
+ # for some reason necessary to correctly import conf from cwd
9
+ sys .path .insert (0 , str (pathlib .Path (__file__ ).parent .absolute ()))
10
+ import conf
5
11
6
12
7
13
## Sphinx related options
23
29
BUILD_PARAMETERS = ["-b" , "html" ]
24
30
25
31
# Sphinx parameters used to test the build of the guide
26
- TEST_PARAMETERS = ['-W' , '- -keep-going' , '-E' , '-a' ]
32
+ TEST_PARAMETERS = ['--keep-going' , '-E' , '-a' ]
27
33
28
34
# Sphinx parameters to generate translation templates
29
35
TRANSLATION_TEMPLATE_PARAMETERS = ["-b" , "gettext" ]
42
48
## Localization options (translations)
43
49
44
50
# List of languages for which locales will be generated in (/locales/<lang>)
45
- LANGUAGES = [ "es" , "ja" ]
51
+ LANGUAGES = conf . languages
46
52
47
53
# List of languages that should be built when releasing the guide (docs or docs-test sessions)
48
- RELEASE_LANGUAGES = []
54
+ RELEASE_LANGUAGES = conf . release_languages
49
55
56
+ # allowable values of `SPHINX_ENV`
57
+ SPHINX_ENVS = ('production' , 'development' )
50
58
51
59
@nox .session
52
60
def docs (session ):
53
61
"""Build the packaging guide."""
54
62
session .install ("-e" , "." )
63
+ sphinx_env = _sphinx_env (session )
55
64
session .run (SPHINX_BUILD , * BUILD_PARAMETERS , SOURCE_DIR , OUTPUT_DIR , * session .posargs )
56
65
# When building the guide, also build the translations in RELEASE_LANGUAGES
57
66
session .notify ("build-release-languages" , session .posargs )
@@ -65,11 +74,18 @@ def docs_test(session):
65
74
Note: this is the session used in CI/CD to release the guide.
66
75
"""
67
76
session .install ("-e" , "." )
68
- session .run (SPHINX_BUILD , * BUILD_PARAMETERS , * TEST_PARAMETERS , SOURCE_DIR , OUTPUT_DIR , * session .posargs )
77
+ session .run (SPHINX_BUILD , * BUILD_PARAMETERS , * TEST_PARAMETERS , SOURCE_DIR , OUTPUT_DIR , * session .posargs ,
78
+ env = {'SPHINX_ENV' : 'production' })
69
79
# When building the guide with additional parameters, also build the translations in RELEASE_LANGUAGES
70
80
# with those same parameters.
71
81
session .notify ("build-release-languages" , [* TEST_PARAMETERS , * session .posargs ])
72
82
83
+ def _autobuild_cmd (posargs : list [str ], output_dir = OUTPUT_DIR ) -> list [str ]:
84
+ cmd = [SPHINX_AUTO_BUILD , * BUILD_PARAMETERS , str (SOURCE_DIR ), str (output_dir ), * posargs ]
85
+ for folder in AUTOBUILD_IGNORE :
86
+ cmd .extend (["--ignore" , f"*/{ folder } /*" ])
87
+ return cmd
88
+
73
89
74
90
@nox .session (name = "docs-live" )
75
91
def docs_live (session ):
@@ -87,13 +103,11 @@ def docs_live(session):
87
103
so they don't need to remember the specific sphinx-build parameters to build a different language.
88
104
"""
89
105
session .install ("-e" , "." )
90
- cmd = [SPHINX_AUTO_BUILD , * BUILD_PARAMETERS , SOURCE_DIR , OUTPUT_DIR , * session .posargs ]
91
- for folder in AUTOBUILD_IGNORE :
92
- cmd .extend (["--ignore" , f"*/{ folder } /*" ])
106
+ cmd = _autobuild_cmd (session .posargs )
93
107
# This part was commented in the previous version of the nox file, keeping the same here
94
108
# for folder in AUTOBUILD_INCLUDE:
95
109
# cmd.extend(["--watch", folder])
96
- session .run (* cmd )
110
+ session .run (* cmd , env = { 'SPHINX_ENV' : "development" } )
97
111
98
112
99
113
@nox .session (name = "docs-live-lang" )
@@ -127,6 +141,37 @@ def docs_live_lang(session):
127
141
f"where LANG is one of: { LANGUAGES } "
128
142
)
129
143
144
+ @nox .session (name = "docs-live-langs" )
145
+ def docs_live_langs (session ):
146
+ """
147
+ Like docs-live but build all languages simultaneously
148
+
149
+ Requires concurrently to run (npm install -g concurrently)
150
+ """
151
+ try :
152
+ subprocess .check_call (['concurrently' ], stdout = subprocess .DEVNULL , stderr = subprocess .DEVNULL )
153
+ except subprocess .CalledProcessError :
154
+ # handle errors in the called executable
155
+ # (aka, was found)
156
+ pass
157
+ except OSError :
158
+ session .error ('docs-live-langs requires concurrently (npm install -g concurrently)' )
159
+
160
+ session .install ("-e" , "." )
161
+
162
+ cmds = ['"' + " " .join (["SPHINX_ENV=development" ] + _autobuild_cmd (session .posargs ) + ['--open-browser' ]) + '"' ]
163
+ for language in LANGUAGES :
164
+ cmds .append (
165
+ '"' + " " .join (
166
+ [f"SPHINX_LANG={ language } " , "SPHINX_ENV=development" ] +
167
+ _autobuild_cmd (
168
+ session .posargs + ["-D" , f"language={ language } " ],
169
+ output_dir = OUTPUT_DIR / language
170
+ ) + ["--port=0" ]
171
+ ) + '"'
172
+ )
173
+ cmd = ['concurrently' , '--kill-others' , '-n' , ',' .join (["en" ] + LANGUAGES ), '-c' , 'auto' , * cmds ]
174
+ session .run (* cmd )
130
175
131
176
@nox .session (name = "docs-clean" )
132
177
def clean_dir (session ):
@@ -187,6 +232,13 @@ def update_language(session):
187
232
"nox -s update-language -- LANG\n \n "
188
233
f" where LANG is one of: { LANGUAGES } "
189
234
)
235
+ if not session .posargs :
236
+ session .error ("Please provide the list of languages to build the translation for" )
237
+
238
+ sphinx_env = _sphinx_env (session )
239
+
240
+ languages_to_build = session .posargs .pop (0 )
241
+
190
242
191
243
@nox .session (name = "build-language" )
192
244
def build_language (session ):
@@ -215,13 +267,20 @@ def build_release_languages(session):
215
267
"""
216
268
Build the translations of the guide for the languages in RELEASE_LANGUAGES.
217
269
"""
270
+ sphinx_env = _sphinx_env (session )
218
271
if not RELEASE_LANGUAGES :
219
272
session .warn ("No release languages defined in RELEASE_LANGUAGES" )
220
273
return
221
274
session .install ("-e" , "." )
222
275
for lang in RELEASE_LANGUAGES :
223
276
session .log (f"Building [{ lang } ] guide" )
224
277
session .run (SPHINX_BUILD , * BUILD_PARAMETERS , "-D" , f"language={ lang } " , "." , OUTPUT_DIR / lang , * session .posargs )
278
+ if lang == 'en' :
279
+ out_dir = OUTPUT_DIR
280
+ else :
281
+ out_dir = OUTPUT_DIR / lang
282
+ session .run (SPHINX_BUILD , * BUILD_PARAMETERS , "-D" , f"language={ lang } " , "." , out_dir , * session .posargs ,
283
+ env = {"SPHINX_LANG" : lang , "SPHINX_ENV" : sphinx_env })
225
284
session .log (f"Translations built for { RELEASE_LANGUAGES } " )
226
285
227
286
@nox .session (name = "build-all-languages" )
@@ -237,6 +296,19 @@ def build_all_languages(session):
237
296
session .log (f"Building [{ lang } ] guide" )
238
297
session .run (SPHINX_BUILD , * BUILD_PARAMETERS , "-D" , f"language={ lang } " , "." , OUTPUT_DIR / lang , * session .posargs )
239
298
session .log (f"Translations built for { LANGUAGES } " )
299
+ sphinx_env = _sphinx_env (session )
300
+
301
+ # if running from the docs or docs-test sessions, build only release languages
302
+ BUILD_LANGUAGES = RELEASE_LANGUAGES if sphinx_env == "production" else LANGUAGES
303
+ # only build languages that have a locale folder
304
+ BUILD_LANGUAGES = [lang for lang in BUILD_LANGUAGES if (TRANSLATION_LOCALES_DIR / lang ).exists ()]
305
+ session .log (f"Declared languages: { LANGUAGES } " )
306
+ session .log (f"Release languages: { RELEASE_LANGUAGES } " )
307
+ session .log (f"Building languages{ ' for release' if sphinx_env == 'production' else '' } : { BUILD_LANGUAGES } " )
308
+ if not BUILD_LANGUAGES :
309
+ session .warn ("No translations to build" )
310
+ else :
311
+ session .notify ("build-languages" , [sphinx_env , BUILD_LANGUAGES , * session .posargs ])
240
312
241
313
242
314
@nox .session (name = "build-all-languages-test" )
@@ -248,3 +320,14 @@ def build_all_languages_test(session):
248
320
in the same way docs-test does for the English version.
249
321
"""
250
322
session .notify ("build-all-languages" , [* TEST_PARAMETERS ])
323
+
324
+
325
+ def _sphinx_env (session ) -> str :
326
+ """
327
+ Get the sphinx env, from the first positional argument if present or from the
328
+ ``SPHINX_ENV`` environment variable, defaulting to "development"
329
+ """
330
+ if session .posargs and session .posargs [0 ] in SPHINX_ENVS :
331
+ return session .posargs .pop (0 )
332
+ else :
333
+ return os .environ .get ('SPHINX_ENV' , 'development' )
0 commit comments