From c4c6a486c52d0b8f46648b73facd2c64c6d77d46 Mon Sep 17 00:00:00 2001 From: Agi Sferro Date: Thu, 29 Nov 2018 14:58:19 -0800 Subject: [PATCH] Issue #34: Add a way to filter errors. --- apilint/src/main/resources/apilint.py | 19 ++++++++++++++++++- apilint/src/test/resources/apilint_test.py | 4 +++- .../src/test/resources/apilint_test/tests.py | 2 ++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/apilint/src/main/resources/apilint.py b/apilint/src/main/resources/apilint.py index b50b4d1..68ef0e4 100644 --- a/apilint/src/main/resources/apilint.py +++ b/apilint/src/main/resources/apilint.py @@ -1552,6 +1552,12 @@ def dump_result_json(args, compat_fail, api_changes, failures): json.dump(result, args['result_json']) +def matches_filter(filter_, failure): + for f in filter_: + if failure.rule is not None and failure.rule.startswith(f): + return True + return False + if __name__ == "__main__": parser = argparse.ArgumentParser(description="Enforces common Android public API design \ patterns. It ignores lint messages from a previous API level, if provided.") @@ -1566,6 +1572,9 @@ def dump_result_json(args, compat_fail, api_changes, failures): help="Show API changes noticed") parser.add_argument("--show-deprecations-at-birth", action='store_const', const=True, help="Show API deprecations at birth") + parser.add_argument("--filter-errors", nargs='*', + help="Provide a list of erorr codes to consider. Filter will " + "select only error codes that starts with the codes specified.") parser.add_argument("--result-json", help="Put result in JSON file.", type=argparse.FileType('w')) args = vars(parser.parse_args()) @@ -1586,7 +1595,7 @@ def dump_result_json(args, compat_fail, api_changes, failures): show_deprecations_at_birth(cur, prev) sys.exit() - compat_fail = None + compat_fail = [] with current_file as f: cur_fail, cur_noticed, cur = examine_stream(f) @@ -1607,6 +1616,14 @@ def dump_result_json(args, compat_fail, api_changes, failures): # look for compatibility issues compat_fail = verify_compat(cur, prev) + # filter errors if filter was specified + if args['filter_errors'] is not None: + filtered_fail = {} + for p in cur_fail: + if matches_filter(args['filter_errors'], cur_fail[p]): + filtered_fail[p] = cur_fail[p] + cur_fail = filtered_fail + dump_result_json(args, compat_fail, cur_noticed, cur_fail) if compat_fail and len(compat_fail) != 0: diff --git a/apilint/src/test/resources/apilint_test.py b/apilint/src/test/resources/apilint_test.py index 5d905a1..4db96c2 100644 --- a/apilint/src/test/resources/apilint_test.py +++ b/apilint/src/test/resources/apilint_test.py @@ -40,7 +40,9 @@ json_file = "{}/{}-result.json".format(args.build_dir, t["test"]) test = ["python", "src/main/resources/apilint.py", "--result-json", json_file, - after_api, before_api, "--show-noticed"] + after_api, before_api, + "--filter-errors", t["filter"] if "filter" in t else "NONE", + "--show-noticed"] error_code = sp.call(test) diff --git a/apilint/src/test/resources/apilint_test/tests.py b/apilint/src/test/resources/apilint_test/tests.py index 8ca99aa..545ba5d 100644 --- a/apilint/src/test/resources/apilint_test/tests.py +++ b/apilint/src/test/resources/apilint_test/tests.py @@ -71,10 +71,12 @@ },{ "test": "test-fields-only-class", "expected": "API_ERROR", + "filter": "GV", "rule": "GV1" },{ "test": "test-fields-only-class-final", "expected": "API_ERROR", + "filter": "GV", "rule": "GV2" },{ "test": "test-whitespace-change",