Mix-in that implements IConfigurationContext
Subclasses provide a package attribute and a basepath attribute. If the base path is not None, relative paths are converted to absolute paths using the the base path. If the package is not none, relative imports are performed relative to the package.
In general, the basepath and package attributes should be consistent. When a package is provided, the base path should be set to the path of the package directory.
Subclasses also provide an actions attribute, which is a list of actions, an includepath attribute, and an info attribute.
The include path is appended to each action and is used when resolving conflicts among actions. Normally, only the a ConfigurationMachine provides the actions attribute. Decorators simply use the actions of the context they decorate. The includepath attribute is a tuple of names. Each name is typically the name of an included configuration file.
The info attribute contains descriptive information helpful when reporting errors. If not set, it defaults to an empty string.
The actions attribute is a sequence of tuples with items:
- discriminator, a value that identifies the action. Two actions that have the same (non None) discriminator conflict.
- an object that is called to execute the action,
- positional arguments for the action
- keyword arguments for the action
- a tuple of include file names (defaults to ())
- an object that has descriptive information about the action (defaults to '')
For brevity, trailing items after the callable in the tuples are ommitted if they are empty.
There are no implemented interfaces.
There are no attributes in this class.
action(discriminator, callable=None, args=(), kw={}, order=0)
Add an action with the given discriminator, callable and arguments
For testing purposes, the callable and arguments may be omitted. In that case, a default noop callable is used.
The discriminator must be given, but it can be None, to indicate that the action never conflicts.
Let's look at some examples:
>>> c = ConfigurationContext()
Normally, the context gets actions from subclasses. We'll provide an actions attribute ourselves:
>>> c.actions = []
We'll use a test callable that has a convenient string representation
>>> from zope.configuration.tests.directives import f
>>> c.action(1, f, (1, ), {'x': 1}) >>> c.actions [(1, f, (1,), {'x': 1})]
>>> c.action(None) >>> c.actions [(1, f, (1,), {'x': 1}), (None, None)]
Now set the include path and info:
>>> c.includepath = ('foo.zcml',) >>> c.info = "?" >>> c.action(None) >>> c.actions[-1] (None, None, (), {}, ('foo.zcml',), '?')
Finally, we can add an order argument to crudely control the order of execution:
>>> c.action(None, order=99999) >>> c.actions[-1] (None, None, (), {}, ('foo.zcml',), '?', 99999)
checkDuplicate(filename)
Check for duplicate imports of the same file.
Raises an exception if this file had been processed before. This is better than an unlimited number of conflict errors.
>>> c = ConfigurationContext() >>> c.checkDuplicate('/foo.zcml') >>> try: ... c.checkDuplicate('/foo.zcml') ... except ConfigurationError, e: ... # On Linux the exact msg has /foo, on Windows oo. ... str(e).endswith("foo.zcml' included more than once") True
You may use different ways to refer to the same file:
>>> import zope.configuration >>> c.package = zope.configuration >>> import os >>> d = os.path.dirname(zope.configuration.__file__) >>> c.checkDuplicate('bar.zcml') >>> try: ... c.checkDuplicate(d + os.path.normpath('/bar.zcml')) ... except ConfigurationError, e: ... str(e).endswith("bar.zcml' included more than once") ... True
hasFeature(feature)
Check whether a named feature has been provided.
Initially no features are provided
>>> c = ConfigurationContext() >>> c.hasFeature('onlinehelp') False
You can declare that a feature is provided
>>> c.provideFeature('onlinehelp')
and it becomes available
>>> c.hasFeature('onlinehelp') True
path(filename)
Examples:
>>> c = ConfigurationContext() >>> c.path("/x/y/z") == os.path.normpath("/x/y/z") 1 >>> c.path("y/z") Traceback (most recent call last): ... AttributeError: 'ConfigurationContext' object has no attribute 'package' >>> import zope.configuration >>> c.package = zope.configuration >>> import os >>> d = os.path.dirname(zope.configuration.__file__) >>> c.path("y/z") == d + os.path.normpath("/y/z") 1 >>> c.path("y/./z") == d + os.path.normpath("/y/z") 1 >>> c.path("y/../z") == d + os.path.normpath("/z") 1
processFile(filename)
Check whether a file needs to be processed
Return True if processing is needed and False otherwise. If the file needs to be processed, it will be marked as processed, assuming that the caller will procces the file if it needs to be procssed.
>>> c = ConfigurationContext() >>> c.processFile('/foo.zcml') True >>> c.processFile('/foo.zcml') False
You may use different ways to refer to the same file:
>>> import zope.configuration >>> c.package = zope.configuration >>> import os >>> d = os.path.dirname(zope.configuration.__file__) >>> c.processFile('bar.zcml') True >>> c.processFile('bar.zcml') False
provideFeature(feature)
Declare thata named feature has been provided.
See hasFeature for examples.
resolve(dottedname)
Resolve a dotted name to an object
Examples:
>>> c = ConfigurationContext() >>> import zope, zope.interface >>> c.resolve('zope') is zope 1 >>> c.resolve('zope.interface') is zope.interface 1
>>> c.resolve('zope.configuration.eek') #doctest: +NORMALIZE_WHITESPACE Traceback (most recent call last): ... ConfigurationError: ImportError: Module zope.configuration has no global eek
>>> c.resolve('.config.ConfigurationContext') Traceback (most recent call last): ... AttributeError: 'ConfigurationContext' object has no attribute 'package' >>> import zope.configuration >>> c.package = zope.configuration >>> c.resolve('.') is zope.configuration 1 >>> c.resolve('.config.ConfigurationContext') is ConfigurationContext 1 >>> c.resolve('..interface') is zope.interface 1 >>> c.resolve('unicode') <type 'unicode'>