Hello community,

here is the log from the commit of package python-six for openSUSE:Factory 
checked in at 2020-01-23 16:10:54
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-six (Old)
 and      /work/SRC/openSUSE:Factory/.python-six.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-six"

Thu Jan 23 16:10:54 2020 rev:35 rq:766053 version:1.14.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-six/python-six.changes    2020-01-16 
18:13:19.768706304 +0100
+++ /work/SRC/openSUSE:Factory/.python-six.new.26092/python-six.changes 
2020-01-23 16:12:40.227698290 +0100
@@ -1,0 +2,11 @@
+Tue Jan 21 11:17:01 UTC 2020 - Ondřej Súkup <[email protected]>
+
+- update to 1.14.0
+ * Add `six.assertNotRegex`
+ * `six.moves._dummy_thread` now points to the `_thread` module on
+    Python 3.9+. Python 3.7 and later requires threading and deprecated the
+    `_dummy_thread` module
+ * Remove support for Python 2.6 and Python 3.2
+ * `six.wraps` now ignores missing attributes
+
+-------------------------------------------------------------------

Old:
----
  six-1.13.0.tar.gz

New:
----
  six-1.14.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-six.spec ++++++
--- /var/tmp/diff_new_pack.IvZX4g/_old  2020-01-23 16:12:40.799698629 +0100
+++ /var/tmp/diff_new_pack.IvZX4g/_new  2020-01-23 16:12:40.803698631 +0100
@@ -27,7 +27,7 @@
 %bcond_with test
 %define psuffix %{nil}
 %endif
-Version:        1.13.0
+Version:        1.14.0
 Release:        0
 Summary:        Python 2 and 3 compatibility utilities
 License:        MIT

++++++ six-1.13.0.tar.gz -> six-1.14.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/six-1.13.0/CHANGES new/six-1.14.0/CHANGES
--- old/six-1.13.0/CHANGES      2019-11-05 18:28:14.000000000 +0100
+++ new/six-1.14.0/CHANGES      2020-01-15 19:10:01.000000000 +0100
@@ -3,6 +3,20 @@
 
 This file lists the changes in each six version.
 
+1.14.0
+------
+
+- Issue #288, pull request #289: Add `six.assertNotRegex`.
+
+- Issue #317: `six.moves._dummy_thread` now points to the `_thread` module on
+  Python 3.9+. Python 3.7 and later requires threading and deprecated the
+  `_dummy_thread` module.
+
+- Issue #308, pull request #314: Remove support for Python 2.6 and Python 3.2.
+
+- Issue #250, issue #165, pull request #251: `six.wraps` now ignores missing
+  attributes. This follows the Python 3.2+ standard library behavior.
+
 1.13.0
 ------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/six-1.13.0/LICENSE new/six-1.14.0/LICENSE
--- old/six-1.13.0/LICENSE      2019-11-05 18:28:14.000000000 +0100
+++ new/six-1.14.0/LICENSE      2020-01-15 19:10:01.000000000 +0100
@@ -1,4 +1,4 @@
-Copyright (c) 2010-2019 Benjamin Peterson
+Copyright (c) 2010-2020 Benjamin Peterson
 
 Permission is hereby granted, free of charge, to any person obtaining a copy of
 this software and associated documentation files (the "Software"), to deal in
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/six-1.13.0/PKG-INFO new/six-1.14.0/PKG-INFO
--- old/six-1.13.0/PKG-INFO     2019-11-05 18:28:33.568000000 +0100
+++ new/six-1.14.0/PKG-INFO     2020-01-15 19:10:19.026476400 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: six
-Version: 1.13.0
+Version: 1.14.0
 Summary: Python 2 and 3 compatibility utilities
 Home-page: https://github.com/benjaminp/six
 Author: Benjamin Peterson
@@ -27,7 +27,7 @@
         writing Python code that is compatible on both Python versions.  See 
the
         documentation for more information on what is provided.
         
-        Six supports every Python version since 2.6.  It is contained in only 
one Python
+        Six supports Python 2.7 and 3.3+.  It is contained in only one Python
         file, so it can be easily copied into your project. (The copyright and 
license
         notice must be retained.)
         
@@ -36,9 +36,6 @@
         Bugs can be reported to https://github.com/benjaminp/six.  The code 
can also
         be found there.
         
-        For questions about six or porting in general, email the 
python-porting mailing
-        list: https://mail.python.org/mailman/listinfo/python-porting
-        
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Programming Language :: Python :: 2
@@ -47,4 +44,4 @@
 Classifier: License :: OSI Approved :: MIT License
 Classifier: Topic :: Software Development :: Libraries
 Classifier: Topic :: Utilities
-Requires-Python: >=2.6, !=3.0.*, !=3.1.*
+Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/six-1.13.0/README.rst new/six-1.14.0/README.rst
--- old/six-1.13.0/README.rst   2019-11-05 18:28:14.000000000 +0100
+++ new/six-1.14.0/README.rst   2020-01-15 19:10:01.000000000 +0100
@@ -19,7 +19,7 @@
 writing Python code that is compatible on both Python versions.  See the
 documentation for more information on what is provided.
 
-Six supports every Python version since 2.6.  It is contained in only one 
Python
+Six supports Python 2.7 and 3.3+.  It is contained in only one Python
 file, so it can be easily copied into your project. (The copyright and license
 notice must be retained.)
 
@@ -27,6 +27,3 @@
 
 Bugs can be reported to https://github.com/benjaminp/six.  The code can also
 be found there.
-
-For questions about six or porting in general, email the python-porting mailing
-list: https://mail.python.org/mailman/listinfo/python-porting
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/six-1.13.0/documentation/conf.py 
new/six-1.14.0/documentation/conf.py
--- old/six-1.13.0/documentation/conf.py        2019-11-05 18:28:14.000000000 
+0100
+++ new/six-1.14.0/documentation/conf.py        2020-01-15 19:10:01.000000000 
+0100
@@ -33,7 +33,7 @@
 
 # General information about the project.
 project = u"six"
-copyright = u"2010-2019, Benjamin Peterson"
+copyright = u"2010-2020, Benjamin Peterson"
 
 sys.path.append(os.path.abspath(os.path.join(".", "..")))
 from six import __version__ as six_version
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/six-1.13.0/documentation/index.rst 
new/six-1.14.0/documentation/index.rst
--- old/six-1.13.0/documentation/index.rst      2019-11-05 18:28:14.000000000 
+0100
+++ new/six-1.14.0/documentation/index.rst      2020-01-15 19:10:01.000000000 
+0100
@@ -257,9 +257,10 @@
 
 .. decorator:: 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.
+   This is Python 3.2's :func:`py3:functools.wraps` decorator.  It sets the
+   ``__wrapped__`` attribute on what it decorates.  It doesn't raise an error 
if
+   any of the attributes mentioned in ``assigned`` and ``updated`` are missing
+   on ``wrapped`` object.
 
 
 Syntax compatibility
@@ -509,6 +510,11 @@
    Alias for :meth:`~py3:unittest.TestCase.assertRegex` on Python 3 and
    :meth:`~py2:unittest.TestCase.assertRegexpMatches` on Python 2.
 
+.. function:: assertNotRegex()
+
+   Alias for :meth:`~py3:unittest.TestCase.assertNotRegex` on Python 3 and
+   :meth:`~py2:unittest.TestCase.assertNotRegexpMatches` on Python 2.
+
 
 Renamed modules and attributes compatibility
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
@@ -590,7 +596,8 @@
 
+------------------------------+-------------------------------------+---------------------------------------+
 | ``dbm_ndbm``                 | :mod:`py2:dbm`                      | 
:mod:`py3:dbm.ndbm`                   |
 
+------------------------------+-------------------------------------+---------------------------------------+
-| ``_dummy_thread``            | :mod:`py2:dummy_thread`             | 
:mod:`py3:_dummy_thread`              |
+| ``_dummy_thread``            | :mod:`py2:dummy_thread`             | 
:mod:`py3:_dummy_thread` (< 3.9)      |
+|                              |                                     | 
:mod:`py3:_thread` (3.9+)             |
 
