[Checkins] SVN: z3c.breadcrumb/trunk/ Try to create an egg.

Stephan Richter srichter at cosmos.phy.tufts.edu
Tue Jul 10 15:41:16 EDT 2007


Log message for revision 77684:
  Try to create an egg.
  

Changed:
  A   z3c.breadcrumb/trunk/AUTHOR.txt
  A   z3c.breadcrumb/trunk/CHANGES.txt
  A   z3c.breadcrumb/trunk/LICENSE.txt
  A   z3c.breadcrumb/trunk/README.txt
  A   z3c.breadcrumb/trunk/bootstrap.py
  A   z3c.breadcrumb/trunk/buildout.cfg
  U   z3c.breadcrumb/trunk/setup.py
  U   z3c.breadcrumb/trunk/src/z3c/breadcrumb/README.txt
  U   z3c.breadcrumb/trunk/src/z3c/breadcrumb/browser.py

-=-
Added: z3c.breadcrumb/trunk/AUTHOR.txt
===================================================================
--- z3c.breadcrumb/trunk/AUTHOR.txt	                        (rev 0)
+++ z3c.breadcrumb/trunk/AUTHOR.txt	2007-07-10 19:41:15 UTC (rev 77684)
@@ -0,0 +1,3 @@
+Roger Ineichen (roger <at> projekt01.ch)
+Stephan Richter (stephan.richter <at> gmail.com)
+


Property changes on: z3c.breadcrumb/trunk/AUTHOR.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: z3c.breadcrumb/trunk/CHANGES.txt
===================================================================
--- z3c.breadcrumb/trunk/CHANGES.txt	                        (rev 0)
+++ z3c.breadcrumb/trunk/CHANGES.txt	2007-07-10 19:41:15 UTC (rev 77684)
@@ -0,0 +1,8 @@
+=======
+CHANGES
+=======
+
+Version 1.0.0 (7/10/2007)
+-------------------------
+
+- Initial Release


Property changes on: z3c.breadcrumb/trunk/CHANGES.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: z3c.breadcrumb/trunk/LICENSE.txt
===================================================================
--- z3c.breadcrumb/trunk/LICENSE.txt	                        (rev 0)
+++ z3c.breadcrumb/trunk/LICENSE.txt	2007-07-10 19:41:15 UTC (rev 77684)
@@ -0,0 +1,54 @@
+Zope Public License (ZPL) Version 2.1
+-------------------------------------
+
+A copyright notice accompanies this license document that
+identifies the copyright holders.
+
+This license has been certified as open source. It has also
+been designated as GPL compatible by the Free Software
+Foundation (FSF).
+
+Redistribution and use in source and binary forms, with or
+without modification, are permitted provided that the
+following conditions are met:
+
+1. Redistributions in source code must retain the
+   accompanying copyright notice, this list of conditions,
+   and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the accompanying
+   copyright notice, this list of conditions, and the
+   following disclaimer in the documentation and/or other
+   materials provided with the distribution.
+
+3. Names of the copyright holders must not be used to
+   endorse or promote products derived from this software
+   without prior written permission from the copyright
+   holders.
+
+4. The right to distribute this software or to use it for
+   any purpose does not give you the right to use
+   Servicemarks (sm) or Trademarks (tm) of the copyright
+   holders. Use of them is covered by separate agreement
+   with the copyright holders.
+
+5. If any files are modified, you must cause the modified
+   files to carry prominent notices stating that you changed
+   the files and the date of any change.
+
+Disclaimer
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS''
+  AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
+  NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+  AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+  NO EVENT SHALL THE COPYRIGHT HOLDERS BE
+  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+  DAMAGE.


Property changes on: z3c.breadcrumb/trunk/LICENSE.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: z3c.breadcrumb/trunk/README.txt
===================================================================
--- z3c.breadcrumb/trunk/README.txt	                        (rev 0)
+++ z3c.breadcrumb/trunk/README.txt	2007-07-10 19:41:15 UTC (rev 77684)
@@ -0,0 +1,3 @@
+The ``z3c.breadcrumb`` package provides base classes for breadcrumb
+implementations. It allows you to write adapters for each content object which
+provides it's own rules for providing the breadcrumb name, url and selection.


