From b046ee4bb16811ce89e29555d16be813b550a458 Mon Sep 17 00:00:00 2001 From: Ivan Malison Date: Mon, 22 Sep 2014 16:40:09 -0700 Subject: [PATCH] Fix use_cassette decorator in python 2 by using wrapt.decorator. Add wrapt as dependency. --- setup.py | 2 +- tests/unit/test_vcr.py | 21 ++++++++++++++++++++- vcr/cassette.py | 8 +++++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index df31370..329dfeb 100644 --- a/setup.py +++ b/setup.py @@ -41,7 +41,7 @@ setup( 'vcr.compat': 'vcr/compat', 'vcr.persisters': 'vcr/persisters', }, - install_requires=['PyYAML', 'mock', 'six', 'contextlib2'], + install_requires=['PyYAML', 'mock', 'six', 'contextlib2', 'wrapt'], license='MIT', tests_require=['pytest', 'mock', 'pytest-localserver'], cmdclass={'test': PyTest}, diff --git a/tests/unit/test_vcr.py b/tests/unit/test_vcr.py index c1dc6f0..a2143aa 100644 --- a/tests/unit/test_vcr.py +++ b/tests/unit/test_vcr.py @@ -1,6 +1,7 @@ import mock +import pytest -from vcr import VCR +from vcr import VCR, use_cassette def test_vcr_use_cassette(): @@ -26,3 +27,21 @@ def test_vcr_use_cassette(): with test_vcr.use_cassette('test', filter_headers=new_filter_headers) as cassette: assert cassette._filter_headers == new_filter_headers + + +@pytest.fixture +def random_fixture(): + return 1 + + +@use_cassette('test') +def test_fixtures_with_use_cassette(random_fixture): + # Applying a decorator to a test function that requests features can cause + # problems if the decorator does not preserve the signature of the original + # test function. + + # This test ensures that use_cassette preserves the signature of the original + # test function, and thus that use_cassette is compatible with py.test + # fixtures. It is admittedly a bit strange because the test would never even + # run if the relevant feature were broken. + pass diff --git a/vcr/cassette.py b/vcr/cassette.py index d5c33b8..bc52340 100644 --- a/vcr/cassette.py +++ b/vcr/cassette.py @@ -2,6 +2,7 @@ import logging import contextlib2 +import wrapt try: from collections import Counter except ImportError: @@ -19,7 +20,7 @@ from .errors import UnhandledHTTPRequestError log = logging.getLogger(__name__) -class CassetteContextDecorator(contextlib2.ContextDecorator): +class CassetteContextDecorator(object): """Context manager/decorator that handles installing the cassette and removing cassettes. @@ -58,6 +59,11 @@ class CassetteContextDecorator(contextlib2.ContextDecorator): next(self.__finish, None) self.__finish = None + @wrapt.decorator + def __call__(self, function, instance, args, kwargs): + with self: + return function(*args, **kwargs) + class Cassette(object): '''A container for recorded requests and responses'''