Hello community,
here is the log from the commit of package python-contextlib2 for openSUSE:Factory checked in at 2019-09-30 15:55:44
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-contextlib2 (Old)
and /work/SRC/openSUSE:Factory/.python-contextlib2.new.2352 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-contextlib2"
Mon Sep 30 15:55:44 2019 rev:4 rq:732920 version:0.6.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-contextlib2/python-contextlib2.changes 2018-05-23 16:09:36.960852240 +0200
+++ /work/SRC/openSUSE:Factory/.python-contextlib2.new.2352/python-contextlib2.changes 2019-09-30 15:55:53.429776842 +0200
@@ -1,0 +2,8 @@
+Tue Sep 24 11:44:26 UTC 2019 - Tomáš Chvátal
+
+- Update to 0.6.0:
+ * Various minor fixes and metadata updates
+ * Add nullcontext
+ * Add AbstractContextManager
+
+-------------------------------------------------------------------
Old:
----
contextlib2-0.5.5.tar.gz
New:
----
contextlib2-0.6.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-contextlib2.spec ++++++
--- /var/tmp/diff_new_pack.KUtQ0N/_old 2019-09-30 15:55:54.209774767 +0200
+++ /var/tmp/diff_new_pack.KUtQ0N/_new 2019-09-30 15:55:54.213774757 +0200
@@ -1,7 +1,7 @@
#
# spec file for package python-contextlib2
#
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
# Copyright (c) 2014 LISA GmbH, Bingen, Germany.
#
# All modifications and additions to the file contributed by third parties
@@ -13,13 +13,13 @@
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-contextlib2
-Version: 0.5.5
+Version: 0.6.0
Release: 0
Summary: Backports and enhancements for the contextlib module
License: Python-2.0
++++++ contextlib2-0.5.5.tar.gz -> contextlib2-0.6.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/contextlib2-0.5.5/NEWS.rst new/contextlib2-0.6.0/NEWS.rst
--- old/contextlib2-0.5.5/NEWS.rst 2017-04-25 05:51:01.000000000 +0200
+++ new/contextlib2-0.6.0/NEWS.rst 2019-09-21 15:16:23.000000000 +0200
@@ -1,6 +1,13 @@
Release History
---------------
+0.6.0 (Unreleased)
+^^^^^^^^^^^^^^^^^^
+
+* Issue `#16 https://github.com/jazzband/contextlib2/issues/16`__:
+ Backport `AbstractContextManager` from Python 3.6 and `nullcontext`
+ from Python 3.7 (patch by John Vandenberg)
+
0.5.5 (2017-04-25)
^^^^^^^^^^^^^^^^^^
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/contextlib2-0.5.5/PKG-INFO new/contextlib2-0.6.0/PKG-INFO
--- old/contextlib2-0.5.5/PKG-INFO 2017-04-25 05:51:27.000000000 +0200
+++ new/contextlib2-0.6.0/PKG-INFO 2019-09-21 15:16:50.000000000 +0200
@@ -1,6 +1,6 @@
-Metadata-Version: 1.1
+Metadata-Version: 1.2
Name: contextlib2
-Version: 0.5.5
+Version: 0.6.0
Summary: Backports and enhancements for the contextlib module
Home-page: http://contextlib2.readthedocs.org
Author: Nick Coghlan
@@ -47,29 +47,22 @@
Versions currently tested in both tox and Travis CI are:
- * CPython 2.6
* CPython 2.7
* CPython 3.4
* CPython 3.5
* CPython 3.6
- * CPython 3.7 (CPython development branch)
+ * CPython 3.7
* PyPy
-
- Versions currently tested only in tox are:
-
* PyPy3
- This is due to an exception chaining compatibility bug that was fixed in
- the PyPy3 5.5 alpha release, while the version on Travis CI (as of April 2017)
- is still the older PyPy3 2.4.0 release.
-
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: License :: OSI Approved :: Python Software Foundation License
Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/contextlib2-0.5.5/README.rst new/contextlib2-0.6.0/README.rst
--- old/contextlib2-0.5.5/README.rst 2017-04-25 05:51:01.000000000 +0200
+++ new/contextlib2-0.6.0/README.rst 2019-09-21 15:16:23.000000000 +0200
@@ -39,18 +39,10 @@
Versions currently tested in both tox and Travis CI are:
-* CPython 2.6
* CPython 2.7
* CPython 3.4
* CPython 3.5
* CPython 3.6
-* CPython 3.7 (CPython development branch)
+* CPython 3.7
* PyPy
-
-Versions currently tested only in tox are:
-
* PyPy3
-
-This is due to an exception chaining compatibility bug that was fixed in
-the PyPy3 5.5 alpha release, while the version on Travis CI (as of April 2017)
-is still the older PyPy3 2.4.0 release.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/contextlib2-0.5.5/VERSION.txt new/contextlib2-0.6.0/VERSION.txt
--- old/contextlib2-0.5.5/VERSION.txt 2017-04-25 05:51:01.000000000 +0200
+++ new/contextlib2-0.6.0/VERSION.txt 2019-09-21 15:16:23.000000000 +0200
@@ -1 +1 @@
-0.5.5
+0.6.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/contextlib2-0.5.5/contextlib2.egg-info/PKG-INFO new/contextlib2-0.6.0/contextlib2.egg-info/PKG-INFO
--- old/contextlib2-0.5.5/contextlib2.egg-info/PKG-INFO 2017-04-25 05:51:27.000000000 +0200
+++ new/contextlib2-0.6.0/contextlib2.egg-info/PKG-INFO 2019-09-21 15:16:50.000000000 +0200
@@ -1,6 +1,6 @@
-Metadata-Version: 1.1
+Metadata-Version: 1.2
Name: contextlib2
-Version: 0.5.5
+Version: 0.6.0
Summary: Backports and enhancements for the contextlib module
Home-page: http://contextlib2.readthedocs.org
Author: Nick Coghlan
@@ -47,29 +47,22 @@
Versions currently tested in both tox and Travis CI are:
- * CPython 2.6
* CPython 2.7
* CPython 3.4
* CPython 3.5
* CPython 3.6
- * CPython 3.7 (CPython development branch)
+ * CPython 3.7
* PyPy
-
- Versions currently tested only in tox are:
-
* PyPy3
- This is due to an exception chaining compatibility bug that was fixed in
- the PyPy3 5.5 alpha release, while the version on Travis CI (as of April 2017)
- is still the older PyPy3 2.4.0 release.
-
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: License :: OSI Approved :: Python Software Foundation License
Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/contextlib2-0.5.5/contextlib2.py new/contextlib2-0.6.0/contextlib2.py
--- old/contextlib2-0.5.5/contextlib2.py 2017-04-25 05:51:01.000000000 +0200
+++ new/contextlib2-0.6.0/contextlib2.py 2019-09-21 15:16:23.000000000 +0200
@@ -1,18 +1,77 @@
"""contextlib2 - backports and enhancements to the contextlib module"""
+import abc
import sys
import warnings
from collections import deque
from functools import wraps
-__all__ = ["contextmanager", "closing", "ContextDecorator", "ExitStack",
+__all__ = ["contextmanager", "closing", "nullcontext",
+ "AbstractContextManager",
+ "ContextDecorator", "ExitStack",
"redirect_stdout", "redirect_stderr", "suppress"]
# Backwards compatibility
__all__ += ["ContextStack"]
+
+# Backport abc.ABC
+if sys.version_info[:2] >= (3, 4):
+ _abc_ABC = abc.ABC
+else:
+ _abc_ABC = abc.ABCMeta('ABC', (object,), {'__slots__': ()})
+
+
+# Backport classic class MRO
+def _classic_mro(C, result):
+ if C in result:
+ return
+ result.append(C)
+ for B in C.__bases__:
+ _classic_mro(B, result)
+ return result
+
+
+# Backport _collections_abc._check_methods
+def _check_methods(C, *methods):
+ try:
+ mro = C.__mro__
+ except AttributeError:
+ mro = tuple(_classic_mro(C, []))
+
+ for method in methods:
+ for B in mro:
+ if method in B.__dict__:
+ if B.__dict__[method] is None:
+ return NotImplemented
+ break
+ else:
+ return NotImplemented
+ return True
+
+
+class AbstractContextManager(_abc_ABC):
+ """An abstract base class for context managers."""
+
+ def __enter__(self):
+ """Return `self` upon entering the runtime context."""
+ return self
+
+ @abc.abstractmethod
+ def __exit__(self, exc_type, exc_value, traceback):
+ """Raise any exception triggered within the runtime context."""
+ return None
+
+ @classmethod
+ def __subclasshook__(cls, C):
+ """Check whether subclass is considered a subclass of this ABC."""
+ if cls is AbstractContextManager:
+ return _check_methods(C, "__enter__", "__exit__")
+ return NotImplemented
+
+
class ContextDecorator(object):
- "A base class or mixin that enables context managers to work as decorators."
+ """A base class or mixin that enables context managers to work as decorators."""
def refresh_cm(self):
"""Returns the context manager used to actually wrap the call to the
@@ -176,8 +235,10 @@
"""
def __init__(self, thing):
self.thing = thing
+
def __enter__(self):
return self.thing
+
def __exit__(self, *exc_info):
self.thing.close()
@@ -289,7 +350,7 @@
# but use exec to avoid SyntaxError in Python 3
def _reraise_with_existing_context(exc_details):
exc_type, exc_value, exc_tb = exc_details
- exec ("raise exc_type, exc_value, exc_tb")
+ exec("raise exc_type, exc_value, exc_tb")
# Handle old-style classes if they exist
try:
@@ -302,8 +363,9 @@
def _get_type(obj):
obj_type = type(obj)
if obj_type is InstanceType:
- return obj.__class__ # Old-style class
- return obj_type # New-style class
+ return obj.__class__ # Old-style class
+ return obj_type # New-style class
+
# Inspired by discussions on http://bugs.python.org/issue13585
class ExitStack(object):
@@ -417,6 +479,7 @@
_reraise_with_existing_context(exc_details)
return received_exc and suppressed_exc
+
# Preserve backwards compatibility
class ContextStack(ExitStack):
"""Backwards compatibility alias for ExitStack"""
@@ -434,3 +497,22 @@
def preserve(self):
return self.pop_all()
+
+
+class nullcontext(AbstractContextManager):
+ """Context manager that does no additional processing.
+ Used as a stand-in for a normal context manager, when a particular
+ block of code is only sometimes used with a normal context manager:
+ cm = optional_cm if condition else nullcontext()
+ with cm:
+ # Perform operation, using optional_cm if condition is True
+ """
+
+ def __init__(self, enter_result=None):
+ self.enter_result = enter_result
+
+ def __enter__(self):
+ return self.enter_result
+
+ def __exit__(self, *excinfo):
+ pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/contextlib2-0.5.5/docs/index.rst new/contextlib2-0.6.0/docs/index.rst
--- old/contextlib2-0.5.5/docs/index.rst 2017-04-25 05:51:01.000000000 +0200
+++ new/contextlib2-0.6.0/docs/index.rst 2019-09-21 15:16:23.000000000 +0200
@@ -21,11 +21,13 @@
Additions Relative to the Standard Library
------------------------------------------
-This module is primarily a backport of the Python 3.5 version of
-:mod:`contextlib` to earlier releases. However, it is also a proving ground
-for new features not yet part of the standard library.
+This module is primarily a backport of the Python 3.6 version of
+:mod:`contextlib` to earlier releases. It includes `nullcontext` from
+Python 3.7, however it does not yet provide async context management
+support from Python 3.7.
-There are currently no such features in the module.
+However, it is also a proving ground for new features not yet part of the
+standard library. There are currently no such features in the module.
Refer to the :mod:`contextlib` documentation for details of which
versions of Python 3 introduce the various APIs provided in this module.
@@ -36,6 +38,19 @@
Functions and classes provided:
+
+.. class:: AbstractContextManager
+
+ An :term:`abstract base class` for classes that implement
+ :meth:`object.__enter__` and :meth:`object.__exit__`. A default
+ implementation for :meth:`object.__enter__` is provided which returns
+ ``self`` while :meth:`object.__exit__` is an abstract method which by default
+ returns ``None``.
+
+ .. versionadded:: 0.6.0
+ Part of the standard library in Python 3.6 and later
+
+
.. decorator:: contextmanager
This function is a :term:`decorator` that can be used to define a factory
@@ -110,6 +125,39 @@
``page.close()`` will be called when the :keyword:`with` block is exited.
+.. function:: nullcontext(enter_result=None)
+
+ Return a context manager that returns *enter_result* from ``__enter__``, but
+ otherwise does nothing. It is intended to be used as a stand-in for an
+ optional context manager, for example::
+
+ def myfunction(arg, ignore_exceptions=False):
+ if ignore_exceptions:
+ # Use suppress to ignore all exceptions.
+ cm = contextlib.suppress(Exception)
+ else:
+ # Do not ignore any exceptions, cm has no effect.
+ cm = contextlib.nullcontext()
+ with cm:
+ # Do something
+
+ An example using *enter_result*::
+
+ def process_file(file_or_path):
+ if isinstance(file_or_path, str):
+ # If string, open file
+ cm = open(file_or_path)
+ else:
+ # Caller is responsible for closing file
+ cm = nullcontext(file_or_path)
+
+ with cm as file:
+ # Perform processing on the file
+
+ .. versionadded:: 0.6.0
+ Part of the standard library in Python 3.7 and later
+
+
.. function:: suppress(*exceptions)
Return a context manager that suppresses any of the specified exceptions
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/contextlib2-0.5.5/setup.py new/contextlib2-0.6.0/setup.py
--- old/contextlib2-0.5.5/setup.py 2017-04-25 05:51:01.000000000 +0200
+++ new/contextlib2-0.6.0/setup.py 2019-09-21 15:16:23.000000000 +0200
@@ -7,6 +7,7 @@
setup(
name='contextlib2',
version=open('VERSION.txt').read().strip(),
+ python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*',
py_modules=['contextlib2'],
license='PSF License',
description='Backports and enhancements for the contextlib module',
@@ -19,12 +20,12 @@
'License :: OSI Approved :: Python Software Foundation License',
# These are the Python versions tested, it may work on others
'Programming Language :: Python :: 2',
- 'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
- 'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
+ 'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
],
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/contextlib2-0.5.5/test_contextlib2.py new/contextlib2-0.6.0/test_contextlib2.py
--- old/contextlib2-0.5.5/test_contextlib2.py 2017-04-25 05:51:01.000000000 +0200
+++ new/contextlib2-0.6.0/test_contextlib2.py 2019-09-21 15:16:23.000000000 +0200
@@ -15,6 +15,58 @@
requires_docstrings = unittest.skipIf(sys.flags.optimize >= 2,
"Test requires docstrings")
+
+class TestAbstractContextManager(unittest.TestCase):
+
+ def test_enter(self):
+ class DefaultEnter(AbstractContextManager):
+ def __exit__(self, *args):
+ super().__exit__(*args)
+
+ manager = DefaultEnter()
+ self.assertIs(manager.__enter__(), manager)
+
+ def test_exit_is_abstract(self):
+ class MissingExit(AbstractContextManager):
+ pass
+
+ with self.assertRaises(TypeError):
+ MissingExit()
+
+ def test_structural_subclassing(self):
+ # New style classes used here
+ class ManagerFromScratch(object):
+ def __enter__(self):
+ return self
+ def __exit__(self, exc_type, exc_value, traceback):
+ return None
+
+ self.assertTrue(issubclass(ManagerFromScratch, AbstractContextManager))
+
+ class DefaultEnter(AbstractContextManager):
+ def __exit__(self, *args):
+ super().__exit__(*args)
+
+ self.assertTrue(issubclass(DefaultEnter, AbstractContextManager))
+
+ if sys.version_info[:2] <= (3, 0):
+ def test_structural_subclassing_classic(self):
+ # Old style classes used here
+ class ManagerFromScratch:
+ def __enter__(self):
+ return self
+ def __exit__(self, exc_type, exc_value, traceback):
+ return None
+
+ self.assertTrue(issubclass(ManagerFromScratch, AbstractContextManager))
+
+ class DefaultEnter(AbstractContextManager):
+ def __exit__(self, *args):
+ super().__exit__(*args)
+
+ self.assertTrue(issubclass(DefaultEnter, AbstractContextManager))
+
+
class ContextManagerTestCase(unittest.TestCase):
def test_contextmanager_plain(self):
@@ -911,6 +963,16 @@
# This shouldn't raise an exception.
stack.enter_context(suppress())
+
+class NullcontextTestCase(unittest.TestCase):
+ def test_nullcontext(self):
+ class C:
+ pass
+ c = C()
+ with nullcontext(c) as c_in:
+ self.assertIs(c_in, c)
+
+
if __name__ == "__main__":
import unittest
unittest.main()