mirror of
https://github.com/simon987/hexlib.git
synced 2025-04-19 17:56:43 +00:00
add volatile state
This commit is contained in:
parent
c0472efacc
commit
f92776e646
36
hexlib/db.py
36
hexlib/db.py
@ -1,5 +1,7 @@
|
|||||||
import base64
|
import base64
|
||||||
import sqlite3
|
import sqlite3
|
||||||
|
import redis
|
||||||
|
import ujson as json
|
||||||
|
|
||||||
|
|
||||||
class PersistentState:
|
class PersistentState:
|
||||||
@ -15,6 +17,40 @@ class PersistentState:
|
|||||||
return Table(self, table)
|
return Table(self, table)
|
||||||
|
|
||||||
|
|
||||||
|
class VolatileState:
|
||||||
|
"""Quick and dirty volatile dict-like redis wrapper"""
|
||||||
|
def __init__(self, prefix, ttl=3600, **redis_args):
|
||||||
|
self.rdb = redis.Redis(**redis_args)
|
||||||
|
self.prefix = prefix
|
||||||
|
self.ttl = 3600
|
||||||
|
|
||||||
|
def __getitem__(self, table):
|
||||||
|
return RedisTable(self, table)
|
||||||
|
|
||||||
|
|
||||||
|
class RedisTable:
|
||||||
|
def __init__(self, state, table):
|
||||||
|
self._state = state
|
||||||
|
self._table = table
|
||||||
|
|
||||||
|
def __setitem__(self, key, value):
|
||||||
|
self._state.rdb.set(self._state.prefix + self._table + ":" + str(key), json.dumps(value), ex=self._state.ttl)
|
||||||
|
|
||||||
|
def __getitem__(self, key):
|
||||||
|
val = self._state.rdb.get(self._state.prefix + self._table + ":" + str(key))
|
||||||
|
if val:
|
||||||
|
return json.loads(val)
|
||||||
|
return None
|
||||||
|
|
||||||
|
def __delitem__(self, key):
|
||||||
|
self._state.rdb.delete(self._state.prefix + self._table + ":" + str(key))
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
for key in self._state.rdb.scan_iter(self._state.prefix + self._table + "*"):
|
||||||
|
val = self._state.rdb.get(key)
|
||||||
|
yield json.loads(val) if val else None
|
||||||
|
|
||||||
|
|
||||||
class Table:
|
class Table:
|
||||||
def __init__(self, state, table):
|
def __init__(self, state, table):
|
||||||
self._state = state
|
self._state = state
|
||||||
|
4
setup.py
4
setup.py
@ -2,12 +2,12 @@ from setuptools import setup
|
|||||||
|
|
||||||
setup(
|
setup(
|
||||||
name="hexlib",
|
name="hexlib",
|
||||||
version="1.7",
|
version="1.8",
|
||||||
description="Misc utility methods",
|
description="Misc utility methods",
|
||||||
author="simon987",
|
author="simon987",
|
||||||
author_email="me@simon987.net",
|
author_email="me@simon987.net",
|
||||||
packages=["hexlib"],
|
packages=["hexlib"],
|
||||||
install_requires=[
|
install_requires=[
|
||||||
"ImageHash", "influxdb", "siphash", "python-dateutil"
|
"ImageHash", "influxdb", "siphash", "python-dateutil", "redis", "ujson"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
40
test/test_VolatileState.py
Normal file
40
test/test_VolatileState.py
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
from unittest import TestCase
|
||||||
|
from hexlib.db import VolatileState
|
||||||
|
|
||||||
|
|
||||||
|
class TestVolatileState(TestCase):
|
||||||
|
|
||||||
|
def test_get_set(self):
|
||||||
|
s = VolatileState(prefix="test1")
|
||||||
|
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")
|
||||||
|
|
||||||
|
s["b"]["1"] = 1
|
||||||
|
s["b"]["2"] = 2
|
||||||
|
s["b"]["3"] = 3
|
||||||
|
s["b"]["4"] = 4
|
||||||
|
|
||||||
|
self.assertEqual(sum(s["b"]), 10)
|
||||||
|
|
||||||
|
def test_int_key(self):
|
||||||
|
s = VolatileState(prefix="test2")
|
||||||
|
s["b"][1] = 1
|
||||||
|
del s["b"][1]
|
||||||
|
|
||||||
|
def test_delete(self):
|
||||||
|
s = VolatileState(prefix="test3")
|
||||||
|
|
||||||
|
s["c"]["1"] = 1
|
||||||
|
self.assertIsNotNone(s["c"]["1"])
|
||||||
|
del s["c"]["1"]
|
||||||
|
self.assertIsNone(s["c"]["1"])
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user