[Checkins] SVN: grokcore.view/branches/jw-contentproviders/s add tests similar to those on grokcore.viewlet
Jan-Wijbrand Kolman
janwijbrand at gmail.com
Thu Jun 23 05:29:43 EDT 2011
Log message for revision 121966:
add tests similar to those on grokcore.viewlet
Changed:
U grokcore.view/branches/jw-contentproviders/setup.py
U grokcore.view/branches/jw-contentproviders/src/grokcore/view/components.py
U grokcore.view/branches/jw-contentproviders/src/grokcore/view/interfaces.py
U grokcore.view/branches/jw-contentproviders/src/grokcore/view/meta-minimal.zcml
A grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/contentprovider/
A grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/contentprovider/__init__.py
A grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/contentprovider/contentprovider_references.py
A grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/contentprovider/contentprovider_render_and_template.py
A grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/contentprovider/render_and_template_templates/
A grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/contentprovider/render_and_template_templates/contentprovider.pt
D grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/contentprovider/render_and_template_templates/viewlet.pt
U grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/test_all.py
-=-
Modified: grokcore.view/branches/jw-contentproviders/setup.py
===================================================================
--- grokcore.view/branches/jw-contentproviders/setup.py 2011-06-23 07:54:58 UTC (rev 121965)
+++ grokcore.view/branches/jw-contentproviders/setup.py 2011-06-23 09:29:43 UTC (rev 121966)
@@ -11,12 +11,13 @@
)
install_requires = [
- 'setuptools',
'grokcore.component >= 2.1',
'grokcore.security >= 1.5',
'martian >= 0.13',
+ 'setuptools',
'zope.browserresource >= 3.9.0',
'zope.component',
+ 'zope.contentprovider',
'zope.interface',
'zope.pagetemplate',
'zope.ptresource >= 3.9.0',
@@ -26,18 +27,18 @@
]
tests_require = [
+ 'zope.app.appsetup',
+ 'zope.app.publication',
'zope.app.wsgi',
+ 'zope.browserpage',
+ 'zope.configuration',
'zope.container',
+ 'zope.login',
+ 'zope.password',
+ 'zope.principalregistry',
'zope.securitypolicy',
'zope.site',
'zope.testing',
- 'zope.login',
- 'zope.configuration',
- 'zope.app.appsetup',
- 'zope.app.publication',
- 'zope.browserpage',
- 'zope.password',
- 'zope.principalregistry',
]
publication_require = [
@@ -68,6 +69,8 @@
zip_safe=False,
install_requires=install_requires,
tests_require=tests_require,
- extras_require={'test': tests_require,
- 'security_publication': publication_require},
+ extras_require={
+ 'test': tests_require,
+ 'security_publication': publication_require
+ },
)
Modified: grokcore.view/branches/jw-contentproviders/src/grokcore/view/components.py
===================================================================
--- grokcore.view/branches/jw-contentproviders/src/grokcore/view/components.py 2011-06-23 07:54:58 UTC (rev 121965)
+++ grokcore.view/branches/jw-contentproviders/src/grokcore/view/components.py 2011-06-23 09:29:43 UTC (rev 121966)
@@ -22,6 +22,7 @@
from zope import interface
from zope.browserresource import directory
from zope.browserresource.interfaces import IResourceFactoryFactory
+from zope.contentprovider.provider import ContentProviderBase
from zope.pagetemplate import pagetemplate, pagetemplatefile
from zope.pagetemplate.engine import TrustedAppPT
from zope.ptresource.ptresource import PageTemplateResourceFactory
@@ -229,7 +230,53 @@
def _initFactory(self, factory):
pass
+class ContentProvider(ContentProviderBase):
+ interface.implements(interfaces.IContentProvider)
+ template = None
+
+ def __init__(self, context, request, view):
+ super(ContentProvider, self).__init__(context, request, view)
+ self.context = context
+ self.request = request
+ self.view = view
+ self.__name__ = self.__view_name__
+ self.static = component.queryAdapter(
+ self.request,
+ interface.Interface,
+ name=self.module_info.package_dotted_name,
+ )
+
+ def default_namespace(self):
+ namespace = {}
+ namespace['context'] = self.context
+ namespace['provider'] = self
+ namespace['request'] = self.request
+ namespace['static'] = self.static
+ namespace['view'] = self.view
+ return namespace
+
+ def namespace(self):
+ return {}
+
+ def _render_template(self):
+ return self.template.render(self)
+
+ def render(self, **kwargs):
+ """A content provider can either be rendered by an associated
+ template, or it can implement this method to render itself from
+ Python. This is useful if the view's output isn't XML/HTML but
+ something computed in Python (plain text, PDF, etc.)
+
+ render() can take arbitrary keyword parameters which will be
+ filled in from the request (in that case they *must* be
+ present in the request).
+ """
+ return self._render_template()
+
+ render.base_method = True
+
+
class GrokTemplate(BaseTemplate):
"""A slightly more advanced page template
Modified: grokcore.view/branches/jw-contentproviders/src/grokcore/view/interfaces.py
===================================================================
--- grokcore.view/branches/jw-contentproviders/src/grokcore/view/interfaces.py 2011-06-23 07:54:58 UTC (rev 121965)
+++ grokcore.view/branches/jw-contentproviders/src/grokcore/view/interfaces.py 2011-06-23 09:29:43 UTC (rev 121966)
@@ -15,14 +15,17 @@
"""
from zope.interface import Interface, Attribute
from zope.publisher.interfaces.browser import IBrowserPage, IBrowserView
+from zope.contentprovider.interfaces import IContentProvider
-
class IBaseClasses(Interface):
View = Attribute("Base class for browser views.")
- DirectoryResource = Attribute("Base class to create new "
- "directory resource.")
+ ContentProvider = Attribute("Base class for content providers.")
+ DirectoryResource = Attribute(
+ "Base class to create new directory resource.")
+
+
class IDirectives(Interface):
def layer(layer):
@@ -182,9 +185,11 @@
def render(view):
"""Renders the template"""
+
class TemplateLookupError(Exception):
pass
+
class ITemplateRegAPI(Interface):
"""Public API for the templatereg module.
"""
@@ -221,3 +226,20 @@
`grok.Permission` and `grok.require` settings however, will be
applied to such views.
"""
+
+
+class IContentProvider(IContentProvider):
+
+ context = Attribute(
+ 'context', "Context object for the content provider.")
+
+ request = Attribute(
+ 'request', "Request object for the content provider.")
+
+ view = Attribute(
+ 'view', "View object for the content provider.")
+
+ static = Attribute(
+ 'static',
+ "Directory resource containing the static files of the "
+ "content provider's package.")
Modified: grokcore.view/branches/jw-contentproviders/src/grokcore/view/meta-minimal.zcml
===================================================================
--- grokcore.view/branches/jw-contentproviders/src/grokcore/view/meta-minimal.zcml 2011-06-23 07:54:58 UTC (rev 121965)
+++ grokcore.view/branches/jw-contentproviders/src/grokcore/view/meta-minimal.zcml 2011-06-23 09:29:43 UTC (rev 121966)
@@ -16,6 +16,7 @@
<!-- Only load view and template grokkers -->
<grok:grok package=".meta.views" />
+ <grok:grok package=".meta.contentproviders" />
<grok:grok package=".meta.templates" />
</configure>
Added: grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/contentprovider/__init__.py
===================================================================
--- grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/contentprovider/__init__.py (rev 0)
+++ grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/contentprovider/__init__.py 2011-06-23 09:29:43 UTC (rev 121966)
@@ -0,0 +1 @@
+#package
Added: grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/contentprovider/contentprovider_references.py
===================================================================
--- grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/contentprovider/contentprovider_references.py (rev 0)
+++ grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/contentprovider/contentprovider_references.py 2011-06-23 09:29:43 UTC (rev 121966)
@@ -0,0 +1,43 @@
+"""
+A grok.ContentProvider instance has references to the components it was
+registered for::
+
+ >>> grok.testing.grok(__name__)
+ >>> from zope import component
+ >>> from zope.contentprovider.interfaces import IContentProvider
+ >>> from zope.publisher.browser import TestRequest
+ >>> ctxt = AContext()
+ >>> request = TestRequest()
+ >>> view = component.getMultiAdapter((ctxt, request), name='a_view')
+ >>> provider = component.getMultiAdapter(
+ ... (ctxt, request, view), IContentProvider, name='a_content_provider')
+ >>> provider.context is ctxt
+ True
+
+ >>> provider.view is view
+ True
+
+ >>> provider.request is request
+ True
+
+ >>> provider.render()
+ u'I provide some content for a view'
+
+"""
+
+import grokcore.view as grok
+
+class AContext(grok.Context):
+ pass
+
+class AView(grok.View):
+ grok.name('a_view')
+
+ def render(self):
+ return u""
+
+class AContentProvider(grok.ContentProvider):
+ grok.name('a_content_provider')
+
+ def render(self):
+ return u"I provide some content for a view"
\ No newline at end of file
Added: grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/contentprovider/contentprovider_render_and_template.py
===================================================================
--- grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/contentprovider/contentprovider_render_and_template.py (rev 0)
+++ grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/contentprovider/contentprovider_render_and_template.py 2011-06-23 09:29:43 UTC (rev 121966)
@@ -0,0 +1,27 @@
+"""
+A content provider is not allowed to define its own render method and
+have a template associated with it at the same time.
+
+ >>> grok.testing.grok(__name__)
+ Traceback (most recent call last):
+ ...
+ ConfigurationExecutionError: martian.error.GrokError: Multiple possible ways
+ to render contentprovider <class 'grokcore.view.tests.contentprovider.contentprovider_render_and_template.ContentProvider'>.
+ It has both a 'render' method as well as an associated template.
+ in:
+
+"""
+
+from zope.interface import Interface
+import grokcore.view as grok
+
+grok.templatedir('render_and_template_templates')
+
+class ContentProvider(grok.ContentProvider):
+ grok.name('foo')
+ grok.context(Interface)
+ grok.template('contentprovider')
+
+ def render(self):
+ """There's also a template!
+ """
Copied: grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/contentprovider/render_and_template_templates/contentprovider.pt (from rev 121818, grokcore.viewlet/trunk/src/grokcore/viewlet/tests/viewlet/viewlet_render_and_template_templates/viewlet.pt)
===================================================================
--- grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/contentprovider/render_and_template_templates/contentprovider.pt (rev 0)
+++ grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/contentprovider/render_and_template_templates/contentprovider.pt 2011-06-23 09:29:43 UTC (rev 121966)
@@ -0,0 +1 @@
+<p>There is also a render method!</p>
Deleted: grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/contentprovider/render_and_template_templates/viewlet.pt
===================================================================
--- grokcore.viewlet/trunk/src/grokcore/viewlet/tests/viewlet/viewlet_render_and_template_templates/viewlet.pt 2011-05-26 11:27:21 UTC (rev 121818)
+++ grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/contentprovider/render_and_template_templates/viewlet.pt 2011-06-23 09:29:43 UTC (rev 121966)
@@ -1 +0,0 @@
-<p>There is also a render method!</p>
Modified: grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/test_all.py
===================================================================
--- grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/test_all.py 2011-06-23 07:54:58 UTC (rev 121965)
+++ grokcore.view/branches/jw-contentproviders/src/grokcore/view/tests/test_all.py 2011-06-23 09:29:43 UTC (rev 121966)
@@ -44,7 +44,13 @@
def test_suite():
suite = unittest.TestSuite()
- for name in ['view', 'skin', 'template', 'directoryresource']:
+ for name in [
+ 'contentprovider',
+ 'directoryresource',
+ 'skin',
+ 'template',
+ 'view',
+ ]:
suite.addTest(suiteFromPackage(name))
suite.addTest(doctest.DocFileSuite(
'../templatereg.txt',
More information about the checkins
mailing list