[Checkins] SVN: zope.browserpage/trunk/ Remove dependency on zope.app.pagetemplate by moving viewpagetemplatefile, simpleviewclass and metaconfigure.registerType into this package.

Hanno Schlichting hannosch at hannosch.eu
Tue Dec 22 13:39:52 EST 2009


Log message for revision 106891:
  Remove dependency on zope.app.pagetemplate by moving viewpagetemplatefile, simpleviewclass and metaconfigure.registerType into this package.
  

Changed:
  U   zope.browserpage/trunk/CHANGES.txt
  U   zope.browserpage/trunk/buildout.cfg
  U   zope.browserpage/trunk/setup.py
  U   zope.browserpage/trunk/src/zope/browserpage/__init__.py
  A   zope.browserpage/trunk/src/zope/browserpage/configure.zcml
  U   zope.browserpage/trunk/src/zope/browserpage/metaconfigure.py
  A   zope.browserpage/trunk/src/zope/browserpage/simpleviewclass.py
  D   zope.browserpage/trunk/src/zope/browserpage/testfiles/
  A   zope.browserpage/trunk/src/zope/browserpage/tests/
  A   zope.browserpage/trunk/src/zope/browserpage/tests/__init__.py
  A   zope.browserpage/trunk/src/zope/browserpage/tests/sample.py
  A   zope.browserpage/trunk/src/zope/browserpage/tests/simpletestview.py
  A   zope.browserpage/trunk/src/zope/browserpage/tests/test.pt
  A   zope.browserpage/trunk/src/zope/browserpage/tests/test_boundpagetemplate.py
  A   zope.browserpage/trunk/src/zope/browserpage/tests/test_page.py
  A   zope.browserpage/trunk/src/zope/browserpage/tests/test_simpleviewclass.py
  A   zope.browserpage/trunk/src/zope/browserpage/tests/test_viewzpt.py
  A   zope.browserpage/trunk/src/zope/browserpage/tests/testfiles/
  A   zope.browserpage/trunk/src/zope/browserpage/tests/testsimpleviewclass.pt
  A   zope.browserpage/trunk/src/zope/browserpage/tests/testxml.pt
  D   zope.browserpage/trunk/src/zope/browserpage/tests.py
  A   zope.browserpage/trunk/src/zope/browserpage/viewpagetemplatefile.py

-=-
Modified: zope.browserpage/trunk/CHANGES.txt
===================================================================
--- zope.browserpage/trunk/CHANGES.txt	2009-12-22 18:25:39 UTC (rev 106890)
+++ zope.browserpage/trunk/CHANGES.txt	2009-12-22 18:39:51 UTC (rev 106891)
@@ -2,12 +2,13 @@
 CHANGES
 =======
 
-3.9.1 (unreleased)
-==================
+3.10.0 (unreleased)
+===================
 
-- ...
+- Remove dependency on zope.app.pagetemplate by moving viewpagetemplatefile,
+  simpleviewclass and metaconfigure.registerType into this package.
 
 3.9.0 (2009-08-27)
 ==================
 
-Initial release. This package was splitted off from zope.app.publisher.
+- Initial release. This package was split off from zope.app.publisher.

Modified: zope.browserpage/trunk/buildout.cfg
===================================================================
--- zope.browserpage/trunk/buildout.cfg	2009-12-22 18:25:39 UTC (rev 106890)
+++ zope.browserpage/trunk/buildout.cfg	2009-12-22 18:39:51 UTC (rev 106891)
@@ -1,6 +1,6 @@
 [buildout]
-develop = .
-parts = test coverage-test coverage-report pydev
+develop = . /opt/zope/zope.app.pagetemplate
+parts = test coverage-test coverage-report
 
 [test]
 recipe = zc.recipe.testrunner
@@ -16,7 +16,3 @@
 eggs = z3c.coverage
 scripts = coverage=coverage-report
 arguments = ('coverage', 'coverage/report')
-
-[pydev]
-recipe = pb.recipes.pydev
-eggs = zope.browserpage

Modified: zope.browserpage/trunk/setup.py
===================================================================
--- zope.browserpage/trunk/setup.py	2009-12-22 18:25:39 UTC (rev 106890)
+++ zope.browserpage/trunk/setup.py	2009-12-22 18:39:51 UTC (rev 106891)
@@ -13,13 +13,13 @@
 ##############################################################################
 """zope.browserpage setup
 """
-from setuptools import setup, find_packages, Extension
+from setuptools import setup, find_packages
 
 long_description = (open('README.txt').read() + '\n\n' +
                     open('CHANGES.txt').read())
 
 setup(name='zope.browserpage',
-      version = '3.9.1dev',
+      version = '3.10.0dev',
       url='http://pypi.python.org/pypi/zope.browserpage/',
       author='Zope Corporation and Contributors',
       author_email='zope-dev at zope.org',
@@ -31,7 +31,7 @@
                      'Topic :: Internet :: WWW/HTTP',
                      'Framework :: Zope3',
                      ],
-      description='ZCML directives for configuration browser views for Zope 3.',
+      description='ZCML directives for configuring browser views for Zope.',
       long_description=long_description,
 
       packages=find_packages('src'),
@@ -40,7 +40,7 @@
       namespace_packages=['zope'],
       include_package_data=True,
       install_requires=['setuptools',
-                        'zope.app.pagetemplate',
+                        'zope.pagetemplate',
                         'zope.component>=3.7',
                         'zope.configuration',
                         'zope.interface',

Modified: zope.browserpage/trunk/src/zope/browserpage/__init__.py
===================================================================
--- zope.browserpage/trunk/src/zope/browserpage/__init__.py	2009-12-22 18:25:39 UTC (rev 106890)
+++ zope.browserpage/trunk/src/zope/browserpage/__init__.py	2009-12-22 18:39:51 UTC (rev 106891)
@@ -0,0 +1 @@
+from zope.browserpage.viewpagetemplatefile import ViewPageTemplateFile
\ No newline at end of file

Added: zope.browserpage/trunk/src/zope/browserpage/configure.zcml
===================================================================
--- zope.browserpage/trunk/src/zope/browserpage/configure.zcml	                        (rev 0)
+++ zope.browserpage/trunk/src/zope/browserpage/configure.zcml	2009-12-22 18:39:51 UTC (rev 106891)
@@ -0,0 +1,14 @@
+<configure xmlns="http://namespaces.zope.org/zope">
+
+  <class class=".viewpagetemplatefile.BoundPageTemplate">
+    <allow attributes="__call__ __str__ __name__" />
+  </class>
+
+ <adapter
+     for="zope.browserpage.viewpagetemplatefile.BoundPageTemplate
+          zope.publisher.interfaces.browser.IBrowserRequest"
+     provides="zope.publisher.interfaces.browser.IBrowserPublisher"
+     factory="zope.browserpage.viewpagetemplatefile.NoTraverser"
+     />
+
+</configure>


Property changes on: zope.browserpage/trunk/src/zope/browserpage/configure.zcml
___________________________________________________________________
Added: svn:eol-style
   + native

Modified: zope.browserpage/trunk/src/zope/browserpage/metaconfigure.py
===================================================================
--- zope.browserpage/trunk/src/zope/browserpage/metaconfigure.py	2009-12-22 18:25:39 UTC (rev 106890)
+++ zope.browserpage/trunk/src/zope/browserpage/metaconfigure.py	2009-12-22 18:39:51 UTC (rev 106891)
@@ -24,13 +24,17 @@
 from zope.publisher.interfaces import NotFound
 from zope.security.checker import CheckerPublic, Checker, defineChecker
 from zope.configuration.exceptions import ConfigurationError
+from zope.pagetemplate.engine import Engine
+from zope.pagetemplate.engine import _Engine
+from zope.pagetemplate.engine import TrustedEngine
+from zope.pagetemplate.engine import _TrustedEngine
 from zope.publisher.interfaces.browser import IBrowserRequest
 from zope.publisher.interfaces.browser import IDefaultBrowserLayer
 from zope.publisher.interfaces.browser import IBrowserPublisher
 from zope.publisher.browser import BrowserView
 
-from zope.app.pagetemplate.simpleviewclass import SimpleViewClass
-from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
+from zope.browserpage.simpleviewclass import SimpleViewClass
+from zope.browserpage.viewpagetemplatefile import ViewPageTemplateFile
 
 try:
     from zope.browsermenu.metaconfigure import menuItemDirective
@@ -429,3 +433,23 @@
             if '__call__' in c.__dict__:
                 return True
     return False
+
+
+def registerType(name, handler):
+    Engine.registerType(name, handler)
+    TrustedEngine.registerType(name, handler)
+
+
+def clear():
+    Engine.__init__()
+    _Engine(Engine)
+    TrustedEngine.__init__()
+    _TrustedEngine(TrustedEngine)
+
+
+try:
+    from zope.testing.cleanup import addCleanUp
+except ImportError:
+    pass
+else:
+    addCleanUp(clear)

Copied: zope.browserpage/trunk/src/zope/browserpage/simpleviewclass.py (from rev 106889, zope.app.pagetemplate/trunk/src/zope/app/pagetemplate/simpleviewclass.py)
===================================================================
--- zope.browserpage/trunk/src/zope/browserpage/simpleviewclass.py	                        (rev 0)
+++ zope.browserpage/trunk/src/zope/browserpage/simpleviewclass.py	2009-12-22 18:39:51 UTC (rev 106891)
@@ -0,0 +1,60 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Simple View Class
+
+$Id$
+"""
+__docformat__ = 'restructuredtext'
+
+import sys
+from zope.interface import implements
+from zope.publisher.browser import BrowserView
+from zope.publisher.interfaces.browser import IBrowserPublisher
+from zope.publisher.interfaces import NotFound
+from zope.browserpage.viewpagetemplatefile import ViewPageTemplateFile
+
+class simple(BrowserView):
+
+    implements(IBrowserPublisher)
+
+    def browserDefault(self, request):
+        return self, ()
+
+    def publishTraverse(self, request, name):
+        if name == 'index.html':
+            return self.index
+
+        raise NotFound(self, name, request)
+
+    def __getitem__(self, name):
+        return self.index.macros[name]
+
+    def __call__(self, *args, **kw):
+        return self.index(*args, **kw)
+
+
+def SimpleViewClass(src, offering=None, used_for=None, bases=(), name=u''):
+    if offering is None:
+        offering = sys._getframe(1).f_globals
+
+    bases += (simple, )
+
+    class_ = type("SimpleViewClass from %s" % src, bases,
+                  {'index': ViewPageTemplateFile(src, offering),
+                   '__name__': name})
+
+    if used_for is not None:
+        class_.__used_for__ = used_for
+
+    return class_

Added: zope.browserpage/trunk/src/zope/browserpage/tests/__init__.py
===================================================================
--- zope.browserpage/trunk/src/zope/browserpage/tests/__init__.py	                        (rev 0)
+++ zope.browserpage/trunk/src/zope/browserpage/tests/__init__.py	2009-12-22 18:39:51 UTC (rev 106891)
@@ -0,0 +1 @@
+#
\ No newline at end of file


Property changes on: zope.browserpage/trunk/src/zope/browserpage/tests/__init__.py
___________________________________________________________________
Added: svn:eol-style
   + native

Copied: zope.browserpage/trunk/src/zope/browserpage/tests/sample.py (from rev 106889, zope.app.pagetemplate/trunk/src/zope/app/pagetemplate/tests/sample.py)
===================================================================
--- zope.browserpage/trunk/src/zope/browserpage/tests/sample.py	                        (rev 0)
+++ zope.browserpage/trunk/src/zope/browserpage/tests/sample.py	2009-12-22 18:39:51 UTC (rev 106891)
@@ -0,0 +1,21 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Sample Component
+
+$Id$
+"""
+from zope.browserpage import ViewPageTemplateFile
+
+class C(object):
+    index = ViewPageTemplateFile('test.pt')

Copied: zope.browserpage/trunk/src/zope/browserpage/tests/simpletestview.py (from rev 106889, zope.app.pagetemplate/trunk/src/zope/app/pagetemplate/tests/simpletestview.py)
===================================================================
--- zope.browserpage/trunk/src/zope/browserpage/tests/simpletestview.py	                        (rev 0)
+++ zope.browserpage/trunk/src/zope/browserpage/tests/simpletestview.py	2009-12-22 18:39:51 UTC (rev 106891)
@@ -0,0 +1,20 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Simple Test View
+
+$Id$
+"""
+from zope.browserpage.simpleviewclass import SimpleViewClass
+
+SimpleTestView = SimpleViewClass('testsimpleviewclass.pt')

Copied: zope.browserpage/trunk/src/zope/browserpage/tests/test.pt (from rev 106889, zope.app.pagetemplate/trunk/src/zope/app/pagetemplate/tests/test.pt)
===================================================================
--- zope.browserpage/trunk/src/zope/browserpage/tests/test.pt	                        (rev 0)
+++ zope.browserpage/trunk/src/zope/browserpage/tests/test.pt	2009-12-22 18:39:51 UTC (rev 106891)
@@ -0,0 +1 @@
+<html><body></body></html>

Copied: zope.browserpage/trunk/src/zope/browserpage/tests/test_boundpagetemplate.py (from rev 106889, zope.app.pagetemplate/trunk/src/zope/app/pagetemplate/tests/test_boundpagetemplate.py)
===================================================================
--- zope.browserpage/trunk/src/zope/browserpage/tests/test_boundpagetemplate.py	                        (rev 0)
+++ zope.browserpage/trunk/src/zope/browserpage/tests/test_boundpagetemplate.py	2009-12-22 18:39:51 UTC (rev 106891)
@@ -0,0 +1,37 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Bound Page Template Tests
+
+$Id$
+"""
+import unittest
+
+class Test(unittest.TestCase):
+
+    def testAttributes(self):
+
+        from zope.browserpage.tests.sample import C
+
+        C.index.im_func.foo = 1
+        self.assertEqual(C.index.macros, C.index.im_func.macros)
+        self.assertEqual(C.index.filename, C.index.im_func.filename)
+
+
+
+def test_suite():
+    loader=unittest.TestLoader()
+    return loader.loadTestsFromTestCase(Test)
+
+if __name__=='__main__':
+    unittest.TextTestRunner().run(test_suite())

Copied: zope.browserpage/trunk/src/zope/browserpage/tests/test_page.py (from rev 106889, zope.browserpage/trunk/src/zope/browserpage/tests.py)
===================================================================
--- zope.browserpage/trunk/src/zope/browserpage/tests/test_page.py	                        (rev 0)
+++ zope.browserpage/trunk/src/zope/browserpage/tests/test_page.py	2009-12-22 18:39:51 UTC (rev 106891)
@@ -0,0 +1,961 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Tests for browser:page directive and friends
+
+$Id$
+"""
+
+import sys
+import os
+import unittest
+from cStringIO import StringIO
+
+from zope import component
+from zope.interface import Interface, implements, directlyProvides, providedBy
+
+import zope.security.management
+from zope.configuration.xmlconfig import xmlconfig, XMLConfig
+from zope.configuration.exceptions import ConfigurationError
+from zope.publisher.browser import TestRequest
+from zope.publisher.interfaces import IDefaultViewName
+from zope.publisher.interfaces.browser import IBrowserPublisher
+from zope.publisher.interfaces.browser import IBrowserRequest
+from zope.publisher.interfaces.browser import IBrowserSkinType, IDefaultSkin
+from zope.security.proxy import removeSecurityProxy, ProxyFactory
+from zope.security.permission import Permission
+from zope.security.interfaces import IPermission
+from zope.testing.doctest import DocTestSuite
+from zope.testing import cleanup
+from zope.traversing.adapters import DefaultTraversable
+from zope.traversing.interfaces import ITraversable
+
+import zope.publisher.defaultview
+import zope.browserpage
+import zope.browsermenu
+from zope.browsermenu.menu import getFirstMenuItem
+from zope.browsermenu.interfaces import IMenuItemType
+from zope.component.testfiles.views import IC, V1, VZMI, R1, IV
+
+tests_path = os.path.dirname(__file__)
+
+template = """<configure
+   xmlns='http://namespaces.zope.org/zope'
+   xmlns:browser='http://namespaces.zope.org/browser'
+   i18n_domain='zope'>
+   %s
+   </configure>"""
+
+class templateclass(object):
+    def data(self): return 42
+
+request = TestRequest()
+
+class V2(V1, object):
+
+    def action(self):
+        return self.action2()
+
+    def action2(self):
+        return "done"
+
+class VT(V1, object):
+    def publishTraverse(self, request, name):
+        try:
+            return int(name)
+        except:
+            return super(VT, self).publishTraverse(request, name)
+
+class Ob(object):
+    implements(IC)
+
+ob = Ob()
+
+class NCV(object):
+    "non callable view"
+
+    def __init__(self, context, request):
+        pass
+
+class CV(NCV):
+    "callable view"
+    def __call__(self):
+        pass
+
+
+class C_w_implements(NCV):
+    implements(Interface)
+
+    def index(self):
+        return self
+
+class ITestLayer(IBrowserRequest):
+    """Test Layer."""
+
+class ITestSkin(ITestLayer):
+    """Test Skin."""
+
+
+class ITestMenu(Interface):
+    """Test menu."""
+
+directlyProvides(ITestMenu, IMenuItemType)
+
+class Test(cleanup.CleanUp, unittest.TestCase):
+
+    def setUp(self):
+        super(Test, self).setUp()
+        XMLConfig('meta.zcml', zope.browserpage)()
+        XMLConfig('meta.zcml', zope.browsermenu)()
+        component.provideAdapter(DefaultTraversable, (None,), ITraversable, )
+        zope.security.management.newInteraction()
+
+    def testPage(self):
+        self.assertEqual(
+            component.queryMultiAdapter((ob, request), name='test'),
+            None)
+
+        xmlconfig(StringIO(template % (
+            '''
+            <browser:page
+                name="test"
+                class="zope.component.testfiles.views.V1"
+                for="zope.component.testfiles.views.IC"
+                permission="zope.Public"
+                attribute="index"
+                />
+            '''
+            )))
+
+        v = component.queryMultiAdapter((ob, request), name='test')
+        self.assert_(issubclass(v.__class__, V1))
+
+
+    def testPageWithClassWithMenu(self):
+        self.assertEqual(
+            component.queryMultiAdapter((ob, request), name='test'),
+            None)
+        testtemplate = os.path.join(tests_path, 'testfiles', 'test.pt')
+
+
+        xmlconfig(StringIO(template % (
+            '''
+            <browser:menu
+                id="test_menu" title="Test menu" />
+            <browser:page
+                name="test"
+                class="zope.component.testfiles.views.V1"
+                for="zope.component.testfiles.views.IC"
+                permission="zope.Public"
+                template="%s"
+                menu="test_menu"
+                title="Test View"
+                />
+            ''' % testtemplate
+            )))
+        menuItem = getFirstMenuItem('test_menu', ob, TestRequest())
+        self.assertEqual(menuItem["title"], "Test View")
+        self.assertEqual(menuItem["action"], "@@test")
+        v = component.queryMultiAdapter((ob, request), name='test')
+        self.assertEqual(v(), "<html><body><p>test</p></body></html>\n")
+
+
+    def testPageWithTemplateWithMenu(self):
+        self.assertEqual(
+            component.queryMultiAdapter((ob, request), name='test'),
+            None)
+        testtemplate = os.path.join(tests_path, 'testfiles', 'test.pt')
+
+        xmlconfig(StringIO(template % (
+            '''
+            <browser:menu
+                id="test_menu" title="Test menu"/>
+            <browser:page
+                name="test"
+                for="zope.component.testfiles.views.IC"
+                permission="zope.Public"
+                template="%s"
+                menu="test_menu"
+                title="Test View"
+                />
+            ''' % testtemplate
+            )))
+
+        menuItem = getFirstMenuItem('test_menu', ob, TestRequest())
+        self.assertEqual(menuItem["title"], "Test View")
+        self.assertEqual(menuItem["action"], "@@test")
+        v = component.queryMultiAdapter((ob, request), name='test')
+        self.assertEqual(v(), "<html><body><p>test</p></body></html>\n")
+
+
+    def testPageInPagesWithTemplateWithMenu(self):
+        self.assertEqual(
+            component.queryMultiAdapter((ob, request), name='test'),
+            None)
+        testtemplate = os.path.join(tests_path, 'testfiles', 'test.pt')
+
+        xmlconfig(StringIO(template % (
+            '''
+            <browser:menu
+                id="test_menu" title="Test menu" />
+            <browser:pages
+                for="zope.component.testfiles.views.IC"
+                permission="zope.Public">
+              <browser:page
+                  name="test"
+                  template="%s"
+                  menu="test_menu"
+                  title="Test View"
+                  />
+            </browser:pages>
+            ''' % testtemplate
+            )))
+
+        menuItem = getFirstMenuItem('test_menu', ob, TestRequest())
+        self.assertEqual(menuItem["title"], "Test View")
+        self.assertEqual(menuItem["action"], "@@test")
+        v = component.queryMultiAdapter((ob, request), name='test')
+        self.assertEqual(v(), "<html><body><p>test</p></body></html>\n")
+
+
+    def testPageInPagesWithClassWithMenu(self):
+        self.assertEqual(
+            component.queryMultiAdapter((ob, request), name='test'),
+            None)
+        testtemplate = os.path.join(tests_path, 'testfiles', 'test.pt')
+
+        xmlconfig(StringIO(template % (
+            '''
+            <browser:menu
+                id="test_menu" title="Test menu" />
+            <browser:pages
+                for="zope.component.testfiles.views.IC"
+                class="zope.component.testfiles.views.V1"
+                permission="zope.Public">
+              <browser:page
+                  name="test"
+                  template="%s"
+                  menu="test_menu"
+                  title="Test View"
+                  />
+            </browser:pages>
+            ''' % testtemplate
+            )))
+
+        menuItem = getFirstMenuItem('test_menu', ob, TestRequest())
+        self.assertEqual(menuItem["title"], "Test View")
+        self.assertEqual(menuItem["action"], "@@test")
+        v = component.queryMultiAdapter((ob, request), name='test')
+        self.assertEqual(v(), "<html><body><p>test</p></body></html>\n")
+
+    def testSkinPage(self):
+        self.assertEqual(
+            component.queryMultiAdapter((ob, request), name='test'),
+            None)
+
+        xmlconfig(StringIO(template % (
+            '''
+            <browser:page name="test"
+                class="zope.component.testfiles.views.VZMI"
+                layer="
+                  zope.browserpage.tests.test_page.ITestLayer"
+                for="zope.component.testfiles.views.IC"
+                permission="zope.Public"
+                attribute="index"
+                />
+            <browser:page name="test"
+                class="zope.component.testfiles.views.V1"
+                for="zope.component.testfiles.views.IC"
+                permission="zope.Public"
+                attribute="index"
+                />
+            '''
+            )))
+
+        v = component.queryMultiAdapter((ob, request), name='test')
+        self.assert_(issubclass(v.__class__, V1))
+        v = component.queryMultiAdapter(
+            (ob, TestRequest(skin=ITestSkin)), name='test')
+        self.assert_(issubclass(v.__class__, VZMI))
+
+
+    def testInterfaceProtectedPage(self):
+        xmlconfig(StringIO(template %
+            '''
+            <browser:page name="test"
+                class="zope.component.testfiles.views.V1"
+                attribute="index"
+                for="zope.component.testfiles.views.IC"
+                permission="zope.Public"
+                allowed_interface="zope.component.testfiles.views.IV"
+                />
+            '''
+            ))
+
+        v = component.getMultiAdapter((ob, request), name='test')
+        v = ProxyFactory(v)
+        self.assertEqual(v.index(), 'V1 here')
+        self.assertRaises(Exception, getattr, v, 'action')
+
+    def testAttributeProtectedPage(self):
+        xmlconfig(StringIO(template %
+            '''
+            <browser:page name="test"
+                class="zope.browserpage.tests.test_page.V2"
+                for="zope.component.testfiles.views.IC"
+                attribute="action"
+                permission="zope.Public"
+                allowed_attributes="action2"
+                />
+            '''
+            ))
+
+        v = component.getMultiAdapter((ob, request), name='test')
+        v = ProxyFactory(v)
+        self.assertEqual(v.action(), 'done')
+        self.assertEqual(v.action2(), 'done')
+        self.assertRaises(Exception, getattr, v, 'index')
+
+    def testAttributeProtectedView(self):
+        xmlconfig(StringIO(template %
+            '''
+            <browser:view name="test"
+                class="zope.browserpage.tests.test_page.V2"
+                for="zope.component.testfiles.views.IC"
+                permission="zope.Public"
+                allowed_attributes="action2"
+                >
+              <browser:page name="index.html" attribute="action" />
+           </browser:view>
+            '''
+            ))
+
+        v = component.getMultiAdapter((ob, request), name='test')
+        v = ProxyFactory(v)
+        page = v.publishTraverse(request, 'index.html')
+        self.assertEqual(page(), 'done')
+        self.assertEqual(v.action2(), 'done')
+        self.assertRaises(Exception, getattr, page, 'index')
+
+    def testInterfaceAndAttributeProtectedPage(self):
+        xmlconfig(StringIO(template %
+            '''
+            <browser:page name="test"
+                class="zope.component.testfiles.views.V1"
+                for="zope.component.testfiles.views.IC"
+                permission="zope.Public"
+                attribute="index"
+                allowed_attributes="action"
+                allowed_interface="zope.component.testfiles.views.IV"
+                />
+            '''
+            ))
+
+        v = component.getMultiAdapter((ob, request), name='test')
+        self.assertEqual(v.index(), 'V1 here')
+        self.assertEqual(v.action(), 'done')
+
+    def testDuplicatedInterfaceAndAttributeProtectedPage(self):
+        xmlconfig(StringIO(template %
+            '''
+            <browser:page name="test"
+                class="zope.component.testfiles.views.V1"
+                for="zope.component.testfiles.views.IC"
+                attribute="index"
+                permission="zope.Public"
+                allowed_attributes="action index"
+                allowed_interface="zope.component.testfiles.views.IV"
+                />
+            '''
+            ))
+
+        v = component.getMultiAdapter((ob, request), name='test')
+        self.assertEqual(v.index(), 'V1 here')
+        self.assertEqual(v.action(), 'done')
+
+    def test_class_w_implements(self):
+        xmlconfig(StringIO(template %
+            '''
+            <browser:page
+                name="test"
+                class="
+             zope.browserpage.tests.test_page.C_w_implements"
+                for="zope.component.testfiles.views.IC"
+                attribute="index"
+                permission="zope.Public"
+                />
+            '''
+            ))
+
+        v = component.getMultiAdapter((ob, request), name='test')
+        self.assertEqual(v.index(), v)
+        self.assert_(IBrowserPublisher.providedBy(v))
+
+    def testIncompleteProtectedPageNoPermission(self):
+        self.assertRaises(
+            ConfigurationError,
+            xmlconfig,
+            StringIO(template %
+            '''
+            <browser:page name="test"
+                class="zope.component.testfiles.views.V1"
+                for="zope.component.testfiles.views.IC"
+                attribute="index"
+                allowed_attributes="action index"
+                />
+            '''
+            ))
+
+
+    def testPageViews(self):
+        self.assertEqual(
+            component.queryMultiAdapter((ob, request), name='test'),
+            None)
+        test3 = os.path.join(tests_path, 'testfiles', 'test3.pt')
+
+        xmlconfig(StringIO(template %
+            '''
+            <browser:pages
+                class="zope.component.testfiles.views.V1"
+                for="zope.component.testfiles.views.IC"
+                permission="zope.Public"
+                >
+
+              <browser:page name="index.html" attribute="index" />
+              <browser:page name="action.html" attribute="action" />
+              <browser:page name="test.html" template="%s" />
+            </browser:pages>
+            ''' % test3
+            ))
+
+        v = component.getMultiAdapter((ob, request), name='index.html')
+        self.assertEqual(v(), 'V1 here')
+        v = component.getMultiAdapter((ob, request), name='action.html')
+        self.assertEqual(v(), 'done')
+        v = component.getMultiAdapter((ob, request), name='test.html')
+        self.assertEqual(str(v()), '<html><body><p>done</p></body></html>\n')
+
+    def testNamedViewPageViewsCustomTraversr(self):
+        self.assertEqual(
+            component.queryMultiAdapter((ob, request), name='test'),
+            None)
+
+        xmlconfig(StringIO(template %
+            '''
+            <browser:view
+                name="test"
+                class="zope.browserpage.tests.test_page.V1"
+                for="zope.component.testfiles.views.IC"
+                permission="zope.Public"
+                >
+
+              <browser:page name="index.html" attribute="index" />
+              <browser:page name="action.html" attribute="action" />
+            </browser:view>
+            '''
+            ))
+
+        view = component.getMultiAdapter((ob, request), name='test')
+        view = removeSecurityProxy(view)
+        self.assertEqual(view.browserDefault(request)[1], (u'index.html', ))
+
+
+        v = view.publishTraverse(request, 'index.html')
+        v = removeSecurityProxy(v)
+        self.assertEqual(v(), 'V1 here')
+        v = view.publishTraverse(request, 'action.html')
+        v = removeSecurityProxy(v)
+        self.assertEqual(v(), 'done')
+
+
+    def testNamedViewNoPagesForCallable(self):
+        self.assertEqual(
+            component.queryMultiAdapter((ob, request), name='test'),
+            None)
+
+        xmlconfig(StringIO(template %
+            '''
+            <browser:view
+                name="test"
+                class="zope.browserpage.tests.test_page.CV"
+                for="zope.component.testfiles.views.IC"
+                permission="zope.Public"
+                />
+            '''
+            ))
+
+        view = component.getMultiAdapter((ob, request), name='test')
+        view = removeSecurityProxy(view)
+        self.assertEqual(view.browserDefault(request), (view, ()))
+
+    def testNamedViewNoPagesForNonCallable(self):
+        self.assertEqual(
+            component.queryMultiAdapter((ob, request), name='test'),
+            None)
+
+        xmlconfig(StringIO(template %
+            '''
+            <browser:view
+                name="test"
+                class="zope.browserpage.tests.test_page.NCV"
+                for="zope.component.testfiles.views.IC"
+                permission="zope.Public"
+                />
+            '''
+            ))
+
+        view = component.getMultiAdapter((ob, request), name='test')
+        view = removeSecurityProxy(view)
+        self.assertEqual(getattr(view, 'browserDefault', None), None)
+
+    def testNamedViewPageViewsNoDefault(self):
+        self.assertEqual(
+            component.queryMultiAdapter((ob, request), name='test'),
+            None)
+        test3 = os.path.join(tests_path, 'testfiles', 'test3.pt')
+
+        xmlconfig(StringIO(template %
+            '''
+            <browser:view
+                name="test"
+                class="zope.component.testfiles.views.V1"
+                for="zope.component.testfiles.views.IC"
+                permission="zope.Public"
+                >
+
+              <browser:page name="index.html" attribute="index" />
+              <browser:page name="action.html" attribute="action" />
+              <browser:page name="test.html" template="%s" />
+            </browser:view>
+            ''' % test3
+            ))
+
+        view = component.getMultiAdapter((ob, request), name='test')
+        view = removeSecurityProxy(view)
+        self.assertEqual(view.browserDefault(request)[1], (u'index.html', ))
+
+
+        v = view.publishTraverse(request, 'index.html')
+        v = removeSecurityProxy(v)
+        self.assertEqual(v(), 'V1 here')
+        v = view.publishTraverse(request, 'action.html')
+        v = removeSecurityProxy(v)
+        self.assertEqual(v(), 'done')
+        v = view.publishTraverse(request, 'test.html')
+        v = removeSecurityProxy(v)
+        self.assertEqual(str(v()), '<html><body><p>done</p></body></html>\n')
+
+    def testNamedViewPageViewsWithDefault(self):
+        self.assertEqual(
+            component.queryMultiAdapter((ob, request), name='test'),
+            None)
+        test3 = os.path.join(tests_path, 'testfiles', 'test3.pt')
+
+        xmlconfig(StringIO(template %
+            '''
+            <browser:view
+                name="test"
+                class="zope.component.testfiles.views.V1"
+                for="zope.component.testfiles.views.IC"
+                permission="zope.Public"
+                >
+
+              <browser:defaultPage name="test.html" />
+              <browser:page name="index.html" attribute="index" />
+              <browser:page name="action.html" attribute="action" />
+              <browser:page name="test.html" template="%s" />
+            </browser:view>
+            ''' % test3
+            ))
+
+        view = component.getMultiAdapter((ob, request), name='test')
+        view = removeSecurityProxy(view)
+        self.assertEqual(view.browserDefault(request)[1], (u'test.html', ))
+
+
+        v = view.publishTraverse(request, 'index.html')
+        v = removeSecurityProxy(v)
+        self.assertEqual(v(), 'V1 here')
+        v = view.publishTraverse(request, 'action.html')
+        v = removeSecurityProxy(v)
+        self.assertEqual(v(), 'done')
+        v = view.publishTraverse(request, 'test.html')
+        v = removeSecurityProxy(v)
+        self.assertEqual(str(v()), '<html><body><p>done</p></body></html>\n')
+
+    def testTraversalOfPageForView(self):
+        """Tests proper traversal of a page defined for a view."""
+
+        xmlconfig(StringIO(template %
+            '''
+            <browser:view
+                name="test"
+                class="zope.component.testfiles.views.V1"
+                for="zope.component.testfiles.views.IC"
+                permission="zope.Public" />
+
+            <browser:page name="index.html"
+                for="zope.component.testfiles.views.IV"
+                class="zope.browserpage.tests.test_page.CV"
+                permission="zope.Public" />
+            '''
+            ))
+
+        view = component.getMultiAdapter((ob, request), name='test')
+        view = removeSecurityProxy(view)
+        view.publishTraverse(request, 'index.html')
+
+    def testTraversalOfPageForViewWithPublishTraverse(self):
+        """Tests proper traversal of a page defined for a view.
+
+        This test is different from testTraversalOfPageForView in that it
+        tests the behavior on a view that has a publishTraverse method --
+        the implementation of the lookup is slightly different in such a
+        case.
+        """
+        xmlconfig(StringIO(template %
+            '''
+            <browser:view
+                name="test"
+                class="zope.browserpage.tests.test_page.VT"
+                for="zope.component.testfiles.views.IC"
+                permission="zope.Public" />
+
+            <browser:page name="index.html"
+                for="zope.component.testfiles.views.IV"
+                class="zope.browserpage.tests.test_page.CV"
+                permission="zope.Public" />
+            '''
+            ))
+
+        view = component.getMultiAdapter((ob, request), name='test')
+        view = removeSecurityProxy(view)
+        view.publishTraverse(request, 'index.html')
+
+    def testProtectedPageViews(self):
+        component.provideUtility(Permission('p', 'P'), IPermission, 'p')
+
+        request = TestRequest()
+        self.assertEqual(
+            component.queryMultiAdapter((ob, request), name='test'),
+            None)
+
+        xmlconfig(StringIO(template %
+            '''
+            <include package="zope.security" file="meta.zcml" />
+
+            <permission id="zope.TestPermission" title="Test permission" />
+
+            <browser:pages
+                class="zope.component.testfiles.views.V1"
+                for="zope.component.testfiles.views.IC"
+                permission="zope.TestPermission"
+                >
+
+              <browser:page name="index.html" attribute="index" />
+              <browser:page name="action.html" attribute="action" />
+            </browser:pages>
+            '''
+            ))
+
+        v = component.getMultiAdapter((ob, request), name='index.html')
+        v = ProxyFactory(v)
+        zope.security.management.getInteraction().add(request)
+        self.assertRaises(Exception, v)
+        v = component.getMultiAdapter((ob, request), name='action.html')
+        v = ProxyFactory(v)
+        self.assertRaises(Exception, v)
+
+    def testProtectedNamedViewPageViews(self):
+        self.assertEqual(
+            component.queryMultiAdapter((ob, request), name='test'),
+            None)
+
+        xmlconfig(StringIO(template %
+            '''
+            <include package="zope.security" file="meta.zcml" />
+
+            <permission id="zope.TestPermission" title="Test permission" />
+
+            <browser:view
+                name="test"
+                class="zope.component.testfiles.views.V1"
+                for="zope.component.testfiles.views.IC"
+                permission="zope.Public"
+                >
+
+              <browser:page name="index.html" attribute="index" />
+              <browser:page name="action.html" attribute="action" />
+            </browser:view>
+            '''
+            ))
+
+        view = component.getMultiAdapter((ob, request), name='test')
+        self.assertEqual(view.browserDefault(request)[1], (u'index.html', ))
+
+        v = view.publishTraverse(request, 'index.html')
+        self.assertEqual(v(), 'V1 here')
+
+    def testSkinnedPageView(self):
+        self.assertEqual(
+            component.queryMultiAdapter((ob, request), name='test'),
+            None)
+
+        xmlconfig(StringIO(template %
+            '''
+            <browser:pages
+                for="*"
+                class="zope.component.testfiles.views.V1"
+                permission="zope.Public"
+                >
+              <browser:page name="index.html" attribute="index" />
+            </browser:pages>
+
+            <browser:pages
+                for="*"
+                class="zope.component.testfiles.views.V1"
+                layer="
+                  zope.browserpage.tests.test_page.ITestLayer"
+                permission="zope.Public"
+                >
+              <browser:page name="index.html" attribute="action" />
+            </browser:pages>
+            '''
+            ))
+
+        v = component.getMultiAdapter((ob, request), name='index.html')
+        self.assertEqual(v(), 'V1 here')
+        v = component.getMultiAdapter((ob, TestRequest(skin=ITestSkin)),
+                                 name='index.html')
+        self.assertEqual(v(), 'done')
+
+
+    def test_template_page(self):
+        path = os.path.join(tests_path, 'testfiles', 'test.pt')
+
+        self.assertEqual(
+            component.queryMultiAdapter((ob, request), name='index.html'),
+            None)
+
+        xmlconfig(StringIO(template %
+            '''
+            <browser:page
+                name="index.html"
+                template="%s"
+                permission="zope.Public"
+                for="zope.component.testfiles.views.IC" />
+            ''' % path
+            ))
+
+        v = component.getMultiAdapter((ob, request), name='index.html')
+        self.assertEqual(v().strip(), '<html><body><p>test</p></body></html>')
+
+    def test_page_menu_within_different_layers(self):
+        path = os.path.join(tests_path, 'testfiles', 'test.pt')
+        self.assertEqual(
+            component.queryMultiAdapter((ob, request), name='index.html'),
+            None)
+
+        xmlconfig(StringIO(template %
+            '''
+            <browser:menu
+                id="test_menu"
+                title="Test menu"
+                interface="zope.browserpage.tests.test_page.ITestMenu"/>
+
+            <browser:page
+                name="index.html"
+                permission="zope.Public"
+                for="zope.component.testfiles.views.IC"
+                template="%s"
+                menu="test_menu" title="Index"/>
+
+            <browser:page
+                name="index.html"
+                permission="zope.Public"
+                for="zope.component.testfiles.views.IC"
+                menu="test_menu" title="Index"
+                template="%s"
+                layer="zope.browserpage.tests.test_page.ITestLayer"/>
+            ''' % (path, path)
+            ))
+
+        v = component.getMultiAdapter((ob, request), name='index.html')
+        self.assertEqual(v().strip(), '<html><body><p>test</p></body></html>')
+
+    def testtemplateWClass(self):
+        path = os.path.join(tests_path, 'testfiles', 'test2.pt')
+
+        self.assertEqual(
+            component.queryMultiAdapter((ob, request), name='index.html'),
+            None)
+
+        xmlconfig(StringIO(template %
+            '''
+            <browser:page
+                name="index.html"
+                template="%s"
+                permission="zope.Public"
+          class="zope.browserpage.tests.test_page.templateclass"
+                for="zope.component.testfiles.views.IC" />
+            ''' % path
+            ))
+
+        v = component.getMultiAdapter((ob, request), name='index.html')
+        self.assertEqual(v().strip(), '<html><body><p>42</p></body></html>')
+
+    def testProtectedtemplate(self):
+
+        path = os.path.join(tests_path, 'testfiles', 'test.pt')
+
+        request = TestRequest()
+        self.assertEqual(
+            component.queryMultiAdapter((ob, request), name='test'),
+            None)
+
+        xmlconfig(StringIO(template %
+            '''
+            <include package="zope.security" file="meta.zcml" />
+
+            <permission id="zope.TestPermission" title="Test permission" />
+
+            <browser:page
+                name="xxx.html"
+                template="%s"
+                permission="zope.TestPermission"
+                for="zope.component.testfiles.views.IC" />
+            ''' % path
+            ))
+
+        xmlconfig(StringIO(template %
+            '''
+            <browser:page
+                name="index.html"
+                template="%s"
+                permission="zope.Public"
+                for="zope.component.testfiles.views.IC" />
+            ''' % path
+            ))
+
+        v = component.getMultiAdapter((ob, request), name='xxx.html')
+        v = ProxyFactory(v)
+        zope.security.management.getInteraction().add(request)
+        self.assertRaises(Exception, v)
+
+        v = component.getMultiAdapter((ob, request), name='index.html')
+        v = ProxyFactory(v)
+        self.assertEqual(v().strip(), '<html><body><p>test</p></body></html>')
+
+
+    def testtemplateNoName(self):
+        path = os.path.join(tests_path, 'testfiles', 'test.pt')
+        self.assertRaises(
+            ConfigurationError,
+            xmlconfig,
+            StringIO(template %
+            '''
+            <browser:page
+                template="%s"
+                for="zope.component.testfiles.views.IC"
+                />
+            ''' % path
+            ))
+
+    def testtemplateAndPage(self):
+        path = os.path.join(tests_path, 'testfiles', 'test.pt')
+        self.assertRaises(
+            ConfigurationError,
+            xmlconfig,
+            StringIO(template %
+            '''
+            <browser:view
+                name="index.html"
+                template="%s"
+                for="zope.component.testfiles.views.IC"
+                permission="zope.Public"
+                >
+              <browser:page name="foo.html" attribute="index" />
+            </browser:view>
+            ''' % path
+            ))
+
+    def testViewThatProvidesAnInterface(self):
+        request = TestRequest()
+        self.assertEqual(
+            component.queryMultiAdapter((ob, request), IV, name='test'), None)
+
+        xmlconfig(StringIO(template %
+            '''
+            <browser:view
+                name="test"
+                class="zope.component.testfiles.views.V1"
+                for="zope.component.testfiles.views.IC"
+                permission="zope.Public"
+                />
+            '''
+            ))
+
+        v = component.queryMultiAdapter((ob, request), IV, name='test')
+        self.assertEqual(v, None)
+
+        xmlconfig(StringIO(template %
+            '''
+            <browser:view
+                name="test"
+                class="zope.component.testfiles.views.V1"
+                for="zope.component.testfiles.views.IC"
+                provides="zope.component.testfiles.views.IV"
+                permission="zope.Public"
+                />
+            '''
+            ))
+
+        v = component.queryMultiAdapter((ob, request), IV, name='test')
+        self.assert_(isinstance(v, V1))
+
+    def testUnnamedViewThatProvidesAnInterface(self):
+        request = TestRequest()
+        self.assertEqual(component.queryMultiAdapter((ob, request), IV),
+                         None)
+
+        xmlconfig(StringIO(template %
+            '''
+            <browser:view
+                class="zope.component.testfiles.views.V1"
+                for="zope.component.testfiles.views.IC"
+                permission="zope.Public"
+                />
+            '''
+            ))
+
+        v = component.queryMultiAdapter((ob, request), IV)
+        self.assertEqual(v, None)
+
+        xmlconfig(StringIO(template %
+            '''
+            <browser:view
+                class="zope.component.testfiles.views.V1"
+                for="zope.component.testfiles.views.IC"
+                provides="zope.component.testfiles.views.IV"
+                permission="zope.Public"
+                />
+            '''
+            ))
+
+        v = component.queryMultiAdapter((ob, request), IV)
+
+        self.assert_(isinstance(v, V1))
+
+
+def test_suite():
+    return unittest.makeSuite(Test)

Copied: zope.browserpage/trunk/src/zope/browserpage/tests/test_simpleviewclass.py (from rev 106889, zope.app.pagetemplate/trunk/src/zope/app/pagetemplate/tests/test_simpleviewclass.py)
===================================================================
--- zope.browserpage/trunk/src/zope/browserpage/tests/test_simpleviewclass.py	                        (rev 0)
+++ zope.browserpage/trunk/src/zope/browserpage/tests/test_simpleviewclass.py	2009-12-22 18:39:51 UTC (rev 106891)
@@ -0,0 +1,173 @@
+##############################################################################
+#
+# Copyright (c) 2001-2009 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Simple View Class Tests
+
+$Id$
+"""
+import unittest
+
+class Test_SimpleTestView(unittest.TestCase):
+
+    def _getTargetClass(self):
+        from zope.browserpage.tests.simpletestview import SimpleTestView
+        return SimpleTestView
+
+    def _makeOne(self, context, request):
+        return self._getTargetClass()(context, request)
+
+    def test_simple(self):
+        from zope.publisher.browser import TestRequest
+        context = DummyContext()
+        request = TestRequest()
+        view = self._makeOne(context, request)
+        macro = view['test']
+        out = view()
+        self.assertEqual(out,
+                         '<html>\n'
+                         '  <body>\n'
+                         '    <p>hello world</p>\n'
+                         '  </body>\n</html>\n')
+
+class Test_SimpleViewClass(unittest.TestCase):
+
+    def _getTargetClass(self):
+        from zope.browserpage.simpleviewclass import SimpleViewClass
+        return SimpleViewClass
+
+    def _makeKlass(self, *args, **kw):
+        return self._getTargetClass()(*args, **kw)
+
+    def test___name__(self):
+        klass = self._makeKlass('testsimpleviewclass.pt', name='test.html')
+        view = klass(None, None)
+        self.assertEqual(view.__name__, 'test.html')
+
+    def test___getitem___(self):
+        klass = self._makeKlass('testsimpleviewclass.pt', name='test.html')
+        view = klass(None, None)
+        self.assert_(view['test'] is not None)
+        self.assertRaises(KeyError, view.__getitem__, 'foo')
+
+    def test_w_base_classes(self):
+        from zope.publisher.browser import TestRequest
+        class BaseClass(object):
+            pass
+
+        klass = self._makeKlass('testsimpleviewclass.pt', bases=(BaseClass, ))
+
+        self.failUnless(issubclass(klass, BaseClass))
+
+        ob = DummyContext()
+        request = TestRequest()
+        view = klass(ob, request)
+        macro = view['test']
+        out = view()
+        self.assertEqual(out,
+                         '<html>\n'
+                         '  <body>\n'
+                         '    <p>hello world</p>\n'
+                         '  </body>\n</html>\n')
+
+class Test_simple(unittest.TestCase):
+
+    def _getTargetClass(self):
+        from zope.browserpage.simpleviewclass import simple
+        return simple
+
+    def _makeOne(self, context=None, request=None):
+        if context is None:
+            context = DummyContext()
+        if request is None:
+            request = DummyRequest()
+        return self._getTargetClass()(context, request)
+
+    def test_class_conforms_to_IBrowserPublisher(self):
+        from zope.interface.verify import verifyClass
+        from zope.publisher.interfaces.browser import IBrowserPublisher
+        verifyClass(IBrowserPublisher, self._getTargetClass())
+
+    def test_browserDefault(self):
+        request = DummyRequest()
+        view = self._makeOne(request=request)
+        self.assertEqual(view.browserDefault(request), (view, ()))
+
+    def test_publishTraverse_not_index_raises_NotFound(self):
+        from zope.publisher.interfaces import NotFound
+        request = DummyRequest()
+        view = self._makeOne(request=request)
+        self.assertRaises(NotFound, view.publishTraverse, request, 'nonesuch')
+
+    def test_publishTraverse_w_index_returns_index(self):
+        request = DummyRequest()
+        view = self._makeOne(request=request)
+        index = view.index = DummyTemplate()
+        self.failUnless(view.publishTraverse(request, 'index.html') is index)
+
+    def test___getitem___uses_index_macros(self):
+        view = self._makeOne()
+        view.index = index = DummyTemplate()
+        index.macros = {}
+        index.macros['aaa'] = aaa = object()
+        self.failUnless(view['aaa'] is aaa)
+
+    def test___call___no_args_no_kw(self):
+        view = self._makeOne()
+        view.index = index = DummyTemplate()
+        result = view()
+        self.failUnless(result is index)
+        self.assertEqual(index._called_with, ((), {}))
+
+    def test___call___w_args_no_kw(self):
+        view = self._makeOne()
+        view.index = index = DummyTemplate()
+        result = view('abc')
+        self.failUnless(result is index)
+        self.assertEqual(index._called_with, (('abc',), {}))
+
+    def test___call___no_args_w_kw(self):
+        view = self._makeOne()
+        view.index = index = DummyTemplate()
+        result = view(foo='bar')
+        self.failUnless(result is index)
+        self.assertEqual(index._called_with, ((), {'foo': 'bar'}))
+
+    def test___call___no_args_no_kw(self):
+        view = self._makeOne()
+        view.index = index = DummyTemplate()
+        result = view('abc', foo='bar')
+        self.failUnless(result is index)
+        self.assertEqual(index._called_with, (('abc',), {'foo': 'bar'}))
+
+
+class DummyContext:
+    pass
+
+class DummyResponse:
+    pass
+
+class DummyRequest:
+    debug = False
+    response = DummyResponse()
+
+class DummyTemplate:
+    def __call__(self, *args, **kw):
+        self._called_with = (args, kw)
+        return self
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(Test_SimpleTestView),
+        unittest.makeSuite(Test_SimpleViewClass),
+        unittest.makeSuite(Test_simple),
+    ))

