This file is indexed.

/usr/share/pyshared/zope/container/constraints.txt is in python-zope.container 3.12.0-0ubuntu2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
=========================
 Containment constraints
=========================

Containment constraints allow us to express restrictions on the types
of items that can be placed in containers or on the types of
containers an item can be placed in.  We express these constraints in
interfaces.  Let's define some container and item interfaces:

    >>> from zope.container.interfaces import IContainer
    >>> from zope.location.interfaces import IContained
    >>> from zope.container.constraints import containers, contains

    >>> class IBuddyFolder(IContainer):
    ...     contains('.IBuddy')


In this example, we used the contains function to declare that objects
that provide IBuddyFolder can only contain items that provide IBuddy.
Note that we used a string containing a dotted name for the IBuddy
interface. This is because IBuddy hasn't been defined yet.  When we
define IBuddy, we can use IBuddyFolder directly:

    >>> class IBuddy(IContained):
    ...     containers(IBuddyFolder)


Now, with these interfaces in place, we can define Buddy and
BuddyFolder classes and verify that we can put buddies in buddy
folders:

    >>> from zope import interface

    >>> class Buddy:
    ...     interface.implements(IBuddy)

    >>> class BuddyFolder:
    ...     interface.implements(IBuddyFolder)

    >>> from zope.container.constraints import checkObject, checkFactory
    >>> from zope.component.factory import Factory

    >>> checkObject(BuddyFolder(), 'x', Buddy())
    >>> checkFactory(BuddyFolder(), 'x', Factory(Buddy))
    True

If we try to use other containers or folders, we'll get errors:

    >>> class Container:
    ...     interface.implements(IContainer)

    >>> class Contained:
    ...     interface.implements(IContained)

    >>> checkObject(Container(), 'x', Buddy())
    ... # doctest: +ELLIPSIS
    Traceback (most recent call last):
    InvalidContainerType: ...

    >>> checkFactory(Container(), 'x', Factory(Buddy))
    False

    >>> checkObject(BuddyFolder(), 'x', Contained())
    ... # doctest: +ELLIPSIS
    Traceback (most recent call last):
    InvalidItemType: ...

    >>> checkFactory(BuddyFolder(), 'x', Factory(Contained))
    False

In the example, we defined the container first and then the items.  We
could have defined these in the opposite order:

    >>> class IContact(IContained):
    ...     containers('.IContacts')

    >>> class IContacts(IContainer):
    ...     contains(IContact)

    >>> class Contact:
    ...     interface.implements(IContact)

    >>> class Contacts:
    ...     interface.implements(IContacts)

    >>> checkObject(Contacts(), 'x', Contact())

    >>> checkFactory(Contacts(), 'x', Factory(Contact))
    True

    >>> checkObject(Contacts(), 'x', Buddy())
    ... # doctest: +ELLIPSIS
    Traceback (most recent call last):
    InvalidItemType: ...

    >>> checkFactory(Contacts(), 'x', Factory(Buddy))
    False

The constraints prevent us from moving a container beneath itself (either into
itself or another folder beneath it):

    >>> container = Container()
    >>> checkObject(container, 'x', container)
    Traceback (most recent call last):
    TypeError: Cannot add an object to itself or its children.

    >>> import zope.location.interfaces
    >>> import zope.interface
    >>> subcontainer = Container()
    >>> zope.interface.directlyProvides(subcontainer,
    ...     zope.location.interfaces.ILocation)
    >>> subcontainer.__parent__ = container
    >>> checkObject(subcontainer, 'x', container)
    Traceback (most recent call last):
    TypeError: Cannot add an object to itself or its children.