|
import builtins |
|
import inspect |
|
import os |
|
import pathlib |
|
import shutil |
|
import sys |
|
import types |
|
|
|
import pytest |
|
|
|
|
|
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 |
|
|
|
|
|
shell = TerminalInteractiveShell.instance(config=config) |
|
return shell |
|
|
|
|
|
@pytest.fixture(scope='session', autouse=True) |
|
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. |
|
""" |
|
|
|
|
|
print(self.getoutput(cmd, split=False, depth=1).rstrip(), end="", file=sys.stdout) |
|
sys.stdout.flush() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
inject() |
|
|