[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