From 1d6cc1bb7b6f4a88f8df23d854993cdef754ec3f Mon Sep 17 00:00:00 2001 From: Jason Gerard DeRose Date: Wed, 27 Jan 2010 05:59:09 -0700 Subject: Remove __public__ and __proxy__ hold-overs from Plugin class --- ipalib/backend.py | 2 - ipalib/frontend.py | 35 ------------- ipalib/plugable.py | 73 +-------------------------- tests/test_ipalib/test_backend.py | 1 - tests/test_ipalib/test_frontend.py | 16 ------ tests/test_ipalib/test_plugable.py | 101 ------------------------------------- 6 files changed, 1 insertion(+), 227 deletions(-) diff --git a/ipalib/backend.py b/ipalib/backend.py index 8aa05780..03f4ce39 100644 --- a/ipalib/backend.py +++ b/ipalib/backend.py @@ -32,8 +32,6 @@ class Backend(plugable.Plugin): Base class for all backend plugins. """ - __proxy__ = False # Backend plugins are not wrapped in a PluginProxy - class Connectible(Backend): """ diff --git a/ipalib/frontend.py b/ipalib/frontend.py index 2c1168a5..1cc2ea27 100644 --- a/ipalib/frontend.py +++ b/ipalib/frontend.py @@ -359,20 +359,6 @@ class Command(HasParam): ipalib.frontend.my_command() """ - __public__ = frozenset(( - 'get_default', - 'convert', - 'normalize', - 'validate', - 'execute', - '__call__', - 'args', - 'options', - 'params', - 'params_2_args_options', - 'args_options_2_params', - 'output_for_cli', - )) takes_options = tuple() takes_args = tuple() args = None @@ -875,16 +861,6 @@ class LocalOrRemote(Command): class Object(HasParam): - __public__ = frozenset(( - 'backend', - 'methods', - 'properties', - 'params', - 'primary_key', - 'params_minus_pk', - 'params_minus', - 'get_dn', - )) backend = None methods = None properties = None @@ -1011,10 +987,6 @@ class Attribute(Plugin): only the base class for the `Method` and `Property` classes. Also see the `Object` class. """ - __public__ = frozenset(( - 'obj', - 'obj_name', - )) __obj = None def __init__(self): @@ -1112,7 +1084,6 @@ class Method(Attribute, Command): attribute-to-object association. Also see the `Object` and the `Property` classes. """ - __public__ = Attribute.__public__.union(Command.__public__) extra_options_first = False extra_args_first = False @@ -1125,12 +1096,6 @@ class Method(Attribute, Command): class Property(Attribute): - __public__ = frozenset(( - 'rules', - 'param', - 'type', - )).union(Attribute.__public__) - klass = Str default = None default_from = None diff --git a/ipalib/plugable.py b/ipalib/plugable.py index ecccb79e..b6ba7325 100644 --- a/ipalib/plugable.py +++ b/ipalib/plugable.py @@ -154,11 +154,9 @@ class Plugin(ReadOnly): """ Base class for all plugins. """ - __public__ = frozenset() - __proxy__ = True - __api = None def __init__(self): + self.__api = None cls = self.__class__ self.name = cls.__name__ self.module = cls.__module__ @@ -189,75 +187,6 @@ class Plugin(ReadOnly): return self.__api api = property(__get_api) - @classmethod - def implements(cls, arg): - """ - Return True if this class implements ``arg``. - - There are three different ways this method can be called: - - With a argument, e.g.: - - >>> class base(Plugin): - ... __public__ = frozenset(['attr1', 'attr2']) - ... - >>> base.implements('attr1') - True - >>> base.implements('attr2') - True - >>> base.implements('attr3') - False - - With a argument, e.g.: - - With any object that has a `__public__` attribute that is - , e.g.: - - Unlike ProxyTarget.implemented_by(), this returns an abstract answer - because only the __public__ frozenset is checked... a ProxyTarget - need not itself have attributes for all names in __public__ - (subclasses might provide them). - """ - assert type(cls.__public__) is frozenset - if isinstance(arg, str): - return arg in cls.__public__ - if type(getattr(arg, '__public__', None)) is frozenset: - return cls.__public__.issuperset(arg.__public__) - if type(arg) is frozenset: - return cls.__public__.issuperset(arg) - raise TypeError( - "must be str, frozenset, or have frozenset '__public__' attribute" - ) - - @classmethod - def implemented_by(cls, arg): - """ - Return True if ``arg`` implements public interface of this class. - - This classmethod returns True if: - - 1. ``arg`` is an instance of or subclass of this class, and - - 2. ``arg`` (or ``arg.__class__`` if instance) has an attribute for - each name in this class's ``__public__`` frozenset. - - Otherwise, returns False. - - Unlike `Plugin.implements`, this returns a concrete answer because - the attributes of the subclass are checked. - - :param arg: An instance of or subclass of this class. - """ - if inspect.isclass(arg): - subclass = arg - else: - subclass = arg.__class__ - assert issubclass(subclass, cls), 'must be subclass of %r' % cls - for name in cls.__public__: - if not hasattr(subclass, name): - return False - return True - def finalize(self): """ """ diff --git a/tests/test_ipalib/test_backend.py b/tests/test_ipalib/test_backend.py index 82cf17aa..6517bec9 100644 --- a/tests/test_ipalib/test_backend.py +++ b/tests/test_ipalib/test_backend.py @@ -39,7 +39,6 @@ class test_Backend(ClassChecker): def test_class(self): assert self.cls.__bases__ == (plugable.Plugin,) - assert self.cls.__proxy__ is False class Disconnect(object): diff --git a/tests/test_ipalib/test_frontend.py b/tests/test_ipalib/test_frontend.py index 4cdb8774..b5ecd053 100644 --- a/tests/test_ipalib/test_frontend.py +++ b/tests/test_ipalib/test_frontend.py @@ -250,7 +250,6 @@ class test_Command(ClassChecker): """ Test the ``ipalib.frontend.Command.args`` instance attribute. """ - assert 'args' in self.cls.__public__ # Public assert self.cls().args is None o = self.cls() o.finalize() @@ -300,7 +299,6 @@ class test_Command(ClassChecker): """ Test the ``ipalib.frontend.Command.options`` instance attribute. """ - assert 'options' in self.cls.__public__ # Public assert self.cls().options is None o = self.cls() o.finalize() @@ -389,7 +387,6 @@ class test_Command(ClassChecker): """ Test the `ipalib.frontend.Command.convert` method. """ - assert 'convert' in self.cls.__public__ # Public kw = dict( option0=u'1.5', option1=u'7', @@ -403,7 +400,6 @@ class test_Command(ClassChecker): """ Test the `ipalib.frontend.Command.normalize` method. """ - assert 'normalize' in self.cls.__public__ # Public kw = dict( option0=u'OPTION0', option1=u'OPTION1', @@ -417,14 +413,12 @@ class test_Command(ClassChecker): """ Test the `ipalib.frontend.Command.get_default` method. """ - assert 'get_default' in self.cls.__public__ # Public # FIXME: Add an updated unit tests for get_default() def test_validate(self): """ Test the `ipalib.frontend.Command.validate` method. """ - assert 'validate' in self.cls.__public__ # Public sub = self.subcls() sub.finalize() @@ -457,7 +451,6 @@ class test_Command(ClassChecker): """ Test the `ipalib.frontend.Command.execute` method. """ - assert 'execute' in self.cls.__public__ # Public o = self.cls() e = raises(NotImplementedError, o.execute) assert str(e) == 'Command.execute()' @@ -466,7 +459,6 @@ class test_Command(ClassChecker): """ Test the `ipalib.frontend.Command.args_options_2_params` method. """ - assert 'args_options_2_params' in self.cls.__public__ # Public # Test that ZeroArgumentError is raised: o = self.get_instance() @@ -548,7 +540,6 @@ class test_Command(ClassChecker): """ Test the `ipalib.frontend.Command.params_2_args_options` method. """ - assert 'params_2_args_options' in self.cls.__public__ # Public o = self.get_instance(args='one', options='two') assert o.params_2_args_options() == ((None,), {}) assert o.params_2_args_options(one=1) == ((1,), {}) @@ -915,7 +906,6 @@ class test_Object(ClassChecker): """ Test the `ipalib.frontend.Object.get_dn` method. """ - assert 'get_dn' in self.cls.__public__ # Public o = self.cls() e = raises(NotImplementedError, o.get_dn, 'primary key') assert str(e) == 'Object.get_dn()' @@ -1019,8 +1009,6 @@ class test_Method(ClassChecker): Test the `ipalib.frontend.Method` class. """ assert self.cls.__bases__ == (frontend.Attribute, frontend.Command) - assert self.cls.implements(frontend.Command) - assert self.cls.implements(frontend.Attribute) def test_init(self): """ @@ -1032,10 +1020,6 @@ class test_Method(ClassChecker): assert o.name == 'user_add' assert o.obj_name == 'user' assert o.attr_name == 'add' - assert frontend.Command.implemented_by(o) - assert frontend.Attribute.implemented_by(o) - - class test_Property(ClassChecker): diff --git a/tests/test_ipalib/test_plugable.py b/tests/test_ipalib/test_plugable.py index ec1ef3e0..79121cf7 100644 --- a/tests/test_ipalib/test_plugable.py +++ b/tests/test_ipalib/test_plugable.py @@ -209,7 +209,6 @@ class test_Plugin(ClassChecker): Test the `ipalib.plugable.Plugin` class. """ assert self.cls.__bases__ == (plugable.ReadOnly,) - assert self.cls.__public__ == frozenset() assert type(self.cls.api) is property def test_init(self): @@ -251,98 +250,6 @@ class test_Plugin(ClassChecker): assert str(e) == \ "check.info attribute ('whatever') conflicts with Plugin logger" - def test_implements(self): - """ - Test the `ipalib.plugable.Plugin.implements` classmethod. - """ - class example(self.cls): - __public__ = frozenset(( - 'some_method', - 'some_property', - )) - class superset(self.cls): - __public__ = frozenset(( - 'some_method', - 'some_property', - 'another_property', - )) - class subset(self.cls): - __public__ = frozenset(( - 'some_property', - )) - class any_object(object): - __public__ = frozenset(( - 'some_method', - 'some_property', - )) - - for ex in (example, example()): - # Test using str: - assert ex.implements('some_method') - assert not ex.implements('another_method') - - # Test using frozenset: - assert ex.implements(frozenset(['some_method'])) - assert not ex.implements( - frozenset(['some_method', 'another_method']) - ) - - # Test using another object/class with __public__ frozenset: - assert ex.implements(example) - assert ex.implements(example()) - - assert ex.implements(subset) - assert not subset.implements(ex) - - assert not ex.implements(superset) - assert superset.implements(ex) - - assert ex.implements(any_object) - assert ex.implements(any_object()) - - def test_implemented_by(self): - """ - Test the `ipalib.plugable.Plugin.implemented_by` classmethod. - """ - class base(self.cls): - __public__ = frozenset(( - 'attr0', - 'attr1', - 'attr2', - )) - - class okay(base): - def attr0(self): - pass - def __get_attr1(self): - assert False # Make sure property isn't accesed on instance - attr1 = property(__get_attr1) - attr2 = 'hello world' - another_attr = 'whatever' - - class fail(base): - def __init__(self): - # Check that class, not instance is inspected: - self.attr2 = 'hello world' - def attr0(self): - pass - def __get_attr1(self): - assert False # Make sure property isn't accesed on instance - attr1 = property(__get_attr1) - another_attr = 'whatever' - - # Test that AssertionError is raised trying to pass something not - # subclass nor instance of base: - raises(AssertionError, base.implemented_by, object) - - # Test on subclass with needed attributes: - assert base.implemented_by(okay) is True - assert base.implemented_by(okay()) is True - - # Test on subclass *without* needed attributes: - assert base.implemented_by(fail) is False - assert base.implemented_by(fail()) is False - def test_set_api(self): """ Test the `ipalib.plugable.Plugin.set_api` method. @@ -507,18 +414,10 @@ class test_API(ClassChecker): # Setup the test bases, create the API: class base0(plugable.Plugin): - __public__ = frozenset(( - 'method', - )) - def method(self, n): return n class base1(plugable.Plugin): - __public__ = frozenset(( - 'method', - )) - def method(self, n): return n + 1 -- cgit