__init__.py (5759B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\utillib\__init__.py 2 import collections 3 import os 4 import sys 5 from collections import defaultdict 6 import blue 7 8 class KeyVal: 9 __passbyvalue__ = 1 10 11 def __init__(self, dictLikeObject = None, **kw): 12 self.__dict__ = kw 13 if dictLikeObject is not None: 14 if isinstance(dictLikeObject, dict): 15 self.__dict__.update(dictLikeObject) 16 elif isinstance(dictLikeObject, blue.DBRow): 17 for k in dictLikeObject.__keys__: 18 self.__dict__[k] = getattr(dictLikeObject, k) 19 20 elif isinstance(dictLikeObject, KeyVal): 21 self.__dict__.update(dictLikeObject.__dict__) 22 else: 23 raise TypeError("KeyVal can only be initialized with dictionaries, key/value pairs or blue.DBRow's. %s isn't one of them." % type(dictLikeObject)) 24 25 def _get_class_name(self): 26 return self.__class__.__name__ 27 28 def __str__(self): 29 members = dict(filter(lambda k_v: not k_v[0].startswith('__'), self.__dict__.items())) 30 return '%s: %s' % (self._get_class_name(), members) 31 32 def __repr__(self): 33 return '<%s>' % str(self) 34 35 def __getitem__(self, key): 36 return self.__dict__[key] 37 38 def __contains__(self, key): 39 return key in self.__dict__ 40 41 def __delitem__(self, key): 42 del self.__dict__[key] 43 44 def __setitem__(self, key, value): 45 self.__dict__[key] = value 46 47 def update(self, other): 48 self.__dict__.update(other) 49 50 def copy(self): 51 ret = KeyVal() 52 ret.__dict__.update(self.__dict__) 53 return ret 54 55 def get(self, key, defval = None): 56 return self.__dict__.get(key, defval) 57 58 def Get(self, key, defval = None): 59 return self.__dict__.get(key, defval) 60 61 def Set(self, key, value): 62 self.__dict__[key] = value 63 64 65 class keydefaultdict(defaultdict): 66 67 def __missing__(self, key): 68 ret = self[key] = self.default_factory(key) 69 return ret 70 71 72 def strx(o): 73 try: 74 return str(o) 75 except UnicodeEncodeError: 76 sys.exc_clear() 77 return unicode(o).encode('ascii', 'replace') 78 79 80 def GetClientUniqueFolderName(): 81 path = os.path.normpath(blue.paths.ResolvePath(u'app:/').lower()) 82 path = path.replace('/', '_').replace('\\', '_').replace(':', '').replace(' ', '_') 83 path += u'_' + GetServerNameForSettingsFolder() 84 return path 85 86 87 def GetServerNameForSettingsFolder(): 88 name = GetServerName().lower().replace(' ', '_') 89 if name.endswith('.servers.eveonline.com'): 90 name = name.split('.')[0] 91 return name 92 93 94 def GetServerName(): 95 from eveprefs import prefs, boot 96 serverName = boot.GetValue('server', '') 97 if prefs: 98 serverName = prefs.GetValue('server', serverName) 99 for arg in blue.pyos.GetArg(): 100 if arg.startswith('/server:'): 101 serverName = arg.split(':')[1] 102 103 return serverName 104 105 106 def GetServerPort(): 107 from eveprefs import prefs, boot 108 serverPort = boot.GetValue('port', '') 109 if prefs: 110 serverPort = prefs.GetValue('port', serverPort) 111 for arg in blue.pyos.GetArg(): 112 if arg.startswith('/port:'): 113 serverPort = arg.split(':')[1] 114 115 return int(serverPort) 116 117 118 def GetLoginCredentials(): 119 for arg in blue.pyos.GetArg()[1:]: 120 if arg.startswith('/login:'): 121 argParts = arg.split(':')[1:] 122 if len(argParts) != 2: 123 raise RuntimeError('Format of login parameter incorrect, should be /login:<user>:<password>') 124 return argParts 125 126 127 class DAG(object): 128 129 def __init__(self): 130 self.graph = collections.defaultdict(lambda : (set(), set())) 131 132 def AddNode(self, node): 133 self.graph[node] 134 135 def InsertEdge(self, A, B): 136 self.graph[A][0].add(B) 137 self.graph[B][1].add(A) 138 139 def RemoveEdge(self, A, B): 140 self.graph[A][0].remove(B) 141 self.graph[B][1].remove(A) 142 143 def RemoveNode(self, N, stitch = True): 144 connections = self.graph[N] 145 del self.graph[N] 146 for out in connections[0]: 147 self.graph[out][1].remove(N) 148 149 for inc in connections[1]: 150 self.graph[inc][0].remove(N) 151 152 if stitch: 153 for out in connections[0]: 154 self.graph[out][1].update(connections[1]) 155 156 for inc in connections[1]: 157 self.graph[inc][0].update(connections[0]) 158 159 def Invert(self): 160 for k, v in self.graph.items(): 161 self.graph[k] = (v[1], v[0]) 162 163 def Leaves(self): 164 return [ k for k, v in self.graph.iteritems() if not v[0] ] 165 166 def __str__(self): 167 return self.graph.__str__() 168 169 def ToDot(self): 170 retStr = 'digraph graphname {\n' 171 for k, v in self.graph.iteritems(): 172 for dep in v[0]: 173 retStr += '%s -> %s\n' % (k, dep) 174 175 retStr += '}' 176 return retStr 177 178 def _ListAllCyclesRec(self, k, v, doneStack, currentStack, detectedCycles): 179 if k in doneStack: 180 return 181 if k in currentStack: 182 t = currentStack[currentStack.index(k):] 183 t.append(k) 184 detectedCycles.append(t) 185 return 186 currentStack.append(k) 187 for each in v[0]: 188 self._ListAllCyclesRec(each, self.graph[each], doneStack, currentStack, detectedCycles) 189 190 currentStack.pop() 191 doneStack.append(k) 192 193 def ListAllCycles(self): 194 doneStack = [] 195 currentStack = [] 196 detectedCycles = [] 197 for k, v in self.graph.iteritems(): 198 if k not in doneStack: 199 self._ListAllCyclesRec(k, v, doneStack, currentStack, detectedCycles) 200 201 return detectedCycles