##// END OF EJS Templates
update formatting as per PR tests
Peter Corke -
Show More
@@ -1,1027 +1,1028 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Display formatters.
2 """Display formatters.
3
3
4 Inheritance diagram:
4 Inheritance diagram:
5
5
6 .. inheritance-diagram:: IPython.core.formatters
6 .. inheritance-diagram:: IPython.core.formatters
7 :parts: 3
7 :parts: 3
8 """
8 """
9
9
10 # Copyright (c) IPython Development Team.
10 # Copyright (c) IPython Development Team.
11 # Distributed under the terms of the Modified BSD License.
11 # Distributed under the terms of the Modified BSD License.
12
12
13 import abc
13 import abc
14 import json
14 import json
15 import sys
15 import sys
16 import traceback
16 import traceback
17 import warnings
17 import warnings
18 from io import StringIO
18 from io import StringIO
19
19
20 from decorator import decorator
20 from decorator import decorator
21
21
22 from traitlets.config.configurable import Configurable
22 from traitlets.config.configurable import Configurable
23 from .getipython import get_ipython
23 from .getipython import get_ipython
24 from ..utils.sentinel import Sentinel
24 from ..utils.sentinel import Sentinel
25 from ..utils.dir2 import get_real_method
25 from ..utils.dir2 import get_real_method
26 from ..lib import pretty
26 from ..lib import pretty
27 from traitlets import (
27 from traitlets import (
28 Bool, Dict, Integer, Unicode, CUnicode, ObjectName, List,
28 Bool, Dict, Integer, Unicode, CUnicode, ObjectName, List,
29 ForwardDeclaredInstance,
29 ForwardDeclaredInstance,
30 default, observe,
30 default, observe,
31 )
31 )
32
32
33
33
34 class DisplayFormatter(Configurable):
34 class DisplayFormatter(Configurable):
35
35
36 active_types = List(Unicode(),
36 active_types = List(Unicode(),
37 help="""List of currently active mime-types to display.
37 help="""List of currently active mime-types to display.
38 You can use this to set a white-list for formats to display.
38 You can use this to set a white-list for formats to display.
39
39
40 Most users will not need to change this value.
40 Most users will not need to change this value.
41 """).tag(config=True)
41 """).tag(config=True)
42
42
43 @default('active_types')
43 @default('active_types')
44 def _active_types_default(self):
44 def _active_types_default(self):
45 return self.format_types
45 return self.format_types
46
46
47 @observe('active_types')
47 @observe('active_types')
48 def _active_types_changed(self, change):
48 def _active_types_changed(self, change):
49 for key, formatter in self.formatters.items():
49 for key, formatter in self.formatters.items():
50 if key in change['new']:
50 if key in change['new']:
51 formatter.enabled = True
51 formatter.enabled = True
52 else:
52 else:
53 formatter.enabled = False
53 formatter.enabled = False
54
54
55 ipython_display_formatter = ForwardDeclaredInstance('FormatterABC')
55 ipython_display_formatter = ForwardDeclaredInstance('FormatterABC')
56 @default('ipython_display_formatter')
56 @default('ipython_display_formatter')
57 def _default_formatter(self):
57 def _default_formatter(self):
58 return IPythonDisplayFormatter(parent=self)
58 return IPythonDisplayFormatter(parent=self)
59
59
60 mimebundle_formatter = ForwardDeclaredInstance('FormatterABC')
60 mimebundle_formatter = ForwardDeclaredInstance('FormatterABC')
61 @default('mimebundle_formatter')
61 @default('mimebundle_formatter')
62 def _default_mime_formatter(self):
62 def _default_mime_formatter(self):
63 return MimeBundleFormatter(parent=self)
63 return MimeBundleFormatter(parent=self)
64
64
65 # A dict of formatter whose keys are format types (MIME types) and whose
65 # A dict of formatter whose keys are format types (MIME types) and whose
66 # values are subclasses of BaseFormatter.
66 # values are subclasses of BaseFormatter.
67 formatters = Dict()
67 formatters = Dict()
68 @default('formatters')
68 @default('formatters')
69 def _formatters_default(self):
69 def _formatters_default(self):
70 """Activate the default formatters."""
70 """Activate the default formatters."""
71 formatter_classes = [
71 formatter_classes = [
72 PlainTextFormatter,
72 PlainTextFormatter,
73 HTMLFormatter,
73 HTMLFormatter,
74 MarkdownFormatter,
74 MarkdownFormatter,
75 SVGFormatter,
75 SVGFormatter,
76 PNGFormatter,
76 PNGFormatter,
77 PDFFormatter,
77 PDFFormatter,
78 JPEGFormatter,
78 JPEGFormatter,
79 LatexFormatter,
79 LatexFormatter,
80 JSONFormatter,
80 JSONFormatter,
81 JavascriptFormatter
81 JavascriptFormatter
82 ]
82 ]
83 d = {}
83 d = {}
84 for cls in formatter_classes:
84 for cls in formatter_classes:
85 f = cls(parent=self)
85 f = cls(parent=self)
86 d[f.format_type] = f
86 d[f.format_type] = f
87 return d
87 return d
88
88
89 def format(self, obj, include=None, exclude=None):
89 def format(self, obj, include=None, exclude=None):
90 """Return a format data dict for an object.
90 """Return a format data dict for an object.
91
91
92 By default all format types will be computed.
92 By default all format types will be computed.
93
93
94 The following MIME types are usually implemented:
94 The following MIME types are usually implemented:
95
95
96 * text/plain
96 * text/plain
97 * text/html
97 * text/html
98 * text/markdown
98 * text/markdown
99 * text/latex
99 * text/latex
100 * application/json
100 * application/json
101 * application/javascript
101 * application/javascript
102 * application/pdf
102 * application/pdf
103 * image/png
103 * image/png
104 * image/jpeg
104 * image/jpeg
105 * image/svg+xml
105 * image/svg+xml
106
106
107 Parameters
107 Parameters
108 ----------
108 ----------
109 obj : object
109 obj : object
110 The Python object whose format data will be computed.
110 The Python object whose format data will be computed.
111 include : list, tuple or set; optional
111 include : list, tuple or set; optional
112 A list of format type strings (MIME types) to include in the
112 A list of format type strings (MIME types) to include in the
113 format data dict. If this is set *only* the format types included
113 format data dict. If this is set *only* the format types included
114 in this list will be computed.
114 in this list will be computed.
115 exclude : list, tuple or set; optional
115 exclude : list, tuple or set; optional
116 A list of format type string (MIME types) to exclude in the format
116 A list of format type string (MIME types) to exclude in the format
117 data dict. If this is set all format types will be computed,
117 data dict. If this is set all format types will be computed,
118 except for those included in this argument.
118 except for those included in this argument.
119 Mimetypes present in exclude will take precedence over the ones in include
119 Mimetypes present in exclude will take precedence over the ones in include
120
120
121 Returns
121 Returns
122 -------
122 -------
123 (format_dict, metadata_dict) : tuple of two dicts
123 (format_dict, metadata_dict) : tuple of two dicts
124
124
125 format_dict is a dictionary of key/value pairs, one of each format that was
125 format_dict is a dictionary of key/value pairs, one of each format that was
126 generated for the object. The keys are the format types, which
126 generated for the object. The keys are the format types, which
127 will usually be MIME type strings and the values and JSON'able
127 will usually be MIME type strings and the values and JSON'able
128 data structure containing the raw data for the representation in
128 data structure containing the raw data for the representation in
129 that format.
129 that format.
130
130
131 metadata_dict is a dictionary of metadata about each mime-type output.
131 metadata_dict is a dictionary of metadata about each mime-type output.
132 Its keys will be a strict subset of the keys in format_dict.
132 Its keys will be a strict subset of the keys in format_dict.
133
133
134 Notes
134 Notes
135 -----
135 -----
136
136
137 If an object implement `_repr_mimebundle_` as well as various
137 If an object implement `_repr_mimebundle_` as well as various
138 `_repr_*_`, the data returned by `_repr_mimebundle_` will take
138 `_repr_*_`, the data returned by `_repr_mimebundle_` will take
139 precedence and the corresponding `_repr_*_` for this mimetype will
139 precedence and the corresponding `_repr_*_` for this mimetype will
140 not be called.
140 not be called.
141
141
142 """
142 """
143 format_dict = {}
143 format_dict = {}
144 md_dict = {}
144 md_dict = {}
145
145
146 if self.ipython_display_formatter(obj):
146 if self.ipython_display_formatter(obj):
147 # object handled itself, don't proceed
147 # object handled itself, don't proceed
148 return {}, {}
148 return {}, {}
149
149
150 format_dict, md_dict = self.mimebundle_formatter(obj, include=include, exclude=exclude)
150 format_dict, md_dict = self.mimebundle_formatter(obj, include=include, exclude=exclude)
151
151
152 if format_dict or md_dict:
152 if format_dict or md_dict:
153 if include:
153 if include:
154 format_dict = {k:v for k,v in format_dict.items() if k in include}
154 format_dict = {k:v for k,v in format_dict.items() if k in include}
155 md_dict = {k:v for k,v in md_dict.items() if k in include}
155 md_dict = {k:v for k,v in md_dict.items() if k in include}
156 if exclude:
156 if exclude:
157 format_dict = {k:v for k,v in format_dict.items() if k not in exclude}
157 format_dict = {k:v for k,v in format_dict.items() if k not in exclude}
158 md_dict = {k:v for k,v in md_dict.items() if k not in exclude}
158 md_dict = {k:v for k,v in md_dict.items() if k not in exclude}
159
159
160 for format_type, formatter in self.formatters.items():
160 for format_type, formatter in self.formatters.items():
161 if format_type in format_dict:
161 if format_type in format_dict:
162 # already got it from mimebundle, maybe don't render again.
162 # already got it from mimebundle, maybe don't render again.
163 # exception: manually registered per-mime renderer
163 # exception: manually registered per-mime renderer
164 # check priority:
164 # check priority:
165 # 1. user-registered per-mime formatter
165 # 1. user-registered per-mime formatter
166 # 2. mime-bundle (user-registered or repr method)
166 # 2. mime-bundle (user-registered or repr method)
167 # 3. default per-mime formatter (e.g. repr method)
167 # 3. default per-mime formatter (e.g. repr method)
168 try:
168 try:
169 formatter.lookup(obj)
169 formatter.lookup(obj)
170 except KeyError:
170 except KeyError:
171 # no special formatter, use mime-bundle-provided value
171 # no special formatter, use mime-bundle-provided value
172 continue
172 continue
173 if include and format_type not in include:
173 if include and format_type not in include:
174 continue
174 continue
175 if exclude and format_type in exclude:
175 if exclude and format_type in exclude:
176 continue
176 continue
177
177
178 md = None
178 md = None
179 try:
179 try:
180 data = formatter(obj)
180 data = formatter(obj)
181 except:
181 except:
182 # FIXME: log the exception
182 # FIXME: log the exception
183 raise
183 raise
184
184
185 # formatters can return raw data or (data, metadata)
185 # formatters can return raw data or (data, metadata)
186 if isinstance(data, tuple) and len(data) == 2:
186 if isinstance(data, tuple) and len(data) == 2:
187 data, md = data
187 data, md = data
188
188
189 if data is not None:
189 if data is not None:
190 format_dict[format_type] = data
190 format_dict[format_type] = data
191 if md is not None:
191 if md is not None:
192 md_dict[format_type] = md
192 md_dict[format_type] = md
193 return format_dict, md_dict
193 return format_dict, md_dict
194
194
195 @property
195 @property
196 def format_types(self):
196 def format_types(self):
197 """Return the format types (MIME types) of the active formatters."""
197 """Return the format types (MIME types) of the active formatters."""
198 return list(self.formatters.keys())
198 return list(self.formatters.keys())
199
199
200
200
201 #-----------------------------------------------------------------------------
201 #-----------------------------------------------------------------------------
202 # Formatters for specific format types (text, html, svg, etc.)
202 # Formatters for specific format types (text, html, svg, etc.)
203 #-----------------------------------------------------------------------------
203 #-----------------------------------------------------------------------------
204
204
205
205
206 def _safe_repr(obj):
206 def _safe_repr(obj):
207 """Try to return a repr of an object
207 """Try to return a repr of an object
208
208
209 always returns a string, at least.
209 always returns a string, at least.
210 """
210 """
211 try:
211 try:
212 return repr(obj)
212 return repr(obj)
213 except Exception as e:
213 except Exception as e:
214 return "un-repr-able object (%r)" % e
214 return "un-repr-able object (%r)" % e
215
215
216
216
217 class FormatterWarning(UserWarning):
217 class FormatterWarning(UserWarning):
218 """Warning class for errors in formatters"""
218 """Warning class for errors in formatters"""
219
219
220 @decorator
220 @decorator
221 def catch_format_error(method, self, *args, **kwargs):
221 def catch_format_error(method, self, *args, **kwargs):
222 """show traceback on failed format call"""
222 """show traceback on failed format call"""
223 try:
223 try:
224 r = method(self, *args, **kwargs)
224 r = method(self, *args, **kwargs)
225 except NotImplementedError:
225 except NotImplementedError:
226 # don't warn on NotImplementedErrors
226 # don't warn on NotImplementedErrors
227 return self._check_return(None, args[0])
227 return self._check_return(None, args[0])
228 except Exception:
228 except Exception:
229 exc_info = sys.exc_info()
229 exc_info = sys.exc_info()
230 ip = get_ipython()
230 ip = get_ipython()
231 if ip is not None:
231 if ip is not None:
232 ip.showtraceback(exc_info)
232 ip.showtraceback(exc_info)
233 else:
233 else:
234 traceback.print_exception(*exc_info)
234 traceback.print_exception(*exc_info)
235 return self._check_return(None, args[0])
235 return self._check_return(None, args[0])
236 return self._check_return(r, args[0])
236 return self._check_return(r, args[0])
237
237
238
238
239 class FormatterABC(metaclass=abc.ABCMeta):
239 class FormatterABC(metaclass=abc.ABCMeta):
240 """ Abstract base class for Formatters.
240 """ Abstract base class for Formatters.
241
241
242 A formatter is a callable class that is responsible for computing the
242 A formatter is a callable class that is responsible for computing the
243 raw format data for a particular format type (MIME type). For example,
243 raw format data for a particular format type (MIME type). For example,
244 an HTML formatter would have a format type of `text/html` and would return
244 an HTML formatter would have a format type of `text/html` and would return
245 the HTML representation of the object when called.
245 the HTML representation of the object when called.
246 """
246 """
247
247
248 # The format type of the data returned, usually a MIME type.
248 # The format type of the data returned, usually a MIME type.
249 format_type = 'text/plain'
249 format_type = 'text/plain'
250
250
251 # Is the formatter enabled...
251 # Is the formatter enabled...
252 enabled = True
252 enabled = True
253
253
254 @abc.abstractmethod
254 @abc.abstractmethod
255 def __call__(self, obj):
255 def __call__(self, obj):
256 """Return a JSON'able representation of the object.
256 """Return a JSON'able representation of the object.
257
257
258 If the object cannot be formatted by this formatter,
258 If the object cannot be formatted by this formatter,
259 warn and return None.
259 warn and return None.
260 """
260 """
261 return repr(obj)
261 return repr(obj)
262
262
263
263
264 def _mod_name_key(typ):
264 def _mod_name_key(typ):
265 """Return a (__module__, __name__) tuple for a type.
265 """Return a (__module__, __name__) tuple for a type.
266
266
267 Used as key in Formatter.deferred_printers.
267 Used as key in Formatter.deferred_printers.
268 """
268 """
269 module = getattr(typ, '__module__', None)
269 module = getattr(typ, '__module__', None)
270 name = getattr(typ, '__name__', None)
270 name = getattr(typ, '__name__', None)
271 return (module, name)
271 return (module, name)
272
272
273
273
274 def _get_type(obj):
274 def _get_type(obj):
275 """Return the type of an instance (old and new-style)"""
275 """Return the type of an instance (old and new-style)"""
276 return getattr(obj, '__class__', None) or type(obj)
276 return getattr(obj, '__class__', None) or type(obj)
277
277
278
278
279 _raise_key_error = Sentinel('_raise_key_error', __name__,
279 _raise_key_error = Sentinel('_raise_key_error', __name__,
280 """
280 """
281 Special value to raise a KeyError
281 Special value to raise a KeyError
282
282
283 Raise KeyError in `BaseFormatter.pop` if passed as the default value to `pop`
283 Raise KeyError in `BaseFormatter.pop` if passed as the default value to `pop`
284 """)
284 """)
285
285
286
286
287 class BaseFormatter(Configurable):
287 class BaseFormatter(Configurable):
288 """A base formatter class that is configurable.
288 """A base formatter class that is configurable.
289
289
290 This formatter should usually be used as the base class of all formatters.
290 This formatter should usually be used as the base class of all formatters.
291 It is a traited :class:`Configurable` class and includes an extensible
291 It is a traited :class:`Configurable` class and includes an extensible
292 API for users to determine how their objects are formatted. The following
292 API for users to determine how their objects are formatted. The following
293 logic is used to find a function to format an given object.
293 logic is used to find a function to format an given object.
294
294
295 1. The object is introspected to see if it has a method with the name
295 1. The object is introspected to see if it has a method with the name
296 :attr:`print_method`. If is does, that object is passed to that method
296 :attr:`print_method`. If is does, that object is passed to that method
297 for formatting.
297 for formatting.
298 2. If no print method is found, three internal dictionaries are consulted
298 2. If no print method is found, three internal dictionaries are consulted
299 to find print method: :attr:`singleton_printers`, :attr:`type_printers`
299 to find print method: :attr:`singleton_printers`, :attr:`type_printers`
300 and :attr:`deferred_printers`.
300 and :attr:`deferred_printers`.
301
301
302 Users should use these dictionaries to register functions that will be
302 Users should use these dictionaries to register functions that will be
303 used to compute the format data for their objects (if those objects don't
303 used to compute the format data for their objects (if those objects don't
304 have the special print methods). The easiest way of using these
304 have the special print methods). The easiest way of using these
305 dictionaries is through the :meth:`for_type` and :meth:`for_type_by_name`
305 dictionaries is through the :meth:`for_type` and :meth:`for_type_by_name`
306 methods.
306 methods.
307
307
308 If no function/callable is found to compute the format data, ``None`` is
308 If no function/callable is found to compute the format data, ``None`` is
309 returned and this format type is not used.
309 returned and this format type is not used.
310 """
310 """
311
311
312 format_type = Unicode('text/plain')
312 format_type = Unicode('text/plain')
313 _return_type = str
313 _return_type = str
314
314
315 enabled = Bool(True).tag(config=True)
315 enabled = Bool(True).tag(config=True)
316
316
317 print_method = ObjectName('__repr__')
317 print_method = ObjectName('__repr__')
318
318
319 # The singleton printers.
319 # The singleton printers.
320 # Maps the IDs of the builtin singleton objects to the format functions.
320 # Maps the IDs of the builtin singleton objects to the format functions.
321 singleton_printers = Dict().tag(config=True)
321 singleton_printers = Dict().tag(config=True)
322
322
323 # The type-specific printers.
323 # The type-specific printers.
324 # Map type objects to the format functions.
324 # Map type objects to the format functions.
325 type_printers = Dict().tag(config=True)
325 type_printers = Dict().tag(config=True)
326
326
327 # The deferred-import type-specific printers.
327 # The deferred-import type-specific printers.
328 # Map (modulename, classname) pairs to the format functions.
328 # Map (modulename, classname) pairs to the format functions.
329 deferred_printers = Dict().tag(config=True)
329 deferred_printers = Dict().tag(config=True)
330
330
331 @catch_format_error
331 @catch_format_error
332 def __call__(self, obj):
332 def __call__(self, obj):
333 """Compute the format for an object."""
333 """Compute the format for an object."""
334 if self.enabled:
334 if self.enabled:
335 # lookup registered printer
335 # lookup registered printer
336 try:
336 try:
337 printer = self.lookup(obj)
337 printer = self.lookup(obj)
338 except KeyError:
338 except KeyError:
339 pass
339 pass
340 else:
340 else:
341 return printer(obj)
341 return printer(obj)
342 # Finally look for special method names
342 # Finally look for special method names
343 method = get_real_method(obj, self.print_method)
343 method = get_real_method(obj, self.print_method)
344 if method is not None:
344 if method is not None:
345 return method()
345 return method()
346 return None
346 return None
347 else:
347 else:
348 return None
348 return None
349
349
350 def __contains__(self, typ):
350 def __contains__(self, typ):
351 """map in to lookup_by_type"""
351 """map in to lookup_by_type"""
352 try:
352 try:
353 self.lookup_by_type(typ)
353 self.lookup_by_type(typ)
354 except KeyError:
354 except KeyError:
355 return False
355 return False
356 else:
356 else:
357 return True
357 return True
358
358
359 def _check_return(self, r, obj):
359 def _check_return(self, r, obj):
360 """Check that a return value is appropriate
360 """Check that a return value is appropriate
361
361
362 Return the value if so, None otherwise, warning if invalid.
362 Return the value if so, None otherwise, warning if invalid.
363 """
363 """
364 if r is None or isinstance(r, self._return_type) or \
364 if r is None or isinstance(r, self._return_type) or \
365 (isinstance(r, tuple) and r and isinstance(r[0], self._return_type)):
365 (isinstance(r, tuple) and r and isinstance(r[0], self._return_type)):
366 return r
366 return r
367 else:
367 else:
368 warnings.warn(
368 warnings.warn(
369 "%s formatter returned invalid type %s (expected %s) for object: %s" % \
369 "%s formatter returned invalid type %s (expected %s) for object: %s" % \
370 (self.format_type, type(r), self._return_type, _safe_repr(obj)),
370 (self.format_type, type(r), self._return_type, _safe_repr(obj)),
371 FormatterWarning
371 FormatterWarning
372 )
372 )
373
373
374 def lookup(self, obj):
374 def lookup(self, obj):
375 """Look up the formatter for a given instance.
375 """Look up the formatter for a given instance.
376
376
377 Parameters
377 Parameters
378 ----------
378 ----------
379 obj : object instance
379 obj : object instance
380
380
381 Returns
381 Returns
382 -------
382 -------
383 f : callable
383 f : callable
384 The registered formatting callable for the type.
384 The registered formatting callable for the type.
385
385
386 Raises
386 Raises
387 ------
387 ------
388 KeyError if the type has not been registered.
388 KeyError if the type has not been registered.
389 """
389 """
390 # look for singleton first
390 # look for singleton first
391 obj_id = id(obj)
391 obj_id = id(obj)
392 if obj_id in self.singleton_printers:
392 if obj_id in self.singleton_printers:
393 return self.singleton_printers[obj_id]
393 return self.singleton_printers[obj_id]
394 # then lookup by type
394 # then lookup by type
395 return self.lookup_by_type(_get_type(obj))
395 return self.lookup_by_type(_get_type(obj))
396
396
397 def lookup_by_type(self, typ):
397 def lookup_by_type(self, typ):
398 """Look up the registered formatter for a type.
398 """Look up the registered formatter for a type.
399
399
400 Parameters
400 Parameters
401 ----------
401 ----------
402 typ : type or '__module__.__name__' string for a type
402 typ : type or '__module__.__name__' string for a type
403
403
404 Returns
404 Returns
405 -------
405 -------
406 f : callable
406 f : callable
407 The registered formatting callable for the type.
407 The registered formatting callable for the type.
408
408
409 Raises
409 Raises
410 ------
410 ------
411 KeyError if the type has not been registered.
411 KeyError if the type has not been registered.
412 """
412 """
413 if isinstance(typ, str):
413 if isinstance(typ, str):
414 typ_key = tuple(typ.rsplit('.',1))
414 typ_key = tuple(typ.rsplit('.',1))
415 if typ_key not in self.deferred_printers:
415 if typ_key not in self.deferred_printers:
416 # We may have it cached in the type map. We will have to
416 # We may have it cached in the type map. We will have to
417 # iterate over all of the types to check.
417 # iterate over all of the types to check.
418 for cls in self.type_printers:
418 for cls in self.type_printers:
419 if _mod_name_key(cls) == typ_key:
419 if _mod_name_key(cls) == typ_key:
420 return self.type_printers[cls]
420 return self.type_printers[cls]
421 else:
421 else:
422 return self.deferred_printers[typ_key]
422 return self.deferred_printers[typ_key]
423 else:
423 else:
424 for cls in pretty._get_mro(typ):
424 for cls in pretty._get_mro(typ):
425 if cls in self.type_printers or self._in_deferred_types(cls):
425 if cls in self.type_printers or self._in_deferred_types(cls):
426 return self.type_printers[cls]
426 return self.type_printers[cls]
427
427
428 # If we have reached here, the lookup failed.
428 # If we have reached here, the lookup failed.
429 raise KeyError("No registered printer for {0!r}".format(typ))
429 raise KeyError("No registered printer for {0!r}".format(typ))
430
430
431 def for_type(self, typ, func=None):
431 def for_type(self, typ, func=None):
432 """Add a format function for a given type.
432 """Add a format function for a given type.
433
433
434 Parameters
434 Parameters
435 ----------
435 ----------
436 typ : type or '__module__.__name__' string for a type
436 typ : type or '__module__.__name__' string for a type
437 The class of the object that will be formatted using `func`.
437 The class of the object that will be formatted using `func`.
438 func : callable
438 func : callable
439 A callable for computing the format data.
439 A callable for computing the format data.
440 `func` will be called with the object to be formatted,
440 `func` will be called with the object to be formatted,
441 and will return the raw data in this formatter's format.
441 and will return the raw data in this formatter's format.
442 Subclasses may use a different call signature for the
442 Subclasses may use a different call signature for the
443 `func` argument.
443 `func` argument.
444
444
445 If `func` is None or not specified, there will be no change,
445 If `func` is None or not specified, there will be no change,
446 only returning the current value.
446 only returning the current value.
447
447
448 Returns
448 Returns
449 -------
449 -------
450 oldfunc : callable
450 oldfunc : callable
451 The currently registered callable.
451 The currently registered callable.
452 If you are registering a new formatter,
452 If you are registering a new formatter,
453 this will be the previous value (to enable restoring later).
453 this will be the previous value (to enable restoring later).
454 """
454 """
455 # if string given, interpret as 'pkg.module.class_name'
455 # if string given, interpret as 'pkg.module.class_name'
456 if isinstance(typ, str):
456 if isinstance(typ, str):
457 type_module, type_name = typ.rsplit('.', 1)
457 type_module, type_name = typ.rsplit('.', 1)
458 return self.for_type_by_name(type_module, type_name, func)
458 return self.for_type_by_name(type_module, type_name, func)
459
459
460 try:
460 try:
461 oldfunc = self.lookup_by_type(typ)
461 oldfunc = self.lookup_by_type(typ)
462 except KeyError:
462 except KeyError:
463 oldfunc = None
463 oldfunc = None
464
464
465 if func is not None:
465 if func is not None:
466 self.type_printers[typ] = func
466 self.type_printers[typ] = func
467
467
468 return oldfunc
468 return oldfunc
469
469
470 def for_type_by_name(self, type_module, type_name, func=None):
470 def for_type_by_name(self, type_module, type_name, func=None):
471 """Add a format function for a type specified by the full dotted
471 """Add a format function for a type specified by the full dotted
472 module and name of the type, rather than the type of the object.
472 module and name of the type, rather than the type of the object.
473
473
474 Parameters
474 Parameters
475 ----------
475 ----------
476 type_module : str
476 type_module : str
477 The full dotted name of the module the type is defined in, like
477 The full dotted name of the module the type is defined in, like
478 ``numpy``.
478 ``numpy``.
479 type_name : str
479 type_name : str
480 The name of the type (the class name), like ``dtype``
480 The name of the type (the class name), like ``dtype``
481 func : callable
481 func : callable
482 A callable for computing the format data.
482 A callable for computing the format data.
483 `func` will be called with the object to be formatted,
483 `func` will be called with the object to be formatted,
484 and will return the raw data in this formatter's format.
484 and will return the raw data in this formatter's format.
485 Subclasses may use a different call signature for the
485 Subclasses may use a different call signature for the
486 `func` argument.
486 `func` argument.
487
487
488 If `func` is None or unspecified, there will be no change,
488 If `func` is None or unspecified, there will be no change,
489 only returning the current value.
489 only returning the current value.
490
490
491 Returns
491 Returns
492 -------
492 -------
493 oldfunc : callable
493 oldfunc : callable
494 The currently registered callable.
494 The currently registered callable.
495 If you are registering a new formatter,
495 If you are registering a new formatter,
496 this will be the previous value (to enable restoring later).
496 this will be the previous value (to enable restoring later).
497 """
497 """
498 key = (type_module, type_name)
498 key = (type_module, type_name)
499
499
500 try:
500 try:
501 oldfunc = self.lookup_by_type("%s.%s" % key)
501 oldfunc = self.lookup_by_type("%s.%s" % key)
502 except KeyError:
502 except KeyError:
503 oldfunc = None
503 oldfunc = None
504
504
505 if func is not None:
505 if func is not None:
506 self.deferred_printers[key] = func
506 self.deferred_printers[key] = func
507 return oldfunc
507 return oldfunc
508
508
509 def pop(self, typ, default=_raise_key_error):
509 def pop(self, typ, default=_raise_key_error):
510 """Pop a formatter for the given type.
510 """Pop a formatter for the given type.
511
511
512 Parameters
512 Parameters
513 ----------
513 ----------
514 typ : type or '__module__.__name__' string for a type
514 typ : type or '__module__.__name__' string for a type
515 default : object
515 default : object
516 value to be returned if no formatter is registered for typ.
516 value to be returned if no formatter is registered for typ.
517
517
518 Returns
518 Returns
519 -------
519 -------
520 obj : object
520 obj : object
521 The last registered object for the type.
521 The last registered object for the type.
522
522
523 Raises
523 Raises
524 ------
524 ------
525 KeyError if the type is not registered and default is not specified.
525 KeyError if the type is not registered and default is not specified.
526 """
526 """
527
527
528 if isinstance(typ, str):
528 if isinstance(typ, str):
529 typ_key = tuple(typ.rsplit('.',1))
529 typ_key = tuple(typ.rsplit('.',1))
530 if typ_key not in self.deferred_printers:
530 if typ_key not in self.deferred_printers:
531 # We may have it cached in the type map. We will have to
531 # We may have it cached in the type map. We will have to
532 # iterate over all of the types to check.
532 # iterate over all of the types to check.
533 for cls in self.type_printers:
533 for cls in self.type_printers:
534 if _mod_name_key(cls) == typ_key:
534 if _mod_name_key(cls) == typ_key:
535 old = self.type_printers.pop(cls)
535 old = self.type_printers.pop(cls)
536 break
536 break
537 else:
537 else:
538 old = default
538 old = default
539 else:
539 else:
540 old = self.deferred_printers.pop(typ_key)
540 old = self.deferred_printers.pop(typ_key)
541 else:
541 else:
542 if typ in self.type_printers:
542 if typ in self.type_printers:
543 old = self.type_printers.pop(typ)
543 old = self.type_printers.pop(typ)
544 else:
544 else:
545 old = self.deferred_printers.pop(_mod_name_key(typ), default)
545 old = self.deferred_printers.pop(_mod_name_key(typ), default)
546 if old is _raise_key_error:
546 if old is _raise_key_error:
547 raise KeyError("No registered value for {0!r}".format(typ))
547 raise KeyError("No registered value for {0!r}".format(typ))
548 return old
548 return old
549
549
550 def _in_deferred_types(self, cls):
550 def _in_deferred_types(self, cls):
551 """
551 """
552 Check if the given class is specified in the deferred type registry.
552 Check if the given class is specified in the deferred type registry.
553
553
554 Successful matches will be moved to the regular type registry for future use.
554 Successful matches will be moved to the regular type registry for future use.
555 """
555 """
556 mod = getattr(cls, '__module__', None)
556 mod = getattr(cls, '__module__', None)
557 name = getattr(cls, '__name__', None)
557 name = getattr(cls, '__name__', None)
558 key = (mod, name)
558 key = (mod, name)
559 if key in self.deferred_printers:
559 if key in self.deferred_printers:
560 # Move the printer over to the regular registry.
560 # Move the printer over to the regular registry.
561 printer = self.deferred_printers.pop(key)
561 printer = self.deferred_printers.pop(key)
562 self.type_printers[cls] = printer
562 self.type_printers[cls] = printer
563 return True
563 return True
564 return False
564 return False
565
565
566
566
567 class PlainTextFormatter(BaseFormatter):
567 class PlainTextFormatter(BaseFormatter):
568 """The default pretty-printer.
568 """The default pretty-printer.
569
569
570 This uses :mod:`IPython.lib.pretty` to compute the format data of
570 This uses :mod:`IPython.lib.pretty` to compute the format data of
571 the object. If the object cannot be pretty printed, :func:`repr` is used.
571 the object. If the object cannot be pretty printed, :func:`repr` is used.
572 See the documentation of :mod:`IPython.lib.pretty` for details on
572 See the documentation of :mod:`IPython.lib.pretty` for details on
573 how to write pretty printers. Here is a simple example::
573 how to write pretty printers. Here is a simple example::
574
574
575 def dtype_pprinter(obj, p, cycle):
575 def dtype_pprinter(obj, p, cycle):
576 if cycle:
576 if cycle:
577 return p.text('dtype(...)')
577 return p.text('dtype(...)')
578 if hasattr(obj, 'fields'):
578 if hasattr(obj, 'fields'):
579 if obj.fields is None:
579 if obj.fields is None:
580 p.text(repr(obj))
580 p.text(repr(obj))
581 else:
581 else:
582 p.begin_group(7, 'dtype([')
582 p.begin_group(7, 'dtype([')
583 for i, field in enumerate(obj.descr):
583 for i, field in enumerate(obj.descr):
584 if i > 0:
584 if i > 0:
585 p.text(',')
585 p.text(',')
586 p.breakable()
586 p.breakable()
587 p.pretty(field)
587 p.pretty(field)
588 p.end_group(7, '])')
588 p.end_group(7, '])')
589 """
589 """
590
590
591 # The format type of data returned.
591 # The format type of data returned.
592 format_type = Unicode('text/plain')
592 format_type = Unicode('text/plain')
593
593
594 # This subclass ignores this attribute as it always need to return
594 # This subclass ignores this attribute as it always need to return
595 # something.
595 # something.
596 enabled = Bool(True).tag(config=False)
596 enabled = Bool(True).tag(config=False)
597
597
598 max_seq_length = Integer(pretty.MAX_SEQ_LENGTH,
598 max_seq_length = Integer(pretty.MAX_SEQ_LENGTH,
599 help="""Truncate large collections (lists, dicts, tuples, sets) to this size.
599 help="""Truncate large collections (lists, dicts, tuples, sets) to this size.
600
600
601 Set to 0 to disable truncation.
601 Set to 0 to disable truncation.
602 """
602 """
603 ).tag(config=True)
603 ).tag(config=True)
604
604
605 # Look for a _repr_pretty_ methods to use for pretty printing.
605 # Look for a _repr_pretty_ methods to use for pretty printing.
606 print_method = ObjectName('_repr_pretty_')
606 print_method = ObjectName('_repr_pretty_')
607
607
608 # Whether to pretty-print or not.
608 # Whether to pretty-print or not.
609 pprint = Bool(True).tag(config=True)
609 pprint = Bool(True).tag(config=True)
610
610
611 # Whether to be verbose or not.
611 # Whether to be verbose or not.
612 verbose = Bool(False).tag(config=True)
612 verbose = Bool(False).tag(config=True)
613
613
614 # The maximum width.
614 # The maximum width.
615 max_width = Integer(79).tag(config=True)
615 max_width = Integer(79).tag(config=True)
616
616
617 # The newline character.
617 # The newline character.
618 newline = Unicode('\n').tag(config=True)
618 newline = Unicode('\n').tag(config=True)
619
619
620 # format-string for pprinting floats
620 # format-string for pprinting floats
621 float_format = Unicode('%r')
621 float_format = Unicode('%r')
622 # setter for float precision, either int or direct format-string
622 # setter for float precision, either int or direct format-string
623 float_precision = CUnicode('').tag(config=True)
623 float_precision = CUnicode('').tag(config=True)
624
624
625 @observe('float_precision')
625 @observe('float_precision')
626 def _float_precision_changed(self, change):
626 def _float_precision_changed(self, change):
627 """float_precision changed, set float_format accordingly.
627 """float_precision changed, set float_format accordingly.
628
628
629 float_precision can be set by int or str.
629 float_precision can be set by int or str.
630 This will set float_format, after interpreting input.
630 This will set float_format, after interpreting input.
631 If numpy has been imported, numpy print precision will also be set.
631 If numpy has been imported, numpy print precision will also be set.
632
632
633 integer `n` sets format to '%.nf', otherwise, format set directly.
633 integer `n` sets format to '%.nf', otherwise, format set directly.
634
634
635 An empty string returns to defaults (repr for float, 8 for numpy).
635 An empty string returns to defaults (repr for float, 8 for numpy).
636
636
637 This parameter can be set via the '%precision' magic.
637 This parameter can be set via the '%precision' magic.
638 """
638 """
639 new = change['new']
639 new = change['new']
640 if '%' in new:
640 if '%' in new:
641 # got explicit format string
641 # got explicit format string
642 fmt = new
642 fmt = new
643 try:
643 try:
644 fmt%3.14159
644 fmt%3.14159
645 except Exception as e:
645 except Exception as e:
646 raise ValueError("Precision must be int or format string, not %r"%new) from e
646 raise ValueError("Precision must be int or format string, not %r"%new) from e
647 elif new:
647 elif new:
648 # otherwise, should be an int
648 # otherwise, should be an int
649 try:
649 try:
650 i = int(new)
650 i = int(new)
651 assert i >= 0
651 assert i >= 0
652 except ValueError as e:
652 except ValueError as e:
653 raise ValueError("Precision must be int or format string, not %r"%new) from e
653 raise ValueError("Precision must be int or format string, not %r"%new) from e
654 except AssertionError as e:
654 except AssertionError as e:
655 raise ValueError("int precision must be non-negative, not %r"%i) from e
655 raise ValueError("int precision must be non-negative, not %r"%i) from e
656
656
657 fmt = '%%.%if'%i
657 fmt = '%%.%if'%i
658 if 'numpy' in sys.modules:
658 if 'numpy' in sys.modules:
659 # set numpy precision if it has been imported
659 # set numpy precision if it has been imported
660 import numpy
660 import numpy
661 numpy.set_printoptions(precision=i)
661 numpy.set_printoptions(precision=i)
662 else:
662 else:
663 # default back to repr
663 # default back to repr
664 fmt = '%r'
664 fmt = '%r'
665 if 'numpy' in sys.modules:
665 if 'numpy' in sys.modules:
666 import numpy
666 import numpy
667 # numpy default is 8
667 # numpy default is 8
668 numpy.set_printoptions(precision=8)
668 numpy.set_printoptions(precision=8)
669 self.float_format = fmt
669 self.float_format = fmt
670
670
671 # Use the default pretty printers from IPython.lib.pretty.
671 # Use the default pretty printers from IPython.lib.pretty.
672 @default('singleton_printers')
672 @default('singleton_printers')
673 def _singleton_printers_default(self):
673 def _singleton_printers_default(self):
674 return pretty._singleton_pprinters.copy()
674 return pretty._singleton_pprinters.copy()
675
675
676 @default('type_printers')
676 @default('type_printers')
677 def _type_printers_default(self):
677 def _type_printers_default(self):
678 d = pretty._type_pprinters.copy()
678 d = pretty._type_pprinters.copy()
679 d[float] = lambda obj,p,cycle: p.text(self.float_format%obj)
679 d[float] = lambda obj,p,cycle: p.text(self.float_format%obj)
680 # if NumPy is used, set precision for its float64 type
680 # if NumPy is used, set precision for its float64 type
681 if 'numpy' in sys.modules:
681 if "numpy" in sys.modules:
682 import numpy
682 import numpy
683 d[numpy.float64] = lambda obj,p,cycle: p.text(self.float_format%obj)
683
684 d[numpy.float64] = lambda obj, p, cycle: p.text(self.float_format % obj)
684 return d
685 return d
685
686
686 @default('deferred_printers')
687 @default('deferred_printers')
687 def _deferred_printers_default(self):
688 def _deferred_printers_default(self):
688 return pretty._deferred_type_pprinters.copy()
689 return pretty._deferred_type_pprinters.copy()
689
690
690 #### FormatterABC interface ####
691 #### FormatterABC interface ####
691
692
692 @catch_format_error
693 @catch_format_error
693 def __call__(self, obj):
694 def __call__(self, obj):
694 """Compute the pretty representation of the object."""
695 """Compute the pretty representation of the object."""
695 if not self.pprint:
696 if not self.pprint:
696 return repr(obj)
697 return repr(obj)
697 else:
698 else:
698 stream = StringIO()
699 stream = StringIO()
699 printer = pretty.RepresentationPrinter(stream, self.verbose,
700 printer = pretty.RepresentationPrinter(stream, self.verbose,
700 self.max_width, self.newline,
701 self.max_width, self.newline,
701 max_seq_length=self.max_seq_length,
702 max_seq_length=self.max_seq_length,
702 singleton_pprinters=self.singleton_printers,
703 singleton_pprinters=self.singleton_printers,
703 type_pprinters=self.type_printers,
704 type_pprinters=self.type_printers,
704 deferred_pprinters=self.deferred_printers)
705 deferred_pprinters=self.deferred_printers)
705 printer.pretty(obj)
706 printer.pretty(obj)
706 printer.flush()
707 printer.flush()
707 return stream.getvalue()
708 return stream.getvalue()
708
709
709
710
710 class HTMLFormatter(BaseFormatter):
711 class HTMLFormatter(BaseFormatter):
711 """An HTML formatter.
712 """An HTML formatter.
712
713
713 To define the callables that compute the HTML representation of your
714 To define the callables that compute the HTML representation of your
714 objects, define a :meth:`_repr_html_` method or use the :meth:`for_type`
715 objects, define a :meth:`_repr_html_` method or use the :meth:`for_type`
715 or :meth:`for_type_by_name` methods to register functions that handle
716 or :meth:`for_type_by_name` methods to register functions that handle
716 this.
717 this.
717
718
718 The return value of this formatter should be a valid HTML snippet that
719 The return value of this formatter should be a valid HTML snippet that
719 could be injected into an existing DOM. It should *not* include the
720 could be injected into an existing DOM. It should *not* include the
720 ```<html>`` or ```<body>`` tags.
721 ```<html>`` or ```<body>`` tags.
721 """
722 """
722 format_type = Unicode('text/html')
723 format_type = Unicode('text/html')
723
724
724 print_method = ObjectName('_repr_html_')
725 print_method = ObjectName('_repr_html_')
725
726
726
727
727 class MarkdownFormatter(BaseFormatter):
728 class MarkdownFormatter(BaseFormatter):
728 """A Markdown formatter.
729 """A Markdown formatter.
729
730
730 To define the callables that compute the Markdown representation of your
731 To define the callables that compute the Markdown representation of your
731 objects, define a :meth:`_repr_markdown_` method or use the :meth:`for_type`
732 objects, define a :meth:`_repr_markdown_` method or use the :meth:`for_type`
732 or :meth:`for_type_by_name` methods to register functions that handle
733 or :meth:`for_type_by_name` methods to register functions that handle
733 this.
734 this.
734
735
735 The return value of this formatter should be a valid Markdown.
736 The return value of this formatter should be a valid Markdown.
736 """
737 """
737 format_type = Unicode('text/markdown')
738 format_type = Unicode('text/markdown')
738
739
739 print_method = ObjectName('_repr_markdown_')
740 print_method = ObjectName('_repr_markdown_')
740
741
741 class SVGFormatter(BaseFormatter):
742 class SVGFormatter(BaseFormatter):
742 """An SVG formatter.
743 """An SVG formatter.
743
744
744 To define the callables that compute the SVG representation of your
745 To define the callables that compute the SVG representation of your
745 objects, define a :meth:`_repr_svg_` method or use the :meth:`for_type`
746 objects, define a :meth:`_repr_svg_` method or use the :meth:`for_type`
746 or :meth:`for_type_by_name` methods to register functions that handle
747 or :meth:`for_type_by_name` methods to register functions that handle
747 this.
748 this.
748
749
749 The return value of this formatter should be valid SVG enclosed in
750 The return value of this formatter should be valid SVG enclosed in
750 ```<svg>``` tags, that could be injected into an existing DOM. It should
751 ```<svg>``` tags, that could be injected into an existing DOM. It should
751 *not* include the ```<html>`` or ```<body>`` tags.
752 *not* include the ```<html>`` or ```<body>`` tags.
752 """
753 """
753 format_type = Unicode('image/svg+xml')
754 format_type = Unicode('image/svg+xml')
754
755
755 print_method = ObjectName('_repr_svg_')
756 print_method = ObjectName('_repr_svg_')
756
757
757
758
758 class PNGFormatter(BaseFormatter):
759 class PNGFormatter(BaseFormatter):
759 """A PNG formatter.
760 """A PNG formatter.
760
761
761 To define the callables that compute the PNG representation of your
762 To define the callables that compute the PNG representation of your
762 objects, define a :meth:`_repr_png_` method or use the :meth:`for_type`
763 objects, define a :meth:`_repr_png_` method or use the :meth:`for_type`
763 or :meth:`for_type_by_name` methods to register functions that handle
764 or :meth:`for_type_by_name` methods to register functions that handle
764 this.
765 this.
765
766
766 The return value of this formatter should be raw PNG data, *not*
767 The return value of this formatter should be raw PNG data, *not*
767 base64 encoded.
768 base64 encoded.
768 """
769 """
769 format_type = Unicode('image/png')
770 format_type = Unicode('image/png')
770
771
771 print_method = ObjectName('_repr_png_')
772 print_method = ObjectName('_repr_png_')
772
773
773 _return_type = (bytes, str)
774 _return_type = (bytes, str)
774
775
775
776
776 class JPEGFormatter(BaseFormatter):
777 class JPEGFormatter(BaseFormatter):
777 """A JPEG formatter.
778 """A JPEG formatter.
778
779
779 To define the callables that compute the JPEG representation of your
780 To define the callables that compute the JPEG representation of your
780 objects, define a :meth:`_repr_jpeg_` method or use the :meth:`for_type`
781 objects, define a :meth:`_repr_jpeg_` method or use the :meth:`for_type`
781 or :meth:`for_type_by_name` methods to register functions that handle
782 or :meth:`for_type_by_name` methods to register functions that handle
782 this.
783 this.
783
784
784 The return value of this formatter should be raw JPEG data, *not*
785 The return value of this formatter should be raw JPEG data, *not*
785 base64 encoded.
786 base64 encoded.
786 """
787 """
787 format_type = Unicode('image/jpeg')
788 format_type = Unicode('image/jpeg')
788
789
789 print_method = ObjectName('_repr_jpeg_')
790 print_method = ObjectName('_repr_jpeg_')
790
791
791 _return_type = (bytes, str)
792 _return_type = (bytes, str)
792
793
793
794
794 class LatexFormatter(BaseFormatter):
795 class LatexFormatter(BaseFormatter):
795 """A LaTeX formatter.
796 """A LaTeX formatter.
796
797
797 To define the callables that compute the LaTeX representation of your
798 To define the callables that compute the LaTeX representation of your
798 objects, define a :meth:`_repr_latex_` method or use the :meth:`for_type`
799 objects, define a :meth:`_repr_latex_` method or use the :meth:`for_type`
799 or :meth:`for_type_by_name` methods to register functions that handle
800 or :meth:`for_type_by_name` methods to register functions that handle
800 this.
801 this.
801
802
802 The return value of this formatter should be a valid LaTeX equation,
803 The return value of this formatter should be a valid LaTeX equation,
803 enclosed in either ```$```, ```$$``` or another LaTeX equation
804 enclosed in either ```$```, ```$$``` or another LaTeX equation
804 environment.
805 environment.
805 """
806 """
806 format_type = Unicode('text/latex')
807 format_type = Unicode('text/latex')
807
808
808 print_method = ObjectName('_repr_latex_')
809 print_method = ObjectName('_repr_latex_')
809
810
810
811
811 class JSONFormatter(BaseFormatter):
812 class JSONFormatter(BaseFormatter):
812 """A JSON string formatter.
813 """A JSON string formatter.
813
814
814 To define the callables that compute the JSONable representation of
815 To define the callables that compute the JSONable representation of
815 your objects, define a :meth:`_repr_json_` method or use the :meth:`for_type`
816 your objects, define a :meth:`_repr_json_` method or use the :meth:`for_type`
816 or :meth:`for_type_by_name` methods to register functions that handle
817 or :meth:`for_type_by_name` methods to register functions that handle
817 this.
818 this.
818
819
819 The return value of this formatter should be a JSONable list or dict.
820 The return value of this formatter should be a JSONable list or dict.
820 JSON scalars (None, number, string) are not allowed, only dict or list containers.
821 JSON scalars (None, number, string) are not allowed, only dict or list containers.
821 """
822 """
822 format_type = Unicode('application/json')
823 format_type = Unicode('application/json')
823 _return_type = (list, dict)
824 _return_type = (list, dict)
824
825
825 print_method = ObjectName('_repr_json_')
826 print_method = ObjectName('_repr_json_')
826
827
827 def _check_return(self, r, obj):
828 def _check_return(self, r, obj):
828 """Check that a return value is appropriate
829 """Check that a return value is appropriate
829
830
830 Return the value if so, None otherwise, warning if invalid.
831 Return the value if so, None otherwise, warning if invalid.
831 """
832 """
832 if r is None:
833 if r is None:
833 return
834 return
834 md = None
835 md = None
835 if isinstance(r, tuple):
836 if isinstance(r, tuple):
836 # unpack data, metadata tuple for type checking on first element
837 # unpack data, metadata tuple for type checking on first element
837 r, md = r
838 r, md = r
838
839
839 # handle deprecated JSON-as-string form from IPython < 3
840 # handle deprecated JSON-as-string form from IPython < 3
840 if isinstance(r, str):
841 if isinstance(r, str):
841 warnings.warn("JSON expects JSONable list/dict containers, not JSON strings",
842 warnings.warn("JSON expects JSONable list/dict containers, not JSON strings",
842 FormatterWarning)
843 FormatterWarning)
843 r = json.loads(r)
844 r = json.loads(r)
844
845
845 if md is not None:
846 if md is not None:
846 # put the tuple back together
847 # put the tuple back together
847 r = (r, md)
848 r = (r, md)
848 return super(JSONFormatter, self)._check_return(r, obj)
849 return super(JSONFormatter, self)._check_return(r, obj)
849
850
850
851
851 class JavascriptFormatter(BaseFormatter):
852 class JavascriptFormatter(BaseFormatter):
852 """A Javascript formatter.
853 """A Javascript formatter.
853
854
854 To define the callables that compute the Javascript representation of
855 To define the callables that compute the Javascript representation of
855 your objects, define a :meth:`_repr_javascript_` method or use the
856 your objects, define a :meth:`_repr_javascript_` method or use the
856 :meth:`for_type` or :meth:`for_type_by_name` methods to register functions
857 :meth:`for_type` or :meth:`for_type_by_name` methods to register functions
857 that handle this.
858 that handle this.
858
859
859 The return value of this formatter should be valid Javascript code and
860 The return value of this formatter should be valid Javascript code and
860 should *not* be enclosed in ```<script>``` tags.
861 should *not* be enclosed in ```<script>``` tags.
861 """
862 """
862 format_type = Unicode('application/javascript')
863 format_type = Unicode('application/javascript')
863
864
864 print_method = ObjectName('_repr_javascript_')
865 print_method = ObjectName('_repr_javascript_')
865
866
866
867
867 class PDFFormatter(BaseFormatter):
868 class PDFFormatter(BaseFormatter):
868 """A PDF formatter.
869 """A PDF formatter.
869
870
870 To define the callables that compute the PDF representation of your
871 To define the callables that compute the PDF representation of your
871 objects, define a :meth:`_repr_pdf_` method or use the :meth:`for_type`
872 objects, define a :meth:`_repr_pdf_` method or use the :meth:`for_type`
872 or :meth:`for_type_by_name` methods to register functions that handle
873 or :meth:`for_type_by_name` methods to register functions that handle
873 this.
874 this.
874
875
875 The return value of this formatter should be raw PDF data, *not*
876 The return value of this formatter should be raw PDF data, *not*
876 base64 encoded.
877 base64 encoded.
877 """
878 """
878 format_type = Unicode('application/pdf')
879 format_type = Unicode('application/pdf')
879
880
880 print_method = ObjectName('_repr_pdf_')
881 print_method = ObjectName('_repr_pdf_')
881
882
882 _return_type = (bytes, str)
883 _return_type = (bytes, str)
883
884
884 class IPythonDisplayFormatter(BaseFormatter):
885 class IPythonDisplayFormatter(BaseFormatter):
885 """An escape-hatch Formatter for objects that know how to display themselves.
886 """An escape-hatch Formatter for objects that know how to display themselves.
886
887
887 To define the callables that compute the representation of your
888 To define the callables that compute the representation of your
888 objects, define a :meth:`_ipython_display_` method or use the :meth:`for_type`
889 objects, define a :meth:`_ipython_display_` method or use the :meth:`for_type`
889 or :meth:`for_type_by_name` methods to register functions that handle
890 or :meth:`for_type_by_name` methods to register functions that handle
890 this. Unlike mime-type displays, this method should not return anything,
891 this. Unlike mime-type displays, this method should not return anything,
891 instead calling any appropriate display methods itself.
892 instead calling any appropriate display methods itself.
892
893
893 This display formatter has highest priority.
894 This display formatter has highest priority.
894 If it fires, no other display formatter will be called.
895 If it fires, no other display formatter will be called.
895
896
896 Prior to IPython 6.1, `_ipython_display_` was the only way to display custom mime-types
897 Prior to IPython 6.1, `_ipython_display_` was the only way to display custom mime-types
897 without registering a new Formatter.
898 without registering a new Formatter.
898
899
899 IPython 6.1 introduces `_repr_mimebundle_` for displaying custom mime-types,
900 IPython 6.1 introduces `_repr_mimebundle_` for displaying custom mime-types,
900 so `_ipython_display_` should only be used for objects that require unusual
901 so `_ipython_display_` should only be used for objects that require unusual
901 display patterns, such as multiple display calls.
902 display patterns, such as multiple display calls.
902 """
903 """
903 print_method = ObjectName('_ipython_display_')
904 print_method = ObjectName('_ipython_display_')
904 _return_type = (type(None), bool)
905 _return_type = (type(None), bool)
905
906
906 @catch_format_error
907 @catch_format_error
907 def __call__(self, obj):
908 def __call__(self, obj):
908 """Compute the format for an object."""
909 """Compute the format for an object."""
909 if self.enabled:
910 if self.enabled:
910 # lookup registered printer
911 # lookup registered printer
911 try:
912 try:
912 printer = self.lookup(obj)
913 printer = self.lookup(obj)
913 except KeyError:
914 except KeyError:
914 pass
915 pass
915 else:
916 else:
916 printer(obj)
917 printer(obj)
917 return True
918 return True
918 # Finally look for special method names
919 # Finally look for special method names
919 method = get_real_method(obj, self.print_method)
920 method = get_real_method(obj, self.print_method)
920 if method is not None:
921 if method is not None:
921 method()
922 method()
922 return True
923 return True
923
924
924
925
925 class MimeBundleFormatter(BaseFormatter):
926 class MimeBundleFormatter(BaseFormatter):
926 """A Formatter for arbitrary mime-types.
927 """A Formatter for arbitrary mime-types.
927
928
928 Unlike other `_repr_<mimetype>_` methods,
929 Unlike other `_repr_<mimetype>_` methods,
929 `_repr_mimebundle_` should return mime-bundle data,
930 `_repr_mimebundle_` should return mime-bundle data,
930 either the mime-keyed `data` dictionary or the tuple `(data, metadata)`.
931 either the mime-keyed `data` dictionary or the tuple `(data, metadata)`.
931 Any mime-type is valid.
932 Any mime-type is valid.
932
933
933 To define the callables that compute the mime-bundle representation of your
934 To define the callables that compute the mime-bundle representation of your
934 objects, define a :meth:`_repr_mimebundle_` method or use the :meth:`for_type`
935 objects, define a :meth:`_repr_mimebundle_` method or use the :meth:`for_type`
935 or :meth:`for_type_by_name` methods to register functions that handle
936 or :meth:`for_type_by_name` methods to register functions that handle
936 this.
937 this.
937
938
938 .. versionadded:: 6.1
939 .. versionadded:: 6.1
939 """
940 """
940 print_method = ObjectName('_repr_mimebundle_')
941 print_method = ObjectName('_repr_mimebundle_')
941 _return_type = dict
942 _return_type = dict
942
943
943 def _check_return(self, r, obj):
944 def _check_return(self, r, obj):
944 r = super(MimeBundleFormatter, self)._check_return(r, obj)
945 r = super(MimeBundleFormatter, self)._check_return(r, obj)
945 # always return (data, metadata):
946 # always return (data, metadata):
946 if r is None:
947 if r is None:
947 return {}, {}
948 return {}, {}
948 if not isinstance(r, tuple):
949 if not isinstance(r, tuple):
949 return r, {}
950 return r, {}
950 return r
951 return r
951
952
952 @catch_format_error
953 @catch_format_error
953 def __call__(self, obj, include=None, exclude=None):
954 def __call__(self, obj, include=None, exclude=None):
954 """Compute the format for an object.
955 """Compute the format for an object.
955
956
956 Identical to parent's method but we pass extra parameters to the method.
957 Identical to parent's method but we pass extra parameters to the method.
957
958
958 Unlike other _repr_*_ `_repr_mimebundle_` should allow extra kwargs, in
959 Unlike other _repr_*_ `_repr_mimebundle_` should allow extra kwargs, in
959 particular `include` and `exclude`.
960 particular `include` and `exclude`.
960 """
961 """
961 if self.enabled:
962 if self.enabled:
962 # lookup registered printer
963 # lookup registered printer
963 try:
964 try:
964 printer = self.lookup(obj)
965 printer = self.lookup(obj)
965 except KeyError:
966 except KeyError:
966 pass
967 pass
967 else:
968 else:
968 return printer(obj)
969 return printer(obj)
969 # Finally look for special method names
970 # Finally look for special method names
970 method = get_real_method(obj, self.print_method)
971 method = get_real_method(obj, self.print_method)
971
972
972 if method is not None:
973 if method is not None:
973 return method(include=include, exclude=exclude)
974 return method(include=include, exclude=exclude)
974 return None
975 return None
975 else:
976 else:
976 return None
977 return None
977
978
978
979
979 FormatterABC.register(BaseFormatter)
980 FormatterABC.register(BaseFormatter)
980 FormatterABC.register(PlainTextFormatter)
981 FormatterABC.register(PlainTextFormatter)
981 FormatterABC.register(HTMLFormatter)
982 FormatterABC.register(HTMLFormatter)
982 FormatterABC.register(MarkdownFormatter)
983 FormatterABC.register(MarkdownFormatter)
983 FormatterABC.register(SVGFormatter)
984 FormatterABC.register(SVGFormatter)
984 FormatterABC.register(PNGFormatter)
985 FormatterABC.register(PNGFormatter)
985 FormatterABC.register(PDFFormatter)
986 FormatterABC.register(PDFFormatter)
986 FormatterABC.register(JPEGFormatter)
987 FormatterABC.register(JPEGFormatter)
987 FormatterABC.register(LatexFormatter)
988 FormatterABC.register(LatexFormatter)
988 FormatterABC.register(JSONFormatter)
989 FormatterABC.register(JSONFormatter)
989 FormatterABC.register(JavascriptFormatter)
990 FormatterABC.register(JavascriptFormatter)
990 FormatterABC.register(IPythonDisplayFormatter)
991 FormatterABC.register(IPythonDisplayFormatter)
991 FormatterABC.register(MimeBundleFormatter)
992 FormatterABC.register(MimeBundleFormatter)
992
993
993
994
994 def format_display_data(obj, include=None, exclude=None):
995 def format_display_data(obj, include=None, exclude=None):
995 """Return a format data dict for an object.
996 """Return a format data dict for an object.
996
997
997 By default all format types will be computed.
998 By default all format types will be computed.
998
999
999 Parameters
1000 Parameters
1000 ----------
1001 ----------
1001 obj : object
1002 obj : object
1002 The Python object whose format data will be computed.
1003 The Python object whose format data will be computed.
1003
1004
1004 Returns
1005 Returns
1005 -------
1006 -------
1006 format_dict : dict
1007 format_dict : dict
1007 A dictionary of key/value pairs, one or each format that was
1008 A dictionary of key/value pairs, one or each format that was
1008 generated for the object. The keys are the format types, which
1009 generated for the object. The keys are the format types, which
1009 will usually be MIME type strings and the values and JSON'able
1010 will usually be MIME type strings and the values and JSON'able
1010 data structure containing the raw data for the representation in
1011 data structure containing the raw data for the representation in
1011 that format.
1012 that format.
1012 include : list or tuple, optional
1013 include : list or tuple, optional
1013 A list of format type strings (MIME types) to include in the
1014 A list of format type strings (MIME types) to include in the
1014 format data dict. If this is set *only* the format types included
1015 format data dict. If this is set *only* the format types included
1015 in this list will be computed.
1016 in this list will be computed.
1016 exclude : list or tuple, optional
1017 exclude : list or tuple, optional
1017 A list of format type string (MIME types) to exclude in the format
1018 A list of format type string (MIME types) to exclude in the format
1018 data dict. If this is set all format types will be computed,
1019 data dict. If this is set all format types will be computed,
1019 except for those included in this argument.
1020 except for those included in this argument.
1020 """
1021 """
1021 from .interactiveshell import InteractiveShell
1022 from .interactiveshell import InteractiveShell
1022
1023
1023 return InteractiveShell.instance().display_formatter.format(
1024 return InteractiveShell.instance().display_formatter.format(
1024 obj,
1025 obj,
1025 include,
1026 include,
1026 exclude
1027 exclude
1027 )
1028 )
General Comments 0
You need to be logged in to leave comments. Login now