Show More
@@ -0,0 +1,124 b'' | |||
|
1 | # -*- coding: utf-8 -*- | |
|
2 | """Displayhook formatters. | |
|
3 | ||
|
4 | Authors: | |
|
5 | ||
|
6 | * Robert Kern | |
|
7 | """ | |
|
8 | ||
|
9 | import abc | |
|
10 | from cStringIO import StringIO | |
|
11 | ||
|
12 | from IPython.config.configurable import Configurable | |
|
13 | from IPython.external import pretty | |
|
14 | from IPython.utils.traitlets import Bool, Dict, Int, Str | |
|
15 | ||
|
16 | ||
|
17 | class DefaultFormatter(Configurable): | |
|
18 | """ The default pretty-printer. | |
|
19 | """ | |
|
20 | ||
|
21 | # The ID of the formatter. | |
|
22 | id = Str('default') | |
|
23 | ||
|
24 | # The kind of data returned. | |
|
25 | format = Str('text') | |
|
26 | ||
|
27 | # Whether to pretty-print or not. | |
|
28 | pprint = Bool(True) | |
|
29 | ||
|
30 | # Whether to be verbose or not. | |
|
31 | verbose = Bool(False) | |
|
32 | ||
|
33 | # The maximum width. | |
|
34 | max_width = Int(79) | |
|
35 | ||
|
36 | # The newline character. | |
|
37 | newline = Str('\n') | |
|
38 | ||
|
39 | # The singleton prettyprinters. | |
|
40 | # Maps the IDs of the builtin singleton objects to the format functions. | |
|
41 | singleton_pprinters = Dict() | |
|
42 | def _singleton_pprinters_default(self): | |
|
43 | return pretty._singleton_pprinters.copy() | |
|
44 | ||
|
45 | # The type-specific prettyprinters. | |
|
46 | # Map type objects to the format functions. | |
|
47 | type_pprinters = Dict() | |
|
48 | def _type_pprinters_default(self): | |
|
49 | return pretty._type_pprinters.copy() | |
|
50 | ||
|
51 | # The deferred-import type-specific prettyprinters. | |
|
52 | # Map (modulename, classname) pairs to the format functions. | |
|
53 | deferred_pprinters = Dict() | |
|
54 | def _deferred_pprinters_default(self): | |
|
55 | return pretty._deferred_type_pprinters.copy() | |
|
56 | ||
|
57 | #### FormatterABC interface #### | |
|
58 | ||
|
59 | def __call__(self, obj): | |
|
60 | """ Format the object. | |
|
61 | """ | |
|
62 | if not self.pprint: | |
|
63 | r = repr(obj) | |
|
64 | if r is None: | |
|
65 | # It can happen. | |
|
66 | r = '' | |
|
67 | return r | |
|
68 | else: | |
|
69 | stream = StringIO() | |
|
70 | printer = pretty.RepresentationPrinter(stream, self.verbose, | |
|
71 | self.max_width, self.newline, | |
|
72 | singleton_pprinters=self.singleton_pprinters, | |
|
73 | type_pprinters=self.type_pprinters, | |
|
74 | deferred_pprinters=self.deferred_pprinters) | |
|
75 | printer.pretty(obj) | |
|
76 | printer.flush() | |
|
77 | return stream.getvalue() | |
|
78 | ||
|
79 | ||
|
80 | #### DefaultFormatter interface #### | |
|
81 | ||
|
82 | def for_type(self, typ, func): | |
|
83 | """ | |
|
84 | Add a pretty printer for a given type. | |
|
85 | """ | |
|
86 | oldfunc = self.type_pprinters.get(typ, None) | |
|
87 | if func is not None: | |
|
88 | # To support easy restoration of old pprinters, we need to ignore | |
|
89 | # Nones. | |
|
90 | self.type_pprinters[typ] = func | |
|
91 | return oldfunc | |
|
92 | ||
|
93 | def for_type_by_name(self, type_module, type_name, func): | |
|
94 | """ | |
|
95 | Add a pretty printer for a type specified by the module and name of | |
|
96 | a type rather than the type object itself. | |
|
97 | """ | |
|
98 | key = (type_module, type_name) | |
|
99 | oldfunc = self.deferred_pprinters.get(key, None) | |
|
100 | if func is not None: | |
|
101 | # To support easy restoration of old pprinters, we need to ignore | |
|
102 | # Nones. | |
|
103 | self.deferred_pprinters[key] = func | |
|
104 | return oldfunc | |
|
105 | ||
|
106 | ||
|
107 | class FormatterABC(object): | |
|
108 | """ Abstract base class for Formatters. | |
|
109 | """ | |
|
110 | __metaclass__ = abc.ABCMeta | |
|
111 | ||
|
112 | # The ID of the formatter. | |
|
113 | id = 'abstract' | |
|
114 | ||
|
115 | # The kind of data returned. | |
|
116 | format = 'text' | |
|
117 | ||
|
118 | @abc.abstractmethod | |
|
119 | def __call__(self, obj): | |
|
120 | """ Return a JSONable representation of the object. | |
|
121 | """ | |
|
122 | return repr(obj) | |
|
123 | ||
|
124 | FormatterABC.register(DefaultFormatter) |
@@ -0,0 +1,30 b'' | |||
|
1 | """Tests for the Formatters. | |
|
2 | """ | |
|
3 | ||
|
4 | import nose.tools as nt | |
|
5 | ||
|
6 | from IPython.core.formatters import FormatterABC, DefaultFormatter | |
|
7 | ||
|
8 | class A(object): | |
|
9 | def __repr__(self): | |
|
10 | return 'A()' | |
|
11 | ||
|
12 | class B(A): | |
|
13 | def __repr__(self): | |
|
14 | return 'B()' | |
|
15 | ||
|
16 | def foo_printer(obj, pp, cycle): | |
|
17 | pp.text('foo') | |
|
18 | ||
|
19 | def test_pretty(): | |
|
20 | f = DefaultFormatter() | |
|
21 | f.for_type(A, foo_printer) | |
|
22 | nt.assert_equals(f(A()), 'foo') | |
|
23 | nt.assert_equals(f(B()), 'foo') | |
|
24 | f.pprint = False | |
|
25 | nt.assert_equals(f(A()), 'A()') | |
|
26 | nt.assert_equals(f(B()), 'B()') | |
|
27 | ||
|
28 | def test_deferred(): | |
|
29 | f = DefaultFormatter() | |
|
30 |
General Comments 0
You need to be logged in to leave comments.
Login now