Property changes on: z3c.breadcrumb/trunk/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: z3c.breadcrumb/trunk/bootstrap.py
===================================================================
--- z3c.breadcrumb/trunk/bootstrap.py	                        (rev 0)
+++ z3c.breadcrumb/trunk/bootstrap.py	2007-07-10 19:41:15 UTC (rev 77684)
@@ -0,0 +1,52 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Bootstrap a buildout-based project
+
+Simply run this script in a directory containing a buildout.cfg.
+The script accepts buildout command-line options, so you can
+use the -c option to specify an alternate configuration file.
+
+$Id$
+"""
+
+import os, shutil, sys, tempfile, urllib2
+
+tmpeggs = tempfile.mkdtemp()
+
+ez = {}
+exec urllib2.urlopen('http://peak.telecommunity.com/dist/ez_setup.py'
+                     ).read() in ez
+ez['use_setuptools'](to_dir=tmpeggs, download_delay=0)
+
+import pkg_resources
+
+cmd = 'from setuptools.command.easy_install import main; main()'
+if sys.platform == 'win32':
+    cmd = '"%s"' % cmd # work around spawn lamosity on windows
+
+ws = pkg_resources.working_set
+assert os.spawnle(
+    os.P_WAIT, sys.executable, sys.executable,
+    '-c', cmd, '-mqNxd', tmpeggs, 'zc.buildout',
+    dict(os.environ,
+         PYTHONPATH=
+         ws.find(pkg_resources.Requirement.parse('setuptools')).location
+         ),
+    ) == 0
+
+ws.add_entry(tmpeggs)
+ws.require('zc.buildout')
+import zc.buildout.buildout
+zc.buildout.buildout.main(sys.argv[1:] + ['bootstrap'])
+shutil.rmtree(tmpeggs)


Property changes on: z3c.breadcrumb/trunk/bootstrap.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: z3c.breadcrumb/trunk/buildout.cfg
===================================================================
--- z3c.breadcrumb/trunk/buildout.cfg	                        (rev 0)
+++ z3c.breadcrumb/trunk/buildout.cfg	2007-07-10 19:41:15 UTC (rev 77684)
@@ -0,0 +1,8 @@
+[buildout]
+develop = .
+parts = test
+
+[test]
+recipe = zc.recipe.testrunner
+eggs = z3c.breadcrumb [test]
+

Modified: z3c.breadcrumb/trunk/setup.py
===================================================================
--- z3c.breadcrumb/trunk/setup.py	2007-07-10 16:30:48 UTC (rev 77683)
+++ z3c.breadcrumb/trunk/setup.py	2007-07-10 19:41:15 UTC (rev 77684)
@@ -1,21 +1,74 @@
-#!python
+##############################################################################
+#
+# Copyright (c) 2007 Zope Foundation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Setup
+
+$Id$
+"""
+import os
+import xml.sax.saxutils
 from setuptools import setup, find_packages
 
