Author: ianb
Date: 2007-10-17 12:08:56 -0600 (Wed, 17 Oct 2007)
New Revision: 3085

Modified:
   FormEncode/trunk/docs/news.txt
   FormEncode/trunk/formencode/validators.py
   FormEncode/trunk/tests/test_validators.py
Log:
Improve the UnicodeString handling of non-str/non-unicode inputs

Modified: FormEncode/trunk/docs/news.txt
===================================================================
--- FormEncode/trunk/docs/news.txt      2007-10-17 17:21:44 UTC (rev 3084)
+++ FormEncode/trunk/docs/news.txt      2007-10-17 18:08:56 UTC (rev 3085)
@@ -35,6 +35,8 @@
   unicode if an ``encoding`` parameter is given.  Empty values are
   handled better.
 
+* ``validators.UnicodeString`` properly handles non-Unicode inputs.
+
 0.7.1
 -----
 

Modified: FormEncode/trunk/formencode/validators.py
===================================================================
--- FormEncode/trunk/formencode/validators.py   2007-10-17 17:21:44 UTC (rev 
3084)
+++ FormEncode/trunk/formencode/validators.py   2007-10-17 18:08:56 UTC (rev 
3085)
@@ -1088,23 +1088,32 @@
         self.outputEncoding = outputEncoding or self.encoding
     
     def _to_python(self, value, state):
-        if value:
-            if isinstance(value, unicode):
+        if not value:
+            return u''
+        if isinstance(value, unicode):
+            return value
+        if not isinstance(value, unicode):
+            if hasattr(value, '__unicode__'):
+                value = unicode(value)
                 return value
-            if hasattr(value, '__unicode__'):
-                return unicode(value)
-            try:
-                return unicode(value, self.inputEncoding)
-            except UnicodeDecodeError:
-                raise Invalid(self.message('badEncoding', state), value, state)
-        return u''
+            else:
+                value = str(value)
+        try:
+            return unicode(value, self.inputEncoding)
+        except UnicodeDecodeError:
+            raise Invalid(self.message('badEncoding', state), value, state)
+        except TypeError:
+            raise Invalid(self.message('badType', state, type=type(value), 
value=value), value, state)
     
     def _from_python(self, value, state):
-        if hasattr(value, '__unicode__'):
-            value = unicode(value)
+        if not isinstance(value, unicode):
+            if hasattr(value, '__unicode__'):
+                value = unicode(value)
+            else:
+                value = str(value)
         if isinstance(value, unicode):
-            return value.encode(self.outputEncoding)
-        return str(value)
+            value = value.encode(self.outputEncoding)
+        return value
 
 class Set(FancyValidator):
 

Modified: FormEncode/trunk/tests/test_validators.py
===================================================================
--- FormEncode/trunk/tests/test_validators.py   2007-10-17 17:21:44 UTC (rev 
3084)
+++ FormEncode/trunk/tests/test_validators.py   2007-10-17 18:08:56 UTC (rev 
3085)
@@ -1,4 +1,4 @@
-from formencode.validators import String, Invalid
+from formencode.validators import String, UnicodeString, Invalid
 
 def validate(validator, value):
     try:
@@ -38,3 +38,8 @@
     assert sv.from_python(2) == "2"
     assert sv.from_python([]) == ""
 
+def test_unicode():
+    un = UnicodeString()
+    assert un.to_python(12) == u'12'
+    assert type(un.to_python(12)) is unicode
+    


-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
FormEncode-CVS mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/formencode-cvs

Reply via email to