[Zope3-checkins] CVS: Zope3/src/zope/app/interfaces/services - registration.py:1.1 adapter.py:1.2 cache.py:1.3 connection.py:1.9 folder.py:1.5 pagefolder.py:1.4 query.py:1.10 service.py:1.14 session.py:1.3 utility.py:1.7 view.py:1.4 configuration.py:NONE

Jim Fulton jim@zope.com
Sat, 21 Jun 2003 17:22:42 -0400


Update of /cvs-repository/Zope3/src/zope/app/interfaces/services
In directory cvs.zope.org:/tmp/cvs-serv2745/src/zope/app/interfaces/services

Modified Files:
	adapter.py cache.py connection.py folder.py pagefolder.py 
	query.py service.py session.py utility.py view.py 
Added Files:
	registration.py 
Removed Files:
	configuration.py 
Log Message:
Major refactoring to reflect change in terminology from
"configuration" to "registration" to refer to the configuration of how
objects are used (as opposed to their internal configuration).


=== Added File Zope3/src/zope/app/interfaces/services/registration.py ===
##############################################################################
#
# Copyright (c) 2002 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Interfaces for objects supporting registration

$Id: registration.py,v 1.1 2003/06/21 21:22:10 jim Exp $
"""

from zope.app.interfaces.annotation import IAnnotatable
from zope.app.interfaces.annotation import IAttributeAnnotatable
from zope.app.interfaces.container  import IContainerNamesContainer, IContainer
from zope.app.security.permission import PermissionField
from zope.interface import Interface, Attribute, implements
from zope.schema import TextLine
from zope.schema.interfaces import ITextLine

UnregisteredStatus = 'Unregistered'
RegisteredStatus = 'Registered'
ActiveStatus = 'Active'

class IRegistrationStatus(ITextLine):
    """The status of a registration
    """

class RegistrationStatus(TextLine):
    implements(IRegistrationStatus)
    allowed_values = UnregisteredStatus, RegisteredStatus, ActiveStatus

class INoLocalServiceError(Interface):
    """No local service to register with.
    """

class NoLocalServiceError(Exception):
    """No local service to configure

    An attempt was made to register a registration for which there is
    no local service.
    """

    implements(INoLocalServiceError)

class IRegistration(Interface):
    """Registration object

    A registration object represents a specific registration
    decision, such as registering an adapter or defining a permission.

    In addition to the attributes or methods defined here,
    registration objects will include additional attributes
    identifying how they should be used. For example, a service
    registration will provide a service type. An adapter
    registration will specify a used-for interface and a provided
    interface.
    """

    serviceType = Attribute("service type that manages "
                            "this registration type")
    # A string; typically a class attribute

    status = RegistrationStatus(title = u"Registration status")

    def activated():
        """Method called when a registration is made active
        """

    def deactivated():
        """Method called when a registration is made inactive
        """

    def usageSummary():
        """Text for line 1 of registration manager summary"""

    def implementationSummary():
        """Text for line 2 of registration manager summary"""


class INamedRegistration(IRegistration):
    """Registration object that is registered only by name.
    """

    name = TextLine(title=u"Name",
                    description=u"The name that is registered",
                    readonly=True,
                    # Don't allow empty or missing name:
                    required=True,
                    min_length=1,
                    )

    # The label is generally set as a class attribute on the
    # registration class.
    label = Attribute("Descriptive label of the registration type "
                      "(for example, Service, Connection)")


class IComponentPath(ITextLine):
    """A component path
    """
    # This is juse the interface for the ComponentPath field below.
    # We'll use this as the basis for looking up an appriate widget.

class ComponentPath(TextLine):
    """A component path

    Values of the field are absolute unicode path strings that can be
    traversed to get an object.
    """
    implements(IComponentPath)


class IComponentRegistration(IRegistration):
    """Registration object that uses a component path and a permission."""

    componentPath = ComponentPath(
        title=u"Component path",
        description=u"The path to the component; this may be absolute, "
                    u"or relative to the nearest site management folder",
        required=True)

    permission = PermissionField(
        title=u"The permission needed to use the component",
        required=False,
        )

    def getComponent():
        """Return the component named in the registration.
        """


class INamedComponentRegistration(INamedRegistration,
                                   IComponentRegistration):
    """Components registered by name, using componemt path and permission."""


class IRegistrationStack(Interface):
    """A stack of registrations for a set of parameters

    A service will have a registry containing registry stacks
    for specific parameters.  For example, an adapter service will
    have a registry stack for each given used-for and provided
    interface.

    The registry stack works like a stack: the first element is
    active; when it is removed, the element after it is automatically
    activated.  An explicit None may be present (at most once) to
    signal that nothing is active.  To deactivate an element, it is
    moved to the end.
    """

    def register(registration):
        """Register the given registration without activating it.

        Do nothing if the registration is already registered.
        """

    def unregister(registration):
        """Unregister the given registration.

        Do nothing if the registration is not registered.

        Implies deactivate() if the registration is active.
        """

    def registered(registration):
        """Is the registration registered?

        Return a boolean indicating whether the registration has been
        registered.
        """

    def activate(registration):
        """Make the registration active.

        The activated() method is called on the registration.  If
        another registration was previously active, its deactivated()
        method is called first.

        If the argument is None, the currently active registration if
        any is disabled and no new registration is activated.

        Raises a ValueError if the given registration is not registered.
        """

    def deactivate(registration):
        """Make the registration inactive.

        If the registration is active, the deactivated() method is
        called on the registration.  If this reveals a registration
        that was previously active, that registration's activated()
        method is called.

        Raises a ValueError if the given registration is not registered.

        The call has no effect if the registration is registered but
        not active.
        """

    def active():
        """Return the active registration, if any.

        Otherwise, returns None.
        """

    def info(keep_dummy=False):
        """Return a sequence of registration information.

        The sequence items are mapping objects with keys:

        id -- A string that can be used to uniquely identify the
              registration.

        active -- A boolean indicating whether the registration is
                  active.

        registration -- The registration object.

        If keep_dummy is true, an entry corresponding to the dummy
        entry's position is returned whose value is
        {id: '',
         active: (True iff it is the first entry),
         registration: None}.
        """

    def __nonzero__(self):
        """The registry is true iff it has no registered registrations."""


class IRegistry(Interface):
    """A component that can be configured using a registration manager."""

    def queryRegistrationsFor(registration, default=None):
        """Return an IRegistrationStack for the registration

        Data on the registration is used to decide which registry to
        return. For example, a service manager will use the
        registration name attribute to decide which registry
        to return.

        Typically, an object that implements this method will also
        implement a method named queryRegistrations, which takes
        arguments for each of the parameters needed to specify a set
        of registrations.

        The registry must be returned wrapped in the context of the
        registry.

        """

    def createRegistrationsFor(registration):
        """Create and return an IRegistrationStack for the registration

        Data on the registration is used to decide which regsitry to
        create. For example, a service manager will use the
        registration name attribute to decide which regsitry
        to create.

        Typically, an object that implements this method will also
        implement a method named createRegistrations, which takes
        arguments for each of the parameters needed to specify a set
        of registrations.

        Calling createRegistrationsFor twice for the same registration
        returns the same registry.

        The registry must be returned wrapped in the context of the
        registry.

        """


class INameRegistry(IRegistry):
    """An IRegistry, where a name is used to decide which registry to
    return for methods in IRegistry.

    All registrations that pass through queryRegistrationsFor and
    createRegistrationsFor are expected to implement INamedRegistration.
    """

    def queryRegistrations(name, default=None):
        """Return an IRegistrationRegistry for the registration name

        queryRegistrationsFor(cfg, default) is equivalent to
        queryRegistrations(cfg.name, default)
        """

    def createRegistrationsFor(registration):
        """Create and return an IRegistrationRegistry for the registration
        name

        createRegistrationsFor(cfg, default) is equivalent to
        createRegistrations(cfg.name, default)
        """

    def listRegistrationNames():
        """Return a list of all registered registration names
        """

class INameComponentRegistry(INameRegistry):
    """An INameRegistry where the registrations refer to components.

    All registrations that pass through queryRegistrationsFor and
    createRegistrationsFor are expected to implement
    INamedComponentRegistration.
    """
    def queryActiveComponent(name, default=None):
        """Finds the registration registry for a given name, checks if it has
        an active registration, and if so, returns its component.  Otherwise
        returns default.
        """

class IRegisterable(IAnnotatable):
    """A marker interface."""

class IRegistered(IRegisterable):
    """An object that can keep track of its configured uses.

    The object need not implement this functionality itself, but must at
    least support doing so via an adapter.
    """

    def addUsage(location):
        """Add a usage by location.

        The location is the physical path to the registration object that
        configures the usage.
        """
    def removeUsage(location):
        """Remove a usage by location.

        The location is the physical path to the registration object that
        configures the usage.
        """
    def usages():
        """Return a sequence of locations.

        A location is a physical path to a registration object that
        configures a usage.
        """

class IAttributeRegisterable(IAttributeAnnotatable, IRegisterable):
    """A marker interface."""


class IOrderedContainer(Interface):
    """Containers whose items can be reorderd.

    XXX This is likely to go.
    """

    def moveTop(names):
        """Move the objects corresponding to the given names to the top
        """

    def moveUp(names):
        """Move the objects corresponding to the given names up
        """

    def moveBottom(names):
        """Move the objects corresponding to the given names to the bottom
        """

    def moveDown(names):
        """Move the objects corresponding to the given names down
        """

class IRegistrationManager(IContainerNamesContainer, IOrderedContainer):
    """Manage Registrations
    """

class INoRegistrationManagerError(Interface):
    """No registration manager error
    """

class NoRegistrationManagerError(Exception):
    """No registration manager

    There is no registration manager in a site-management folder, or
    an operation would result in no registration manager in a
    site-management folder.

    """
    implements(INoRegistrationManagerError)

class IRegistrationManagerContainer(IContainer):
    """Containers with registration managers

    The container provides clients to access the registration manager
    without knowing it's name.

    The container prevents deletion of the last registration manager.
    The container may allow more than one registration manager. If it
    has more than one, the one returned from an unnamed access is
    undefined.

    """

    def getRegistrationManager():
        """get a registration manager

        Find a registration manager.  Clients can get the
        registration manager without knowing it's name. Normally,
        folders have one registration manager. If there is more than
        one, this method willl return one; which one is undefined.

        An error is raised if no registration manager can be found.
        """



# XXX Pickle backward compatability
IUseConfigurable = IRegisterable
import sys
sys.modules['zope.app.interfaces.services.configuration'
            ] = sys.modules['zope.app.interfaces.services.registration']


=== Zope3/src/zope/app/interfaces/services/adapter.py 1.1 => 1.2 ===
--- Zope3/src/zope/app/interfaces/services/adapter.py:1.1	Tue Mar 11 11:15:52 2003
+++ Zope3/src/zope/app/interfaces/services/adapter.py	Sat Jun 21 17:22:10 2003
@@ -16,13 +16,13 @@
 $Id$
 """
 
