mirror of
https://github.com/servo/servo.git
synced 2025-08-04 13:10:20 +01:00
Auto merge of #14092 - kivikakk:sort-check, r=Wafflespeanut
Sort check on JSON <!-- Please describe your changes on the following line: --> Check that JSON keys are ordered, and that there's no duplicates (for `resources/prefs.json` and `resources/package-prefs.json`). --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: --> - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors - [x] 🆕 `./mach test-tidy --self-test` does not report any errors - [x] These changes fix #12283 <!-- Either: --> - [x] There are tests for these changes 🎉 <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/14092) <!-- Reviewable:end -->
This commit is contained in:
commit
94d0c485e1
6 changed files with 107 additions and 75 deletions
|
@ -27,6 +27,7 @@ CONFIG_FILE_PATH = os.path.join(".", "servo-tidy.toml")
|
||||||
config = {
|
config = {
|
||||||
"skip-check-length": False,
|
"skip-check-length": False,
|
||||||
"skip-check-licenses": False,
|
"skip-check-licenses": False,
|
||||||
|
"check-ordered-json-keys": [],
|
||||||
"ignore": {
|
"ignore": {
|
||||||
"files": [
|
"files": [
|
||||||
"./.", # ignore hidden files
|
"./.", # ignore hidden files
|
||||||
|
@ -636,23 +637,37 @@ def check_for_possible_duplicate_json_keys(key_value_pairs):
|
||||||
seen_keys = set()
|
seen_keys = set()
|
||||||
for key in keys:
|
for key in keys:
|
||||||
if key in seen_keys:
|
if key in seen_keys:
|
||||||
raise KeyError(key)
|
raise KeyError("Duplicated Key (%s)" % key)
|
||||||
|
|
||||||
seen_keys.add(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):
|
def check_json(filename, contents):
|
||||||
if not filename.endswith(".json"):
|
if not filename.endswith(".json"):
|
||||||
raise StopIteration
|
raise StopIteration
|
||||||
|
|
||||||
try:
|
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:
|
except ValueError as e:
|
||||||
match = re.search(r"line (\d+) ", e.message)
|
match = re.search(r"line (\d+) ", e.message)
|
||||||
line_no = match and match.group(1)
|
line_no = match and match.group(1)
|
||||||
yield (line_no, e.message)
|
yield (line_no, e.message)
|
||||||
except KeyError as e:
|
except KeyError as e:
|
||||||
yield (None, "Duplicated Key (%s)" % e.message)
|
yield (None, e.message)
|
||||||
|
|
||||||
|
|
||||||
def check_spec(file_name, lines):
|
def check_spec(file_name, lines):
|
||||||
|
|
|
@ -171,6 +171,12 @@ class CheckTidiness(unittest.TestCase):
|
||||||
self.assertEqual('Duplicated Key (the_duplicated_key)', errors.next()[2])
|
self.assertEqual('Duplicated Key (the_duplicated_key)', errors.next()[2])
|
||||||
self.assertNoMoreErrors(errors)
|
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):
|
def test_lock(self):
|
||||||
errors = tidy.collect_errors_for_files(iterFile('duplicated_package.lock'), [tidy.check_lock], [], print_text=False)
|
errors = tidy.collect_errors_for_files(iterFile('duplicated_package.lock'), [tidy.check_lock], [], print_text=False)
|
||||||
msg = """duplicate versions for package "test"
|
msg = """duplicate versions for package "test"
|
||||||
|
|
7
python/tidy/servo_tidy_tests/unordered_key.json
Normal file
7
python/tidy/servo_tidy_tests/unordered_key.json
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"key": "value",
|
||||||
|
"other_key": {
|
||||||
|
"b": 1,
|
||||||
|
"a": 2
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,56 +7,56 @@
|
||||||
"dom.serviceworker.timeout_seconds": 60,
|
"dom.serviceworker.timeout_seconds": 60,
|
||||||
"dom.testable_crash.enabled": false,
|
"dom.testable_crash.enabled": false,
|
||||||
"dom.testbinding.enabled": false,
|
"dom.testbinding.enabled": false,
|
||||||
"js.baseline.enabled": true,
|
|
||||||
"js.ion.enabled": true,
|
|
||||||
"js.asmjs.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.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.dump_stack_on_debuggee_would_run.enabled": false,
|
||||||
"js.werror.enabled": false,
|
"js.ion.enabled": true,
|
||||||
"js.shared_memory.enabled": true,
|
"js.ion.offthread_compilation.enabled": true,
|
||||||
"js.mem.high_water_mark": 128,
|
"js.ion.unsafe_eager_compilation.enabled": false,
|
||||||
"js.mem.max": -1,
|
"js.mem.gc.allocation_threshold_mb": 30,
|
||||||
"js.mem.gc.per_compartment.enabled": true,
|
"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.enabled": true,
|
||||||
"js.mem.gc.incremental.slice_ms": 10,
|
"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.low_frequency_heap_growth": 150,
|
||||||
"js.mem.gc.high_frequency_heap_growth_min": 150,
|
"js.mem.gc.per_compartment.enabled": true,
|
||||||
"js.mem.gc.high_frequency_heap_growth_max": 300,
|
"js.mem.gc.refresh_frame_slices.enabled": true,
|
||||||
"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.zeal.frequency": 100,
|
"js.mem.gc.zeal.frequency": 100,
|
||||||
"layout.columns.enabled": false,
|
"js.mem.gc.zeal.level": 0,
|
||||||
"layout.column-width.enabled": false,
|
"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-count.enabled": false,
|
||||||
"layout.column-gap.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-direction.enabled": false,
|
||||||
|
"layout.flex.enabled": false,
|
||||||
"layout.text-orientation.enabled": false,
|
"layout.text-orientation.enabled": false,
|
||||||
"layout.viewport.enabled": false,
|
"layout.viewport.enabled": false,
|
||||||
"layout.writing-mode.enabled": false,
|
"layout.writing-mode.enabled": false,
|
||||||
"network.http.redirection-limit": 20,
|
"network.http.redirection-limit": 20,
|
||||||
"network.mime.sniff": false,
|
"network.mime.sniff": false,
|
||||||
|
"shell.builtin-key-shortcuts.enabled": false,
|
||||||
"shell.homepage": "https://servo.org",
|
"shell.homepage": "https://servo.org",
|
||||||
"shell.native-titlebar.enabled": false,
|
"shell.native-titlebar.enabled": false
|
||||||
"shell.builtin-key-shortcuts.enabled": false
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,57 +7,57 @@
|
||||||
"dom.serviceworker.timeout_seconds": 60,
|
"dom.serviceworker.timeout_seconds": 60,
|
||||||
"dom.testable_crash.enabled": false,
|
"dom.testable_crash.enabled": false,
|
||||||
"dom.testbinding.enabled": false,
|
"dom.testbinding.enabled": false,
|
||||||
"js.baseline.enabled": true,
|
|
||||||
"js.ion.enabled": true,
|
|
||||||
"js.asmjs.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.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.dump_stack_on_debuggee_would_run.enabled": false,
|
||||||
"js.werror.enabled": false,
|
"js.ion.enabled": true,
|
||||||
"js.shared_memory.enabled": true,
|
"js.ion.offthread_compilation.enabled": true,
|
||||||
"js.mem.high_water_mark": 128,
|
"js.ion.unsafe_eager_compilation.enabled": false,
|
||||||
"js.mem.max": -1,
|
"js.mem.gc.allocation_threshold_mb": 30,
|
||||||
"js.mem.gc.per_compartment.enabled": true,
|
"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.enabled": true,
|
||||||
"js.mem.gc.incremental.slice_ms": 10,
|
"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.low_frequency_heap_growth": 150,
|
||||||
"js.mem.gc.high_frequency_heap_growth_min": 150,
|
"js.mem.gc.per_compartment.enabled": true,
|
||||||
"js.mem.gc.high_frequency_heap_growth_max": 300,
|
"js.mem.gc.refresh_frame_slices.enabled": true,
|
||||||
"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.zeal.frequency": 100,
|
"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.animations.test.enabled": false,
|
||||||
"layout.columns.enabled": false,
|
|
||||||
"layout.column-width.enabled": false,
|
|
||||||
"layout.column-count.enabled": false,
|
"layout.column-count.enabled": false,
|
||||||
"layout.column-gap.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-direction.enabled": false,
|
||||||
|
"layout.flex.enabled": false,
|
||||||
"layout.text-orientation.enabled": false,
|
"layout.text-orientation.enabled": false,
|
||||||
"layout.viewport.enabled": false,
|
"layout.viewport.enabled": false,
|
||||||
"layout.writing-mode.enabled": false,
|
"layout.writing-mode.enabled": false,
|
||||||
"network.http.redirection-limit": 20,
|
"network.http.redirection-limit": 20,
|
||||||
"network.mime.sniff": false,
|
"network.mime.sniff": false,
|
||||||
|
"shell.builtin-key-shortcuts.enabled": true,
|
||||||
"shell.homepage": "http://servo.org",
|
"shell.homepage": "http://servo.org",
|
||||||
"shell.native-titlebar.enabled": true,
|
"shell.native-titlebar.enabled": true
|
||||||
"shell.builtin-key-shortcuts.enabled": true
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
[configs]
|
[configs]
|
||||||
skip-check-length = false
|
skip-check-length = false
|
||||||
skip-check-licenses = false
|
skip-check-licenses = false
|
||||||
|
check-ordered-json-keys = [
|
||||||
|
"./resources/prefs.json",
|
||||||
|
"./resources/package-prefs.json",
|
||||||
|
]
|
||||||
|
|
||||||
[ignore]
|
[ignore]
|
||||||
# Ignored packages with duplicated versions
|
# Ignored packages with duplicated versions
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue