[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