[Checkins] SVN: grok/branches/darrylcousins-branch/ Brought in megrok layer and viewlet packages

Darryl Cousins darryl at darrylcousins.net.nz
Sun Jul 1 02:05:23 EDT 2007


Log message for revision 77278:
  Brought in megrok layer and viewlet packages

Changed:
  U   grok/branches/darrylcousins-branch/buildout.cfg
  A   grok/branches/darrylcousins-branch/megrok.layer/
  A   grok/branches/darrylcousins-branch/megrok.layer/setup.py
  A   grok/branches/darrylcousins-branch/megrok.layer/src/
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/__init__.py
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/__init__.py
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/components.py
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/directive.py
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/__init__.py
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/__init__.py
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/__init__.py
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/ellie.py
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/file.txt
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/static.pt
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/subdir/
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/subdir/otherfile.txt
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/static.py
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/view.py
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/test_functional.py
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.py
  A   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.zcml
  A   grok/branches/darrylcousins-branch/megrok.viewlet/
  A   grok/branches/darrylcousins-branch/megrok.viewlet/setup.py
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/__init__.py
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/__init__.py
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/components.py
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/directive.py
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/__init__.py
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/test_functional.py
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/__init__.py
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view.py
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/firstmanager.pt
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/index.pt
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/secondviewlet.pt
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/skinnedindex.pt
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/title.pt
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.py
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.zcml
  U   grok/branches/darrylcousins-branch/setup.py

-=-
Modified: grok/branches/darrylcousins-branch/buildout.cfg
===================================================================
--- grok/branches/darrylcousins-branch/buildout.cfg	2007-07-01 04:53:58 UTC (rev 77277)
+++ grok/branches/darrylcousins-branch/buildout.cfg	2007-07-01 06:05:22 UTC (rev 77278)
@@ -1,62 +1,99 @@
 [buildout]
-develop = . grokwiki ldapaddressbook martian
-parts = data instance testdata testinstance test
+develop = . grokwiki ldapaddressbook martian megrok.layer megrok.viewlet
+parts = app data instance test devpython
+find-links = http://download.zope.org/distribution/
 
 [zope3]
-#recipe = zc.recipe.zope3checkout
-#url = svn://svn.zope.org/repos/main/Zope3/branches/3.3
-location = /home/faassen/buildout/z331-lp
+# this dead chicken is needed by some other recipe(s)
+location =
 
+[app]
+eggs = grok
+       grokwiki
+       martian
+       megrok.layer
+       megrok.viewlet
+recipe = zc.zope3recipes:app
+site.zcml = <include package="zope.security" file="meta.zcml" />
+            <include package="zope.i18n" file="meta.zcml" />
+            <include package="zope.app.securitypolicy" file="meta.zcml" />
+            <include package="zope.app.zcmlfiles" file="meta.zcml" />
+            <include package="zope.viewlet" file="meta.zcml" />
+            <include package="grok" file="meta.zcml" />
+            <include package="megrok.layer" file="meta.zcml" />
+            <include package="megrok.viewlet" file="meta.zcml" />
+
+            <include package="zope.annotation" />
+            <include package="zope.copypastemove" />
+            <include package="zope.contentprovider" />
+            <include package="zope.formlib" />
+            <include package="zope.i18n.locales" />
+            <include package="zope.publisher" />
+            <include package="zope.size" />
+            <include package="zope.traversing" />
+            <include package="zope.traversing.browser" />
+            <include package="zope.publisher" />
+            <include package="zope.viewlet" />
+            <include package="zope.app.zcmlfiles" />
+            <include package="zope.app.securitypolicy" />
+            <include package="zope.app.authentication" />
+            <include package="zope.app.catalog" />
+            <include package="zope.app.intid" />
+            <include package="zope.app.keyreference" />
+            <include package="zope.app.twisted" />
+            <include package="grok" />
+            <include package="grokwiki" />
+
+            <securityPolicy 
+                component="zope.app.securitypolicy.zopepolicy.ZopeSecurityPolicy" />
+
+            <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" />
+            <principal id="zope.manager"
+                       title="Manager"
+                       login="grok"
+                       password_manager="Plain Text"
+                       password="grok"
+                       />
+
+            <!-- Replace the following directive if you don't want
+                 public access -->
+            <grant permission="zope.View"
+                   principal="zope.Anybody" />
+            <grant permission="zope.app.dublincore.view"
+                   principal="zope.Anybody" />
+
+            <role id="zope.Manager" title="Site Manager" />
+            <role id="zope.Member" title="Site Member" />
+            <grantAll role="zope.Manager" />
+            <grant role="zope.Manager"
+                   principal="zope.manager" />
+
 [data]
 recipe = zc.recipe.filestorage
 
-[testdata]
-recipe = zc.recipe.filestorage
-
-[testinstance]
-recipe = zc.recipe.zope3instance
-database = testdata
-user = grok:grok
-eggs = setuptools
-       grok
-zcml = zope.annotation
-       zope.copypastemove
-       zope.formlib
-       zope.i18n-meta
-       zope.i18n.locales
-       zope.publisher
-       zope.security-meta
-       zope.size
-       zope.traversing
-       zope.traversing.browser
-       zope.app    
-       zope.app-meta
-       zope.app.securitypolicy
-       zope.app.securitypolicy-meta
-       zope.app.authentication
-       zope.app.catalog
-       zope.app.intid
-       zope.app.keyreference
-       grok
-       grok-meta
-
 [instance]
-recipe = zc.recipe.zope3instance
-database = data
-user = grok:grok
-eggs = setuptools
-       grok
-       grokwiki
+recipe = zc.zope3recipes:instance
+application = app
+zope.conf = ${data:zconfig}
 
-zcml = ${testinstance:zcml}
-       zope.app.twisted
-       grokwiki
-
 [test]
 recipe = zc.recipe.testrunner
 eggs = grok
-extra-paths = /home/faassen/buildout/z331-lp/lib/python
-working-directory = parts/testinstance
-defaults = ['--tests-pattern', '^f?tests$',
-            '-v'
-           ]
+       martian
+       megrok.layer
+       megrok.viewlet
+defaults = ['--tests-pattern', '^f?tests$', '-v']
+
+# installs bin/devpython to do simple interpreter tests
+[devpython]
+recipe = zc.recipe.egg
+interpreter = devpython
+eggs = grok
+       martian

