diff --git a/CHANGES.rst b/CHANGES.rst
index de05167..01bb7c1 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -42,6 +42,21 @@
   <https://github.com/zopefoundation/zope.schema/issues/15>`_ and `PR
   6 <https://github.com/zopefoundation/zope.schema/pull/6>`_.
 
+- All instances of ``ValidationError`` have a ``field`` and ``value``
+  attribute that is set to the field that raised the exception and the
+  value that failed validation.
+
+- ``Float``, ``Int`` and ``Decimal`` fields raise ``ValidationError``
+  subclasses for literals that cannot be parsed. These subclasses also
+  subclass ``ValueError`` for backwards compatibility.
+
+- Add a new exception ``SchemaNotCorrectlyImplemented``, a subclass of
+  ``WrongContainedType`` that is raised by the ``Object`` field. It
+  has a dictionary (``schema_errors``) mapping invalid schema
+  attributes to their corresponding exception, and a list
+  (``invariant_errors``) containing the exceptions raised by
+  validating invariants. See `issue 16
+  <https://github.com/zopefoundation/zope.schema/issues/16>`_.
 
 4.5.0 (2017-07-10)
 ==================
diff --git a/docs/fields.rst b/docs/fields.rst
index 7799441..7ebabaf 100644
--- a/docs/fields.rst
+++ b/docs/fields.rst
@@ -101,7 +101,27 @@ Conversion from Unicode:
    >>> f.fromUnicode("1.25.6") #doctest: +IGNORE_EXCEPTION_DETAIL
    Traceback (most recent call last):
    ...
-   ValueError: invalid literal for float(): 1.25.6
+   InvalidFloatLiteral: invalid literal for float(): 1.25.6
+
+Int
+###
+
+:class:`zope.schema.Int` fields contain binary data, represented
+as a a Python ``int``.
+
+Conversion from Unicode:
+
+.. doctest::
+
+   >>> from zope.schema import Int
+   >>> f = Int()
+   >>> f.fromUnicode("1")
+   1
+   >>> f.fromUnicode("1.25.6") #doctest: +IGNORE_EXCEPTION_DETAIL
+   Traceback (most recent call last):
+   ...
+   InvalidIntLiteral: invalid literal for int() with base 10: 1.25.6
+
 
 Decimal
 #######
@@ -123,7 +143,7 @@ Conversion from Unicode:
    >>> f.fromUnicode("1.25.6")
    Traceback (most recent call last):
    ...
-   ValueError: invalid literal for Decimal(): 1.25.6
+   InvalidDecimalLiteral: invalid literal for Decimal(): 1.25.6
 
 Datetime
 ########
diff --git a/src/zope/schema/_bootstrapfields.py b/src/zope/schema/_bootstrapfields.py
index 5c318e7..6501310 100644
--- a/src/zope/schema/_bootstrapfields.py
+++ b/src/zope/schema/_bootstrapfields.py
@@ -19,6 +19,7 @@ from zope.interface import Attribute
 from zope.interface import providedBy
 from zope.interface import implementer
 
+from zope.schema._bootstrapinterfaces import ValidationError
 from zope.schema._bootstrapinterfaces import ConstraintNotSatisfied
 from zope.schema._bootstrapinterfaces import IContextAwareDefaultFactory
 from zope.schema._bootstrapinterfaces import IFromUnicode
@@ -181,7 +182,7 @@ class Field(Attribute):
     def validate(self, value):
         if value == self.missing_value:
             if self.required:
-                raise RequiredMissing(self.__name__)
+                raise RequiredMissing(self.__name__).with_field_and_value(self, value)
         else:
             try:
                 self._validate(value)
@@ -227,10 +228,10 @@ class Field(Attribute):
 
     def _validate(self, value):
         if self._type is not None and not isinstance(value, self._type):
-            raise WrongType(value, self._type, self.__name__)
+            raise WrongType(value, self._type, self.__name__).with_field_and_value(self, value)
 
         if not self.constraint(value):
-            raise ConstraintNotSatisfied(value, self.__name__)
+            raise ConstraintNotSatisfied(value, self.__name__).with_field_and_value(self, value)
 
     def get(self, object):
         return getattr(object, self.__name__)
@@ -257,7 +258,7 @@ class Container(Field):
             try:
                 iter(value)
             except TypeError:
-                raise NotAContainer(value)
+                raise NotAContainer(value).with_field_and_value(self, value)
 
 
 # XXX This class violates the Liskov Substituability Principle:  it
@@ -272,7 +273,7 @@ class Iterable(Container):
         try:
             iter(value)
         except TypeError:
-            raise NotAnIterator(value)
+            raise NotAnIterator(value).with_field_and_value(self, value)
 
 
 class Orderable(object):
@@ -307,10 +308,10 @@ class Orderable(object):
         super(Orderable, self)._validate(value)
 
         if self.min is not None and value < self.min:
-            raise TooSmall(value, self.min)
+            raise TooSmall(value, self.min).with_field_and_value(self, value)
 
         if self.max is not None and value > self.max:
-            raise TooBig(value, self.max)
+            raise TooBig(value, self.max).with_field_and_value(self, value)
 
 
 class MinMaxLen(object):
@@ -330,10 +331,10 @@ class MinMaxLen(object):
         super(MinMaxLen, self)._validate(value)
 
         if self.min_length is not None and len(value) < self.min_length:
-            raise TooShort(value, self.min_length)
+            raise TooShort(value, self.min_length).with_field_and_value(self, value)
 
         if self.max_length is not None and len(value) > self.max_length:
-            raise TooLong(value, self.max_length)
+            raise TooLong(value, self.max_length).with_field_and_value(self, value)
 
 
 @implementer(IFromUnicode)
@@ -440,6 +441,9 @@ class Bool(Field):
         self.validate(v)
         return v
 
+class InvalidIntLiteral(ValueError, ValidationError):
+    """Invalid int literal."""
+
 
 @implementer(IFromUnicode)
 class Int(Orderable, Field):
@@ -458,8 +462,11 @@ class Int(Orderable, Field):
         >>> f.fromUnicode("125.6") #doctest: +IGNORE_EXCEPTION_DETAIL
         Traceback (most recent call last):
         ...
-        ValueError: invalid literal for int(): 125.6
+        InvalidIntLiteral: invalid literal for int(): 125.6
         """
-        v = int(str)
+        try:
+            v = int(str)
+        except ValueError as v:
+            raise InvalidIntLiteral(*v.args).with_field_and_value(self, str)
         self.validate(v)
         return v
diff --git a/src/zope/schema/_bootstrapinterfaces.py b/src/zope/schema/_bootstrapinterfaces.py
index 60f265f..40d85e2 100644
--- a/src/zope/schema/_bootstrapinterfaces.py
+++ b/src/zope/schema/_bootstrapinterfaces.py
@@ -32,6 +32,17 @@ class StopValidation(Exception):
 class ValidationError(zope.interface.Invalid):
     """Raised if the Validation process fails."""
 
+    #: The field that raised the error, if known.
+    field = None
+
+    #: The value that failed validation.
+    value = None
+
+    def with_field_and_value(self, field, value):
+        self.field = field
+        self.value = value
+        return self
+
     def doc(self):
         return self.__class__.__doc__
 
diff --git a/src/zope/schema/_field.py b/src/zope/schema/_field.py
index 67d4210..807ca48 100644
--- a/src/zope/schema/_field.py
+++ b/src/zope/schema/_field.py
@@ -72,6 +72,7 @@ from zope.schema.interfaces import WrongType
 from zope.schema.interfaces import WrongContainedType
 from zope.schema.interfaces import NotUnique
 from zope.schema.interfaces import SchemaNotProvided
+from zope.schema.interfaces import SchemaNotCorrectlyImplemented
 from zope.schema.interfaces import SchemaNotFullyImplemented
 from zope.schema.interfaces import InvalidURI
 from zope.schema.interfaces import InvalidId
@@ -157,7 +158,7 @@ class ASCII(NativeString):
         if not value:
             return
         if not max(map(ord, value)) < 128:
-            raise InvalidValue
+            raise InvalidValue().with_field_and_value(self, value)
 
 
 @implementer(IBytesLine)
@@ -184,6 +185,10 @@ class ASCIILine(ASCII):
         return '\n' not in value
 
 
+class InvalidFloatLiteral(ValueError, ValidationError):
+    """Raised by Float fields."""
+
+
 @implementer(IFloat, IFromUnicode)
 class Float(Orderable, Field):
     __doc__ = IFloat.__doc__
@@ -195,11 +200,21 @@ class Float(Orderable, Field):
     def fromUnicode(self, uc):
         """ See IFromUnicode.
         """
-        v = float(uc)
+        try:
+            v = float(uc)
+        except ValueError as v:
+            raise InvalidFloatLiteral(*v.args).with_field_and_value(self, uc)
         self.validate(v)
         return v
 
 
+class InvalidDecimalLiteral(ValueError, ValidationError):
+
+    def __init__(self, literal):
+        super(InvalidDecimalLiteral, self).__init__(
+            "invalid literal for Decimal(): %s" % literal)
+
+
 @implementer(IDecimal, IFromUnicode)
 class Decimal(Orderable, Field):
     __doc__ = IDecimal.__doc__
@@ -214,7 +229,7 @@ class Decimal(Orderable, Field):
         try:
             v = decimal.Decimal(uc)
         except decimal.InvalidOperation:
-            raise ValueError('invalid literal for Decimal(): %s' % uc)
+            raise InvalidDecimalLiteral(uc).with_field_and_value(self, uc)
         self.validate(v)
         return v
 
@@ -236,7 +251,7 @@ class Date(Orderable, Field):
     def _validate(self, value):
         super(Date, self)._validate(value)
         if isinstance(value, datetime):
-            raise WrongType(value, self._type, self.__name__)
+            raise WrongType(value, self._type, self.__name__).with_field_and_value(self, value)
 
 
 @implementer(ITimedelta)
@@ -336,7 +351,7 @@ class Choice(Field):
             except VocabularyRegistryError:
                 raise ValueError("Can't validate value without vocabulary")
         if value not in vocabulary:
-            raise ConstraintNotSatisfied(value, self.__name__)
+            raise ConstraintNotSatisfied(value, self.__name__).with_field_and_value(self, value)
 
 
 _isuri = r"[a-zA-z0-9+.-]+:"  # scheme
@@ -354,7 +369,7 @@ class URI(NativeStringLine):
         if _isuri(value):
             return
 
-        raise InvalidURI(value)
+        raise InvalidURI(value).with_field_and_value(self, value)
 
     def fromUnicode(self, value):
         """ See IFromUnicode.