-from zope.app.interfaces.services.configuration import IConfiguration
+from zope.app.interfaces.services.registration import IRegistration
 from zope.app.component.interfacefield import InterfaceField
 from zope.app.security.permission import PermissionField
 from zope.schema import BytesLine, TextLine
 from zope.interface import Interface
 
-class IAdapterConfigurationInfo(Interface):
+class IAdapterRegistrationInfo(Interface):
 
     forInterface = InterfaceField(
         title = u"For interface",
@@ -57,7 +57,7 @@
         )
         
 
-class IAdapterConfiguration(IConfiguration, IAdapterConfigurationInfo):
+class IAdapterRegistration(IRegistration, IAdapterRegistrationInfo):
 
     def getAdapter(object):
         """Return an adapter for the object


=== Zope3/src/zope/app/interfaces/services/cache.py 1.2 => 1.3 ===
--- Zope3/src/zope/app/interfaces/services/cache.py:1.2	Wed Dec 25 09:13:02 2002
+++ Zope3/src/zope/app/interfaces/services/cache.py	Sat Jun 21 17:22:10 2003
@@ -11,17 +11,17 @@
 # FOR A PARTICULAR PURPOSE.
 #
 ##############################################################################
-"""A configuration for a cache.
+"""A registration for a cache.
 
 $Id$
 """
 
