Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-mock for openSUSE:Factory 
checked in at 2021-02-01 13:26:34
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-mock (Old)
 and      /work/SRC/openSUSE:Factory/.python-mock.new.28504 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-mock"

Mon Feb  1 13:26:34 2021 rev:27 rq:866397 version:4.0.3

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-mock/python-mock.changes  2020-05-01 
11:04:49.618734909 +0200
+++ /work/SRC/openSUSE:Factory/.python-mock.new.28504/python-mock.changes       
2021-02-01 13:28:25.910124402 +0100
@@ -1,0 +2,16 @@
+Sun Jan 24 18:10:57 UTC 2021 - Dirk M??ller <dmuel...@suse.com>
+
+- update to 4.0.3:
+  * Issue #42532: Remove unexpected call of ``__bool__`` when passing a
+  ``spec_arg`` argument to a Mock.
+  * Issue #39966: Revert bpo-25597. :class:`unittest.mock.MagicMock` with
+  wraps' set uses default return values for magic methods.
+  * Issue #41877: Mock objects which are not unsafe will now raise an
+  AttributeError if an attribute with the prefix asert, aseert, or assrt is
+  accessed, in addition to this already happening for the prefixes assert or
+  assret.
+  * Issue #40126: Fixed reverting multiple patches in unittest.mock. Patcher's
+  ``__exit__()`` is now never called if its ``__enter__()`` is failed.
+  Returning true from ``__exit__()`` silences now the exception.
+
+-------------------------------------------------------------------

Old:
----
  4.0.2.tar.gz

New:
----
  4.0.3.tar.gz

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

Other differences:
------------------
++++++ python-mock.spec ++++++
--- /var/tmp/diff_new_pack.0dyLwS/_old  2021-02-01 13:28:26.610125491 +0100
+++ /var/tmp/diff_new_pack.0dyLwS/_new  2021-02-01 13:28:26.610125491 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-mock
 #
-# Copyright (c) 2020 SUSE LLC
+# Copyright (c) 2021 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -27,7 +27,7 @@
 %bcond_with test
 %endif
 Name:           python-mock%{psuffix}
-Version:        4.0.2
+Version:        4.0.3
 Release:        0
 Summary:        A Python Mocking and Patching Library for Testing
 License:        BSD-2-Clause

