diff options
Diffstat (limited to 'test/tools/dump_coveralls.py')
-rwxr-xr-x | test/tools/dump_coveralls.py | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/test/tools/dump_coveralls.py b/test/tools/dump_coveralls.py new file mode 100755 index 0000000..a96dc92 --- /dev/null +++ b/test/tools/dump_coveralls.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 + +# Small tool to dump JSON payload for coveralls.io API + +import json +from operator import itemgetter +import os +import sys + + +def warn(*args, **kwargs): + print(*args, file=sys.stderr, **kwargs) + + +def dump_file(json_file): + """Dumps coveralls.io API payload stored in json_file + Returns: 0 if successful, 1 otherwise + """ + try: + with open(json_file, encoding='utf8') as f: + data = json.load(f) + except OSError as err: + warn(err) + return os.EX_DATAERR + except json.decoder.JSONDecodeError: + warn("{}: json parsing error".format(json_file)) + return 1 + + if 'source_files' not in data: + warn("{}: no source_files, not a coveralls.io payload?".format(json_file)) + return 1 + + print("{} ({} source files)".format(json_file, len(data['source_files']))) + + for src_file in sorted(data['source_files'], key=itemgetter('name')): + covered_lines = not_skipped_lines = 0 + for cnt in src_file['coverage']: + if cnt is None: + continue + not_skipped_lines += 1 + if cnt > 0: + covered_lines += 1 + if not_skipped_lines > 0: + coverage = "{:.0%}".format(covered_lines / not_skipped_lines) + else: + coverage = 'N/A' + + print("\t{:>3} {}".format(coverage, src_file['name'])) + + return 0 + + +def main(): + if (len(sys.argv) < 2): + warn("usage: {} file.json ...".format(sys.argv[0])) + return os.EX_USAGE + + exit_status = 0 + for f in sys.argv[1:]: + exit_status += dump_file(f) + + return exit_status + + +if __name__ == '__main__': + sys.exit(main()) |