-from zope.app.interfaces.services.configuration \
-     import INamedComponentConfiguration
+from zope.app.interfaces.services.registration \
+     import INamedComponentRegistration
 
-class ICacheConfiguration(INamedComponentConfiguration):
-    """Cache configuration
+class ICacheRegistration(INamedComponentRegistration):
+    """Cache registration
 
-    Cache configurations are dependent on the caches that they configure. They
+    Cache registrations are dependent on the caches that they configure. They
     register themselves as component dependents.
     """


=== Zope3/src/zope/app/interfaces/services/connection.py 1.8 => 1.9 ===
--- Zope3/src/zope/app/interfaces/services/connection.py:1.8	Thu May  1 15:35:22 2003
+++ Zope3/src/zope/app/interfaces/services/connection.py	Sat Jun 21 17:22:10 2003
@@ -11,22 +11,22 @@
 # FOR A PARTICULAR PURPOSE.
 #
 ##############################################################################
-"""A configuration for a database adapter.
+"""A registration for a database adapter.
 
 $Id$
 """
 
 from zope.schema import TextLine
-from zope.app.interfaces.services.configuration import IComponentConfiguration
-from zope.app.interfaces.services.configuration import ComponentPath
+from zope.app.interfaces.services.registration import IComponentRegistration
+from zope.app.interfaces.services.registration import ComponentPath
 from zope.app.interfaces.rdb import IConnectionService
