diff options
author | Jacek Konieczny <jajcus@jajcus.net> | 2007-02-03 22:31:43 +0300 |
---|---|---|
committer | Jacek Konieczny <jajcus@jajcus.net> | 2007-02-03 22:31:43 +0300 |
commit | dc8f08812c176236f443a40bfffc91a9bd5ca9d8 (patch) | |
tree | 2733e81442b4f6deb1aa51099e8ff4e520383237 /pyxmpp | |
parent | 6a332ecb87d6d5dc3aff0a942a427398a3c922ce (diff) |
- interfaces API improvements
Diffstat (limited to 'pyxmpp')
-rw-r--r-- | pyxmpp/interface.py | 2 | ||||
-rw-r--r-- | pyxmpp/interface_micro_impl.py | 23 | ||||
-rw-r--r-- | pyxmpp/interfaces.py | 11 |
3 files changed, 25 insertions, 11 deletions
diff --git a/pyxmpp/interface.py b/pyxmpp/interface.py index 1967ad4..8e262cd 100644 --- a/pyxmpp/interface.py +++ b/pyxmpp/interface.py @@ -31,6 +31,6 @@ except ImportError: from pyxmpp.interface_micro_impl import Interface, Attribute, providedBy, implementedBy, implements -__all__ = (Interface, Attribute, providedBy, implementedBy, implements) +__all__ = ("Interface", "Attribute", "providedBy", "implementedBy", "implements") # vi: sts=4 et sw=4 diff --git a/pyxmpp/interface_micro_impl.py b/pyxmpp/interface_micro_impl.py index a28fe34..fa3bcc5 100644 --- a/pyxmpp/interface_micro_impl.py +++ b/pyxmpp/interface_micro_impl.py @@ -51,10 +51,17 @@ def implements(*interfaces): locals["__implemented__"] = tuple(interfaces) +def _whole_tree(cls): + yield cls + for base in cls.__bases__: + for b in _whole_tree(base): + yield b + def implementedBy(cls): try: for interface in cls.__implemented__: - yield interface + for c in _whole_tree(interface): + yield c except AttributeError: pass for base in cls.__bases__: @@ -82,23 +89,27 @@ class InterfaceClass(object): __module__ = sys._getframe(1).f_globals['__name__'] if __doc__ is not None: self.__doc__ = __doc__ - if attrs is not None and "__doc__" in attrs: - del attrs["__doc__"] + if attrs is not None and "__doc__" in attrs: + del attrs["__doc__"] self.__module__ = __module__ for base in bases: if not isinstance(base, InterfaceClass): raise TypeError, 'Interface bases must be Interfaces' if attrs is not None: - for attr in attrs.values(): + for aname, attr in attrs.items(): if not isinstance(attr, Attribute) and type(attr) is not FunctionType: - raise TypeError, 'Interface attributes must be Attributes o functions' + raise TypeError, 'Interface attributes must be Attributes o functions (%r found in %s)' % (attr, aname) + self.__bases__ = bases self.__attrs = attrs self.__name__ = name self.__identifier__ = "%s.%s" % (self.__module__, self.__name__) def providedBy(self, ob): """Is the interface implemented by an object""" - return self in providedBy(ob) + if self in providedBy(ob): + return True + return False + def implementedBy(self, cls): """Do instances of the given class implement the interface?""" return self in implementedBy(cls) diff --git a/pyxmpp/interfaces.py b/pyxmpp/interfaces.py index e8d48be..5d16414 100644 --- a/pyxmpp/interfaces.py +++ b/pyxmpp/interfaces.py @@ -22,19 +22,22 @@ __docformat__ = "restructuredtext en" from pyxmpp.interface import Interface, Attribute -class IPresenceHandlersProvider(Interface): +class IPyXMPPHelper(Interface): + """Base for all interfaces used as PyXMPP helpers.""" + +class IPresenceHandlersProvider(IPyXMPPHelper): def get_presence_handlers(): """Returns iterable over (presence_type, handler[, namespace[, priority]]) tuples. The tuples will be used as arguments for `Stream.set_presence_handler`.""" -class IMessageHandlersProvider(Interface): +class IMessageHandlersProvider(IPyXMPPHelper): def get_message_handlers(): """Returns iterable over (message_type, handler[, namespace[, priority]]) tuples. The tuples will be used as arguments for `Stream.set_message_handler`.""" -class IIqHandlersProvider(Interface): +class IIqHandlersProvider(IPyXMPPHelper): def get_iq_get_handlers(): """Returns iterable over (element_name, namespace) tuples. @@ -47,7 +50,7 @@ class IIqHandlersProvider(Interface): class IStanzaHandlersProvider(IPresenceHandlersProvider, IMessageHandlersProvider, IIqHandlersProvider): pass -class IFeaturesProvider(Interface): +class IFeaturesProvider(IPyXMPPHelper): def get_features(): """Return iterable of namespaces (features) supported, for disco#info query response.""" |