Merge remote-tracking branch 'ebag/SorryNotSorryBlitzmann' into SorryNotSorryBlitzmann

This commit is contained in:
blitzman
2017-02-11 10:46:59 -05:00
29 changed files with 98 additions and 89 deletions

View File

@@ -38,7 +38,7 @@ class FitDpsGraph(Graph):
fit = self.fit
total = 0
distance = data["distance"] * 1000
abssort = lambda val: -abs(val - 1)
abssort = lambda _val: -abs(_val - 1)
for mod in fit.modules:
if not mod.isEmpty and mod.state >= State.ACTIVE:

View File

@@ -212,11 +212,11 @@ class ModifiedAttributeDict(collections.MutableMapping):
for penalizedMultipliers in penalizedMultiplierGroups.itervalues():
# A quick explanation of how this works:
# 1: Bonuses and penalties are calculated seperately, so we'll have to filter each of them
l1 = filter(lambda val: val > 1, penalizedMultipliers)
l2 = filter(lambda val: val < 1, penalizedMultipliers)
l1 = filter(lambda _val: _val > 1, penalizedMultipliers)
l2 = filter(lambda _val: _val < 1, penalizedMultipliers)
# 2: The most significant bonuses take the smallest penalty,
# This means we'll have to sort
abssort = lambda val: -abs(val - 1)
abssort = lambda _val: -abs(_val - 1)
l1.sort(key=abssort)
l2.sort(key=abssort)
# 3: The first module doesn't get penalized at all

View File

@@ -133,11 +133,11 @@ class Booster(HandledItem, ItemAttrShortcut):
@validates("ID", "itemID", "ammoID", "active")
def validator(self, key, val):
map = {"ID": lambda val: isinstance(val, int),
"itemID": lambda val: isinstance(val, int),
"ammoID": lambda val: isinstance(val, int),
"active": lambda val: isinstance(val, bool),
"slot": lambda val: isinstance(val, int) and 1 <= val <= 3}
map = {"ID": lambda _val: isinstance(_val, int),
"itemID": lambda _val: isinstance(_val, int),
"ammoID": lambda _val: isinstance(_val, int),
"active": lambda _val: isinstance(_val, bool),
"slot": lambda _val: isinstance(_val, int) and 1 <= _val <= 3}
if not map[key](val):
raise ValueError(str(val) + " is not a valid value for " + key)

View File

@@ -71,9 +71,9 @@ class Cargo(HandledItem, ItemAttrShortcut):
@validates("fitID", "itemID", "amount")
def validator(self, key, val):
map = {"fitID": lambda val: isinstance(val, int),
"itemID": lambda val: isinstance(val, int),
"amount": lambda val: isinstance(val, int)}
map = {"fitID": lambda _val: isinstance(_val, int),
"itemID": lambda _val: isinstance(_val, int),
"amount": lambda _val: isinstance(_val, int)}
if key == "amount" and val > sys.maxint:
val = sys.maxint

View File

@@ -256,10 +256,10 @@ class Character(object):
@validates("ID", "name", "apiKey", "ownerID")
def validator(self, key, val):
map = {"ID": lambda val: isinstance(val, int),
"name": lambda val: True,
"apiKey": lambda val: val is None or (isinstance(val, basestring) and len(val) > 0),
"ownerID": lambda val: isinstance(val, int) or val is None}
map = {"ID": lambda _val: isinstance(_val, int),
"name": lambda _val: True,
"apiKey": lambda _val: _val is None or (isinstance(_val, basestring) and len(_val) > 0),
"ownerID": lambda _val: isinstance(_val, int) or _val is None}
if not map[key](val):
raise ValueError(str(val) + " is not a valid value for " + key)
@@ -377,8 +377,8 @@ class Skill(HandledItem):
if hasattr(self, "_Skill__ro") and self.__ro is True and key != "characterID":
raise ReadOnlyException()
map = {"characterID": lambda val: isinstance(val, int),
"skillID": lambda val: isinstance(val, int)}
map = {"characterID": lambda _val: isinstance(_val, int),
"skillID": lambda _val: isinstance(_val, int)}
if not map[key](val):
raise ValueError(str(val) + " is not a valid value for " + key)

View File

