Roll up all changes from #962 as the base has been massively changed by code cleanups. Rename our logging to a universal pyfalog to avoid shadowing either Logging or Logbook loggers

This commit is contained in:
Ebag333
2017-02-11 11:51:53 -08:00
parent beed414429
commit 3b185e1bcb
50 changed files with 482 additions and 262 deletions

View File

@@ -20,7 +20,7 @@
import copy
import itertools
import json
import logging
from logbook import Logger
import threading
from codecs import open
from xml.etree import ElementTree
@@ -39,7 +39,7 @@ from eos.saveddata.character import Character as es_Character
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__)
pyfalog = Logger(__name__)
class CharacterImportThread(threading.Thread):
@@ -72,7 +72,7 @@ class CharacterImportThread(threading.Thread):
charFile = open(path, mode='r').read()
doc = minidom.parseString(charFile)
if doc.documentElement.tagName not in ("SerializableCCPCharacter", "SerializableUriCharacter"):
logger.error("Incorrect EVEMon XML sheet")
pyfalog.error("Incorrect EVEMon XML sheet")
raise RuntimeError("Incorrect EVEMon XML sheet")
name = doc.getElementsByTagName("name")[0].firstChild.nodeValue
skill_els = doc.getElementsByTagName("skill")
@@ -84,7 +84,7 @@ class CharacterImportThread(threading.Thread):
"level": int(skill.getAttribute("level")),
})
else:
logger.error("Attempted to import unknown skill %s (ID: %s) (Level: %s)",
pyfalog.error("Attempted to import unknown skill %s (ID: %s) (Level: %s)",
skill.getAttribute("name"),
skill.getAttribute("typeID"),
skill.getAttribute("level"),
@@ -92,8 +92,8 @@ class CharacterImportThread(threading.Thread):
char = sCharacter.new(name + " (EVEMon)")
sCharacter.apiUpdateCharSheet(char.ID, skills)
except Exception, e:
logger.error("Exception on character import:")
logger.error(e)
pyfalog.error("Exception on character import:")
pyfalog.error(e)
continue
wx.CallAfter(self.callback)
@@ -304,7 +304,7 @@ class Character(object):
@staticmethod
def rename(char, newName):
if char.name in ("All 0", "All 5"):
logger.info("Cannot rename built in characters.")
pyfalog.info("Cannot rename built in characters.")
else:
char.name = newName
eos.db.commit()
@@ -404,7 +404,7 @@ class Character(object):
def addImplant(charID, itemID):
char = eos.db.getCharacter(charID)
if char.ro:
logger.error("Trying to add implant to read-only character")
pyfalog.error("Trying to add implant to read-only character")
return
implant = es_Implant(eos.db.getItem(itemID))

View File

@@ -1,7 +1,7 @@
# noinspection PyPackageRequirements
import wx
import thread
import logging
from logbook import Logger
import threading
import copy
import uuid
@@ -15,7 +15,7 @@ from service.settings import CRESTSettings
from service.server import StoppableHTTPServer, AuthHandler
from service.pycrest.eve import EVE
logger = logging.getLogger(__name__)
pyfalog = Logger(__name__)
class Servers(Enum):
@@ -153,17 +153,17 @@ class Crest(object):
def logout(self):
"""Logout of implicit character"""
logging.debug("Character logout")
pyfalog.debug("Character logout")
self.implicitCharacter = None
wx.PostEvent(self.mainFrame, GE.SsoLogout(type=self.settings.get('mode')))
def stopServer(self):
logging.debug("Stopping Server")
pyfalog.debug("Stopping Server")
self.httpd.stop()
self.httpd = None
def startServer(self):
logging.debug("Starting server")
pyfalog.debug("Starting server")
if self.httpd:
self.stopServer()
time.sleep(1)
@@ -179,10 +179,10 @@ class Crest(object):
return
if message['state'][0] != self.state:
logger.warn("OAUTH state mismatch")
pyfalog.warn("OAUTH state mismatch")
return
logger.debug("Handling CREST login with: %s" % message)
pyfalog.debug("Handling CREST login with: %s" % message)
if 'access_token' in message: # implicit
eve = copy.deepcopy(self.eve)
@@ -196,7 +196,7 @@ class Crest(object):
eve()
info = eve.whoami()
logger.debug("Got character info: %s" % info)
pyfalog.debug("Got character info: %s" % info)
self.implicitCharacter = CrestChar(info['CharacterID'], info['CharacterName'])
self.implicitCharacter.eve = eve
@@ -209,7 +209,7 @@ class Crest(object):
eve()
info = eve.whoami()
logger.debug("Got character info: %s" % info)
pyfalog.debug("Got character info: %s" % info)
# check if we have character already. If so, simply replace refresh_token
char = self.getCrestCharacter(int(info['CharacterID']))

View File

@@ -18,7 +18,7 @@
# ===============================================================================
import copy
import logging
from logbook import Logger
import eos.db
from eos.saveddata.booster import Booster as es_Booster
@@ -36,7 +36,7 @@ from service.character import Character
from service.damagePattern import DamagePattern
from service.settings import SettingsProvider
logger = logging.getLogger(__name__)
pyfalog = Logger(__name__)
class Fit(object):
@@ -50,6 +50,7 @@ class Fit(object):
return cls.instance
def __init__(self):
pyfalog.debug("Initialize Fit class")
self.pattern = DamagePattern.getInstance().getDamagePattern("Uniform")
self.targetResists = None
self.character = saveddata_Character.getAll5()
@@ -1010,7 +1011,7 @@ class Fit(object):
self.recalc(fit)
def recalc(self, fit, withBoosters=True):
logger.debug("=" * 10 + "recalc" + "=" * 10)
pyfalog.debug("=" * 10 + "recalc" + "=" * 10)
if fit.factorReload is not self.serviceFittingOptions["useGlobalForceReload"]:
fit.factorReload = self.serviceFittingOptions["useGlobalForceReload"]
fit.clear()

View File

@@ -19,7 +19,7 @@
import re
import threading
import logging
from logbook import Logger
import Queue
# noinspection PyPackageRequirements
@@ -41,7 +41,7 @@ try:
except ImportError:
from utils.compat import OrderedDict
logger = logging.getLogger(__name__)
pyfalog = Logger(__name__)
# Event which tells threads dependent on Market that it's initialized
mktRdy = threading.Event()
@@ -74,12 +74,12 @@ class ShipBrowserWorkerThread(threading.Thread):
wx.CallAfter(callback, (id_, set_))
except:
pass
pyfalog.debug("Callback failed.")
finally:
try:
queue.task_done()
except:
pass
pyfalog.debug("Queue task done failed.")
class PriceWorkerThread(threading.Thread):
@@ -88,9 +88,11 @@ class PriceWorkerThread(threading.Thread):
self.name = "PriceWorker"
def run(self):
pyfalog.debug("Run start")
self.queue = Queue.Queue()
self.wait = {}
self.processUpdates()
pyfalog.debug("Run end")
def processUpdates(self):
queue = self.queue
@@ -440,7 +442,7 @@ class Market(object):
else:
raise TypeError("Need Item object, integer, float or string as argument")
except:
logger.error("Could not get item: %s", identity)
pyfalog.error("Could not get item: %s", identity)
raise
return item
@@ -834,7 +836,7 @@ class Market(object):
try:
callback(requests)
except Exception:
pass
pyfalog.debug("Callback failed.")
eos.db.commit()
self.priceWorkerThread.trigger(requests, cb)
@@ -850,7 +852,7 @@ class Market(object):
try:
callback(item)
except:
pass
pyfalog.debug("Callback failed.")
self.priceWorkerThread.setToWait(item.ID, cb)

View File

@@ -20,7 +20,7 @@
import re
import os
import xml.dom
import logging
from logbook import Logger
import collections
import json
import threading
@@ -50,7 +50,7 @@ from service.market import Market
if 'wxMac' not in wx.PlatformInfo or ('wxMac' in wx.PlatformInfo and wx.VERSION >= (3, 0)):
from service.crest import Crest
logger = logging.getLogger("pyfa.service.port")
pyfalog = Logger(__name__)
try:
from collections import OrderedDict
@@ -134,21 +134,21 @@ class Port(object):
savebom = bom
if codec_found is None:
logger.info("Unicode BOM not found in file %s.", path)
pyfalog.info("Unicode BOM not found in file %s.", 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)
pyfalog.info("Attempting to decode file %s using %s page.", path, page)
srcString = unicode(srcString, page)
codec_found = page
logger.info("File %s decoded using %s page.", path, page)
pyfalog.info("File %s decoded using %s page.", path, page)
except UnicodeDecodeError:
logger.info("Error unicode decoding %s from page %s, trying next codec", path, page)
pyfalog.info("Error unicode decoding %s from page %s, trying next codec", path, page)
else:
break
else:
logger.info("Unicode BOM detected in %s, using %s page.", path, codec_found)
pyfalog.info("Unicode BOM detected in %s, using %s page.", path, codec_found)
srcString = unicode(srcString[len(savebom):], codec_found)
else:
@@ -167,7 +167,7 @@ class Port(object):
except xml.parsers.expat.ExpatError:
return False, "Malformed XML in %s" % path
except Exception:
logger.exception("Unknown exception processing: %s", path)
pyfalog.exception("Unknown exception processing: %s", path)
return False, "Unknown Error while processing %s" % path
IDs = []
@@ -340,6 +340,7 @@ class Port(object):
except ValueError:
f.ship = Citadel(sMkt.getItem(fit['ship']['id']))
except:
pyfalog.warning("Caught exception in importCrest")
return None
items = fit['items']
@@ -365,6 +366,7 @@ class Port(object):
m = Module(item)
# When item can't be added to any slot (unknown item or just charge), ignore it
except ValueError:
pyfalog.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":
@@ -377,6 +379,7 @@ class Port(object):
moduleList.append(m)
except:
pyfalog.warning("Could not process module.")
continue
# Recalc to get slot numbers correct for T3 cruisers
@@ -405,6 +408,7 @@ class Port(object):
string = string[string.index(str(id_)):]
break
except:
pyfalog.warning("Exception caught in importDna")
pass
string = string[:string.index("::") + 2]
info = string.split(":")
@@ -422,7 +426,7 @@ class Port(object):
return s_[:10] + "..."
return s_
logger.exception("Couldn't import ship data %r", [logtransform(s) for s in info])
pyfalog.exception("Couldn't import ship data {0}", [logtransform(s) for s in info])
return None
moduleList = []
@@ -449,6 +453,7 @@ class Port(object):
try:
m = Module(item)
except:
pyfalog.warning("Exception caught in importDna")
continue
# Add subsystems before modules to make sure T3 cruisers have subsystems installed
if item.category.name == "Subsystem":
@@ -497,6 +502,7 @@ class Port(object):
fit.ship = Citadel(ship)
fit.name = fitName
except:
pyfalog.warning("Exception caught in importEft")
return
# maintain map of drones and their quantities
@@ -537,6 +543,7 @@ class Port(object):
item = sMkt.getItem(modName, eager="group.category")
except:
# if no data can be found (old names)
pyfalog.warning("no data can be found (old names)")
continue
if item.category.name == "Drone":
@@ -563,7 +570,7 @@ class Port(object):
elif "boosterness" in item.attributes:
fit.boosters.append(Booster(item))
else:
logger.error("Failed to import implant: %s", line)
pyfalog.error("Failed to import implant: {0}", line)
# elif item.category.name == "Subsystem":
# try:
# subsystem = Module(item)
@@ -689,6 +696,7 @@ class Port(object):
try:
droneItem = sMkt.getItem(droneName, eager="group.category")
except:
pyfalog.warning("Cannot get item.")
continue
if droneItem.category.name == "Drone":
# Add drone to the fitting
@@ -710,6 +718,7 @@ class Port(object):
try:
implantItem = sMkt.getItem(entityData, eager="group.category")
except:
pyfalog.warning("Cannot get item.")
continue
if implantItem.category.name != "Implant":
continue
@@ -725,6 +734,7 @@ class Port(object):
try:
boosterItem = sMkt.getItem(entityData, eager="group.category")
except:
pyfalog.warning("Cannot get item.")
continue
# All boosters have implant category
if boosterItem.category.name != "Implant":
@@ -745,6 +755,7 @@ class Port(object):
try:
item = sMkt.getItem(cargoName)
except:
pyfalog.warning("Cannot get item.")
continue
# Add Cargo to the fitting
c = Cargo(item)
@@ -758,6 +769,7 @@ class Port(object):
try:
modItem = sMkt.getItem(modName)
except:
pyfalog.warning("Cannot get item.")
continue
# Create module
@@ -779,6 +791,7 @@ class Port(object):
if chargeItem.category.name == "Charge":
m.charge = chargeItem
except:
pyfalog.warning("Cannot get item.")
pass
# Append module to fit
moduleList.append(m)
@@ -797,6 +810,7 @@ class Port(object):
wx.CallAfter(callback, None)
# Skip fit silently if we get an exception
except Exception:
pyfalog.error("Caught exception on fit.")
pass
return fits
@@ -821,6 +835,7 @@ class Port(object):
except ValueError:
f.ship = Citadel(sMkt.getItem(shipType))
except:
pyfalog.warning("Caught exception on importXml")
continue
hardwares = fitting.getElementsByTagName("hardware")
moduleList = []
@@ -830,6 +845,7 @@ class Port(object):
try:
item = sMkt.getItem(moduleName, eager="group.category")
except:
pyfalog.warning("Caught exception on importXml")
continue
if item:
if item.category.name == "Drone":
@@ -852,6 +868,7 @@ class Port(object):
m = Module(item)
# When item can't be added to any slot (unknown item or just charge), ignore it
except ValueError:
pyfalog.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":
@@ -865,6 +882,7 @@ class Port(object):
moduleList.append(m)
except KeyboardInterrupt:
pyfalog.warning("Keyboard Interrupt")
continue
# Recalc to get slot numbers correct for T3 cruisers
@@ -1171,7 +1189,7 @@ class FitImportThread(threading.Thread):
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)
pyfalog.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)

