[Checkins] SVN: zope.schema/trunk/ - Port to Python 3. This adds a dependency on six and removes support for

Brian Sutherland jinty at web.de
Fri Oct 14 05:51:08 EST 2011


Log message for revision 123093:
  - Port to Python 3. This adds a dependency on six and removes support for
    Python 2.5.
  
  - Fix deprecated unittest methods.
  

Changed:
  U   zope.schema/trunk/CHANGES.txt
  U   zope.schema/trunk/setup.py
  U   zope.schema/trunk/src/zope/schema/README.txt
  U   zope.schema/trunk/src/zope/schema/_bootstrapfields.py
  U   zope.schema/trunk/src/zope/schema/_bootstrapinterfaces.py
  U   zope.schema/trunk/src/zope/schema/_field.py
  U   zope.schema/trunk/src/zope/schema/_messageid.py
  U   zope.schema/trunk/src/zope/schema/_schema.py
  U   zope.schema/trunk/src/zope/schema/fieldproperty.py
  U   zope.schema/trunk/src/zope/schema/fields.txt
  U   zope.schema/trunk/src/zope/schema/interfaces.py
  U   zope.schema/trunk/src/zope/schema/sources.txt
  U   zope.schema/trunk/src/zope/schema/tests/__init__.py
  U   zope.schema/trunk/src/zope/schema/tests/states.py
  U   zope.schema/trunk/src/zope/schema/tests/test_accessors.py
  U   zope.schema/trunk/src/zope/schema/tests/test_boolfield.py
  U   zope.schema/trunk/src/zope/schema/tests/test_choice.py
  U   zope.schema/trunk/src/zope/schema/tests/test_containerfield.py
  U   zope.schema/trunk/src/zope/schema/tests/test_date.py
  U   zope.schema/trunk/src/zope/schema/tests/test_datetime.py
  U   zope.schema/trunk/src/zope/schema/tests/test_decimalfield.py
  U   zope.schema/trunk/src/zope/schema/tests/test_dictfield.py
  U   zope.schema/trunk/src/zope/schema/tests/test_docs.py
  U   zope.schema/trunk/src/zope/schema/tests/test_dotted_name.py
  U   zope.schema/trunk/src/zope/schema/tests/test_equality.py
  U   zope.schema/trunk/src/zope/schema/tests/test_field.py
  U   zope.schema/trunk/src/zope/schema/tests/test_fieldproperty.py
  U   zope.schema/trunk/src/zope/schema/tests/test_floatfield.py
  U   zope.schema/trunk/src/zope/schema/tests/test_interfacefield.py
  U   zope.schema/trunk/src/zope/schema/tests/test_intfield.py
  U   zope.schema/trunk/src/zope/schema/tests/test_iterablefield.py
  U   zope.schema/trunk/src/zope/schema/tests/test_listfield.py
  U   zope.schema/trunk/src/zope/schema/tests/test_objectfield.py
  U   zope.schema/trunk/src/zope/schema/tests/test_schema.py
  U   zope.schema/trunk/src/zope/schema/tests/test_setfield.py
  U   zope.schema/trunk/src/zope/schema/tests/test_states.py
  U   zope.schema/trunk/src/zope/schema/tests/test_strfield.py
  U   zope.schema/trunk/src/zope/schema/tests/test_timedelta.py
  U   zope.schema/trunk/src/zope/schema/tests/test_tuplefield.py
  U   zope.schema/trunk/src/zope/schema/tests/test_vocabulary.py
  U   zope.schema/trunk/src/zope/schema/validation.txt
  U   zope.schema/trunk/src/zope/schema/vocabulary.py

-=-
Modified: zope.schema/trunk/CHANGES.txt
===================================================================
--- zope.schema/trunk/CHANGES.txt	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/CHANGES.txt	2011-10-14 10:51:07 UTC (rev 123093)
@@ -2,11 +2,14 @@
 CHANGES
 =======
 
-3.8.2 (unreleased)
+3.9.0 (unreleased)
 ------------------
 
-- ...
+- Fix deprecated unittest methods.
 
+- Port to Python 3. This adds a dependency on six and removes support for
+  Python 2.5.
+
 3.8.1 (2011-09-23)
 ------------------
 

Modified: zope.schema/trunk/setup.py
===================================================================
--- zope.schema/trunk/setup.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/setup.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -82,9 +82,22 @@
       extras_require={'test': ['zope.testing'],
                       'docs': ['z3c.recipe.sphinxdoc']},
       install_requires=['setuptools',
-                        'zope.interface',
+                        'zope.interface >= 3.6.0',
                         'zope.event',
+                        'six',
                        ],
+      classifiers=[
+        "Development Status :: 5 - Production/Stable",
+        "Intended Audience :: Developers",
+        "License :: OSI Approved :: Zope Public License",
+        "Operating System :: OS Independent",
+        "Programming Language :: Python :: 2.6",
+        "Programming Language :: Python :: 2.7",
+        "Programming Language :: Python :: 3",
+        "Programming Language :: Python :: 3.1",
+        "Programming Language :: Python :: 3.2",
+        "Topic :: Software Development :: Libraries :: Python Modules",
+      ],
       include_package_data = True,
       zip_safe = False,
       test_suite='__main__.alltests',

Modified: zope.schema/trunk/src/zope/schema/README.txt
===================================================================
--- zope.schema/trunk/src/zope/schema/README.txt	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/README.txt	2011-10-14 10:51:07 UTC (rev 123093)
@@ -35,24 +35,25 @@
 
   >>> import zope.interface
   >>> import zope.schema
+  >>> from six import u, b
 
   >>> class IBookmark(zope.interface.Interface):
   ...     title = zope.schema.TextLine(
-  ...         title=u'Title',
-  ...         description=u'The title of the bookmark',
+  ...         title=u('Title'),
+  ...         description=u('The title of the bookmark'),
   ...         required=True)
   ...
   ...     url = zope.schema.URI(
-  ...         title=u'Bookmark URL',
-  ...         description=u'URL of the Bookmark',
+  ...         title=u('Bookmark URL'),
+  ...         description=u('URL of the Bookmark'),
   ...         required=True)
   ...
 
 Now we create a class that implements this interface and create an instance of
 it:
 
-  >>> class Bookmark(object):
-  ...     zope.interface.implements(IBookmark)
+  >>> @zope.interface.implementer(IBookmark)
+  ... class Bookmark(object):
   ...
   ...     title = None
   ...     url = None
@@ -63,8 +64,8 @@
 by first validating and then setting the value on the object. The first step
 is to define some data:
 
-  >>> title = u'Zope 3 Website'
-  >>> url = 'http://dev.zope.org/Zope3'
+  >>> title = u('Zope 3 Website')
+  >>> url = b('http://dev.zope.org/Zope3')
 
 Now we, get the fields from the interface:
 
@@ -85,12 +86,12 @@
 If the validation is successful, ``None`` is returned. If a validation error
 occurs a ``ValidationError`` will be raised; for example:
 
-  >>> url_bound.validate(u'http://zope.org/foo')
+  >>> url_bound.validate(u('http://zope.org/foo'))
   Traceback (most recent call last):
   ...
   WrongType: (u'http://zope.org/foo', <type 'str'>, 'url')
 
-  >>> url_bound.validate('foo.bar')
+  >>> url_bound.validate(b('foo.bar'))
   Traceback (most recent call last):
   ...
   InvalidURI: foo.bar
@@ -128,16 +129,16 @@
     >>> class IContact(zope.interface.Interface):
     ...     """Provides access to basic contact information."""
     ...
-    ...     first = zope.schema.TextLine(title=u"First name")
+    ...     first = zope.schema.TextLine(title=u("First name"))
     ...
-    ...     last = zope.schema.TextLine(title=u"Last name")
+    ...     last = zope.schema.TextLine(title=u("Last name"))
     ...
-    ...     email = zope.schema.TextLine(title=u"Electronic mail address")
+    ...     email = zope.schema.TextLine(title=u("Electronic mail address"))
     ...
-    ...     address = zope.schema.Text(title=u"Postal address")
+    ...     address = zope.schema.Text(title=u("Postal address"))
     ...
     ...     postalCode = zope.schema.TextLine(
-    ...         title=u"Postal code",
+    ...         title=u("Postal code"),
     ...         constraint=re.compile("\d{5,5}(-\d{4,4})?$").match)
 
 ``TextLine`` is a field and expresses that an attribute is a single line
@@ -161,8 +162,8 @@
 Now you can see if an instance of ``Contact`` actually implements the
 schema:
 
-    >>> someone = Contact(u'Tim', u'Roberts', u'tim at roberts', u'',
-    ...                   u'12032-3492')
+    >>> someone = Contact(u('Tim'), u('Roberts'), u('tim at roberts'), u(''),
+    ...                   u('12032-3492'))
 
     >>> for field in zope.schema.getFields(IContact).values():
     ...     bound = field.bind(someone)

Modified: zope.schema/trunk/src/zope/schema/_bootstrapfields.py
===================================================================
--- zope.schema/trunk/src/zope/schema/_bootstrapfields.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/_bootstrapfields.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -17,7 +17,8 @@
 
 import sys
 
-from zope.interface import Attribute, providedBy, implements
+from six import u, b, text_type, integer_types
+from zope.interface import Attribute, providedBy, implementer
 from zope.schema._bootstrapinterfaces import StopValidation
 from zope.schema._bootstrapinterfaces import IFromUnicode
 from zope.schema._bootstrapinterfaces import RequiredMissing, WrongType
@@ -102,7 +103,7 @@
     interface = None
     _Element__tagged_values = None
 
-    def __init__(self, title=u'', description=u'', __name__='',
+    def __init__(self, title=u(''), description=u(''), __name__='',
                  required=True, readonly=False, constraint=None, default=None,
                  defaultFactory=None, missing_value=__missing_value_marker):
         """Pass in field values as keyword parameters.
@@ -122,11 +123,11 @@
         >>> f.__doc__, f.title, f.description
         ('', u'', u'')
 
-        >>> f = Field(title=u'sample')
+        >>> f = Field(title=u('sample'))
         >>> f.__doc__, f.title, f.description
         (u'sample', u'sample', u'')
 
-        >>> f = Field(title=u'sample', description=u'blah blah\\nblah')
+        >>> f = Field(title=u('sample'), description=u('blah blah\\nblah'))
         >>> f.__doc__, f.title, f.description
         (u'sample\\n\\nblah blah\\nblah', u'sample', u'blah blah\\nblah')
         """
@@ -304,25 +305,24 @@
             raise TooLong(value, self.max_length)
 
 
+ at implementer(IFromUnicode)
 class Text(MinMaxLen, Field):
     """A field containing text used for human discourse."""
-    _type = unicode
+    _type = text_type
 
-    implements(IFromUnicode)
-
     def __init__(self, *args, **kw):
         super(Text, self).__init__(*args, **kw)
 
     def fromUnicode(self, str):
         """
         >>> t = Text(constraint=lambda v: 'x' in v)
-        >>> t.fromUnicode("foo x spam")
+        >>> t.fromUnicode(b("foo x spam"))
         Traceback (most recent call last):
         ...
         WrongType: ('foo x spam', <type 'unicode'>, '')
-        >>> t.fromUnicode(u"foo x spam")
+        >>> t.fromUnicode(u("foo x spam"))
         u'foo x spam'
-        >>> t.fromUnicode(u"foo spam")
+        >>> t.fromUnicode(u("foo spam"))
         Traceback (most recent call last):
         ...
         ConstraintNotSatisfied: foo spam
@@ -410,12 +410,11 @@
         return v
 
 
+ at implementer(IFromUnicode)
 class Int(Orderable, Field):
     """A field representing an Integer."""
-    _type = int, long
+    _type = integer_types
 
-    implements(IFromUnicode)
-
     def __init__(self, *args, **kw):
         super(Int, self).__init__(*args, **kw)
 

Modified: zope.schema/trunk/src/zope/schema/_bootstrapinterfaces.py
===================================================================
--- zope.schema/trunk/src/zope/schema/_bootstrapinterfaces.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/_bootstrapinterfaces.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -35,6 +35,13 @@
             return -1
         return cmp(self.args, other.args)
 
+    def __eq__(self, other):
+        if not hasattr(other, 'args'):
+            return False
+        return self.args == other.args
+
+    __hash__ = zope.interface.Invalid.__hash__ # python3
+
     def __repr__(self):
         return '%s(%s)' % (self.__class__.__name__,
             ', '.join(repr(arg) for arg in self.args))

Modified: zope.schema/trunk/src/zope/schema/_field.py
===================================================================
--- zope.schema/trunk/src/zope/schema/_field.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/_field.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -22,8 +22,9 @@
 from datetime import datetime, date, timedelta, time
 from zope.event import notify
 
-from zope.interface import classImplements, implements, Interface
+from zope.interface import classImplements, implementer, Interface
 from zope.interface.interfaces import IInterface, IMethod
+from six import u, b, text_type, string_types, binary_type, PY3
 
 from zope.schema.interfaces import IField
 from zope.schema.interfaces import IMinMaxLen, IText, ITextLine
@@ -73,38 +74,46 @@
 classImplements(Int, IInt)
 
 
+ at implementer(ISourceText)
 class SourceText(Text):
     __doc__ = ISourceText.__doc__
-    implements(ISourceText)
-    _type = unicode
+    _type = text_type
 
 
+ at implementer(IBytes, IFromUnicode)
 class Bytes(MinMaxLen, Field):
     __doc__ = IBytes.__doc__
-    implements(IBytes, IFromUnicode)
 
-    _type = str
+    _type = binary_type
 
     def fromUnicode(self, u):
         """
-        >>> b = Bytes(constraint=lambda v: 'x' in v)
+        >>> obj = Bytes(constraint=lambda v: b('x') in v)
 
-        >>> b.fromUnicode(u" foo x.y.z bat")
+        >>> obj.fromUnicode(u(" foo x.y.z bat"))
         ' foo x.y.z bat'
-        >>> b.fromUnicode(u" foo y.z bat")
+        >>> obj.fromUnicode(u(" foo y.z bat"))
         Traceback (most recent call last):
         ...
         ConstraintNotSatisfied:  foo y.z bat
 
         """
-        v = str(u)
+        if PY3:
+            v = b(u)
+        else:
+            v = str(u)
         self.validate(v)
         return v
 
+# for things which are of the str type on both Python 2 and 3
+if PY3:
+    _Str = Text
+else:
+    _Str = Bytes
 
-class ASCII(Bytes):
+ at implementer(IASCII)
+class ASCII(_Str):
     __doc__ = IASCII.__doc__
-    implements(IASCII)
 
     def _validate(self, value):
         """
@@ -133,29 +142,32 @@
             raise InvalidValue
 
 
+ at implementer(IBytesLine)
 class BytesLine(Bytes):
     """A Text field with no newlines."""
 
-    implements(IBytesLine)
-
     def constraint(self, value):
         # TODO: we should probably use a more general definition of newlines
-        return '\n' not in value
+        return b('\n') not in value
 
+# for things which are of the str type on both Python 2 and 3
+if PY3:
+    _StrLine = TextLine
+else:
+    _StrLine = BytesLine
 
+ at implementer(IASCIILine)
 class ASCIILine(ASCII):
     __doc__ = IASCIILine.__doc__
 
-    implements(IASCIILine)
-
     def constraint(self, value):
         # TODO: we should probably use a more general definition of newlines
-        return '\n' not in value
+        return b('\n') not in value
 
 
+ at implementer(IFloat, IFromUnicode)
 class Float(Orderable, Field):
     __doc__ = IFloat.__doc__
-    implements(IFloat, IFromUnicode)
     _type = float
 
     def __init__(self, *args, **kw):
@@ -176,9 +188,9 @@
         return v
 
 
+ at implementer(IDecimal, IFromUnicode)
 class Decimal(Orderable, Field):
     __doc__ = IDecimal.__doc__
-    implements(IDecimal, IFromUnicode)
     _type = decimal.Decimal
 
     def __init__(self, *args, **kw):
@@ -205,18 +217,18 @@
         return v
 
 
+ at implementer(IDatetime)
 class Datetime(Orderable, Field):
     __doc__ = IDatetime.__doc__
-    implements(IDatetime)
     _type = datetime
 
     def __init__(self, *args, **kw):
         super(Datetime, self).__init__(*args, **kw)
 
 
+ at implementer(IDate)
 class Date(Orderable, Field):
     __doc__ = IDate.__doc__
-    implements(IDate)
     _type = date
 
     def _validate(self, value):
@@ -225,28 +237,28 @@
             raise WrongType(value, self._type, self.__name__)
 
 
+ at implementer(ITimedelta)
 class Timedelta(Orderable, Field):
     __doc__ = ITimedelta.__doc__
-    implements(ITimedelta)
     _type = timedelta
 
 
+ at implementer(ITime)
 class Time(Orderable, Field):
     __doc__ = ITime.__doc__
-    implements(ITime)
     _type = time
 
 
+ at implementer(IChoice, IFromUnicode)
 class Choice(Field):
     """Choice fields can have a value found in a constant or dynamic set of
     values given by the field definition.
     """
-    implements(IChoice, IFromUnicode)
 
     def __init__(self, values=None, vocabulary=None, source=None, **kw):
         """Initialize object."""
         if vocabulary is not None:
-            assert (isinstance(vocabulary, basestring)
+            assert (isinstance(vocabulary, string_types)
                     or IBaseVocabulary.providedBy(vocabulary))
             assert source is None, (
                 "You cannot specify both source and vocabulary.")
@@ -262,7 +274,7 @@
         self.vocabularyName = None
         if values is not None:
             self.vocabulary = SimpleVocabulary.fromValues(values)
-        elif isinstance(vocabulary, (unicode, str)):
+        elif isinstance(vocabulary, string_types):
             self.vocabularyName = vocabulary
         else:
             assert (ISource.providedBy(vocabulary) or
@@ -296,16 +308,16 @@
 
     def fromUnicode(self, str):
         """
-        >>> from vocabulary import SimpleVocabulary
+        >>> from zope.schema.vocabulary import SimpleVocabulary
         >>> t = Choice(
-        ...     vocabulary=SimpleVocabulary.fromValues([u'foo',u'bar']))
+        ...     vocabulary=SimpleVocabulary.fromValues([u('foo'),u('bar')]))
         >>> IFromUnicode.providedBy(t)
         True
-        >>> t.fromUnicode(u"baz")
+        >>> t.fromUnicode(u("baz"))
         Traceback (most recent call last):
         ...
         ConstraintNotSatisfied: baz
-        >>> t.fromUnicode(u"foo")
+        >>> t.fromUnicode(u("foo"))
         u'foo'
         """
         self.validate(str)
@@ -327,9 +339,9 @@
             raise ConstraintNotSatisfied(value)
 
 
+ at implementer(IInterfaceField)
 class InterfaceField(Field):
     __doc__ = IInterfaceField.__doc__
-    implements(IInterfaceField)
 
     def _validate(self, value):
         super(InterfaceField, self)._validate(value)
@@ -352,9 +364,9 @@
 
         To validate a sequence of various values:
 
-            >>> errors = _validate_sequence(field, ('foo', u'bar', 1))
+            >>> errors = _validate_sequence(field, (b('foo'), u('bar'), 1))
             >>> errors
-            [WrongType('foo', <type 'unicode'>, ''), WrongType(1, <type 'unicode'>, '')]
+            [WrongType(b'foo', <type 'unicode'>, ''), WrongType(1, <type 'unicode'>, '')]
 
         The only valid value in the sequence is the second item. The others
         generated errors.
@@ -362,9 +374,9 @@
         We can use the optional errors argument to collect additional errors
         for a new sequence:
 
-        >>> errors = _validate_sequence(field, (2, u'baz'), errors)
+        >>> errors = _validate_sequence(field, (2, u('baz')), errors)
         >>> errors
-        [WrongType('foo', <type 'unicode'>, ''), WrongType(1, <type 'unicode'>, ''), WrongType(2, <type 'unicode'>, '')]
+        [WrongType(b'foo', <type 'unicode'>, ''), WrongType(1, <type 'unicode'>, ''), WrongType(2, <type 'unicode'>, '')]
 
     """
     if errors is None:
@@ -374,7 +386,7 @@
     for item in value:
         try:
             value_type.validate(item)
-        except ValidationError, error:
+        except ValidationError as error:
             errors.append(error)
     return errors
 
@@ -418,21 +430,21 @@
             _validate_uniqueness(value)
 
 
+ at implementer(ITuple)
 class Tuple(AbstractCollection):
     """A field representing a Tuple."""
-    implements(ITuple)
     _type = tuple
 
 
+ at implementer(IList)
 class List(AbstractCollection):
     """A field representing a List."""
-    implements(IList)
     _type = list
 
 
+ at implementer(ISet)
 class Set(AbstractCollection):
     """A field representing a set."""
-    implements(ISet)
     _type = set
 
     def __init__(self, **kw):
@@ -442,8 +454,8 @@
         super(Set, self).__init__(unique=True, **kw)
 
 
+ at implementer(IFrozenSet)
 class FrozenSet(AbstractCollection):
-    implements(IFrozenSet)
     _type = frozenset
 
     def __init__(self, **kw):
@@ -483,9 +495,9 @@
                     if IField.providedBy(attribute):
                         # validate attributes that are fields
                         attribute.validate(getattr(value, name))
-                except ValidationError, error:
+                except ValidationError as error:
                     errors.append(error)
-                except AttributeError, error:
+                except AttributeError as error:
                     # property for the given name is not implemented
                     errors.append(SchemaNotFullyImplemented(error))
     finally:
@@ -493,9 +505,9 @@
     return errors
 
 
+ at implementer(IObject)
 class Object(Field):
     __doc__ = IObject.__doc__
-    implements(IObject)
 
     def __init__(self, schema, **kw):
         if not IInterface.providedBy(schema):
@@ -528,20 +540,19 @@
         super(Object, self).set(object, value)
 
 
+ at implementer(IBeforeObjectAssignedEvent)
 class BeforeObjectAssignedEvent(object):
     """An object is going to be assigned to an attribute on another object."""
 
-    implements(IBeforeObjectAssignedEvent)
-
     def __init__(self, object, name, context):
         self.object = object
         self.name = name
         self.context = context
 
 
+ at implementer(IDict)
 class Dict(MinMaxLen, Iterable):
     """A field representing a Dict."""
-    implements(IDict)
     _type = dict
     key_type = None
     value_type = None
@@ -583,32 +594,30 @@
         return clone
 
 
-_isuri = re.compile(
-    # scheme
-    r"[a-zA-z0-9+.-]+:"
-    # non space (should be pickier)
-    r"\S*$").match
+_isuri = r"[a-zA-z0-9+.-]+:" # scheme
+_isuri += r"\S*$" # non space (should be pickier)
 
+_isuri_bytes = re.compile(_isuri.encode('ascii')).match
+_isuri = re.compile(_isuri).match
 
+ at implementer(IURI, IFromUnicode)
 class URI(BytesLine):
     """URI schema field
     """
 
-    implements(IURI, IFromUnicode)
-
     def _validate(self, value):
         """
         >>> uri = URI(__name__='test')
-        >>> uri.validate("http://www.python.org/foo/bar")
-        >>> uri.validate("DAV:")
-        >>> uri.validate("www.python.org/foo/bar")
+        >>> uri.validate(b("http://www.python.org/foo/bar"))
+        >>> uri.validate(b("DAV:"))
+        >>> uri.validate(b("www.python.org/foo/bar"))
         Traceback (most recent call last):
         ...
         InvalidURI: www.python.org/foo/bar
         """
 
         super(URI, self)._validate(value)
-        if _isuri(value):
+        if _isuri_bytes(value):
             return
 
         raise InvalidURI(value)
@@ -627,7 +636,7 @@
         ...
         InvalidURI: http://www.python.org/ foo/bar
         """
-        v = str(value.strip())
+        v = value.strip().encode('ascii')
         self.validate(v)
         return v
 
@@ -639,14 +648,13 @@
     r"$").match
 
 
-class Id(BytesLine):
+ at implementer(IId, IFromUnicode)
+class Id(_StrLine):
     """Id field
 
     Values of id fields must be either uris or dotted names.
     """
 
-    implements(IId, IFromUnicode)
-
     def _validate(self, value):
         """
         >>> id = Id(__name__='test')
@@ -674,7 +682,7 @@
         >>> id = Id(__name__='test')
         >>> id.fromUnicode("http://www.python.org/foo/bar")
         'http://www.python.org/foo/bar'
-        >>> id.fromUnicode(u" http://www.python.org/foo/bar ")
+        >>> id.fromUnicode(u(" http://www.python.org/foo/bar "))
         'http://www.python.org/foo/bar'
         >>> id.fromUnicode("http://www.python.org/ foo/bar")
         Traceback (most recent call last):
@@ -684,19 +692,20 @@
         'x.y.z'
 
         """
-        v = str(value.strip())
+        v = value.strip()
+        if not isinstance(v, self._type):
+            v = v.encode('ascii')
         self.validate(v)
         return v
 
 
-class DottedName(BytesLine):
+ at implementer(IDottedName)
+class DottedName(_StrLine):
     """Dotted name field.
 
     Values of DottedName fields must be Python-style dotted names.
     """
 
-    implements(IDottedName)
-
     def __init__(self, *args, **kw):
         """
         >>> DottedName(min_dots=-1)
@@ -797,6 +806,6 @@
                                     self.max_dots, value)
 
     def fromUnicode(self, value):
-        v = str(value.strip())
+        v = b(value.strip())
         self.validate(v)
         return v

Modified: zope.schema/trunk/src/zope/schema/_messageid.py
===================================================================
--- zope.schema/trunk/src/zope/schema/_messageid.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/_messageid.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -15,6 +15,7 @@
 try:
     from zope.i18nmessageid import MessageFactory
 except ImportError:
-    _ = lambda x: unicode(x)
+    from six import text_type
+    _ = lambda x: text_type(x)
 else:
     _ = MessageFactory("zope")

Modified: zope.schema/trunk/src/zope/schema/_schema.py
===================================================================
--- zope.schema/trunk/src/zope/schema/_schema.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/_schema.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -35,14 +35,11 @@
             fields[name] = attr
     return fields
 
-
 def getFieldsInOrder(schema,
-                     _fieldsorter=lambda x, y: cmp(x[1].order, y[1].order)):
+                     _field_key=lambda x: x[1].order):
     """Return a list of (name, value) tuples in native schema order.
     """
-    fields = getFields(schema).items()
-    fields.sort(_fieldsorter)
-    return fields
+    return sorted(getFields(schema).items(), key=_field_key)
 
 
 def getFieldNamesInOrder(schema):
@@ -82,13 +79,13 @@
             continue
         try:
             value = getattr(object, name)
-        except AttributeError, error:
+        except AttributeError as error:
             # property for the given name is not implemented
             errors.append((
                 name, zope.schema.interfaces.SchemaNotFullyImplemented(error)))
         else:
             try:
                 attribute.bind(object).validate(value)
-            except zope.schema.ValidationError, e:
+            except zope.schema.ValidationError as e:
                 errors.append((name, e))
     return errors

Modified: zope.schema/trunk/src/zope/schema/fieldproperty.py
===================================================================
--- zope.schema/trunk/src/zope/schema/fieldproperty.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/fieldproperty.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -50,7 +50,7 @@
     def __set__(self, inst, value):
         field = self.__field.bind(inst)
         field.validate(value)
-        if field.readonly and inst.__dict__.has_key(self.__name):
+        if field.readonly and self.__name in inst.__dict__:
             raise ValueError(self.__name, 'field is readonly')
         inst.__dict__[self.__name] = value
 

Modified: zope.schema/trunk/src/zope/schema/fields.txt
===================================================================
--- zope.schema/trunk/src/zope/schema/fields.txt	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/fields.txt	2011-10-14 10:51:07 UTC (rev 123093)
@@ -26,11 +26,12 @@
 
   >>> from zope.interface import Interface
   >>> from zope.schema import List, Float
+  >>> from six import u
   >>> class IInventoryItem(Interface):
   ...     pricePoints = List(
-  ...         title=u"Price Points",
+  ...         title=u("Price Points"),
   ...         unique=True,
-  ...         value_type=Float(title=u"Price", min=0.0)
+  ...         value_type=Float(title=u("Price"), min=0.0)
   ...     )
 
 This indicates several things.

Modified: zope.schema/trunk/src/zope/schema/interfaces.py
===================================================================
--- zope.schema/trunk/src/zope/schema/interfaces.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/interfaces.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -16,6 +16,7 @@
 __docformat__ = "reStructuredText"
 
 from zope.interface import Interface, Attribute
+from six import u, PY3
 
 from zope.schema._messageid import _
 
@@ -107,46 +108,46 @@
         """
 
     title = TextLine(
-        title=_(u"Title"),
-        description=_(u"A short summary or label"),
-        default=u"",
+        title=_("Title"),
+        description=_("A short summary or label"),
+        default=u(""),
         required=False,
         )
 
     description = Text(
-        title=_(u"Description"),
-        description=_(u"A description of the field"),
-        default=u"",
+        title=_("Description"),
+        description=_("A description of the field"),
+        default=u(""),
         required=False,
         )
 
     required = Bool(
-        title=_(u"Required"),
+        title=_("Required"),
         description=(
-        _(u"Tells whether a field requires its value to exist.")),
+        _("Tells whether a field requires its value to exist.")),
         default=True)
 
     readonly = Bool(
-        title=_(u"Read Only"),
-        description=_(u"If true, the field's value cannot be changed."),
+        title=_("Read Only"),
+        description=_("If true, the field's value cannot be changed."),
         required=False,
         default=False)
 
     default = Field(
-        title=_(u"Default Value"),
-        description=_(u"""The field default value may be None or a legal
+        title=_("Default Value"),
+        description=_("""The field default value may be None or a legal
                         field value""")
         )
 
     missing_value = Field(
-        title=_(u"Missing Value"),
-        description=_(u"""If input for this Field is missing, and that's ok,
+        title=_("Missing Value"),
+        description=_("""If input for this Field is missing, and that's ok,
                           then this is the value to use""")
         )
 
     order = Int(
-        title=_(u"Field Order"),
-        description=_(u"""
+        title=_("Field Order"),
+        description=_("""
         The order attribute can be used to determine the order in
         which fields in a schema were defined. If one field is created
         after another (in the same thread), its order will be
@@ -159,7 +160,7 @@
         )
 
     def constraint(value):
-        u"""Check a customized constraint on the value.
+        """Check a customized constraint on the value.
 
         You can implement this method with your Field to
         require a certain constraint.  This relaxes the need
@@ -168,7 +169,7 @@
         """
 
     def validate(value):
-        u"""Validate that the given value is a valid field value.
+        """Validate that the given value is a valid field value.
 
         Returns nothing but raises an error if the value is invalid.
         It checks everything specific to a Field and also checks
@@ -191,7 +192,7 @@
         """
 
 class IIterable(IField):
-    u"""Fields with a value that can be iterated over.
+    """Fields with a value that can be iterated over.
 
     The value needs to support iteration; the implementation mechanism
     is not constrained.  (Either `__iter__()` or `__getitem__()` may be
@@ -199,7 +200,7 @@
     """
 
 class IContainer(IField):
-    u"""Fields whose value allows an ``x in value`` check.
+    """Fields whose value allows an ``x in value`` check.
 
     The value needs to support the `in` operator, but is not
     constrained in how it does so (whether it defines `__contains__()`
@@ -207,7 +208,7 @@
     """
 
 class IOrderable(IField):
-    u"""Field requiring its value to be orderable.
+    """Field requiring its value to be orderable.
 
     The set of value needs support a complete ordering; the
     implementation mechanism is not constrained.  Either `__cmp__()` or
@@ -215,36 +216,36 @@
     """
 
 class ILen(IField):
-    u"""A Field requiring its value to have a length.
+    """A Field requiring its value to have a length.
 
     The value needs to have a conventional __len__ method.
     """
 
 class IMinMax(IOrderable):
-    u"""Field requiring its value to be between min and max.
+    """Field requiring its value to be between min and max.
 
     This implies that the value needs to support the IOrderable interface.
     """
 
     min = Field(
-        title=_(u"Start of the range"),
+        title=_("Start of the range"),
         required=False,
         default=None
         )
 
     max = Field(
-        title=_(u"End of the range (including the value itself)"),
+        title=_("End of the range (including the value itself)"),
         required=False,
         default=None
         )
 
 
 class IMinMaxLen(ILen):
-    u"""Field requiring the length of its value to be within a range"""
+    """Field requiring the length of its value to be within a range"""
 
     min_length = Int(
-        title=_(u"Minimum length"),
-        description=_(u"""
+        title=_("Minimum length"),
+        description=_("""
         Value after whitespace processing cannot have less than
         `min_length` characters (if a string type) or elements (if
         another sequence type). If `min_length` is ``None``, there is
@@ -255,8 +256,8 @@
         default=0)
 
     max_length = Int(
-        title=_(u"Maximum length"),
-        description=_(u"""
+        title=_("Maximum length"),
+        description=_("""
         Value after whitespace processing cannot have greater
         or equal than `max_length` characters (if a string type) or
         elements (if another sequence type). If `max_length` is
@@ -266,87 +267,98 @@
         default=None)
 
 class IInterfaceField(IField):
-    u"""Fields with a value that is an interface (implementing
+    """Fields with a value that is an interface (implementing
     zope.interface.Interface)."""
 
 class IBool(IField):
-    u"""Boolean Field."""
+    """Boolean Field."""
 
     default = Bool(
-        title=_(u"Default Value"),
-        description=_(u"""The field default value may be None or a legal
+        title=_("Default Value"),
+        description=_("""The field default value may be None or a legal
                         field value""")
         )
 
 class IBytes(IMinMaxLen, IIterable, IField):
-    u"""Field containing a byte string (like the python str).
+    """Field containing a byte string (like the python str).
 
     The value might be constrained to be with length limits.
     """
 
-class IASCII(IBytes):
-    u"""Field containing a 7-bit ASCII string. No characters > DEL
+class IText(IMinMaxLen, IIterable, IField):
+    """Field containing a unicode string."""
+
+# for things which are of the str type on both Python 2 and 3
+if PY3:
+    _IStr = IText
+else:
+    _IStr = IBytes
+
+class IASCII(_IStr):
+    """Field containing a 7-bit ASCII string. No characters > DEL
     (chr(127)) are allowed
 
     The value might be constrained to be with length limits.
     """
 
 class IBytesLine(IBytes):
-    u"""Field containing a byte string without newlines."""
+    """Field containing a byte string without newlines."""
 
 class IASCIILine(IASCII):
-    u"""Field containing a 7-bit ASCII string without newlines."""
+    """Field containing a 7-bit ASCII string without newlines."""
 
-class IText(IMinMaxLen, IIterable, IField):
-    u"""Field containing a unicode string."""
-
 class ISourceText(IText):
-    u"""Field for source text of object."""
+    """Field for source text of object."""
 
 class ITextLine(IText):
-    u"""Field containing a unicode string without newlines."""
+    """Field containing a unicode string without newlines."""
 
+if PY3:
+    _IStrLine = ITextLine
+else:
+    _IStrLine = IBytesLine
+
 class IPassword(ITextLine):
-    u"Field containing a unicode string without newlines that is a password."
+    "Field containing a unicode string without newlines that is a password."
 
 class IInt(IMinMax, IField):
-    u"""Field containing an Integer Value."""
+    """Field containing an Integer Value."""
 
     min = Int(
-        title=_(u"Start of the range"),
+        title=_("Start of the range"),
         required=False,
         default=None
         )
 
     max = Int(
-        title=_(u"End of the range (excluding the value itself)"),
+        title=_("End of the range (excluding the value itself)"),
         required=False,
         default=None
         )
 
     default = Int(
-        title=_(u"Default Value"),
-        description=_(u"""The field default value may be None or a legal
+        title=_("Default Value"),
+        description=_("""The field default value may be None or a legal
                         field value""")
         )
 
 class IFloat(IMinMax, IField):
-    u"""Field containing a Float."""
+    """Field containing a Float."""
 
 class IDecimal(IMinMax, IField):
-    u"""Field containing a Decimal."""
+    """Field containing a Decimal."""
 
 class IDatetime(IMinMax, IField):
-    u"""Field containing a DateTime."""
+    """Field containing a DateTime."""
 
 class IDate(IMinMax, IField):
-    u"""Field containing a date."""
+    """Field containing a date."""
 
 class ITimedelta(IMinMax, IField):
-    u"""Field containing a timedelta."""
+    """Field containing a timedelta."""
 
 class ITime(IMinMax, IField):
-    u"""Field containing a time."""
+    """Field containing a time."""
 
 def _is_field(value):
     if not IField.providedBy(value):
@@ -364,48 +376,48 @@
     """A field containing an absolute URI
     """
 
-class IId(IBytesLine):
+class IId(_IStrLine):
     """A field containing a unique identifier
 
     A unique identifier is either an absolute URI or a dotted name.
     If it's a dotted name, it should have a module/package name as a prefix.
     """
 
-class IDottedName(IBytesLine):
+class IDottedName(_IStrLine):
     """Dotted name field.
 
     Values of DottedName fields must be Python-style dotted names.
     """
 
     min_dots = Int(
-        title=_(u"Minimum number of dots"),
+        title=_("Minimum number of dots"),
         required=True,
         min=0,
         default=0
         )
 
     max_dots = Int(
-        title=_(u"Maximum number of dots (should not be less than min_dots)"),
+        title=_("Maximum number of dots (should not be less than min_dots)"),
         required=False,
         default=None
         )
 
 class IChoice(IField):
-    u"""Field whose value is contained in a predefined set
+    """Field whose value is contained in a predefined set
 
     Only one, values or vocabulary, may be specified for a given choice.
     """
     vocabulary = Field(
-        title=_(u"Vocabulary or source providing values"),
-        description=_(u"The ISource, IContextSourceBinder or IBaseVocabulary "
-                      u"object that provides values for this field."),
+        title=_("Vocabulary or source providing values"),
+        description=_("The ISource, IContextSourceBinder or IBaseVocabulary "
+                      "object that provides values for this field."),
         required=False,
         default=None
         )
 
     vocabularyName = TextLine(
-        title=_(u"Vocabulary name"),
-        description=_(u"Vocabulary name to lookup in the vocabulary registry"),
+        title=_("Vocabulary name"),
+        description=_("Vocabulary name to lookup in the vocabulary registry"),
         required=False,
         default=None
         )
@@ -415,15 +427,15 @@
 # Abstract
 
 class ICollection(IMinMaxLen, IIterable, IContainer):
-    u"""Abstract interface containing a collection value.
+    """Abstract interface containing a collection value.
 
     The Value must be iterable and may have a min_length/max_length.
     """
 
     value_type = Field(
         title = _("Value Type"),
-        description = _(u"Field value items must conform to the given type, "
-                        u"expressed via a Field."))
+        description = _("Field value items must conform to the given type, "
+                        "expressed via a Field."))
 
     unique = Bool(
         title = _('Unique Members'),
@@ -432,47 +444,47 @@
         default=False)
 
 class ISequence(ICollection):
-    u"""Abstract interface specifying that the value is ordered"""
+    """Abstract interface specifying that the value is ordered"""
 
 class IUnorderedCollection(ICollection):
-    u"""Abstract interface specifying that the value cannot be ordered"""
+    """Abstract interface specifying that the value cannot be ordered"""
 
 class IAbstractSet(IUnorderedCollection):
-    u"""An unordered collection of unique values."""
+    """An unordered collection of unique values."""
 
-    unique = Attribute(u"This ICollection interface attribute must be True")
+    unique = Attribute("This ICollection interface attribute must be True")
 
 class IAbstractBag(IUnorderedCollection):
-    u"""An unordered collection of values, with no limitations on whether
+    """An unordered collection of values, with no limitations on whether
     members are unique"""
 
-    unique = Attribute(u"This ICollection interface attribute must be False")
+    unique = Attribute("This ICollection interface attribute must be False")
 
 # Concrete
 
 class ITuple(ISequence):
-    u"""Field containing a value that implements the API of a conventional
+    """Field containing a value that implements the API of a conventional
     Python tuple."""
 
 class IList(ISequence):
-    u"""Field containing a value that implements the API of a conventional
+    """Field containing a value that implements the API of a conventional
     Python list."""
 
 class ISet(IAbstractSet):
-    u"""Field containing a value that implements the API of a Python2.4+ set.
+    """Field containing a value that implements the API of a Python2.4+ set.
     """
 
 class IFrozenSet(IAbstractSet):
-    u"""Field containing a value that implements the API of a conventional
+    """Field containing a value that implements the API of a conventional
     Python 2.4+ frozenset."""
 
 # (end Collections)
 
 class IObject(IField):
-    u"""Field containing an Object value."""
+    """Field containing an Object value."""
 
     schema = Attribute("schema",
-        _(u"The Interface that defines the Fields comprising the Object."))
+        _("The Interface that defines the Fields comprising the Object."))
 
 class IBeforeObjectAssignedEvent(Interface):
     """An object is going to be assigned to an attribute on another object.
@@ -494,19 +506,19 @@
 
 
 class IDict(IMinMaxLen, IIterable, IContainer):
-    u"""Field containing a conventional dict.
+    """Field containing a conventional dict.
 
     The key_type and value_type fields allow specification
     of restrictions for keys and values contained in the dict.
     """
 
     key_type = Attribute("key_type",
-        _(u"""Field keys must conform to the given type, expressed
+        _("""Field keys must conform to the given type, expressed
            via a Field.
         """))
 
     value_type = Attribute("value_type",
-        _(u"""Field values must conform to the given type, expressed
+        _("""Field values must conform to the given type, expressed
            via a Field.
         """))
 
@@ -533,7 +545,7 @@
 class ITitledTokenizedTerm(ITokenizedTerm):
     """A tokenized term that includes a title."""
 
-    title = TextLine(title=_(u"Title"))
+    title = TextLine(title=_("Title"))
 
 class ISource(Interface):
     """A set of values from which to choose

Modified: zope.schema/trunk/src/zope/schema/sources.txt
===================================================================
--- zope.schema/trunk/src/zope/schema/sources.txt	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/sources.txt	2011-10-14 10:51:07 UTC (rev 123093)
@@ -39,8 +39,8 @@
 
     >>> from zope import interface
     >>> from zope.schema.interfaces import ISource, IContextSourceBinder
-    >>> class MySource(object):
-    ...     interface.implements(ISource)
+    >>> @interface.implementer(ISource)
+    ... class MySource(object):
     ...     divisor = 2
     ...     def __contains__(self, value):
     ...         return bool(value % self.divisor)
@@ -60,8 +60,9 @@
 `bind` method will be called with the context as its only argument.   The
 result must implement ISource and will be used as the source.
 
+    >>> from six import print_
     >>> def my_binder(context):
-    ...     print "Binder was called."
+    ...     print_("Binder was called.")
     ...     source = MySource()
     ...     source.divisor = context.divisor
     ...     return source

Modified: zope.schema/trunk/src/zope/schema/tests/__init__.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/__init__.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/__init__.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -1,2 +1,46 @@
 #
 # This file is necessary to make this directory a package.
+
+import re
+
+from six import PY3
+from zope.testing import renormalizing
+
+if PY3:
+    py3_checker = renormalizing.RENormalizing([
+        (re.compile(r"u'([^']*)'"),
+                    r"'\1'"),
+        (re.compile(r"^b'([^']*)'"),
+                    r"'\1'"),
+        (re.compile(r"([^'])b'([^']*)'"),
+                    r"\1'\2'"),
+        (re.compile(r"<class 'bytes'>"),
+                    r"<type 'str'>"),
+        (re.compile(r"<class 'str'>"),
+                    r"<type 'unicode'>"),
+        (re.compile(r"zope.schema._bootstrapinterfaces.InvalidValue"),
+                    r"InvalidValue"),
+        (re.compile(r"zope.schema.interfaces.InvalidId: '([^']*)'"),
+                    r"InvalidId: \1"),
+        (re.compile(r"zope.schema.interfaces.InvalidId:"),
+                    r"InvalidId:"),
+        (re.compile(r"zope.schema.interfaces.InvalidURI: '([^']*)'"),
+                    r"InvalidURI: \1"),
+        (re.compile(r"zope.schema.interfaces.InvalidURI:"),
+                    r"InvalidURI:"),
+        (re.compile(r"zope.schema.interfaces.InvalidDottedName: '([^']*)'"),
+                    r"InvalidDottedName: \1"),
+        (re.compile(r"zope.schema.interfaces.InvalidDottedName:"),
+                    r"InvalidDottedName:"),
+        (re.compile(r"zope.schema._bootstrapinterfaces.ConstraintNotSatisfied: '([^']*)'"),
+                    r"ConstraintNotSatisfied: \1"),
+        (re.compile(r"zope.schema._bootstrapinterfaces.ConstraintNotSatisfied:"),
+                    r"ConstraintNotSatisfied:"),
+        (re.compile(r"zope.schema._bootstrapinterfaces.WrongType:"),
+                    r"WrongType:"),
+      ])
+else:
+    py3_checker = renormalizing.RENormalizing([
+        (re.compile(r"([^'])b'([^']*)'"),
+                    r"\1'\2'"),
+        ])

Modified: zope.schema/trunk/src/zope/schema/tests/states.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/states.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/states.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -13,84 +13,85 @@
 ##############################################################################
 """Sample vocabulary supporting state abbreviations.
 """
-from zope.interface import implements
+from six import u
+from zope.interface import implementer
 from zope.schema import interfaces
 from zope.schema import Choice
 
 # This table is based on information from the United States Postal Service:
 # http://www.usps.com/ncsc/lookups/abbreviations.html#states
 _states = {
-    'AL': u'Alabama',
-    'AK': u'Alaska',
-    'AS': u'American Samoa',
-    'AZ': u'Arizona',
-    'AR': u'Arkansas',
-    'CA': u'California',
-    'CO': u'Colorado',
-    'CT': u'Connecticut',
-    'DE': u'Delaware',
-    'DC': u'District of Columbia',
-    'FM': u'Federated States of Micronesia',
-    'FL': u'Florida',
-    'GA': u'Georgia',
-    'GU': u'Guam',
-    'HI': u'Hawaii',
-    'ID': u'Idaho',
-    'IL': u'Illinois',
-    'IN': u'Indiana',
-    'IA': u'Iowa',
-    'KS': u'Kansas',
-    'KY': u'Kentucky',
-    'LA': u'Louisiana',
-    'ME': u'Maine',
-    'MH': u'Marshall Islands',
-    'MD': u'Maryland',
-    'MA': u'Massachusetts',
-    'MI': u'Michigan',
-    'MN': u'Minnesota',
-    'MS': u'Mississippi',
-    'MO': u'Missouri',
-    'MT': u'Montana',
-    'NE': u'Nebraska',
-    'NV': u'Nevada',
-    'NH': u'New Hampshire',
-    'NJ': u'New Jersey',
-    'NM': u'New Mexico',
-    'NY': u'New York',
-    'NC': u'North Carolina',
-    'ND': u'North Dakota',
-    'MP': u'Northern Mariana Islands',
-    'OH': u'Ohio',
-    'OK': u'Oklahoma',
-    'OR': u'Oregon',
-    'PW': u'Palau',
-    'PA': u'Pennsylvania',
-    'PR': u'Puerto Rico',
-    'RI': u'Rhode Island',
-    'SC': u'South Carolina',
-    'SD': u'South Dakota',
-    'TN': u'Tennessee',
-    'TX': u'Texas',
-    'UT': u'Utah',
-    'VT': u'Vermont',
-    'VI': u'Virgin Islands',
-    'VA': u'Virginia',
-    'WA': u'Washington',
-    'WV': u'West Virginia',
-    'WI': u'Wisconsin',
-    'WY': u'Wyoming',
+    'AL': u('Alabama'),
+    'AK': u('Alaska'),
+    'AS': u('American Samoa'),
+    'AZ': u('Arizona'),
+    'AR': u('Arkansas'),
+    'CA': u('California'),
+    'CO': u('Colorado'),
+    'CT': u('Connecticut'),
+    'DE': u('Delaware'),
+    'DC': u('District of Columbia'),
+    'FM': u('Federated States of Micronesia'),
+    'FL': u('Florida'),
+    'GA': u('Georgia'),
+    'GU': u('Guam'),
+    'HI': u('Hawaii'),
+    'ID': u('Idaho'),
+    'IL': u('Illinois'),
+    'IN': u('Indiana'),
+    'IA': u('Iowa'),
+    'KS': u('Kansas'),
+    'KY': u('Kentucky'),
+    'LA': u('Louisiana'),
+    'ME': u('Maine'),
+    'MH': u('Marshall Islands'),
+    'MD': u('Maryland'),
+    'MA': u('Massachusetts'),
+    'MI': u('Michigan'),
+    'MN': u('Minnesota'),
+    'MS': u('Mississippi'),
+    'MO': u('Missouri'),
+    'MT': u('Montana'),
+    'NE': u('Nebraska'),
+    'NV': u('Nevada'),
+    'NH': u('New Hampshire'),
+    'NJ': u('New Jersey'),
+    'NM': u('New Mexico'),
+    'NY': u('New York'),
+    'NC': u('North Carolina'),
+    'ND': u('North Dakota'),
+    'MP': u('Northern Mariana Islands'),
+    'OH': u('Ohio'),
+    'OK': u('Oklahoma'),
+    'OR': u('Oregon'),
+    'PW': u('Palau'),
+    'PA': u('Pennsylvania'),
+    'PR': u('Puerto Rico'),
+    'RI': u('Rhode Island'),
+    'SC': u('South Carolina'),
+    'SD': u('South Dakota'),
+    'TN': u('Tennessee'),
+    'TX': u('Texas'),
+    'UT': u('Utah'),
+    'VT': u('Vermont'),
+    'VI': u('Virgin Islands'),
+    'VA': u('Virginia'),
+    'WA': u('Washington'),
+    'WV': u('West Virginia'),
+    'WI': u('Wisconsin'),
+    'WY': u('Wyoming'),
     }
 
 
+ at implementer(interfaces.ITerm)
 class State(object):
     __slots__ = 'value', 'title'
-    implements(interfaces.ITerm)
 
     def __init__(self, value, title):
         self.value = value
         self.title = title
 
-for v,p in _states.iteritems():
+for v,p in _states.items():
     _states[v] = State(v, p)
 
 
@@ -98,9 +99,9 @@
     """Vocabularies that support the states database conform to this."""
 
 
+ at implementer(IStateVocabulary)
 class StateVocabulary(object):
     __slots__ = ()
-    implements(IStateVocabulary)
 
     def __init__(self, object=None):
         pass
@@ -109,7 +110,7 @@
         return value in _states
 
     def __iter__(self):
-        return _states.itervalues()
+        return iter(_states.values())
 
     def __len__(self):
         return len(_states)

Modified: zope.schema/trunk/src/zope/schema/tests/test_accessors.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_accessors.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_accessors.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -14,7 +14,8 @@
 """Test Interface accessor methods.
 """
 import unittest
-from zope.interface import Interface, implements
+from zope.interface import Interface, implementer
+from six import u
 from zope.schema import Text, accessors
 from zope.schema.interfaces import IText
 from zope.schema.accessors import FieldReadAccessor, FieldWriteAccessor
@@ -26,23 +27,24 @@
 
     def test(self):
 
-        field = Text(title=u"Foo thing")
+        field = Text(title=u("Foo thing"))
 
         class I(Interface):
 
             getFoo, setFoo = accessors(field)
 
+        @implementer(I)
         class Bad(object):
-            implements(I)
+            pass
 
+        @implementer(I)
         class Good(object):
-            implements(I)
             
             def __init__(self):
                 self.set = 0
 
             def getFoo(self):
-                return u"foo"
+                return u("foo")
 
             def setFoo(self, v):
                 self.set += 1
@@ -52,7 +54,7 @@
         self.assertEqual(names, ['getFoo', 'setFoo'])
         self.assertEqual(I['getFoo'].field, field)
         self.assertEqual(I['getFoo'].__name__, 'getFoo')
-        self.assertEqual(I['getFoo'].__doc__, u'get Foo thing')
+        self.assertEqual(I['getFoo'].__doc__, u('get Foo thing'))
         self.assertEqual(I['getFoo'].__class__, FieldReadAccessor)
         self.assertEqual(I['getFoo'].writer, I['setFoo'])
 
@@ -60,34 +62,34 @@
         for attr in ('title', 'description', 'readonly'):
             self.assertEqual(getattr(I['getFoo'], attr), getattr(field, attr))
 
-        self.assert_(IText.providedBy(I['getFoo']))
+        self.assertTrue(IText.providedBy(I['getFoo']))
         
-        self.assert_(IMethod.providedBy(I['getFoo']))
-        self.assert_(IMethod.providedBy(I['setFoo']))
+        self.assertTrue(IMethod.providedBy(I['getFoo']))
+        self.assertTrue(IMethod.providedBy(I['setFoo']))
 
         self.assertEqual(I['setFoo'].field, field)
         self.assertEqual(I['setFoo'].__name__, 'setFoo')
-        self.assertEqual(I['setFoo'].__doc__, u'set Foo thing')
+        self.assertEqual(I['setFoo'].__doc__, u('set Foo thing'))
         self.assertEqual(I['setFoo'].__class__, FieldWriteAccessor)
 
         self.assertRaises(Exception, verifyClass, I, Bad)
         self.assertRaises(Exception, verifyObject, I, Bad())
         
-        self.assertEquals(I['getFoo'].query(Bad(), 42), 42)
+        self.assertEqual(I['getFoo'].query(Bad(), 42), 42)
         self.assertRaises(AttributeError, I['getFoo'].get, Bad())
 
         verifyClass(I, Good)
         verifyObject(I, Good())
 
-        self.assertEquals(I['getFoo'].query(Good(), 42), u'foo')
-        self.assertEquals(I['getFoo'].get(Good()), u'foo')
+        self.assertEqual(I['getFoo'].query(Good(), 42), u('foo'))
+        self.assertEqual(I['getFoo'].get(Good()), u('foo'))
         instance = Good()
-        I['getFoo'].set(instance, u'whatever')
-        self.assertEquals(instance.set, 1)
+        I['getFoo'].set(instance, u('whatever'))
+        self.assertEqual(instance.set, 1)
 
     def test_doc(self):
 
-        field = Text(title=u"Foo thing")
+        field = Text(title=u("Foo thing"))
 
         class I(Interface):
 

Modified: zope.schema/trunk/src/zope/schema/tests/test_boolfield.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_boolfield.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_boolfield.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -14,6 +14,8 @@
 """Boolean field tests
 """
 from unittest import main, makeSuite
+
+from six import u
 from zope.schema import Bool
 from zope.schema.interfaces import RequiredMissing, IBool, IFromUnicode
 from zope.schema.tests.test_field import FieldTestBase
@@ -27,14 +29,14 @@
     _Field_Factory = Bool
 
     def testValidate(self):
-        field = Bool(title=u'Bool field', description=u'',
+        field = Bool(title=u('Bool field'), description=u(''),
                      readonly=False, required=False)
         field.validate(None)
         field.validate(True)
         field.validate(False)
 
     def testValidateRequired(self):
-        field = Bool(title=u'Bool field', description=u'',
+        field = Bool(title=u('Bool field'), description=u(''),
                      readonly=False, required=True)
         field.validate(True)
         field.validate(False)
@@ -53,10 +55,10 @@
         class IAdaptTo(zope.interface.Interface):
             pass
 
-        registry.register((IBool,), IAdaptTo, u'', adapt_bool)
-        registry.register((IFromUnicode,), IAdaptTo, u'', adapt_from_unicode)
+        registry.register((IBool,), IAdaptTo, u(''), adapt_bool)
+        registry.register((IFromUnicode,), IAdaptTo, u(''), adapt_from_unicode)
 
-        field = Bool(title=u'Bool field', description=u'',
+        field = Bool(title=u('Bool field'), description=u(''),
                      readonly=False, required=True)
 
         self.assertEqual('bool', registry.queryAdapter(field, IAdaptTo))

Modified: zope.schema/trunk/src/zope/schema/tests/test_choice.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_choice.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_choice.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -15,13 +15,14 @@
 """
 import unittest
 
+from six import u
 from zope.schema import vocabulary
 from zope.schema import Choice
 from zope.schema.interfaces import ConstraintNotSatisfied
 from zope.schema.interfaces import ValidationError
 from zope.schema.interfaces import InvalidValue, NotAContainer, NotUnique
 
-from test_vocabulary import SampleVocabulary, DummyRegistry
+from zope.schema.tests.test_vocabulary import SampleVocabulary, DummyRegistry
 
 
 class Value_ChoiceFieldTests(unittest.TestCase):
@@ -41,7 +42,7 @@
         choice = Choice(values=['a', 'c'])
         choice.validate('a')
         choice.validate('c')
-        choice.validate(u'c')
+        choice.validate(u('c'))
         self.assertRaises(ConstraintNotSatisfied, choice.validate, 'd')
 
     def test_validate_tuple(self):
@@ -71,11 +72,11 @@
     def check_preconstructed(self, cls, okval, badval):
         v = SampleVocabulary()
         field = cls(vocabulary=v)
-        self.assert_(field.vocabulary is v)
-        self.assert_(field.vocabularyName is None)
+        self.assertTrue(field.vocabulary is v)
+        self.assertTrue(field.vocabularyName is None)
         bound = field.bind(None)
-        self.assert_(bound.vocabulary is v)
-        self.assert_(bound.vocabularyName is None)
+        self.assertTrue(bound.vocabulary is v)
+        self.assertTrue(bound.vocabularyName is None)
         bound.default = okval
         self.assertEqual(bound.default, okval)
         self.assertRaises(ValidationError, setattr, bound, "default", badval)
@@ -86,11 +87,11 @@
     def check_constructed(self, cls, okval, badval):
         vocabulary.setVocabularyRegistry(DummyRegistry())
         field = cls(vocabulary="vocab")
-        self.assert_(field.vocabulary is None)
+        self.assertTrue(field.vocabulary is None)
         self.assertEqual(field.vocabularyName, "vocab")
         o = object()
         bound = field.bind(o)
-        self.assert_(isinstance(bound.vocabulary, SampleVocabulary))
+        self.assertTrue(isinstance(bound.vocabulary, SampleVocabulary))
         bound.default = okval
         self.assertEqual(bound.default, okval)
         self.assertRaises(ValidationError, setattr, bound, "default", badval)

Modified: zope.schema/trunk/src/zope/schema/tests/test_containerfield.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_containerfield.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_containerfield.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -13,7 +13,12 @@
 ##############################################################################
 """Container field tests
 """
-from UserDict import UserDict
+from six import PY3, u
+if not PY3:
+    from UserDict import UserDict
+else:
+    #python3
+    from collections import UserDict
 from unittest import main, makeSuite
 from zope.schema import Container
 from zope.schema.interfaces import RequiredMissing, NotAContainer
@@ -25,7 +30,7 @@
     _Field_Factory = Container
 
     def testValidate(self):
-        field = self._Field_Factory(title=u'test field', description=u'',
+        field = self._Field_Factory(title=u('test field'), description=u(''),
                                     readonly=False, required=False)
         field.validate(None)
         field.validate('')
@@ -38,7 +43,7 @@
         self.assertRaises(NotAContainer, field.validate, True)
 
     def testValidateRequired(self):
-        field = self._Field_Factory(title=u'test field', description=u'',
+        field = self._Field_Factory(title=u('test field'), description=u(''),
                                     readonly=False, required=True)
 
         field.validate('')

Modified: zope.schema/trunk/src/zope/schema/tests/test_date.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_date.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_date.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -14,6 +14,8 @@
 """Date field tests
 """
 from unittest import main, makeSuite
+
+from six import u
 from zope.schema import Date
 from zope.schema.interfaces import RequiredMissing, InvalidValue, WrongType
 from zope.schema.interfaces import TooSmall, TooBig
@@ -31,14 +33,14 @@
         verifyObject(IDate, self._Field_Factory())
 
     def testValidate(self):
-        field = self._Field_Factory(title=u'Date field', description=u'',
+        field = self._Field_Factory(title=u('Date field'), description=u(''),
                                     readonly=False, required=False)
         field.validate(None)
         field.validate(datetime.now().date())
         self.assertRaises(WrongType, field.validate, datetime.now())
 
     def testValidateRequired(self):
-        field = self._Field_Factory(title=u'Date field', description=u'',
+        field = self._Field_Factory(title=u('Date field'), description=u(''),
                                     readonly=False, required=True)
         field.validate(datetime.now().date())
 
@@ -47,7 +49,7 @@
     def testValidateMin(self):
         d1 = date(2000,10,1)
         d2 = date(2000,10,2)
-        field = self._Field_Factory(title=u'Date field', description=u'',
+        field = self._Field_Factory(title=u('Date field'), description=u(''),
                                     readonly=False, required=False, min=d1)
         field.validate(None)
         field.validate(d1)
@@ -60,7 +62,7 @@
         d1 = date(2000,10,1)
         d2 = date(2000,10,2)
         d3 = date(2000,10,3)
-        field = self._Field_Factory(title=u'Date field', description=u'',
+        field = self._Field_Factory(title=u('Date field'), description=u(''),
                                     readonly=False, required=False, max=d2)
         field.validate(None)
         field.validate(d1)
@@ -75,7 +77,7 @@
         d4 = date(2000,10,4)
         d5 = date(2000,10,5)
 
-        field = self._Field_Factory(title=u'Date field', description=u'',
+        field = self._Field_Factory(title=u('Date field'), description=u(''),
                                     readonly=False, required=False,
                                     min=d2, max=d4)
         field.validate(None)

Modified: zope.schema/trunk/src/zope/schema/tests/test_datetime.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_datetime.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_datetime.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -14,6 +14,8 @@
 """Datetime Field tests
 """
 from unittest import main, makeSuite
+
+from six import u
 from zope.schema import Datetime
 from zope.schema.interfaces import RequiredMissing, InvalidValue
 from zope.schema.interfaces import TooSmall, TooBig
@@ -26,13 +28,13 @@
     _Field_Factory = Datetime
 
     def testValidate(self):
-        field = self._Field_Factory(title=u'Datetime field', description=u'',
+        field = self._Field_Factory(title=u('Datetime field'), description=u(''),
                                     readonly=False, required=False)
         field.validate(None)
         field.validate(datetime.now())
 
     def testValidateRequired(self):
-        field = self._Field_Factory(title=u'Datetime field', description=u'',
+        field = self._Field_Factory(title=u('Datetime field'), description=u(''),
                                     readonly=False, required=True)
         field.validate(datetime.now())
 
@@ -41,7 +43,7 @@
     def testValidateMin(self):
         d1 = datetime(2000,10,1)
         d2 = datetime(2000,10,2)
-        field = self._Field_Factory(title=u'Datetime field', description=u'',
+        field = self._Field_Factory(title=u('Datetime field'), description=u(''),
                                     readonly=False, required=False, min=d1)
         field.validate(None)
         field.validate(d1)
@@ -54,7 +56,7 @@
         d1 = datetime(2000,10,1)
         d2 = datetime(2000,10,2)
         d3 = datetime(2000,10,3)
-        field = self._Field_Factory(title=u'Datetime field', description=u'',
+        field = self._Field_Factory(title=u('Datetime field'), description=u(''),
                                     readonly=False, required=False, max=d2)
         field.validate(None)
         field.validate(d1)
@@ -69,7 +71,7 @@
         d4 = datetime(2000,10,4)
         d5 = datetime(2000,10,5)
 
-        field = self._Field_Factory(title=u'Datetime field', description=u'',
+        field = self._Field_Factory(title=u('Datetime field'), description=u(''),
                                     readonly=False, required=False,
                                     min=d2, max=d4)
         field.validate(None)

Modified: zope.schema/trunk/src/zope/schema/tests/test_decimalfield.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_decimalfield.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_decimalfield.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -14,6 +14,8 @@
 """Decimal field tests
 """
 import decimal
+
+from six import u
 from unittest import main, makeSuite
 from zope.schema import Decimal
 from zope.schema.interfaces import RequiredMissing, InvalidValue
@@ -26,7 +28,7 @@
     _Field_Factory = Decimal
 
     def testValidate(self):
-        field = self._Field_Factory(title=u'Decimal field', description=u'',
+        field = self._Field_Factory(title=u('Decimal field'), description=u(''),
                                     readonly=False, required=False)
         field.validate(None)
         field.validate(decimal.Decimal("10.0"))
@@ -34,7 +36,7 @@
         field.validate(decimal.Decimal("1000.0003"))
 
     def testValidateRequired(self):
-        field = self._Field_Factory(title=u'Decimal field', description=u'',
+        field = self._Field_Factory(title=u('Decimal field'), description=u(''),
                                     readonly=False, required=True)
         field.validate(decimal.Decimal("10.0"))
         field.validate(decimal.Decimal("0.93"))
@@ -43,7 +45,7 @@
         self.assertRaises(RequiredMissing, field.validate, None)
 
     def testValidateMin(self):
-        field = self._Field_Factory(title=u'Decimal field', description=u'',
+        field = self._Field_Factory(title=u('Decimal field'), description=u(''),
                                     readonly=False, required=False,
                                     min=decimal.Decimal("10.5"))
         field.validate(None)
@@ -54,7 +56,7 @@
         self.assertRaises(TooSmall, field.validate, decimal.Decimal("10.4"))
 
     def testValidateMax(self):
-        field = self._Field_Factory(title=u'Decimal field', description=u'',
+        field = self._Field_Factory(title=u('Decimal field'), description=u(''),
                                     readonly=False, required=False,
                                     max=decimal.Decimal("10.5"))
         field.validate(None)
@@ -65,7 +67,7 @@
         self.assertRaises(TooBig, field.validate, decimal.Decimal("20.7"))
 
     def testValidateMinAndMax(self):
-        field = self._Field_Factory(title=u'Decimal field', description=u'',
+        field = self._Field_Factory(title=u('Decimal field'), description=u(''),
                                     readonly=False, required=False,
                                     min=decimal.Decimal("-0.6"),
                                     max=decimal.Decimal("10.1"))

Modified: zope.schema/trunk/src/zope/schema/tests/test_dictfield.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_dictfield.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_dictfield.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -14,6 +14,8 @@
 """Dictionary field tests
 """
 from unittest import main, makeSuite
+
+from six import u
 from zope.schema import Dict, Int
 from zope.schema.interfaces import RequiredMissing, WrongContainedType
 from zope.schema.interfaces import TooShort, TooLong
@@ -25,16 +27,16 @@
     _Field_Factory = Dict
 
     def testValidate(self):
-        field = Dict(title=u'Dict field',
-                     description=u'', readonly=False, required=False)
+        field = Dict(title=u('Dict field'),
+                     description=u(''), readonly=False, required=False)
         field.validate(None)
         field.validate({})
         field.validate({1: 'foo'})
         field.validate({'a': 1})
 
     def testValidateRequired(self):
-        field = Dict(title=u'Dict field',
-                     description=u'', readonly=False, required=True)
+        field = Dict(title=u('Dict field'),
+                     description=u(''), readonly=False, required=True)
         field.validate({})
         field.validate({1: 'foo'})
         field.validate({'a': 1})
@@ -42,8 +44,8 @@
         self.assertRaises(RequiredMissing, field.validate, None)
 
     def testValidateMinValues(self):
-        field = Dict(title=u'Dict field',
-                     description=u'', readonly=False, required=False,
+        field = Dict(title=u('Dict field'),
+                     description=u(''), readonly=False, required=False,
                      min_length=1)
         field.validate(None)
         field.validate({1: 'a'})
@@ -52,8 +54,8 @@
         self.assertRaises(TooShort, field.validate, {})
 
     def testValidateMaxValues(self):
-        field = Dict(title=u'Dict field',
-                     description=u'', readonly=False, required=False,
+        field = Dict(title=u('Dict field'),
+                     description=u(''), readonly=False, required=False,
                      max_length=1)
         field.validate(None)
         field.validate({})
@@ -63,8 +65,8 @@
         self.assertRaises(TooLong, field.validate, {1: 'a', 2: 'b', 3: 'c'})
 
     def testValidateMinValuesAndMaxValues(self):
-        field = Dict(title=u'Dict field',
-                     description=u'', readonly=False, required=False,
+        field = Dict(title=u('Dict field'),
+                     description=u(''), readonly=False, required=False,
                      min_length=1, max_length=2)
         field.validate(None)
         field.validate({1: 'a'})
@@ -74,8 +76,8 @@
         self.assertRaises(TooLong, field.validate, {1: 'a', 2: 'b', 3: 'c'})
 
     def testValidateValueType(self):
-        field = Dict(title=u'Dict field',
-                     description=u'', readonly=False, required=False,
+        field = Dict(title=u('Dict field'),
+                     description=u(''), readonly=False, required=False,
                      value_type=Int())
         field.validate(None)
         field.validate({'a': 5})
@@ -86,8 +88,8 @@
         self.assertRaises(WrongContainedType, field.validate, {'a': ()} )
 
     def testValidateKeyTypes(self):
-        field = Dict(title=u'Dict field',
-                     description=u'', readonly=False, required=False,
+        field = Dict(title=u('Dict field'),
+                     description=u(''), readonly=False, required=False,
                      key_type=Int())
         field.validate(None)
         field.validate({5: 'a'})
@@ -101,7 +103,7 @@
     def test_bind_binds_key_and_value_types(self):
         field = self._Field_Factory(
             __name__ = 'x',
-            title=u'Not required field', description=u'',
+            title=u('Not required field'), description=u(''),
             readonly=False, required=False,
             key_type=Int(),
             value_type=Int(),

Modified: zope.schema/trunk/src/zope/schema/tests/test_docs.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_docs.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_docs.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -18,16 +18,20 @@
 import unittest
 
 from zope.testing import renormalizing
+import zope.schema.tests
 
 def test_suite():
     checker = renormalizing.RENormalizing([
         (re.compile(r"\[\(None, Invalid\('8<=10',\)\)\]"),
                     r"[(None, <zope.interface.exceptions.Invalid instance at 0x...>)]",)
       ])
+    checker = checker + zope.schema.tests.py3_checker
     return unittest.TestSuite((
-        doctest.DocFileSuite('../sources.txt', optionflags=doctest.ELLIPSIS),
-        doctest.DocFileSuite('../fields.txt'),
-        doctest.DocFileSuite('../README.txt'),
+        doctest.DocFileSuite('../sources.txt',
+                             optionflags=doctest.ELLIPSIS,
+                             checker=zope.schema.tests.py3_checker),
+        doctest.DocFileSuite('../fields.txt', checker=zope.schema.tests.py3_checker),
+        doctest.DocFileSuite('../README.txt', checker=zope.schema.tests.py3_checker),
         doctest.DocFileSuite(
             '../validation.txt', checker=checker,
             optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS),

Modified: zope.schema/trunk/src/zope/schema/tests/test_dotted_name.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_dotted_name.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_dotted_name.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -14,6 +14,8 @@
 """DottedName field tests
 """
 from unittest import main, makeSuite
+
+from six import b
 from zope.schema import DottedName
 from zope.schema.tests.test_field import FieldTestBase
 from zope.schema.interfaces import InvalidDottedName, RequiredMissing

Modified: zope.schema/trunk/src/zope/schema/tests/test_equality.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_equality.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_equality.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -14,18 +14,20 @@
 """Field equality tests
 """
 from unittest import TestCase, TestSuite, makeSuite
+
+from six import u
 from zope.schema import Text, Int
 
 class FieldEqualityTests(TestCase):
 
     equality = [
-        'Text(title=u"Foo", description=u"Bar")',
-        'Int(title=u"Foo", description=u"Bar")',
+        'Text(title=u("Foo"), description=u("Bar"))',
+        'Int(title=u("Foo"), description=u("Bar"))',
         ]
 
     def test_equality(self):
         for text in self.equality:
-            self.assertEquals(eval(text), eval(text))
+            self.assertEqual(eval(text), eval(text))
 
 def test_suite():
     return TestSuite(

Modified: zope.schema/trunk/src/zope/schema/tests/test_field.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_field.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_field.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -19,19 +19,21 @@
 from doctest import DocTestSuite
 from unittest import TestCase, TestSuite, makeSuite
 
+from six import u, b
 from zope.interface import Interface, provider
 from zope.schema import Field, Text, Int
 from zope.schema.interfaces import IContextAwareDefaultFactory
 from zope.schema.interfaces import ValidationError, RequiredMissing
 from zope.schema.interfaces import ConstraintNotSatisfied, WrongType
 from zope.testing import renormalizing
+import zope.schema.tests
 
 class FieldTestBase(TestCase):
 
     def test_bind(self):
         field = self._Field_Factory(
             __name__ = 'x',
-            title=u'Not required field', description=u'',
+            title=u('Not required field'), description=u(''),
             readonly=False, required=False)
 
         field.interface = Interface
@@ -47,11 +49,11 @@
         self.assertEqual(field.queryTaggedValue('a'), field2.queryTaggedValue('a'))
         for n in ('__class__', '__name__', '__doc__', 'title', 'description',
                   'readonly', 'required', 'interface'):
-            self.assertEquals(getattr(field2, n), getattr(field, n), n)
+            self.assertEqual(getattr(field2, n), getattr(field, n), n)
 
     def testValidate(self):
         field = self._Field_Factory(
-            title=u'Not required field', description=u'',
+            title=u('Not required field'), description=u(''),
             readonly=False, required=False)
         field.validate(None)
         field.validate('foo')
@@ -61,7 +63,7 @@
 
     def testValidateRequired(self):
         field = self._Field_Factory(
-            title=u'Required field', description=u'',
+            title=u('Required field'), description=u(''),
             readonly=False, required=True)
         field.validate('foo')
         field.validate(1)
@@ -75,7 +77,7 @@
     def test_bind_binds_value_type(self):
         field = self._Field_Factory(
             __name__ = 'x',
-            title=u'Not required field', description=u'',
+            title=u('Not required field'), description=u(''),
             readonly=False, required=False,
             value_type=Int(),
             )
@@ -94,20 +96,20 @@
     _Field_Factory = Field
 
     def testSillyDefault(self):
-        self.assertRaises(ValidationError, Text, default="")
+        self.assertRaises(ValidationError, Text, default=b(""))
 
     def test__doc__(self):
-        field = Text(title=u"test fiield",
+        field = Text(title=u("test fiield"),
                      description=(
-                         u"To make sure that\n"
-                         u"doc strings are working correctly\n"
+                         u("To make sure that\n"
+                           "doc strings are working correctly\n")
                          )
                      )
         self.assertEqual(
             field.__doc__,
-            u"test fiield\n\n"
-            u"To make sure that\n"
-            u"doc strings are working correctly\n"
+            u("test fiield\n\n"
+              "To make sure that\n"
+              "doc strings are working correctly\n")
             )
 
     def testOrdering(self):
@@ -118,19 +120,19 @@
             a = Text()
             b = Text()
 
-        self.failUnless(S1['a'].order < S1['b'].order)
+        self.assertTrue(S1['a'].order < S1['b'].order)
 
         class S2(Interface):
             b = Text()
             a = Text()
 
-        self.failUnless(S2['a'].order > S2['b'].order)
+        self.assertTrue(S2['a'].order > S2['b'].order)
 
     def testConstraint(self):
         def isodd(x):
             return x % 2 == 1
 
-        i = Int(title=u'my constrained integer',
+        i = Int(title=u('my constrained integer'),
                 constraint=isodd)
 
         i.validate(11)
@@ -168,17 +170,18 @@
     def test_required_defaults_to_true(self):
         class MyField(Field):
             pass
-        field = MyField(title=u'my')
-        self.assert_(field.required)
+        field = MyField(title=u('my'))
+        self.assertTrue(field.required)
 
 def test_suite():
     checker = renormalizing.RENormalizing([
         (re.compile(r" with base 10: '125.6'"),
                     r': 125.6')
         ])
+    checker = checker + zope.schema.tests.py3_checker
     return TestSuite((
         makeSuite(FieldTest),
         makeSuite(FieldDefaultBehaviour),
-        DocTestSuite("zope.schema._field"),
+        DocTestSuite("zope.schema._field", checker=zope.schema.tests.py3_checker),
         DocTestSuite("zope.schema._bootstrapfields",checker=checker),
         ))

Modified: zope.schema/trunk/src/zope/schema/tests/test_fieldproperty.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_fieldproperty.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_fieldproperty.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -16,6 +16,7 @@
 
 from unittest import TestCase, TestSuite, main, makeSuite
 
+from six import u, b
 from zope.interface import Interface
 from zope.schema import Float, Text, Bytes
 from zope.schema.interfaces import ValidationError
@@ -25,10 +26,10 @@
 
 class I(Interface):
 
-    title = Text(description=u"Short summary", default=u'say something')
+    title = Text(description=u("Short summary"), default=u('say something'))
     weight = Float(min=0.0)
-    code = Bytes(min_length=6, max_length=6, default='xxxxxx')
-    date = Float(title=u'Date', readonly=True)
+    code = Bytes(min_length=6, max_length=6, default=b('xxxxxx'))
+    date = Float(title=u('Date'), readonly=True)
 
 
 class C(object):
@@ -44,24 +45,24 @@
 
     def test_basic(self):
         c = self.klass()
-        self.assertEqual(c.title, u'say something')
+        self.assertEqual(c.title, u('say something'))
         self.assertEqual(c.weight, None)
-        self.assertEqual(c.code, 'xxxxxx')
-        self.assertRaises(ValidationError, setattr, c, 'title', 'foo')
-        self.assertRaises(ValidationError, setattr, c, 'weight', 'foo')
+        self.assertEqual(c.code, b('xxxxxx'))
+        self.assertRaises(ValidationError, setattr, c, 'title', b('foo'))
+        self.assertRaises(ValidationError, setattr, c, 'weight', b('foo'))
         self.assertRaises(ValidationError, setattr, c, 'weight', -1.0)
         self.assertRaises(ValidationError, setattr, c, 'weight', 2)
         self.assertRaises(ValidationError, setattr, c, 'code', -1)
-        self.assertRaises(ValidationError, setattr, c, 'code', 'xxxx')
-        self.assertRaises(ValidationError, setattr, c, 'code', u'xxxxxx')
+        self.assertRaises(ValidationError, setattr, c, 'code', b('xxxx'))
+        self.assertRaises(ValidationError, setattr, c, 'code', u('xxxxxx'))
 
-        c.title = u'c is good'
+        c.title = u('c is good')
         c.weight = 10.0
-        c.code = 'abcdef'
+        c.code = b('abcdef')
 
-        self.assertEqual(c.title, u'c is good')
+        self.assertEqual(c.title, u('c is good'))
         self.assertEqual(c.weight, 10)
-        self.assertEqual(c.code, 'abcdef')
+        self.assertEqual(c.code, b('abcdef'))
 
     def test_readonly(self):
         c = self.klass()

Modified: zope.schema/trunk/src/zope/schema/tests/test_floatfield.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_floatfield.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_floatfield.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -14,6 +14,8 @@
 """Float field tests
 """
 from unittest import main, makeSuite
+
+from six import u
 from zope.schema import Float
 from zope.schema.interfaces import RequiredMissing, InvalidValue
 from zope.schema.interfaces import TooSmall, TooBig
@@ -25,7 +27,7 @@
     _Field_Factory = Float
 
     def testValidate(self):
-        field = self._Field_Factory(title=u'Float field', description=u'',
+        field = self._Field_Factory(title=u('Float field'), description=u(''),
                                     readonly=False, required=False)
         field.validate(None)
         field.validate(10.0)
@@ -33,7 +35,7 @@
         field.validate(1000.0003)
 
     def testValidateRequired(self):
-        field = self._Field_Factory(title=u'Float field', description=u'',
+        field = self._Field_Factory(title=u('Float field'), description=u(''),
                                     readonly=False, required=True)
         field.validate(10.0)
         field.validate(0.93)
@@ -42,7 +44,7 @@
         self.assertRaises(RequiredMissing, field.validate, None)
 
     def testValidateMin(self):
-        field = self._Field_Factory(title=u'Float field', description=u'',
+        field = self._Field_Factory(title=u('Float field'), description=u(''),
                                     readonly=False, required=False, min=10.5)
         field.validate(None)
         field.validate(10.6)
@@ -52,7 +54,7 @@
         self.assertRaises(TooSmall, field.validate, 10.4)
 
     def testValidateMax(self):
-        field = self._Field_Factory(title=u'Float field', description=u'',
+        field = self._Field_Factory(title=u('Float field'), description=u(''),
                                     readonly=False, required=False, max=10.5)
         field.validate(None)
         field.validate(5.3)
@@ -62,7 +64,7 @@
         self.assertRaises(TooBig, field.validate, 20.7)
 
     def testValidateMinAndMax(self):
-        field = self._Field_Factory(title=u'Float field', description=u'',
+        field = self._Field_Factory(title=u('Float field'), description=u(''),
                                     readonly=False, required=False,
                                     min=-0.6, max=10.1)
         field.validate(None)

Modified: zope.schema/trunk/src/zope/schema/tests/test_interfacefield.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_interfacefield.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_interfacefield.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -14,6 +14,8 @@
 """Interface field tests
 """
 from unittest import main, makeSuite
+
+from six import u
 from zope.schema import InterfaceField
 from zope.schema.interfaces import RequiredMissing, WrongType
 from zope.schema.tests.test_field import FieldTestBase
@@ -28,13 +30,13 @@
     _Field_Factory = InterfaceField
 
     def testValidate(self):
-        field = InterfaceField(title=u'Interface field', description=u'',
+        field = InterfaceField(title=u('Interface field'), description=u(''),
                      readonly=False, required=False)
         field.validate(DummyInterface)
         self.assertRaises(WrongType, field.validate, object())
 
     def testValidateRequired(self):
-        field = InterfaceField(title=u'Interface field', description=u'',
+        field = InterfaceField(title=u('Interface field'), description=u(''),
                      readonly=False, required=True)
         self.assertRaises(RequiredMissing, field.validate, None)
 

Modified: zope.schema/trunk/src/zope/schema/tests/test_intfield.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_intfield.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_intfield.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -14,6 +14,8 @@
 """Integer field tests
 """
 from unittest import main, makeSuite
+
+from six import u
 from zope.schema import Int
 from zope.schema.interfaces import RequiredMissing, InvalidValue
 from zope.schema.interfaces import TooSmall, TooBig
@@ -25,7 +27,7 @@
     _Field_Factory = Int
 
     def testValidate(self):
-        field = self._Field_Factory(title=u'Int field', description=u'',
+        field = self._Field_Factory(title=u('Int field'), description=u(''),
                                     readonly=False, required=False)
         field.validate(None)
         field.validate(10)
@@ -33,7 +35,7 @@
         field.validate(-1)
 
     def testValidateRequired(self):
-        field = self._Field_Factory(title=u'Int field', description=u'',
+        field = self._Field_Factory(title=u('Int field'), description=u(''),
                                     readonly=False, required=True)
         field.validate(10)
         field.validate(0)
@@ -42,7 +44,7 @@
         self.assertRaises(RequiredMissing, field.validate, None)
 
     def testValidateMin(self):
-        field = self._Field_Factory(title=u'Int field', description=u'',
+        field = self._Field_Factory(title=u('Int field'), description=u(''),
                                     readonly=False, required=False, min=10)
         field.validate(None)
         field.validate(10)
@@ -52,7 +54,7 @@
         self.assertRaises(TooSmall, field.validate, -10)
 
     def testValidateMax(self):
-        field = self._Field_Factory(title=u'Int field', description=u'',
+        field = self._Field_Factory(title=u('Int field'), description=u(''),
                                     readonly=False, required=False, max=10)
         field.validate(None)
         field.validate(5)
@@ -63,7 +65,7 @@
         self.assertRaises(TooBig, field.validate, 20)
 
     def testValidateMinAndMax(self):
-        field = self._Field_Factory(title=u'Int field', description=u'',
+        field = self._Field_Factory(title=u('Int field'), description=u(''),
                                     readonly=False, required=False,
                                     min=0, max=10)
         field.validate(None)

Modified: zope.schema/trunk/src/zope/schema/tests/test_iterablefield.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_iterablefield.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_iterablefield.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -13,7 +13,12 @@
 ##############################################################################
 """Iterable field tests
 """
-from UserDict import UserDict, IterableUserDict
+from six import PY3, u
+if not PY3:
+    from UserDict import UserDict, IterableUserDict
+else:
+    #python3
+    from collections import UserDict as IterableUserDict, UserDict
 from unittest import main, makeSuite
 from zope.schema import Iterable
 from zope.schema.interfaces import RequiredMissing
@@ -26,7 +31,7 @@
     _Field_Factory = Iterable
 
     def testValidate(self):
-        field = self._Field_Factory(title=u'test field', description=u'',
+        field = self._Field_Factory(title=u('test field'), description=u(''),
                                     readonly=False, required=False)
         field.validate(None)
         field.validate('')
@@ -40,7 +45,7 @@
         self.assertRaises(NotAnIterator, field.validate, UserDict)
 
     def testValidateRequired(self):
-        field = self._Field_Factory(title=u'test field', description=u'',
+        field = self._Field_Factory(title=u('test field'), description=u(''),
                                     readonly=False, required=True)
 
         field.validate('')

Modified: zope.schema/trunk/src/zope/schema/tests/test_listfield.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_listfield.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_listfield.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -15,7 +15,8 @@
 """
 from unittest import main, makeSuite
 
-from zope.interface import implements
+from six import u
+from zope.interface import implementer
 from zope.schema import Field, List, Int
 from zope.schema.interfaces import IField
 from zope.schema.interfaces import ICollection, ISequence, IList
@@ -30,7 +31,7 @@
     _Field_Factory = List
 
     def testValidate(self):
-        field = List(title=u'List field', description=u'',
+        field = List(title=u('List field'), description=u(''),
                      readonly=False, required=False)
         field.validate(None)
         field.validate([])
@@ -38,7 +39,7 @@
         field.validate([3,])
 
     def testValidateRequired(self):
-        field = List(title=u'List field', description=u'',
+        field = List(title=u('List field'), description=u(''),
                      readonly=False, required=True)
         field.validate([])
         field.validate([1, 2])
@@ -47,7 +48,7 @@
         self.assertRaises(RequiredMissing, field.validate, None)
 
     def testValidateMinValues(self):
-        field = List(title=u'List field', description=u'',
+        field = List(title=u('List field'), description=u(''),
                      readonly=False, required=False, min_length=2)
         field.validate(None)
         field.validate([1, 2])
@@ -57,7 +58,7 @@
         self.assertRaises(TooShort, field.validate, [1,])
 
     def testValidateMaxValues(self):
-        field = List(title=u'List field', description=u'',
+        field = List(title=u('List field'), description=u(''),
                      readonly=False, required=False, max_length=2)
         field.validate(None)
         field.validate([])
@@ -67,7 +68,7 @@
         self.assertRaises(TooLong, field.validate, [1, 2, 3])
 
     def testValidateMinValuesAndMaxValues(self):
-        field = List(title=u'List field', description=u'',
+        field = List(title=u('List field'), description=u(''),
                      readonly=False, required=False,
                      min_length=1, max_length=2)
         field.validate(None)
@@ -78,7 +79,7 @@
         self.assertRaises(TooLong, field.validate, [1, 2, 3])
 
     def testValidateValueTypes(self):
-        field = List(title=u'List field', description=u'',
+        field = List(title=u('List field'), description=u(''),
                      readonly=False, required=False,
                      value_type=Int())
         field.validate(None)
@@ -98,21 +99,22 @@
 
         # however, allow anything that implements IField
         List(value_type=Field())
+        @implementer(IField)
         class FakeField(object):
-            implements(IField)
+            pass
         List(value_type=FakeField())
 
     def testUnique(self):
-        field = self._Field_Factory(title=u'test field', description=u'',
+        field = self._Field_Factory(title=u('test field'), description=u(''),
                                     readonly=False, required=True, unique=True)
         field.validate([1, 2])
         self.assertRaises(NotUnique, field.validate, [1, 2, 1])
     
     def testImplements(self):
         field = List()
-        self.failUnless(IList.providedBy(field))
-        self.failUnless(ISequence.providedBy(field))
-        self.failUnless(ICollection.providedBy(field))
+        self.assertTrue(IList.providedBy(field))
+        self.assertTrue(ISequence.providedBy(field))
+        self.assertTrue(ICollection.providedBy(field))
 
 def test_suite():
     return makeSuite(ListTest)

Modified: zope.schema/trunk/src/zope/schema/tests/test_objectfield.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_objectfield.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_objectfield.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -16,8 +16,9 @@
 """
 from unittest import TestSuite, main, makeSuite
 
+from six import u
 import zope.event
-from zope.interface import Attribute, Interface, implements
+from zope.interface import Attribute, Interface, implementer
 from zope.schema import Object, TextLine
 from zope.schema.fieldproperty import FieldProperty
 from zope.schema.interfaces import ValidationError
@@ -34,35 +35,34 @@
     """A test schema"""
 
     foo = TextLine(
-        title=_(u"Foo"),
-        description=_(u"Foo description"),
-        default=u"",
+        title=_("Foo"),
+        description=_("Foo description"),
+        default=u(""),
         required=True)
 
     bar = TextLine(
-        title=_(u"Bar"),
-        description=_(u"Bar description"),
-        default=u"",
+        title=_("Bar"),
+        description=_("Bar description"),
+        default=u(""),
         required=False)
 
     attribute = Attribute("Test attribute, an attribute can't be validated.")
 
 
+ at implementer(ITestSchema)
 class TestClass(object):
 
-    implements(ITestSchema)
+    _foo = u('')
+    _bar = u('')
+    _attribute = u('')
 
-    _foo = u''
-    _bar = u''
-    _attribute = u''
-
     def getfoo(self):
         return self._foo
 
     def setfoo(self, value):
         self._foo = value
 
-    foo = property(getfoo, setfoo, None, u'foo')
+    foo = property(getfoo, setfoo, None, u('foo'))
 
     def getbar(self):
         return self._bar
@@ -70,7 +70,7 @@
     def setbar(self, value):
         self._bar = value
 
-    bar = property(getbar, setbar, None, u'foo')
+    bar = property(getbar, setbar, None, u('foo'))
 
     def getattribute(self):
         return self._attribute
@@ -78,23 +78,21 @@
     def setattribute(self, value):
         self._attribute = value
 
-    attribute = property(getattribute, setattribute, None, u'attribute')
+    attribute = property(getattribute, setattribute, None, u('attribute'))
 
 
+ at implementer(ITestSchema)
 class FieldPropertyTestClass(object):
 
-    implements(ITestSchema)
 
-
     foo = FieldProperty(ITestSchema['foo'])
     bar = FieldProperty(ITestSchema['bar'])
     attribute = FieldProperty(ITestSchema['attribute'])
 
 
+ at implementer(ITestSchema)
 class NotFullyImplementedTestClass(object):
 
-    implements(ITestSchema)
-
     foo = FieldProperty(ITestSchema['foo'])
     # bar = FieldProperty(ITestSchema['bar']): bar is not implemented
     # attribute
@@ -104,15 +102,14 @@
 
     obj = Object(
         schema=Interface,
-        title=_(u"Object"),
-        description=_(u"object description"),
+        title=_("Object"),
+        description=_("object description"),
         required=False)
 
 
+ at implementer(ISchemaWithObjectFieldAsInterface)
 class ClassWithObjectFieldAsInterface(object):
 
-    implements(ISchemaWithObjectFieldAsInterface)
-
     _obj = None
 
     def getobj(self):
@@ -121,7 +118,7 @@
     def setobj(self, value):
         self._obj = value
 
-    obj = property(getobj, setobj, None, u'obj')
+    obj = property(getobj, setobj, None, u('obj'))
 
 
 class IUnit(Interface):
@@ -129,15 +126,15 @@
 
     boss = Object(
         schema=Interface,
-        title=_(u"Boss"),
-        description=_(u"Boss description"),
+        title=_("Boss"),
+        description=_("Boss description"),
         required=False,
         )
 
     members = List(
         value_type=Object(schema=Interface),
-        title=_(u"Member List"),
-        description=_(u"Member list description"),
+        title=_("Member List"),
+        description=_("Member list description"),
         required=False,
         )
 
@@ -147,8 +144,8 @@
 
     unit = Object(
         schema=IUnit,
-        title=_(u"Unit"),
-        description=_(u"Unit description"),
+        title=_("Unit"),
+        description=_("Unit description"),
         required=False,
         )
 
@@ -156,19 +153,17 @@
 IUnit['members'].value_type.schema = IPerson
 
 
+ at implementer(IUnit)
 class Unit(object):
 
-    implements(IUnit)
-
     def __init__(self, person, person_list):
         self.boss = person
         self.members = person_list
 
 
+ at implementer(IPerson)
 class Person(object):
 
-    implements(IPerson)
-
     def __init__(self, unit):
         self.unit = unit
 
@@ -179,9 +174,9 @@
     def getErrors(self, f, *args, **kw):
         try:
             f(*args, **kw)
-        except WrongContainedType, e:
+        except WrongContainedType as e:
             try:
-                return e[0]
+                return e.args[0]
             except:
                 return []
         self.fail('Expected WrongContainedType Error')
@@ -224,7 +219,7 @@
 
     def test_validate_required(self):
         field = self._Field_Factory(
-            title=u'Required field', description=u'',
+            title=u('Required field'), description=u(''),
             readonly=False, required=True)
         self.assertRaises(RequiredMissing, field.validate, None)
 
@@ -238,7 +233,7 @@
         self.assertRaises(ValidationError, field.validate, data)
         self.assertRaises(WrongContainedType, field.validate, data)
         errors = self.getErrors(field.validate, data)
-        self.assertEquals(errors[0], RequiredMissing('foo'))
+        self.assertEqual(errors[0], RequiredMissing('foo'))
 
     def test_validate_FieldPropertyTestData(self):
         field = self.makeTestObject(schema=ITestSchema, required=False)
@@ -255,7 +250,7 @@
         self.assertRaises(ValidationError, field.validate, data)
         self.assertRaises(WrongContainedType, field.validate, data)
         errors = self.getErrors(field.validate, data)
-        self.assert_(isinstance(errors[0], SchemaNotFullyImplemented))
+        self.assertTrue(isinstance(errors[0], SchemaNotFullyImplemented))
 
     def test_validate_with_non_object_value(self):
         field = self.makeTestObject(
@@ -279,12 +274,12 @@
             pass
         context = Dummy()
         field.set(context, data)
-        self.assertEquals(1, len(events))
+        self.assertEqual(1, len(events))
         event = events[0]
-        self.failUnless(IBeforeObjectAssignedEvent.providedBy(event))
-        self.assertEquals(data, event.object)
-        self.assertEquals('object_field', event.name)
-        self.assertEquals(context, event.context)
+        self.assertTrue(IBeforeObjectAssignedEvent.providedBy(event))
+        self.assertEqual(data, event.object)
+        self.assertEqual('object_field', event.name)
+        self.assertEqual(context, event.context)
 
     # cycles
 

Modified: zope.schema/trunk/src/zope/schema/tests/test_schema.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_schema.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_schema.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -14,6 +14,7 @@
 """Schema field tests
 """
 from unittest import TestCase, main, makeSuite
+from six import u, b
 from zope.interface import Interface
 from zope.schema import Bytes
 from zope.schema import getFields, getFieldsInOrder
@@ -21,28 +22,28 @@
 
 class ISchemaTest(Interface):
     title = Bytes(
-        title=u"Title",
-        description=u"Title",
-        default="",
+        title=u("Title"),
+        description=u("Title"),
+        default=b(""),
         required=True)
 
     description = Bytes(
-        title=u"Description",
-        description=u"Description",
-        default="",
+        title=u("Description"),
+        description=u("Description"),
+        default=b(""),
         required=True)
 
     spam = Bytes(
-        title=u"Spam",
-        description=u"Spam",
-        default="",
+        title=u("Spam"),
+        description=u("Spam"),
+        default=b(""),
         required=True)
 
 class ISchemaTestSubclass(ISchemaTest):
     foo = Bytes(
-        title=u'Foo',
-        description=u'Fooness',
-        default="",
+        title=u('Foo'),
+        description=u('Fooness'),
+        default=b(""),
         required=False)
 
 
@@ -51,62 +52,62 @@
     def test_getFieldNames(self):
         names = getFieldNames(ISchemaTest)
         self.assertEqual(len(names),3)
-        self.assert_('title' in names)
-        self.assert_('description' in names)
-        self.assert_('spam' in names)
+        self.assertTrue('title' in names)
+        self.assertTrue('description' in names)
+        self.assertTrue('spam' in names)
 
     def test_getFieldNamesAll(self):
         names = getFieldNames(ISchemaTestSubclass)
         self.assertEqual(len(names),4)
-        self.assert_('title' in names)
-        self.assert_('description' in names)
-        self.assert_('spam' in names)
-        self.assert_('foo' in names)
+        self.assertTrue('title' in names)
+        self.assertTrue('description' in names)
+        self.assertTrue('spam' in names)
+        self.assertTrue('foo' in names)
 
     def test_getFields(self):
         fields = getFields(ISchemaTest)
 
-        self.assert_(fields.has_key('title'))
-        self.assert_(fields.has_key('description'))
-        self.assert_(fields.has_key('spam'))
+        self.assertTrue('title' in fields)
+        self.assertTrue('description' in fields)
+        self.assertTrue('spam' in fields)
 
         # test whether getName() has the right value
-        for key, value in fields.iteritems():
-            self.assertEquals(key, value.getName())
+        for key, value in fields.items():
+            self.assertEqual(key, value.getName())
 
     def test_getFieldsAll(self):
         fields = getFields(ISchemaTestSubclass)
 
-        self.assert_(fields.has_key('title'))
-        self.assert_(fields.has_key('description'))
-        self.assert_(fields.has_key('spam'))
-        self.assert_(fields.has_key('foo'))
+        self.assertTrue('title' in fields)
+        self.assertTrue('description' in fields)
+        self.assertTrue('spam' in fields)
+        self.assertTrue('foo' in fields)
 
         # test whether getName() has the right value
-        for key, value in fields.iteritems():
-            self.assertEquals(key, value.getName())
+        for key, value in fields.items():
+            self.assertEqual(key, value.getName())
 
     def test_getFieldsInOrder(self):
         fields = getFieldsInOrder(ISchemaTest)
         field_names = [name for name, field in fields]
-        self.assertEquals(field_names, ['title', 'description', 'spam'])
+        self.assertEqual(field_names, ['title', 'description', 'spam'])
         for key, value in fields:
-            self.assertEquals(key, value.getName())
+            self.assertEqual(key, value.getName())
 
     def test_getFieldsInOrderAll(self):
         fields = getFieldsInOrder(ISchemaTestSubclass)
         field_names = [name for name, field in fields]
-        self.assertEquals(field_names, ['title', 'description', 'spam', 'foo'])
+        self.assertEqual(field_names, ['title', 'description', 'spam', 'foo'])
         for key, value in fields:
-            self.assertEquals(key, value.getName())
+            self.assertEqual(key, value.getName())
 
     def test_getFieldsNamesInOrder(self):
         names = getFieldNamesInOrder(ISchemaTest)
-        self.assertEquals(names, ['title', 'description', 'spam'])
+        self.assertEqual(names, ['title', 'description', 'spam'])
 
     def test_getFieldsNamesInOrderAll(self):
         names = getFieldNamesInOrder(ISchemaTestSubclass)
-        self.assertEquals(names, ['title', 'description', 'spam', 'foo'])
+        self.assertEqual(names, ['title', 'description', 'spam', 'foo'])
 
 def test_suite():
     return makeSuite(SchemaTest)

Modified: zope.schema/trunk/src/zope/schema/tests/test_setfield.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_setfield.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_setfield.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -15,7 +15,8 @@
 """
 from unittest import TestSuite, main, makeSuite
 
-from zope.interface import implements, providedBy
+from six import u
+from zope.interface import implementer, providedBy
 from zope.schema import Field, Set, Int, FrozenSet
 from zope.schema.interfaces import IField
 from zope.schema.interfaces import (
@@ -32,7 +33,7 @@
     _Field_Factory = Set
 
     def testValidate(self):
-        field = Set(title=u'Set field', description=u'',
+        field = Set(title=u('Set field'), description=u(''),
                     readonly=False, required=False)
         field.validate(None)
         field.validate(set())
@@ -50,7 +51,7 @@
         self.assertRaises(WrongType, field.validate, frozenset((1, 2, 3)))
 
     def testValidateRequired(self):
-        field = Set(title=u'Set field', description=u'',
+        field = Set(title=u('Set field'), description=u(''),
                     readonly=False, required=True)
         field.validate(set())
         field.validate(set((1, 2)))
@@ -79,7 +80,7 @@
         field.default = missing
 
     def testValidateMinValues(self):
-        field = Set(title=u'Set field', description=u'',
+        field = Set(title=u('Set field'), description=u(''),
                     readonly=False, required=False, min_length=2)
         field.validate(None)
         field.validate(set((1, 2)))
@@ -93,7 +94,7 @@
         self.assertRaises(TooShort, field.validate, set((3,)))
 
     def testValidateMaxValues(self):
-        field = Set(title=u'Set field', description=u'',
+        field = Set(title=u('Set field'), description=u(''),
                     readonly=False, required=False, max_length=2)
         field.validate(None)
         field.validate(set())
@@ -107,7 +108,7 @@
         self.assertRaises(TooLong, field.validate, set((1, 2, 3)))
 
     def testValidateMinValuesAndMaxValues(self):
-        field = Set(title=u'Set field', description=u'',
+        field = Set(title=u('Set field'), description=u(''),
                     readonly=False, required=False,
                     min_length=1, max_length=2)
         field.validate(None)
@@ -122,7 +123,7 @@
         self.assertRaises(TooLong, field.validate, set((1, 2, 3)))
 
     def testValidateValueTypes(self):
-        field = Set(title=u'Set field', description=u'',
+        field = Set(title=u('Set field'), description=u(''),
                     readonly=False, required=False,
                     value_type=Int())
         field.validate(None)
@@ -149,21 +150,22 @@
 
         # however, allow anything that implements IField
         Set(value_type=Field())
+        @implementer(IField)
         class FakeField(object):
-            implements(IField)
+            pass
         Set(value_type=FakeField())
     
     def testNoUniqueArgument(self):
         self.assertRaises(TypeError, Set, unique=False)
         self.assertRaises(TypeError, Set, unique=True)
-        self.failUnless(Set().unique)
+        self.assertTrue(Set().unique)
     
     def testImplements(self):
         field = Set()
-        self.failUnless(ISet.providedBy(field))
-        self.failUnless(IUnorderedCollection.providedBy(field))
-        self.failUnless(IAbstractSet.providedBy(field))
-        self.failUnless(ICollection.providedBy(field))
+        self.assertTrue(ISet.providedBy(field))
+        self.assertTrue(IUnorderedCollection.providedBy(field))
+        self.assertTrue(IAbstractSet.providedBy(field))
+        self.assertTrue(ICollection.providedBy(field))
 
 class FrozenSetTest(CollectionFieldTestBase):
     """Test the Tuple Field."""
@@ -171,7 +173,7 @@
     _Field_Factory = FrozenSet
 
     def testValidate(self):
-        field = FrozenSet(title=u'Set field', description=u'',
+        field = FrozenSet(title=u('Set field'), description=u(''),
                     readonly=False, required=False)
         field.validate(None)
         field.validate(frozenset())
@@ -187,7 +189,7 @@
         self.assertRaises(WrongType, field.validate, set((1, 2, 3)))
 
     def testValidateRequired(self):
-        field = FrozenSet(title=u'Set field', description=u'',
+        field = FrozenSet(title=u('Set field'), description=u(''),
                     readonly=False, required=True)
         field.validate(frozenset())
         field.validate(frozenset((1, 2)))
@@ -212,7 +214,7 @@
         field.default = missing
 
     def testValidateMinValues(self):
-        field = FrozenSet(title=u'FrozenSet field', description=u'',
+        field = FrozenSet(title=u('FrozenSet field'), description=u(''),
                     readonly=False, required=False, min_length=2)
         field.validate(None)
         field.validate(frozenset((1, 2)))
@@ -222,7 +224,7 @@
         self.assertRaises(TooShort, field.validate, frozenset((3,)))
 
     def testValidateMaxValues(self):
-        field = FrozenSet(title=u'FrozenSet field', description=u'',
+        field = FrozenSet(title=u('FrozenSet field'), description=u(''),
                           readonly=False, required=False, max_length=2)
         field.validate(None)
         field.validate(frozenset())
@@ -232,7 +234,7 @@
         self.assertRaises(TooLong, field.validate, frozenset((1, 2, 3)))
 
     def testValidateMinValuesAndMaxValues(self):
-        field = FrozenSet(title=u'FrozenSet field', description=u'',
+        field = FrozenSet(title=u('FrozenSet field'), description=u(''),
                           readonly=False, required=False,
                           min_length=1, max_length=2)
         field.validate(None)
@@ -243,7 +245,7 @@
         self.assertRaises(TooLong, field.validate, frozenset((1, 2, 3)))
 
     def testValidateValueTypes(self):
-        field = FrozenSet(title=u'FrozenSet field', description=u'',
+        field = FrozenSet(title=u('FrozenSet field'), description=u(''),
                           readonly=False, required=False,
                           value_type=Int())
         field.validate(None)
@@ -264,21 +266,22 @@
 
         # however, allow anything that implements IField
         FrozenSet(value_type=Field())
+        @implementer(IField)
         class FakeField(object):
-            implements(IField)
+            pass
         FrozenSet(value_type=FakeField())
     
     def testNoUniqueArgument(self):
         self.assertRaises(TypeError, FrozenSet, unique=False)
         self.assertRaises(TypeError, FrozenSet, unique=True)
-        self.failUnless(FrozenSet().unique)
+        self.assertTrue(FrozenSet().unique)
     
     def testImplements(self):
         field = FrozenSet()
-        self.failUnless(IFrozenSet.providedBy(field))
-        self.failUnless(IAbstractSet.providedBy(field))
-        self.failUnless(IUnorderedCollection.providedBy(field))
-        self.failUnless(ICollection.providedBy(field))
+        self.assertTrue(IFrozenSet.providedBy(field))
+        self.assertTrue(IAbstractSet.providedBy(field))
+        self.assertTrue(IUnorderedCollection.providedBy(field))
+        self.assertTrue(ICollection.providedBy(field))
 
 def test_suite():
     suite = TestSuite()

Modified: zope.schema/trunk/src/zope/schema/tests/test_states.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_states.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_states.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -15,6 +15,7 @@
 """
 import unittest
 
+from six import u
 from zope.interface import Interface
 from zope.interface.verify import verifyObject
 
@@ -26,25 +27,25 @@
 
 class IBirthInfo(Interface):
     state1 = Choice(
-        title=u'State of Birth',
-        description=u'The state in which you were born.',
+        title=u('State of Birth'),
+        description=u('The state in which you were born.'),
         vocabulary="states",
         default="AL",
         )
     state2 = Choice(
-        title=u'State of Birth',
-        description=u'The state in which you were born.',
+        title=u('State of Birth'),
+        description=u('The state in which you were born.'),
         vocabulary="states",
         default="AL",
         )
     state3 = Choice(
-        title=u'Favorite State',
-        description=u'The state you like the most.',
+        title=u('Favorite State'),
+        description=u('The state you like the most.'),
         vocabulary=states.StateVocabulary(),
         )
     state4 = Choice(
-        title=u"Name",
-        description=u"The name of your new state",
+        title=u("Name"),
+        description=u("The name of your new state"),
         vocabulary="states",
         )
 
@@ -61,17 +62,17 @@
     def test_default_presentation(self):
         field = IBirthInfo.getDescriptionFor("state1")
         bound = field.bind(object())
-        self.assert_(verifyObject(IVocabulary, bound.vocabulary))
+        self.assertTrue(verifyObject(IVocabulary, bound.vocabulary))
         self.assertEqual(bound.vocabulary.getTerm("VA").title, "Virginia")
 
     def test_contains(self):
         vocab = states.StateVocabulary()
-        self.assert_(verifyObject(IVocabulary, vocab))
+        self.assertTrue(verifyObject(IVocabulary, vocab))
         count = 0
         L = list(vocab)
         for term in L:
             count += 1
-            self.assert_(term.value in vocab)
+            self.assertTrue(term.value in vocab)
         self.assertEqual(count, len(vocab))
         # make sure we get the same values the second time around:
         L = [term.value for term in L]
@@ -83,9 +84,9 @@
     def test_prebound_vocabulary(self):
         field = IBirthInfo.getDescriptionFor("state3")
         bound = field.bind(None)
-        self.assert_(bound.vocabularyName is None)
-        self.assert_(verifyObject(IVocabulary, bound.vocabulary))
-        self.assert_("AL" in bound.vocabulary)
+        self.assertTrue(bound.vocabularyName is None)
+        self.assertTrue(verifyObject(IVocabulary, bound.vocabulary))
+        self.assertTrue("AL" in bound.vocabulary)
 
 
 def test_suite():

Modified: zope.schema/trunk/src/zope/schema/tests/test_strfield.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_strfield.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_strfield.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -14,6 +14,7 @@
 """String field tests
 """
 from unittest import TestSuite, main, makeSuite
+from six import b, u
 from zope.schema import Bytes, BytesLine, Text, TextLine, Password
 from zope.schema.interfaces import ValidationError, WrongType
 from zope.schema.interfaces import RequiredMissing, InvalidValue
@@ -24,7 +25,7 @@
     """Test the Str Field."""
 
     def testValidate(self):
-        field = self._Field_Factory(title=u'Str field', description=u'',
+        field = self._Field_Factory(title=u('Str field'), description=u(''),
                                     readonly=False, required=False)
         field.validate(None)
         field.validate(self._convert('foo'))
@@ -36,7 +37,7 @@
         # we need to set the min-length to 1.
 
         field = self._Field_Factory(
-            title=u'Str field', description=u'',
+            title=u('Str field'), description=u(''),
             readonly=False, required=True, min_length=1)
         field.validate(self._convert('foo'))
 
@@ -45,7 +46,7 @@
 
     def testValidateMinLength(self):
         field = self._Field_Factory(
-            title=u'Str field', description=u'',
+            title=u('Str field'), description=u(''),
             readonly=False, required=False, min_length=3)
         field.validate(None)
         field.validate(self._convert('333'))
@@ -57,7 +58,7 @@
 
     def testValidateMaxLength(self):
         field = self._Field_Factory(
-            title=u'Str field', description=u'',
+            title=u('Str field'), description=u(''),
             readonly=False, required=False, max_length=5)
         field.validate(None)
         field.validate(self._convert(''))
@@ -69,7 +70,7 @@
 
     def testValidateMinLengthAndMaxLength(self):
         field = self._Field_Factory(
-            title=u'Str field', description=u'',
+            title=u('Str field'), description=u(''),
             readonly=False, required=False,
             min_length=3, max_length=5)
 
@@ -87,32 +88,34 @@
 class MultiLine(object):
 
     def test_newlines(self):
-        field = self._Field_Factory(title=u'Str field')
+        field = self._Field_Factory(title=u('Str field'))
         field.validate(self._convert('hello\nworld'))
 
 
 class BytesTest(StrTest, MultiLine):
     _Field_Factory = Bytes
-    _convert = str
 
+    def _convert(self, v):
+        return b(v)
+
     def testBadStringType(self):
         field = self._Field_Factory()
-        self.assertRaises(ValidationError, field.validate, u'hello')
+        self.assertRaises(ValidationError, field.validate, u('hello'))
 
 
 class TextTest(StrTest, MultiLine):
     _Field_Factory = Text
     def _convert(self, v):
-        return unicode(v, 'ascii')
+        return u(v)
 
     def testBadStringType(self):
         field = self._Field_Factory()
-        self.assertRaises(ValidationError, field.validate, 'hello')
+        self.assertRaises(ValidationError, field.validate, b('hello'))
 
 class SingleLine(object):
 
     def test_newlines(self):
-        field = self._Field_Factory(title=u'Str field')
+        field = self._Field_Factory(title=u('Str field'))
         self.assertRaises(ConstraintNotSatisfied,
                                     field.validate,
                                     self._convert('hello\nworld'))
@@ -125,7 +128,7 @@
             password = None
         dummy = Dummy()
 
-        field = self._Field_Factory(title=u'Str field', description=u'',
+        field = self._Field_Factory(title=u('Str field'), description=u(''),
                                     readonly=False, required=True, __name__='password')
         field = field.bind(dummy)
 
@@ -136,12 +139,12 @@
         field.validate(field.UNCHANGED_PASSWORD)
 
         # Using a normal value, the field gets updated
-        field.set(dummy, u'test')
-        self.assertEquals(u'test', dummy.password)
+        field.set(dummy, u('test'))
+        self.assertEqual(u('test'), dummy.password)
 
         # Using UNCHANGED_PASSWORD the field is not updated.
         field.set(dummy, field.UNCHANGED_PASSWORD)
-        self.assertEquals(u'test', dummy.password)
+        self.assertEqual(u('test'), dummy.password)
 
 
 class LineTest(SingleLine, BytesTest):

Modified: zope.schema/trunk/src/zope/schema/tests/test_timedelta.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_timedelta.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_timedelta.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -14,6 +14,8 @@
 """Timedelta Field tests
 """
 from unittest import main, makeSuite
+
+from six import u
 from zope.schema import Timedelta
 from zope.schema.interfaces import RequiredMissing, InvalidValue
 from zope.schema.interfaces import TooSmall, TooBig
@@ -31,13 +33,13 @@
         verifyObject(ITimedelta, self._Field_Factory())
 
     def testValidate(self):
-        field = self._Field_Factory(title=u'Timedelta field', description=u'',
+        field = self._Field_Factory(title=u('Timedelta field'), description=u(''),
                                     readonly=False, required=False)
         field.validate(None)
         field.validate(timedelta(minutes=15))
 
     def testValidateRequired(self):
-        field = self._Field_Factory(title=u'Timedelta field', description=u'',
+        field = self._Field_Factory(title=u('Timedelta field'), description=u(''),
                                     readonly=False, required=True)
         field.validate(timedelta(minutes=15))
 
@@ -46,7 +48,7 @@
     def testValidateMin(self):
         t1 = timedelta(hours=2)
         t2 = timedelta(hours=3)
-        field = self._Field_Factory(title=u'Timedelta field', description=u'',
+        field = self._Field_Factory(title=u('Timedelta field'), description=u(''),
                                     readonly=False, required=False, min=t1)
         field.validate(None)
         field.validate(t1)
@@ -58,7 +60,7 @@
         t1 = timedelta(minutes=1)
         t2 = timedelta(minutes=2)
         t3 = timedelta(minutes=3)
-        field = self._Field_Factory(title=u'Timedelta field', description=u'',
+        field = self._Field_Factory(title=u('Timedelta field'), description=u(''),
                                     readonly=False, required=False, max=t2)
         field.validate(None)
         field.validate(t1)
@@ -73,7 +75,7 @@
         t4 = timedelta(days=4)
         t5 = timedelta(days=5)
 
-        field = self._Field_Factory(title=u'Timedelta field', description=u'',
+        field = self._Field_Factory(title=u('Timedelta field'), description=u(''),
                                     readonly=False, required=False,
                                     min=t2, max=t4)
         field.validate(None)

Modified: zope.schema/trunk/src/zope/schema/tests/test_tuplefield.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_tuplefield.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_tuplefield.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -15,7 +15,8 @@
 """
 from unittest import TestSuite, main, makeSuite
 
-from zope.interface import implements
+from six import u
+from zope.interface import implementer
 from zope.schema import Field, Tuple, Int
 from zope.schema.interfaces import IField
 from zope.schema.interfaces import ICollection, ISequence, ITuple
@@ -30,7 +31,7 @@
     _Field_Factory = Tuple
 
     def testValidate(self):
-        field = Tuple(title=u'Tuple field', description=u'',
+        field = Tuple(title=u('Tuple field'), description=u(''),
                       readonly=False, required=False)
         field.validate(None)
         field.validate(())
@@ -43,7 +44,7 @@
         self.assertRaises(WrongType, field.validate, {})
 
     def testValidateRequired(self):
-        field = Tuple(title=u'Tuple field', description=u'',
+        field = Tuple(title=u('Tuple field'), description=u(''),
                       readonly=False, required=True)
         field.validate(())
         field.validate((1, 2))
@@ -52,7 +53,7 @@
         self.assertRaises(RequiredMissing, field.validate, None)
 
     def testValidateMinValues(self):
-        field = Tuple(title=u'Tuple field', description=u'',
+        field = Tuple(title=u('Tuple field'), description=u(''),
                       readonly=False, required=False, min_length=2)
         field.validate(None)
         field.validate((1, 2))
@@ -62,7 +63,7 @@
         self.assertRaises(TooShort, field.validate, (1,))
 
     def testValidateMaxValues(self):
-        field = Tuple(title=u'Tuple field', description=u'',
+        field = Tuple(title=u('Tuple field'), description=u(''),
                       readonly=False, required=False, max_length=2)
         field.validate(None)
         field.validate(())
@@ -72,7 +73,7 @@
         self.assertRaises(TooLong, field.validate, (1, 2, 3))
 
     def testValidateMinValuesAndMaxValues(self):
-        field = Tuple(title=u'Tuple field', description=u'',
+        field = Tuple(title=u('Tuple field'), description=u(''),
                       readonly=False, required=False,
                       min_length=1, max_length=2)
         field.validate(None)
@@ -83,7 +84,7 @@
         self.assertRaises(TooLong, field.validate, (1, 2, 3))
 
     def testValidateValueTypes(self):
-        field = Tuple(title=u'Tuple field', description=u'',
+        field = Tuple(title=u('Tuple field'), description=u(''),
                       readonly=False, required=False,
                       value_type=Int())
         field.validate(None)
@@ -103,21 +104,22 @@
 
         # however, allow anything that implements IField
         Tuple(value_type=Field())
+        @implementer(IField)
         class FakeField(object):
-            implements(IField)
+            pass
         Tuple(value_type=FakeField())
 
     def testUnique(self):
-        field = self._Field_Factory(title=u'test field', description=u'',
+        field = self._Field_Factory(title=u('test field'), description=u(''),
                                     readonly=False, required=True, unique=True)
         field.validate((1, 2))
         self.assertRaises(NotUnique, field.validate, (1, 2, 1))
     
     def testImplements(self):
         field = Tuple()
-        self.failUnless(ITuple.providedBy(field))
-        self.failUnless(ISequence.providedBy(field))
-        self.failUnless(ICollection.providedBy(field))
+        self.assertTrue(ITuple.providedBy(field))
+        self.assertTrue(ISequence.providedBy(field))
+        self.assertTrue(ICollection.providedBy(field))
 
 def test_suite():
     suite = TestSuite()

Modified: zope.schema/trunk/src/zope/schema/tests/test_vocabulary.py
===================================================================
--- zope.schema/trunk/src/zope/schema/tests/test_vocabulary.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/tests/test_vocabulary.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -17,7 +17,7 @@
 
 from zope.interface.verify import verifyObject
 from zope.interface.exceptions import DoesNotImplement
-from zope.interface import Interface, implements
+from zope.interface import Interface, implementer
 
 from zope.schema import interfaces
 from zope.schema import vocabulary
@@ -48,19 +48,19 @@
     def test_setVocabularyRegistry(self):
         r = DummyRegistry()
         vocabulary.setVocabularyRegistry(r)
-        self.assert_(vocabulary.getVocabularyRegistry() is r)
+        self.assertTrue(vocabulary.getVocabularyRegistry() is r)
 
     def test_getVocabularyRegistry(self):
         r = vocabulary.getVocabularyRegistry()
-        self.assert_(interfaces.IVocabularyRegistry.providedBy(r))
+        self.assertTrue(interfaces.IVocabularyRegistry.providedBy(r))
 
     # TODO: still need to test the default implementation
 
 class SampleTerm(object):
     pass
 
+ at implementer(interfaces.IVocabulary)
 class SampleVocabulary(object):
-    implements(interfaces.IVocabulary)
 
     def __iter__(self):
         return iter([self.getTerm(x) for x in range(0, 10)])
@@ -99,13 +99,13 @@
     def test_simple_term_title(self):
         t = vocabulary.SimpleTerm(1)
         verifyObject(interfaces.ITokenizedTerm, t)
-        self.failUnlessRaises(DoesNotImplement, verifyObject,
+        self.assertRaises(DoesNotImplement, verifyObject,
             interfaces.ITitledTokenizedTerm, t)
-        self.failUnless(t.title is None)
+        self.assertTrue(t.title is None)
         t = vocabulary.SimpleTerm(1, title="Title")
         verifyObject(interfaces.ITokenizedTerm, t)
         verifyObject(interfaces.ITitledTokenizedTerm, t)
-        self.failUnlessEqual(t.title, "Title")
+        self.assertEqual(t.title, "Title")
 
     def test_order(self):
         value = 1
@@ -119,18 +119,18 @@
             value += 1
 
     def test_implementation(self):
-        self.failUnless(verifyObject(interfaces.IVocabulary, self.list_vocab))
-        self.failUnless(
+        self.assertTrue(verifyObject(interfaces.IVocabulary, self.list_vocab))
+        self.assertTrue(
             verifyObject(interfaces.IVocabularyTokenized, self.list_vocab))
-        self.failUnless(verifyObject(interfaces.IVocabulary, self.items_vocab))
-        self.failUnless(
+        self.assertTrue(verifyObject(interfaces.IVocabulary, self.items_vocab))
+        self.assertTrue(
             verifyObject(interfaces.IVocabularyTokenized, self.items_vocab))
 
     def test_addt_interfaces(self):
         class IStupid(Interface):
             pass
         v = vocabulary.SimpleVocabulary.fromValues([1, 2, 3], IStupid)
-        self.failUnless(IStupid.providedBy(v))
+        self.assertTrue(IStupid.providedBy(v))
 
     def test_len(self):
         self.assertEqual(len(self.list_vocab), 3)
@@ -138,14 +138,14 @@
 
     def test_contains(self):
         for v in (self.list_vocab, self.items_vocab):
-            self.assert_(1 in v and 2 in v and 3 in v)
-            self.assert_(5 not in v)
+            self.assertTrue(1 in v and 2 in v and 3 in v)
+            self.assertTrue(5 not in v)
 
     def test_iter_and_get_term(self):
         for v in (self.list_vocab, self.items_vocab):
             for term in v:
-                self.assert_(v.getTerm(term.value) is term)
-                self.assert_(v.getTermByToken(term.token) is term)
+                self.assertTrue(v.getTerm(term.value) is term)
+                self.assertTrue(v.getTermByToken(term.token) is term)
 
     def test_nonunique_tokens(self):
         self.assertRaises(
@@ -161,14 +161,14 @@
     def test_nonunique_token_message(self):
         try:
             vocabulary.SimpleVocabulary.fromValues([2, '2'])
-        except ValueError, e:
-            self.assertEquals(str(e), "term tokens must be unique: '2'")
+        except ValueError as e:
+            self.assertEqual(str(e), "term tokens must be unique: '2'")
 
     def test_nonunique_token_messages(self):
         try:
             vocabulary.SimpleVocabulary.fromItems([(0, 'one'), (1, 'one')])
-        except ValueError, e:
-            self.assertEquals(str(e), "term values must be unique: 'one'")
+        except ValueError as e:
+            self.assertEqual(str(e), "term values must be unique: 'one'")
 
     def test_overriding_createTerm(self):
         class MyTerm(object):

Modified: zope.schema/trunk/src/zope/schema/validation.txt
===================================================================
--- zope.schema/trunk/src/zope/schema/validation.txt	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/validation.txt	2011-10-14 10:51:07 UTC (rev 123093)
@@ -16,13 +16,14 @@
 
   >>> import zope.interface
   >>> import zope.schema
+  >>> from six import print_
   >>> class ITwoInts(zope.interface.Interface):
   ...     a = zope.schema.Int(max=10)
   ...     b = zope.schema.Int(min=5)
   ...
   ...     @zope.interface.invariant
   ...     def a_greater_b(obj):
-  ...         print "Checking if a > b"
+  ...         print_("Checking if a > b")
   ...         if obj.a <= obj.b:
   ...             raise zope.interface.Invalid("%s<=%s" % (obj.a, obj.b))
   ...     

Modified: zope.schema/trunk/src/zope/schema/vocabulary.py
===================================================================
--- zope.schema/trunk/src/zope/schema/vocabulary.py	2011-10-14 10:44:40 UTC (rev 123092)
+++ zope.schema/trunk/src/zope/schema/vocabulary.py	2011-10-14 10:51:07 UTC (rev 123093)
@@ -13,7 +13,7 @@
 ##############################################################################
 """Vocabulary support for schema.
 """
-from zope.interface.declarations import directlyProvides, implements
+from zope.interface.declarations import directlyProvides, implementer
 from zope.schema.interfaces import ValidationError
 from zope.schema.interfaces import IVocabularyRegistry
 from zope.schema.interfaces import IVocabulary, IVocabularyTokenized
@@ -23,11 +23,10 @@
 
 _marker = object()
 
+ at implementer(ITokenizedTerm)
 class SimpleTerm(object):
     """Simple tokenized term used by SimpleVocabulary."""
 
-    implements(ITokenizedTerm)
-
     def __init__(self, value, token=None, title=None):
         """Create a term for value and token. If token is omitted,
         str(value) is used for the token.  If title is provided, 
@@ -41,11 +40,10 @@
         if title is not None:
             directlyProvides(self, ITitledTokenizedTerm)
 
+ at implementer(IVocabularyTokenized)
 class SimpleVocabulary(object):
     """Vocabulary that works from a sequence of terms."""
 
-    implements(IVocabularyTokenized)
-
     def __init__(self, terms, *interfaces):
         """Initialize the vocabulary given a list of terms.
 
@@ -151,9 +149,9 @@
         return "unknown vocabulary: %r" % self.name
 
 
+ at implementer(IVocabularyRegistry)
 class VocabularyRegistry(object):
     __slots__ = '_map',
-    implements(IVocabularyRegistry)
 
     def __init__(self):
         self._map = {}



More information about the checkins mailing list