Dispatch (lookup) a set of strings / regexps for match. Example: >>> dis = StrDispatch() >>> dis.add_s('hei',34, priority = 4) >>> dis.add_s('hei',123, priority = 2) >>> dis.add_re('h.i', 686) >>> print(list(dis.flat_matches('hei'))) [123, 34, 686]
| 9 | |
| 10 | # Code begins |
| 11 | class StrDispatch(object): |
| 12 | """Dispatch (lookup) a set of strings / regexps for match. |
| 13 | |
| 14 | Example: |
| 15 | |
| 16 | >>> dis = StrDispatch() |
| 17 | >>> dis.add_s('hei',34, priority = 4) |
| 18 | >>> dis.add_s('hei',123, priority = 2) |
| 19 | >>> dis.add_re('h.i', 686) |
| 20 | >>> print(list(dis.flat_matches('hei'))) |
| 21 | [123, 34, 686] |
| 22 | """ |
| 23 | |
| 24 | def __init__(self): |
| 25 | self.strs = {} |
| 26 | self.regexs = {} |
| 27 | |
| 28 | def add_s(self, s, obj, priority= 0 ): |
| 29 | """ Adds a target 'string' for dispatching """ |
| 30 | |
| 31 | chain = self.strs.get(s, CommandChainDispatcher()) |
| 32 | chain.add(obj,priority) |
| 33 | self.strs[s] = chain |
| 34 | |
| 35 | def add_re(self, regex, obj, priority= 0 ): |
| 36 | """ Adds a target regexp for dispatching """ |
| 37 | |
| 38 | chain = self.regexs.get(regex, CommandChainDispatcher()) |
| 39 | chain.add(obj,priority) |
| 40 | self.regexs[regex] = chain |
| 41 | |
| 42 | def dispatch(self, key): |
| 43 | """ Get a seq of Commandchain objects that match key """ |
| 44 | if key in self.strs: |
| 45 | yield self.strs[key] |
| 46 | |
| 47 | for r, obj in self.regexs.items(): |
| 48 | if re.match(r, key): |
| 49 | yield obj |
| 50 | else: |
| 51 | #print "nomatch",key # dbg |
| 52 | pass |
| 53 | |
| 54 | def __repr__(self): |
| 55 | return "<Strdispatch %s, %s>" % (self.strs, self.regexs) |
| 56 | |
| 57 | def s_matches(self, key): |
| 58 | if key not in self.strs: |
| 59 | return |
| 60 | for el in self.strs[key]: |
| 61 | yield el[1] |
| 62 | |
| 63 | def flat_matches(self, key): |
| 64 | """ Yield all 'value' targets, without priority """ |
| 65 | for val in self.dispatch(key): |
| 66 | for el in val: |
| 67 | yield el[1] # only value, no priority |
| 68 | return |
no outgoing calls
no test coverage detected