diff options
Diffstat (limited to 'muck/mem.py')
-rw-r--r-- | muck/mem.py | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/muck/mem.py b/muck/mem.py index 437085d..3100a62 100644 --- a/muck/mem.py +++ b/muck/mem.py @@ -13,6 +13,8 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. +import copy + import muck @@ -27,6 +29,61 @@ class MemoryStore: def as_dict(self): return self._dict + def __contains__(self, key): + return key in self._dict + + def __getitem__(self, key): + meta, res = self._dict[key] + meta = copy.deepcopy(meta) + res = copy.deepcopy(res) + return meta, res + + def search(self, conds): + hits = [] + for rid in self._dict: + meta, res = self._dict[rid] + if any(self._matches(meta, res, cond) for cond in conds): + hits.append(rid) + return hits + + def _matches(self, meta, res, cond): + if cond['where'] not in ('meta', 'data'): # pragma: no cover + return False + + if cond['where'] == 'meta': + thing = meta + else: + thing = res + + field = cond['field'] + pattern = cond['pattern'] + + if field not in thing: # pragma: no cover + return False + value = thing[field] + + funcs = { + '==': self._equal, + '>=': self._ge, + '<=': self._le, + } + if cond['op'] not in funcs: # pragma: no cover + return False + is_match = funcs[cond['op']] + + if isinstance(value, list): + return any(is_match(pattern, item) for item in value) + return is_match(pattern, value) + + def _equal(self, expected, actual): + return expected.lower() == actual.lower() + + def _ge(self, expected, actual): + return expected.lower() == actual.lower() + + def _le(self, expected, actual): + return expected.lower() == actual.lower() + def change(self, chg): funcs = { 'create': self._create, |