1 import os
2 import os.path
3 import re
4 import gc
5 import sys
6 import unittest
7
8 try:
9 import urlparse
10 except ImportError:
11 import urllib.parse as urlparse
12
13 try:
14 from urllib import pathname2url
15 except:
16 from urllib.request import pathname2url
17
18 from lxml import etree, html
19
21 l = []
22 for part in re.findall('([0-9]+|[^0-9.]+)', version_string):
23 try:
24 l.append(int(part))
25 except ValueError:
26 l.append(part)
27 return tuple(l)
28
29 IS_PYPY = (getattr(sys, 'implementation', None) == 'pypy' or
30 getattr(sys, 'pypy_version_info', None) is not None)
31
32 IS_PYTHON3 = sys.version_info[0] >= 3
33 IS_PYTHON2 = sys.version_info[0] < 3
34
35 try:
36 from xml.etree import ElementTree
37 except ImportError:
38 try:
39 from elementtree import ElementTree
40 except ImportError:
41 ElementTree = None
42
43 if hasattr(ElementTree, 'VERSION'):
44 ET_VERSION = make_version_tuple(ElementTree.VERSION)
45 else:
46 ET_VERSION = (0,0,0)
47
48 try:
49 from xml.etree import cElementTree
50 except ImportError:
51 try:
52 import cElementTree
53 except ImportError:
54 cElementTree = None
55
56 if hasattr(cElementTree, 'VERSION'):
57 CET_VERSION = make_version_tuple(cElementTree.VERSION)
58 else:
59 CET_VERSION = (0,0,0)
60
62 """Remove test methods that do not work with the current lib version.
63 """
64 find_required_version = version_dict.get
65 def dummy_test_method(self):
66 pass
67 for name in dir(test_class):
68 expected_version = find_required_version(name, (0,0,0))
69 if expected_version > current_version:
70 setattr(test_class, name, dummy_test_method)
71
72 try:
73 import doctest
74
75 doctest.DocFileSuite
76 doctest.DocTestParser
77 doctest.NORMALIZE_WHITESPACE
78 doctest.ELLIPSIS
79 except (ImportError, AttributeError):
80
81 import local_doctest as doctest
82
83 try:
84 sorted
85 except NameError:
87 seq = list(seq)
88 seq.sort(**kwargs)
89 return seq
90 else:
91 locals()['sorted'] = sorted
92
93
94 try:
95 next
96 except NameError:
99 else:
100 locals()['next'] = next
101
102
103 try:
104 import pytest
105 except ImportError:
107 "Using a class because a function would bind into a method when used in classes"
109 - def __call__(self, func, *args): return func
110 else:
111 skipif = pytest.mark.skipif
112
114 module = sys.modules[sys._getframe(frame_depth).f_globals['__name__']]
115 return os.path.normpath(os.path.join(
116 os.path.dirname(getattr(module, '__file__', '')), filename))
117
118 from io import StringIO
119
120 unichr_escape = re.compile(r'\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}')
121
122 if sys.version_info[0] >= 3:
123
124 from builtins import str as unicode
125 from codecs import unicode_escape_decode
126 _chr = chr
127 - def _str(s, encoding="UTF-8"):
128 return unichr_escape.sub(lambda x: unicode_escape_decode(x.group(0))[0], s)
129 - def _bytes(s, encoding="UTF-8"):
131 from io import BytesIO as _BytesIO
133 if args and isinstance(args[0], str):
134 args = (args[0].encode("UTF-8"),)
135 return _BytesIO(*args)
136
137 doctest_parser = doctest.DocTestParser()
138 _fix_unicode = re.compile(r'(\s+)u(["\'])').sub
139 _fix_exceptions = re.compile(r'(.*except [^(]*),\s*(.*:)').sub
148 else:
149
150 from __builtin__ import unicode
151 _chr = unichr
152 - def _str(s, encoding="UTF-8"):
157 - def _bytes(s, encoding="UTF-8"):
159 from io import BytesIO
160
161 doctest_parser = doctest.DocTestParser()
162 _fix_traceback = re.compile(r'^(\s*)(?:\w+\.)+(\w*(?:Error|Exception|Invalid):)', re.M).sub
163 _fix_exceptions = re.compile(r'(.*except [^(]*)\s+as\s+(.*:)').sub
164 _fix_bytes = re.compile(r'(\s+)b(["\'])').sub
174
175 try:
176 skipIf = unittest.skipIf
177 except AttributeError:
179 def _skip(thing):
180 import types
181 if isinstance(thing, (type, types.ClassType)):
182 return type(thing.__name__, (object,), {})
183 else:
184 return None
185 if condition:
186 return _skip
187 return lambda thing: thing
188
189
193
194 - def parse(self, text, parser=None):
197
201
202
203 try:
204 unittest.TestCase.assertFalse
205 except AttributeError:
206 assertFalse = unittest.TestCase.failIf
207
208
211 self.xml_data = xml_data
212
213 - def read(self, amount=None):
214 if self.xml_data:
215 if amount:
216 data = self.xml_data[:amount]
217 self.xml_data = self.xml_data[amount:]
218 else:
219 data = self.xml_data
220 self.xml_data = _bytes('')
221 return data
222 return _bytes('')
223
225 - def __init__(self, charlen=100, depth=4, children=5):
226 self.data = BytesIO()
227 self.chars = _bytes('a') * charlen
228 self.children = range(children)
229 self.more = self.iterelements(depth)
230
232 yield _bytes('<root>')
233 depth -= 1
234 if depth > 0:
235 for child in self.children:
236 for element in self.iterelements(depth):
237 yield element
238 yield self.chars
239 else:
240 yield self.chars
241 yield _bytes('</root>')
242
243 - def read(self, amount=None):
261
263 - def __init__(self, charlen=100, depth=4, children=5):
268
270 yield _str('<root>')
271 depth -= 1
272 if depth > 0:
273 for child in self.children:
274 for element in self.iterelements(depth):
275 yield element
276 yield self.chars
277 else:
278 yield self.chars
279 yield _str('</root>')
280
282 _testdir = os.path.dirname(__file__)
283 return os.path.join(_testdir, name)
284
286 return urlparse.urljoin(
287 'file:', pathname2url(path))
288
291
299
306
309
311 tree = etree.parse(BytesIO(xml) if isinstance(xml, bytes) else StringIO(xml))
312 f = BytesIO()
313 tree.write_c14n(f)
314 return f.getvalue()
315
320