Source code for simstack.util.database_information

from __future__ import annotations

import os
import sys
from typing import TYPE_CHECKING, Any, Dict, Union

from simstack.core.definitions import DBType

if TYPE_CHECKING:
    from simstack.util.db import Database


[docs] class DatabaseInformation: """ Represents a database and its connection information. This class encapsulates essential details about a database, including its name and connection string. It provides a convenient method for initializing this information from a configuration file, facilitating streamlined database setups and connections. Attributes: _db_name (str): The name of the database. _connection_string (str): The connection string used to access the database. Methods: from_config_file(config, **kwargs): Initialize DatabaseInformation from TOML config or a database specified in TOML. """ def __init__( self, db_name: str, connection_string: str, db_type: DBType = DBType.MONGODB, server_url: str | None = None, server_token: str | None = None, ): self._db_name = db_name self._connection_string = connection_string self._db_type = db_type self._server_url = server_url self._server_token = server_token @property def server_url(self) -> str: return self._server_url @property def server_token(self) -> str: return self._server_token
[docs] @classmethod def from_config(cls, config: Dict[str, Any], **kwargs): """ Initialize DatabaseInformation from TOML config kwargs override config file. """ common_params = config.get("parameters", {}).get("db", {}) is_test = kwargs.get("is_test", False) # Standard initialization from TOML db_name = kwargs.get("db_name") # for testing we can use an in_memory db if db_name is None: # the package simstack.toml has no db_name and connections string db_name = common_params.get("database") if db_name is None: print( "You must specify a database name in parameters.db in the config file" ) sys.exit(-1) connection_string = kwargs.get("connection_string") if connection_string is None: connection_string = common_params.get("connection_string") if not is_test and connection_string is None: print("You must specify a connection string in the config file") sys.exit(-1) server_url = config.get("parameters", {}).get("server", {}).get("url", None) if server_url is None: server_url = os.environ.get("SIMSTACK_SERVER_URL") server_token = config.get("parameters", {}).get("server", {}).get("token", None) if server_token is None: server_token = os.environ.get("SIMSTACK_SERVER_TOKEN") # Use in-memory database for tests db_type = ( DBType.IN_MEMORY if is_test and connection_string is None else DBType.MONGODB ) return cls( db_name=db_name, connection_string=connection_string, db_type=db_type, server_url=server_url, server_token=server_token, )
[docs] @classmethod def from_db_info(cls, db_info: "DatabaseInformation"): return cls( db_info._db_name, db_info._connection_string, db_info._db_type, getattr(db_info, "_server_url", None), getattr(db_info, "_server_token", None), )
[docs] @classmethod def from_db_info_or_db(cls, db_info: Union["DatabaseInformation", "Database"]): from simstack.util.db import Database if isinstance(db_info, DatabaseInformation): return DatabaseInformation.from_db_info(db_info) elif isinstance(db_info, Database): return cls( db_info.database_name, db_info.connection_string, db_info.databae_type, getattr(db_info, "server_url", None), getattr(db_info, "server_token", None), ) else: raise TypeError( "db_info must be an instance of DatabaseInformation or Database" )
@property def db_type(self) -> DBType: return self._db_type @property def db_name(self) -> str: return self._db_name @property def connection_string(self) -> str: return self._connection_string def __repr__(self) -> str: return f"DatabaseInformation(db_name='{self._db_name}', connection_string='{self._connection_string}', db_type={self._db_type})"
[docs] def get_information(self): """ Returns a tuple of the initialization parameters that can be used as *args for __init__. Returns: tuple: (db_name, connection_string, db_type) """ return ( self._db_name, self._connection_string, self._db_type, self._server_url, self._server_token, )