Add sep option in volatile state

This commit is contained in:
simon987 2021-04-16 19:10:45 -04:00
parent 53a262a138
commit 30902c8235
3 changed files with 45 additions and 18 deletions

View File

@ -12,8 +12,9 @@ from hexlib.env import get_redis
class PersistentState: class PersistentState:
"""Quick and dirty persistent dict-like SQLite wrapper""" """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.dbfile = dbfile
self.logger = logger
if dbargs is None: if dbargs is None:
dbargs = {"timeout": 30000} dbargs = {"timeout": 30000}
self.dbargs = dbargs self.dbargs = dbargs
@ -25,14 +26,15 @@ class PersistentState:
class VolatileState: class VolatileState:
"""Quick and dirty volatile dict-like redis wrapper""" """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: if redis_db is None:
redis_db = get_redis() redis_db = get_redis()
self.rdb = redis_db self.rdb = redis_db
self.prefix = prefix self.prefix = prefix
self._sep = sep
def __getitem__(self, table): def __getitem__(self, table):
return RedisTable(self, table) return RedisTable(self, table, self._sep)
class VolatileQueue: class VolatileQueue:
@ -56,59 +58,63 @@ class VolatileQueue:
class VolatileBooleanState: class VolatileBooleanState:
"""Quick and dirty volatile dict-like redis wrapper for boolean values""" """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: if redis_db is None:
redis_db = get_redis() redis_db = get_redis()
self.rdb = redis_db self.rdb = redis_db
self.prefix = prefix self.prefix = prefix
self._sep = sep
def __getitem__(self, table): def __getitem__(self, table):
return RedisBooleanTable(self, table) return RedisBooleanTable(self, table, self._sep)
class RedisTable: class RedisTable:
def __init__(self, state, table): def __init__(self, state, table, sep=""):
self._state = state self._state = state
self._table = table self._table = table
self._sep = sep
self._key = f"{self._state.prefix}{self._sep}{self._table}"
def __setitem__(self, key, value): 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): 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: if val:
return umsgpack.loads(val) return umsgpack.loads(val)
return None return None
def __delitem__(self, key): 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): def __iter__(self):
val = self._state.rdb.hgetall(self._state.prefix + self._table) val = self._state.rdb.hgetall(self._key)
if val: if val:
return ((k, umsgpack.loads(v)) for k, v in return ((k, umsgpack.loads(v)) for k, v in val.items())
self._state.rdb.hgetall(self._state.prefix + self._table).items())
class RedisBooleanTable: class RedisBooleanTable:
def __init__(self, state, table): def __init__(self, state, table, sep=""):
self._state = state self._state = state
self._table = table self._table = table
self._sep = sep
self._key = f"{self._state.prefix}{self._sep}{self._table}"
def __setitem__(self, key, value): def __setitem__(self, key, value):
if value: if value:
self._state.rdb.sadd(self._state.prefix + self._table, str(key)) self._state.rdb.sadd(self._key, str(key))
else: else:
self.__delitem__(key) self.__delitem__(key)
def __getitem__(self, 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): 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): def __iter__(self):
return iter(self._state.rdb.smembers(self._state.prefix + self._table)) return iter(self._state.rdb.smembers(self._key))
class Table: class Table:

View File

@ -2,7 +2,7 @@ from setuptools import setup
setup( setup(
name="hexlib", name="hexlib",
version="1.37", version="1.38",
description="Misc utility methods", description="Misc utility methods",
author="simon987", author="simon987",
author_email="me@simon987.net", author_email="me@simon987.net",

View File

@ -16,6 +16,17 @@ class TestVolatileState(TestCase):
self.assertDictEqual(val, s["a"]["1"]) 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): def test_iter(self):
s = VolatileState(prefix="test2") s = VolatileState(prefix="test2")
@ -52,6 +63,16 @@ class TestVolatileBoolState(TestCase):
self.assertTrue(s["a"]["2"]) self.assertTrue(s["a"]["2"])
self.assertFalse(s["a"]["3"]) 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): def test_iter(self):
s = VolatileBooleanState(prefix="test2") s = VolatileBooleanState(prefix="test2")