Products.validation/no_at: Python 3 compatibilty

Tom Gross <jenkins-z4DKO/[email protected]> Sun, 30 Jul 2017 14:34:17 -0700 (PDT)
Newsgroups gmane.comp.web.zope.plone.cvs
Message-ID <[email protected]>
Repository: Products.validation
Branch: refs/heads/no_at
Date: 2017-07-30T21:05:04Z
Author: Tom Gross (tomgross) <[email protected]>
Commit: https://github.com/plone/Products.validation/commit/2df8a51758dd7ef7abdb203f7964c73dff8883e3

Python 3 compatibilty

Files changed:
M Products/validation/__init__.py
M Products/validation/chain.py
M Products/validation/i18n.py
M Products/validation/interfaces/__init__.py
M Products/validation/service.py
M Products/validation/tests/test_validation.py
M Products/validation/validators/BaseValidators.py
M Products/validation/validators/ExpressionValidator.py
M Products/validation/validators/IdValidator.py
M Products/validation/validators/RegexValidator.py
M Products/validation/validators/__init__.py
M setup.py

diff --git a/Products/validation/__init__.py b/Products/validation/__init__.py
index eb584bb..f32bf23 100644
--- a/Products/validation/__init__.py
+++ b/Products/validation/__init__.py
@@ -1,3 +1,7 @@
-from config import validation
-from chain import ValidationChain, V_REQUIRED, V_SUFFICIENT
-from exceptions import UnknowValidatorError, FalseValidatorError, AlreadyRegisteredValidatorError
+from Products.validation.config import validation
+from Products.validation.chain import ValidationChain
+from Products.validation.chain import V_REQUIRED
+from Products.validation.chain import V_SUFFICIENT
+from Products.validation.exceptions import UnknowValidatorError
+from Products.validation.exceptions import FalseValidatorError
+from Products.validation.exceptions import AlreadyRegisteredValidatorError
diff --git a/Products/validation/chain.py b/Products/validation/chain.py
index 966359a..6319feb 100644
--- a/Products/validation/chain.py
+++ b/Products/validation/chain.py
@@ -1,12 +1,13 @@
+from Products.validation.config import validation as validationService
+from Products.validation.exceptions import ValidatorError
 from Products.validation.interfaces.IValidator import IValidationChain
 from zope.interface import implementer
 
-from types import TupleType, ListType
-from config import validation as validationService
-from exceptions import ValidatorError
 
 V_REQUIRED   = 1
 V_SUFFICIENT = 2
+TupleType = type((0,1))
+ListType = type([])
 
 
 @implementer(IValidationChain)
@@ -140,7 +141,7 @@ def __call__(self, value, *args, **kwargs):
                 elif mode == V_REQUIRED:
                     continue    # go on
                 else:
-                    raise ValidatorError, 'Unknown mode %s' % mode
+                    raise ValidatorError('Unknown mode {0}'.format(mode))
             else:
                 if mode == V_SUFFICIENT:
                     if isinstance(result, basestring):
@@ -154,7 +155,7 @@ def __call__(self, value, *args, **kwargs):
                     failed = True
                     break    # fatal error, stop and fail
                 else:
-                    raise ValidatorError, 'Unknown mode %s' % mode
+                    raise ValidatorError('Unknown mode {0}'.format(mode))
 
         if failed:
             return '\n'.join([
diff --git a/Products/validation/i18n.py b/Products/validation/i18n.py
index 6c931d6..f01953c 100644
--- a/Products/validation/i18n.py
+++ b/Products/validation/i18n.py
@@ -2,18 +2,24 @@
 from zope.i18n import translate
 from zope.i18nmessageid import Message
 
+import six
+
 
 PloneMessageFactory = MessageFactory('plone')
 
-def safe_unicode(value):
-    if isinstance(value, unicode):
+if six.PY2:
+    def safe_unicode(value):
+        if isinstance(value, unicode):
+            return value
+        elif isinstance(value, str):
+            try:
+                return unicode(value, 'utf-8')
+            except UnicodeDecodeError:
+                return unicode(value, 'utf-8', 'ignore')
+        return str(value)
+else:
+    def safe_unicode(value):
         return value
-    elif isinstance(value, str):
-        try:
-            return unicode(value, 'utf-8')
-        except UnicodeDecodeError:
-            return unicode(value, 'utf-8', 'ignore')
-    return str(value)
 
 
 def recursiveTranslate(message, **kwargs):
diff --git a/Products/validation/interfaces/__init__.py b/Products/validation/interfaces/__init__.py
index 47a8423..28454b5 100644
--- a/Products/validation/interfaces/__init__.py
+++ b/Products/validation/interfaces/__init__.py
@@ -1,3 +1,3 @@
 # backward compatibility
-from IValidator import IValidator as ivalidator
-from IValidationService import IValidationService as ivalidationService
+from Products.validation.interfaces.IValidator import IValidator as ivalidator
+from Products.validation.interfaces.IValidationService import IValidationService as ivalidationService
diff --git a/Products/validation/service.py b/Products/validation/service.py
index eb86f18..2a495d9 100644
--- a/Products/validation/service.py
+++ b/Products/validation/service.py
@@ -1,9 +1,12 @@
+from Products.validation.exceptions import FalseValidatorError
+from Products.validation.exceptions import UnknowValidatorError
+from Products.validation.exceptions import AlreadyRegisteredValidatorError
 from Products.validation.interfaces.IValidationService import IValidationService
 from Products.validation.interfaces.IValidator import IValidator
 from zope.interface import implementer
 
-from exceptions import UnknowValidatorError, FalseValidatorError, AlreadyRegisteredValidatorError
-from types import StringType, StringTypes
+import six
+
 
 @implementer(IValidationService)
 class Service:
@@ -18,19 +21,19 @@ def validate(self, name_or_validator, value, *args, **kwargs):
     __call__ = validate
 
     def validatorFor(self, name_or_validator):
-        if type(name_or_validator) in StringTypes:
+        if type(name_or_validator) in six.string_types:
             try:
                 return self._validator[name_or_validator]
             except KeyError:
-                raise UnknowValidatorError, name_or_validator
+                raise UnknowValidatorError(name_or_validator)
         elif IValidator.providedBy(name_or_validator):
             return name_or_validator
         else:
-            raise FalseValidatorError, name_or_validator
+            raise FalseValidatorError(name_or_validator)
 
     def register(self, validator): #XXX
         if not IValidator.providedBy(validator):
-            raise FalseValidatorError, validator
+            raise FalseValidatorError(validator)
         name = validator.name
         # The following code prevents refreshing
         ##if self._validator.has_key(name):
@@ -47,7 +50,7 @@ def values(self):
         return [v for k, v in self.items()]
 
     def unregister(self, name_or_validator):
-        if type(name_or_validator) is StringType:
+        if type(name_or_validator) == six.binary_type:
             name = name_or_validator
         elif IValidator.implementedBy(name_or_validator):
             name = name_or_validator.name
diff --git a/Products/validation/tests/test_validation.py b/Products/validation/tests/test_validation.py
index 5c67230..335e133 100644
--- a/Products/validation/tests/test_validation.py
+++ b/Products/validation/tests/test_validation.py
@@ -1,7 +1,10 @@
-import unittest
+# -*- coding: utf-8 -*-
+from Products.validation import validation
+
 import doctest
+import six
+import unittest
 
-from Products.validation import validation
 
 class TestValidation(unittest.TestCase):
 
@@ -20,8 +23,14 @@ def test_isDecimal(self):
     def test_isPrintable(self):
         v = validation.validatorFor('isPrintable')
         self.assertEqual(v('text'), 1)
-        self.assertEqual(v('\u203'), u"Validation failed(isPrintable): '\\u203' contains unprintable characters")
-        self.assertEqual(v(10), u"Validation failed(isPrintable): 10 of type <type 'int'>, expected 'string'")
+        self.assertEqual(
+            v('\u203'),
+            u"Validation failed(isPrintable): '\\u203' contains unprintable characters"
+        )
+        self.assertEqual(
+            v(10),
+            u"Validation failed(isPrintable): 10 of type <type 'int'>, expected 'string'"
+        )
 
     def test_isSSN(self):
         v = validation.validatorFor('isSSN')
diff --git a/Products/validation/validators/BaseValidators.py b/Products/validation/validators/BaseValidators.py
index 5fbd093..c956e0c 100644
--- a/Products/validation/validators/BaseValidators.py
+++ b/Products/validation/validators/BaseValidators.py
@@ -1,5 +1,5 @@
-from RegexValidator import RegexValidator
-from RangeValidator import RangeValidator
+from Products.validation.validators.RegexValidator import RegexValidator
+from Products.validation.validators.RangeValidator import RangeValidator
 from Products.validation.i18n import PloneMessageFactory as _
 
 # protocols for isURL validator, the secure (*s) variants are automagically
diff --git a/Products/validation/validators/ExpressionValidator.py b/Products/validation/validators/ExpressionValidator.py
index ccf1d92..b92a595 100644
--- a/Products/validation/validators/ExpressionValidator.py
+++ b/Products/validation/validators/ExpressionValidator.py
@@ -45,8 +45,8 @@ class ExpressionValidator:
     True
 
     now lets fail a test
-    >>> val(4,c)
-    u'validation failed, expr was:python: int(value) == 5'
+    >>> str(val(4,c))
+    'validation failed, expr was:python: int(value) == 5'
 
     It is also possible to specify the error string
 
diff --git a/Products/validation/validators/IdValidator.py b/Products/validation/validators/IdValidator.py
index f98181d..0e2c6f2 100644
--- a/Products/validation/validators/IdValidator.py
+++ b/Products/validation/validators/IdValidator.py
@@ -40,11 +40,11 @@ def __call__(self, id, instance, *args, **kwargs):
                         mapping = {'id': safe_unicode(id)})
                 return recursiveTranslate(msg, **kwargs)
 
-            # objet manager test
+            # objcet manager test
             # XXX: This is f***ed
             try:
                 ObjectManager.checkValidId(self, id, allow_dup=1)
-            except BadRequest, m:
+            except BadRequest as m:
                 return str(m)
             return 1
 
diff --git a/Products/validation/validators/RegexValidator.py b/Products/validation/validators/RegexValidator.py
index 148e6f7..fec27f6 100644
--- a/Products/validation/validators/RegexValidator.py
+++ b/Products/validation/validators/RegexValidator.py
@@ -1,15 +1,18 @@
 from Products.validation.interfaces.IValidator import IValidator
-from zope.interface import implementer
 from Products.validation.i18n import PloneMessageFactory as _
 from Products.validation.i18n import recursiveTranslate
 from Products.validation.i18n import safe_unicode
+from zope.interface import implementer
+
 import re
-from types import StringType
+import six
+
 
 def ignoreRE(value, expression):
     ignore = re.compile(expression)
     return ignore.sub('', value)
 
+
 @implementer(IValidator)
 class RegexValidator:
 
@@ -40,7 +43,7 @@ def __setstate__(self, dict):
         self.compileRegex()
 
     def __call__(self, value, *args, **kwargs):
-        if type(value) != StringType:
+        if type(value) != six.binary_type:
             msg =  _(u"Validation failed($name): $value of type $type, expected 'string'",
                      mapping = {
                         'name' : safe_unicode(self.name),
diff --git a/Products/validation/validators/__init__.py b/Products/validation/validators/__init__.py
index f9e3033..f6abbfa 100644
--- a/Products/validation/validators/__init__.py
+++ b/Products/validation/validators/__init__.py
@@ -1,19 +1,19 @@
-from RegexValidator import RegexValidator
-from RangeValidator import RangeValidator
-from ExpressionValidator import ExpressionValidator
+from Products.validation.validators.RegexValidator import RegexValidator
+from Products.validation.validators.RangeValidator import RangeValidator
+from Products.validation.validators.ExpressionValidator import ExpressionValidator
 
 validators = []
 
-from BaseValidators import baseValidators
+from Products.validation.validators.BaseValidators import baseValidators
 validators.extend(baseValidators)
 
-from EmptyValidator import validatorList
+from Products.validation.validators.EmptyValidator import validatorList
 validators.extend(validatorList)
 
-from SupplValidators import validatorList
+from Products.validation.validators.SupplValidators import validatorList
 validators.extend(validatorList)
 
-from IdValidator import validatorList
+from Products.validation.validators.IdValidator import validatorList
 validators.extend(validatorList)
 
 
diff --git a/setup.py b/setup.py
index 17434c0..515e5dc 100644
--- a/setup.py
+++ b/setup.py
@@ -30,6 +30,7 @@
     extras_require={},
     install_requires=[
         'setuptools',
+        'six',
         'zope.i18n',
         'zope.i18nmessageid',
         'zope.interface',



------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot