dfhack/travis/script-in-readme.py

67 lines
2.1 KiB
Python

from __future__ import print_function
from io import open
import os
from os.path import basename, dirname, join, splitext
import sys
def expected_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 check_ls(fname, line):
"""Check length & existence of leading comment for "ls" builtin command."""
line = line.strip()
comment = '--' if fname.endswith('.lua') else '#'
if line.endswith('=begin') or not line.startswith(comment):
print('Error: no leading comment in ' + fname)
return 1
return 0
def check_file(fname):
errors, doclines = 0, []
with open(fname, errors='ignore') as f:
lines = f.readlines()
errors += check_ls(fname, lines[0])
for l in lines:
if doclines or l.strip().endswith('=begin'):
doclines.append(l.rstrip())
if l.startswith('=end'):
break
else:
if doclines:
print('Error: docs start but not end: ' + fname)
else:
print('Error: no documentation in: ' + fname)
return 1
title, underline = [d for d in doclines if d and '=begin' not in d][:2]
if underline != '=' * len(title):
print('Error: title/underline mismatch:', fname, title, underline)
errors += 1
if title != expected_cmd(fname):
print('Warning: expected script title {}, got {}'.format(
expected_cmd(fname), title))
errors += 1
return errors
def main():
"""Check that all DFHack scripts include documentation (not 3rdparty)"""
err = 0
for root, _, files in os.walk('scripts'):
for f in files:
# TODO: remove 3rdparty exemptions from checks
# Requires reading their CMakeLists to only apply to used scripts
if f[-3:] in {'.rb', 'lua'} and '3rdparty' not in root:
err += check_file(join(root, f))
return err
if __name__ == '__main__':
sys.exit(bool(main()))