View File

@@ -25,9 +25,9 @@ from eos.db import migration
from eos.db.saveddata.loadDefaultDatabaseValues import DefaultDatabaseValues
from eos.db.saveddata.databaseRepair import DatabaseCleanup
import logging
from logbook import Logger
logger = logging.getLogger(__name__)
pyfalog = Logger(__name__)
# Make sure the saveddata db exists
if config.savePath and not os.path.exists(config.savePath):
@@ -35,14 +35,16 @@ if config.savePath and not os.path.exists(config.savePath):
if config.saveDB and os.path.isfile(config.saveDB):
# If database exists, run migration after init'd database
pyfalog.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
pyfalog.debug("Import Required Database Values.")
DefaultDatabaseValues.importRequiredDefaults()
# Finds and fixes database corruption issues.
logging.debug("Starting database validation.")
pyfalog.debug("Starting database validation.")
database_cleanup_instance = DatabaseCleanup()
database_cleanup_instance.OrphanedCharacterSkills(db.saveddata_engine)
database_cleanup_instance.OrphanedFitCharacterIDs(db.saveddata_engine)
@@ -52,7 +54,7 @@ if config.saveDB and os.path.isfile(config.saveDB):
database_cleanup_instance.OrphanedFitIDItemID(db.saveddata_engine)
database_cleanup_instance.NullDamageTargetPatternValues(db.saveddata_engine)
database_cleanup_instance.DuplicateSelectedAmmoName(db.saveddata_engine)
logging.debug("Completed database validation.")
pyfalog.debug("Completed database validation.")
else:
# If database does not exist, do not worry about migration. Simply