Added: grok/branches/darrylcousins-branch/megrok.layer/setup.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/setup.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/setup.py	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,21 @@
+from setuptools import setup, find_packages
+
+setup(
+    name='megrok.layer',
+    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 z3c.form!
+""",
+    packages=find_packages('src'),
+    package_dir = {'': 'src'},
+    include_package_data = True,
+    zip_safe=False,
+    license='ZPL',
+
+    install_requires=['setuptools',
+                     ],
+)
+


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

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/__init__.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/__init__.py	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,6 @@
+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.layer/src/megrok/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/__init__.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/__init__.py	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,3 @@
+from directive import layer
+from components import ILayer, Skin
+


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

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/components.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/components.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/components.py	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,8 @@
+from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+
+class ILayer(IDefaultBrowserLayer):
+    pass
+
+class Skin(object):
+    pass
+


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

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/directive.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/directive.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/directive.py	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,5 @@
+from grok.directive import (InterfaceOrClassDirective,
+                            ClassOrModuleDirectiveContext)
+
+layer = InterfaceOrClassDirective('megrok.layer.layer',
+                           ClassOrModuleDirectiveContext())


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

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/__init__.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/__init__.py	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1 @@
+#


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

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/__init__.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/__init__.py	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1 @@
+#


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

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/__init__.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/__init__.py	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1 @@
+# this is a package


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

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/ellie.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/ellie.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/ellie.py	2007-07-01 06:05:22 UTC (rev 77278)
@@ -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.ILayer):
+    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/ftests/layer/simple_fixture/ellie.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/file.txt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/file.txt	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/file.txt	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1 @@
+some text


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

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/static.pt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/static.pt	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/static.pt	2007-07-01 06:05:22 UTC (rev 77278)
@@ -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/ftests/layer/simple_fixture/static/subdir/otherfile.txt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/subdir/otherfile.txt	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/subdir/otherfile.txt	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1 @@
+This is yet another file.


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

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/static.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/static.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/static.py	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,68 @@
+"""
+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.ftests.layer.simple_fixture')
+  >>> from zope.testbrowser.testing import Browser
+  >>> browser = Browser()
+  >>> browser.handleErrors = False
+  >>> browser.open('http://localhost/@@/megrok.layer.ftests.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.ftests.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.ftests.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.ftests.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.ftests.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
+
+
+grok.ILayer now inherits IDefaultBrowserLayer
+
+  >>> browser.open('http://localhost/++skin++mammothskin/@@/megrok.layer.ftests.layer.simple_fixture/subdir/otherfile.txt')
+  >>> print browser.contents
+  This is yet another file.
+
+
+  >>> browser.open('http://localhost/++skin++Rotterdam/@@/megrok.layer.ftests.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/ftests/layer/static.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/view.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/view.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/view.py	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,74 @@
+"""
+  >>> import grok
+  >>> from megrok.layer.ftests.layer.view import Mammoth
+  >>> grok.grok('megrok.layer.ftests.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>
+  
+In another branch this would raise NotFound
+
+  >>> #browser.open("http://localhost/++skin++Rotterdam/manfred/cavedrawings")
+  Traceback (most recent call last):
+  ...
+  NotFound: Object: <megrok.layer.ftests.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.ILayer):
+    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/ftests/layer/view.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/test_functional.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/test_functional.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/test_functional.py	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,30 @@
+import unittest
+from pkg_resources import resource_listdir
+
+from grok.ftests.test_grok_functional import FunctionalDocTestSuite
+
+def suiteFromPackage(name):
+    files = resource_listdir(__name__, name)
+    suite = unittest.TestSuite()
+    #files = ['view.py']
+    for filename in files:
+        if not filename.endswith('.py'):
+            continue
+        if filename == '__init__.py':
+            continue
+
+        dottedname = 'megrok.layer.ftests.%s.%s' % (name, filename[:-3])
+        test = FunctionalDocTestSuite(dottedname)
+
+        suite.addTest(test)
+    return suite
+
+def test_suite():
+    suite = unittest.TestSuite()
+    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/ftests/test_functional.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.py	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,24 @@
+import martian
+import grok
+import zope.component
+from zope.publisher.interfaces.browser import (IDefaultBrowserLayer,
+                                               IBrowserSkinType)
+from martian import util
+import megrok.layer
+
+class ILayerGrokker(martian.ClassGrokker):
+    component_class = megrok.layer.ILayer
+
+
+class SkinGrokker(martian.ClassGrokker):
+    component_class = megrok.layer.Skin
+
+    def grok(self, name, factory, context, module_info, templates):
+        layer = util.class_annotation(factory, 'megrok.layer.layer',
+                                    None) or module_info.getAnnotation('megrok.layer.layer',
+                                    None) or IDefaultBrowserLayer
+        name = grok.util.class_annotation(factory, 'grok.name', factory.__name__.lower())
+        zope.component.interface.provideInterface(name, layer, IBrowserSkinType)
+
+        return True
+


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

Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.zcml
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.zcml	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.zcml	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,2 @@
+<grok package=".meta" xmlns="http://namespaces.zope.org/grok" />
+

Added: grok/branches/darrylcousins-branch/megrok.viewlet/setup.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/setup.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/setup.py	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,22 @@
+from setuptools import setup, find_packages
+
+setup(
+    name='megrok.viewlet',
+    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 z3c.form!
+""",
+    packages=find_packages('src'),
+    package_dir = {'': 'src'},
+    include_package_data = True,
+    zip_safe=False,
+    license='ZPL',
+
+    install_requires=['setuptools',
+                      'z3c.viewlet',
+                     ],
+)
+


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

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/__init__.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/__init__.py	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,6 @@
+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.viewlet/src/megrok/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/__init__.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/__init__.py	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,3 @@
+from directive import viewletmanager
+from components import Viewlet, ViewletManager, ContentProvider
+


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

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/components.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/components.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/components.py	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,175 @@
+import grok
+from zope import component
+from zope import interface
+
+from zope.publisher.interfaces.browser import IBrowserView
+from zope.publisher.browser import BrowserView
+from zope.viewlet.interfaces import IViewlet
+from zope.publisher.publish import mapply
+
+from z3c.viewlet.manager import WeightOrderedViewletManager
+
+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
+
+class TemplateContentBase(object):
+    """Mixin class to provide render method using given template"""
+
+    template = None
+
+    def render(self):
+        """My concern here is that if subclass overrides this method then it
+        will be the responsibility of the developer to call update()"""
+        mapply(self.update, (), self.request)
+        if self.request.response.getStatus() in (302, 303):
+            return
+        template = getattr(self, 'template', None)
+        if template is not None:
+            return self._render_template()
+
+
+class ContentProvider(ViewBase, TemplateContentBase):
+
+    def __init__(self, context, request, view):
+        self.__parent__ = self.view = view
+        self.context = context
+        self.request = request
+        self.static = component.queryAdapter(
+            self.request,
+            interface.Interface,
+            name=self.module_info.package_dotted_name
+            )        
+
+class Viewlet(BrowserView, ViewBase, TemplateContentBase):
+    """ A grok.View-like viewlet
+    """
+    interface.implements(IViewlet)
+
+    def __init__(self, context, request, view, manager):
+        #super(Viewlet, self).__init__(context, request)
+        self.__parent__ = self.view = view
+        self.context = context
+        self.request = request
+        self.manager = manager
+        self.static = component.queryAdapter(
+            self.request,
+            interface.Interface,
+            name=self.module_info.package_dotted_name
+            )
+
+# using z3c orderedviewletmanager
+class ViewletManager(WeightOrderedViewletManager, ContentProvider):
+    """  A grok.View-like ViewletManager
+    """
+
+    def __init__(self, context, request, view):
+        self.__updated = False
+        self.__parent__ = self.view = view
+        self.context = context
+        self.request = request
+        self.static = component.queryAdapter(
+            self.request,
+            interface.Interface,
+            name=self.module_info.package_dotted_name
+            )
+
+    def update(self):
+        """Subclasses can override this method just like on regular
+        grok.Views. It will be called before any viewlet processing
+        happens."""
+        pass
+
+    def update_manager(self):
+        """Update the manager, i.e. process the viewlets.
+
+        On ViewletManagers, this is what the update() method is.
+        In grok views, the update() method has a different meaning.
+        That's why this method is called update_manager() in grok manager."""
+        super(ViewletManager, self).update()
+
+    def render(self):
+        """First update the manager then the normal grok view update"""
+        self.update_manager()
+        #mapply(self.update, (), self.request)
+        if self.request.response.getStatus() in (302, 303):
+            return
+        template = getattr(self, 'template', None)
+        if template is not None:
+            return self._render_template()
+        else:
+            return u'\n'.join([viewlet.render() for viewlet in self.viewlets])
+
+    def filter(self, viewlets):
+        """Sort out all content providers
+
+        ``viewlets`` is a list of tuples of the form (name, viewlet).
+        """
+# Only return viewlets accessible to the principal
+# this is the original for z.v.manager.py but I would get ForbiddenAttribute: ('render'
+# for the viewlets??
+        #import zope.security
+        #return [(name, viewlet) for name, viewlet in viewlets
+        #                        if zope.security.canAccess(viewlet, 'render')]
+        return [(name, viewlet) for name, viewlet in viewlets]
+
+


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

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/directive.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/directive.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/directive.py	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,5 @@
+from grok.directive import (InterfaceOrClassDirective,
+                            ClassDirectiveContext)
+
+viewletmanager = InterfaceOrClassDirective('megrok.viewlet.viewletmanager',
+                           ClassDirectiveContext())


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

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/__init__.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/__init__.py	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1 @@
+#


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

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/test_functional.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/test_functional.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/test_functional.py	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,30 @@
+import unittest
+from pkg_resources import resource_listdir
+
+from grok.ftests.test_grok_functional import FunctionalDocTestSuite
+
+def suiteFromPackage(name):
+    files = resource_listdir(__name__, name)
+    suite = unittest.TestSuite()
+    #files = ['view.py']
+    for filename in files:
+        if not filename.endswith('.py'):
+            continue
+        if filename == '__init__.py':
+            continue
+
+        dottedname = 'megrok.viewlet.ftests.%s.%s' % (name, filename[:-3])
+        test = FunctionalDocTestSuite(dottedname)
+
+        suite.addTest(test)
+    return suite
+
+def test_suite():
+    suite = unittest.TestSuite()
+    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/ftests/test_functional.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/__init__.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/__init__.py	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1 @@
+#


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

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view.py	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,122 @@
+"""
+This doctest uses grok.ContentProvider, grok.ViewletManager and grok.Viewlet.
+
+  >>> import grok
+  >>> from megrok.viewlet.ftests.viewlet.view import Mammoth
+  >>> grok.grok('megrok.viewlet.ftests.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>
+
+In another branch this would raise NotFound
+
+  >>> #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
+
+class Mammoth(grok.Model):
+    title = u'Manfred'
+
+class IMySkinLayer(megrok.layer.ILayer):
+    pass
+
+class MySkin(megrok.layer.Skin):
+    megrok.layer.layer(IMySkinLayer)
+
+class Index(grok.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(grok.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/ftests/viewlet/view.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/firstmanager.pt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/firstmanager.pt	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/firstmanager.pt	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1 @@
+<div>Way cool</div>

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/index.pt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/index.pt	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/index.pt	2007-07-01 06:05:22 UTC (rev 77278)
@@ -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/ftests/viewlet/view_templates/secondviewlet.pt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/secondviewlet.pt	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/secondviewlet.pt	2007-07-01 06:05:22 UTC (rev 77278)
@@ -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/ftests/viewlet/view_templates/skinnedindex.pt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/skinnedindex.pt	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/skinnedindex.pt	2007-07-01 06:05:22 UTC (rev 77278)
@@ -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/ftests/viewlet/view_templates/title.pt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/title.pt	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/title.pt	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1 @@
+<h1 tal:content="context/title">Hello World!</h1>

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.py	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,117 @@
+import martian
+import grok
+from zope import component
+from zope.publisher.interfaces.browser import (IDefaultBrowserLayer,
+                                               IBrowserView)
+from zope.viewlet.interfaces import IViewlet, IViewletManager
+from zope.contentprovider.interfaces import IContentProvider
+
+from martian import util
+import megrok.viewlet
+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
+
+    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)
+
+        view_layer = util.class_annotation(factory, 'megrok.layer.layer',
+                                           None) or module_info.getAnnotation('megrok.layer.layer',
+                                               None) or IDefaultBrowserLayer
+
+        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),
+                                 provides=view_provider,
+                                 name=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)
+
+        view_layer = util.class_annotation(factory, 'megrok.layer.layer',
+                                           None) or module_info.getAnnotation('megrok.layer.layer',
+                                               None) or IDefaultBrowserLayer
+
+        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, 
+                                         IBrowserView, view_manager),
+                                 provides=IViewlet,
+                                 name=view_name)
+
+
+        self.grok_end(factory)
+
+        return True
+


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

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.zcml
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.zcml	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.zcml	2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,2 @@
+<grok package=".meta" xmlns="http://namespaces.zope.org/grok" />
+

Modified: grok/branches/darrylcousins-branch/setup.py
===================================================================
--- grok/branches/darrylcousins-branch/setup.py	2007-07-01 04:53:58 UTC (rev 77277)
+++ grok/branches/darrylcousins-branch/setup.py	2007-07-01 06:05:22 UTC (rev 77278)
@@ -16,6 +16,39 @@
     include_package_data = True,
     zip_safe=False,    
     install_requires=['setuptools',
-                      'martian',
-                      'simplejson'],
+                      'simplejson',
+                      'pytz',
+                      'ZODB3',
+                      'zope.annotation',
+                      'zope.app.catalog',
+                      'zope.app.component',
+                      'zope.app.container',
+                      'zope.app.folder',
+                      'zope.app.intid',
+                      'zope.app.pagetemplate',
+                      'zope.app.publication',
+                      'zope.app.publisher',
+                      'zope.app.testing',
+                      'zope.component',
+                      'zope.contentprovider',
+                      'zope.configuration',
+                      'zope.dottedname',
+                      'zope.event',
+                      'zope.formlib',
+                      'zope.interface',
+                      'zope.lifecycleevent',
+                      'zope.pagetemplate',
+                      'zope.publisher',
+                      'zope.schema',
+                      'zope.security',
+                      'zope.testing',
+                      'zope.traversing',
+                      'zope.viewlet',
+
+                      # needed for ftests and typical deployments
+                      'zope.testbrowser',
+                      'zope.app.twisted',
+                      'zope.app.securitypolicy',
+                      'zope.app.zcmlfiles',
+                      ],
 )



More information about the Checkins mailing list