[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