Code for barn-growl utility for OS X.
[snippets/.git] / barn-growl / abstfilter.py
1 #!/usr/bin/env python
2 ##  $Id: abstfilter.py,v 1.1.1.1 2003/07/01 23:28:27 euske Exp $
3 ##
4 ##  abstfilter.py - A framework for cascade filters.
5 ##
6
7
8 ##  AbstractFeeder
9 ##
10 class AbstractFeeder(object):
11
12   def __init__(self, next_filter):
13     self.next_filter = next_filter
14     return
15
16   def feed_next(self, s):
17     self.next_filter.feed(s)
18     return
19
20   def close(self):
21     self.next_filter.close()
22     return
23
24
25 ##  AbstractFilter
26 ##
27 class AbstractFilter(object):
28
29   def __init__(self, next_filter):
30     self.next_filter = next_filter
31     return
32
33   def process(self, s):
34     raise NotImplementedError
35   
36   def feed(self, s):
37     self.feed_next(self.process(s))
38     return
39
40   def feed_next(self, s):
41     self.next_filter.feed(s)
42     return
43
44   def close(self):
45     self.next_filter.close()
46     return
47
48
49 ##  AbstractConsumer
50 ##
51 class AbstractConsumer(object):
52
53   def __init__(self):
54     return
55
56   def feed(self, s):
57     raise NotImplementedError
58   
59   def close(self):
60     return
61
62
63 ##  FileGenerator
64 ##
65 class FileGenerator(AbstractFeeder):
66   def __init__(self, next_type):
67     next_filter = next_type(self)
68     AbstractFeeder.__init__(self, next_filter)
69     self.results = []
70     return
71   
72   def feed(self, s):
73     self.results.append(s)
74     return
75
76   def close(self):
77     return
78   
79   def pullopen(self, f):
80     while 1:
81       s = f.readline()
82       if not s: break
83       self.feed_next(s)
84       if self.results:
85         for s in self.results:
86           yield s
87         self.results = []
88     for s in self.results:
89       yield s
90     self.results = []
91     return
92