-setup(name='z3c.breadcrumb',
-      version='0.1.0',
-      author = "Zope Community",
-      author_email = "zope3-dev at zope.org",
-      license = "ZPL 2.1",
-      keywords = "breadcrumb zope zope3",
-      url='http://svn.zope.org/z3c.breadcrumb',
+def read(*rnames):
+    text = open(os.path.join(os.path.dirname(__file__), *rnames)).read()
+    return xml.sax.saxutils.escape(text)
 
-      zip_safe=False,
-      packages=find_packages('src'),
-      include_package_data=True,
-      package_dir = {'':'src'},
-      namespace_packages=['z3c',],
-      install_requires=[
-          'setuptools',
-          ],
-     )
-
+setup (
+    name='z3c.breadcrumb',
+    version='1.0.0',
+    author = "Roger Ineichen,Stephan Richter and the Zope Community",
+    author_email = "zope3-dev at zope.org",
+    description = "A pluggable breadcrumbs implementation based on adapters.",
+    long_description=(
+        read('README.txt')
+        + '\n\n' +
+        'Detailed Documentation\n'
+        '**********************\n'
+        + '\n' +
+        read('src', 'z3c', 'breadcrumb', 'README.txt')
+        + '\n\n' +
+        read('CHANGES.txt')
+        ),
+    license = "ZPL 2.1",
+    keywords = "zope3 breadcrumb adapter",
+    classifiers = [
+        'Development Status :: 4 - Beta',
+        'Environment :: Web Environment',
+        'Intended Audience :: Developers',
+        'License :: OSI Approved :: Zope Public License',
+        'Programming Language :: Python',
+        'Natural Language :: English',
+        'Operating System :: OS Independent',
+        'Topic :: Internet :: WWW/HTTP',
+        'Framework :: Zope3'],
+    url = 'http://svn.zope.org/z3c.breadcrumb',
+    packages = find_packages('src'),
+    include_package_data = True,
+    package_dir = {'':'src'},
+    namespace_packages = ['z3c'],
+    extras_require = dict(
+        test = ['zope.testing'],
+        ),
+    install_requires = [
+        'setuptools',
+        'zope.app.component',
+        'zope.component',
+        'zope.interface',
+        'zope.location',
+        'zope.publisher',
+        'zope.schema',
+        'zope.traversing',
+        ],
+    dependency_links = ['http://download.zope.org/distribution'],
+    zip_safe = False,
+    )

