Spaces:
No application file
No application file
| import builtins | |
| import inspect | |
| import os | |
| import pathlib | |
| import shutil | |
| import sys | |
| import types | |
| import pytest | |
| # Must register before it gets imported | |
| pytest.register_assert_rewrite("IPython.testing.tools") | |
| from .testing import tools | |
| def pytest_collection_modifyitems(items): | |
| """This function is automatically run by pytest passing all collected test | |
| functions. | |
| We use it to add asyncio marker to all async tests and assert we don't use | |
| test functions that are async generators which wouldn't make sense. | |
| """ | |
| for item in items: | |
| if inspect.iscoroutinefunction(item.obj): | |
| item.add_marker("asyncio") | |
| assert not inspect.isasyncgenfunction(item.obj) | |
| def get_ipython(): | |
| from .terminal.interactiveshell import TerminalInteractiveShell | |
| if TerminalInteractiveShell._instance: | |
| return TerminalInteractiveShell.instance() | |
| config = tools.default_config() | |
| config.TerminalInteractiveShell.simple_prompt = True | |
| # Create and initialize our test-friendly IPython instance. | |
| shell = TerminalInteractiveShell.instance(config=config) | |
| return shell | |
| def work_path(): | |
| path = pathlib.Path("./tmp-ipython-pytest-profiledir") | |
| os.environ["IPYTHONDIR"] = str(path.absolute()) | |
| if path.exists(): | |
| raise ValueError('IPython dir temporary path already exists ! Did previous test run exit successfully ?') | |
| path.mkdir() | |
| yield | |
| shutil.rmtree(str(path.resolve())) | |
| def nopage(strng, start=0, screen_lines=0, pager_cmd=None): | |
| if isinstance(strng, dict): | |
| strng = strng.get("text/plain", "") | |
| print(strng) | |
| def xsys(self, cmd): | |
| """Replace the default system call with a capturing one for doctest. | |
| """ | |
| # We use getoutput, but we need to strip it because pexpect captures | |
| # the trailing newline differently from commands.getoutput | |
| print(self.getoutput(cmd, split=False, depth=1).rstrip(), end="", file=sys.stdout) | |
| sys.stdout.flush() | |
| # for things to work correctly we would need this as a session fixture; | |
| # unfortunately this will fail on some test that get executed as _collection_ | |
| # time (before the fixture run), in particular parametrized test that contain | |
| # yields. so for now execute at import time. | |
| #@pytest.fixture(autouse=True, scope='session') | |
| def inject(): | |
| builtins.get_ipython = get_ipython | |
| builtins._ip = get_ipython() | |
| builtins.ip = get_ipython() | |
| builtins.ip.system = types.MethodType(xsys, ip) | |
| builtins.ip.builtin_trap.activate() | |
| from .core import page | |
| page.pager_page = nopage | |
| # yield | |
| inject() | |