| 537 | setattr(object, method, new.instancemethod(function, object)) |
| 538 | |
| 539 | class Stream(list): |
| 540 | |
| 541 | def __init__(self, url, delimiter="\n", **kwargs): |
| 542 | """ Buffered stream of data from a given URL. |
| 543 | """ |
| 544 | self.socket = URL(url).open(**kwargs) |
| 545 | self.buffer = "" |
| 546 | self.delimiter = delimiter |
| 547 | |
| 548 | def update(self, bytes=1024): |
| 549 | """ Reads a number of bytes from the stream. |
| 550 | If a delimiter is encountered, calls Stream.parse() on the packet. |
| 551 | """ |
| 552 | packets = [] |
| 553 | self.buffer += self.socket.read(bytes) |
| 554 | self.buffer = self.buffer.split(self.delimiter, 1) |
| 555 | while len(self.buffer) > 1: |
| 556 | data = self.buffer[0] |
| 557 | data = self.parse(data) |
| 558 | if data is not None: |
| 559 | packets.append(data) |
| 560 | self.buffer = self.buffer[-1] |
| 561 | self.buffer = self.buffer.split(self.delimiter, 1) |
| 562 | self.buffer = self.buffer[-1] |
| 563 | self.extend(packets) |
| 564 | return packets |
| 565 | |
| 566 | def parse(self, data): |
| 567 | """ Must be overridden in a subclass. |
| 568 | """ |
| 569 | return data |
| 570 | |
| 571 | def clear(self): |
| 572 | list.__init__(self, []) |
| 573 | |
| 574 | def stream(url, delimiter="\n", parse=lambda data: data, **kwargs): |
| 575 | """ Returns a new Stream with the given parse method. |
no outgoing calls
no test coverage detected
searching dependent graphs…