comparison hgext/phabricator.py @ 43380:579672b347d2 stable

py3: define and use json.loads polyfill Python 3.5's json.loads() requires a str. Only Python 3.6+ supports passing a bytes or bytearray. This commit implements a json.loads() polyfill on Python 3.5 so that we can use bytes. The added function to detect encodings comes verbatim from Python 3.7.
author Gregory Szorc <gregory.szorc@gmail.com>
date Sat, 02 Nov 2019 12:09:35 -0700
parents 132ddd1cba85
children 742065def6ca
comparison
equal deleted inserted replaced
43379:bb509f39d387 43380:579672b347d2
150 if key not in r2params: 150 if key not in r2params:
151 return False 151 return False
152 value = r1params[key][0] 152 value = r1params[key][0]
153 # we want to compare json payloads without worrying about ordering 153 # we want to compare json payloads without worrying about ordering
154 if value.startswith(b'{') and value.endswith(b'}'): 154 if value.startswith(b'{') and value.endswith(b'}'):
155 r1json = json.loads(value) 155 r1json = pycompat.json_loads(value)
156 r2json = json.loads(r2params[key][0]) 156 r2json = pycompat.json_loads(r2params[key][0])
157 if r1json != r2json: 157 if r1json != r2json:
158 return False 158 return False
159 elif r2params[key][0] != value: 159 elif r2params[key][0] != value:
160 return False 160 return False
161 return True 161 return True
305 parsed = pycompat.rapply( 305 parsed = pycompat.rapply(
306 lambda x: encoding.unitolocal(x) 306 lambda x: encoding.unitolocal(x)
307 if isinstance(x, pycompat.unicode) 307 if isinstance(x, pycompat.unicode)
308 else x, 308 else x,
309 # json.loads only accepts bytes from py3.6+ 309 # json.loads only accepts bytes from py3.6+
310 json.loads(encoding.unifromlocal(body)), 310 pycompat.json_loads(encoding.unifromlocal(body)),
311 ) 311 )
312 if parsed.get(b'error_code'): 312 if parsed.get(b'error_code'):
313 msg = _(b'Conduit Error (%s): %s') % ( 313 msg = _(b'Conduit Error (%s): %s') % (
314 parsed[b'error_code'], 314 parsed[b'error_code'],
315 parsed[b'error_info'], 315 parsed[b'error_info'],
330 # json.loads only returns unicode strings 330 # json.loads only returns unicode strings
331 params = pycompat.rapply( 331 params = pycompat.rapply(
332 lambda x: encoding.unitolocal(x) 332 lambda x: encoding.unitolocal(x)
333 if isinstance(x, pycompat.unicode) 333 if isinstance(x, pycompat.unicode)
334 else x, 334 else x,
335 json.loads(rawparams), 335 pycompat.json_loads(rawparams),
336 ) 336 )
337 # json.dumps only accepts unicode strings 337 # json.dumps only accepts unicode strings
338 result = pycompat.rapply( 338 result = pycompat.rapply(
339 lambda x: encoding.unifromlocal(x) if isinstance(x, bytes) else x, 339 lambda x: encoding.unifromlocal(x) if isinstance(x, bytes) else x,
340 callconduit(ui, name, params), 340 callconduit(ui, name, params),