View File

@@ -23,6 +23,8 @@ from xml.dom import minidom
from eos import db
from service.network import Network, TimeoutError
from logbook import Logger
pyfalog = Logger(__name__)
VALIDITY = 24 * 60 * 60 # Price validity period, 24 hours
REREQUEST = 4 * 60 * 60 # Re-request delay for failed fetches, 4 hours
@@ -114,6 +116,7 @@ class Price(object):
# If getting or processing data returned any errors
except TimeoutError:
# Timeout error deserves special treatment
pyfalog.warning("Price fetch timout")
for typeID in priceMap.keys():
priceobj = priceMap[typeID]
priceobj.time = time.time() + TIMEOUT
@@ -121,6 +124,7 @@ class Price(object):
del priceMap[typeID]
except:
# all other errors will pass and continue onward to the REREQUEST delay
pyfalog.warning("Caught exception in fetchPrices")
pass
# if we get to this point, then we've got an error. Set to REREQUEST delay

View File

@@ -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"

View File

@@ -1,5 +1,5 @@
import base64
import logging
from logbook import Logger
import os
import re
import time
@@ -20,7 +20,7 @@ except ImportError: # pragma: no cover
# noinspection PyPep8Naming
import cPickle as pickle
logger = logging.getLogger("pycrest.eve")
pyfalog = Logger(__name__)
cache_re = re.compile(r'max-age=([0-9]+)')
@@ -58,6 +58,7 @@ class FileCache(APICache):
with open(self._getpath(key), 'rb') as f:
return pickle.loads(zlib.decompress(f.read()))
except IOError as ex:
pyfalog.debug("IO error opening zip file. (May not exist yet)")
if ex.errno == 2: # file does not exist (yet)
return None
else:
@@ -69,6 +70,8 @@ class FileCache(APICache):
try:
os.unlink(self._getpath(key))
except OSError as ex:
pyfalog.debug("Caught exception in invalidate")
pyfalog.debug(ex)
if ex.errno == 2: # does not exist
pass
else:
@@ -116,7 +119,7 @@ class APIConnection(object):
self.cache = DictCache()
def get(self, resource, params=None):
logger.debug('Getting resource %s', resource)
pyfalog.debug('Getting resource %s', resource)
if params is None:
params = {}
@@ -136,15 +139,15 @@ class APIConnection(object):
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)
pyfalog.debug('Cache hit for resource %s (params=%s)', resource, prms)
return cached
elif cached:
logger.debug('Cache stale for resource %s (params=%s)', resource, prms)
pyfalog.debug('Cache stale for resource %s (params=%s)', resource, prms)
self.cache.invalidate(key)
else:
logger.debug('Cache miss for resource %s (params=%s', resource, prms)
pyfalog.debug('Cache miss for resource %s (params=%s', resource, prms)
logger.debug('Getting resource %s (params=%s)', resource, prms)
pyfalog.debug('Getting resource %s (params=%s)', 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)

