~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/hooks.py

  • Committer: Andrew Bennetts
  • Date: 2010-09-24 02:19:53 UTC
  • mto: This revision was merged to the branch mainline in revision 5443.
  • Revision ID: andrew.bennetts@canonical.com-20100924021953-0cg1kjtifuvkbyzp
Fix typo in test method name.

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 
17
17
 
18
18
"""Support for plugin hooking logic."""
19
 
from bzrlib import (
20
 
    pyutils,
21
 
    registry,
22
 
    symbol_versioning,
23
 
    )
 
19
from bzrlib import registry
24
20
from bzrlib.lazy_import import lazy_import
25
21
lazy_import(globals(), """
26
22
import textwrap
33
29
""")
34
30
 
35
31
 
36
 
class KnownHooksRegistry(registry.Registry):
37
 
    # known_hooks registry contains
38
 
    # tuple of (module, member name) which is the hook point
39
 
    # module where the specific hooks are defined
40
 
    # callable to get the empty specific Hooks for that attribute
41
 
 
42
 
    def register_lazy_hook(self, hook_module_name, hook_member_name,
43
 
            hook_factory_member_name):
44
 
        self.register_lazy((hook_module_name, hook_member_name),
45
 
            hook_module_name, hook_factory_member_name)
46
 
 
47
 
    def iter_parent_objects(self):
48
 
        """Yield (hook_key, (parent_object, attr)) tuples for every registered
49
 
        hook, where 'parent_object' is the object that holds the hook
50
 
        instance.
51
 
 
52
 
        This is useful for resetting/restoring all the hooks to a known state,
53
 
        as is done in bzrlib.tests.TestCase._clear_hooks.
54
 
        """
55
 
        for key in self.keys():
56
 
            yield key, self.key_to_parent_and_attribute(key)
57
 
 
58
 
    def key_to_parent_and_attribute(self, (module_name, member_name)):
59
 
        """Convert a known_hooks key to a (parent_obj, attr) pair.
60
 
 
61
 
        :param key: A tuple (module_name, member_name) as found in the keys of
62
 
            the known_hooks registry.
63
 
        :return: The parent_object of the hook and the name of the attribute on
64
 
            that parent object where the hook is kept.
65
 
        """
66
 
        parent_mod, parent_member, attr = pyutils.calc_parent_name(module_name,
67
 
            member_name)
68
 
        return pyutils.get_named_object(parent_mod, parent_member), attr
69
 
 
70
 
 
71
 
_builtin_known_hooks = (
72
 
    ('bzrlib.branch', 'Branch.hooks', 'BranchHooks'),
73
 
    ('bzrlib.bzrdir', 'BzrDir.hooks', 'BzrDirHooks'),
74
 
    ('bzrlib.commands', 'Command.hooks', 'CommandHooks'),
75
 
    ('bzrlib.info', 'hooks', 'InfoHooks'),
76
 
    ('bzrlib.lock', 'Lock.hooks', 'LockHooks'),
77
 
    ('bzrlib.merge', 'Merger.hooks', 'MergeHooks'),
78
 
    ('bzrlib.msgeditor', 'hooks', 'MessageEditorHooks'),
79
 
    ('bzrlib.mutabletree', 'MutableTree.hooks', 'MutableTreeHooks'),
80
 
    ('bzrlib.smart.client', '_SmartClient.hooks', 'SmartClientHooks'),
81
 
    ('bzrlib.smart.server', 'SmartTCPServer.hooks', 'SmartServerHooks'),
82
 
    ('bzrlib.status', 'hooks', 'StatusHooks'),
83
 
    ('bzrlib.version_info_formats.format_rio', 'RioVersionInfoBuilder.hooks',
84
 
        'RioVersionInfoBuilderHooks'),
85
 
    ('bzrlib.merge_directive', 'BaseMergeDirective.hooks',
86
 
        'MergeDirectiveHooks'),
87
 
    )
88
 
 
89
 
known_hooks = KnownHooksRegistry()
90
 
for (_hook_module, _hook_attribute, _hook_class) in _builtin_known_hooks:
91
 
    known_hooks.register_lazy_hook(_hook_module, _hook_attribute, _hook_class)
92
 
del _builtin_known_hooks, _hook_module, _hook_attribute, _hook_class
 
32
known_hooks = registry.Registry()
 
33
# known_hooks registry contains
 
34
# tuple of (module, member name) which is the hook point
 
35
# module where the specific hooks are defined
 
36
# callable to get the empty specific Hooks for that attribute
 
37
known_hooks.register_lazy(('bzrlib.branch', 'Branch.hooks'), 'bzrlib.branch',
 
38
    'BranchHooks')
 
39
known_hooks.register_lazy(('bzrlib.bzrdir', 'BzrDir.hooks'), 'bzrlib.bzrdir',
 
40
    'BzrDirHooks')
 
41
known_hooks.register_lazy(('bzrlib.commands', 'Command.hooks'),
 
42
    'bzrlib.commands', 'CommandHooks')
 
43
known_hooks.register_lazy(('bzrlib.info', 'hooks'),
 
44
    'bzrlib.info', 'InfoHooks')
 
45
known_hooks.register_lazy(('bzrlib.lock', 'Lock.hooks'), 'bzrlib.lock',
 
46
    'LockHooks')
 
47
known_hooks.register_lazy(('bzrlib.merge', 'Merger.hooks'), 'bzrlib.merge',
 
48
    'MergeHooks')
 
49
known_hooks.register_lazy(('bzrlib.msgeditor', 'hooks'), 'bzrlib.msgeditor',
 
50
    'MessageEditorHooks')
 
51
known_hooks.register_lazy(('bzrlib.mutabletree', 'MutableTree.hooks'),
 
52
    'bzrlib.mutabletree', 'MutableTreeHooks')
 
53
known_hooks.register_lazy(('bzrlib.smart.client', '_SmartClient.hooks'),
 
54
    'bzrlib.smart.client', 'SmartClientHooks')
 
55
known_hooks.register_lazy(('bzrlib.smart.server', 'SmartTCPServer.hooks'),
 
56
    'bzrlib.smart.server', 'SmartServerHooks')
 
57
known_hooks.register_lazy(('bzrlib.status', 'hooks'),
 
58
    'bzrlib.status', 'StatusHooks')
 
59
known_hooks.register_lazy(
 
60
    ('bzrlib.version_info_formats.format_rio', 'RioVersionInfoBuilder.hooks'),
 
61
    'bzrlib.version_info_formats.format_rio', 'RioVersionInfoBuilderHooks')
 
62
known_hooks.register_lazy(
 
63
    ('bzrlib.merge_directive', 'BaseMergeDirective.hooks'),
 
64
    'bzrlib.merge_directive', 'MergeDirectiveHooks')
93
65
 
94
66
 
95
67
def known_hooks_key_to_object((module_name, member_name)):
99
71
        the known_hooks registry.
100
72
    :return: The object this specifies.
101
73
    """
102
 
    return pyutils.get_named_object(module_name, member_name)
103
 
 
104
 
 
105
 
@symbol_versioning.deprecated_function(symbol_versioning.deprecated_in((2, 3)))
106
 
def known_hooks_key_to_parent_and_attribute(key):
107
 
    """See KnownHooksRegistry.key_to_parent_and_attribute."""
108
 
    return known_hooks.key_to_parent_and_attribute(key)
 
74
    return registry._LazyObjectGetter(module_name, member_name).get_obj()
 
75
 
 
76
 
 
77
def known_hooks_key_to_parent_and_attribute((module_name, member_name)):
 
78
    """Convert a known_hooks key to a object.
 
79
 
 
80
    :param key: A tuple (module_name, member_name) as found in the keys of
 
81
        the known_hooks registry.
 
82
    :return: The object this specifies.
 
83
    """
 
84
    member_list = member_name.rsplit('.', 1)
 
85
    if len(member_list) == 2:
 
86
        parent_name, attribute = member_list
 
87
    else:
 
88
        parent_name = None
 
89
        attribute = member_name
 
90
    parent = known_hooks_key_to_object((module_name, parent_name))
 
91
    return parent, attribute
109
92
 
110
93
 
111
94
class Hooks(dict):