| 174 | |
| 175 | |
| 176 | def _init_runner_class() -> Type["doctest.DocTestRunner"]: |
| 177 | import doctest |
| 178 | |
| 179 | class PytestDoctestRunner(doctest.DebugRunner): |
| 180 | """Runner to collect failures. |
| 181 | |
| 182 | Note that the out variable in this case is a list instead of a |
| 183 | stdout-like object. |
| 184 | """ |
| 185 | |
| 186 | def __init__( |
| 187 | self, |
| 188 | checker: Optional["doctest.OutputChecker"] = None, |
| 189 | verbose: Optional[bool] = None, |
| 190 | optionflags: int = 0, |
| 191 | continue_on_failure: bool = True, |
| 192 | ) -> None: |
| 193 | super().__init__(checker=checker, verbose=verbose, optionflags=optionflags) |
| 194 | self.continue_on_failure = continue_on_failure |
| 195 | |
| 196 | def report_failure( |
| 197 | self, |
| 198 | out, |
| 199 | test: "doctest.DocTest", |
| 200 | example: "doctest.Example", |
| 201 | got: str, |
| 202 | ) -> None: |
| 203 | failure = doctest.DocTestFailure(test, example, got) |
| 204 | if self.continue_on_failure: |
| 205 | out.append(failure) |
| 206 | else: |
| 207 | raise failure |
| 208 | |
| 209 | def report_unexpected_exception( |
| 210 | self, |
| 211 | out, |
| 212 | test: "doctest.DocTest", |
| 213 | example: "doctest.Example", |
| 214 | exc_info: Tuple[Type[BaseException], BaseException, types.TracebackType], |
| 215 | ) -> None: |
| 216 | if isinstance(exc_info[1], OutcomeException): |
| 217 | raise exc_info[1] |
| 218 | if isinstance(exc_info[1], bdb.BdbQuit): |
| 219 | outcomes.exit("Quitting debugger") |
| 220 | failure = doctest.UnexpectedException(test, example, exc_info) |
| 221 | if self.continue_on_failure: |
| 222 | out.append(failure) |
| 223 | else: |
| 224 | raise failure |
| 225 | |
| 226 | return PytestDoctestRunner |
| 227 | |
| 228 | |
| 229 | def _get_runner( |