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