320: plugable.API now respects the Plugin.__proxy__ flag; added test for plugins without proxy to unit tests for API

This commit is contained in:
Jason Gerard DeRose
2008-09-24 00:44:41 +00:00
parent 81de10f176
commit f3aaf65f1c
4 changed files with 30 additions and 2 deletions

View File

@@ -24,4 +24,8 @@ Base classes for all backed-end plugins.
import plugable
class Backend(plugable.Plugin):
pass
"""
Base class for all backend plugins.
"""
__proxy__ = False # Backend plugins are not wrapped in a PluginProxy

View File

@@ -241,6 +241,7 @@ class Plugin(ReadOnly):
Base class for all plugins.
"""
__public__ = frozenset()
__proxy__ = True
__api = None
def __get_name(self):
@@ -709,7 +710,10 @@ class API(DictProxy):
if klass not in instances:
instances[klass] = klass()
plugin = instances[klass]
yield PluginProxy(base, plugin)
if base.__proxy__:
yield PluginProxy(base, plugin)
else:
yield plugin
for name in self.register:
base = self.register[name]

View File

@@ -34,3 +34,4 @@ class test_Backend(ClassChecker):
def test_class(self):
assert self.cls.__bases__ == (plugable.Plugin,)
assert self.cls.__proxy__ is False

View File

@@ -795,3 +795,22 @@ def test_API():
# Test that calling finilize again raises AssertionError:
raises(AssertionError, api.finalize)
# Test with base class that doesn't request a proxy
class NoProxy(plugable.Plugin):
__proxy__ = False
api = plugable.API(NoProxy)
class plugin0(NoProxy):
pass
api.register(plugin0)
class plugin1(NoProxy):
pass
api.register(plugin1)
api.finalize()
names = ['plugin0', 'plugin1']
assert list(api.NoProxy) == names
for name in names:
plugin = api.NoProxy[name]
assert getattr(api.NoProxy, name) is plugin
assert isinstance(plugin, plugable.Plugin)
assert not isinstance(plugin, plugable.PluginProxy)