summaryrefslogtreecommitdiff
path: root/muck/mem.py
diff options
context:
space:
mode:
Diffstat (limited to 'muck/mem.py')
-rw-r--r--muck/mem.py57
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,