Add is_pseudo & Replace the bad expression with isinstance check

This commit is contained in:
Sadra Barikbin 2023-09-05 10:41:09 +03:30
parent fc92f9f1dd
commit 0c163ec969
2 changed files with 22 additions and 20 deletions

View File

@ -882,7 +882,6 @@ def _eval_scope_callable(
return result return result
@final
class FixtureDef(Generic[FixtureValue]): class FixtureDef(Generic[FixtureValue]):
"""A container for a fixture definition. """A container for a fixture definition.
@ -1025,6 +1024,24 @@ class FixtureDef(Generic[FixtureValue]):
) )
class IdentityFixture(FixtureDef[FixtureValue]):
def __init__(
self,
fixturemanager: "FixtureManager",
argname: str,
scope: Union[Scope, _ScopeName, Callable[[str, Config], _ScopeName], None],
):
super().__init__(
fixturemanager,
"",
argname,
lambda request: request.param,
scope,
None,
_ispytest=True,
)
def resolve_fixture_function( def resolve_fixture_function(
fixturedef: FixtureDef[FixtureValue], request: FixtureRequest fixturedef: FixtureDef[FixtureValue], request: FixtureRequest
) -> "_FixtureFunc[FixtureValue]": ) -> "_FixtureFunc[FixtureValue]":
@ -1488,10 +1505,7 @@ class FixtureManager:
arg2fixturedefs[argname] = fixturedefs arg2fixturedefs[argname] = fixturedefs
else: else:
fixturedefs = arg2fixturedefs[argname] fixturedefs = arg2fixturedefs[argname]
if fixturedefs and not ( if fixturedefs and not isinstance(fixturedefs[-1], IdentityFixture):
fixturedefs[-1].func.__name__ == "get_direct_param_fixture_func"
and fixturedefs[-1].baseid == ""
):
fixturenames_closure = deduplicate_names( fixturenames_closure = deduplicate_names(
fixturenames_closure + arg2fixturedefs[argname][-1].argnames fixturenames_closure + arg2fixturedefs[argname][-1].argnames
) )

View File

@ -60,9 +60,9 @@ from _pytest.deprecated import INSTANCE_COLLECTOR
from _pytest.deprecated import NOSE_SUPPORT_METHOD from _pytest.deprecated import NOSE_SUPPORT_METHOD
from _pytest.fixtures import _get_direct_parametrize_args from _pytest.fixtures import _get_direct_parametrize_args
from _pytest.fixtures import FixtureDef from _pytest.fixtures import FixtureDef
from _pytest.fixtures import FixtureRequest
from _pytest.fixtures import FuncFixtureInfo from _pytest.fixtures import FuncFixtureInfo
from _pytest.fixtures import get_scope_node from _pytest.fixtures import get_scope_node
from _pytest.fixtures import IdentityFixture
from _pytest.main import Session from _pytest.main import Session
from _pytest.mark import MARK_GEN from _pytest.mark import MARK_GEN
from _pytest.mark import ParameterSet from _pytest.mark import ParameterSet
@ -1184,10 +1184,6 @@ class CallSpec2:
return "-".join(self._idlist) return "-".join(self._idlist)
def get_direct_param_fixture_func(request: FixtureRequest) -> Any:
return request.param
# Used for storing pseudo fixturedefs for direct parametrization. # Used for storing pseudo fixturedefs for direct parametrization.
name2pseudofixturedef_key = StashKey[Dict[str, FixtureDef[Any]]]() name2pseudofixturedef_key = StashKey[Dict[str, FixtureDef[Any]]]()
@ -1387,16 +1383,8 @@ class Metafunc:
if name2pseudofixturedef is not None and argname in name2pseudofixturedef: if name2pseudofixturedef is not None and argname in name2pseudofixturedef:
fixturedef = name2pseudofixturedef[argname] fixturedef = name2pseudofixturedef[argname]
else: else:
fixturedef = FixtureDef( fixturedef = IdentityFixture(
fixturemanager=self.definition.session._fixturemanager, self.definition.session._fixturemanager, argname, scope_
baseid="",
argname=argname,
func=get_direct_param_fixture_func,
scope=scope_,
params=None,
unittest=False,
ids=None,
_ispytest=True,
) )
if name2pseudofixturedef is not None: if name2pseudofixturedef is not None:
name2pseudofixturedef[argname] = fixturedef name2pseudofixturedef[argname] = fixturedef