|
"""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 |
|
|