Skeleton command line program.
(
config: Config, doit: Callable[[Config, Session], int | ExitCode | None]
)
| 315 | |
| 316 | |
| 317 | def wrap_session( |
| 318 | config: Config, doit: Callable[[Config, Session], int | ExitCode | None] |
| 319 | ) -> int | ExitCode: |
| 320 | class="st">""class="st">"Skeleton command line program."class="st">"" |
| 321 | session = Session.from_config(config) |
| 322 | session.exitstatus = ExitCode.OK |
| 323 | initstate = 0 |
| 324 | try: |
| 325 | try: |
| 326 | config._do_configure() |
| 327 | initstate = 1 |
| 328 | config.hook.pytest_sessionstart(session=session) |
| 329 | initstate = 2 |
| 330 | session.exitstatus = doit(config, session) or 0 |
| 331 | except UsageError: |
| 332 | session.exitstatus = ExitCode.USAGE_ERROR |
| 333 | raise |
| 334 | except Failed: |
| 335 | session.exitstatus = ExitCode.TESTS_FAILED |
| 336 | except (KeyboardInterrupt, exit.Exception): |
| 337 | excinfo = _pytest._code.ExceptionInfo.from_current() |
| 338 | exitstatus: int | ExitCode = ExitCode.INTERRUPTED |
| 339 | if isinstance(excinfo.value, exit.Exception): |
| 340 | if excinfo.value.returncode is not None: |
| 341 | exitstatus = excinfo.value.returncode |
| 342 | if initstate < 2: |
| 343 | sys.stderr.write(fclass="st">"{excinfo.typename}: {excinfo.value.msg}\n") |
| 344 | config.hook.pytest_keyboard_interrupt(excinfo=excinfo) |
| 345 | session.exitstatus = exitstatus |
| 346 | except BaseException: |
| 347 | session.exitstatus = ExitCode.INTERNAL_ERROR |
| 348 | excinfo = _pytest._code.ExceptionInfo.from_current() |
| 349 | try: |
| 350 | config.notify_exception(excinfo, config.option) |
| 351 | except exit.Exception as exc: |
| 352 | if exc.returncode is not None: |
| 353 | session.exitstatus = exc.returncode |
| 354 | sys.stderr.write(fclass="st">"{type(exc).__name__}: {exc}\n") |
| 355 | else: |
| 356 | if isinstance(excinfo.value, SystemExit): |
| 357 | sys.stderr.write(class="st">"mainloop: caught unexpected SystemExit!\n") |
| 358 | |
| 359 | finally: |
| 360 | class="cm"># Explicitly break reference cycle. |
| 361 | excinfo = None class="cm"># type: ignore |
| 362 | os.chdir(session.startpath) |
| 363 | if initstate >= 2: |
| 364 | try: |
| 365 | config.hook.pytest_sessionfinish( |
| 366 | session=session, exitstatus=session.exitstatus |
| 367 | ) |
| 368 | except exit.Exception as exc: |
| 369 | if exc.returncode is not None: |
| 370 | session.exitstatus = exc.returncode |
| 371 | sys.stderr.write(fclass="st">"{type(exc).__name__}: {exc}\n") |
| 372 | config._ensure_unconfigure() |
| 373 | return session.exitstatus |
| 374 |
no test coverage detected