[Checkins] SVN: zope.generic/trunk/src/zope/generic/ add unicode support (-> usage for json)

Dominik Huber dominik.huber at perse.ch
Mon Jul 10 13:48:56 EDT 2006


Log message for revision 69076:
  add unicode support (-> usage for json)
  handle None within EuroDate

Changed:
  U   zope.generic/trunk/src/zope/generic/configuration/base.py
  U   zope.generic/trunk/src/zope/generic/configuration/helper.py
  U   zope.generic/trunk/src/zope/generic/field/_datetime.py

-=-
Modified: zope.generic/trunk/src/zope/generic/configuration/base.py
===================================================================
--- zope.generic/trunk/src/zope/generic/configuration/base.py	2006-07-10 17:42:11 UTC (rev 69075)
+++ zope.generic/trunk/src/zope/generic/configuration/base.py	2006-07-10 17:48:55 UTC (rev 69076)
@@ -27,6 +27,7 @@
 from zope.interface import implements
 from zope.schema import ValidationError
 from zope.schema.interfaces import IField
+from zope.schema.interfaces import IFromUnicode
 
 from zope.generic.face import IAttributeFaced
 from zope.generic.face import IFace
@@ -44,14 +45,14 @@
 
 
 
-def createConfiguration(keyface, data):
+def createConfiguration(keyface, data, fromunicode=False):
     """Factory function for configuration data."""
 
-    return ConfigurationData(keyface, data)
+    return ConfigurationData(keyface, data, fromunicode)
 
 
 
-def createConfigurationList(field, data):
+def createConfigurationList(field, data, fromunicode=False):
 
     if ISubConfiguration.providedBy(field.value_type):
         subkeyface = field.value_type.schema
@@ -60,7 +61,7 @@
         while data:
             subdata = subData(str(counter), data)
             if subdata:
-                subconfigurations.append(createConfiguration(subkeyface, subdata))
+                subconfigurations.append(createConfiguration(subkeyface, subdata, fromunicode))
             else:
                 raise IndexError('list index out of range')
 
@@ -75,23 +76,32 @@
         # precondition: assume that everythings is ok if the start and end point is ok
         if int(indices[0]) != 0 or int(indices[-1]) != len(indices) - 1:
             raise IndexError('list index out of range')
-        return ConfigurationList([data[index] for index in indices])
+        
+        if fromunicode and IFromUnicode.providedBy(field):
+            return ConfigurationList([field.fromUnicode(data[index]) for index in indices])
+        else:
+            return ConfigurationList([data[index] for index in indices])
 
 
 
-def createConfigurationDict(field, data):
+def createConfigurationDict(field, data, fromunicode=False):
     if ISubConfiguration.providedBy(field.value_type):
         subkeyface = field.value_type.schema
         subconfigurations = {}
         while data:
             prefix = iter(data).next().split('.')[0] # evaluate the next entry  
-            subconfigurations[prefix] = createConfiguration(subkeyface, subData(prefix, data))
+            subconfigurations[prefix] = createConfiguration(subkeyface, subData(prefix, data), fromunicode)
 
         return ConfigurationDict(subconfigurations)
 
     # other objects
     else:
-        return ConfigurationDict(data)
+        if fromunicode and IFromUnicode.providedBy(field):
+            unicode_data = {}; 
+            [unicode_data.__setitem__(key, field.fromUnicode(value)) for key, value in data.items()]
+            return ConfigurationDict(unicode_data)
+        else:
+            return ConfigurationDict(data)
 
 
 
@@ -120,7 +130,7 @@
 
 
 
-def prepareData(__keyface__, data):
+def prepareData(__keyface__, data, fromunicode):
     """Nested configuration support."""
     missedArguments = []
     relevant_data = {}
@@ -134,11 +144,11 @@
 
                 if subdata or field.required is True:
                     if ISubConfiguration.providedBy(field):
-                        relevant_data[name] = createConfiguration(field.schema, subdata)
+                        relevant_data[name] = createConfiguration(field.schema, subdata, fromunicode)
                     elif ISubConfigurationList.providedBy(field):
-                        relevant_data[name] = createConfigurationList(field, subdata)
+                        relevant_data[name] = createConfigurationList(field, subdata, fromunicode)
                     elif ISubConfigurationDict.providedBy(field):
-                        relevant_data[name] = createConfigurationDict(field, subdata)
+                        relevant_data[name] = createConfigurationDict(field, subdata, fromunicode)
                     else:
                         raise NotImplementedError()
 
@@ -157,10 +167,13 @@
                 relevant_data[name] = ConfigurationDict(value)
 
             elif isinstance(value, dict) and ISubConfiguration.providedBy(field):
-                relevant_data[name] = createConfiguration(field.schema, value)
+                relevant_data[name] = createConfiguration(field.schema, value, fromunicode)
 
             else:
-                relevant_data[name] = data[name]
+                if fromunicode and IFromUnicode.providedBy(field):
+                    relevant_data[name] = field.fromUnicode(data[name])
+                else:
+                    relevant_data[name] = data[name]
     
     if missedArguments:
         raise TypeError("__init__ requires '%s' of '%s'." % (', '.join(missedArguments), __keyface__.__name__))
