Mercurial > public > mercurial-scm > hg
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), |