Skip to content

Commit

Permalink
Check multiple invariants; test validateInvariants.
Browse files Browse the repository at this point in the history
  • Loading branch information
smcmahon committed Nov 17, 2013
1 parent 0b3f3ad commit 4219338
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 3 deletions.
14 changes: 12 additions & 2 deletions plone/supermodel/schema.txt
Expand Up @@ -448,14 +448,15 @@ fieldset.
Invariant Support
-----------------

We may specify an invariant for the form via the "invariant" tag with
We may specify one or more invariants for the form via the "invariant" tag with
a dotted name for the invariant function.

>>> schema = """\
... <?xml version="1.0" encoding="UTF-8"?>
... <model xmlns="http://namespaces.plone.org/supermodel/schema">
... <schema>
... <invariant>plone.supermodel.tests.dummy_invariant</invariant>
... <invariant>plone.supermodel.tests.dummy_invariant_prime</invariant>
... <field type="zope.schema.Text" name="description">
... <title>Description</title>
... <description>A short summary</description>
Expand All @@ -469,14 +470,23 @@ a dotted name for the invariant function.

>>> model = loadString(schema)
>>> model.schema.getTaggedValue('invariants')
[<function dummy_invariant at ...>]
[<function dummy_invariant at ...>, <function dummy_invariant_prime at ...>]

When invariants are checked for our model.schema, we'll see our invariant
in action.

>>> model.schema.validateInvariants(object())
Traceback (most recent call last):
...
Invalid: Yikes! Invalid

The model's serialization should include the invariant.

>>> print serializeModel(model) # doctest: +NORMALIZE_WHITESPACE
<model xmlns="http://namespaces.plone.org/supermodel/schema">
<schema>
<invariant>plone.supermodel.tests.dummy_invariant</invariant>
<invariant>plone.supermodel.tests.dummy_invariant_prime</invariant>
<field name="description" type="zope.schema.Text">
<description>A short summary</description>
<title>Description</title>
Expand Down
2 changes: 1 addition & 1 deletion plone/supermodel/serializer.py
Expand Up @@ -96,7 +96,7 @@ def writeField(field, parentElement):

for invariant in schema.queryTaggedValue('invariants', []):
invariant_element = etree.Element('invariant')
invariant_element.text = "%s.%s" % (invariant.__module__, invariant.__name__
invariant_element.text = "%s.%s" % (invariant.__module__, invariant.__name__)
schema_element.append(invariant_element)

for fieldName in non_fieldset_fields:
Expand Down
6 changes: 6 additions & 0 deletions plone/supermodel/tests.py
Expand Up @@ -5,6 +5,7 @@
from lxml import etree

from zope.interface import Interface, implements, alsoProvides, provider
from zope.interface import Invalid
import zope.component.testing

from zope.schema import getFieldNamesInOrder
Expand Down Expand Up @@ -70,6 +71,11 @@ def dummy_defaultBadFactory():

@provider(IInvariant)
def dummy_invariant(data):
raise Invalid(u"Yikes! Invalid")


@provider(IInvariant)
def dummy_invariant_prime(data):
return None


Expand Down

0 comments on commit 4219338

Please sign in to comment.