-from zope.app.interfaces.services.configuration \
-     import INameComponentConfigurable
+from zope.app.interfaces.services.registration \
+     import INameComponentRegistry
 
-class IConnectionConfiguration(IComponentConfiguration):
-    """Database Connection Configuration
+class IConnectionRegistration(IComponentRegistration):
+    """Database Connection Registration
 
-    Connection configurations are dependent on the database adapters that they
+    Connection registrations are dependent on the database adapters that they
     configure. They register themselves as component dependents.
     """
 
@@ -44,5 +44,5 @@
         required=True)
 
 
-class ILocalConnectionService(IConnectionService, INameComponentConfigurable):
+class ILocalConnectionService(IConnectionService, INameComponentRegistry):
     """A local (placeful) connection service"""


=== Zope3/src/zope/app/interfaces/services/folder.py 1.4 => 1.5 ===
--- Zope3/src/zope/app/interfaces/services/folder.py:1.4	Sun Mar 23 14:24:45 2003
+++ Zope3/src/zope/app/interfaces/services/folder.py	Sat Jun 21 17:22:10 2003
@@ -18,11 +18,11 @@
 
 from zope.app.interfaces.container import IAdding, IContainer
 from zope.app.interfaces.services.service import IComponentManager
-from zope.app.interfaces.services.configuration \
-     import IConfigurationManagerContainer
+from zope.app.interfaces.services.registration \
+     import IRegistrationManagerContainer
 
-class ISiteManagementFolder(IContainer, IConfigurationManagerContainer):
-    """Component and component configuration containers."""
+class ISiteManagementFolder(IContainer, IRegistrationManagerContainer):
+    """Component and component registration containers."""
 
 
 class ISiteManagementFolders(IContainer, IComponentManager):
@@ -39,6 +39,6 @@
     The SiteManagementFolder Adding is special, since it is not part
     of the content namespace, but has a similar functionality as a
     Folder. Therefore there are views that overlap; this interface was
-    created so that there are no configuration conflicts.
+    created so that there are no registration conflicts.
 
     """


=== Zope3/src/zope/app/interfaces/services/pagefolder.py 1.3 => 1.4 ===
--- Zope3/src/zope/app/interfaces/services/pagefolder.py:1.3	Thu Jun  5 08:03:16 2003
+++ Zope3/src/zope/app/interfaces/services/pagefolder.py	Sat Jun 21 17:22:10 2003
@@ -13,7 +13,7 @@
 ##############################################################################
 """Page Folder interfaces
 
-Page folders support easy creation and configuration of page views
+Page folders support easy creation and registration of page views
 using folders of templates.
 
 $Id$
@@ -22,12 +22,12 @@
 from zope.schema import BytesLine
 from zope.app.interfaces.container import IContainer
 from zope.app.security.permission import PermissionField
-from zope.app.interfaces.services.configuration \
-     import IConfigurationManagerContainer
+from zope.app.interfaces.services.registration \
+     import IRegistrationManagerContainer
 from zope.interface import Interface
 
 class IPageFolderInfo(Interface):
-    """Default configuration information for page folders
+    """Default registration information for page folders
 
     This information is used to configure the pages in the folder.
     """
@@ -59,6 +59,6 @@
 
 class IPageFolder(IPageFolderInfo,
                   IContainer,
-                  IConfigurationManagerContainer):
+                  IRegistrationManagerContainer):
     """Sub-packages that contain templates that are registered as page views
     """


