mirror of
https://github.com/servo/servo.git
synced 2025-06-08 16:43:28 +00:00
Auto merge of #12318 - tallowen:tidy-features, r=frewsxcv
[tidy] prevent duplicate json keys
Throws a tidy error when duplicated keys are present.

---
<!-- 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] These changes fix #12283 (github issue number if applicable).
<!-- Either: -->
- [X] There are tests for these changes OR
- [ ] These changes do not require tests because _____
<!-- 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/12318)
<!-- Reviewable:end -->
This commit is contained in:
commit
638eb80110
3 changed files with 25 additions and 1 deletions
|
@ -524,16 +524,28 @@ def check_webidl_spec(file_name, contents):
|
||||||
yield (0, "No specification link found.")
|
yield (0, "No specification link found.")
|
||||||
|
|
||||||
|
|
||||||
|
def check_for_possible_duplicate_json_keys(key_value_pairs):
|
||||||
|
keys = [x[0] for x in key_value_pairs]
|
||||||
|
seen_keys = set()
|
||||||
|
for key in keys:
|
||||||
|
if key in seen_keys:
|
||||||
|
raise KeyError(key)
|
||||||
|
|
||||||
|
seen_keys.add(key)
|
||||||
|
|
||||||
|
|
||||||
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)
|
json.loads(contents, object_pairs_hook=check_for_possible_duplicate_json_keys)
|
||||||
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:
|
||||||
|
yield (None, "Duplicated Key (%s)" % e.message)
|
||||||
|
|
||||||
|
|
||||||
def check_spec(file_name, lines):
|
def check_spec(file_name, lines):
|
||||||
|
|
7
python/tidy/servo_tidy_tests/duplicate_key.json
Normal file
7
python/tidy/servo_tidy_tests/duplicate_key.json
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"key": "value",
|
||||||
|
"other_key": {
|
||||||
|
"the_duplicated_key": 1,
|
||||||
|
"the_duplicated_key": 2
|
||||||
|
}
|
||||||
|
}
|
|
@ -109,6 +109,11 @@ class CheckTidiness(unittest.TestCase):
|
||||||
self.assertEqual('Invalid control character at: line 3 column 40 (char 61)', errors.next()[2])
|
self.assertEqual('Invalid control character at: line 3 column 40 (char 61)', errors.next()[2])
|
||||||
self.assertNoMoreErrors(errors)
|
self.assertNoMoreErrors(errors)
|
||||||
|
|
||||||
|
def test_json_with_duplicate_key(self):
|
||||||
|
errors = tidy.collect_errors_for_files(iterFile('duplicate_key.json'), [tidy.check_json], [], print_text=False)
|
||||||
|
self.assertEqual('Duplicated Key (the_duplicated_key)', 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"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue