strdispatch.py
70 lines
| 1.9 KiB
| text/x-python
|
PythonLexer
/ IPython / strdispatch.py
Fernando Perez
|
r1417 | """String dispatch class to match regexps and dispatch commands. | ||
""" | ||||
# Stdlib imports | ||||
import re | ||||
# Our own modules | ||||
vivainio
|
r503 | from IPython.hooks import CommandChainDispatcher | ||
import IPython.hooks | ||||
Fernando Perez
|
r1417 | # Code begins | ||
vivainio
|
r503 | class StrDispatch(object): | ||
Fernando Perez
|
r1417 | """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] | ||||
""" | ||||
vivainio
|
r503 | def __init__(self): | ||
self.strs = {} | ||||
self.regexs = {} | ||||
Fernando Perez
|
r1417 | |||
vivainio
|
r503 | 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: | ||||
Fernando Perez
|
r1417 | #print "nomatch",key # dbg | ||
vivainio
|
r503 | 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] # only value, no priority | ||||
return | ||||