def _process_result(result, to_json=False): out, err, code = result if out and is_bytes(out): out = out.decode(get_locale_encoding()) if err and is_bytes(err): err = err.decode(get_locale_encoding()) text = ("%s\n\n%s" % (out, err)).strip() if code != 0: raise Exception(text) if not to_json: return text try: return json.loads(out) except ValueError as e: click.secho("%s => `%s`" % (e, out), fg="red", err=True) # if PIO Core prints unhandled warnings for line in out.split("\n"): line = line.strip() if not line: continue try: return json.loads(line) except ValueError: pass raise e
async def _handle_rpc(self, websocket, data): response = jsonrpc.JSONRPCResponseManager.handle( data, self.factory.dispatcher # pylint: disable=no-member ) if response.result and inspect.isawaitable(response.result): try: response.result = await response.result response.data["result"] = response.result response.error = None except Exception as exc: # pylint: disable=broad-except if not isinstance(exc, jsonrpc.exceptions.JSONRPCDispatchException): exc = jsonrpc.exceptions.JSONRPCDispatchException( code=4999, message=str(exc)) response.result = None response.error = exc.error._data # pylint: disable=protected-access new_data = response.data.copy() new_data["error"] = response.error del new_data["result"] response.data = new_data if response.error: click.secho("Error: %s" % response.error, fg="red", err=True) if "result" in response.data and is_bytes(response.data["result"]): response.data["result"] = response.data["result"].decode("utf-8") await websocket.send_text(json.dumps(response.data))
def sendJSONResponse(self, response): # click.echo("< %s" % response) if "error" in response: click.secho("Error: %s" % response["error"], fg="red", err=True) response = dump_json_to_unicode(response) if not PY2 and not is_bytes(response): response = response.encode("utf-8") self.sendMessage(response)
def write(self, value): thread_id = thread_get_ident() self._ensure_thread_buffer(thread_id) if PY2 and isinstance(value, unicode): # pylint: disable=undefined-variable value = value.encode() return self._buffers[thread_id].write( value.decode() if is_bytes(value) else value )
def escape_gdbmi_stream(prefix, stream): bytes_stream = False if is_bytes(stream): bytes_stream = True stream = stream.decode() if not stream: return b"" if bytes_stream else "" ends_nl = stream.endswith("\n") stream = re.sub(r"\\+", "\\\\\\\\", stream) stream = stream.replace('"', '\\"') stream = stream.replace("\n", "\\n") stream = '%s"%s"' % (prefix, stream) if ends_nl: stream += "\n" return stream.encode() if bytes_stream else stream
def decode_scons_arg(data): value = base64.urlsafe_b64decode(data) return value.decode() if is_bytes(value) else value
def encode_scons_arg(value): data = base64.urlsafe_b64encode(hashlib_encode_data(value)) return data.decode() if is_bytes(data) else data
def write(self, value): thread_id = thread_get_ident() self._ensure_thread_buffer(thread_id) return self._buffers[thread_id].write( value.decode() if is_bytes(value) else value)
def console_log(self, msg): if helpers.is_gdbmi_mode(): msg = helpers.escape_gdbmi_stream("~", msg) self.outReceived(msg if is_bytes(msg) else msg.encode())