##// END OF EJS Templates
Fixing display publisher (Python 3)
Henry Fredrick Schreiner -
Show More
@@ -1,124 +1,124 b''
1 """An interface for publishing rich data to frontends.
1 """An interface for publishing rich data to frontends.
2
2
3 There are two components of the display system:
3 There are two components of the display system:
4
4
5 * Display formatters, which take a Python object and compute the
5 * Display formatters, which take a Python object and compute the
6 representation of the object in various formats (text, HTML, SVG, etc.).
6 representation of the object in various formats (text, HTML, SVG, etc.).
7 * The display publisher that is used to send the representation data to the
7 * The display publisher that is used to send the representation data to the
8 various frontends.
8 various frontends.
9
9
10 This module defines the logic display publishing. The display publisher uses
10 This module defines the logic display publishing. The display publisher uses
11 the ``display_data`` message type that is defined in the IPython messaging
11 the ``display_data`` message type that is defined in the IPython messaging
12 spec.
12 spec.
13 """
13 """
14
14
15 # Copyright (c) IPython Development Team.
15 # Copyright (c) IPython Development Team.
16 # Distributed under the terms of the Modified BSD License.
16 # Distributed under the terms of the Modified BSD License.
17
17
18
18
19 import sys
19 import sys
20
20
21 from traitlets.config.configurable import Configurable
21 from traitlets.config.configurable import Configurable
22 from traitlets import List
22 from traitlets import List
23
23
24 # This used to be defined here - it is imported for backwards compatibility
24 # This used to be defined here - it is imported for backwards compatibility
25 from .display import publish_display_data
25 from .display import publish_display_data
26
26
27 #-----------------------------------------------------------------------------
27 #-----------------------------------------------------------------------------
28 # Main payload class
28 # Main payload class
29 #-----------------------------------------------------------------------------
29 #-----------------------------------------------------------------------------
30
30
31 class DisplayPublisher(Configurable):
31 class DisplayPublisher(Configurable):
32 """A traited class that publishes display data to frontends.
32 """A traited class that publishes display data to frontends.
33
33
34 Instances of this class are created by the main IPython object and should
34 Instances of this class are created by the main IPython object and should
35 be accessed there.
35 be accessed there.
36 """
36 """
37
37
38 def _validate_data(self, data, metadata=None):
38 def _validate_data(self, data, metadata=None):
39 """Validate the display data.
39 """Validate the display data.
40
40
41 Parameters
41 Parameters
42 ----------
42 ----------
43 data : dict
43 data : dict
44 The formata data dictionary.
44 The formata data dictionary.
45 metadata : dict
45 metadata : dict
46 Any metadata for the data.
46 Any metadata for the data.
47 """
47 """
48
48
49 if not isinstance(data, dict):
49 if not isinstance(data, dict):
50 raise TypeError('data must be a dict, got: %r' % data)
50 raise TypeError('data must be a dict, got: %r' % data)
51 if metadata is not None:
51 if metadata is not None:
52 if not isinstance(metadata, dict):
52 if not isinstance(metadata, dict):
53 raise TypeError('metadata must be a dict, got: %r' % data)
53 raise TypeError('metadata must be a dict, got: %r' % data)
54
54
55 # use * to indicate transient, update are keyword-only
55 # use * to indicate transient, update are keyword-only
56 def publish(self, data, metadata=None, source=None, *, transient=None, update=False, **kwargs):
56 def publish(self, data, metadata=None, source=None, *, transient=None, update=False, **kwargs):
57 """Publish data and metadata to all frontends.
57 """Publish data and metadata to all frontends.
58
58
59 See the ``display_data`` message in the messaging documentation for
59 See the ``display_data`` message in the messaging documentation for
60 more details about this message type.
60 more details about this message type.
61
61
62 The following MIME types are currently implemented:
62 The following MIME types are currently implemented:
63
63
64 * text/plain
64 * text/plain
65 * text/html
65 * text/html
66 * text/markdown
66 * text/markdown
67 * text/latex
67 * text/latex
68 * application/json
68 * application/json
69 * application/javascript
69 * application/javascript
70 * image/png
70 * image/png
71 * image/jpeg
71 * image/jpeg
72 * image/svg+xml
72 * image/svg+xml
73
73
74 Parameters
74 Parameters
75 ----------
75 ----------
76 data : dict
76 data : dict
77 A dictionary having keys that are valid MIME types (like
77 A dictionary having keys that are valid MIME types (like
78 'text/plain' or 'image/svg+xml') and values that are the data for
78 'text/plain' or 'image/svg+xml') and values that are the data for
79 that MIME type. The data itself must be a JSON'able data
79 that MIME type. The data itself must be a JSON'able data
80 structure. Minimally all data should have the 'text/plain' data,
80 structure. Minimally all data should have the 'text/plain' data,
81 which can be displayed by all frontends. If more than the plain
81 which can be displayed by all frontends. If more than the plain
82 text is given, it is up to the frontend to decide which
82 text is given, it is up to the frontend to decide which
83 representation to use.
83 representation to use.
84 metadata : dict
84 metadata : dict
85 A dictionary for metadata related to the data. This can contain
85 A dictionary for metadata related to the data. This can contain
86 arbitrary key, value pairs that frontends can use to interpret
86 arbitrary key, value pairs that frontends can use to interpret
87 the data. Metadata specific to each mime-type can be specified
87 the data. Metadata specific to each mime-type can be specified
88 in the metadata dict with the same mime-type keys as
88 in the metadata dict with the same mime-type keys as
89 the data itself.
89 the data itself.
90 source : str, deprecated
90 source : str, deprecated
91 Unused.
91 Unused.
92 transient: dict, keyword-only
92 transient: dict, keyword-only
93 A dictionary for transient data.
93 A dictionary for transient data.
94 Data in this dictionary should not be persisted as part of saving this output.
94 Data in this dictionary should not be persisted as part of saving this output.
95 Examples include 'display_id'.
95 Examples include 'display_id'.
96 update: bool, keyword-only, default: False
96 update: bool, keyword-only, default: False
97 If True, only update existing outputs with the same display_id,
97 If True, only update existing outputs with the same display_id,
98 rather than creating a new output.
98 rather than creating a new output.
99 """
99 """
100
100
101 # The default is to simply write the plain text data using sys.stdout.
101 # The default is to simply write the plain text data using sys.stdout.
102 if 'text/plain' in data:
102 if 'text/plain' in data:
103 print(data['text/plain'])
103 print(data['text/plain'])
104
104
105 def clear_output(self, wait=False):
105 def clear_output(self, wait=False):
106 """Clear the output of the cell receiving output."""
106 """Clear the output of the cell receiving output."""
107 print('\033[2K\r', end='')
107 print('\033[2K\r', end='')
108 sys.stdout.flush()
108 sys.stdout.flush()
109 print('\033[2K\r', end='')
109 print('\033[2K\r', end='')
110 sys.stderr.flush()
110 sys.stderr.flush()
111
111
112
112
113 class CapturingDisplayPublisher(DisplayPublisher):
113 class CapturingDisplayPublisher(DisplayPublisher):
114 """A DisplayPublisher that stores"""
114 """A DisplayPublisher that stores"""
115 outputs = List()
115 outputs = List()
116
116
117 def publish(self, data, metadata=None, source=None):
117 def publish(self, data, metadata=None, source=None, *, transient=None, update=False):
118 self.outputs.append((data, metadata))
118 self.outputs.append((data, metadata))
119
119
120 def clear_output(self, wait=False):
120 def clear_output(self, wait=False):
121 super(CapturingDisplayPublisher, self).clear_output(wait)
121 super(CapturingDisplayPublisher, self).clear_output(wait)
122
122
123 # empty the list, *do not* reassign a new list
123 # empty the list, *do not* reassign a new list
124 del self.outputs[:]
124 del self.outputs[:]
General Comments 0
You need to be logged in to leave comments. Login now