diff --git a/CHANGES.rst b/CHANGES.rst
index 80df698..6ab7c79 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -4,6 +4,12 @@ Changes
 4.5.1 (unreleased)
 ------------------
 
+- ``Object`` instances call their schema's ``validateInvariants``
+  method by default to collect errors from functions decorated with
+  ``@invariant`` when validating. This can be disabled by passing
+  ``validate_invariants=False`` to the ``Object`` constructor. See
+  `issue 10 <https://github.com/zopefoundation/zope.schema/issues/10>`_.
+
 - ``Field`` instances are hashable on Python 3, and use a defined
   hashing algorithm that matches what equality does on all versions of
   Python. Previously, on Python 2, fields were hashed based on their
diff --git a/docs/conf.py b/docs/conf.py
index 024b46c..ef33189 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -77,7 +77,7 @@ version = '.'.join(release.split('.')[:2])
 exclude_patterns = ['_build']
 
 # The reST default role (used for this markup: `text`) to use for all documents.
-#default_role = None
+default_role = 'obj'
 
 # If true, '()' will be appended to :func: etc. cross-reference text.
 #add_function_parentheses = True
diff --git a/src/zope/schema/_field.py b/src/zope/schema/_field.py
index b4e6db7..0d02e40 100644
--- a/src/zope/schema/_field.py
+++ b/src/zope/schema/_field.py
@@ -27,6 +27,7 @@ from zope.event import notify
 from zope.interface import classImplements
 from zope.interface import implementer
 from zope.interface import Interface
+from zope.interface import Invalid
 from zope.interface.interfaces import IInterface
 from zope.interface.interfaces import IMethod
 
@@ -615,10 +616,21 @@ class Object(Field):
     __doc__ = IObject.__doc__
 
     def __init__(self, schema, **kw):
+        """
+        Object(schema, *, validate_invariants=True, **kwargs)
+
+        Create an `~.IObject` field. The keyword arguments are as for `~.Field`.
+
+        .. versionchanged:: 4.6.0
+           Add the keyword argument *validate_invariants*. When true (the default),
+           the schema's ``validateInvariants`` method will be invoked to check
+           the ``@invariant`` properties of the schema.
+        """
         if not IInterface.providedBy(schema):
             raise WrongType
 
         self.schema = schema
+        self.validate_invariants = kw.pop('validate_invariants', True)
         super(Object, self).__init__(**kw)
 
     def _validate(self, value):
@@ -630,6 +642,17 @@ class Object(Field):
 
         # check the value against schema
         errors = _validate_fields(self.schema, value)
+
+        if self.validate_invariants:
+            try:
+                self.schema.validateInvariants(value, errors)
+            except Invalid:
+                # validateInvariants raises a wrapper error around
+                # all the errors it got if it got errors, in addition
+                # to appending them to the errors list. We don't want
+                # that, we raise our own error.
+                pass
+
         if errors:
             raise WrongContainedType(errors, self.__name__)
 
diff --git a/src/zope/schema/interfaces.py b/src/zope/schema/interfaces.py
index 1066fb8..6ed8169 100644
--- a/src/zope/schema/interfaces.py
+++ b/src/zope/schema/interfaces.py
@@ -535,13 +535,24 @@ class IFrozenSet(IAbstractSet):
 
 
 class IObject(IField):
-    """Field containing an Object value."""
+    """
+    Field containing an Object value.
+
+    .. versionchanged:: 4.6.0
+       Add the *validate_invariants* attribute.
+    """
 
     schema = Attribute(
         "schema",
         _("The Interface that defines the Fields comprising the Object.")
     )
 