Copied: zope.browserpage/trunk/src/zope/browserpage/tests/test_viewzpt.py (from rev 106889, zope.app.pagetemplate/trunk/src/zope/app/pagetemplate/tests/test_viewzpt.py)
===================================================================
--- zope.browserpage/trunk/src/zope/browserpage/tests/test_viewzpt.py	                        (rev 0)
+++ zope.browserpage/trunk/src/zope/browserpage/tests/test_viewzpt.py	2009-12-22 18:39:51 UTC (rev 106891)
@@ -0,0 +1,144 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""View ZPT Tests
+
+$Id$
+"""
+import unittest
+
+from zope.component import getGlobalSiteManager
+from zope.component.testing import PlacelessSetup
+from zope.interface import Interface, implements
+
+from zope.browserpage.viewpagetemplatefile import ViewPageTemplateFile
+
+
+class I1(Interface):
+    pass
+
+class C1(object):
+    implements(I1)
+
+class InstanceWithContext(object):
+    def __init__(self, context):
+        self.context = context
+
+class InstanceWithoutContext(object):
+    pass
+
+
+class TestViewZPT(PlacelessSetup, unittest.TestCase):
+
+    def setUp(self):
+        super(TestViewZPT, self).setUp()
+        self.t = ViewPageTemplateFile('test.pt')
+        self.context = C1()
+
+    def testNamespaceContextAvailable(self):
+        context = self.context
+        request = None
+
+        namespace = self.t.pt_getContext(InstanceWithContext(context), request)
+        self.failUnless(namespace['context'] is context)
+        self.failUnless('views' in namespace)
+
+    def testNamespaceHereNotAvailable(self):
+        request = None
+        self.assertRaises(AttributeError, self.t.pt_getContext,
+                          InstanceWithoutContext(), request)
+
+    def testViewMapper(self):
+        the_view = "This is the view"
+        the_view_name = "some view name"
+        def ViewMaker(*args, **kw):
+            return the_view
+
+        from zope.publisher.interfaces import IRequest
+
+        gsm = getGlobalSiteManager()
+        gsm.registerAdapter(
+            ViewMaker, (I1, IRequest), Interface, the_view_name, event=False)
+
+        class MyRequest(object):
+            implements(IRequest)
+
+        request = MyRequest()
+
+        namespace = self.t.pt_getContext(InstanceWithContext(self.context),
+                                         request)
+        views = namespace['views']
+        self.failUnless(the_view is views[the_view_name])
+
+    def test_debug_flags(self):
+        from zope.publisher.browser import TestRequest
+        self.request = TestRequest()
+        self.request.debug.sourceAnnotations = False
+        self.assert_('test.pt' not in self.t(self))
+        self.request.debug.sourceAnnotations = True
+        self.assert_('test.pt' in self.t(self))
+
+        t = ViewPageTemplateFile('testsimpleviewclass.pt')
+        self.request.debug.showTAL = False
+        self.assert_('metal:' not in t(self))
+        self.request.debug.showTAL = True
+        self.assert_('metal:' in t(self))
+
+    def test_render_sets_content_type_unless_set(self):
+        from zope.publisher.browser import TestRequest
+        t = ViewPageTemplateFile('test.pt')
+
+        self.request = TestRequest()
+        response = self.request.response
+        self.assert_(not response.getHeader('Content-Type'))
+        t(self)
+        self.assertEquals(response.getHeader('Content-Type'), 'text/html')
+
+        self.request = TestRequest()
+        response = self.request.response
+        response.setHeader('Content-Type', 'application/x-test-junk')
+        t(self)
+        self.assertEquals(response.getHeader('Content-Type'),
+                          'application/x-test-junk')
+        
+
+class TestViewZPTContentType(unittest.TestCase):
+
+    def testInitWithoutType(self):
+        t = ViewPageTemplateFile('test.pt')
+        t._cook_check()
+        self.assertEquals(t.content_type, "text/html")
+
+        t = ViewPageTemplateFile('testxml.pt')
+        t._cook_check()
+        self.assertEquals(t.content_type, "text/xml")
+
+    def testInitWithType(self):
+        t = ViewPageTemplateFile('test.pt', content_type="text/plain")
+        t._cook_check()
+        self.assertEquals(t.content_type, "text/plain")
+
+        t = ViewPageTemplateFile('testxml.pt', content_type="text/plain")
+        t._cook_check()
+        self.assertEquals(t.content_type, "text/xml")
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(TestViewZPT))
+    suite.addTest(unittest.makeSuite(TestViewZPTContentType))
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.TextTestRunner().run(test_suite())

Copied: zope.browserpage/trunk/src/zope/browserpage/tests/testsimpleviewclass.pt (from rev 106889, zope.app.pagetemplate/trunk/src/zope/app/pagetemplate/tests/testsimpleviewclass.pt)
===================================================================
--- zope.browserpage/trunk/src/zope/browserpage/tests/testsimpleviewclass.pt	                        (rev 0)
+++ zope.browserpage/trunk/src/zope/browserpage/tests/testsimpleviewclass.pt	2009-12-22 18:39:51 UTC (rev 106891)
@@ -0,0 +1,5 @@
+<html>
+  <body>
+    <p metal:define-macro="test">hello world</p>
+  </body>
+</html>

Copied: zope.browserpage/trunk/src/zope/browserpage/tests/testxml.pt (from rev 106889, zope.app.pagetemplate/trunk/src/zope/app/pagetemplate/tests/testxml.pt)
===================================================================
--- zope.browserpage/trunk/src/zope/browserpage/tests/testxml.pt	                        (rev 0)
+++ zope.browserpage/trunk/src/zope/browserpage/tests/testxml.pt	2009-12-22 18:39:51 UTC (rev 106891)
@@ -0,0 +1,2 @@
+<?xml version="1.0" ?>
+<html><body></body></html>

Deleted: zope.browserpage/trunk/src/zope/browserpage/tests.py
===================================================================
--- zope.browserpage/trunk/src/zope/browserpage/tests.py	2009-12-22 18:25:39 UTC (rev 106890)
+++ zope.browserpage/trunk/src/zope/browserpage/tests.py	2009-12-22 18:39:51 UTC (rev 106891)
@@ -1,961 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Tests for browser:page directive and friends
-
-$Id$
-"""
-
-import sys
-import os
-import unittest
-from cStringIO import StringIO
-
-from zope import component
-from zope.interface import Interface, implements, directlyProvides, providedBy
-
-import zope.security.management
-from zope.configuration.xmlconfig import xmlconfig, XMLConfig
-from zope.configuration.exceptions import ConfigurationError
-from zope.publisher.browser import TestRequest
-from zope.publisher.interfaces import IDefaultViewName
-from zope.publisher.interfaces.browser import IBrowserPublisher
-from zope.publisher.interfaces.browser import IBrowserRequest
-from zope.publisher.interfaces.browser import IBrowserSkinType, IDefaultSkin
-from zope.security.proxy import removeSecurityProxy, ProxyFactory
-from zope.security.permission import Permission
-from zope.security.interfaces import IPermission
-from zope.testing.doctestunit import DocTestSuite
-from zope.testing import cleanup
-from zope.traversing.adapters import DefaultTraversable
-from zope.traversing.interfaces import ITraversable
-
-import zope.publisher.defaultview
-import zope.browserpage
-import zope.browsermenu
-from zope.browsermenu.menu import getFirstMenuItem
-from zope.browsermenu.interfaces import IMenuItemType
-from zope.component.testfiles.views import IC, V1, VZMI, R1, IV
-
-tests_path = os.path.dirname(__file__)
-
-template = """<configure
-   xmlns='http://namespaces.zope.org/zope'
-   xmlns:browser='http://namespaces.zope.org/browser'
-   i18n_domain='zope'>
-   %s
-   </configure>"""
-
-class templateclass(object):
-    def data(self): return 42
-
-request = TestRequest()
-
-class V2(V1, object):
-
-    def action(self):
-        return self.action2()
-
-    def action2(self):
-        return "done"
-
-class VT(V1, object):
-    def publishTraverse(self, request, name):
-        try:
-            return int(name)
-        except:
-            return super(VT, self).publishTraverse(request, name)
-
-class Ob(object):
-    implements(IC)
-
-ob = Ob()
-
-class NCV(object):
-    "non callable view"
-
-    def __init__(self, context, request):
-        pass
-
-class CV(NCV):
-    "callable view"
-    def __call__(self):
-        pass
-
-
-class C_w_implements(NCV):
-    implements(Interface)
-
-    def index(self):
-        return self
-
-class ITestLayer(IBrowserRequest):
-    """Test Layer."""
-
-class ITestSkin(ITestLayer):
-    """Test Skin."""
-
-
-class ITestMenu(Interface):
-    """Test menu."""
-
-directlyProvides(ITestMenu, IMenuItemType)
-
-class Test(cleanup.CleanUp, unittest.TestCase):
-
-    def setUp(self):
-        super(Test, self).setUp()
-        XMLConfig('meta.zcml', zope.browserpage)()
-        XMLConfig('meta.zcml', zope.browsermenu)()
-        component.provideAdapter(DefaultTraversable, (None,), ITraversable, )
-        zope.security.management.newInteraction()
-
-    def testPage(self):
-        self.assertEqual(
-            component.queryMultiAdapter((ob, request), name='test'),
-            None)
-
-        xmlconfig(StringIO(template % (
-            '''
-            <browser:page
-                name="test"
-                class="zope.component.testfiles.views.V1"
-                for="zope.component.testfiles.views.IC"
-                permission="zope.Public"
-                attribute="index"
-                />
-            '''
-            )))
-
-        v = component.queryMultiAdapter((ob, request), name='test')
-        self.assert_(issubclass(v.__class__, V1))
-
-
-    def testPageWithClassWithMenu(self):
-        self.assertEqual(
-            component.queryMultiAdapter((ob, request), name='test'),
-            None)
-        testtemplate = os.path.join(tests_path, 'testfiles', 'test.pt')
-
-
-        xmlconfig(StringIO(template % (
-            '''
-            <browser:menu
-                id="test_menu" title="Test menu" />
-            <browser:page
-                name="test"
-                class="zope.component.testfiles.views.V1"
-                for="zope.component.testfiles.views.IC"
-                permission="zope.Public"
-                template="%s"
-                menu="test_menu"
-                title="Test View"
-                />
-            ''' % testtemplate
-            )))
-        menuItem = getFirstMenuItem('test_menu', ob, TestRequest())
-        self.assertEqual(menuItem["title"], "Test View")
-        self.assertEqual(menuItem["action"], "@@test")
-        v = component.queryMultiAdapter((ob, request), name='test')
-        self.assertEqual(v(), "<html><body><p>test</p></body></html>\n")
-
-
-    def testPageWithTemplateWithMenu(self):
-        self.assertEqual(
-            component.queryMultiAdapter((ob, request), name='test'),
-            None)
-        testtemplate = os.path.join(tests_path, 'testfiles', 'test.pt')
-
-        xmlconfig(StringIO(template % (
-            '''
-            <browser:menu
-                id="test_menu" title="Test menu"/>
-            <browser:page
-                name="test"
-                for="zope.component.testfiles.views.IC"
-                permission="zope.Public"
-                template="%s"
-                menu="test_menu"
-                title="Test View"
-                />
-            ''' % testtemplate
-            )))
-
-        menuItem = getFirstMenuItem('test_menu', ob, TestRequest())
-        self.assertEqual(menuItem["title"], "Test View")
-        self.assertEqual(menuItem["action"], "@@test")
-        v = component.queryMultiAdapter((ob, request), name='test')
-        self.assertEqual(v(), "<html><body><p>test</p></body></html>\n")
-
-
-    def testPageInPagesWithTemplateWithMenu(self):
-        self.assertEqual(
-            component.queryMultiAdapter((ob, request), name='test'),
-            None)
-        testtemplate = os.path.join(tests_path, 'testfiles', 'test.pt')
-
-        xmlconfig(StringIO(template % (
-            '''
-            <browser:menu
-                id="test_menu" title="Test menu" />
-            <browser:pages
-                for="zope.component.testfiles.views.IC"
-                permission="zope.Public">
-              <browser:page
-                  name="test"
-                  template="%s"
-                  menu="test_menu"
-                  title="Test View"
-                  />
-            </browser:pages>
-            ''' % testtemplate
-            )))
-
-        menuItem = getFirstMenuItem('test_menu', ob, TestRequest())
-        self.assertEqual(menuItem["title"], "Test View")
-        self.assertEqual(menuItem["action"], "@@test")
-        v = component.queryMultiAdapter((ob, request), name='test')
-        self.assertEqual(v(), "<html><body><p>test</p></body></html>\n")
-
-
-    def testPageInPagesWithClassWithMenu(self):
-        self.assertEqual(
-            component.queryMultiAdapter((ob, request), name='test'),
-            None)
-        testtemplate = os.path.join(tests_path, 'testfiles', 'test.pt')
-
-        xmlconfig(StringIO(template % (
-            '''
-            <browser:menu
-                id="test_menu" title="Test menu" />
-            <browser:pages
-                for="zope.component.testfiles.views.IC"
-                class="zope.component.testfiles.views.V1"
-                permission="zope.Public">
-              <browser:page
-                  name="test"
-                  template="%s"
-                  menu="test_menu"
-                  title="Test View"
-                  />
-            </browser:pages>
-            ''' % testtemplate
-            )))
-
-        menuItem = getFirstMenuItem('test_menu', ob, TestRequest())
-        self.assertEqual(menuItem["title"], "Test View")
-        self.assertEqual(menuItem["action"], "@@test")
-        v = component.queryMultiAdapter((ob, request), name='test')
-        self.assertEqual(v(), "<html><body><p>test</p></body></html>\n")
-
-    def testSkinPage(self):
-        self.assertEqual(
-            component.queryMultiAdapter((ob, request), name='test'),
-            None)
-
-        xmlconfig(StringIO(template % (
-            '''
-            <browser:page name="test"
-                class="zope.component.testfiles.views.VZMI"
-                layer="
-                  zope.browserpage.tests.ITestLayer"
-                for="zope.component.testfiles.views.IC"
-                permission="zope.Public"
-                attribute="index"
-                />
-            <browser:page name="test"
-                class="zope.component.testfiles.views.V1"
-                for="zope.component.testfiles.views.IC"
-                permission="zope.Public"
-                attribute="index"
-                />
-            '''
-            )))
-
-        v = component.queryMultiAdapter((ob, request), name='test')
-        self.assert_(issubclass(v.__class__, V1))
-        v = component.queryMultiAdapter(
-            (ob, TestRequest(skin=ITestSkin)), name='test')
-        self.assert_(issubclass(v.__class__, VZMI))
-
-
-    def testInterfaceProtectedPage(self):
-        xmlconfig(StringIO(template %
-            '''
-            <browser:page name="test"
-                class="zope.component.testfiles.views.V1"
-                attribute="index"
-                for="zope.component.testfiles.views.IC"
-                permission="zope.Public"
-                allowed_interface="zope.component.testfiles.views.IV"
-                />
-            '''
-            ))
-
-        v = component.getMultiAdapter((ob, request), name='test')
-        v = ProxyFactory(v)
-        self.assertEqual(v.index(), 'V1 here')
-        self.assertRaises(Exception, getattr, v, 'action')
-
-    def testAttributeProtectedPage(self):
-        xmlconfig(StringIO(template %
-            '''
-            <browser:page name="test"
-                class="zope.browserpage.tests.V2"
-                for="zope.component.testfiles.views.IC"
-                attribute="action"
-                permission="zope.Public"
-                allowed_attributes="action2"
-                />
-            '''
-            ))
-
-        v = component.getMultiAdapter((ob, request), name='test')
-        v = ProxyFactory(v)
-        self.assertEqual(v.action(), 'done')
-        self.assertEqual(v.action2(), 'done')
-        self.assertRaises(Exception, getattr, v, 'index')
-
-    def testAttributeProtectedView(self):
-        xmlconfig(StringIO(template %
-            '''
-            <browser:view name="test"
-                class="zope.browserpage.tests.V2"
-                for="zope.component.testfiles.views.IC"
-                permission="zope.Public"
-                allowed_attributes="action2"
-                >
-              <browser:page name="index.html" attribute="action" />
-           </browser:view>
-            '''
-            ))
-
-        v = component.getMultiAdapter((ob, request), name='test')
-        v = ProxyFactory(v)
-        page = v.publishTraverse(request, 'index.html')
-        self.assertEqual(page(), 'done')
-        self.assertEqual(v.action2(), 'done')
-        self.assertRaises(Exception, getattr, page, 'index')
-
-    def testInterfaceAndAttributeProtectedPage(self):
-        xmlconfig(StringIO(template %
-            '''
-            <browser:page name="test"
-                class="zope.component.testfiles.views.V1"
-                for="zope.component.testfiles.views.IC"
-                permission="zope.Public"
-                attribute="index"
-                allowed_attributes="action"
-                allowed_interface="zope.component.testfiles.views.IV"
-                />
-            '''
-            ))
-
-        v = component.getMultiAdapter((ob, request), name='test')
-        self.assertEqual(v.index(), 'V1 here')
-        self.assertEqual(v.action(), 'done')
-
-    def testDuplicatedInterfaceAndAttributeProtectedPage(self):
-        xmlconfig(StringIO(template %
-            '''
-            <browser:page name="test"
-                class="zope.component.testfiles.views.V1"
-                for="zope.component.testfiles.views.IC"
-                attribute="index"
-                permission="zope.Public"
-                allowed_attributes="action index"
-                allowed_interface="zope.component.testfiles.views.IV"
-                />
-            '''
-            ))
-
-        v = component.getMultiAdapter((ob, request), name='test')
-        self.assertEqual(v.index(), 'V1 here')
-        self.assertEqual(v.action(), 'done')
-
-    def test_class_w_implements(self):
-        xmlconfig(StringIO(template %
-            '''
-            <browser:page
-                name="test"
-                class="
-             zope.browserpage.tests.C_w_implements"
-                for="zope.component.testfiles.views.IC"
-                attribute="index"
-                permission="zope.Public"
-                />
-            '''
-            ))
-
-        v = component.getMultiAdapter((ob, request), name='test')
-        self.assertEqual(v.index(), v)
-        self.assert_(IBrowserPublisher.providedBy(v))
-
-    def testIncompleteProtectedPageNoPermission(self):
-        self.assertRaises(
-            ConfigurationError,
-            xmlconfig,
-            StringIO(template %
-            '''
-            <browser:page name="test"
-                class="zope.component.testfiles.views.V1"
-                for="zope.component.testfiles.views.IC"
-                attribute="index"
-                allowed_attributes="action index"
-                />
-            '''
-            ))
-
-
-    def testPageViews(self):
-        self.assertEqual(
-            component.queryMultiAdapter((ob, request), name='test'),
-            None)
-        test3 = os.path.join(tests_path, 'testfiles', 'test3.pt')
-
-        xmlconfig(StringIO(template %
-            '''
-            <browser:pages
-                class="zope.component.testfiles.views.V1"
-                for="zope.component.testfiles.views.IC"
-                permission="zope.Public"
-                >
-
-              <browser:page name="index.html" attribute="index" />
-              <browser:page name="action.html" attribute="action" />
-              <browser:page name="test.html" template="%s" />
-            </browser:pages>
-            ''' % test3
-            ))
-
-        v = component.getMultiAdapter((ob, request), name='index.html')
-        self.assertEqual(v(), 'V1 here')
-        v = component.getMultiAdapter((ob, request), name='action.html')
-        self.assertEqual(v(), 'done')
-        v = component.getMultiAdapter((ob, request), name='test.html')
-        self.assertEqual(str(v()), '<html><body><p>done</p></body></html>\n')
-
-    def testNamedViewPageViewsCustomTraversr(self):
-        self.assertEqual(
-            component.queryMultiAdapter((ob, request), name='test'),
-            None)
-
-        xmlconfig(StringIO(template %
-            '''
-            <browser:view
-                name="test"
-                class="zope.browserpage.tests.V1"
-                for="zope.component.testfiles.views.IC"
-                permission="zope.Public"
-                >
-
-              <browser:page name="index.html" attribute="index" />
-              <browser:page name="action.html" attribute="action" />
-            </browser:view>
-            '''
-            ))
-
-        view = component.getMultiAdapter((ob, request), name='test')
-        view = removeSecurityProxy(view)
-        self.assertEqual(view.browserDefault(request)[1], (u'index.html', ))
-
-
-        v = view.publishTraverse(request, 'index.html')
-        v = removeSecurityProxy(v)
-        self.assertEqual(v(), 'V1 here')
-        v = view.publishTraverse(request, 'action.html')
-        v = removeSecurityProxy(v)
-        self.assertEqual(v(), 'done')
-
-
-    def testNamedViewNoPagesForCallable(self):
-        self.assertEqual(
-            component.queryMultiAdapter((ob, request), name='test'),
-            None)
-
-        xmlconfig(StringIO(template %
-            '''
-            <browser:view
-                name="test"
-                class="zope.browserpage.tests.CV"
-                for="zope.component.testfiles.views.IC"
-                permission="zope.Public"
-                />
-            '''
-            ))
-
-        view = component.getMultiAdapter((ob, request), name='test')
-        view = removeSecurityProxy(view)
-        self.assertEqual(view.browserDefault(request), (view, ()))
-
-    def testNamedViewNoPagesForNonCallable(self):
-        self.assertEqual(
-            component.queryMultiAdapter((ob, request), name='test'),
-            None)
-
-        xmlconfig(StringIO(template %
-            '''
-            <browser:view
-                name="test"
-                class="zope.browserpage.tests.NCV"
-                for="zope.component.testfiles.views.IC"
-                permission="zope.Public"
-                />
-            '''
-            ))
-
-        view = component.getMultiAdapter((ob, request), name='test')
-        view = removeSecurityProxy(view)
-        self.assertEqual(getattr(view, 'browserDefault', None), None)
-
-    def testNamedViewPageViewsNoDefault(self):
-        self.assertEqual(
-            component.queryMultiAdapter((ob, request), name='test'),
-            None)
-        test3 = os.path.join(tests_path, 'testfiles', 'test3.pt')
-
-        xmlconfig(StringIO(template %
-            '''
-            <browser:view
-                name="test"
-                class="zope.component.testfiles.views.V1"
-                for="zope.component.testfiles.views.IC"
-                permission="zope.Public"
-                >
-
-              <browser:page name="index.html" attribute="index" />
-              <browser:page name="action.html" attribute="action" />
-              <browser:page name="test.html" template="%s" />
-            </browser:view>
-            ''' % test3
-            ))
-
-        view = component.getMultiAdapter((ob, request), name='test')
-        view = removeSecurityProxy(view)
-        self.assertEqual(view.browserDefault(request)[1], (u'index.html', ))
-
-
-        v = view.publishTraverse(request, 'index.html')
-        v = removeSecurityProxy(v)
-        self.assertEqual(v(), 'V1 here')
-        v = view.publishTraverse(request, 'action.html')
-        v = removeSecurityProxy(v)
-        self.assertEqual(v(), 'done')
-        v = view.publishTraverse(request, 'test.html')
-        v = removeSecurityProxy(v)
-        self.assertEqual(str(v()), '<html><body><p>done</p></body></html>\n')
-
-    def testNamedViewPageViewsWithDefault(self):
-        self.assertEqual(
-            component.queryMultiAdapter((ob, request), name='test'),
-            None)
-        test3 = os.path.join(tests_path, 'testfiles', 'test3.pt')
-
-        xmlconfig(StringIO(template %
-            '''
-            <browser:view
-                name="test"
-                class="zope.component.testfiles.views.V1"
-                for="zope.component.testfiles.views.IC"
-                permission="zope.Public"
-                >
-
-              <browser:defaultPage name="test.html" />
-              <browser:page name="index.html" attribute="index" />
-              <browser:page name="action.html" attribute="action" />
-              <browser:page name="test.html" template="%s" />
-            </browser:view>
-            ''' % test3
-            ))
-
-        view = component.getMultiAdapter((ob, request), name='test')
-        view = removeSecurityProxy(view)
-        self.assertEqual(view.browserDefault(request)[1], (u'test.html', ))
-
-
-        v = view.publishTraverse(request, 'index.html')
-        v = removeSecurityProxy(v)
-        self.assertEqual(v(), 'V1 here')
-        v = view.publishTraverse(request, 'action.html')
-        v = removeSecurityProxy(v)
-        self.assertEqual(v(), 'done')
-        v = view.publishTraverse(request, 'test.html')
-        v = removeSecurityProxy(v)
-        self.assertEqual(str(v()), '<html><body><p>done</p></body></html>\n')
-
-    def testTraversalOfPageForView(self):
-        """Tests proper traversal of a page defined for a view."""
-
-        xmlconfig(StringIO(template %
-            '''
-            <browser:view
-                name="test"
-                class="zope.component.testfiles.views.V1"
-                for="zope.component.testfiles.views.IC"
-                permission="zope.Public" />
-
-            <browser:page name="index.html"
-                for="zope.component.testfiles.views.IV"
-                class="zope.browserpage.tests.CV"
-                permission="zope.Public" />
-            '''
-            ))
-
-        view = component.getMultiAdapter((ob, request), name='test')
-        view = removeSecurityProxy(view)
-        view.publishTraverse(request, 'index.html')
-
-    def testTraversalOfPageForViewWithPublishTraverse(self):
-        """Tests proper traversal of a page defined for a view.
-
-        This test is different from testTraversalOfPageForView in that it
-        tests the behavior on a view that has a publishTraverse method --
-        the implementation of the lookup is slightly different in such a
-        case.
-        """
-        xmlconfig(StringIO(template %
-            '''
-            <browser:view
-                name="test"
-                class="zope.browserpage.tests.VT"
-                for="zope.component.testfiles.views.IC"
-                permission="zope.Public" />
-
-            <browser:page name="index.html"
-                for="zope.component.testfiles.views.IV"
-                class="zope.browserpage.tests.CV"
-                permission="zope.Public" />
-            '''
-            ))
-
-        view = component.getMultiAdapter((ob, request), name='test')
-        view = removeSecurityProxy(view)
-        view.publishTraverse(request, 'index.html')
-
-    def testProtectedPageViews(self):
-        component.provideUtility(Permission('p', 'P'), IPermission, 'p')
-
-        request = TestRequest()
-        self.assertEqual(
-            component.queryMultiAdapter((ob, request), name='test'),
-            None)
-
-        xmlconfig(StringIO(template %
-            '''
-            <include package="zope.security" file="meta.zcml" />
-
-            <permission id="zope.TestPermission" title="Test permission" />
-
-            <browser:pages
-                class="zope.component.testfiles.views.V1"
-                for="zope.component.testfiles.views.IC"
-                permission="zope.TestPermission"
-                >
-
-              <browser:page name="index.html" attribute="index" />
-              <browser:page name="action.html" attribute="action" />
-            </browser:pages>
-            '''
-            ))
-
-        v = component.getMultiAdapter((ob, request), name='index.html')
-        v = ProxyFactory(v)
-        zope.security.management.getInteraction().add(request)
-        self.assertRaises(Exception, v)
-        v = component.getMultiAdapter((ob, request), name='action.html')
-        v = ProxyFactory(v)
-        self.assertRaises(Exception, v)
-
-    def testProtectedNamedViewPageViews(self):
-        self.assertEqual(
-            component.queryMultiAdapter((ob, request), name='test'),
-            None)
-
-        xmlconfig(StringIO(template %
-            '''
-            <include package="zope.security" file="meta.zcml" />
-
-            <permission id="zope.TestPermission" title="Test permission" />
-
-            <browser:view
-                name="test"
-                class="zope.component.testfiles.views.V1"
-                for="zope.component.testfiles.views.IC"
-                permission="zope.Public"
-                >
-
-              <browser:page name="index.html" attribute="index" />
-              <browser:page name="action.html" attribute="action" />
-            </browser:view>
-            '''
-            ))
-
-        view = component.getMultiAdapter((ob, request), name='test')
-        self.assertEqual(view.browserDefault(request)[1], (u'index.html', ))
-
-        v = view.publishTraverse(request, 'index.html')
-        self.assertEqual(v(), 'V1 here')
-
-    def testSkinnedPageView(self):
-        self.assertEqual(
-            component.queryMultiAdapter((ob, request), name='test'),
-            None)
-
-        xmlconfig(StringIO(template %
-            '''
-            <browser:pages
-                for="*"
-                class="zope.component.testfiles.views.V1"
-                permission="zope.Public"
-                >
-              <browser:page name="index.html" attribute="index" />
-            </browser:pages>
-
-            <browser:pages
-                for="*"
-                class="zope.component.testfiles.views.V1"
-                layer="
-                  zope.browserpage.tests.ITestLayer"
-                permission="zope.Public"
-                >
-              <browser:page name="index.html" attribute="action" />
-            </browser:pages>
-            '''
-            ))
-
-        v = component.getMultiAdapter((ob, request), name='index.html')
-        self.assertEqual(v(), 'V1 here')
-        v = component.getMultiAdapter((ob, TestRequest(skin=ITestSkin)),
-                                 name='index.html')
-        self.assertEqual(v(), 'done')
-
-
-    def test_template_page(self):
-        path = os.path.join(tests_path, 'testfiles', 'test.pt')
-
-        self.assertEqual(
-            component.queryMultiAdapter((ob, request), name='index.html'),
-            None)
-
-        xmlconfig(StringIO(template %
-            '''
-            <browser:page
-                name="index.html"
-                template="%s"
-                permission="zope.Public"
-                for="zope.component.testfiles.views.IC" />
-            ''' % path
-            ))
-
-        v = component.getMultiAdapter((ob, request), name='index.html')
-        self.assertEqual(v().strip(), '<html><body><p>test</p></body></html>')
-
-    def test_page_menu_within_different_layers(self):
-        path = os.path.join(tests_path, 'testfiles', 'test.pt')
-        self.assertEqual(
-            component.queryMultiAdapter((ob, request), name='index.html'),
-            None)
-
-        xmlconfig(StringIO(template %
-            '''
-            <browser:menu
-                id="test_menu"
-                title="Test menu"
-                interface="zope.browserpage.tests.ITestMenu"/>
-
-            <browser:page
-                name="index.html"
-                permission="zope.Public"
-                for="zope.component.testfiles.views.IC"
-                template="%s"
-                menu="test_menu" title="Index"/>
-
-            <browser:page
-                name="index.html"
-                permission="zope.Public"
-                for="zope.component.testfiles.views.IC"
-                menu="test_menu" title="Index"
-                template="%s"
-                layer="zope.browserpage.tests.ITestLayer"/>
-            ''' % (path, path)
-            ))
-
-        v = component.getMultiAdapter((ob, request), name='index.html')
-        self.assertEqual(v().strip(), '<html><body><p>test</p></body></html>')
-
-    def testtemplateWClass(self):
-        path = os.path.join(tests_path, 'testfiles', 'test2.pt')
-
-        self.assertEqual(
-            component.queryMultiAdapter((ob, request), name='index.html'),
-            None)
-
-        xmlconfig(StringIO(template %
-            '''
-            <browser:page
-                name="index.html"
-                template="%s"
-                permission="zope.Public"
-          class="zope.browserpage.tests.templateclass"
-                for="zope.component.testfiles.views.IC" />
-            ''' % path
-            ))
-
-        v = component.getMultiAdapter((ob, request), name='index.html')
-        self.assertEqual(v().strip(), '<html><body><p>42</p></body></html>')
-
-    def testProtectedtemplate(self):
-
-        path = os.path.join(tests_path, 'testfiles', 'test.pt')
-
-        request = TestRequest()
-        self.assertEqual(
-            component.queryMultiAdapter((ob, request), name='test'),
-            None)
-
-        xmlconfig(StringIO(template %
-            '''
-            <include package="zope.security" file="meta.zcml" />
-
-            <permission id="zope.TestPermission" title="Test permission" />
-
-            <browser:page
-                name="xxx.html"
-                template="%s"
-                permission="zope.TestPermission"
-                for="zope.component.testfiles.views.IC" />
-            ''' % path
-            ))
-
-        xmlconfig(StringIO(template %
-            '''
-            <browser:page
-                name="index.html"
-                template="%s"
-                permission="zope.Public"
-                for="zope.component.testfiles.views.IC" />
-            ''' % path
-            ))
-
-        v = component.getMultiAdapter((ob, request), name='xxx.html')
-        v = ProxyFactory(v)
-        zope.security.management.getInteraction().add(request)
-        self.assertRaises(Exception, v)
-
-        v = component.getMultiAdapter((ob, request), name='index.html')
-        v = ProxyFactory(v)
-        self.assertEqual(v().strip(), '<html><body><p>test</p></body></html>')
-
-
-    def testtemplateNoName(self):
-        path = os.path.join(tests_path, 'testfiles', 'test.pt')
-        self.assertRaises(
-            ConfigurationError,
-            xmlconfig,
-            StringIO(template %
-            '''
-            <browser:page
-                template="%s"
-                for="zope.component.testfiles.views.IC"
-                />
-            ''' % path
-            ))
-
-    def testtemplateAndPage(self):
-        path = os.path.join(tests_path, 'testfiles', 'test.pt')
-        self.assertRaises(
-            ConfigurationError,
-            xmlconfig,
-            StringIO(template %
-            '''
-            <browser:view
-                name="index.html"
-                template="%s"
-                for="zope.component.testfiles.views.IC"
-                permission="zope.Public"
-                >
-              <browser:page name="foo.html" attribute="index" />
-            </browser:view>
-            ''' % path
-            ))
-
-    def testViewThatProvidesAnInterface(self):
-        request = TestRequest()
-        self.assertEqual(
-            component.queryMultiAdapter((ob, request), IV, name='test'), None)
-
-        xmlconfig(StringIO(template %
-            '''
-            <browser:view
-                name="test"
-                class="zope.component.testfiles.views.V1"
-                for="zope.component.testfiles.views.IC"
-                permission="zope.Public"
-                />
-            '''
-            ))
-
-        v = component.queryMultiAdapter((ob, request), IV, name='test')
-        self.assertEqual(v, None)
-
-        xmlconfig(StringIO(template %
-            '''
-            <browser:view
-                name="test"
-                class="zope.component.testfiles.views.V1"
-                for="zope.component.testfiles.views.IC"
-                provides="zope.component.testfiles.views.IV"
-                permission="zope.Public"
-                />
-            '''
-            ))
-
-        v = component.queryMultiAdapter((ob, request), IV, name='test')
-        self.assert_(isinstance(v, V1))
-
-    def testUnnamedViewThatProvidesAnInterface(self):
-        request = TestRequest()
-        self.assertEqual(component.queryMultiAdapter((ob, request), IV),
-                         None)
-
-        xmlconfig(StringIO(template %
-            '''
-            <browser:view
-                class="zope.component.testfiles.views.V1"
-                for="zope.component.testfiles.views.IC"
-                permission="zope.Public"
-                />
-            '''
-            ))
-
-        v = component.queryMultiAdapter((ob, request), IV)
-        self.assertEqual(v, None)
-
-        xmlconfig(StringIO(template %
-            '''
-            <browser:view
-                class="zope.component.testfiles.views.V1"
-                for="zope.component.testfiles.views.IC"
-                provides="zope.component.testfiles.views.IV"
-                permission="zope.Public"
-                />
-            '''
-            ))
-
-        v = component.queryMultiAdapter((ob, request), IV)
-
-        self.assert_(isinstance(v, V1))
-
-
-def test_suite():
-    return unittest.makeSuite(Test)

