from zope.interface.interfaces import ComponentLookupError
from zope.interface import providedBy
from zope.component import getGlobalSiteManager, getMultiAdapter
from graph.interfaces import IBaseComponent
gsm = getGlobalSiteManager()
class BaseAdapter(object):
"""
Base for all Adapters
"""
# implements(IBaseAdapter)
def __init__(self, obj):
"""
Gets an Object to be adapted
"""
self.obj = obj
class BaseComponent(object):
"""
"""
def __init__(self, parent):
self.parent = parent
self.items = []
def addItem(self, item):
self.items.append(item)
def setup(self, *args, **kwargs):
pass
class BaseFactory(object):
def __init__(self, obj, *args, **kwargs):
"""
Gets an Object to be adapted
"""
self.obj = obj
self.args = args
self.kwargs = kwargs
def __call__(self, *args, **kwargs):
parent_vector = self.traverse_parents()
adapter = self.find_adapter(parent_vector)
adapter.setup(*args, **kwargs)
return adapter
def find_adapter(self, parent_vector):
for i in range(len(parent_vector)):
try:
adapter = getMultiAdapter(parent_vector[i:], self.target_interface)
except ComponentLookupError:
pass
else:
if adapter :
return adapter
def traverse_parents(self):
"""
Retrieve the vector of all component parents up to the top level component which has no parent
"""
parent_vector = [self.obj]
obj = self.obj
while obj.parent:
obj = obj.parent
parent_vector.append(obj)
parent_vector.reverse()
return parent_vector
def getComponentInterfaceOf(self, obj):
"""
Retrieve the interfacess a certain instance is providing.
Filter out the interface that belongs to our framework.
"""
for interface in providedBy(obj):
if isinstance(interface, IBaseComponent.__class__):
return interface