+    validate_invariants = Attribute(
+        "validate_invariants",
+        _("A boolean that says whether ``schema.validateInvariants`` "
+          "is called from ``self.validate()``. The default is true.")
+    )
+
 
 class IBeforeObjectAssignedEvent(Interface):
     """An object is going to be assigned to an attribute on another object.
diff --git a/tox.ini b/tox.ini
index 8f26665..043e2c0 100644
--- a/tox.ini
+++ b/tox.ini
@@ -33,5 +33,3 @@ commands =
     sphinx-build -b doctest -d docs/_build/doctrees docs docs/_build/doctest
 deps =
     .[test,docs]
-    Sphinx
-    repoze.sphinx.autointerface

Field zope.schema.Object does not check for invariants
In https://bugs.launchpad.net/zope.schema/+bug/567520, @andreypopp reported:

> Field zope.schema.Object does not check invariant during validation. I have attached simple test for that.

and attached a file:  https://bugs.launchpad.net/zope.schema/+bug/567520/+attachment/1341035/+files/test_object_invariants_bug.py

and a patch: https://bugs.launchpad.net/zope.schema/+bug/567520/+attachment/1341770/+files/object_invariants.patch

@tseaver followed up:

> The issue is definitely present: Object fields do not enforce their schema invariants.
> 
> I have reviewed the patch, and like the idea. I am concerned that obscuring the Invalid eror raised by the invariant check is going to lead to hard-to-debug errors, so I haven't committed the patch. Instead, I am assigning the Christian for confirmation.

@andreypopp replied:

> Just for some clarification, I'm wrapping exceptions raised during Object field's invariant check to differentiate them later from exceptions raised by other fields.

diff --git a/src/zope/schema/tests/test__field.py b/src/zope/schema/tests/test__field.py
index 9bcb116..7ce5ab4 100644
--- a/src/zope/schema/tests/test__field.py
+++ b/src/zope/schema/tests/test__field.py
@@ -17,6 +17,12 @@ import unittest
 
 from zope.schema.tests.test__bootstrapfields import OrderableMissingValueMixin
 
+# pylint:disable=protected-access
+# pylint:disable=too-many-lines
+# pylint:disable=inherit-non-class
+# pylint:disable=no-member
+# pylint:disable=blacklisted-name
+
 class BytesTests(unittest.TestCase):
 
     def _getTargetClass(self):
@@ -73,7 +79,6 @@ class BytesTests(unittest.TestCase):
         self.assertRaises(RequiredMissing, field.validate, None)
 
     def test_fromUnicode_miss(self):
-        from zope.schema._compat import text_type
         byt = self._makeOne()
         self.assertRaises(UnicodeEncodeError, byt.fromUnicode, u'\x81')
 
@@ -458,10 +463,9 @@ class DatetimeTests(OrderableMissingValueMixin,
         self.assertRaises(WrongType, field.validate, date.today())
 
     def test_validate_not_required(self):
-        from datetime import datetime
         field = self._makeOne(required=False)
         field.validate(None)  # doesn't raise
-        field.validate(datetime.now())  # doesn't raise
+        field.validate(datetime.datetime.now())  # doesn't raise
 
     def test_validate_required(self):
         from zope.schema.interfaces import RequiredMissing
@@ -469,35 +473,32 @@ class DatetimeTests(OrderableMissingValueMixin,
         self.assertRaises(RequiredMissing, field.validate, None)
 
     def test_validate_w_min(self):
-        from datetime import datetime
         from zope.schema.interfaces import TooSmall
-        d1 = datetime(2000, 10, 1)
-        d2 = datetime(2000, 10, 2)
+        d1 = datetime.datetime(2000, 10, 1)
+        d2 = datetime.datetime(2000, 10, 2)
         field = self._makeOne(min=d1)
         field.validate(d1)  # doesn't raise
         field.validate(d2)  # doesn't raise
-        self.assertRaises(TooSmall, field.validate, datetime(2000, 9, 30))
+        self.assertRaises(TooSmall, field.validate, datetime.datetime(2000, 9, 30))
 
     def test_validate_w_max(self):
-        from datetime import datetime
         from zope.schema.interfaces import TooBig
-        d1 = datetime(2000, 10, 1)
-        d2 = datetime(2000, 10, 2)
-        d3 = datetime(2000, 10, 3)
+        d1 = datetime.datetime(2000, 10, 1)
+        d2 = datetime.datetime(2000, 10, 2)
+        d3 = datetime.datetime(2000, 10, 3)
         field = self._makeOne(max=d2)
         field.validate(d1)  # doesn't raise
         field.validate(d2)  # doesn't raise
         self.assertRaises(TooBig, field.validate, d3)
 
     def test_validate_w_min_and_max(self):
-        from datetime import datetime
         from zope.schema.interfaces import TooBig
         from zope.schema.interfaces import TooSmall
-        d1 = datetime(2000, 10, 1)
-        d2 = datetime(2000, 10, 2)
-        d3 = datetime(2000, 10, 3)
-        d4 = datetime(2000, 10, 4)
-        d5 = datetime(2000, 10, 5)
+        d1 = datetime.datetime(2000, 10, 1)
+        d2 = datetime.datetime(2000, 10, 2)
+        d3 = datetime.datetime(2000, 10, 3)
+        d4 = datetime.datetime(2000, 10, 4)
+        d5 = datetime.datetime(2000, 10, 5)
         field = self._makeOne(min=d2, max=d4)
         field.validate(d2)  # doesn't raise
         field.validate(d3)  # doesn't raise
@@ -530,10 +531,8 @@ class DateTests(OrderableMissingValueMixin,
         verifyObject(IDate, self._makeOne())
 
     def test_validate_wrong_types(self):
-        from datetime import datetime
         from zope.schema.interfaces import WrongType
 
-
         field = self._makeOne()
         self.assertRaises(WrongType, field.validate, u'')
         self.assertRaises(WrongType, field.validate, u'')
@@ -545,7 +544,7 @@ 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.now())
+        self.assertRaises(WrongType, field.validate, datetime.datetime.now())
 
     def test_validate_not_required(self):
         from datetime import date
@@ -554,22 +553,20 @@ class DateTests(OrderableMissingValueMixin,
         field.validate(date.today())
 
     def test_validate_required(self):
-        from datetime import datetime
         from zope.schema.interfaces import RequiredMissing
         field = self._makeOne()
-        field.validate(datetime.now().date())
+        field.validate(datetime.datetime.now().date())
         self.assertRaises(RequiredMissing, field.validate, None)
 
     def test_validate_w_min(self):
         from datetime import date
-        from datetime import datetime
         from zope.schema.interfaces import TooSmall
         d1 = date(2000, 10, 1)
         d2 = date(2000, 10, 2)
         field = self._makeOne(min=d1)
         field.validate(d1)
         field.validate(d2)
-        field.validate(datetime.now().date())
+        field.validate(datetime.datetime.now().date())
         self.assertRaises(TooSmall, field.validate, date(2000, 9, 30))
 
     def test_validate_w_max(self):
@@ -1970,6 +1967,64 @@ class ObjectTests(unittest.TestCase):
         self.assertEqual(log[-1].name, 'field')
         self.assertEqual(log[-1].context, inst)
 
+    def test_validates_invariants_by_default(self):
+        from zope.interface import invariant
+        from zope.interface import Interface
+        from zope.interface import implementer
+        from zope.interface import Invalid
+        from zope.schema import Text
+        from zope.schema import Bytes
+
+        class ISchema(Interface):
+
+            foo = Text()
+            bar = Bytes()
+
+            @invariant
+            def check_foo(o):
+                if o.foo == u'bar':
+                    raise Invalid("Foo is not valid")
+
+            @invariant
+            def check_bar(o):
+                if o.bar == b'foo':
+                    raise Invalid("Bar is not valid")
+
+        @implementer(ISchema)
+        class O(object):
+            foo = u''
+            bar = b''
+
+
+        field = self._makeOne(ISchema)
+        inst = O()
+
+        # Fine at first
+        field.validate(inst)
+
+        inst.foo = u'bar'
+        errors = self._getErrors(field.validate, inst)
+        self.assertEqual(len(errors), 1)
+        self.assertEqual(errors[0].args[0], "Foo is not valid")
+
+        del inst.foo
+        inst.bar = b'foo'
+        errors = self._getErrors(field.validate, inst)
+        self.assertEqual(len(errors), 1)
+        self.assertEqual(errors[0].args[0], "Bar is not valid")
+
+        # Both invalid
+        inst.foo = u'bar'
+        errors = self._getErrors(field.validate, inst)
+        self.assertEqual(len(errors), 2)
+        errors.sort(key=lambda i: i.args)
+        self.assertEqual(errors[0].args[0], "Bar is not valid")
+        self.assertEqual(errors[1].args[0], "Foo is not valid")
+
+        # We can specifically ask for invariants to be turned off.
+        field = self._makeOne(ISchema, validate_invariants=False)
+        field.validate(inst)
+
 
 class DictTests(unittest.TestCase):
 
@@ -2085,9 +2140,6 @@ def _makeSampleVocabulary():
     from zope.interface import implementer
     from zope.schema.interfaces import IVocabulary
 
-    class SampleTerm(object):
-        pass
-
     @implementer(IVocabulary)
     class SampleVocabulary(object):
 

pip install -e .[test]
parse_log_pytest
requirements.txt
pytest
3.6
requirements/base.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs==22.2.0
certifi==2021.5.30
importlib-metadata==4.8.3
iniconfig==1.1.1
packaging==21.3
pluggy==1.0.0
py==1.11.0
pyparsing==3.1.4
pytest==7.0.1
six==1.17.0
tomli==1.2.3
typing_extensions==4.1.1
zipp==3.6.0
zope.event==4.6
zope.exceptions==4.6
zope.interface==5.5.2
-e git+https://github.com/zopefoundation/zope.schema.git@c61de9872ad17fb279641784329266ad371d2366#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
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_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
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - 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
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - attrs==22.2.0
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - packaging==21.3
      - pluggy==1.0.0
      - py==1.11.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - six==1.17.0
      - tomli==1.2.3
      - typing-extensions==4.1.1
      - zipp==3.6.0
      - 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__field.py::ObjectTests::test_validates_invariants_by_default
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__validate_non_empty_miss 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_fromUnicode_miss 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_min_and_max 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::DateTests::test_validate_wrong_types 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_fromUnicode_miss 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_a_uri 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_fromUnicode_invalid 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_w_max_dots src/zope/schema/tests/test__field.py::DottedNameTests::test_validate_w_min_dots 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_a_uri 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::IdTests::test_validate_wrong_types 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::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::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_max_length src/zope/schema/tests/test__field.py::TupleTests::test_validate_min_length 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_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_not_providing_schema src/zope/schema/tests/test__field.py::ObjectTests::test__validate_w_value_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::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::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_invalid_key_type src/zope/schema/tests/test__field.py::DictTests::test_validate_invalid_value_type 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
docs/conf.py src/zope/schema/_field.py tox.ini CHANGES.rst src/zope/schema/interfaces.py
docs/conf.py src/zope/schema/_field.py tox.ini CHANGES.rst src/zope/schema/interfaces.py