[Checkins] SVN: grokcore.view/branches/zca-only/ Using now infrae.testbrowser

Souheil CHELFOUH souheil at chelfouh.com
Thu Mar 17 18:22:13 EDT 2011


Log message for revision 121015:
  Using now infrae.testbrowser
  Removed tests from features we no longer want to support
  

Changed:
  U   grokcore.view/branches/zca-only/buildout.cfg
  U   grokcore.view/branches/zca-only/setup.py
  U   grokcore.view/branches/zca-only/src/grokcore/view/components.py
  U   grokcore.view/branches/zca-only/src/grokcore/view/ftesting.zcml
  A   grokcore.view/branches/zca-only/src/grokcore/view/ftests/
  D   grokcore.view/branches/zca-only/src/grokcore/view/ftests/directoryresource/
  U   grokcore.view/branches/zca-only/src/grokcore/view/ftests/test_functional.py
  D   grokcore.view/branches/zca-only/src/grokcore/view/ftests/view/argument.py
  D   grokcore.view/branches/zca-only/src/grokcore/view/ftests/view/index.py
  D   grokcore.view/branches/zca-only/src/grokcore/view/ftests/view/skindirective.py
  U   grokcore.view/branches/zca-only/src/grokcore/view/ftests/view/view.py
  U   grokcore.view/branches/zca-only/src/grokcore/view/interfaces.py
  A   grokcore.view/branches/zca-only/src/grokcore/view/meta/security.py
  U   grokcore.view/branches/zca-only/src/grokcore/view/meta/views.py
  D   grokcore.view/branches/zca-only/src/grokcore/view/meta-minimal.zcml
  U   grokcore.view/branches/zca-only/src/grokcore/view/meta.zcml
  U   grokcore.view/branches/zca-only/src/grokcore/view/tests/view/interfacereg.py
  D   grokcore.view/branches/zca-only/src/grokcore/view/tests/view/view_decorator.py

-=-
Modified: grokcore.view/branches/zca-only/buildout.cfg
===================================================================
--- grokcore.view/branches/zca-only/buildout.cfg	2011-03-17 21:43:46 UTC (rev 121014)
+++ grokcore.view/branches/zca-only/buildout.cfg	2011-03-17 22:22:13 UTC (rev 121015)
@@ -6,10 +6,17 @@
     test
 versions = versions
 extensions = mr.developer buildout.dumppickedversions
+always-checkout = true
 auto-checkout = cromlech.io
+	        cromlech.bootstrap
+		cromlech.publication
+		cromlech.request
 
 [sources]
 cromlech.io = git gitosis at devel.dolmen-project.org:cromlech.io.git
+cromlech.bootstrap = git gitosis at devel.dolmen-project.org:cromlech.bootstrap.git
+cromlech.publication = git gitosis at devel.dolmen-project.org:cromlech.publication.git
+cromlech.request = git gitosis at devel.dolmen-project.org:cromlech.request.git
 
 [versions]
 grokcore.view =
@@ -22,5 +29,5 @@
 [test]
 recipe = zc.recipe.testrunner
 eggs = grokcore.view
-       grokcore.view[test]
+       grokcore.view [test, security]
 defaults = ['--tests-pattern', '^f?tests$', '-v', '--auto-color', '--auto-progress']

Modified: grokcore.view/branches/zca-only/setup.py
===================================================================
--- grokcore.view/branches/zca-only/setup.py	2011-03-17 21:43:46 UTC (rev 121014)
+++ grokcore.view/branches/zca-only/setup.py	2011-03-17 22:22:13 UTC (rev 121015)
@@ -11,25 +11,34 @@
     )
 
 install_requires = [
-    'setuptools',
+    'WebOb',
+    'cromlech.io',
     'grokcore.component >= 2.1',
     'grokcore.security >= 1.5',
     'martian >= 0.13',
+    'setuptools',
+    'zc.buildout',
     'zope.component',
     'zope.interface',
+    'zope.location',
     'zope.pagetemplate',
-    'zope.publisher',
-    'zope.security',
+    'zope.schema',
     'zope.traversing',
-    'cromlech.io',
     ]
 
 tests_require = [
-    'WebOb',
     'zope.container',
+    'zope.site',
+    'zope.publisher',
+    'infrae.testbrowser',
+    'cromlech.publication',
+    'cromlech.bootstrap',
+    'cromlech.request',
+    ]
+
+security_require = [
+    'zope.security',
     'zope.securitypolicy',
-    'zope.site',
-    'zope.browserpage',
     'zope.principalregistry',
     ]
 
@@ -43,13 +52,12 @@
     description='Grok-like configuration for Zope browser pages',
     long_description=long_description,
     license='ZPL',
-    classifiers=['Environment :: Web Environment',
-                 'Intended Audience :: Developers',
-                 'License :: OSI Approved :: Zope Public License',
-                 'Programming Language :: Python',
-                 'Framework :: Zope3',
-                 ],
-
+    classifiers=[
+        'Environment :: Web Environment',
+        'Intended Audience :: Developers',
+        'License :: OSI Approved :: Zope Public License',
+        'Programming Language :: Python',
+        ],
     packages=find_packages('src'),
     package_dir = {'': 'src'},
     namespace_packages=['grokcore'],
@@ -57,5 +65,8 @@
     zip_safe=False,
     install_requires=install_requires,
     tests_require=tests_require,
-    extras_require={'test': tests_require},
+    extras_require={
+        'test': tests_require,
+        'security': security_require,
+        },
 )

Modified: grokcore.view/branches/zca-only/src/grokcore/view/components.py
===================================================================
--- grokcore.view/branches/zca-only/src/grokcore/view/components.py	2011-03-17 21:43:46 UTC (rev 121014)
+++ grokcore.view/branches/zca-only/src/grokcore/view/components.py	2011-03-17 22:22:13 UTC (rev 121015)
@@ -33,7 +33,7 @@
 class Response(webob.Response):
     interface.implements(IResponse)
 
-    charset = 'utf8'
+    charset = 'utf-8'
 
     @apply
     def body():
@@ -61,7 +61,10 @@
         self.location = url
         self.status = status
 
+    def __str__(self):
+        return self.body
 
