diff --git a/scripts/maint/practracker/metrics.py b/scripts/maint/practracker/metrics.py index 525a058405d69f1eb353c3ac00795b84e7b889d8..c7d2091d0514c7319dc0fdb2c282000184219f12 100644 --- a/scripts/maint/practracker/metrics.py +++ b/scripts/maint/practracker/metrics.py @@ -1,8 +1,12 @@ #!/usr/bin/python +# Implementation of various source code metrics. +# These are currently ad-hoc string operations and regexps. +# We might want to use a proper static analysis library in the future, if we want to get more advanced metrics. + import re -def file_len(f): +def get_file_len(f): """Get file length of file""" for i, l in enumerate(f): pass @@ -16,14 +20,20 @@ def get_include_count(f): include_count += 1 return include_count -def function_lines(f): +def get_function_lines(f): """ Return iterator which iterates over functions and returns (function name, function lines) """ - # XXX Buggy! Doesn't work with MOCK_IMPL and ENABLE_GCC_WARNINGS + # Skip lines with these terms since they confuse our regexp + REGEXP_CONFUSE_TERMS = ["MOCK_IMPL", "ENABLE_GCC_WARNINGS", "ENABLE_GCC_WARNING", "DUMMY_TYPECHECK_INSTANCE", + "DISABLE_GCC_WARNING", "DISABLE_GCC_WARNINGS"] + in_function = False for lineno, line in enumerate(f): + if any(x in line for x in REGEXP_CONFUSE_TERMS): + continue + if not in_function: # find the start of a function m = re.match(r'^([a-zA-Z_][a-zA-Z_0-9]*),?\(', line) @@ -31,6 +41,7 @@ def function_lines(f): func_name = m.group(1) func_start = lineno in_function = True + else: # Fund the end of a function if line.startswith("}"): diff --git a/scripts/maint/practracker/practracker_tests.py b/scripts/maint/practracker/practracker_tests.py index f3d225207afd1a2a28c036d1cee3ba65183f66e1..cdbab2908e0b2c8c784aaef5e37a9358d4c18d5d 100755 --- a/scripts/maint/practracker/practracker_tests.py +++ b/scripts/maint/practracker/practracker_tests.py @@ -40,6 +40,10 @@ class TestFunctionLength(unittest.TestCase): # All functions should have length 2 for name, lines in metrics.function_lines(funcs): self.assertEqual(name, "fun") + + funcs.seek(0) + + for name, lines in metrics.function_lines(funcs): self.assertEqual(lines, 2) if __name__ == '__main__':