From c5ade523a574cca0881d265cd0e87be558cd3c14 Mon Sep 17 00:00:00 2001 From: jepegit Date: Wed, 12 Nov 2025 16:59:08 +0100 Subject: [PATCH] start improving dbreaders --- cellpy/readers/core.py | 24 +++++++++++++++++ cellpy/readers/dbreader.py | 2 +- cellpy/readers/json_dbreader.py | 42 +++++++++++++++++++++++++++++ cellpy/readers/sql_dbreader.py | 4 +-- cellpy/utils/batch_tools/engines.py | 10 +++++++ 5 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 cellpy/readers/json_dbreader.py diff --git a/cellpy/readers/core.py b/cellpy/readers/core.py index 817db287..4b18ed4e 100644 --- a/cellpy/readers/core.py +++ b/cellpy/readers/core.py @@ -118,6 +118,30 @@ def pickle_protocol(level): class BaseDbReader(metaclass=abc.ABCMeta): """Base class for database readers.""" + @abc.abstractmethod + def from_batch( + self, batch_name: str|None=None, + include_key: bool=False, + include_individual_arguments: bool=False, + **kwargs: Any + ) -> dict: + """Get a dictionary with the data from a batch for the journal. + + Args: + batch: name of the batch. + include_key: include the key (the cell ids). + include_individual_arguments: include the individual arguments. + + Returns: + dict: dictionary with the data. + """ + pass + + + +class BaseSimpleDbReader(metaclass=abc.ABCMeta): + """Base class for database readers.""" + @abc.abstractmethod def select_batch(self, batch: str) -> List[int]: pass diff --git a/cellpy/readers/dbreader.py b/cellpy/readers/dbreader.py index 3f15d2a5..66d8e235 100644 --- a/cellpy/readers/dbreader.py +++ b/cellpy/readers/dbreader.py @@ -35,7 +35,7 @@ def __repr__(self): return f"" -class Reader(core.BaseDbReader): +class Reader(core.BaseSimpleDbReader): def __init__( self, db_file=None, diff --git a/cellpy/readers/json_dbreader.py b/cellpy/readers/json_dbreader.py new file mode 100644 index 00000000..92dd9f53 --- /dev/null +++ b/cellpy/readers/json_dbreader.py @@ -0,0 +1,42 @@ +from typing import Any +from cellpy.readers.core import BaseDbReader +import json + + +class BaseJSONReader(BaseDbReader): + def __init__(self, json_file: str): + self.json_file = json_file + self.data = self.load_data() + + def _load_raw_data(self): + with open(self.json_file, "r") as f: + return json.load(f) + + def load_data(self): + return pd.read_json(self.json_file) + + +class BattBaseJSONReader(BaseJSONReader): + _version = "1.0.0" + + def from_batch( + self, + batch_name: str | None = None, + project_name: str | None = None, + include_key: bool = False, + include_individual_arguments: bool = False, + ) -> dict: + raise NotImplementedError("This method is not implemented for this reader") + + +if __name__ == "__main__": + from pathlib import Path + import pandas as pd + + pd.set_option("display.max_columns", None) + + local_dir = Path(__file__).parent.parent.parent / "local" + json_file = local_dir / "cellpy_journal_table.json" + print(json_file.exists()) + reader = BattBaseJSONReader(json_file) + print(reader.from_batch()) diff --git a/cellpy/readers/sql_dbreader.py b/cellpy/readers/sql_dbreader.py index c1a22c96..bb398118 100644 --- a/cellpy/readers/sql_dbreader.py +++ b/cellpy/readers/sql_dbreader.py @@ -24,7 +24,7 @@ BATCH_ATTRS_TO_IMPORT_FROM_EXCEL_SQLITE, get_headers_journal, ) -from cellpy.readers.core import BaseDbReader +from cellpy.readers.core import BaseSimpleDbReader # ----------------- USED WHEN CONVERTING FROM EXCEL ----------------- DB_FILE_EXCEL = prms.Paths.db_filename @@ -158,7 +158,7 @@ def __str__(self) -> str: return f"batch: '{self.name}' (#{self.pk})" -class SQLReader(BaseDbReader): +class SQLReader(BaseSimpleDbReader): """A custom database reader for the batch utility in cellpy.""" def __init__(self, db_connection: str = None, batch: str = None, **kwargs) -> None: diff --git a/cellpy/utils/batch_tools/engines.py b/cellpy/utils/batch_tools/engines.py index db9b13fa..62e97747 100644 --- a/cellpy/utils/batch_tools/engines.py +++ b/cellpy/utils/batch_tools/engines.py @@ -11,6 +11,7 @@ import pandas as pd from cellpy import dbreader +from cellpy.readers import json_dbreader from cellpy.parameters.internal_settings import get_headers_journal, get_headers_summary from cellpy.utils.batch_tools import batch_helpers as helper @@ -191,6 +192,15 @@ def simple_db_engine( reader = dbreader.Reader() logging.debug("No reader provided. Creating one myself.") + if isinstance(reader, str): + match reader: + case "simple_excel_reader": + reader = dbreader.Reader() + case "batbase_json_reader": + reader = json_dbreader.BatbaseJSONReader() + case _: + raise ValueError(f"Invalid reader: {reader}") + if cell_ids is None: logging.debug("cell_ids is None") pages_dict = reader.from_batch(