mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
Add utils/doclinter.py; a documenter linter for Sphinx
This commit is contained in:
parent
935d1ad0af
commit
5d2c8e6eb7
9
tox.ini
9
tox.ini
@ -66,6 +66,15 @@ extras =
|
|||||||
commands =
|
commands =
|
||||||
python setup.py build_sphinx {posargs}
|
python setup.py build_sphinx {posargs}
|
||||||
|
|
||||||
|
[testenv:docslint]
|
||||||
|
basepython = python3
|
||||||
|
description =
|
||||||
|
Lint documentation.
|
||||||
|
extras =
|
||||||
|
docs
|
||||||
|
commands =
|
||||||
|
python utils/doclinter.py CHANGES CONTRIBUTING.rst README.rst doc/
|
||||||
|
|
||||||
[testenv:bindep]
|
[testenv:bindep]
|
||||||
description =
|
description =
|
||||||
Install binary dependencies.
|
Install binary dependencies.
|
||||||
|
59
utils/doclinter.py
Normal file
59
utils/doclinter.py
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
"""
|
||||||
|
utils.doclinter
|
||||||
|
~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
A linter for Sphinx docs
|
||||||
|
|
||||||
|
:copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
|
||||||
|
:license: BSD, see LICENSE for details.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
from typing import List
|
||||||
|
|
||||||
|
|
||||||
|
MAX_LINE_LENGTH = 100
|
||||||
|
|
||||||
|
|
||||||
|
def lint(path: str) -> int:
|
||||||
|
with open(path) as f:
|
||||||
|
document = f.readlines()
|
||||||
|
|
||||||
|
errors = 0
|
||||||
|
for i, line in enumerate(document):
|
||||||
|
if line.endswith(' '):
|
||||||
|
print('%s:%d: the line ends with whitespace.' %
|
||||||
|
(path, i + 1))
|
||||||
|
errors += 1
|
||||||
|
|
||||||
|
if len(line) > MAX_LINE_LENGTH:
|
||||||
|
if re.match(r'^\s*\.\. ', line):
|
||||||
|
# ignore directives and hyperlink targets
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
print('%s:%d: the line is too long (%d > %d).' %
|
||||||
|
(path, i + 1, len(line), MAX_LINE_LENGTH))
|
||||||
|
errors += 1
|
||||||
|
|
||||||
|
return errors
|
||||||
|
|
||||||
|
|
||||||
|
def main(args: List[str]) -> int:
|
||||||
|
errors = 0
|
||||||
|
for directory in args:
|
||||||
|
for root, dirs, files in os.walk(directory):
|
||||||
|
for filename in files:
|
||||||
|
if filename.endswith('.rst'):
|
||||||
|
path = os.path.join(root, filename)
|
||||||
|
errors += lint(path)
|
||||||
|
|
||||||
|
if errors:
|
||||||
|
return 1
|
||||||
|
else:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.exit(main(sys.argv[1:]))
|
Loading…
Reference in New Issue
Block a user