=== Zope3/src/zope/app/interfaces/services/query.py 1.9 => 1.10 ===
--- Zope3/src/zope/app/interfaces/services/query.py:1.9	Fri Mar 21 16:05:22 2003
+++ Zope3/src/zope/app/interfaces/services/query.py	Sat Jun 21 17:22:10 2003
@@ -18,7 +18,7 @@
 
 from zope.interface import Interface, Attribute
 from zope.app.security.permission import PermissionField
-from zope.app.interfaces.services.configuration import INamedConfiguration
+from zope.app.interfaces.services.registration import INamedRegistration
 from zope.app.component.interfacefield import InterfacesField
 from zope.schema.interfaces import ITuple
 # There's another import further down
@@ -75,7 +75,7 @@
 # The import is here to avoid circular imports
 from zope.app.services.queryfield import QueryProcessorsField
 
-class IQueryConfiguration(INamedConfiguration):
+class IQueryRegistration(INamedRegistration):
 
     permission = PermissionField(title=u'Required permission', required=False)
     inputInterfaces = InterfacesField(title=u'Input interfaces',


=== Zope3/src/zope/app/interfaces/services/service.py 1.13 => 1.14 ===
--- Zope3/src/zope/app/interfaces/services/service.py:1.13	Thu May  1 15:35:22 2003
+++ Zope3/src/zope/app/interfaces/services/service.py	Sat Jun 21 17:22:10 2003
@@ -19,24 +19,24 @@
 
 from zope.interface import Interface
 from zope.component.interfaces import IServiceService
-from zope.app.interfaces.services import configuration
+from zope.app.interfaces.services import registration
 
 
-class ILocalService(configuration.IUseConfigurable):
+class ILocalService(registration.IRegisterable):
     """A local service isn't a local service if it doesn't implement this.
 
     The contract of a local service includes collaboration with
     services above it.  A local service should also implement
-    IUseConfigurable (which implies that it is adaptable to
-    IUseConfiguration).  Implementing ILocalService implies this.
+    IRegisterable (which implies that it is adaptable to
+    IRegistered).  Implementing ILocalService implies this.
     """
 
 
-class ISimpleService(ILocalService, configuration.IAttributeUseConfigurable):
+class ISimpleService(ILocalService, registration.IAttributeRegisterable):
     """Most local services should implement this instead of ILocalService.
 
-    It implies a specific way of implementing IUseConfigurable,
-    by subclassing IAttributeUseConfigurable.
+    It implies a specific way of implementing IRegisterable,
+    by subclassing IAttributeRegisterable.
     """
 
 class IComponentManager(Interface):
@@ -105,7 +105,7 @@
 
 
 class IServiceManager(IServiceService, IComponentManager,
-                      configuration.INameComponentConfigurable):
+                      registration.INameComponentRegistry):
     """Service Managers act as containers for Services.
 
     If a Service Manager is asked for a service, it checks for those it
@@ -123,12 +123,12 @@
         The service must be returned in the context of the service manager.
         """
 
-class IServiceConfiguration(configuration.INamedComponentConfiguration):
-    """Service Configuration
+class IServiceRegistration(registration.INamedComponentRegistration):
+    """Service Registration
 
-    Service configurations are dependent on the components that they
+    Service registrations are dependent on the components that they
     configure. They register themselves as component dependents.
 
-    The name of a service configuration is used to determine the service
+    The name of a service registration is used to determine the service
     type.
     """


=== Zope3/src/zope/app/interfaces/services/session.py 1.2 => 1.3 ===
--- Zope3/src/zope/app/interfaces/services/session.py:1.2	Wed Dec 25 09:13:02 2002
+++ Zope3/src/zope/app/interfaces/services/session.py	Sat Jun 21 17:22:10 2003
@@ -44,7 +44,7 @@
 
 
 class IConfigureSessionService(Interface):
-    """Configuration for ISessionService."""
+    """Registration for ISessionService."""
 
     def registerDataManager(name, dataManager):
         """Register ISessionDataManager under given name.


