diff --git a/senju/store_manager.py b/senju/store_manager.py index a70a68f..591e984 100644 --- a/senju/store_manager.py +++ b/senju/store_manager.py @@ -1,8 +1,7 @@ from typing import Optional -from tinydb import TinyDB, Query -from uuid import UUID, uuid1 +from tinydb import TinyDB from pathlib import Path -import time +from logging import Logger from tinydb.queries import QueryImpl @@ -10,41 +9,23 @@ DEFAULT_DB_PATH: Path = Path("/var/lib/senju.json") class StoreManager: - __slots__ = "_db" + __slots__ = "_db", "logger" _db: TinyDB + logger: Logger def __init__(self, path_to_db: Path = DEFAULT_DB_PATH) -> None: self._db = TinyDB(path_to_db) - - def new_id(self) -> UUID: - _guard: int = 0 - while True: - unix_timestamp: int = int(time.time()) - id = uuid1(node=None, clock_seq=unix_timestamp) - if len(self._query(Query().id == id)) < 1: - break - _guard += 1 - if _guard > 100: - raise Exception( - "tried 100 random UUIDs but found no unused one") - return id + self.logger = Logger(__name__) def _query(self, query: QueryImpl) -> list[dict]: return self._db.search(query) - def load(self, key: UUID) -> Optional[dict]: - results = self._query(Query().id == str(key)) - if len(results) < 1: - raise Exception("foobar") - elif len(results) > 2: - raise KeyError("The requested item did not exist in our database") - else: - return results[0]["data"] + def _load(self, id: int) -> Optional[dict]: + try: + return self._db.get(doc_id=id) + except IndexError as e: + self.logger.warning(f"could not get item with id {id}: {e}") + return None - def save(self, data: dict) -> UUID: - id = self.new_id() - self._db.insert({ - "id": str(id), - "data": data - }) - return id + def _save(self, data: dict) -> int: + return self._db.insert(data) diff --git a/tests/test_store.py b/tests/test_store.py index fc05ef1..66b3f01 100644 --- a/tests/test_store.py +++ b/tests/test_store.py @@ -5,7 +5,7 @@ import pytest # noqa: F401 from senju.store_manager import StoreManager # noqa: F401 -def test_temp_data_dir(store_manager: StoreManager): +def test_save_and_load_any(store_manager: StoreManager): thing = { "color": "blue", "number": 19, @@ -13,9 +13,11 @@ def test_temp_data_dir(store_manager: StoreManager): "no": "yes" } } - thing_id = store_manager.save(thing) - thing_loaded = store_manager.load(thing_id) + thing_id = store_manager._save(thing) + thing_loaded = store_manager._load(thing_id) + if thing_loaded is None: - assert False, "the store manager load did not return anything" + assert False, "store manager load did not return anything but \ + should have" for key in thing.keys(): assert thing[key] == thing_loaded[key]