Skeleton command line program.
(
config: Config, doit: Callable[[Config, "Session"], Optional[Union[int, ExitCode]]]
)
| 253 | |
| 254 | |
| 255 | def wrap_session( |
| 256 | config: Config, doit: Callable[[Config, "Session"], Optional[Union[int, ExitCode]]] |
| 257 | ) -> Union[int, ExitCode]: |
| 258 | """Skeleton command line program.""" |
| 259 | session = Session.from_config(config) |
| 260 | session.exitstatus = ExitCode.OK |
| 261 | initstate = 0 |
| 262 | try: |
| 263 | try: |
| 264 | config._do_configure() |
| 265 | initstate = 1 |
| 266 | config.hook.pytest_sessionstart(session=session) |
| 267 | initstate = 2 |
| 268 | session.exitstatus = doit(config, session) or 0 |
| 269 | except UsageError: |
| 270 | session.exitstatus = ExitCode.USAGE_ERROR |
| 271 | raise |
| 272 | except Failed: |
| 273 | session.exitstatus = ExitCode.TESTS_FAILED |
| 274 | except (KeyboardInterrupt, exit.Exception): |
| 275 | excinfo = _pytest._code.ExceptionInfo.from_current() |
| 276 | exitstatus: Union[int, ExitCode] = ExitCode.INTERRUPTED |
| 277 | if isinstance(excinfo.value, exit.Exception): |
| 278 | if excinfo.value.returncode is not None: |
| 279 | exitstatus = excinfo.value.returncode |
| 280 | if initstate < 2: |
| 281 | sys.stderr.write(f"{excinfo.typename}: {excinfo.value.msg}\n") |
| 282 | config.hook.pytest_keyboard_interrupt(excinfo=excinfo) |
| 283 | session.exitstatus = exitstatus |
| 284 | except BaseException: |
| 285 | session.exitstatus = ExitCode.INTERNAL_ERROR |
| 286 | excinfo = _pytest._code.ExceptionInfo.from_current() |
| 287 | try: |
| 288 | config.notify_exception(excinfo, config.option) |
| 289 | except exit.Exception as exc: |
| 290 | if exc.returncode is not None: |
| 291 | session.exitstatus = exc.returncode |
| 292 | sys.stderr.write(f"{type(exc).__name__}: {exc}\n") |
| 293 | else: |
| 294 | if isinstance(excinfo.value, SystemExit): |
| 295 | sys.stderr.write("mainloop: caught unexpected SystemExit!\n") |
| 296 | |
| 297 | finally: |
| 298 | # Explicitly break reference cycle. |
| 299 | excinfo = None # type: ignore |
| 300 | os.chdir(session.startpath) |
| 301 | if initstate >= 2: |
| 302 | try: |
| 303 | config.hook.pytest_sessionfinish( |
| 304 | session=session, exitstatus=session.exitstatus |
| 305 | ) |
| 306 | except exit.Exception as exc: |
| 307 | if exc.returncode is not None: |
| 308 | session.exitstatus = exc.returncode |
| 309 | sys.stderr.write(f"{type(exc).__name__}: {exc}\n") |
| 310 | config._ensure_unconfigure() |
| 311 | return session.exitstatus |
| 312 |
no test coverage detected