@@ -186,11 +186,11 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
@validates("ID", "itemID", "chargeID", "amount", "amountActive")
def validator(self, key, val):
map = {"ID": lambda val: isinstance(val, int),
"itemID": lambda val: isinstance(val, int),
"chargeID": lambda val: isinstance(val, int),
"amount": lambda val: isinstance(val, int) and val >= 0,
"amountActive": lambda val: isinstance(val, int) and self.amount >= val >= 0}
map = {"ID": lambda _val: isinstance(_val, int),
"itemID": lambda _val: isinstance(_val, int),
"chargeID": lambda _val: isinstance(_val, int),
"amount": lambda _val: isinstance(_val, int) and _val >= 0,
"amountActive": lambda _val: isinstance(_val, int) and self.amount >= _val >= 0}
if not map[key](val):
raise ValueError(str(val) + " is not a valid value for " + key)

View File

@@ -219,10 +219,10 @@ class Fighter(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
@validates("ID", "itemID", "chargeID", "amount", "amountActive")
def validator(self, key, val):
map = {"ID": lambda val: isinstance(val, int),
"itemID": lambda val: isinstance(val, int),
"chargeID": lambda val: isinstance(val, int),
"amount": lambda val: isinstance(val, int) and val >= -1,
map = {"ID": lambda _val: isinstance(_val, int),
"itemID": lambda _val: isinstance(_val, int),
"chargeID": lambda _val: isinstance(_val, int),
"amount": lambda _val: isinstance(_val, int) and _val >= -1,
}
if not map[key](val):

View File

@@ -364,9 +364,9 @@ class Fit(object):
@validates("ID", "ownerID", "shipID")
def validator(self, key, val):
map = {"ID": lambda val: isinstance(val, int),
"ownerID": lambda val: isinstance(val, int) or val is None,
"shipID": lambda val: isinstance(val, int) or val is None}
map = {"ID": lambda _val: isinstance(_val, int),
"ownerID": lambda _val: isinstance(_val, int) or _val is None,
"shipID": lambda _val: isinstance(_val, int) or _val is None}
if not map[key](val):
raise ValueError(str(val) + " is not a valid value for " + key)
@@ -1041,8 +1041,8 @@ class Fit(object):
repairers.append(mod)
# Sort repairers by efficiency. We want to use the most efficient repairers first
repairers.sort(key=lambda mod: mod.getModifiedItemAttr(
groupAttrMap[mod.item.group.name]) / mod.getModifiedItemAttr("capacitorNeed"), reverse=True)
repairers.sort(key=lambda _mod: _mod.getModifiedItemAttr(
groupAttrMap[_mod.item.group.name]) / _mod.getModifiedItemAttr("capacitorNeed"), reverse=True)
# Loop through every module until we're above peak recharge
# Most efficient first, as we sorted earlier.

View File

@@ -99,9 +99,9 @@ class Implant(HandledItem, ItemAttrShortcut):
@validates("fitID", "itemID", "active")
def validator(self, key, val):
map = {"fitID": lambda val: isinstance(val, int),
"itemID": lambda val: isinstance(val, int),
"active": lambda val: isinstance(val, bool)}
map = {"fitID": lambda _val: isinstance(_val, int),
"itemID": lambda _val: isinstance(_val, int),
"active": lambda _val: isinstance(_val, bool)}
if not map[key](val):
raise ValueError(str(val) + " is not a valid value for " + key)

View File

@@ -581,9 +581,9 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
@validates("ID", "itemID", "ammoID")
def validator(self, key, val):
map = {"ID": lambda val: isinstance(val, int),
"itemID": lambda val: val is None or isinstance(val, int),
"ammoID": lambda val: isinstance(val, int)}
map = {"ID": lambda _val: isinstance(_val, int),
"itemID": lambda _val: _val is None or isinstance(_val, int),
"ammoID": lambda _val: isinstance(_val, int)}
if not map[key](val):
raise ValueError(str(val) + " is not a valid value for " + key)

View File

@@ -49,10 +49,10 @@ class User(object):
@validates("ID", "username", "password", "admin")
def validator(self, key, val):
map = {"ID": lambda val: isinstance(val, int),
"username": lambda val: isinstance(val, basestring),
"password": lambda val: isinstance(val, basestring) and len(val) == 96,
"admin": lambda val: isinstance(val, bool)}
map = {"ID": lambda _val: isinstance(_val, int),
"username": lambda _val: isinstance(_val, basestring),
"password": lambda _val: isinstance(_val, basestring) and len(_val) == 96,
"admin": lambda _val: isinstance(_val, bool)}
if not map[key](val):
raise ValueError(str(val) + " is not a valid value for " + key)

View File

@@ -21,7 +21,7 @@
import wx
import gui.display as d
import gui.globalEvents as GE
import gui.marketBrowser as mb
import gui.marketBrowser as marketBrowser
from gui.builtinViewColumns.state import State
from gui.contextMenu import ContextMenu
from service.fit import Fit
@@ -30,7 +30,6 @@ from service.fit import Fit
class BoosterViewDrop(wx.PyDropTarget):
def __init__(self, dropFn, *args, **kwargs):
super(BoosterViewDrop, self).__init__(*args, **kwargs)
wx.PyDropTarget.__init__(self)
self.dropFn = dropFn
# this is really transferring an EVE itemID
self.dropData = wx.PyTextDataObject()
@@ -54,7 +53,7 @@ class BoosterView(d.Display):
self.lastFitId = None
self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged)
self.mainFrame.Bind(mb.ITEM_SELECTED, self.addItem)
self.mainFrame.Bind(marketBrowser.ITEM_SELECTED, self.addItem)
self.Bind(wx.EVT_LEFT_DCLICK, self.removeItem)
self.Bind(wx.EVT_LEFT_DOWN, self.click)
@@ -77,7 +76,7 @@ class BoosterView(d.Display):
"""
if data[0] == "market":
wx.PostEvent(self.mainFrame, mb.ItemSelected(itemID=int(data[1])))
wx.PostEvent(self.mainFrame, marketBrowser.ItemSelected(itemID=int(data[1])))
def kbEvent(self, event):
keycode = event.GetKeyCode()

View File

@@ -23,7 +23,7 @@ from gui.statsView import StatsView
from gui.bitmapLoader import BitmapLoader
from gui.utils.numberFormatter import formatAmount
import gui.mainFrame
import gui.builtinStatsViews.resistancesViewFull as rvf
from gui.builtinStatsViews.resistancesViewFull import EFFECTIVE_HP_TOGGLED
from service.fit import Fit
@@ -34,7 +34,7 @@ class RechargeViewFull(StatsView):
StatsView.__init__(self)
self.parent = parent
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
self.mainFrame.Bind(rvf.EFFECTIVE_HP_TOGGLED, self.toggleEffective)
self.mainFrame.Bind(EFFECTIVE_HP_TOGGLED, self.toggleEffective)
self.effective = True
def getHeaderText(self, fit):

View File

@@ -21,7 +21,7 @@
import wx
from gui.statsView import StatsView
from gui.bitmapLoader import BitmapLoader
from gui import pygauge as PG
from gui.pygauge import PyGauge
from gui.utils.numberFormatter import formatAmount
import gui.mainFrame
import gui.globalEvents as GE
@@ -133,7 +133,7 @@ class ResistancesViewFull(StatsView):
bc = pgColour[1]
currGColour += 1
lbl = PG.PyGauge(contentPanel, wx.ID_ANY, 100)
lbl = PyGauge(contentPanel, wx.ID_ANY, 100)
lbl.SetMinSize((48, 16))
lbl.SetBackgroundColour(wx.Colour(bc[0], bc[1], bc[2]))
lbl.SetBarColour(wx.Colour(fc[0], fc[1], fc[2]))

View File

@@ -21,7 +21,7 @@
import wx
from gui.statsView import StatsView
from gui.bitmapLoader import BitmapLoader
from gui import pygauge as PG
from gui.pygauge import PyGauge
import gui.mainFrame
from gui.chromeTabs import EVT_NOTEBOOK_PAGE_CHANGED
@@ -176,7 +176,7 @@ class ResourcesViewFull(StatsView):
# Gauges modif. - Darriele
gauge = PG.PyGauge(parent, wx.ID_ANY, 1)
gauge = PyGauge(parent, wx.ID_ANY, 1)
gauge.SetValueRange(0, 0)
gauge.SetMinSize((self.getTextExtentW("1.999M/1.99M MW"), 23))
gauge.SetFractionDigits(2)

View File

@@ -34,6 +34,7 @@ from gui.bitmapLoader import BitmapLoader
import gui.builtinViews.emptyView
from gui.utils.exportHtml import exportHtml
from logging import getLogger
from gui.chromeTabs import EVT_NOTEBOOK_PAGE_CHANGED
from service.fit import Fit
from service.market import Market
@@ -101,7 +102,6 @@ FitSpawner.register()
class FittingViewDrop(wx.PyDropTarget):
def __init__(self, dropFn, *args, **kwargs):
super(FittingViewDrop, self).__init__(*args, **kwargs)
wx.PyDropTarget.__init__(self)
self.dropFn = dropFn
# this is really transferring an EVE itemID
self.dropData = wx.PyTextDataObject()
@@ -160,7 +160,7 @@ class FittingView(d.Display):
self.Bind(wx.EVT_SHOW, self.OnShow)
self.Bind(wx.EVT_MOTION, self.OnMouseMove)
self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow)
self.parent.Bind(gui.chromeTabs.EVT_NOTEBOOK_PAGE_CHANGED, self.pageChanged)
self.parent.Bind(EVT_NOTEBOOK_PAGE_CHANGED, self.pageChanged)
def OnLeaveWindow(self, event):
self.SetToolTip(None)
@@ -209,7 +209,7 @@ class FittingView(d.Display):
wx.PostEvent(self.mainFrame, gui.shipBrowser.FitSelected(fitID=fitID))
def Destroy(self):
self.parent.Unbind(gui.chromeTabs.EVT_NOTEBOOK_PAGE_CHANGED, handler=self.pageChanged)
self.parent.Unbind(EVT_NOTEBOOK_PAGE_CHANGED, handler=self.pageChanged)
self.mainFrame.Unbind(GE.FIT_CHANGED, handler=self.fitChanged)
self.mainFrame.Unbind(gui.shipBrowser.EVT_FIT_RENAMED, handler=self.fitRenamed)
self.mainFrame.Unbind(gui.shipBrowser.EVT_FIT_REMOVED, handler=self.fitRemoved)
@@ -406,15 +406,15 @@ class FittingView(d.Display):
if mod1.slot != mod2.slot:
return
if not getattr(mod2, "modPosition"):
self.mods.modPosition = mod2.modPosition = dstRow
if getattr(mod2, "modPosition"):
if clone and mod2.isEmpty:
sFit.cloneModule(self.mainFrame.getActiveFit(), srcIdx, mod2.modPosition)
else:
sFit.swapModules(self.mainFrame.getActiveFit(), srcIdx, mod2.modPosition)
if clone and mod2.isEmpty:
sFit.cloneModule(self.mainFrame.getActiveFit(), srcIdx, mod2.modPosition)
wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.mainFrame.getActiveFit()))
else:
sFit.swapModules(self.mainFrame.getActiveFit(), srcIdx, mod2.modPosition)
wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.mainFrame.getActiveFit()))
logger.error("Missing module position for: %s", str(getattr(mod2, "ID", "Unknown")))
def generateMods(self):
"""
@@ -431,7 +431,7 @@ class FittingView(d.Display):
if fit is not None:
self.mods = fit.modules[:]
self.mods.sort(key=lambda mod: (slotOrder.index(mod.slot), mod.position))
self.mods.sort(key=lambda _mod: (slotOrder.index(_mod.slot), _mod.position))
# Blanks is a list of indexes that mark non-module positions (such
# as Racks and tactical Modes. This allows us to skip over common

View File

@@ -30,7 +30,6 @@ from service.market import Market
class CargoViewDrop(wx.PyDropTarget):
def __init__(self, dropFn, *args, **kwargs):
super(CargoViewDrop, self).__init__(*args, **kwargs)
wx.PyDropTarget.__init__(self)
self.dropFn = dropFn
# this is really transferring an EVE itemID
self.dropData = wx.PyTextDataObject()

View File

@@ -1127,8 +1127,9 @@ class PFTabsContainer(wx.Panel):
color = wx.Colour(0, 0, 0)
brush = wx.Brush(color)
# noinspection PyPackageRequirements
# noinspection PyPackageRequirements,PyUnresolvedReferences,PyUnresolvedReferences,PyUnresolvedReferences
from Carbon.Appearance import kThemeBrushDialogBackgroundActive
# noinspection PyUnresolvedReferences
brush.MacSetTheme(kThemeBrushDialogBackgroundActive)
else:
color = wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE)

