Skip to content
Snippets Groups Projects
Factory.py 1.51 KiB
Newer Older
import logging, os
from enum import Enum
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
from .api.Database import Database
from .engines.inmemory.InMemoryDatabaseEngine import InMemoryDatabaseEngine
from .engines.redis.RedisDatabaseEngine import RedisDatabaseEngine

LOGGER = logging.getLogger(__name__)

class DatabaseEngineEnum(Enum):
    INMEMORY = 'inmemory'
    REDIS = 'redis'
    #MONGO = 'mongo'
    #RETHINK = 'rethink'
    #ETCD = 'etcd'

ENGINES = {
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    DatabaseEngineEnum.INMEMORY.value: InMemoryDatabaseEngine,
    DatabaseEngineEnum.REDIS.value: RedisDatabaseEngine,
    #DatabaseEngineEnum.MONGO.value: MongoDatabase,
    #DatabaseEngineEnum.RETHINK.value: RethinkDatabase,
    #DatabaseEngineEnum.ETCD.value: EtcdDatabase,
}

DEFAULT_DB_ENGINE = DatabaseEngineEnum.INMEMORY

def get_database(engine=None, **settings) -> Database:
    # return an instance of Database initialized with selected engine.
    # Engine is selected using following criteria (first that is not None is selected):
    # 1. user selected by parameter (engine=...)
    # 2. environment variable DB_ENGINE
    # 3. default engine: INMEMORY
    if engine is None: engine = os.environ.get('DB_ENGINE', DEFAULT_DB_ENGINE)
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    if engine is None: raise Exception('Database Engine not specified')
    if isinstance(engine, DatabaseEngineEnum): engine = engine.value
    engine_class = ENGINES.get(engine)
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    if engine_class is None: raise Exception('Unsupported DatabaseEngine({})'.format(engine))
    LOGGER.info('Selected Database Engine: {}'.format(engine))
    return Database(engine_class(**settings))