+
 class ViewSupport(object):
     """Mixin class providing methods and properties generally
     useful for view-ish components.

Modified: grokcore.view/branches/zca-only/src/grokcore/view/ftesting.zcml
===================================================================
--- grokcore.view/branches/zca-only/src/grokcore/view/ftesting.zcml	2011-03-17 21:43:46 UTC (rev 121014)
+++ grokcore.view/branches/zca-only/src/grokcore/view/ftesting.zcml	2011-03-17 22:22:13 UTC (rev 121015)
@@ -5,22 +5,18 @@
    i18n_domain="grokcore.view"
    package="grokcore.view">
 
+  <include package="zope.security" />
+  <include package="zope.securitypolicy" />
+
   <include package="zope.component" file="meta.zcml" />
   <include package="grokcore.view" file="meta.zcml" />
 
-  <include package="zope.security" />
-  <include package="zope.site" />
-  <include package="zope.container" />
-  <include package="zope.publisher" />
-  <include package="zope.traversing" />
-  <include package="zope.traversing.browser" />
+  <include package="cromlech.bootstrap" />
+  <include package="cromlech.publication" file="publish.zcml" />
+  <include package="cromlech.publication" file="traverse.zcml" />
+  <include package="cromlech.request" file="webob.zcml" />
 
   <include package="grokcore.view" />
   <grok:grok package="grokcore.view.ftests" />
 
-  <browser:defaultView
-      for="grokcore.component.interfaces.IContext"
-      name="index"
-      />
-
 </configure>

Modified: grokcore.view/branches/zca-only/src/grokcore/view/ftests/test_functional.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/ftests/test_functional.py	2011-03-17 14:57:14 UTC (rev 121006)
+++ grokcore.view/branches/zca-only/src/grokcore/view/ftests/test_functional.py	2011-03-17 22:22:13 UTC (rev 121015)
@@ -1,25 +1,88 @@
+# -*- coding: utf-8 -*-
+
+import doctest
+import grokcore.component
+import grokcore.view
+import os.path
 import re
+import types
 import unittest
-import os.path
-import grokcore.view
+import webob.dec
 
+from cromlech.bootstrap.testlayer import ZODBLayer
+from persistent.interfaces import IPersistent
 from pkg_resources import resource_listdir
+from zope.component import getMultiAdapter
+from zope.event import notify
+from zope.lifecycleevent import ObjectCreatedEvent
+from zope.publisher.interfaces import IRequest, IPublication
+from zope.publisher.publish import publish
+from zope.site.interfaces import IRootFolder
+from zope.site.folder import rootFolder
 
-from zope.app.wsgi.testlayer import BrowserLayer, http
-from zope.testing import doctest, renormalizing
 
+ROOT = 'grok'
 
+ at grokcore.component.implementer(IRootFolder)
+ at grokcore.component.adapter(IPersistent, types.BooleanType)
+def test_root(db_root, creation=False):
+    folder = db_root.get(ROOT, None)
+    if folder is None and creation is True:
+        folder = rootFolder()
+        notify(ObjectCreatedEvent(folder))
+        db_root[ROOT] = folder
+    return folder
+
+
+class WSGIApplication(object):
+
+    def __init__(self, db):
+        self.db = db
+
+    @webob.dec.wsgify
+    def __call__(self, webob_req):
+
+        # We want an interaction here
+        # XXXX
+
+        # We get a valid zope request
+        request = IRequest(webob_req)
+
+        # Here, we keep the zope compatibility. It will go away
+        request.setPublication(getMultiAdapter(
+            (request, self.db), IPublication))
+
+        # publishing
+        response = publish(request)
+
+        # Return the WSGI server response
+        return response
+
+
+class BrowserLayer(ZODBLayer):
+    """This create a test layer with a test database and register a wsgi
+    application to use that test database.
+
+    A wsgi_intercept handler is installed as well, so you can use a
+    WSGI version of zope.testbrowser Browser instance to access the
+    application.
+    """
+
+    def testSetUp(self):
+        ZODBLayer.testSetUp(self)
+        self.application = WSGIApplication(self.db)
+
+    def getApplication(self):
+        return self.application
+
+
 FunctionalLayer = BrowserLayer(grokcore.view)
 
-checker = renormalizing.RENormalizing([
-    # Accommodate to exception wrapping in newer versions of mechanize
-    (re.compile(r'httperror_seek_wrapper:', re.M), 'HTTPError:'),
-    ])
 
 def suiteFromPackage(name):
     files = resource_listdir(__name__, name)
     suite = unittest.TestSuite()
-    getRootFolder = FunctionalLayer.getRootFolder
+
     for filename in files:
         if not filename.endswith('.py'):
             continue
@@ -29,10 +92,9 @@
         dottedname = 'grokcore.view.ftests.%s.%s' % (name, filename[:-3])
         test = doctest.DocTestSuite(
             dottedname,
-            checker=checker,
-            extraglobs=dict(http=http,
-                            getRootFolder=getRootFolder,
-                            ),
+            extraglobs=dict(
+                getRootFolder=FunctionalLayer.getRootFolder,
+                getApplication=FunctionalLayer.getApplication),
             optionflags=(doctest.ELLIPSIS+
                          doctest.NORMALIZE_WHITESPACE+
                          doctest.REPORT_NDIFF),
@@ -42,8 +104,9 @@
         suite.addTest(test)
     return suite
 
+
 def test_suite():
     suite = unittest.TestSuite()
-    for name in ['view', 'staticdir', 'url', 'directoryresource']:
+    for name in ['view', 'staticdir', 'url']:
         suite.addTest(suiteFromPackage(name))
     return suite

Deleted: grokcore.view/branches/zca-only/src/grokcore/view/ftests/view/argument.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/ftests/view/argument.py	2011-03-17 14:57:14 UTC (rev 121006)
+++ grokcore.view/branches/zca-only/src/grokcore/view/ftests/view/argument.py	2011-03-17 22:22:13 UTC (rev 121015)
@@ -1,73 +0,0 @@
-"""
-  >>> getRootFolder()["manfred"] = Mammoth()
-
-  >>> from zope.app.wsgi.testlayer 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 grokcore.view as grok
-
-class Mammoth(grok.Context):
-    pass
-
-class RenderWithArguments(grok.View):
-    grok.name('render')
-
-    def render(self, message, another):
-        return "Message: %s\nAnother: %s" % (message, another)
-
-class UpdateWithArguments(grok.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" />
-""")

Deleted: grokcore.view/branches/zca-only/src/grokcore/view/ftests/view/index.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/ftests/view/index.py	2011-03-17 14:57:14 UTC (rev 121006)
+++ grokcore.view/branches/zca-only/src/grokcore/view/ftests/view/index.py	2011-03-17 22:22:13 UTC (rev 121015)
@@ -1,36 +0,0 @@
-"""
-  >>> getRootFolder()["manfred"] = Mammoth()
-
-The default view name for a model is 'index':
-
-  >>> from zope.app.wsgi.testlayer import Browser
-  >>> browser = Browser()
-  >>> browser.handleErrors = False
-  >>> browser.open("http://localhost/manfred")
-  >>> print browser.contents
-  <html>
-  <body>
-  <h1>Hello, world!</h1>
-  <span><class 'grokcore.view.ftests.view.index.Mammoth'></span>
-  <span><class 'grokcore.view.ftests.view.index.Mammoth'></span>
-  </body>
-  </html>
-
-"""
-import grokcore.view as grok
-
-class Mammoth(grok.Context):
-    pass
-
-class Index(grok.View):
-    pass
-
-index = grok.PageTemplate("""\
-<html>
-<body>
-<h1>Hello, world!</h1>
-<span tal:content="structure python:context.__class__">green</span>
-<span tal:content="structure context/__class__">green</span>
-</body>
-</html>
-""")

Deleted: grokcore.view/branches/zca-only/src/grokcore/view/ftests/view/skindirective.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/ftests/view/skindirective.py	2011-03-17 14:57:14 UTC (rev 121006)
+++ grokcore.view/branches/zca-only/src/grokcore/view/ftests/view/skindirective.py	2011-03-17 22:22:13 UTC (rev 121015)
@@ -1,82 +0,0 @@
-"""
-  >>> getRootFolder()["manfred"] = Mammoth()
-
-  >>> from zope.app.wsgi.testlayer import Browser
-  >>> browser = Browser()
-  >>> browser.handleErrors = False
-  >>> browser.open("http://localhost/++skin++casual/manfred/@@hello")
-  >>> print browser.contents
-  <html>
-  <body>
-  <h1>Hi sir !</h1>
-  </body>
-  </html>
-
-  >>> browser.open("http://localhost/++skin++party/manfred/@@happy")
-  >>> print browser.contents
-  Hee yay !
-
-  >>> browser.open("http://localhost/++skin++rainy/manfred/@@sad")
-  >>> print browser.contents
-  Aw... It rains.
-
-"""
-import grokcore.view as grok
-
-
-class CasualLayer(grok.IBrowserRequest):
-    pass
-
-
-class PartyLayer(grok.IBrowserRequest):
-    pass
-
-
-class RainyLayer(grok.IBrowserRequest):
-    pass
-
-
-class PartySkin(PartyLayer):
-    grok.skin('party')
-
-
-class CasualSkin(CasualLayer):
-    grok.skin('casual')
-
-
-class RainySkin(RainyLayer):
-    grok.skin('rainy')
-
-
-grok.layer(CasualLayer)
-
-
-class Mammoth(grok.Context):
-    pass
-
-
-class Hello(grok.View):
-    pass
-
-
-hello = grok.PageTemplate("""\
-<html>
-<body>
-<h1>Hi sir !</h1>
-</body>
-</html>
-""")
-
-
-class Happy(grok.View):
-    grok.layer(PartyLayer)
-
-    def render(self):
-        return u"Hee yay !"
-
-
-class Sad(grok.View):
-    grok.layer(RainyLayer)
-
-    def render(self):
-        return u"Aw... It rains."

Modified: grokcore.view/branches/zca-only/src/grokcore/view/ftests/view/view.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/ftests/view/view.py	2011-03-17 14:57:14 UTC (rev 121006)
+++ grokcore.view/branches/zca-only/src/grokcore/view/ftests/view/view.py	2011-03-17 22:22:13 UTC (rev 121015)
@@ -1,9 +1,15 @@
 """
-  >>> getRootFolder()["manfred"] = Mammoth()
+  >>> root = getRootFolder()
+  >>> application = getApplication()
 
-  >>> from zope.app.wsgi.testlayer import Browser
-  >>> browser = Browser()
-  >>> browser.handleErrors = False
+  
+  >>> root["manfred"] = Mammoth()
+
+  >>> from infrae.testbrowser.browser import Browser
+
+  >>> browser = Browser(application)
+  >>> browser.options.handle_errors = False
+
   >>> browser.open("http://localhost/manfred/@@painting")
   >>> print browser.contents
   <html>

Modified: grokcore.view/branches/zca-only/src/grokcore/view/interfaces.py
===================================================================
--- grokcore.view/branches/zca-only/src/grokcore/view/interfaces.py	2011-03-17 21:43:46 UTC (rev 121014)
+++ grokcore.view/branches/zca-only/src/grokcore/view/interfaces.py	2011-03-17 22:22:13 UTC (rev 121015)
@@ -73,8 +73,6 @@
         ``filename``.  It will be treated like an inline template
         created with ``PageTemplate``."""
 
-    IBrowserRequest = Attribute('Browser request interface')
-    IDefaultBrowserLayer = Attribute('Default layer for browser views.')
     IGrokSecurityView = Attribute('Marker interface for permissive views.')
 
 

Added: grokcore.view/branches/zca-only/src/grokcore/view/meta/security.py
===================================================================
--- grokcore.view/branches/zca-only/src/grokcore/view/meta/security.py	                        (rev 0)
+++ grokcore.view/branches/zca-only/src/grokcore/view/meta/security.py	2011-03-17 22:22:13 UTC (rev 121015)
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+
+try:
+    import martian
+    import grokcore.security
+    from grokcore.view import components
+    from cromlech.io.interfaces import IRenderer
+
+    
+    class ViewSecurityGrokker(martian.ClassGrokker):
+        martian.component(components.View)
+        martian.directive(grokcore.security.require, name='permission')
+
+        def execute(self, factory, config, permission, **kw):
+            for method_name in IRenderer:
+                config.action(
+                    discriminator=('protectName', factory, method_name),
+                    callable=grokcore.security.util.protect_getattr,
+                    args=(factory, method_name, permission),
+                    )
+            return True
+
+except ImportError:
+    pass

Modified: grokcore.view/branches/zca-only/src/grokcore/view/meta/views.py
===================================================================
--- grokcore.view/branches/zca-only/src/grokcore/view/meta/views.py	2011-03-17 21:43:46 UTC (rev 121014)
+++ grokcore.view/branches/zca-only/src/grokcore/view/meta/views.py	2011-03-17 22:22:13 UTC (rev 121015)
@@ -22,7 +22,6 @@
 
 import grokcore.security
 import grokcore.view
-from grokcore.security.util import protect_getattr
 from grokcore.view import components
 from grokcore.view import templatereg
 
@@ -90,12 +89,6 @@
         # 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 grokcore.security.require.bind().get(method) 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)
 
         # __view_name__ is needed to support IAbsoluteURL on views
         factory.__view_name__ = name

Deleted: grokcore.view/branches/zca-only/src/grokcore/view/meta-minimal.zcml
===================================================================
--- grokcore.view/branches/zca-only/src/grokcore/view/meta-minimal.zcml	2011-03-17 21:43:46 UTC (rev 121014)
+++ grokcore.view/branches/zca-only/src/grokcore/view/meta-minimal.zcml	2011-03-17 22:22:13 UTC (rev 121015)
@@ -1,21 +0,0 @@
-<configure
-   xmlns="http://namespaces.zope.org/zope"
-   xmlns:meta="http://namespaces.zope.org/meta"
-   xmlns:grok="http://namespaces.zope.org/grok">
-
-  <include package="grokcore.component" file="meta.zcml" />
-  <include package="grokcore.security" file="meta.zcml" />
-
-  <meta:directives namespace="http://namespaces.zope.org/grok">
-    <meta:directive
-        name="ignoreTemplates"
-        schema=".zcml.IIgnoreTemplatesDirective"
-        handler=".zcml.ignoreTemplates"
-        />
-  </meta:directives>
-
-  <!-- Only load view and template grokkers -->
-  <grok:grok package=".meta.views" />
-  <grok:grok package=".meta.templates" />
-
-</configure>

Modified: grokcore.view/branches/zca-only/src/grokcore/view/meta.zcml
===================================================================
--- grokcore.view/branches/zca-only/src/grokcore/view/meta.zcml	2011-03-17 21:43:46 UTC (rev 121014)
+++ grokcore.view/branches/zca-only/src/grokcore/view/meta.zcml	2011-03-17 22:22:13 UTC (rev 121015)
@@ -1,11 +1,9 @@
 <configure
    xmlns="http://namespaces.zope.org/zope"
+   xmlns:zcml="http://namespaces.zope.org/zcml"
    xmlns:meta="http://namespaces.zope.org/meta"
    xmlns:grok="http://namespaces.zope.org/grok">
 
-  <include package="grokcore.component" file="meta.zcml" />
-  <include package="grokcore.security" file="meta.zcml" />
-
   <meta:directives namespace="http://namespaces.zope.org/grok">
     <meta:directive
         name="ignoreTemplates"
@@ -14,5 +12,13 @@
         />
   </meta:directives>
 
-  <grok:grok package=".meta" />
+  <include package="grokcore.component" file="meta.zcml" />
+  <grok:grok package=".meta.views" />
+  <grok:grok package=".meta.templates" />
+
+  <configure zcml:condition="installed grokcore.security"> 
+    <include package="grokcore.security" file="meta.zcml" />
+    <grok:grok package=".meta.security" />
+  </configure>
+
 </configure>

Modified: grokcore.view/branches/zca-only/src/grokcore/view/tests/view/interfacereg.py
===================================================================
--- grokcore.view/branches/zca-only/src/grokcore/view/tests/view/interfacereg.py	2011-03-17 21:43:46 UTC (rev 121014)
+++ grokcore.view/branches/zca-only/src/grokcore/view/tests/view/interfacereg.py	2011-03-17 22:22:13 UTC (rev 121015)
@@ -23,21 +23,21 @@
 
   >>> view = component.getMultiAdapter(
   ...     (manfred, request), interface=IChalk, name='cavepainting')
-  >>> view()
-  'a chalk cave painting'
+  >>> print view()
+  a chalk cave painting
 
 The name can be set to '', in which case it is an 'unnamed' view:
 
   >>> view = component.getMultiAdapter((manfred, request), interface=IRealist)
-  >>> view()
-  'a realist cave painting'
+  >>> print view()
+  a realist cave painting
 
 Multipl IPaintStyles can now be looked up by interface, rather than name:
 
   >>> view = component.getMultiAdapter(
   ...     (manfred, request), interface=IImpressionist)
-  >>> view()
-  'an impressionist cave painting'
+  >>> print view()
+  an impressionist cave painting
 
 """
 

Deleted: grokcore.view/branches/zca-only/src/grokcore/view/tests/view/view_decorator.py
===================================================================
--- grokcore.view/branches/zca-only/src/grokcore/view/tests/view/view_decorator.py	2011-03-17 21:43:46 UTC (rev 121014)
+++ grokcore.view/branches/zca-only/src/grokcore/view/tests/view/view_decorator.py	2011-03-17 22:22:13 UTC (rev 121015)
@@ -1,23 +0,0 @@
-"""
-Using the @grok.require decorator in a view class is not allowed.
-
-  >>> grok.testing.grok(__name__)
-  Traceback (most recent call last):
-    ...
-  GrokError: The @grok.require decorator is used for method 'render' in view <class 'grokcore.view.tests.view.view_decorator.BogusView'>. It may only be used for XML-RPC methods.
-
-
-"""
-
-import grokcore.view as grok
-import zope.interface
-
-class Bogus(grok.Permission):
-    grok.name('bogus.perm')
-
-class BogusView(grok.View):
-    grok.context(zope.interface.Interface)
-
-    @grok.require(Bogus)
-    def render(self):
-        pass



More information about the checkins mailing list