[Checkins] SVN: megrok.z3ctable/trunk/ Moved from Dolmen's GIT.

Souheil CHELFOUH souheil at chelfouh.com
Fri May 7 05:54:17 EDT 2010


Log message for revision 112116:
  Moved from Dolmen's GIT.
  

Changed:
  A   megrok.z3ctable/trunk/
  A   megrok.z3ctable/trunk/LICENSE.txt
  A   megrok.z3ctable/trunk/bootstrap.py
  A   megrok.z3ctable/trunk/buildout.cfg
  A   megrok.z3ctable/trunk/docs/
  A   megrok.z3ctable/trunk/docs/HISTORY.txt
  A   megrok.z3ctable/trunk/setup.py
  A   megrok.z3ctable/trunk/src/
  A   megrok.z3ctable/trunk/src/megrok/
  A   megrok.z3ctable/trunk/src/megrok/__init__.py
  A   megrok.z3ctable/trunk/src/megrok/z3ctable/
  A   megrok.z3ctable/trunk/src/megrok/z3ctable/CREDITS.txt
  A   megrok.z3ctable/trunk/src/megrok/z3ctable/README.txt
  A   megrok.z3ctable/trunk/src/megrok/z3ctable/__init__.py
  A   megrok.z3ctable/trunk/src/megrok/z3ctable/components.py
  A   megrok.z3ctable/trunk/src/megrok/z3ctable/configure.zcml
  A   megrok.z3ctable/trunk/src/megrok/z3ctable/directive.py
  A   megrok.z3ctable/trunk/src/megrok/z3ctable/meta.py
  A   megrok.z3ctable/trunk/src/megrok/z3ctable/meta.zcml
  A   megrok.z3ctable/trunk/src/megrok/z3ctable/tests/
  A   megrok.z3ctable/trunk/src/megrok/z3ctable/tests/__init__.py
  A   megrok.z3ctable/trunk/src/megrok/z3ctable/tests/adapters.py
  A   megrok.z3ctable/trunk/src/megrok/z3ctable/tests/ftesting.zcml
  A   megrok.z3ctable/trunk/src/megrok/z3ctable/tests/implicit.py
  A   megrok.z3ctable/trunk/src/megrok/z3ctable/tests/test_general.py
  A   megrok.z3ctable/trunk/src/megrok/z3ctable/tests/views.py
  A   megrok.z3ctable/trunk/src/megrok/z3ctable/tests/views_templates/
  A   megrok.z3ctable/trunk/src/megrok/z3ctable/tests/views_templates/tablelayout.pt
  A   megrok.z3ctable/trunk/src/megrok/z3ctable/tests/views_templates/tablepageinlayout.pt
  A   megrok.z3ctable/trunk/src/megrok/z3ctable/tests/views_templates/tableview.pt
  A   megrok.z3ctable/trunk/src/megrok/z3ctable/tests/views_templates/tw.pt
  A   megrok.z3ctable/trunk/versions.cfg

-=-
Added: megrok.z3ctable/trunk/LICENSE.txt
===================================================================
--- megrok.z3ctable/trunk/LICENSE.txt	                        (rev 0)
+++ megrok.z3ctable/trunk/LICENSE.txt	2010-05-07 09:54:16 UTC (rev 112116)
@@ -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.

