def test_currentRuleWithArgs(self): """ TrampolinedParser should be able to invoke curruent rule with args. """ receiver = TrampolinedReceiver() receiver.currentRule = "witharg", "nice ", "day" trampolinedParser = TrampolinedParser(self.grammar, receiver, {}) buf = ' oh yes\r\n' for c in iterbytes(buf): trampolinedParser.receive(c) self.assertEqual(receiver.received, ["nice day oh yes"])
def test_dataNotFullyReceived(self): """ Since the initial rule inside the grammar is not matched, the receiver shouldn't receive any byte. """ receiver = TrampolinedReceiver() trampolinedParser = TrampolinedParser(self.grammar, receiver, {}) buf = b'foobarandnotreachdelimiter' for c in iterbytes(buf): trampolinedParser.receive(c) self.assertEqual(receiver.received, [])
def test_dataNotFullyReceived(self): """ Since the initial rule inside the grammar is not matched, the receiver shouldn't receive any byte. """ receiver = TrampolinedReceiver() trampolinedParser = TrampolinedParser(self.grammar, receiver, {}) buf = 'foobarandnotreachdelimiter' for c in iterbytes(buf): trampolinedParser.receive(c) self.assertEqual(receiver.received, [])
def test_dataFullyReceived(self): """ The receiver should receive the data according to the grammar. """ receiver = TrampolinedReceiver() trampolinedParser = TrampolinedParser(self.grammar, receiver, {}) buf = b'\r\n'.join((b'foo', b'bar', b'foo', b'bar')) for c in iterbytes(buf): trampolinedParser.receive(c) self.assertEqual(receiver.received, [b'foo', b'bar', b'foo']) trampolinedParser.receive('\r\n') self.assertEqual(receiver.received, [b'foo', b'bar', b'foo', b'bar'])
def test_dataFullyReceived(self): """ The receiver should receive the data according to the grammar. """ receiver = TrampolinedReceiver() trampolinedParser = TrampolinedParser(self.grammar, receiver, {}) buf = '\r\n'.join(('foo', 'bar', 'foo', 'bar')) for c in iterbytes(buf): trampolinedParser.receive(c) self.assertEqual(receiver.received, ['foo', 'bar', 'foo']) trampolinedParser.receive('\r\n') self.assertEqual(receiver.received, ['foo', 'bar', 'foo', 'bar'])
class ParserProtocol(Protocol): """ A Twisted ``Protocol`` subclass for parsing stream protocols. """ def __init__(self, grammar, senderFactory, receiverFactory, bindings): """ Initialize the parser. :param grammar: An OMeta grammar to use for parsing. :param senderFactory: A unary callable that returns a sender given a transport. :param receiverFactory: A unary callable that returns a receiver given a sender. :param bindings: A dict of additional globals for the grammar rules. """ self._grammar = grammar self._bindings = dict(bindings) self._senderFactory = senderFactory self._receiverFactory = receiverFactory self._disconnecting = False def connectionMade(self): """ Start parsing, since the connection has been established. """ self.sender = self._senderFactory(self.transport) self.receiver = self._receiverFactory(self.sender) self.receiver.prepareParsing(self) self._parser = TrampolinedParser( self._grammar, self.receiver, self._bindings) def dataReceived(self, data): """ Receive and parse some data. :param data: A ``str`` from Twisted. """ if self._disconnecting: return try: self._parser.receive(data) except Exception: self.connectionLost(Failure()) self.transport.abortConnection() return def connectionLost(self, reason): """ Stop parsing, since the connection has been lost. :param reason: A ``Failure`` instance from Twisted. """ if self._disconnecting: return self.receiver.finishParsing(reason) self._disconnecting = True
def receive(self, data): if self.receiver.currentRule != self._currentRule: if not self._interp.input.data: self._setupInterp() return TrampolinedParser.receive(self, data)
class ParserProtocol(Protocol): """ A Twisted ``Protocol`` subclass for parsing stream protocols. """ def __init__(self, grammar, senderFactory, receiverFactory, bindings): """ Initialize the parser. :param grammar: An OMeta grammar to use for parsing. :param senderFactory: A unary callable that returns a sender given a transport. :param receiverFactory: A unary callable that returns a receiver given a sender. :param bindings: A dict of additional globals for the grammar rules. """ self._grammar = grammar self._bindings = dict(bindings) self._senderFactory = senderFactory self._receiverFactory = receiverFactory self._disconnecting = False def connectionMade(self): """ Start parsing, since the connection has been established. """ self.sender = self._senderFactory(self.transport) self.receiver = self._receiverFactory(self.sender) self.receiver.prepareParsing(self) self._parser = TrampolinedParser(self._grammar, self.receiver, self._bindings) def dataReceived(self, data): """ Receive and parse some data. :param data: A ``str`` from Twisted. """ if self._disconnecting: return try: self._parser.receive(data) except Exception: self.connectionLost(Failure()) self.transport.abortConnection() return def connectionLost(self, reason): """ Stop parsing, since the connection has been lost. :param reason: A ``Failure`` instance from Twisted. """ if self._disconnecting: return self.receiver.finishParsing(reason) self._disconnecting = True