@@ -261,14 +274,14 @@
 
     implements(IAttributeFaced, IConfigurationData)
 
-    def __init__(self, __keyface__, data):
+    def __init__(self, __keyface__, data, fromunicode=False):
         # essentials
         self.__dict__['__keyface__'] = __keyface__
         self.__dict__['__conface__'] = IUndefinedContext
         directlyProvides(self, __keyface__)
 
         # set other data
-        for key, value in prepareData(__keyface__, data).items():
+        for key, value in prepareData(__keyface__, data, fromunicode).items():
             setattr(self, key, value)
 
     def __repr__(self):

Modified: zope.generic/trunk/src/zope/generic/configuration/helper.py
===================================================================
--- zope.generic/trunk/src/zope/generic/configuration/helper.py	2006-07-10 17:42:11 UTC (rev 69075)
+++ zope.generic/trunk/src/zope/generic/configuration/helper.py	2006-07-10 17:48:55 UTC (rev 69076)
@@ -27,8 +27,10 @@
 from zope.generic.configuration.field import ISubConfiguration
 from zope.generic.configuration.field import ISubConfigurationDict
 from zope.generic.configuration.field import ISubConfigurationList
+from zope.generic.field import IToUnicode
 
 
+
 def provideConfigurationType(interface):
     """Mark an interface as IConfigurationType."""
 
@@ -38,18 +40,20 @@
 
 _marker = object()
 
-def configurationToDict(configuration, all=False):
+def configurationToDict(configuration, all=False, tounicode=False):
     """Extract values from configuration to a dictionary.
 
     First we have to specify a test configurtion interface:
 
         >>> from zope.interface import Interface
         >>> from zope.schema import TextLine
+        >>> from zope.generic.field.api import EuroDate
         
         >>> class IAnyConfiguration(Interface):
         ...    a = TextLine()
         ...    b = TextLine(required=False)
         ...    c = TextLine(required=False, readonly=True, default=u'c default')
+        ...    d = EuroDate(required=False)
 
     Minimal data without defaults:
 
@@ -60,8 +64,14 @@
 
     Including defaults:
         >>> api.configurationToDict(configuration, all=True)
-        {'a': u'a bla', 'c': u'c default', 'b': None}
+        {'a': u'a bla', 'c': u'c default', 'b': None, 'd': None}
 
+    Unicode support:
+        >>> configuration = createConfiguration(IAnyConfiguration, {'a': u'a bla', 'd': u'12.3.2006'}, fromunicode=True)
+        >>> api.configurationToDict(configuration, all=True)
+        {'a': u'a bla', 'c': u'c default', 'b': None, 'd': datetime.date(2006, 3, 12)}
+        >>> api.configurationToDict(configuration, all=True, tounicode=True)
+        {'a': u'a bla', 'c': u'c default', 'b': None, 'd': u'12.03.2006'}
     """
     data = {}
     keyface = IFace(configuration).keyface
@@ -71,28 +81,26 @@
         field = keyface[name]
         
         if INestedConfiguration.providedBy(field):
-
             if ISubConfiguration.providedBy(field):
                 if value:
-                    data[name] = configurationToDict(value, all)
+                    data[name] = configurationToDict(value, all, tounicode)
 
             elif ISubConfigurationList.providedBy(field):
                 if ISubConfiguration.providedBy(field.value_type):
-                    data[name] = [configurationToDict(v, all) for v in value]
+                    data[name] = [configurationToDict(v, all, tounicode) for v in value]
                 # regular objects
                 else:
                     data[name] = [v for v in value]
 
             elif ISubConfigurationDict.providedBy(field):
                 if ISubConfiguration.providedBy(field.value_type):
-                    data[name] = dict([(k, configurationToDict(v, all)) for k, v in value.items()])
+                    data[name] = dict([(k, configurationToDict(v, all, tounicode)) for k, v in value.items()])
                 # regular objects
                 else:
                     data[name] = dict([item for item in value.items()])
 
         # no sub-configuraiton
         else:
-
             if field.required is False:
                 if value is not _marker and value != field.default:
                    data[name] = value
@@ -111,6 +119,9 @@
             else:
                 raise RuntimeError('Data is missing', name)
 
+            if tounicode and IToUnicode.providedBy(field):
+                data[name] = field.toUnicode(data[name])
+
     return data
 
 

Modified: zope.generic/trunk/src/zope/generic/field/_datetime.py
===================================================================
--- zope.generic/trunk/src/zope/generic/field/_datetime.py	2006-07-10 17:42:11 UTC (rev 69075)
+++ zope.generic/trunk/src/zope/generic/field/_datetime.py	2006-07-10 17:48:55 UTC (rev 69076)
@@ -63,6 +63,8 @@
         u'12.03.2006'
 
         """
-
-        return unicode(value.strftime('%d.%m.%Y'))
+        if value is None:
+            return u''
+        else:
+            return unicode(value.strftime('%d.%m.%Y'))
         
\ No newline at end of file



More information about the Checkins mailing list