summaryrefslogtreecommitdiff
path: root/test/CheckOptions.py
diff options
context:
space:
mode:
authorAlexis Hildebrandt <afh@surryhill.net>2015-01-27 11:55:08 +0100
committerAlexis Hildebrandt <afh@surryhill.net>2015-01-27 22:02:59 +0100
commit11a01f1b5aeff063740edfbe99dba35003237551 (patch)
treec30df6911bd553f2229c1012214963a589d1c393 /test/CheckOptions.py
parent19f4f587f0a527056707465bdd9b441a53236711 (diff)
downloadfork-ledger-11a01f1b5aeff063740edfbe99dba35003237551.tar.gz
fork-ledger-11a01f1b5aeff063740edfbe99dba35003237551.tar.bz2
fork-ledger-11a01f1b5aeff063740edfbe99dba35003237551.zip
[doc] Report undocumented value expression functions
in the manpage and texinfo manual.
Diffstat (limited to 'test/CheckOptions.py')
-rwxr-xr-xtest/CheckOptions.py48
1 files changed, 38 insertions, 10 deletions
diff --git a/test/CheckOptions.py b/test/CheckOptions.py
index 124ce197..5059a289 100755
--- a/test/CheckOptions.py
+++ b/test/CheckOptions.py
@@ -22,16 +22,21 @@ class CheckOptions (object):
self.ledger = os.path.abspath(args.ledger)
self.source = os.path.abspath(args.source)
- self.missing_baseline_tests = set()
self.missing_options = set()
self.unknown_options = set()
+ self.missing_functions = set()
+ self.unknown_functions = set()
- def find_options(self, filename):
- regex = re.compile(self.option_pattern)
+ def find_pattern(self, filename, pattern):
+ regex = re.compile(pattern)
return {match.group(1) for match in {regex.match(line) for line in open(filename)} if match}
+ def find_options(self, filename):
+ return self.find_pattern(filename, self.option_pattern)
+
+ def find_functions(self, filename):
+ return self.find_pattern(filename, self.function_pattern)
def find_alternates(self):
- regex = re.compile(r'OPT_ALT\([^,]*,\s*([^)]+?)_?\)');
command = shlex.split('grep --no-filename OPT_ALT')
for source_file in ['session', 'report']:
command.append(os.path.join(self.source, 'src', '%s.cc' % source_file))
@@ -39,6 +44,8 @@ class CheckOptions (object):
output = subprocess.check_output(command).split('\n');
except subprocess.CalledProcessError:
output = ''
+
+ regex = re.compile(r'OPT_ALT\([^,]*,\s*([^)]+?)_?\)');
alternates = {match.group(1).replace('_', '-') for match in {regex.search(line) for line in output} if match}
return alternates
@@ -49,22 +56,43 @@ class CheckOptions (object):
ledger_options = {match.group(1).replace('_', '-') for match in {regex.search(line.decode()) for line in pipe.stderr} if match}
return ledger_options
+ def ledger_functions(self):
+ command = shlex.split('grep --no-filename fn_ %s' % (os.path.join(self.source, 'src', 'report.h')))
+ try:
+ output = subprocess.check_output(command).split('\n');
+ except subprocess.CalledProcessError:
+ output = ''
+
+ regex = re.compile(r'fn_([^(]+)\(');
+ functions = {match.group(1) for match in {regex.search(line) for line in output} if match}
+ return functions
+
def main(self):
options = self.find_options(self.source_file)
-
for option in self.ledger_options():
if option not in options:
self.missing_options.add(option)
else:
options.remove(option)
-
known_alternates = self.find_alternates()
self.unknown_options = {option for option in options if option not in known_alternates}
+ functions = self.find_functions(self.source_file)
+ for function in self.ledger_functions():
+ if function not in functions:
+ self.missing_functions.add(function)
+ else:
+ functions.remove(function)
+ known_functions = ['tag', 'has_tag']
+ self.unknown_functions = {function for function in functions if function not in known_functions}
+
if len(self.missing_options):
- print("Missing %s entries for:%s%s\n" % (self.source_type, self.sep, self.sep.join(sorted(list(self.missing_options)))))
+ print("Missing %s option entries for:%s%s\n" % (self.source_type, self.sep, self.sep.join(sorted(list(self.missing_options)))))
if len(self.unknown_options):
- print("%s entry for unknown options:%s%s" % (self.source_type, self.sep, self.sep.join(sorted(list(self.unknown_options)))))
-
- errors = len(self.missing_options) + len(self.unknown_options)
+ print("%s entry for unknown options:%s%s\n" % (self.source_type, self.sep, self.sep.join(sorted(list(self.unknown_options)))))
+ if len(self.missing_functions):
+ print("Missing %s function entries for:%s%s\n" % (self.source_type, '\n ', '\n '.join(sorted(list(self.missing_functions)))))
+ if len(self.unknown_functions):
+ print("%s entry for unknown functions:%s%s\n" % (self.source_type, '\n ', '\n '.join(sorted(list(self.unknown_functions)))))
+ errors = len(self.missing_options) + len(self.unknown_options) + len(self.missing_functions) + len(self.unknown_functions)
return errors