Modified: z3c.breadcrumb/trunk/src/z3c/breadcrumb/README.txt
===================================================================
--- z3c.breadcrumb/trunk/src/z3c/breadcrumb/README.txt	2007-07-10 16:30:48 UTC (rev 77683)
+++ z3c.breadcrumb/trunk/src/z3c/breadcrumb/README.txt	2007-07-10 19:41:15 UTC (rev 77684)
@@ -1,117 +1,117 @@
-======
-README
-======
-
-The z3c.breadcrumb package provides base classes for breadcrumb 
-implementations. It allows you to write adapters for each content object which
-provides it's own rule for providing the breadcrumb name, url and selection.
-
-Let's do some imports we will use later.
-
-  >>> import zope.interface
-  >>> import zope.component
-  >>> from zope.publisher.interfaces.http import IHTTPRequest
-  >>> from zope.publisher.browser import TestRequest
-  >>> from zope.traversing.browser import absoluteURL
-  >>> from zope.app.container import contained
-  >>> from z3c.breadcrumb import interfaces
-  >>> from z3c.breadcrumb import browser
-
-
-IBreadcrumb
------------
-
-Let's define a interface and a content object.
-
-  >>> class IOffice(zope.interface.Interface):
-  ...     """Office interface."""
-
-  >>> class Office(contained.Contained):
-  ...     zope.interface.implements(IOffice)
-  ...     def __init__(self, label):
-  ...         self.label = label
-  ...         self.activeURL = True
-
-  >>> office = Office(u'Zope Foundation')
-  >>> office.__name__ = u'ZF'
-
-There is a generic breadcrumb implementation which is registered by 
-default. If we do not implement a custom IBreadcrumb the generic adapter will
-return the title or __name__ of the item. Let's register the default adapter, 
-this is normaly done in configure.zcml:
-
-  >>> zope.component.provideAdapter(browser.GenericBreadcrumb)
-
-And see what we get:
-
-  >>> request = TestRequest()
-  >>> breadcrumb = zope.component.getMultiAdapter((office, request), 
-  ...     interfaces.IBreadcrumb)
-  >>> breadcrumb.name
-  u'ZF'
-
-We can also implement a custom IBreadcrumb adapter and provide another name
-for the breadcrumb name:
-
-  >>> class BreadcrumbForOffice(object):
-  ...     zope.interface.implements(interfaces.IBreadcrumb)
-  ...     zope.component.adapts(IOffice, IHTTPRequest)
-  ... 
-  ...     def __init__(self, context, request):
-  ...         self.context = context
-  ...         self.request = request
-  ... 
-  ...     @property
-  ...     def name(self):
-  ...         return self.context.label
-  ... 
-  ...     @property
-  ...     def url(self):
-  ...         return absoluteURL(self.context, self.request)
-  ... 
-  ...     @property
-  ...     def activeURL(self):
-  ...         return self.context.activeURL
-
-Let's register the custom IBreadcrumb adapter for IOffice:
-
-  >>> zope.component.provideAdapter(BreadcrumbForOffice)
-
-And check the new breadcrumb name:
-
-  >>> breadcrumb = zope.component.getMultiAdapter((office, request), 
-  ...     interfaces.IBreadcrumb)
-  >>> breadcrumb.name
-  u'Zope Foundation'
-
-
-IBreadcrumbs
-------------
-
-There is also a IBreadcrumbs adapter which knows how to collect breadcrumb 
-informations for each item he traverses. We need to setup a little bit 
-infrastucture:
-
-  >>> root = rootFolder
-  >>> root['office'] = office
-
-Register the IBreadcrumbs adapter:
-
-  >>> zope.component.provideAdapter(browser.Breadcrumbs, 
-  ...     (zope.interface.Interface, zope.interface.Interface), 
-  ...     interfaces.IBreadcrumbs)
-
-
-Now we can collect breadcrumbs for our items. You can see the url is correct
-and the label ``Zope Foundation`` is collected by the custom IBreadcrumb 
-adapter:
-
-  >>> breadcrumb = zope.component.getMultiAdapter((office, request), 
-  ...     interfaces.IBreadcrumbs)
-  >>> list(breadcrumb.crumbs)
-  [{'url': 'http://127.0.0.1',
-    'activeURL': True,
-    'name': 'top'},
-   {'url': 'http://127.0.0.1/office',
-    'activeURL': True,
-    'name': u'Zope Foundation'}]
+======
+README
+======
+
+The z3c.breadcrumb package provides base classes for breadcrumb
+implementations. It allows you to write adapters for each content object which
+provides it's own rule for providing the breadcrumb name, url and selection.
+
+Let's do some imports we will use later.
+
+  >>> import zope.interface
+  >>> import zope.component
+  >>> from zope.publisher.interfaces.http import IHTTPRequest
+  >>> from zope.publisher.browser import TestRequest
+  >>> from zope.traversing.browser import absoluteURL
+  >>> from zope.app.container import contained
+  >>> from z3c.breadcrumb import interfaces
+  >>> from z3c.breadcrumb import browser
+
+
+IBreadcrumb
+-----------
+
+Let's define a interface and a content object.
+
+  >>> class IOffice(zope.interface.Interface):
+  ...     """Office interface."""
+
+  >>> class Office(contained.Contained):
+  ...     zope.interface.implements(IOffice)
+  ...     def __init__(self, label):
+  ...         self.label = label
+  ...         self.activeURL = True
+
+  >>> office = Office(u'Zope Foundation')
+  >>> office.__name__ = u'ZF'
+
+There is a generic breadcrumb implementation which is registered by
+default. If we do not implement a custom IBreadcrumb the generic adapter will
+return the ``title`` or ``__name__`` of the item. Let's register the default
+adapter, this is normaly done in ``configure.zcml``:
+
+  >>> zope.component.provideAdapter(browser.GenericBreadcrumb)
+
+And see what we get:
+
+  >>> request = TestRequest()
+  >>> breadcrumb = zope.component.getMultiAdapter((office, request),
+  ...     interfaces.IBreadcrumb)
+  >>> breadcrumb.name
+  u'ZF'
+
+We can also implement a custom ``IBreadcrumb`` adapter and provide another
+name for the breadcrumb name:
+
+  >>> class BreadcrumbForOffice(object):
+  ...     zope.interface.implements(interfaces.IBreadcrumb)
+  ...     zope.component.adapts(IOffice, IHTTPRequest)
+  ...
+  ...     def __init__(self, context, request):
+  ...         self.context = context
+  ...         self.request = request
+  ...
+  ...     @property
+  ...     def name(self):
+  ...         return self.context.label
+  ...
+  ...     @property
+  ...     def url(self):
+  ...         return absoluteURL(self.context, self.request)
+  ...
+  ...     @property
+  ...     def activeURL(self):
+  ...         return self.context.activeURL
+
+Let's register the custom ``IBreadcrumb`` adapter for IOffice:
+
+  >>> zope.component.provideAdapter(BreadcrumbForOffice)
+
+And check the new breadcrumb name:
+
+  >>> breadcrumb = zope.component.getMultiAdapter((office, request),
+  ...     interfaces.IBreadcrumb)
+  >>> breadcrumb.name
+  u'Zope Foundation'
+
+
+IBreadcrumbs
+------------
+
+There is also a IBreadcrumbs adapter which knows how to collect breadcrumb
+informations for each item he traverses. We need to setup a little bit
+infrastucture:
+
+  >>> root = rootFolder
+  >>> root['office'] = office
+
+Register the IBreadcrumbs adapter:
+
+  >>> zope.component.provideAdapter(browser.Breadcrumbs,
+  ...     (zope.interface.Interface, zope.interface.Interface),
+  ...     interfaces.IBreadcrumbs)
+
+
+Now we can collect breadcrumbs for our items. You can see the url is correct
+and the label ``Zope Foundation`` is collected by the custom IBreadcrumb
+adapter:
+
+  >>> breadcrumb = zope.component.getMultiAdapter((office, request),
+  ...     interfaces.IBreadcrumbs)
+  >>> list(breadcrumb.crumbs)
+  [{'url': 'http://127.0.0.1',
+    'activeURL': True,
+    'name': 'top'},
+   {'url': 'http://127.0.0.1/office',
+    'activeURL': True,
+    'name': u'Zope Foundation'}]

