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

Source Code for Module lxml.tests.common_imports

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