def test_round_trip_parse(): m1 = E(data='hi there\nsexy developer', event='salutation', id='abcdefg', retry=10000) dumped = m1.dump() m2 = E.parse(dumped) assert m1.id == m2.id assert m1.data == m2.data assert m1.retry == m2.retry assert m1.event == m2.event
def messages(self): """ Simulates live event stream by using a dump file of the event stream from: `curl -sN host_ip:9999/events > dump_file` """ for_processing = [] for line in open(self.file_path, 'r'): if line == "\n": if for_processing != [':\n']: yield Event.parse(''.join(for_processing)) for_processing = [] continue for_processing.append(line)
def test_round_trip_parse(): m1 = E( data='hi there\nsexy developer', event='salutation', id='abcdefg', retry=10000 ) dumped = m1.dump() m2 = E.parse(dumped) assert m1.id == m2.id assert m1.data == m2.data assert m1.retry == m2.retry assert m1.event == m2.event
def file_message_streamer(server: str, start_from): """ Simulates live event stream by using a dump file of the event stream from: `curl -sN host_ip:9999/events > dump_file` server should be full path to file """ for_processing = [] for line in open(server, 'r'): if line == "\n": if for_processing != [':\n']: msg = Event.parse(''.join(for_processing)) cur_id = int(msg.id) if msg.id is not None else 0 if cur_id >= int(start_from): yield msg for_processing = [] continue for_processing.append(line)
def __next__(self): decoder = codecs.getincrementaldecoder( self.resp.encoding)(errors='replace') pos = 0 while end_of_field.search(self.buf, pos) is None: try: next_chunk = next(self.resp_iterator) if not next_chunk: raise EOFError() pos = max(0, len(self.buf) - 4) self.buf += decoder.decode(next_chunk) except (StopIteration, requests.RequestException, EOFError, http.client.IncompleteRead) as e: time.sleep(self.retry / 1000.0) self._connect() # The SSE spec only supports resuming from a whole message, so # if we have half a message we should throw it out. head, sep, tail = self.buf.rpartition('\n') self.buf = head + sep continue # Split the complete event (up to the end_of_field) into event_string, # and retain anything after the current complete event in self.buf # for next time. (event_string, self.buf) = re.split(end_of_field, self.buf, maxsplit=1) msg = Event.parse(event_string) # If the server requests a specific retry delay, we need to honor it. if msg.retry: self.retry = msg.retry # last_id should only be set if included in the message. It's not # forgotten if a message omits it. if msg.id: self.last_id = msg.id return msg
def test_eols(): for eol in ('\r\n', '\r', '\n'): m = E.parse('event: hello%sdata: eol%s' % (eol, eol)) assert m.event == 'hello' assert m.data == 'eol'
def test_default_event(): m = E.parse('data: blah') assert m.event == 'message'
def test_retry_is_integer(): m = E.parse('data: hi\nretry: 4000') assert m.retry == 4000
def test_comment(): raw = ":this is a comment\ndata: this is some data" m = E.parse(raw) assert m.data == 'this is some data'
def test_no_space(): m = E.parse('data:hi') assert m.data == 'hi'
def test_no_colon(): m = E.parse('data') assert m.data == ''