From 890ea21a300f7bcf48cd06d92bb90a36f29e783b Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Mon, 30 Jan 2017 07:24:07 -0800 Subject: [PATCH 01/27] Initial Logbook setup --- eos/db/__init__.py | 3 ++ pyfa.py | 68 ++++++++++++++++++++++++++++++++-------------- service/fit.py | 4 +++ 3 files changed, 54 insertions(+), 21 deletions(-) diff --git a/eos/db/__init__.py b/eos/db/__init__.py index e0dd4d1354..0ed9c85dbe 100644 --- a/eos/db/__init__.py +++ b/eos/db/__init__.py @@ -23,7 +23,10 @@ from sqlalchemy.orm import sessionmaker, scoped_session from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import pool +from logbook import Logger +log = Logger(__name__) +log.debug("Initializing") import migration from eos import config diff --git a/pyfa.py b/pyfa.py index e465b0d5ad..64a0b78025 100755 --- a/pyfa.py +++ b/pyfa.py @@ -24,6 +24,9 @@ from optparse import OptionParser, BadOptionError, AmbiguousOptionError +from logbook import RotatingFileHandler, Logger, StreamHandler, NestedSetup +log = Logger(__name__) + class PassThroughOptionParser(OptionParser): """ @@ -115,24 +118,47 @@ def _process_args(self, largs, rargs, values): config.defPaths(options.savepath) # Basic logging initialization - import logging - logging.basicConfig() - - # Import everything - import wx - import os - import os.path - - import eos.db - import service.prefetch - from gui.mainFrame import MainFrame - - # Make sure the saveddata db exists - if not os.path.exists(config.savePath): - os.mkdir(config.savePath) - - eos.db.saveddata_meta.create_all() - - pyfa = wx.App(False) - MainFrame(options.title) - pyfa.MainLoop() + logging_setup = NestedSetup([ + # make sure we never bubble up to the stderr handler + # if we run out of setup handling + # NullHandler(), + StreamHandler(sys.stdout), + # then write messages that are at least warnings to a logfile + # FileHandler('application.log', level='WARNING'), + RotatingFileHandler( + config.getSavePath("log_rotate_test.txt"), + level=0, + max_size=1048576, + backup_count=5, + bubble=True + ), + ]) + + with logging_setup.threadbound(): + + log.info("Starting Pyfa") + #sys.excepthook = exception_hook + + # Import everything + log.debug("Import wx") + import wx + import os + import os.path + + log.debug("Import eos.db") + import eos.db + import service.prefetch + from gui.mainFrame import MainFrame + + log.debug("Make sure the saveddata db exists") + if not os.path.exists(config.savePath): + os.mkdir(config.savePath) + + eos.db.saveddata_meta.create_all() + + pyfa = wx.App(False) + MainFrame(options.title) + + # run the gui mainloop + log.debug("Run MainLoop()") + pyfa.MainLoop() diff --git a/service/fit.py b/service/fit.py index c8c97baf51..f3e0a90bb1 100644 --- a/service/fit.py +++ b/service/fit.py @@ -39,6 +39,9 @@ logger = logging.getLogger(__name__) +from logbook import Logger +log = Logger(__name__) + class Fit(object): instance = None @@ -51,6 +54,7 @@ def getInstance(cls): return cls.instance def __init__(self): + log.debug("Initialize Fit class") self.pattern = DamagePattern.getInstance().getDamagePattern("Uniform") self.targetResists = None self.character = saveddata_Character.getAll5() From 146fe1c220ef67fbbe7aa73e5a5c2c83756cbc9c Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Mon, 30 Jan 2017 09:13:29 -0800 Subject: [PATCH 02/27] Add logbook to requirements --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 2d88941134..ed301fe255 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ +logbook matplotlib PyYAML python-dateutil From 43d2379966b921488899623e5e3512f90e9308ce Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Mon, 30 Jan 2017 09:13:55 -0800 Subject: [PATCH 03/27] Handle stdout and stderr through logbook. Handle debug mode. --- pyfa.py | 89 ++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 72 insertions(+), 17 deletions(-) diff --git a/pyfa.py b/pyfa.py index 64a0b78025..d3d34960a7 100755 --- a/pyfa.py +++ b/pyfa.py @@ -24,7 +24,7 @@ from optparse import OptionParser, BadOptionError, AmbiguousOptionError -from logbook import RotatingFileHandler, Logger, StreamHandler, NestedSetup +from logbook import RotatingFileHandler, Logger, StreamHandler, NestedSetup, FingersCrossedHandler, NullHandler log = Logger(__name__) @@ -42,6 +42,25 @@ def _process_args(self, largs, rargs, values): largs.append(e.opt_str) +class LoggerWriter: + def __init__(self, level): + # self.level is really like using log.debug(message) + # at least in my case + self.level = level + + def write(self, message): + # if statement reduces the amount of newlines that are + # printed to the logger + if message not in {'\n', ' '}: + self.level(message.replace("\n", "")) + + def flush(self): + # create a flush method so things can be flushed when + # the system wants to. Not sure if simply 'printing' + # sys.stderr is the correct way to do it, but it seemed + # to work properly for me. + self.level(sys.stderr) + # Parse command line options usage = "usage: %prog [--root]" parser = PassThroughOptionParser(usage=usage) @@ -118,26 +137,61 @@ def _process_args(self, largs, rargs, values): config.defPaths(options.savepath) # Basic logging initialization - logging_setup = NestedSetup([ - # make sure we never bubble up to the stderr handler - # if we run out of setup handling - # NullHandler(), - StreamHandler(sys.stdout), - # then write messages that are at least warnings to a logfile - # FileHandler('application.log', level='WARNING'), - RotatingFileHandler( - config.getSavePath("log_rotate_test.txt"), - level=0, - max_size=1048576, - backup_count=5, - bubble=True - ), - ]) + + # Logging levels: + ''' + logbook.CRITICAL + logbook.ERROR + logbook.WARNING + logbook.INFO + logbook.DEBUG + logbook.NOTSET + ''' + + if options.debug: + logging_setup = NestedSetup([ + # make sure we never bubble up to the stderr handler + # if we run out of setup handling + NullHandler(), + StreamHandler( + sys.stdout, + bubble=False + ), + RotatingFileHandler( + config.getSavePath("Pyfa_debug.log"), + level=0, + max_size=1048576, + backup_count=5, + bubble=True + ) + ]) + else: + logging_setup = NestedSetup([ + # make sure we never bubble up to the stderr handler + # if we run out of setup handling + NullHandler(), + FingersCrossedHandler( + RotatingFileHandler( + config.getSavePath("Pyfa.log"), + level=0, + max_size=1048576, + backup_count=5, + bubble=False + ), + # action_level=Warning, + # buffer_size=1000, + # pull_information=True, + # reset=False, + ) + ]) with logging_setup.threadbound(): + # Output all stdout (print) messages as warnings + sys.stdout = LoggerWriter(log.warning) + # Output all stderr (stacktrace) messages as critical + sys.stderr = LoggerWriter(log.critical) log.info("Starting Pyfa") - #sys.excepthook = exception_hook # Import everything log.debug("Import wx") @@ -157,6 +211,7 @@ def _process_args(self, largs, rargs, values): eos.db.saveddata_meta.create_all() pyfa = wx.App(False) + log.debug("Show GUI") MainFrame(options.title) # run the gui mainloop From 518c4c83c057afaf1e888adef857c425fdfd7979 Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Mon, 30 Jan 2017 10:03:14 -0800 Subject: [PATCH 04/27] Convert existing logging to logbook (pass 1) --- eos/db/migration.py | 6 +++--- eos/db/saveddata/databaseRepair.py | 5 ++--- eos/effectHandlerHelpers.py | 5 ++--- eos/effects/adaptivearmorhardener.py | 5 ++--- eos/saveddata/booster.py | 5 ++--- eos/saveddata/cargo.py | 5 ++--- eos/saveddata/character.py | 6 +++--- eos/saveddata/citadel.py | 5 ++--- eos/saveddata/drone.py | 5 ++--- eos/saveddata/fighter.py | 5 ++--- eos/saveddata/fighterAbility.py | 5 ++--- eos/saveddata/fit.py | 5 ++--- eos/saveddata/implant.py | 5 ++--- eos/saveddata/module.py | 5 ++--- eos/saveddata/override.py | 5 ++--- eos/saveddata/ship.py | 5 ++--- gui/contextMenu.py | 5 ++--- gui/graphFrame.py | 4 ++-- gui/mainFrame.py | 6 ++++-- gui/propertyEditor.py | 5 ++--- gui/setEditor.py | 5 ++--- pyfa.py | 18 +++++++++--------- service/character.py | 5 ++--- service/crest.py | 5 ++--- service/fit.py | 5 ++--- service/market.py | 5 ++--- service/port.py | 4 ++-- 27 files changed, 65 insertions(+), 84 deletions(-) diff --git a/eos/db/migration.py b/eos/db/migration.py index 6dc59565c8..061c892104 100644 --- a/eos/db/migration.py +++ b/eos/db/migration.py @@ -1,12 +1,12 @@ -import logging +from logbook import Logger +logger = Logger(__name__) + import shutil import time import config import migrations -logger = logging.getLogger(__name__) - def getVersion(db): cursor = db.execute('PRAGMA user_version') diff --git a/eos/db/saveddata/databaseRepair.py b/eos/db/saveddata/databaseRepair.py index ede0f2fde7..ffb5adbd65 100644 --- a/eos/db/saveddata/databaseRepair.py +++ b/eos/db/saveddata/databaseRepair.py @@ -18,9 +18,8 @@ # =============================================================================== import sqlalchemy -import logging - -logger = logging.getLogger(__name__) +from logbook import Logger +logger = Logger(__name__) class DatabaseCleanup: diff --git a/eos/effectHandlerHelpers.py b/eos/effectHandlerHelpers.py index b0a61be695..544546d97b 100644 --- a/eos/effectHandlerHelpers.py +++ b/eos/effectHandlerHelpers.py @@ -18,12 +18,11 @@ # =============================================================================== # from sqlalchemy.orm.attributes import flag_modified -import logging +from logbook import Logger +logger = Logger(__name__) import eos.db -logger = logging.getLogger(__name__) - class HandledList(list): def filteredItemPreAssign(self, filter, *args, **kwargs): diff --git a/eos/effects/adaptivearmorhardener.py b/eos/effects/adaptivearmorhardener.py index 33e9f143c5..def5d046d6 100644 --- a/eos/effects/adaptivearmorhardener.py +++ b/eos/effects/adaptivearmorhardener.py @@ -2,9 +2,8 @@ # # Used by: # Module: Reactive Armor Hardener -import logging - -logger = logging.getLogger(__name__) +from logbook import Logger +logger = Logger(__name__) runTime = "late" type = "active" diff --git a/eos/saveddata/booster.py b/eos/saveddata/booster.py index 93f0a4bc3a..6721a2ac55 100644 --- a/eos/saveddata/booster.py +++ b/eos/saveddata/booster.py @@ -17,7 +17,8 @@ # along with eos. If not, see . # =============================================================================== -import logging +from logbook import Logger +logger = Logger(__name__) from sqlalchemy.orm import reconstructor, validates @@ -25,8 +26,6 @@ from eos.effectHandlerHelpers import HandledItem from eos.modifiedAttributeDict import ModifiedAttributeDict, ItemAttrShortcut -logger = logging.getLogger(__name__) - class Booster(HandledItem, ItemAttrShortcut): def __init__(self, item): diff --git a/eos/saveddata/cargo.py b/eos/saveddata/cargo.py index 34ab42db36..4b30e8208c 100644 --- a/eos/saveddata/cargo.py +++ b/eos/saveddata/cargo.py @@ -17,7 +17,8 @@ # along with eos. If not, see . # =============================================================================== -import logging +from logbook import Logger +logger = Logger(__name__) from sqlalchemy.orm import validates, reconstructor @@ -25,8 +26,6 @@ from eos.effectHandlerHelpers import HandledItem from eos.modifiedAttributeDict import ModifiedAttributeDict, ItemAttrShortcut -logger = logging.getLogger(__name__) - class Cargo(HandledItem, ItemAttrShortcut): def __init__(self, item): diff --git a/eos/saveddata/character.py b/eos/saveddata/character.py index cd5e278fd8..53d796b301 100644 --- a/eos/saveddata/character.py +++ b/eos/saveddata/character.py @@ -18,7 +18,9 @@ # =============================================================================== -import logging +from logbook import Logger +logger = Logger(__name__) + from itertools import chain from sqlalchemy.orm import validates, reconstructor @@ -28,8 +30,6 @@ import eos.types from eos.effectHandlerHelpers import HandledItem, HandledImplantBoosterList -logger = logging.getLogger(__name__) - class Character(object): __itemList = None diff --git a/eos/saveddata/citadel.py b/eos/saveddata/citadel.py index 1c3c228849..f900a444dd 100644 --- a/eos/saveddata/citadel.py +++ b/eos/saveddata/citadel.py @@ -17,12 +17,11 @@ # along with eos. If not, see . # =============================================================================== -import logging +from logbook import Logger +logger = Logger(__name__) from eos.types import Ship -logger = logging.getLogger(__name__) - class Citadel(Ship): def validate(self, item): diff --git a/eos/saveddata/drone.py b/eos/saveddata/drone.py index d0e8511f54..9ed492ff66 100644 --- a/eos/saveddata/drone.py +++ b/eos/saveddata/drone.py @@ -17,7 +17,8 @@ # along with eos. If not, see . # =============================================================================== -import logging +from logbook import Logger +logger = Logger(__name__) from sqlalchemy.orm import validates, reconstructor @@ -25,8 +26,6 @@ from eos.effectHandlerHelpers import HandledItem, HandledCharge from eos.modifiedAttributeDict import ModifiedAttributeDict, ItemAttrShortcut, ChargeAttrShortcut -logger = logging.getLogger(__name__) - class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): DAMAGE_TYPES = ("em", "kinetic", "explosive", "thermal") diff --git a/eos/saveddata/fighter.py b/eos/saveddata/fighter.py index d46b1a6fe4..774c8c75db 100644 --- a/eos/saveddata/fighter.py +++ b/eos/saveddata/fighter.py @@ -17,7 +17,8 @@ # along with eos. If not, see . # =============================================================================== -import logging +from logbook import Logger +logger = Logger(__name__) from sqlalchemy.orm import validates, reconstructor @@ -26,8 +27,6 @@ from eos.modifiedAttributeDict import ModifiedAttributeDict, ItemAttrShortcut, ChargeAttrShortcut from eos.types import FighterAbility, Slot -logger = logging.getLogger(__name__) - class Fighter(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): DAMAGE_TYPES = ("em", "kinetic", "explosive", "thermal") diff --git a/eos/saveddata/fighterAbility.py b/eos/saveddata/fighterAbility.py index cb7c349122..e01f2b6b87 100644 --- a/eos/saveddata/fighterAbility.py +++ b/eos/saveddata/fighterAbility.py @@ -17,12 +17,11 @@ # along with eos. If not, see . # =============================================================================== -import logging +from logbook import Logger +logger = Logger(__name__) from sqlalchemy.orm import reconstructor -logger = logging.getLogger(__name__) - class FighterAbility(object): DAMAGE_TYPES = ("em", "kinetic", "explosive", "thermal") diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py index f338564f2e..b1b7b8ffce 100644 --- a/eos/saveddata/fit.py +++ b/eos/saveddata/fit.py @@ -33,9 +33,8 @@ from eos.saveddata.module import State, Hardpoint from eos.types import Ship, Character, Slot, Module, Citadel from utils.timer import Timer -import logging - -logger = logging.getLogger(__name__) +from logbook import Logger +logger = Logger(__name__) try: from collections import OrderedDict diff --git a/eos/saveddata/implant.py b/eos/saveddata/implant.py index a77190bc47..e2065f2404 100644 --- a/eos/saveddata/implant.py +++ b/eos/saveddata/implant.py @@ -17,7 +17,8 @@ # along with eos. If not, see . # =============================================================================== -import logging +from logbook import Logger +logger = Logger(__name__) from sqlalchemy.orm import validates, reconstructor @@ -25,8 +26,6 @@ from eos.effectHandlerHelpers import HandledItem from eos.modifiedAttributeDict import ModifiedAttributeDict, ItemAttrShortcut -logger = logging.getLogger(__name__) - class Implant(HandledItem, ItemAttrShortcut): def __init__(self, item): diff --git a/eos/saveddata/module.py b/eos/saveddata/module.py index d040652339..ee496799a2 100644 --- a/eos/saveddata/module.py +++ b/eos/saveddata/module.py @@ -17,7 +17,8 @@ # along with eos. If not, see . # =============================================================================== -import logging +from logbook import Logger +logger = Logger(__name__) from sqlalchemy.orm import validates, reconstructor @@ -28,8 +29,6 @@ from eos.modifiedAttributeDict import ModifiedAttributeDict, ItemAttrShortcut, ChargeAttrShortcut from eos.types import Citadel -logger = logging.getLogger(__name__) - class State(Enum): OFFLINE = -1 diff --git a/eos/saveddata/override.py b/eos/saveddata/override.py index c4f8a1e027..7b7d5cd561 100644 --- a/eos/saveddata/override.py +++ b/eos/saveddata/override.py @@ -17,15 +17,14 @@ # along with eos. If not, see . # =============================================================================== -import logging +from logbook import Logger +logger = Logger(__name__) from sqlalchemy.orm import reconstructor import eos.db from eos.eqBase import EqBase -logger = logging.getLogger(__name__) - class Override(EqBase): def __init__(self, item, attr, value): diff --git a/eos/saveddata/ship.py b/eos/saveddata/ship.py index 4e4020cc77..4ab361344d 100644 --- a/eos/saveddata/ship.py +++ b/eos/saveddata/ship.py @@ -17,15 +17,14 @@ # along with eos. If not, see . # =============================================================================== -import logging +from logbook import Logger +logger = Logger(__name__) import eos.db from eos.effectHandlerHelpers import HandledItem from eos.modifiedAttributeDict import ModifiedAttributeDict, ItemAttrShortcut, cappingAttrKeyCache from eos.saveddata.mode import Mode -logger = logging.getLogger(__name__) - class Ship(ItemAttrShortcut, HandledItem): EXTRA_ATTRIBUTES = { diff --git a/gui/contextMenu.py b/gui/contextMenu.py index 520ad80652..4e53c982d4 100644 --- a/gui/contextMenu.py +++ b/gui/contextMenu.py @@ -18,9 +18,8 @@ # ============================================================================= import wx -import logging - -logger = logging.getLogger(__name__) +from logbook import Logger +logger = Logger(__name__) class ContextMenu(object): diff --git a/gui/graphFrame.py b/gui/graphFrame.py index 1a538f01dc..dd10ac8622 100644 --- a/gui/graphFrame.py +++ b/gui/graphFrame.py @@ -18,8 +18,8 @@ # ============================================================================= import os -import logging -logger = logging.getLogger(__name__) +from logbook import Logger +logger = Logger(__name__) import wx diff --git a/gui/mainFrame.py b/gui/mainFrame.py index 6570bcfc63..725e5055f6 100644 --- a/gui/mainFrame.py +++ b/gui/mainFrame.py @@ -19,7 +19,8 @@ import sys import os.path -import logging +from logbook import Logger +logger = Logger(__name__) import sqlalchemy import wx @@ -87,7 +88,8 @@ print("Error loading Attribute Editor: %s.\nAccess to Attribute Editor is disabled." % e.message) disableOverrideEditor = True -logger = logging.getLogger("pyfa.gui.mainFrame") +# TODO: Remove this if we don't need a special name for it +# logger = logging.getLogger("pyfa.gui.mainFrame") # dummy panel(no paint no erasebk) diff --git a/gui/propertyEditor.py b/gui/propertyEditor.py index 1129545a6c..bcc06816da 100644 --- a/gui/propertyEditor.py +++ b/gui/propertyEditor.py @@ -1,5 +1,6 @@ import csv -import logging +from logbook import Logger +logger = Logger(__name__) import wx @@ -19,8 +20,6 @@ from gui.marketBrowser import SearchBox from gui.bitmapLoader import BitmapLoader -logger = logging.getLogger(__name__) - class AttributeEditor(wx.Frame): def __init__(self, parent): diff --git a/gui/setEditor.py b/gui/setEditor.py index 0118fbe03f..411b114d3c 100644 --- a/gui/setEditor.py +++ b/gui/setEditor.py @@ -17,7 +17,8 @@ # along with pyfa. If not, see . # ============================================================================= -import logging +from logbook import Logger +logger = Logger(__name__) import wx from service.implantSet import ImplantSets @@ -25,8 +26,6 @@ from gui.utils.clipboard import toClipboard, fromClipboard from gui.builtinViews.entityEditor import EntityEditor, BaseValidator -logger = logging.getLogger(__name__) - class ImplantTextValidor(BaseValidator): def __init__(self): diff --git a/pyfa.py b/pyfa.py index d3d34960a7..5bd8061787 100755 --- a/pyfa.py +++ b/pyfa.py @@ -25,7 +25,7 @@ from optparse import OptionParser, BadOptionError, AmbiguousOptionError from logbook import RotatingFileHandler, Logger, StreamHandler, NestedSetup, FingersCrossedHandler, NullHandler -log = Logger(__name__) +logger = Logger(__name__) class PassThroughOptionParser(OptionParser): @@ -187,33 +187,33 @@ def flush(self): with logging_setup.threadbound(): # Output all stdout (print) messages as warnings - sys.stdout = LoggerWriter(log.warning) + sys.stdout = LoggerWriter(logger.warning) # Output all stderr (stacktrace) messages as critical - sys.stderr = LoggerWriter(log.critical) + sys.stderr = LoggerWriter(logger.critical) - log.info("Starting Pyfa") + logger.info("Starting Pyfa") # Import everything - log.debug("Import wx") + logger.debug("Import wx") import wx import os import os.path - log.debug("Import eos.db") + logger.debug("Import eos.db") import eos.db import service.prefetch from gui.mainFrame import MainFrame - log.debug("Make sure the saveddata db exists") + logger.debug("Make sure the saveddata db exists") if not os.path.exists(config.savePath): os.mkdir(config.savePath) eos.db.saveddata_meta.create_all() pyfa = wx.App(False) - log.debug("Show GUI") + logger.debug("Show GUI") MainFrame(options.title) # run the gui mainloop - log.debug("Run MainLoop()") + logger.debug("Run MainLoop()") pyfa.MainLoop() diff --git a/service/character.py b/service/character.py index be0000494d..fc869f04ac 100644 --- a/service/character.py +++ b/service/character.py @@ -20,7 +20,8 @@ import copy import itertools import json -import logging +from logbook import Logger +logger = Logger(__name__) import threading from codecs import open from xml.etree import ElementTree @@ -38,8 +39,6 @@ from eos.saveddata.module import Slot as es_Slot, Module as es_Module from eos.saveddata.fighter import Fighter as es_Fighter -logger = logging.getLogger(__name__) - class CharacterImportThread(threading.Thread): def __init__(self, paths, callback): diff --git a/service/crest.py b/service/crest.py index 74c74d311f..c624ae20dd 100644 --- a/service/crest.py +++ b/service/crest.py @@ -1,6 +1,7 @@ import wx import thread -import logging +from logbook import Logger +logger = Logger(__name__) import threading import copy import uuid @@ -14,8 +15,6 @@ from service.server import StoppableHTTPServer, AuthHandler from service.pycrest.eve import EVE -logger = logging.getLogger(__name__) - class Servers(Enum): TQ = 0 diff --git a/service/fit.py b/service/fit.py index f3e0a90bb1..319edbe0ae 100644 --- a/service/fit.py +++ b/service/fit.py @@ -18,7 +18,8 @@ # =============================================================================== import copy -import logging +from logbook import Logger +logger = Logger(__name__) import eos.db from eos.saveddata.booster import Booster as es_Booster @@ -37,8 +38,6 @@ from service.market import Market from service.settings import SettingsProvider -logger = logging.getLogger(__name__) - from logbook import Logger log = Logger(__name__) diff --git a/service/market.py b/service/market.py index 3384b3ecb9..675f2e4a6e 100644 --- a/service/market.py +++ b/service/market.py @@ -19,7 +19,8 @@ import re import threading -import logging +from logbook import Logger +logger = Logger(__name__) import Queue import wx @@ -42,8 +43,6 @@ except ImportError: from utils.compat import OrderedDict -logger = logging.getLogger(__name__) - # Event which tells threads dependent on Market that it's initialized mktRdy = threading.Event() diff --git a/service/port.py b/service/port.py index cbd24007de..440a3b13ab 100644 --- a/service/port.py +++ b/service/port.py @@ -20,7 +20,8 @@ import re import os import xml.dom -import logging +from logbook import Logger +logger = Logger(__name__) import collections import json import threading @@ -42,7 +43,6 @@ from service.market import Market -logger = logging.getLogger("pyfa.service.port") try: from collections import OrderedDict From 2b81ab98be853b546f78baf9038dc43c22ed6570 Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Mon, 30 Jan 2017 10:04:45 -0800 Subject: [PATCH 05/27] Convert logging (pass 2) --- service/pycrest/eve.py | 5 ++--- service/server.py | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/service/pycrest/eve.py b/service/pycrest/eve.py index 5f6fa9ffc3..afabaec5e5 100644 --- a/service/pycrest/eve.py +++ b/service/pycrest/eve.py @@ -1,5 +1,6 @@ import base64 -import logging +from logbook import Logger +logger = Logger(__name__) import os import re import time @@ -26,11 +27,9 @@ from urllib.parse import quote except ImportError: # pragma: no cover from urllib import quote -import logging import re import config -logger = logging.getLogger("pycrest.eve") cache_re = re.compile(r'max-age=([0-9]+)') diff --git a/service/server.py b/service/server.py index 268637515b..4046133d1f 100644 --- a/service/server.py +++ b/service/server.py @@ -2,14 +2,13 @@ import urlparse import socket import thread -import logging +from logbook import Logger +logger = Logger(__name__) import wx from service.settings import CRESTSettings -logger = logging.getLogger(__name__) - # noinspection PyPep8 HTML = ''' From bb38b695af1f1005697bd99e441b66e8f587b460 Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Mon, 30 Jan 2017 10:05:37 -0800 Subject: [PATCH 06/27] Remove blackholing crest loging --- service/pycrest/__init__.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/service/pycrest/__init__.py b/service/pycrest/__init__.py index f083e1f84d..5820a72904 100644 --- a/service/pycrest/__init__.py +++ b/service/pycrest/__init__.py @@ -1,12 +1 @@ -import logging - - -class NullHandler(logging.Handler): - def emit(self, record): - pass - - -logger = logging.getLogger('pycrest') -logger.addHandler(NullHandler()) - version = "0.0.1" From 83ffe69973b95b269f0aa06de304ee1f4e7d332c Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Mon, 30 Jan 2017 10:21:31 -0800 Subject: [PATCH 07/27] Convert logging (pass 3) --- service/prefetch.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/service/prefetch.py b/service/prefetch.py index 6e86683e58..0e3995c44a 100644 --- a/service/prefetch.py +++ b/service/prefetch.py @@ -27,10 +27,8 @@ from eos.db.saveddata.databaseRepair import DatabaseCleanup from eos.saveddata.character import Character as es_Character -import logging - -logger = logging.getLogger(__name__) - +from logbook import Logger +logger = Logger(__name__) class PrefetchThread(threading.Thread): def run(self): @@ -66,12 +64,12 @@ def run(self): # Import values that must exist otherwise Pyfa breaks DefaultDatabaseValues.importRequiredDefaults() - logging.debug("Starting database validation.") + logger.debug("Starting database validation.") database_cleanup_instance = DatabaseCleanup() database_cleanup_instance.OrphanedCharacterSkills(db.saveddata_engine) database_cleanup_instance.OrphanedFitCharacterIDs(db.saveddata_engine) database_cleanup_instance.OrphanedFitDamagePatterns(db.saveddata_engine) - logging.debug("Completed database validation.") + logger.debug("Completed database validation.") else: # If database does not exist, do not worry about migration. Simply From 7784290c05497ba4590192950d8367e5b705a54f Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Mon, 30 Jan 2017 10:26:07 -0800 Subject: [PATCH 08/27] Convert logging (final?) --- config.py | 40 ++++------------------------------------ 1 file changed, 4 insertions(+), 36 deletions(-) diff --git a/config.py b/config.py index aa9221023f..a011398474 100644 --- a/config.py +++ b/config.py @@ -1,10 +1,8 @@ import os import sys -# TODO: move all logging back to pyfa.py main loop -# We moved it here just to avoid rebuilding windows skeleton for now (any change to pyfa.py needs it) -import logging -import logging.handlers +from logbook import Logger +logger = Logger(__name__) # Load variable overrides specific to distribution type try: @@ -29,23 +27,6 @@ saveDB = None gameDB = None - -class StreamToLogger(object): - """ - Fake file-like stream object that redirects writes to a logger instance. - From: http://www.electricmonk.nl/log/2011/08/14/redirect-stdout-and-stderr-to-a-logger-in-python/ - """ - - def __init__(self, logger, log_level=logging.INFO): - self.logger = logger - self.log_level = log_level - self.linebuf = '' - - def write(self, buf): - for line in buf.rstrip().splitlines(): - self.logger.log(self.log_level, line.rstrip()) - - def isFrozen(): if hasattr(sys, 'frozen'): return True @@ -66,10 +47,7 @@ def defPaths(customSavePath): global gameDB global saveInRoot - if debug: - logLevel = logging.DEBUG - else: - logLevel = logging.WARN + logger.debug("Configuring Pyfa") # The main pyfa directory which contains run.py # Python 2.X uses ANSI by default, so we need to convert the character encoding @@ -97,19 +75,9 @@ def defPaths(customSavePath): os.environ["REQUESTS_CA_BUNDLE"] = getPyfaPath(certName).encode('utf8') os.environ["SSL_CERT_FILE"] = getPyfaPath(certName).encode('utf8') - loggingFormat = '%(asctime)s %(name)-24s %(levelname)-8s %(message)s' - logging.basicConfig(format=loggingFormat, level=logLevel) - handler = logging.handlers.RotatingFileHandler(getSavePath("log.txt"), maxBytes=1000000, backupCount=3) - formatter = logging.Formatter(loggingFormat) - handler.setFormatter(formatter) - logging.getLogger('').addHandler(handler) - - logging.info("Starting pyfa") if hasattr(sys, 'frozen'): - stdout_logger = logging.getLogger('STDOUT') - sl = StreamToLogger(stdout_logger, logging.INFO) - sys.stdout = sl + pass # This interferes with cx_Freeze's own handling of exceptions. Find a way to fix this. # stderr_logger = logging.getLogger('STDERR') From d66c503a90bc569da6adcec7c3772f77cc0ba6f5 Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Mon, 30 Jan 2017 12:42:24 -0800 Subject: [PATCH 09/27] Avoid blackholing all exceptions --- config.py | 1 + eos/db/__init__.py | 5 +- eos/graph/fitDps.py | 4 + gui/bitmapLoader.py | 4 + gui/builtinViews/fittingView.py | 6 + gui/characterEditor.py | 13 +- gui/characterSelection.py | 3 + gui/chromeTabs.py | 3 + gui/crestFittings.py | 17 +- gui/graphFrame.py | 4 +- gui/marketBrowser.py | 3 + gui/patternEditor.py | 8 +- gui/resistsEditor.py | 16 +- gui/setEditor.py | 4 +- gui/utils/compat.py | 4 + gui/utils/exportHtml.py | 5 + pyfa.py | 1 + scripts/dist.py | 520 ++++++++++++++++---------------- scripts/itemDiff.py | 3 + service/port.py | 18 ++ service/price.py | 4 + service/pycrest/eve.py | 2 + service/server.py | 2 + service/update.py | 3 + 24 files changed, 383 insertions(+), 270 deletions(-) diff --git a/config.py b/config.py index a011398474..9235da57d1 100644 --- a/config.py +++ b/config.py @@ -8,6 +8,7 @@ try: import configforced except ImportError: + logger.warning("Failed to import: configforced") configforced = None # Turns on debug mode diff --git a/eos/db/__init__.py b/eos/db/__init__.py index 0ed9c85dbe..c53bab9826 100644 --- a/eos/db/__init__.py +++ b/eos/db/__init__.py @@ -25,8 +25,8 @@ from sqlalchemy import pool from logbook import Logger -log = Logger(__name__) -log.debug("Initializing") +logger = Logger(__name__) +logger.debug("Initializing") import migration from eos import config @@ -53,6 +53,7 @@ class ReadOnlyException(Exception): "SELECT `field_value` FROM `metadata` WHERE `field_name` LIKE 'client_build'" ).fetchone()[0] except: + logger.warning("Missing gamedata version.") config.gamedata_version = None saveddata_connectionstring = config.saveddata_connectionstring diff --git a/eos/graph/fitDps.py b/eos/graph/fitDps.py index 04ef910a54..7f58ea9f11 100644 --- a/eos/graph/fitDps.py +++ b/eos/graph/fitDps.py @@ -22,6 +22,9 @@ from eos.graph import Graph from eos.types import Hardpoint, State +from logbook import Logger +logger = Logger(__name__) + class FitDpsGraph(Graph): defaults = {"angle": 0, @@ -66,6 +69,7 @@ def calcDps(self, data): val *= 1 + (bonus - 1) * exp(- i ** 2 / 7.1289) data[attr] = val except: + logger.warning("Caught exception in calcDPS.") pass for mod in fit.modules: diff --git a/gui/bitmapLoader.py b/gui/bitmapLoader.py index 066fc0c5f3..87586f47b4 100644 --- a/gui/bitmapLoader.py +++ b/gui/bitmapLoader.py @@ -26,6 +26,9 @@ import config +from logbook import Logger +logger = Logger(__name__) + try: from collections import OrderedDict except ImportError: @@ -36,6 +39,7 @@ class BitmapLoader(): try: archive = zipfile.ZipFile(config.getPyfaPath('imgs.zip'), 'r') except IOError: + logger.info("Using local image files instead of zip.") archive = None cachedBitmaps = OrderedDict() diff --git a/gui/builtinViews/fittingView.py b/gui/builtinViews/fittingView.py index dae6fe86ec..4dd0c32501 100644 --- a/gui/builtinViews/fittingView.py +++ b/gui/builtinViews/fittingView.py @@ -58,6 +58,7 @@ def fitSelected(self, event): wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=event.fitID)) break except: + logger.warning("Caught exception in fitSelected") pass if count < 0: startup = getattr(event, "startup", False) # see OpenFitsThread in gui.mainFrame @@ -274,6 +275,7 @@ def fitRemoved(self, event): sFit.refreshFit(self.getActiveFit()) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.activeFitID)) except wx._core.PyDeadObjectError: + logger.warning("Caught dead object") pass event.Skip() @@ -476,6 +478,7 @@ def fitChanged(self, event): self.Show(self.activeFitID is not None and self.activeFitID == event.fitID) except wx._core.PyDeadObjectError: + logger.warning("Caught dead object") pass finally: event.Skip() @@ -630,6 +633,7 @@ def refresh(self, stuff): try: self.MakeSnapshot() except: + logger.warning("Failed to make snapshot") pass def OnShow(self, event): @@ -637,6 +641,7 @@ def OnShow(self, event): try: self.MakeSnapshot() except: + logger.warning("Failed to make snapshot") pass event.Skip() @@ -662,6 +667,7 @@ def MakeSnapshot(self, maxColumns=1337): try: fit = sFit.getFit(self.activeFitID) except: + logger.warning("Failed to get fit") return if fit is None: diff --git a/gui/characterEditor.py b/gui/characterEditor.py index 421ed8bbc2..ebb62a4193 100644 --- a/gui/characterEditor.py +++ b/gui/characterEditor.py @@ -30,6 +30,8 @@ from service.character import Character from service.network import AuthenticationError, TimeoutError from service.market import Market +from logbook import Logger +logger = Logger(__name__) class CharacterTextValidor(BaseValidator): @@ -52,6 +54,7 @@ def Validate(self, win): return True except ValueError, e: + logger.error(e) wx.MessageBox(u"{}".format(e), "Error") textCtrl.SetFocus() return False @@ -626,10 +629,15 @@ def fetchCharList(self, event): activeChar = self.charEditor.entityEditor.getActiveEntity() list = sChar.apiCharList(activeChar.ID, self.inputID.GetLineText(0), self.inputKey.GetLineText(0)) except AuthenticationError, e: - self.stStatus.SetLabel("Authentication failure. Please check keyID and vCode combination.") + msg = "Authentication failure. Please check keyID and vCode combination." + logger.info(msg) + self.stStatus.SetLabel(msg) except TimeoutError, e: - self.stStatus.SetLabel("Request timed out. Please check network connectivity and/or proxy settings.") + msg = "Request timed out. Please check network connectivity and/or proxy settings." + logger.info(msg) + self.stStatus.SetLabel(msg) except Exception, e: + logger.error(e) self.stStatus.SetLabel("Error:\n%s" % e.message) else: self.charChoice.Clear() @@ -652,6 +660,7 @@ def fetchSkills(self, event): sChar.apiFetch(activeChar.ID, charName) self.stStatus.SetLabel("Successfully fetched %s\'s skills from EVE API." % charName) except Exception, e: + logger.error("Unable to retrieve %s\'s skills. Error message:\n%s" % (charName, e)) self.stStatus.SetLabel("Unable to retrieve %s\'s skills. Error message:\n%s" % (charName, e)) diff --git a/gui/characterSelection.py b/gui/characterSelection.py index b63f874751..1aae7b4991 100644 --- a/gui/characterSelection.py +++ b/gui/characterSelection.py @@ -23,6 +23,8 @@ import gui.mainFrame from service.character import Character from service.fit import Fit +from logbook import Logger +logger = Logger(__name__) class CharacterSelection(wx.Panel): @@ -113,6 +115,7 @@ def refreshApi(self, event): sChar.apiFetch(self.getActiveCharacter(), charName) except: # can we do a popup, notifying user of API error? + logger.error("API fetch error") pass self.refreshCharacterList() diff --git a/gui/chromeTabs.py b/gui/chromeTabs.py index 00998eb871..30532984c7 100644 --- a/gui/chromeTabs.py +++ b/gui/chromeTabs.py @@ -23,6 +23,8 @@ import gui.utils.drawUtils as drawUtils import gui.utils.fonts as fonts from gui.bitmapLoader import BitmapLoader +from logbook import Logger +logger = Logger(__name__) from service.fit import Fit @@ -1088,6 +1090,7 @@ def CheckTabPreview(self, mposx, mposy): self.previewTimer.Start(500, True) break except: + logger.warning("Exception caught in CheckTabPreview.") pass def CheckAddHighlighted(self, x, y): diff --git a/gui/crestFittings.py b/gui/crestFittings.py index e51c0cd26e..fd712f8831 100644 --- a/gui/crestFittings.py +++ b/gui/crestFittings.py @@ -16,6 +16,9 @@ import gui.display as d import gui.globalEvents as GE +from logbook import Logger +logger = Logger(__name__) + class CrestFittings(wx.Frame): def __init__(self, parent): @@ -145,7 +148,9 @@ def fetchFittings(self, event): self.cacheTimer.Start(1000) self.fitTree.populateSkillTree(fittings) except requests.exceptions.ConnectionError: - self.statusbar.SetStatusText("Connection error, please check your internet connection") + msg = "Connection error, please check your internet connection" + logger.error(msg) + self.statusbar.SetStatusText(msg) finally: del waitDialog @@ -173,7 +178,9 @@ def deleteFitting(self, event): try: sCrest.delFitting(self.getActiveCharacter(), data['fittingID']) except requests.exceptions.ConnectionError: - self.statusbar.SetStatusText("Connection error, please check your internet connection") + msg = "Connection error, please check your internet connection" + logger.error(msg) + self.statusbar.SetStatusText(msg) class ExportToEve(wx.Frame): @@ -281,9 +288,12 @@ def exportFitting(self, event): text = json.loads(res.text) self.statusbar.SetStatusText(text['message'], 1) except ValueError: + logger.warning("Value error on loading JSON.") self.statusbar.SetStatusText("", 1) except requests.exceptions.ConnectionError: - self.statusbar.SetStatusText("Connection error, please check your internet connection", 1) + msg = "Connection error, please check your internet connection" + logger.error(msg) + self.statusbar.SetStatusText(msg) class CrestMgmt(wx.Dialog): @@ -405,6 +415,7 @@ def displayFit(self, event): cargo.amount = item['quantity'] list.append(cargo) except: + logger.error("Exception caught in displayFit") pass self.parent.fitView.fitSelection = selection diff --git a/gui/graphFrame.py b/gui/graphFrame.py index dd10ac8622..4874f1259c 100644 --- a/gui/graphFrame.py +++ b/gui/graphFrame.py @@ -220,7 +220,9 @@ def draw(self, event=None): self.subplot.plot(x, y) legend.append(fit.name) except: - self.SetStatusText("Invalid values in '%s'" % fit.name) + msg = "Invalid values in '%s'" % fit.name + logger.error(msg) + self.SetStatusText(msg) self.canvas.draw() return diff --git a/gui/marketBrowser.py b/gui/marketBrowser.py index 0a4b9c25f1..d0e884303b 100644 --- a/gui/marketBrowser.py +++ b/gui/marketBrowser.py @@ -25,6 +25,8 @@ from gui.cachingImageList import CachingImageList from gui.contextMenu import ContextMenu from gui.bitmapLoader import BitmapLoader +from logbook import Logger +logger = Logger(__name__) ItemSelected, ITEM_SELECTED = wx.lib.newevent.NewEvent() @@ -179,6 +181,7 @@ def expandLookup(self, event): try: childId = self.AppendItem(root, childMktGrp.name, iconId, data=wx.TreeItemData(childMktGrp.ID)) except: + logger.debug("Error appending item.") continue if sMkt.marketGroupHasTypesCheck(childMktGrp) is False: self.AppendItem(childId, "dummy") diff --git a/gui/patternEditor.py b/gui/patternEditor.py index 9d11a5ab9f..d0e1cadd1e 100644 --- a/gui/patternEditor.py +++ b/gui/patternEditor.py @@ -23,6 +23,8 @@ from gui.utils.clipboard import toClipboard, fromClipboard from gui.builtinViews.entityEditor import EntityEditor, BaseValidator from service.damagePattern import DamagePattern, ImportError +from logbook import Logger +logger = Logger(__name__) class DmgPatternTextValidor(BaseValidator): @@ -45,6 +47,7 @@ def Validate(self, win): return True except ValueError as e: + logger.error(e) wx.MessageBox(u"{}".format(e), "Error") textCtrl.SetFocus() return False @@ -254,9 +257,12 @@ def importPatterns(self, event): sDP.importPatterns(text) self.stNotice.SetLabel("Patterns successfully imported from clipboard") except ImportError as e: + logger.error(e) self.stNotice.SetLabel(str(e)) except Exception: - self.stNotice.SetLabel("Could not import from clipboard: unknown errors") + msg = "Could not import from clipboard: unknown errors" + logger.warning(msg) + self.stNotice.SetLabel(msg) finally: self.entityEditor.refreshEntityList() else: diff --git a/gui/resistsEditor.py b/gui/resistsEditor.py index 84f7bf98bc..a72b98817e 100644 --- a/gui/resistsEditor.py +++ b/gui/resistsEditor.py @@ -22,6 +22,8 @@ from gui.bitmapLoader import BitmapLoader from gui.utils.clipboard import toClipboard, fromClipboard from gui.builtinViews.entityEditor import EntityEditor, BaseValidator +from logbook import Logger +logger = Logger(__name__) class TargetResistsTextValidor(BaseValidator): @@ -44,6 +46,7 @@ def Validate(self, win): return True except ValueError as e: + logger.error(e) wx.MessageBox(u"{}".format(e), "Error") textCtrl.SetFocus() return False @@ -227,10 +230,14 @@ def ValuesUpdated(self, event=None): except ValueError: editObj.SetForegroundColour(wx.RED) - self.stNotice.SetLabel("Incorrect Formatting (decimals only)") + msg = "Incorrect Formatting (decimals only)" + logger.warning(msg) + self.stNotice.SetLabel(msg) except AssertionError: editObj.SetForegroundColour(wx.RED) - self.stNotice.SetLabel("Incorrect Range (must be 0-100)") + msg = "Incorrect Range (must be 0-100)" + logger.warning(msg) + self.stNotice.SetLabel(msg) finally: # Refresh for color changes to take effect immediately self.Refresh() @@ -268,9 +275,12 @@ def importPatterns(self, event): sTR.importPatterns(text) self.stNotice.SetLabel("Patterns successfully imported from clipboard") except ImportError as e: + logger.error(e) self.stNotice.SetLabel(str(e)) except Exception: - self.stNotice.SetLabel("Could not import from clipboard: unknown errors") + msg = "Could not import from clipboard: unknown errors" + logger.warning(msg) + self.stNotice.SetLabel(msg) finally: self.entityEditor.refreshEntityList() else: diff --git a/gui/setEditor.py b/gui/setEditor.py index 411b114d3c..3f2aa0f4ff 100644 --- a/gui/setEditor.py +++ b/gui/setEditor.py @@ -47,6 +47,7 @@ def Validate(self, win): return True except ValueError as e: + logger.error(e) wx.MessageBox(u"{}".format(e), "Error") textCtrl.SetFocus() return False @@ -196,9 +197,10 @@ def importPatterns(self, event): self.stNotice.SetLabel("Patterns successfully imported from clipboard") self.showInput(False) except ImportError as e: + logger.error(e) self.stNotice.SetLabel(str(e)) except Exception as e: - logging.exception("Unhandled Exception") + logger.error(e) self.stNotice.SetLabel("Could not import from clipboard: unknown errors") finally: self.updateChoices() diff --git a/gui/utils/compat.py b/gui/utils/compat.py index e0d336b22d..6951d952bb 100644 --- a/gui/utils/compat.py +++ b/gui/utils/compat.py @@ -1,6 +1,9 @@ # Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. # Passes Python2.7's test suite and incorporates all the latest updates. +from logbook import Logger +logger = Logger(__name__) + try: from thread import get_ident as _get_ident except ImportError: @@ -9,6 +12,7 @@ try: from _abcoll import KeysView, ValuesView, ItemsView except ImportError: + logger.warning("Failed to import from _abcoll") pass diff --git a/gui/utils/exportHtml.py b/gui/utils/exportHtml.py index 59b54319d8..a1e7ea15e4 100644 --- a/gui/utils/exportHtml.py +++ b/gui/utils/exportHtml.py @@ -4,6 +4,8 @@ from service.settings import HTMLExportSettings from service.fit import Fit from service.market import Market +from logbook import Logger +logger = Logger(__name__) class exportHtml(): @@ -194,6 +196,7 @@ def generateFullHTML(self, sMkt, sFit, dnaUrl): HTMLgroup += '
  • ' + ship.name + ": " + \ fit[1] + '
  • \n' except: + logger.warning("Failed to export line") pass finally: if self.callback: @@ -216,6 +219,7 @@ def generateFullHTML(self, sMkt, sFit, dnaUrl): HTMLship += '
  • ' + fit[ 1] + '
  • \n' except: + logger.warning("Failed to export line") continue finally: if self.callback: @@ -268,6 +272,7 @@ def generateMinimalHTML(self, sMkt, sFit, dnaUrl): HTML += '' + ship.name + ': ' + \ fit[1] + '
    \n' except: + logger.error("Failed to export line") continue finally: if self.callback: diff --git a/pyfa.py b/pyfa.py index 5bd8061787..9d4ca12015 100755 --- a/pyfa.py +++ b/pyfa.py @@ -39,6 +39,7 @@ def _process_args(self, largs, rargs, values): try: OptionParser._process_args(self, largs, rargs, values) except (BadOptionError, AmbiguousOptionError) as e: + logger.error("Bad startup option passed.") largs.append(e.opt_str) diff --git a/scripts/dist.py b/scripts/dist.py index 3d6f7c3afe..50b4f326e0 100755 --- a/scripts/dist.py +++ b/scripts/dist.py @@ -1,257 +1,263 @@ -#!/usr/bin/env python -""" -Script for generating distributables based on platform skeletons. - -User supplies path for pyfa code base, root skeleton directory, and where the -builds go. The builds are automatically named depending on the pyfa config -values of `version` and `tag`. If it's a Stable release, the naming -convention is: - - pyfa-pyfaversion-expansion-expversion-platform - -If it is not Stable (tag=git), we determine if the pyfa code base includes -the git repo to use as an ID. If not, uses randomly generated 6-character ID. -The unstable naming convention: - - pyfa-YYYMMDD-id-platform - -dist.py can also build the Windows installer provided that it has a path to -Inno Setup (and, for generating on non-Windows platforms, that WINE is -installed). To build the EXE file, `win` must be included in the platforms to -be built. -""" - -#@todo: ensure build directory can be written to -# todo: default build and dist directories - -from optparse import OptionParser -import os.path -import shutil -import sys -import tarfile -import datetime -import random -import string -import zipfile -import errno -from subprocess import call - -class FileStub(): - def write(self, *args): - pass - - def flush(self, *args): - pass - -i = 0 -def loginfo(path, names): - # Print out a "progress" and return directories / files to ignore - global i - i += 1 - if i % 10 == 0: - sys.stdout.write(".") - sys.stdout.flush() - return () - -def copyanything(src, dst): - try: - shutil.copytree(src, dst, ignore=loginfo) - except: # python >2.5 - try: - shutil.copy(src, dst) - except: - raise - -def id_generator(size=6, chars=string.ascii_uppercase + string.digits): - return ''.join(random.choice(chars) for x in range(size)) - -def zipdir(path, zip): - for root, dirs, files in os.walk(path): - for file in files: - zip.write(os.path.join(root, file)) - -skels = ['win', 'src', 'mac', 'mac-deprecated'] -iscc = "C:\Program Files (x86)\Inno Setup 5\ISCC.exe" # inno script location via wine - -if __name__ == "__main__": - oldstd = sys.stdout - parser = OptionParser() - parser.add_option("-s", "--skeleton", dest="skeleton", help="Location of Pyfa-skel directory") - parser.add_option("-b", "--base", dest="base", help="Location of cleaned read-only base directory") - parser.add_option("-d", "--destination", dest="destination", help="Where to copy our distributable") - parser.add_option("-p", "--platforms", dest="platforms", help="Comma-separated list of platforms to build", default=','.join(skels)) - parser.add_option("-q", "--quiet", dest="silent", action="store_true") - parser.add_option("-w", "--winexe", dest="winexe", action="store_true", help="Build the Windows installer file (needs Inno Setup). Must include 'win' in platform options") - parser.add_option("-z", "--zip", dest="zip", action="store_true", help="zip archive instead of tar") - - options, args = parser.parse_args() - - if options.skeleton is None or options.base is None or options.destination is None: - print "Need --skeleton argument as well as --base and --destination argument" - parser.print_help() - sys.exit() - - if options.silent: - sys.stdout = FileStub() - - options.platforms = options.platforms.split(",") - - for skel in skels: - if skel not in options.platforms: - continue - - print "\n======== %s ========"%skel - - info = {} - config = {} - setup = {} - skeleton = os.path.expanduser(os.path.join(options.skeleton, skel)) - - execfile(os.path.join(options.base, "config.py"), config) - execfile(os.path.join(skeleton, "info.py"), info) - execfile(os.path.join(options.base, "setup.py"), setup) - - destination = os.path.expanduser(options.destination) - if not os.path.isdir(destination) or not os.access(destination, os.W_OK | os.X_OK): - print "Destination directory does not exist or is not writable: {}".format(destination) - sys.exit() - - dirName = info["arcname"] - - nowdt = datetime.datetime.now() - now = "%04d%02d%02d" % (nowdt.year, nowdt.month, nowdt.day) - - git = False - if config['tag'].lower() == "git": - try: # if there is a git repo associated with base, use master commit - with open(os.path.join(options.base, ".git", "refs", "heads", "master"), 'r') as f: - id = f.readline()[0:6] - git = True - except: # else, use custom ID - id = id_generator() - fileName = "pyfa-{}-{}-{}".format(now, id, info["os"]) - else: - fileName = "pyfa-{}-{}-{}-{}".format( - config['version'], - config['expansionName'].lower(), - config['expansionVersion'], - info["os"] - ) - - archiveName = "{}.{}".format(fileName, "zip" if options.zip else "tar.bz2") - tmpDir = os.path.join(os.getcwd(), dirName) # tmp directory where files are copied - tmpFile = os.path.join(os.getcwd(), archiveName) - - try: - print "Copying skeleton to ", tmpDir - shutil.copytree(skeleton, tmpDir, ignore=loginfo) - print - source = os.path.expanduser(options.base) - root = os.path.join(tmpDir, info["base"]) - - # it is easier to work from the source directory - oldcwd = os.getcwd() - os.chdir(source) - - if info["library"]: - print "Injecting files into", info["library"] - libraryFile = os.path.join(root, info["library"]) - - with zipfile.ZipFile(libraryFile, 'a') as library: - for dir in setup['packages']: - zipdir(dir, library) - library.write('pyfa.py', 'pyfa__main__.py') - library.write('config.py') - else: # platforms where we don't have a packaged library - print "Copying modules into", root - for dir in setup['packages']: - copyanything(dir, os.path.join(root, dir)) - - # add some additional files to root dir for these platforms - # (hopefully can figure out a way later for OS X to use the one in - # it's library) - if skel == 'mac': - setup['include_files'] += ['pyfa.py'] - if skel in ('src', 'mac-deprecated'): - setup['include_files'] += ['pyfa.py', 'config.py'] - - print - print "Copying included files:", - - for file in setup['include_files']: - if isinstance(file, basestring): - print file, - copyanything(file, os.path.join(root, file)) - - print - print "Creating images zipfile:", - os.chdir('imgs') - imagesFile = os.path.join(root, "imgs.zip") - - with zipfile.ZipFile(imagesFile, 'w') as images: - for dir in setup['icon_dirs']: - print dir, - zipdir(dir, images) - os.chdir(oldcwd) - - print - print "Creating archive" - if options.zip: - archive = zipfile.ZipFile(tmpFile, 'w', compression=zipfile.ZIP_DEFLATED) - zipdir(dirName, archive) - archive.close() - else: - archive = tarfile.open(tmpFile, "w:bz2") - archive.add(tmpDir, arcname=info["arcname"]) - archive.close() - - print "Moving archive to ", destination - shutil.move(tmpFile, destination) - - if "win" in skel and options.winexe: - print "Compiling EXE" - - if config['tag'].lower() == "git": - if git: # if git repo info available, use git commit - expansion = "git-%s"%(id) - else: # if there is no git repo, use timestamp - expansion = now - else: # if code is Stable, use expansion name - expansion = "%s %s"%(config['expansionName'], config['expansionVersion']), - - calllist = ["wine"] if 'win' not in sys.platform else [] - - call(calllist + [ - iscc, - "pyfa-setup.iss", - "/dMyAppVersion=%s"%(config['version']), - "/dMyAppExpansion=%s"%(expansion), - "/dMyAppDir=pyfa", - "/dMyOutputDir=%s"%destination, - "/dMyOutputFile=%s"%fileName]) #stdout=devnull, stderr=devnull - - print "EXE completed" - - except Exception as e: - print "Encountered an error: \n\t", e - raise - finally: - print "Deleting tmp files\n" - try: - shutil.rmtree("dist") # Inno dir - except: - pass - try: - shutil.rmtree(tmpDir) - except: - pass - try: - os.unlink(tmpFile) - except: - pass - - sys.stdout = oldstd - if os.path.isdir(destination): - print os.path.join(destination, os.path.split(tmpFile)[1]) - else: - print destination +#!/usr/bin/env python +""" +Script for generating distributables based on platform skeletons. + +User supplies path for pyfa code base, root skeleton directory, and where the +builds go. The builds are automatically named depending on the pyfa config +values of `version` and `tag`. If it's a Stable release, the naming +convention is: + + pyfa-pyfaversion-expansion-expversion-platform + +If it is not Stable (tag=git), we determine if the pyfa code base includes +the git repo to use as an ID. If not, uses randomly generated 6-character ID. +The unstable naming convention: + + pyfa-YYYMMDD-id-platform + +dist.py can also build the Windows installer provided that it has a path to +Inno Setup (and, for generating on non-Windows platforms, that WINE is +installed). To build the EXE file, `win` must be included in the platforms to +be built. +""" + +#@todo: ensure build directory can be written to +# todo: default build and dist directories + +from optparse import OptionParser +import os.path +import shutil +import sys +import tarfile +import datetime +import random +import string +import zipfile +import errno +from subprocess import call +from logbook import Logger +logger = Logger(__name__) + + +class FileStub(): + def write(self, *args): + pass + + def flush(self, *args): + pass + +i = 0 +def loginfo(path, names): + # Print out a "progress" and return directories / files to ignore + global i + i += 1 + if i % 10 == 0: + sys.stdout.write(".") + sys.stdout.flush() + return () + +def copyanything(src, dst): + try: + shutil.copytree(src, dst, ignore=loginfo) + except: # python >2.5 + try: + shutil.copy(src, dst) + except: + raise + +def id_generator(size=6, chars=string.ascii_uppercase + string.digits): + return ''.join(random.choice(chars) for x in range(size)) + +def zipdir(path, zip): + for root, dirs, files in os.walk(path): + for file in files: + zip.write(os.path.join(root, file)) + +skels = ['win', 'src', 'mac', 'mac-deprecated'] +iscc = "C:\Program Files (x86)\Inno Setup 5\ISCC.exe" # inno script location via wine + +if __name__ == "__main__": + oldstd = sys.stdout + parser = OptionParser() + parser.add_option("-s", "--skeleton", dest="skeleton", help="Location of Pyfa-skel directory") + parser.add_option("-b", "--base", dest="base", help="Location of cleaned read-only base directory") + parser.add_option("-d", "--destination", dest="destination", help="Where to copy our distributable") + parser.add_option("-p", "--platforms", dest="platforms", help="Comma-separated list of platforms to build", default=','.join(skels)) + parser.add_option("-q", "--quiet", dest="silent", action="store_true") + parser.add_option("-w", "--winexe", dest="winexe", action="store_true", help="Build the Windows installer file (needs Inno Setup). Must include 'win' in platform options") + parser.add_option("-z", "--zip", dest="zip", action="store_true", help="zip archive instead of tar") + + options, args = parser.parse_args() + + if options.skeleton is None or options.base is None or options.destination is None: + print "Need --skeleton argument as well as --base and --destination argument" + parser.print_help() + sys.exit() + + if options.silent: + sys.stdout = FileStub() + + options.platforms = options.platforms.split(",") + + for skel in skels: + if skel not in options.platforms: + continue + + print "\n======== %s ========"%skel + + info = {} + config = {} + setup = {} + skeleton = os.path.expanduser(os.path.join(options.skeleton, skel)) + + execfile(os.path.join(options.base, "config.py"), config) + execfile(os.path.join(skeleton, "info.py"), info) + execfile(os.path.join(options.base, "setup.py"), setup) + + destination = os.path.expanduser(options.destination) + if not os.path.isdir(destination) or not os.access(destination, os.W_OK | os.X_OK): + print "Destination directory does not exist or is not writable: {}".format(destination) + sys.exit() + + dirName = info["arcname"] + + nowdt = datetime.datetime.now() + now = "%04d%02d%02d" % (nowdt.year, nowdt.month, nowdt.day) + + git = False + if config['tag'].lower() == "git": + try: # if there is a git repo associated with base, use master commit + with open(os.path.join(options.base, ".git", "refs", "heads", "master"), 'r') as f: + id = f.readline()[0:6] + git = True + except: # else, use custom ID + id = id_generator() + fileName = "pyfa-{}-{}-{}".format(now, id, info["os"]) + else: + fileName = "pyfa-{}-{}-{}-{}".format( + config['version'], + config['expansionName'].lower(), + config['expansionVersion'], + info["os"] + ) + + archiveName = "{}.{}".format(fileName, "zip" if options.zip else "tar.bz2") + tmpDir = os.path.join(os.getcwd(), dirName) # tmp directory where files are copied + tmpFile = os.path.join(os.getcwd(), archiveName) + + try: + print "Copying skeleton to ", tmpDir + shutil.copytree(skeleton, tmpDir, ignore=loginfo) + print + source = os.path.expanduser(options.base) + root = os.path.join(tmpDir, info["base"]) + + # it is easier to work from the source directory + oldcwd = os.getcwd() + os.chdir(source) + + if info["library"]: + print "Injecting files into", info["library"] + libraryFile = os.path.join(root, info["library"]) + + with zipfile.ZipFile(libraryFile, 'a') as library: + for dir in setup['packages']: + zipdir(dir, library) + library.write('pyfa.py', 'pyfa__main__.py') + library.write('config.py') + else: # platforms where we don't have a packaged library + print "Copying modules into", root + for dir in setup['packages']: + copyanything(dir, os.path.join(root, dir)) + + # add some additional files to root dir for these platforms + # (hopefully can figure out a way later for OS X to use the one in + # it's library) + if skel == 'mac': + setup['include_files'] += ['pyfa.py'] + if skel in ('src', 'mac-deprecated'): + setup['include_files'] += ['pyfa.py', 'config.py'] + + print + print "Copying included files:", + + for file in setup['include_files']: + if isinstance(file, basestring): + print file, + copyanything(file, os.path.join(root, file)) + + print + print "Creating images zipfile:", + os.chdir('imgs') + imagesFile = os.path.join(root, "imgs.zip") + + with zipfile.ZipFile(imagesFile, 'w') as images: + for dir in setup['icon_dirs']: + print dir, + zipdir(dir, images) + os.chdir(oldcwd) + + print + print "Creating archive" + if options.zip: + archive = zipfile.ZipFile(tmpFile, 'w', compression=zipfile.ZIP_DEFLATED) + zipdir(dirName, archive) + archive.close() + else: + archive = tarfile.open(tmpFile, "w:bz2") + archive.add(tmpDir, arcname=info["arcname"]) + archive.close() + + print "Moving archive to ", destination + shutil.move(tmpFile, destination) + + if "win" in skel and options.winexe: + print "Compiling EXE" + + if config['tag'].lower() == "git": + if git: # if git repo info available, use git commit + expansion = "git-%s"%(id) + else: # if there is no git repo, use timestamp + expansion = now + else: # if code is Stable, use expansion name + expansion = "%s %s"%(config['expansionName'], config['expansionVersion']), + + calllist = ["wine"] if 'win' not in sys.platform else [] + + call(calllist + [ + iscc, + "pyfa-setup.iss", + "/dMyAppVersion=%s"%(config['version']), + "/dMyAppExpansion=%s"%(expansion), + "/dMyAppDir=pyfa", + "/dMyOutputDir=%s"%destination, + "/dMyOutputFile=%s"%fileName]) #stdout=devnull, stderr=devnull + + print "EXE completed" + + except Exception as e: + print "Encountered an error: \n\t", e + raise + finally: + print "Deleting tmp files\n" + try: + shutil.rmtree("dist") # Inno dir + except: + logger.warning("Failed to remove dist") + pass + try: + shutil.rmtree(tmpDir) + except: + logger.warning("Failed to remove: %s" % tmpDir) + pass + try: + os.unlink(tmpFile) + except: + logger.warning("Faileld to remove: %s" % tmpFile) + pass + + sys.stdout = oldstd + if os.path.isdir(destination): + print os.path.join(destination, os.path.split(tmpFile)[1]) + else: + print destination diff --git a/scripts/itemDiff.py b/scripts/itemDiff.py index c25312bf80..e5441ae918 100755 --- a/scripts/itemDiff.py +++ b/scripts/itemDiff.py @@ -30,6 +30,8 @@ import re import sqlite3 import sys +from logbook import Logger +logger = Logger(__name__) script_dir = os.path.dirname(__file__) default_old = os.path.join(script_dir, "..", "eve.db") @@ -408,6 +410,7 @@ def getattrname(attr): for row in new_cursor: new_meta[row[0]] = row[1] except: + logger.warning("Failed to get db metadata") pass # Print jobs print("Comparing databases:\n{0} -> {1}\n".format(old_meta.get("client_build"), new_meta.get("client_build"))) diff --git a/service/port.py b/service/port.py index 440a3b13ab..1806b99188 100644 --- a/service/port.py +++ b/service/port.py @@ -326,6 +326,7 @@ def importCrest(str_): except ValueError: f.ship = Citadel(sMkt.getItem(fit['ship']['id'])) except: + logger.warning("Caught exception in importCrest") return None items = fit['items'] @@ -351,6 +352,7 @@ def importCrest(str_): m = Module(item) # When item can't be added to any slot (unknown item or just charge), ignore it except ValueError: + logger.debug("Item can't be added to any slot (unknown item or just charge)") continue # Add subsystems before modules to make sure T3 cruisers have subsystems installed if item.category.name == "Subsystem": @@ -363,6 +365,7 @@ def importCrest(str_): moduleList.append(m) except: + logger.warning("Could not process module.") continue # Recalc to get slot numbers correct for T3 cruisers @@ -391,6 +394,7 @@ def importDna(string): string = string[string.index(str(id_)):] break except: + logger.warning("Exception caught in importDna") pass string = string[:string.index("::") + 2] info = string.split(":") @@ -435,6 +439,7 @@ def logtransform(s_): try: m = Module(item) except: + logger.warning("Exception caught in importDna") continue # Add subsystems before modules to make sure T3 cruisers have subsystems installed if item.category.name == "Subsystem": @@ -483,6 +488,7 @@ def importEft(eftString): fit.ship = Citadel(ship) fit.name = fitName except: + logger.warning("Exception caught in importEft") return # maintain map of drones and their quantities @@ -523,6 +529,7 @@ def importEft(eftString): item = sMkt.getItem(modName, eager="group.category") except: # if no data can be found (old names) + logger.warning("no data can be found (old names)") continue if item.category.name == "Drone": @@ -675,6 +682,7 @@ def importEftCfg(shipname, contents, callback=None): try: droneItem = sMkt.getItem(droneName, eager="group.category") except: + logger.warning("Cannot get item.") continue if droneItem.category.name == "Drone": # Add drone to the fitting @@ -696,6 +704,7 @@ def importEftCfg(shipname, contents, callback=None): try: implantItem = sMkt.getItem(entityData, eager="group.category") except: + logger.warning("Cannot get item.") continue if implantItem.category.name != "Implant": continue @@ -711,6 +720,7 @@ def importEftCfg(shipname, contents, callback=None): try: boosterItem = sMkt.getItem(entityData, eager="group.category") except: + logger.warning("Cannot get item.") continue # All boosters have implant category if boosterItem.category.name != "Implant": @@ -731,6 +741,7 @@ def importEftCfg(shipname, contents, callback=None): try: item = sMkt.getItem(cargoName) except: + logger.warning("Cannot get item.") continue # Add Cargo to the fitting c = Cargo(item) @@ -744,6 +755,7 @@ def importEftCfg(shipname, contents, callback=None): try: modItem = sMkt.getItem(modName) except: + logger.warning("Cannot get item.") continue # Create module @@ -765,6 +777,7 @@ def importEftCfg(shipname, contents, callback=None): if chargeItem.category.name == "Charge": m.charge = chargeItem except: + logger.warning("Cannot get item.") pass # Append module to fit moduleList.append(m) @@ -783,6 +796,7 @@ def importEftCfg(shipname, contents, callback=None): wx.CallAfter(callback, None) # Skip fit silently if we get an exception except Exception: + logger.error("Caught exception on fit.") pass return fits @@ -807,6 +821,7 @@ def importXml(text, callback=None, encoding="utf-8"): except ValueError: f.ship = Citadel(sMkt.getItem(shipType)) except: + logger.warning("Caught exception on importXml") continue hardwares = fitting.getElementsByTagName("hardware") moduleList = [] @@ -816,6 +831,7 @@ def importXml(text, callback=None, encoding="utf-8"): try: item = sMkt.getItem(moduleName, eager="group.category") except: + logger.warning("Caught exception on importXml") continue if item: if item.category.name == "Drone": @@ -838,6 +854,7 @@ def importXml(text, callback=None, encoding="utf-8"): m = Module(item) # When item can't be added to any slot (unknown item or just charge), ignore it except ValueError: + logger.warning("item can't be added to any slot (unknown item or just charge), ignore it") continue # Add subsystems before modules to make sure T3 cruisers have subsystems installed if item.category.name == "Subsystem": @@ -851,6 +868,7 @@ def importXml(text, callback=None, encoding="utf-8"): moduleList.append(m) except KeyboardInterrupt: + logger.warning("Keyboard Interrupt") continue # Recalc to get slot numbers correct for T3 cruisers diff --git a/service/price.py b/service/price.py index e3d39d7347..a49b914aa0 100644 --- a/service/price.py +++ b/service/price.py @@ -23,6 +23,8 @@ from eos import db from service.network import Network, TimeoutError +from logbook import Logger +logger = Logger(__name__) VALIDITY = 24 * 60 * 60 # Price validity period, 24 hours REREQUEST = 4 * 60 * 60 # Re-request delay for failed fetches, 4 hours @@ -99,6 +101,7 @@ def fetchPrices(cls, prices): # If getting or processing data returned any errors except TimeoutError: # Timeout error deserves special treatment + logger.warning("Price fetch timout") for typeID in priceMap.keys(): priceobj = priceMap[typeID] priceobj.time = time.time() + TIMEOUT @@ -106,6 +109,7 @@ def fetchPrices(cls, prices): del priceMap[typeID] except: # all other errors will pass and continue onward to the REREQUEST delay + logger.warning("Caught exception in fetchPrices") pass # if we get to this point, then we've got an error. Set to REREQUEST delay diff --git a/service/pycrest/eve.py b/service/pycrest/eve.py index afabaec5e5..5fe13fa6b1 100644 --- a/service/pycrest/eve.py +++ b/service/pycrest/eve.py @@ -67,6 +67,7 @@ def get(self, key): with open(self._getpath(key), 'rb') as f: return pickle.loads(zlib.decompress(f.read())) except IOError as ex: + logger.debug("IO error opening zip file. (May not exist yet.") if ex.errno == 2: # file does not exist (yet) return None else: @@ -78,6 +79,7 @@ def invalidate(self, key): try: os.unlink(self._getpath(key)) except OSError as ex: + logger.debug("Caught exception in invalidate") if ex.errno == 2: # does not exist pass else: diff --git a/service/server.py b/service/server.py index 4046133d1f..2d8b387162 100644 --- a/service/server.py +++ b/service/server.py @@ -97,6 +97,7 @@ def get_request(self): sock.settimeout(None) return (sock, addr) except socket.timeout: + logger.warning("Server timed out waiting for connection") pass def stop(self): @@ -115,6 +116,7 @@ def serve(self, callback): try: self.handle_request() except TypeError: + logger.debug("Caught exception in serve") pass self.server_close() diff --git a/service/update.py b/service/update.py index 05f05efd7f..237eafd0d6 100644 --- a/service/update.py +++ b/service/update.py @@ -27,6 +27,8 @@ import config from service.network import Network from service.settings import UpdateSettings +from logbook import Logger +logger = Logger(__name__) class CheckUpdateThread(threading.Thread): @@ -80,6 +82,7 @@ def run(self): wx.CallAfter(self.callback, release) # Singularity -> Singularity break except: + logger.warning("Caught exception in run") pass def versiontuple(self, v): From 0992889b0cd001e68b8e696ca9784c29d1d40d99 Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Mon, 30 Jan 2017 12:47:29 -0800 Subject: [PATCH 10/27] Fix missed logging switch --- gui/builtinViews/fittingView.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/builtinViews/fittingView.py b/gui/builtinViews/fittingView.py index 4dd0c32501..8dea11470a 100644 --- a/gui/builtinViews/fittingView.py +++ b/gui/builtinViews/fittingView.py @@ -30,14 +30,14 @@ from gui.bitmapLoader import BitmapLoader import gui.builtinViews.emptyView from gui.utils.exportHtml import exportHtml -from logging import getLogger, Formatter from service.fit import Fit from service.market import Market import gui.globalEvents as GE -logger = getLogger(__name__) +from logbook import Logger +logger = Logger(__name__) # Tab spawning handler From 53e74ef2f2590693d1a4a592573f792828c5cbab Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Mon, 30 Jan 2017 13:30:07 -0800 Subject: [PATCH 11/27] Add more logging to blackholed exceptions --- service/market.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/service/market.py b/service/market.py index 675f2e4a6e..0fb6f35cf4 100644 --- a/service/market.py +++ b/service/market.py @@ -70,11 +70,13 @@ def processRequests(self): wx.CallAfter(callback, (id_, set_)) except: + logger.debug("Callback failed.") pass finally: try: queue.task_done() except: + logger.debug("Queue task done failed.") pass @@ -813,6 +815,7 @@ def cb(): try: callback(requests) except Exception: + logger.debug("Callback failed.") pass eos.db.commit() @@ -829,6 +832,7 @@ def cb(): try: callback(item) except: + logger.debug("Callback failed.") pass self.priceWorkerThread.setToWait(item.ID, cb) From b41f794ebe878106b9426a2f8f18ab4866e6a0a0 Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Mon, 30 Jan 2017 14:33:20 -0800 Subject: [PATCH 12/27] Fix logging messages that pass in variables. Add some basic logging for startup workflow. --- eos/db/migration.py | 2 +- eos/db/saveddata/databaseRepair.py | 6 +++--- eos/effects/adaptivearmorhardener.py | 2 +- eos/saveddata/booster.py | 4 ++-- eos/saveddata/cargo.py | 2 +- eos/saveddata/drone.py | 4 ++-- eos/saveddata/fighter.py | 4 ++-- eos/saveddata/fighterAbility.py | 2 +- eos/saveddata/fit.py | 16 ++++++++-------- eos/saveddata/implant.py | 4 ++-- eos/saveddata/module.py | 4 ++-- eos/saveddata/override.py | 4 ++-- gui/characterEditor.py | 2 +- gui/contextMenu.py | 2 +- gui/mainFrame.py | 3 ++- gui/marketBrowser.py | 4 ++++ gui/propertyEditor.py | 2 +- gui/shipBrowser.py | 3 +++ scripts/dist.py | 4 ++-- service/character.py | 2 +- service/crest.py | 6 +++--- service/market.py | 4 +++- service/port.py | 18 +++++++++--------- service/prefetch.py | 2 ++ service/pycrest/eve.py | 10 +++++----- service/server.py | 2 +- 26 files changed, 65 insertions(+), 53 deletions(-) diff --git a/eos/db/migration.py b/eos/db/migration.py index 061c892104..3ceab9ced8 100644 --- a/eos/db/migration.py +++ b/eos/db/migration.py @@ -37,7 +37,7 @@ def update(saveddata_engine): for version in xrange(dbVersion, appVersion): func = migrations.updates[version + 1] if func: - logger.info("Applying database update: %d", version + 1) + logger.info("Applying database update: {0}", version + 1) func(saveddata_engine) # when all is said and done, set version to current diff --git a/eos/db/saveddata/databaseRepair.py b/eos/db/saveddata/databaseRepair.py index ffb5adbd65..488c7d564f 100644 --- a/eos/db/saveddata/databaseRepair.py +++ b/eos/db/saveddata/databaseRepair.py @@ -42,7 +42,7 @@ def OrphanedCharacterSkills(saveddata_engine): if row and row['num']: delete = saveddata_engine.execute("DELETE FROM characterSkills WHERE characterID NOT IN (SELECT ID from characters)") - logger.error("Database corruption found. Cleaning up %d records.", delete.rowcount) + logger.error("Database corruption found. Cleaning up {0} records.", delete.rowcount) except sqlalchemy.exc.DatabaseError: logger.error("Failed to connect to database.") @@ -72,7 +72,7 @@ def OrphanedFitDamagePatterns(saveddata_engine): update = saveddata_engine.execute("UPDATE 'fits' SET 'damagePatternID' = ? " "WHERE damagePatternID NOT IN (SELECT ID FROM damagePatterns) OR damagePatternID IS NULL", uniform_damage_pattern_id) - logger.error("Database corruption found. Cleaning up %d records.", update.rowcount) + logger.error("Database corruption found. Cleaning up {0} records.", update.rowcount) except sqlalchemy.exc.DatabaseError: logger.error("Failed to connect to database.") @@ -98,6 +98,6 @@ def OrphanedFitCharacterIDs(saveddata_engine): update = saveddata_engine.execute("UPDATE 'fits' SET 'characterID' = ? " "WHERE characterID not in (select ID from characters) OR characterID IS NULL", all5_id) - logger.error("Database corruption found. Cleaning up %d records.", update.rowcount) + logger.error("Database corruption found. Cleaning up {0} records.", update.rowcount) except sqlalchemy.exc.DatabaseError: logger.error("Failed to connect to database.") diff --git a/eos/effects/adaptivearmorhardener.py b/eos/effects/adaptivearmorhardener.py index def5d046d6..3bf5c3e244 100644 --- a/eos/effects/adaptivearmorhardener.py +++ b/eos/effects/adaptivearmorhardener.py @@ -97,7 +97,7 @@ def handler(fit, module, context): cycleList.append(list(RAHResistance)) if loopStart < 0: - logger.error("Reactive Armor Hardener failed to find equilibrium. Damage profile after armor: %f/%f/%f/%f", + logger.error("Reactive Armor Hardener failed to find equilibrium. Damage profile after armor: {0}/{1}/{2}/{3}", baseDamageTaken[0], baseDamageTaken[1], baseDamageTaken[2], baseDamageTaken[3]) # Average the profiles in the RAH loop, or the last 20 if it didn't find a loop. diff --git a/eos/saveddata/booster.py b/eos/saveddata/booster.py index 6721a2ac55..492ec1ba40 100644 --- a/eos/saveddata/booster.py +++ b/eos/saveddata/booster.py @@ -46,11 +46,11 @@ def init(self): if self.itemID: self.__item = eos.db.getItem(self.itemID) if self.__item is None: - logger.error("Item (id: %d) does not exist", self.itemID) + logger.error("Item (id: {0}) does not exist", self.itemID) return if self.isInvalid: - logger.error("Item (id: %d) is not a Booser", self.itemID) + logger.error("Item (id: {0}) is not a Booser", self.itemID) return self.build() diff --git a/eos/saveddata/cargo.py b/eos/saveddata/cargo.py index 4b30e8208c..05a0cc926c 100644 --- a/eos/saveddata/cargo.py +++ b/eos/saveddata/cargo.py @@ -45,7 +45,7 @@ def init(self): if self.itemID: self.__item = eos.db.getItem(self.itemID) if self.__item is None: - logger.error("Item (id: %d) does not exist", self.itemID) + logger.error("Item (id: {0}) does not exist", self.itemID) return self.__itemModifiedAttributes = ModifiedAttributeDict() diff --git a/eos/saveddata/drone.py b/eos/saveddata/drone.py index 9ed492ff66..b807e4390f 100644 --- a/eos/saveddata/drone.py +++ b/eos/saveddata/drone.py @@ -52,11 +52,11 @@ def init(self): if self.itemID: self.__item = eos.db.getItem(self.itemID) if self.__item is None: - logger.error("Item (id: %d) does not exist", self.itemID) + logger.error("Item (id: {0}) does not exist", self.itemID) return if self.isInvalid: - logger.error("Item (id: %d) is not a Drone", self.itemID) + logger.error("Item (id: {0}) is not a Drone", self.itemID) return self.build() diff --git a/eos/saveddata/fighter.py b/eos/saveddata/fighter.py index 774c8c75db..c7fac10ca7 100644 --- a/eos/saveddata/fighter.py +++ b/eos/saveddata/fighter.py @@ -59,11 +59,11 @@ def init(self): if self.itemID: self.__item = eos.db.getItem(self.itemID) if self.__item is None: - logger.error("Item (id: %d) does not exist", self.itemID) + logger.error("Item (id: {0}) does not exist", self.itemID) return if self.isInvalid: - logger.error("Item (id: %d) is not a Fighter", self.itemID) + logger.error("Item (id: {0}) is not a Fighter", self.itemID) return self.build() diff --git a/eos/saveddata/fighterAbility.py b/eos/saveddata/fighterAbility.py index e01f2b6b87..b4c022e612 100644 --- a/eos/saveddata/fighterAbility.py +++ b/eos/saveddata/fighterAbility.py @@ -58,7 +58,7 @@ def init(self): if self.effectID: self.__effect = next((x for x in self.fighter.item.effects.itervalues() if x.ID == self.effectID), None) if self.__effect is None: - logger.error("Effect (id: %d) does not exist", self.effectID) + logger.error("Effect (id: {0}) does not exist", self.effectID) return self.build() diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py index b1b7b8ffce..df48f9e977 100644 --- a/eos/saveddata/fit.py +++ b/eos/saveddata/fit.py @@ -91,7 +91,7 @@ def init(self): if self.shipID: item = eos.db.getItem(self.shipID) if item is None: - logger.error("Item (id: %d) does not exist", self.shipID) + logger.error("Item (id: {0}) does not exist", self.shipID) return try: @@ -104,7 +104,7 @@ def init(self): # change all instances in source). Remove this at some point self.extraAttributes = self.__ship.itemModifiedAttributes except ValueError: - logger.error("Item (id: %d) is not a Ship", self.shipID) + logger.error("Item (id: {0}) is not a Ship", self.shipID) return if self.modeID and self.__ship: @@ -453,7 +453,7 @@ def addCommandBonus(self, warfareBuffID, value, module, effect, runTime="normal" self.commandBonuses[warfareBuffID] = (runTime, value, module, effect) def __runCommandBoosts(self, runTime="normal"): - logger.debug("Applying gang boosts for %r", self) + logger.debug("Applying gang boosts for {0}", self) for warfareBuffID in self.commandBonuses.keys(): # Unpack all data required to run effect properly effect_runTime, value, thing, effect = self.commandBonuses[warfareBuffID] @@ -636,20 +636,20 @@ def __runCommandBoosts(self, runTime="normal"): def calculateModifiedAttributes(self, targetFit=None, withBoosters=False, dirtyStorage=None): timer = Timer(u'Fit: {}, {}'.format(self.ID, self.name), logger) - logger.debug("Starting fit calculation on: %r, withBoosters: %s", self, withBoosters) + logger.debug("Starting fit calculation on: {0}, withBoosters: {1}", self, withBoosters) shadow = False if targetFit and not withBoosters: - logger.debug("Applying projections to target: %r", targetFit) + logger.debug("Applying projections to target: {0}", targetFit) projectionInfo = self.getProjectionInfo(targetFit.ID) - logger.debug("ProjectionInfo: %s", projectionInfo) + logger.debug("ProjectionInfo: {0}", projectionInfo) if self == targetFit: copied = self # original fit shadow = True # Don't inspect this, we genuinely want to reassign self # noinspection PyMethodFirstArgAssignment self = copy.deepcopy(self) - logger.debug("Handling self projection - making shadow copy of fit. %r => %r", copied, self) + logger.debug("Handling self projection - making shadow copy of fit. {0} => {1}", copied, self) # we delete the fit because when we copy a fit, flush() is # called to properly handle projection updates. However, we do # not want to save this fit to the database, so simply remove it @@ -684,7 +684,7 @@ def calculateModifiedAttributes(self, targetFit=None, withBoosters=False, dirtyS # projection have modifying stuff applied, such as gang boosts and other # local modules that may help if self.__calculated and not projected and not withBoosters: - logger.debug("Fit has already been calculated and is not projected, returning: %r", self) + logger.debug("Fit has already been calculated and is not projected, returning: {0}", self) return for runTime in ("early", "normal", "late"): diff --git a/eos/saveddata/implant.py b/eos/saveddata/implant.py index e2065f2404..e3305f7820 100644 --- a/eos/saveddata/implant.py +++ b/eos/saveddata/implant.py @@ -45,11 +45,11 @@ def init(self): if self.itemID: self.__item = eos.db.getItem(self.itemID) if self.__item is None: - logger.error("Item (id: %d) does not exist", self.itemID) + logger.error("Item (id: {0}) does not exist", self.itemID) return if self.isInvalid: - logger.error("Item (id: %d) is not an Implant", self.itemID) + logger.error("Item (id: {0}) is not an Implant", self.itemID) return self.build() diff --git a/eos/saveddata/module.py b/eos/saveddata/module.py index ee496799a2..a7bc884caf 100644 --- a/eos/saveddata/module.py +++ b/eos/saveddata/module.py @@ -93,11 +93,11 @@ def init(self): if self.itemID: self.__item = eos.db.getItem(self.itemID) if self.__item is None: - logger.error("Item (id: %d) does not exist", self.itemID) + logger.error("Item (id: {0}) does not exist", self.itemID) return if self.isInvalid: - logger.error("Item (id: %d) is not a Module", self.itemID) + logger.error("Item (id: {0}) is not a Module", self.itemID) return if self.chargeID: diff --git a/eos/saveddata/override.py b/eos/saveddata/override.py index 7b7d5cd561..57254474dc 100644 --- a/eos/saveddata/override.py +++ b/eos/saveddata/override.py @@ -42,13 +42,13 @@ def init(self): if self.attrID: self.__attr = eos.db.getAttributeInfo(self.attrID) if self.__attr is None: - logger.error("Attribute (id: %d) does not exist", self.attrID) + logger.error("Attribute (id: {0}) does not exist", self.attrID) return if self.itemID: self.__item = eos.db.getItem(self.itemID) if self.__item is None: - logger.error("Item (id: %d) does not exist", self.itemID) + logger.error("Item (id: {0}) does not exist", self.itemID) return @property diff --git a/gui/characterEditor.py b/gui/characterEditor.py index ebb62a4193..87ac85acd0 100644 --- a/gui/characterEditor.py +++ b/gui/characterEditor.py @@ -660,7 +660,7 @@ def fetchSkills(self, event): sChar.apiFetch(activeChar.ID, charName) self.stStatus.SetLabel("Successfully fetched %s\'s skills from EVE API." % charName) except Exception, e: - logger.error("Unable to retrieve %s\'s skills. Error message:\n%s" % (charName, e)) + logger.error("Unable to retrieve {0}\'s skills. Error message:\n{1}", charName, e) self.stStatus.SetLabel("Unable to retrieve %s\'s skills. Error message:\n%s" % (charName, e)) diff --git a/gui/contextMenu.py b/gui/contextMenu.py index 4e53c982d4..56297280dd 100644 --- a/gui/contextMenu.py +++ b/gui/contextMenu.py @@ -119,7 +119,7 @@ def getMenu(cls, selection, *fullContexts): debug_end = len(cls._ids) if (debug_end - debug_start): - logger.debug("%d new IDs created for this menu" % (debug_end - debug_start)) + logger.debug("{0} new IDs created for this menu", (debug_end - debug_start)) return rootMenu if empty is False else None diff --git a/gui/mainFrame.py b/gui/mainFrame.py index 725e5055f6..5b5aa4ea51 100644 --- a/gui/mainFrame.py +++ b/gui/mainFrame.py @@ -139,6 +139,7 @@ def getInstance(cls): return cls.__instance if cls.__instance is not None else MainFrame() def __init__(self, title): + logger.debug("Initialize MainFrame") self.title = title wx.Frame.__init__(self, None, wx.ID_ANY, self.title) @@ -706,7 +707,7 @@ def importFromClipboard(self, event): try: fits = Port().importFitFromBuffer(clipboard, self.getActiveFit()) except: - logger.error("Attempt to import failed:\n%s", clipboard) + logger.error("Attempt to import failed:\n{0}", clipboard) else: self._openAfterImport(fits) diff --git a/gui/marketBrowser.py b/gui/marketBrowser.py index d0e884303b..c9567e08db 100644 --- a/gui/marketBrowser.py +++ b/gui/marketBrowser.py @@ -54,6 +54,7 @@ def reset(self): class MarketBrowser(wx.Panel): def __init__(self, parent): + logger.debug("Initialize marketBrowser") wx.Panel.__init__(self, parent) vbox = wx.BoxSizer(wx.VERTICAL) self.SetSizer(vbox) @@ -131,6 +132,7 @@ def __init__(self, parent, **kwargs): class MarketTree(wx.TreeCtrl): def __init__(self, parent, marketBrowser): + logger.debug("Initialize marketTree") wx.TreeCtrl.__init__(self, parent, style=wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT) self.root = self.AddRoot("root") @@ -224,6 +226,7 @@ class ItemView(d.Display): "attr:cpu,,,True"] def __init__(self, parent, marketBrowser): + logger.debug("Initialize ItemView") d.Display.__init__(self, parent) marketBrowser.Bind(wx.EVT_TREE_SEL_CHANGED, self.selectionMade) @@ -251,6 +254,7 @@ def __init__(self, parent, marketBrowser): self.metaMap = self.makeReverseMetaMap() # Fill up recently used modules set + logger.debug("Fill up recently used modules set") for itemID in self.sMkt.serviceMarketRecentlyUsedModules["pyfaMarketRecentlyUsedModules"]: self.recentlyUsedModules.add(self.sMkt.getItem(itemID)) diff --git a/gui/propertyEditor.py b/gui/propertyEditor.py index bcc06816da..b19e6ce5fe 100644 --- a/gui/propertyEditor.py +++ b/gui/propertyEditor.py @@ -267,7 +267,7 @@ def OnPropGridChange(self, event): self.itemView.updateItems() - logger.debug('%s changed to "%s"' % (p.GetName(), p.GetValueAsString())) + logger.debug('{0} changed to "{1}"', p.GetName(), p.GetValueAsString()) def OnPropGridSelect(self, event): pass diff --git a/gui/shipBrowser.py b/gui/shipBrowser.py index a9e12a110a..bca6de3326 100644 --- a/gui/shipBrowser.py +++ b/gui/shipBrowser.py @@ -19,6 +19,8 @@ from gui.PFListPane import PFListPane from gui.contextMenu import ContextMenu from gui.bitmapLoader import BitmapLoader +from logbook import Logger +logger = Logger(__name__) FitRenamed, EVT_FIT_RENAMED = wx.lib.newevent.NewEvent() FitSelected, EVT_FIT_SELECTED = wx.lib.newevent.NewEvent() @@ -680,6 +682,7 @@ def stage1(self, event): self.lpane.Freeze() self.lpane.RemoveAllChildren() + logger.debug("Populate ship category list.") if len(self.categoryList) == 0: # set cache of category list self.categoryList = list(sMkt.getShipRoot()) diff --git a/scripts/dist.py b/scripts/dist.py index 50b4f326e0..6d3cef4c6f 100755 --- a/scripts/dist.py +++ b/scripts/dist.py @@ -248,12 +248,12 @@ def zipdir(path, zip): try: shutil.rmtree(tmpDir) except: - logger.warning("Failed to remove: %s" % tmpDir) + logger.warning("Failed to remove: {0}", tmpDir) pass try: os.unlink(tmpFile) except: - logger.warning("Faileld to remove: %s" % tmpFile) + logger.warning("Faileld to remove: {0}", tmpFile) pass sys.stdout = oldstd diff --git a/service/character.py b/service/character.py index fc869f04ac..540f455761 100644 --- a/service/character.py +++ b/service/character.py @@ -81,7 +81,7 @@ def run(self): "level": int(skill.getAttribute("level")), }) else: - logger.error("Attempted to import unknown skill %s (ID: %s) (Level: %s)", + logger.error("Attempted to import unknown skill {0} (ID: {1}) (Level: {2})", skill.getAttribute("name"), skill.getAttribute("typeID"), skill.getAttribute("level"), diff --git a/service/crest.py b/service/crest.py index c624ae20dd..8e23615b09 100644 --- a/service/crest.py +++ b/service/crest.py @@ -180,7 +180,7 @@ def handleLogin(self, message): logger.warn("OAUTH state mismatch") return - logger.debug("Handling CREST login with: %s" % message) + logger.debug("Handling CREST login with: {0}", message) if 'access_token' in message: # implicit eve = copy.deepcopy(self.eve) @@ -194,7 +194,7 @@ def handleLogin(self, message): eve() info = eve.whoami() - logger.debug("Got character info: %s" % info) + logger.debug("Got character info: {0}", info) self.implicitCharacter = CrestChar(info['CharacterID'], info['CharacterName']) self.implicitCharacter.eve = eve @@ -207,7 +207,7 @@ def handleLogin(self, message): eve() info = eve.whoami() - logger.debug("Got character info: %s" % info) + logger.debug("Got character info: {0}", info) # check if we have character already. If so, simply replace refresh_token char = self.getCrestCharacter(int(info['CharacterID'])) diff --git a/service/market.py b/service/market.py index 0fb6f35cf4..f83d4d92b2 100644 --- a/service/market.py +++ b/service/market.py @@ -82,9 +82,11 @@ def processRequests(self): class PriceWorkerThread(threading.Thread): def run(self): + logger.debug("Run start") self.queue = Queue.Queue() self.wait = {} self.processUpdates() + logger.debug("Run end") def processUpdates(self): queue = self.queue @@ -425,7 +427,7 @@ def getItem(self, identity, *args, **kwargs): else: raise TypeError("Need Item object, integer, float or string as argument") except: - logger.error("Could not get item: %s", identity) + logger.error("Could not get item: {0}", identity) raise return item diff --git a/service/port.py b/service/port.py index 1806b99188..6d573992bd 100644 --- a/service/port.py +++ b/service/port.py @@ -121,21 +121,21 @@ def importFitFromFiles(self, paths, callback=None): savebom = bom if codec_found is None: - logger.info("Unicode BOM not found in file %s.", path) + logger.info("Unicode BOM not found in file {0}.", path) attempt_codecs = (defcodepage, "utf-8", "utf-16", "cp1252") for page in attempt_codecs: try: - logger.info("Attempting to decode file %s using %s page.", path, page) + logger.info("Attempting to decode file {0} using {1} page.", path, page) srcString = unicode(srcString, page) codec_found = page - logger.info("File %s decoded using %s page.", path, page) + logger.info("File {0} decoded using {1} page.", path, page) except UnicodeDecodeError: - logger.info("Error unicode decoding %s from page %s, trying next codec", path, page) + logger.info("Error unicode decoding {0} from page {1}, trying next codec", path, page) else: break else: - logger.info("Unicode BOM detected in %s, using %s page.", path, codec_found) + logger.info("Unicode BOM detected in {0}, using {1} page.", path, codec_found) srcString = unicode(srcString[len(savebom):], codec_found) else: @@ -154,7 +154,7 @@ def importFitFromFiles(self, paths, callback=None): except xml.parsers.expat.ExpatError: return False, "Malformed XML in %s" % path except Exception: - logger.exception("Unknown exception processing: %s", path) + logger.exception("Unknown exception processing: {0}", path) return False, "Unknown Error while processing %s" % path IDs = [] @@ -412,7 +412,7 @@ def logtransform(s_): return s_[:10] + "..." return s_ - logger.exception("Couldn't import ship data %r", [logtransform(s) for s in info]) + logger.exception("Couldn't import ship data {0}", [logtransform(s) for s in info]) return None moduleList = [] @@ -556,7 +556,7 @@ def importEft(eftString): elif "boosterness" in item.attributes: fit.boosters.append(Booster(item)) else: - logger.error("Failed to import implant: %s", line) + logger.error("Failed to import implant: {0}", line) # elif item.category.name == "Subsystem": # try: # subsystem = Module(item) @@ -1175,7 +1175,7 @@ def run(self): success, result = sPort.importFitFromFiles(self.paths, self.callback) if not success: # there was an error during processing - logger.error("Error while processing file import: %s", result) + logger.error("Error while processing file import: {0}", result) wx.CallAfter(self.callback, -2, result) else: # Send done signal to GUI wx.CallAfter(self.callback, -1, result) diff --git a/service/prefetch.py b/service/prefetch.py index 0e3995c44a..aa89117928 100644 --- a/service/prefetch.py +++ b/service/prefetch.py @@ -58,10 +58,12 @@ def run(self): if config.saveDB and os.path.isfile(config.saveDB): # If database exists, run migration after init'd database + logger.debug("Run database migration.") db.saveddata_meta.create_all() migration.update(db.saveddata_engine) # Import default database values # Import values that must exist otherwise Pyfa breaks + logger.debug("Import Required Database Values.") DefaultDatabaseValues.importRequiredDefaults() logger.debug("Starting database validation.") diff --git a/service/pycrest/eve.py b/service/pycrest/eve.py index 5fe13fa6b1..76e882957a 100644 --- a/service/pycrest/eve.py +++ b/service/pycrest/eve.py @@ -127,7 +127,7 @@ def __init__(self, additional_headers=None, user_agent=None, cache_dir=None, cac self.cache = DictCache() def get(self, resource, params=None): - logger.debug('Getting resource %s', resource) + logger.debug('Getting resource {0}', resource) if params is None: params = {} @@ -147,15 +147,15 @@ def get(self, resource, params=None): key = (resource, frozenset(self._session.headers.items()), frozenset(prms.items())) cached = self.cache.get(key) if cached and cached['cached_until'] > time.time(): - logger.debug('Cache hit for resource %s (params=%s)', resource, prms) + logger.debug('Cache hit for resource {0} (params={1})', resource, prms) return cached elif cached: - logger.debug('Cache stale for resource %s (params=%s)', resource, prms) + logger.debug('Cache stale for resource {0} (params={1})', resource, prms) self.cache.invalidate(key) else: - logger.debug('Cache miss for resource %s (params=%s', resource, prms) + logger.debug('Cache miss for resource {0} (params={1}', resource, prms) - logger.debug('Getting resource %s (params=%s)', resource, prms) + logger.debug('Getting resource {0} (params={1})', resource, prms) res = self._session.get(resource, params=prms) if res.status_code != 200: raise APIException("Got unexpected status code from server: %i" % res.status_code) diff --git a/service/server.py b/service/server.py index 2d8b387162..02355afa85 100644 --- a/service/server.py +++ b/service/server.py @@ -83,7 +83,7 @@ def server_bind(self): # Allow listening for x seconds sec = self.settings.get('timeout') - logger.debug("Running server for %d seconds", sec) + logger.debug("Running server for {0} seconds", sec) self.socket.settimeout(0.5) self.max_tries = sec / self.socket.gettimeout() From 4be0b30aadba322597411b26a5403792c6a0ef32 Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Mon, 30 Jan 2017 15:08:04 -0800 Subject: [PATCH 13/27] More logging! --- eos/saveddata/fit.py | 4 ++-- gui/mainMenuBar.py | 7 +++++++ service/fit.py | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py index df48f9e977..d0860d23e6 100644 --- a/eos/saveddata/fit.py +++ b/eos/saveddata/fit.py @@ -636,13 +636,13 @@ def __runCommandBoosts(self, runTime="normal"): def calculateModifiedAttributes(self, targetFit=None, withBoosters=False, dirtyStorage=None): timer = Timer(u'Fit: {}, {}'.format(self.ID, self.name), logger) - logger.debug("Starting fit calculation on: {0}, withBoosters: {1}", self, withBoosters) + logger.info("Starting fit calculation on: {0}, withBoosters: {1}", self, withBoosters) shadow = False if targetFit and not withBoosters: logger.debug("Applying projections to target: {0}", targetFit) projectionInfo = self.getProjectionInfo(targetFit.ID) - logger.debug("ProjectionInfo: {0}", projectionInfo) + logger.info("ProjectionInfo: {0}", projectionInfo) if self == targetFit: copied = self # original fit shadow = True diff --git a/gui/mainMenuBar.py b/gui/mainMenuBar.py index b543998c2e..1bcea30740 100644 --- a/gui/mainMenuBar.py +++ b/gui/mainMenuBar.py @@ -26,6 +26,9 @@ import gui.globalEvents as GE from gui.bitmapLoader import BitmapLoader +from logbook import Logger +logger = Logger(__name__) + if 'wxMac' not in wx.PlatformInfo or ('wxMac' in wx.PlatformInfo and wx.VERSION >= (3, 0)): from service.crest import Crest from service.crest import CrestModes @@ -33,6 +36,7 @@ class MainMenuBar(wx.MenuBar): def __init__(self): + logger.debug("Initialize MainMenuBar") self.characterEditorId = wx.NewId() self.damagePatternEditorId = wx.NewId() self.targetResistsEditorId = wx.NewId() @@ -163,6 +167,7 @@ def __init__(self): self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged) def fitChanged(self, event): + logger.debug("fitChanged - Start") enable = event.fitID is not None self.Enable(wx.ID_SAVEAS, enable) self.Enable(wx.ID_COPY, enable) @@ -178,3 +183,5 @@ def fitChanged(self, event): self.Enable(self.revertCharId, char.isDirty) event.Skip() + + logger.debug("fitChanged - End") diff --git a/service/fit.py b/service/fit.py index 319edbe0ae..10b966a9b4 100644 --- a/service/fit.py +++ b/service/fit.py @@ -992,7 +992,7 @@ def refreshFit(self, fitID): self.recalc(fit) def recalc(self, fit, withBoosters=True): - logger.debug("=" * 10 + "recalc" + "=" * 10) + logger.info("=" * 10 + "recalc" + "=" * 10) if fit.factorReload is not self.serviceFittingOptions["useGlobalForceReload"]: fit.factorReload = self.serviceFittingOptions["useGlobalForceReload"] fit.clear() From b650140cca1d009772a70e1f8679272fc2fb1534 Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Mon, 30 Jan 2017 18:02:40 -0800 Subject: [PATCH 14/27] Catch scenario where the log file is locked by another process --- pyfa.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pyfa.py b/pyfa.py index 9d4ca12015..54642ba0bd 100755 --- a/pyfa.py +++ b/pyfa.py @@ -188,9 +188,15 @@ def flush(self): with logging_setup.threadbound(): # Output all stdout (print) messages as warnings - sys.stdout = LoggerWriter(logger.warning) + try: + sys.stdout = LoggerWriter(logger.warning) + except ValueError: + logger.critical("Cannot access log file. Continuing without writing stdout to log.") # Output all stderr (stacktrace) messages as critical - sys.stderr = LoggerWriter(logger.critical) + try: + sys.stderr = LoggerWriter(logger.critical) + except ValueError: + logger.critical("Cannot access log file. Continuing without writing stderr to log.") logger.info("Starting Pyfa") From 3d5ec4e464783f7b092d23c199a5886d706d07a1 Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Mon, 30 Jan 2017 18:35:23 -0800 Subject: [PATCH 15/27] Add logging for when effect handlers are generated --- eos/gamedata.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/eos/gamedata.py b/eos/gamedata.py index e4a4afa1c1..9508d28b99 100644 --- a/eos/gamedata.py +++ b/eos/gamedata.py @@ -30,6 +30,9 @@ except ImportError: from utils.compat import OrderedDict +from logbook import Logger +logger = Logger(__name__) + class Effect(EqBase): """ @@ -64,6 +67,8 @@ def handler(self): if not self.__generated: self.__generateHandler() + logger.debug("Generating effect: {0} ({1}) [runTime: {2}]", self.name, self.effectID, self.runTime) + return self.__handler @property @@ -138,7 +143,7 @@ def type(self): @property def isImplemented(self): """ - Wether this effect is implemented in code or not, + Whether this effect is implemented in code or not, unimplemented effects simply do nothing at all when run """ return self.handler != effectDummy From ef695e5776e9837d1116e5fd2c1cbc251388fb8b Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Mon, 30 Jan 2017 19:12:53 -0800 Subject: [PATCH 16/27] Better handling for when files are locked or other issues writing to the file. Now falls back to console output only if we can't access the log file. --- gui/mainMenuBar.py | 2 -- pyfa.py | 75 ++++++++++++++++++++++++++++++---------------- 2 files changed, 49 insertions(+), 28 deletions(-) diff --git a/gui/mainMenuBar.py b/gui/mainMenuBar.py index 1bcea30740..7e8e4dd635 100644 --- a/gui/mainMenuBar.py +++ b/gui/mainMenuBar.py @@ -183,5 +183,3 @@ def fitChanged(self, event): self.Enable(self.revertCharId, char.isDirty) event.Skip() - - logger.debug("fitChanged - End") diff --git a/pyfa.py b/pyfa.py index 54642ba0bd..abab9314cf 100755 --- a/pyfa.py +++ b/pyfa.py @@ -19,6 +19,7 @@ # ============================================================================== import sys +import os import re import config @@ -150,6 +151,53 @@ def flush(self): ''' if options.debug: + savePath_filename = "Pyfa_debug.log" + else: + savePath_filename = "Pyfa.log" + + savePath_Destination = config.getSavePath(savePath_filename) + + try: + if options.debug and savePath_Destination: + logging_mode = "Debug" + logging_setup = NestedSetup([ + # make sure we never bubble up to the stderr handler + # if we run out of setup handling + NullHandler(), + StreamHandler( + sys.stdout, + bubble=False + ), + RotatingFileHandler( + savePath_Destination, + level=0, + max_size=1048576, + backup_count=5, + bubble=True + ) + ]) + elif savePath_Destination: + logging_mode = "User" + logging_setup = NestedSetup([ + # make sure we never bubble up to the stderr handler + # if we run out of setup handling + NullHandler(), + FingersCrossedHandler( + RotatingFileHandler( + savePath_Destination, + level=0, + max_size=1048576, + backup_count=5, + bubble=False + ), + # action_level=Warning, + # buffer_size=1000, + # pull_information=True, + # reset=False, + ) + ]) + except: + logging_mode = "Console Only" logging_setup = NestedSetup([ # make sure we never bubble up to the stderr handler # if we run out of setup handling @@ -157,32 +205,6 @@ def flush(self): StreamHandler( sys.stdout, bubble=False - ), - RotatingFileHandler( - config.getSavePath("Pyfa_debug.log"), - level=0, - max_size=1048576, - backup_count=5, - bubble=True - ) - ]) - else: - logging_setup = NestedSetup([ - # make sure we never bubble up to the stderr handler - # if we run out of setup handling - NullHandler(), - FingersCrossedHandler( - RotatingFileHandler( - config.getSavePath("Pyfa.log"), - level=0, - max_size=1048576, - backup_count=5, - bubble=False - ), - # action_level=Warning, - # buffer_size=1000, - # pull_information=True, - # reset=False, ) ]) @@ -199,6 +221,7 @@ def flush(self): logger.critical("Cannot access log file. Continuing without writing stderr to log.") logger.info("Starting Pyfa") + logger.info("Running in logging mode: {0}", logging_mode) # Import everything logger.debug("Import wx") From 1e99d4f0a68b755faa36a4f9aad406f73d823ad5 Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Mon, 30 Jan 2017 19:55:33 -0800 Subject: [PATCH 17/27] Update text --- gui/mainMenuBar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/mainMenuBar.py b/gui/mainMenuBar.py index 7e8e4dd635..1da041cd8c 100644 --- a/gui/mainMenuBar.py +++ b/gui/mainMenuBar.py @@ -167,7 +167,7 @@ def __init__(self): self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged) def fitChanged(self, event): - logger.debug("fitChanged - Start") + logger.debug("fitChanged triggered") enable = event.fitID is not None self.Enable(wx.ID_SAVEAS, enable) self.Enable(wx.ID_COPY, enable) From 8016e45c082c393db9c92bd6f81df9601ab88693 Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Mon, 30 Jan 2017 20:00:49 -0800 Subject: [PATCH 18/27] remove unneeded check --- pyfa.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyfa.py b/pyfa.py index abab9314cf..e39c48cb1e 100755 --- a/pyfa.py +++ b/pyfa.py @@ -158,7 +158,7 @@ def flush(self): savePath_Destination = config.getSavePath(savePath_filename) try: - if options.debug and savePath_Destination: + if options.debug: logging_mode = "Debug" logging_setup = NestedSetup([ # make sure we never bubble up to the stderr handler @@ -176,7 +176,7 @@ def flush(self): bubble=True ) ]) - elif savePath_Destination: + else: logging_mode = "User" logging_setup = NestedSetup([ # make sure we never bubble up to the stderr handler From 960e96d5999c56b6518feab2f4a3522a7788f792 Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Thu, 2 Feb 2017 22:17:03 -0800 Subject: [PATCH 19/27] Don't redirect if frozen --- pyfa.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/pyfa.py b/pyfa.py index e39c48cb1e..60e36b08a2 100755 --- a/pyfa.py +++ b/pyfa.py @@ -209,16 +209,18 @@ def flush(self): ]) with logging_setup.threadbound(): - # Output all stdout (print) messages as warnings - try: - sys.stdout = LoggerWriter(logger.warning) - except ValueError: - logger.critical("Cannot access log file. Continuing without writing stdout to log.") - # Output all stderr (stacktrace) messages as critical - try: - sys.stderr = LoggerWriter(logger.critical) - except ValueError: - logger.critical("Cannot access log file. Continuing without writing stderr to log.") + # Don't redirect if frozen + if not hasattr(sys, 'frozen'): + # Output all stdout (print) messages as warnings + try: + sys.stdout = LoggerWriter(logger.warning) + except ValueError: + logger.critical("Cannot access log file. Continuing without writing stdout to log.") + # Output all stderr (stacktrace) messages as critical + try: + sys.stderr = LoggerWriter(logger.critical) + except ValueError: + logger.critical("Cannot access log file. Continuing without writing stderr to log.") logger.info("Starting Pyfa") logger.info("Running in logging mode: {0}", logging_mode) From d92395d438e84a2d509e68ea683740c430710688 Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Fri, 3 Feb 2017 19:26:43 -0800 Subject: [PATCH 20/27] Use TimedRotatingFileHandler --- pyfa.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/pyfa.py b/pyfa.py index 60e36b08a2..89d389b059 100755 --- a/pyfa.py +++ b/pyfa.py @@ -25,7 +25,7 @@ from optparse import OptionParser, BadOptionError, AmbiguousOptionError -from logbook import RotatingFileHandler, Logger, StreamHandler, NestedSetup, FingersCrossedHandler, NullHandler +from logbook import TimedRotatingFileHandler, Logger, StreamHandler, NestedSetup, FingersCrossedHandler, NullHandler logger = Logger(__name__) @@ -168,13 +168,13 @@ def flush(self): sys.stdout, bubble=False ), - RotatingFileHandler( - savePath_Destination, - level=0, - max_size=1048576, - backup_count=5, - bubble=True - ) + TimedRotatingFileHandler( + savePath_Destination, + level=0, + backup_count=5, + bubble=False, + date_format='%Y-%m-%d', + ), ]) else: logging_mode = "User" @@ -183,12 +183,12 @@ def flush(self): # if we run out of setup handling NullHandler(), FingersCrossedHandler( - RotatingFileHandler( + TimedRotatingFileHandler( savePath_Destination, level=0, - max_size=1048576, backup_count=5, - bubble=False + bubble=False, + date_format='%Y-%m-%d', ), # action_level=Warning, # buffer_size=1000, From 6e8831a36b70b63fc23bd80424a383524d66e9dd Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Fri, 3 Feb 2017 19:31:17 -0800 Subject: [PATCH 21/27] Lower backup count --- pyfa.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyfa.py b/pyfa.py index 89d389b059..d41e494f3f 100755 --- a/pyfa.py +++ b/pyfa.py @@ -171,7 +171,7 @@ def flush(self): TimedRotatingFileHandler( savePath_Destination, level=0, - backup_count=5, + backup_count=3, bubble=False, date_format='%Y-%m-%d', ), @@ -186,7 +186,7 @@ def flush(self): TimedRotatingFileHandler( savePath_Destination, level=0, - backup_count=5, + backup_count=3, bubble=False, date_format='%Y-%m-%d', ), From 3615e39a29fd05f593e324cd87e637bd88028af7 Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Fri, 3 Feb 2017 21:08:37 -0800 Subject: [PATCH 22/27] Bubble up in debug mode --- pyfa.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyfa.py b/pyfa.py index d41e494f3f..b1786360bf 100755 --- a/pyfa.py +++ b/pyfa.py @@ -172,7 +172,7 @@ def flush(self): savePath_Destination, level=0, backup_count=3, - bubble=False, + bubble=True, date_format='%Y-%m-%d', ), ]) From da663e6da885113341bfeb16fc94e2634410c384 Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Fri, 3 Feb 2017 21:33:51 -0800 Subject: [PATCH 23/27] Rename references from logger to logging to avoid shadowing --- config.py | 6 +-- eos/db/__init__.py | 6 +-- eos/db/migration.py | 4 +- eos/db/saveddata/databaseRepair.py | 30 +++++++-------- eos/effectHandlerHelpers.py | 2 +- eos/effects/adaptivearmorhardener.py | 20 +++++----- eos/gamedata.py | 4 +- eos/graph/fitDps.py | 4 +- eos/saveddata/booster.py | 6 +-- eos/saveddata/cargo.py | 4 +- eos/saveddata/character.py | 2 +- eos/saveddata/citadel.py | 2 +- eos/saveddata/drone.py | 6 +-- eos/saveddata/fighter.py | 6 +-- eos/saveddata/fighterAbility.py | 4 +- eos/saveddata/fit.py | 20 +++++----- eos/saveddata/implant.py | 6 +-- eos/saveddata/module.py | 6 +-- eos/saveddata/override.py | 6 +-- eos/saveddata/ship.py | 2 +- gui/bitmapLoader.py | 4 +- gui/builtinViews/fittingView.py | 14 +++---- gui/characterEditor.py | 12 +++--- gui/characterSelection.py | 4 +- gui/chromeTabs.py | 4 +- gui/contextMenu.py | 4 +- gui/crestFittings.py | 12 +++--- gui/graphFrame.py | 6 +-- gui/mainFrame.py | 6 +-- gui/mainMenuBar.py | 6 +-- gui/marketBrowser.py | 12 +++--- gui/patternEditor.py | 8 ++-- gui/propertyEditor.py | 4 +- gui/resistsEditor.py | 12 +++--- gui/setEditor.py | 8 ++-- gui/shipBrowser.py | 4 +- gui/utils/compat.py | 4 +- gui/utils/exportHtml.py | 8 ++-- pyfa.py | 26 ++++++------- scripts/dist.py | 8 ++-- scripts/itemDiff.py | 4 +- service/character.py | 14 +++---- service/crest.py | 10 ++--- service/fit.py | 4 +- service/market.py | 16 ++++---- service/port.py | 56 ++++++++++++++-------------- service/prefetch.py | 10 ++--- service/price.py | 6 +-- service/pycrest/eve.py | 16 ++++---- service/server.py | 12 +++--- service/update.py | 4 +- 51 files changed, 232 insertions(+), 232 deletions(-) diff --git a/config.py b/config.py index 9235da57d1..f2ea4af11d 100644 --- a/config.py +++ b/config.py @@ -2,13 +2,13 @@ import sys from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) # Load variable overrides specific to distribution type try: import configforced except ImportError: - logger.warning("Failed to import: configforced") + logging.warning("Failed to import: configforced") configforced = None # Turns on debug mode @@ -48,7 +48,7 @@ def defPaths(customSavePath): global gameDB global saveInRoot - logger.debug("Configuring Pyfa") + logging.debug("Configuring Pyfa") # The main pyfa directory which contains run.py # Python 2.X uses ANSI by default, so we need to convert the character encoding diff --git a/eos/db/__init__.py b/eos/db/__init__.py index c53bab9826..dd8cce3fc1 100644 --- a/eos/db/__init__.py +++ b/eos/db/__init__.py @@ -25,8 +25,8 @@ from sqlalchemy import pool from logbook import Logger -logger = Logger(__name__) -logger.debug("Initializing") +logging = Logger(__name__) +logging.debug("Initializing") import migration from eos import config @@ -53,7 +53,7 @@ class ReadOnlyException(Exception): "SELECT `field_value` FROM `metadata` WHERE `field_name` LIKE 'client_build'" ).fetchone()[0] except: - logger.warning("Missing gamedata version.") + logging.warning("Missing gamedata version.") config.gamedata_version = None saveddata_connectionstring = config.saveddata_connectionstring diff --git a/eos/db/migration.py b/eos/db/migration.py index 3ceab9ced8..7b611c5030 100644 --- a/eos/db/migration.py +++ b/eos/db/migration.py @@ -1,5 +1,5 @@ from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) import shutil import time @@ -37,7 +37,7 @@ def update(saveddata_engine): for version in xrange(dbVersion, appVersion): func = migrations.updates[version + 1] if func: - logger.info("Applying database update: {0}", version + 1) + logging.info("Applying database update: {0}", version + 1) func(saveddata_engine) # when all is said and done, set version to current diff --git a/eos/db/saveddata/databaseRepair.py b/eos/db/saveddata/databaseRepair.py index 488c7d564f..5aaf1974ad 100644 --- a/eos/db/saveddata/databaseRepair.py +++ b/eos/db/saveddata/databaseRepair.py @@ -19,7 +19,7 @@ import sqlalchemy from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) class DatabaseCleanup: @@ -29,23 +29,23 @@ def __init__(self): @staticmethod def OrphanedCharacterSkills(saveddata_engine): # Finds and fixes database corruption issues. - logger.debug("Start databsae validation and cleanup.") + logging.debug("Start databsae validation and cleanup.") # Find orphaned character skills. # This solves an issue where the character doesn't exist, but skills for that character do. # See issue #917 try: - logger.debug("Running database cleanup for character skills.") + logging.debug("Running database cleanup for character skills.") results = saveddata_engine.execute("SELECT COUNT(*) AS num FROM characterSkills " "WHERE characterID NOT IN (SELECT ID from characters)") row = results.first() if row and row['num']: delete = saveddata_engine.execute("DELETE FROM characterSkills WHERE characterID NOT IN (SELECT ID from characters)") - logger.error("Database corruption found. Cleaning up {0} records.", delete.rowcount) + logging.error("Database corruption found. Cleaning up {0} records.", delete.rowcount) except sqlalchemy.exc.DatabaseError: - logger.error("Failed to connect to database.") + logging.error("Failed to connect to database.") @staticmethod def OrphanedFitDamagePatterns(saveddata_engine): @@ -53,7 +53,7 @@ def OrphanedFitDamagePatterns(saveddata_engine): # This solves an issue where the damage pattern doesn't exist, but fits reference the pattern. # See issue #777 try: - logger.debug("Running database cleanup for orphaned damage patterns attached to fits.") + logging.debug("Running database cleanup for orphaned damage patterns attached to fits.") results = saveddata_engine.execute("SELECT COUNT(*) AS num FROM fits WHERE damagePatternID NOT IN (SELECT ID FROM damagePatterns) OR damagePatternID IS NULL") row = results.first() @@ -64,23 +64,23 @@ def OrphanedFitDamagePatterns(saveddata_engine): rows = query.fetchall() if len(rows) == 0: - logger.error("Missing uniform damage pattern.") + logging.error("Missing uniform damage pattern.") elif len(rows) > 1: - logger.error("More than one uniform damage pattern found.") + logging.error("More than one uniform damage pattern found.") else: uniform_damage_pattern_id = rows[0]['ID'] update = saveddata_engine.execute("UPDATE 'fits' SET 'damagePatternID' = ? " "WHERE damagePatternID NOT IN (SELECT ID FROM damagePatterns) OR damagePatternID IS NULL", uniform_damage_pattern_id) - logger.error("Database corruption found. Cleaning up {0} records.", update.rowcount) + logging.error("Database corruption found. Cleaning up {0} records.", update.rowcount) except sqlalchemy.exc.DatabaseError: - logger.error("Failed to connect to database.") + logging.error("Failed to connect to database.") @staticmethod def OrphanedFitCharacterIDs(saveddata_engine): # Find orphaned character IDs. This solves an issue where the character doesn't exist, but fits reference the pattern. try: - logger.debug("Running database cleanup for orphaned characters attached to fits.") + logging.debug("Running database cleanup for orphaned characters attached to fits.") results = saveddata_engine.execute("SELECT COUNT(*) AS num FROM fits WHERE characterID NOT IN (SELECT ID FROM characters) OR characterID IS NULL") row = results.first() @@ -90,14 +90,14 @@ def OrphanedFitCharacterIDs(saveddata_engine): rows = query.fetchall() if len(rows) == 0: - logger.error("Missing 'All 5' character.") + logging.error("Missing 'All 5' character.") elif len(rows) > 1: - logger.error("More than one 'All 5' character found.") + logging.error("More than one 'All 5' character found.") else: all5_id = rows[0]['ID'] update = saveddata_engine.execute("UPDATE 'fits' SET 'characterID' = ? " "WHERE characterID not in (select ID from characters) OR characterID IS NULL", all5_id) - logger.error("Database corruption found. Cleaning up {0} records.", update.rowcount) + logging.error("Database corruption found. Cleaning up {0} records.", update.rowcount) except sqlalchemy.exc.DatabaseError: - logger.error("Failed to connect to database.") + logging.error("Failed to connect to database.") diff --git a/eos/effectHandlerHelpers.py b/eos/effectHandlerHelpers.py index 544546d97b..c7e9458648 100644 --- a/eos/effectHandlerHelpers.py +++ b/eos/effectHandlerHelpers.py @@ -19,7 +19,7 @@ # from sqlalchemy.orm.attributes import flag_modified from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) import eos.db diff --git a/eos/effects/adaptivearmorhardener.py b/eos/effects/adaptivearmorhardener.py index 3bf5c3e244..a9e27c5def 100644 --- a/eos/effects/adaptivearmorhardener.py +++ b/eos/effects/adaptivearmorhardener.py @@ -3,7 +3,7 @@ # Used by: # Module: Reactive Armor Hardener from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) runTime = "late" type = "active" @@ -14,8 +14,8 @@ def handler(fit, module, context): # Skip if there is no damage pattern. Example: projected ships or fleet boosters if damagePattern: - # logger.debug("Damage Pattern: %f/%f/%f/%f", damagePattern.emAmount, damagePattern.thermalAmount, damagePattern.kineticAmount, damagePattern.explosiveAmount) - # logger.debug("Original Armor Resists: %f/%f/%f/%f", fit.ship.getModifiedItemAttr('armorEmDamageResonance'), fit.ship.getModifiedItemAttr('armorThermalDamageResonance'), fit.ship.getModifiedItemAttr('armorKineticDamageResonance'), fit.ship.getModifiedItemAttr('armorExplosiveDamageResonance')) + # logging.debug("Damage Pattern: %f/%f/%f/%f", damagePattern.emAmount, damagePattern.thermalAmount, damagePattern.kineticAmount, damagePattern.explosiveAmount) + # logging.debug("Original Armor Resists: %f/%f/%f/%f", fit.ship.getModifiedItemAttr('armorEmDamageResonance'), fit.ship.getModifiedItemAttr('armorThermalDamageResonance'), fit.ship.getModifiedItemAttr('armorKineticDamageResonance'), fit.ship.getModifiedItemAttr('armorExplosiveDamageResonance')) # Populate a tuple with the damage profile modified by current armor resists. baseDamageTaken = ( @@ -24,7 +24,7 @@ def handler(fit, module, context): damagePattern.kineticAmount * fit.ship.getModifiedItemAttr('armorKineticDamageResonance'), damagePattern.explosiveAmount * fit.ship.getModifiedItemAttr('armorExplosiveDamageResonance'), ) - # logger.debug("Damage Adjusted for Armor Resists: %f/%f/%f/%f", baseDamageTaken[0], baseDamageTaken[1], baseDamageTaken[2], baseDamageTaken[3]) + # logging.debug("Damage Adjusted for Armor Resists: %f/%f/%f/%f", baseDamageTaken[0], baseDamageTaken[1], baseDamageTaken[2], baseDamageTaken[3]) resistanceShiftAmount = module.getModifiedItemAttr( 'resistanceShiftAmount') / 100 # The attribute is in percent and we want a fraction @@ -40,7 +40,7 @@ def handler(fit, module, context): cycleList = [] loopStart = -20 for num in range(50): - # logger.debug("Starting cycle %d.", num) + # logging.debug("Starting cycle %d.", num) # The strange order is to emulate the ingame sorting when different types have taken the same amount of damage. # This doesn't take into account stacking penalties. In a few cases fitting a Damage Control causes an inaccurate result. damagePattern_tuples = [ @@ -49,7 +49,7 @@ def handler(fit, module, context): (2, baseDamageTaken[2] * RAHResistance[2], RAHResistance[2]), (1, baseDamageTaken[1] * RAHResistance[1], RAHResistance[1]), ] - # logger.debug("Damage taken this cycle: %f/%f/%f/%f", damagePattern_tuples[0][1], damagePattern_tuples[3][1], damagePattern_tuples[2][1], damagePattern_tuples[1][1]) + # logging.debug("Damage taken this cycle: %f/%f/%f/%f", damagePattern_tuples[0][1], damagePattern_tuples[3][1], damagePattern_tuples[2][1], damagePattern_tuples[1][1]) # Sort the tuple to drop the highest damage value to the bottom sortedDamagePattern_tuples = sorted(damagePattern_tuples, key=lambda damagePattern: damagePattern[1]) @@ -79,7 +79,7 @@ def handler(fit, module, context): RAHResistance[sortedDamagePattern_tuples[1][0]] = sortedDamagePattern_tuples[1][2] + change1 RAHResistance[sortedDamagePattern_tuples[2][0]] = sortedDamagePattern_tuples[2][2] + change2 RAHResistance[sortedDamagePattern_tuples[3][0]] = sortedDamagePattern_tuples[3][2] + change3 - # logger.debug("Resistances shifted to %f/%f/%f/%f", RAHResistance[0], RAHResistance[1], RAHResistance[2], RAHResistance[3]) + # logging.debug("Resistances shifted to %f/%f/%f/%f", RAHResistance[0], RAHResistance[1], RAHResistance[2], RAHResistance[3]) # See if the current RAH profile has been encountered before, indicating a loop. for i, val in enumerate(cycleList): @@ -89,7 +89,7 @@ def handler(fit, module, context): abs(RAHResistance[2] - val[2]) <= tolerance and \ abs(RAHResistance[3] - val[3]) <= tolerance: loopStart = i - # logger.debug("Loop found: %d-%d", loopStart, num) + # logging.debug("Loop found: %d-%d", loopStart, num) break if loopStart >= 0: break @@ -97,7 +97,7 @@ def handler(fit, module, context): cycleList.append(list(RAHResistance)) if loopStart < 0: - logger.error("Reactive Armor Hardener failed to find equilibrium. Damage profile after armor: {0}/{1}/{2}/{3}", + logging.error("Reactive Armor Hardener failed to find equilibrium. Damage profile after armor: {0}/{1}/{2}/{3}", baseDamageTaken[0], baseDamageTaken[1], baseDamageTaken[2], baseDamageTaken[3]) # Average the profiles in the RAH loop, or the last 20 if it didn't find a loop. @@ -112,7 +112,7 @@ def handler(fit, module, context): average[i] = round(average[i] / numCycles, 3) # Set the new resistances - # logger.debug("Setting new resist profile: %f/%f/%f/%f", average[0], average[1], average[2],average[3]) + # logging.debug("Setting new resist profile: %f/%f/%f/%f", average[0], average[1], average[2],average[3]) for i, attr in enumerate(( 'armorEmDamageResonance', 'armorThermalDamageResonance', 'armorKineticDamageResonance', 'armorExplosiveDamageResonance')): diff --git a/eos/gamedata.py b/eos/gamedata.py index 9508d28b99..55ebe1f827 100644 --- a/eos/gamedata.py +++ b/eos/gamedata.py @@ -31,7 +31,7 @@ from utils.compat import OrderedDict from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) class Effect(EqBase): @@ -67,7 +67,7 @@ def handler(self): if not self.__generated: self.__generateHandler() - logger.debug("Generating effect: {0} ({1}) [runTime: {2}]", self.name, self.effectID, self.runTime) + logging.debug("Generating effect: {0} ({1}) [runTime: {2}]", self.name, self.effectID, self.runTime) return self.__handler diff --git a/eos/graph/fitDps.py b/eos/graph/fitDps.py index 7f58ea9f11..3dc75a4780 100644 --- a/eos/graph/fitDps.py +++ b/eos/graph/fitDps.py @@ -23,7 +23,7 @@ from eos.types import Hardpoint, State from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) class FitDpsGraph(Graph): @@ -69,7 +69,7 @@ def calcDps(self, data): val *= 1 + (bonus - 1) * exp(- i ** 2 / 7.1289) data[attr] = val except: - logger.warning("Caught exception in calcDPS.") + logging.warning("Caught exception in calcDPS.") pass for mod in fit.modules: diff --git a/eos/saveddata/booster.py b/eos/saveddata/booster.py index 492ec1ba40..e169534dfe 100644 --- a/eos/saveddata/booster.py +++ b/eos/saveddata/booster.py @@ -18,7 +18,7 @@ # =============================================================================== from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) from sqlalchemy.orm import reconstructor, validates @@ -46,11 +46,11 @@ def init(self): if self.itemID: self.__item = eos.db.getItem(self.itemID) if self.__item is None: - logger.error("Item (id: {0}) does not exist", self.itemID) + logging.error("Item (id: {0}) does not exist", self.itemID) return if self.isInvalid: - logger.error("Item (id: {0}) is not a Booser", self.itemID) + logging.error("Item (id: {0}) is not a Booser", self.itemID) return self.build() diff --git a/eos/saveddata/cargo.py b/eos/saveddata/cargo.py index 05a0cc926c..4467d7894b 100644 --- a/eos/saveddata/cargo.py +++ b/eos/saveddata/cargo.py @@ -18,7 +18,7 @@ # =============================================================================== from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) from sqlalchemy.orm import validates, reconstructor @@ -45,7 +45,7 @@ def init(self): if self.itemID: self.__item = eos.db.getItem(self.itemID) if self.__item is None: - logger.error("Item (id: {0}) does not exist", self.itemID) + logging.error("Item (id: {0}) does not exist", self.itemID) return self.__itemModifiedAttributes = ModifiedAttributeDict() diff --git a/eos/saveddata/character.py b/eos/saveddata/character.py index 53d796b301..c7fd157a4e 100644 --- a/eos/saveddata/character.py +++ b/eos/saveddata/character.py @@ -19,7 +19,7 @@ from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) from itertools import chain diff --git a/eos/saveddata/citadel.py b/eos/saveddata/citadel.py index f900a444dd..9062e80192 100644 --- a/eos/saveddata/citadel.py +++ b/eos/saveddata/citadel.py @@ -18,7 +18,7 @@ # =============================================================================== from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) from eos.types import Ship diff --git a/eos/saveddata/drone.py b/eos/saveddata/drone.py index b807e4390f..ff96771d73 100644 --- a/eos/saveddata/drone.py +++ b/eos/saveddata/drone.py @@ -18,7 +18,7 @@ # =============================================================================== from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) from sqlalchemy.orm import validates, reconstructor @@ -52,11 +52,11 @@ def init(self): if self.itemID: self.__item = eos.db.getItem(self.itemID) if self.__item is None: - logger.error("Item (id: {0}) does not exist", self.itemID) + logging.error("Item (id: {0}) does not exist", self.itemID) return if self.isInvalid: - logger.error("Item (id: {0}) is not a Drone", self.itemID) + logging.error("Item (id: {0}) is not a Drone", self.itemID) return self.build() diff --git a/eos/saveddata/fighter.py b/eos/saveddata/fighter.py index c7fac10ca7..0905210043 100644 --- a/eos/saveddata/fighter.py +++ b/eos/saveddata/fighter.py @@ -18,7 +18,7 @@ # =============================================================================== from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) from sqlalchemy.orm import validates, reconstructor @@ -59,11 +59,11 @@ def init(self): if self.itemID: self.__item = eos.db.getItem(self.itemID) if self.__item is None: - logger.error("Item (id: {0}) does not exist", self.itemID) + logging.error("Item (id: {0}) does not exist", self.itemID) return if self.isInvalid: - logger.error("Item (id: {0}) is not a Fighter", self.itemID) + logging.error("Item (id: {0}) is not a Fighter", self.itemID) return self.build() diff --git a/eos/saveddata/fighterAbility.py b/eos/saveddata/fighterAbility.py index b4c022e612..0cbea597c7 100644 --- a/eos/saveddata/fighterAbility.py +++ b/eos/saveddata/fighterAbility.py @@ -18,7 +18,7 @@ # =============================================================================== from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) from sqlalchemy.orm import reconstructor @@ -58,7 +58,7 @@ def init(self): if self.effectID: self.__effect = next((x for x in self.fighter.item.effects.itervalues() if x.ID == self.effectID), None) if self.__effect is None: - logger.error("Effect (id: {0}) does not exist", self.effectID) + logging.error("Effect (id: {0}) does not exist", self.effectID) return self.build() diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py index d0860d23e6..b551b2899e 100644 --- a/eos/saveddata/fit.py +++ b/eos/saveddata/fit.py @@ -34,7 +34,7 @@ from eos.types import Ship, Character, Slot, Module, Citadel from utils.timer import Timer from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) try: from collections import OrderedDict @@ -91,7 +91,7 @@ def init(self): if self.shipID: item = eos.db.getItem(self.shipID) if item is None: - logger.error("Item (id: {0}) does not exist", self.shipID) + logging.error("Item (id: {0}) does not exist", self.shipID) return try: @@ -104,7 +104,7 @@ def init(self): # change all instances in source). Remove this at some point self.extraAttributes = self.__ship.itemModifiedAttributes except ValueError: - logger.error("Item (id: {0}) is not a Ship", self.shipID) + logging.error("Item (id: {0}) is not a Ship", self.shipID) return if self.modeID and self.__ship: @@ -453,7 +453,7 @@ def addCommandBonus(self, warfareBuffID, value, module, effect, runTime="normal" self.commandBonuses[warfareBuffID] = (runTime, value, module, effect) def __runCommandBoosts(self, runTime="normal"): - logger.debug("Applying gang boosts for {0}", self) + logging.debug("Applying gang boosts for {0}", self) for warfareBuffID in self.commandBonuses.keys(): # Unpack all data required to run effect properly effect_runTime, value, thing, effect = self.commandBonuses[warfareBuffID] @@ -636,20 +636,20 @@ def __runCommandBoosts(self, runTime="normal"): def calculateModifiedAttributes(self, targetFit=None, withBoosters=False, dirtyStorage=None): timer = Timer(u'Fit: {}, {}'.format(self.ID, self.name), logger) - logger.info("Starting fit calculation on: {0}, withBoosters: {1}", self, withBoosters) + logging.info("Starting fit calculation on: {0}, withBoosters: {1}", self, withBoosters) shadow = False if targetFit and not withBoosters: - logger.debug("Applying projections to target: {0}", targetFit) + logging.debug("Applying projections to target: {0}", targetFit) projectionInfo = self.getProjectionInfo(targetFit.ID) - logger.info("ProjectionInfo: {0}", projectionInfo) + logging.info("ProjectionInfo: {0}", projectionInfo) if self == targetFit: copied = self # original fit shadow = True # Don't inspect this, we genuinely want to reassign self # noinspection PyMethodFirstArgAssignment self = copy.deepcopy(self) - logger.debug("Handling self projection - making shadow copy of fit. {0} => {1}", copied, self) + logging.debug("Handling self projection - making shadow copy of fit. {0} => {1}", copied, self) # we delete the fit because when we copy a fit, flush() is # called to properly handle projection updates. However, we do # not want to save this fit to the database, so simply remove it @@ -684,7 +684,7 @@ def calculateModifiedAttributes(self, targetFit=None, withBoosters=False, dirtyS # projection have modifying stuff applied, such as gang boosts and other # local modules that may help if self.__calculated and not projected and not withBoosters: - logger.debug("Fit has already been calculated and is not projected, returning: {0}", self) + logging.debug("Fit has already been calculated and is not projected, returning: {0}", self) return for runTime in ("early", "normal", "late"): @@ -755,7 +755,7 @@ def calculateModifiedAttributes(self, targetFit=None, withBoosters=False, dirtyS timer.checkpoint('Done with fit calculation') if shadow: - logger.debug("Delete shadow fit object") + logging.debug("Delete shadow fit object") del self def fill(self): diff --git a/eos/saveddata/implant.py b/eos/saveddata/implant.py index e3305f7820..7870f34e94 100644 --- a/eos/saveddata/implant.py +++ b/eos/saveddata/implant.py @@ -18,7 +18,7 @@ # =============================================================================== from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) from sqlalchemy.orm import validates, reconstructor @@ -45,11 +45,11 @@ def init(self): if self.itemID: self.__item = eos.db.getItem(self.itemID) if self.__item is None: - logger.error("Item (id: {0}) does not exist", self.itemID) + logging.error("Item (id: {0}) does not exist", self.itemID) return if self.isInvalid: - logger.error("Item (id: {0}) is not an Implant", self.itemID) + logging.error("Item (id: {0}) is not an Implant", self.itemID) return self.build() diff --git a/eos/saveddata/module.py b/eos/saveddata/module.py index a7bc884caf..2c0f4b55ea 100644 --- a/eos/saveddata/module.py +++ b/eos/saveddata/module.py @@ -18,7 +18,7 @@ # =============================================================================== from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) from sqlalchemy.orm import validates, reconstructor @@ -93,11 +93,11 @@ def init(self): if self.itemID: self.__item = eos.db.getItem(self.itemID) if self.__item is None: - logger.error("Item (id: {0}) does not exist", self.itemID) + logging.error("Item (id: {0}) does not exist", self.itemID) return if self.isInvalid: - logger.error("Item (id: {0}) is not a Module", self.itemID) + logging.error("Item (id: {0}) is not a Module", self.itemID) return if self.chargeID: diff --git a/eos/saveddata/override.py b/eos/saveddata/override.py index 57254474dc..a41fb0e29f 100644 --- a/eos/saveddata/override.py +++ b/eos/saveddata/override.py @@ -18,7 +18,7 @@ # =============================================================================== from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) from sqlalchemy.orm import reconstructor @@ -42,13 +42,13 @@ def init(self): if self.attrID: self.__attr = eos.db.getAttributeInfo(self.attrID) if self.__attr is None: - logger.error("Attribute (id: {0}) does not exist", self.attrID) + logging.error("Attribute (id: {0}) does not exist", self.attrID) return if self.itemID: self.__item = eos.db.getItem(self.itemID) if self.__item is None: - logger.error("Item (id: {0}) does not exist", self.itemID) + logging.error("Item (id: {0}) does not exist", self.itemID) return @property diff --git a/eos/saveddata/ship.py b/eos/saveddata/ship.py index 4ab361344d..3c776fd211 100644 --- a/eos/saveddata/ship.py +++ b/eos/saveddata/ship.py @@ -18,7 +18,7 @@ # =============================================================================== from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) import eos.db from eos.effectHandlerHelpers import HandledItem diff --git a/gui/bitmapLoader.py b/gui/bitmapLoader.py index 87586f47b4..bdd93a8d8d 100644 --- a/gui/bitmapLoader.py +++ b/gui/bitmapLoader.py @@ -27,7 +27,7 @@ import config from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) try: from collections import OrderedDict @@ -39,7 +39,7 @@ class BitmapLoader(): try: archive = zipfile.ZipFile(config.getPyfaPath('imgs.zip'), 'r') except IOError: - logger.info("Using local image files instead of zip.") + logging.info("Using local image files instead of zip.") archive = None cachedBitmaps = OrderedDict() diff --git a/gui/builtinViews/fittingView.py b/gui/builtinViews/fittingView.py index 8dea11470a..e6b69c9827 100644 --- a/gui/builtinViews/fittingView.py +++ b/gui/builtinViews/fittingView.py @@ -37,7 +37,7 @@ import gui.globalEvents as GE from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) # Tab spawning handler @@ -58,7 +58,7 @@ def fitSelected(self, event): wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=event.fitID)) break except: - logger.warning("Caught exception in fitSelected") + logging.warning("Caught exception in fitSelected") pass if count < 0: startup = getattr(event, "startup", False) # see OpenFitsThread in gui.mainFrame @@ -275,7 +275,7 @@ def fitRemoved(self, event): sFit.refreshFit(self.getActiveFit()) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.activeFitID)) except wx._core.PyDeadObjectError: - logger.warning("Caught dead object") + logging.warning("Caught dead object") pass event.Skip() @@ -478,7 +478,7 @@ def fitChanged(self, event): self.Show(self.activeFitID is not None and self.activeFitID == event.fitID) except wx._core.PyDeadObjectError: - logger.warning("Caught dead object") + logging.warning("Caught dead object") pass finally: event.Skip() @@ -633,7 +633,7 @@ def refresh(self, stuff): try: self.MakeSnapshot() except: - logger.warning("Failed to make snapshot") + logging.warning("Failed to make snapshot") pass def OnShow(self, event): @@ -641,7 +641,7 @@ def OnShow(self, event): try: self.MakeSnapshot() except: - logger.warning("Failed to make snapshot") + logging.warning("Failed to make snapshot") pass event.Skip() @@ -667,7 +667,7 @@ def MakeSnapshot(self, maxColumns=1337): try: fit = sFit.getFit(self.activeFitID) except: - logger.warning("Failed to get fit") + logging.warning("Failed to get fit") return if fit is None: diff --git a/gui/characterEditor.py b/gui/characterEditor.py index 87ac85acd0..bbbf1bc9c2 100644 --- a/gui/characterEditor.py +++ b/gui/characterEditor.py @@ -31,7 +31,7 @@ from service.network import AuthenticationError, TimeoutError from service.market import Market from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) class CharacterTextValidor(BaseValidator): @@ -54,7 +54,7 @@ def Validate(self, win): return True except ValueError, e: - logger.error(e) + logging.error(e) wx.MessageBox(u"{}".format(e), "Error") textCtrl.SetFocus() return False @@ -630,14 +630,14 @@ def fetchCharList(self, event): list = sChar.apiCharList(activeChar.ID, self.inputID.GetLineText(0), self.inputKey.GetLineText(0)) except AuthenticationError, e: msg = "Authentication failure. Please check keyID and vCode combination." - logger.info(msg) + logging.info(msg) self.stStatus.SetLabel(msg) except TimeoutError, e: msg = "Request timed out. Please check network connectivity and/or proxy settings." - logger.info(msg) + logging.info(msg) self.stStatus.SetLabel(msg) except Exception, e: - logger.error(e) + logging.error(e) self.stStatus.SetLabel("Error:\n%s" % e.message) else: self.charChoice.Clear() @@ -660,7 +660,7 @@ def fetchSkills(self, event): sChar.apiFetch(activeChar.ID, charName) self.stStatus.SetLabel("Successfully fetched %s\'s skills from EVE API." % charName) except Exception, e: - logger.error("Unable to retrieve {0}\'s skills. Error message:\n{1}", charName, e) + logging.error("Unable to retrieve {0}\'s skills. Error message:\n{1}", charName, e) self.stStatus.SetLabel("Unable to retrieve %s\'s skills. Error message:\n%s" % (charName, e)) diff --git a/gui/characterSelection.py b/gui/characterSelection.py index 1aae7b4991..e4e5a68d84 100644 --- a/gui/characterSelection.py +++ b/gui/characterSelection.py @@ -24,7 +24,7 @@ from service.character import Character from service.fit import Fit from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) class CharacterSelection(wx.Panel): @@ -115,7 +115,7 @@ def refreshApi(self, event): sChar.apiFetch(self.getActiveCharacter(), charName) except: # can we do a popup, notifying user of API error? - logger.error("API fetch error") + logging.error("API fetch error") pass self.refreshCharacterList() diff --git a/gui/chromeTabs.py b/gui/chromeTabs.py index 30532984c7..daeedad233 100644 --- a/gui/chromeTabs.py +++ b/gui/chromeTabs.py @@ -24,7 +24,7 @@ import gui.utils.fonts as fonts from gui.bitmapLoader import BitmapLoader from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) from service.fit import Fit @@ -1090,7 +1090,7 @@ def CheckTabPreview(self, mposx, mposy): self.previewTimer.Start(500, True) break except: - logger.warning("Exception caught in CheckTabPreview.") + logging.warning("Exception caught in CheckTabPreview.") pass def CheckAddHighlighted(self, x, y): diff --git a/gui/contextMenu.py b/gui/contextMenu.py index 56297280dd..8cba7d4ba1 100644 --- a/gui/contextMenu.py +++ b/gui/contextMenu.py @@ -19,7 +19,7 @@ import wx from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) class ContextMenu(object): @@ -119,7 +119,7 @@ def getMenu(cls, selection, *fullContexts): debug_end = len(cls._ids) if (debug_end - debug_start): - logger.debug("{0} new IDs created for this menu", (debug_end - debug_start)) + logging.debug("{0} new IDs created for this menu", (debug_end - debug_start)) return rootMenu if empty is False else None diff --git a/gui/crestFittings.py b/gui/crestFittings.py index fd712f8831..82a095c59a 100644 --- a/gui/crestFittings.py +++ b/gui/crestFittings.py @@ -17,7 +17,7 @@ import gui.globalEvents as GE from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) class CrestFittings(wx.Frame): @@ -149,7 +149,7 @@ def fetchFittings(self, event): self.fitTree.populateSkillTree(fittings) except requests.exceptions.ConnectionError: msg = "Connection error, please check your internet connection" - logger.error(msg) + logging.error(msg) self.statusbar.SetStatusText(msg) finally: del waitDialog @@ -179,7 +179,7 @@ def deleteFitting(self, event): sCrest.delFitting(self.getActiveCharacter(), data['fittingID']) except requests.exceptions.ConnectionError: msg = "Connection error, please check your internet connection" - logger.error(msg) + logging.error(msg) self.statusbar.SetStatusText(msg) @@ -288,11 +288,11 @@ def exportFitting(self, event): text = json.loads(res.text) self.statusbar.SetStatusText(text['message'], 1) except ValueError: - logger.warning("Value error on loading JSON.") + logging.warning("Value error on loading JSON.") self.statusbar.SetStatusText("", 1) except requests.exceptions.ConnectionError: msg = "Connection error, please check your internet connection" - logger.error(msg) + logging.error(msg) self.statusbar.SetStatusText(msg) @@ -415,7 +415,7 @@ def displayFit(self, event): cargo.amount = item['quantity'] list.append(cargo) except: - logger.error("Exception caught in displayFit") + logging.error("Exception caught in displayFit") pass self.parent.fitView.fitSelection = selection diff --git a/gui/graphFrame.py b/gui/graphFrame.py index 4874f1259c..58684eb109 100644 --- a/gui/graphFrame.py +++ b/gui/graphFrame.py @@ -19,7 +19,7 @@ import os from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) import wx @@ -39,7 +39,7 @@ mplImported = False except ImportError: enabled = False - logger.info("Problems importing matplotlib; continuing without graphs") + logging.info("Problems importing matplotlib; continuing without graphs") class GraphFrame(wx.Frame): @@ -221,7 +221,7 @@ def draw(self, event=None): legend.append(fit.name) except: msg = "Invalid values in '%s'" % fit.name - logger.error(msg) + logging.error(msg) self.SetStatusText(msg) self.canvas.draw() return diff --git a/gui/mainFrame.py b/gui/mainFrame.py index 5b5aa4ea51..b3fdb91e7f 100644 --- a/gui/mainFrame.py +++ b/gui/mainFrame.py @@ -20,7 +20,7 @@ import sys import os.path from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) import sqlalchemy import wx @@ -139,7 +139,7 @@ def getInstance(cls): return cls.__instance if cls.__instance is not None else MainFrame() def __init__(self, title): - logger.debug("Initialize MainFrame") + logging.debug("Initialize MainFrame") self.title = title wx.Frame.__init__(self, None, wx.ID_ANY, self.title) @@ -707,7 +707,7 @@ def importFromClipboard(self, event): try: fits = Port().importFitFromBuffer(clipboard, self.getActiveFit()) except: - logger.error("Attempt to import failed:\n{0}", clipboard) + logging.error("Attempt to import failed:\n{0}", clipboard) else: self._openAfterImport(fits) diff --git a/gui/mainMenuBar.py b/gui/mainMenuBar.py index 1da041cd8c..fa167c4064 100644 --- a/gui/mainMenuBar.py +++ b/gui/mainMenuBar.py @@ -27,7 +27,7 @@ from gui.bitmapLoader import BitmapLoader from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) if 'wxMac' not in wx.PlatformInfo or ('wxMac' in wx.PlatformInfo and wx.VERSION >= (3, 0)): from service.crest import Crest @@ -36,7 +36,7 @@ class MainMenuBar(wx.MenuBar): def __init__(self): - logger.debug("Initialize MainMenuBar") + logging.debug("Initialize MainMenuBar") self.characterEditorId = wx.NewId() self.damagePatternEditorId = wx.NewId() self.targetResistsEditorId = wx.NewId() @@ -167,7 +167,7 @@ def __init__(self): self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged) def fitChanged(self, event): - logger.debug("fitChanged triggered") + logging.debug("fitChanged triggered") enable = event.fitID is not None self.Enable(wx.ID_SAVEAS, enable) self.Enable(wx.ID_COPY, enable) diff --git a/gui/marketBrowser.py b/gui/marketBrowser.py index c9567e08db..bc78732d32 100644 --- a/gui/marketBrowser.py +++ b/gui/marketBrowser.py @@ -26,7 +26,7 @@ from gui.contextMenu import ContextMenu from gui.bitmapLoader import BitmapLoader from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) ItemSelected, ITEM_SELECTED = wx.lib.newevent.NewEvent() @@ -54,7 +54,7 @@ def reset(self): class MarketBrowser(wx.Panel): def __init__(self, parent): - logger.debug("Initialize marketBrowser") + logging.debug("Initialize marketBrowser") wx.Panel.__init__(self, parent) vbox = wx.BoxSizer(wx.VERTICAL) self.SetSizer(vbox) @@ -132,7 +132,7 @@ def __init__(self, parent, **kwargs): class MarketTree(wx.TreeCtrl): def __init__(self, parent, marketBrowser): - logger.debug("Initialize marketTree") + logging.debug("Initialize marketTree") wx.TreeCtrl.__init__(self, parent, style=wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT) self.root = self.AddRoot("root") @@ -183,7 +183,7 @@ def expandLookup(self, event): try: childId = self.AppendItem(root, childMktGrp.name, iconId, data=wx.TreeItemData(childMktGrp.ID)) except: - logger.debug("Error appending item.") + logging.debug("Error appending item.") continue if sMkt.marketGroupHasTypesCheck(childMktGrp) is False: self.AppendItem(childId, "dummy") @@ -226,7 +226,7 @@ class ItemView(d.Display): "attr:cpu,,,True"] def __init__(self, parent, marketBrowser): - logger.debug("Initialize ItemView") + logging.debug("Initialize ItemView") d.Display.__init__(self, parent) marketBrowser.Bind(wx.EVT_TREE_SEL_CHANGED, self.selectionMade) @@ -254,7 +254,7 @@ def __init__(self, parent, marketBrowser): self.metaMap = self.makeReverseMetaMap() # Fill up recently used modules set - logger.debug("Fill up recently used modules set") + logging.debug("Fill up recently used modules set") for itemID in self.sMkt.serviceMarketRecentlyUsedModules["pyfaMarketRecentlyUsedModules"]: self.recentlyUsedModules.add(self.sMkt.getItem(itemID)) diff --git a/gui/patternEditor.py b/gui/patternEditor.py index d0e1cadd1e..7a56ca8713 100644 --- a/gui/patternEditor.py +++ b/gui/patternEditor.py @@ -24,7 +24,7 @@ from gui.builtinViews.entityEditor import EntityEditor, BaseValidator from service.damagePattern import DamagePattern, ImportError from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) class DmgPatternTextValidor(BaseValidator): @@ -47,7 +47,7 @@ def Validate(self, win): return True except ValueError as e: - logger.error(e) + logging.error(e) wx.MessageBox(u"{}".format(e), "Error") textCtrl.SetFocus() return False @@ -257,11 +257,11 @@ def importPatterns(self, event): sDP.importPatterns(text) self.stNotice.SetLabel("Patterns successfully imported from clipboard") except ImportError as e: - logger.error(e) + logging.error(e) self.stNotice.SetLabel(str(e)) except Exception: msg = "Could not import from clipboard: unknown errors" - logger.warning(msg) + logging.warning(msg) self.stNotice.SetLabel(msg) finally: self.entityEditor.refreshEntityList() diff --git a/gui/propertyEditor.py b/gui/propertyEditor.py index b19e6ce5fe..70d7ba7cfd 100644 --- a/gui/propertyEditor.py +++ b/gui/propertyEditor.py @@ -1,6 +1,6 @@ import csv from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) import wx @@ -267,7 +267,7 @@ def OnPropGridChange(self, event): self.itemView.updateItems() - logger.debug('{0} changed to "{1}"', p.GetName(), p.GetValueAsString()) + logging.debug('{0} changed to "{1}"', p.GetName(), p.GetValueAsString()) def OnPropGridSelect(self, event): pass diff --git a/gui/resistsEditor.py b/gui/resistsEditor.py index a72b98817e..d29ecf35e9 100644 --- a/gui/resistsEditor.py +++ b/gui/resistsEditor.py @@ -23,7 +23,7 @@ from gui.utils.clipboard import toClipboard, fromClipboard from gui.builtinViews.entityEditor import EntityEditor, BaseValidator from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) class TargetResistsTextValidor(BaseValidator): @@ -46,7 +46,7 @@ def Validate(self, win): return True except ValueError as e: - logger.error(e) + logging.error(e) wx.MessageBox(u"{}".format(e), "Error") textCtrl.SetFocus() return False @@ -231,12 +231,12 @@ def ValuesUpdated(self, event=None): except ValueError: editObj.SetForegroundColour(wx.RED) msg = "Incorrect Formatting (decimals only)" - logger.warning(msg) + logging.warning(msg) self.stNotice.SetLabel(msg) except AssertionError: editObj.SetForegroundColour(wx.RED) msg = "Incorrect Range (must be 0-100)" - logger.warning(msg) + logging.warning(msg) self.stNotice.SetLabel(msg) finally: # Refresh for color changes to take effect immediately self.Refresh() @@ -275,11 +275,11 @@ def importPatterns(self, event): sTR.importPatterns(text) self.stNotice.SetLabel("Patterns successfully imported from clipboard") except ImportError as e: - logger.error(e) + logging.error(e) self.stNotice.SetLabel(str(e)) except Exception: msg = "Could not import from clipboard: unknown errors" - logger.warning(msg) + logging.warning(msg) self.stNotice.SetLabel(msg) finally: self.entityEditor.refreshEntityList() diff --git a/gui/setEditor.py b/gui/setEditor.py index 3f2aa0f4ff..3a7895d708 100644 --- a/gui/setEditor.py +++ b/gui/setEditor.py @@ -18,7 +18,7 @@ # ============================================================================= from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) import wx from service.implantSet import ImplantSets @@ -47,7 +47,7 @@ def Validate(self, win): return True except ValueError as e: - logger.error(e) + logging.error(e) wx.MessageBox(u"{}".format(e), "Error") textCtrl.SetFocus() return False @@ -197,10 +197,10 @@ def importPatterns(self, event): self.stNotice.SetLabel("Patterns successfully imported from clipboard") self.showInput(False) except ImportError as e: - logger.error(e) + logging.error(e) self.stNotice.SetLabel(str(e)) except Exception as e: - logger.error(e) + logging.error(e) self.stNotice.SetLabel("Could not import from clipboard: unknown errors") finally: self.updateChoices() diff --git a/gui/shipBrowser.py b/gui/shipBrowser.py index bca6de3326..432f349bfe 100644 --- a/gui/shipBrowser.py +++ b/gui/shipBrowser.py @@ -20,7 +20,7 @@ from gui.contextMenu import ContextMenu from gui.bitmapLoader import BitmapLoader from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) FitRenamed, EVT_FIT_RENAMED = wx.lib.newevent.NewEvent() FitSelected, EVT_FIT_SELECTED = wx.lib.newevent.NewEvent() @@ -682,7 +682,7 @@ def stage1(self, event): self.lpane.Freeze() self.lpane.RemoveAllChildren() - logger.debug("Populate ship category list.") + logging.debug("Populate ship category list.") if len(self.categoryList) == 0: # set cache of category list self.categoryList = list(sMkt.getShipRoot()) diff --git a/gui/utils/compat.py b/gui/utils/compat.py index 6951d952bb..5241a1ce61 100644 --- a/gui/utils/compat.py +++ b/gui/utils/compat.py @@ -2,7 +2,7 @@ # Passes Python2.7's test suite and incorporates all the latest updates. from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) try: from thread import get_ident as _get_ident @@ -12,7 +12,7 @@ try: from _abcoll import KeysView, ValuesView, ItemsView except ImportError: - logger.warning("Failed to import from _abcoll") + logging.warning("Failed to import from _abcoll") pass diff --git a/gui/utils/exportHtml.py b/gui/utils/exportHtml.py index a1e7ea15e4..a88ab0e333 100644 --- a/gui/utils/exportHtml.py +++ b/gui/utils/exportHtml.py @@ -5,7 +5,7 @@ from service.fit import Fit from service.market import Market from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) class exportHtml(): @@ -196,7 +196,7 @@ def generateFullHTML(self, sMkt, sFit, dnaUrl): HTMLgroup += '
  • ' + ship.name + ": " + \ fit[1] + '
  • \n' except: - logger.warning("Failed to export line") + logging.warning("Failed to export line") pass finally: if self.callback: @@ -219,7 +219,7 @@ def generateFullHTML(self, sMkt, sFit, dnaUrl): HTMLship += '
  • ' + fit[ 1] + '
  • \n' except: - logger.warning("Failed to export line") + logging.warning("Failed to export line") continue finally: if self.callback: @@ -272,7 +272,7 @@ def generateMinimalHTML(self, sMkt, sFit, dnaUrl): HTML += '' + ship.name + ': ' + \ fit[1] + '
    \n' except: - logger.error("Failed to export line") + logging.error("Failed to export line") continue finally: if self.callback: diff --git a/pyfa.py b/pyfa.py index b1786360bf..c93e44c07f 100755 --- a/pyfa.py +++ b/pyfa.py @@ -26,7 +26,7 @@ from optparse import OptionParser, BadOptionError, AmbiguousOptionError from logbook import TimedRotatingFileHandler, Logger, StreamHandler, NestedSetup, FingersCrossedHandler, NullHandler -logger = Logger(__name__) +logging = Logger(__name__) class PassThroughOptionParser(OptionParser): @@ -40,7 +40,7 @@ def _process_args(self, largs, rargs, values): try: OptionParser._process_args(self, largs, rargs, values) except (BadOptionError, AmbiguousOptionError) as e: - logger.error("Bad startup option passed.") + logging.error("Bad startup option passed.") largs.append(e.opt_str) @@ -213,39 +213,39 @@ def flush(self): if not hasattr(sys, 'frozen'): # Output all stdout (print) messages as warnings try: - sys.stdout = LoggerWriter(logger.warning) + sys.stdout = LoggerWriter(logging.warning) except ValueError: - logger.critical("Cannot access log file. Continuing without writing stdout to log.") + logging.critical("Cannot access log file. Continuing without writing stdout to log.") # Output all stderr (stacktrace) messages as critical try: - sys.stderr = LoggerWriter(logger.critical) + sys.stderr = LoggerWriter(logging.critical) except ValueError: - logger.critical("Cannot access log file. Continuing without writing stderr to log.") + logging.critical("Cannot access log file. Continuing without writing stderr to log.") - logger.info("Starting Pyfa") - logger.info("Running in logging mode: {0}", logging_mode) + logging.info("Starting Pyfa") + logging.info("Running in logging mode: {0}", logging_mode) # Import everything - logger.debug("Import wx") + logging.debug("Import wx") import wx import os import os.path - logger.debug("Import eos.db") + logging.debug("Import eos.db") import eos.db import service.prefetch from gui.mainFrame import MainFrame - logger.debug("Make sure the saveddata db exists") + logging.debug("Make sure the saveddata db exists") if not os.path.exists(config.savePath): os.mkdir(config.savePath) eos.db.saveddata_meta.create_all() pyfa = wx.App(False) - logger.debug("Show GUI") + logging.debug("Show GUI") MainFrame(options.title) # run the gui mainloop - logger.debug("Run MainLoop()") + logging.debug("Run MainLoop()") pyfa.MainLoop() diff --git a/scripts/dist.py b/scripts/dist.py index 6d3cef4c6f..1f93c11dcc 100755 --- a/scripts/dist.py +++ b/scripts/dist.py @@ -36,7 +36,7 @@ import errno from subprocess import call from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) class FileStub(): @@ -243,17 +243,17 @@ def zipdir(path, zip): try: shutil.rmtree("dist") # Inno dir except: - logger.warning("Failed to remove dist") + logging.warning("Failed to remove dist") pass try: shutil.rmtree(tmpDir) except: - logger.warning("Failed to remove: {0}", tmpDir) + logging.warning("Failed to remove: {0}", tmpDir) pass try: os.unlink(tmpFile) except: - logger.warning("Faileld to remove: {0}", tmpFile) + logging.warning("Faileld to remove: {0}", tmpFile) pass sys.stdout = oldstd diff --git a/scripts/itemDiff.py b/scripts/itemDiff.py index e5441ae918..473b145c74 100755 --- a/scripts/itemDiff.py +++ b/scripts/itemDiff.py @@ -31,7 +31,7 @@ import sqlite3 import sys from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) script_dir = os.path.dirname(__file__) default_old = os.path.join(script_dir, "..", "eve.db") @@ -410,7 +410,7 @@ def getattrname(attr): for row in new_cursor: new_meta[row[0]] = row[1] except: - logger.warning("Failed to get db metadata") + logging.warning("Failed to get db metadata") pass # Print jobs print("Comparing databases:\n{0} -> {1}\n".format(old_meta.get("client_build"), new_meta.get("client_build"))) diff --git a/service/character.py b/service/character.py index 540f455761..45cfb0dc37 100644 --- a/service/character.py +++ b/service/character.py @@ -21,7 +21,7 @@ import itertools import json from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) import threading from codecs import open from xml.etree import ElementTree @@ -69,7 +69,7 @@ def run(self): charFile = open(path, mode='r').read() doc = minidom.parseString(charFile) if doc.documentElement.tagName not in ("SerializableCCPCharacter", "SerializableUriCharacter"): - logger.error("Incorrect EVEMon XML sheet") + logging.error("Incorrect EVEMon XML sheet") raise RuntimeError("Incorrect EVEMon XML sheet") name = doc.getElementsByTagName("name")[0].firstChild.nodeValue skill_els = doc.getElementsByTagName("skill") @@ -81,7 +81,7 @@ def run(self): "level": int(skill.getAttribute("level")), }) else: - logger.error("Attempted to import unknown skill {0} (ID: {1}) (Level: {2})", + logging.error("Attempted to import unknown skill {0} (ID: {1}) (Level: {2})", skill.getAttribute("name"), skill.getAttribute("typeID"), skill.getAttribute("level"), @@ -89,8 +89,8 @@ def run(self): char = sCharacter.new(name+" (EVEMon)") sCharacter.apiUpdateCharSheet(char.ID, skills) except Exception, e: - logger.error("Exception on character import:") - logger.error(e) + logging.error("Exception on character import:") + logging.error(e) continue wx.CallAfter(self.callback) @@ -281,7 +281,7 @@ def new(self, name="New Character"): def rename(self, char, newName): if char.name in ("All 0", "All 5"): - logger.info("Cannot rename built in characters.") + logging.info("Cannot rename built in characters.") else: char.name = newName eos.db.commit() @@ -371,7 +371,7 @@ def saveSkill(self, charID, skillID): def addImplant(self, charID, itemID): char = eos.db.getCharacter(charID) if char.ro: - logger.error("Trying to add implant to read-only character") + logging.error("Trying to add implant to read-only character") return implant = es_Implant(eos.db.getItem(itemID)) diff --git a/service/crest.py b/service/crest.py index 8e23615b09..320963688d 100644 --- a/service/crest.py +++ b/service/crest.py @@ -1,7 +1,7 @@ import wx import thread from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) import threading import copy import uuid @@ -177,10 +177,10 @@ def handleLogin(self, message): return if message['state'][0] != self.state: - logger.warn("OAUTH state mismatch") + logging.warn("OAUTH state mismatch") return - logger.debug("Handling CREST login with: {0}", message) + logging.debug("Handling CREST login with: {0}", message) if 'access_token' in message: # implicit eve = copy.deepcopy(self.eve) @@ -194,7 +194,7 @@ def handleLogin(self, message): eve() info = eve.whoami() - logger.debug("Got character info: {0}", info) + logging.debug("Got character info: {0}", info) self.implicitCharacter = CrestChar(info['CharacterID'], info['CharacterName']) self.implicitCharacter.eve = eve @@ -207,7 +207,7 @@ def handleLogin(self, message): eve() info = eve.whoami() - logger.debug("Got character info: {0}", info) + logging.debug("Got character info: {0}", info) # check if we have character already. If so, simply replace refresh_token char = self.getCrestCharacter(int(info['CharacterID'])) diff --git a/service/fit.py b/service/fit.py index 10b966a9b4..4d4b4a3fcf 100644 --- a/service/fit.py +++ b/service/fit.py @@ -19,7 +19,7 @@ import copy from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) import eos.db from eos.saveddata.booster import Booster as es_Booster @@ -992,7 +992,7 @@ def refreshFit(self, fitID): self.recalc(fit) def recalc(self, fit, withBoosters=True): - logger.info("=" * 10 + "recalc" + "=" * 10) + logging.info("=" * 10 + "recalc" + "=" * 10) if fit.factorReload is not self.serviceFittingOptions["useGlobalForceReload"]: fit.factorReload = self.serviceFittingOptions["useGlobalForceReload"] fit.clear() diff --git a/service/market.py b/service/market.py index f83d4d92b2..da3e2147da 100644 --- a/service/market.py +++ b/service/market.py @@ -20,7 +20,7 @@ import re import threading from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) import Queue import wx @@ -70,23 +70,23 @@ def processRequests(self): wx.CallAfter(callback, (id_, set_)) except: - logger.debug("Callback failed.") + logging.debug("Callback failed.") pass finally: try: queue.task_done() except: - logger.debug("Queue task done failed.") + logging.debug("Queue task done failed.") pass class PriceWorkerThread(threading.Thread): def run(self): - logger.debug("Run start") + logging.debug("Run start") self.queue = Queue.Queue() self.wait = {} self.processUpdates() - logger.debug("Run end") + logging.debug("Run end") def processUpdates(self): queue = self.queue @@ -427,7 +427,7 @@ def getItem(self, identity, *args, **kwargs): else: raise TypeError("Need Item object, integer, float or string as argument") except: - logger.error("Could not get item: {0}", identity) + logging.error("Could not get item: {0}", identity) raise return item @@ -817,7 +817,7 @@ def cb(): try: callback(requests) except Exception: - logger.debug("Callback failed.") + logging.debug("Callback failed.") pass eos.db.commit() @@ -834,7 +834,7 @@ def cb(): try: callback(item) except: - logger.debug("Callback failed.") + logging.debug("Callback failed.") pass self.priceWorkerThread.setToWait(item.ID, cb) diff --git a/service/port.py b/service/port.py index 6d573992bd..5ccce3ad99 100644 --- a/service/port.py +++ b/service/port.py @@ -21,7 +21,7 @@ import os import xml.dom from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) import collections import json import threading @@ -121,21 +121,21 @@ def importFitFromFiles(self, paths, callback=None): savebom = bom if codec_found is None: - logger.info("Unicode BOM not found in file {0}.", path) + logging.info("Unicode BOM not found in file {0}.", path) attempt_codecs = (defcodepage, "utf-8", "utf-16", "cp1252") for page in attempt_codecs: try: - logger.info("Attempting to decode file {0} using {1} page.", path, page) + logging.info("Attempting to decode file {0} using {1} page.", path, page) srcString = unicode(srcString, page) codec_found = page - logger.info("File {0} decoded using {1} page.", path, page) + logging.info("File {0} decoded using {1} page.", path, page) except UnicodeDecodeError: - logger.info("Error unicode decoding {0} from page {1}, trying next codec", path, page) + logging.info("Error unicode decoding {0} from page {1}, trying next codec", path, page) else: break else: - logger.info("Unicode BOM detected in {0}, using {1} page.", path, codec_found) + logging.info("Unicode BOM detected in {0}, using {1} page.", path, codec_found) srcString = unicode(srcString[len(savebom):], codec_found) else: @@ -154,7 +154,7 @@ def importFitFromFiles(self, paths, callback=None): except xml.parsers.expat.ExpatError: return False, "Malformed XML in %s" % path except Exception: - logger.exception("Unknown exception processing: {0}", path) + logging.exception("Unknown exception processing: {0}", path) return False, "Unknown Error while processing %s" % path IDs = [] @@ -326,7 +326,7 @@ def importCrest(str_): except ValueError: f.ship = Citadel(sMkt.getItem(fit['ship']['id'])) except: - logger.warning("Caught exception in importCrest") + logging.warning("Caught exception in importCrest") return None items = fit['items'] @@ -352,7 +352,7 @@ def importCrest(str_): m = Module(item) # When item can't be added to any slot (unknown item or just charge), ignore it except ValueError: - logger.debug("Item can't be added to any slot (unknown item or just charge)") + logging.debug("Item can't be added to any slot (unknown item or just charge)") continue # Add subsystems before modules to make sure T3 cruisers have subsystems installed if item.category.name == "Subsystem": @@ -365,7 +365,7 @@ def importCrest(str_): moduleList.append(m) except: - logger.warning("Could not process module.") + logging.warning("Could not process module.") continue # Recalc to get slot numbers correct for T3 cruisers @@ -394,7 +394,7 @@ def importDna(string): string = string[string.index(str(id_)):] break except: - logger.warning("Exception caught in importDna") + logging.warning("Exception caught in importDna") pass string = string[:string.index("::") + 2] info = string.split(":") @@ -412,7 +412,7 @@ def logtransform(s_): return s_[:10] + "..." return s_ - logger.exception("Couldn't import ship data {0}", [logtransform(s) for s in info]) + logging.exception("Couldn't import ship data {0}", [logtransform(s) for s in info]) return None moduleList = [] @@ -439,7 +439,7 @@ def logtransform(s_): try: m = Module(item) except: - logger.warning("Exception caught in importDna") + logging.warning("Exception caught in importDna") continue # Add subsystems before modules to make sure T3 cruisers have subsystems installed if item.category.name == "Subsystem": @@ -488,7 +488,7 @@ def importEft(eftString): fit.ship = Citadel(ship) fit.name = fitName except: - logger.warning("Exception caught in importEft") + logging.warning("Exception caught in importEft") return # maintain map of drones and their quantities @@ -529,7 +529,7 @@ def importEft(eftString): item = sMkt.getItem(modName, eager="group.category") except: # if no data can be found (old names) - logger.warning("no data can be found (old names)") + logging.warning("no data can be found (old names)") continue if item.category.name == "Drone": @@ -556,7 +556,7 @@ def importEft(eftString): elif "boosterness" in item.attributes: fit.boosters.append(Booster(item)) else: - logger.error("Failed to import implant: {0}", line) + logging.error("Failed to import implant: {0}", line) # elif item.category.name == "Subsystem": # try: # subsystem = Module(item) @@ -682,7 +682,7 @@ def importEftCfg(shipname, contents, callback=None): try: droneItem = sMkt.getItem(droneName, eager="group.category") except: - logger.warning("Cannot get item.") + logging.warning("Cannot get item.") continue if droneItem.category.name == "Drone": # Add drone to the fitting @@ -704,7 +704,7 @@ def importEftCfg(shipname, contents, callback=None): try: implantItem = sMkt.getItem(entityData, eager="group.category") except: - logger.warning("Cannot get item.") + logging.warning("Cannot get item.") continue if implantItem.category.name != "Implant": continue @@ -720,7 +720,7 @@ def importEftCfg(shipname, contents, callback=None): try: boosterItem = sMkt.getItem(entityData, eager="group.category") except: - logger.warning("Cannot get item.") + logging.warning("Cannot get item.") continue # All boosters have implant category if boosterItem.category.name != "Implant": @@ -741,7 +741,7 @@ def importEftCfg(shipname, contents, callback=None): try: item = sMkt.getItem(cargoName) except: - logger.warning("Cannot get item.") + logging.warning("Cannot get item.") continue # Add Cargo to the fitting c = Cargo(item) @@ -755,7 +755,7 @@ def importEftCfg(shipname, contents, callback=None): try: modItem = sMkt.getItem(modName) except: - logger.warning("Cannot get item.") + logging.warning("Cannot get item.") continue # Create module @@ -777,7 +777,7 @@ def importEftCfg(shipname, contents, callback=None): if chargeItem.category.name == "Charge": m.charge = chargeItem except: - logger.warning("Cannot get item.") + logging.warning("Cannot get item.") pass # Append module to fit moduleList.append(m) @@ -796,7 +796,7 @@ def importEftCfg(shipname, contents, callback=None): wx.CallAfter(callback, None) # Skip fit silently if we get an exception except Exception: - logger.error("Caught exception on fit.") + logging.error("Caught exception on fit.") pass return fits @@ -821,7 +821,7 @@ def importXml(text, callback=None, encoding="utf-8"): except ValueError: f.ship = Citadel(sMkt.getItem(shipType)) except: - logger.warning("Caught exception on importXml") + logging.warning("Caught exception on importXml") continue hardwares = fitting.getElementsByTagName("hardware") moduleList = [] @@ -831,7 +831,7 @@ def importXml(text, callback=None, encoding="utf-8"): try: item = sMkt.getItem(moduleName, eager="group.category") except: - logger.warning("Caught exception on importXml") + logging.warning("Caught exception on importXml") continue if item: if item.category.name == "Drone": @@ -854,7 +854,7 @@ def importXml(text, callback=None, encoding="utf-8"): m = Module(item) # When item can't be added to any slot (unknown item or just charge), ignore it except ValueError: - logger.warning("item can't be added to any slot (unknown item or just charge), ignore it") + logging.warning("item can't be added to any slot (unknown item or just charge), ignore it") continue # Add subsystems before modules to make sure T3 cruisers have subsystems installed if item.category.name == "Subsystem": @@ -868,7 +868,7 @@ def importXml(text, callback=None, encoding="utf-8"): moduleList.append(m) except KeyboardInterrupt: - logger.warning("Keyboard Interrupt") + logging.warning("Keyboard Interrupt") continue # Recalc to get slot numbers correct for T3 cruisers @@ -1175,7 +1175,7 @@ def run(self): success, result = sPort.importFitFromFiles(self.paths, self.callback) if not success: # there was an error during processing - logger.error("Error while processing file import: {0}", result) + logging.error("Error while processing file import: {0}", result) wx.CallAfter(self.callback, -2, result) else: # Send done signal to GUI wx.CallAfter(self.callback, -1, result) diff --git a/service/prefetch.py b/service/prefetch.py index aa89117928..212950db4e 100644 --- a/service/prefetch.py +++ b/service/prefetch.py @@ -28,7 +28,7 @@ from eos.saveddata.character import Character as es_Character from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) class PrefetchThread(threading.Thread): def run(self): @@ -58,20 +58,20 @@ def run(self): if config.saveDB and os.path.isfile(config.saveDB): # If database exists, run migration after init'd database - logger.debug("Run database migration.") + logging.debug("Run database migration.") db.saveddata_meta.create_all() migration.update(db.saveddata_engine) # Import default database values # Import values that must exist otherwise Pyfa breaks - logger.debug("Import Required Database Values.") + logging.debug("Import Required Database Values.") DefaultDatabaseValues.importRequiredDefaults() - logger.debug("Starting database validation.") + logging.debug("Starting database validation.") database_cleanup_instance = DatabaseCleanup() database_cleanup_instance.OrphanedCharacterSkills(db.saveddata_engine) database_cleanup_instance.OrphanedFitCharacterIDs(db.saveddata_engine) database_cleanup_instance.OrphanedFitDamagePatterns(db.saveddata_engine) - logger.debug("Completed database validation.") + logging.debug("Completed database validation.") else: # If database does not exist, do not worry about migration. Simply diff --git a/service/price.py b/service/price.py index a49b914aa0..fa6f115bdb 100644 --- a/service/price.py +++ b/service/price.py @@ -24,7 +24,7 @@ from eos import db from service.network import Network, TimeoutError from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) VALIDITY = 24 * 60 * 60 # Price validity period, 24 hours REREQUEST = 4 * 60 * 60 # Re-request delay for failed fetches, 4 hours @@ -101,7 +101,7 @@ def fetchPrices(cls, prices): # If getting or processing data returned any errors except TimeoutError: # Timeout error deserves special treatment - logger.warning("Price fetch timout") + logging.warning("Price fetch timout") for typeID in priceMap.keys(): priceobj = priceMap[typeID] priceobj.time = time.time() + TIMEOUT @@ -109,7 +109,7 @@ def fetchPrices(cls, prices): del priceMap[typeID] except: # all other errors will pass and continue onward to the REREQUEST delay - logger.warning("Caught exception in fetchPrices") + logging.warning("Caught exception in fetchPrices") pass # if we get to this point, then we've got an error. Set to REREQUEST delay diff --git a/service/pycrest/eve.py b/service/pycrest/eve.py index 76e882957a..73247b2289 100644 --- a/service/pycrest/eve.py +++ b/service/pycrest/eve.py @@ -1,6 +1,6 @@ import base64 from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) import os import re import time @@ -67,7 +67,7 @@ def get(self, key): with open(self._getpath(key), 'rb') as f: return pickle.loads(zlib.decompress(f.read())) except IOError as ex: - logger.debug("IO error opening zip file. (May not exist yet.") + logging.debug("IO error opening zip file. (May not exist yet.") if ex.errno == 2: # file does not exist (yet) return None else: @@ -79,7 +79,7 @@ def invalidate(self, key): try: os.unlink(self._getpath(key)) except OSError as ex: - logger.debug("Caught exception in invalidate") + logging.debug("Caught exception in invalidate") if ex.errno == 2: # does not exist pass else: @@ -127,7 +127,7 @@ def __init__(self, additional_headers=None, user_agent=None, cache_dir=None, cac self.cache = DictCache() def get(self, resource, params=None): - logger.debug('Getting resource {0}', resource) + logging.debug('Getting resource {0}', resource) if params is None: params = {} @@ -147,15 +147,15 @@ def get(self, resource, params=None): key = (resource, frozenset(self._session.headers.items()), frozenset(prms.items())) cached = self.cache.get(key) if cached and cached['cached_until'] > time.time(): - logger.debug('Cache hit for resource {0} (params={1})', resource, prms) + logging.debug('Cache hit for resource {0} (params={1})', resource, prms) return cached elif cached: - logger.debug('Cache stale for resource {0} (params={1})', resource, prms) + logging.debug('Cache stale for resource {0} (params={1})', resource, prms) self.cache.invalidate(key) else: - logger.debug('Cache miss for resource {0} (params={1}', resource, prms) + logging.debug('Cache miss for resource {0} (params={1}', resource, prms) - logger.debug('Getting resource {0} (params={1})', resource, prms) + logging.debug('Getting resource {0} (params={1})', resource, prms) res = self._session.get(resource, params=prms) if res.status_code != 200: raise APIException("Got unexpected status code from server: %i" % res.status_code) diff --git a/service/server.py b/service/server.py index 02355afa85..bf9a7b378e 100644 --- a/service/server.py +++ b/service/server.py @@ -3,7 +3,7 @@ import socket import thread from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) import wx @@ -83,7 +83,7 @@ def server_bind(self): # Allow listening for x seconds sec = self.settings.get('timeout') - logger.debug("Running server for {0} seconds", sec) + logging.debug("Running server for {0} seconds", sec) self.socket.settimeout(0.5) self.max_tries = sec / self.socket.gettimeout() @@ -97,17 +97,17 @@ def get_request(self): sock.settimeout(None) return (sock, addr) except socket.timeout: - logger.warning("Server timed out waiting for connection") + logging.warning("Server timed out waiting for connection") pass def stop(self): self.run = False def handle_timeout(self): - # logger.debug("Number of tries: %d"%self.tries) + # logging.debug("Number of tries: %d"%self.tries) self.tries += 1 if self.tries == self.max_tries: - logger.debug("Server timed out waiting for connection") + logging.debug("Server timed out waiting for connection") self.stop() def serve(self, callback): @@ -116,7 +116,7 @@ def serve(self, callback): try: self.handle_request() except TypeError: - logger.debug("Caught exception in serve") + logging.debug("Caught exception in serve") pass self.server_close() diff --git a/service/update.py b/service/update.py index 237eafd0d6..fffa91242b 100644 --- a/service/update.py +++ b/service/update.py @@ -28,7 +28,7 @@ from service.network import Network from service.settings import UpdateSettings from logbook import Logger -logger = Logger(__name__) +logging = Logger(__name__) class CheckUpdateThread(threading.Thread): @@ -82,7 +82,7 @@ def run(self): wx.CallAfter(self.callback, release) # Singularity -> Singularity break except: - logger.warning("Caught exception in run") + logging.warning("Caught exception in run") pass def versiontuple(self, v): From 83920a39b5f447cd495894a0206649de8584e88e Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Sat, 4 Feb 2017 23:19:10 -0800 Subject: [PATCH 24/27] Fix reference to logging module --- eos/saveddata/fit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py index b551b2899e..219691bc6f 100644 --- a/eos/saveddata/fit.py +++ b/eos/saveddata/fit.py @@ -635,7 +635,7 @@ def __runCommandBoosts(self, runTime="normal"): del self.commandBonuses[warfareBuffID] def calculateModifiedAttributes(self, targetFit=None, withBoosters=False, dirtyStorage=None): - timer = Timer(u'Fit: {}, {}'.format(self.ID, self.name), logger) + timer = Timer(u'Fit: {}, {}'.format(self.ID, self.name), logging) logging.info("Starting fit calculation on: {0}, withBoosters: {1}", self, withBoosters) shadow = False From 591e6238d5f5e55ee994518e2bbb8366ac2bc961 Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Sun, 5 Feb 2017 20:56:22 -0800 Subject: [PATCH 25/27] Don't redirect stdout and stderror if in debug mode --- pyfa.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyfa.py b/pyfa.py index c93e44c07f..f1cacc5132 100755 --- a/pyfa.py +++ b/pyfa.py @@ -210,7 +210,7 @@ def flush(self): with logging_setup.threadbound(): # Don't redirect if frozen - if not hasattr(sys, 'frozen'): + if not hasattr(sys, 'frozen') and not options.debug: # Output all stdout (print) messages as warnings try: sys.stdout = LoggerWriter(logging.warning) From 8723f512202d750d2420956ba5b731287a674a83 Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Sun, 5 Feb 2017 21:57:18 -0800 Subject: [PATCH 26/27] Improve logging control, add new preference --- pyfa.py | 46 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/pyfa.py b/pyfa.py index f1cacc5132..aec6566ee8 100755 --- a/pyfa.py +++ b/pyfa.py @@ -25,7 +25,8 @@ from optparse import OptionParser, BadOptionError, AmbiguousOptionError -from logbook import TimedRotatingFileHandler, Logger, StreamHandler, NestedSetup, FingersCrossedHandler, NullHandler +from logbook import TimedRotatingFileHandler, Logger, StreamHandler, NestedSetup, FingersCrossedHandler, NullHandler, \ + CRITICAL, ERROR, WARNING, DEBUG, INFO logging = Logger(__name__) @@ -71,9 +72,23 @@ def flush(self): parser.add_option("-d", "--debug", action="store_true", dest="debug", help="Set logger to debug level.", default=False) parser.add_option("-t", "--title", action="store", dest="title", help="Set Window Title", default=None) parser.add_option("-s", "--savepath", action="store", dest="savepath", help="Set the folder for savedata", default=None) +parser.add_option("-l", "--logginglevel", action="store", dest="logginglevel", help="Set the desired logging level (Critical, Error, Warning, Info, Debug)", default="Error") (options, args) = parser.parse_args() +if options.logginglevel == "Critical": + options.logginglevel = CRITICAL +elif options.logginglevel == "Error": + options.logginglevel = ERROR +elif options.logginglevel == "Warning": + options.logginglevel = WARNING +elif options.logginglevel == "Info": + options.logginglevel = INFO +elif options.logginglevel == "Debug": + options.logginglevel = DEBUG +else: + options.logginglevel = ERROR + if not hasattr(sys, 'frozen'): if sys.version_info < (2, 6) or sys.version_info > (3, 0): @@ -165,8 +180,9 @@ def flush(self): # if we run out of setup handling NullHandler(), StreamHandler( - sys.stdout, - bubble=False + sys.stdout, + bubble=False, + level=options.logginglevel ), TimedRotatingFileHandler( savePath_Destination, @@ -183,17 +199,17 @@ def flush(self): # if we run out of setup handling NullHandler(), FingersCrossedHandler( - TimedRotatingFileHandler( - savePath_Destination, - level=0, - backup_count=3, - bubble=False, - date_format='%Y-%m-%d', - ), - # action_level=Warning, - # buffer_size=1000, - # pull_information=True, - # reset=False, + TimedRotatingFileHandler( + savePath_Destination, + level=0, + backup_count=3, + bubble=False, + date_format='%Y-%m-%d', + ), + # action_level=Warning, + # buffer_size=1000, + # pull_information=True, + # reset=False, ) ]) except: @@ -246,6 +262,8 @@ def flush(self): logging.debug("Show GUI") MainFrame(options.title) + logging.critical("Force logging") + # run the gui mainloop logging.debug("Run MainLoop()") pyfa.MainLoop() From 8ed3f8de453d39828c1cec46d6d3d1a693143000 Mon Sep 17 00:00:00 2001 From: Ebag333 Date: Sun, 5 Feb 2017 22:04:24 -0800 Subject: [PATCH 27/27] put buffer size back. --- pyfa.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyfa.py b/pyfa.py index aec6566ee8..8cea7e3d7a 100755 --- a/pyfa.py +++ b/pyfa.py @@ -206,8 +206,8 @@ def flush(self): bubble=False, date_format='%Y-%m-%d', ), - # action_level=Warning, - # buffer_size=1000, + action_level=ERROR, + buffer_size=1000, # pull_information=True, # reset=False, )