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