View File

@@ -43,7 +43,6 @@ class DummyEntry(object):
class CommandViewDrop(wx.PyDropTarget):
def __init__(self, dropFn, *args, **kwargs):
super(CommandViewDrop, self).__init__(*args, **kwargs)
wx.PyDropTarget.__init__(self)
self.dropFn = dropFn
# this is really transferring an EVE itemID
self.dropData = wx.PyTextDataObject()

View File

@@ -32,7 +32,6 @@ from service.market import Market
class DroneViewDrop(wx.PyDropTarget):
def __init__(self, dropFn, *args, **kwargs):
super(DroneViewDrop, self).__init__(*args, **kwargs)
wx.PyDropTarget.__init__(self)
self.dropFn = dropFn
# this is really transferring an EVE itemID
self.dropData = wx.PyTextDataObject()

View File

@@ -21,7 +21,7 @@
import wx
import gui.globalEvents as GE
import gui.marketBrowser as mb
import gui.marketBrowser as marketBrowser
import gui.mainFrame
import gui.display as d
from gui.builtinViewColumns.state import State
@@ -34,7 +34,6 @@ from service.market import Market
class FighterViewDrop(wx.PyDropTarget):
def __init__(self, dropFn, *args, **kwargs):
super(FighterViewDrop, self).__init__(*args, **kwargs)
wx.PyDropTarget.__init__(self)
self.dropFn = dropFn
# this is really transferring an EVE itemID
self.dropData = wx.PyTextDataObject()
@@ -128,7 +127,7 @@ class FighterDisplay(d.Display):
self.hoveredColumn = None
self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged)
self.mainFrame.Bind(mb.ITEM_SELECTED, self.addItem)
self.mainFrame.Bind(marketBrowser.ITEM_SELECTED, self.addItem)
self.Bind(wx.EVT_LEFT_DCLICK, self.removeItem)
self.Bind(wx.EVT_LEFT_DOWN, self.click)
self.Bind(wx.EVT_KEY_UP, self.kbEvent)
@@ -205,7 +204,7 @@ class FighterDisplay(d.Display):
if srcRow != -1 and dstRow != -1:
self._merge(srcRow, dstRow)
elif data[0] == "market":
wx.PostEvent(self.mainFrame, mb.ItemSelected(itemID=int(data[1])))
wx.PostEvent(self.mainFrame, marketBrowser.ItemSelected(itemID=int(data[1])))
@staticmethod
def _merge(src, dst):

