diff --git a/CHANGES.rst b/CHANGES.rst
index 9d29d73..72e6b4e 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -126,6 +126,16 @@
   <https://github.com/zopefoundation/zope.schema/issues/57>`_.
 
 
+- Make ``Field.getDoc()`` return more information about the properties
+  of the field, such as its required and readonly status. Subclasses
+  can add more information using the new method
+  ``Field.getExtraDocLines()``. This is used to generate Sphinx
+  documentation when using `repoze.sphinx.autointerface
+  <https://pypi.org/project/repoze.sphinx.autointerface/>`_. See
+  `issue 60
+  <https://github.com/zopefoundation/zope.schema/issues/60>`_.
+
+
 4.5.0 (2017-07-10)
 ==================
 
diff --git a/docs/api.rst b/docs/api.rst
index 5a1b9b3..7877e76 100644
--- a/docs/api.rst
+++ b/docs/api.rst
@@ -20,7 +20,7 @@ Interfaces
 .. autointerface:: zope.schema.interfaces.IInterfaceField
 .. autointerface:: zope.schema.interfaces.IBool
 .. autointerface:: zope.schema.interfaces.IObject
-.. autointerface:: zope.schema.interfaces.IDict
+
 
 Strings
 -------
@@ -76,6 +76,13 @@ Collections
 .. autointerface:: zope.schema.interfaces.ISet
 .. autointerface:: zope.schema.interfaces.IFrozenSet
 
+Mappings
+~~~~~~~~
+.. autointerface:: zope.schema.interfaces.IMapping
+.. autointerface:: zope.schema.interfaces.IMutableMapping
+.. autointerface:: zope.schema.interfaces.IDict
+
+
 Events
 ------
 
diff --git a/src/zope/schema/_bootstrapfields.py b/src/zope/schema/_bootstrapfields.py
index cde9df0..4534073 100644
--- a/src/zope/schema/_bootstrapfields.py
+++ b/src/zope/schema/_bootstrapfields.py
@@ -18,6 +18,7 @@ __docformat__ = 'restructuredtext'
 import decimal
 import fractions
 import numbers
+import sys
 import threading
 from math import isinf
 
@@ -26,6 +27,7 @@ from zope.interface import Invalid
 from zope.interface import Interface
 from zope.interface import providedBy
 from zope.interface import implementer
+from zope.interface.interface import InterfaceClass
 from zope.interface.interfaces import IInterface
 from zope.interface.interfaces import IMethod
 
@@ -118,6 +120,62 @@ def getFields(schema):
             fields[name] = attr
     return fields
 
+class _DocStringHelpers(object):
+    # Namespace object to hold methods related to ReST formatting
+    # docstrings
+
+    @staticmethod
+    def docstring_to_lines(docstring):
+        # Similar to what sphinx.utils.docstrings.prepare_docstring
+        # does. Strip leading equal whitespace, accounting for an initial line
+        # that might not have any. Return a list of lines, with a trailing
+        # blank line.
+        lines = docstring.expandtabs().splitlines()
+        # Find minimum indentation of any non-blank lines after ignored lines.
+
+        margin = sys.maxsize
+        for line in lines[1:]:
+            content = len(line.lstrip())
+            if content:
+                indent = len(line) - content
+                margin = min(margin, indent)
+        # Remove indentation from first ignored lines.
+        if len(lines) >= 1:
+            lines[0] = lines[0].lstrip()
+
+        if margin < sys.maxsize:
+            for i in range(1, len(lines)):
+                lines[i] = lines[i][margin:]
+        # Remove any leading blank lines.
+        while lines and not lines[0]:
+            lines.pop(0)
+        #
+        lines.append('')
+        return lines
+
+    @staticmethod
+    def make_class_directive(kind):
+        mod = kind.__module__
+        if kind.__module__ in ('__builtin__', 'builtins'):
+            mod = ''
+        if mod in ('zope.schema._bootstrapfields', 'zope.schema._field'):
+            mod = 'zope.schema'
+        mod += '.' if mod else ''
+        return ':class:`%s%s`' % (mod, kind.__name__)
+
+    @classmethod
+    def make_field(cls, name, value):
+        return ":%s: %s" % (name, value)
+
+    @classmethod
+    def make_class_field(cls, name, kind):
+        if isinstance(kind, (type, InterfaceClass)):
+            return cls.make_field(name, cls.make_class_directive(kind))
+        if isinstance(kind, tuple):
+            return cls.make_field(
+                name,
+                ', '.join([cls.make_class_directive(t) for t in kind]))
+
 
 class Field(Attribute):
 
