/usr/share/cagefs-skeleton/opt/cloudlinux/venv/lib/python3.11/site-packages/_pytest
from typing import List from typing import Optional from typing import TYPE_CHECKING import pytest from _pytest import nodes from _pytest.config import Config from _pytest.config.argparsing import Parser from _pytest.main import Session from _pytest.reports import TestReport if TYPE_CHECKING: from _pytest.cacheprovider import Cache STEPWISE_CACHE_DIR = "cache/stepwise" def pytest_addoption(parser: Parser) -> None: group = parser.getgroup("general") group.addoption( "--sw", "--stepwise", action="store_true", default=False, dest="stepwise", help="Exit on test failure and continue from last failing test next time", ) group.addoption( "--sw-skip", "--stepwise-skip", action="store_true", default=False, dest="stepwise_skip", help="Ignore the first failing test but stop on the next failing test. " "Implicitly enables --stepwise.", ) @pytest.hookimpl def pytest_configure(config: Config) -> None: if config.option.stepwise_skip: # allow --stepwise-skip to work on it's own merits. config.option.stepwise = True if config.getoption("stepwise"): config.pluginmanager.register(StepwisePlugin(config), "stepwiseplugin") def pytest_sessionfinish(session: Session) -> None: if not session.config.getoption("stepwise"): assert session.config.cache is not None if hasattr(session.config, "workerinput"): # Do not update cache if this process is a xdist worker to prevent # race conditions (#10641). return # Clear the list of failing tests if the plugin is not active. session.config.cache.set(STEPWISE_CACHE_DIR, []) class StepwisePlugin: def __init__(self, config: Config) -> None: self.config = config self.session: Optional[Session] = None self.report_status = "" assert config.cache is not None self.cache: Cache = config.cache self.lastfailed: Optional[str] = self.cache.get(STEPWISE_CACHE_DIR, None) self.skip: bool = config.getoption("stepwise_skip") def pytest_sessionstart(self, session: Session) -> None: self.session = session def pytest_collection_modifyitems( self, config: Config, items: List[nodes.Item] ) -> None: if not self.lastfailed: self.report_status = "no previously failed tests, not skipping." return # check all item nodes until we find a match on last failed failed_index = None for index, item in enumerate(items): if item.nodeid == self.lastfailed: failed_index = index break # If the previously failed test was not found among the test items, # do not skip any tests. if failed_index is None: self.report_status = "previously failed test not found, not skipping." else: self.report_status = f"skipping {failed_index} already passed items." deselected = items[:failed_index] del items[:failed_index] config.hook.pytest_deselected(items=deselected) def pytest_runtest_logreport(self, report: TestReport) -> None: if report.failed: if self.skip: # Remove test from the failed ones (if it exists) and unset the skip option # to make sure the following tests will not be skipped. if report.nodeid == self.lastfailed: self.lastfailed = None self.skip = False else: # Mark test as the last failing and interrupt the test session. self.lastfailed = report.nodeid assert self.session is not None self.session.shouldstop = ( "Test failed, continuing from this test next run." ) else: # If the test was actually run and did pass. if report.when == "call": # Remove test from the failed ones, if exists. if report.nodeid == self.lastfailed: self.lastfailed = None def pytest_report_collectionfinish(self) -> Optional[str]: if self.config.getoption("verbose") >= 0 and self.report_status: return f"stepwise: {self.report_status}" return None def pytest_sessionfinish(self) -> None: if hasattr(self.config, "workerinput"): # Do not update cache if this process is a xdist worker to prevent # race conditions (#10641). return self.cache.set(STEPWISE_CACHE_DIR, self.lastfailed)
.
Edit
..
Edit
__init__.py
Edit
__pycache__
Edit
_argcomplete.py
Edit
_code
Edit
_io
Edit
_py
Edit
_version.py
Edit
assertion
Edit
cacheprovider.py
Edit
capture.py
Edit
compat.py
Edit
config
Edit
debugging.py
Edit
deprecated.py
Edit
doctest.py
Edit
faulthandler.py
Edit
fixtures.py
Edit
freeze_support.py
Edit
helpconfig.py
Edit
hookspec.py
Edit
junitxml.py
Edit
legacypath.py
Edit
logging.py
Edit
main.py
Edit
mark
Edit
monkeypatch.py
Edit
nodes.py
Edit
nose.py
Edit
outcomes.py
Edit
pastebin.py
Edit
pathlib.py
Edit
py.typed
Edit
pytester.py
Edit
pytester_assertions.py
Edit
python.py
Edit
python_api.py
Edit
python_path.py
Edit
recwarn.py
Edit
reports.py
Edit
runner.py
Edit
scope.py
Edit
setuponly.py
Edit
setupplan.py
Edit
skipping.py
Edit
stash.py
Edit
stepwise.py
Edit
terminal.py
Edit
threadexception.py
Edit
timing.py
Edit
tmpdir.py
Edit
unittest.py
Edit
unraisableexception.py
Edit
warning_types.py
Edit
warnings.py
Edit