++++++ 4.0.2.tar.gz -> 4.0.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mock-4.0.2/.github/ISSUE_TEMPLATE/bug_report.md 
new/mock-4.0.3/.github/ISSUE_TEMPLATE/bug_report.md
--- old/mock-4.0.2/.github/ISSUE_TEMPLATE/bug_report.md 1970-01-01 
01:00:00.000000000 +0100
+++ new/mock-4.0.3/.github/ISSUE_TEMPLATE/bug_report.md 2020-12-10 
08:30:27.000000000 +0100
@@ -0,0 +1,30 @@
+---
+name: Bug report
+about: Only report bugs here that are specific to this backport.
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+This package is a rolling backport of 
[`unittest.mock`](https://github.com/python/cpython/blob/master/Lib/unittest/mock.py).
 
+As such, any problems you encounter most likely need to be fixed upstream.
+
+Before submitting an issue here, please try and reproduce the problem on the 
latest release of Python 3, including alphas, and replace any import from 
`mock` with ones from `unittest.mock`.
+
+If the issue still occurs, then please report upstream through 
https://bugs.python.org/ as it will need to be fixed there so that it can be 
backported here and released to you.
+
+If the issue does not occur upstream, please file an issue using the template 
below as it may be an issue specific to the backport:
+
+**What versions are you using?**
+ - Python: [e.g. 3.7.1]
+ - Mock: [e.g. 4.0.2]
+ - Operating System: [e.g.Linux, macOS, Windows]
+
+**What happened?**
+
+<!-- 
+A clear and concise description of what the problem is, including full 
tracebacks and code being executed  
+-->
+
+**What were you hoping to happen instead?**
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mock-4.0.2/CHANGELOG.rst new/mock-4.0.3/CHANGELOG.rst
--- old/mock-4.0.2/CHANGELOG.rst        2020-03-11 18:25:49.000000000 +0100
+++ new/mock-4.0.3/CHANGELOG.rst        2020-12-10 08:30:27.000000000 +0100
@@ -1,3 +1,21 @@
+4.0.3
+-----
+
+- Issue #42532: Remove unexpected call of ``__bool__`` when passing a
+  ``spec_arg`` argument to a Mock.
+
+- Issue #39966: Revert bpo-25597. :class:`unittest.mock.MagicMock` with
+  wraps' set uses default return values for magic methods.
+
+- Issue #41877: Mock objects which are not unsafe will now raise an
+  AttributeError if an attribute with the prefix asert, aseert, or assrt is
+  accessed, in addition to this already happening for the prefixes assert or
+  assret.
+
+- Issue #40126: Fixed reverting multiple patches in unittest.mock. Patcher's
+  ``__exit__()`` is now never called if its ``__enter__()`` is failed.
+  Returning true from ``__exit__()`` silences now the exception.
+
 4.0.2
 -----
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mock-4.0.2/lastsync.txt new/mock-4.0.3/lastsync.txt
--- old/mock-4.0.2/lastsync.txt 2020-03-11 18:25:49.000000000 +0100
+++ new/mock-4.0.3/lastsync.txt 2020-12-10 08:30:27.000000000 +0100
@@ -1 +1 @@
-e553f204bf0e39b1d701a364bc71b286acb9433f
+c598a04dd29b89ad072245ddaf738badcfb41ac7
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mock-4.0.2/mock/__init__.py 
new/mock-4.0.3/mock/__init__.py
--- old/mock-4.0.2/mock/__init__.py     2020-03-11 18:25:49.000000000 +0100
+++ new/mock-4.0.3/mock/__init__.py     2020-12-10 08:30:27.000000000 +0100
@@ -7,7 +7,7 @@
 import mock.mock as _mock
 from mock.mock import *
 
-__version__ = '4.0.2'
+__version__ = '4.0.3'
 version_info = tuple(int(p) for p in
                      re.match(r'(\d+).(\d+).(\d+)', __version__).groups())
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mock-4.0.2/mock/mock.py new/mock-4.0.3/mock/mock.py
--- old/mock-4.0.2/mock/mock.py 2020-03-11 18:25:49.000000000 +0100
+++ new/mock-4.0.3/mock/mock.py 2020-12-10 08:30:27.000000000 +0100
@@ -408,7 +408,7 @@
             # Check if spec is an async object or function
             bound_args = _MOCK_SIG.bind_partial(cls, *args, **kw).arguments
             spec_arg = bound_args.get('spec_set', bound_args.get('spec'))
-            if spec_arg and _is_async_obj(spec_arg):
+            if spec_arg is not None and _is_async_obj(spec_arg):
                 bases = (AsyncMockMixin, cls)
         new = type(cls.__name__, bases, {'__doc__': cls.__doc__})
         instance = _safe_super(NonCallableMock, cls).__new__(new)
@@ -633,9 +633,9 @@
         elif _is_magic(name):
             raise AttributeError(name)
         if not self._mock_unsafe:
-            if name.startswith(('assert', 'assret')):
+            if name.startswith(('assert', 'assret', 'asert', 'aseert', 
'assrt')):
                 raise AttributeError("Attributes cannot start with 'assert' "
-                                     "or 'assret'")
+                                     "or its misspellings")
 
         result = self._mock_children.get(name)
         if result is _deleted:
@@ -1250,11 +1250,6 @@
     return thing
 
 
-def _is_started(patcher):
-    # XXXX horrible
-    return hasattr(patcher, 'is_local')
-
-
 class _patch(object):
 
     attribute_name = None
@@ -1325,14 +1320,9 @@
     @contextlib.contextmanager
     def decoration_helper(self, patched, args, keywargs):
         extra_args = []
-        entered_patchers = []
-        patching = None
-
-        exc_info = tuple()
-        try:
+        with contextlib.ExitStack() as exit_stack:
             for patching in patched.patchings:
-                arg = patching.__enter__()
-                entered_patchers.append(patching)
+                arg = exit_stack.enter_context(patching)
                 if patching.attribute_name is not None:
                     keywargs.update(arg)
                 elif patching.new is DEFAULT:
