aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYuki Izumi <kivikakk@github.com>2016-11-07 19:02:22 +1100
committerYuki Izumi <kivikakk@github.com>2016-11-07 19:02:22 +1100
commitd47aca18c4bb199feb1cd4674defaa27ce71ee85 (patch)
tree3c78a320e385252ad6eeef7e9c5d1cfe8b79fa32
parentc62ce53efa75c1d817669253036c2621caac88bf (diff)
downloadservo-d47aca18c4bb199feb1cd4674defaa27ce71ee85.tar.gz
servo-d47aca18c4bb199feb1cd4674defaa27ce71ee85.zip
Check for JSON key non-duplication and order
-rw-r--r--python/tidy/servo_tidy/tidy.py21
-rw-r--r--python/tidy/servo_tidy_tests/test_tidy.py6
-rw-r--r--python/tidy/servo_tidy_tests/unordered_key.json7
-rw-r--r--servo-tidy.toml4
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