summaryrefslogtreecommitdiffstats
path: root/ipalib
diff options
context:
space:
mode:
authorJan Cholasta <jcholast@redhat.com>2016-05-25 12:50:10 +0200
committerJan Cholasta <jcholast@redhat.com>2016-06-03 09:00:34 +0200
commit19cf6e950943725986bca5732e343c3a793f5b70 (patch)
tree98b711bab691597699c86d4c43eff325f00d85ab /ipalib
parented4c2d9252a995d01dc098e5b761ded8cd9373d8 (diff)
downloadfreeipa-19cf6e950943725986bca5732e343c3a793f5b70.tar.gz
freeipa-19cf6e950943725986bca5732e343c3a793f5b70.tar.xz
freeipa-19cf6e950943725986bca5732e343c3a793f5b70.zip
plugable: simplify API plugin initialization code
Use a flat dictionary to track plugins in API rather than nested dictionaries. https://fedorahosted.org/freeipa/ticket/4739 Reviewed-By: David Kupka <dkupka@redhat.com>
Diffstat (limited to 'ipalib')
-rw-r--r--ipalib/plugable.py61
1 files changed, 29 insertions, 32 deletions
diff --git a/ipalib/plugable.py b/ipalib/plugable.py
index e8b5eb9c6..ed63ec646 100644
--- a/ipalib/plugable.py
+++ b/ipalib/plugable.py
@@ -574,41 +574,37 @@ class API(ReadOnly):
raise TypeError('plugin must be a class; got %r' % klass)
# Find the base class or raise SubclassError:
- found = False
for base in self.bases:
- if not issubclass(klass, base):
- continue
-
- sub_d = self.__plugins.setdefault(base, {})
- found = True
-
- # Check override:
- if klass.__name__ in sub_d:
- if not override:
- # Must use override=True to override:
- raise errors.PluginOverrideError(
- base=base.__name__,
- name=klass.__name__,
- plugin=klass,
- )
- else:
- if override:
- # There was nothing already registered to override:
- raise errors.PluginMissingOverrideError(
- base=base.__name__,
- name=klass.__name__,
- plugin=klass,
- )
-
- # The plugin is okay, add to sub_d:
- sub_d[klass.__name__] = klass
-
- if not found:
+ if issubclass(klass, self.bases):
+ break
+ else:
raise errors.PluginSubclassError(
plugin=klass,
bases=self.bases,
)
+ # Check override:
+ prev = self.__plugins.get(klass.__name__)
+ if prev:
+ if not override:
+ # Must use override=True to override:
+ raise errors.PluginOverrideError(
+ base=base.__name__,
+ name=klass.__name__,
+ plugin=klass,
+ )
+ else:
+ if override:
+ # There was nothing already registered to override:
+ raise errors.PluginMissingOverrideError(
+ base=base.__name__,
+ name=klass.__name__,
+ plugin=klass,
+ )
+
+ # The plugin is okay, add to sub_d:
+ self.__plugins[klass.__name__] = klass
+
def finalize(self):
"""
Finalize the registration, instantiate the plugins.
@@ -625,10 +621,11 @@ class API(ReadOnly):
for base in self.bases:
name = base.__name__
- sub_d = self.__plugins.get(base, {})
-
members = []
- for klass in sub_d.values():
+
+ for klass in self.__plugins.values():
+ if not issubclass(klass, base):
+ continue
try:
instance = plugins[klass]
except KeyError: