strdispatch.py
68 lines
| 1.8 KiB
| text/x-python
|
PythonLexer
Fernando Perez
|
r1417 | """String dispatch class to match regexps and dispatch commands. | ||
""" | ||||
# Stdlib imports | ||||
import re | ||||
# Our own modules | ||||
Brian Granger
|
r2026 | from IPython.core.hooks import CommandChainDispatcher | ||
vivainio
|
r503 | |||
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] | ||||
""" | ||||
Bernardo B. Marques
|
r4872 | |||
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 """ | ||||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r503 | 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 """ | ||||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r503 | 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] | ||||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r503 | for r, obj in self.regexs.items(): | ||
if re.match(r, key): | ||||
yield obj | ||||
Bernardo B. Marques
|
r4872 | else: | ||
Fernando Perez
|
r1417 | #print "nomatch",key # dbg | ||
vivainio
|
r503 | pass | ||
def __repr__(self): | ||||
return "<Strdispatch %s, %s>" % (self.strs, self.regexs) | ||||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r503 | def s_matches(self, key): | ||
if key not in self.strs: | ||||
return | ||||
for el in self.strs[key]: | ||||
yield el[1] | ||||
Bernardo B. Marques
|
r4872 | |||
vivainio
|
r503 | 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 | ||||