| # This script can be used to compare IdnaTestV2.json across revisions, with some manual labor. It is |
| # used primarily for review and to add to IdnaTestV2-removed.json, to ensure we never lose a test. |
| # (IdnaTestV2.json is the output of IdnaTestV2-parser.py.) |
| |
| import argparse |
| import json |
| |
| def compute_differences(): |
| data_old = None |
| data_new = None |
| with open("IdnaTestV2-old.json", "r") as file_handle: |
| data_old = json.load(file_handle) |
| |
| with open("IdnaTestV2-new.json", "r") as file_handle: |
| data_new = json.load(file_handle) |
| |
| added_tests = [] |
| changed_tests = [] |
| removed_tests = [] |
| |
| for old_test in data_old: |
| if isinstance(old_test, str): |
| continue |
| found = None |
| for new_test in data_new: |
| if isinstance(new_test, str): |
| continue |
| if old_test["input"] == new_test["input"]: |
| found = new_test |
| break |
| |
| if not found: |
| # We now exclude ? as it's a forbidden domain code point. This check can be removed in the future. |
| if "?" not in old_test["input"]: |
| removed_tests.append(old_test) |
| # For changed tests we only care about parsing no longer succeeding. |
| elif old_test["output"] != found["output"] and old_test["output"]: |
| changed_tests.append({ "input": old_test["input"], "output_old": old_test["output"], "output_new": found["output"] }) |
| |
| for new_test in data_new: |
| if isinstance(new_test, str): |
| continue |
| found = False |
| for old_test in data_old: |
| if isinstance(old_test, str): |
| continue |
| if new_test["input"] == old_test["input"]: |
| found = True |
| break |
| if not found: |
| added_tests.append(new_test) |
| |
| return { "added": added_tests, "changed": changed_tests, "removed": removed_tests } |
| |
| def main(): |
| parser = argparse.ArgumentParser(epilog="Thanks for caring about IDNA!") |
| group = parser.add_mutually_exclusive_group(required=True) |
| group.add_argument("--differences", action="store_true", help="Output the differences") |
| group.add_argument("--removed", action="store_true", help="Output the removed tests only") |
| args = parser.parse_args() |
| |
| differences = compute_differences() |
| |
| output = None |
| |
| if args.differences: |
| output = differences |
| elif args.removed: |
| output = differences["removed"] |
| |
| print(json.dumps(output, sort_keys=True, allow_nan=False, indent=2, separators=(',', ': '))) |
| |
| main() |