| cls = <class '_pytest.runner.CallInfo'>
|
| func = <function FlakyPlugin.call_and_report.<locals>._call_runtest_hook.<locals>.<lambda> at 0x00000233FE3CF130>
|
| when = 'call'
|
| reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)
|
|
|
| @classmethod
|
| def from_call(
|
| cls,
|
| func: Callable[[], TResult],
|
| when: Literal["collect", "setup", "call", "teardown"],
|
| reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None,
|
| ) -> CallInfo[TResult]:
|
| """Call func, wrapping the result in a CallInfo.
|
|
|
| :param func:
|
| The function to call. Called without arguments.
|
| :type func: Callable[[], _pytest.runner.TResult]
|
| :param when:
|
| The phase in which the function is called.
|
| :param reraise:
|
| Exception or exceptions that shall propagate if raised by the
|
| function, instead of being wrapped in the CallInfo.
|
| """
|
| excinfo = None
|
| instant = timing.Instant()
|
| try:
|
| > result: TResult | None = func()
|
|
|
| venv\lib\site-packages\_pytest\runner.py:344:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| > lambda: ihook(item=item, **kwds), when=when, reraise=reraise
|
| )
|
|
|
| venv\lib\site-packages\flaky\flaky_pytest_plugin.py:146:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| self = <HookCaller 'pytest_runtest_call'>
|
| kwargs = {'item': <Function test_mojo_column_data[3.13]>}, firstresult = False
|
|
|
| def __call__(self, **kwargs: object) -> Any:
|
| """Call the hook.
|
|
|
| Only accepts keyword arguments, which should match the hook
|
| specification.
|
|
|
| Returns the result(s) of calling all registered plugins, see
|
| :ref:`calling`.
|
| """
|
| assert not self.is_historic(), (
|
| "Cannot directly call a historic hook - use call_historic instead."
|
| )
|
| self._verify_all_args_are_provided(kwargs)
|
| firstresult = self.spec.opts.get("firstresult", False) if self.spec else False
|
| # Copy because plugins may register other plugins during iteration (#438).
|
| > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
|
|
|
| venv\lib\site-packages\pluggy\_hooks.py:512:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| self = <_pytest.config.PytestPluginManager object at 0x00000233FA603310>
|
| hook_name = 'pytest_runtest_call'
|
| methods = [<HookImpl plugin_name='threadexception', plugin=<module '_pytest.threadexception' from 'D:\\a\\austin\\austin\\venv\\...e=None>>, <HookImpl plugin_name='logging-plugin', plugin=<_pytest.logging.LoggingPlugin object at 0x00000233FB968F40>>]
|
| kwargs = {'item': <Function test_mojo_column_data[3.13]>}, firstresult = False
|
|
|
| def _hookexec(
|
| self,
|
| hook_name: str,
|
| methods: Sequence[HookImpl],
|
| kwargs: Mapping[str, object],
|
| firstresult: bool,
|
| ) -> object | list[object]:
|
| # called from all hookcaller instances.
|
| # enable_tracing will set its own wrapping function at self._inner_hookexec
|
| > return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
|
|
|
| venv\lib\site-packages\pluggy\_manager.py:120:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| hook_name = 'pytest_runtest_call'
|
| hook_impls = [<HookImpl plugin_name='threadexception', plugin=<module '_pytest.threadexception' from 'D:\\a\\austin\\austin\\venv\\...e=None>>, <HookImpl plugin_name='logging-plugin', plugin=<_pytest.logging.LoggingPlugin object at 0x00000233FB968F40>>]
|
| caller_kwargs = {'item': <Function test_mojo_column_data[3.13]>}
|
| firstresult = False
|
|
|
| def _multicall(
|
| hook_name: str,
|
| hook_impls: Sequence[HookImpl],
|
| caller_kwargs: Mapping[str, object],
|
| firstresult: bool,
|
| ) -> object | list[object]:
|
| """Execute a call into multiple python functions/methods and return the
|
| result(s).
|
|
|
| ``caller_kwargs`` comes from HookCaller.__call__().
|
| """
|
| __tracebackhide__ = True
|
| results: list[object] = []
|
| exception = None
|
| try: # run impl and wrapper setup functions in a loop
|
| teardowns: list[Teardown] = []
|
| try:
|
| for hook_impl in reversed(hook_impls):
|
| try:
|
| args = [caller_kwargs[argname] for argname in hook_impl.argnames]
|
| except KeyError as e:
|
| # coverage bug - this is tested
|
| for argname in hook_impl.argnames: # pragma: no cover
|
| if argname not in caller_kwargs:
|
| raise HookCallError(
|
| f"hook call must provide argument {argname!r}"
|
| ) from e
|
|
|
| if hook_impl.hookwrapper:
|
| function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args)
|
|
|
| next(function_gen) # first yield
|
| teardowns.append(function_gen)
|
|
|
| elif hook_impl.wrapper:
|
| try:
|
| # If this cast is not valid, a type error is raised below,
|
| # which is the desired response.
|
| res = hook_impl.function(*args)
|
| function_gen = cast(Generator[None, object, object], res)
|
| next(function_gen) # first yield
|
| teardowns.append(function_gen)
|
| except StopIteration:
|
| _raise_wrapfail(function_gen, "did not yield")
|
| else:
|
| res = hook_impl.function(*args)
|
| if res is not None:
|
| results.append(res)
|
| if firstresult: # halt further impl calls
|
| break
|
| except BaseException as exc:
|
| exception = exc
|
| finally:
|
| if firstresult: # first result hooks return a single value
|
| result = results[0] if results else None
|
| else:
|
| result = results
|
|
|
| # run all wrapper post-yield blocks
|
| for teardown in reversed(teardowns):
|
| try:
|
| if exception is not None:
|
| try:
|
| teardown.throw(exception)
|
| except RuntimeError as re:
|
| # StopIteration from generator causes RuntimeError
|
| # even for coroutine usage - see #544
|
| if (
|
| isinstance(exception, StopIteration)
|
| and re.__cause__ is exception
|
| ):
|
| teardown.close()
|
| continue
|
| else:
|
| raise
|
| else:
|
| teardown.send(result)
|
| # Following is unreachable for a well behaved hook wrapper.
|
| # Try to force finalizers otherwise postponed till GC action.
|
| # Note: close() may raise if generator handles GeneratorExit.
|
| teardown.close()
|
| except StopIteration as si:
|
| result = si.value
|
| exception = None
|
| continue
|
| except BaseException as e:
|
| exception = e
|
| continue
|
| _raise_wrapfail(teardown, "has second yield")
|
|
|
| if exception is not None:
|
| > raise exception
|
|
|
| venv\lib\site-packages\pluggy\_callers.py:167:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| hook_name = 'pytest_runtest_call'
|
| hook_impls = [<HookImpl plugin_name='threadexception', plugin=<module '_pytest.threadexception' from 'D:\\a\\austin\\austin\\venv\\...e=None>>, <HookImpl plugin_name='logging-plugin', plugin=<_pytest.logging.LoggingPlugin object at 0x00000233FB968F40>>]
|
| caller_kwargs = {'item': <Function test_mojo_column_data[3.13]>}
|
| firstresult = False
|
|
|
| def _multicall(
|
| hook_name: str,
|
| hook_impls: Sequence[HookImpl],
|
| caller_kwargs: Mapping[str, object],
|
| firstresult: bool,
|
| ) -> object | list[object]:
|
| """Execute a call into multiple python functions/methods and return the
|
| result(s).
|
|
|
| ``caller_kwargs`` comes from HookCaller.__call__().
|
| """
|
| __tracebackhide__ = True
|
| results: list[object] = []
|
| exception = None
|
| try: # run impl and wrapper setup functions in a loop
|
| teardowns: list[Teardown] = []
|
| try:
|
| for hook_impl in reversed(hook_impls):
|
| try:
|
| args = [caller_kwargs[argname] for argname in hook_impl.argnames]
|
| except KeyError as e:
|
| # coverage bug - this is tested
|
| for argname in hook_impl.argnames: # pragma: no cover
|
| if argname not in caller_kwargs:
|
| raise HookCallError(
|
| f"hook call must provide argument {argname!r}"
|
| ) from e
|
|
|
| if hook_impl.hookwrapper:
|
| function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args)
|
|
|
| next(function_gen) # first yield
|
| teardowns.append(function_gen)
|
|
|
| elif hook_impl.wrapper:
|
| try:
|
| # If this cast is not valid, a type error is raised below,
|
| # which is the desired response.
|
| res = hook_impl.function(*args)
|
| function_gen = cast(Generator[None, object, object], res)
|
| next(function_gen) # first yield
|
| teardowns.append(function_gen)
|
| except StopIteration:
|
| _raise_wrapfail(function_gen, "did not yield")
|
| else:
|
| res = hook_impl.function(*args)
|
| if res is not None:
|
| results.append(res)
|
| if firstresult: # halt further impl calls
|
| break
|
| except BaseException as exc:
|
| exception = exc
|
| finally:
|
| if firstresult: # first result hooks return a single value
|
| result = results[0] if results else None
|
| else:
|
| result = results
|
|
|
| # run all wrapper post-yield blocks
|
| for teardown in reversed(teardowns):
|
| try:
|
| if exception is not None:
|
| try:
|
| > teardown.throw(exception)
|
|
|
| venv\lib\site-packages\pluggy\_callers.py:139:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| self = <_pytest.logging.LoggingPlugin object at 0x00000233FB968F40>
|
| item = <Function test_mojo_column_data[3.13]>
|
|
|
| @hookimpl(wrapper=True)
|
| def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]:
|
| self.log_cli_handler.set_when("call")
|
|
|
| with self._runtest_for(item, "call"):
|
| > yield
|
|
|
| venv\lib\site-packages\_pytest\logging.py:850:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| hook_name = 'pytest_runtest_call'
|
| hook_impls = [<HookImpl plugin_name='threadexception', plugin=<module '_pytest.threadexception' from 'D:\\a\\austin\\austin\\venv\\...e=None>>, <HookImpl plugin_name='logging-plugin', plugin=<_pytest.logging.LoggingPlugin object at 0x00000233FB968F40>>]
|
| caller_kwargs = {'item': <Function test_mojo_column_data[3.13]>}
|
| firstresult = False
|
|
|
| def _multicall(
|
| hook_name: str,
|
| hook_impls: Sequence[HookImpl],
|
| caller_kwargs: Mapping[str, object],
|
| firstresult: bool,
|
| ) -> object | list[object]:
|
| """Execute a call into multiple python functions/methods and return the
|
| result(s).
|
|
|
| ``caller_kwargs`` comes from HookCaller.__call__().
|
| """
|
| __tracebackhide__ = True
|
| results: list[object] = []
|
| exception = None
|
| try: # run impl and wrapper setup functions in a loop
|
| teardowns: list[Teardown] = []
|
| try:
|
| for hook_impl in reversed(hook_impls):
|
| try:
|
| args = [caller_kwargs[argname] for argname in hook_impl.argnames]
|
| except KeyError as e:
|
| # coverage bug - this is tested
|
| for argname in hook_impl.argnames: # pragma: no cover
|
| if argname not in caller_kwargs:
|
| raise HookCallError(
|
| f"hook call must provide argument {argname!r}"
|
| ) from e
|
|
|
| if hook_impl.hookwrapper:
|
| function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args)
|
|
|
| next(function_gen) # first yield
|
| teardowns.append(function_gen)
|
|
|
| elif hook_impl.wrapper:
|
| try:
|
| # If this cast is not valid, a type error is raised below,
|
| # which is the desired response.
|
| res = hook_impl.function(*args)
|
| function_gen = cast(Generator[None, object, object], res)
|
| next(function_gen) # first yield
|
| teardowns.append(function_gen)
|
| except StopIteration:
|
| _raise_wrapfail(function_gen, "did not yield")
|
| else:
|
| res = hook_impl.function(*args)
|
| if res is not None:
|
| results.append(res)
|
| if firstresult: # halt further impl calls
|
| break
|
| except BaseException as exc:
|
| exception = exc
|
| finally:
|
| if firstresult: # first result hooks return a single value
|
| result = results[0] if results else None
|
| else:
|
| result = results
|
|
|
| # run all wrapper post-yield blocks
|
| for teardown in reversed(teardowns):
|
| try:
|
| if exception is not None:
|
| try:
|
| > teardown.throw(exception)
|
| E RecursionError: maximum recursion depth exceeded while getting the str of an object
|
|
|
| venv\lib\site-packages\pluggy\_callers.py:139: RecursionError
|
| !!! Recursion detected (same locals & position)
|