[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