[Checkins] SVN: z3c.schema2xml/branches/jw-experiment/ Fairly
mechanical changes where IXMLGenerators are now multi
Jan-Wijbrand Kolman
janwijbrand at gmail.com
Thu Mar 27 09:38:23 EDT 2008
Log message for revision 84963:
Fairly mechanical changes where IXMLGenerators are now multi
adapters on field and request (essentially making them into views).
Changed:
U z3c.schema2xml/branches/jw-experiment/CHANGES.txt
U z3c.schema2xml/branches/jw-experiment/src/z3c/schema2xml/README.txt
U z3c.schema2xml/branches/jw-experiment/src/z3c/schema2xml/_schema2xml.py
-=-
Modified: z3c.schema2xml/branches/jw-experiment/CHANGES.txt
===================================================================
--- z3c.schema2xml/branches/jw-experiment/CHANGES.txt 2008-03-27 13:37:17 UTC (rev 84962)
+++ z3c.schema2xml/branches/jw-experiment/CHANGES.txt 2008-03-27 13:38:21 UTC (rev 84963)
@@ -5,7 +5,10 @@
0.11 (unreleased)
=================
-* ...
+* IXMLGenerators are now multi adapters on field and request. This
+ makes IXMLGenerators essentially views, or something like widgets. This is
+ needed to have proper validation of input and in preparation of improved
+ sources/vocabularies support.
0.10 (2008-03-10)
=================
Modified: z3c.schema2xml/branches/jw-experiment/src/z3c/schema2xml/README.txt
===================================================================
--- z3c.schema2xml/branches/jw-experiment/src/z3c/schema2xml/README.txt 2008-03-27 13:37:17 UTC (rev 84962)
+++ z3c.schema2xml/branches/jw-experiment/src/z3c/schema2xml/README.txt 2008-03-27 13:38:21 UTC (rev 84963)
@@ -43,8 +43,9 @@
Now let's serialize it to XML:
+ >>> from zope.publisher.browser import TestRequest
>>> from z3c.schema2xml import serialize
- >>> print serialize('container', IName, name)
+ >>> print serialize('container', IName, name, TestRequest())
<container>
<first_name>Karel</first_name>
<last_name>Titulaer</last_name>
@@ -62,7 +63,7 @@
... self.street_name = street_name
... self.number = number
>>> address = Address('Hofplein', 42)
- >>> print serialize('container', IAddress, address)
+ >>> print serialize('container', IAddress, address, TestRequest())
<container>
<street_name>Hofplein</street_name>
<number>42</number>
@@ -72,7 +73,7 @@
element::
>>> address2 = Address(None, None)
- >>> print serialize('container', IAddress, address2)
+ >>> print serialize('container', IAddress, address2, TestRequest())
<container>
<street_name/>
<number/>
@@ -92,7 +93,7 @@
... self.address = address
>>> person = Person(name, address)
- >>> print serialize('person', IPerson, person)
+ >>> print serialize('person', IPerson, person, TestRequest())
<person>
<name>
<first_name>Karel</first_name>
@@ -124,7 +125,7 @@
>>> commission = Commission(
... [person, Person(Name('Chriet', 'Titulaer'), Address('Ruimteweg', 3))])
- >>> print serialize('commission', ICommission, commission)
+ >>> print serialize('commission', ICommission, commission, TestRequest())
<commission>
<members>
<person>
@@ -160,11 +161,12 @@
... def __init__(self, value):
... self.field = value
>>> not_serializable = NotSerializable(None)
- >>> serialize('noway', IWithNonSerializableField, not_serializable)
+ >>> serialize('noway', IWithNonSerializableField, not_serializable, TestRequest())
Traceback (most recent call last):
...
- TypeError: ('Could not adapt', <zope.schema._bootstrapfields.Field object at ...>, <InterfaceClass z3c.schema2xml._schema2xml.IXMLGenerator>)
+ ComponentLookupError: ((<zope.schema._bootstrapfields.Field object at ...>, <zope.publisher.browser.TestRequest instance URL=http://127.0.0.1>), <InterfaceClass z3c.schema2xml._schema2xml.IXMLGenerator>, u'')
+
Deserialization
---------------
@@ -179,7 +181,7 @@
... </container>
... '''
>>> name = Name('', '')
- >>> deserialize(xml, IName, name)
+ >>> deserialize(xml, IName, name, TestRequest())
>>> name.first_name
u'Karel'
>>> name.last_name
@@ -194,7 +196,7 @@
... </container>
... '''
>>> name = Name('', '')
- >>> deserialize(xml, IName, name)
+ >>> deserialize(xml, IName, name, TestRequest())
>>> name.first_name
u'Karel'
>>> name.last_name
@@ -214,7 +216,7 @@
... </container>
... '''
>>> address = Address('', 0)
- >>> deserialize(xml, IAddress, address)
+ >>> deserialize(xml, IAddress, address, TestRequest())
>>> address.street_name
u'Hofplein'
>>> address.number
@@ -236,7 +238,7 @@
... </person>
... '''
>>> person = Person(Name('', ''), Address('', 0))
- >>> deserialize(xml, IPerson, person)
+ >>> deserialize(xml, IPerson, person, TestRequest())
>>> person.name.first_name
u'Karel'
>>> person.name.last_name
@@ -267,7 +269,7 @@
... </person>
... '''
>>> person = Person(Name('', ''), Address('', 0))
- >>> deserialize(xml, IPerson, person)
+ >>> deserialize(xml, IPerson, person, TestRequest())
>>> person.name.first_name
u'Karel'
>>> person.name.last_name
@@ -311,7 +313,7 @@
... '''
>>> commission = Commission([])
- >>> deserialize(xml, ICommission, commission)
+ >>> deserialize(xml, ICommission, commission, TestRequest())
>>> len(commission.members)
2
>>> member = commission.members[0]
@@ -335,7 +337,7 @@
... </container>
... '''
>>> name = Name('', '')
- >>> deserialize(xml, IName, name)
+ >>> deserialize(xml, IName, name, TestRequest())
>>> name.first_name is None
True
>>> name.last_name is None
@@ -350,7 +352,7 @@
... </container>
... '''
>>> address = Address('', 0)
- >>> deserialize(xml, IAddress, address)
+ >>> deserialize(xml, IAddress, address, TestRequest())
>>> address.street_name is None
True
>>> address.number is None
@@ -371,7 +373,7 @@
... </person>
... '''
>>> person = Person(Name('', ''), Address('', 0))
- >>> deserialize(xml, IPerson, person)
+ >>> deserialize(xml, IPerson, person, TestRequest())
>>> person.name.first_name is None
True
>>> person.name.last_name is None
@@ -397,7 +399,7 @@
... </commission>
... '''
>>> commission = Commission([])
- >>> deserialize(xml, ICommission, commission)
+ >>> deserialize(xml, ICommission, commission, TestRequest())
>>> len(commission.members)
0
@@ -417,13 +419,13 @@
... def __init__(self, datetime):
... self.datetime = datetime
>>> with_datetime = WithDatetime(datetime(2006, 12, 31))
- >>> xml = serialize('container', IWithDatetime, with_datetime)
+ >>> xml = serialize('container', IWithDatetime, with_datetime, TestRequest())
>>> print xml
<container>
<datetime>2006-12-31T00:00:00</datetime>
</container>
>>> new_datetime = WithDatetime(None)
- >>> deserialize(xml, IWithDatetime, new_datetime)
+ >>> deserialize(xml, IWithDatetime, new_datetime, TestRequest())
>>> new_datetime.datetime.year
2006
>>> new_datetime.datetime.month
@@ -434,13 +436,13 @@
Let's try it with the field not filled in::
>>> with_datetime = WithDatetime(None)
- >>> xml = serialize('container', IWithDatetime, with_datetime)
+ >>> xml = serialize('container', IWithDatetime, with_datetime, TestRequest())
>>> print xml
<container>
<datetime/>
</container>
>>> new_datetime= WithDatetime(None)
- >>> deserialize(xml, IWithDatetime, new_datetime)
+ >>> deserialize(xml, IWithDatetime, new_datetime, TestRequest())
>>> new_datetime.datetime is None
True
@@ -463,22 +465,22 @@
... def __init__(self, choice):
... self.choice = choice
>>> with_choice = WithChoice('alpha')
- >>> xml = serialize('container', IWithChoice, with_choice)
+ >>> xml = serialize('container', IWithChoice, with_choice, TestRequest())
>>> print xml
<container>
<choice>alpha</choice>
</container>
>>> new_choice = WithChoice(None)
- >>> deserialize(xml, IWithChoice, new_choice)
+ >>> deserialize(xml, IWithChoice, new_choice, TestRequest())
>>> new_choice.choice
'alpha'
>>> with_choice = WithChoice(None)
- >>> xml = serialize('container', IWithChoice, with_choice)
+ >>> xml = serialize('container', IWithChoice, with_choice, TestRequest())
>>> print xml
<container>
<choice/>
</container>
- >>> deserialize(xml, IWithChoice, new_choice)
+ >>> deserialize(xml, IWithChoice, new_choice, TestRequest())
>>> new_choice.choice is None
True
@@ -490,7 +492,7 @@
... <choice>gamma</choice>
... </container>
... '''
- >>> deserialize(xml, IWithChoice, new_choice)
+ >>> deserialize(xml, IWithChoice, new_choice, TestRequest())
Traceback (most recent call last):
...
ConstraintNotSatisfied: gamma
@@ -509,7 +511,7 @@
... def __init__(self, set):
... self.set = set
>>> with_set = WithSet(set(['alpha']))
- >>> xml = serialize('container', IWithSet, with_set)
+ >>> xml = serialize('container', IWithSet, with_set, TestRequest())
>>> print xml
<container>
<set>
@@ -517,7 +519,7 @@
</set>
</container>
>>> with_set = WithSet(set(['alpha', 'beta']))
- >>> xml = serialize('container', IWithSet, with_set)
+ >>> xml = serialize('container', IWithSet, with_set, TestRequest())
>>> print xml
<container>
<set>
@@ -526,7 +528,7 @@
</set>
</container>
>>> new_set = WithSet(None)
- >>> deserialize(xml, IWithSet, new_set)
+ >>> deserialize(xml, IWithSet, new_set, TestRequest())
>>> new_set.set
set(['alpha', 'beta'])
@@ -542,7 +544,7 @@
... </set>
... </container>
... '''
- >>> deserialize(xml, IWithSet, new_set)
+ >>> deserialize(xml, IWithSet, new_set, TestRequest())
Traceback (most recent call last):
...
ConstraintNotSatisfied: gamma
Modified: z3c.schema2xml/branches/jw-experiment/src/z3c/schema2xml/_schema2xml.py
===================================================================
--- z3c.schema2xml/branches/jw-experiment/src/z3c/schema2xml/_schema2xml.py 2008-03-27 13:37:17 UTC (rev 84962)
+++ z3c.schema2xml/branches/jw-experiment/src/z3c/schema2xml/_schema2xml.py 2008-03-27 13:38:21 UTC (rev 84963)
@@ -7,34 +7,42 @@
from zope.interface import Interface, alsoProvides
import zope.datetime
from zope.location import Location
+
+from zope.component import getMultiAdapter
+
from zope.schema import getFieldsInOrder
from zope.schema.interfaces import IText, IInt, IObject, IList, IChoice, ISet
from zope.schema.interfaces import IDatetime
-def serialize_to_tree(container, schema, instance):
+from zope.publisher.interfaces.browser import IBrowserRequest
+
+def serialize_to_tree(container, schema, instance, request):
for name, field in getFieldsInOrder(schema):
value = field.get(instance)
- IXMLGenerator(field).output(container, value)
+ getMultiAdapter(
+ (field, request), IXMLGenerator).output(container, value)
return container
def serialize(
- container_name, schema, instance, encoding='UTF-8', pretty_print=True):
+ container_name, schema, instance, request,
+ encoding='UTF-8', pretty_print=True):
container = etree.Element(container_name)
- container = serialize_to_tree(container, schema, instance)
+ container = serialize_to_tree(container, schema, instance, request)
return etree.tostring(
container, encoding=encoding, pretty_print=pretty_print)
-def deserialize_from_tree(container, schema, instance):
+def deserialize_from_tree(container, schema, instance, request):
for element in container:
field = schema[element.tag]
- value = IXMLGenerator(field).input(element)
+ value = getMultiAdapter(
+ (field, request), IXMLGenerator).input(element)
field.set(instance, value)
alsoProvides(instance, schema)
-def deserialize(xml, schema, instance):
+def deserialize(xml, schema, instance, request):
container = etree.XML(xml)
- deserialize_from_tree(container, schema, instance)
+ deserialize_from_tree(container, schema, instance, request)
class GeneratedObject(Location, Persistent):
def __init__(self):
@@ -50,12 +58,19 @@
"""Input XML element according to field and return value.
"""
-class Text(grok.Adapter):
- grok.context(IText)
+class XMLGeneratorBase(grok.MultiAdapter):
+ grok.baseclass()
grok.implements(IXMLGenerator)
+ def __init__(self, field, request):
+ self.field = field
+ self.request = request
+
+class Text(XMLGeneratorBase):
+ grok.adapts(IText, IBrowserRequest)
+
def output(self, container, value):
- element = etree.SubElement(container, self.context.__name__)
+ element = etree.SubElement(container, self.field.__name__)
element.text = value
def input(self, element):
@@ -63,12 +78,11 @@
return unicode(element.text)
return None
-class Int(grok.Adapter):
- grok.context(IInt)
- grok.implements(IXMLGenerator)
+class Int(XMLGeneratorBase):
+ grok.adapts(IInt, IBrowserRequest)
def output(self, container, value):
- element = etree.SubElement(container, self.context.__name__)
+ element = etree.SubElement(container, self.field.__name__)
if value is not None:
element.text = str(value)
@@ -77,43 +91,44 @@
return int(element.text)
return None
-class Object(grok.Adapter):
- grok.context(IObject)
- grok.implements(IXMLGenerator)
+class Object(XMLGeneratorBase):
+ grok.adapts(IObject, IBrowserRequest)
def output(self, container, value):
- container = etree.SubElement(container, self.context.__name__)
+ container = etree.SubElement(container, self.field.__name__)
- for name, field in getFieldsInOrder(self.context.schema):
- IXMLGenerator(field).output(container, field.get(value))
+ for name, field in getFieldsInOrder(self.field.schema):
+ adapter = getMultiAdapter((field, self.request), IXMLGenerator)
+ adapter.output(container, field.get(value))
def input(self, element):
instance = GeneratedObject()
- deserialize_from_tree(element, self.context.schema, instance)
+ deserialize_from_tree(
+ element, self.field.schema, instance, self.request)
return instance
-class List(grok.Adapter):
- grok.context(IList)
- grok.implements(IXMLGenerator)
+class List(XMLGeneratorBase):
+ grok.adapts(IList, IBrowserRequest)
def output(self, container, value):
- container = etree.SubElement(container, self.context.__name__)
- field = self.context.value_type
+ container = etree.SubElement(container, self.field.__name__)
+ field = self.field.value_type
for v in value:
- IXMLGenerator(field).output(container, v)
+ adapter = getMultiAdapter((field, self.request), IXMLGenerator)
+ adapter.output(container, v)
def input(self, element):
- field = self.context.value_type
+ field = self.field.value_type
return [
- IXMLGenerator(field).input(sub_element)
+ getMultiAdapter(
+ (field, self.request), IXMLGenerator).input(sub_element)
for sub_element in element]
-class Datetime(grok.Adapter):
- grok.context(IDatetime)
- grok.implements(IXMLGenerator)
+class Datetime(XMLGeneratorBase):
+ grok.adapts(IDatetime, IBrowserRequest)
def output(self, container, value):
- element = etree.SubElement(container, self.context.__name__)
+ element = etree.SubElement(container, self.field.__name__)
if value is not None:
element.text = value.isoformat()
@@ -122,33 +137,33 @@
return zope.datetime.parseDatetimetz(element.text)
return None
-class Choice(grok.Adapter):
- grok.context(IChoice)
- grok.implements(IXMLGenerator)
+class Choice(XMLGeneratorBase):
+ grok.adapts(IChoice, IBrowserRequest)
def output(self, container, value):
- element = etree.SubElement(container, self.context.__name__)
+ element = etree.SubElement(container, self.field.__name__)
element.text = value
def input(self, element):
value = element.text
if value is not None:
- self.context.validate(value) # raises an error if not valid.
+ self.field.validate(value) # raises an error if not valid.
return value
return None
-class Set(grok.Adapter):
- grok.context(ISet)
- grok.implements(IXMLGenerator)
+class Set(XMLGeneratorBase):
+ grok.adapts(ISet, IBrowserRequest)
def output(self, container, value):
- container = etree.SubElement(container, self.context.__name__)
- field = self.context.value_type
+ container = etree.SubElement(container, self.field.__name__)
+ field = self.field.value_type
for v in value:
- IXMLGenerator(field).output(container, v)
+ adapter = getMultiAdapter((field, self.request), IXMLGenerator)
+ adapter.output(container, v)
def input(self, element):
- field = self.context.value_type
+ field = self.field.value_type
return set([
- IXMLGenerator(field).input(sub_element)
+ getMultiAdapter(
+ (field, self.request), IXMLGenerator).input(sub_element)
for sub_element in element])
More information about the Checkins
mailing list