dfhack/ci/script-docs.py

80 lines
2.5 KiB
Python

#!/usr/bin/env python3
import os
from os.path import basename, dirname, exists, join, splitext
import sys
SCRIPT_PATH = sys.argv[1] if len(sys.argv) > 1 else 'scripts'
DOCS_PATH = join(SCRIPT_PATH, 'docs')
IS_GITHUB_ACTIONS = bool(os.environ.get('GITHUB_ACTIONS'))
def get_cmd(path):
"""Get the command from the name of a script."""
dname, fname = basename(dirname(path)), splitext(basename(path))[0]
if dname in ('devel', 'fix', 'gui', 'modtools'):
return dname + '/' + fname
return fname
def print_error(message, filename, line=None):
if not isinstance(line, int):
line = 1
print('Error: %s:%i: %s' % (filename, line, message))
if IS_GITHUB_ACTIONS:
print('::error file=%s,line=%i::%s' % (filename, line, message))
def check_ls(docfile, lines):
"""Check length & existence of first sentence for "ls" builtin command."""
# TODO
return 0
def check_file(fname):
errors, doc_start_line = 0, None
docfile = join(DOCS_PATH, get_cmd(fname)+'.rst')
if not exists(docfile):
print_error('missing documentation file: {!r}'.format(docfile), fname)
return 1
with open(docfile, errors='ignore') as f:
lines = f.readlines()
if not lines:
print_error('empty documentation file', docfile)
return 1
for i, l in enumerate(lines):
l = l.strip()
if l and not doc_start_line and doc_start_line != 0:
doc_start_line = i
doc_end_line = i
lines[i] = l
errors += check_ls(docfile, lines)
title, underline = lines[doc_start_line:doc_start_line+2]
expected_underline = '=' * len(title)
if underline != expected_underline:
print_error('title/underline mismatch: expected {!r}, got {!r}'.format(
expected_underline, underline),
docfile, doc_start_line+1)
errors += 1
if title != get_cmd(fname):
print_error('expected script title {!r}, got {!r}'.format(
get_cmd(fname), title),
docfile, doc_start_line)
errors += 1
return errors
def main():
"""Check that all DFHack scripts include documentation"""
err = 0
exclude = {'.git', 'internal', 'test'}
for root, dirs, files in os.walk(SCRIPT_PATH, topdown=True):
dirs[:] = [d for d in dirs if d not in exclude]
for f in files:
if f.split('.')[-1] in {'rb', 'lua'}:
err += check_file(join(root, f))
return err
if __name__ == '__main__':
sys.exit(min(100, main()))