diff --git a/tobiko/__init__.py b/tobiko/__init__.py index cb3fc7c34..265aae861 100644 --- a/tobiko/__init__.py +++ b/tobiko/__init__.py @@ -28,6 +28,7 @@ TobikoException = _exception.TobikoException is_fixture = _fixture.is_fixture get_fixture = _fixture.get_fixture +fixture_property = _fixture.fixture_property required_fixture = _fixture.required_fixture required_setup_fixture = _fixture.required_setup_fixture get_fixture_name = _fixture.get_fixture_name diff --git a/tobiko/common/_fixture.py b/tobiko/common/_fixture.py index 60fa6dcf6..3010298d0 100644 --- a/tobiko/common/_fixture.py +++ b/tobiko/common/_fixture.py @@ -215,6 +215,10 @@ def init_fixture(obj, name): raise TypeError("Invalid fixture object type: {!r}".format(obj)) +def fixture_property(*args, **kwargs): + return FixtureProperty(*args, **kwargs) + + def required_fixture(obj): '''Creates a property that gets fixture identified by given :param obj: @@ -371,6 +375,13 @@ class SharedFixture(fixtures.Fixture): pass +class FixtureProperty(property): + + def __get__(self, instance, owner): + instance = instance or tobiko.get_fixture(owner) + return super(FixtureProperty, self).__get__(instance, owner) + + class RequiredFixtureProperty(object): def __init__(self, fixture): diff --git a/tobiko/tests/test_fixture.py b/tobiko/tests/test_fixture.py index 851b7640b..65cef1247 100644 --- a/tobiko/tests/test_fixture.py +++ b/tobiko/tests/test_fixture.py @@ -208,6 +208,24 @@ class CleanupFixtureTest(FixtureBaseTest): result.cleanup_fixture.assert_called_once_with() +class MyFixtureWithProperty(MyBaseFixture): + + @tobiko.fixture_property + def some_property(self): + return id(self) + + +class FixturePropertyTest(FixtureBaseTest): + + def test_with_instance(self): + fixture = tobiko.get_fixture(MyFixtureWithProperty) + self.assertEqual(id(fixture), fixture.some_property) + + def test_without_instance(self): + fixture = tobiko.get_fixture(MyFixtureWithProperty) + self.assertEqual(id(fixture), MyFixtureWithProperty.some_property) + + class MyFixture2(MyBaseFixture): pass