[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