From cdbd2979d2bea0dbbad93bcd077fd8e2c9204215 Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Wed, 22 Mar 2017 22:17:56 -0700 Subject: [PATCH] Back to what works on Windows (cherry picked from commit 3401b87) --- _development/helpers.py | 94 +++++++++++++++++++++++++--- eos/config.py | 13 ++-- tests/test_smoketests/test_rifter.py | 6 +- 3 files changed, 98 insertions(+), 15 deletions(-) diff --git a/_development/helpers.py b/_development/helpers.py index 89adade8b..643404913 100644 --- a/_development/helpers.py +++ b/_development/helpers.py @@ -3,6 +3,7 @@ import pytest import os import sys +import threading from sqlalchemy import MetaData, create_engine from sqlalchemy.orm import sessionmaker @@ -14,17 +15,92 @@ sys.path.append(os.path.realpath(os.path.join(script_dir, '..', '..'))) # noinspection PyUnresolvedReferences,PyUnusedLocal @pytest.fixture -def DBInMemory(): +def DBInMemory_test(): + def rollback(): + with sd_lock: + saveddata_session.rollback() + + print("Creating database in memory") - import eos.config from os.path import realpath, join, dirname, abspath - eos.config.debug = False - eos.config.gamedataCache = True - eos.config.saveddataCache = True - eos.config.gamedata_version = "" - eos.config.gamedata_connectionstring = 'sqlite:///' + realpath(join(dirname(abspath(unicode(__file__))), "..", "eve.db")) - # saveddata_connectionstring = 'sqlite:///' + unicode(realpath(join(dirname(abspath(__file__)), "..", "saveddata", "saveddata.db")), sys.getfilesystemencoding()) + debug = False + gamedataCache = True + saveddataCache = True + gamedata_version = "" + gamedata_connectionstring = 'sqlite:///' + realpath(join(dirname(abspath(unicode(__file__))), "..", "eve.db")) + saveddata_connectionstring = 'sqlite:///:memory:' + + class ReadOnlyException(Exception): + pass + + if callable(gamedata_connectionstring): + gamedata_engine = create_engine("sqlite://", creator=gamedata_connectionstring, echo=debug) + else: + gamedata_engine = create_engine(gamedata_connectionstring, echo=debug) + + gamedata_meta = MetaData() + gamedata_meta.bind = gamedata_engine + gamedata_session = sessionmaker(bind=gamedata_engine, autoflush=False, expire_on_commit=False)() + + # This should be moved elsewhere, maybe as an actual query. Current, without try-except, it breaks when making a new + # game db because we haven't reached gamedata_meta.create_all() + try: + gamedata_version = gamedata_session.execute( + "SELECT `field_value` FROM `metadata` WHERE `field_name` LIKE 'client_build'" + ).fetchone()[0] + except Exception as e: + print("Missing gamedata version.") + gamedata_version = None + + if saveddata_connectionstring is not None: + if callable(saveddata_connectionstring): + saveddata_engine = create_engine(creator=saveddata_connectionstring, echo=debug) + else: + saveddata_engine = create_engine(saveddata_connectionstring, echo=debug) + + saveddata_meta = MetaData() + saveddata_meta.bind = saveddata_engine + saveddata_session = sessionmaker(bind=saveddata_engine, autoflush=False, expire_on_commit=False)() + else: + saveddata_meta = None + + # Lock controlling any changes introduced to session + sd_lock = threading.Lock() + + # Import all the definitions for all our database stuff + # noinspection PyPep8 + #from eos.db.gamedata import alphaClones, attribute, category, effect, group, icon, item, marketGroup, metaData, metaGroup, queries, traits, unit + # noinspection PyPep8 + #from eos.db.saveddata import booster, cargo, character, crest, damagePattern, databaseRepair, drone, fighter, fit, implant, implantSet, loadDefaultDatabaseValues, miscData, module, override, price, queries, skill, targetResists, user + + # If using in memory saveddata, you'll want to reflect it so the data structure is good. + if saveddata_connectionstring == "sqlite:///:memory:": + saveddata_meta.create_all() + + # Output debug info to help us troubleshoot Travis + print(saveddata_engine) + print(gamedata_engine) + + helper = { + #'config': eos.config, + 'gamedata_session' : gamedata_session, + 'saveddata_session' : saveddata_session, + } + return helper + +# noinspection PyUnresolvedReferences,PyUnusedLocal +@pytest.fixture +def DBInMemory(): + print("Creating database in memory") + from os.path import realpath, join, dirname, abspath + + ''' + global saveddata_memory + saveddata_memory = True + ''' + + import eos.config eos.config.saveddata_connectionstring = 'sqlite:///:memory:' import eos @@ -48,6 +124,8 @@ def DBInMemory(): helper = { 'config': eos.config, 'db' : eos.db, + 'gamedata_session' : eos.db.gamedata_session, + 'saveddata_session' : eos.db.saveddata_session, } return helper diff --git a/eos/config.py b/eos/config.py index 38371e299..ee7b0e0fa 100644 --- a/eos/config.py +++ b/eos/config.py @@ -1,14 +1,19 @@ import sys from os.path import realpath, join, dirname, abspath +from logbook import Logger +pyfalog = Logger(__name__) + debug = False gamedataCache = True saveddataCache = True gamedata_version = "" -gamedata_connectionstring = 'sqlite:///' + unicode(realpath(join(dirname(abspath(__file__)), "..", "eve.db")), - sys.getfilesystemencoding()) -saveddata_connectionstring = 'sqlite:///' + unicode( - realpath(join(dirname(abspath(__file__)), "..", "saveddata", "saveddata.db")), sys.getfilesystemencoding()) +gamedata_connectionstring = 'sqlite:///' + unicode(realpath(join(dirname(abspath(__file__)), "..", "eve.db")), sys.getfilesystemencoding()) +pyfalog.debug("Gamedata connection string: {0}", gamedata_connectionstring) + +saveddata_connectionstring = 'sqlite:///' + unicode(realpath(join(dirname(abspath(__file__)), "..", "saveddata", "saveddata.db")), sys.getfilesystemencoding()) + +pyfalog.debug("Saveddata connection string: {0}", saveddata_connectionstring) settings = { "setting1": True diff --git a/tests/test_smoketests/test_rifter.py b/tests/test_smoketests/test_rifter.py index 050098be8..195dcacb8 100644 --- a/tests/test_smoketests/test_rifter.py +++ b/tests/test_smoketests/test_rifter.py @@ -15,9 +15,9 @@ from _development.helpers import DBInMemory as DB, Gamedata, Saveddata @pytest.fixture def Rifter(DB, Gamedata, Saveddata): print("Creating Rifter") - print(DB['db'].gamedata_session.bind) - print(DB['db'].saveddata_session.bind) - item = DB['db'].gamedata_session.query(Gamedata['Item']).filter(Gamedata['Item'].name == "Rifter").first() + print(DB['gamedata_session'].bind) + print(DB['saveddata_session'].bind) + item = DB['gamedata_session'].query(Gamedata['Item']).filter(Gamedata['Item'].name == "Rifter").first() ship = Saveddata['Ship'](item) # setup fit fit = Saveddata['Fit'](ship, "My Rifter Fit")