| Left: | ||
| Right: |
| OLD | NEW |
|---|---|
| 1 # This Source Code Form is subject to the terms of the Mozilla Public | 1 # This Source Code Form is subject to the terms of the Mozilla Public |
| 2 # License, v. 2.0. If a copy of the MPL was not distributed with this | 2 # License, v. 2.0. If a copy of the MPL was not distributed with this |
| 3 # file, You can obtain one at http://mozilla.org/MPL/2.0/. | 3 # file, You can obtain one at http://mozilla.org/MPL/2.0/. |
| 4 | 4 |
| 5 import difflib | 5 import difflib |
| 6 import json | 6 import json |
| 7 import os | 7 import os |
| 8 import re | 8 import re |
| 9 import shutil | 9 import shutil |
| 10 import zipfile | 10 import zipfile |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 233 files['ext/c.js'] = 'var this_is_c;' | 233 files['ext/c.js'] = 'var this_is_c;' |
| 234 | 234 |
| 235 tmpdir.mkdir('lib').join('b.js').write(files['lib/b.js']) | 235 tmpdir.mkdir('lib').join('b.js').write(files['lib/b.js']) |
| 236 ext_dir = tmpdir.mkdir('ext') | 236 ext_dir = tmpdir.mkdir('ext') |
| 237 ext_dir.join('a.js').write(files['ext/a.js']) | 237 ext_dir.join('a.js').write(files['ext/a.js']) |
| 238 ext_dir.join('c.js').write(files['ext/c.js']) | 238 ext_dir.join('c.js').write(files['ext/c.js']) |
| 239 | 239 |
| 240 return files | 240 return files |
| 241 | 241 |
| 242 | 242 |
| 243 def comparable_xml(xml): | |
| 244 """Create a nonambiguous representation of a given XML tree. | |
| 245 | |
| 246 Note that this function is not safe against ambiguous tags | |
| 247 containing differently distributed children, e.g.: | |
| 248 | |
| 249 '<a><b><c/></b><b><d/></b></a>' | |
| 250 vs. | |
| 251 '<a><b/><b><c/><d/></b></a>' | |
| 252 | |
| 253 This is irrelevant for comparing the XML used by the tests of this | |
| 254 module. | |
| 255 """ | |
| 256 def get_leafs_string(tree): | |
| 257 """Recursively build a string representing all xml leaf-nodes.""" | |
| 258 root_str = '{}|{}|{}'.format(tree.tag, tree.tail, tree.text).strip() | |
| 259 result = [] | |
| 260 | |
| 261 if len(tree) > 0: | |
| 262 for subtree in tree: | |
| 263 for leaf in get_leafs_string(subtree): | |
| 264 result.append('{}__{}'.format(root_str, leaf)) | |
| 265 for k, v in tree.attrib.items(): | |
| 266 result.append('{}__{}:{}'.format(root_str, k, v)) | |
| 267 else: | |
| 268 result.append(root_str) | |
| 269 return result | |
| 270 | |
| 271 # XML data itself shall not be sorted, hence we can safely sort | |
| 272 # our string representations in order to produce a valid unified diff. | |
| 273 return sorted(get_leafs_string(ElementTree.fromstring(xml))) | |
| 274 | |
| 275 | |
| 276 def comparable_json(json_string): | 243 def comparable_json(json_string): |
| 277 """Create a nonambiguous representation of a given JSON string.""" | 244 """Create a nonambiguous representation of a given JSON string.""" |
| 278 return json.dumps( | 245 return json.dumps( |
| 279 json.loads(json_string), sort_keys=True, indent=0 | 246 json.loads(json_string), sort_keys=True, indent=0 |
| 280 ).split('\n') | 247 ).split('\n') |
| 281 | 248 |
| 282 | 249 |
| 250 def comparable_xml(xml): | |
| 251 """Create a nonambiguous representation of a given XML tree.""" | |
| 252 def strip(s): | |
| 253 if s is None: | |
| 254 return '' | |
| 255 return s.strip() | |
| 256 | |
| 257 def transform(elt): | |
| 258 subs = sorted(transform(s) for s in elt) | |
| 259 attrs = tuple('{}={}'.format(k, v) for k, v in elt.attrib.items()) | |
|
Vasily Kuznetsov
2017/10/23 12:48:20
Since you're doing a `comparable_json` later, we c
tlucas
2017/10/23 13:21:36
Good point - Done.
| |
| 260 return (elt.tag, strip(elt.tail), strip(elt.text), attrs, subs) | |
| 261 | |
| 262 return comparable_json(json.dumps(transform(ElementTree.fromstring(xml)))) | |
|
Vasily Kuznetsov
2017/10/23 12:48:20
Its kind of a pity that we're doing `json.dumps` h
tlucas
2017/10/23 13:21:36
No, you are right - dumps(loads(dumps())) is defin
| |
| 263 | |
| 264 | |
| 283 def assert_manifest_content(manifest, expected_path): | 265 def assert_manifest_content(manifest, expected_path): |
| 284 extension = os.path.basename(expected_path).split('.')[-1] | 266 extension = os.path.basename(expected_path).split('.')[-1] |
| 285 | 267 |
| 286 with open(expected_path, 'r') as fp: | 268 with open(expected_path, 'r') as fp: |
| 287 if extension == 'xml': | 269 if extension == 'xml': |
| 288 generated = comparable_xml(manifest) | 270 generated = comparable_xml(manifest) |
| 289 expected = comparable_xml(fp.read()) | 271 expected = comparable_xml(fp.read()) |
| 290 else: | 272 else: |
| 291 generated = comparable_json(manifest) | 273 generated = comparable_json(manifest) |
| 292 expected = comparable_json(fp.read()) | 274 expected = comparable_json(fp.read()) |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 476 expected = os.path.join( | 458 expected = os.path.join( |
| 477 os.path.dirname(__file__), | 459 os.path.dirname(__file__), |
| 478 'expecteddata', | 460 'expecteddata', |
| 479 filename.format(name, ext), | 461 filename.format(name, ext), |
| 480 ) | 462 ) |
| 481 | 463 |
| 482 assert_manifest_content( | 464 assert_manifest_content( |
| 483 package.read(os.path.join(folder, '{}.{}'.format(name, ext))), | 465 package.read(os.path.join(folder, '{}.{}'.format(name, ext))), |
| 484 expected, | 466 expected, |
| 485 ) | 467 ) |
| OLD | NEW |