Copied: zope.browserpage/trunk/src/zope/browserpage/viewpagetemplatefile.py (from rev 106889, zope.app.pagetemplate/trunk/src/zope/app/pagetemplate/viewpagetemplatefile.py)
===================================================================
--- zope.browserpage/trunk/src/zope/browserpage/viewpagetemplatefile.py	                        (rev 0)
+++ zope.browserpage/trunk/src/zope/browserpage/viewpagetemplatefile.py	2009-12-22 18:39:51 UTC (rev 106891)
@@ -0,0 +1,93 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""File-based page templates that can be used as methods on views.
+
+$Id$
+"""
+__docformat__ = 'restructuredtext'
+
+from zope.component import getMultiAdapter
+from zope.pagetemplate.pagetemplatefile import PageTemplateFile
+from zope.pagetemplate.engine import TrustedAppPT
+
+class ViewPageTemplateFile(TrustedAppPT, PageTemplateFile):
+    """Page Templates used as methods of views defined as Python classes.
+    """
+
+    def __init__(self, filename, _prefix=None, content_type=None):
+        _prefix = self.get_path_from_prefix(_prefix)
+        super(ViewPageTemplateFile, self).__init__(filename, _prefix)
+        if content_type is not None:
+            self.content_type = content_type
+
+    def pt_getContext(self, instance, request, **_kw):
+        # instance is a View component
+        namespace = super(ViewPageTemplateFile, self).pt_getContext(**_kw)
+        namespace['request'] = request
+        namespace['view'] = instance
+        namespace['context'] = context = instance.context
+        namespace['views'] = ViewMapper(context, request)
+        return namespace
+
+    def __call__(self, instance, *args, **keywords):
+        namespace = self.pt_getContext(
+            request=instance.request,
+            instance=instance, args=args, options=keywords)
+        debug_flags = instance.request.debug
+        s = self.pt_render(
+            namespace,
+            showtal=getattr(debug_flags, 'showTAL', 0),
+            sourceAnnotations=getattr(debug_flags, 'sourceAnnotations', 0),
+            )
+        response = instance.request.response
+        if not response.getHeader("Content-Type"):
+            response.setHeader("Content-Type", self.content_type)
+        return s
+
+    def __get__(self, instance, type):
+        return BoundPageTemplate(self, instance)
+
+class ViewMapper(object):
+    def __init__(self, ob, request):
+        self.ob = ob
+        self.request = request
+
+    def __getitem__(self, name):
+        return getMultiAdapter((self.ob, self.request), name=name)
+
+
+class BoundPageTemplate(object):
+    def __init__(self, pt, ob):
+        object.__setattr__(self, 'im_func', pt)
+        object.__setattr__(self, 'im_self', ob)
+
+    macros = property(lambda self: self.im_func.macros)
+    filename = property(lambda self: self.im_func.filename)
+
+    def __call__(self, *args, **kw):
+        if self.im_self is None:
+            im_self, args = args[0], args[1:]
+        else:
+            im_self = self.im_self
+        return self.im_func(im_self, *args, **kw)
+
+    def __setattr__(self, name, v):
+        raise AttributeError("Can't set attribute", name)
+
+    def __repr__(self):
+        return "<BoundPageTemplateFile of %r>" % self.im_self
+
+
+def NoTraverser(ob, request):
+    return None



More information about the checkins mailing list