Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(496)

Side by Side Diff: appengine/chromium_build_logs/third_party/six.py

Issue 1260293009: make version of ts_mon compatible with appengine (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: clean up code Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 """Utilities for writing code that runs on Python 2 and 3"""
agable 2015/08/10 22:23:58 Similarly here: the symlink above is to appengine/
jshu 2015/08/11 21:57:18 same as other place, appengine/third_party symlink
2
3 # Copyright (c) 2010-2015 Benjamin Peterson
4 #
5 # Permission is hereby granted, free of charge, to any person obtaining a copy
6 # of this software and associated documentation files (the "Software"), to deal
7 # in the Software without restriction, including without limitation the rights
8 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 # copies of the Software, and to permit persons to whom the Software is
10 # furnished to do so, subject to the following conditions:
11 #
12 # The above copyright notice and this permission notice shall be included in all
13 # copies or substantial portions of the Software.
14 #
15 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 # SOFTWARE.
22
23 from __future__ import absolute_import
24
25 import functools
26 import itertools
27 import operator
28 import sys
29 import types
30
31 __author__ = "Benjamin Peterson <benjamin@python.org>"
32 __version__ = "1.9.0"
33
34
35 # Useful for very coarse version differentiation.
36 PY2 = sys.version_info[0] == 2
37 PY3 = sys.version_info[0] == 3
38
39 if PY3:
40 string_types = str,
41 integer_types = int,
42 class_types = type,
43 text_type = str
44 binary_type = bytes
45
46 MAXSIZE = sys.maxsize
47 else:
48 string_types = basestring,
49 integer_types = (int, long)
50 class_types = (type, types.ClassType)
51 text_type = unicode
52 binary_type = str
53
54 if sys.platform.startswith("java"):
55 # Jython always uses 32 bits.
56 MAXSIZE = int((1 << 31) - 1)
57 else:
58 # It's possible to have sizeof(long) != sizeof(Py_ssize_t).
59 class X(object):
60 def __len__(self):
61 return 1 << 31
62 try:
63 len(X())
64 except OverflowError:
65 # 32-bit
66 MAXSIZE = int((1 << 31) - 1)
67 else:
68 # 64-bit
69 MAXSIZE = int((1 << 63) - 1)
70 del X
71
72
73 def _add_doc(func, doc):
74 """Add documentation to a function."""
75 func.__doc__ = doc
76
77
78 def _import_module(name):
79 """Import module, returning the module after the last dot."""
80 __import__(name)
81 return sys.modules[name]
82
83
84 class _LazyDescr(object):
85
86 def __init__(self, name):
87 self.name = name
88
89 def __get__(self, obj, tp):
90 result = self._resolve()
91 setattr(obj, self.name, result) # Invokes __set__.
92 try:
93 # This is a bit ugly, but it avoids running this again by
94 # removing this descriptor.
95 delattr(obj.__class__, self.name)
96 except AttributeError:
97 pass
98 return result
99
100
101 class MovedModule(_LazyDescr):
102
103 def __init__(self, name, old, new=None):
104 super(MovedModule, self).__init__(name)
105 if PY3:
106 if new is None:
107 new = name
108 self.mod = new
109 else:
110 self.mod = old
111
112 def _resolve(self):
113 return _import_module(self.mod)
114
115 def __getattr__(self, attr):
116 _module = self._resolve()
117 value = getattr(_module, attr)
118 setattr(self, attr, value)
119 return value
120
121
122 class _LazyModule(types.ModuleType):
123
124 def __init__(self, name):
125 super(_LazyModule, self).__init__(name)
126 self.__doc__ = self.__class__.__doc__
127
128 def __dir__(self):
129 attrs = ["__doc__", "__name__"]
130 attrs += [attr.name for attr in self._moved_attributes]
131 return attrs
132
133 # Subclasses should override this
134 _moved_attributes = []
135
136
137 class MovedAttribute(_LazyDescr):
138
139 def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
140 super(MovedAttribute, self).__init__(name)
141 if PY3:
142 if new_mod is None:
143 new_mod = name
144 self.mod = new_mod
145 if new_attr is None:
146 if old_attr is None:
147 new_attr = name
148 else:
149 new_attr = old_attr
150 self.attr = new_attr
151 else:
152 self.mod = old_mod
153 if old_attr is None:
154 old_attr = name
155 self.attr = old_attr
156
157 def _resolve(self):
158 module = _import_module(self.mod)
159 return getattr(module, self.attr)
160
161
162 class _SixMetaPathImporter(object):
163 """
164 A meta path importer to import six.moves and its submodules.
165
166 This class implements a PEP302 finder and loader. It should be compatible
167 with Python 2.5 and all existing versions of Python3
168 """
169 def __init__(self, six_module_name):
170 self.name = six_module_name
171 self.known_modules = {}
172
173 def _add_module(self, mod, *fullnames):
174 for fullname in fullnames:
175 self.known_modules[self.name + "." + fullname] = mod
176
177 def _get_module(self, fullname):
178 return self.known_modules[self.name + "." + fullname]
179
180 def find_module(self, fullname, path=None):
181 if fullname in self.known_modules:
182 return self
183 return None
184
185 def __get_module(self, fullname):
186 try:
187 return self.known_modules[fullname]
188 except KeyError:
189 raise ImportError("This loader does not know module " + fullname)
190
191 def load_module(self, fullname):
192 try:
193 # in case of a reload
194 return sys.modules[fullname]
195 except KeyError:
196 pass
197 mod = self.__get_module(fullname)
198 if isinstance(mod, MovedModule):
199 mod = mod._resolve()
200 else:
201 mod.__loader__ = self
202 sys.modules[fullname] = mod
203 return mod
204
205 def is_package(self, fullname):
206 """
207 Return true, if the named module is a package.
208
209 We need this method to get correct spec objects with
210 Python 3.4 (see PEP451)
211 """
212 return hasattr(self.__get_module(fullname), "__path__")
213
214 def get_code(self, fullname):
215 """Return None
216
217 Required, if is_package is implemented"""
218 self.__get_module(fullname) # eventually raises ImportError
219 return None
220 get_source = get_code # same as get_code
221
222 _importer = _SixMetaPathImporter(__name__)
223
224
225 class _MovedItems(_LazyModule):
226 """Lazy loading of moved objects"""
227 __path__ = [] # mark as package
228
229
230 _moved_attributes = [
231 MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
232 MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
233 MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "fil terfalse"),
234 MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
235 MovedAttribute("intern", "__builtin__", "sys"),
236 MovedAttribute("map", "itertools", "builtins", "imap", "map"),
237 MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
238 MovedAttribute("reload_module", "__builtin__", "imp", "reload"),
239 MovedAttribute("reduce", "__builtin__", "functools"),
240 MovedAttribute("shlex_quote", "pipes", "shlex", "quote"),
241 MovedAttribute("StringIO", "StringIO", "io"),
242 MovedAttribute("UserDict", "UserDict", "collections"),
243 MovedAttribute("UserList", "UserList", "collections"),
244 MovedAttribute("UserString", "UserString", "collections"),
245 MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
246 MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
247 MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip _longest"),
248
249 MovedModule("builtins", "__builtin__"),
250 MovedModule("configparser", "ConfigParser"),
251 MovedModule("copyreg", "copy_reg"),
252 MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
253 MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"),
254 MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
255 MovedModule("http_cookies", "Cookie", "http.cookies"),
256 MovedModule("html_entities", "htmlentitydefs", "html.entities"),
257 MovedModule("html_parser", "HTMLParser", "html.parser"),
258 MovedModule("http_client", "httplib", "http.client"),
259 MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multi part"),
260 MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime .nonmultipart"),
261 MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
262 MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
263 MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
264 MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
265 MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
266 MovedModule("cPickle", "cPickle", "pickle"),
267 MovedModule("queue", "Queue"),
268 MovedModule("reprlib", "repr"),
269 MovedModule("socketserver", "SocketServer"),
270 MovedModule("_thread", "thread", "_thread"),
271 MovedModule("tkinter", "Tkinter"),
272 MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
273 MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
274 MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
275 MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
276 MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
277 MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"),
278 MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
279 MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
280 MovedModule("tkinter_colorchooser", "tkColorChooser",
281 "tkinter.colorchooser"),
282 MovedModule("tkinter_commondialog", "tkCommonDialog",
283 "tkinter.commondialog"),
284 MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
285 MovedModule("tkinter_font", "tkFont", "tkinter.font"),
286 MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
287 MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
288 "tkinter.simpledialog"),
289 MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse" ),
290 MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error" ),
291 MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib" ),
292 MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
293 MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"),
294 MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"),
295 MovedModule("winreg", "_winreg"),
296 ]
297 for attr in _moved_attributes:
298 setattr(_MovedItems, attr.name, attr)
299 if isinstance(attr, MovedModule):
300 _importer._add_module(attr, "moves." + attr.name)
301 del attr
302
303 _MovedItems._moved_attributes = _moved_attributes
304
305 moves = _MovedItems(__name__ + ".moves")
306 _importer._add_module(moves, "moves")
307
308
309 class Module_six_moves_urllib_parse(_LazyModule):
310 """Lazy loading of moved objects in six.moves.urllib_parse"""
311
312
313 _urllib_parse_moved_attributes = [
314 MovedAttribute("ParseResult", "urlparse", "urllib.parse"),
315 MovedAttribute("SplitResult", "urlparse", "urllib.parse"),
316 MovedAttribute("parse_qs", "urlparse", "urllib.parse"),
317 MovedAttribute("parse_qsl", "urlparse", "urllib.parse"),
318 MovedAttribute("urldefrag", "urlparse", "urllib.parse"),
319 MovedAttribute("urljoin", "urlparse", "urllib.parse"),
320 MovedAttribute("urlparse", "urlparse", "urllib.parse"),
321 MovedAttribute("urlsplit", "urlparse", "urllib.parse"),
322 MovedAttribute("urlunparse", "urlparse", "urllib.parse"),
323 MovedAttribute("urlunsplit", "urlparse", "urllib.parse"),
324 MovedAttribute("quote", "urllib", "urllib.parse"),
325 MovedAttribute("quote_plus", "urllib", "urllib.parse"),
326 MovedAttribute("unquote", "urllib", "urllib.parse"),
327 MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
328 MovedAttribute("urlencode", "urllib", "urllib.parse"),
329 MovedAttribute("splitquery", "urllib", "urllib.parse"),
330 MovedAttribute("splittag", "urllib", "urllib.parse"),
331 MovedAttribute("splituser", "urllib", "urllib.parse"),
332 MovedAttribute("uses_fragment", "urlparse", "urllib.parse"),
333 MovedAttribute("uses_netloc", "urlparse", "urllib.parse"),
334 MovedAttribute("uses_params", "urlparse", "urllib.parse"),
335 MovedAttribute("uses_query", "urlparse", "urllib.parse"),
336 MovedAttribute("uses_relative", "urlparse", "urllib.parse"),
337 ]
338 for attr in _urllib_parse_moved_attributes:
339 setattr(Module_six_moves_urllib_parse, attr.name, attr)
340 del attr
341
342 Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes
343
344 _importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_pa rse"),
345 "moves.urllib_parse", "moves.urllib.parse")
346
347
348 class Module_six_moves_urllib_error(_LazyModule):
349 """Lazy loading of moved objects in six.moves.urllib_error"""
350
351
352 _urllib_error_moved_attributes = [
353 MovedAttribute("URLError", "urllib2", "urllib.error"),
354 MovedAttribute("HTTPError", "urllib2", "urllib.error"),
355 MovedAttribute("ContentTooShortError", "urllib", "urllib.error"),
356 ]
357 for attr in _urllib_error_moved_attributes:
358 setattr(Module_six_moves_urllib_error, attr.name, attr)
359 del attr
360
361 Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes
362
363 _importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.er ror"),
364 "moves.urllib_error", "moves.urllib.error")
365
366
367 class Module_six_moves_urllib_request(_LazyModule):
368 """Lazy loading of moved objects in six.moves.urllib_request"""
369
370
371 _urllib_request_moved_attributes = [
372 MovedAttribute("urlopen", "urllib2", "urllib.request"),
373 MovedAttribute("install_opener", "urllib2", "urllib.request"),
374 MovedAttribute("build_opener", "urllib2", "urllib.request"),
375 MovedAttribute("pathname2url", "urllib", "urllib.request"),
376 MovedAttribute("url2pathname", "urllib", "urllib.request"),
377 MovedAttribute("getproxies", "urllib", "urllib.request"),
378 MovedAttribute("Request", "urllib2", "urllib.request"),
379 MovedAttribute("OpenerDirector", "urllib2", "urllib.request"),
380 MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"),
381 MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"),
382 MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"),
383 MovedAttribute("ProxyHandler", "urllib2", "urllib.request"),
384 MovedAttribute("BaseHandler", "urllib2", "urllib.request"),
385 MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"),
386 MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request "),
387 MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"),
388 MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"),
389 MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"),
390 MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"),
391 MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"),
392 MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"),
393 MovedAttribute("HTTPHandler", "urllib2", "urllib.request"),
394 MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"),
395 MovedAttribute("FileHandler", "urllib2", "urllib.request"),
396 MovedAttribute("FTPHandler", "urllib2", "urllib.request"),
397 MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"),
398 MovedAttribute("UnknownHandler", "urllib2", "urllib.request"),
399 MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
400 MovedAttribute("urlretrieve", "urllib", "urllib.request"),
401 MovedAttribute("urlcleanup", "urllib", "urllib.request"),
402 MovedAttribute("URLopener", "urllib", "urllib.request"),
403 MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
404 MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
405 ]
406 for attr in _urllib_request_moved_attributes:
407 setattr(Module_six_moves_urllib_request, attr.name, attr)
408 del attr
409
410 Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attrib utes
411
412 _importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib. request"),
413 "moves.urllib_request", "moves.urllib.request")
414
415
416 class Module_six_moves_urllib_response(_LazyModule):
417 """Lazy loading of moved objects in six.moves.urllib_response"""
418
419
420 _urllib_response_moved_attributes = [
421 MovedAttribute("addbase", "urllib", "urllib.response"),
422 MovedAttribute("addclosehook", "urllib", "urllib.response"),
423 MovedAttribute("addinfo", "urllib", "urllib.response"),
424 MovedAttribute("addinfourl", "urllib", "urllib.response"),
425 ]
426 for attr in _urllib_response_moved_attributes:
427 setattr(Module_six_moves_urllib_response, attr.name, attr)
428 del attr
429
430 Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attr ibutes
431
432 _importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib .response"),
433 "moves.urllib_response", "moves.urllib.response")
434
435
436 class Module_six_moves_urllib_robotparser(_LazyModule):
437 """Lazy loading of moved objects in six.moves.urllib_robotparser"""
438
439
440 _urllib_robotparser_moved_attributes = [
441 MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
442 ]
443 for attr in _urllib_robotparser_moved_attributes:
444 setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
445 del attr
446
447 Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_move d_attributes
448
449 _importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.url lib.robotparser"),
450 "moves.urllib_robotparser", "moves.urllib.robotparser")
451
452
453 class Module_six_moves_urllib(types.ModuleType):
454 """Create a six.moves.urllib namespace that resembles the Python 3 namespace """
455 __path__ = [] # mark as package
456 parse = _importer._get_module("moves.urllib_parse")
457 error = _importer._get_module("moves.urllib_error")
458 request = _importer._get_module("moves.urllib_request")
459 response = _importer._get_module("moves.urllib_response")
460 robotparser = _importer._get_module("moves.urllib_robotparser")
461
462 def __dir__(self):
463 return ['parse', 'error', 'request', 'response', 'robotparser']
464
465 _importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"),
466 "moves.urllib")
467
468
469 def add_move(move):
470 """Add an item to six.moves."""
471 setattr(_MovedItems, move.name, move)
472
473
474 def remove_move(name):
475 """Remove item from six.moves."""
476 try:
477 delattr(_MovedItems, name)
478 except AttributeError:
479 try:
480 del moves.__dict__[name]
481 except KeyError:
482 raise AttributeError("no such move, %r" % (name,))
483
484
485 if PY3:
486 _meth_func = "__func__"
487 _meth_self = "__self__"
488
489 _func_closure = "__closure__"
490 _func_code = "__code__"
491 _func_defaults = "__defaults__"
492 _func_globals = "__globals__"
493 else:
494 _meth_func = "im_func"
495 _meth_self = "im_self"
496
497 _func_closure = "func_closure"
498 _func_code = "func_code"
499 _func_defaults = "func_defaults"
500 _func_globals = "func_globals"
501
502
503 try:
504 advance_iterator = next
505 except NameError:
506 def advance_iterator(it):
507 return it.next()
508 next = advance_iterator
509
510
511 try:
512 callable = callable
513 except NameError:
514 def callable(obj):
515 return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
516
517
518 if PY3:
519 def get_unbound_function(unbound):
520 return unbound
521
522 create_bound_method = types.MethodType
523
524 Iterator = object
525 else:
526 def get_unbound_function(unbound):
527 return unbound.im_func
528
529 def create_bound_method(func, obj):
530 return types.MethodType(func, obj, obj.__class__)
531
532 class Iterator(object):
533
534 def next(self):
535 return type(self).__next__(self)
536
537 callable = callable
538 _add_doc(get_unbound_function,
539 """Get the function out of a possibly unbound function""")
540
541
542 get_method_function = operator.attrgetter(_meth_func)
543 get_method_self = operator.attrgetter(_meth_self)
544 get_function_closure = operator.attrgetter(_func_closure)
545 get_function_code = operator.attrgetter(_func_code)
546 get_function_defaults = operator.attrgetter(_func_defaults)
547 get_function_globals = operator.attrgetter(_func_globals)
548
549
550 if PY3:
551 def iterkeys(d, **kw):
552 return iter(d.keys(**kw))
553
554 def itervalues(d, **kw):
555 return iter(d.values(**kw))
556
557 def iteritems(d, **kw):
558 return iter(d.items(**kw))
559
560 def iterlists(d, **kw):
561 return iter(d.lists(**kw))
562
563 viewkeys = operator.methodcaller("keys")
564
565 viewvalues = operator.methodcaller("values")
566
567 viewitems = operator.methodcaller("items")
568 else:
569 def iterkeys(d, **kw):
570 return iter(d.iterkeys(**kw))
571
572 def itervalues(d, **kw):
573 return iter(d.itervalues(**kw))
574
575 def iteritems(d, **kw):
576 return iter(d.iteritems(**kw))
577
578 def iterlists(d, **kw):
579 return iter(d.iterlists(**kw))
580
581 viewkeys = operator.methodcaller("viewkeys")
582
583 viewvalues = operator.methodcaller("viewvalues")
584
585 viewitems = operator.methodcaller("viewitems")
586
587 _add_doc(iterkeys, "Return an iterator over the keys of a dictionary.")
588 _add_doc(itervalues, "Return an iterator over the values of a dictionary.")
589 _add_doc(iteritems,
590 "Return an iterator over the (key, value) pairs of a dictionary.")
591 _add_doc(iterlists,
592 "Return an iterator over the (key, [values]) pairs of a dictionary.")
593
594
595 if PY3:
596 def b(s):
597 return s.encode("latin-1")
598 def u(s):
599 return s
600 unichr = chr
601 if sys.version_info[1] <= 1:
602 def int2byte(i):
603 return bytes((i,))
604 else:
605 # This is about 2x faster than the implementation above on 3.2+
606 int2byte = operator.methodcaller("to_bytes", 1, "big")
607 byte2int = operator.itemgetter(0)
608 indexbytes = operator.getitem
609 iterbytes = iter
610 import io
611 StringIO = io.StringIO
612 BytesIO = io.BytesIO
613 _assertCountEqual = "assertCountEqual"
614 _assertRaisesRegex = "assertRaisesRegex"
615 _assertRegex = "assertRegex"
616 else:
617 def b(s):
618 return s
619 # Workaround for standalone backslash
620 def u(s):
621 return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape")
622 unichr = unichr
623 int2byte = chr
624 def byte2int(bs):
625 return ord(bs[0])
626 def indexbytes(buf, i):
627 return ord(buf[i])
628 iterbytes = functools.partial(itertools.imap, ord)
629 import StringIO
630 StringIO = BytesIO = StringIO.StringIO
631 _assertCountEqual = "assertItemsEqual"
632 _assertRaisesRegex = "assertRaisesRegexp"
633 _assertRegex = "assertRegexpMatches"
634 _add_doc(b, """Byte literal""")
635 _add_doc(u, """Text literal""")
636
637
638 def assertCountEqual(self, *args, **kwargs):
639 return getattr(self, _assertCountEqual)(*args, **kwargs)
640
641
642 def assertRaisesRegex(self, *args, **kwargs):
643 return getattr(self, _assertRaisesRegex)(*args, **kwargs)
644
645
646 def assertRegex(self, *args, **kwargs):
647 return getattr(self, _assertRegex)(*args, **kwargs)
648
649
650 if PY3:
651 exec_ = getattr(moves.builtins, "exec")
652
653
654 def reraise(tp, value, tb=None):
655 if value is None:
656 value = tp()
657 if value.__traceback__ is not tb:
658 raise value.with_traceback(tb)
659 raise value
660
661 else:
662 def exec_(_code_, _globs_=None, _locs_=None):
663 """Execute code in a namespace."""
664 if _globs_ is None:
665 frame = sys._getframe(1)
666 _globs_ = frame.f_globals
667 if _locs_ is None:
668 _locs_ = frame.f_locals
669 del frame
670 elif _locs_ is None:
671 _locs_ = _globs_
672 exec("""exec _code_ in _globs_, _locs_""")
673
674
675 exec_("""def reraise(tp, value, tb=None):
676 raise tp, value, tb
677 """)
678
679
680 if sys.version_info[:2] == (3, 2):
681 exec_("""def raise_from(value, from_value):
682 if from_value is None:
683 raise value
684 raise value from from_value
685 """)
686 elif sys.version_info[:2] > (3, 2):
687 exec_("""def raise_from(value, from_value):
688 raise value from from_value
689 """)
690 else:
691 def raise_from(value, from_value):
692 raise value
693
694
695 print_ = getattr(moves.builtins, "print", None)
696 if print_ is None:
697 def print_(*args, **kwargs):
698 """The new-style print function for Python 2.4 and 2.5."""
699 fp = kwargs.pop("file", sys.stdout)
700 if fp is None:
701 return
702 def write(data):
703 if not isinstance(data, basestring):
704 data = str(data)
705 # If the file has an encoding, encode unicode with it.
706 if (isinstance(fp, file) and
707 isinstance(data, unicode) and
708 fp.encoding is not None):
709 errors = getattr(fp, "errors", None)
710 if errors is None:
711 errors = "strict"
712 data = data.encode(fp.encoding, errors)
713 fp.write(data)
714 want_unicode = False
715 sep = kwargs.pop("sep", None)
716 if sep is not None:
717 if isinstance(sep, unicode):
718 want_unicode = True
719 elif not isinstance(sep, str):
720 raise TypeError("sep must be None or a string")
721 end = kwargs.pop("end", None)
722 if end is not None:
723 if isinstance(end, unicode):
724 want_unicode = True
725 elif not isinstance(end, str):
726 raise TypeError("end must be None or a string")
727 if kwargs:
728 raise TypeError("invalid keyword arguments to print()")
729 if not want_unicode:
730 for arg in args:
731 if isinstance(arg, unicode):
732 want_unicode = True
733 break
734 if want_unicode:
735 newline = unicode("\n")
736 space = unicode(" ")
737 else:
738 newline = "\n"
739 space = " "
740 if sep is None:
741 sep = space
742 if end is None:
743 end = newline
744 for i, arg in enumerate(args):
745 if i:
746 write(sep)
747 write(arg)
748 write(end)
749 if sys.version_info[:2] < (3, 3):
750 _print = print_
751 def print_(*args, **kwargs):
752 fp = kwargs.get("file", sys.stdout)
753 flush = kwargs.pop("flush", False)
754 _print(*args, **kwargs)
755 if flush and fp is not None:
756 fp.flush()
757
758 _add_doc(reraise, """Reraise an exception.""")
759
760 if sys.version_info[0:2] < (3, 4):
761 def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
762 updated=functools.WRAPPER_UPDATES):
763 def wrapper(f):
764 f = functools.wraps(wrapped, assigned, updated)(f)
765 f.__wrapped__ = wrapped
766 return f
767 return wrapper
768 else:
769 wraps = functools.wraps
770
771 def with_metaclass(meta, *bases):
772 """Create a base class with a metaclass."""
773 # This requires a bit of explanation: the basic idea is to make a dummy
774 # metaclass for one level of class instantiation that replaces itself with
775 # the actual metaclass.
776 class metaclass(meta):
777 def __new__(cls, name, this_bases, d):
778 return meta(name, bases, d)
779 return type.__new__(metaclass, 'temporary_class', (), {})
780
781
782 def add_metaclass(metaclass):
783 """Class decorator for creating a class with a metaclass."""
784 def wrapper(cls):
785 orig_vars = cls.__dict__.copy()
786 slots = orig_vars.get('__slots__')
787 if slots is not None:
788 if isinstance(slots, str):
789 slots = [slots]
790 for slots_var in slots:
791 orig_vars.pop(slots_var)
792 orig_vars.pop('__dict__', None)
793 orig_vars.pop('__weakref__', None)
794 return metaclass(cls.__name__, cls.__bases__, orig_vars)
795 return wrapper
796
797
798 def python_2_unicode_compatible(klass):
799 """
800 A decorator that defines __unicode__ and __str__ methods under Python 2.
801 Under Python 3 it does nothing.
802
803 To support Python 2 and 3 with a single code base, define a __str__ method
804 returning text and apply this decorator to the class.
805 """
806 if PY2:
807 if '__str__' not in klass.__dict__:
808 raise ValueError("@python_2_unicode_compatible cannot be applied "
809 "to %s because it doesn't define __str__()." %
810 klass.__name__)
811 klass.__unicode__ = klass.__str__
812 klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
813 return klass
814
815
816 # Complete the moves implementation.
817 # This code is at the end of this module to speed up module loading.
818 # Turn this module into a package.
819 __path__ = [] # required for PEP 302 and PEP 451
820 __package__ = __name__ # see PEP 366 @ReservedAssignment
821 if globals().get("__spec__") is not None:
822 __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable
823 # Remove other six meta path importers, since they cause problems. This can
824 # happen if six is removed from sys.modules and then reloaded. (Setuptools does
825 # this for some reason.)
826 if sys.meta_path:
827 for i, importer in enumerate(sys.meta_path):
828 # Here's some real nastiness: Another "instance" of the six module might
829 # be floating around. Therefore, we can't use isinstance() to check for
830 # the six meta path importer, since the other six instance will have
831 # inserted an importer with different class.
832 if (type(importer).__name__ == "_SixMetaPathImporter" and
833 importer.name == __name__):
834 del sys.meta_path[i]
835 break
836 del i, importer
837 # Finally, add the importer to the meta path import hook.
838 sys.meta_path.append(_importer)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698