Source code

Revision control

Copy as Markdown

Other Tools

# 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()