diff options
author | Yuki Izumi <kivikakk@github.com> | 2016-11-07 19:02:22 +1100 |
---|---|---|
committer | Yuki Izumi <kivikakk@github.com> | 2016-11-07 19:02:22 +1100 |
commit | d47aca18c4bb199feb1cd4674defaa27ce71ee85 (patch) | |
tree | 3c78a320e385252ad6eeef7e9c5d1cfe8b79fa32 | |
parent | c62ce53efa75c1d817669253036c2621caac88bf (diff) | |
download | servo-d47aca18c4bb199feb1cd4674defaa27ce71ee85.tar.gz servo-d47aca18c4bb199feb1cd4674defaa27ce71ee85.zip |
Check for JSON key non-duplication and order
-rw-r--r-- | python/tidy/servo_tidy/tidy.py | 21 | ||||
-rw-r--r-- | python/tidy/servo_tidy_tests/test_tidy.py | 6 | ||||
-rw-r--r-- | python/tidy/servo_tidy_tests/unordered_key.json | 7 | ||||
-rw-r--r-- | servo-tidy.toml | 4 |
4 files changed, 35 insertions, 3 deletions
diff --git a/python/tidy/servo_tidy/tidy.py b/python/tidy/servo_tidy/tidy.py index 98eb8fa2d94..45ad2f44638 100644 --- a/python/tidy/servo_tidy/tidy.py +++ b/python/tidy/servo_tidy/tidy.py @@ -27,6 +27,7 @@ CONFIG_FILE_PATH = os.path.join(".", "servo-tidy.toml") config = { "skip-check-length": False, "skip-check-licenses": False, + "check-ordered-json-keys": [], "ignore": { "files": [ "./.", # ignore hidden files @@ -636,23 +637,37 @@ def check_for_possible_duplicate_json_keys(key_value_pairs): seen_keys = set() for key in keys: if key in seen_keys: - raise KeyError(key) + raise KeyError("Duplicated Key (%s)" % key) seen_keys.add(key) +def check_for_alphabetical_sorted_json_keys(key_value_pairs): + for a, b in zip(key_value_pairs[:-1], key_value_pairs[1:]): + if a[0] > b[0]: + raise KeyError("Unordered key (found %s before %s)" % (a[0], b[0])) + + +def check_json_requirements(filename): + def check_fn(key_value_pairs): + check_for_possible_duplicate_json_keys(key_value_pairs) + if filename in config["check-ordered-json-keys"]: + check_for_alphabetical_sorted_json_keys(key_value_pairs) + return check_fn + + def check_json(filename, contents): if not filename.endswith(".json"): raise StopIteration try: - json.loads(contents, object_pairs_hook=check_for_possible_duplicate_json_keys) + json.loads(contents, object_pairs_hook=check_json_requirements(filename)) except ValueError as e: match = re.search(r"line (\d+) ", e.message) line_no = match and match.group(1) yield (line_no, e.message) except KeyError as e: - yield (None, "Duplicated Key (%s)" % e.message) + yield (None, e.message) def check_spec(file_name, lines): diff --git a/python/tidy/servo_tidy_tests/test_tidy.py b/python/tidy/servo_tidy_tests/test_tidy.py index d997bb00f82..6dd97aee7e3 100644 --- a/python/tidy/servo_tidy_tests/test_tidy.py +++ b/python/tidy/servo_tidy_tests/test_tidy.py @@ -171,6 +171,12 @@ class CheckTidiness(unittest.TestCase): self.assertEqual('Duplicated Key (the_duplicated_key)', errors.next()[2]) self.assertNoMoreErrors(errors) + def test_json_with_unordered_keys(self): + tidy.config["check-ordered-json-keys"].append('python/tidy/servo_tidy_tests/unordered_key.json') + errors = tidy.collect_errors_for_files(iterFile('unordered_key.json'), [tidy.check_json], [], print_text=False) + self.assertEqual('Unordered key (found b before a)', errors.next()[2]) + self.assertNoMoreErrors(errors) + def test_lock(self): errors = tidy.collect_errors_for_files(iterFile('duplicated_package.lock'), [tidy.check_lock], [], print_text=False) msg = """duplicate versions for package "test" diff --git a/python/tidy/servo_tidy_tests/unordered_key.json b/python/tidy/servo_tidy_tests/unordered_key.json new file mode 100644 index 00000000000..36f0a13f9c2 --- /dev/null +++ b/python/tidy/servo_tidy_tests/unordered_key.json @@ -0,0 +1,7 @@ +{ + "key": "value", + "other_key": { + "b": 1, + "a": 2 + } +} diff --git a/servo-tidy.toml b/servo-tidy.toml index f96cadc62cf..b0df193e7fb 100644 --- a/servo-tidy.toml +++ b/servo-tidy.toml @@ -1,6 +1,10 @@ [configs] skip-check-length = false skip-check-licenses = false +check-ordered-json-keys = [ + "./resources/prefs.json", + "./resources/package-prefs.json", +] [ignore] # Ignored packages with duplicated versions |