|
| 1 | +<html> |
| 2 | +<head> |
| 3 | +<title>formencode.doctest_xml_compare</title> |
| 4 | +</head> |
| 5 | +<body> |
| 6 | +formencode.doctest_xml_compare |
| 7 | +<style> |
| 8 | +.coverage pre {float: left; margin: 0px 1em; border: none; |
| 9 | + padding: 0px; } |
| 10 | +.num pre { margin: 0px } |
| 11 | +.nocov, .nocov pre {background-color: #faa} |
| 12 | +.cov, .cov pre {background-color: #cfc} |
| 13 | +div.coverage div { clear: both; height: 1.1em} |
| 14 | +</style> |
| 15 | +<div class="stats"> |
| 16 | +Covered: 36 lines<br/> |
| 17 | +Missed: 82 lines<br/> |
| 18 | +Skipped 13 lines<br/> |
| 19 | +Percent: 30 %<br/> |
| 20 | + |
| 21 | +</div> |
| 22 | +<div class="coverage"> |
| 23 | +<div class="cov"><span class="num"><pre> 1</pre></span><pre>try:</pre></div> |
| 24 | +<div class="cov"><span class="num"><pre> 2</pre></span><pre> import doctest</pre></div> |
| 25 | +<div class="cov"><span class="num"><pre> 3</pre></span><pre> doctest.OutputChecker</pre></div> |
| 26 | +<div class="nocov"><span class="num"><pre> 4</pre></span><pre>except AttributeError:</pre></div> |
| 27 | +<div class="nocov"><span class="num"><pre> 5</pre></span><pre> import util.doctest24 as doctest</pre></div> |
| 28 | +<div class="cov"><span class="num"><pre> 6</pre></span><pre>try:</pre></div> |
| 29 | +<div class="cov"><span class="num"><pre> 7</pre></span><pre> import xml.etree.ElementTree as ET</pre></div> |
| 30 | +<div class="nocov"><span class="num"><pre> 8</pre></span><pre>except ImportError:</pre></div> |
| 31 | +<div class="nocov"><span class="num"><pre> 9</pre></span><pre> import elementtree.ElementTree as ET</pre></div> |
| 32 | +<div class="cov"><span class="num"><pre> 10</pre></span><pre>from xml.parsers.expat import ExpatError as XMLParseError</pre></div> |
| 33 | +<div class="skip"><span class="num"><pre> 11</pre></span><pre></pre></div> |
| 34 | +<div class="cov"><span class="num"><pre> 12</pre></span><pre>RealOutputChecker = doctest.OutputChecker</pre></div> |
| 35 | +<div class="skip"><span class="num"><pre> 13</pre></span><pre></pre></div> |
| 36 | +<div class="cov"><span class="num"><pre> 14</pre></span><pre>def debug(*msg):</pre></div> |
| 37 | +<div class="nocov"><span class="num"><pre> 15</pre></span><pre> import sys</pre></div> |
| 38 | +<div class="nocov"><span class="num"><pre> 16</pre></span><pre> print >> sys.stderr, ' '.join(map(str, msg))</pre></div> |
| 39 | +<div class="skip"><span class="num"><pre> 17</pre></span><pre></pre></div> |
| 40 | +<div class="cov"><span class="num"><pre> 18</pre></span><pre>class HTMLOutputChecker(RealOutputChecker):</pre></div> |
| 41 | +<div class="skip"><span class="num"><pre> 19</pre></span><pre></pre></div> |
| 42 | +<div class="cov"><span class="num"><pre> 20</pre></span><pre> def check_output(self, want, got, optionflags):</pre></div> |
| 43 | +<div class="nocov"><span class="num"><pre> 21</pre></span><pre> normal = RealOutputChecker.check_output(self, want, got, optionflags)</pre></div> |
| 44 | +<div class="nocov"><span class="num"><pre> 22</pre></span><pre> if normal or not got:</pre></div> |
| 45 | +<div class="nocov"><span class="num"><pre> 23</pre></span><pre> return normal</pre></div> |
| 46 | +<div class="nocov"><span class="num"><pre> 24</pre></span><pre> try:</pre></div> |
| 47 | +<div class="nocov"><span class="num"><pre> 25</pre></span><pre> want_xml = make_xml(want)</pre></div> |
| 48 | +<div class="nocov"><span class="num"><pre> 26</pre></span><pre> except XMLParseError, e:</pre></div> |
| 49 | +<div class="nocov"><span class="num"><pre> 27</pre></span><pre> pass</pre></div> |
| 50 | +<div class="nocov"><span class="num"><pre> 28</pre></span><pre> else:</pre></div> |
| 51 | +<div class="nocov"><span class="num"><pre> 29</pre></span><pre> try:</pre></div> |
| 52 | +<div class="nocov"><span class="num"><pre> 30</pre></span><pre> got_xml = make_xml(got)</pre></div> |
| 53 | +<div class="nocov"><span class="num"><pre> 31</pre></span><pre> except XMLParseError:</pre></div> |
| 54 | +<div class="nocov"><span class="num"><pre> 32</pre></span><pre> pass</pre></div> |
| 55 | +<div class="nocov"><span class="num"><pre> 33</pre></span><pre> else:</pre></div> |
| 56 | +<div class="nocov"><span class="num"><pre> 34</pre></span><pre> if xml_compare(want_xml, got_xml):</pre></div> |
| 57 | +<div class="nocov"><span class="num"><pre> 35</pre></span><pre> return True</pre></div> |
| 58 | +<div class="nocov"><span class="num"><pre> 36</pre></span><pre> return False</pre></div> |
| 59 | +<div class="skip"><span class="num"><pre> 37</pre></span><pre></pre></div> |
| 60 | +<div class="cov"><span class="num"><pre> 38</pre></span><pre> def output_difference(self, example, got, optionflags):</pre></div> |
| 61 | +<div class="nocov"><span class="num"><pre> 39</pre></span><pre> actual = RealOutputChecker.output_difference(</pre></div> |
| 62 | +<div class="nocov"><span class="num"><pre> 40</pre></span><pre> self, example, got, optionflags)</pre></div> |
| 63 | +<div class="nocov"><span class="num"><pre> 41</pre></span><pre> want_xml = got_xml = None</pre></div> |
| 64 | +<div class="nocov"><span class="num"><pre> 42</pre></span><pre> try:</pre></div> |
| 65 | +<div class="nocov"><span class="num"><pre> 43</pre></span><pre> want_xml = make_xml(example.want)</pre></div> |
| 66 | +<div class="nocov"><span class="num"><pre> 44</pre></span><pre> want_norm = make_string(want_xml)</pre></div> |
| 67 | +<div class="nocov"><span class="num"><pre> 45</pre></span><pre> except XMLParseError, e:</pre></div> |
| 68 | +<div class="nocov"><span class="num"><pre> 46</pre></span><pre> if example.want.startswith('<'):</pre></div> |
| 69 | +<div class="nocov"><span class="num"><pre> 47</pre></span><pre> want_norm = '(bad XML: %s)' % e</pre></div> |
| 70 | +<div class="skip"><span class="num"><pre> 48</pre></span><pre> # '<xml>%s</xml>' % example.want</pre></div> |
| 71 | +<div class="nocov"><span class="num"><pre> 49</pre></span><pre> else:</pre></div> |
| 72 | +<div class="nocov"><span class="num"><pre> 50</pre></span><pre> return actual</pre></div> |
| 73 | +<div class="nocov"><span class="num"><pre> 51</pre></span><pre> try:</pre></div> |
| 74 | +<div class="nocov"><span class="num"><pre> 52</pre></span><pre> got_xml = make_xml(got)</pre></div> |
| 75 | +<div class="nocov"><span class="num"><pre> 53</pre></span><pre> got_norm = make_string(got_xml)</pre></div> |
| 76 | +<div class="nocov"><span class="num"><pre> 54</pre></span><pre> except XMLParseError, e:</pre></div> |
| 77 | +<div class="nocov"><span class="num"><pre> 55</pre></span><pre> if example.want.startswith('<'):</pre></div> |
| 78 | +<div class="nocov"><span class="num"><pre> 56</pre></span><pre> got_norm = '(bad XML: %s)' % e</pre></div> |
| 79 | +<div class="nocov"><span class="num"><pre> 57</pre></span><pre> else:</pre></div> |
| 80 | +<div class="nocov"><span class="num"><pre> 58</pre></span><pre> return actual</pre></div> |
| 81 | +<div class="nocov"><span class="num"><pre> 59</pre></span><pre> s = '%s\nXML Wanted: %s\nXML Got : %s\n' % (</pre></div> |
| 82 | +<div class="nocov"><span class="num"><pre> 60</pre></span><pre> actual, want_norm, got_norm)</pre></div> |
| 83 | +<div class="nocov"><span class="num"><pre> 61</pre></span><pre> if got_xml and want_xml:</pre></div> |
| 84 | +<div class="nocov"><span class="num"><pre> 62</pre></span><pre> result = []</pre></div> |
| 85 | +<div class="nocov"><span class="num"><pre> 63</pre></span><pre> xml_compare(want_xml, got_xml, result.append)</pre></div> |
| 86 | +<div class="nocov"><span class="num"><pre> 64</pre></span><pre> s += 'Difference report:\n%s\n' % '\n'.join(result)</pre></div> |
| 87 | +<div class="nocov"><span class="num"><pre> 65</pre></span><pre> return s</pre></div> |
| 88 | +<div class="skip"><span class="num"><pre> 66</pre></span><pre></pre></div> |
| 89 | +<div class="cov"><span class="num"><pre> 67</pre></span><pre>def xml_compare(x1, x2, reporter=None):</pre></div> |
| 90 | +<div class="cov"><span class="num"><pre> 68</pre></span><pre> if x1.tag != x2.tag:</pre></div> |
| 91 | +<div class="nocov"><span class="num"><pre> 69</pre></span><pre> if reporter:</pre></div> |
| 92 | +<div class="nocov"><span class="num"><pre> 70</pre></span><pre> reporter('Tags do not match: %s and %s' % (x1.tag, x2.tag))</pre></div> |
| 93 | +<div class="nocov"><span class="num"><pre> 71</pre></span><pre> return False</pre></div> |
| 94 | +<div class="cov"><span class="num"><pre> 72</pre></span><pre> for name, value in x1.attrib.items():</pre></div> |
| 95 | +<div class="cov"><span class="num"><pre> 73</pre></span><pre> if x2.attrib.get(name) != value:</pre></div> |
| 96 | +<div class="nocov"><span class="num"><pre> 74</pre></span><pre> if reporter:</pre></div> |
| 97 | +<div class="nocov"><span class="num"><pre> 75</pre></span><pre> reporter('Attributes do not match: %s=%r, %s=%r'</pre></div> |
| 98 | +<div class="nocov"><span class="num"><pre> 76</pre></span><pre> % (name, value, name, x2.attrib.get(name)))</pre></div> |
| 99 | +<div class="nocov"><span class="num"><pre> 77</pre></span><pre> return False</pre></div> |
| 100 | +<div class="cov"><span class="num"><pre> 78</pre></span><pre> for name in x2.attrib.keys():</pre></div> |
| 101 | +<div class="cov"><span class="num"><pre> 79</pre></span><pre> if not x1.attrib.has_key(name):</pre></div> |
| 102 | +<div class="nocov"><span class="num"><pre> 80</pre></span><pre> if reporter:</pre></div> |
| 103 | +<div class="nocov"><span class="num"><pre> 81</pre></span><pre> reporter('x2 has an attribute x1 is missing: %s'</pre></div> |
| 104 | +<div class="nocov"><span class="num"><pre> 82</pre></span><pre> % name)</pre></div> |
| 105 | +<div class="nocov"><span class="num"><pre> 83</pre></span><pre> return False</pre></div> |
| 106 | +<div class="cov"><span class="num"><pre> 84</pre></span><pre> if not text_compare(x1.text, x2.text):</pre></div> |
| 107 | +<div class="nocov"><span class="num"><pre> 85</pre></span><pre> if reporter:</pre></div> |
| 108 | +<div class="nocov"><span class="num"><pre> 86</pre></span><pre> reporter('text: %r != %r' % (x1.text, x2.text))</pre></div> |
| 109 | +<div class="nocov"><span class="num"><pre> 87</pre></span><pre> return False</pre></div> |
| 110 | +<div class="cov"><span class="num"><pre> 88</pre></span><pre> if not text_compare(x1.tail, x2.tail):</pre></div> |
| 111 | +<div class="nocov"><span class="num"><pre> 89</pre></span><pre> if reporter:</pre></div> |
| 112 | +<div class="nocov"><span class="num"><pre> 90</pre></span><pre> reporter('tail: %r != %r' % (x1.tail, x2.tail))</pre></div> |
| 113 | +<div class="nocov"><span class="num"><pre> 91</pre></span><pre> return False</pre></div> |
| 114 | +<div class="cov"><span class="num"><pre> 92</pre></span><pre> cl1 = x1.getchildren()</pre></div> |
| 115 | +<div class="cov"><span class="num"><pre> 93</pre></span><pre> cl2 = x2.getchildren()</pre></div> |
| 116 | +<div class="cov"><span class="num"><pre> 94</pre></span><pre> if len(cl1) != len(cl2):</pre></div> |
| 117 | +<div class="nocov"><span class="num"><pre> 95</pre></span><pre> if reporter:</pre></div> |
| 118 | +<div class="nocov"><span class="num"><pre> 96</pre></span><pre> reporter('children length differs, %i != %i'</pre></div> |
| 119 | +<div class="nocov"><span class="num"><pre> 97</pre></span><pre> % (len(cl1), len(cl2)))</pre></div> |
| 120 | +<div class="nocov"><span class="num"><pre> 98</pre></span><pre> return False</pre></div> |
| 121 | +<div class="cov"><span class="num"><pre> 99</pre></span><pre> i = 0</pre></div> |
| 122 | +<div class="cov"><span class="num"><pre>100</pre></span><pre> for c1, c2 in zip(cl1, cl2):</pre></div> |
| 123 | +<div class="cov"><span class="num"><pre>101</pre></span><pre> i += 1</pre></div> |
| 124 | +<div class="cov"><span class="num"><pre>102</pre></span><pre> if not xml_compare(c1, c2, reporter=reporter):</pre></div> |
| 125 | +<div class="nocov"><span class="num"><pre>103</pre></span><pre> if reporter:</pre></div> |
| 126 | +<div class="nocov"><span class="num"><pre>104</pre></span><pre> reporter('children %i do not match: %s'</pre></div> |
| 127 | +<div class="nocov"><span class="num"><pre>105</pre></span><pre> % (i, c1.tag))</pre></div> |
| 128 | +<div class="nocov"><span class="num"><pre>106</pre></span><pre> return False</pre></div> |
| 129 | +<div class="cov"><span class="num"><pre>107</pre></span><pre> return True</pre></div> |
| 130 | +<div class="skip"><span class="num"><pre>108</pre></span><pre></pre></div> |
| 131 | +<div class="cov"><span class="num"><pre>109</pre></span><pre>def text_compare(t1, t2):</pre></div> |
| 132 | +<div class="cov"><span class="num"><pre>110</pre></span><pre> if not t1 and not t2:</pre></div> |
| 133 | +<div class="cov"><span class="num"><pre>111</pre></span><pre> return True</pre></div> |
| 134 | +<div class="cov"><span class="num"><pre>112</pre></span><pre> if t1 == '*' or t2 == '*':</pre></div> |
| 135 | +<div class="nocov"><span class="num"><pre>113</pre></span><pre> return True</pre></div> |
| 136 | +<div class="cov"><span class="num"><pre>114</pre></span><pre> return (t1 or '').strip() == (t2 or '').strip()</pre></div> |
| 137 | +<div class="skip"><span class="num"><pre>115</pre></span><pre></pre></div> |
| 138 | +<div class="cov"><span class="num"><pre>116</pre></span><pre>def make_xml(s):</pre></div> |
| 139 | +<div class="nocov"><span class="num"><pre>117</pre></span><pre> return ET.XML('<xml>%s</xml>' % s)</pre></div> |
| 140 | +<div class="skip"><span class="num"><pre>118</pre></span><pre></pre></div> |
| 141 | +<div class="cov"><span class="num"><pre>119</pre></span><pre>def make_string(xml):</pre></div> |
| 142 | +<div class="nocov"><span class="num"><pre>120</pre></span><pre> if isinstance(xml, (str, unicode)):</pre></div> |
| 143 | +<div class="nocov"><span class="num"><pre>121</pre></span><pre> xml = make_xml(xml)</pre></div> |
| 144 | +<div class="nocov"><span class="num"><pre>122</pre></span><pre> s = ET.tostring(xml)</pre></div> |
| 145 | +<div class="nocov"><span class="num"><pre>123</pre></span><pre> if s == '<xml />':</pre></div> |
| 146 | +<div class="nocov"><span class="num"><pre>124</pre></span><pre> return ''</pre></div> |
| 147 | +<div class="nocov"><span class="num"><pre>125</pre></span><pre> assert s.startswith('<xml>') and s.endswith('</xml>'), repr(s)</pre></div> |
| 148 | +<div class="nocov"><span class="num"><pre>126</pre></span><pre> return s[5:-6]</pre></div> |
| 149 | +<div class="skip"><span class="num"><pre>127</pre></span><pre></pre></div> |
| 150 | +<div class="cov"><span class="num"><pre>128</pre></span><pre>def install():</pre></div> |
| 151 | +<div class="cov"><span class="num"><pre>129</pre></span><pre> doctest.OutputChecker = HTMLOutputChecker</pre></div> |
| 152 | +<div class="skip"><span class="num"><pre>130</pre></span><pre></pre></div> |
| 153 | +<div class="skip"><span class="num"><pre>131</pre></span><pre></pre></div> |
| 154 | +</div> |
| 155 | +</body> |
| 156 | +</html> |
0 commit comments