Show More
@@ -327,22 +327,6 b' class MagicsManager(Configurable):' | |||
|
327 | 327 | """Return descriptive string with automagic status.""" |
|
328 | 328 | return self._auto_status[self.auto_magic] |
|
329 | 329 | |
|
330 | def lsmagic_info(self): | |
|
331 | """Return the magics as a list of dicts""" | |
|
332 | magic_list = [] | |
|
333 | for m_type in self.magics: | |
|
334 | for m_name,mgc in self.magics[m_type].items(): | |
|
335 | try: | |
|
336 | magic_list.append({'name':m_name,'type':m_type,'class':mgc.im_class.__name__}) | |
|
337 | except AttributeError: | |
|
338 | magic_list.append({'name':m_name,'type':m_type,'class':'Other'}) | |
|
339 | return magic_list | |
|
340 | ||
|
341 | def lsmagic_json(self): | |
|
342 | """Wrap lsmagic_info() in a JSON object""" | |
|
343 | from IPython.display import JSON | |
|
344 | return JSON(json.dumps(self.lsmagic_info())) | |
|
345 | ||
|
346 | 330 | def lsmagic(self): |
|
347 | 331 | """Return a dict of currently available magic functions. |
|
348 | 332 |
@@ -15,6 +15,7 b' from __future__ import print_function' | |||
|
15 | 15 | |
|
16 | 16 | # Stdlib |
|
17 | 17 | import io |
|
18 | import json | |
|
18 | 19 | import sys |
|
19 | 20 | from pprint import pformat |
|
20 | 21 | |
@@ -33,6 +34,55 b' from IPython.utils.warn import warn, error' | |||
|
33 | 34 | # Magics class implementation |
|
34 | 35 | #----------------------------------------------------------------------------- |
|
35 | 36 | |
|
37 | class MagicsDisplay(object): | |
|
38 | def __init__(self, magics_manager): | |
|
39 | self.magics_manager = magics_manager | |
|
40 | ||
|
41 | def _lsmagic(self): | |
|
42 | """The main implementation of the %lsmagic""" | |
|
43 | mesc = magic_escapes['line'] | |
|
44 | cesc = magic_escapes['cell'] | |
|
45 | mman = self.magics_manager | |
|
46 | magics = mman.lsmagic() | |
|
47 | out = ['Available line magics:', | |
|
48 | mesc + (' '+mesc).join(sorted(magics['line'])), | |
|
49 | '', | |
|
50 | 'Available cell magics:', | |
|
51 | cesc + (' '+cesc).join(sorted(magics['cell'])), | |
|
52 | '', | |
|
53 | mman.auto_status()] | |
|
54 | return '\n'.join(out) | |
|
55 | ||
|
56 | def _repr_pretty_(self, p, cycle): | |
|
57 | p.text(self._lsmagic()) | |
|
58 | ||
|
59 | def __str__(self): | |
|
60 | return self._lsmagic() | |
|
61 | ||
|
62 | def _jsonable(self): | |
|
63 | """turn magics dict into jsonable dict of the same structure | |
|
64 | ||
|
65 | replaces object instances with their class names as strings | |
|
66 | """ | |
|
67 | magic_dict = {} | |
|
68 | mman = self.magics_manager | |
|
69 | magics = mman.lsmagic() | |
|
70 | for key, subdict in magics.items(): | |
|
71 | d = {} | |
|
72 | magic_dict[key] = d | |
|
73 | for name, obj in subdict.items(): | |
|
74 | try: | |
|
75 | classname = obj.im_class.__name__ | |
|
76 | except AttributeError: | |
|
77 | classname = 'Other' | |
|
78 | ||
|
79 | d[name] = classname | |
|
80 | return magic_dict | |
|
81 | ||
|
82 | def _repr_json_(self): | |
|
83 | return json.dumps(self._jsonable()) | |
|
84 | ||
|
85 | ||
|
36 | 86 | @magics_class |
|
37 | 87 | class BasicMagics(Magics): |
|
38 | 88 | """Magics that provide central IPython functionality. |
@@ -124,24 +174,10 b' class BasicMagics(Magics):' | |||
|
124 | 174 | magic_escapes['cell'], name, |
|
125 | 175 | magic_escapes['cell'], target)) |
|
126 | 176 | |
|
127 | def _lsmagic(self): | |
|
128 | mesc = magic_escapes['line'] | |
|
129 | cesc = magic_escapes['cell'] | |
|
130 | mman = self.shell.magics_manager | |
|
131 | magics = mman.lsmagic() | |
|
132 | out = ['Available line magics:', | |
|
133 | mesc + (' '+mesc).join(sorted(magics['line'])), | |
|
134 | '', | |
|
135 | 'Available cell magics:', | |
|
136 | cesc + (' '+cesc).join(sorted(magics['cell'])), | |
|
137 | '', | |
|
138 | mman.auto_status()] | |
|
139 | return '\n'.join(out) | |
|
140 | ||
|
141 | 177 | @line_magic |
|
142 | 178 | def lsmagic(self, parameter_s=''): |
|
143 | 179 | """List currently available magic functions.""" |
|
144 | print(self._lsmagic()) | |
|
180 | return MagicsDisplay(self.shell.magics_manager) | |
|
145 | 181 | |
|
146 | 182 | def _magic_docs(self, brief=False, rest=False): |
|
147 | 183 | """Return docstrings from magic functions.""" |
@@ -29,6 +29,8 b' from threading import Thread' | |||
|
29 | 29 | # System library imports |
|
30 | 30 | from IPython.external.qt import QtGui,QtCore |
|
31 | 31 | |
|
32 | from IPython.core.magic import magic_escapes | |
|
33 | ||
|
32 | 34 | def background(f): |
|
33 | 35 | """call a function in a simple thread, to prevent blocking""" |
|
34 | 36 | t = Thread(target=f) |
@@ -621,8 +623,8 b' class MainWindow(QtGui.QMainWindow):' | |||
|
621 | 623 | Parameters |
|
622 | 624 | ---------- |
|
623 | 625 | display_data : dict, |
|
624 |
dict of display_data for the magics |
|
|
625 |
Expects json data, as the result of |
|
|
626 | dict of display_data for the magics dict of a MagicsManager. | |
|
627 | Expects json data, as the result of %lsmagic | |
|
626 | 628 | |
|
627 | 629 | """ |
|
628 | 630 | for k,v in self._magic_menu_dict.items(): |
@@ -632,20 +634,19 b' class MainWindow(QtGui.QMainWindow):' | |||
|
632 | 634 | if not display_data: |
|
633 | 635 | return |
|
634 | 636 | |
|
635 | mlist = json.loads(display_data['data'].get('application/json', [])) | |
|
636 | ||
|
637 | for magic in mlist: | |
|
638 | cell = (magic['type'] == 'cell') | |
|
639 | name = magic['name'] | |
|
640 | mclass = magic['class'] | |
|
641 | if cell : | |
|
642 | prefix='%%' | |
|
643 | else : | |
|
644 | prefix='%' | |
|
645 | magic_menu = self._get_magic_menu(mclass) | |
|
637 | if display_data['status'] != 'ok': | |
|
638 | self.log.warn("%%lsmagic user-expression failed: %s" % display_data) | |
|
639 | return | |
|
646 | 640 | |
|
647 | pmagic = '%s%s'%(prefix,name) | |
|
641 | mdict = json.loads(display_data['data'].get('application/json', {})) | |
|
648 | 642 | |
|
643 | for mtype in sorted(mdict): | |
|
644 | subdict = mdict[mtype] | |
|
645 | prefix = magic_escapes[mtype] | |
|
646 | for name in sorted(subdict): | |
|
647 | mclass = subdict[name] | |
|
648 | magic_menu = self._get_magic_menu(mclass) | |
|
649 | pmagic = prefix + name | |
|
649 | 650 | xaction = QtGui.QAction(pmagic, |
|
650 | 651 | self, |
|
651 | 652 | triggered=self._make_dynamic_magic(pmagic) |
@@ -660,7 +661,7 b' class MainWindow(QtGui.QMainWindow):' | |||
|
660 | 661 | menu with the list received back |
|
661 | 662 | |
|
662 | 663 | """ |
|
663 |
self.active_frontend._silent_exec_callback('get_ipython().magic |
|
|
664 | self.active_frontend._silent_exec_callback('get_ipython().magic("lsmagic")', | |
|
664 | 665 | self.populate_all_magic_menu) |
|
665 | 666 | |
|
666 | 667 | def _get_magic_menu(self,menuidentifier, menulabel=None): |
General Comments 0
You need to be logged in to leave comments.
Login now