[Checkins] SVN: zope.generic/trunk/src/zope/generic/configuration/ create flat-dotted-named dicts from a configuration

Dominik Huber dominik.huber at perse.ch
Wed Jul 26 12:23:15 EDT 2006


Log message for revision 69266:
  create flat-dotted-named dicts from a configuration

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

-=-
Modified: zope.generic/trunk/src/zope/generic/configuration/api.py
===================================================================
--- zope.generic/trunk/src/zope/generic/configuration/api.py	2006-07-26 12:30:06 UTC (rev 69265)
+++ zope.generic/trunk/src/zope/generic/configuration/api.py	2006-07-26 16:23:14 UTC (rev 69266)
@@ -30,6 +30,7 @@
 from zope.generic.configuration.field import SubConfigurationDict
 from zope.generic.configuration.field import SubConfigurationList
 from zope.generic.configuration.helper import configurationToDict
+from zope.generic.configuration.helper import configurationToFlatDict
 from zope.generic.configuration.helper import provideConfigurationType
 from zope.generic.configuration.helper import namesInOrder
 

Modified: zope.generic/trunk/src/zope/generic/configuration/base.py
===================================================================
--- zope.generic/trunk/src/zope/generic/configuration/base.py	2006-07-26 12:30:06 UTC (rev 69265)
+++ zope.generic/trunk/src/zope/generic/configuration/base.py	2006-07-26 16:23:14 UTC (rev 69266)
@@ -77,8 +77,8 @@
         if int(indices[0]) != 0 or int(indices[-1]) != len(indices) - 1:
             raise IndexError('list index out of range')
         
-        if fromunicode and IFromUnicode.providedBy(field):
-            return ConfigurationList([field.fromUnicode(data[index]) for index in indices])
+        if fromunicode:
+            return ConfigurationList([field.value_type.fromUnicode(data[index]) for index in indices])
         else:
             return ConfigurationList([data[index] for index in indices])
 
@@ -96,9 +96,9 @@
 
     # other objects
     else:
-        if fromunicode and IFromUnicode.providedBy(field):
+        if fromunicode:
             unicode_data = {}; 
-            [unicode_data.__setitem__(key, field.fromUnicode(value)) for key, value in data.items()]
+            [unicode_data.__setitem__(key, field.value_type.fromUnicode(value)) for key, value in data.items()]
             return ConfigurationDict(unicode_data)
         else:
             return ConfigurationDict(data)
@@ -170,7 +170,7 @@
                 relevant_data[name] = createConfiguration(field.schema, value, fromunicode)
 
             else:
-                if fromunicode and IFromUnicode.providedBy(field):
+                if fromunicode:
                     relevant_data[name] = field.fromUnicode(data[name])
                 else:
                     relevant_data[name] = data[name]

Modified: zope.generic/trunk/src/zope/generic/configuration/helper.py
===================================================================
--- zope.generic/trunk/src/zope/generic/configuration/helper.py	2006-07-26 12:30:06 UTC (rev 69265)
+++ zope.generic/trunk/src/zope/generic/configuration/helper.py	2006-07-26 16:23:14 UTC (rev 69266)
@@ -72,6 +72,10 @@
         {'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'}
+
+    Nested configuration support:
+
+        TODO
     """
     data = {}
     keyface = IFace(configuration).keyface
@@ -125,7 +129,111 @@
     return data
 
 
+def configurationToFlatDict(configuration, all=False, tounicode=False):
+    """Extract values from configuration to a flat 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:
+
+        >>> from zope.generic.configuration.base import createConfiguration
+        >>> configuration = createConfiguration(IAnyConfiguration, {'a': u'a bla'})
+        >>> api.configurationToFlatDict(configuration)
+        {'a': u'a bla'}
+
+    Including defaults:
+        >>> api.configurationToFlatDict(configuration, all=True)
+        {'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.configurationToFlatDict(configuration, all=True)
+        {'a': u'a bla', 'c': u'c default', 'b': None, 'd': datetime.date(2006, 3, 12)}
+        >>> api.configurationToFlatDict(configuration, all=True, tounicode=True)
+        {'a': u'a bla', 'c': u'c default', 'b': None, 'd': u'12.03.2006'}
+
+    Nested configuration support:
+
+        TODO
+
+    """
+    data = {}
+    keyface = IFace(configuration).keyface
+
+    for name in keyface:
+        value = getattr(configuration, name, _marker)
+        field = keyface[name]
+        
+        if INestedConfiguration.providedBy(field):
+            if ISubConfiguration.providedBy(field):
+                if value:
+                    subconfig = configurationToFlatDict(value, all, tounicode)
+                    for key, value in subconfig.items():
+                        data['.'.join([name, key])] = value
+
+            elif ISubConfigurationList.providedBy(field):
+                if ISubConfiguration.providedBy(field.value_type):
+                    sublist = [configurationToFlatDict(v, all, tounicode) for v in value]
+                    for i in range(len(sublist)):
+                        subconfig = sublist[i]
+                        for key, value in subconfig.items():
+                            data['.'.join([name, str(i), key])] = value
+
+                # regular objects
+                else:
+                    sublist = [v for v in value]
+                    for i in range(len(sublist)):
+                        data['.'.join([name, str(i)])] = sublist[i]
+
+            elif ISubConfigurationDict.providedBy(field):
+                if ISubConfiguration.providedBy(field.value_type):
+                    subdict = dict([(k, configurationToFlatDict(v, all, tounicode)) for k, v in value.items()])
+                    for key, value in subdict.items():
+                        for k, v in value:
+                            data['.'.join([name, key, k])] = v
+                # regular objects
+                else:
+                    subdict = dict([item for item in value.items()])
+                    for key, value in subdict.items():
+                        data['.'.join([name, key])] = value
+
+        # no sub-configuraiton
+        else:
+            if field.required is False:
+                if value is not _marker and value != field.default:
+                   data[name] = value
+    
+                elif value == field.default:
+                    if all:
+                        data[name] = value
+    
+                else:
+                    if all:
+                        data[name] = field.default
+    
+            elif value is not _marker:
+                data[name] = value
+    
+            else:
+                raise RuntimeError('Data is missing', name)
+
+            if tounicode and IToUnicode.providedBy(field):
+                data[name] = field.toUnicode(data[name])
+
+    return data
+
+
+
 def namesInOrder(configuration, required_only=True):
     """Evaluate the relevant order of positional arguments.
 



More information about the Checkins mailing list