Rework the CallbackInterface

Fix several problems with the callback interface:
- Automatically registered callbacks (i.e. methods named
    exc_callback, pre_callback etc) were registered on every
    instantiation.
    Fix: Do not register callbacks in __init__; instead return the
    method when asked for it.
- The calling code had to distinguish between bound methods and
    plain functions by checking the 'im_self' attribute.
    Fix: Always return the "default" callback as an unbound method.
    Registered callbacks now always take the extra `self` argument,
    whether they happen to be bound methods or not.
    Calling code now always needs to pass the `self` argument.
- Did not work well with inheritance: due to the fact that Python
    looks up missing attributes in superclasses, callbacks could
    get attached to a superclass if it was instantiated early enough. *
    Fix: Instead of attribute lookup, use a dictionary with class keys.
- The interface included the callback types, which are LDAP-specific.
    Fix: Create generic register_callback and get_callback mehods,
    move LDAP-specific code to BaseLDAPCommand

Update code that calls the callbacks.
Add tests.
Remove lint exceptions for CallbackInterface.

* https://fedorahosted.org/freeipa/ticket/2674
This commit is contained in:
Petr Viktorin
2012-04-25 10:31:10 -04:00
committed by Martin Kosek
parent f52fa2a018
commit 9960149e3f
4 changed files with 235 additions and 217 deletions

View File

@@ -1195,8 +1195,13 @@ class cli(backend.Executioner):
param.label, param.confirm
)
for callback in getattr(cmd, 'INTERACTIVE_PROMPT_CALLBACKS', []):
callback(kw)
try:
callbacks = cmd.get_callbacks('interactive_prompt')
except AttributeError:
pass
else:
for callback in callbacks:
callback(cmd, kw)
def load_files(self, cmd, kw):
"""