[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