summaryrefslogtreecommitdiffstats
path: root/ipalib
diff options
context:
space:
mode:
authorJan Cholasta <jcholast@redhat.com>2015-06-15 13:36:26 +0000
committerJan Cholasta <jcholast@redhat.com>2015-07-01 13:05:30 +0000
commit2b12bca660e5dd65256e67b0815392173428247d (patch)
tree594d6ddf6683ce7563ba12aaa10c9b5245ed48a9 /ipalib
parent4b277d04771bece11f5cc9fe04cc04d3f2ded165 (diff)
downloadfreeipa-2b12bca660e5dd65256e67b0815392173428247d.tar.gz
freeipa-2b12bca660e5dd65256e67b0815392173428247d.tar.xz
freeipa-2b12bca660e5dd65256e67b0815392173428247d.zip
plugable: Specify plugin base classes and modules using API properties
https://fedorahosted.org/freeipa/ticket/3090 Reviewed-By: Martin Babinsky <mbabinsk@redhat.com>
Diffstat (limited to 'ipalib')
-rw-r--r--ipalib/__init__.py16
-rw-r--r--ipalib/plugable.py25
2 files changed, 25 insertions, 16 deletions
diff --git a/ipalib/__init__.py b/ipalib/__init__.py
index 4a66e7dd4..44aacd091 100644
--- a/ipalib/__init__.py
+++ b/ipalib/__init__.py
@@ -899,16 +899,16 @@ else:
class API(plugable.API):
- def __init__(self, allowed):
- super(API, self).__init__(allowed, ['ipalib.plugins.*'])
-
- def bootstrap(self, parser=None, **overrides):
- super(API, self).bootstrap(parser, **overrides)
+ bases = (Command, Object, Method, Backend, Updater)
+ @property
+ def modules(self):
+ result = ('ipalib.plugins.*',)
if self.env.in_server:
- self.modules.append('ipaserver.plugins.*')
+ result += ('ipaserver.plugins.*',)
if self.env.context in ('installer', 'updates'):
- self.modules.append('ipaserver.install.plugins.*')
+ result += ('ipaserver.install.plugins.*',)
+ return result
def create_api(mode='dummy'):
@@ -926,7 +926,7 @@ def create_api(mode='dummy'):
- `backend.Backend`
"""
- api = API((Command, Object, Method, Backend, Updater))
+ api = API()
if mode is not None:
api.env.mode = mode
assert mode != 'production'
diff --git a/ipalib/plugable.py b/ipalib/plugable.py
index 967246f10..33b7a58fd 100644
--- a/ipalib/plugable.py
+++ b/ipalib/plugable.py
@@ -306,24 +306,31 @@ class API(ReadOnly):
register = Registrar()
- def __init__(self, allowed, modules):
+ def __init__(self):
super(API, self).__init__()
- self.__plugins = {base: {} for base in allowed}
- self.modules = modules
+ self.__plugins = {}
self.__done = set()
self.env = Env()
+ @property
+ def bases(self):
+ raise NotImplementedError
+
+ @property
+ def modules(self):
+ raise NotImplementedError
+
def __len__(self):
"""
Return the number of plugin namespaces in this API object.
"""
- return len(self.__plugins)
+ return len(self.bases)
def __iter__(self):
"""
Iterate (in ascending order) through plugin namespace names.
"""
- return (base.__name__ for base in self.__plugins)
+ return (base.__name__ for base in self.bases)
def __contains__(self, name):
"""
@@ -614,10 +621,11 @@ class API(ReadOnly):
# Find the base class or raise SubclassError:
found = False
- for (base, sub_d) in self.__plugins.iteritems():
+ for base in self.bases:
if not issubclass(klass, base):
continue
+ sub_d = self.__plugins.setdefault(base, {})
found = True
if sub_d.get(klass.__name__) is klass:
@@ -647,7 +655,7 @@ class API(ReadOnly):
if not found:
raise errors.PluginSubclassError(
plugin=klass,
- bases=self.__plugins.keys(),
+ bases=self.bases,
)
def finalize(self):
@@ -664,8 +672,9 @@ class API(ReadOnly):
plugins = {}
plugin_info = {}
- for base, sub_d in self.__plugins.iteritems():
+ for base in self.bases:
name = base.__name__
+ sub_d = self.__plugins.get(base, {})
members = []
for klass in sub_d.itervalues():