Coverage for src/importnb/ipython_extension.py: 36%
67 statements
« prev ^ index » next coverage.py v6.5.0, created at 2022-10-03 13:38 -0700
« prev ^ index » next coverage.py v6.5.0, created at 2022-10-03 13:38 -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(description="""Define the importnb loader properties.""")
22parser.add_argument("--cls", type=get_module_object, default="importnb:Notebook")
23parser.add_argument("--fuzzy", action="store_true")
25try:
26 from IPython.core import magic_arguments
27 from IPython.core.magic import (
28 Magics,
29 cell_magic,
30 line_cell_magic,
31 line_magic,
32 magics_class,
33 )
35 __IPYTHON__ = True
36except ImportError:
37 __IPYTHON__ = False
40class ImportNbExtensionBase:
41 loaders = None
43 def __init__(self, shell, loader=None):
44 self.loaders = []
45 # A default loader to install
46 if loader:
47 self.loaders.append(loader(position=-1).__enter__())
50if __IPYTHON__:
52 @magics_class
53 class ImportNbExtension(Magics, ImportNbExtensionBase):
54 loaders = None
56 def __init__(self, shell, loader=None):
57 Magics.__init__(self, shell)
58 ImportNbExtensionBase.__init__(self, shell, loader)
60 @line_cell_magic
61 def importnb(self, line, cell=None):
62 if line.strip() == "pop":
63 return self.pop()
64 module.__package__
66 details = vars(parser.parse_args(line.split()))
67 self.loaders.append(details.pop("cls")(**details))
69 if cell is None:
70 self.loaders[-1].__enter__()
71 return
73 with self.loaders.pop(-1):
74 self.parent.run_cell(cell)
76 def unload(self):
77 while self.loaders:
78 self.pop()
80 def pop(self):
81 self.loaders.pop().__exit__(None, None, None)
83else:
85 class ImportNbExtension(ImportNbExtensionBase):
86 ...
89manager = None
92def IPYTHON_MAIN():
93 """Decide if the Ipython command line is running code."""
94 import pkg_resources
96 runner_frame = inspect.getouterframes(inspect.currentframe())[-2]
97 return (
98 getattr(runner_frame, "function", None)
99 == pkg_resources.load_entry_point("ipython", "console_scripts", "ipython").__name__
100 )
103def load_ipython_extension(ip=None):
104 global manager, module
105 if IPYTHON_MAIN():
106 from .parameterize import Parameterize as Notebook
107 else:
108 from .loader import Notebook
110 # Auto loading only works in IPython and
111 # we only read need it when there are parameters.
112 manager = ImportNbExtension(ip, Notebook)
114 if ip:
115 ip.register_magics(manager)
116 ip.user_ns.update(__path__=[str(__import__("pathlib").Path().absolute())])
117 from .completer import load_ipython_extension
119 load_ipython_extension(ip)
121 ip.user_ns["reload"] = __import__("importlib").reload
124def unload_ipython_extension(ip=None):
125 global manager
126 ip and manager and manager.unload()