diff options
author | Jason Gerard DeRose <jderose@redhat.com> | 2008-08-15 05:07:17 +0000 |
---|---|---|
committer | Jason Gerard DeRose <jderose@redhat.com> | 2008-08-15 05:07:17 +0000 |
commit | a24f2121d553644513dc90d423b9ac968de34bc2 (patch) | |
tree | 368972377dd3c5c38f41e41e7f50a8cb1348ffd9 /ipalib/plugable.py | |
parent | 5ed58fdb4213908b406fe625d0727ecc15dbd1cf (diff) | |
download | freeipa-a24f2121d553644513dc90d423b9ac968de34bc2.tar.gz freeipa-a24f2121d553644513dc90d423b9ac968de34bc2.tar.xz freeipa-a24f2121d553644513dc90d423b9ac968de34bc2.zip |
178: Registrar now subclasses from DictProxy; made Registrar.__iter__ behave same as the other container emulation in plugable.py, and made the dictorary interface return the base and the attribute interface return the MagicDict; updated API class and unit tests
Diffstat (limited to 'ipalib/plugable.py')
-rw-r--r-- | ipalib/plugable.py | 85 |
1 files changed, 26 insertions, 59 deletions
diff --git a/ipalib/plugable.py b/ipalib/plugable.py index b8d2b3906..57ab8bc74 100644 --- a/ipalib/plugable.py +++ b/ipalib/plugable.py @@ -546,7 +546,7 @@ class NameSpace(DictProxy): return '%s(<%d members>)' % (self.__class__.__name__, len(self)) -class Registrar(ReadOnly): +class Registrar(DictProxy): """ Collects plugin classes as they are registered. @@ -561,30 +561,19 @@ class Registrar(ReadOnly): :param allowed: Base classes from which plugins accepted by this Registrar must subclass. """ - - class Val(ReadOnly): - """ - Internal class used so that only one mapping is needed. - """ - def __init__(self, base): - assert inspect.isclass(base) - self.base = base - self.name = base.__name__ - self.sub_d = dict() - self.dictproxy = MagicDict(self.sub_d) - lock(self) - - self.__allowed = allowed - self.__d = {} + self.__allowed = dict((base, {}) for base in allowed) self.__registered = set() - for base in self.__allowed: - val = Val(base) - assert not ( - val.name in self.__d or hasattr(self, val.name) - ) - self.__d[val.name] = val - setattr(self, val.name, val.dictproxy) - lock(self) + super(Registrar, self).__init__( + dict(self.__base_iter()) + ) + + def __base_iter(self): + for (base, sub_d) in self.__allowed.iteritems(): + assert inspect.isclass(base) + name = base.__name__ + assert not hasattr(self, name) + setattr(self, name, MagicDict(sub_d)) + yield (name, base) def __findbases(self, klass): """ @@ -597,12 +586,12 @@ class Registrar(ReadOnly): """ assert inspect.isclass(klass) found = False - for base in self.__allowed: + for (base, sub_d) in self.__allowed.iteritems(): if issubclass(klass, base): found = True - yield base + yield (base, sub_d) if not found: - raise errors.SubclassError(klass, self.__allowed) + raise errors.SubclassError(klass, self.__allowed.keys()) def __call__(self, klass, override=False): """ @@ -619,17 +608,15 @@ class Registrar(ReadOnly): raise errors.DuplicateError(klass) # Find the base class or raise SubclassError: - for base in self.__findbases(klass): - sub_d = self.__d[base.__name__].sub_d - + for (base, sub_d) in self.__findbases(klass): # Check override: if klass.__name__ in sub_d: - # Must use override=True to override: if not override: + # Must use override=True to override: raise errors.OverrideError(base, klass) else: - # There was nothing already registered to override: if override: + # There was nothing already registered to override: raise errors.MissingOverrideError(base, klass) # The plugin is okay, add to sub_d: @@ -638,29 +625,6 @@ class Registrar(ReadOnly): # The plugin is okay, add to __registered: self.__registered.add(klass) - def __getitem__(self, key): - """ - Returns the MagicDict for plugins subclassed from the base named ``key``. - """ - if key not in self.__d: - raise KeyError('no base class named %r' % key) - return self.__d[key].dictproxy - - def __contains__(self, key): - """ - Returns True if a base class named ``key`` is in this Registrar. - """ - return key in self.__d - - def __iter__(self): - """ - Iterates through a (base, registered_plugins) tuple for each allowed - base. - """ - for base in self.__allowed: - sub_d = self.__d[base.__name__].sub_d - yield (base, tuple(sub_d[k] for k in sorted(sub_d))) - class API(DictProxy): """ @@ -687,16 +651,19 @@ class API(DictProxy): plugin = instances[klass] yield PluginProxy(base, plugin) - for (base, classes) in self.register: - namespace = NameSpace(plugin_iter(base, classes)) - name = base.__name__ + for name in self.register: + base = self.register[name] + magic = getattr(self.register, name) + namespace = NameSpace( + plugin_iter(base, (magic[k] for k in magic)) + ) assert not ( name in self.__d or hasattr(self, name) ) self.__d[name] = namespace object.__setattr__(self, name, namespace) - for plugin in instances.values(): + for plugin in instances.itervalues(): plugin.finalize(self) lock(plugin) assert plugin.api is self |