+------------------------------+-------------------------------------+---------------------------------------+
 | ``email_mime_base``          | :mod:`py2:email.MIMEBase`           | 
:mod:`py3:email.mime.base`            |
 
+------------------------------+-------------------------------------+---------------------------------------+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/six-1.13.0/setup.py new/six-1.14.0/setup.py
--- old/six-1.13.0/setup.py     2019-11-05 18:28:14.000000000 +0100
+++ new/six-1.14.0/setup.py     2020-01-15 19:10:01.000000000 +0100
@@ -1,4 +1,4 @@
-# Copyright (c) 2010-2019 Benjamin Peterson
+# Copyright (c) 2010-2020 Benjamin Peterson
 #
 # Permission is hereby granted, free of charge, to any person obtaining a copy
 # of this software and associated documentation files (the "Software"), to deal
@@ -54,5 +54,5 @@
       long_description=six_long_description,
       license="MIT",
       classifiers=six_classifiers,
-      python_requires=">=2.6, !=3.0.*, !=3.1.*",
+      python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*",
       )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/six-1.13.0/six.egg-info/PKG-INFO 
new/six-1.14.0/six.egg-info/PKG-INFO
--- old/six-1.13.0/six.egg-info/PKG-INFO        2019-11-05 18:28:33.000000000 
+0100
+++ new/six-1.14.0/six.egg-info/PKG-INFO        2020-01-15 19:10:18.000000000 
+0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: six
-Version: 1.13.0
+Version: 1.14.0
 Summary: Python 2 and 3 compatibility utilities
 Home-page: https://github.com/benjaminp/six
 Author: Benjamin Peterson
@@ -27,7 +27,7 @@
         writing Python code that is compatible on both Python versions.  See 
the
         documentation for more information on what is provided.
         
-        Six supports every Python version since 2.6.  It is contained in only 
one Python
+        Six supports Python 2.7 and 3.3+.  It is contained in only one Python
         file, so it can be easily copied into your project. (The copyright and 
license
         notice must be retained.)
         
@@ -36,9 +36,6 @@
         Bugs can be reported to https://github.com/benjaminp/six.  The code 
can also
         be found there.
         
-        For questions about six or porting in general, email the 
python-porting mailing
-        list: https://mail.python.org/mailman/listinfo/python-porting
-        
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Programming Language :: Python :: 2
@@ -47,4 +44,4 @@
 Classifier: License :: OSI Approved :: MIT License
 Classifier: Topic :: Software Development :: Libraries
 Classifier: Topic :: Utilities
-Requires-Python: >=2.6, !=3.0.*, !=3.1.*
+Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/six-1.13.0/six.py new/six-1.14.0/six.py
--- old/six-1.13.0/six.py       2019-11-05 18:28:14.000000000 +0100
+++ new/six-1.14.0/six.py       2020-01-15 19:10:01.000000000 +0100
@@ -1,4 +1,4 @@
-# Copyright (c) 2010-2019 Benjamin Peterson
+# Copyright (c) 2010-2020 Benjamin Peterson
 #
 # Permission is hereby granted, free of charge, to any person obtaining a copy
 # of this software and associated documentation files (the "Software"), to deal
@@ -29,7 +29,7 @@
 import types
 
 __author__ = "Benjamin Peterson <[email protected]>"
-__version__ = "1.13.0"
+__version__ = "1.14.0"
 
 
 # Useful for very coarse version differentiation.
@@ -259,7 +259,7 @@
     MovedModule("copyreg", "copy_reg"),
     MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
     MovedModule("dbm_ndbm", "dbm", "dbm.ndbm"),
-    MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"),
+    MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread" if 
sys.version_info < (3, 9) else "_thread"),
     MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
     MovedModule("http_cookies", "Cookie", "http.cookies"),
     MovedModule("html_entities", "htmlentitydefs", "html.entities"),
@@ -644,9 +644,11 @@
     if sys.version_info[1] <= 1:
         _assertRaisesRegex = "assertRaisesRegexp"
         _assertRegex = "assertRegexpMatches"
+        _assertNotRegex = "assertNotRegexpMatches"
     else:
         _assertRaisesRegex = "assertRaisesRegex"
         _assertRegex = "assertRegex"
+        _assertNotRegex = "assertNotRegex"
 else:
     def b(s):
         return s
@@ -668,6 +670,7 @@
     _assertCountEqual = "assertItemsEqual"
     _assertRaisesRegex = "assertRaisesRegexp"
     _assertRegex = "assertRegexpMatches"
+    _assertNotRegex = "assertNotRegexpMatches"
 _add_doc(b, """Byte literal""")
 _add_doc(u, """Text literal""")
 
@@ -684,6 +687,10 @@
     return getattr(self, _assertRegex)(*args, **kwargs)
 
 
+def assertNotRegex(self, *args, **kwargs):
+    return getattr(self, _assertNotRegex)(*args, **kwargs)
+
+
 if PY3:
     exec_ = getattr(moves.builtins, "exec")
 
@@ -719,16 +726,7 @@
 """)
 
 
-if sys.version_info[:2] == (3, 2):
-    exec_("""def raise_from(value, from_value):
-    try:
-        if from_value is None:
-            raise value
-        raise value from from_value
-    finally:
-        value = None
-""")
-elif sys.version_info[:2] > (3, 2):
+if sys.version_info[:2] > (3,):
     exec_("""def raise_from(value, from_value):
     try:
         raise value from from_value
@@ -808,13 +806,33 @@
 _add_doc(reraise, """Reraise an exception.""")
 
 if sys.version_info[0:2] < (3, 4):
+    # This does exactly the same what the :func:`py3:functools.update_wrapper`
+    # function does on Python versions after 3.2. It sets the ``__wrapped__``
+    # attribute on ``wrapper`` object and it doesn't raise an error if any of
+    # the attributes mentioned in ``assigned`` and ``updated`` are missing on
+    # ``wrapped`` object.
+    def _update_wrapper(wrapper, wrapped,
+                        assigned=functools.WRAPPER_ASSIGNMENTS,
+                        updated=functools.WRAPPER_UPDATES):
+        for attr in assigned:
+            try:
+                value = getattr(wrapped, attr)
+            except AttributeError:
+                continue
+            else:
+                setattr(wrapper, attr, value)
+        for attr in updated:
+            getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
+        wrapper.__wrapped__ = wrapped
+        return wrapper
+    _update_wrapper.__doc__ = functools.update_wrapper.__doc__
+
     def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
               updated=functools.WRAPPER_UPDATES):
-        def wrapper(f):
-            f = functools.wraps(wrapped, assigned, updated)(f)
-            f.__wrapped__ = wrapped
-            return f
-        return wrapper
+        return functools.partial(_update_wrapper, wrapped=wrapped,
+                                 assigned=assigned, updated=updated)
+    wraps.__doc__ = functools.wraps.__doc__
+
 else:
     wraps = functools.wraps
 
@@ -919,10 +937,9 @@
         raise TypeError("not expecting type '%s'" % type(s))
 
 
-
 def python_2_unicode_compatible(klass):
     """
-    A decorator that defines __unicode__ and __str__ methods under Python 2.
+    A class decorator that defines __unicode__ and __str__ methods under 
Python 2.
     Under Python 3 it does nothing.
 
     To support Python 2 and 3 with a single code base, define a __str__ method
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/six-1.13.0/test_six.py new/six-1.14.0/test_six.py
--- old/six-1.13.0/test_six.py  2019-11-05 18:28:14.000000000 +0100
+++ new/six-1.14.0/test_six.py  2020-01-15 19:10:01.000000000 +0100
@@ -1,4 +1,4 @@
-# Copyright (c) 2010-2019 Benjamin Peterson
+# Copyright (c) 2010-2020 Benjamin Peterson
 #
 # Permission is hereby granted, free of charge, to any person obtaining a copy
 # of this software and associated documentation files (the "Software"), to deal
@@ -121,34 +121,23 @@
         item = getattr(six.moves, item_name)
         if isinstance(item, types.ModuleType):
             __import__("six.moves." + item_name)
-    except AttributeError:
-        if item_name == "zip_longest" and sys.version_info < (2, 6):
-            pytest.skip("zip_longest only available on 2.6+")
     except ImportError:
         if item_name == "winreg" and not sys.platform.startswith("win"):
             pytest.skip("Windows only module")
         if item_name.startswith("tkinter"):
             if not have_tkinter:
                 pytest.skip("requires tkinter")
-            if item_name == "tkinter_ttk" and sys.version_info[:2] <= (2, 6):
-                pytest.skip("ttk only available on 2.7+")
         if item_name.startswith("dbm_gnu") and not have_gdbm:
             pytest.skip("requires gdbm")
         raise
-    if sys.version_info[:2] >= (2, 6):
-        assert item_name in dir(six.moves)
+    assert item_name in dir(six.moves)
 
 
 @pytest.mark.parametrize("item_name",
                           [item.name for item in 
six._urllib_parse_moved_attributes])
 def test_move_items_urllib_parse(item_name):
     """Ensure that everything loads correctly."""
-    if item_name == "ParseResult" and sys.version_info < (2, 5):
-        pytest.skip("ParseResult is only found on 2.5+")
-    if item_name in ("parse_qs", "parse_qsl") and sys.version_info < (2, 6):
-        pytest.skip("parse_qs[l] is new in 2.6")
-    if sys.version_info[:2] >= (2, 6):
-        assert item_name in dir(six.moves.urllib.parse)
+    assert item_name in dir(six.moves.urllib.parse)
     getattr(six.moves.urllib.parse, item_name)
 
 
@@ -156,8 +145,7 @@
                           [item.name for item in 
six._urllib_error_moved_attributes])
 def test_move_items_urllib_error(item_name):
     """Ensure that everything loads correctly."""
-    if sys.version_info[:2] >= (2, 6):
-        assert item_name in dir(six.moves.urllib.error)
+    assert item_name in dir(six.moves.urllib.error)
     getattr(six.moves.urllib.error, item_name)
 
 
@@ -165,8 +153,7 @@
                           [item.name for item in 
six._urllib_request_moved_attributes])
 def test_move_items_urllib_request(item_name):
     """Ensure that everything loads correctly."""
-    if sys.version_info[:2] >= (2, 6):
-        assert item_name in dir(six.moves.urllib.request)
+    assert item_name in dir(six.moves.urllib.request)
     getattr(six.moves.urllib.request, item_name)
 
 
@@ -174,8 +161,7 @@
                           [item.name for item in 
six._urllib_response_moved_attributes])
 def test_move_items_urllib_response(item_name):
     """Ensure that everything loads correctly."""
-    if sys.version_info[:2] >= (2, 6):
-        assert item_name in dir(six.moves.urllib.response)
+    assert item_name in dir(six.moves.urllib.response)
     getattr(six.moves.urllib.response, item_name)
 
 
@@ -183,8 +169,7 @@
                           [item.name for item in 
six._urllib_robotparser_moved_attributes])
 def test_move_items_urllib_robotparser(item_name):
     """Ensure that everything loads correctly."""
-    if sys.version_info[:2] >= (2, 6):
-        assert item_name in dir(six.moves.urllib.robotparser)
+    assert item_name in dir(six.moves.urllib.robotparser)
     getattr(six.moves.urllib.robotparser, item_name)
 
 
@@ -244,7 +229,6 @@
     assert six.advance_iterator(zip(range(2), range(2))) == (0, 0)
 
 
[email protected]("sys.version_info < (2, 6)")
 def test_zip_longest():
     from six.moves import zip_longest
     it = zip_longest(range(2), range(1))
@@ -417,17 +401,7 @@
         monkeypatch.undo()
 
 
[email protected]("sys.version_info[:2] < (2, 7)",
-                reason="view methods on dictionaries only available on 2.7+")
 def test_dictionary_views():
-    def stock_method_name(viewwhat):
-        """Given a method suffix like "keys" 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 viewwhat
-        return 'view' + viewwhat
-
     d = dict(zip(range(10), (range(11, 20))))
     for name in "keys", "values", "items":
         meth = getattr(six, "view" + name)
@@ -644,7 +618,6 @@
         # We should have done a raise f from None equivalent.
         assert val.__cause__ is None
         assert val.__context__ is ctx
