class BreadcrumbContentProvider( grok.MultiAdapter, zope.contentprovider.provider.ContentProviderBase): """Content provider rendering the breadcrumbs.""" grok.adapter(zope.interface.Interface, icemac.addressbook.browser.interfaces.IAddressBookLayer, zope.interface.Interface) grok.provides(zope.contentprovider.interfaces.IContentProvider) grok.name('breadcrumbs') def render(self): return '\n'.join(self.rendered_breadcrumbs) @property def rendered_breadcrumbs(self): for bc in reversed(list(self.reversed_breadcrumbs)): yield bc.render() @property def reversed_breadcrumbs(self): bc = self.get_breadcrumb(self.__parent__) parent = bc.parent while parent is not None: if bc.show: yield bc bc = self.get_breadcrumb(parent) parent = bc.parent assert not bc.show, 'Found a root breadcrumb with show = True' def get_breadcrumb(self, context): return zope.component.getMultiAdapter((context, self.request), IBreadcrumb)
factory4 = CaveHomeFactory(u"four") factory5 = CaveHomeFactory(u"five") factory6 = CaveFireplaceHomeFactory(u"six") factory7a = CaveHomeFactory(u"seven-a") factory7b = CaveFireplaceHomeFactory(u"seven-b") # make some direct assertions implementer(IHome)(factory3) implementer(IHome)(factory4) implementer(IHome)(factory5) implementer(IHome)(factory6) implementer(IHome)(factory7a) implementer(IHome)(factory7b) grok.adapter(Fireplace)(factory5) grok.adapter(Fireplace)(factory7a) grok.adapter(Cave, Fireplace)(factory7b) # should accept single value for adapts grok.global_adapter(factory1, Cave, IHome) # should accept tuple for adapts grok.global_adapter(factory2, (Cave, ), IHome, name=u"two") # should look at the provided interface grok.global_adapter(factory3, Cave, name=u"three") # should pick the canonical context grok.global_adapter(factory4, name=u"four") # should use __component_adapts__ grok.global_adapter(factory5, name=u"five") # should work as multi-adapter grok.global_adapter(factory6, (
class CaveFireplaceHomeFactory(object): def __init__(self, id): self.id = id def __call__(self, cave, fireplace): return Home(self.id) factory1 = CaveHomeFactory(u"one") factory2 = CaveHomeFactory(u"two") factory3 = CaveHomeFactory(u"three") factory4 = CaveHomeFactory(u"four") factory5 = CaveHomeFactory(u"five") factory6 = CaveFireplaceHomeFactory(u"six") # make some direct assertions grok.implementer(IHome)(factory3) grok.implementer(IHome)(factory4) grok.implementer(IHome)(factory5) grok.implementer(IHome)(factory6) grok.adapter(Fireplace)(factory5) grok.global_adapter(factory1, Cave, IHome) # should accept single value for adapts grok.global_adapter(factory2, (Cave,), IHome, name="two") # should accept tuple for adapts grok.global_adapter(factory3, Cave, name="three") # should look at the provided interface grok.global_adapter(factory4, name=u"four") # should pick the canonical context grok.global_adapter(factory5, name="five") # should use __component_adapts__ grok.global_adapter(factory6, (Cave, Fireplace,)) # should work as multi-adapter
factory4 = CaveHomeFactory(u"four") factory5 = CaveHomeFactory(u"five") factory6 = CaveFireplaceHomeFactory(u"six") factory7a = CaveHomeFactory(u"seven-a") factory7b = CaveFireplaceHomeFactory(u"seven-b") # make some direct assertions implementer(IHome)(factory3) implementer(IHome)(factory4) implementer(IHome)(factory5) implementer(IHome)(factory6) implementer(IHome)(factory7a) implementer(IHome)(factory7b) grok.adapter(Fireplace)(factory5) grok.adapter(Fireplace)(factory7a) grok.adapter(Cave, Fireplace)(factory7b) # should accept single value for adapts grok.global_adapter(factory1, Cave, IHome) # should accept tuple for adapts grok.global_adapter(factory2, (Cave,), IHome, name=u"two") # should look at the provided interface grok.global_adapter(factory3, Cave, name=u"three") # should pick the canonical context grok.global_adapter(factory4, name=u"four") # should use __component_adapts__ grok.global_adapter(factory5, name=u"five") # should work as multi-adapter grok.global_adapter(factory6, (Cave, Fireplace,))