git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@33440 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
146 lines
4.5 KiB
Python
146 lines
4.5 KiB
Python
#----------------------------------------------------------------------------
|
|
# Name: dependencymgr.py
|
|
# Purpose: Dependency Manager
|
|
#
|
|
# Author: Jeff Norton
|
|
#
|
|
# Created: 01/28/05
|
|
# CVS-ID: $Id$
|
|
# Copyright: (c) 2004-2005 ActiveGrid, Inc.
|
|
#----------------------------------------------------------------------------
|
|
|
|
DM_NO_ID = 0
|
|
DM_ID_ATTR = "_DependencyMgr__ID"
|
|
|
|
##class ManageableObject(object):
|
|
##
|
|
## def __init__(self):
|
|
## self.__id = DM_NO_ID
|
|
##
|
|
## def __repr__(self):
|
|
## return "<ManageableObject id = %s>" % self.__id
|
|
##
|
|
## def __getID(self):
|
|
## return self.__id
|
|
##
|
|
## def __setID(self, value):
|
|
## if (self.__id != DM_NO_ID):
|
|
## raise DependencyMgrException("Cannot set the dependency ID on object %s to \"%s\" because it already has one (\"%s\")." % (repr(self), value, self.__id))
|
|
## self.__id = value
|
|
##
|
|
## _DependencyMgr__ID = property(__getID, __setID)
|
|
|
|
class DependencyMgr(object):
|
|
|
|
def __init__(self):
|
|
self.clear()
|
|
|
|
def clear(self):
|
|
self.__dependencies = {}
|
|
self.__lastID = DM_NO_ID
|
|
|
|
def addDependency(self, parent, child):
|
|
pid = self._initObjectID(parent)
|
|
try:
|
|
parentCollection = self.__dependencies[pid]
|
|
except KeyError:
|
|
parentCollection = self._newDependencyCollection()
|
|
self.__dependencies[pid] = parentCollection
|
|
if (child not in parentCollection):
|
|
parentCollection.append(child)
|
|
|
|
def removeDependency(self, parent, child):
|
|
pid = self._getObjectID(parent)
|
|
if (pid != DM_NO_ID):
|
|
try:
|
|
parentCollection = self.__dependencies[pid]
|
|
parentCollection.remove(child)
|
|
if (len(parentCollection) == 0):
|
|
del self.__dependencies[pid]
|
|
except KeyError, ValueError:
|
|
pass
|
|
|
|
def clearDependencies(self, parent):
|
|
"Returns a list of objects or an empty list if no dependencies exist as for getDependencies, and then removes the dependency list."
|
|
pid = self._getObjectID(parent)
|
|
try:
|
|
deps = self.__dependencies[pid]
|
|
del self.__dependencies[pid]
|
|
return deps
|
|
except KeyError:
|
|
return []
|
|
|
|
def hasDependency(self, parent):
|
|
"Returns a boolean"
|
|
return (self._getObjectID(parent) in self.__dependencies)
|
|
|
|
def getDependencies(self, parent):
|
|
"Returns a list of objects or an empty list if no dependencies exist."
|
|
try:
|
|
return self.__dependencies[self._getObjectID(parent)]
|
|
except KeyError:
|
|
return []
|
|
|
|
def dumpState(self, out):
|
|
"Writes the state of the dependency manager (as reported by getState) to out"
|
|
for line in self.getState():
|
|
print >> out, line
|
|
|
|
def getState(self):
|
|
"Returns the state of the dependency manager including all managed objects as a list of strings"
|
|
out = []
|
|
out.append("DependencyMgr %s has %i parent objects, last id assigned is %i" % (repr(self), len(self.__dependencies), self.__lastID))
|
|
for key, val in self.__dependencies.iteritems():
|
|
out.append("Object %s has dependents: %s " % (repr(key), ", ".join([repr(d) for d in val])))
|
|
return out
|
|
|
|
def _initObjectID(self, obj):
|
|
try:
|
|
id = getattr(obj, DM_ID_ATTR)
|
|
except AttributeError:
|
|
id = DM_NO_ID
|
|
if (id == DM_NO_ID):
|
|
id = self._newID()
|
|
setattr(obj, DM_ID_ATTR, id)
|
|
return id
|
|
|
|
def _getObjectID(self, obj):
|
|
try:
|
|
id = getattr(obj, DM_ID_ATTR)
|
|
except AttributeError:
|
|
id = DM_NO_ID
|
|
return id
|
|
|
|
def _newID(self):
|
|
self.__lastID += 1
|
|
return self.__lastID
|
|
|
|
def _newDependencyCollection(self):
|
|
return []
|
|
|
|
globalDM = DependencyMgr()
|
|
|
|
def addDependency(parent, child):
|
|
getGlobalDM().addDependency(parent, child)
|
|
|
|
def removeDependency(parent, child):
|
|
getGlobalDM().removeDependency(parent, child)
|
|
|
|
def clearDependencies(parent):
|
|
return getGlobalDM().clearDependencies(parent)
|
|
|
|
def hasDependency(parent):
|
|
return getGlobalDM().hasDependency(parent)
|
|
|
|
def getDependencies(parent):
|
|
return getGlobalDM().getDependencies(parent)
|
|
|
|
def getState():
|
|
return getGlobalDM().getState()
|
|
|
|
def dumpState(out):
|
|
getGlobalDM().dumpState(out)
|
|
|
|
def getGlobalDM():
|
|
return globalDM
|