-    if sys.version_info[:2] >= (3, 3):
         # And that should suppress the context on the exception.
         assert val.__suppress_context__
     # For all versions the outer exception should have raised successfully.
@@ -690,24 +663,6 @@
     assert out.flushed
 
 
[email protected]("sys.version_info[:2] >= (2, 6)")
-def test_print_encoding(monkeypatch):
-    # Fool the type checking in print_.
-    monkeypatch.setattr(six, "file", six.BytesIO, raising=False)
-    out = six.BytesIO()
-    out.encoding = "utf-8"
-    out.errors = None
-    six.print_(six.u("\u053c"), end="", file=out)
-    assert out.getvalue() == six.b("\xd4\xbc")
-    out = six.BytesIO()
-    out.encoding = "ascii"
-    out.errors = "strict"
-    pytest.raises(UnicodeEncodeError, six.print_, six.u("\u053c"), file=out)
-    out.errors = "backslashreplace"
-    six.print_(six.u("\u053c"), end="", file=out)
-    assert out.getvalue() == six.b("\\u053c")
-
-
 def test_print_exceptions():
     pytest.raises(TypeError, six.print_, x=3)
     pytest.raises(TypeError, six.print_, end=3)
@@ -745,7 +700,6 @@
     assert Y.__mro__ == (Y, X, object)
 
 
[email protected]("sys.version_info[:2] < (2, 7)")
 def test_with_metaclass_typing():
     try:
         import typing
@@ -840,14 +794,33 @@
     def f(g, assign, update):
         def w():
             return 42
-        w.glue = {"foo" : "bar"}
+        w.glue = {"foo": "bar"}
+        w.xyzzy = {"qux": "quux"}
         return six.wraps(g, assign, update)(w)
-    k.glue = {"melon" : "egg"}
+    k.glue = {"melon": "egg"}
     k.turnip = 43
-    k = f(k, ["turnip"], ["glue"])
+    k = f(k, ["turnip", "baz"], ["glue", "xyzzy"])
     assert k.__name__ == "w"
     assert k.turnip == 43
-    assert k.glue == {"melon" : "egg", "foo" : "bar"}
+    assert not hasattr(k, "baz")
+    assert k.glue == {"melon": "egg", "foo": "bar"}
+    assert k.xyzzy == {"qux": "quux"}
+
+
+def test_wraps_raises_on_missing_updated_field_on_wrapper():
+    """Ensure six.wraps doesn't ignore missing attrs wrapper.
+
+    Because that's what happens in Py3's functools.update_wrapper.
+    """
+    def wrapped():
+        pass
+
+    def wrapper():
+        pass
+
+    with pytest.raises(AttributeError, match='has no attribute.*xyzzy'):
+        six.wraps(wrapped, [], ['xyzzy'])(wrapper)
+
 
 
 def test_add_metaclass():
@@ -943,7 +916,6 @@
     assert A.B.__qualname__ == expected
 
 
[email protected]("sys.version_info[:2] < (2, 7) or sys.version_info[:2] in 
((3, 0), (3, 1))")
 def test_assertCountEqual():
     class TestAssertCountEqual(unittest.TestCase):
         def test(self):
@@ -955,7 +927,6 @@
     TestAssertCountEqual('test').test()
 
 
[email protected]("sys.version_info[:2] < (2, 7)")
 def test_assertRegex():
     class TestAssertRegex(unittest.TestCase):
         def test(self):
@@ -967,7 +938,17 @@
     TestAssertRegex('test').test()
 
 
[email protected]("sys.version_info[:2] < (2, 7)")
+def test_assertNotRegex():
+    class TestAssertNotRegex(unittest.TestCase):
+        def test(self):
+            with self.assertRaises(AssertionError):
+                six.assertNotRegex(self, 'test', r'^t')
+
+            six.assertNotRegex(self, 'test', r'^a')
+
+    TestAssertNotRegex('test').test()
+
+
 def test_assertRaisesRegex():
     class TestAssertRaisesRegex(unittest.TestCase):
         def test(self):


Reply via email to