comparison env/lib/python3.7/site-packages/planemo/xml/diff.py @ 2:6af9afd405e9 draft

"planemo upload commit 0a63dd5f4d38a1f6944587f52a8cd79874177fc1"
author shellac
date Thu, 14 May 2020 14:56:58 -0400
parents 26e78fe6e8c4
children
comparison
equal deleted inserted replaced
1:75ca89e9b81c 2:6af9afd405e9
1
2 def diff(x1, x2, reporter=None):
3 """Return 0 if and only if the XML has the same content."""
4 compare = xml_compare(x1, x2, reporter)
5 return_val = 0 if compare else 1
6 return return_val
7
8
9 # From
10 # bitbucket.org/ianb/formencode/src/tip/formencode/doctest_xml_compare.py
11 # with (PSF license)
12 def xml_compare(x1, x2, reporter=None):
13 if reporter is None:
14 def reporter(x):
15 return None
16
17 if x1.tag != x2.tag:
18 reporter('Tags do not match: %s and %s\n' % (x1.tag, x2.tag))
19 return False
20 for name, value in x1.attrib.items():
21 if x2.attrib.get(name) != value:
22 reporter('Attributes do not match: %s=%r, %s=%r\n'
23 % (name, value, name, x2.attrib.get(name)))
24 return False
25 for name in x2.attrib.keys():
26 if name not in x1.attrib:
27 reporter('x2 has an attribute x1 is missing: %s\n'
28 % name)
29 return False
30 if not text_compare(x1.text, x2.text):
31 reporter('text: %r != %r\n' % (x1.text, x2.text))
32 return False
33 if not text_compare(x1.tail, x2.tail):
34 reporter('tail: %r != %r\n' % (x1.tail, x2.tail))
35 return False
36 return _compare_children(x1, x2, reporter)
37
38
39 def _compare_children(x1, x2, reporter):
40 cl1 = list(x1)
41 cl2 = list(x2)
42 if len(cl1) != len(cl2):
43 reporter('children length differs, %i != %i\n'
44 % (len(cl1), len(cl2)))
45 return False
46 i = 0
47 for c1, c2 in zip(cl1, cl2):
48 i += 1
49 if not xml_compare(c1, c2, reporter=reporter):
50 reporter('children %i do not match: %s\n'
51 % (i, c1.tag))
52 return False
53 return True
54
55
56 def text_compare(t1, t2):
57 if not t1 and not t2:
58 return True
59 return (t1 or '').strip() == (t2 or '').strip()