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):
