##// END OF EJS Templates
allow multiple instances of magics...
MinRK -
Show More
@@ -1,586 +1,592 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """Magic functions for InteractiveShell.
2 """Magic functions for InteractiveShell.
3 """
3 """
4
4
5 #-----------------------------------------------------------------------------
5 #-----------------------------------------------------------------------------
6 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
6 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
7 # Copyright (C) 2001 Fernando Perez <fperez@colorado.edu>
7 # Copyright (C) 2001 Fernando Perez <fperez@colorado.edu>
8 # Copyright (C) 2008 The IPython Development Team
8 # Copyright (C) 2008 The IPython Development Team
9
9
10 # Distributed under the terms of the BSD License. The full license is in
10 # Distributed under the terms of the BSD License. The full license is in
11 # the file COPYING, distributed as part of this software.
11 # the file COPYING, distributed as part of this software.
12 #-----------------------------------------------------------------------------
12 #-----------------------------------------------------------------------------
13
13
14 #-----------------------------------------------------------------------------
14 #-----------------------------------------------------------------------------
15 # Imports
15 # Imports
16 #-----------------------------------------------------------------------------
16 #-----------------------------------------------------------------------------
17 # Stdlib
17 # Stdlib
18 import os
18 import os
19 import re
19 import re
20 import sys
20 import sys
21 import types
21 import types
22 from getopt import getopt, GetoptError
22 from getopt import getopt, GetoptError
23
23
24 # Our own
24 # Our own
25 from IPython.config.configurable import Configurable
25 from IPython.config.configurable import Configurable
26 from IPython.core import oinspect
26 from IPython.core import oinspect
27 from IPython.core.error import UsageError
27 from IPython.core.error import UsageError
28 from IPython.core.inputsplitter import ESC_MAGIC
28 from IPython.core.inputsplitter import ESC_MAGIC
29 from IPython.external.decorator import decorator
29 from IPython.external.decorator import decorator
30 from IPython.utils.ipstruct import Struct
30 from IPython.utils.ipstruct import Struct
31 from IPython.utils.process import arg_split
31 from IPython.utils.process import arg_split
32 from IPython.utils.text import dedent
32 from IPython.utils.text import dedent
33 from IPython.utils.traitlets import Bool, Dict, Instance, MetaHasTraits
33 from IPython.utils.traitlets import Bool, Dict, Instance, MetaHasTraits
34 from IPython.utils.warn import error, warn
34 from IPython.utils.warn import error, warn
35
35
36 #-----------------------------------------------------------------------------
36 #-----------------------------------------------------------------------------
37 # Globals
37 # Globals
38 #-----------------------------------------------------------------------------
38 #-----------------------------------------------------------------------------
39
39
40 # A dict we'll use for each class that has magics, used as temporary storage to
40 # A dict we'll use for each class that has magics, used as temporary storage to
41 # pass information between the @line/cell_magic method decorators and the
41 # pass information between the @line/cell_magic method decorators and the
42 # @magics_class class decorator, because the method decorators have no
42 # @magics_class class decorator, because the method decorators have no
43 # access to the class when they run. See for more details:
43 # access to the class when they run. See for more details:
44 # http://stackoverflow.com/questions/2366713/can-a-python-decorator-of-an-instance-method-access-the-class
44 # http://stackoverflow.com/questions/2366713/can-a-python-decorator-of-an-instance-method-access-the-class
45
45
46 magics = dict(line={}, cell={})
46 magics = dict(line={}, cell={})
47
47
48 magic_kinds = ('line', 'cell')
48 magic_kinds = ('line', 'cell')
49 magic_spec = ('line', 'cell', 'line_cell')
49 magic_spec = ('line', 'cell', 'line_cell')
50
50
51 #-----------------------------------------------------------------------------
51 #-----------------------------------------------------------------------------
52 # Utility classes and functions
52 # Utility classes and functions
53 #-----------------------------------------------------------------------------
53 #-----------------------------------------------------------------------------
54
54
55 class Bunch: pass
55 class Bunch: pass
56
56
57
57
58 def on_off(tag):
58 def on_off(tag):
59 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
59 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
60 return ['OFF','ON'][tag]
60 return ['OFF','ON'][tag]
61
61
62
62
63 def compress_dhist(dh):
63 def compress_dhist(dh):
64 """Compress a directory history into a new one with at most 20 entries.
64 """Compress a directory history into a new one with at most 20 entries.
65
65
66 Return a new list made from the first and last 10 elements of dhist after
66 Return a new list made from the first and last 10 elements of dhist after
67 removal of duplicates.
67 removal of duplicates.
68 """
68 """
69 head, tail = dh[:-10], dh[-10:]
69 head, tail = dh[:-10], dh[-10:]
70
70
71 newhead = []
71 newhead = []
72 done = set()
72 done = set()
73 for h in head:
73 for h in head:
74 if h in done:
74 if h in done:
75 continue
75 continue
76 newhead.append(h)
76 newhead.append(h)
77 done.add(h)
77 done.add(h)
78
78
79 return newhead + tail
79 return newhead + tail
80
80
81
81
82 def needs_local_scope(func):
82 def needs_local_scope(func):
83 """Decorator to mark magic functions which need to local scope to run."""
83 """Decorator to mark magic functions which need to local scope to run."""
84 func.needs_local_scope = True
84 func.needs_local_scope = True
85 return func
85 return func
86
86
87 #-----------------------------------------------------------------------------
87 #-----------------------------------------------------------------------------
88 # Class and method decorators for registering magics
88 # Class and method decorators for registering magics
89 #-----------------------------------------------------------------------------
89 #-----------------------------------------------------------------------------
90
90
91 def magics_class(cls):
91 def magics_class(cls):
92 """Class decorator for all subclasses of the main Magics class.
92 """Class decorator for all subclasses of the main Magics class.
93
93
94 Any class that subclasses Magics *must* also apply this decorator, to
94 Any class that subclasses Magics *must* also apply this decorator, to
95 ensure that all the methods that have been decorated as line/cell magics
95 ensure that all the methods that have been decorated as line/cell magics
96 get correctly registered in the class instance. This is necessary because
96 get correctly registered in the class instance. This is necessary because
97 when method decorators run, the class does not exist yet, so they
97 when method decorators run, the class does not exist yet, so they
98 temporarily store their information into a module global. Application of
98 temporarily store their information into a module global. Application of
99 this class decorator copies that global data to the class instance and
99 this class decorator copies that global data to the class instance and
100 clears the global.
100 clears the global.
101
101
102 Obviously, this mechanism is not thread-safe, which means that the
102 Obviously, this mechanism is not thread-safe, which means that the
103 *creation* of subclasses of Magic should only be done in a single-thread
103 *creation* of subclasses of Magic should only be done in a single-thread
104 context. Instantiation of the classes has no restrictions. Given that
104 context. Instantiation of the classes has no restrictions. Given that
105 these classes are typically created at IPython startup time and before user
105 these classes are typically created at IPython startup time and before user
106 application code becomes active, in practice this should not pose any
106 application code becomes active, in practice this should not pose any
107 problems.
107 problems.
108 """
108 """
109 cls.registered = True
109 cls.registered = True
110 cls.magics = dict(line = magics['line'],
110 cls.magics = dict(line = magics['line'],
111 cell = magics['cell'])
111 cell = magics['cell'])
112 magics['line'] = {}
112 magics['line'] = {}
113 magics['cell'] = {}
113 magics['cell'] = {}
114 return cls
114 return cls
115
115
116
116
117 def record_magic(dct, magic_kind, magic_name, func):
117 def record_magic(dct, magic_kind, magic_name, func):
118 """Utility function to store a function as a magic of a specific kind.
118 """Utility function to store a function as a magic of a specific kind.
119
119
120 Parameters
120 Parameters
121 ----------
121 ----------
122 dct : dict
122 dct : dict
123 A dictionary with 'line' and 'cell' subdicts.
123 A dictionary with 'line' and 'cell' subdicts.
124
124
125 magic_kind : str
125 magic_kind : str
126 Kind of magic to be stored.
126 Kind of magic to be stored.
127
127
128 magic_name : str
128 magic_name : str
129 Key to store the magic as.
129 Key to store the magic as.
130
130
131 func : function
131 func : function
132 Callable object to store.
132 Callable object to store.
133 """
133 """
134 if magic_kind == 'line_cell':
134 if magic_kind == 'line_cell':
135 dct['line'][magic_name] = dct['cell'][magic_name] = func
135 dct['line'][magic_name] = dct['cell'][magic_name] = func
136 else:
136 else:
137 dct[magic_kind][magic_name] = func
137 dct[magic_kind][magic_name] = func
138
138
139
139
140 def validate_type(magic_kind):
140 def validate_type(magic_kind):
141 """Ensure that the given magic_kind is valid.
141 """Ensure that the given magic_kind is valid.
142
142
143 Check that the given magic_kind is one of the accepted spec types (stored
143 Check that the given magic_kind is one of the accepted spec types (stored
144 in the global `magic_spec`), raise ValueError otherwise.
144 in the global `magic_spec`), raise ValueError otherwise.
145 """
145 """
146 if magic_kind not in magic_spec:
146 if magic_kind not in magic_spec:
147 raise ValueError('magic_kind must be one of %s, %s given' %
147 raise ValueError('magic_kind must be one of %s, %s given' %
148 magic_kinds, magic_kind)
148 magic_kinds, magic_kind)
149
149
150
150
151 # The docstrings for the decorator below will be fairly similar for the two
151 # The docstrings for the decorator below will be fairly similar for the two
152 # types (method and function), so we generate them here once and reuse the
152 # types (method and function), so we generate them here once and reuse the
153 # templates below.
153 # templates below.
154 _docstring_template = \
154 _docstring_template = \
155 """Decorate the given {0} as {1} magic.
155 """Decorate the given {0} as {1} magic.
156
156
157 The decorator can be used with or without arguments, as follows.
157 The decorator can be used with or without arguments, as follows.
158
158
159 i) without arguments: it will create a {1} magic named as the {0} being
159 i) without arguments: it will create a {1} magic named as the {0} being
160 decorated::
160 decorated::
161
161
162 @deco
162 @deco
163 def foo(...)
163 def foo(...)
164
164
165 will create a {1} magic named `foo`.
165 will create a {1} magic named `foo`.
166
166
167 ii) with one string argument: which will be used as the actual name of the
167 ii) with one string argument: which will be used as the actual name of the
168 resulting magic::
168 resulting magic::
169
169
170 @deco('bar')
170 @deco('bar')
171 def foo(...)
171 def foo(...)
172
172
173 will create a {1} magic named `bar`.
173 will create a {1} magic named `bar`.
174 """
174 """
175
175
176 # These two are decorator factories. While they are conceptually very similar,
176 # These two are decorator factories. While they are conceptually very similar,
177 # there are enough differences in the details that it's simpler to have them
177 # there are enough differences in the details that it's simpler to have them
178 # written as completely standalone functions rather than trying to share code
178 # written as completely standalone functions rather than trying to share code
179 # and make a single one with convoluted logic.
179 # and make a single one with convoluted logic.
180
180
181 def _method_magic_marker(magic_kind):
181 def _method_magic_marker(magic_kind):
182 """Decorator factory for methods in Magics subclasses.
182 """Decorator factory for methods in Magics subclasses.
183 """
183 """
184
184
185 validate_type(magic_kind)
185 validate_type(magic_kind)
186
186
187 # This is a closure to capture the magic_kind. We could also use a class,
187 # This is a closure to capture the magic_kind. We could also use a class,
188 # but it's overkill for just that one bit of state.
188 # but it's overkill for just that one bit of state.
189 def magic_deco(arg):
189 def magic_deco(arg):
190 call = lambda f, *a, **k: f(*a, **k)
190 call = lambda f, *a, **k: f(*a, **k)
191
191
192 if callable(arg):
192 if callable(arg):
193 # "Naked" decorator call (just @foo, no args)
193 # "Naked" decorator call (just @foo, no args)
194 func = arg
194 func = arg
195 name = func.func_name
195 name = func.func_name
196 retval = decorator(call, func)
196 retval = decorator(call, func)
197 record_magic(magics, magic_kind, name, name)
197 record_magic(magics, magic_kind, name, name)
198 elif isinstance(arg, basestring):
198 elif isinstance(arg, basestring):
199 # Decorator called with arguments (@foo('bar'))
199 # Decorator called with arguments (@foo('bar'))
200 name = arg
200 name = arg
201 def mark(func, *a, **kw):
201 def mark(func, *a, **kw):
202 record_magic(magics, magic_kind, name, func.func_name)
202 record_magic(magics, magic_kind, name, func.func_name)
203 return decorator(call, func)
203 return decorator(call, func)
204 retval = mark
204 retval = mark
205 else:
205 else:
206 raise TypeError("Decorator can only be called with "
206 raise TypeError("Decorator can only be called with "
207 "string or function")
207 "string or function")
208 return retval
208 return retval
209
209
210 # Ensure the resulting decorator has a usable docstring
210 # Ensure the resulting decorator has a usable docstring
211 magic_deco.__doc__ = _docstring_template.format('method', magic_kind)
211 magic_deco.__doc__ = _docstring_template.format('method', magic_kind)
212 return magic_deco
212 return magic_deco
213
213
214
214
215 def _function_magic_marker(magic_kind):
215 def _function_magic_marker(magic_kind):
216 """Decorator factory for standalone functions.
216 """Decorator factory for standalone functions.
217 """
217 """
218 validate_type(magic_kind)
218 validate_type(magic_kind)
219
219
220 # This is a closure to capture the magic_kind. We could also use a class,
220 # This is a closure to capture the magic_kind. We could also use a class,
221 # but it's overkill for just that one bit of state.
221 # but it's overkill for just that one bit of state.
222 def magic_deco(arg):
222 def magic_deco(arg):
223 call = lambda f, *a, **k: f(*a, **k)
223 call = lambda f, *a, **k: f(*a, **k)
224
224
225 # Find get_ipython() in the caller's namespace
225 # Find get_ipython() in the caller's namespace
226 caller = sys._getframe(1)
226 caller = sys._getframe(1)
227 for ns in ['f_locals', 'f_globals', 'f_builtins']:
227 for ns in ['f_locals', 'f_globals', 'f_builtins']:
228 get_ipython = getattr(caller, ns).get('get_ipython')
228 get_ipython = getattr(caller, ns).get('get_ipython')
229 if get_ipython is not None:
229 if get_ipython is not None:
230 break
230 break
231 else:
231 else:
232 raise NameError('Decorator can only run in context where '
232 raise NameError('Decorator can only run in context where '
233 '`get_ipython` exists')
233 '`get_ipython` exists')
234
234
235 ip = get_ipython()
235 ip = get_ipython()
236
236
237 if callable(arg):
237 if callable(arg):
238 # "Naked" decorator call (just @foo, no args)
238 # "Naked" decorator call (just @foo, no args)
239 func = arg
239 func = arg
240 name = func.func_name
240 name = func.func_name
241 ip.register_magic_function(func, magic_kind, name)
241 ip.register_magic_function(func, magic_kind, name)
242 retval = decorator(call, func)
242 retval = decorator(call, func)
243 elif isinstance(arg, basestring):
243 elif isinstance(arg, basestring):
244 # Decorator called with arguments (@foo('bar'))
244 # Decorator called with arguments (@foo('bar'))
245 name = arg
245 name = arg
246 def mark(func, *a, **kw):
246 def mark(func, *a, **kw):
247 ip.register_magic_function(func, magic_kind, name)
247 ip.register_magic_function(func, magic_kind, name)
248 return decorator(call, func)
248 return decorator(call, func)
249 retval = mark
249 retval = mark
250 else:
250 else:
251 raise TypeError("Decorator can only be called with "
251 raise TypeError("Decorator can only be called with "
252 "string or function")
252 "string or function")
253 return retval
253 return retval
254
254
255 # Ensure the resulting decorator has a usable docstring
255 # Ensure the resulting decorator has a usable docstring
256 ds = _docstring_template.format('function', magic_kind)
256 ds = _docstring_template.format('function', magic_kind)
257
257
258 ds += dedent("""
258 ds += dedent("""
259 Note: this decorator can only be used in a context where IPython is already
259 Note: this decorator can only be used in a context where IPython is already
260 active, so that the `get_ipython()` call succeeds. You can therefore use
260 active, so that the `get_ipython()` call succeeds. You can therefore use
261 it in your startup files loaded after IPython initializes, but *not* in the
261 it in your startup files loaded after IPython initializes, but *not* in the
262 IPython configuration file itself, which is executed before IPython is
262 IPython configuration file itself, which is executed before IPython is
263 fully up and running. Any file located in the `startup` subdirectory of
263 fully up and running. Any file located in the `startup` subdirectory of
264 your configuration profile will be OK in this sense.
264 your configuration profile will be OK in this sense.
265 """)
265 """)
266
266
267 magic_deco.__doc__ = ds
267 magic_deco.__doc__ = ds
268 return magic_deco
268 return magic_deco
269
269
270
270
271 # Create the actual decorators for public use
271 # Create the actual decorators for public use
272
272
273 # These three are used to decorate methods in class definitions
273 # These three are used to decorate methods in class definitions
274 line_magic = _method_magic_marker('line')
274 line_magic = _method_magic_marker('line')
275 cell_magic = _method_magic_marker('cell')
275 cell_magic = _method_magic_marker('cell')
276 line_cell_magic = _method_magic_marker('line_cell')
276 line_cell_magic = _method_magic_marker('line_cell')
277
277
278 # These three decorate standalone functions and perform the decoration
278 # These three decorate standalone functions and perform the decoration
279 # immediately. They can only run where get_ipython() works
279 # immediately. They can only run where get_ipython() works
280 register_line_magic = _function_magic_marker('line')
280 register_line_magic = _function_magic_marker('line')
281 register_cell_magic = _function_magic_marker('cell')
281 register_cell_magic = _function_magic_marker('cell')
282 register_line_cell_magic = _function_magic_marker('line_cell')
282 register_line_cell_magic = _function_magic_marker('line_cell')
283
283
284 #-----------------------------------------------------------------------------
284 #-----------------------------------------------------------------------------
285 # Core Magic classes
285 # Core Magic classes
286 #-----------------------------------------------------------------------------
286 #-----------------------------------------------------------------------------
287
287
288 class MagicsManager(Configurable):
288 class MagicsManager(Configurable):
289 """Object that handles all magic-related functionality for IPython.
289 """Object that handles all magic-related functionality for IPython.
290 """
290 """
291 # Non-configurable class attributes
291 # Non-configurable class attributes
292
292
293 # A two-level dict, first keyed by magic type, then by magic function, and
293 # A two-level dict, first keyed by magic type, then by magic function, and
294 # holding the actual callable object as value. This is the dict used for
294 # holding the actual callable object as value. This is the dict used for
295 # magic function dispatch
295 # magic function dispatch
296 magics = Dict
296 magics = Dict
297
297
298 # A registry of the original objects that we've been given holding magics.
298 # A registry of the original objects that we've been given holding magics.
299 registry = Dict
299 registry = Dict
300
300
301 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
301 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
302
302
303 auto_magic = Bool(True, config=True, help=
303 auto_magic = Bool(True, config=True, help=
304 "Automatically call line magics without requiring explicit % prefix")
304 "Automatically call line magics without requiring explicit % prefix")
305
305
306 _auto_status = [
306 _auto_status = [
307 'Automagic is OFF, % prefix IS needed for line magics.',
307 'Automagic is OFF, % prefix IS needed for line magics.',
308 'Automagic is ON, % prefix IS NOT needed for line magics.']
308 'Automagic is ON, % prefix IS NOT needed for line magics.']
309
309
310 user_magics = Instance('IPython.core.magics.UserMagics')
310 user_magics = Instance('IPython.core.magics.UserMagics')
311
311
312 def __init__(self, shell=None, config=None, user_magics=None, **traits):
312 def __init__(self, shell=None, config=None, user_magics=None, **traits):
313
313
314 super(MagicsManager, self).__init__(shell=shell, config=config,
314 super(MagicsManager, self).__init__(shell=shell, config=config,
315 user_magics=user_magics, **traits)
315 user_magics=user_magics, **traits)
316 self.magics = dict(line={}, cell={})
316 self.magics = dict(line={}, cell={})
317 # Let's add the user_magics to the registry for uniformity, so *all*
317 # Let's add the user_magics to the registry for uniformity, so *all*
318 # registered magic containers can be found there.
318 # registered magic containers can be found there.
319 self.registry[user_magics.__class__.__name__] = user_magics
319 self.registry[user_magics.__class__.__name__] = user_magics
320
320
321 def auto_status(self):
321 def auto_status(self):
322 """Return descriptive string with automagic status."""
322 """Return descriptive string with automagic status."""
323 return self._auto_status[self.auto_magic]
323 return self._auto_status[self.auto_magic]
324
324
325 def lsmagic_info(self):
325 def lsmagic_info(self):
326 magic_list = []
326 magic_list = []
327 for m_type in self.magics :
327 for m_type in self.magics :
328 for m_name,mgc in self.magics[m_type].items():
328 for m_name,mgc in self.magics[m_type].items():
329 try :
329 try :
330 magic_list.append({'name':m_name,'type':m_type,'class':mgc.im_class.__name__})
330 magic_list.append({'name':m_name,'type':m_type,'class':mgc.im_class.__name__})
331 except AttributeError :
331 except AttributeError :
332 magic_list.append({'name':m_name,'type':m_type,'class':'Other'})
332 magic_list.append({'name':m_name,'type':m_type,'class':'Other'})
333 return magic_list
333 return magic_list
334
334
335 def lsmagic(self):
335 def lsmagic(self):
336 """Return a dict of currently available magic functions.
336 """Return a dict of currently available magic functions.
337
337
338 The return dict has the keys 'line' and 'cell', corresponding to the
338 The return dict has the keys 'line' and 'cell', corresponding to the
339 two types of magics we support. Each value is a list of names.
339 two types of magics we support. Each value is a list of names.
340 """
340 """
341 return self.magics
341 return self.magics
342
342
343 def register(self, *magic_objects):
343 def register(self, *magic_objects):
344 """Register one or more instances of Magics.
344 """Register one or more instances of Magics.
345
345
346 Take one or more classes or instances of classes that subclass the main
346 Take one or more classes or instances of classes that subclass the main
347 `core.Magic` class, and register them with IPython to use the magic
347 `core.Magic` class, and register them with IPython to use the magic
348 functions they provide. The registration process will then ensure that
348 functions they provide. The registration process will then ensure that
349 any methods that have decorated to provide line and/or cell magics will
349 any methods that have decorated to provide line and/or cell magics will
350 be recognized with the `%x`/`%%x` syntax as a line/cell magic
350 be recognized with the `%x`/`%%x` syntax as a line/cell magic
351 respectively.
351 respectively.
352
352
353 If classes are given, they will be instantiated with the default
353 If classes are given, they will be instantiated with the default
354 constructor. If your classes need a custom constructor, you should
354 constructor. If your classes need a custom constructor, you should
355 instanitate them first and pass the instance.
355 instanitate them first and pass the instance.
356
356
357 The provided arguments can be an arbitrary mix of classes and instances.
357 The provided arguments can be an arbitrary mix of classes and instances.
358
358
359 Parameters
359 Parameters
360 ----------
360 ----------
361 magic_objects : one or more classes or instances
361 magic_objects : one or more classes or instances
362 """
362 """
363 # Start by validating them to ensure they have all had their magic
363 # Start by validating them to ensure they have all had their magic
364 # methods registered at the instance level
364 # methods registered at the instance level
365 for m in magic_objects:
365 for m in magic_objects:
366 if not m.registered:
366 if not m.registered:
367 raise ValueError("Class of magics %r was constructed without "
367 raise ValueError("Class of magics %r was constructed without "
368 "the @register_magics class decorator")
368 "the @register_magics class decorator")
369 if type(m) in (type, MetaHasTraits):
369 if type(m) in (type, MetaHasTraits):
370 # If we're given an uninstantiated class
370 # If we're given an uninstantiated class
371 m = m(shell=self.shell)
371 m = m(shell=self.shell)
372
372
373 # Now that we have an instance, we can register it and update the
373 # Now that we have an instance, we can register it and update the
374 # table of callables
374 # table of callables
375 self.registry[m.__class__.__name__] = m
375 self.registry[m.__class__.__name__] = m
376 for mtype in magic_kinds:
376 for mtype in magic_kinds:
377 self.magics[mtype].update(m.magics[mtype])
377 self.magics[mtype].update(m.magics[mtype])
378
378
379 def register_function(self, func, magic_kind='line', magic_name=None):
379 def register_function(self, func, magic_kind='line', magic_name=None):
380 """Expose a standalone function as magic function for IPython.
380 """Expose a standalone function as magic function for IPython.
381
381
382 This will create an IPython magic (line, cell or both) from a
382 This will create an IPython magic (line, cell or both) from a
383 standalone function. The functions should have the following
383 standalone function. The functions should have the following
384 signatures:
384 signatures:
385
385
386 * For line magics: `def f(line)`
386 * For line magics: `def f(line)`
387 * For cell magics: `def f(line, cell)`
387 * For cell magics: `def f(line, cell)`
388 * For a function that does both: `def f(line, cell=None)`
388 * For a function that does both: `def f(line, cell=None)`
389
389
390 In the latter case, the function will be called with `cell==None` when
390 In the latter case, the function will be called with `cell==None` when
391 invoked as `%f`, and with cell as a string when invoked as `%%f`.
391 invoked as `%f`, and with cell as a string when invoked as `%%f`.
392
392
393 Parameters
393 Parameters
394 ----------
394 ----------
395 func : callable
395 func : callable
396 Function to be registered as a magic.
396 Function to be registered as a magic.
397
397
398 magic_kind : str
398 magic_kind : str
399 Kind of magic, one of 'line', 'cell' or 'line_cell'
399 Kind of magic, one of 'line', 'cell' or 'line_cell'
400
400
401 magic_name : optional str
401 magic_name : optional str
402 If given, the name the magic will have in the IPython namespace. By
402 If given, the name the magic will have in the IPython namespace. By
403 default, the name of the function itself is used.
403 default, the name of the function itself is used.
404 """
404 """
405
405
406 # Create the new method in the user_magics and register it in the
406 # Create the new method in the user_magics and register it in the
407 # global table
407 # global table
408 validate_type(magic_kind)
408 validate_type(magic_kind)
409 magic_name = func.func_name if magic_name is None else magic_name
409 magic_name = func.func_name if magic_name is None else magic_name
410 setattr(self.user_magics, magic_name, func)
410 setattr(self.user_magics, magic_name, func)
411 record_magic(self.magics, magic_kind, magic_name, func)
411 record_magic(self.magics, magic_kind, magic_name, func)
412
412
413 def define_magic(self, name, func):
413 def define_magic(self, name, func):
414 """[Deprecated] Expose own function as magic function for IPython.
414 """[Deprecated] Expose own function as magic function for IPython.
415
415
416 Example::
416 Example::
417
417
418 def foo_impl(self, parameter_s=''):
418 def foo_impl(self, parameter_s=''):
419 'My very own magic!. (Use docstrings, IPython reads them).'
419 'My very own magic!. (Use docstrings, IPython reads them).'
420 print 'Magic function. Passed parameter is between < >:'
420 print 'Magic function. Passed parameter is between < >:'
421 print '<%s>' % parameter_s
421 print '<%s>' % parameter_s
422 print 'The self object is:', self
422 print 'The self object is:', self
423
423
424 ip.define_magic('foo',foo_impl)
424 ip.define_magic('foo',foo_impl)
425 """
425 """
426 meth = types.MethodType(func, self.user_magics)
426 meth = types.MethodType(func, self.user_magics)
427 setattr(self.user_magics, name, meth)
427 setattr(self.user_magics, name, meth)
428 record_magic(self.magics, 'line', name, meth)
428 record_magic(self.magics, 'line', name, meth)
429
429
430 # Key base class that provides the central functionality for magics.
430 # Key base class that provides the central functionality for magics.
431
431
432 class Magics(object):
432 class Magics(object):
433 """Base class for implementing magic functions.
433 """Base class for implementing magic functions.
434
434
435 Shell functions which can be reached as %function_name. All magic
435 Shell functions which can be reached as %function_name. All magic
436 functions should accept a string, which they can parse for their own
436 functions should accept a string, which they can parse for their own
437 needs. This can make some functions easier to type, eg `%cd ../`
437 needs. This can make some functions easier to type, eg `%cd ../`
438 vs. `%cd("../")`
438 vs. `%cd("../")`
439
439
440 Classes providing magic functions need to subclass this class, and they
440 Classes providing magic functions need to subclass this class, and they
441 MUST:
441 MUST:
442
442
443 - Use the method decorators `@line_magic` and `@cell_magic` to decorate
443 - Use the method decorators `@line_magic` and `@cell_magic` to decorate
444 individual methods as magic functions, AND
444 individual methods as magic functions, AND
445
445
446 - Use the class decorator `@magics_class` to ensure that the magic
446 - Use the class decorator `@magics_class` to ensure that the magic
447 methods are properly registered at the instance level upon instance
447 methods are properly registered at the instance level upon instance
448 initialization.
448 initialization.
449
449
450 See :mod:`magic_functions` for examples of actual implementation classes.
450 See :mod:`magic_functions` for examples of actual implementation classes.
451 """
451 """
452 # Dict holding all command-line options for each magic.
452 # Dict holding all command-line options for each magic.
453 options_table = None
453 options_table = None
454 # Dict for the mapping of magic names to methods, set by class decorator
454 # Dict for the mapping of magic names to methods, set by class decorator
455 magics = None
455 magics = None
456 # Flag to check that the class decorator was properly applied
456 # Flag to check that the class decorator was properly applied
457 registered = False
457 registered = False
458 # Instance of IPython shell
458 # Instance of IPython shell
459 shell = None
459 shell = None
460
460
461 def __init__(self, shell):
461 def __init__(self, shell):
462 if not(self.__class__.registered):
462 if not(self.__class__.registered):
463 raise ValueError('Magics subclass without registration - '
463 raise ValueError('Magics subclass without registration - '
464 'did you forget to apply @magics_class?')
464 'did you forget to apply @magics_class?')
465 self.shell = shell
465 self.shell = shell
466 self.options_table = {}
466 self.options_table = {}
467 # The method decorators are run when the instance doesn't exist yet, so
467 # The method decorators are run when the instance doesn't exist yet, so
468 # they can only record the names of the methods they are supposed to
468 # they can only record the names of the methods they are supposed to
469 # grab. Only now, that the instance exists, can we create the proper
469 # grab. Only now, that the instance exists, can we create the proper
470 # mapping to bound methods. So we read the info off the original names
470 # mapping to bound methods. So we read the info off the original names
471 # table and replace each method name by the actual bound method.
471 # table and replace each method name by the actual bound method.
472 # But we mustn't clobber the *class* mapping, in case of multiple instances.
473 class_magics = self.magics
474 self.magics = {}
472 for mtype in magic_kinds:
475 for mtype in magic_kinds:
473 tab = self.magics[mtype]
476 tab = self.magics[mtype] = {}
474 # must explicitly use keys, as we're mutating this puppy
477 cls_tab = class_magics[mtype]
475 for magic_name in tab.keys():
478 for magic_name, meth_name in cls_tab.iteritems():
476 meth_name = tab[magic_name]
477 if isinstance(meth_name, basestring):
479 if isinstance(meth_name, basestring):
480 # it's a method name, grab it
478 tab[magic_name] = getattr(self, meth_name)
481 tab[magic_name] = getattr(self, meth_name)
482 else:
483 # it's the real thing
484 tab[magic_name] = meth_name
479
485
480 def arg_err(self,func):
486 def arg_err(self,func):
481 """Print docstring if incorrect arguments were passed"""
487 """Print docstring if incorrect arguments were passed"""
482 print 'Error in arguments:'
488 print 'Error in arguments:'
483 print oinspect.getdoc(func)
489 print oinspect.getdoc(func)
484
490
485 def format_latex(self, strng):
491 def format_latex(self, strng):
486 """Format a string for latex inclusion."""
492 """Format a string for latex inclusion."""
487
493
488 # Characters that need to be escaped for latex:
494 # Characters that need to be escaped for latex:
489 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
495 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
490 # Magic command names as headers:
496 # Magic command names as headers:
491 cmd_name_re = re.compile(r'^(%s.*?):' % ESC_MAGIC,
497 cmd_name_re = re.compile(r'^(%s.*?):' % ESC_MAGIC,
492 re.MULTILINE)
498 re.MULTILINE)
493 # Magic commands
499 # Magic commands
494 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % ESC_MAGIC,
500 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % ESC_MAGIC,
495 re.MULTILINE)
501 re.MULTILINE)
496 # Paragraph continue
502 # Paragraph continue
497 par_re = re.compile(r'\\$',re.MULTILINE)
503 par_re = re.compile(r'\\$',re.MULTILINE)
498
504
499 # The "\n" symbol
505 # The "\n" symbol
500 newline_re = re.compile(r'\\n')
506 newline_re = re.compile(r'\\n')
501
507
502 # Now build the string for output:
508 # Now build the string for output:
503 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
509 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
504 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
510 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
505 strng)
511 strng)
506 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
512 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
507 strng = par_re.sub(r'\\\\',strng)
513 strng = par_re.sub(r'\\\\',strng)
508 strng = escape_re.sub(r'\\\1',strng)
514 strng = escape_re.sub(r'\\\1',strng)
509 strng = newline_re.sub(r'\\textbackslash{}n',strng)
515 strng = newline_re.sub(r'\\textbackslash{}n',strng)
510 return strng
516 return strng
511
517
512 def parse_options(self, arg_str, opt_str, *long_opts, **kw):
518 def parse_options(self, arg_str, opt_str, *long_opts, **kw):
513 """Parse options passed to an argument string.
519 """Parse options passed to an argument string.
514
520
515 The interface is similar to that of getopt(), but it returns back a
521 The interface is similar to that of getopt(), but it returns back a
516 Struct with the options as keys and the stripped argument string still
522 Struct with the options as keys and the stripped argument string still
517 as a string.
523 as a string.
518
524
519 arg_str is quoted as a true sys.argv vector by using shlex.split.
525 arg_str is quoted as a true sys.argv vector by using shlex.split.
520 This allows us to easily expand variables, glob files, quote
526 This allows us to easily expand variables, glob files, quote
521 arguments, etc.
527 arguments, etc.
522
528
523 Options:
529 Options:
524 -mode: default 'string'. If given as 'list', the argument string is
530 -mode: default 'string'. If given as 'list', the argument string is
525 returned as a list (split on whitespace) instead of a string.
531 returned as a list (split on whitespace) instead of a string.
526
532
527 -list_all: put all option values in lists. Normally only options
533 -list_all: put all option values in lists. Normally only options
528 appearing more than once are put in a list.
534 appearing more than once are put in a list.
529
535
530 -posix (True): whether to split the input line in POSIX mode or not,
536 -posix (True): whether to split the input line in POSIX mode or not,
531 as per the conventions outlined in the shlex module from the
537 as per the conventions outlined in the shlex module from the
532 standard library."""
538 standard library."""
533
539
534 # inject default options at the beginning of the input line
540 # inject default options at the beginning of the input line
535 caller = sys._getframe(1).f_code.co_name
541 caller = sys._getframe(1).f_code.co_name
536 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
542 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
537
543
538 mode = kw.get('mode','string')
544 mode = kw.get('mode','string')
539 if mode not in ['string','list']:
545 if mode not in ['string','list']:
540 raise ValueError,'incorrect mode given: %s' % mode
546 raise ValueError,'incorrect mode given: %s' % mode
541 # Get options
547 # Get options
542 list_all = kw.get('list_all',0)
548 list_all = kw.get('list_all',0)
543 posix = kw.get('posix', os.name == 'posix')
549 posix = kw.get('posix', os.name == 'posix')
544 strict = kw.get('strict', True)
550 strict = kw.get('strict', True)
545
551
546 # Check if we have more than one argument to warrant extra processing:
552 # Check if we have more than one argument to warrant extra processing:
547 odict = {} # Dictionary with options
553 odict = {} # Dictionary with options
548 args = arg_str.split()
554 args = arg_str.split()
549 if len(args) >= 1:
555 if len(args) >= 1:
550 # If the list of inputs only has 0 or 1 thing in it, there's no
556 # If the list of inputs only has 0 or 1 thing in it, there's no
551 # need to look for options
557 # need to look for options
552 argv = arg_split(arg_str, posix, strict)
558 argv = arg_split(arg_str, posix, strict)
553 # Do regular option processing
559 # Do regular option processing
554 try:
560 try:
555 opts,args = getopt(argv, opt_str, long_opts)
561 opts,args = getopt(argv, opt_str, long_opts)
556 except GetoptError,e:
562 except GetoptError,e:
557 raise UsageError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
563 raise UsageError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
558 " ".join(long_opts)))
564 " ".join(long_opts)))
559 for o,a in opts:
565 for o,a in opts:
560 if o.startswith('--'):
566 if o.startswith('--'):
561 o = o[2:]
567 o = o[2:]
562 else:
568 else:
563 o = o[1:]
569 o = o[1:]
564 try:
570 try:
565 odict[o].append(a)
571 odict[o].append(a)
566 except AttributeError:
572 except AttributeError:
567 odict[o] = [odict[o],a]
573 odict[o] = [odict[o],a]
568 except KeyError:
574 except KeyError:
569 if list_all:
575 if list_all:
570 odict[o] = [a]
576 odict[o] = [a]
571 else:
577 else:
572 odict[o] = a
578 odict[o] = a
573
579
574 # Prepare opts,args for return
580 # Prepare opts,args for return
575 opts = Struct(odict)
581 opts = Struct(odict)
576 if mode == 'string':
582 if mode == 'string':
577 args = ' '.join(args)
583 args = ' '.join(args)
578
584
579 return opts,args
585 return opts,args
580
586
581 def default_option(self, fn, optstr):
587 def default_option(self, fn, optstr):
582 """Make an entry in the options_table for fn, with value optstr"""
588 """Make an entry in the options_table for fn, with value optstr"""
583
589
584 if fn not in self.lsmagic():
590 if fn not in self.lsmagic():
585 error("%s is not a magic function" % fn)
591 error("%s is not a magic function" % fn)
586 self.options_table[fn] = optstr
592 self.options_table[fn] = optstr
General Comments 0
You need to be logged in to leave comments. Login now