summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory P. Smith <greg@krypto.org>2012-03-14 15:04:18 -0700
committerGregory P. Smith <greg@krypto.org>2012-03-14 15:04:18 -0700
commit5a4ffdbe3d08848d1984622f989431cf13c5c94e (patch)
tree354fe8871f5ddd69792316b64406135098b116a0
parent8bfd49e0a0d4faac58cd0a48c097a9b1b0846458 (diff)
parentd7c65e28078f9fdc0ce9255605f5c54059b2e893 (diff)
downloadcpython-git-5a4ffdbe3d08848d1984622f989431cf13c5c94e.tar.gz
merge heads
-rw-r--r--Doc/faq/programming.rst4
-rw-r--r--Lib/unittest/mock.py58
-rw-r--r--Lib/unittest/test/testmock/testcallable.py16
3 files changed, 27 insertions, 51 deletions
diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst
index 5de36764c5..d33e25be85 100644
--- a/Doc/faq/programming.rst
+++ b/Doc/faq/programming.rst
@@ -794,9 +794,9 @@ My program is too slow. How do I speed it up?
That's a tough one, in general. First, here are a list of things to
remember before diving further:
-* Performance characteristics vary accross Python implementations. This FAQ
+* Performance characteristics vary across Python implementations. This FAQ
focusses on :term:`CPython`.
-* Behaviour can vary accross operating systems, especially when talking about
+* Behaviour can vary across operating systems, especially when talking about
I/O or multi-threading.
* You should always find the hot spots in your program *before* attempting to
optimize any code (see the :mod:`profile` module).
diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py
index 89fe232c2b..e6b103d5d6 100644
--- a/Lib/unittest/mock.py
+++ b/Lib/unittest/mock.py
@@ -143,13 +143,10 @@ def _instance_callable(obj):
# already an instance
return getattr(obj, '__call__', None) is not None
- klass = obj
- # uses __bases__ instead of __mro__ so that we work with old style classes
- if klass.__dict__.get('__call__') is not None:
- return True
-
- for base in klass.__bases__:
- if _instance_callable(base):
+ # *could* be broken by a class overriding __mro__ or __dict__ via
+ # a metaclass
+ for base in (obj,) + obj.__mro__:
+ if base.__dict__.get('__call__') is not None:
return True
return False
@@ -622,9 +619,7 @@ class NonCallableMock(Base):
def __dir__(self):
- """Filter the output of `dir(mock)` to only useful members.
- XXXX
- """
+ """Filter the output of `dir(mock)` to only useful members."""
extras = self._mock_methods or []
from_type = dir(type(self))
from_dict = list(self.__dict__)
@@ -1060,31 +1055,28 @@ class _patch(object):
@wraps(func)
def patched(*args, **keywargs):
- # could use with statement here
extra_args = []
entered_patchers = []
- # could use try..except...finally here
try:
- try:
- for patching in patched.patchings:
- arg = patching.__enter__()
- entered_patchers.append(patching)
- if patching.attribute_name is not None:
- keywargs.update(arg)
- elif patching.new is DEFAULT:
- extra_args.append(arg)
-
- args += tuple(extra_args)
- return func(*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)
- # re-raise the exception
- raise
+ for patching in patched.patchings:
+ arg = patching.__enter__()
+ entered_patchers.append(patching)
+ if patching.attribute_name is not None:
+ keywargs.update(arg)
+ elif patching.new is DEFAULT:
+ extra_args.append(arg)
+
+ args += tuple(extra_args)
+ return func(*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)
+ # re-raise the exception
+ raise
finally:
for patching in reversed(entered_patchers):
patching.__exit__()
@@ -2064,11 +2056,7 @@ def _must_skip(spec, entry, is_type):
if entry in getattr(spec, '__dict__', {}):
# instance attribute - shouldn't skip
return False
- # can't use type because of old style classes
spec = spec.__class__
- if not hasattr(spec, '__mro__'):
- # old style class: can't have descriptors anyway
- return is_type
for klass in spec.__mro__:
result = klass.__dict__.get(entry, DEFAULT)
diff --git a/Lib/unittest/test/testmock/testcallable.py b/Lib/unittest/test/testmock/testcallable.py
index bdc42fa4cc..7b2dd003ea 100644
--- a/Lib/unittest/test/testmock/testcallable.py
+++ b/Lib/unittest/test/testmock/testcallable.py
@@ -107,19 +107,9 @@ class TestCallable(unittest.TestCase):
class Multi(SomeClass, Sub):
pass
- class OldStyle:
- def __call__(self):
- pass
-
- class OldStyleSub(OldStyle):
- pass
-
for arg in 'spec', 'spec_set':
- for Klass in CallableX, Sub, Multi, OldStyle, OldStyleSub:
- patcher = patch('%s.X' % __name__, **{arg: Klass})
- mock = patcher.start()
-
- try:
+ for Klass in CallableX, Sub, Multi:
+ with patch('%s.X' % __name__, **{arg: Klass}) as mock:
instance = mock()
mock.assert_called_once_with()
@@ -136,8 +126,6 @@ class TestCallable(unittest.TestCase):
result.assert_called_once_with(3, 2, 1)
result.foo(3, 2, 1)
result.foo.assert_called_once_with(3, 2, 1)
- finally:
- patcher.stop()
def test_create_autopsec(self):