[Checkins] SVN: grok/branches/darrylcousins-branch/ Doing ok here methinks

Darryl Cousins darryl at darrylcousins.net.nz
Mon Jul 2 06:02:38 EDT 2007


Log message for revision 77295:
  Doing ok here methinks

Changed:
  U   grok/branches/darrylcousins-branch/buildout.cfg
  U   grok/branches/darrylcousins-branch/megrok.layer/setup.py
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/README.txt
  U   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/__init__.py
  U   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/components.py
  D   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/
  U   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.py
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/__init__.py
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/configure.zcml
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/ftesting.zcml
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/__init__.py
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/__init__.py
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/ellie.py
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/static/
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/static/file.txt
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/static/static.pt
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/static/subdir/
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/static/subdir/otherfile.txt
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/static.py
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/view.py
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/test_layer.py
  A   grok/branches/darrylcousins-branch/megrok.template/
  A   grok/branches/darrylcousins-branch/megrok.template/setup.py
  A   grok/branches/darrylcousins-branch/megrok.template/src/
  A   grok/branches/darrylcousins-branch/megrok.template/src/megrok/
  A   grok/branches/darrylcousins-branch/megrok.template/src/megrok/__init__.py
  A   grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/
  A   grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/README.txt
  A   grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/__init__.py
  A   grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/components.py
  A   grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/directive.py
  A   grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/meta.py
  A   grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/meta.zcml
  A   grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/
  A   grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/__init__.py
  A   grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/configure.zcml
  A   grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/ftesting.zcml
  A   grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/template/
  A   grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/template/__init__.py
  A   grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/template/view.py
  A   grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/template/view_templates/
  A   grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/template/view_templates/myfactory.pt
  A   grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/test_template.py
  A   grok/branches/darrylcousins-branch/megrok.view/
  A   grok/branches/darrylcousins-branch/megrok.view/setup.py
  A   grok/branches/darrylcousins-branch/megrok.view/src/
  A   grok/branches/darrylcousins-branch/megrok.view/src/megrok/
  A   grok/branches/darrylcousins-branch/megrok.view/src/megrok/__init__.py
  A   grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/
  A   grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/README.txt
  A   grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/__init__.py
  A   grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/components.py
  A   grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/directive.py
  A   grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/meta.py
  A   grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/meta.zcml
  A   grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/
  A   grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/__init__.py
  A   grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/configure.zcml
  A   grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/ftesting.zcml
  A   grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/test_view.py
  A   grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/
  A   grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/__init__.py
  A   grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/argument.py
  A   grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/index.py
  A   grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/layout.py
  A   grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/macros.py
  A   grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/template.py
  A   grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/template_templates/
  A   grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/template_templates/drawing.pt
  A   grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/view.py
  U   grok/branches/darrylcousins-branch/megrok.viewlet/setup.py
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/README.txt
  U   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/components.py
  D   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/
  U   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.py
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/__init__.py
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/configure.zcml
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/ftesting.zcml
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/test_viewlet.py
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/__init__.py
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/adapter.py
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/adapter_templates/
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/adapter_templates/painting.pt
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view.py
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view_templates/
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view_templates/firstmanager.pt
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view_templates/index.pt
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view_templates/secondviewlet.pt
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view_templates/skinnedindex.pt
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view_templates/title.pt

-=-
Modified: grok/branches/darrylcousins-branch/buildout.cfg
===================================================================
--- grok/branches/darrylcousins-branch/buildout.cfg	2007-07-02 09:52:32 UTC (rev 77294)
+++ grok/branches/darrylcousins-branch/buildout.cfg	2007-07-02 10:02:38 UTC (rev 77295)
@@ -1,5 +1,5 @@
 [buildout]
-develop = . grokwiki ldapaddressbook martian megrok.layer megrok.viewlet
+develop = . grokwiki ldapaddressbook martian megrok.layer megrok.viewlet megrok.view megrok.template
 parts = app data instance test devpython
 find-links = http://download.zope.org/distribution/
 
@@ -12,7 +12,9 @@
        grokwiki
        martian
        megrok.layer
+       megrok.template
        megrok.viewlet
+       megrok.view
 recipe = zc.zope3recipes:app
 site.zcml = <include package="zope.security" file="meta.zcml" />
             <include package="zope.i18n" file="meta.zcml" />
@@ -20,6 +22,7 @@
             <include package="zope.app.zcmlfiles" file="meta.zcml" />
             <include package="zope.viewlet" file="meta.zcml" />
             <include package="grok" file="meta.zcml" />
+            <include package="megrok.view" file="meta.zcml" />
             <include package="megrok.layer" file="meta.zcml" />
             <include package="megrok.viewlet" file="meta.zcml" />
 
@@ -88,7 +91,9 @@
 eggs = grok
        martian
        megrok.layer
+       megrok.template
        megrok.viewlet
+       megrok.view
 defaults = ['--tests-pattern', '^f?tests$', '-v']
 
 # installs bin/devpython to do simple interpreter tests

Modified: grok/branches/darrylcousins-branch/megrok.layer/setup.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/setup.py	2007-07-02 09:52:32 UTC (rev 77294)
+++ grok/branches/darrylcousins-branch/megrok.layer/setup.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -1,5 +1,9 @@
+import os
 from setuptools import setup, find_packages
 
+def read(*rnames):
+    return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
+
 setup(
     name='megrok.layer',
     version='0.1',
@@ -7,8 +11,11 @@
     author_email='grok-dev at zope.org',
     url='http://svn.zope.org/grok/trunk',
     description="""\
-Grok: Now even cavemen can use z3c.form!
+Grok: Now even cavemen can use Zope3!
 """,
+    long_description=(
+        read('src/megrok/layer/README.txt')
+        ),
     packages=find_packages('src'),
     package_dir = {'': 'src'},
     include_package_data = True,
@@ -17,9 +24,7 @@
 
     install_requires=['setuptools',
                       'z3c.layer',
-                      'z3c.template',
-                      'z3c.macro',
-                      'z3c.pagelet',
+                      'megrok.view',
                      ],
 )
 

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/README.txt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/README.txt	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/README.txt	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,13 @@
+============
+Megrok Layer
+============
+
+This package is part of an attempt to use the wonderful tools provided in the
+z3c namespace to the grok cave.
+
+The grok.ILayer provides IDefaultBrowser, megrok.layer provides IMinimalLayer
+and IPageletLayer which respectively provide z3c.minimal.IMinimalBrowserLayer
+and z3c.layer.pagelet.IPageletBrowserLayer. Both of which provide
+IBrowserRequest but *not* IDefaultLayer.
+
+More about these layers can be found in z3c.layer.*.README's.


Property changes on: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/README.txt
___________________________________________________________________
Name: svn:keywords
   + Date Author

Modified: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/__init__.py	2007-07-02 09:52:32 UTC (rev 77294)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/__init__.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -1,4 +1,3 @@
 from directive import layer
-from components import ILayer, Skin
-from components import IMinimalLayer, IPageletLayer
+from components import Skin, IMinimalLayer, IPageletLayer
 

Modified: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/components.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/components.py	2007-07-02 09:52:32 UTC (rev 77294)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/components.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -1,14 +1,15 @@
 from zope.publisher.interfaces.browser import IBrowserRequest
+import zope.interface
 from z3c.layer.pagelet import IPageletBrowserLayer
 from z3c.layer.minimal import IMinimalBrowserLayer
 
-class ILayer(IBrowserRequest):
+class ILayer(zope.interface.Interface):
     pass
 
-class IMinimalLayer(IMinimalBrowserLayer):
+class IMinimalLayer(ILayer, IMinimalBrowserLayer):
     pass
 
-class IPageletLayer(IPageletBrowserLayer):
+class IPageletLayer(ILayer, IPageletBrowserLayer):
     pass
 
 class Skin(object):

Modified: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.py	2007-07-02 09:52:32 UTC (rev 77294)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -6,9 +6,10 @@
                                                IBrowserSkinType)
 from martian import util
 import megrok.layer
+from megrok.layer.components import ILayer
 
 class ILayerGrokker(martian.ClassGrokker):
-    component_class = megrok.layer.ILayer
+    component_class = ILayer
 
 
 class SkinGrokker(martian.ClassGrokker):

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/__init__.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/__init__.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1 @@
+#


Property changes on: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/configure.zcml
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/configure.zcml	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/configure.zcml	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,8 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:browser="http://namespaces.zope.org/browser">
+
+  <include file="ftesting.zcml" />
+
+</configure>
+

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/ftesting.zcml
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/ftesting.zcml	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/ftesting.zcml	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,16 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:meta="http://namespaces.zope.org/meta"
+           xmlns:browser="http://namespaces.zope.org/browser"
+           i18n_domain="zope"
+           package="megrok.layer.tests">
+
+  <include package="grok" file="meta.zcml" />
+  <include package="megrok.view" file="meta.zcml" />
+  <include package="megrok.layer" file="meta.zcml" />
+
+  <include package="z3c.layer.minimal.tests" file="ftesting.zcml" />
+
+  <include package="grok" />
+
+</configure>
+

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/__init__.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/__init__.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1 @@
+#


Property changes on: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/__init__.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/__init__.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1 @@
+# this is a package


Property changes on: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/ellie.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/ellie.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/ellie.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,36 @@
+import grok
+import megrok.layer
+
+class Mammoth(grok.Model):
+    pass
+
+class Index(grok.View):
+    grok.context(Mammoth)
+
+index = grok.PageTemplate("""\
+<html>
+<body>
+<a tal:attributes="href static/file.txt">Some text in a file</a>
+</body>
+</html>""")
+
+class MammothLayer(megrok.layer.IMinimalLayer):
+    pass
+
+class MammothSkin(megrok.layer.Skin):
+    megrok.layer.layer(MammothLayer)
+
+
+class CaveDrawings(grok.View):
+    grok.context(Mammoth)
+
+    def render(self):
+        return "stick figures"
+
+class TarPit(grok.View):
+    grok.context(Mammoth)
+    megrok.layer.layer(MammothLayer)
+
+    def render(self):
+        return "inky darkness all around"
+    


Property changes on: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/ellie.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/static/file.txt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/static/file.txt	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/static/file.txt	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1 @@
+some text


Property changes on: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/static/file.txt
___________________________________________________________________
Name: svn:keywords
   + Date Author

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/static/static.pt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/static/static.pt	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/static/static.pt	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,5 @@
+<html>
+<body>
+<h1 tal:content="string:will not be interpreted"/>
+</body>
+</html>

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/static/subdir/otherfile.txt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/static/subdir/otherfile.txt	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/static/subdir/otherfile.txt	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1 @@
+This is yet another file.


Property changes on: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/simple_fixture/static/subdir/otherfile.txt
___________________________________________________________________
Name: svn:keywords
   + Date Author

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/static.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/static.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/static.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,65 @@
+"""
+If there is a static/ directory inside of a grokked package, its
+contents will be available as static resources under a URL:
+
+  >>> import grok
+  >>> grok.grok('megrok.layer.tests.layer.simple_fixture')
+  >>> from zope.testbrowser.testing import Browser
+  >>> browser = Browser()
+  >>> browser.handleErrors = False
+  >>> browser.open('http://localhost/@@/megrok.layer.tests.layer.simple_fixture/'
+  ...              'file.txt')
+  >>> print browser.contents
+  some text
+
+We use a special name 'static' in page templates to allow easy linking
+to resources:
+
+  >>> root = getRootFolder()
+  >>> from megrok.layer.tests.layer.simple_fixture.ellie import Mammoth
+  >>> root[u'ellie'] = Mammoth()
+  >>> browser.open('http://localhost/ellie')
+  >>> print browser.contents
+  <html>
+  <body>
+  <a href="http://localhost/@@/megrok.layer.tests.layer.simple_fixture/file.txt">Some text in a file</a>
+  </body>
+  </html>
+
+Static also means that page templates will not be interpreted:
+
+  >>> browser.open('http://localhost/@@/megrok.layer.tests.layer.simple_fixture/static.pt')
+  >>> print browser.contents
+  <html>
+  <body>
+  <h1 tal:content="string:will not be interpreted"/>
+  </body>
+  </html>
+
+We also support subdirectories for resources:
+
+  >>> browser.open('http://localhost/@@/megrok.layer.tests.layer.simple_fixture/subdir/otherfile.txt')
+  >>> print browser.contents
+  This is yet another file.
+
+Sanity check custom layers
+
+  >>> browser.open('http://localhost/ellie/@@cavedrawings')
+  >>> print browser.contents
+  stick figures
+
+  >>> browser.open('http://localhost/++skin++mammothskin/ellie/@@tarpit')
+  >>> print browser.contents
+  inky darkness all around
+
+
+  >>> browser.open('http://localhost/++skin++mammothskin/@@/megrok.layer.tests.layer.simple_fixture/subdir/otherfile.txt')
+  >>> print browser.contents
+  This is yet another file.
+
+  >>> browser.open('http://localhost/++skin++Rotterdam/@@/megrok.layer.tests.layer.simple_fixture/subdir/otherfile.txt')
+  >>> print browser.contents
+  This is yet another file.
+  
+"""
+


Property changes on: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/static.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/view.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/view.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/view.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,73 @@
+"""
+  >>> import grok
+  >>> from megrok.layer.tests.layer.view import Mammoth
+  >>> grok.grok('megrok.layer.tests.layer.view')
+  >>> getRootFolder()["manfred"] = Mammoth()
+
+  >>> from zope.testbrowser.testing import Browser
+  >>> browser = Browser()
+  >>> browser.handleErrors = False
+  >>> browser.open("http://localhost/++skin++Basic/manfred/cavedrawings")
+  >>> print browser.contents
+  <html>
+  <body>
+  <h1>Hello, world!</h1>
+  </body>
+  </html>
+  
+
+  >>> browser.open("http://localhost/++skin++Rotterdam/manfred/cavedrawings")
+  Traceback (most recent call last):
+  ...
+  NotFound: Object: <megrok.layer.tests.layer.view.Mammoth object at ...>, name: u'cavedrawings'
+
+  >>> browser.open("http://localhost/++skin++Rotterdam/manfred/moredrawings")
+  >>> print browser.contents
+  Pretty
+
+  >>> browser.open("http://localhost/++skin++myskin/manfred/evenmoredrawings")
+  >>> print browser.contents
+  Awesome
+
+"""
+import grok
+from zope.app.basicskin import IBasicSkin
+from zope.publisher.interfaces.browser import IBrowserRequest
+from zope.app.rotterdam import rotterdam
+from zope import interface
+
+import megrok.layer
+megrok.layer.layer(IBasicSkin)
+
+class MySkinLayer(megrok.layer.IMinimalLayer):
+    pass
+
+class MySkin(megrok.layer.Skin):
+    megrok.layer.layer(MySkinLayer)
+
+class Mammoth(grok.Model):
+    pass
+
+class CaveDrawings(grok.View):
+    pass
+
+cavedrawings = grok.PageTemplate("""\
+<html>
+<body>
+<h1>Hello, world!</h1>
+</body>
+</html>
+""")
+
+class MoreDrawings(grok.View):
+    megrok.layer.layer(rotterdam)
+
+    def render(self):
+        return "Pretty"
+
+class EvenMoreDrawings(grok.View):
+    megrok.layer.layer(MySkinLayer)
+
+    def render(self):
+        return "Awesome"
+


Property changes on: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/layer/view.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/test_layer.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/test_layer.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/test_layer.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,37 @@
+import unittest
+from pkg_resources import resource_listdir
+
+from grok.ftests.test_grok_functional import FunctionalDocTestSuite
+
+from zope.app.testing import functional
+functional.defineLayer('TestLayer', 'ftesting.zcml')
+
+def suiteFromPackage(name):
+    files = resource_listdir(__name__, name)
+    suite = unittest.TestSuite()
+    for filename in files:
+        if not filename.endswith('.py'):
+            continue
+        if filename == '__init__.py':
+            continue
+
+        dottedname = 'megrok.layer.tests.%s.%s' % (name, filename[:-3])
+        test = FunctionalDocTestSuite(dottedname)
+        test.layer = TestLayer
+
+        suite.addTest(test)
+    return suite
+
+def test_suite():
+    suite = unittest.TestSuite()
+    s = functional.FunctionalDocFileSuite('../README.txt')
+    s.layer = TestLayer
+    suite.addTest(s)
+    for name in ['layer']:
+        suite.addTest(suiteFromPackage(name))
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')
+


Property changes on: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/tests/test_layer.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.template/setup.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.template/setup.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.template/setup.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,31 @@
+import os
+from setuptools import setup, find_packages
+
+def read(*rnames):
+    return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
+
+setup(
+    name='megrok.template',
+    version='0.1',
+    author='Grok Team',
+    author_email='grok-dev at zope.org',
+    url='http://svn.zope.org/grok/trunk',
+    description="""\
+Grok: Now even cavemen can use Zope3!
+""",
+    long_description=(
+        read('src/megrok/template/README.txt')
+        ),
+    packages=find_packages('src'),
+    package_dir = {'': 'src'},
+    include_package_data = True,
+    zip_safe=False,
+    license='ZPL',
+
+    install_requires=['setuptools',
+                      'z3c.template',
+                      'megrok.view',
+                     ],
+)
+
+


Property changes on: grok/branches/darrylcousins-branch/megrok.template/setup.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.template/src/megrok/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.template/src/megrok/__init__.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.template/src/megrok/__init__.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,7 @@
+try:
+    # Declare this a namespace package if pkg_resources is available.
+    import pkg_resources
+    pkg_resources.declare_namespace('megrok')
+except ImportError:
+    pass
+


Property changes on: grok/branches/darrylcousins-branch/megrok.template/src/megrok/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/README.txt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/README.txt	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/README.txt	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,3 @@
+===============
+Megrok Template
+===============


Property changes on: grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/README.txt
___________________________________________________________________
Name: svn:keywords
   + Date Author

Added: grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/__init__.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/__init__.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,3 @@
+from directive import layout, macro
+from components import TemplateFactory
+


Property changes on: grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/components.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/components.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/components.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,11 @@
+import zope.component
+import zope.interface
+from zope.publisher.interfaces.browser import IBrowserRequest
+from zope.publisher.browser import BrowserPage
+from zope.pagetemplate.interfaces import IPageTemplate
+
+
+class TemplateFactory(object):
+    pass
+
+


Property changes on: grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/components.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/directive.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/directive.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/directive.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,9 @@
+from martian.directive import (InterfaceOrClassDirective,
+                            ClassDirectiveContext)
+
+layout = InterfaceOrClassDirective('megrok.template.layout',
+                           ClassDirectiveContext())
+macro = InterfaceOrClassDirective('megrok.template.macro',
+                           ClassDirectiveContext())
+content_type = InterfaceOrClassDirective('megrok.template.content_type',
+                           ClassDirectiveContext())


Property changes on: grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/directive.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/meta.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/meta.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/meta.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,58 @@
+import zope.component
+import zope.interface
+from zope.publisher.interfaces.browser import IBrowserRequest
+from zope.pagetemplate.interfaces import IPageTemplate
+
+from z3c.template.template import TemplateFactory
+
+import martian
+from martian import util
+
+import grok
+from grok.util import check_adapts
+
+import megrok.template
+
+# TODO raise errors if anything missing?
+class TemplateFactoryGrokker(martian.ClassGrokker):
+    component_class = megrok.template.TemplateFactory
+
+    def grok(self, name, factory, context, module_info, templates):
+        view_context = util.determine_class_context(factory, context)
+        factory.module_info = module_info
+        factory_name = factory.__name__.lower()
+
+        template_name = util.class_annotation(factory, 'grok.template',
+                                              factory_name)
+        template = templates.get(template_name)
+        if factory_name != template_name:
+            # grok.template is being used
+            if templates.get(self.factory_name):
+                raise GrokError("Multiple possible templates for template %r. It "
+                                "uses grok.template('%s'), but there is also "
+                                "a template called '%s'."
+                                % (factory, template_name, factory_name),
+                                factory)
+
+        provides = util.class_annotation(factory, 'grok.provides', IPageTemplate)
+        macro = util.class_annotation(factory, 'megrok.template.macro', None)
+        contentType = util.class_annotation(factory,
+                                    'megrok.template.content_type', 'text/html')
+        view_layer = util.class_annotation(factory, 'megrok.layer.layer',
+                                       None) or module_info.getAnnotation('megrok.layer.layer',
+                                       None) or IBrowserRequest
+        view_name = util.class_annotation(factory, 'grok.name', u'')
+
+
+        filename = template.__grok_location__
+        factory = TemplateFactory(filename, contentType, macro)
+        templates.markAssociated(template_name)
+        zope.interface.directlyProvides(factory, provides)
+        zope.component.provideAdapter(factory,
+                                 adapts=(view_context, view_layer),
+                                 provides=provides,
+                                 name=view_name)
+        return True
+
+
+


Property changes on: grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/meta.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/meta.zcml
===================================================================
--- grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/meta.zcml	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/meta.zcml	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,2 @@
+<grok package=".meta" xmlns="http://namespaces.zope.org/grok" />
+

Added: grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/__init__.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/__init__.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1 @@
+#


Property changes on: grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/configure.zcml
===================================================================
--- grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/configure.zcml	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/configure.zcml	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,8 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:browser="http://namespaces.zope.org/browser">
+
+  <include file="ftesting.zcml" />
+
+</configure>
+

Added: grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/ftesting.zcml
===================================================================
--- grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/ftesting.zcml	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/ftesting.zcml	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,67 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:meta="http://namespaces.zope.org/meta"
+           xmlns:browser="http://namespaces.zope.org/browser"
+           i18n_domain="zope"
+           package="megrok.layer.tests">
+
+  <include package="grok" file="meta.zcml" />
+  <include package="megrok.view" file="meta.zcml" />
+  <include package="megrok.viewlet" file="meta.zcml" />
+  <include package="megrok.layer" file="meta.zcml" />
+  <include package="megrok.template" file="meta.zcml" />
+
+  <include package="zope.app.zcmlfiles" />
+
+  <!-- -->
+  <!-- -->
+
+  <include package="zope.app.securitypolicy" file="meta.zcml" />
+  <include package="zope.app.authentication" />
+  <securityPolicy
+    component="zope.app.securitypolicy.zopepolicy.ZopeSecurityPolicy" />
+
+  <include package="zope.app.securitypolicy" />
+
+  <role id="zope.Anonymous" title="Everybody"
+        description="All users have this role implicitly" />
+
+  <role id="zope.Manager" title="Site Manager" />
+
+  <principal
+   id="zope.manager"
+   title="Administrator"
+   login="mgr"
+   password="mgrpw" />
+
+  <grant
+   role="zope.Manager"
+   principal="zope.manager"
+   />
+
+  <unauthenticatedPrincipal
+    id="zope.anybody"
+    title="Unauthenticated User" />
+
+  <unauthenticatedGroup
+    id="zope.Anybody"
+    title="Unauthenticated Users"
+    />
+
+  <authenticatedGroup
+    id="zope.Authenticated"
+    title="Authenticated Users"
+    />
+
+  <everybodyGroup
+    id="zope.Everybody"
+    title="All Users"
+    />
+
+  <grantAll role="zope.Manager" />
+
+
+  <include package="grok" />
+
+</configure>
+
+

Added: grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/template/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/template/__init__.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/template/__init__.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1 @@
+#


Property changes on: grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/template/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/template/view.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/template/view.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/template/view.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,32 @@
+"""
+  >>> import grok
+  >>> from megrok.template.tests.template.view import MyFactory, Mammoth
+  >>> grok.grok('megrok.template.tests.template.view')
+
+  >>> mammoth = Mammoth()
+  >>> import zope.component
+  >>> from zope.pagetemplate.interfaces import IPageTemplate
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+  >>> template = zope.component.getMultiAdapter(
+  ...              (mammoth, request), IPageTemplate)
+  >>> print template
+  <zope.app.pagetemplate.viewpagetemplatefile.ViewPageTemplateFile object at ...>
+
+"""
+
+import grok
+
+import megrok.template
+import zope.interface
+
+class Mammoth(grok.Model):
+    pass
+
+class MyFactory(megrok.template.TemplateFactory):
+    pass
+
+#myfactory = grok.PageTemplate("""\
+#<div>Factory template</div>
+#""")
+


Property changes on: grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/template/view.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/template/view_templates/myfactory.pt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/template/view_templates/myfactory.pt	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/template/view_templates/myfactory.pt	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1 @@
+<div>Factory template</div>

Added: grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/test_template.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/test_template.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/test_template.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,37 @@
+import unittest
+from pkg_resources import resource_listdir
+
+from grok.ftests.test_grok_functional import FunctionalDocTestSuite
+
+from zope.app.testing import functional
+functional.defineLayer('TestLayer', 'ftesting.zcml')
+
+def suiteFromPackage(name):
+    files = resource_listdir(__name__, name)
+    suite = unittest.TestSuite()
+    for filename in files:
+        if not filename.endswith('.py'):
+            continue
+        if filename == '__init__.py':
+            continue
+
+        dottedname = 'megrok.template.tests.%s.%s' % (name, filename[:-3])
+        test = FunctionalDocTestSuite(dottedname)
+        test.layer = TestLayer
+
+        suite.addTest(test)
+    return suite
+
+def test_suite():
+    suite = unittest.TestSuite()
+    s = functional.FunctionalDocFileSuite('../README.txt')
+    s.layer = TestLayer
+    suite.addTest(s)
+    for name in ['template']:
+        suite.addTest(suiteFromPackage(name))
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')
+


Property changes on: grok/branches/darrylcousins-branch/megrok.template/src/megrok/template/tests/test_template.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.view/setup.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.view/setup.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.view/setup.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,29 @@
+import os
+from setuptools import setup, find_packages
+
+def read(*rnames):
+    return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
+
+setup(
+    name='megrok.view',
+    version='0.1',
+    author='Grok Team',
+    author_email='grok-dev at zope.org',
+    url='http://svn.zope.org/grok/trunk',
+    description="""\
+Grok: Now even cavemen can use Zope3!
+""",
+    long_description=(
+        read('src/megrok/view/README.txt')
+        ),
+    packages=find_packages('src'),
+    package_dir = {'': 'src'},
+    include_package_data = True,
+    zip_safe=False,
+    license='ZPL',
+
+    install_requires=['setuptools',
+                      'megrok.template',
+                     ],
+)
+


Property changes on: grok/branches/darrylcousins-branch/megrok.view/setup.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.view/src/megrok/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.view/src/megrok/__init__.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.view/src/megrok/__init__.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,7 @@
+try:
+    # Declare this a namespace package if pkg_resources is available.
+    import pkg_resources
+    pkg_resources.declare_namespace('megrok')
+except ImportError:
+    pass
+


Property changes on: grok/branches/darrylcousins-branch/megrok.view/src/megrok/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/README.txt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/README.txt	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/README.txt	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,6 @@
+===========
+Megrok View
+===========
+
+This package is part of an attempt to use the wonderful tools provided in the
+z3c namespace to the grok cave.


Property changes on: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/README.txt
___________________________________________________________________
Name: svn:keywords
   + Date Author

Added: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/__init__.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/__init__.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1 @@
+from components import View, TemplateView, LayoutView


Property changes on: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/components.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/components.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/components.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,186 @@
+import zope.component
+import zope.interface
+from zope.publisher.browser import BrowserPage
+from zope.publisher.publish import mapply
+from zope.pagetemplate.interfaces import IPageTemplate
+
+from z3c.template.interfaces import ILayoutTemplate
+
+import grok
+from grok.interfaces import IGrokView
+
+class ViewBase(object):
+
+    def _render_template(self):
+        namespace = self.template.pt_getContext()
+        namespace['request'] = self.request
+        namespace['view'] = self
+        namespace['context'] = self.context
+        namespace['static'] = self.static
+        return self.template.pt_render(namespace)
+
+    def application(self):
+        obj = self.context
+        while obj is not None:
+            if isinstance(obj, grok.Application):
+                return obj
+            obj = obj.__parent__
+        raise ValueErrror("No application found.")
+
+    def site(self):
+        obj = self.context
+        while obj is not None:
+            if isinstance(obj, grok.Site):
+                return obj
+            obj = obj.__parent__
+        raise ValueErrror("No site found.")
+
+    def application_url(self, name=None):
+        obj = self.context
+        while obj is not None:
+            if isinstance(obj, grok.Application):
+                return self.url(obj, name)
+            obj = obj.__parent__
+        raise ValueErrror("No application found.")
+
+    def url(self, obj=None, name=None):
+        # if the first argument is a string, that's the name. There should
+        # be no second argument
+        if isinstance(obj, basestring):
+            if name is not None:
+                raise TypeError(
+                    'url() takes either obj argument, obj, string arguments, '
+                    'or string argument')
+            name = obj
+            obj = None
+
+        if name is None and obj is None:
+            # create URL to view itself
+            obj = self
+        elif name is not None and obj is None:
+            # create URL to view on context
+            obj = self.context
+        return url(self.request, obj, name)
+        
+    def redirect(self, url):
+        return self.request.response.redirect(url)
+        
+    @property
+    def response(self):
+        return self.request.response
+
+    def update(self):
+        pass
+
+    def __getitem__(self, key):
+        # XXX give nice error message if template is None
+        return self.template.macros[key]
+
+
+class View(BrowserPage, ViewBase):
+    zope.interface.implements(IGrokView)
+
+    def __init__(self, context, request):
+        super(View, self).__init__(context, request)
+        self.static = zope.component.queryAdapter(
+            self.request,
+            zope.interface.Interface,
+            name=self.module_info.package_dotted_name
+            )
+
+    def __call__(self):
+        mapply(self.update, (), self.request)
+        if self.request.response.getStatus() in (302, 303):
+            # A redirect was triggered somewhere in update().  Don't
+            # continue rendering the template or doing anything else.
+            return
+
+        template = getattr(self, 'template', None)
+        if template is not None:
+            return self._render_template()
+        return mapply(self.render, (), self.request)
+
+class ITemplateView(zope.interface.Interface):
+    pass
+
+class TemplateView(BrowserPage, ViewBase):
+    """This differs from the above in that instead of expecting a template
+    or render method, the template will be looked up.
+    No call method is provided.
+    
+    This is at the moment experimentation with z3c.template package.
+
+    Probable it will go away and I'll just use megrok.pagelet.
+    """
+    zope.interface.implements(ITemplateView)
+    template = None
+
+    def __init__(self, context, request):
+        super(TemplateView, self).__init__(context, request)
+        self.static = zope.component.queryAdapter(
+            self.request,
+            zope.interface.Interface,
+            name=self.module_info.package_dotted_name
+            )
+
+    def _render_template(self):
+        # z3c.template factory is a z.a.viewpagetemplatefile
+        namespace = self.template.pt_getContext(self, self.request)
+        namespace['request'] = self.request
+        namespace['view'] = self
+        namespace['context'] = self.context
+        namespace['static'] = self.static
+        #for key in namespace.keys():
+        #    print key
+        return self.template.pt_render(namespace)
+
+    def render(self):
+        # should check if update() is not called elsewhere
+        mapply(self.update, (), self.request)
+        if self.template is None:
+            self.template = zope.component.getMultiAdapter(
+                (self, self.request), IPageTemplate)
+            self.template.macro = None
+            return self._render_template()
+        return self._render_template()
+
+class ILayoutView(zope.interface.Interface):
+    pass
+
+class LayoutView(BrowserPage, ViewBase):
+    """This differs from the above in that instead of expecting a template
+    or render method, a layout template will be looked up in the call method
+    
+    This is at the moment experimentation with z3c.template package.
+
+    Probable it will go away and I'll just use megrok.pagelet.
+    """
+    zope.interface.implements(ILayoutView)
+    layout = None
+
+    def __init__(self, context, request):
+        super(LayoutView, self).__init__(context, request)
+        self.static = zope.component.queryAdapter(
+            self.request,
+            zope.interface.Interface,
+            name=self.module_info.package_dotted_name
+            )
+
+    def _render_layout(self):
+        # z3c.template factory is a z.a.viewpagetemplatefile
+        namespace = self.layout.pt_getContext(self, self.request)
+        namespace['request'] = self.request
+        namespace['view'] = self
+        namespace['context'] = self.context
+        namespace['static'] = self.static
+        return self.layout.pt_render(namespace)
+
+    def __call__(self):
+        # should check if update() is not called elsewhere
+        mapply(self.update, (), self.request)
+        if self.layout is None:
+            self.layout = zope.component.getMultiAdapter(
+                (self, self.request), ILayoutTemplate)
+            return self._render_layout()
+        return self._render_layout()
+


Property changes on: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/components.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/directive.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/directive.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/directive.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1 @@
+#


Property changes on: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/directive.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/meta.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/meta.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/meta.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,164 @@
+import zope.component
+import zope.interface
+from zope.publisher.interfaces.browser import IBrowserRequest
+
+from z3c.template.template import TemplateFactory
+
+import martian
+from martian.error import GrokError
+from martian import util
+
+import grok
+from grok.util import get_default_permission, make_checker
+
+import megrok.view
+
+class ViewGrokkerBase(martian.ClassGrokker):
+    """Code resuse for View, ContentProvider and Viewlet grokkers"""
+    component_class = None
+    factory_name = ''
+    view_name = ''
+    layer_name = ''
+    view_context = None
+
+    def grok(self, name, factory, context, module_info, templates):
+        self.view_context = util.determine_class_context(factory, context)
+        factory.module_info = module_info
+        self.factory_name = factory.__name__.lower()
+
+        # find templates
+        template_name = util.class_annotation(factory, 'grok.template',
+                                              self.factory_name)
+        template = templates.get(template_name)
+
+        if self.factory_name != template_name:
+            # grok.template is being used
+            if templates.get(self.factory_name):
+                raise GrokError("Multiple possible templates for view %r. It "
+                                "uses grok.template('%s'), but there is also "
+                                "a template called '%s'."
+                                % (factory, template_name, self.factory_name),
+                                factory)
+
+        self.register_template(factory, template, template_name, templates)
+
+        self.view_layer = util.class_annotation(factory, 'megrok.layer.layer',
+                                           None) or module_info.getAnnotation('megrok.layer.layer',
+                                               None) or IBrowserRequest
+
+        self.view_name = util.class_annotation(factory, 'grok.name',
+                                          self.factory_name)
+
+        # __view_name__ is needed to support IAbsoluteURL on views
+        factory.__view_name__ = self.view_name
+
+        self.register(factory, module_info)
+
+        # protect view, public by default
+        default_permission = get_default_permission(factory)
+        make_checker(factory, factory, default_permission)
+
+        # safety belt: make sure that the programmer didn't use
+        # @grok.require on any of the view's methods.
+        methods = util.methods_from_class(factory)
+        for method in methods:
+            if getattr(method, '__grok_require__', None) is not None:
+                raise GrokError('The @grok.require decorator is used for '
+                                'method %r in view %r. It may only be used '
+                                'for XML-RPC methods.'
+                                % (method.__name__, factory), factory)
+
+        return True
+
+    def register_template(self, factory, template, template_name, templates):
+        """May be overridden"""
+        if template:
+            templates.markAssociated(template_name)
+            factory.template = template
+        else:
+            if not getattr(factory, 'render', None):
+                # we do not accept a view without any way to render it
+                raise GrokError("View %r has no associated template or "
+                                "'render' method." % factory, factory)
+
+
+    def register(self, factory, module_info):
+        """Must be defined in subclasses"""
+        pass
+
+
+class ViewGrokker(ViewGrokkerBase):
+    component_class = megrok.view.View
+
+    def register(self, factory, module_info):
+
+        zope.component.provideAdapter(factory,
+                                 adapts=(self.view_context, self.view_layer),
+                                 provides=zope.interface.Interface,
+                                 name=self.view_name)
+
+class TemplateViewGrokker(ViewGrokkerBase):
+    component_class = megrok.view.TemplateView
+
+    def register(self, factory, module_info):
+
+        zope.component.provideAdapter(factory,
+                                 adapts=(self.view_context, self.view_layer),
+                                 provides=zope.interface.Interface,
+                                 name=self.view_name)
+
+    def register_template(self, factory, template, template_name, templates):
+        """Jumping a bit here to make the z3c.template Macro available to the
+        template, either it needs to be in grok.PageTemplate ...?"""
+        contentType = getattr(factory, 'contentType', 'text/html')
+        if template:
+            print '\n', template, '\n'
+            #filename = getattr(template, 'filename', None)
+            #if not filename:
+            #    raise GrokError("%s cannot use the inline "
+            #                    "template called '%s'. Please use grok.PageTemplateFle "
+            #                    "or drop a template in %s_templates called '%s'"
+            #                    % (factory, template_name, 
+            #                       factory.module_info.name, 
+            #                       self.factory_name),
+            #                    factory)
+            filename = template.__grok_location__
+            templates.markAssociated(template_name)
+            #template = TemplateFactory(filename, contentType)
+            factory.template = template
+        else:
+            # we assume that a template has or will be grokked from a class
+            pass
+
+class LayoutViewGrokker(ViewGrokkerBase):
+    component_class = megrok.view.LayoutView
+
+    def register(self, factory, module_info):
+
+        zope.component.provideAdapter(factory,
+                                 adapts=(self.view_context, self.view_layer),
+                                 provides=zope.interface.Interface,
+                                 name=self.view_name)
+
+    def register_template(self, factory, template, template_name, templates):
+        """Jumping a bit here to make the z3c.template Macro available to the
+        template, either it needs to be in grok.PageTemplate ...?"""
+        contentType = getattr(factory, 'contentType', 'text/html')
+        if template:
+            templates.markAssociated(template_name)
+            template = TemplateFactory(template.filename, contentType)
+            factory.template = template
+        else:
+            # we assume that a template has or will be grokked from a class
+            pass
+        # also for the layout template
+        layout_name = util.class_annotation(factory, 'megrok.view.layout', u'')
+        layout = templates.get(layout_name)
+        if layout:
+            templates.markAssociated(layout_name)
+            layout = TemplateFactory(layout.filename, contentType)
+            factory.layout = layout
+        else:
+            # we assume that a template has or will be grokked from a class
+            pass
+            pass


Property changes on: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/meta.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/meta.zcml
===================================================================
--- grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/meta.zcml	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/meta.zcml	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,2 @@
+<grok package=".meta" xmlns="http://namespaces.zope.org/grok" />
+

Added: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/__init__.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/__init__.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1 @@
+#


Property changes on: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/configure.zcml
===================================================================
--- grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/configure.zcml	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/configure.zcml	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,8 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:browser="http://namespaces.zope.org/browser">
+
+  <include file="ftesting.zcml" />
+
+</configure>
+

Added: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/ftesting.zcml
===================================================================
--- grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/ftesting.zcml	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/ftesting.zcml	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,65 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:meta="http://namespaces.zope.org/meta"
+           xmlns:browser="http://namespaces.zope.org/browser"
+           i18n_domain="zope"
+           package="megrok.layer.tests">
+
+  <include package="grok" file="meta.zcml" />
+  <include package="megrok.view" file="meta.zcml" />
+  <include package="megrok.viewlet" file="meta.zcml" />
+  <include package="megrok.layer" file="meta.zcml" />
+
+  <include package="zope.app.zcmlfiles" />
+
+  <!-- -->
+  <!-- -->
+
+  <include package="zope.app.securitypolicy" file="meta.zcml" />
+  <include package="zope.app.authentication" />
+  <securityPolicy
+    component="zope.app.securitypolicy.zopepolicy.ZopeSecurityPolicy" />
+
+  <include package="zope.app.securitypolicy" />
+
+  <role id="zope.Anonymous" title="Everybody"
+        description="All users have this role implicitly" />
+
+  <role id="zope.Manager" title="Site Manager" />
+
+  <principal
+   id="zope.manager"
+   title="Administrator"
+   login="mgr"
+   password="mgrpw" />
+
+  <grant
+   role="zope.Manager"
+   principal="zope.manager"
+   />
+
+  <unauthenticatedPrincipal
+    id="zope.anybody"
+    title="Unauthenticated User" />
+
+  <unauthenticatedGroup
+    id="zope.Anybody"
+    title="Unauthenticated Users"
+    />
+
+  <authenticatedGroup
+    id="zope.Authenticated"
+    title="Authenticated Users"
+    />
+
+  <everybodyGroup
+    id="zope.Everybody"
+    title="All Users"
+    />
+
+  <grantAll role="zope.Manager" />
+
+
+  <include package="grok" />
+
+</configure>
+

Added: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/test_view.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/test_view.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/test_view.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,38 @@
+import unittest
+from pkg_resources import resource_listdir
+
+from grok.ftests.test_grok_functional import FunctionalDocTestSuite
+
+from zope.app.testing import functional
+functional.defineLayer('TestLayer', 'ftesting.zcml')
+
+def suiteFromPackage(name):
+    files = resource_listdir(__name__, name)
+    suite = unittest.TestSuite()
+    files = ['template.py']
+    for filename in files:
+        if not filename.endswith('.py'):
+            continue
+        if filename == '__init__.py':
+            continue
+
+        dottedname = 'megrok.view.tests.%s.%s' % (name, filename[:-3])
+        test = FunctionalDocTestSuite(dottedname)
+        test.layer = TestLayer
+
+        suite.addTest(test)
+    return suite
+
+def test_suite():
+    suite = unittest.TestSuite()
+    s = functional.FunctionalDocFileSuite('../README.txt')
+    s.layer = TestLayer
+    suite.addTest(s)
+    for name in ['view']:
+        suite.addTest(suiteFromPackage(name))
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')
+


Property changes on: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/test_view.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/__init__.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/__init__.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1 @@
+#


Property changes on: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/argument.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/argument.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/argument.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,77 @@
+"""
+  >>> import grok
+  >>> from megrok.view.tests.view.argument import Mammoth
+  >>> grok.grok('megrok.view.tests.view.argument')
+  >>> getRootFolder()["manfred"] = Mammoth()
+
+  >>> from zope.testbrowser.testing import Browser
+  >>> browser = Browser()
+  >>> browser.handleErrors = False
+
+Form variables such as GET parameters are dispatched to arguments of
+the render() method, should the method choose to take them:
+
+  >>> browser.open("http://localhost/manfred/render?message=Foo&another=Bar")
+  >>> print browser.contents
+  Message: Foo
+  Another: Bar
+
+Supplying more arguments than those specified has no effect:
+
+  >>> browser.open("http://localhost/manfred/render?message=There&another=Is&last=More")
+  >>> print browser.contents
+  Message: There
+  Another: Is
+
+If you don't supply all of the arguments, there will be a System Error:
+
+  >>> browser.open("http://localhost/manfred/render?message=Foo")
+  Traceback (most recent call last):
+  ...
+  TypeError: Missing argument to render(): another
+
+The same works with views that define update():
+
+  >>> browser.open("http://localhost/manfred/update?message=Foo&another=Bar")
+  >>> print browser.contents
+  Coming to us from update():
+  Message: Foo
+  Another: Bar
+
+  >>> browser.open("http://localhost/manfred/update?message=There&another=Is&last=More")
+  >>> print browser.contents
+  Coming to us from update():
+  Message: There
+  Another: Is
+
+  >>> browser.open("http://localhost/manfred/update?another=Bar")
+  Traceback (most recent call last):
+  ...
+  TypeError: Missing argument to update(): message
+
+"""
+import grok
+import megrok.view
+
+class Mammoth(grok.Model):
+    pass
+
+class RenderWithArguments(megrok.view.View):
+    grok.name('render')
+
+    def render(self, message, another):
+        return "Message: %s\nAnother: %s" % (message, another)
+
+class UpdateWithArguments(megrok.view.View):
+    grok.name('update')
+    grok.template('update')
+
+    def update(self, message, another):
+        self.message = message
+        self.another = another
+
+update = grok.PageTemplate("""
+Coming to us from update():
+Message: <span tal:replace="view/message" />
+Another: <span tal:replace="view/another" />
+""")


Property changes on: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/argument.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/index.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/index.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/index.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,40 @@
+"""
+  >>> import grok
+  >>> from megrok.view.tests.view.index import Mammoth
+  >>> grok.grok('megrok.view.tests.view.index')
+  >>> getRootFolder()["manfred"] = Mammoth()
+
+The default view name for a model is 'index':
+
+  >>> from zope.testbrowser.testing import Browser
+  >>> browser = Browser()
+  >>> browser.handleErrors = False
+  >>> browser.open("http://localhost/manfred")
+  >>> print browser.contents
+  <html>
+  <body>
+  <h1>Hello, world!</h1>
+  <span>Blue</span>
+  <span>Blue</span>
+  </body>
+  </html>
+
+"""
+import grok
+import megrok.view
+
+class Mammoth(grok.Model):
+    teeth = u"Blue"
+
+class Index(megrok.view.View):
+    pass
+
+index = grok.PageTemplate("""\
+<html>
+<body>
+<h1>Hello, world!</h1>
+<span tal:content="python:context.teeth">green</span>
+<span tal:content="context/teeth">green</span>
+</body>
+</html>
+""")


Property changes on: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/index.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/layout.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/layout.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/layout.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,61 @@
+"""
+Testing the LayoutView, which unlike grok.View will look up a layout.
+
+  >>> import grok
+  >>> from megrok.view.tests.view.layout import Mammoth
+  >>> grok.grok('megrok.view.tests.view.layout')
+  >>> getRootFolder()["manfred"] = Mammoth()
+
+  >>> from zope.testbrowser.testing import Browser
+  >>> browser = Browser()
+  >>> browser.handleErrors = False
+
+Since a layout template is not yet registered, calling the view will fail:
+
+  >>> browser.open("http://localhost/manfred/@@painting")
+  Traceback (most recent call last):
+  ...
+  ComponentLookupError: ......
+
+  >>> import os, tempfile
+  >>> temp_dir = tempfile.mkdtemp()
+  >>> from z3c.template.interfaces import ILayoutTemplate
+  >>> from zope.pagetemplate.interfaces import IPageTemplate
+  >>> from z3c.template.template import TemplateFactory
+  >>> from zope.publisher.interfaces.browser import IBrowserRequest
+  >>> import zope.component
+  >>> from megrok.view.tests.view.layout import Painting
+  >>> layout = os.path.join(temp_dir, 'layout.pt')
+  >>> open(layout, 'w').write('''
+  ...   <div tal:content="view/render">
+  ...     Full layout
+  ...   </div>
+  ... ''')
+
+  >>> factory = TemplateFactory(layout, 'text/html')
+  >>> zope.component.provideAdapter(factory,
+  ...     (Painting, IBrowserRequest), ILayoutTemplate)
+
+  >>> browser.open("http://localhost/manfred/@@painting")
+  >>> print browser.contents
+  <div>Rendered content</div>
+
+Cleanup
+-------
+
+  >>> import shutil
+  >>> shutil.rmtree(temp_dir)
+
+"""
+
+import grok
+import megrok.view
+
+class Mammoth(grok.Model):
+    pass
+
+class Painting(megrok.view.LayoutView):
+    pass
+
+    def render(self):
+        return u'Rendered content'


