[Checkins] SVN: plone.z3cform/trunk/ Fix traversal tests on Zope 2.10 to handle TraversalError instead of
Laurence Rowe
l at lrowe.co.uk
Tue May 3 16:26:45 EDT 2011
Log message for revision 121530:
Fix traversal tests on Zope 2.10 to handle TraversalError instead of
LocationError.
Changed:
U plone.z3cform/trunk/docs/HISTORY.txt
U plone.z3cform/trunk/plone/z3cform/tests.py
D plone.z3cform/trunk/plone/z3cform/zope210traversal.txt
-=-
Modified: plone.z3cform/trunk/docs/HISTORY.txt
===================================================================
--- plone.z3cform/trunk/docs/HISTORY.txt 2011-05-03 20:21:51 UTC (rev 121529)
+++ plone.z3cform/trunk/docs/HISTORY.txt 2011-05-03 20:26:45 UTC (rev 121530)
@@ -4,8 +4,8 @@
0.7.5 - unreleased
------------------
-* Split traversal tests for Zope2.10, not all traversal functionality is
- supported on Zope 2.10 and different errors are raised.
+* Fix traversal tests on Zope 2.10 to handle TraversalError instead of
+ LocationError.
[elro]
* Revert [120798] as it breaks on Zope2.10 / Plone 3.3. We can deal with Zope
Modified: plone.z3cform/trunk/plone/z3cform/tests.py
===================================================================
--- plone.z3cform/trunk/plone/z3cform/tests.py 2011-05-03 20:21:51 UTC (rev 121529)
+++ plone.z3cform/trunk/plone/z3cform/tests.py 2011-05-03 20:26:45 UTC (rev 121530)
@@ -71,13 +71,17 @@
fieldsets_txt = doctest.DocFileSuite('fieldsets/README.txt')
fieldsets_txt.layer = testing_zcml_layer
- if sys.version_info[:2] == (2, 4):
+ if sys.version_info[:2] > (2, 4):
# Zope 2.10 raises TraversalError instead of LocationError
- # and some more advanced functionality breaks.
- traversal_txt = doctest.DocFileSuite('zope210traversal.txt')
+ traversal_txt = doctest.DocFileSuite('traversal.txt')
traversal_txt.layer = testing_zcml_layer
else:
- traversal_txt = doctest.DocFileSuite('traversal.txt')
+ import tempfile
+ tmp = tempfile.NamedTemporaryFile()
+ test = open(os.path.join(os.path.dirname(__file__), 'traversal.txt')).read()
+ tmp.write(test.replace('LocationError', 'TraversalError'))
+ tmp.flush()
+ traversal_txt = doctest.DocFileSuite(tmp.name, module_relative=False)
traversal_txt.layer = testing_zcml_layer
return unittest.TestSuite([
Deleted: plone.z3cform/trunk/plone/z3cform/zope210traversal.txt
===================================================================
--- plone.z3cform/trunk/plone/z3cform/zope210traversal.txt 2011-05-03 20:21:51 UTC (rev 121529)
+++ plone.z3cform/trunk/plone/z3cform/zope210traversal.txt 2011-05-03 20:26:45 UTC (rev 121530)
@@ -1,169 +0,0 @@
-Traversal
-=========
-
-plone.z3cform allows you to traverse to a widget using the ++widget++
-namespace adapter on a form wrapper view or standalone form view.
-
-Note that widgets may need to mix in Acquisition.Explicit to be truly
-traversable in Zope 2.10. In Zope 2.12, that is not required. However, you
-may get an error if you mix in Explicit in Zope 2.12 and the parent view
-(normally the form or the form layout wrapper) does not, as is likely to be
-the case. To be compatible with both Zope 2.10 and 2.12, you'll need to
-mix in Acquisition.Explicit, but make sure the widget does *not* provide the
-IAcquirer interface. One way to do that is by using implementsOnly(), e.g.::
-
- class MyWidget(Aquisition.Explicit):
- implementsOnly(IMyWidget)
-
- ...
-
-If you are only targeting Zope 2.12 and later, you can avoid mixing in any
-kind of acquisition altogether.
-
-The ++widget++ namespace works both in the case of a layout wrapper view,
-and in the case of a form used directly (in Zope 2.12 or later).
-
-Traversal on a standalone form
-------------------------------
-
-First, we create a simple form and context.
-
- >>> from zope.interface import alsoProvides
- >>> from zope.publisher.browser import TestRequest
- >>> from zope.annotation.interfaces import IAttributeAnnotatable
- >>> from z3c.form.interfaces import IFormLayer
-
- >>> def make_request(form={}):
- ... request = TestRequest()
- ... request.form.update(form)
- ... alsoProvides(request, IFormLayer)
- ... alsoProvides(request, IAttributeAnnotatable)
- ... return request
-
- >>> from zope import interface, schema
- >>> from z3c.form import form, field, button
-
- >>> class MySchema(interface.Interface):
- ... age = schema.Int(title=u"Age")
-
- >>> from z3c.form.interfaces import IFieldsForm
- >>> from zope.interface import implements
- >>> class MyForm(form.Form):
- ... implements(IFieldsForm)
- ... fields = field.Fields(MySchema)
- ... ignoreContext = True # don't use context to get widget data
- ...
- ... def update(self):
- ... print "Updating test form"
- ... super(MyForm, self).update()
-
- >>> from zope.component import provideAdapter
- >>> from zope.publisher.interfaces.browser import IBrowserRequest
- >>> from zope.interface import Interface
-
- >>> provideAdapter(adapts=(Interface, IBrowserRequest),
- ... provides=Interface,
- ... factory=MyForm,
- ... name=u"test-form")
-
- >>> from Acquisition import Implicit
- >>> class Bar(Implicit):
- ... __allow_access_to_unprotected_subobjects__ = 1
- ... implements(Interface)
-
- >>> from zope.component import getMultiAdapter
- >>> context = Bar()
- >>> request = make_request()
-
-Now, let's emulate the publisher and look up the namespace traversal
-adapter. For example, let's say we'd traversed to
-../@@test-form/++widget++age. The publisher would then do:
-
- >>> form = getMultiAdapter((context, request), name=u"test-form")
-
- >>> from zope.traversing.interfaces import ITraversable
- >>> traverser = getMultiAdapter((form, request), name=u"widget")
- >>> traverser.traverse('age', [])
- Updating test form
- <TextWidget 'form.widgets.age'>
-
-Please note that this point, the form has been updated, but not rendered.
-
-Traversal on a layout wrapper view
------------------------------------
-
-Again, we create a simple form and context.
-
- >>> from zope.interface import alsoProvides
- >>> from zope.publisher.browser import TestRequest
- >>> from zope.annotation.interfaces import IAttributeAnnotatable
- >>> from z3c.form.interfaces import IFormLayer
-
- >>> def make_request(form={}):
- ... request = TestRequest()
- ... request.form.update(form)
- ... alsoProvides(request, IFormLayer)
- ... alsoProvides(request, IAttributeAnnotatable)
- ... return request
-
- >>> from zope import interface, schema
- >>> from z3c.form import form, field, button
- >>> from plone.z3cform.layout import FormWrapper
-
- >>> class MySchema(interface.Interface):
- ... age = schema.Int(title=u"Age")
-
- >>> from z3c.form.interfaces import IFieldsForm
- >>> from zope.interface import implements
- >>> class MyForm(form.Form):
- ... implements(IFieldsForm)
- ... fields = field.Fields(MySchema)
- ... ignoreContext = True # don't use context to get widget data
- ...
- ... def update(self):
- ... print "Updating test form"
- ... super(MyForm, self).update()
-
- >>> class MyFormWrapper(FormWrapper):
- ... form = MyForm
- ... label = u"Please enter your age"
-
- >>> from zope.component import provideAdapter
- >>> from zope.publisher.interfaces.browser import IBrowserRequest
- >>> from zope.interface import Interface
-
- >>> provideAdapter(adapts=(Interface, IBrowserRequest),
- ... provides=Interface,
- ... factory=MyFormWrapper,
- ... name=u"test-form")
-
- >>> from Acquisition import Implicit
- >>> class Bar(Implicit):
- ... __allow_access_to_unprotected_subobjects__ = 1
- ... implements(Interface)
-
- >>> from zope.component import getMultiAdapter
- >>> context = Bar()
- >>> request = make_request()
-
-Now, let's emulate the publisher and look up the namespace traversal
-adapter. For example, let's say we'd traversed to
-../@@test-form/++widget++age. The publisher would then do:
-
- >>> form = getMultiAdapter((context, request), name=u"test-form")
-
- >>> from zope.traversing.interfaces import ITraversable
- >>> traverser = getMultiAdapter((form, request), name=u"widget")
- >>> traverser.traverse('age', [])
- Updating test form
- <TextWidget 'form.widgets.age'>
-
-Please note that this point, the form has been updated, but not rendered.
-
-When a form field does not exist a TraversalError is raised.
-
- >>> traverser = getMultiAdapter((form, request), name=u"widget")
- >>> traverser.traverse('missing', [])
- Traceback (most recent call last):
- ...
- TraversalError: 'missing'
More information about the checkins
mailing list