| | """String dispatch class to match regexps and dispatch commands. |
| | """ |
| |
|
| | |
| | import re |
| |
|
| | |
| | from IPython.core.hooks import CommandChainDispatcher |
| |
|
| | |
| | class StrDispatch(object): |
| | """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] |
| | """ |
| |
|
| | def __init__(self): |
| | self.strs = {} |
| | self.regexs = {} |
| |
|
| | def add_s(self, s, obj, priority= 0 ): |
| | """ Adds a target 'string' for dispatching """ |
| |
|
| | chain = self.strs.get(s, CommandChainDispatcher()) |
| | chain.add(obj,priority) |
| | self.strs[s] = chain |
| |
|
| | def add_re(self, regex, obj, priority= 0 ): |
| | """ Adds a target regexp for dispatching """ |
| |
|
| | chain = self.regexs.get(regex, CommandChainDispatcher()) |
| | chain.add(obj,priority) |
| | self.regexs[regex] = chain |
| |
|
| | def dispatch(self, key): |
| | """ Get a seq of Commandchain objects that match key """ |
| | if key in self.strs: |
| | yield self.strs[key] |
| |
|
| | for r, obj in self.regexs.items(): |
| | if re.match(r, key): |
| | yield obj |
| | else: |
| | |
| | pass |
| |
|
| | def __repr__(self): |
| | return "<Strdispatch %s, %s>" % (self.strs, self.regexs) |
| |
|
| | def s_matches(self, key): |
| | if key not in self.strs: |
| | return |
| | for el in self.strs[key]: |
| | yield el[1] |
| |
|
| | def flat_matches(self, key): |
| | """ Yield all 'value' targets, without priority """ |
| | for val in self.dispatch(key): |
| | for el in val: |
| | yield el[1] |
| | return |
| |
|