View File

@@ -20,7 +20,7 @@
# noinspection PyPackageRequirements
import wx
import gui.display as d
import gui.marketBrowser as mb
import gui.marketBrowser as marketBrowser
import gui.mainFrame
from gui.builtinViewColumns.state import State
from gui.contextMenu import ContextMenu
@@ -90,7 +90,7 @@ class ImplantDisplay(d.Display):
self.lastFitId = None
self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged)
self.mainFrame.Bind(mb.ITEM_SELECTED, self.addItem)
self.mainFrame.Bind(marketBrowser.ITEM_SELECTED, self.addItem)
self.Bind(wx.EVT_LEFT_DCLICK, self.removeItem)
self.Bind(wx.EVT_LEFT_DOWN, self.click)
self.Bind(wx.EVT_KEY_UP, self.kbEvent)

View File

@@ -629,17 +629,17 @@ class ItemCompare(wx.Panel):
if sort is not None:
if sort == 0: # Name sort
func = lambda x: x.name
func = lambda _val: _val.name
else:
try:
# Remember to reduce by 1, because the attrs array
# starts at 0 while the list has the item name as column 0.
attr = str(self.attrs.keys()[sort - 1])
func = lambda x: x.attributes[attr].value if attr in x.attributes else None
func = lambda _val: _val.attributes[attr].value if attr in _val.attributes else None
except IndexError:
# Clicked on a column that's not part of our array (price most likely)
self.sortReverse = False
func = lambda x: x.attributes['metaLevel'].value if 'metaLevel' in x.attributes else None
func = lambda _val: _val.attributes['metaLevel'].value if 'metaLevel' in _val.attributes else None
self.items = sorted(self.items, key=func, reverse=self.sortReverse)
@@ -859,7 +859,7 @@ class ItemEffects(wx.Panel):
elif 'wxMac' in wx.PlatformInfo:
os.system("open " + file_)
else:
subprocess.call({"xdg-open": file_})
subprocess.call(["xdg-open", file_])
def RefreshValues(self, event):
self.Freeze()

