From a09dc598c365b12a69a93ebf62c32799d582e268 Mon Sep 17 00:00:00 2001 From: JarbasAI <33701864+JarbasAl@users.noreply.github.com> Date: Sat, 28 Dec 2024 16:16:37 +0000 Subject: [PATCH] feat: hivemind-plugin-manager (#7) * feat: hivemind-plugin-manager integrate with hivemind-plugin-manager provide a json database implementation via entrypoint * Update json_database/hpm.py Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- json_database/hpm.py | 86 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 json_database/hpm.py diff --git a/json_database/hpm.py b/json_database/hpm.py new file mode 100644 index 0000000..81dcd72 --- /dev/null +++ b/json_database/hpm.py @@ -0,0 +1,86 @@ +from hivemind_plugin_manager.database import Client, AbstractDB, cast2client +from ovos_utils.log import LOG +from ovos_utils.xdg_utils import xdg_data_home +from typing import Union, Iterable, List +from json_database import JsonStorageXDG + + +class JsonDB(AbstractDB): + """HiveMind Database implementation using JSON files.""" + + def __init__(self, name="clients", subfolder="hivemind-core"): + self._db = JsonStorageXDG(name, subfolder=subfolder, xdg_folder=xdg_data_home()) + LOG.debug(f"json database path: {self._db.path}") + + def sync(self): + """update db from disk if needed""" + self._db.reload() + + def add_item(self, client: Client) -> bool: + """ + Add a client to the JSON database. + + Args: + client: The client to be added. + + Returns: + True if the addition was successful, False otherwise. + """ + self._db[client.client_id] = client.__dict__ + return True + + def search_by_value(self, key: str, val: Union[str, bool, int, float]) -> List[Client]: + """ + Search for clients by a specific key-value pair in the JSON database. + + Args: + key: The key to search by. + val: The value to search for. + + Returns: + A list of clients that match the search criteria. + """ + res = [] + if key == "client_id": + v = self._db.get(val) + if v: + res.append(cast2client(v)) + else: + for client in self._db.values(): + v = client.get(key) + if v == val: + res.append(cast2client(client)) + return res + + def __len__(self) -> int: + """ + Get the number of clients in the database. + + Returns: + The number of clients in the database. + """ + return len(self._db) + + def __iter__(self) -> Iterable['Client']: + """ + Iterate over all clients in the JSON database. + + Returns: + An iterator over the clients in the database. + """ + for item in self._db.values(): + yield Client.deserialize(item) + + def commit(self) -> bool: + """ + Commit changes to the JSON database. + + Returns: + True if the commit was successful, False otherwise. + """ + try: + self._db.store() + return True + except Exception as e: + LOG.error(f"Failed to save {self._db.path} - {e}") + return False