Skip to content

Commit b19a07a

Browse files
unify dev/prod switching into SPHINX_ENV, fix jp -> ja language name, separate build_languages from languages in conf.py
1 parent 76f9af0 commit b19a07a

File tree

3 files changed

+78
-24
lines changed

3 files changed

+78
-24
lines changed

README.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,28 @@ To build live documentation that updates when you update local files, run the fo
5858
$ nox -s docs-live
5959
```
6060

61+
### Building for release
62+
63+
When building for release, the docs are built multiple times for each translation,
64+
but translations are only included in the production version of the guide after some completion threshold.
65+
66+
The sphinx build environment is controlled by an environment variable `SPHINX_ENV`
67+
68+
- when `SPHINX_ENV=development` (default), sphinx assumes all languages are built,
69+
and includes them in the language selector
70+
- when `SPHINX_ENV=production`, only those languages in `release_languages` (set in `conf.py`)
71+
are built and included in the language selector.
72+
73+
Most of the time you should not need to set `SPHINX_ENV`,
74+
as it is forced by the primary nox sessions intended to be used for release or development:
75+
76+
`SPHINX_ENV=development`
77+
- `docs-live` - autobuild english
78+
- `docs-live-lang` - autobuild a single language
79+
- `docs-live-langs` - autobuild all languages
80+
81+
`SPHINX_ENV=production`
82+
- `build-test` - build all languages for production
6183

6284
## Contributing to this guide
6385

conf.py

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,34 @@
2020
current_year = datetime.now().year
2121
organization_name = "pyOpenSci"
2222

23+
# env vars
24+
sphinx_env = os.environ.get("SPHINX_ENV", "development")
25+
language_env = os.environ.get("SPHINX_LANG", "en")
26+
2327

2428
# -- Project information -----------------------------------------------------
2529

2630
project = "pyOpenSci Python Package Guide"
2731
copyright = f"{current_year}, {organization_name}"
2832
author = "pyOpenSci Community"
2933

34+
# Language of the current build
3035
# language can later be overridden (eg with the -D flag)
3136
# but we need it set here so it can make it into the html_context
32-
language = os.environ.get("SPHINX_LANG", "en")
33-
languages = ["en", "es", "jp"]
37+
language = language_env
38+
# all languages that have .po files generated for them
39+
# (excluding english)
40+
languages = ["es", "ja"]
41+
# the languages that will be included in a production build
42+
# (also excluding english)
43+
release_languages = []
44+
45+
# languages that will be included in the language dropdown
46+
# (ie. all that are being built in this nox build session)
47+
if sphinx_env == "production":
48+
build_languages = ["en"] + release_languages
49+
else:
50+
build_languages = ["en"] + languages
3451

3552
# Get the latest Git tag - there might be a prettier way to do this but...
3653
try:
@@ -78,7 +95,7 @@
7895
]
7996

8097
html_baseurl = "https://www.pyopensci.org/python-package-guide/"
81-
if os.environ.get("SPHINX_DEV", False):
98+
if not sphinx_env == "production":
8299
# for links in language selector when developing locally
83100
html_baseurl = "/"
84101

@@ -129,8 +146,8 @@
129146
"github_repo": "python-package-guide",
130147
"github_version": "main",
131148
"language": language,
132-
"languages": languages,
133-
"base_url": html_baseurl,
149+
"languages": build_languages,
150+
"baseurl": html_baseurl,
134151
}
135152

136153
# Add any paths that contain templates here, relative to this directory.

noxfile.py

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,19 @@
5252
LANGUAGES = conf.languages
5353

5454
# List of languages that should be built when releasing the guide (docs or docs-test sessions)
55-
RELEASE_LANGUAGES = [lang for lang in conf.languages if lang != "en"]
55+
RELEASE_LANGUAGES = conf.release_languages
5656

57+
# allowable values of `SPHINX_ENV`
58+
SPHINX_ENVS = ('production', 'development')
5759

5860
@nox.session
5961
def docs(session):
6062
"""Build the packaging guide."""
6163
session.install("-e", ".")
64+
sphinx_env = _sphinx_env(session)
6265
session.run(SPHINX_BUILD, *BUILD_PARAMETERS, SOURCE_DIR, OUTPUT_DIR, *session.posargs)
6366
# When building the guide, also build the translations in RELEASE_LANGUAGES
64-
session.notify("build-translations", ['release-build'])
67+
session.notify("build-translations", [sphinx_env])
6568

6669

6770
@nox.session(name="docs-test")
@@ -72,13 +75,14 @@ def docs_test(session):
7275
Note: this is the session used in CI/CD to release the guide.
7376
"""
7477
session.install("-e", ".")
75-
session.run(SPHINX_BUILD, *BUILD_PARAMETERS, *TEST_PARAMETERS, SOURCE_DIR, OUTPUT_DIR, *session.posargs)
78+
session.run(SPHINX_BUILD, *BUILD_PARAMETERS, *TEST_PARAMETERS, SOURCE_DIR, OUTPUT_DIR, *session.posargs,
79+
env={'SPHINX_ENV': 'production'})
7680
# When building the guide with additional parameters, also build the translations in RELEASE_LANGUAGES
7781
# with those same parameters.
78-
session.notify("build-translations", ['release-build', *TEST_PARAMETERS])
82+
session.notify("build-translations", ['production', *TEST_PARAMETERS])
7983

8084
def _autobuild_cmd(posargs: list[str], output_dir = OUTPUT_DIR) -> list[str]:
81-
cmd = ["SPHINX_DEV=true", SPHINX_AUTO_BUILD, *BUILD_PARAMETERS, str(SOURCE_DIR), str(output_dir), *posargs]
85+
cmd = [SPHINX_AUTO_BUILD, *BUILD_PARAMETERS, str(SOURCE_DIR), str(output_dir), *posargs]
8286
for folder in AUTOBUILD_IGNORE:
8387
cmd.extend(["--ignore", f"*/{folder}/*"])
8488
return cmd
@@ -104,7 +108,7 @@ def docs_live(session):
104108
# This part was commented in the previous version of the nox file, keeping the same here
105109
# for folder in AUTOBUILD_INCLUDE:
106110
# cmd.extend(["--watch", folder])
107-
session.run(*cmd)
111+
session.run(*cmd, env={'SPHINX_ENV': "development"})
108112

109113

110114
@nox.session(name="docs-live-lang")
@@ -156,20 +160,18 @@ def docs_live_langs(session):
156160

157161
session.install("-e", ".")
158162

159-
cmds = ['"' + " ".join(_autobuild_cmd(session.posargs) + ['--open-browser']) + '"']
163+
cmds = ['"' + " ".join(["SPHINX_ENV=development"] + _autobuild_cmd(session.posargs) + ['--open-browser']) + '"']
160164
for language in LANGUAGES:
161-
if language == "en":
162-
continue
163165
cmds.append(
164166
'"' + " ".join(
165-
[f"SPHINX_LANG={language}"] +
167+
[f"SPHINX_LANG={language}", "SPHINX_ENV=development"] +
166168
_autobuild_cmd(
167169
session.posargs + ["-D", f"language={language}"],
168170
output_dir=OUTPUT_DIR / language
169171
) + ["--port=0"]
170172
) + '"'
171173
)
172-
cmd = ['concurrently', '--kill-others', '-n', ','.join(LANGUAGES), '-c', 'auto', *cmds]
174+
cmd = ['concurrently', '--kill-others', '-n', ','.join(["en"] + LANGUAGES), '-c', 'auto', *cmds]
173175
session.run(*cmd)
174176

175177
@nox.session(name="docs-clean")
@@ -212,6 +214,9 @@ def build_languages(session):
212214
"""
213215
if not session.posargs:
214216
session.error("Please provide the list of languages to build the translation for")
217+
218+
sphinx_env = _sphinx_env(session)
219+
215220
languages_to_build = session.posargs.pop(0)
216221

217222
session.install("-e", ".")
@@ -224,7 +229,8 @@ def build_languages(session):
224229
out_dir = OUTPUT_DIR
225230
else:
226231
out_dir = OUTPUT_DIR / lang
227-
session.run(SPHINX_BUILD, *BUILD_PARAMETERS, "-D", f"language={lang}", ".", out_dir, *session.posargs, env={"SPHINX_LANG": lang})
232+
session.run(SPHINX_BUILD, *BUILD_PARAMETERS, "-D", f"language={lang}", ".", out_dir, *session.posargs,
233+
env={"SPHINX_LANG": lang, "SPHINX_ENV": sphinx_env})
228234

229235

230236
@nox.session(name="build-translations")
@@ -236,21 +242,19 @@ def build_translations(session):
236242
It is also called by the docs and docs-test sessions with 'release-build' as the first positional
237243
argument, to build only the translations defined in RELEASE_LANGUAGES.
238244
"""
239-
release_build = False
240-
if session.posargs and session.posargs[0] == 'release-build':
241-
session.posargs.pop(0)
242-
release_build = True
245+
sphinx_env = _sphinx_env(session)
246+
243247
# if running from the docs or docs-test sessions, build only release languages
244-
BUILD_LANGUAGES = RELEASE_LANGUAGES if release_build else LANGUAGES
248+
BUILD_LANGUAGES = RELEASE_LANGUAGES if sphinx_env == "production" else LANGUAGES
245249
# only build languages that have a locale folder
246250
BUILD_LANGUAGES = [lang for lang in BUILD_LANGUAGES if (TRANSLATION_LOCALES_DIR / lang).exists()]
247251
session.log(f"Declared languages: {LANGUAGES}")
248252
session.log(f"Release languages: {RELEASE_LANGUAGES}")
249-
session.log(f"Building languages{' for release' if release_build else ''}: {BUILD_LANGUAGES}")
253+
session.log(f"Building languages{' for release' if sphinx_env == 'production' else ''}: {BUILD_LANGUAGES}")
250254
if not BUILD_LANGUAGES:
251255
session.warn("No translations to build")
252256
else:
253-
session.notify("build-languages", [BUILD_LANGUAGES, *session.posargs])
257+
session.notify("build-languages", [sphinx_env, BUILD_LANGUAGES, *session.posargs])
254258

255259

256260
@nox.session(name="build-translations-test")
@@ -262,3 +266,14 @@ def build_translations_test(session):
262266
in the same way docs-test does for the English version.
263267
"""
264268
session.notify("build-translations", [*TEST_PARAMETERS])
269+
270+
271+
def _sphinx_env(session) -> str:
272+
"""
273+
Get the sphinx env, from the first positional argument if present or from the
274+
``SPHINX_ENV`` environment variable, defaulting to "development"
275+
"""
276+
if session.posargs and session.posargs[0] in SPHINX_ENVS:
277+
return session.posargs.pop(0)
278+
else:
279+
return os.environ.get('SPHINX_ENV', 'development')

0 commit comments

Comments
 (0)