[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