NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

__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