22import pathlib
33import shutil
44import 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
511
612
713## Sphinx related options
2329BUILD_PARAMETERS = ["-b" , "html" ]
2430
2531# 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' ]
2733
2834# Sphinx parameters to generate translation templates
2935TRANSLATION_TEMPLATE_PARAMETERS = ["-b" , "gettext" ]
4248## Localization options (translations)
4349
4450# List of languages for which locales will be generated in (/locales/<lang>)
45- LANGUAGES = [ "es" , "ja" ]
51+ LANGUAGES = conf . languages
4652
4753# 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
4955
56+ # allowable values of `SPHINX_ENV`
57+ SPHINX_ENVS = ('production' , 'development' )
5058
5159@nox .session
5260def docs (session ):
5361 """Build the packaging guide."""
5462 session .install ("-e" , "." )
63+ sphinx_env = _sphinx_env (session )
5564 session .run (SPHINX_BUILD , * BUILD_PARAMETERS , SOURCE_DIR , OUTPUT_DIR , * session .posargs )
5665 # When building the guide, also build the translations in RELEASE_LANGUAGES
5766 session .notify ("build-release-languages" , session .posargs )
@@ -65,11 +74,18 @@ def docs_test(session):
6574 Note: this is the session used in CI/CD to release the guide.
6675 """
6776 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' })
6979 # When building the guide with additional parameters, also build the translations in RELEASE_LANGUAGES
7080 # with those same parameters.
7181 session .notify ("build-release-languages" , [* TEST_PARAMETERS , * session .posargs ])
7282
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+
7389
7490@nox .session (name = "docs-live" )
7591def docs_live (session ):
@@ -87,13 +103,11 @@ def docs_live(session):
87103 so they don't need to remember the specific sphinx-build parameters to build a different language.
88104 """
89105 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 )
93107 # This part was commented in the previous version of the nox file, keeping the same here
94108 # for folder in AUTOBUILD_INCLUDE:
95109 # cmd.extend(["--watch", folder])
96- session .run (* cmd )
110+ session .run (* cmd , env = { 'SPHINX_ENV' : "development" } )
97111
98112
99113@nox .session (name = "docs-live-lang" )
@@ -127,6 +141,37 @@ def docs_live_lang(session):
127141 f"where LANG is one of: { LANGUAGES } "
128142 )
129143
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 )
130175
131176@nox .session (name = "docs-clean" )
132177def clean_dir (session ):
@@ -187,6 +232,13 @@ def update_language(session):
187232 "nox -s update-language -- LANG\n \n "
188233 f" where LANG is one of: { LANGUAGES } "
189234 )
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+
190242
191243@nox .session (name = "build-language" )
192244def build_language (session ):
@@ -215,13 +267,20 @@ def build_release_languages(session):
215267 """
216268 Build the translations of the guide for the languages in RELEASE_LANGUAGES.
217269 """
270+ sphinx_env = _sphinx_env (session )
218271 if not RELEASE_LANGUAGES :
219272 session .warn ("No release languages defined in RELEASE_LANGUAGES" )
220273 return
221274 session .install ("-e" , "." )
222275 for lang in RELEASE_LANGUAGES :
223276 session .log (f"Building [{ lang } ] guide" )
224277 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 })
225284 session .log (f"Translations built for { RELEASE_LANGUAGES } " )
226285
227286@nox .session (name = "build-all-languages" )
@@ -237,6 +296,19 @@ def build_all_languages(session):
237296 session .log (f"Building [{ lang } ] guide" )
238297 session .run (SPHINX_BUILD , * BUILD_PARAMETERS , "-D" , f"language={ lang } " , "." , OUTPUT_DIR / lang , * session .posargs )
239298 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 ])
240312
241313
242314@nox .session (name = "build-all-languages-test" )
@@ -248,3 +320,14 @@ def build_all_languages_test(session):
248320 in the same way docs-test does for the English version.
249321 """
250322 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