##// END OF EJS Templates
%lsmagic returns a RichRepr of the magics dict...
MinRK -
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 list.
625 Expects json data, as the result of MagicsManager.lsmagic_json()
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():
@@ -631,27 +633,26 b' class MainWindow(QtGui.QMainWindow):'
631 633
632 634 if not display_data:
633 635 return
634
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)
646
647 pmagic = '%s%s'%(prefix,name)
648
649 xaction = QtGui.QAction(pmagic,
650 self,
651 triggered=self._make_dynamic_magic(pmagic)
652 )
653 magic_menu.addAction(xaction)
654 self.all_magic_menu.addAction(xaction)
636
637 if display_data['status'] != 'ok':
638 self.log.warn("%%lsmagic user-expression failed: %s" % display_data)
639 return
640
641 mdict = json.loads(display_data['data'].get('application/json', {}))
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
650 xaction = QtGui.QAction(pmagic,
651 self,
652 triggered=self._make_dynamic_magic(pmagic)
653 )
654 magic_menu.addAction(xaction)
655 self.all_magic_menu.addAction(xaction)
655 656
656 657 def update_all_magic_menu(self):
657 658 """ Update the list of magics in the "All Magics..." Menu
@@ -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().magics_manager.lsmagic_json()',
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