@@ -384,7 +399,7 @@ class _StrippedNativeStringLine(NativeStringLine):
         try:
             v = v.encode('ascii') # bytes
         except UnicodeEncodeError:
-            raise self._invalid_exc_type(value)
+            raise self._invalid_exc_type(value).with_field_and_value(self, value)
         if not isinstance(v, self._type):
             v = v.decode('ascii')
         self.validate(v)
@@ -417,15 +432,15 @@ class DottedName(_StrippedNativeStringLine):
         """
         super(DottedName, self)._validate(value)
         if not _isdotted(value):
-            raise InvalidDottedName(value)
+            raise InvalidDottedName(value).with_field_and_value(self, value)
         dots = value.count(".")
         if dots < self.min_dots:
             raise InvalidDottedName(
                 "too few dots; %d required" % self.min_dots, value
-            )
+            ).with_field_and_value(self, value)
         if self.max_dots is not None and dots > self.max_dots:
             raise InvalidDottedName("too many dots; no more than %d allowed" %
-                                    self.max_dots, value)
+                                    self.max_dots, value).with_field_and_value(self, value)
 
 
 
@@ -445,7 +460,7 @@ class Id(_StrippedNativeStringLine):
         if _isdotted(value) and "." in value:
             return
 
-        raise InvalidId(value)
+        raise InvalidId(value).with_field_and_value(self, value)
 
 
 @implementer(IInterfaceField)
@@ -455,7 +470,11 @@ class InterfaceField(Field):
     def _validate(self, value):
         super(InterfaceField, self)._validate(value)
         if not IInterface.providedBy(value):
-            raise WrongType("An interface is required", value, self.__name__)
+            raise WrongType(
+                "An interface is required",
+                value,
+                self.__name__
+            ).with_field_and_value(self, value)
 
 
 def _validate_sequence(value_type, value, errors=None):
@@ -500,11 +519,11 @@ def _validate_sequence(value_type, value, errors=None):
     return errors
 
 
-def _validate_uniqueness(value):
+def _validate_uniqueness(self, value):
     temp_values = []
     for item in value:
         if item in temp_values:
-            raise NotUnique(item)
+            raise NotUnique(item).with_field_and_value(self, value)
 
         temp_values.append(item)
 
@@ -534,9 +553,13 @@ class AbstractCollection(MinMaxLen, Iterable):
         super(AbstractCollection, self)._validate(value)
         errors = _validate_sequence(self.value_type, value)
         if errors:
-            raise WrongContainedType(errors, self.__name__)
+            try:
+                raise WrongContainedType(errors, self.__name__).with_field_and_value(self, value)
+            finally:
+                # Break cycles
+                del errors
         if self.unique:
-            _validate_uniqueness(value)
+            _validate_uniqueness(self, value)
 
 
 @implementer(ITuple)
@@ -577,9 +600,8 @@ class FrozenSet(AbstractCollection):
 VALIDATED_VALUES = threading.local()
 
 
-def _validate_fields(schema, value, errors=None):
-    if errors is None:
-        errors = []
+def _validate_fields(schema, value):
+    errors = {}
     # Interface can be used as schema property for Object fields that plan to
     # hold values of any type.
     # Because Interface does not include any Attribute, it is obviously not
@@ -599,22 +621,24 @@ def _validate_fields(schema, value, errors=None):
     # that supports attribute assignment.)
     try:
         for name in schema.names(all=True):
-            if not IMethod.providedBy(schema[name]):
-                try:
-                    attribute = schema[name]
-                    if IChoice.providedBy(attribute):
-                        # Choice must be bound before validation otherwise
-                        # IContextSourceBinder is not iterable in validation
-                        bound = attribute.bind(value)
-                        bound.validate(getattr(value, name))
-                    elif IField.providedBy(attribute):
-                        # validate attributes that are fields
-                        attribute.validate(getattr(value, name))
-                except ValidationError as error:
-                    errors.append(error)
-                except AttributeError as error:
-                    # property for the given name is not implemented
-                    errors.append(SchemaNotFullyImplemented(error))
+            attribute = schema[name]
+            if IMethod.providedBy(attribute):
+                continue # pragma: no cover
+
+            try:
+                if IChoice.providedBy(attribute):
+                    # Choice must be bound before validation otherwise
+                    # IContextSourceBinder is not iterable in validation
+                    bound = attribute.bind(value)
+                    bound.validate(getattr(value, name))
+                elif IField.providedBy(attribute):
+                    # validate attributes that are fields
+                    attribute.validate(getattr(value, name))
+            except ValidationError as error:
+                errors[name] = error
+            except AttributeError as error:
+                # property for the given name is not implemented
+                errors[name] = SchemaNotFullyImplemented(error).with_field_and_value(attribute, None)
     finally:
         del VALIDATED_VALUES.__dict__[id(value)]
     return errors
@@ -647,14 +671,14 @@ class Object(Field):
 
         # schema has to be provided by value
         if not self.schema.providedBy(value):
-            raise SchemaNotProvided
+            raise SchemaNotProvided(self.schema, value).with_field_and_value(self, value)
 
         # check the value against schema
-        errors = _validate_fields(self.schema, value)
-
+        schema_error_dict = _validate_fields(self.schema, value)
+        invariant_errors = []
         if self.validate_invariants:
             try:
-                self.schema.validateInvariants(value, errors)
+                self.schema.validateInvariants(value, invariant_errors)
             except Invalid:
                 # validateInvariants raises a wrapper error around
                 # all the errors it got if it got errors, in addition
@@ -662,8 +686,22 @@ class Object(Field):
                 # that, we raise our own error.
                 pass
 
-        if errors:
-            raise WrongContainedType(errors, self.__name__)
+        if schema_error_dict or invariant_errors:
+            errors = list(schema_error_dict.values()) + invariant_errors
+            exception = SchemaNotCorrectlyImplemented(
+                errors,
+                self.__name__
+            ).with_field_and_value(self, value)
+            exception.schema_errors = schema_error_dict
+            exception.invariant_errors = invariant_errors
+            try:
+                raise exception
+            finally:
+                # Break cycles
+                del exception
+                del invariant_errors
+                del schema_error_dict
+                del errors
 
     def set(self, object, value):
         # Announce that we're going to assign the value to the object.
@@ -707,17 +745,17 @@ class Dict(MinMaxLen, Iterable):
     def _validate(self, value):
         super(Dict, self)._validate(value)
         errors = []
-        try:
-            if self.value_type:
-                errors = _validate_sequence(self.value_type, value.values(),
-                                            errors)
-            errors = _validate_sequence(self.key_type, value, errors)
-
-            if errors:
-                raise WrongContainedType(errors, self.__name__)
+        if self.value_type:
+            errors = _validate_sequence(self.value_type, value.values(),
+                                        errors)
+        errors = _validate_sequence(self.key_type, value, errors)
 
-        finally:
-            errors = None
+        if errors:
+            try:
+                raise WrongContainedType(errors, self.__name__).with_field_and_value(self, value)
+            finally:
+                # Break cycles
+                del errors
 
     def bind(self, object):
         """See zope.schema._bootstrapinterfaces.IField."""
diff --git a/src/zope/schema/_schema.py b/src/zope/schema/_schema.py
index 413f5d0..50b3a49 100644
--- a/src/zope/schema/_schema.py
+++ b/src/zope/schema/_schema.py
@@ -80,8 +80,9 @@ def getSchemaValidationErrors(schema, object):
             value = getattr(object, name)
         except AttributeError as error:
             # property for the given name is not implemented
-            errors.append((
-                name, zope.schema.interfaces.SchemaNotFullyImplemented(error)))
+            error = zope.schema.interfaces.SchemaNotFullyImplemented(error)
+            error = error.with_field_and_value(attribute, None)
+            errors.append((name, error))
         else:
             try:
                 attribute.bind(object).validate(value)
diff --git a/src/zope/schema/interfaces.py b/src/zope/schema/interfaces.py
index 6ed8169..e6fe30d 100644
--- a/src/zope/schema/interfaces.py
+++ b/src/zope/schema/interfaces.py
@@ -56,6 +56,18 @@ class WrongContainedType(ValidationError):
     __doc__ = _("""Wrong contained type""")
 
 
+class SchemaNotCorrectlyImplemented(WrongContainedType):
+    __doc__ = _("""An object failed schema or invariant validation.""")
+
+    #: A dictionary mapping failed attribute names of the
+    #: *value* to the underlying exception
+    schema_errors = None
+
+    #: A list of exceptions from validating the invariants
+    #: of the schema.
+    invariant_errors = ()
+
+
 class NotUnique(ValidationError):
     __doc__ = _("""One or more entries of sequence are not unique.""")
 
diff --git a/tox.ini b/tox.ini
index 8012429..184397e 100644
--- a/tox.ini
+++ b/tox.ini
@@ -7,9 +7,10 @@ envlist =
 
 [testenv]
 deps =
-    .[test]
+    .[test,docs]
 commands =
     zope-testrunner --test-path=src
+    sphinx-build -b doctest -d {envdir}/.cache/doctrees docs {envdir}/.cache/doctest
 
 [testenv:coverage]
 usedevelop = true
@@ -24,7 +25,7 @@ deps =
 
 [testenv:docs]
 basepython =
-    python2.7
+    python3.6
 commands =
     sphinx-build -b html -d docs/_build/doctrees docs docs/_build/html
     sphinx-build -b doctest -d docs/_build/doctrees docs docs/_build/doctest

`zope.schema.Object._validate`: missing field information in error reports
In https://bugs.launchpad.net/zope.schema/+bug/620324, Dieter Maurer (dieter@handshake.de) reported:

> Error reports from `zope.schema.Object._validate` for field related errors often lack the information about the affected field. This makes identification of the affected fields unnecessarily difficult.
> 
> `dm.zope.schema.schema.Object._validate` provides a potential fix. It collects pairs fieldname, exception instead of exception alone in the `WrongContainedType` exception.

diff --git a/src/zope/schema/tests/test__bootstrapfields.py b/src/zope/schema/tests/test__bootstrapfields.py
index 30b9126..3355a1e 100644
--- a/src/zope/schema/tests/test__bootstrapfields.py
+++ b/src/zope/schema/tests/test__bootstrapfields.py
@@ -414,7 +414,13 @@ class ContainerTests(unittest.TestCase):
     def test__validate_not_collection_not_iterable(self):
         from zope.schema._bootstrapinterfaces import NotAContainer
         cont = self._makeOne()
-        self.assertRaises(NotAContainer, cont._validate, object())
+        bad_value = object()
+        with self.assertRaises(NotAContainer) as exc:
+            cont._validate(bad_value)
+
+        not_cont = exc.exception
+        self.assertIs(not_cont.field, cont)
+        self.assertIs(not_cont.value, bad_value)
 
     def test__validate_collection_but_not_iterable(self):
         cont = self._makeOne()
@@ -453,7 +459,13 @@ class IterableTests(ContainerTests):
         class Dummy(object):
             def __contains__(self, item):
                 raise AssertionError("Not called")
-        self.assertRaises(NotAnIterator, itr._validate, Dummy())
+        dummy = Dummy()
+        with self.assertRaises(NotAnIterator) as exc:
+            itr._validate(dummy)
+
+        not_it = exc.exception
+        self.assertIs(not_it.field, itr)
+        self.assertIs(not_it.value, dummy)
 
 
 class OrderableTests(unittest.TestCase):
diff --git a/src/zope/schema/tests/test__field.py b/src/zope/schema/tests/test__field.py
index 09456fc..9327299 100644
--- a/src/zope/schema/tests/test__field.py
+++ b/src/zope/schema/tests/test__field.py
@@ -129,7 +129,12 @@ class ASCIITests(unittest.TestCase):
     def test__validate_non_empty_miss(self):
         from zope.schema.interfaces import InvalidValue
         asc = self._makeOne()
-        self.assertRaises(InvalidValue, asc._validate, chr(129))
+        with self.assertRaises(InvalidValue) as exc:
+            asc._validate(chr(129))
+
+        invalid = exc.exception
+        self.assertIs(invalid.field, asc)
+        self.assertEqual(invalid.value, chr(129))
 
     def test__validate_non_empty_hit(self):
         asc = self._makeOne()
@@ -401,16 +406,33 @@ class DecimalTests(OrderableMissingValueMixin,
         field.validate(decimal.Decimal("-0.03"))
         field.validate(decimal.Decimal("10.0001"))
         self.assertRaises(TooSmall, field.validate, decimal.Decimal("-10.0"))
-        self.assertRaises(TooSmall, field.validate, decimal.Decimal("-1.6"))
+        with self.assertRaises(TooSmall) as exc:
+            field.validate(decimal.Decimal("-1.6"))
+
+        too_small = exc.exception
+        self.assertIs(too_small.field, field)
+        self.assertEqual(too_small.value, decimal.Decimal("-1.6"))
+
         self.assertRaises(TooBig, field.validate, decimal.Decimal("11.45"))
-        self.assertRaises(TooBig, field.validate, decimal.Decimal("20.02"))
+        with self.assertRaises(TooBig) as exc:
+            field.validate(decimal.Decimal("20.02"))
 
-    def test_fromUnicode_miss(self):
+        too_big = exc.exception
+        self.assertIs(too_big.field, field)
+        self.assertEqual(too_big.value, decimal.Decimal("20.02"))
 
+    def test_fromUnicode_miss(self):
+        from zope.schema.interfaces import ValidationError
         flt = self._makeOne()
         self.assertRaises(ValueError, flt.fromUnicode, u'')
         self.assertRaises(ValueError, flt.fromUnicode, u'abc')
-        self.assertRaises(ValueError, flt.fromUnicode, u'1.4G')
+        with self.assertRaises(ValueError) as exc:
+            flt.fromUnicode(u'1.4G')
+
+        value_error = exc.exception
+        self.assertIs(value_error.field, flt)
+        self.assertEqual(value_error.value, u'1.4G')
+        self.assertIsInstance(value_error, ValidationError)
 
     def test_fromUnicode_hit(self):
         from decimal import Decimal
@@ -544,7 +566,13 @@ class DateTests(OrderableMissingValueMixin,
         self.assertRaises(WrongType, field.validate, set())
         self.assertRaises(WrongType, field.validate, frozenset())
         self.assertRaises(WrongType, field.validate, object())
-        self.assertRaises(WrongType, field.validate, datetime.datetime.now())
+        now = datetime.datetime.now()
+        with self.assertRaises(WrongType) as exc:
+            field.validate(now)
+
+        wrong_type = exc.exception
+        self.assertIs(wrong_type.field, field)
+        self.assertIs(wrong_type.value, now)
 
     def test_validate_not_required(self):
         from datetime import date
@@ -901,7 +929,12 @@ class ChoiceTests(unittest.TestCase):
         flt = self._makeOne(values=(u'foo', u'bar', u'baz'))
         self.assertRaises(ConstraintNotSatisfied, flt.fromUnicode, u'')
         self.assertRaises(ConstraintNotSatisfied, flt.fromUnicode, u'abc')
-        self.assertRaises(ConstraintNotSatisfied, flt.fromUnicode, u'1.4G')
+        with self.assertRaises(ConstraintNotSatisfied) as exc:
+            flt.fromUnicode(u'1.4G')
+
+        cns = exc.exception
+        self.assertIs(cns.field, flt)
+        self.assertEqual(cns.value, u'1.4G')
 
     def test_fromUnicode_hit(self):
 
@@ -1039,7 +1072,13 @@ class URITests(unittest.TestCase):
         from zope.schema.interfaces import ConstraintNotSatisfied
         from zope.schema.interfaces import InvalidURI
         field = self._makeOne()
-        self.assertRaises(InvalidURI, field.validate, '')
+        with self.assertRaises(InvalidURI) as exc:
+            field.validate('')
+
+        invalid = exc.exception
+        self.assertIs(invalid.field, field)
+        self.assertEqual(invalid.value, '')
+
         self.assertRaises(InvalidURI, field.validate, 'abc')
         self.assertRaises(InvalidURI, field.validate, '\xab\xde')
         self.assertRaises(ConstraintNotSatisfied,
@@ -1130,7 +1169,12 @@ class DottedNameTests(unittest.TestCase):
     def test_validate_w_min_dots(self):
         from zope.schema.interfaces import InvalidDottedName
         field = self._makeOne(min_dots=1)
-        self.assertRaises(InvalidDottedName, field.validate, 'name')
+        with self.assertRaises(InvalidDottedName) as exc:
+            field.validate('name')
+        invalid = exc.exception
+        self.assertIs(invalid.field, field)
+        self.assertEqual(invalid.value, 'name')
+
         field.validate('dotted.name')
         field.validate('moar.dotted.name')
 
@@ -1139,8 +1183,12 @@ class DottedNameTests(unittest.TestCase):
         field = self._makeOne(max_dots=1)
         field.validate('name')
         field.validate('dotted.name')
-        self.assertRaises(InvalidDottedName,
-                          field.validate, 'moar.dotted.name')
+        with self.assertRaises(InvalidDottedName) as exc:
+            field.validate('moar.dotted.name')
+
+        invalid = exc.exception
+        self.assertIs(invalid.field, field)
+        self.assertEqual(invalid.value, 'moar.dotted.name')
 
     def test_validate_not_a_dotted_name(self):
         from zope.schema.interfaces import ConstraintNotSatisfied
@@ -1161,7 +1209,12 @@ class DottedNameTests(unittest.TestCase):
 
         field = self._makeOne()
         self.assertRaises(InvalidDottedName, field.fromUnicode, u'')
-        self.assertRaises(InvalidDottedName, field.fromUnicode, u'\u2603')
+        with self.assertRaises(InvalidDottedName) as exc:
+            field.fromUnicode(u'\u2603')
+        invalid = exc.exception
+        self.assertIs(invalid.field, field)
+        self.assertEqual(invalid.value, u'\u2603')
+
         self.assertRaises(ConstraintNotSatisfied,
                           field.fromUnicode, u'http://example.com/\nDAV:')
 
@@ -1197,7 +1250,13 @@ class IdTests(unittest.TestCase):
         self.assertRaises(WrongType, field.validate, {})
         self.assertRaises(WrongType, field.validate, set())
         self.assertRaises(WrongType, field.validate, frozenset())
-        self.assertRaises(WrongType, field.validate, object())
+        bad_value = object()
+        with self.assertRaises(WrongType) as exc:
+            field.validate(bad_value)
+
+        wrong = exc.exception
+        self.assertIs(wrong.field, field)
+        self.assertEqual(wrong.value, bad_value)
 
     def test_validate_not_required(self):
         field = self._makeOne(required=False)
@@ -1216,7 +1275,13 @@ class IdTests(unittest.TestCase):
         from zope.schema.interfaces import ConstraintNotSatisfied
         from zope.schema.interfaces import InvalidId
         field = self._makeOne()
-        self.assertRaises(InvalidId, field.validate, '')
+        with self.assertRaises(InvalidId) as exc:
+            field.validate('')
+
+        invalid = exc.exception
+        self.assertIs(invalid.field, field)
+        self.assertEqual(invalid.value, '')
+
         self.assertRaises(InvalidId, field.validate, 'abc')
         self.assertRaises(InvalidId, field.validate, '\xab\xde')
         self.assertRaises(ConstraintNotSatisfied,
@@ -1270,7 +1335,13 @@ class InterfaceFieldTests(unittest.TestCase):
 
 
         field = self._makeOne()
-        self.assertRaises(WrongType, field.validate, u'')
+        with self.assertRaises(WrongType) as exc:
+            field.validate(u'')
+
+        wrong = exc.exception
+        self.assertIs(wrong.field, field)
+        self.assertEqual(wrong.value, u'')
+
         self.assertRaises(WrongType, field.validate, b'')
         self.assertRaises(WrongType, field.validate, 1)
         self.assertRaises(WrongType, field.validate, 1.0)
@@ -1354,7 +1425,12 @@ class AbstractCollectionTests(unittest.TestCase):
         from zope.schema._bootstrapfields import Text
         text = Text()
         absc = self._makeOne(text)
-        self.assertRaises(WrongContainedType, absc.validate, [1])
+        with self.assertRaises(WrongContainedType) as exc:
+            absc.validate([1])
+
+        wct = exc.exception
+        self.assertIs(wct.field, absc)
+        self.assertEqual(wct.value, [1])
 
     def test__validate_miss_uniqueness(self):
         from zope.schema.interfaces import NotUnique
@@ -1362,7 +1438,12 @@ class AbstractCollectionTests(unittest.TestCase):
 
         text = Text()
         absc = self._makeOne(text, True)
-        self.assertRaises(NotUnique, absc.validate, [u'a', u'a'])
+        with self.assertRaises(NotUnique) as exc:
+            absc.validate([u'a', u'a'])
+
+        not_uniq = exc.exception
+        self.assertIs(not_uniq.field, absc)
+        self.assertEqual(not_uniq.value, [u'a', u'a'])
 
 
 class TupleTests(unittest.TestCase):
@@ -1412,7 +1493,12 @@ class TupleTests(unittest.TestCase):
         field.validate(())
         field.validate((1, 2))
         field.validate((3,))
-        self.assertRaises(RequiredMissing, field.validate, None)
+        with self.assertRaises(RequiredMissing) as exc:
+            field.validate(None)
+
+        req_missing = exc.exception
+        self.assertIs(req_missing.field, field)
+        self.assertEqual(req_missing.value, None)
 
     def test_validate_min_length(self):
         from zope.schema.interfaces import TooShort
@@ -1420,7 +1506,12 @@ class TupleTests(unittest.TestCase):
         field.validate((1, 2))
         field.validate((1, 2, 3))
         self.assertRaises(TooShort, field.validate, ())
-        self.assertRaises(TooShort, field.validate, (1,))
+        with self.assertRaises(TooShort) as exc:
+            field.validate((1,))
+
+        too_short = exc.exception
+        self.assertIs(too_short.field, field)
+        self.assertEqual(too_short.value, (1,))
 
     def test_validate_max_length(self):
         from zope.schema.interfaces import TooLong
@@ -1428,7 +1519,12 @@ class TupleTests(unittest.TestCase):
         field.validate(())
         field.validate((1, 2))
         self.assertRaises(TooLong, field.validate, (1, 2, 3, 4))
-        self.assertRaises(TooLong, field.validate, (1, 2, 3))
+        with self.assertRaises(TooLong) as exc:
+            field.validate((1, 2, 3))
+
+        too_long = exc.exception
+        self.assertIs(too_long.field, field)
+        self.assertEqual(too_long.value, (1, 2, 3))
 
     def test_validate_min_length_and_max_length(self):
         from zope.schema.interfaces import TooLong
@@ -1792,12 +1888,19 @@ class ObjectTests(unittest.TestCase):
         from zope.schema._bootstrapfields import Text
         schema = self._makeSchema(foo=Text(), bar=Text())
         objf = self._makeOne(schema)
-        self.assertRaises(SchemaNotProvided, objf.validate, object())
+        bad_value = object()
+        with self.assertRaises(SchemaNotProvided) as exc:
+            objf.validate(bad_value)
+
+        not_provided = exc.exception
+        self.assertIs(not_provided.field, objf)
+        self.assertIs(not_provided.value, bad_value)
+        self.assertEqual(not_provided.args, (schema, bad_value), )
 
     def test__validate_w_value_providing_schema_but_missing_fields(self):
         from zope.interface import implementer
         from zope.schema.interfaces import SchemaNotFullyImplemented
-        from zope.schema.interfaces import WrongContainedType
+        from zope.schema.interfaces import SchemaNotCorrectlyImplemented
         from zope.schema._bootstrapfields import Text
         schema = self._makeSchema(foo=Text(), bar=Text())
 
@@ -1806,25 +1909,44 @@ class ObjectTests(unittest.TestCase):
             pass
 
         objf = self._makeOne(schema)
-        self.assertRaises(WrongContainedType, objf.validate, Broken())
+        broken = Broken()
+        with self.assertRaises(SchemaNotCorrectlyImplemented) as exc:
+            objf.validate(broken)
+
+        wct = exc.exception
+        self.assertIs(wct.field, objf)
+        self.assertIs(wct.value, broken)
+        self.assertEqual(wct.invariant_errors, [])
+        self.assertEqual(
+            sorted(wct.schema_errors),
+            ['bar', 'foo']
+        )
+        for name in ('foo', 'bar'):
+            error = wct.schema_errors[name]
+            self.assertIsInstance(error,
+                                  SchemaNotFullyImplemented)
+            self.assertEqual(schema[name], error.field)
+            self.assertIsNone(error.value)
+
+        # The legacy arg[0] errors list
         errors = self._getErrors(objf.validate, Broken())
         self.assertEqual(len(errors), 2)
         errors = sorted(errors,
                         key=lambda x: (type(x).__name__, str(x.args[0])))
         err = errors[0]
-        self.assertTrue(isinstance(err, SchemaNotFullyImplemented))
+        self.assertIsInstance(err, SchemaNotFullyImplemented)
         nested = err.args[0]
-        self.assertTrue(isinstance(nested, AttributeError))
-        self.assertTrue("'bar'" in str(nested))
+        self.assertIsInstance(nested, AttributeError)
+        self.assertIn("'bar'", str(nested))
         err = errors[1]
-        self.assertTrue(isinstance(err, SchemaNotFullyImplemented))
+        self.assertIsInstance(err, SchemaNotFullyImplemented)
         nested = err.args[0]
-        self.assertTrue(isinstance(nested, AttributeError))
-        self.assertTrue("'foo'" in str(nested))
+        self.assertIsInstance(nested, AttributeError)
+        self.assertIn("'foo'", str(nested))
 
     def test__validate_w_value_providing_schema_but_invalid_fields(self):
         from zope.interface import implementer
-        from zope.schema.interfaces import WrongContainedType
+        from zope.schema.interfaces import SchemaNotCorrectlyImplemented
         from zope.schema.interfaces import RequiredMissing
         from zope.schema.interfaces import WrongType
         from zope.schema._bootstrapfields import Text
@@ -1837,15 +1959,30 @@ class ObjectTests(unittest.TestCase):
             bar = 1
 
         objf = self._makeOne(schema)
-        self.assertRaises(WrongContainedType, objf.validate, Broken())
+        broken = Broken()
+        with self.assertRaises(SchemaNotCorrectlyImplemented) as exc:
+            objf.validate(broken)
+
+        wct = exc.exception
+        self.assertIs(wct.field, objf)
+        self.assertIs(wct.value, broken)
+        self.assertEqual(wct.invariant_errors, [])
+        self.assertEqual(
+            sorted(wct.schema_errors),
+            ['bar', 'foo']
+        )
+        self.assertIsInstance(wct.schema_errors['foo'], RequiredMissing)
+        self.assertIsInstance(wct.schema_errors['bar'], WrongType)
+
+        # The legacy arg[0] errors list
         errors = self._getErrors(objf.validate, Broken())
         self.assertEqual(len(errors), 2)
         errors = sorted(errors, key=lambda x: type(x).__name__)
         err = errors[0]
-        self.assertTrue(isinstance(err, RequiredMissing))
+        self.assertIsInstance(err, RequiredMissing)
         self.assertEqual(err.args, ('foo',))
         err = errors[1]
-        self.assertTrue(isinstance(err, WrongType))
+        self.assertIsInstance(err, WrongType)
         self.assertEqual(err.args, (1, text_type, 'bar'))
 
     def test__validate_w_value_providing_schema(self):
@@ -2089,7 +2226,12 @@ class DictTests(unittest.TestCase):
         field.validate({})
         field.validate({1: 'b', 2: 'd'})
         field.validate({3: 'a'})
-        self.assertRaises(WrongContainedType, field.validate, {'a': 1})
+        with self.assertRaises(WrongContainedType) as exc:
+            field.validate({'a': 1})
+
+        wct = exc.exception
+        self.assertIs(wct.field, field)
+        self.assertEqual(wct.value, {'a': 1})
 
     def test_validate_invalid_value_type(self):
         from zope.schema.interfaces import WrongContainedType
@@ -2098,7 +2240,12 @@ class DictTests(unittest.TestCase):
         field.validate({})
         field.validate({'b': 1, 'd': 2})
         field.validate({'a': 3})
-        self.assertRaises(WrongContainedType, field.validate, {1: 'a'})
+        with self.assertRaises(WrongContainedType) as exc:
+            field.validate({1: 'a'})
+
+        wct = exc.exception
+        self.assertIs(wct.field, field)
+        self.assertEqual(wct.value, {1: 'a'})
 
     def test_validate_min_length(self):
         from zope.schema.interfaces import TooShort
diff --git a/src/zope/schema/tests/test_schema.py b/src/zope/schema/tests/test_schema.py
index 6262125..f64b5fe 100644
--- a/src/zope/schema/tests/test_schema.py
+++ b/src/zope/schema/tests/test_schema.py
@@ -171,6 +171,9 @@ class Test_getValidationErrors(unittest.TestCase):
         self.assertEqual(len(errors), 1)
         self.assertEqual(errors[0][0], 'must')
         self.assertEqual(errors[0][1].__class__, SchemaNotFullyImplemented)
+        self.assertIsNone(errors[0][1].value)
+        self.assertEqual(IWithRequired['must'],
+                         errors[0][1].field)
 
     def test_schema_with_invariant_errors(self):
         from zope.interface import Interface
@@ -246,6 +249,9 @@ class Test_getSchemaValidationErrors(unittest.TestCase):
         self.assertEqual(len(errors), 1)
         self.assertEqual(errors[0][0], 'must')
         self.assertEqual(errors[0][1].__class__, SchemaNotFullyImplemented)
+        self.assertIsNone(errors[0][1].value)
+        self.assertEqual(IWithRequired['must'],
+                         errors[0][1].field)
 
     def test_schema_with_invalid_field(self):
         from zope.interface import Interface

pip install -e .[test]
parse_log_pytest
pytest
coverage sphinx pytest
3.6
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster==0.7.13
attrs @ file:///opt/conda/conda-bld/attrs_1642510447205/work
Babel==2.11.0
certifi==2021.5.30
charset-normalizer==2.0.12
coverage==6.2
docutils==0.18.1
idna==3.10
imagesize==1.4.1
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1631916693255/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
Jinja2==3.0.3
MarkupSafe==2.0.1
more-itertools @ file:///tmp/build/80754af9/more-itertools_1637733554872/work
packaging @ file:///tmp/build/80754af9/packaging_1637314298585/work
pluggy @ file:///tmp/build/80754af9/pluggy_1615976315926/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
Pygments==2.14.0
pyparsing @ file:///tmp/build/80754af9/pyparsing_1635766073266/work
pytest==6.2.4
pytz==2025.2
requests==2.27.1
six==1.17.0
snowballstemmer==2.2.0
Sphinx==5.3.0
sphinxcontrib-applehelp==1.0.2
sphinxcontrib-devhelp==1.0.2
sphinxcontrib-htmlhelp==2.0.0
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.3
sphinxcontrib-serializinghtml==1.1.5
toml @ file:///tmp/build/80754af9/toml_1616166611790/work
typing_extensions @ file:///opt/conda/conda-bld/typing_extensions_1647553014482/work
urllib3==1.26.20
zipp @ file:///tmp/build/80754af9/zipp_1633618647012/work
zope.event==4.6
zope.exceptions==4.6
zope.interface==5.5.2
-e git+https://github.com/zopefoundation/zope.schema.git@1696ffef6aa44e530e7095bd41365749634707df#egg=zope.schema
zope.testing==5.0.1
zope.testrunner==5.6

name: zope.schema
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=21.4.0=pyhd3eb1b0_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - importlib-metadata=4.8.1=py36h06a4308_0
  - importlib_metadata=4.8.1=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - more-itertools=8.12.0=pyhd3eb1b0_0
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=21.3=pyhd3eb1b0_0
  - pip=21.2.2=py36h06a4308_0
  - pluggy=0.13.1=py36h06a4308_0
  - py=1.11.0=pyhd3eb1b0_0
  - pyparsing=3.0.4=pyhd3eb1b0_0
  - pytest=6.2.4=py36h06a4308_2
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - toml=0.10.2=pyhd3eb1b0_0
  - typing_extensions=4.1.1=pyh06a4308_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.6.0=pyhd3eb1b0_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alabaster==0.7.13
      - babel==2.11.0
      - charset-normalizer==2.0.12
      - coverage==6.2
      - docutils==0.18.1
      - idna==3.10
      - imagesize==1.4.1
      - jinja2==3.0.3
      - markupsafe==2.0.1
      - pygments==2.14.0
      - pytz==2025.2
      - requests==2.27.1
      - six==1.17.0
      - snowballstemmer==2.2.0
      - sphinx==5.3.0
      - sphinxcontrib-applehelp==1.0.2
      - sphinxcontrib-devhelp==1.0.2
      - sphinxcontrib-htmlhelp==2.0.0
      - sphinxcontrib-jsmath==1.0.1
      - sphinxcontrib-qthelp==1.0.3
      - sphinxcontrib-serializinghtml==1.1.5
      - urllib3==1.26.20
      - zope-event==4.6
      - zope-exceptions==4.6
      - zope-interface==5.5.2
      - zope-testing==5.0.1
      - zope-testrunner==5.6
prefix: /opt/conda/envs/zope.schema

src/zope/schema/tests/test__bootstrapfields.py::ContainerTests::test__validate_not_collection_not_iterable src/zope/schema/tests/test__bootstrapfields.py::IterableTests::test__validate_collection_but_not_iterable src/zope/schema/tests/test__bootstrapfields.py::IterableTests::test__validate_not_collection_not_iterable src/zope/schema/tests/test__field.py::ASCIITests::test__validate_non_empty_miss src/zope/schema/tests/test__field.py::DecimalTests::test_fromUnicode_miss src/zope/schema/tests/test__field.py::DecimalTests::test_validate_min_and_max src/zope/schema/tests/test__field.py::DateTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::ChoiceTests::test_fromUnicode_miss src/zope/schema/tests/test__field.py::URITests::test_validate_not_a_uri src/zope/schema/tests/test__field.py::DottedNameTests::test_fromUnicode_invalid src/zope/schema/tests/test__field.py::DottedNameTests::test_validate_w_max_dots src/zope/schema/tests/test__field.py::DottedNameTests::test_validate_w_min_dots src/zope/schema/tests/test__field.py::IdTests::test_validate_not_a_uri src/zope/schema/tests/test__field.py::IdTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::InterfaceFieldTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::AbstractCollectionTests::test__validate_miss_uniqueness src/zope/schema/tests/test__field.py::AbstractCollectionTests::test__validate_wrong_contained_type src/zope/schema/tests/test__field.py::TupleTests::test_validate_max_length src/zope/schema/tests/test__field.py::TupleTests::test_validate_min_length src/zope/schema/tests/test__field.py::TupleTests::test_validate_required src/zope/schema/tests/test__field.py::ObjectTests::test__validate_w_value_not_providing_schema src/zope/schema/tests/test__field.py::ObjectTests::test__validate_w_value_providing_schema_but_invalid_fields src/zope/schema/tests/test__field.py::ObjectTests::test__validate_w_value_providing_schema_but_missing_fields src/zope/schema/tests/test__field.py::DictTests::test_validate_invalid_key_type src/zope/schema/tests/test__field.py::DictTests::test_validate_invalid_value_type src/zope/schema/tests/test_schema.py::Test_getValidationErrors::test_schema_with_field_errors src/zope/schema/tests/test_schema.py::Test_getSchemaValidationErrors::test_schema_with_missing_field
src/zope/schema/tests/test__bootstrapfields.py::ValidatedPropertyTests::test___get__ src/zope/schema/tests/test__bootstrapfields.py::ValidatedPropertyTests::test___set___not_missing_w_check src/zope/schema/tests/test__bootstrapfields.py::ValidatedPropertyTests::test___set___not_missing_wo_check src/zope/schema/tests/test__bootstrapfields.py::ValidatedPropertyTests::test___set___w_missing_wo_check src/zope/schema/tests/test__bootstrapfields.py::DefaultPropertyTests::test___get___w_defaultFactory_not_ICAF_no_check src/zope/schema/tests/test__bootstrapfields.py::DefaultPropertyTests::test___get___w_defaultFactory_w_ICAF_w_check src/zope/schema/tests/test__bootstrapfields.py::DefaultPropertyTests::test___get___wo_defaultFactory_hit src/zope/schema/tests/test__bootstrapfields.py::DefaultPropertyTests::test___get___wo_defaultFactory_miss src/zope/schema/tests/test__bootstrapfields.py::DefaultPropertyTests::test__get___wo_defaultFactory_in_dict src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test___eq___different_type src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test___eq___same_type_different_attrs src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test___eq___same_type_same_attrs src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_bind src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_ctor_defaults src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_ctor_order_madness src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_ctor_w_both_title_and_description src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_ctor_w_title_wo_description src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_ctor_wo_title_w_description src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_equal_instances_have_same_hash src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_explicit_constraint_default src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_explicit_defaultFactory src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_explicit_defaultFactory_returning_missing_value src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_explicit_required_readonly_missingValue src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_get_hit src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_get_miss src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_hash_across_unequal_instances src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_is_hashable src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_query_hit src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_query_miss_no_default src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_query_miss_w_default src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_set_hit src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_set_readonly src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_validate_constraint_fails src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_validate_constraint_raises_StopValidation src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_validate_missing_and_required src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_validate_missing_not_required src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_validate_wrong_type src/zope/schema/tests/test__bootstrapfields.py::ContainerTests::test__validate_collection_but_not_iterable src/zope/schema/tests/test__bootstrapfields.py::ContainerTests::test__validate_not_collection_but_iterable src/zope/schema/tests/test__bootstrapfields.py::ContainerTests::test__validate_w_collections src/zope/schema/tests/test__bootstrapfields.py::ContainerTests::test_validate_not_required src/zope/schema/tests/test__bootstrapfields.py::ContainerTests::test_validate_required src/zope/schema/tests/test__bootstrapfields.py::IterableTests::test__validate_not_collection_but_iterable src/zope/schema/tests/test__bootstrapfields.py::IterableTests::test__validate_w_collections src/zope/schema/tests/test__bootstrapfields.py::IterableTests::test_validate_not_required src/zope/schema/tests/test__bootstrapfields.py::IterableTests::test_validate_required src/zope/schema/tests/test__bootstrapfields.py::OrderableTests::test_ctor_default_too_large src/zope/schema/tests/test__bootstrapfields.py::OrderableTests::test_ctor_default_too_small src/zope/schema/tests/test__bootstrapfields.py::OrderableTests::test_ctor_defaults src/zope/schema/tests/test__bootstrapfields.py::MinMaxLenTests::test_ctor_defaults src/zope/schema/tests/test__bootstrapfields.py::MinMaxLenTests::test_validate_too_long src/zope/schema/tests/test__bootstrapfields.py::MinMaxLenTests::test_validate_too_short src/zope/schema/tests/test__bootstrapfields.py::TextTests::test_ctor_defaults src/zope/schema/tests/test__bootstrapfields.py::TextTests::test_fromUnicode_hit src/zope/schema/tests/test__bootstrapfields.py::TextTests::test_fromUnicode_miss src/zope/schema/tests/test__bootstrapfields.py::TextTests::test_validate_not_required src/zope/schema/tests/test__bootstrapfields.py::TextTests::test_validate_required src/zope/schema/tests/test__bootstrapfields.py::TextTests::test_validate_w_invalid_default src/zope/schema/tests/test__bootstrapfields.py::TextTests::test_validate_wrong_types src/zope/schema/tests/test__bootstrapfields.py::TextLineTests::test_class_conforms_to_ITextLine src/zope/schema/tests/test__bootstrapfields.py::TextLineTests::test_constraint src/zope/schema/tests/test__bootstrapfields.py::TextLineTests::test_instance_conforms_to_ITextLine src/zope/schema/tests/test__bootstrapfields.py::TextLineTests::test_validate_not_required src/zope/schema/tests/test__bootstrapfields.py::TextLineTests::test_validate_required src/zope/schema/tests/test__bootstrapfields.py::TextLineTests::test_validate_wrong_types src/zope/schema/tests/test__bootstrapfields.py::PasswordTests::test_constraint src/zope/schema/tests/test__bootstrapfields.py::PasswordTests::test_set_normal src/zope/schema/tests/test__bootstrapfields.py::PasswordTests::test_set_unchanged src/zope/schema/tests/test__bootstrapfields.py::PasswordTests::test_validate_not_required src/zope/schema/tests/test__bootstrapfields.py::PasswordTests::test_validate_required src/zope/schema/tests/test__bootstrapfields.py::PasswordTests::test_validate_unchanged_already_set src/zope/schema/tests/test__bootstrapfields.py::PasswordTests::test_validate_unchanged_not_already_set src/zope/schema/tests/test__bootstrapfields.py::BoolTests::test__validate_w_int src/zope/schema/tests/test__bootstrapfields.py::BoolTests::test_ctor_defaults src/zope/schema/tests/test__bootstrapfields.py::BoolTests::test_fromUnicode_hit src/zope/schema/tests/test__bootstrapfields.py::BoolTests::test_fromUnicode_miss src/zope/schema/tests/test__bootstrapfields.py::BoolTests::test_set_w_int src/zope/schema/tests/test__bootstrapfields.py::IntTests::test_ctor_defaults src/zope/schema/tests/test__bootstrapfields.py::IntTests::test_fromUnicode_hit src/zope/schema/tests/test__bootstrapfields.py::IntTests::test_fromUnicode_miss src/zope/schema/tests/test__bootstrapfields.py::IntTests::test_missing_value_no_min_or_max src/zope/schema/tests/test__bootstrapfields.py::IntTests::test_validate_max src/zope/schema/tests/test__bootstrapfields.py::IntTests::test_validate_min src/zope/schema/tests/test__bootstrapfields.py::IntTests::test_validate_min_and_max src/zope/schema/tests/test__bootstrapfields.py::IntTests::test_validate_not_required src/zope/schema/tests/test__bootstrapfields.py::IntTests::test_validate_required src/zope/schema/tests/test__field.py::BytesTests::test_class_conforms_to_IBytes src/zope/schema/tests/test__field.py::BytesTests::test_fromUnicode_hit src/zope/schema/tests/test__field.py::BytesTests::test_fromUnicode_miss src/zope/schema/tests/test__field.py::BytesTests::test_instance_conforms_to_IBytes src/zope/schema/tests/test__field.py::BytesTests::test_validate_not_required src/zope/schema/tests/test__field.py::BytesTests::test_validate_required src/zope/schema/tests/test__field.py::BytesTests::test_validate_w_invalid_default src/zope/schema/tests/test__field.py::BytesTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::ASCIITests::test__validate_empty src/zope/schema/tests/test__field.py::ASCIITests::test__validate_non_empty_hit src/zope/schema/tests/test__field.py::ASCIITests::test_class_conforms_to_IASCII src/zope/schema/tests/test__field.py::ASCIITests::test_instance_conforms_to_IASCII src/zope/schema/tests/test__field.py::ASCIITests::test_validate_wrong_types src/zope/schema/tests/test__field.py::BytesLineTests::test_class_conforms_to_IBytesLine src/zope/schema/tests/test__field.py::BytesLineTests::test_constraint src/zope/schema/tests/test__field.py::BytesLineTests::test_instance_conforms_to_IBytesLine src/zope/schema/tests/test__field.py::BytesLineTests::test_validate_not_required src/zope/schema/tests/test__field.py::BytesLineTests::test_validate_required src/zope/schema/tests/test__field.py::BytesLineTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::ASCIILineTests::test_class_conforms_to_IASCIILine src/zope/schema/tests/test__field.py::ASCIILineTests::test_constraint src/zope/schema/tests/test__field.py::ASCIILineTests::test_instance_conforms_to_IASCIILine src/zope/schema/tests/test__field.py::ASCIILineTests::test_validate_not_required src/zope/schema/tests/test__field.py::ASCIILineTests::test_validate_required src/zope/schema/tests/test__field.py::ASCIILineTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::FloatTests::test_class_conforms_to_IFloat src/zope/schema/tests/test__field.py::FloatTests::test_fromUnicode_hit src/zope/schema/tests/test__field.py::FloatTests::test_fromUnicode_miss src/zope/schema/tests/test__field.py::FloatTests::test_instance_conforms_to_IFloat src/zope/schema/tests/test__field.py::FloatTests::test_missing_value_no_min_or_max src/zope/schema/tests/test__field.py::FloatTests::test_validate_max src/zope/schema/tests/test__field.py::FloatTests::test_validate_min src/zope/schema/tests/test__field.py::FloatTests::test_validate_min_and_max src/zope/schema/tests/test__field.py::FloatTests::test_validate_not_required src/zope/schema/tests/test__field.py::FloatTests::test_validate_required src/zope/schema/tests/test__field.py::DecimalTests::test_class_conforms_to_IDecimal src/zope/schema/tests/test__field.py::DecimalTests::test_fromUnicode_hit src/zope/schema/tests/test__field.py::DecimalTests::test_instance_conforms_to_IDecimal src/zope/schema/tests/test__field.py::DecimalTests::test_missing_value_no_min_or_max src/zope/schema/tests/test__field.py::DecimalTests::test_validate_max src/zope/schema/tests/test__field.py::DecimalTests::test_validate_min src/zope/schema/tests/test__field.py::DecimalTests::test_validate_not_required src/zope/schema/tests/test__field.py::DecimalTests::test_validate_required src/zope/schema/tests/test__field.py::DatetimeTests::test_class_conforms_to_IDatetime src/zope/schema/tests/test__field.py::DatetimeTests::test_instance_conforms_to_IDatetime src/zope/schema/tests/test__field.py::DatetimeTests::test_missing_value_no_min_or_max src/zope/schema/tests/test__field.py::DatetimeTests::test_validate_not_required src/zope/schema/tests/test__field.py::DatetimeTests::test_validate_required src/zope/schema/tests/test__field.py::DatetimeTests::test_validate_w_max src/zope/schema/tests/test__field.py::DatetimeTests::test_validate_w_min src/zope/schema/tests/test__field.py::DatetimeTests::test_validate_w_min_and_max src/zope/schema/tests/test__field.py::DatetimeTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::DateTests::test_class_conforms_to_IDate src/zope/schema/tests/test__field.py::DateTests::test_instance_conforms_to_IDate src/zope/schema/tests/test__field.py::DateTests::test_missing_value_no_min_or_max src/zope/schema/tests/test__field.py::DateTests::test_validate_not_required src/zope/schema/tests/test__field.py::DateTests::test_validate_required src/zope/schema/tests/test__field.py::DateTests::test_validate_w_max src/zope/schema/tests/test__field.py::DateTests::test_validate_w_min src/zope/schema/tests/test__field.py::DateTests::test_validate_w_min_and_max src/zope/schema/tests/test__field.py::TimedeltaTests::test_class_conforms_to_ITimedelta src/zope/schema/tests/test__field.py::TimedeltaTests::test_instance_conforms_to_ITimedelta src/zope/schema/tests/test__field.py::TimedeltaTests::test_missing_value_no_min_or_max src/zope/schema/tests/test__field.py::TimedeltaTests::test_validate_max src/zope/schema/tests/test__field.py::TimedeltaTests::test_validate_min src/zope/schema/tests/test__field.py::TimedeltaTests::test_validate_min_and_max src/zope/schema/tests/test__field.py::TimedeltaTests::test_validate_not_required src/zope/schema/tests/test__field.py::TimedeltaTests::test_validate_required src/zope/schema/tests/test__field.py::TimeTests::test_class_conforms_to_ITime src/zope/schema/tests/test__field.py::TimeTests::test_instance_conforms_to_ITime src/zope/schema/tests/test__field.py::TimeTests::test_missing_value_no_min_or_max src/zope/schema/tests/test__field.py::TimeTests::test_validate_max src/zope/schema/tests/test__field.py::TimeTests::test_validate_min src/zope/schema/tests/test__field.py::TimeTests::test_validate_min_and_max src/zope/schema/tests/test__field.py::TimeTests::test_validate_not_required src/zope/schema/tests/test__field.py::TimeTests::test_validate_required src/zope/schema/tests/test__field.py::ChoiceTests::test__validate_int src/zope/schema/tests/test__field.py::ChoiceTests::test__validate_mixed src/zope/schema/tests/test__field.py::ChoiceTests::test__validate_source_is_ICSB_bound src/zope/schema/tests/test__field.py::ChoiceTests::test__validate_source_is_ICSB_unbound src/zope/schema/tests/test__field.py::ChoiceTests::test__validate_string src/zope/schema/tests/test__field.py::ChoiceTests::test__validate_tuple src/zope/schema/tests/test__field.py::ChoiceTests::test__validate_w_named_vocabulary src/zope/schema/tests/test__field.py::ChoiceTests::test__validate_w_named_vocabulary_invalid src/zope/schema/tests/test__field.py::ChoiceTests::test_bind_w_preconstructed_vocabulary src/zope/schema/tests/test__field.py::ChoiceTests::test_bind_w_voc_is_ICSB src/zope/schema/tests/test__field.py::ChoiceTests::test_bind_w_voc_is_ICSB_but_not_ISource src/zope/schema/tests/test__field.py::ChoiceTests::test_bind_w_voc_not_ICSB src/zope/schema/tests/test__field.py::ChoiceTests::test_class_conforms_to_IChoice src/zope/schema/tests/test__field.py::ChoiceTests::test_ctor_both_vocabulary_and_source src/zope/schema/tests/test__field.py::ChoiceTests::test_ctor_both_vocabulary_and_values src/zope/schema/tests/test__field.py::ChoiceTests::test_ctor_invalid_source src/zope/schema/tests/test__field.py::ChoiceTests::test_ctor_invalid_vocabulary src/zope/schema/tests/test__field.py::ChoiceTests::test_ctor_w_named_vocabulary src/zope/schema/tests/test__field.py::ChoiceTests::test_ctor_w_preconstructed_vocabulary src/zope/schema/tests/test__field.py::ChoiceTests::test_ctor_w_unicode_non_ascii_values src/zope/schema/tests/test__field.py::ChoiceTests::test_ctor_w_values src/zope/schema/tests/test__field.py::ChoiceTests::test_ctor_wo_values_vocabulary_or_source src/zope/schema/tests/test__field.py::ChoiceTests::test_fromUnicode_hit src/zope/schema/tests/test__field.py::ChoiceTests::test_instance_conforms_to_IChoice src/zope/schema/tests/test__field.py::URITests::test_class_conforms_to_IURI src/zope/schema/tests/test__field.py::URITests::test_fromUnicode_invalid src/zope/schema/tests/test__field.py::URITests::test_fromUnicode_ok src/zope/schema/tests/test__field.py::URITests::test_instance_conforms_to_IURI src/zope/schema/tests/test__field.py::URITests::test_validate_not_required src/zope/schema/tests/test__field.py::URITests::test_validate_required src/zope/schema/tests/test__field.py::URITests::test_validate_wrong_types src/zope/schema/tests/test__field.py::DottedNameTests::test_class_conforms_to_IDottedName src/zope/schema/tests/test__field.py::DottedNameTests::test_ctor_defaults src/zope/schema/tests/test__field.py::DottedNameTests::test_ctor_max_dots_invalid src/zope/schema/tests/test__field.py::DottedNameTests::test_ctor_max_dots_valid src/zope/schema/tests/test__field.py::DottedNameTests::test_ctor_min_dots_invalid src/zope/schema/tests/test__field.py::DottedNameTests::test_ctor_min_dots_valid src/zope/schema/tests/test__field.py::DottedNameTests::test_fromUnicode_dotted_name_ok src/zope/schema/tests/test__field.py::DottedNameTests::test_instance_conforms_to_IDottedName src/zope/schema/tests/test__field.py::DottedNameTests::test_validate_not_a_dotted_name src/zope/schema/tests/test__field.py::DottedNameTests::test_validate_not_required src/zope/schema/tests/test__field.py::DottedNameTests::test_validate_required src/zope/schema/tests/test__field.py::DottedNameTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::IdTests::test_class_conforms_to_IId src/zope/schema/tests/test__field.py::IdTests::test_fromUnicode_dotted_name_ok src/zope/schema/tests/test__field.py::IdTests::test_fromUnicode_invalid src/zope/schema/tests/test__field.py::IdTests::test_fromUnicode_url_ok src/zope/schema/tests/test__field.py::IdTests::test_instance_conforms_to_IId src/zope/schema/tests/test__field.py::IdTests::test_validate_not_required src/zope/schema/tests/test__field.py::IdTests::test_validate_required src/zope/schema/tests/test__field.py::InterfaceFieldTests::test_class_conforms_to_IInterfaceField src/zope/schema/tests/test__field.py::InterfaceFieldTests::test_instance_conforms_to_IInterfaceField src/zope/schema/tests/test__field.py::InterfaceFieldTests::test_validate_not_required src/zope/schema/tests/test__field.py::InterfaceFieldTests::test_validate_required src/zope/schema/tests/test__field.py::AbstractCollectionTests::test_bind_w_value_Type src/zope/schema/tests/test__field.py::AbstractCollectionTests::test_bind_wo_value_Type src/zope/schema/tests/test__field.py::AbstractCollectionTests::test_ctor_defaults src/zope/schema/tests/test__field.py::AbstractCollectionTests::test_ctor_explicit src/zope/schema/tests/test__field.py::AbstractCollectionTests::test_ctor_w_non_field_value_type src/zope/schema/tests/test__field.py::TupleTests::test_class_conforms_to_ITuple src/zope/schema/tests/test__field.py::TupleTests::test_instance_conforms_to_ITuple src/zope/schema/tests/test__field.py::TupleTests::test_validate_min_length_and_max_length src/zope/schema/tests/test__field.py::TupleTests::test_validate_not_required src/zope/schema/tests/test__field.py::TupleTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::ListTests::test_class_conforms_to_IList src/zope/schema/tests/test__field.py::ListTests::test_instance_conforms_to_IList src/zope/schema/tests/test__field.py::ListTests::test_validate_max_length src/zope/schema/tests/test__field.py::ListTests::test_validate_min_length src/zope/schema/tests/test__field.py::ListTests::test_validate_min_length_and_max_length src/zope/schema/tests/test__field.py::ListTests::test_validate_not_required src/zope/schema/tests/test__field.py::ListTests::test_validate_required src/zope/schema/tests/test__field.py::ListTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::SetTests::test_class_conforms_to_ISet src/zope/schema/tests/test__field.py::SetTests::test_ctor_disallows_unique src/zope/schema/tests/test__field.py::SetTests::test_instance_conforms_to_ISet src/zope/schema/tests/test__field.py::SetTests::test_validate_max_length src/zope/schema/tests/test__field.py::SetTests::test_validate_min_length src/zope/schema/tests/test__field.py::SetTests::test_validate_min_length_and_max_length src/zope/schema/tests/test__field.py::SetTests::test_validate_not_required src/zope/schema/tests/test__field.py::SetTests::test_validate_required src/zope/schema/tests/test__field.py::SetTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::FrozenSetTests::test_class_conforms_to_IFrozenSet src/zope/schema/tests/test__field.py::FrozenSetTests::test_ctor_disallows_unique src/zope/schema/tests/test__field.py::FrozenSetTests::test_instance_conforms_to_IFrozenSet src/zope/schema/tests/test__field.py::FrozenSetTests::test_validate_max_length src/zope/schema/tests/test__field.py::FrozenSetTests::test_validate_min_length src/zope/schema/tests/test__field.py::FrozenSetTests::test_validate_min_length_and_max_length src/zope/schema/tests/test__field.py::FrozenSetTests::test_validate_not_required src/zope/schema/tests/test__field.py::FrozenSetTests::test_validate_required src/zope/schema/tests/test__field.py::FrozenSetTests::test_validate_wrong_types src/zope/schema/tests/test__field.py::ObjectTests::test__validate_w_empty_schema src/zope/schema/tests/test__field.py::ObjectTests::test__validate_w_value_providing_schema src/zope/schema/tests/test__field.py::ObjectTests::test_class_conforms_to_IObject src/zope/schema/tests/test__field.py::ObjectTests::test_ctor_w_bad_schema src/zope/schema/tests/test__field.py::ObjectTests::test_instance_conforms_to_IObject src/zope/schema/tests/test__field.py::ObjectTests::test_set_allows_IBOAE_subscr_to_replace_value src/zope/schema/tests/test__field.py::ObjectTests::test_set_emits_IBOAE src/zope/schema/tests/test__field.py::ObjectTests::test_validate_not_required src/zope/schema/tests/test__field.py::ObjectTests::test_validate_required src/zope/schema/tests/test__field.py::ObjectTests::test_validate_w_cycles src/zope/schema/tests/test__field.py::ObjectTests::test_validate_w_cycles_collection_not_valid src/zope/schema/tests/test__field.py::ObjectTests::test_validate_w_cycles_object_not_valid src/zope/schema/tests/test__field.py::ObjectTests::test_validates_invariants_by_default src/zope/schema/tests/test__field.py::DictTests::test_bind_binds_key_and_value_types src/zope/schema/tests/test__field.py::DictTests::test_class_conforms_to_IDict src/zope/schema/tests/test__field.py::DictTests::test_ctor_key_type_not_IField src/zope/schema/tests/test__field.py::DictTests::test_ctor_value_type_not_IField src/zope/schema/tests/test__field.py::DictTests::test_instance_conforms_to_IDict src/zope/schema/tests/test__field.py::DictTests::test_validate_max_length src/zope/schema/tests/test__field.py::DictTests::test_validate_min_length src/zope/schema/tests/test__field.py::DictTests::test_validate_min_length_and_max_length src/zope/schema/tests/test__field.py::DictTests::test_validate_not_required src/zope/schema/tests/test__field.py::DictTests::test_validate_required src/zope/schema/tests/test__field.py::DictTests::test_validate_wrong_types src/zope/schema/tests/test_schema.py::Test_getFields::test_derived src/zope/schema/tests/test_schema.py::Test_getFields::test_simple src/zope/schema/tests/test_schema.py::Test_getFieldsInOrder::test_derived src/zope/schema/tests/test_schema.py::Test_getFieldsInOrder::test_simple src/zope/schema/tests/test_schema.py::Test_getFieldNames::test_derived src/zope/schema/tests/test_schema.py::Test_getFieldNames::test_simple src/zope/schema/tests/test_schema.py::Test_getFieldNamesInOrder::test_derived src/zope/schema/tests/test_schema.py::Test_getFieldNamesInOrder::test_simple src/zope/schema/tests/test_schema.py::Test_getValidationErrors::test_schema src/zope/schema/tests/test_schema.py::Test_getValidationErrors::test_schema_with_invariant_errors src/zope/schema/tests/test_schema.py::Test_getValidationErrors::test_schema_with_invariant_ok src/zope/schema/tests/test_schema.py::Test_getSchemaValidationErrors::test_schema_with_fields_ok src/zope/schema/tests/test_schema.py::Test_getSchemaValidationErrors::test_schema_with_invalid_field src/zope/schema/tests/test_schema.py::Test_getSchemaValidationErrors::test_schema_wo_fields
src/zope/schema/_field.py docs/fields.rst src/zope/schema/_bootstrapfields.py src/zope/schema/_bootstrapinterfaces.py tox.ini CHANGES.rst src/zope/schema/interfaces.py src/zope/schema/_schema.py
src/zope/schema/_field.py docs/fields.rst src/zope/schema/_bootstrapfields.py src/zope/schema/_bootstrapinterfaces.py tox.ini CHANGES.rst src/zope/schema/interfaces.py src/zope/schema/_schema.py