Skip to content

Instantly share code, notes, and snippets.

@opikalo
Created March 30, 2021 00:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save opikalo/1415210c0b97b18856193ab8944d7a70 to your computer and use it in GitHub Desktop.
Save opikalo/1415210c0b97b18856193ab8944d7a70 to your computer and use it in GitHub Desktop.
import argparse
import json
import logging
import re
import sys
import tqdm
logger = logging.getLogger(__name__)
DEFAULT_TEST_FILEPATH_REGEX = r'\S+/test/'
def drop_coverage(input_report, output_report, file_pattern):
""" Remove branch coverage from tests: this way only line coverage
will be reported within sonarqube for tests, avoiding low scores on
half the coverage for arrert(true) type of statements """
re_file_pattern = re.compile(file_pattern)
logger.debug("opening %s", input_report)
with open(input_report) as file_handle:
coverage_data = json.load(file_handle)
reconstructed_files = []
for covered_file in tqdm.tqdm(coverage_data['files'],
disable=not sys.stdout.isatty()):
# if file matches test pattern, drop it's branch coverage
file_name = covered_file["file"]
match = re.match(re_file_pattern, file_name)
if match:
logger.debug("dropping branch info for %s", file_name)
for line in covered_file['lines']:
line['branches'] = []
reconstructed_files.append(covered_file)
coverage_data['files'] = reconstructed_files
with open(output_report, 'w') as filehandle:
json.dump(coverage_data, filehandle)
logger.debug("finished writing %s", output_report)
def process_args(): # pragma: no cover
""" Process command line arguments, input/output, test pattern and log
level """
parser = argparse.ArgumentParser(
"Drop branch coverage for files matching pattern")
parser.add_argument('--json-input-report',
help='Name of the input gcovr json report file')
parser.add_argument('--json-output-report',
help='Name of the output gcovr json report file')
parser.add_argument('--test-file-pattern',
help='regex pattern for test files',
default=DEFAULT_TEST_FILEPATH_REGEX)
parser.add_argument("-l", "--log", dest="logLevel",
choices=['DEBUG', 'INFO', 'WARNING', 'ERROR',
'CRITICAL'],
default='INFO',
help="Set the logging level")
args = parser.parse_args()
return args
def main(): # pragma: no cover
args = process_args()
if args.logLevel:
logging.basicConfig(level=getattr(logging, args.logLevel))
drop_coverage(args.json_input_report, args.json_output_report,
args.test_file_pattern)
if __name__ == '__main__': # pragma: no cover
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment