whee

Unified interface to key value with locking and transactions.
Log | Files | Refs | README | LICENSE

commit e8a61eb888a6e46416a40e215de582db55411550
parent 8c12346c5991f6cfacac33114506916efbf01ab1
Author: lash <dev@holbrook.no>
Date:   Thu, 28 May 2026 09:52:59 -0600

Enable march search valkey

Diffstat:
Msetup.py | 2+-
Mtests/test_valkey.py | 21++++++++++++++++++++-
Mwhee/valkey/__init__.py | 33+++++++++++++++++++++++++++++++++
3 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/setup.py b/setup.py @@ -6,7 +6,7 @@ f.close() setup( name='wheepy', - version='0.0.6a1', + version='0.0.7a1', description='Unified interface to key value with locking and transactions.', author='Louis Holbrook', author_email='dev@holbrook.no', diff --git a/tests/test_valkey.py b/tests/test_valkey.py @@ -11,7 +11,7 @@ class TestValkey(unittest.TestCase): def setUp(self): self.store = ValkeyStore(124) - def test_get_put(self): + def test_valkey_get_put(self): # remove the initial delete once we are creating temporary test dbs try: self.store.delete(b'foo') @@ -34,5 +34,24 @@ class TestValkey(unittest.TestCase): self.store.delete(b'foo') + def test_valkey_fs_match(self): + self.store.put(b'afoo', b'inky') + self.store.put(b'abar', b'pinky') + self.store.put(b'abaz', b'blinky') + self.store.put(b'barbarbar', b'blinky') + self.store.match(b'a') + r = list(self.store) + self.assertEqual(len(r), 3) + + self.store.match(b'ab') + r = list(self.store) + self.assertEqual(len(r), 2) + + self.store.delete(b'afoo') + self.store.delete(b'abar') + self.store.delete(b'abaz') + self.store.delete(b'barbarbar') + + if __name__ == '__main__': unittest.main() diff --git a/whee/valkey/__init__.py b/whee/valkey/__init__.py @@ -20,6 +20,9 @@ class ValkeyStore(Interface): if user != None: self.db.auth(user, passphrase) self.db.ping() + self.it = None + self.crsr = 0 + self.i = 0 def have(self, k): @@ -53,3 +56,33 @@ class ValkeyStore(Interface): raise FileNotFoundError logg.debug('valkeystore delete {}'.format(k)) self.db.delete(k) + + + def match(self, k): + k = ensure_bytes_key(k) + self.crsr, self.it = self.db.scan(cursor=self.crsr, match=k + b'*') + self.i = 0 + + + def __iter__(self): + if self.it != None: + return self + + + # TODO: example shows use both cursor and key match for iteration? + def __next__(self): + if self.crsr > 0: + raise StopIteration() + try: + v = self.it[self.i] + except IndexError: + self.i = -1 + self.it = None + self.crsr = 0 + raise StopIteration() + self.i += 1 + return v + + + def iter(self): + return self.__iter__()