Package lxml :: Package tests :: Module common_imports
[hide private]
[frames] | no frames]

Source Code for Module lxml.tests.common_imports

  1  import unittest 
  2  import os.path 
  3  import re, gc, sys 
  4   
  5  from lxml import etree 
  6   
7 -def make_version_tuple(version_string):
8 l = [] 9 for part in re.findall('([0-9]+|[^0-9.]+)', version_string): 10 try: 11 l.append(int(part)) 12 except ValueError: 13 l.append(part) 14 return tuple(l)
15 16 IS_PYPY = (getattr(sys, 'implementation', None) == 'pypy' or 17 getattr(sys, 'pypy_version_info', None) is not None) 18 19 IS_PYTHON3 = sys.version_info[0] >= 3 20 21 try: 22 from xml.etree import ElementTree # Python 2.5+ 23 except ImportError: 24 try: 25 from elementtree import ElementTree # standard ET 26 except ImportError: 27 ElementTree = None 28 29 if hasattr(ElementTree, 'VERSION'): 30 ET_VERSION = make_version_tuple(ElementTree.VERSION) 31 else: 32 ET_VERSION = (0,0,0) 33 34 try: 35 from xml.etree import cElementTree # Python 2.5+ 36 except ImportError: 37 try: 38 import cElementTree # standard ET 39 except ImportError: 40 cElementTree = None 41 42 if hasattr(cElementTree, 'VERSION'): 43 CET_VERSION = make_version_tuple(cElementTree.VERSION) 44 else: 45 CET_VERSION = (0,0,0) 46
47 -def filter_by_version(test_class, version_dict, current_version):
48 """Remove test methods that do not work with the current lib version. 49 """ 50 find_required_version = version_dict.get 51 def dummy_test_method(self): 52 pass
53 for name in dir(test_class): 54 expected_version = find_required_version(name, (0,0,0)) 55 if expected_version > current_version: 56 setattr(test_class, name, dummy_test_method) 57 58 try: 59 import doctest 60 # check if the system version has everything we need 61 doctest.DocFileSuite 62 doctest.DocTestParser 63 doctest.NORMALIZE_WHITESPACE 64 doctest.ELLIPSIS 65 except (ImportError, AttributeError): 66 # we need our own version to make it work (Python 2.3?) 67 import local_doctest as doctest 68 69 try: 70 sorted 71 except NameError:
72 - def sorted(seq, **kwargs):
73 seq = list(seq) 74 seq.sort(**kwargs) 75 return seq
76 else: 77 locals()['sorted'] = sorted 78 79 80 try: 81 next 82 except NameError:
83 - def next(it):
84 return it.next()
85 else: 86 locals()['next'] = next 87 88 89 try: 90 import pytest 91 except ImportError:
92 - class skipif(object):
93 "Using a class because a function would bind into a method when used in classes"
94 - def __init__(self, *args): pass
95 - def __call__(self, func, *args): return func
96 else: 97 skipif = pytest.mark.skipif 98
99 -def _get_caller_relative_path(filename, frame_depth=2):
100 module = sys.modules[sys._getframe(frame_depth).f_globals['__name__']] 101 return os.path.normpath(os.path.join( 102 os.path.dirname(getattr(module, '__file__', '')), filename))
103 104 if sys.version_info[0] >= 3: 105 # Python 3 106 from builtins import str as unicode
107 - def _str(s, encoding="UTF-8"):
108 return s
109 - def _bytes(s, encoding="UTF-8"):
110 return s.encode(encoding)
111 from io import StringIO, BytesIO as _BytesIO
112 - def BytesIO(*args):
113 if args and isinstance(args[0], str): 114 args = (args[0].encode("UTF-8"),) 115 return _BytesIO(*args)
116 117 doctest_parser = doctest.DocTestParser() 118 _fix_unicode = re.compile(r'(\s+)u(["\'])').sub 119 _fix_exceptions = re.compile(r'(.*except [^(]*),\s*(.*:)').sub
120 - def make_doctest(filename):
121 filename = _get_caller_relative_path(filename) 122 doctests = read_file(filename) 123 doctests = _fix_unicode(r'\1\2', doctests) 124 doctests = _fix_exceptions(r'\1 as \2', doctests) 125 return doctest.DocTestCase( 126 doctest_parser.get_doctest( 127 doctests, {}, os.path.basename(filename), filename, 0))
128 else: 129 # Python 2 130 from __builtin__ import unicode
131 - def _str(s, encoding="UTF-8"):
132 return unicode(s, encoding=encoding)
133 - def _bytes(s, encoding="UTF-8"):
134 return s
135 from StringIO import StringIO 136 BytesIO = StringIO 137 138 doctest_parser = doctest.DocTestParser() 139 _fix_traceback = re.compile(r'^(\s*)(?:\w+\.)+(\w*(?:Error|Exception|Invalid):)', re.M).sub 140 _fix_exceptions = re.compile(r'(.*except [^(]*)\s+as\s+(.*:)').sub 141 _fix_bytes = re.compile(r'(\s+)b(["\'])').sub
142 - def make_doctest(filename):
143 filename = _get_caller_relative_path(filename) 144 doctests = read_file(filename) 145 doctests = _fix_traceback(r'\1\2', doctests) 146 doctests = _fix_exceptions(r'\1, \2', doctests) 147 doctests = _fix_bytes(r'\1\2', doctests) 148 return doctest.DocTestCase( 149 doctest_parser.get_doctest( 150 doctests, {}, os.path.basename(filename), filename, 0))
151 152 try: 153 skipIf = unittest.skipIf 154 except AttributeError:
155 - def skipIf(condition, why, 156 _skip=lambda test_method: None, 157 _keep=lambda test_method: test_method):
158 if condition: 159 return _skip 160 return _keep
161
162 -class HelperTestCase(unittest.TestCase):
163 - def tearDown(self):
164 gc.collect()
165
166 - def parse(self, text, parser=None):
167 f = BytesIO(text) 168 return etree.parse(f, parser=parser)
169
170 - def _rootstring(self, tree):
171 return etree.tostring(tree.getroot()).replace( 172 _bytes(' '), _bytes('')).replace(_bytes('\n'), _bytes(''))
173 174 # assertFalse doesn't exist in Python 2.3 175 try: 176 unittest.TestCase.assertFalse 177 except AttributeError: 178 assertFalse = unittest.TestCase.failIf
179
180 -class SillyFileLike:
181 - def __init__(self, xml_data=_bytes('<foo><bar/></foo>')):
182 self.xml_data = xml_data
183
184 - def read(self, amount=None):
185 if self.xml_data: 186 if amount: 187 data = self.xml_data[:amount] 188 self.xml_data = self.xml_data[amount:] 189 else: 190 data = self.xml_data 191 self.xml_data = _bytes('') 192 return data 193 return _bytes('')
194
195 -class LargeFileLike:
196 - def __init__(self, charlen=100, depth=4, children=5):
197 self.data = BytesIO() 198 self.chars = _bytes('a') * charlen 199 self.children = range(children) 200 self.more = self.iterelements(depth)
201
202 - def iterelements(self, depth):
203 yield _bytes('<root>') 204 depth -= 1 205 if depth > 0: 206 for child in self.children: 207 for element in self.iterelements(depth): 208 yield element 209 yield self.chars 210 else: 211 yield self.chars 212 yield _bytes('</root>')
213
214 - def read(self, amount=None):
215 data = self.data 216 append = data.write 217 if amount: 218 for element in self.more: 219 append(element) 220 if data.tell() >= amount: 221 break 222 else: 223 for element in self.more: 224 append(element) 225 result = data.getvalue() 226 data.seek(0) 227 data.truncate() 228 if amount: 229 append(result[amount:]) 230 result = result[:amount] 231 return result
232
233 -class LargeFileLikeUnicode(LargeFileLike):
234 - def __init__(self, charlen=100, depth=4, children=5):
235 LargeFileLike.__init__(self, charlen, depth, children) 236 self.data = StringIO() 237 self.chars = _str('a') * charlen 238 self.more = self.iterelements(depth)
239
240 - def iterelements(self, depth):
241 yield _str('<root>') 242 depth -= 1 243 if depth > 0: 244 for child in self.children: 245 for element in self.iterelements(depth): 246 yield element 247 yield self.chars 248 else: 249 yield self.chars 250 yield _str('</root>')
251
252 -def fileInTestDir(name):
253 _testdir = os.path.dirname(__file__) 254 return os.path.join(_testdir, name)
255
256 -def read_file(name, mode='r'):
257 f = open(name, mode) 258 try: 259 data = f.read() 260 finally: 261 f.close() 262 return data
263
264 -def write_to_file(name, data, mode='w'):
265 f = open(name, mode) 266 try: 267 data = f.write(data) 268 finally: 269 f.close()
270
271 -def readFileInTestDir(name, mode='r'):
272 return read_file(fileInTestDir(name), mode)
273
274 -def canonicalize(xml):
275 tree = etree.parse(BytesIO(xml)) 276 f = BytesIO() 277 tree.write_c14n(f) 278 return f.getvalue()
279
280 -def unentitify(xml):
281 for entity_name, value in re.findall("(&#([0-9]+);)", xml): 282 xml = xml.replace(entity_name, unichr(int(value))) 283 return xml
284