Property changes on: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/layout.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/macros.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/macros.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/macros.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,97 @@
+"""
+  >>> import grok
+  >>> from megrok.view.tests.view.macros import Mammoth
+  >>> grok.grok('megrok.view.tests.view.macros')
+  >>> getRootFolder()["manfred"] = Mammoth()
+
+  >>> from zope.testbrowser.testing import Browser
+  >>> browser = Browser()
+  >>> browser.handleErrors = False
+  >>> browser.open("http://localhost/manfred/@@painting")
+  >>> print browser.contents
+  <html>
+  <body>
+  <h1>GROK MACRO!</h1>
+  <div>
+  GROK SLOT!
+  </div>
+  </body>
+  </html>
+
+Views without a template do not support macros:
+
+  >>> browser.open("http://localhost/manfred/@@dancing")
+  Traceback (most recent call last):
+  AttributeError: 'DancingHall' object has no attribute 'template'
+
+If the view has an attribute with the same name as a macro, the macro 
+shadows the view. XXX This should probably generate a warning at runtime.
+
+  >>> browser.open("http://localhost/manfred/@@grilldish")
+  >>> print browser.contents
+  <html>
+  Curry
+  </html>
+
+"""
+import grok
+import megrok.view
+
+class Mammoth(grok.Model):
+    pass
+
+class DancingHall(megrok.view.View):
+
+    def render(self):
+        return "A nice large dancing hall for mammoths."
+
+class Grilled(megrok.view.View):
+
+    def update(self):
+        self.spices = "Pepper and salt"
+
+class Painting(megrok.view.View):
+    pass
+
+painting = grok.PageTemplate("""\
+<html metal:use-macro="context/@@layout/main">
+<div metal:fill-slot="slot">
+GROK SLOT!
+</div>
+</html>
+""")
+
+class Layout(megrok.view.View):
+    pass
+
+layout = grok.PageTemplate("""\
+<html metal:define-macro="main">
+<body>
+<h1>GROK MACRO!</h1>
+<div metal:define-slot="slot">
+</div>
+</body>
+</html>""")
+
+class Dancing(megrok.view.View):
+    pass
+
+dancing = grok.PageTemplate("""\
+<html metal:use-macro="context/@@dancinghall/something">
+</html>
+""")
+
+class GrillDish(megrok.view.View):
+    pass
+
+grilldish = grok.PageTemplate("""
+<html metal:use-macro="context/@@grilled/spices">
+</html>""")
+
+class Grilled(megrok.view.View):
+    pass
+
+grilled = grok.PageTemplate("""\
+<html metal:define-macro="spices">
+Curry
+</html>""")


Property changes on: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/macros.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/template.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/template.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/template.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,85 @@
+"""
+Testing the TemplateView, which unlike grok.View will look up a template.
+
+  >>> import grok
+  >>> from megrok.view.tests.view.template import Mammoth, Painting
+  >>> grok.grok('megrok.view.tests.view.template')
+  >>> mammoth = getRootFolder()["manfred"] = Mammoth()
+
+  >>> from zope.testbrowser.testing import Browser
+  >>> browser = Browser()
+  >>> browser.handleErrors = False
+
+TemplateViews look up a template as an adpater.
+
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+  >>> view = Painting(mammoth, request)
+
+Since a template is not yet registered, rendering the view will fail:
+
+  >>> print view.render()
+  Traceback (most recent call last):
+  ...
+  ComponentLookupError: ......
+
+We can register a template for the view.
+
+  >>> import os, tempfile
+  >>> temp_dir = tempfile.mkdtemp()
+  >>> from zope.pagetemplate.interfaces import IPageTemplate
+  >>> from z3c.template.template import TemplateFactory
+  >>> from zope.publisher.interfaces.browser import IBrowserRequest
+  >>> import zope.component
+  >>> template = os.path.join(temp_dir, 'template.pt')
+  >>> open(template, 'w').write('''
+  ...   <div>Rendered content</div>
+  ... ''')
+
+  >>> factory = TemplateFactory(template, 'text/html')
+  >>> zope.component.provideAdapter(factory,
+  ...     (Painting, IBrowserRequest), IPageTemplate)
+
+  >>> print view.render()
+  <div>Rendered content</div>
+
+  >>> import shutil
+  >>> shutil.rmtree(temp_dir)
+
+TemplateViews support inline templates and file templates
+just like any grok view. (But then you may as well use View).
+
+  >>> from megrok.view.tests.view.template import Drawing
+  >>> view = Drawing(mammoth, request)
+  >>> print view.render()
+  <div>Drawing template</div>
+
+  >>> from megrok.view.tests.view.template import Carving
+  >>> view = Carving(mammoth, request)
+  >>> print view.render()
+  <div>Carving inline template</div>
+
+We can also use megrok.template to provide more sophisticated possiblities.
+
+"""
+import grok
+import megrok.view
+
+class Mammoth(grok.Model):
+    pass
+
+class Painting(megrok.view.TemplateView):
+    pass
+
+class Drawing(megrok.view.TemplateView):
+    pass
+
+class Carving(megrok.view.TemplateView):
+    pass
+
+carving = grok.PageTemplate("""\
+<div>Carving inline template</div>
+""")
+
+class Sculpture(megrok.template.Template):
+    pass


Property changes on: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/template.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/template_templates/drawing.pt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/template_templates/drawing.pt	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/template_templates/drawing.pt	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1 @@
+<div>Drawing template</div>

Added: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/view.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/view.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/view.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,34 @@
+"""
+  >>> import grok
+  >>> from megrok.view.tests.view.view import Mammoth
+  >>> grok.grok('megrok.view.tests.view.view')
+  >>> getRootFolder()["manfred"] = Mammoth()
+
+  >>> from zope.testbrowser.testing import Browser
+  >>> browser = Browser()
+  >>> browser.handleErrors = False
+  >>> browser.open("http://localhost/manfred/@@painting")
+  >>> print browser.contents
+  <html>
+  <body>
+  <h1>Hello, world!</h1>
+  </body>
+  </html>
+
+"""
+import grok
+import megrok.view
+
+class Mammoth(grok.Model):
+    pass
+
+class Painting(megrok.view.View):
+    pass
+
+painting = grok.PageTemplate("""\
+<html>
+<body>
+<h1>Hello, world!</h1>
+</body>
+</html>
+""")


Property changes on: grok/branches/darrylcousins-branch/megrok.view/src/megrok/view/tests/view/view.py
___________________________________________________________________
Name: svn:keywords
   + Id

Modified: grok/branches/darrylcousins-branch/megrok.viewlet/setup.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/setup.py	2007-07-02 09:52:32 UTC (rev 77294)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/setup.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -1,5 +1,9 @@
+import os
 from setuptools import setup, find_packages
 
+def read(*rnames):
+    return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
+
 setup(
     name='megrok.viewlet',
     version='0.1',
@@ -7,8 +11,11 @@
     author_email='grok-dev at zope.org',
     url='http://svn.zope.org/grok/trunk',
     description="""\
-Grok: Now even cavemen can use z3c.form!
+Grok: Now even cavemen can use Zope3!
 """,
+    long_description=(
+        read('src/megrok/viewlet/README.txt')
+        ),
     packages=find_packages('src'),
     package_dir = {'': 'src'},
     include_package_data = True,
@@ -16,7 +23,9 @@
     license='ZPL',
 
     install_requires=['setuptools',
+                      'zope.viewlet',
                       'z3c.viewlet',
+                      'megrok.view',
                      ],
 )
 

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/README.txt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/README.txt	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/README.txt	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,7 @@
+==============
+Megrok Viewlet
+==============
+
+This package is part of an attempt to use the wonderful tools provided in the
+z3c namespace to the grok cave.
+


Property changes on: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/README.txt
___________________________________________________________________
Name: svn:keywords
   + Date Author

Modified: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/components.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/components.py	2007-07-02 09:52:32 UTC (rev 77294)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/components.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -1,6 +1,6 @@
 import grok
-from zope import component
-from zope import interface
+import zope.component
+import zope.interface
 
 from zope.publisher.interfaces.browser import IBrowserView
 from zope.publisher.browser import BrowserView
@@ -9,7 +9,7 @@
 
 from z3c.viewlet.manager import WeightOrderedViewletManager
 
-from grok.components import ViewBase
+from megrok.view.components import ViewBase
 
 class TemplateContentBase(object):
     """Mixin class to provide render method using given template"""
@@ -33,16 +33,16 @@
         self.__parent__ = self.view = view
         self.context = context
         self.request = request
