##// END OF EJS Templates
P3K: fix DeprecationWarning under Python 3.x (base64.encodestring is deprecated)
Mikhail Korobov -
Show More
@@ -15,9 +15,15 b' import math'
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 b' 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 b" JPEG = b'\\xff\\xd8'"
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 b' 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,26 +169,26 b' 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
170 176 if isinstance(obj, float):
171 177 # cast out-of-range floats to their reprs
172 178 if math.isnan(obj) or math.isinf(obj):
173 179 return repr(obj)
174 180 return 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
General Comments 0
You need to be logged in to leave comments. Login now