diff options
author | Gregory P. Smith <greg@krypto.org> | 2012-03-14 15:04:18 -0700 |
---|---|---|
committer | Gregory P. Smith <greg@krypto.org> | 2012-03-14 15:04:18 -0700 |
commit | 5a4ffdbe3d08848d1984622f989431cf13c5c94e (patch) | |
tree | 354fe8871f5ddd69792316b64406135098b116a0 | |
parent | 8bfd49e0a0d4faac58cd0a48c097a9b1b0846458 (diff) | |
parent | d7c65e28078f9fdc0ce9255605f5c54059b2e893 (diff) | |
download | cpython-git-5a4ffdbe3d08848d1984622f989431cf13c5c94e.tar.gz |
merge heads
-rw-r--r-- | Doc/faq/programming.rst | 4 | ||||
-rw-r--r-- | Lib/unittest/mock.py | 58 | ||||
-rw-r--r-- | Lib/unittest/test/testmock/testcallable.py | 16 |
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): |