@@ -1340,19 +1330,6 @@
 
             args += tuple(extra_args)
             yield (args, keywargs)
-        except:
-            if (patching not in entered_patchers and
-                _is_started(patching)):
-                # the patcher may have been started, but an exception
-                # raised whilst entering one of its additional_patchers
-                entered_patchers.append(patching)
-            # Pass the exception to __exit__
-            exc_info = sys.exc_info()
-            # re-raise the exception
-            raise
-        finally:
-            for patching in reversed(entered_patchers):
-                patching.__exit__(*exc_info)
 
 
     def decorate_callable(self, func):
@@ -1529,25 +1506,26 @@
 
         self.temp_original = original
         self.is_local = local
-        setattr(self.target, self.attribute, new_attr)
-        if self.attribute_name is not None:
-            extra_args = {}
-            if self.new is DEFAULT:
-                extra_args[self.attribute_name] =  new
-            for patching in self.additional_patchers:
-                arg = patching.__enter__()
-                if patching.new is DEFAULT:
-                    extra_args.update(arg)
-            return extra_args
-
-        return new
+        self._exit_stack = contextlib.ExitStack()
+        try:
+            setattr(self.target, self.attribute, new_attr)
+            if self.attribute_name is not None:
+                extra_args = {}
+                if self.new is DEFAULT:
+                    extra_args[self.attribute_name] =  new
+                for patching in self.additional_patchers:
+                    arg = self._exit_stack.enter_context(patching)
+                    if patching.new is DEFAULT:
+                        extra_args.update(arg)
+                return extra_args
 
+            return new
+        except:
+            if not self.__exit__(*sys.exc_info()):
+                raise
 
     def __exit__(self, *exc_info):
         """Undo the patch."""
-        if not _is_started(self):
-            return
-
         if self.is_local and self.temp_original is not DEFAULT:
             setattr(self.target, self.attribute, self.temp_original)
         else:
@@ -1562,9 +1540,9 @@
         del self.temp_original
         del self.is_local
         del self.target
-        for patcher in reversed(self.additional_patchers):
-            if _is_started(patcher):
-                patcher.__exit__(*exc_info)
+        exit_stack = self._exit_stack
+        del self._exit_stack
+        return exit_stack.__exit__(*exc_info)
 
 
     def start(self):
@@ -1580,9 +1558,9 @@
             self._active_patches.remove(self)
         except ValueError:
             # If the patch hasn't been started this will fail
-            pass
+            return None
 
-        return self.__exit__()
+        return self.__exit__(None, None, None)
 
 
 
@@ -1882,9 +1860,9 @@
             _patch._active_patches.remove(self)
         except ValueError:
             # If the patch hasn't been started this will fail
-            pass
+            return None
 
-        return self.__exit__()
+        return self.__exit__(None, None, None)
 
 
 def _clear_dict(in_dict):
@@ -2047,12 +2025,6 @@
 
 
 def _set_return_value(mock, method, name):
-    # If _mock_wraps is present then attach it so that wrapped object
-    # is used for return value is used when called.
-    if mock._mock_wraps is not None:
-        method._mock_wraps = getattr(mock._mock_wraps, name)
-        return
-
     fixed = _return_values.get(name, DEFAULT)
     if fixed is not DEFAULT:
         method.return_value = fixed
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mock-4.0.2/mock/tests/testmock.py 
new/mock-4.0.3/mock/tests/testmock.py
--- old/mock-4.0.2/mock/tests/testmock.py       2020-03-11 18:25:49.000000000 
+0100
+++ new/mock-4.0.3/mock/tests/testmock.py       2020-12-10 08:30:27.000000000 
+0100
@@ -716,12 +716,16 @@
 
 
     def test_magic_method_wraps_dict(self):
+        # bpo-25597: MagicMock with wrap doesn't call wrapped object's
+        # method for magic methods with default values.
         data = {'foo': 'bar'}
 
         wrapped_dict = MagicMock(wraps=data)
         self.assertEqual(wrapped_dict.get('foo'), 'bar')