-        self.static = component.queryAdapter(
+        self.static = zope.component.queryAdapter(
             self.request,
-            interface.Interface,
+            zope.interface.Interface,
             name=self.module_info.package_dotted_name
             )        
 
 class Viewlet(BrowserView, ViewBase, TemplateContentBase):
     """ A grok.View-like viewlet
     """
-    interface.implements(IViewlet)
+    zope.interface.implements(IViewlet)
 
     def __init__(self, context, request, view, manager):
         #super(Viewlet, self).__init__(context, request)
@@ -50,9 +50,9 @@
         self.context = context
         self.request = request
         self.manager = manager
-        self.static = component.queryAdapter(
+        self.static = zope.component.queryAdapter(
             self.request,
-            interface.Interface,
+            zope.interface.Interface,
             name=self.module_info.package_dotted_name
             )
 
@@ -66,9 +66,9 @@
         self.__parent__ = self.view = view
         self.context = context
         self.request = request
-        self.static = component.queryAdapter(
+        self.static = zope.component.queryAdapter(
             self.request,
-            interface.Interface,
+            zope.interface.Interface,
             name=self.module_info.package_dotted_name
             )
 

Modified: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.py	2007-07-02 09:52:32 UTC (rev 77294)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -1,117 +1,47 @@
-import martian
-import grok
-from zope import component
+import zope.component
 from zope.publisher.interfaces.browser import (IBrowserRequest,
                                                IBrowserView)
 from zope.viewlet.interfaces import IViewlet, IViewletManager
 from zope.contentprovider.interfaces import IContentProvider
 
+import martian
 from martian import util
-import megrok.viewlet
+from martian.error import GrokError
+
+import grok
 from grok.util import get_default_permission, make_checker
 
-class ViewGrokkerBase(martian.ClassGrokker):
-    """Code resuse for View, ContentProvider and Viewlet grokkers"""
-    component_class = None
-    factory_name = ''
-    view_context = None
+import megrok.viewlet
+from megrok.view.meta import ViewGrokkerBase
 
-    def grok_start(self, name, factory, context, module_info, templates):
-        self.view_context = util.determine_class_context(factory, context)
-        factory.module_info = module_info
-        self.factory_name = factory.__name__.lower()
-
-        # find templates
-        template_name = util.class_annotation(factory, 'grok.template',
-                                              self.factory_name)
-        template = templates.get(template_name)
-
-        if self.factory_name != template_name:
-            # grok.template is being used
-            if templates.get(self.factory_name):
-                raise GrokError("Multiple possible templates for view %r. It "
-                                "uses grok.template('%s'), but there is also "
-                                "a template called '%s'."
-                                % (factory, template_name, self.factory_name),
-                                factory)
-
-        if template:
-            templates.markAssociated(template_name)
-            factory.template = template
-        else:
-            if not getattr(factory, 'render', None):
-                # we do not accept a view without any way to render it
-                raise GrokError("View %r has no associated template or "
-                                "'render' method." % factory, factory)
-
-    def grok_end(self, factory):
-        # protect view, public by default
-        default_permission = get_default_permission(factory)
-        make_checker(factory, factory, default_permission)
-
-        # safety belt: make sure that the programmer didn't use
-        # @grok.require on any of the view's methods.
-        methods = util.methods_from_class(factory)
-        for method in methods:
-            if getattr(method, '__grok_require__', None) is not None:
-                raise GrokError('The @grok.require decorator is used for '
-                                'method %r in view %r. It may only be used '
-                                'for XML-RPC methods.'
-                                % (method.__name__, factory), factory)
-
 class ContentProviderGrokker(ViewGrokkerBase):
     """Also groks ViewletManager"""
     component_class = megrok.viewlet.ContentProvider
 
-    def grok(self, name, factory, context, module_info, templates):
-        self.grok_start(name, factory, context, module_info, templates)
+    def register(self, factory, module_info):
 
-        view_layer = util.class_annotation(factory, 'megrok.layer.layer',
-                                           None) or module_info.getAnnotation('megrok.layer.layer',
-                                               None) or IBrowserRequest
-
-        view_name = util.class_annotation(factory, 'grok.name',
-                                          self.factory_name)
-        # __view_name__ is needed to support IAbsoluteURL on views
-        factory.__view_name__ = view_name
         if util.check_subclass(factory, megrok.viewlet.ViewletManager):
             view_provider = IViewletManager
         else:
             view_provider = IContentProvider
-        component.provideAdapter(factory,
-                                 adapts=(self.view_context, view_layer, IBrowserView),
+        zope.component.provideAdapter(factory,
+                                 adapts=(self.view_context, self.view_layer, IBrowserView),
                                  provides=view_provider,
-                                 name=view_name)
+                                 name=self.view_name)
 
-        self.grok_end(factory)
 
-        return True
-
 class ViewletGrokker(ViewGrokkerBase):
     component_class = megrok.viewlet.Viewlet
 
-    def grok(self, name, factory, context, module_info, templates):
-        self.grok_start(name, factory, context, module_info, templates)
+    def register(self, factory, module_info):
 
-        view_layer = util.class_annotation(factory, 'megrok.layer.layer',
-                                           None) or module_info.getAnnotation('megrok.layer.layer',
-                                               None) or IBrowserRequest
-
-        view_name = util.class_annotation(factory, 'grok.name',
-                                          self.factory_name)
         view_manager = util.class_annotation(factory, 'megrok.viewlet.viewletmanager',
                                            None) or module_info.getAnnotation('megrok.viewlet.viewletmanager',
                                                None) or IViewletManager
-        # __view_name__ is needed to support IAbsoluteURL on views
-        factory.__view_name__ = view_name
-        component.provideAdapter(factory,
-                                 adapts=(self.view_context, view_layer, 
+
+        zope.component.provideAdapter(factory,
+                                 adapts=(self.view_context, self.view_layer, 
                                          IBrowserView, view_manager),
                                  provides=IViewlet,
-                                 name=view_name)
+                                 name=self.view_name)
 
-
-        self.grok_end(factory)
-
-        return True
-

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/__init__.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/__init__.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1 @@
+#


Property changes on: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/configure.zcml
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/configure.zcml	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/configure.zcml	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,8 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:browser="http://namespaces.zope.org/browser">
+
+  <include file="ftesting.zcml" />
+
+</configure>
+

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/ftesting.zcml
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/ftesting.zcml	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/ftesting.zcml	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,66 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:meta="http://namespaces.zope.org/meta"
+           xmlns:browser="http://namespaces.zope.org/browser"
+           i18n_domain="zope"
+           package="megrok.layer.tests">
+
+  <include package="grok" file="meta.zcml" />
+  <include package="megrok.view" file="meta.zcml" />
+  <include package="megrok.viewlet" file="meta.zcml" />
+  <include package="megrok.layer" file="meta.zcml" />
+
+  <include package="zope.app.zcmlfiles" />
+
+  <!-- -->
+  <include package="zope.contentprovider" />
+  <!-- -->
+
+  <include package="zope.app.securitypolicy" file="meta.zcml" />
+  <include package="zope.app.authentication" />
+  <securityPolicy
+    component="zope.app.securitypolicy.zopepolicy.ZopeSecurityPolicy" />
+
+  <include package="zope.app.securitypolicy" />
+
+  <role id="zope.Anonymous" title="Everybody"
+        description="All users have this role implicitly" />
+
+  <role id="zope.Manager" title="Site Manager" />
+
+  <principal
+   id="zope.manager"
+   title="Administrator"
+   login="mgr"
+   password="mgrpw" />
+
+  <grant
+   role="zope.Manager"
+   principal="zope.manager"
+   />
+
+  <unauthenticatedPrincipal
+    id="zope.anybody"
+    title="Unauthenticated User" />
+
+  <unauthenticatedGroup
+    id="zope.Anybody"
+    title="Unauthenticated Users"
+    />
+
+  <authenticatedGroup
+    id="zope.Authenticated"
+    title="Authenticated Users"
+    />
+
+  <everybodyGroup
+    id="zope.Everybody"
+    title="All Users"
+    />
+
+  <grantAll role="zope.Manager" />
+
+
+  <include package="grok" />
+
+</configure>
+

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/test_viewlet.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/test_viewlet.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/test_viewlet.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,37 @@
+import unittest
+from pkg_resources import resource_listdir
+
+from grok.ftests.test_grok_functional import FunctionalDocTestSuite
+
+from zope.app.testing import functional
+functional.defineLayer('TestLayer', 'ftesting.zcml')
+
+def suiteFromPackage(name):
+    files = resource_listdir(__name__, name)
+    suite = unittest.TestSuite()
+    for filename in files:
+        if not filename.endswith('.py'):
+            continue
+        if filename == '__init__.py':
+            continue
+
+        dottedname = 'megrok.viewlet.tests.%s.%s' % (name, filename[:-3])
+        test = FunctionalDocTestSuite(dottedname)
+        test.layer = TestLayer
+
+        suite.addTest(test)
+    return suite
+
+def test_suite():
+    suite = unittest.TestSuite()
+    s = functional.FunctionalDocFileSuite('../README.txt')
+    s.layer = TestLayer
+    suite.addTest(s)
+    for name in ['viewlet']:
+        suite.addTest(suiteFromPackage(name))
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')
+


Property changes on: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/test_viewlet.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/__init__.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/__init__.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1 @@
+#


Property changes on: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/adapter.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/adapter.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/adapter.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,102 @@
+"""
+This first doctest demonstrates the use of grok.MultiAdapter to create and
+configure providers, viewletmanagers and viewlets.
+
+It is more wordy and not as convenient as the grokked equivalent.
+
+  >>> import grok
+  >>> from megrok.viewlet.tests.viewlet.adapter import Mammoth
+  >>> grok.grok('megrok.viewlet.tests.viewlet.adapter')
+  >>> getRootFolder()["manfred"] = Mammoth()
+
+  >>> from zope.testbrowser.testing import Browser
+  >>> browser = Browser()
+  >>> browser.handleErrors = False
+  >>> browser.open("http://localhost/++skin++myskin/manfred/@@painting")
+  >>> print browser.contents
+  <html>
+  <body>
+  <h1>This is a cave painting</h1>
+  <div><p>Hello World</p></div>
+  </body>
+  </html>
+
+"""
+import grok
+
+from zope.publisher.interfaces.browser import IBrowserRequest, IBrowserView
+from zope.contentprovider.interfaces import IContentProvider
+from zope.viewlet.interfaces import IViewletManager
+from zope.viewlet.interfaces import IViewlet
+from zope.viewlet.viewlet import ViewletBase
+import zope.component
+
+from z3c.viewlet.manager import WeightOrderedViewletManager
+
+import megrok.layer
+import megrok.view
+
+class Mammoth(grok.Model):
+    pass
+
+class IMySkinLayer(megrok.layer.IMinimalLayer):
+    pass
+
+class MySkin(megrok.layer.Skin):
+    megrok.layer.layer(IMySkinLayer)
+
+class Painting(megrok.view.View):
+    """Template must be in *_templates, I tried and I tried to find out
+    why when inline the `provider` tal directive wasn't found"""
+    pass
+
+class MammothContentProvider(grok.MultiAdapter):
+    grok.adapts(Mammoth, IMySkinLayer, IBrowserView)
+    grok.implements(IContentProvider)
+    grok.name('cave')
+
+    def __init__(self, context, request, view):
+        self.context = context
+        self.request = request
+        self.view = self.__parent__ = view
+
+    def update(self):
+        pass
+
+    def render(self):
+        return u'This is a cave painting'
+
+class MammothViewletManager(grok.MultiAdapter, WeightOrderedViewletManager):
+    grok.adapts(Mammoth, IMySkinLayer, IBrowserView)
+    grok.name('cavecolumn')
+
+    def __init__(self, context, request, view):
+        WeightOrderedViewletManager.__init__(self, context, request, view)
+
+    def update(self):
+        viewlets = zope.component.getAdapters(
+                    (self.context, self.request, self.__parent__, self),
+                    IViewlet)
+        self.viewlets = []
+        for viewlet in viewlets:
+            self.viewlets.append(viewlet[1])
+
+    def render(self):
+        return '\n'.join([s.render() for s in self.viewlets])
+
+class HelloWorldViewlet(grok.MultiAdapter):
+    grok.adapts(Mammoth, IMySkinLayer, IBrowserView, IViewletManager)
+    grok.implements(IViewlet)
+    grok.name('helloworld')
+    weight = 0
+
+    def __init__(self, context, request, view, manager):
+        self.__parent__ = view
+        self.context = context
+        self.request = request
+        self.manager = manager
+
+    def render(self):
+        return u'<p>Hello World</p>'
+
+


Property changes on: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/adapter.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/adapter_templates/painting.pt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/adapter_templates/painting.pt	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/adapter_templates/painting.pt	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,7 @@
+<html>
+<body>
+<h1 tal:content="structure provider:cave">Hello, world!</h1>
+<div tal:content="structure provider:cavecolumn">Cave column</div>
+</body>
+</html>
+

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view.py	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,121 @@
+"""
+This doctest uses grok.ContentProvider, megrok.view.ViewletManager and grok.Viewlet.
+
+  >>> import grok
+  >>> from megrok.viewlet.tests.viewlet.view import Mammoth
+  >>> grok.grok('megrok.viewlet.tests.viewlet.view')
+  >>> getRootFolder()["manfred"] = Mammoth()
+
+  >>> from zope.testbrowser.testing import Browser
+  >>> browser = Browser()
+  >>> browser.handleErrors = False
+  >>> browser.open("http://localhost/manfred/@@index")
+  >>> print browser.contents
+  <html>
+  <body>
+  <h1>Manfred</h1>
+  <div id="leftcolumn">
+  <p>My simple viewlet</p>
+  <p>This is from a template for Manfred</p>
+  </div>
+  <div>Way cool</div>
+  <div id="rightcolumn">
+  </div>
+  </body>
+  </html>
+
+  >>> browser.open("http://localhost/manfred/@@skinnedindex")
+  Traceback (most recent call last):
+  ...
+  NotFound...'@@skinnedindex'
+
+  >>> browser.open("http://localhost/++skin++myskin/manfred/@@skinnedindex")
+  >>> print browser.contents
+  <html>
+  <body>
+  <h1>Manfred</h1>
+  <div id="leftcolumn">
+  <p>My skinned viewlet</p>
+  <p>My simple viewlet</p>
+  <p>This is from a template for Manfred</p>
+  </div>
+  <div>Way cool</div>
+  <div id="rightcolumn">
+  </div>
+  </body>
+  </html>
+
+"""
+import grok
+import megrok.layer
+import megrok.viewlet
+import megrok.view
+
+class Mammoth(grok.Model):
+    title = u'Manfred'
+
+class IMySkinLayer(megrok.layer.IMinimalLayer):
+    pass
+
+class MySkin(megrok.layer.Skin):
+    megrok.layer.layer(IMySkinLayer)
+
+class Index(megrok.view.View):
+    """Template must be in *_templates, I tried and I tried to find out
+    why when the template is inline the `provider` tal directive isn't found"""
+    pass
+
+class SkinnedIndex(megrok.view.View):
+    """Template must be in *_templates, I tried and I tried to find out
+    why when the template is inline the `provider` tal directive isn't found"""
+    megrok.layer.layer(IMySkinLayer)
+
+class Title(megrok.viewlet.ContentProvider):
+    """This has a template"""
+    grok.name('site.title')
+    grok.context(Mammoth)
+
+class FirstManager(megrok.viewlet.ViewletManager):
+    """This has a template also, ie it acts just like the above"""
+    grok.name('site.firstmanager')
+    grok.context(Mammoth)
+
+class RightColumnManager(megrok.viewlet.ViewletManager):
+    """This has no template and no viewlets, it renders nothing"""
+    grok.name('site.rightcolumnmanager')
+    grok.context(Mammoth)
+
+class LeftColumnManager(megrok.viewlet.ViewletManager):
+    """This has no template it renders its viewlets"""
+    grok.name('site.leftcolumnmanager')
+    grok.context(Mammoth)
+
+class FirstViewlet(megrok.viewlet.Viewlet):
+    """A simple viewlet"""
+    grok.name('site.viewlet.simple')
+    grok.context(Mammoth)
+    megrok.viewlet.viewletmanager(LeftColumnManager)
+    weight = 0
+
+    def render(self):
+        return u'<p>My simple viewlet</p>'
+
+class SecondViewlet(megrok.viewlet.Viewlet):
+    """A viewlet that has its own template"""
+    grok.name('site.viewlet.templated')
+    grok.context(Mammoth)
+    megrok.viewlet.viewletmanager(LeftColumnManager)
+    weight = 1
+
+class ThirdViewlet(megrok.viewlet.Viewlet):
+    """A simple viewlet for a specific layer only"""
+    grok.name('site.viewlet.skinned')
+    grok.context(Mammoth)
+    megrok.viewlet.viewletmanager(LeftColumnManager)
+    megrok.layer.layer(IMySkinLayer)
+    weight = 0
+
+    def render(self):
+        return u'<p>My skinned viewlet</p>'
+
+


Property changes on: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view_templates/firstmanager.pt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view_templates/firstmanager.pt	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view_templates/firstmanager.pt	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1 @@
+<div>Way cool</div>

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view_templates/index.pt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view_templates/index.pt	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view_templates/index.pt	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,13 @@
+<html>
+<body>
+<tal:block tal:content="structure provider:site.title" />
+<div id="leftcolumn">
+<tal:block tal:content="structure provider:site.leftcolumnmanager" />
+</div>
+<tal:block tal:content="structure provider:site.firstmanager" />
+<div id="rightcolumn">
+<tal:block tal:content="structure provider:site.rightcolumnmanager" />
+</div>
+</body>
+</html>
+

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view_templates/secondviewlet.pt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view_templates/secondviewlet.pt	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view_templates/secondviewlet.pt	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1 @@
+<p>This is from a template for <span tal:replace="context/title" /></p>

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view_templates/skinnedindex.pt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view_templates/skinnedindex.pt	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view_templates/skinnedindex.pt	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1,14 @@
+<html>
+<body>
+<tal:block tal:content="structure provider:site.title" />
+<div id="leftcolumn">
+<tal:block tal:content="structure provider:site.leftcolumnmanager" />
+</div>
+<tal:block tal:content="structure provider:site.firstmanager" />
+<div id="rightcolumn">
+<tal:block tal:content="structure provider:site.rightcolumnmanager" />
+</div>
+</body>
+</html>
+
+

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view_templates/title.pt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view_templates/title.pt	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/tests/viewlet/view_templates/title.pt	2007-07-02 10:02:38 UTC (rev 77295)
@@ -0,0 +1 @@
+<h1 tal:content="context/title">Hello World!</h1>



More information about the Checkins mailing list