|
From: <sub...@co...> - 2007-10-17 18:08:55
|
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
+
|