Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def _unpack_resolved(self, fixture_dict: Dict[str, Any]) -> Dict[str, Any]:
resolved_vals = {}
for (k, arg) in fixture_dict.items():
if isinstance(arg, Fixture):
resolved_vals[k] = arg.resolved_val
else:
resolved_vals[k] = arg
return resolved_vals
def exception_raising_fixture():
@fixture
def i_raise_an_exception():
raise ZeroDivisionError()
return Fixture(fn=i_raise_an_exception)
def _resolve_single_arg(
self, arg: Callable, cache: FixtureCache
) -> Union[Any, Fixture]:
if not hasattr(arg, "ward_meta"):
return arg
fixture = Fixture(arg)
if cache.contains(fixture, fixture.scope, self.scope_key_from(fixture.scope)):
return cache.get(
fixture.key,
fixture.scope,
self.scope_key_from(fixture.scope),
)
has_deps = len(fixture.deps()) > 0
is_generator = fixture.is_generator_fixture
if not has_deps:
try:
if is_generator:
fixture.gen = arg()
fixture.resolved_val = next(fixture.gen)
else:
fixture.resolved_val = arg()
def fixtures(a=fixture_a, b=fixture_b):
return {"fixture_a": Fixture(fn=a), "fixture_b": Fixture(fn=b)}
def deps(self):
return inspect.signature(self.fn).parameters
def teardown(self):
# Suppress because we can't know whether there's more code
# to execute below the yield.
with suppress(StopIteration, RuntimeError):
if self.is_generator_fixture and self.gen:
next(self.gen)
FixtureKey = str
TestId = str
ModulePath = str
ScopeKey = Union[TestId, ModulePath, Scope]
ScopeCache = Dict[Scope, Dict[ScopeKey, Dict[FixtureKey, Fixture]]]
def _scope_cache_factory():
return {scope: {} for scope in Scope}
@dataclass
class FixtureCache:
"""
A collection of caches, each storing data for a different scope.
When a fixture is resolved, it is stored in the appropriate cache given
the scope of the fixture.
A lookup into this cache is a 3 stage process: