From 30902c82354276ef80afdd062fa7899d5426db92 Mon Sep 17 00:00:00 2001 From: simon987 Date: Fri, 16 Apr 2021 19:10:45 -0400 Subject: [PATCH] Add sep option in volatile state --- hexlib/db.py | 40 ++++++++++++++++++++++---------------- setup.py | 2 +- test/test_VolatileState.py | 21 ++++++++++++++++++++ 3 files changed, 45 insertions(+), 18 deletions(-) diff --git a/hexlib/db.py b/hexlib/db.py index 040d59c..abe111f 100644 --- a/hexlib/db.py +++ b/hexlib/db.py @@ -12,8 +12,9 @@ from hexlib.env import get_redis class PersistentState: """Quick and dirty persistent dict-like SQLite wrapper""" - def __init__(self, dbfile="state.db", **dbargs): + def __init__(self, dbfile="state.db", logger=None, **dbargs): self.dbfile = dbfile + self.logger = logger if dbargs is None: dbargs = {"timeout": 30000} self.dbargs = dbargs @@ -25,14 +26,15 @@ class PersistentState: class VolatileState: """Quick and dirty volatile dict-like redis wrapper""" - def __init__(self, prefix, redis_db=None): + def __init__(self, prefix, redis_db=None, sep=""): if redis_db is None: redis_db = get_redis() self.rdb = redis_db self.prefix = prefix + self._sep = sep def __getitem__(self, table): - return RedisTable(self, table) + return RedisTable(self, table, self._sep) class VolatileQueue: @@ -56,59 +58,63 @@ class VolatileQueue: class VolatileBooleanState: """Quick and dirty volatile dict-like redis wrapper for boolean values""" - def __init__(self, prefix, redis_db=None): + def __init__(self, prefix, redis_db=None, sep=""): if redis_db is None: redis_db = get_redis() self.rdb = redis_db self.prefix = prefix + self._sep = sep def __getitem__(self, table): - return RedisBooleanTable(self, table) + return RedisBooleanTable(self, table, self._sep) class RedisTable: - def __init__(self, state, table): + def __init__(self, state, table, sep=""): self._state = state self._table = table + self._sep = sep + self._key = f"{self._state.prefix}{self._sep}{self._table}" def __setitem__(self, key, value): - self._state.rdb.hset(self._state.prefix + self._table, str(key), umsgpack.dumps(value)) + self._state.rdb.hset(self._key, str(key), umsgpack.dumps(value)) def __getitem__(self, key): - val = self._state.rdb.hget(self._state.prefix + self._table, str(key)) + val = self._state.rdb.hget(self._key, str(key)) if val: return umsgpack.loads(val) return None def __delitem__(self, key): - self._state.rdb.hdel(self._state.prefix + self._table, str(key)) + self._state.rdb.hdel(self._key, str(key)) def __iter__(self): - val = self._state.rdb.hgetall(self._state.prefix + self._table) + val = self._state.rdb.hgetall(self._key) if val: - return ((k, umsgpack.loads(v)) for k, v in - self._state.rdb.hgetall(self._state.prefix + self._table).items()) + return ((k, umsgpack.loads(v)) for k, v in val.items()) class RedisBooleanTable: - def __init__(self, state, table): + def __init__(self, state, table, sep=""): self._state = state self._table = table + self._sep = sep + self._key = f"{self._state.prefix}{self._sep}{self._table}" def __setitem__(self, key, value): if value: - self._state.rdb.sadd(self._state.prefix + self._table, str(key)) + self._state.rdb.sadd(self._key, str(key)) else: self.__delitem__(key) def __getitem__(self, key): - return self._state.rdb.sismember(self._state.prefix + self._table, str(key)) + return self._state.rdb.sismember(self._key, str(key)) def __delitem__(self, key): - self._state.rdb.srem(self._state.prefix + self._table, str(key)) + self._state.rdb.srem(self._key, str(key)) def __iter__(self): - return iter(self._state.rdb.smembers(self._state.prefix + self._table)) + return iter(self._state.rdb.smembers(self._key)) class Table: diff --git a/setup.py b/setup.py index ce03442..5d65452 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup setup( name="hexlib", - version="1.37", + version="1.38", description="Misc utility methods", author="simon987", author_email="me@simon987.net", diff --git a/test/test_VolatileState.py b/test/test_VolatileState.py index 15ba3f4..cb0933b 100644 --- a/test/test_VolatileState.py +++ b/test/test_VolatileState.py @@ -16,6 +16,17 @@ class TestVolatileState(TestCase): self.assertDictEqual(val, s["a"]["1"]) + def test_sep(self): + s = VolatileState(prefix="test1", sep=":") + val = { + "field1": 1, + "arr1": [1, 2, 3] + } + + s["a"]["1"] = val + + self.assertDictEqual(val, s["a"]["1"]) + def test_iter(self): s = VolatileState(prefix="test2") @@ -52,6 +63,16 @@ class TestVolatileBoolState(TestCase): self.assertTrue(s["a"]["2"]) self.assertFalse(s["a"]["3"]) + def test_sep(self): + s = VolatileBooleanState(prefix="test1", sep=":") + + s["a"]["1"] = True + s["a"]["2"] = True + + self.assertTrue(s["a"]["1"]) + self.assertTrue(s["a"]["2"]) + self.assertFalse(s["a"]["3"]) + def test_iter(self): s = VolatileBooleanState(prefix="test2")