Zope Container
Project description
This package define interfaces of container components, and provides container implementations such as a BTreeContainer and OrderedContainer, as well as the base class used by zope.site.folder for the Folder implementation.
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
CHANGES
3.8.3 (2009-08-27)
Move IXMLRPCPublisher ZCML registrations for containers from zope.app.publisher.xmlrpc to zope.container for now.
3.8.2 (2009-05-17)
Rid ourselves of IContained interface. This interface was moved to zope.location.interfaces. A b/w compat import still exists to keep old code running. Depend on zope.location>=3.5.4.
Rid ourselves of the implementations of IObjectMovedEvent, IObjectAddedEvent, IObjectRemovedEvent interfaces and ObjectMovedEvent, ObjectAddedEvent and ObjectRemovedEvent classes. B/w compat imports still exist. All of these were moved to zope.lifecycleevent. Depend on zope.lifecycleevent>=3.5.2.
Fix a bug in OrderedContainer where trying to set the value for a key that already exists (duplication error) would actually delete the key from the order, leaving a dangling reference.
Partially break dependency on zope.traversing by disusing zope.traversing.api.getPath in favor of using ILocationInfo(object).getPath(). The rest of the runtime dependencies on zope.traversing are currently interface dependencies.
Break runtime dependency on zope.app.dependable by using a zcml condition on the qsubscriber ZCML directive that registers the CheckDependency handler for IObjectRemovedEvent. If zope.app.dependable is not installed, this subscriber will never be registered. zope.app.dependable is now a testing dependency only.
3.8.1 (2009-04-03)
Fixed misspackaged 3.8.0
3.8.0 (2009-04-03)
Change configure.zcml to not depend on zope.app.component. Fixes: https://bugs.launchpad.net/bugs/348329
Moved the declaration of IOrderedContainer.updateOrder to a new, basic IOrdered interface and let IOrderedContainer inherit it. This allows easier reuse of the declaration.
3.7.2 (2009-03-12)
Fix: added missing ComponentLookupError, missing since revision 95429 and missing in last release.
Adapt to the move of IDefaultViewName from zope.component.interfaces to zope.publisher.interfaces.
Add support for reserved names for containers. To specify reserved names for some container, you need to provide an adapter from the container to the zope.container.interfaces.IReservedNames interface. The default NameChooser is now also aware of reserved names.
3.7.1 (2009-02-05)
Raise more “Pythonic” errors from __setitem__, losing the dependency on zope.exceptions:
o zope.exceptions.DuplicationError -> KeyError
o zope.exceptions.UserError -> ValueError
Moved import of IBroken interface to use new zope.broken package, which has no dependencies beyond zope.interface.
Made test part pull in the extra test requirements of this package.
Split the z3c.recipe.compattest configuration out into a new file, compat.cfg, to reduce the burden of doing standard unit tests.
Stripped out bogus develop eggs from buildout.cfg.
3.7.0 (2009-01-31)
Split this package off zope.app.container. This package is intended to have far less dependencies than zope.app.container.
This package also contains the container implementation that used to be in zope.app.folder.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Hashes for zope.container-3.8.3-py2.6-win-amd64.egg
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3a3dde801bb497957974da4a9e1fdce5919da40d9957103c265154460fde8389 |
|
MD5 | 8739beece50b6e9129e7df3ee92beecf |
|
BLAKE2b-256 | e0ee4dd49e46ab09bbe659d694335a5123ae9d03c42732892208cf8de6429753 |
Hashes for zope.container-3.8.3-py2.6-win32.egg
Algorithm | Hash digest | |
---|---|---|
SHA256 | eabb2c2a2ef06dd726215a0fd03221a79d283cd9bc6015d5e1754121e79e95de |
|
MD5 | 38fbbb6eb14764ba44b14421b7d48480 |
|
BLAKE2b-256 | 138ab2b02b010457cd8cff86036852ce76a8eec2b5223221d3b072f1ee572680 |
Hashes for zope.container-3.8.3-py2.5-win32.egg
Algorithm | Hash digest | |
---|---|---|
SHA256 | 06683880f92bf2d90167dea2536639c932fc9acc8a99f7612a4b59bffe31fed6 |
|
MD5 | 017e13d95e2681444541239908498062 |
|
BLAKE2b-256 | 5368de48b28109f1fc95221af0932a3549097010fa21f0bb7ccb02c066b5eda9 |
Hashes for zope.container-3.8.3-py2.4-win32.egg
Algorithm | Hash digest | |
---|---|---|
SHA256 | 15d58c5ffc9db99355efad6b5f19bba565dbffdc89cd0e34b43c706052d0cc96 |
|
MD5 | 6113f4627be2ab7554a0b32abf688ddb |
|
BLAKE2b-256 | 2dfb4139b4357814ce1f5734c305cb413dacba19e0c9d30d512d589ce18958c7 |