Modified: z3c.breadcrumb/trunk/src/z3c/breadcrumb/browser.py
===================================================================
--- z3c.breadcrumb/trunk/src/z3c/breadcrumb/browser.py	2007-07-10 16:30:48 UTC (rev 77683)
+++ z3c.breadcrumb/trunk/src/z3c/breadcrumb/browser.py	2007-07-10 19:41:15 UTC (rev 77684)
@@ -1,94 +1,96 @@
-##############################################################################
-#
-# Copyright (c) 2007 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""
-$Id: __init__.py 70825 2006-10-20 01:34:05Z rogerineichen $
-"""
-__docformat__ = 'reStructuredText'
-
-import zope.component
-import zope.interface
-import zope.location
-from zope.publisher.interfaces import NotFound
-from zope.publisher import browser
-from zope.publisher.interfaces.http import IHTTPRequest
-from zope.traversing.interfaces import IContainmentRoot
-from zope.app import zapi
-from zope.app.component.interfaces import ISite
-
-from z3c.breadcrumb import interfaces
-
-
-class Breadcrumbs(zope.location.Location):
-    """Breadcrumbs implementation using IBreadcrum adapters."""
-
-    zope.interface.implements(interfaces.IBreadcrumbs)
-    zope.component.adapts(zope.interface.Interface, IHTTPRequest)
-
-    def __init__(self, context, request):
-        self.context = context
-        self.request = request
-
-    def __getParent(self):
-        return getattr(self, '_parent', self.context)
-
-    def __setParent(self, parent):
-        self._parent = parent
-
-    __parent__ = property(__getParent, __setParent)
-
-    @property
-    def crumbs(self):
-        objects = []
-        for obj in [self.context] + list(zapi.getParents(self.context)):
-            objects.append(obj)
-            if ISite.providedBy(obj):
-                break
-        objects.reverse()
-        for object in objects:
-            info = zapi.getMultiAdapter((object, self.request),
-                                        interfaces.IBreadcrumb)
-            yield {'name': info.name, 'url': info.url, 'activeURL': info.activeURL}
-
-
-class GenericBreadcrumb(object):
-    """A generic breadcrumb adapter."""
-    zope.interface.implements(interfaces.IBreadcrumb)
-    zope.component.adapts(zope.interface.Interface, IHTTPRequest)
-
-    # See interfaces.IBreadcrumb
-    activeURL = True
-
-    def __init__(self, context, request):
-        self.context = context
-        self.request = request
-
-    @property
-    def name(self):
-        """See interfaces.IBreadcrumb"""
-        name = getattr(self.context, 'title', None)
-        if name is None:
-            name = getattr(self.context, '__name__', None)
-        if name is None and IContainmentRoot.providedBy(self.context):
-            name = 'top'
-        return name
-
-    @property
-    def url(self):
-        """See interfaces.IBreadcrumb"""
-        return zapi.absoluteURL(self.context, self.request)
-
-
-def CustomNameBreadcrumb(name):
-    return type('CustomNameBreadcrumb(%r)' %name,
-                (GenericBreadcrumb,), {'name': name})
+##############################################################################
+#
+# Copyright (c) 2007 Zope Foundation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+$Id: __init__.py 70825 2006-10-20 01:34:05Z rogerineichen $
+"""
+__docformat__ = 'reStructuredText'
+
+import zope.component
+import zope.interface
+import zope.location
+import zope.traversing.browser
+from zope.publisher.interfaces import NotFound
+from zope.publisher import browser
+from zope.publisher.interfaces.http import IHTTPRequest
+from zope.traversing.interfaces import IContainmentRoot
+from zope.app.component.interfaces import ISite
+
+from z3c.breadcrumb import interfaces
+
+
+class Breadcrumbs(zope.location.Location):
+    """Breadcrumbs implementation using IBreadcrum adapters."""
+
+    zope.interface.implements(interfaces.IBreadcrumbs)
+    zope.component.adapts(zope.interface.Interface, IHTTPRequest)
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def __getParent(self):
+        return getattr(self, '_parent', self.context)
+
+    def __setParent(self, parent):
+        self._parent = parent
+
+    __parent__ = property(__getParent, __setParent)
+
+    @property
+    def crumbs(self):
+        objects = []
+        for obj in [self.context]+list(zope.component.getParents(self.context)):
+            objects.append(obj)
+            if ISite.providedBy(obj):
+                break
+        objects.reverse()
+        for object in objects:
+            info = zope.component.getMultiAdapter((object, self.request),
+                                        interfaces.IBreadcrumb)
+            yield {'name': info.name,
+                   'url': info.url,
+                   'activeURL': info.activeURL}
+
+
+class GenericBreadcrumb(object):
+    """A generic breadcrumb adapter."""
+    zope.interface.implements(interfaces.IBreadcrumb)
+    zope.component.adapts(zope.interface.Interface, IHTTPRequest)
+
+    # See interfaces.IBreadcrumb
+    activeURL = True
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    @property
+    def name(self):
+        """See interfaces.IBreadcrumb"""
+        name = getattr(self.context, 'title', None)
+        if name is None:
+            name = getattr(self.context, '__name__', None)
+        if name is None and IContainmentRoot.providedBy(self.context):
+            name = 'top'
+        return name
+
+    @property
+    def url(self):
+        """See interfaces.IBreadcrumb"""
+        return zope.traversing.browser.absoluteURL(self.context, self.request)
+
+
+def CustomNameBreadcrumb(name):
+    return type('CustomNameBreadcrumb(%r)' %name,
+                (GenericBreadcrumb,), {'name': name})



More information about the Checkins mailing list