@@ -182,6 +240,9 @@ class Field(Attribute):
         __doc__ = ''
         if title:
             if description:
+                # Fix leading whitespace that occurs when using multi-line
+                # strings.
+                description = '\n'.join(_DocStringHelpers.docstring_to_lines(description)[:-1])
                 __doc__ = "%s\n\n%s" % (title, description)
             else:
                 __doc__ = title
@@ -286,6 +347,53 @@ class Field(Attribute):
                                object.__class__.__name__))
         setattr(object, self.__name__, value)
 
+    def getExtraDocLines(self):
+        """
+        Return a list of ReST formatted lines that will be added
+        to the docstring returned by :meth:`getDoc`.
+
+        By default, this will include information about the various
+        properties of this object, such as required and readonly status,
+        required type, and so on.
+
+        This implementation uses a field list for this.
+
+        Subclasses may override or extend.
+
+        .. versionadded:: 4.6.0
+        """
+
+        lines = []
+        lines.append(_DocStringHelpers.make_class_field('Implementation', type(self)))
+        lines.append(_DocStringHelpers.make_field("Read Only", self.readonly))
+        lines.append(_DocStringHelpers.make_field("Required", self.required))
+        if self.defaultFactory:
+            lines.append(_DocStringHelpers.make_field("Default Factory", repr(self.defaultFactory)))
+        else:
+            lines.append(_DocStringHelpers.make_field("Default Value", repr(self.default)))
+
+        if self._type:
+            lines.append(_DocStringHelpers.make_class_field("Allowed Type", self._type))
+
+        # key_type and value_type are commonly used, but don't
+        # have a common superclass to add them, so we do it here.
+        # Using a rubric produces decent formatting
+        for name, rubric in (('key_type', 'Key Type'),
+                             ('value_type', 'Value Type')):
+            field = getattr(self, name, None)
+            if hasattr(field, 'getDoc'):
+                lines.append(".. rubric:: " + rubric)
+                lines.append(field.getDoc())
+
+        return lines
+
+    def getDoc(self):
+        doc = super(Field, self).getDoc()
+        lines = _DocStringHelpers.docstring_to_lines(doc)
+        lines += self.getExtraDocLines()
+        lines.append('')
+
+        return '\n'.join(lines)
 
 class Container(Field):
 
@@ -806,6 +914,11 @@ class Object(Field):
         self.validate_invariants = kw.pop('validate_invariants', True)
         super(Object, self).__init__(**kw)
 
+    def getExtraDocLines(self):
+        lines = super(Object, self).getExtraDocLines()
+        lines.append(_DocStringHelpers.make_class_field("Must Provide", self.schema))
+        return lines
+
     def _validate(self, value):
         super(Object, self)._validate(value)
 

Can `Field.getDoc()` include more information?
There is a lot of information that Field has that's not currently printed by, e.g., `repoze.sphinx.autointerface`, such as the type of acceptable values, whether they are required, the default, and so on. For example, here's what `IField` looks like now:
![before](https://user-images.githubusercontent.com/1256082/45103033-939f4e80-b0f4-11e8-83d6-512c4a133f1e.png)

It's not very difficult to add this on to the user-provided title and description by overriding `Field.getDoc()`. Here's one way this could look if this information were added:
![after](https://user-images.githubusercontent.com/1256082/45103070-a6b21e80-b0f4-11e8-82a7-7188b56012dc.png)

We've found this to be useful in our own projects and consequently we define subclasses of `Field` that add this information. I'm wondering if it would be more broadly useful, useful enough to include by default? Are there any programattic users of `getDoc()` that would be broken by such a change?



diff --git a/src/zope/schema/tests/test__bootstrapfields.py b/src/zope/schema/tests/test__bootstrapfields.py
index 733d5c9..55c8537 100644
--- a/src/zope/schema/tests/test__bootstrapfields.py
+++ b/src/zope/schema/tests/test__bootstrapfields.py
@@ -277,6 +277,64 @@ class FieldTests(EqualityTestsMixin,
         from zope.schema.interfaces import IField
         return IField
 
+    def test_getDoc(self):
+        import textwrap
+        field = self._makeOne(readonly=True, required=False)
+        doc = field.getDoc()
+        self.assertIn(':Read Only: True', doc)
+        self.assertIn(':Required: False', doc)
+        self.assertIn(":Default Value:", doc)
+        self.assertNotIn(':Default Factory:', doc)
+
+        field._type = str
+        doc = field.getDoc()
+        self.assertIn(':Allowed Type: :class:`str`', doc)
+        self.assertNotIn(':Default Factory:', doc)
+
+        field.defaultFactory = 'default'
+        doc = field.getDoc()
+        self.assertNotIn(":Default Value:", doc)
+        self.assertIn(':Default Factory:', doc)
+
+        field._type = (str, object)
+        doc = field.getDoc()
+        self.assertIn(':Allowed Type: :class:`str`, :class:`object`', doc)
+        self.assertNotIn('..rubric', doc)
+
+        # value_type and key_type are automatically picked up
+        field.value_type = self._makeOne()
+        field.key_type = self._makeOne()
+        doc = field .getDoc()
+        self.assertIn('.. rubric:: Key Type', doc)
+        self.assertIn('.. rubric:: Value Type', doc)
+
+        field = self._makeOne(title=u'A title', description=u"""Multiline description.
+
+        Some lines have leading whitespace.
+
+        It gets stripped.
+        """)
+
+        doc = field.getDoc()
+        self.assertEqual(
+            field.getDoc(),
+            textwrap.dedent("""\
+            A title
+
+            Multiline description.
+
+            Some lines have leading whitespace.
+
+            It gets stripped.
+
+            :Implementation: :class:`zope.schema.Field`
+            :Read Only: False
+            :Required: True
+            :Default Value: None
+            """)
+        )
+
+
     def test_ctor_defaults(self):
 
         field = self._makeOne()
@@ -1480,6 +1538,11 @@ class ObjectTests(EqualityTestsMixin,
         self.assertEqual(bad_choices, e.value)
         self.assertEqual(['choices'], list(e.schema_errors))
 
+    def test_getDoc(self):
+        field = self._makeOne()
+        doc = field.getDoc()
+        self.assertIn(":Must Provide: :class:", doc)
+
 
 class DummyInst(object):
     missing_value = object()

pip install -e .[test]
parse_log_pytest
pytest
pytest
3.7
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///croot/attrs_1668696182826/work
certifi @ file:///croot/certifi_1671487769961/work/certifi
flit_core @ file:///opt/conda/conda-bld/flit-core_1644941570762/work/source/flit_core
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1648562407465/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
packaging @ file:///croot/packaging_1671697413597/work
pluggy @ file:///tmp/build/80754af9/pluggy_1648042572264/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pytest==7.1.2
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
typing_extensions @ file:///croot/typing_extensions_1669924550328/work
zipp @ file:///croot/zipp_1672387121353/work
zope.event==5.0
zope.exceptions==5.1
zope.interface==6.4.post2
-e git+https://github.com/zopefoundation/zope.schema.git@0a719f2ded189630a0a77e9292a66a3662c6512c#egg=zope.schema
zope.testing==5.0.1
zope.testrunner==6.5

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=22.1.0=py37h06a4308_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - flit-core=3.6.0=pyhd3eb1b0_0
  - importlib-metadata=4.11.3=py37h06a4308_0
  - importlib_metadata=4.11.3=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - 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
  - packaging=22.0=py37h06a4308_0
  - pip=22.3.1=py37h06a4308_0
  - pluggy=1.0.0=py37h06a4308_1
  - py=1.11.0=pyhd3eb1b0_0
  - pytest=7.1.2=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py37h06a4308_0
  - typing_extensions=4.4.0=py37h06a4308_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.11.0=py37h06a4308_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - zope-event==5.0
      - zope-exceptions==5.1
      - zope-interface==6.4.post2
      - zope-testing==5.0.1
      - zope-testrunner==6.5
prefix: /opt/conda/envs/zope.schema

src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_getDoc src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test_getDoc
src/zope/schema/tests/test__bootstrapfields.py::test_suite
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_class_conforms_to_iface 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_instance_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::FieldTests::test_instances_in_different_interfaces_not_equal 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___eq___different_type src/zope/schema/tests/test__bootstrapfields.py::ContainerTests::test___eq___same_type_different_attrs src/zope/schema/tests/test__bootstrapfields.py::ContainerTests::test___eq___same_type_same_attrs 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_not_collection_not_iterable src/zope/schema/tests/test__bootstrapfields.py::ContainerTests::test__validate_w_collections src/zope/schema/tests/test__bootstrapfields.py::ContainerTests::test_class_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::ContainerTests::test_equal_instances_have_same_hash src/zope/schema/tests/test__bootstrapfields.py::ContainerTests::test_hash_across_unequal_instances src/zope/schema/tests/test__bootstrapfields.py::ContainerTests::test_instance_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::ContainerTests::test_instances_in_different_interfaces_not_equal src/zope/schema/tests/test__bootstrapfields.py::ContainerTests::test_is_hashable 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___eq___different_type src/zope/schema/tests/test__bootstrapfields.py::IterableTests::test___eq___same_type_different_attrs src/zope/schema/tests/test__bootstrapfields.py::IterableTests::test___eq___same_type_same_attrs 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_but_iterable src/zope/schema/tests/test__bootstrapfields.py::IterableTests::test__validate_not_collection_not_iterable src/zope/schema/tests/test__bootstrapfields.py::IterableTests::test__validate_w_collections src/zope/schema/tests/test__bootstrapfields.py::IterableTests::test_class_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::IterableTests::test_equal_instances_have_same_hash src/zope/schema/tests/test__bootstrapfields.py::IterableTests::test_hash_across_unequal_instances src/zope/schema/tests/test__bootstrapfields.py::IterableTests::test_instance_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::IterableTests::test_instances_in_different_interfaces_not_equal src/zope/schema/tests/test__bootstrapfields.py::IterableTests::test_is_hashable 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___eq___different_type src/zope/schema/tests/test__bootstrapfields.py::TextTests::test___eq___same_type_different_attrs src/zope/schema/tests/test__bootstrapfields.py::TextTests::test___eq___same_type_same_attrs src/zope/schema/tests/test__bootstrapfields.py::TextTests::test_class_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::TextTests::test_ctor_defaults src/zope/schema/tests/test__bootstrapfields.py::TextTests::test_equal_instances_have_same_hash 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_hash_across_unequal_instances src/zope/schema/tests/test__bootstrapfields.py::TextTests::test_instance_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::TextTests::test_instances_in_different_interfaces_not_equal src/zope/schema/tests/test__bootstrapfields.py::TextTests::test_is_hashable 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___eq___different_type src/zope/schema/tests/test__bootstrapfields.py::TextLineTests::test___eq___same_type_different_attrs src/zope/schema/tests/test__bootstrapfields.py::TextLineTests::test___eq___same_type_same_attrs src/zope/schema/tests/test__bootstrapfields.py::TextLineTests::test_class_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::TextLineTests::test_constraint src/zope/schema/tests/test__bootstrapfields.py::TextLineTests::test_equal_instances_have_same_hash src/zope/schema/tests/test__bootstrapfields.py::TextLineTests::test_hash_across_unequal_instances src/zope/schema/tests/test__bootstrapfields.py::TextLineTests::test_instance_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::TextLineTests::test_instances_in_different_interfaces_not_equal src/zope/schema/tests/test__bootstrapfields.py::TextLineTests::test_is_hashable 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___eq___different_type src/zope/schema/tests/test__bootstrapfields.py::PasswordTests::test___eq___same_type_different_attrs src/zope/schema/tests/test__bootstrapfields.py::PasswordTests::test___eq___same_type_same_attrs src/zope/schema/tests/test__bootstrapfields.py::PasswordTests::test_class_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::PasswordTests::test_constraint src/zope/schema/tests/test__bootstrapfields.py::PasswordTests::test_equal_instances_have_same_hash src/zope/schema/tests/test__bootstrapfields.py::PasswordTests::test_hash_across_unequal_instances src/zope/schema/tests/test__bootstrapfields.py::PasswordTests::test_instance_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::PasswordTests::test_instances_in_different_interfaces_not_equal src/zope/schema/tests/test__bootstrapfields.py::PasswordTests::test_is_hashable 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___eq___different_type src/zope/schema/tests/test__bootstrapfields.py::BoolTests::test___eq___same_type_different_attrs src/zope/schema/tests/test__bootstrapfields.py::BoolTests::test___eq___same_type_same_attrs src/zope/schema/tests/test__bootstrapfields.py::BoolTests::test__validate_w_int src/zope/schema/tests/test__bootstrapfields.py::BoolTests::test_class_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::BoolTests::test_ctor_defaults src/zope/schema/tests/test__bootstrapfields.py::BoolTests::test_equal_instances_have_same_hash 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_hash_across_unequal_instances src/zope/schema/tests/test__bootstrapfields.py::BoolTests::test_instance_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::BoolTests::test_instances_in_different_interfaces_not_equal src/zope/schema/tests/test__bootstrapfields.py::BoolTests::test_is_hashable src/zope/schema/tests/test__bootstrapfields.py::BoolTests::test_set_w_int src/zope/schema/tests/test__bootstrapfields.py::NumberTests::test___eq___different_type src/zope/schema/tests/test__bootstrapfields.py::NumberTests::test___eq___same_type_different_attrs src/zope/schema/tests/test__bootstrapfields.py::NumberTests::test___eq___same_type_same_attrs src/zope/schema/tests/test__bootstrapfields.py::NumberTests::test_class_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::NumberTests::test_equal_instances_have_same_hash src/zope/schema/tests/test__bootstrapfields.py::NumberTests::test_hash_across_unequal_instances src/zope/schema/tests/test__bootstrapfields.py::NumberTests::test_instance_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::NumberTests::test_instances_in_different_interfaces_not_equal src/zope/schema/tests/test__bootstrapfields.py::NumberTests::test_is_hashable src/zope/schema/tests/test__bootstrapfields.py::NumberTests::test_missing_value_no_min_or_max src/zope/schema/tests/test__bootstrapfields.py::ComplexTests::test___eq___different_type src/zope/schema/tests/test__bootstrapfields.py::ComplexTests::test___eq___same_type_different_attrs src/zope/schema/tests/test__bootstrapfields.py::ComplexTests::test___eq___same_type_same_attrs src/zope/schema/tests/test__bootstrapfields.py::ComplexTests::test_class_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::ComplexTests::test_equal_instances_have_same_hash src/zope/schema/tests/test__bootstrapfields.py::ComplexTests::test_hash_across_unequal_instances src/zope/schema/tests/test__bootstrapfields.py::ComplexTests::test_instance_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::ComplexTests::test_instances_in_different_interfaces_not_equal src/zope/schema/tests/test__bootstrapfields.py::ComplexTests::test_is_hashable src/zope/schema/tests/test__bootstrapfields.py::ComplexTests::test_missing_value_no_min_or_max src/zope/schema/tests/test__bootstrapfields.py::RealTests::test___eq___different_type src/zope/schema/tests/test__bootstrapfields.py::RealTests::test___eq___same_type_different_attrs src/zope/schema/tests/test__bootstrapfields.py::RealTests::test___eq___same_type_same_attrs src/zope/schema/tests/test__bootstrapfields.py::RealTests::test_class_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::RealTests::test_ctor_real_min_max src/zope/schema/tests/test__bootstrapfields.py::RealTests::test_equal_instances_have_same_hash src/zope/schema/tests/test__bootstrapfields.py::RealTests::test_hash_across_unequal_instances src/zope/schema/tests/test__bootstrapfields.py::RealTests::test_instance_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::RealTests::test_instances_in_different_interfaces_not_equal src/zope/schema/tests/test__bootstrapfields.py::RealTests::test_is_hashable src/zope/schema/tests/test__bootstrapfields.py::RealTests::test_missing_value_no_min_or_max src/zope/schema/tests/test__bootstrapfields.py::RationalTests::test___eq___different_type src/zope/schema/tests/test__bootstrapfields.py::RationalTests::test___eq___same_type_different_attrs src/zope/schema/tests/test__bootstrapfields.py::RationalTests::test___eq___same_type_same_attrs src/zope/schema/tests/test__bootstrapfields.py::RationalTests::test_class_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::RationalTests::test_equal_instances_have_same_hash src/zope/schema/tests/test__bootstrapfields.py::RationalTests::test_hash_across_unequal_instances src/zope/schema/tests/test__bootstrapfields.py::RationalTests::test_instance_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::RationalTests::test_instances_in_different_interfaces_not_equal src/zope/schema/tests/test__bootstrapfields.py::RationalTests::test_is_hashable src/zope/schema/tests/test__bootstrapfields.py::RationalTests::test_missing_value_no_min_or_max src/zope/schema/tests/test__bootstrapfields.py::IntegralTests::test___eq___different_type src/zope/schema/tests/test__bootstrapfields.py::IntegralTests::test___eq___same_type_different_attrs src/zope/schema/tests/test__bootstrapfields.py::IntegralTests::test___eq___same_type_same_attrs src/zope/schema/tests/test__bootstrapfields.py::IntegralTests::test_class_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::IntegralTests::test_equal_instances_have_same_hash src/zope/schema/tests/test__bootstrapfields.py::IntegralTests::test_fromUnicode_hit src/zope/schema/tests/test__bootstrapfields.py::IntegralTests::test_fromUnicode_miss src/zope/schema/tests/test__bootstrapfields.py::IntegralTests::test_hash_across_unequal_instances src/zope/schema/tests/test__bootstrapfields.py::IntegralTests::test_instance_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::IntegralTests::test_instances_in_different_interfaces_not_equal src/zope/schema/tests/test__bootstrapfields.py::IntegralTests::test_is_hashable src/zope/schema/tests/test__bootstrapfields.py::IntegralTests::test_missing_value_no_min_or_max src/zope/schema/tests/test__bootstrapfields.py::IntegralTests::test_validate_max src/zope/schema/tests/test__bootstrapfields.py::IntegralTests::test_validate_min src/zope/schema/tests/test__bootstrapfields.py::IntegralTests::test_validate_min_and_max src/zope/schema/tests/test__bootstrapfields.py::IntegralTests::test_validate_not_required src/zope/schema/tests/test__bootstrapfields.py::IntegralTests::test_validate_required src/zope/schema/tests/test__bootstrapfields.py::IntTests::test___eq___different_type src/zope/schema/tests/test__bootstrapfields.py::IntTests::test___eq___same_type_different_attrs src/zope/schema/tests/test__bootstrapfields.py::IntTests::test___eq___same_type_same_attrs src/zope/schema/tests/test__bootstrapfields.py::IntTests::test_class_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::IntTests::test_ctor_defaults src/zope/schema/tests/test__bootstrapfields.py::IntTests::test_equal_instances_have_same_hash 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_hash_across_unequal_instances src/zope/schema/tests/test__bootstrapfields.py::IntTests::test_instance_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::IntTests::test_instances_in_different_interfaces_not_equal src/zope/schema/tests/test__bootstrapfields.py::IntTests::test_is_hashable 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__bootstrapfields.py::ObjectTests::test___eq___different_type src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test___eq___same_type_different_attrs src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test___eq___same_type_same_attrs src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test__validate_w_empty_schema src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test__validate_w_value_not_providing_schema src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test__validate_w_value_providing_schema src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test__validate_w_value_providing_schema_but_invalid_fields src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test__validate_w_value_providing_schema_but_missing_fields src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test_bound_field_of_collection_with_choice src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test_class_conforms_to_IObject src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test_class_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test_ctor_w_bad_schema src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test_equal_instances_have_same_hash src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test_hash_across_unequal_instances src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test_instance_conforms_to_IObject src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test_instance_conforms_to_iface src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test_instances_in_different_interfaces_not_equal src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test_is_hashable src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test_schema_defined_by_subclass src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test_set_allows_IBOAE_subscr_to_replace_value src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test_set_emits_IBOAE src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test_validate_not_required src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test_validate_required src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test_validate_w_cycles src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test_validate_w_cycles_collection_not_valid src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test_validate_w_cycles_object_not_valid src/zope/schema/tests/test__bootstrapfields.py::ObjectTests::test_validates_invariants_by_default
src/zope/schema/_bootstrapfields.py docs/api.rst CHANGES.rst
src/zope/schema/_bootstrapfields.py docs/api.rst CHANGES.rst