fixtures: remove special cases when deciding when pytest.fixture() is a direct decoration

pytest.fixture() can be used either as

    @pytest.fixture
    def func(): ...

or as

    @pytest.fixture()
    def func(): ...

or (while maybe not intended)

    func = pytest.fixture(func)

so it needs to inspect internally whether it got a function in the first
positional argument or not.

Previously, there were was oddity. In the following,

    func = pytest.fixture(func, autouse=True)
    # OR
    func = pytest.fixture(func, parms=['a', 'b'])

The result is as if `func` wasn't passed.

There isn't any reason for this special that I can understand, so remove
it.
This commit is contained in:
Ran Benita 2020-05-01 14:40:15 +03:00
parent 54ae27f081
commit 5507752c53
2 changed files with 11 additions and 6 deletions

View File

@ -0,0 +1,3 @@
When using ``pytest.fixture`` on a function directly, as in ``pytest.fixture(func)``,
if the ``autouse`` or ``params`` arguments are also passed, the function is no longer
ignored, but is marked as a fixture.

View File

@ -1152,13 +1152,15 @@ def fixture(
if params is not None:
params = list(params)
if fixture_function and params is None and autouse is False:
# direct decoration
return FixtureFunctionMarker(scope, params, autouse, name=name)(
fixture_function
)
fixture_marker = FixtureFunctionMarker(
scope=scope, params=params, autouse=autouse, ids=ids, name=name,
)
return FixtureFunctionMarker(scope, params, autouse, ids=ids, name=name)
# Direct decoration.
if fixture_function:
return fixture_marker(fixture_function)
return fixture_marker
def yield_fixture(