Hello community, here is the log from the commit of package python3-six for openSUSE:Factory checked in at 2014-09-17 17:26:37 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python3-six (Old) and /work/SRC/openSUSE:Factory/.python3-six.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python3-six" Changes: -------- --- /work/SRC/openSUSE:Factory/python3-six/python3-six.changes 2014-05-09 06:58:59.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.python3-six.new/python3-six.changes 2014-09-17 17:27:01.000000000 +0200 @@ -1,0 +2,34 @@ +Tue Sep 16 12:05:57 UTC 2014 - toddrme2...@gmail.com + +- update to version 1.8.0: + * Issue #90: Add six.moves.shlex_quote. + * Issue #59: Add six.moves.intern. + * Add six.urllib.parse.uses_(fragment|netloc|params|query|relative). + * Issue #88: Fix add_metaclass when the class has __slots__ containing + "__weakref__" or "__dict__". + * Issue #89: Make six use absolute imports. + * Issue #85: Always accept *updated* and *assigned* arguments for wraps(). + * Issue #86: In reraise(), instantiate the exception if the second argument is + None. + * Pull request #45: Add six.moves.email_mime_nonmultipart. + * Issue #81: Add six.urllib.request.splittag mapping. + * Issue #80: Add six.urllib.request.splituser mapping. +- update to 1.7.3: + - Issue #77: Fix import six on Python 3.4 with a custom loader. + - Issue #74: six.moves.xmlrpc_server should map to SimpleXMLRPCServer on Python + 2 as documented not xmlrpclib. +- update to 1.7.2: + - Issue #72: Fix installing on Python 2. + - Issue #71: Make the six.moves meta path importer handle reloading of the six + module gracefully. + - Pull request #30: Implement six.moves with a PEP 302 meta path hook. + - Pull request #32: Add six.wraps, which is like functools.wraps but always sets + the __wrapped__ attribute. + - Pull request #35: Improve add_metaclass, so that it doesn't end up inserting + another class into the hierarchy. + - Pull request #34: Add import mappings for dummy_thread. + - Pull request #33: Add import mappings for UserDict and UserList. + - Pull request #31: Select the implementations of dictionary iterator routines + at import time for a 20% speed boost. + +------------------------------------------------------------------- Old: ---- six-1.6.1.tar.gz New: ---- six-1.8.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python3-six.spec ++++++ --- /var/tmp/diff_new_pack.atpkYx/_old 2014-09-17 17:27:02.000000000 +0200 +++ /var/tmp/diff_new_pack.atpkYx/_new 2014-09-17 17:27:02.000000000 +0200 @@ -17,7 +17,7 @@ Name: python3-six -Version: 1.6.1 +Version: 1.8.0 Release: 0 Url: http://pypi.python.org/pypi/six/ Summary: Python 2 and 3 compatibility utilities ++++++ six-1.6.1.tar.gz -> six-1.8.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/six-1.6.1/CHANGES new/six-1.8.0/CHANGES --- old/six-1.6.1/CHANGES 2014-03-14 04:36:39.000000000 +0100 +++ new/six-1.8.0/CHANGES 2014-09-11 23:42:45.000000000 +0200 @@ -3,6 +3,68 @@ This file lists the changes in each six version. +1.8.0 +----- + +- Issue #90: Add six.moves.shlex_quote. + +- Issue #59: Add six.moves.intern. + +- Add six.urllib.parse.uses_(fragment|netloc|params|query|relative). + +- Issue #88: Fix add_metaclass when the class has __slots__ containing + "__weakref__" or "__dict__". + +- Issue #89: Make six use absolute imports. + +- Issue #85: Always accept *updated* and *assigned* arguments for wraps(). + +- Issue #86: In reraise(), instantiate the exception if the second argument is + None. + +- Pull request #45: Add six.moves.email_mime_nonmultipart. + +- Issue #81: Add six.urllib.request.splittag mapping. + +- Issue #80: Add six.urllib.request.splituser mapping. + +1.7.3 +----- + +- Issue #77: Fix import six on Python 3.4 with a custom loader. + +- Issue #74: six.moves.xmlrpc_server should map to SimpleXMLRPCServer on Python + 2 as documented not xmlrpclib. + +1.7.2 +----- + +- Issue #72: Fix installing on Python 2. + +1.7.1 +----- + +- Issue #71: Make the six.moves meta path importer handle reloading of the six + module gracefully. + +1.7.0 +----- + +- Pull request #30: Implement six.moves with a PEP 302 meta path hook. + +- Pull request #32: Add six.wraps, which is like functools.wraps but always sets + the __wrapped__ attribute. + +- Pull request #35: Improve add_metaclass, so that it doesn't end up inserting + another class into the hierarchy. + +- Pull request #34: Add import mappings for dummy_thread. + +- Pull request #33: Add import mappings for UserDict and UserList. + +- Pull request #31: Select the implementations of dictionary iterator routines + at import time for a 20% speed boost. + 1.6.1 ----- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/six-1.6.1/PKG-INFO new/six-1.8.0/PKG-INFO --- old/six-1.6.1/PKG-INFO 2014-03-14 04:39:28.000000000 +0100 +++ new/six-1.8.0/PKG-INFO 2014-09-11 23:48:41.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: six -Version: 1.6.1 +Version: 1.8.0 Summary: Python 2 and 3 compatibility utilities Home-page: http://pypi.python.org/pypi/six/ Author: Benjamin Peterson diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/six-1.6.1/documentation/index.rst new/six-1.8.0/documentation/index.rst --- old/six-1.6.1/documentation/index.rst 2014-03-14 03:56:36.000000000 +0100 +++ new/six-1.8.0/documentation/index.rst 2014-09-11 23:32:59.000000000 +0200 @@ -222,6 +222,13 @@ aliased to :class:`py3:object`.) +.. function:: wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, updated=functools.WRAPPER_UPDATES) + + This is exactly the :func:`py3:functools.wraps` decorator, but it sets the + ``__wrapped__`` attribute on what it decorates as :func:`py3:functools.wraps` + does on Python versions after 3.2. + + Syntax compatibility >>>>>>>>>>>>>>>>>>>> @@ -259,7 +266,10 @@ Reraise an exception, possibly with a different traceback. In the simple case, ``reraise(*sys.exc_info())`` with an active exception (in an except block) reraises the current exception with the last traceback. A different - traceback can be specified with the *exc_traceback* parameter. + traceback can be specified with the *exc_traceback* parameter. Note that + since the exception reraising is done within the :func:`reraise` function, + Python will attach the call frame of :func:`reraise` to whatever traceback is + raised. .. function:: with_metaclass(metaclass, *bases) @@ -285,9 +295,7 @@ .. function:: add_metaclass(metaclass) Class decorator that replaces a normally-constructed class with a - metaclass-constructed one. Unlike :func:`with_metaclass`, - :func:`add_metaclass` does not create an intermediate base class between the - class being created and its bases. Example usage: :: + metaclass-constructed one. Example usage: :: @add_metaclass(Meta) class MyClass(object): @@ -477,8 +485,12 @@ +------------------------------+-------------------------------------+-------------------------------------+ | ``dbm_gnu`` | :func:`py2:gdbm` | :class:`py3:dbm.gnu` | +------------------------------+-------------------------------------+-------------------------------------+ +| ``_dummy_thread`` | :mod:`py2:dummy_thread` | :mod:`py3:_dummy_thread` | ++------------------------------+-------------------------------------+-------------------------------------+ | ``email_mime_multipart`` | :mod:`py2:email.MIMEMultipart` | :mod:`py3:email.mime.multipart` | +------------------------------+-------------------------------------+-------------------------------------+ +| ``email_mime_nonmultipart`` | :mod:`py2:email.MIMENonMultipart` | :mod:`py3:email.mime.nonmultipart` | ++------------------------------+-------------------------------------+-------------------------------------+ | ``email_mime_text`` | :mod:`py2:email.MIMEText` | :mod:`py3:email.mime.text` | +------------------------------+-------------------------------------+-------------------------------------+ | ``email_mime_base`` | :mod:`py2:email.MIMEBase` | :mod:`py3:email.mime.base` | @@ -505,6 +517,8 @@ +------------------------------+-------------------------------------+-------------------------------------+ | ``input`` | :func:`py2:raw_input` | :func:`py3:input` | +------------------------------+-------------------------------------+-------------------------------------+ +| ``intern`` | :func:`py2:intern` | :func:`py3:sys.intern` | ++------------------------------+-------------------------------------+-------------------------------------+ | ``map`` | :func:`py2:itertools.imap` | :func:`py3:map` | +------------------------------+-------------------------------------+-------------------------------------+ | ``queue`` | :mod:`py2:Queue` | :mod:`py3:queue` | @@ -517,6 +531,8 @@ +------------------------------+-------------------------------------+-------------------------------------+ | ``reprlib`` | :mod:`py2:repr` | :mod:`py3:reprlib` | +------------------------------+-------------------------------------+-------------------------------------+ +| ``shlex_quote`` | :mod:`py2:pipes.quote` | :mod:`py3:shlex.quote` | ++------------------------------+-------------------------------------+-------------------------------------+ | ``socketserver`` | :mod:`py2:SocketServer` | :mod:`py3:socketserver` | +------------------------------+-------------------------------------+-------------------------------------+ | ``_thread`` | :mod:`py2:thread` | :mod:`py3:_thread` | @@ -563,6 +579,10 @@ +------------------------------+-------------------------------------+-------------------------------------+ | ``urllib_robotparser`` | :mod:`py2:robotparser` | :mod:`py3:urllib.robotparser` | +------------------------------+-------------------------------------+-------------------------------------+ +| ``UserDict`` | :class:`py2:UserDict.UserDict` | :class:`py3:collections.UserDict` | ++------------------------------+-------------------------------------+-------------------------------------+ +| ``UserList`` | :class:`py2:UserList.UserList` | :class:`py3:collections.UserList` | ++------------------------------+-------------------------------------+-------------------------------------+ | ``UserString`` | :class:`py2:UserString.UserString` | :class:`py3:collections.UserString` | +------------------------------+-------------------------------------+-------------------------------------+ | ``winreg`` | :mod:`py2:_winreg` | :mod:`py3:winreg` | @@ -599,11 +619,18 @@ * :func:`py2:urlparse.urlsplit` * :func:`py2:urlparse.urlunsplit` * :func:`py2:urlparse.splitquery` +* :func:`py2:urlparse.uses_fragment` +* :func:`py2:urlparse.uses_netloc` +* :func:`py2:urlparse.uses_params` +* :func:`py2:urlparse.uses_query` +* :func:`py2:urlparse.uses_relative` and :mod:`py2:urllib`: * :func:`py2:urllib.quote` * :func:`py2:urllib.quote_plus` +* :func:`py2:urllib.splittag` +* :func:`py2:urllib.splituser` * :func:`py2:urllib.unquote` * :func:`py2:urllib.unquote_plus` * :func:`py2:urllib.urlencode` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/six-1.6.1/setup.cfg new/six-1.8.0/setup.cfg --- old/six-1.6.1/setup.cfg 2014-03-14 04:39:28.000000000 +0100 +++ new/six-1.8.0/setup.cfg 2014-09-11 23:48:41.000000000 +0200 @@ -2,7 +2,7 @@ universal = 1 [egg_info] -tag_date = 0 tag_build = +tag_date = 0 tag_svn_revision = 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/six-1.6.1/six.egg-info/PKG-INFO new/six-1.8.0/six.egg-info/PKG-INFO --- old/six-1.6.1/six.egg-info/PKG-INFO 2014-03-14 04:39:28.000000000 +0100 +++ new/six-1.8.0/six.egg-info/PKG-INFO 2014-09-11 23:48:40.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: six -Version: 1.6.1 +Version: 1.8.0 Summary: Python 2 and 3 compatibility utilities Home-page: http://pypi.python.org/pypi/six/ Author: Benjamin Peterson diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/six-1.6.1/six.py new/six-1.8.0/six.py --- old/six-1.6.1/six.py 2014-03-14 04:38:01.000000000 +0100 +++ new/six-1.8.0/six.py 2014-09-11 23:42:33.000000000 +0200 @@ -20,12 +20,15 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +from __future__ import absolute_import + +import functools import operator import sys import types __author__ = "Benjamin Peterson <benja...@python.org>" -__version__ = "1.6.1" +__version__ = "1.8.0" # Useful for very coarse version differentiation. @@ -83,11 +86,7 @@ self.name = name def __get__(self, obj, tp): - try: - result = self._resolve() - except ImportError: - # See the nice big comment in MovedModule.__getattr__. - raise AttributeError("%s could not be imported " % self.name) + result = self._resolve() setattr(obj, self.name, result) # Invokes __set__. # This is a bit ugly, but it avoids running this again. delattr(obj.__class__, self.name) @@ -109,22 +108,7 @@ return _import_module(self.mod) def __getattr__(self, attr): - # It turns out many Python frameworks like to traverse sys.modules and - # try to load various attributes. This causes problems if this is a - # platform-specific module on the wrong platform, like _winreg on - # Unixes. Therefore, we silently pretend unimportable modules do not - # have any attributes. See issues #51, #53, #56, and #63 for the full - # tales of woe. - # - # First, if possible, avoid loading the module just to look at __file__, - # __name__, or __path__. - if (attr in ("__file__", "__name__", "__path__") and - self.mod not in sys.modules): - raise AttributeError(attr) - try: - _module = self._resolve() - except ImportError: - raise AttributeError(attr) + _module = self._resolve() value = getattr(_module, attr) setattr(self, attr, value) return value @@ -170,9 +154,72 @@ return getattr(module, self.attr) +class _SixMetaPathImporter(object): + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + class _MovedItems(_LazyModule): """Lazy loading of moved objects""" + __path__ = [] # mark as package _moved_attributes = [ @@ -180,11 +227,15 @@ MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), MovedAttribute("map", "itertools", "builtins", "imap", "map"), MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), MovedAttribute("reload_module", "__builtin__", "imp", "reload"), MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), MovedAttribute("UserString", "UserString", "collections"), MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), @@ -194,12 +245,14 @@ MovedModule("configparser", "ConfigParser"), MovedModule("copyreg", "copy_reg"), MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), MovedModule("http_cookies", "Cookie", "http.cookies"), MovedModule("html_entities", "htmlentitydefs", "html.entities"), MovedModule("html_parser", "HTMLParser", "html.parser"), MovedModule("http_client", "httplib", "http.client"), MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), @@ -233,18 +286,19 @@ MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), - MovedModule("xmlrpc_server", "xmlrpclib", "xmlrpc.server"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), MovedModule("winreg", "_winreg"), ] for attr in _moved_attributes: setattr(_MovedItems, attr.name, attr) if isinstance(attr, MovedModule): - sys.modules[__name__ + ".moves." + attr.name] = attr + _importer._add_module(attr, "moves." + attr.name) del attr _MovedItems._moved_attributes = _moved_attributes -moves = sys.modules[__name__ + ".moves"] = _MovedItems(__name__ + ".moves") +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") class Module_six_moves_urllib_parse(_LazyModule): @@ -268,6 +322,13 @@ MovedAttribute("unquote_plus", "urllib", "urllib.parse"), MovedAttribute("urlencode", "urllib", "urllib.parse"), MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), ] for attr in _urllib_parse_moved_attributes: setattr(Module_six_moves_urllib_parse, attr.name, attr) @@ -275,7 +336,8 @@ Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes -sys.modules[__name__ + ".moves.urllib_parse"] = sys.modules[__name__ + ".moves.urllib.parse"] = Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse") +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") class Module_six_moves_urllib_error(_LazyModule): @@ -293,7 +355,8 @@ Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes -sys.modules[__name__ + ".moves.urllib_error"] = sys.modules[__name__ + ".moves.urllib.error"] = Module_six_moves_urllib_error(__name__ + ".moves.urllib.error") +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") class Module_six_moves_urllib_request(_LazyModule): @@ -341,7 +404,8 @@ Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes -sys.modules[__name__ + ".moves.urllib_request"] = sys.modules[__name__ + ".moves.urllib.request"] = Module_six_moves_urllib_request(__name__ + ".moves.urllib.request") +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") class Module_six_moves_urllib_response(_LazyModule): @@ -360,7 +424,8 @@ Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes -sys.modules[__name__ + ".moves.urllib_response"] = sys.modules[__name__ + ".moves.urllib.response"] = Module_six_moves_urllib_response(__name__ + ".moves.urllib.response") +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") class Module_six_moves_urllib_robotparser(_LazyModule): @@ -376,22 +441,24 @@ Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes -sys.modules[__name__ + ".moves.urllib_robotparser"] = sys.modules[__name__ + ".moves.urllib.robotparser"] = Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser") +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") class Module_six_moves_urllib(types.ModuleType): """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" - parse = sys.modules[__name__ + ".moves.urllib_parse"] - error = sys.modules[__name__ + ".moves.urllib_error"] - request = sys.modules[__name__ + ".moves.urllib_request"] - response = sys.modules[__name__ + ".moves.urllib_response"] - robotparser = sys.modules[__name__ + ".moves.urllib_robotparser"] + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") def __dir__(self): return ['parse', 'error', 'request', 'response', 'robotparser'] - -sys.modules[__name__ + ".moves.urllib"] = Module_six_moves_urllib(__name__ + ".moves.urllib") +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") def add_move(move): @@ -418,11 +485,6 @@ _func_code = "__code__" _func_defaults = "__defaults__" _func_globals = "__globals__" - - _iterkeys = "keys" - _itervalues = "values" - _iteritems = "items" - _iterlists = "lists" else: _meth_func = "im_func" _meth_self = "im_self" @@ -432,11 +494,6 @@ _func_defaults = "func_defaults" _func_globals = "func_globals" - _iterkeys = "iterkeys" - _itervalues = "itervalues" - _iteritems = "iteritems" - _iterlists = "iterlists" - try: advance_iterator = next @@ -485,21 +542,37 @@ get_function_globals = operator.attrgetter(_func_globals) -def iterkeys(d, **kw): - """Return an iterator over the keys of a dictionary.""" - return iter(getattr(d, _iterkeys)(**kw)) - -def itervalues(d, **kw): - """Return an iterator over the values of a dictionary.""" - return iter(getattr(d, _itervalues)(**kw)) - -def iteritems(d, **kw): - """Return an iterator over the (key, value) pairs of a dictionary.""" - return iter(getattr(d, _iteritems)(**kw)) - -def iterlists(d, **kw): - """Return an iterator over the (key, [values]) pairs of a dictionary.""" - return iter(getattr(d, _iterlists)(**kw)) +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) +else: + def iterkeys(d, **kw): + return iter(d.iterkeys(**kw)) + + def itervalues(d, **kw): + return iter(d.itervalues(**kw)) + + def iteritems(d, **kw): + return iter(d.iteritems(**kw)) + + def iterlists(d, **kw): + return iter(d.iterlists(**kw)) + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") if PY3: @@ -545,6 +618,8 @@ def reraise(tp, value, tb=None): + if value is None: + value = tp() if value.__traceback__ is not tb: raise value.with_traceback(tb) raise value @@ -625,22 +700,63 @@ _add_doc(reraise, """Reraise an exception.""") +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps def with_metaclass(meta, *bases): """Create a base class with a metaclass.""" - return meta("NewBase", bases, {}) + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + def add_metaclass(metaclass): """Class decorator for creating a class with a metaclass.""" def wrapper(cls): orig_vars = cls.__dict__.copy() - orig_vars.pop('__dict__', None) - orig_vars.pop('__weakref__', None) slots = orig_vars.get('__slots__') if slots is not None: if isinstance(slots, str): slots = [slots] for slots_var in slots: orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) return metaclass(cls.__name__, cls.__bases__, orig_vars) return wrapper + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/six-1.6.1/test_six.py new/six-1.8.0/test_six.py --- old/six-1.6.1/test_six.py 2014-03-14 04:30:44.000000000 +0100 +++ new/six-1.8.0/test_six.py 2014-08-18 06:25:25.000000000 +0200 @@ -353,6 +353,14 @@ def test_dictionary_iterators(monkeypatch): + def stock_method_name(iterwhat): + """Given a method suffix like "lists" or "values", return the name + of the dict method that delivers those on the version of Python + we're running in.""" + if six.PY3: + return iterwhat + return 'iter' + iterwhat + class MyDict(dict): if not six.PY3: def lists(self, **kw): @@ -361,7 +369,8 @@ return iter([1, 2, 3]) f = MyDict.iterlists del MyDict.iterlists - setattr(MyDict, six._iterlists, f) + setattr(MyDict, stock_method_name('lists'), f) + d = MyDict(zip(range(10), reversed(range(10)))) for name in "keys", "values", "items", "lists": meth = getattr(six, "iter" + name) @@ -373,8 +382,8 @@ def with_kw(*args, **kw): record.append(kw["kw"]) return old(*args) - old = getattr(MyDict, getattr(six, "_iter" + name)) - monkeypatch.setattr(MyDict, getattr(six, "_iter" + name), with_kw) + old = getattr(MyDict, stock_method_name(name)) + monkeypatch.setattr(MyDict, stock_method_name(name), with_kw) meth(d, kw=42) assert record == [42] monkeypatch.undo() @@ -551,6 +560,14 @@ assert tp2 is Exception assert value2 is e assert get_next(tb3) is tb2 + try: + six.reraise(tp, None, tb) + except Exception: + tp2, value2, tb2 = sys.exc_info() + assert tp2 is Exception + assert value2 is not val + assert isinstance(value2, Exception) + assert tb is get_next(tb2) def test_print_(): @@ -625,6 +642,25 @@ assert type(X) is Meta assert issubclass(X, Base) assert issubclass(X, Base2) + assert X.__mro__ == (X, Base, Base2, object) + + +def test_wraps(): + def f(g): + @six.wraps(g) + def w(): + return 42 + return w + def k(): + pass + original_k = k + k = f(f(k)) + assert hasattr(k, '__wrapped__') + k = k.__wrapped__ + assert hasattr(k, '__wrapped__') + k = k.__wrapped__ + assert k is original_k + assert not hasattr(k, '__wrapped__') def test_add_metaclass(): @@ -694,3 +730,7 @@ py.test.raises(AttributeError, setattr, instance, "a", "baz") py.test.raises(AttributeError, setattr, instance, "b", "baz") + class MySlotsWeakref(object): + __slots__ = "__weakref__", + MySlotsWeakref = six.add_metaclass(Meta)(MySlotsWeakref) + assert type(MySlotsWeakref) is Meta -- To unsubscribe, e-mail: opensuse-commit+unsubscr...@opensuse.org For additional commands, e-mail: opensuse-commit+h...@opensuse.org