-        self.assertEqual(wrapped_dict['foo'], 'bar')
-        self.assertTrue('foo' in wrapped_dict)
+        # Accessing key gives a MagicMock
+        self.assertIsInstance(wrapped_dict['foo'], MagicMock)
+        # __contains__ method has a default value of False
+        self.assertFalse('foo' in wrapped_dict)
 
         # return_value is non-sentinel and takes precedence over wrapped value.
         wrapped_dict.get.return_value = 'return_value'
@@ -732,14 +736,13 @@
         self.assertEqual(wrapped_dict.get('foo'), 'bar')
 
         self.assertEqual(wrapped_dict.get('baz'), None)
-        with self.assertRaises(KeyError):
-            wrapped_dict['baz']
+        self.assertIsInstance(wrapped_dict['baz'], MagicMock)
         self.assertFalse('bar' in wrapped_dict)
 
         data['baz'] = 'spam'
         self.assertEqual(wrapped_dict.get('baz'), 'spam')
-        self.assertEqual(wrapped_dict['baz'], 'spam')
-        self.assertTrue('baz' in wrapped_dict)
+        self.assertIsInstance(wrapped_dict['baz'], MagicMock)
+        self.assertFalse('bar' in wrapped_dict)
 
         del data['baz']
         self.assertEqual(wrapped_dict.get('baz'), None)
@@ -759,6 +762,7 @@
         klass = MagicMock(wraps=Foo)
         obj = klass()
         self.assertEqual(obj.__getitem__(2), 2)
+        self.assertEqual(obj[2], 2)
         self.assertEqual(obj.__custom_method__(), "foo")
 
 
@@ -1596,14 +1600,23 @@
     #Issue21238
     def test_mock_unsafe(self):
         m = Mock()
-        msg = "Attributes cannot start with 'assert' or 'assret'"
+        msg = "Attributes cannot start with 'assert' or its misspellings"
         with self.assertRaisesRegex(AttributeError, msg):
             m.assert_foo_call()
         with self.assertRaisesRegex(AttributeError, msg):
             m.assret_foo_call()
+        with self.assertRaisesRegex(AttributeError, msg):
+            m.asert_foo_call()
+        with self.assertRaisesRegex(AttributeError, msg):
+            m.aseert_foo_call()
+        with self.assertRaisesRegex(AttributeError, msg):
+            m.assrt_foo_call()
         m = Mock(unsafe=True)
         m.assert_foo_call()
         m.assret_foo_call()
+        m.asert_foo_call()
+        m.aseert_foo_call()
+        m.assrt_foo_call()
 
     #Issue21262
     def test_assert_not_called(self):
@@ -2154,6 +2167,16 @@
                 obj = mock(spec=Something)
                 self.assertIsInstance(obj, Something)
 
+    def test_bool_not_called_when_passing_spec_arg(self):
+        class Something:
+            def __init__(self):
+                self.obj_with_bool_func = unittest.mock.MagicMock()
+
+        obj = Something()
+        with unittest.mock.patch.object(obj, 'obj_with_bool_func', 
autospec=True): pass
+
+        self.assertEqual(obj.obj_with_bool_func.__bool__.call_count, 0)
+
 
 if __name__ == '__main__':
     unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mock-4.0.2/mock/tests/testpatch.py 
new/mock-4.0.3/mock/tests/testpatch.py
--- old/mock-4.0.2/mock/tests/testpatch.py      2020-03-11 18:25:49.000000000 
+0100
+++ new/mock-4.0.3/mock/tests/testpatch.py      2020-12-10 08:30:27.000000000 
+0100
@@ -774,7 +774,7 @@
         d = {'foo': 'bar'}
         original = d.copy()
         patcher = patch.dict(d, [('spam', 'eggs')], clear=True)
-        self.assertEqual(patcher.stop(), False)
+        self.assertFalse(patcher.stop())
         self.assertEqual(d, original)
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mock-4.0.2/setup.cfg new/mock-4.0.3/setup.cfg
--- old/mock-4.0.2/setup.cfg    2020-03-11 18:25:49.000000000 +0100
+++ new/mock-4.0.3/setup.cfg    2020-12-10 08:30:27.000000000 +0100
@@ -31,7 +31,7 @@
 docs =
   sphinx
 test =
-  pytest
+  pytest<5.4
   pytest-cov
 build =
   twine

Reply via email to