1
# Copyright (c) 2001-2004 Twisted Matrix Laboratories.
2
# See LICENSE for details.
5
# Author: Clark Evans (cce@clarkevans.com)
10
This contains various filter stages which have exactly one input stage. These
11
stages take a single input and modify its results, ie a rewrite stage.
16
from twisted.python.failure import Failure
19
""" abstract stage which takes a single input stage """
20
def __init__(self, source, *trap):
21
Stage.__init__(self, *trap)
22
self._source = wrap(source)
25
while not self.results \
29
instruction = source._yield()
33
self.failure = source.failure
35
results = source.results
40
self.process(results, stop)
42
def process(self, results):
43
""" process implemented by the pipe
45
Take a set of possibly empty results and sets the member
46
variables: results, stop, or failure appropriately
48
raise NotImplementedError
52
flow equivalent to filter: Filter(function, source, ... )
54
Yield those elements from a source stage for which a function returns true.
55
If the function is None, the identity function is assumed, that is, all
56
items yielded that are false (zero or empty) are discarded.
70
source = flow.Filter(odd,range)
73
def __init__(self, func, source, *trap):
74
Pipe.__init__(self, source, *trap)
77
def process(self, results, stop):
78
self.results.extend(filter(self._func,results))
80
class LineBreak(Pipe):
81
""" pipe stage which breaks its input into lines """
82
def __init__(self, source, *trap, **kwargs):
83
Pipe.__init__(self, source, *trap)
84
self._delimiter = kwargs.get('delimiter','\r\n')
85
self._maxlen = int(kwargs.get('maxlength', 16384))+1
86
self._trailer = int(kwargs.get('trailer',False))
90
def process(self, results, stop):
92
lines = str(block).split(self._delimiter)
98
self._buffer.append(lines.pop(0))
99
self.results.append("".join(self._buffer))
101
self.results.extend(lines)
104
self._currlen += len(tail)
105
self._buffer.append(tail)
106
if stop and self._buffer:
107
tail = "".join(self._buffer)
109
self.results.append(tail)
111
raise RuntimeError, "trailing data remains: '%s'" % tail[:10]