=== Zope3/src/zope/app/interfaces/services/utility.py 1.6 => 1.7 ===
--- Zope3/src/zope/app/interfaces/services/utility.py:1.6	Thu May  1 15:35:22 2003
+++ Zope3/src/zope/app/interfaces/services/utility.py	Sat Jun 21 17:22:10 2003
@@ -16,15 +16,15 @@
 $Id$
 """
 
-from zope.app.interfaces.services.configuration import IComponentConfiguration
+from zope.app.interfaces.services.registration import IComponentRegistration
 from zope.app.component.interfacefield import InterfaceField
 from zope.schema import TextLine
-from zope.app.interfaces.services.configuration import IUseConfigurable
-from zope.app.interfaces.services.configuration import ComponentPath
+from zope.app.interfaces.services.registration import IRegisterable
+from zope.app.interfaces.services.registration import ComponentPath
 from zope.component.interfaces import IUtilityService
 
-class IUtilityConfiguration(IComponentConfiguration):
-    """Utility configuration object.
+class IUtilityRegistration(IComponentRegistration):
+    """Utility registration object.
 
     This is keyed off name (which may be empty) and interface.  It
     overrides componentPath (to make it readonly); it also inherits a
@@ -53,7 +53,7 @@
 
 
 
-class ILocalUtility(IUseConfigurable):
+class ILocalUtility(IRegisterable):
     """Local utility marker.
 
     A marker interface that indicates that a component can be used as
@@ -61,8 +61,8 @@
 
     Utilities should usually also declare they implement
     IAttributeAnnotatable, so that the standard adapter to
-    IUseConfiguration can be used; otherwise, they must provide
-    another way to be adaptable to IUseConfiguration.
+    IRegistered can be used; otherwise, they must provide
+    another way to be adaptable to IRegistered.
     """
 
 
@@ -84,7 +84,7 @@
 
         - name
 
-        - configuration registry
+        - registration stack
 
         One item is present for each registration.
         """


=== Zope3/src/zope/app/interfaces/services/view.py 1.3 => 1.4 ===
--- Zope3/src/zope/app/interfaces/services/view.py:1.3	Thu May 29 16:48:14 2003
+++ Zope3/src/zope/app/interfaces/services/view.py	Sat Jun 21 17:22:10 2003
@@ -16,7 +16,7 @@
 $Id$
 """
 
-from zope.app.interfaces.services.configuration import IConfiguration
+from zope.app.interfaces.services.registration import IRegistration
 from zope.app.component.interfacefield import InterfaceField
 from zope.app.security.permission import PermissionField
 from zope.schema import BytesLine, TextLine, Text, Bool
@@ -24,7 +24,7 @@
 from zope.app.services.field import ComponentPath
 from zope.component.interfaces import IPresentation
 
-class IAdapterConfigurationInfo(Interface):
+class IAdapterRegistrationInfo(Interface):
 
     forInterface = InterfaceField(
         title = u"For interface",
@@ -53,7 +53,7 @@
         )
 
 
-class IAdapterConfiguration(IConfiguration, IAdapterConfigurationInfo):
+class IAdapterRegistration(IRegistration, IAdapterRegistrationInfo):
 
     def getAdapter(object):
         """Return an adapter for the object
@@ -62,7 +62,7 @@
         registered factory.
         """
 
-class IViewConfigurationInfo(Interface):
+class IViewRegistrationInfo(Interface):
 
     forInterface = InterfaceField(
         title = u"For interface",
@@ -110,7 +110,7 @@
         )
 
 
-class IViewConfiguration(IConfiguration, IViewConfigurationInfo):
+class IViewRegistration(IRegistration, IViewRegistrationInfo):
 
     def getView(object, request):
         """Return a view for the object
@@ -150,7 +150,7 @@
 
         """
 
-class IPageConfigurationInfo(IViewConfigurationInfo):
+class IPageRegistrationInfo(IViewRegistrationInfo):
 
     class_ = BytesLine(
         title=u"Page class",
@@ -168,14 +168,14 @@
         required = False,
         )
 
-class IPageConfiguration(IConfiguration, IPageConfigurationInfo):
+class IPageRegistration(IRegistration, IPageRegistrationInfo):
 
     def getView(object, request):
         """Return a page for the object.
         """
 
     def validate(self):
-        """Verifies that the configuration is valid.
+        """Verifies that the registration is valid.
 
         Raises a ConfigurationError if the validation is failed.
         """

=== Removed File Zope3/src/zope/app/interfaces/services/configuration.py ===