def engine_fixture(request): backend_db = 'sqlite' if 'sqlite://' in get_config_settings('sqlalchemy.url') else 'postgres' logger.debug('backend_db: %s' % backend_db) if backend_db == 'sqlite': db_path = tempfile.NamedTemporaryFile(suffix='.sqlite', delete=False).name #use tempfile directly DB_URL = 'sqlite:///' + db_path engine = create_engine(DB_URL, poolclass=NullPool) connection = engine.connect() DBSession.configure(bind=engine) Base.metadata.bind = engine logger.debug('(sqlite_engine_fixture) created, sqlite file: %s' % db_path) else: DB_URL = get_config_settings('sqlalchemy.url') engine = create_engine(DB_URL) connection = engine.connect() DBSession.configure(bind=engine) Base.metadata.bind = engine logger.debug('(postgres_engine_fixture) created, postgres url: %s' % DB_URL) def fin(): DBSession.close() DBSession.remove() connection.close() if backend_db == 'sqlite': os.unlink(db_path) logger.debug('(sqlite_engine_fixture) delete, remove sqlitedb file: %s' % db_path) else: logger.debug('(postgres_engine_fixture) fin with postgresdb url: %s' % DB_URL) request.addfinalizer(fin) #return engine return backend_db
def main(global_config, **settings): """ This function returns a Pyramid WSGI application. """ global DBSession, Base engine = engine_from_config(settings, 'sqlalchemy.') backend_db = 'sqlite' if 'sqlite://' in settings['sqlalchemy.url'] else 'postgres' scarab_settings = {} scarab_settings['backend_db'] = backend_db logger.debug('scarab_settings: %s' % scarab_settings) def get_scarab_settings(request): return scarab_settings #enable sqlite foreignkey if sqlite if 'sqlite' == backend_db: event.listen(engine, 'connect', _fk_pragma_on_connect) #db foreignkey on DBSession.configure(bind=engine) Base.metadata.bind = engine config = Configurator(root_factory='scarab.models.RootFactory', settings=settings) #api routes config.include(api_routes) #embeded userojb to request config.add_request_method(get_user, 'user', reify=True) config.add_request_method(get_scarab_settings, 'scarab_settings', reify=True) #security; add policies here policies =[AuthTktAuthenticationPolicy(settings['scarab.auth_secret'], callback=groupfinder, hashalg='sha512')] authn_policy = MultiAuthenticationPolicy(policies) authz_policy = ACLAuthorizationPolicy() config.set_authentication_policy(authn_policy) config.set_authorization_policy(authz_policy) #all setting is done, scan config config.scan() return config.make_wsgi_app()