[CalendarServer-changes] [12157] twext/trunk/twext/who
source_changes at macosforge.org
source_changes at macosforge.org
Wed Mar 12 11:16:07 PDT 2014
Revision: 12157
http://trac.calendarserver.org//changeset/12157
Author: wsanchez at apple.com
Date: 2013-12-19 15:32:17 -0800 (Thu, 19 Dec 2013)
Log Message:
-----------
Ensure that fields are of the correct type.
Modified Paths:
--------------
twext/trunk/twext/who/directory.py
twext/trunk/twext/who/idirectory.py
twext/trunk/twext/who/index.py
twext/trunk/twext/who/opendirectory/_service.py
twext/trunk/twext/who/test/test_directory.py
twext/trunk/twext/who/test/test_index.py
twext/trunk/twext/who/xml.py
Modified: twext/trunk/twext/who/directory.py
===================================================================
--- twext/trunk/twext/who/directory.py 2013-12-19 22:56:15 UTC (rev 12156)
+++ twext/trunk/twext/who/directory.py 2013-12-19 23:32:17 UTC (rev 12157)
@@ -91,7 +91,7 @@
fieldName = FieldName
normalizedFields = {
- FieldName.emailAddresses: lambda e: bytes(e).lower(),
+ FieldName.emailAddresses: lambda e: e.lower(),
}
@@ -289,7 +289,7 @@
if fieldName not in fields or not fields[fieldName]:
raise ValueError("{0} field is required.".format(fieldName))
- if FieldName.isMultiValue(fieldName):
+ if service.fieldName.isMultiValue(fieldName):
values = fields[fieldName]
for value in values:
if not value:
@@ -308,22 +308,37 @@
)
)
+ def checkType(name, value):
+ expectedType = service.fieldName.valueType(name)
+ if not isinstance(value, expectedType):
+ raise TypeError(
+ "Value {0!r} for field {1} is not of type {2}"
+ .format(value, name, expectedType)
+ )
+
# Normalize fields
normalizedFields = {}
for name, value in fields.items():
normalize = service.normalizedFields.get(name, None)
if normalize is None:
- normalizedFields[name] = value
- continue
+ normalizedValue = value
+ else:
+ if service.fieldName.isMultiValue(name):
+ normalizedValue = tuple((normalize(v) for v in value))
+ else:
+ normalizedValue = normalize(value)
- if FieldName.isMultiValue(name):
- normalizedFields[name] = tuple((normalize(v) for v in value))
+ if service.fieldName.isMultiValue(name):
+ for v in normalizedValue:
+ checkType(name, v)
else:
- normalizedFields[name] = normalize(value)
+ checkType(name, normalizedValue)
+ normalizedFields[name] = normalizedValue
+
self.service = service
- self.fields = normalizedFields
+ self.fields = normalizedFields
def __repr__(self):
Modified: twext/trunk/twext/who/idirectory.py
===================================================================
--- twext/trunk/twext/who/idirectory.py 2013-12-19 22:56:15 UTC (rev 12156)
+++ twext/trunk/twext/who/idirectory.py 2013-12-19 23:32:17 UTC (rev 12157)
@@ -162,6 +162,7 @@
recordType = NamedConstant()
recordType.description = u"record type"
+ recordType.valueType = NamedConstant
shortNames = NamedConstant()
shortNames.description = u"short names"
Modified: twext/trunk/twext/who/index.py
===================================================================
--- twext/trunk/twext/who/index.py 2013-12-19 22:56:15 UTC (rev 12156)
+++ twext/trunk/twext/who/index.py 2013-12-19 23:32:17 UTC (rev 12157)
@@ -207,7 +207,7 @@
values = record.fields.get(fieldName, None)
if values is not None:
- if not BaseFieldName.isMultiValue(fieldName):
+ if not self.fieldName.isMultiValue(fieldName):
values = (values,)
for value in values:
Modified: twext/trunk/twext/who/opendirectory/_service.py
===================================================================
--- twext/trunk/twext/who/opendirectory/_service.py 2013-12-19 22:56:15 UTC (rev 12156)
+++ twext/trunk/twext/who/opendirectory/_service.py 2013-12-19 23:32:17 UTC (rev 12157)
@@ -685,7 +685,7 @@
else:
values = [unicode(v) for v in values]
- if BaseFieldName.isMultiValue(fieldName):
+ if service.fieldName.isMultiValue(fieldName):
fields[fieldName] = values
else:
assert len(values) == 1
Modified: twext/trunk/twext/who/test/test_directory.py
===================================================================
--- twext/trunk/twext/who/test/test_directory.py 2013-12-19 22:56:15 UTC (rev 12156)
+++ twext/trunk/twext/who/test/test_directory.py 2013-12-19 23:32:17 UTC (rev 12157)
@@ -702,6 +702,31 @@
)
+ def test_initWithIncorrectFieldTypes(self):
+ """
+ Raise L{TypeError} if fields are of the wrong type.
+ """
+ self.assertRaises(
+ TypeError,
+ self.makeRecord,
+ {
+ FieldName.uid: "UID:wsanchez", # Not unicode.
+ FieldName.recordType: RecordType.user,
+ FieldName.shortNames: (u"wsanchez",),
+ }
+ )
+
+ self.assertRaises(
+ TypeError,
+ self.makeRecord,
+ {
+ FieldName.uid: u"UID:wsanchez",
+ FieldName.recordType: RecordType.user,
+ FieldName.shortNames: ("wsanchez",), # Not unicode.
+ }
+ )
+
+
def test_repr(self):
"""
L{DirectoryRecord.repr} returns the expected string.
Modified: twext/trunk/twext/who/test/test_index.py
===================================================================
--- twext/trunk/twext/who/test/test_index.py 2013-12-19 22:56:15 UTC (rev 12156)
+++ twext/trunk/twext/who/test/test_index.py 2013-12-19 23:32:17 UTC (rev 12157)
@@ -103,7 +103,7 @@
if values is None:
continue
- if not BaseFieldName.isMultiValue(fieldName):
+ if not service.fieldName.isMultiValue(fieldName):
values = (values,)
for value in values:
@@ -129,7 +129,7 @@
self.assertIn(fieldName, record.fields)
values = record.fields[fieldName]
- if not BaseFieldName.isMultiValue(fieldName):
+ if not service.fieldName.isMultiValue(fieldName):
values = (values,)
self.assertIn(fieldValue, values)
Modified: twext/trunk/twext/who/xml.py
===================================================================
--- twext/trunk/twext/who/xml.py 2013-12-19 22:56:15 UTC (rev 12156)
+++ twext/trunk/twext/who/xml.py 2013-12-19 23:32:17 UTC (rev 12157)
@@ -319,7 +319,7 @@
vType, fieldName
)
- if BaseFieldName.isMultiValue(fieldName):
+ if self.fieldName.isMultiValue(fieldName):
values = fields.setdefault(fieldName, [])
values.append(value)
else:
@@ -385,7 +385,7 @@
if name in fieldNames:
tag = fieldNames[name]
- if BaseFieldName.isMultiValue(name):
+ if self.fieldName.isMultiValue(name):
values = value
else:
values = (value,)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20140312/2fea42de/attachment.html>
More information about the calendarserver-changes
mailing list