Added: megrok.z3ctable/trunk/bootstrap.py
===================================================================
--- megrok.z3ctable/trunk/bootstrap.py	                        (rev 0)
+++ megrok.z3ctable/trunk/bootstrap.py	2010-05-07 09:54:16 UTC (rev 112116)
@@ -0,0 +1,55 @@
+##############################################################################
+#
+# Copyright (c) 2006 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: bootstrap.py 90212 2008-08-25 14:15:22Z thefunny42 $
+"""
+
+import os, shutil, sys, tempfile, urllib2
+
+tmpeggs = tempfile.mkdtemp()
+
+try:
+    import pkg_resources
+except ImportError:
+    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)

Added: megrok.z3ctable/trunk/buildout.cfg
===================================================================
--- megrok.z3ctable/trunk/buildout.cfg	                        (rev 0)
+++ megrok.z3ctable/trunk/buildout.cfg	2010-05-07 09:54:16 UTC (rev 112116)
@@ -0,0 +1,11 @@
+[buildout]
+develop = .
+parts = test
+extends = http://svn.zope.org/*checkout*/groktoolkit/trunk/grok.cfg
+versions = versions
+newest = false
+
+[test]
+recipe = zc.recipe.testrunner
+eggs = megrok.z3ctable [test]
+defaults = ['--tests-pattern', '^f?tests$', '-v', '-c']

Added: megrok.z3ctable/trunk/docs/HISTORY.txt
===================================================================
--- megrok.z3ctable/trunk/docs/HISTORY.txt	                        (rev 0)
+++ megrok.z3ctable/trunk/docs/HISTORY.txt	2010-05-07 09:54:16 UTC (rev 112116)
@@ -0,0 +1,49 @@
+Changelog
+=========
+
+1.4.1 (2010-02-21)
+------------------
+
+* Cleaned out all the zope.app dependencies. Removed unused imports
+  and re-structured the tests module. We are now using minimal
+  dependencies.
+
+* ``megrok.z3ctable`` now requires ``zope.component >= 3.9.1``. This
+  means you have to use the latest ZTK KGS in your buildout. This KGS
+  can be included via the groktoolkit.
+
+
+1.4.0 (2010-01-16)
+------------------
+
+* Now using ztk versions and fixed it for z3c.table >= 0.8
+
+
+1.3.0 (2009-09-24)
+------------------
+
+* Now Columns have their own grokker. Before that, they were treated
+  as basic multi adapters. We now use a dedicated grokking component
+  with explicit directives that can be auto-linked to context and
+  table components. Read the test "test_implicit" in the ftests for
+  more details. [trollfot]
+
+
+1.2.1 (2009-09-18)
+------------------
+
+* Add a new test for a template in a form [cklinger]
+
+
+1.2.0 (2009-09-17)
+------------------
+
+* Let megrok.z3ctable work with grokcore.view 1.12.2 [cklinger]
+
+
+1.1.0 (2009-09-19)
+------------------
+
+* Adapted megrok.z3ctable to the new version of megrok.layout and
+  grokcore.view [cklinger]
+

Added: megrok.z3ctable/trunk/setup.py
===================================================================
--- megrok.z3ctable/trunk/setup.py	                        (rev 0)
+++ megrok.z3ctable/trunk/setup.py	2010-05-07 09:54:16 UTC (rev 112116)
@@ -0,0 +1,55 @@
+from setuptools import setup, find_packages
+import os
+
+version = '1.4.1'
+readme = open(os.path.join("src", "megrok", "z3ctable", "README.txt")).read()
+history = open(os.path.join("docs", "HISTORY.txt")).read()
+
+test_requires = [
+    'zope.site',
+    'zope.browserpage',
+    'zope.configuration',
+    'zope.container',
+    'zope.interface',
+    'zope.security',
+    'zope.testing',
+    'zope.traversing',
+    ]
+
+setup(name='megrok.z3ctable',
+      version=version,
+      description="A table component package for Grok based on z3c.table.",
+      long_description= u"%s\n\n%s" % (readme, history),
+      classifiers=[
+          "Framework :: Zope3",
+          "Programming Language :: Python",
+          "Programming Language :: Zope",
+          "Intended Audience :: Developers",
+          "Development Status :: 4 - Beta",
+          "Topic :: Software Development :: Libraries :: Python Modules",
+          ],
+      keywords='grok table zope3',
+      author='Souheil Chelfouh',
+      author_email='trollfot at gmail.com',
+      url='http://pypi.python.org/pypi/megrok.z3ctable',
+      license='ZPL',
+      package_dir={'':'src'},
+      packages=find_packages('src', exclude=['ez_setup']),
+      namespace_packages=['megrok'],
+      include_package_data=True,
+      zip_safe=False,
+      install_requires=[
+	  'grokcore.component',
+	  'megrok.layout >= 0.9',
+          'grokcore.view >= 1.12',
+          'martian',
+          'setuptools',
+          'z3c.table >= 0.8',
+          'zope.component >= 3.9.1',
+          'zope.publisher',
+      ],
+      extras_require={'test': test_requires},
+      entry_points="""
+      # -*- Entry points: -*-
+      """,
+      )

Added: megrok.z3ctable/trunk/src/megrok/__init__.py
===================================================================
--- megrok.z3ctable/trunk/src/megrok/__init__.py	                        (rev 0)
+++ megrok.z3ctable/trunk/src/megrok/__init__.py	2010-05-07 09:54:16 UTC (rev 112116)
@@ -0,0 +1,6 @@
+# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__)

Added: megrok.z3ctable/trunk/src/megrok/z3ctable/CREDITS.txt
===================================================================
--- megrok.z3ctable/trunk/src/megrok/z3ctable/CREDITS.txt	                        (rev 0)
+++ megrok.z3ctable/trunk/src/megrok/z3ctable/CREDITS.txt	2010-05-07 09:54:16 UTC (rev 112116)
@@ -0,0 +1,20 @@
+=======
+Credits
+=======
+
+Authors
+-------
+
+  - Souheil Chelfouh <trollfot at gmail.com>
+
+  - Christian Klinger <cklinger at novareto.de>
+
+
+Sponsors
+--------
+
+  - http://www.npai.fr
+
+  - http://www.dolmen-project.org
+
+  - http://www.novareto.de

Added: megrok.z3ctable/trunk/src/megrok/z3ctable/README.txt
===================================================================
--- megrok.z3ctable/trunk/src/megrok/z3ctable/README.txt	                        (rev 0)
+++ megrok.z3ctable/trunk/src/megrok/z3ctable/README.txt	2010-05-07 09:54:16 UTC (rev 112116)
@@ -0,0 +1,142 @@
+===============
+megrok.z3ctable
+===============
+
+The `megrok.z3ctable` package is a wrapper around the z3c.table
+components. z3c.table allows you to define HTML tables as zope3
+components, defining columns as multi adapters.
+
+Thanks to megrok.z3ctable, these components are now fully available
+in Grok, making them easy to declare and configure. The following
+components are available :
+
+  - Table
+  - Column
+  - Value
+
+Beyond a simple wrapping, megrok.z3cform brings you new convenient
+ways to create pages displaying a table :
+
+  - TableView : a simple browser view displaying a table.
+  - TablePage : a table browser view included in a layout
+    (see megrok.layout)
+
+For more information and more detailed examples please look in the
+tests directory of this package.
+
+
+Getting started
+---------------
+
+First, we grok the package grokkers::
+
+  >>> import grokcore.component as grok
+  >>> from grokcore.component import testing
+  >>> from grokcore.component.testing import grok_component
+  >>> testing.grok('megrok.z3ctable')
+  
+
+Test Setup
+----------
+
+Let's create simple items to demonstrate the package. Here, the
+table will be the representation of a folder listing, displaying (in an
+ordered way), the content of a simple container::
+
+  >>> from megrok.z3ctable.tests import Container, Content
+  >>> from zope.container import btree
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+
+Let's create 2 dummy content::
+
+  >>> christian = Content('Christian', 29)
+  >>> trollfot = Content('Trollfot', 27) 
+
+Then, we instanciate a container and store the 2 dummies inside::
+
+  >>> container = Container()
+  >>> container['christian'] = christian
+  >>> container['trollfot'] = trollfot
+
+  
+A simple Table
+--------------
+
+We define a simple table. Here, the component only registers itself,
+there's no logic defined inside::
+
+  >>> from megrok.z3ctable import Table, Values 
+  >>> from megrok.z3ctable import ITable
+
+  >>> class SimpleTable(Table):
+  ...    """ My Simple Table """
+
+  >>> ITable.implementedBy(Table)
+  True
+
+Let's make an instance of the Table::
+
+  >>> myTable = SimpleTable(container, request)
+  >>> ITable.providedBy(myTable)
+  True
+
+Now, we need to feed our table with contents. In order to provide a
+pluggable way to fetch the content, z3c.table proposes an adapter
+called "Values". It is in charge of getting in the data to display::
+
+  >>> class MyValues(Values):
+  ...     grok.adapts(btree.BTreeContainer, None, SimpleTable)
+  ...
+  ...     @property
+  ...     def values(self):
+  ...         return self.context.values()
+
+We grok the MyValues Adapter::
+
+  >>> grok_component('MyValues', MyValues)
+  True
+
+  >>> myTable.update()
+  >>> myTable.render()
+  u''
+
+There is currently no output this is because the table itself contains
+no logic. The data is displayed by components called "Column". A
+Column is a multi adapter, adapting the view, the request and the
+table. It permits a very flexible handling of the tables and the data
+representations. Let's define a simple Column::
+
+  >>> from zope.interface import Interface
+  >>> from megrok.z3ctable import NameColumn
+  >>> from megrok.z3ctable import table
+  >>> class Names(NameColumn):
+  ...     grok.context(Interface)
+  ...     table(SimpleTable)
+
+Now we grok our Column::
+
+  >>> grok_component('Names', Names)
+  True
+
+and render the Table again::
+
+  >>> myTable.update()
+  >>> print myTable.render()
+  <table>
+    <thead>
+      <tr>
+        <th>Name</th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr>
+        <td>christian</td>
+      </tr>
+      <tr>
+        <td>trollfot</td>
+      </tr>
+    </tbody>
+  </table>
+
+Here you go. A fully functional and pluggable table. Enjoy.

Added: megrok.z3ctable/trunk/src/megrok/z3ctable/__init__.py
===================================================================
--- megrok.z3ctable/trunk/src/megrok/z3ctable/__init__.py	                        (rev 0)
+++ megrok.z3ctable/trunk/src/megrok/z3ctable/__init__.py	2010-05-07 09:54:16 UTC (rev 112116)
@@ -0,0 +1,3 @@
+from megrok.z3ctable.components import *
+from megrok.z3ctable.directive import table
+from z3c.table.interfaces import ITable, IColumn

Added: megrok.z3ctable/trunk/src/megrok/z3ctable/components.py
===================================================================
--- megrok.z3ctable/trunk/src/megrok/z3ctable/components.py	                        (rev 0)
+++ megrok.z3ctable/trunk/src/megrok/z3ctable/components.py	2010-05-07 09:54:16 UTC (rev 112116)
@@ -0,0 +1,110 @@
+# -*- coding: utf-8 -*-
+
+import megrok.layout
+import grokcore.view as view
+import grokcore.component as grok
+from z3c.table import table, column, interfaces
+
+
+class Table(table.Table):
+    """A table.
+    """
+
+
+class TableView(view.View, Table):
+    """A view that renders a Table.
+    """
+    grok.baseclass()
+
+    def __init__(self, context, request):
+        view.View.__init__(self, context, request)
+        Table.__init__(self, context, request)
+
+    def update(self):
+        Table.update(self)
+
+    def render(self):
+        return Table.render(self)
+
+    render.base_method = True
+
+
+class TablePage(megrok.layout.Page, Table):
+    """A Page that renders a Table.
+    """
+    grok.baseclass()
+
+    def __init__(self, context, request):
+        megrok.layout.Page.__init__(self, context, request)
+        Table.__init__(self, context, request)
+
+    def update(self):
+        Table.update(self)
+
+    def render(self):
+        template = getattr(self, 'template', None)
+        if template is not None:
+            return self.template.render(self)
+        return self.renderTable()
+
+    render.base_method = True
+
+
+class Column(column.Column):
+    """ A basic Column
+    """
+    grok.baseclass()
+    grok.provides(interfaces.IColumn)
+
+
+class NameColumn(column.NameColumn, Column):
+    """Name Column
+    """
+    grok.baseclass()
+
+
+class GetAttrColumn(column.GetAttrColumn, Column):
+    """GetAttr Column
+    """
+    grok.baseclass()
+
+
+class CheckBoxColumn(column.CheckBoxColumn, Column):
+    """CheckBox Column
+    """
+    grok.baseclass()
+
+
+class LinkColumn(column.LinkColumn, Column):
+    """Link Column
+    """
+    grok.baseclass()
+
+
+class ModifiedColumn(column.ModifiedColumn, Column):
+    """Modified Column
+    """
+    grok.baseclass()
+
+
+class Values(grok.MultiAdapter):
+    """Adapter for custom Value Implementation
+    """
+    grok.baseclass()
+    grok.provides(interfaces.IValues)
+
+    def __init__(self, context, request, table):
+        self.context = context
+        self.request = request
+        self.table = table
+
+    @property
+    def values(self):
+        return NotImplementedError(
+            """Your class must override the `Values` method.""")
+
+
+__all__ = ('Table', 'TableView', 'TablePage',
+           'NameColumn', 'Column', 'GetAttrColumn',
+           'CheckBoxColumn', 'LinkColumn', 'Values',
+           'ModifiedColumn')

Added: megrok.z3ctable/trunk/src/megrok/z3ctable/configure.zcml
===================================================================
--- megrok.z3ctable/trunk/src/megrok/z3ctable/configure.zcml	                        (rev 0)
+++ megrok.z3ctable/trunk/src/megrok/z3ctable/configure.zcml	2010-05-07 09:54:16 UTC (rev 112116)
@@ -0,0 +1,3 @@
+<configure xmlns="http://namespaces.zope.org/zope">
+  <include package="z3c.table" />
+</configure>

Added: megrok.z3ctable/trunk/src/megrok/z3ctable/directive.py
===================================================================
--- megrok.z3ctable/trunk/src/megrok/z3ctable/directive.py	                        (rev 0)
+++ megrok.z3ctable/trunk/src/megrok/z3ctable/directive.py	2010-05-07 09:54:16 UTC (rev 112116)
@@ -0,0 +1,9 @@
+# -*- coding: utf-8 -*-
+
+import martian
+
+
+class table(martian.Directive):
+    scope = martian.CLASS_OR_MODULE
+    store = martian.ONCE
+    validate = martian.validateInterfaceOrClass

Added: megrok.z3ctable/trunk/src/megrok/z3ctable/meta.py
===================================================================
--- megrok.z3ctable/trunk/src/megrok/z3ctable/meta.py	                        (rev 0)
+++ megrok.z3ctable/trunk/src/megrok/z3ctable/meta.py	2010-05-07 09:54:16 UTC (rev 112116)
@@ -0,0 +1,46 @@
+# -*- coding: utf-8 -*-
+
+import martian
+import grokcore.view
+import megrok.z3ctable
+import grokcore.component
+
+from zope import component
+from z3c.table.interfaces import ITable
+from grokcore.component.scan import determine_module_component
+from grokcore.component.meta import default_provides as default
+from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+
+
+class TableGrokker(martian.GlobalGrokker):
+    """Grokker dedicated to find the table within a module.
+    This allows to set implicit relationships bewteen a table and a column.
+    """
+    martian.priority(991)
+
+    def grok(self, name, module, module_info, config, **kw):
+        table = determine_module_component(module_info,
+                                           megrok.z3ctable.table,
+                                           megrok.z3ctable.ITable)
+        megrok.z3ctable.table.set(module, table)
+        return True
+
+
+class ColumnGrokker(martian.ClassGrokker):
+    martian.priority(990)
+    martian.component(megrok.z3ctable.components.Column)
+
+    martian.directive(grokcore.component.name)
+    martian.directive(grokcore.component.context)
+    martian.directive(megrok.z3ctable.table, default=ITable)
+    martian.directive(grokcore.component.provides, get_default=default)
+    martian.directive(grokcore.view.layer, default=IDefaultBrowserLayer)
+
+    def execute(self, factory, config, layer, context, table, provides, name):
+        for_ = (context, layer, table)
+        config.action(
+            discriminator=('adapter', for_, provides, name),
+            callable=component.provideAdapter,
+            args=(factory, for_, provides, name),
+            )
+        return True

Added: megrok.z3ctable/trunk/src/megrok/z3ctable/meta.zcml
===================================================================
--- megrok.z3ctable/trunk/src/megrok/z3ctable/meta.zcml	                        (rev 0)
+++ megrok.z3ctable/trunk/src/megrok/z3ctable/meta.zcml	2010-05-07 09:54:16 UTC (rev 112116)
@@ -0,0 +1,10 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:meta="http://namespaces.zope.org/meta"
+    xmlns:grok="http://namespaces.zope.org/grok">
+
+  <include package="grokcore.component" file="meta.zcml" />
+  <grok:grok package=".meta" />
+
+</configure>
+

Added: megrok.z3ctable/trunk/src/megrok/z3ctable/tests/__init__.py
===================================================================
--- megrok.z3ctable/trunk/src/megrok/z3ctable/tests/__init__.py	                        (rev 0)
+++ megrok.z3ctable/trunk/src/megrok/z3ctable/tests/__init__.py	2010-05-07 09:54:16 UTC (rev 112116)
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+
+import grokcore.component as grok
+import zope.component
+from zope.component.interfaces import IComponentLookup
+from zope.component.testlayer import ZCMLFileLayer
+from zope.container import btree
+from zope.container.interfaces import ISimpleReadContainer
+from zope.container.traversal import ContainerTraversable
+from zope.interface import Interface
+from zope.site.folder import rootFolder
+from zope.site.site import LocalSiteManager, SiteManagerAdapter
+from zope.traversing.interfaces import ITraversable
+from zope.traversing.testing import setUp
+
+
+def siteSetUp(test):
+
+    zope.component.hooks.setHooks()
+    
+    # Set up site manager adapter
+    zope.component.provideAdapter(
+        SiteManagerAdapter, (Interface,), IComponentLookup)
+
+    # Set up traversal
+    setUp()
+    zope.component.provideAdapter(
+        ContainerTraversable, (ISimpleReadContainer,), ITraversable)
+
+    # Set up site
+    site = rootFolder()
+    site.setSiteManager(LocalSiteManager(site))
+    zope.component.hooks.setSite(site)
+
+    return site
+
+
+def siteTearDown(test):
+    zope.component.hooks.resetHooks()
+    zope.component.hooks.setSite()
+
+
+class megrokZ3ctableLayer(ZCMLFileLayer):
+    pass
+
+
+class Container(grok.Context, btree.BTreeContainer):
+    """Example Container. 
+    """
+    __name__ = u'container'
+
+
+class Content(grok.Context):
+    """Example Content.
+    """
+    def __init__(self, title, number):
+        self.title = title
+        self.number = number

Added: megrok.z3ctable/trunk/src/megrok/z3ctable/tests/adapters.py
===================================================================
--- megrok.z3ctable/trunk/src/megrok/z3ctable/tests/adapters.py	                        (rev 0)
+++ megrok.z3ctable/trunk/src/megrok/z3ctable/tests/adapters.py	2010-05-07 09:54:16 UTC (rev 112116)
@@ -0,0 +1,211 @@
+"""
+Sample data setup
+-----------------
+
+Let's create a sample container which we can use as our iterable context:
+
+  >>> from zope.site.hooks import getSite
+  >>> root = getSite()
+  >>> container = Container()
+
+and set a parent for the container:
+
+  >>> root['container'] = container
+
+Now setup some items:
+
+  >>> container[u'first'] = Content('First', 1)
+  >>> container[u'second'] = Content('Second', 2)
+  >>> container[u'third'] = Content('Third', 3)
+
+  >>> from zope.publisher.browser import TestRequest
+  >>> table = Table(container, TestRequest())
+
+Start with a very Basic Example
+
+  >>> from megrok.z3ctable import ITable
+  >>> ITable.providedBy(table)
+  True
+
+  >>> from z3c.table.interfaces import ITable as IOriginalTable
+  >>> ITable is IOriginalTable
+  True
+
+  >>> table.update()
+  >>> table.render()
+  u''
+
+Work on a table with some Columns
+
+  >>> mytable = MyTable(container, TestRequest())
+  >>> IMyTable.providedBy(mytable)
+  True
+
+  >>> mytable.update()
+  >>> print mytable.render()
+  <table>
+    <thead>
+      <tr>
+        <th>Title</th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr>
+        <td>Title: First</td>
+      </tr>
+      <tr>
+        <td>Title: Second</td>
+      </tr>
+      <tr>
+        <td>Title: Third</td>
+      </tr>
+    </tbody>
+  </table>
+
+Name Column, GetAttrColumn, LinkColumn and CheckboxColumn
+
+  >>> nametable = NameTable(container, TestRequest())
+  >>> nametable.update()
+  >>> print nametable.render()
+  <table>
+    <thead>
+      <tr>
+        <th>X</th>
+        <th>Name</th>
+        <th>Number</th>
+        <th>edit</th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr>
+        <td><input type="checkbox" class="checkbox-widget" name="table-checkBox-0-selectedItems" value="first"  /></td>
+        <td>first</td>
+        <td>1</td>
+        <td><a href="http://127.0.0.1/container/first/edit">edit this item</a></td>
+      </tr>
+      <tr>
+        <td><input type="checkbox" class="checkbox-widget" name="table-checkBox-0-selectedItems" value="second"  /></td>
+        <td>second</td>
+        <td>2</td>
+        <td><a href="http://127.0.0.1/container/second/edit">edit this item</a></td>
+      </tr>
+      <tr>
+        <td><input type="checkbox" class="checkbox-widget" name="table-checkBox-0-selectedItems" value="third"  /></td>
+        <td>third</td>
+        <td>3</td>
+        <td><a href="http://127.0.0.1/container/third/edit">edit this item</a></td>
+      </tr>
+    </tbody>
+  </table>
+
+
+
+Custom Values for the Table
+
+  >>> customValues = CustomValues(container, TestRequest())
+  >>> customValues.update()
+  >>> print customValues.render()
+  <table>
+    <thead>
+      <tr>
+        <th>Name</th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr>
+        <td></td>
+      </tr>
+      <tr>
+        <td></td>
+      </tr>
+    </tbody>
+  </table>
+  
+"""
+
+import grokcore.component as grok
+from zope.interface import Interface
+from zope.publisher.interfaces.browser import IBrowserRequest
+from megrok.z3ctable.tests import Container, Content
+from megrok.z3ctable import (Table, Column, NameColumn,
+                             GetAttrColumn, CheckBoxColumn,
+			     LinkColumn, Values, table)
+
+
+class IMyTable(Interface):
+    """Marker Interface for MyTable
+    """
+
+
+class MyTable(Table):
+    grok.implements(IMyTable)
+
+
+class Title(Column):
+    grok.name('firstColumn') 
+    grok.context(Interface)
+    table(IMyTable)
+
+    weight = 10
+    header = u'Title'
+
+    def renderCell(self, item):
+        return u'Title: %s' % item.title
+
+
+class NameTable(Table):
+    pass
+
+
+class CheckBox(CheckBoxColumn):
+    grok.name('checkBox')
+    grok.context(Interface)
+    table(NameTable)
+    weight = 0
+
+
+class Name(NameColumn):
+    grok.name('secondColumn') 
+    grok.context(Interface)
+    table(NameTable)
+    weight = 1
+
+
+class Number(GetAttrColumn):
+    grok.name('numberColumn')
+    grok.context(Interface)
+    table(NameTable)
+    attrName = u"number"
+    weight = 2 
+    header = u"Number"
+
+
+class Link(LinkColumn):
+    grok.name('link')
+    grok.context(Interface)
+    table(NameTable)
+    weight = 3
+    header = u"edit"
+    linkName = u"edit"
+    linkContent = u"edit this item"
+    
+
+class CustomValues(Table):
+    pass
+
+
+class MyValues(Values):
+    grok.adapts(Container, IBrowserRequest, CustomValues)
+
+    @property
+    def values(self):
+        return [Content('eins', 1), Content('zwei', 2)]
+
+
+class CustomName(GetAttrColumn):
+    grok.name('nColumn') 
+    grok.context(Interface)
+    table(CustomValues)
+    attrName = u"name"
+    weight = 1
+    header = u"Name"

Added: megrok.z3ctable/trunk/src/megrok/z3ctable/tests/ftesting.zcml
===================================================================
--- megrok.z3ctable/trunk/src/megrok/z3ctable/tests/ftesting.zcml	                        (rev 0)
+++ megrok.z3ctable/trunk/src/megrok/z3ctable/tests/ftesting.zcml	2010-05-07 09:54:16 UTC (rev 112116)
@@ -0,0 +1,21 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:grok="http://namespaces.zope.org/grok">
+
+  <include package="grokcore.view" file="meta.zcml" />
+  <include package="megrok.layout" file="meta.zcml"/>
+  <include package="zope.browserpage" file="meta.zcml" />
+  <include package="zope.component" file="meta.zcml" />
+  <include package="zope.security" file="meta.zcml" />
+
+  <include package="grokcore.view"/>
+  <include package="z3c.table"/>
+  <include package="zope.container" />
+  <include package="zope.security" />
+  <include package="zope.traversing" />
+  <include package="zope.traversing.browser" />
+ 
+  <include package="megrok.z3ctable" file="meta.zcml"/>
+  <grok:grok package="megrok.z3ctable.tests" />
+
+</configure>

Added: megrok.z3ctable/trunk/src/megrok/z3ctable/tests/implicit.py
===================================================================
--- megrok.z3ctable/trunk/src/megrok/z3ctable/tests/implicit.py	                        (rev 0)
+++ megrok.z3ctable/trunk/src/megrok/z3ctable/tests/implicit.py	2010-05-07 09:54:16 UTC (rev 112116)
@@ -0,0 +1,76 @@
+"""
+Implicit is sometimes readable
+==============================
+
+In this exemple, we are going to demonstrate the implicit link between a table 
+and a column, using auto resolving directives. Instead of directly declaring
+the context and the table used to fetch a column, we resolve them by looking
+into the module. Here, the column will automatically be register for the table
+'SimpleTable' and the context 'DummyContainer' as they are the only possible
+values in the module for these directives. This behavior, of course, can be
+overriden by an explicit declaration of the directives at the class level.
+
+  >>> from zope.publisher.browser import TestRequest
+  
+  >>> mongo = DummyContainer()
+  >>> mongo['useless'] = object()
+  
+  >>> silly_table = SimpleTable(mongo, TestRequest())
+  >>> silly_table.update()
+  >>> print silly_table.render()
+    <table>
+      <thead>
+        <tr>
+          <th>Mongo</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr>
+          <td>I'm dumb</td>
+        </tr>
+      </tbody>
+    </table>
+
+
+To be sure that our column doesn't exist for any other context, we try to
+render the table using another context::
+
+  >>> john = Container()
+  >>> empty_table = SimpleTable(john, TestRequest())
+  >>> empty_table.update()
+  >>> empty_table.render()
+  u''
+
+The table is empty : no column is registered for this context.
+We can make the same test for the table::
+
+  >>> class AnotherTable(Table):
+  ...   '''Another table'''
+  >>> empty_table = AnotherTable(mongo, TestRequest())
+  >>> empty_table.update()
+  >>> empty_table.render()
+  u''
+  
+"""
+
+import grokcore.component as grok
+from megrok.z3ctable import Table, Column
+from megrok.z3ctable.tests import Container
+
+
+class DummyContainer(Container):
+    """A stupid context
+    """
+
+class SimpleTable(Table):
+    """A simple table
+    """
+
+class DumbColumn(Column):
+    grok.name('firstColumn') 
+
+    weight = 10
+    header = u'Mongo'
+
+    def renderCell(self, item):
+        return u"I'm dumb"

Added: megrok.z3ctable/trunk/src/megrok/z3ctable/tests/test_general.py
===================================================================
--- megrok.z3ctable/trunk/src/megrok/z3ctable/tests/test_general.py	                        (rev 0)
+++ megrok.z3ctable/trunk/src/megrok/z3ctable/tests/test_general.py	2010-05-07 09:54:16 UTC (rev 112116)
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+
+import unittest
+from megrok.z3ctable import tests
+from zope.testing import doctest
+
+
+def make_test(dottedname):
+    test = doctest.DocTestSuite(
+        dottedname, setUp=tests.siteSetUp, tearDown=tests.siteTearDown,
+        optionflags=doctest.ELLIPSIS+doctest.NORMALIZE_WHITESPACE)
+    test.layer = tests.megrokZ3ctableLayer(tests)
+    return test
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    readme = doctest.DocFileSuite(
+        '../README.txt', globs={'__name__': 'megrok.z3ctable'},
+        optionflags=(doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS))
+    readme.layer = tests.megrokZ3ctableLayer(tests)
+    suite.addTest(readme)
+    for name in ['views', 'implicit', 'adapters']:
+        dottedname = dottedname = 'megrok.z3ctable.tests.%s' % name
+        suite.addTest(make_test(dottedname))
+    return suite

Added: megrok.z3ctable/trunk/src/megrok/z3ctable/tests/views.py
===================================================================
--- megrok.z3ctable/trunk/src/megrok/z3ctable/tests/views.py	                        (rev 0)
+++ megrok.z3ctable/trunk/src/megrok/z3ctable/tests/views.py	2010-05-07 09:54:16 UTC (rev 112116)
@@ -0,0 +1,211 @@
+"""
+Sample data setup
+-----------------
+
+Let's create a sample container which we can use as our iterable context:
+
+  >>> from zope.site.hooks import getSite
+  >>> root = getSite()
+  >>> cont = Container()
+
+and set a parent for the cont:
+
+  >>> root['cont'] = cont
+
+Now setup some items:
+
+  >>> from megrok.z3ctable.tests import Content
+
+  >>> cont[u'first'] = Content('First', 1)
+  >>> cont[u'second'] = Content('Second', 2)
+  >>> cont[u'third'] = Content('Third', 3)
+
+  >>> from zope.component import getMultiAdapter
+  >>> from zope.publisher.browser import TestRequest
+  >>> table_view = getMultiAdapter((cont, TestRequest()), name=u'tableview')
+  >>> print table_view()
+  <table>
+    <thead>
+      <tr>
+        <th>Name</th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr>
+        <td>first</td>
+      </tr>
+      <tr>
+        <td>second</td>
+      </tr>
+      <tr>
+        <td>third</td>
+      </tr>
+    </tbody>
+  </table>
+
+
+  >>> tvwt = getMultiAdapter((cont, TestRequest()), name=u'tvwt')
+  >>> print tvwt()
+  <html>
+   <body>
+    <h1> This is my nice Table renderd in a Templage</h1>
+    <table>
+    <thead>
+      <tr>
+        <th>Name</th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr>
+        <td>first</td>
+      </tr>
+      <tr>
+        <td>second</td>
+      </tr>
+      <tr>
+        <td>third</td>
+      </tr>
+    </tbody>
+  </table>
+   </body>
+  </html>
+
+table renderd in a layout with an template
+
+  >>> tpil = getMultiAdapter((cont, TestRequest()), name=u'tablepageinlayout')
+  >>> print tpil()
+  <html>
+   <body>
+     <div class="layout"><div>
+    <table>
+    <thead>
+      <tr>
+        <th>Name</th>
+        <th>Number</th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr>
+        <td></td>
+        <td></td>
+      </tr>
+      <tr>
+        <td></td>
+        <td></td>
+      </tr>
+      <tr>
+        <td></td>
+        <td></td>
+      </tr>
+    </tbody>
+  </table>
+  </div> 
+  </div>
+   </body>
+  </html>
+
+
+table renderd in a layout with an render method
+
+  >>> twr = getMultiAdapter((cont, TestRequest()), name=u'tablewithrender')
+  >>> print twr()
+  <html>
+   <body>
+     <div class="layout"><table>
+    <thead>
+      <tr>
+        <th>Title</th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr>
+        <td>first</td>
+      </tr>
+      <tr>
+        <td>second</td>
+      </tr>
+      <tr>
+        <td>third</td>
+      </tr>
+    </tbody>
+  </table></div>
+   </body>
+  </html>
+
+
+"""
+
+import grokcore.component as grok
+from zope.interface import Interface
+from megrok.z3ctable.tests import Container
+from megrok.layout import Layout
+from megrok.z3ctable import (TableView, table, 
+                             GetAttrColumn, NameColumn, TablePage)
+
+
+class TableView(TableView):
+    grok.context(Container)
+
+
+class Name(NameColumn):
+    grok.context(Interface)
+    table(TableView)
+
+
+class TW(TableView):
+    grok.name('tvwt')
+    grok.context(Container)
+
+
+class NewName(NameColumn):
+    grok.context(Interface)
+    table(TW)
+
+
+class TableLayout(Layout):
+    grok.context(Interface)
+
+
+class TablePageInLayout(TablePage):
+    grok.context(Container)
+
+
+class MyName(GetAttrColumn):
+    grok.name('myname')
+    grok.context(Interface)
+    table(TablePageInLayout)
+    header = u"Name"
+    weight = 1 
+
+
+class MyNumbers(GetAttrColumn):
+    grok.name('mynumbers')
+    grok.context(Interface)
+    table(TablePageInLayout)
+    header = u"Number"
+    weight = 2
+
+
+class TableWithRender(TablePage):
+    grok.context(Container)
+
+    def render(self):
+        return self.renderTable()
+
+
+class Title(NameColumn):
+    """Display the name of the content item
+    """
+    grok.context(Interface)
+    table(TableWithRender)
+    header = u"Title"
+
+
+def test_suite():
+    from zope.testing import doctest
+    from megrok.z3ctable.ftests import FunctionalLayer
+    suite = doctest.DocTestSuite(
+        optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS
+        )
+    suite.layer = FunctionalLayer
+    return suite 

Added: megrok.z3ctable/trunk/src/megrok/z3ctable/tests/views_templates/tablelayout.pt
===================================================================
--- megrok.z3ctable/trunk/src/megrok/z3ctable/tests/views_templates/tablelayout.pt	                        (rev 0)
+++ megrok.z3ctable/trunk/src/megrok/z3ctable/tests/views_templates/tablelayout.pt	2010-05-07 09:54:16 UTC (rev 112116)
@@ -0,0 +1,8 @@
+<html>
+ <body>
+   <div class="layout" tal:content="structure view/render">
+         here comes the content
+   </div>
+ </body>
+</html>
+

Added: megrok.z3ctable/trunk/src/megrok/z3ctable/tests/views_templates/tablepageinlayout.pt
===================================================================
--- megrok.z3ctable/trunk/src/megrok/z3ctable/tests/views_templates/tablepageinlayout.pt	                        (rev 0)
+++ megrok.z3ctable/trunk/src/megrok/z3ctable/tests/views_templates/tablepageinlayout.pt	2010-05-07 09:54:16 UTC (rev 112116)
@@ -0,0 +1,3 @@
+<div>
+  <div tal:replace="structure view/renderTable"/>
+</div> 

Added: megrok.z3ctable/trunk/src/megrok/z3ctable/tests/views_templates/tableview.pt
===================================================================
--- megrok.z3ctable/trunk/src/megrok/z3ctable/tests/views_templates/tableview.pt	                        (rev 0)
+++ megrok.z3ctable/trunk/src/megrok/z3ctable/tests/views_templates/tableview.pt	2010-05-07 09:54:16 UTC (rev 112116)
@@ -0,0 +1 @@
+<div tal:replace="structure view/renderTable" />

Added: megrok.z3ctable/trunk/src/megrok/z3ctable/tests/views_templates/tw.pt
===================================================================
--- megrok.z3ctable/trunk/src/megrok/z3ctable/tests/views_templates/tw.pt	                        (rev 0)
+++ megrok.z3ctable/trunk/src/megrok/z3ctable/tests/views_templates/tw.pt	2010-05-07 09:54:16 UTC (rev 112116)
@@ -0,0 +1,7 @@
+<html>
+ <body>
+  <h1> This is my nice Table renderd in a Templage</h1>
+
+  <div tal:replace="structure view/renderTable"/>
+ </body>
+</html> 

Added: megrok.z3ctable/trunk/versions.cfg
===================================================================
--- megrok.z3ctable/trunk/versions.cfg	                        (rev 0)
+++ megrok.z3ctable/trunk/versions.cfg	2010-05-07 09:54:16 UTC (rev 112116)
@@ -0,0 +1,112 @@
+[versions]
+ClientForm = 0.2.9
+grokcore.component = 1.7
+grokcore.formlib = 1.3
+grokcore.security = 1.2
+grokcore.view = 1.12.1
+grokcore.viewlet = 1.3
+grokui.admin = 0.4.0
+martian = 0.11
+mechanize = 0.1.7b
+pytz = 2007k
+RestrictedPython = 3.4.2
+simplejson = 1.7.1
+z3c.autoinclude = 0.2.2
+z3c.flashmessage = 1.0
+z3c.recipe.eggbasket = 0.4.3
+z3c.testsetup = 0.4
+zc.catalog = 1.2.0
+ZConfig = 2.5.1
+zc.recipe.testrunner = 1.0.0
+zdaemon = 2.0.2
+ZODB3 = 3.8.3
+zodbcode = 3.4.0
+zope.annotation = 3.4.1
+zope.app.apidoc = 3.4.3
+zope.app.applicationcontrol = 3.4.3
+zope.app.appsetup = 3.4.1
+zope.app.authentication = 3.4.4
+zope.app.basicskin = 3.4.0
+zope.app.broken = 3.4.0
+zope.app.catalog = 3.5.1
+zope.app.component = 3.4.1
+zope.app.container = 3.5.6
+zope.app.content = 3.4.0
+zope.app.debug = 3.4.1
+zope.app.dependable = 3.4.0
+zope.app.error = 3.5.1
+zope.app.exception = 3.4.1
+zope.app.file = 3.4.4
+zope.app.folder = 3.4.0
+zope.app.form = 3.4.1
+zope.app.generations = 3.4.1
+zope.app.http = 3.4.1
+zope.app.i18n = 3.4.4
+zope.app.interface = 3.4.0
+zope.app.intid = 3.4.1
+zope.app.keyreference = 3.4.1
+zope.app.locales = 3.4.5
+zope.app.onlinehelp = 3.4.1
+zope.app.pagetemplate = 3.4.1
+zope.app.preference = 3.4.1
+zope.app.principalannotation = 3.4.0
+zope.app.publication = 3.4.3
+zope.app.publisher = 3.5.1
+zope.app.renderer = 3.4.0
+zope.app.rotterdam = 3.4.1
+zope.app.schema = 3.4.0
+zope.app.security = 3.5.2
+zope.app.securitypolicy = 3.4.6
+zope.app.server = 3.4.2
+zope.app.session = 3.5.1
+zope.app.skins = 3.4.0
+zope.app.testing = 3.4.3
+zope.app.tree = 3.4.0
+zope.app.twisted = 3.4.1
+zope.app.wsgi = 3.4.2
+zope.app.zapi = 3.4.0
+zope.app.zcmlfiles = 3.4.3
+zope.app.zopeappgenerations = 3.4.0
+zope.cachedescriptors = 3.4.1
+zope.component = 3.4.0
+zope.configuration = 3.4.0
+zope.contentprovider = 3.4.0
+zope.contenttype = 3.4.0
+zope.copypastemove = 3.4.0
+zope.datetime = 3.4.0
+zope.deferredimport = 3.4.0
+zope.deprecation = 3.4.0
+zope.dottedname = 3.4.2
+zope.dublincore = 3.4.0
+zope.error = 3.5.1
+zope.event = 3.4.0
+zope.exceptions = 3.4.0
+zope.filerepresentation = 3.4.0
+zope.formlib = 3.4.0
+zope.hookable = 3.4.0
+zope.i18n = 3.4.0
+zope.i18nmessageid = 3.4.3
+zope.index = 3.4.1
+zope.interface = 3.4.1
+zope.lifecycleevent = 3.4.0
+zope.location = 3.4.0
+zope.minmax = 1.1.0
+zope.modulealias = 3.4.0
+zope.pagetemplate = 3.4.0
+zope.proxy = 3.4.2
+zope.publisher = 3.4.9
+zope.schema = 3.4.0
+zope.security = 3.4.1
+zope.securitypolicy = 3.4.1
+zope.server = 3.4.3
+zope.session = 3.4.1
+zope.size = 3.4.0
+zope.structuredtext = 3.4.0
+zope.tal = 3.4.1
+zope.tales = 3.4.0
+zope.testbrowser = 3.4.2
+zope.testing = 3.7.6
+zope.thread = 3.4
+zope.traversing = 3.4.1
+zope.viewlet = 3.4.2
+



More information about the checkins mailing list