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/resources/package-prefs.json b/resources/package-prefs.json index aa5d1d83303..d77d13f4b0c 100644 --- a/resources/package-prefs.json +++ b/resources/package-prefs.json @@ -7,56 +7,56 @@ "dom.serviceworker.timeout_seconds": 60, "dom.testable_crash.enabled": false, "dom.testbinding.enabled": false, - "js.baseline.enabled": true, - "js.ion.enabled": true, "js.asmjs.enabled": true, - "js.strict.enabled": false, - "js.strict.debug.enabled": false, - "js.throw_on_asmjs_validation_failure.enabled": false, - "js.native_regexp.enabled": true, - "js.parallel_parsing.enabled": true, - "js.ion.offthread_compilation.enabled": true, - "js.baseline.unsafe_eager_compilation.enabled": false, - "js.ion.unsafe_eager_compilation.enabled": false, - "js.discard_system_source.enabled": false, "js.asyncstack.enabled": false, - "js.throw_on_debuggee_would_run.enabled": false, + "js.baseline.enabled": true, + "js.baseline.unsafe_eager_compilation.enabled": false, + "js.discard_system_source.enabled": false, "js.dump_stack_on_debuggee_would_run.enabled": false, - "js.werror.enabled": false, - "js.shared_memory.enabled": true, - "js.mem.high_water_mark": 128, - "js.mem.max": -1, - "js.mem.gc.per_compartment.enabled": true, + "js.ion.enabled": true, + "js.ion.offthread_compilation.enabled": true, + "js.ion.unsafe_eager_compilation.enabled": false, + "js.mem.gc.allocation_threshold_mb": 30, + "js.mem.gc.compacting.enabled": true, + "js.mem.gc.decommit_threshold_mb": 32, + "js.mem.gc.dynamic_heap_growth.enabled": true, + "js.mem.gc.dynamic_mark_slice.enabled": true, + "js.mem.gc.empty_chunk_count_max": 30, + "js.mem.gc.empty_chunk_count_min": 1, + "js.mem.gc.high_frequency_heap_growth_max": 300, + "js.mem.gc.high_frequency_heap_growth_min": 150, + "js.mem.gc.high_frequency_high_limit_mb": 500, + "js.mem.gc.high_frequency_low_limit_mb": 100, + "js.mem.gc.high_frequency_time_limit_ms": 1000, "js.mem.gc.incremental.enabled": true, "js.mem.gc.incremental.slice_ms": 10, - "js.mem.gc.compacting.enabled": true, - "js.mem.gc.high_frequency_time_limit_ms": 1000, - "js.mem.gc.dynamic_mark_slice.enabled": true, - "js.mem.gc.refresh_frame_slices.enabled": true, - "js.mem.gc.dynamic_heap_growth.enabled": true, "js.mem.gc.low_frequency_heap_growth": 150, - "js.mem.gc.high_frequency_heap_growth_min": 150, - "js.mem.gc.high_frequency_heap_growth_max": 300, - "js.mem.gc.high_frequency_low_limit_mb": 100, - "js.mem.gc.high_frequency_high_limit_mb": 500, - "js.mem.gc.allocation_threshold_mb": 30, - "js.mem.gc.decommit_threshold_mb": 32, - "js.mem.gc.empty_chunk_count_min": 1, - "js.mem.gc.empty_chunk_count_max": 30, - "js.mem.gc.zeal.level": 0, + "js.mem.gc.per_compartment.enabled": true, + "js.mem.gc.refresh_frame_slices.enabled": true, "js.mem.gc.zeal.frequency": 100, - "layout.columns.enabled": false, - "layout.column-width.enabled": false, + "js.mem.gc.zeal.level": 0, + "js.mem.high_water_mark": 128, + "js.mem.max": -1, + "js.native_regexp.enabled": true, + "js.parallel_parsing.enabled": true, + "js.shared_memory.enabled": true, + "js.strict.debug.enabled": false, + "js.strict.enabled": false, + "js.throw_on_asmjs_validation_failure.enabled": false, + "js.throw_on_debuggee_would_run.enabled": false, + "js.werror.enabled": false, "layout.column-count.enabled": false, "layout.column-gap.enabled": false, - "layout.flex.enabled": false, + "layout.column-width.enabled": false, + "layout.columns.enabled": false, "layout.flex-direction.enabled": false, + "layout.flex.enabled": false, "layout.text-orientation.enabled": false, "layout.viewport.enabled": false, "layout.writing-mode.enabled": false, "network.http.redirection-limit": 20, "network.mime.sniff": false, + "shell.builtin-key-shortcuts.enabled": false, "shell.homepage": "https://servo.org", - "shell.native-titlebar.enabled": false, - "shell.builtin-key-shortcuts.enabled": false + "shell.native-titlebar.enabled": false } diff --git a/resources/prefs.json b/resources/prefs.json index 26b832385c7..c8fe13590e5 100644 --- a/resources/prefs.json +++ b/resources/prefs.json @@ -7,57 +7,57 @@ "dom.serviceworker.timeout_seconds": 60, "dom.testable_crash.enabled": false, "dom.testbinding.enabled": false, - "js.baseline.enabled": true, - "js.ion.enabled": true, "js.asmjs.enabled": true, - "js.strict.enabled": false, - "js.strict.debug.enabled": false, - "js.throw_on_asmjs_validation_failure.enabled": false, - "js.native_regexp.enabled": true, - "js.parallel_parsing.enabled": true, - "js.ion.offthread_compilation.enabled": true, - "js.baseline.unsafe_eager_compilation.enabled": false, - "js.ion.unsafe_eager_compilation.enabled": false, - "js.discard_system_source.enabled": false, "js.asyncstack.enabled": false, - "js.throw_on_debuggee_would_run.enabled": false, + "js.baseline.enabled": true, + "js.baseline.unsafe_eager_compilation.enabled": false, + "js.discard_system_source.enabled": false, "js.dump_stack_on_debuggee_would_run.enabled": false, - "js.werror.enabled": false, - "js.shared_memory.enabled": true, - "js.mem.high_water_mark": 128, - "js.mem.max": -1, - "js.mem.gc.per_compartment.enabled": true, + "js.ion.enabled": true, + "js.ion.offthread_compilation.enabled": true, + "js.ion.unsafe_eager_compilation.enabled": false, + "js.mem.gc.allocation_threshold_mb": 30, + "js.mem.gc.compacting.enabled": true, + "js.mem.gc.decommit_threshold_mb": 32, + "js.mem.gc.dynamic_heap_growth.enabled": true, + "js.mem.gc.dynamic_mark_slice.enabled": true, + "js.mem.gc.empty_chunk_count_max": 30, + "js.mem.gc.empty_chunk_count_min": 1, + "js.mem.gc.high_frequency_heap_growth_max": 300, + "js.mem.gc.high_frequency_heap_growth_min": 150, + "js.mem.gc.high_frequency_high_limit_mb": 500, + "js.mem.gc.high_frequency_low_limit_mb": 100, + "js.mem.gc.high_frequency_time_limit_ms": 1000, "js.mem.gc.incremental.enabled": true, "js.mem.gc.incremental.slice_ms": 10, - "js.mem.gc.compacting.enabled": true, - "js.mem.gc.high_frequency_time_limit_ms": 1000, - "js.mem.gc.dynamic_mark_slice.enabled": true, - "js.mem.gc.refresh_frame_slices.enabled": true, - "js.mem.gc.dynamic_heap_growth.enabled": true, "js.mem.gc.low_frequency_heap_growth": 150, - "js.mem.gc.high_frequency_heap_growth_min": 150, - "js.mem.gc.high_frequency_heap_growth_max": 300, - "js.mem.gc.high_frequency_low_limit_mb": 100, - "js.mem.gc.high_frequency_high_limit_mb": 500, - "js.mem.gc.allocation_threshold_mb": 30, - "js.mem.gc.decommit_threshold_mb": 32, - "js.mem.gc.empty_chunk_count_min": 1, - "js.mem.gc.empty_chunk_count_max": 30, - "js.mem.gc.zeal.level": 0, + "js.mem.gc.per_compartment.enabled": true, + "js.mem.gc.refresh_frame_slices.enabled": true, "js.mem.gc.zeal.frequency": 100, + "js.mem.gc.zeal.level": 0, + "js.mem.high_water_mark": 128, + "js.mem.max": -1, + "js.native_regexp.enabled": true, + "js.parallel_parsing.enabled": true, + "js.shared_memory.enabled": true, + "js.strict.debug.enabled": false, + "js.strict.enabled": false, + "js.throw_on_asmjs_validation_failure.enabled": false, + "js.throw_on_debuggee_would_run.enabled": false, + "js.werror.enabled": false, "layout.animations.test.enabled": false, - "layout.columns.enabled": false, - "layout.column-width.enabled": false, "layout.column-count.enabled": false, "layout.column-gap.enabled": false, - "layout.flex.enabled": false, + "layout.column-width.enabled": false, + "layout.columns.enabled": false, "layout.flex-direction.enabled": false, + "layout.flex.enabled": false, "layout.text-orientation.enabled": false, "layout.viewport.enabled": false, "layout.writing-mode.enabled": false, "network.http.redirection-limit": 20, "network.mime.sniff": false, + "shell.builtin-key-shortcuts.enabled": true, "shell.homepage": "http://servo.org", - "shell.native-titlebar.enabled": true, - "shell.builtin-key-shortcuts.enabled": true + "shell.native-titlebar.enabled": true } 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