[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