Files
postgrest/nix/tools/docs.nix
T
Taimoor Zaeem e49a17ea56 nix(docs): print message to console on script runs
It's not immediately visible that these scripts are run when
doing `postgrest-docs-check`.

Signed-off-by: Taimoor Zaeem <taimoorzaeem@gmail.com>
(cherry picked from commit e1d547623e)
2026-05-28 14:28:37 +05:00

205 lines
5.2 KiB
Nix

{ aspell
, aspellDicts
, buildToolbox
, checkedShellScript
, lib
, plantuml
, python3
, python3Packages
, writeTextFile
, writers
}:
let
selectPythonPackages = ps: [
ps.sphinx
ps.sphinx-copybutton
ps.sphinx-rtd-dark-mode
ps.sphinx-rtd-theme
ps.sphinx-tabs
ps.sphinxext-opengraph
];
requirements = writeTextFile {
name = "requirements.txt";
text = lib.concatMapStringsSep "\n" (pkg: "${pkg.pname}==${pkg.version}") (selectPythonPackages python3Packages);
};
python = python3.withPackages selectPythonPackages;
build =
checkedShellScript
{
name = "postgrest-docs-build";
docs = "Build the documentation.";
args = [ "ARG_POSITIONAL_SINGLE([language], [Language to build docs for.], [\"\"])" ];
workingDir = "/docs";
}
''
# https://github.com/sphinx-doc/sphinx/issues/11739
export LC_ALL=C
function build() {
${python}/bin/sphinx-build --color -W -a -n . -b "$@"
}
if [ "$_arg_language" == "" ]; then
# clean previous build, otherwise some errors might be supressed
rm -rf "../.docs-build/html/default"
if [ -d languages ]; then
# default to updating all existing locales
build gettext ../.docs-build/gettext
${python}/bin/sphinx-intl update -p ../.docs-build/gettext
fi
build html "../.docs-build/html/default"
else
# clean previous build, otherwise some errors might be supressed
rm -rf "../.docs-build/html/$_arg_language"
# update and build specific locale, can be used to create new locale
build gettext ../.docs-build/gettext
${python}/bin/sphinx-intl update -p ../.docs-build/gettext -l "$_arg_language"
build html "../.docs-build/html/$_arg_language" -D "language=$_arg_language"
fi
'';
render =
checkedShellScript
{
name = "postgrest-docs-render";
docs = "Render the diagrams.";
workingDir = "/docs/_diagrams";
}
''
${plantuml}/bin/plantuml -tsvg uml/*.uml -o ../../_static
${plantuml}/bin/plantuml -tsvg -darkmode uml/dark/*.uml -o ../../../_static
'';
server =
writers.writePython3
"postgrest-docs-server"
{ libraries = selectPythonPackages python3Packages ++ [ python3Packages.livereload ]; }
''
import sys
from livereload import Server, shell
from subprocess import call
build = sys.argv[1]
locale = sys.argv[2]
if locale == "":
locale = "default"
else:
build += " " + locale
call(build, shell=True)
server = Server()
server.watch("**/*.rst", shell(build))
server.watch(f"locales/{locale}/LC_MESSAGES/*.po", shell(build))
server.serve(root=f"../.docs-build/html/{locale}")
'';
serve =
checkedShellScript
{
name = "postgrest-docs-serve";
docs = "Serve the documentation locally with live reload.";
args = [ "ARG_POSITIONAL_SINGLE([language], [Language to serve docs for.], [\"\"])" ];
workingDir = "/docs";
}
''
${server} ${build} "$_arg_language"
'';
spellcheck =
checkedShellScript
{
name = "postgrest-docs-spellcheck";
docs = "Verify spelling mistakes. Bypass if the word is present in postgrest.dict.";
workingDir = "/docs";
}
''
echo "Checking spelling mistakes..."
export LC_ALL=C
FILES=$(find . -type f -iname '*.rst' | tr '\n' ' ')
# shellcheck disable=SC2086 disable=SC2016
cat $FILES \
| grep -v '^\(\.\.\| \)' \
| sed -E 's/`+[^`]+`+//g' \
| ${aspell}/bin/aspell -d ${aspellDicts.en}/lib/aspell/en_US -p ./postgrest.dict list \
| sort -f \
| tee misspellings
test ! -s misspellings
'';
dictcheck =
checkedShellScript
{
name = "postgrest-docs-dictcheck";
docs = "Detect obsolete entries in postgrest.dict that are not used anymore.";
workingDir = "/docs";
}
''
echo "Detecting obsolete dictionary entries..."
export LC_ALL=C
FILES=$(find . -type f -iname '*.rst' | tr '\n' ' ')
tail -n+2 postgrest.dict \
| tr '\n' '\0' \
| xargs -0 -i \
sh -c "grep \"{}\" $FILES > /dev/null || echo \"{}\"" \
| tee unuseddict
test ! -s unuseddict
'';
linkcheck =
checkedShellScript
{
name = "postgrest-docs-linkcheck";
docs = "Verify that external links are working correctly.";
workingDir = "/docs";
}
''
export LC_ALL=C
${python}/bin/sphinx-build --color -b linkcheck . ../.docs-build
'';
check =
checkedShellScript
{
name = "postgrest-docs-check";
docs = "Build and run all the validation scripts.";
workingDir = "/docs";
}
''
${build}
${dictcheck}
${spellcheck}
'';
in
buildToolbox
{
name = "postgrest-docs";
tools = {
inherit
build
check
dictcheck
linkcheck
render
serve
spellcheck;
};
extra = { inherit requirements; };
}