Source code for regolith.broker

"""API for accessing the metadata and file storage"""
import copy

from regolith.database import dump_database, open_dbs
from regolith.runcontrol import DEFAULT_RC, load_rcfile, filter_databases
from regolith.storage import store_client, push


[docs]def load_db(rc_file="regolithrc.json"): """Create a Broker instance from an rc file""" rc = copy.copy(DEFAULT_RC) rc._update(load_rcfile(rc_file)) filter_databases(rc) return Broker(rc)
[docs]class Broker: """Interface to the database and file storage systems Examples -------- >>> # Load the db >>> db = Broker.from_rc() >>> # Get a docment from the broker >>> ergs =db['group']['ergs'] >>> # Store a file >>> db.add_file(ergs, 'myfile', '/path/to/file/hello.txt') >>> # Get a file from the store >>> path = db.get_file_path(ergs, 'myfile') """ def __init__(self, rc=DEFAULT_RC): self.rc = rc # TODO: Lazy load these with store_client(rc) as sclient: self.store = sclient rc.client = open_dbs(rc) self._dbs = rc.client.dbs self.md = rc.client.chained_db self.db_client = rc.client
[docs] def add_file(self, document, name, filepath): """Add a file to a document in a collection. Parameters ---------- document : dict The document to add the file to name : str Name of the reference to the file filepath : str Location of the file on local disk """ output_path = self.store.copydoc(filepath) if "files" not in document: document["files"] = {} document["files"][name] = output_path for db in self.rc.databases: dump_database(db, self.db_client, self.rc) push(self.store.store, self.store.path)
[docs] @classmethod def from_rc(cls, rc_file="regolithrc.json"): """Return a Broker instance""" return load_db(rc_file)
[docs] def get_file_path(self, document, name): """ Get a file from the file storage associated with the document and name Parameters ---------- document : dict The document which stores the reference to the file name : str The name of the file stored (note that this can be different from the filename itself) Returns ------- path : str or None The file path, if not in the storage None """ if "files" in document: return self.store.retrieve(document["files"][name]) else: return None
def __getitem__(self, item): return self.md[item]