15
15
import re
16
16
import sys
17
17
import types
18
- from base64 import encodestring
19
18
from datetime import datetime
20
19
20
+ try :
21
+ # base64.encodestring is deprecated in Python 3.x
22
+ from base64 import encodebytes
23
+ except ImportError :
24
+ # Python 2.x
25
+ from base64 import encodestring as encodebytes
26
+
21
27
from IPython .utils import py3compat
22
28
from IPython .utils .encoding import DEFAULT_ENCODING
23
29
from IPython .utils import text
@@ -82,7 +88,7 @@ def squash_dates(obj):
82
88
elif isinstance (obj , datetime ):
83
89
obj = obj .strftime (ISO8601 )
84
90
return obj
85
-
91
+
86
92
def date_default (obj ):
87
93
"""default function for packing datetime objects in JSON."""
88
94
if isinstance (obj , datetime ):
@@ -97,37 +103,37 @@ def date_default(obj):
97
103
98
104
def encode_images (format_dict ):
99
105
"""b64-encodes images in a displaypub format dict
100
-
106
+
101
107
Perhaps this should be handled in json_clean itself?
102
-
108
+
103
109
Parameters
104
110
----------
105
-
111
+
106
112
format_dict : dict
107
113
A dictionary of display data keyed by mime-type
108
-
114
+
109
115
Returns
110
116
-------
111
-
117
+
112
118
format_dict : dict
113
119
A copy of the same dictionary,
114
120
but binary image data ('image/png' or 'image/jpeg')
115
121
is base64-encoded.
116
-
122
+
117
123
"""
118
124
encoded = format_dict .copy ()
119
125
pngdata = format_dict .get ('image/png' )
120
126
if isinstance (pngdata , bytes ) and pngdata [:8 ] == PNG :
121
- encoded ['image/png' ] = encodestring (pngdata ).decode ('ascii' )
127
+ encoded ['image/png' ] = encodebytes (pngdata ).decode ('ascii' )
122
128
jpegdata = format_dict .get ('image/jpeg' )
123
129
if isinstance (jpegdata , bytes ) and jpegdata [:2 ] == JPEG :
124
- encoded ['image/jpeg' ] = encodestring (jpegdata ).decode ('ascii' )
130
+ encoded ['image/jpeg' ] = encodebytes (jpegdata ).decode ('ascii' )
125
131
return encoded
126
132
127
133
128
134
def json_clean (obj ):
129
135
"""Clean an object to ensure it's safe to encode in JSON.
130
-
136
+
131
137
Atomic, immutable objects are returned unmodified. Sets and tuples are
132
138
converted to lists, lists are copied and dicts are also copied.
133
139
@@ -142,7 +148,7 @@ def json_clean(obj):
142
148
Returns
143
149
-------
144
150
out : object
145
-
151
+
146
152
A version of the input which will not cause an encoding error when
147
153
encoded as JSON. Note that this function does not *encode* its inputs,
148
154
it simply sanitizes it so that there will be no encoding errors later.
@@ -163,7 +169,7 @@ def json_clean(obj):
163
169
# types that are 'atomic' and ok in json as-is. bool doesn't need to be
164
170
# listed explicitly because bools pass as int instances
165
171
atomic_ok = (unicode , int , types .NoneType )
166
-
172
+
167
173
# containers that we need to convert into lists
168
174
container_to_list = (tuple , set , types .GeneratorType )
169
175
@@ -175,14 +181,14 @@ def json_clean(obj):
175
181
176
182
if isinstance (obj , atomic_ok ):
177
183
return obj
178
-
184
+
179
185
if isinstance (obj , bytes ):
180
186
return obj .decode (DEFAULT_ENCODING , 'replace' )
181
-
187
+
182
188
if isinstance (obj , container_to_list ) or (
183
189
hasattr (obj , '__iter__' ) and hasattr (obj , next_attr_name )):
184
190
obj = list (obj )
185
-
191
+
186
192
if isinstance (obj , list ):
187
193
return [json_clean (x ) for x in obj ]
188
194
0 commit comments