View File

@@ -2,14 +2,13 @@ import BaseHTTPServer
import urlparse
import socket
import thread
import logging
from logbook import Logger
# noinspection PyPackageRequirements
import wx
from service.settings import CRESTSettings
logger = logging.getLogger(__name__)
pyfalog = Logger(__name__)
# noinspection PyPep8
HTML = '''
@@ -85,7 +84,7 @@ class StoppableHTTPServer(BaseHTTPServer.HTTPServer):
# Allow listening for x seconds
sec = self.settings.get('timeout')
logger.debug("Running server for %d seconds", sec)
pyfalog.debug("Running server for {0} seconds", sec)
self.socket.settimeout(0.5)
self.max_tries = sec / self.socket.gettimeout()
@@ -99,16 +98,17 @@ class StoppableHTTPServer(BaseHTTPServer.HTTPServer):
sock.settimeout(None)
return sock, addr
except socket.timeout:
pyfalog.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)
# pyfalog.debug("Number of tries: %d"%self.tries)
self.tries += 1
if self.tries == self.max_tries:
logger.debug("Server timed out waiting for connection")
pyfalog.debug("Server timed out waiting for connection")
self.stop()
def serve(self, callback):
@@ -117,6 +117,7 @@ class StoppableHTTPServer(BaseHTTPServer.HTTPServer):
try:
self.handle_request()
except TypeError:
pyfalog.debug("Caught exception in serve")
pass
self.server_close()

View File

@@ -29,6 +29,9 @@ import dateutil.parser
import config
from service.network import Network
from service.settings import UpdateSettings
from logbook import Logger
pyfalog = Logger(__name__)
class CheckUpdateThread(threading.Thread):
@@ -83,6 +86,7 @@ class CheckUpdateThread(threading.Thread):
wx.CallAfter(self.callback, release) # Singularity -> Singularity
break
except:
pyfalog.warning("Caught exception in run")
pass
@staticmethod