101 lines
3.5 KiB
Python
Executable File
101 lines
3.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
__help__ = """Print stats of overall project progress
|
|
|
|
# Usage: find src/ -name "*.c" | xargs ./tools/progress.py
|
|
"""
|
|
|
|
import argparse
|
|
import sys
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description=__help__, allow_abbrev=False)
|
|
parser.add_argument("files", metavar="FILE", nargs="+", help="sources")
|
|
parser.add_argument("--sort", dest="sortkey", choices=["name", "percent", "completed", "total", "missing_contribution"], default="missing_contribution", help="key to sort on")
|
|
parser.add_argument("-r", "--reverse", action="store_true", help="sort reverse")
|
|
args = parser.parse_args()
|
|
|
|
files = []
|
|
|
|
total_funcs = 0
|
|
stubbed_funcs = 0
|
|
unimplemented_funcs = 0
|
|
|
|
for file_name in args.files:
|
|
|
|
# we don't care about harness code
|
|
if 'harness' in file_name:
|
|
continue
|
|
|
|
f = open(file_name, 'r')
|
|
|
|
in_function = False
|
|
|
|
file_total = 0
|
|
file_stubbed = 0
|
|
file_unimplemented = 0
|
|
|
|
while True:
|
|
line = f.readline()
|
|
if line == '':
|
|
break
|
|
|
|
if line[0].isalpha() and '(' in line and line[-2] == '{':
|
|
in_function = True
|
|
file_total = file_total + 1
|
|
if line[0] == '}' and in_function == True:
|
|
# leaving function
|
|
in_function = False
|
|
|
|
if in_function:
|
|
if line.strip() == 'NOT_IMPLEMENTED();':
|
|
file_unimplemented = file_unimplemented + 1
|
|
elif line.strip() == 'STUB();':
|
|
file_stubbed = file_stubbed + 1
|
|
elif line.strip() == 'STUB_ONCE();':
|
|
file_stubbed = file_stubbed + 1
|
|
|
|
|
|
if file_total > 0:
|
|
completed = file_total - (file_stubbed + file_unimplemented)
|
|
file = {
|
|
'name': file_name,
|
|
'percent': round((completed / file_total) * 100),
|
|
'completed': completed,
|
|
'total': file_total,
|
|
}
|
|
files.append(file)
|
|
|
|
total_nb_functions = sum(f['total'] for f in files)
|
|
total_implemented_functions = sum(f['completed'] for f in files)
|
|
total_missing_functions = total_nb_functions - total_implemented_functions
|
|
for f in files:
|
|
f['missing_contribution'] = 100 * (f['total'] - f['completed']) / total_missing_functions
|
|
|
|
print('{0:45} {1:>7} {2:>9} / {3:>5} {4:>7}'.format('name', 'percent', 'completed', 'total', 'missing'))
|
|
print("=======================================")
|
|
|
|
completed_funcs = 0
|
|
total_funcs = 0
|
|
for f in sorted(files, key=lambda x: x[args.sortkey], reverse=not args.reverse):
|
|
print('{0:45} {1:>6}% {2:>9} / {3:>5} {4:>6.2f}%'.format(f['name'], f['percent'], f['completed'], f['total'], f['missing_contribution']))
|
|
|
|
total_funcs = total_funcs + f['total']
|
|
completed_funcs = completed_funcs + f['completed']
|
|
|
|
|
|
print('{0:45} {1:>7} {2:>9} / {3:>5} {4:>7}'.format('name', 'percent', 'completed', 'total', 'missing'))
|
|
print("=======================================")
|
|
percent_completed = round((completed_funcs / total_funcs) * 100)
|
|
print('{0:45} {1:5}% {2:>9} / {3:>4}'.format('total', percent_completed, completed_funcs, total_funcs))
|
|
|
|
print()
|
|
print('Overall progress:')
|
|
print('{0}% of all functions implemented. ({1} completed / {2} total)'.format(percent_completed, completed_funcs, total_funcs))
|
|
|
|
return 0
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|