Coverage for /home/tbone/.local/share/hatch/env/virtual/importnb-aVRh-lqt/test.interactive/lib/python3.9/site-packages/importnb/ipython_extension.py: 36%
67 statements
« prev ^ index » next coverage.py v6.5.0, created at 2022-10-03 09:31 -0700
« prev ^ index » next coverage.py v6.5.0, created at 2022-10-03 09:31 -0700
1# coding: utf-8
2"""# `importnb` Jupyter magic extensions
3"""
5""" %importnb --stdout --stderr --display --shell
6"""
8import argparse
9import inspect
10from functools import partial
11from importlib import import_module
13import pkg_resources
16def get_module_object(str):
17 module, object = str.split(":", 1)
18 return getattr(import_module(module), object)
21parser = argparse.ArgumentParser(
22 description="""Define the importnb loader properties."""
23)
24parser.add_argument("--cls", type=get_module_object, default="importnb:Notebook")
25parser.add_argument("--fuzzy", action="store_true")
27try:
28 from IPython.core import magic_arguments
29 from IPython.core.magic import (
30 Magics,
31 magics_class,
32 line_magic,
33 cell_magic,
34 line_cell_magic,
35 )
37 __IPYTHON__ = True
38except ImportError:
39 __IPYTHON__ = False
42class ImportNbExtensionBase:
43 loaders = None
45 def __init__(self, shell, loader=None):
46 self.loaders = []
47 # A default loader to install
48 if loader:
49 self.loaders.append(loader(position=-1).__enter__())
52if __IPYTHON__:
54 @magics_class
55 class ImportNbExtension(Magics, ImportNbExtensionBase):
56 loaders = None
58 def __init__(self, shell, loader=None):
59 Magics.__init__(self, shell)
60 ImportNbExtensionBase.__init__(self, shell, loader)
62 @line_cell_magic
63 def importnb(self, line, cell=None):
64 if line.strip() == "pop":
65 return self.pop()
66 module.__package__
68 details = vars(parser.parse_args(line.split()))
69 self.loaders.append(details.pop("cls")(**details))
71 if cell is None:
72 self.loaders[-1].__enter__()
73 return
75 with self.loaders.pop(-1):
76 self.parent.run_cell(cell)
78 def unload(self):
79 while self.loaders:
80 self.pop()
82 def pop(self):
83 self.loaders.pop().__exit__(None, None, None)
86else:
88 class ImportNbExtension(ImportNbExtensionBase):
89 ...
92manager = None
95def IPYTHON_MAIN():
96 """Decide if the Ipython command line is running code."""
97 import pkg_resources
99 runner_frame = inspect.getouterframes(inspect.currentframe())[-2]
100 return (
101 getattr(runner_frame, "function", None)
102 == pkg_resources.load_entry_point(
103 "ipython", "console_scripts", "ipython"
104 ).__name__
105 )
108def load_ipython_extension(ip=None):
109 global manager, module
110 if IPYTHON_MAIN():
111 from .parameterize import Parameterize as Notebook
112 else:
113 from .loader import Notebook
115 # Auto loading only works in IPython and
116 # we only read need it when there are parameters.
117 manager = ImportNbExtension(ip, Notebook)
119 if ip:
120 ip.register_magics(manager)
121 ip.user_ns.update(__path__=[str(__import__("pathlib").Path().absolute())])
122 from .completer import load_ipython_extension
124 load_ipython_extension(ip)
126 ip.user_ns["reload"] = __import__("importlib").reload
129def unload_ipython_extension(ip=None):
130 global manager
131 ip and manager and manager.unload()