View File

@@ -45,7 +45,6 @@ class DummyEntry(object):
class ProjectedViewDrop(wx.PyDropTarget):
def __init__(self, dropFn, *args, **kwargs):
super(ProjectedViewDrop, self).__init__(*args, **kwargs)
wx.PyDropTarget.__init__(self)
self.dropFn = dropFn
# this is really transferring an EVE itemID
self.dropData = wx.PyTextDataObject()

View File

@@ -685,7 +685,7 @@ class ShipBrowser(wx.Panel):
if len(self.categoryList) == 0:
# set cache of category list
self.categoryList = list(sMkt.getShipRoot())
self.categoryList.sort(key=lambda ship: ship.name)
self.categoryList.sort(key=lambda _ship: _ship.name)
# set map & cache of fittings per category
for cat in self.categoryList:
@@ -928,7 +928,7 @@ class ShipBrowser(wx.Panel):
fits = event.fits
# sort by ship name, then fit name
fits.sort(key=lambda fit: (fit.ship.item.name, fit.name))
fits.sort(key=lambda _fit: (_fit.ship.item.name, _fit.name))
self.lastdata = fits
self.lpane.Freeze()

View File

@@ -169,7 +169,7 @@ class exportHtmlThread(threading.Thread):
""" % (time.time(), dnaUrl, localDate)
HTML += ' <ul data-role="listview" class="ui-listview-outer" data-inset="true" data-filter="true">\n'
categoryList = list(sMkt.getShipRoot())
categoryList.sort(key=lambda ship: ship.name)
categoryList.sort(key=lambda _ship: _ship.name)
count = 0
@@ -178,7 +178,7 @@ class exportHtmlThread(threading.Thread):
HTMLgroup = ''
ships = list(sMkt.getShipList(group.ID))
ships.sort(key=lambda ship: ship.name)
ships.sort(key=lambda _ship: _ship.name)
# Keep track of how many ships per group
groupFits = 0
@@ -248,7 +248,7 @@ class exportHtmlThread(threading.Thread):
def generateMinimalHTML(self, sMkt, sFit, dnaUrl):
""" Generate a minimal HTML version of the fittings, without any javascript or styling"""
categoryList = list(sMkt.getShipRoot())
categoryList.sort(key=lambda ship: ship.name)
categoryList.sort(key=lambda _ship: _ship.name)
count = 0
HTML = ''
@@ -256,9 +256,9 @@ class exportHtmlThread(threading.Thread):
# init market group string to give ships something to attach to
ships = list(sMkt.getShipList(group.ID))
ships.sort(key=lambda ship: ship.name)
ships.sort(key=lambda _ship: _ship.name)
ships.sort(key=lambda ship: ship.name)
ships.sort(key=lambda _ship: _ship.name)
for ship in ships:
fits = sFit.getFitsWithShip(ship.ID)

View File

@@ -59,6 +59,7 @@ if not hasattr(sys, 'frozen'):
try:
import wxversion
except ImportError:
wxversion = None
print("Cannot find wxPython\nYou can download wxPython (2.8+) from http://www.wxpython.org/")
sys.exit(1)
@@ -89,6 +90,7 @@ if not hasattr(sys, 'frozen'):
print("Unknown sqlalchemy version string format, skipping check")
except ImportError:
sqlalchemy = None
print("Cannot find sqlalchemy.\nYou can download sqlalchemy (0.6+) from http://www.sqlalchemy.org/")
sys.exit(1)
@@ -97,6 +99,7 @@ if not hasattr(sys, 'frozen'):
# noinspection PyPackageRequirements
import dateutil.parser # noqa - Copied import statement from service/update.py
except ImportError:
dateutil = None
print("Cannot find python-dateutil.\nYou can download python-dateutil from https://pypi.python.org/pypi/python-dateutil")
sys.exit(1)

View File

@@ -346,6 +346,19 @@ class _Context(object):
# perform arcane attribute majick trick
return _Context(self._root, self._path + "/" + this, self.parameters)
def __call__(self, **kw):
if kw:
# specified keywords override contextual ones
for k, v in self.parameters.iteritems():
if k not in kw:
kw[k] = v
else:
# no keywords provided, just update with contextual ones.
kw.update(self.parameters)
# now let the root context handle it further
return self._root(self._path, **kw)
class _AuthContext(_Context):
def character(self, characterID):

View File

@@ -12,14 +12,12 @@ import config
from service.pycrest.compat import bytes_, text_
from service.pycrest.errors import APIException
try:
from urllib.parse import urlparse, urlunparse, parse_qsl
except ImportError: # pragma: no cover
from urlparse import urlparse, urlunparse, parse_qsl
from urlparse import urlparse, urlunparse, parse_qsl
try:
import pickle
except ImportError: # pragma: no cover
# noinspection PyPep8Naming
import cPickle as pickle
logger = logging.getLogger("pycrest.eve")