[Checkins] SVN: zope.schema/trunk/ Improve error messages when term tokens or values are duplicates.

Benji York benji+zope.org at benjiyork.com
Tue Aug 31 20:33:14 EDT 2010


Log message for revision 116070:
  Improve error messages when term tokens or values are duplicates.
  

Changed:
  U   zope.schema/trunk/CHANGES.txt
  U   zope.schema/trunk/src/zope/schema/tests/test_vocabulary.py
  U   zope.schema/trunk/src/zope/schema/vocabulary.py

-=-
Modified: zope.schema/trunk/CHANGES.txt
===================================================================
--- zope.schema/trunk/CHANGES.txt	2010-09-01 00:23:26 UTC (rev 116069)
+++ zope.schema/trunk/CHANGES.txt	2010-09-01 00:33:13 UTC (rev 116070)
@@ -2,10 +2,11 @@
 CHANGES
 =======
 
-3.6.5 (unreleased)
+3.7.0 (unreleased)
 ------------------
 
-- Nothing changed yet.
+- Improve error messages when term tokens or values are duplicates.
+- Fix the buildout so the tests run.
 
 
 3.6.4 (2010-06-08)

Modified: zope.schema/trunk/src/zope/schema/tests/test_vocabulary.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_vocabulary.py	2010-09-01 00:23:26 UTC (rev 116069)
+++ zope.schema/trunk/src/zope/schema/tests/test_vocabulary.py	2010-09-01 00:33:13 UTC (rev 116070)
@@ -154,7 +154,22 @@
         self.assertRaises(
             ValueError, vocabulary.SimpleVocabulary.fromItems, 
             [(1, 'one'), ('1', 'another one')])
+        self.assertRaises(
+            ValueError, vocabulary.SimpleVocabulary.fromItems,
+            [(0, 'one'), (1, 'one')])
 
+    def test_nonunique_token_message(self):
+        try:
+            vocabulary.SimpleVocabulary.fromValues([2, '2'])
+        except ValueError, e:
+            self.assertEquals(e.message, "term tokens must be unique: '2'")
+
+    def test_nonunique_token_message(self):
+        try:
+            vocabulary.SimpleVocabulary.fromItems([(0, 'one'), (1, 'one')])
+        except ValueError, e:
+            self.assertEquals(e.message, "term values must be unique: 'one'")
+
     def test_overriding_createTerm(self):
         class MyTerm(object):
             def __init__(self, value):

Modified: zope.schema/trunk/src/zope/schema/vocabulary.py
===================================================================
--- zope.schema/trunk/src/zope/schema/vocabulary.py	2010-09-01 00:23:26 UTC (rev 116069)
+++ zope.schema/trunk/src/zope/schema/vocabulary.py	2010-09-01 00:33:13 UTC (rev 116070)
@@ -59,11 +59,14 @@
         self.by_token = {}
         self._terms = terms
         for term in self._terms:
+            if term.value in self.by_value:
+                raise ValueError(
+                    'term values must be unique: %s' % repr(term.value))
+            if term.token in self.by_token:
+                raise ValueError(
+                    'term tokens must be unique: %s' % repr(term.token))
             self.by_value[term.value] = term
             self.by_token[term.token] = term
-        if not (len(self.by_value) == len(self.by_token) == len(terms)):
-            raise ValueError(
-                'Supplied vocabulary values resulted in duplicate term tokens')
         if interfaces:
             directlyProvides(self, *interfaces)
 



More information about the checkins mailing list