diff --git a/docs/docsite/rst/dev_guide/testing/sanity/docs-build.rst b/docs/docsite/rst/dev_guide/testing/sanity/docs-build.rst new file mode 100644 index 0000000000..7ac55bdbb0 --- /dev/null +++ b/docs/docsite/rst/dev_guide/testing/sanity/docs-build.rst @@ -0,0 +1,4 @@ +Sanity Tests ยป docs-build +========================= + +Verifies that ``make singlehtmldocs`` in ``docs/docsite/`` completes without errors. diff --git a/test/sanity/code-smell/docs-build.json b/test/sanity/code-smell/docs-build.json new file mode 100644 index 0000000000..376970e682 --- /dev/null +++ b/test/sanity/code-smell/docs-build.json @@ -0,0 +1,4 @@ +{ + "always": true, + "output": "path-line-column-message" +} diff --git a/test/sanity/code-smell/docs-build.py b/test/sanity/code-smell/docs-build.py new file mode 100755 index 0000000000..614114436d --- /dev/null +++ b/test/sanity/code-smell/docs-build.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python + +import os +import re +import subprocess + + +def main(): + base_dir = os.getcwd() + os.sep + docs_dir = os.path.abspath('docs/docsite') + cmd = ['make', 'singlehtmldocs'] + + sphinx = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=docs_dir) + stdout, stderr = sphinx.communicate() + + if sphinx.returncode != 0: + raise subprocess.CalledProcessError(sphinx.returncode, cmd, output=stdout, stderr=stderr) + + with open('docs/docsite/rst_warnings', 'r') as warnings_fd: + output = warnings_fd.read().strip() + lines = output.splitlines() + + for line in lines: + match = re.search('^(?P[^:]+):((?P[0-9]+):)?((?P[0-9]+):)? (?PWARNING|ERROR): (?P.*)$', line) + + if not match: + path = 'docs/docsite/rst/index.rst' + lineno = 0 + column = 0 + level = 'unknown' + message = line + + # surface unknown lines while filtering out known lines to avoid excessive output + print('%s:%d:%d: %s: %s' % (path, lineno, column, level, message)) + continue + + path = match.group('path') + lineno = int(match.group('line') or 0) + column = int(match.group('column') or 0) + level = match.group('level').lower() + message = match.group('message') + + path = os.path.abspath(path) + + if path.startswith(base_dir): + path = path[len(base_dir):] + + if level == 'warning': + continue + + print('%s:%d:%d: %s: %s' % (path, lineno, column, level, message)) + + +if __name__ == '__main__': + main()