| 81 | |
| 82 | |
| 83 | class JsonFacade(object): |
| 84 | |
| 85 | def __init__(self, writer): |
| 86 | self.writer = writer |
| 87 | if hasattr(writer, "reader_thread"): |
| 88 | writer.reader_thread.accept_xml_messages = False |
| 89 | self._all_json_messages_found = [] |
| 90 | self._sent_launch_or_attach = False |
| 91 | |
| 92 | def mark_messages(self, expected_class, accept_message=lambda obj: True): |
| 93 | ret = [] |
| 94 | for message_with_mark in self._all_json_messages_found: |
| 95 | if not message_with_mark.marked: |
| 96 | if isinstance(message_with_mark.msg, expected_class): |
| 97 | if accept_message(message_with_mark.msg): |
| 98 | message_with_mark.marked = True |
| 99 | ret.append(message_with_mark.msg) |
| 100 | return ret |
| 101 | |
| 102 | def wait_for_json_message(self, expected_class, accept_message=lambda obj: True): |
| 103 | |
| 104 | def accept_json_message(msg): |
| 105 | if msg.startswith("{"): |
| 106 | decoded_msg = from_json(msg) |
| 107 | |
| 108 | self._all_json_messages_found.append(_MessageWithMark(decoded_msg)) |
| 109 | |
| 110 | if isinstance(decoded_msg, expected_class): |
| 111 | if accept_message(decoded_msg): |
| 112 | return True |
| 113 | return False |
| 114 | |
| 115 | msg = self.writer.wait_for_message(accept_json_message, unquote_msg=False, expect_xml=False) |
| 116 | return from_json(msg) |
| 117 | |
| 118 | def build_accept_response(self, request, response_class=None): |
| 119 | if response_class is None: |
| 120 | response_class = pydevd_base_schema.get_response_class(request) |
| 121 | |
| 122 | def accept_message(response): |
| 123 | if isinstance(request, dict): |
| 124 | if response.request_seq == request["seq"]: |
| 125 | return True |
| 126 | else: |
| 127 | if response.request_seq == request.seq: |
| 128 | return True |
| 129 | return False |
| 130 | |
| 131 | return (response_class, Response), accept_message |
| 132 | |
| 133 | def wait_for_response(self, request, response_class=None): |
| 134 | expected_classes, accept_message = self.build_accept_response(request, response_class) |
| 135 | return self.wait_for_json_message(expected_classes, accept_message) |
| 136 | |
| 137 | def write_request(self, request): |
| 138 | seq = self.writer.next_seq() |
| 139 | if isinstance(request, dict): |
| 140 | request["seq"] = seq |
no outgoing calls