mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-01-23 23:03:19 -06:00
44: Added Plugin.finalize() method called by API after all plugin instances are created; updated corresponding unit tests
This commit is contained in:
parent
c3bf5ad857
commit
42c53b2a53
@ -49,16 +49,27 @@ class Plugin(object):
|
|||||||
Base class for all plugins.
|
Base class for all plugins.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, api):
|
__api = None
|
||||||
self.__api = api
|
|
||||||
|
|
||||||
def __get_api(self):
|
def __get_api(self):
|
||||||
"""
|
"""
|
||||||
Returns the plugable.API object this plugin has been instatiated in.
|
Returns the plugable.API instance passed to Plugin.finalize(), or
|
||||||
|
or returns None if finalize() has not yet been called.
|
||||||
"""
|
"""
|
||||||
return self.__api
|
return self.__api
|
||||||
api = property(__get_api)
|
api = property(__get_api)
|
||||||
|
|
||||||
|
def finalize(self, api):
|
||||||
|
"""
|
||||||
|
After all the plugins are instantiated, the plugable.API calls this
|
||||||
|
method, passing itself as the only argument. This is where plugins
|
||||||
|
should check that other plugins they depend upon have actually be
|
||||||
|
loaded.
|
||||||
|
"""
|
||||||
|
assert self.__api is None, 'finalize() can only be called once'
|
||||||
|
assert api is not None, 'finalize() argument cannot be None'
|
||||||
|
self.__api = api
|
||||||
|
|
||||||
def __get_name(self):
|
def __get_name(self):
|
||||||
"""
|
"""
|
||||||
Returns the class name of this instance.
|
Returns the class name of this instance.
|
||||||
@ -280,14 +291,18 @@ class Registrar(object):
|
|||||||
|
|
||||||
class API(ReadOnly):
|
class API(ReadOnly):
|
||||||
def __init__(self, registrar):
|
def __init__(self, registrar):
|
||||||
|
object.__setattr__(self, '_API__plugins', [])
|
||||||
for (base, plugins) in registrar:
|
for (base, plugins) in registrar:
|
||||||
ns = NameSpace(self.__plugin_iter(base, plugins))
|
ns = NameSpace(self.__plugin_iter(base, plugins))
|
||||||
assert not hasattr(self, base.__name__)
|
assert not hasattr(self, base.__name__)
|
||||||
object.__setattr__(self, base.__name__, ns)
|
object.__setattr__(self, base.__name__, ns)
|
||||||
|
for plugin in self.__plugins:
|
||||||
|
plugin.finalize(self)
|
||||||
|
assert plugin.api is self
|
||||||
|
|
||||||
def __plugin_iter(self, base, plugins):
|
def __plugin_iter(self, base, plugins):
|
||||||
assert issubclass(base.proxy, Proxy)
|
assert issubclass(base.proxy, Proxy)
|
||||||
for cls in plugins:
|
for cls in plugins:
|
||||||
plugin = cls(self)
|
plugin = cls()
|
||||||
assert plugin.api is self
|
self.__plugins.append(plugin)
|
||||||
yield base.proxy(plugin)
|
yield base.proxy(plugin)
|
||||||
|
@ -43,17 +43,25 @@ def test_from_cli():
|
|||||||
|
|
||||||
def test_Plugin():
|
def test_Plugin():
|
||||||
api = 'the api instance'
|
api = 'the api instance'
|
||||||
p = plugable.Plugin(api)
|
p = plugable.Plugin()
|
||||||
assert read_only(p, 'api') is api
|
|
||||||
assert read_only(p, 'name') == 'Plugin'
|
assert read_only(p, 'name') == 'Plugin'
|
||||||
assert repr(p) == '%s.Plugin()' % plugable.__name__
|
assert repr(p) == '%s.Plugin()' % plugable.__name__
|
||||||
|
assert read_only(p, 'api') is None
|
||||||
|
raises(AssertionError, p.finalize, None)
|
||||||
|
p.finalize(api)
|
||||||
|
assert read_only(p, 'api') is api
|
||||||
|
raises(AssertionError, p.finalize, api)
|
||||||
|
|
||||||
class some_plugin(plugable.Plugin):
|
class some_plugin(plugable.Plugin):
|
||||||
pass
|
pass
|
||||||
p = some_plugin(api)
|
p = some_plugin()
|
||||||
assert read_only(p, 'api') is api
|
|
||||||
assert read_only(p, 'name') == 'some_plugin'
|
assert read_only(p, 'name') == 'some_plugin'
|
||||||
assert repr(p) == '%s.some_plugin()' % __name__
|
assert repr(p) == '%s.some_plugin()' % __name__
|
||||||
|
assert read_only(p, 'api') is None
|
||||||
|
raises(AssertionError, p.finalize, None)
|
||||||
|
p.finalize(api)
|
||||||
|
assert read_only(p, 'api') is api
|
||||||
|
raises(AssertionError, p.finalize, api)
|
||||||
|
|
||||||
|
|
||||||
def test_ReadOnly():
|
def test_ReadOnly():
|
||||||
|
Loading…
Reference in New Issue
Block a user