Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Jajcus/pyxmpp.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/pyxmpp
diff options
context:
space:
mode:
authorJacek Konieczny <jajcus@jajcus.net>2007-02-03 22:31:43 +0300
committerJacek Konieczny <jajcus@jajcus.net>2007-02-03 22:31:43 +0300
commitdc8f08812c176236f443a40bfffc91a9bd5ca9d8 (patch)
tree2733e81442b4f6deb1aa51099e8ff4e520383237 /pyxmpp
parent6a332ecb87d6d5dc3aff0a942a427398a3c922ce (diff)
- interfaces API improvements
Diffstat (limited to 'pyxmpp')
-rw-r--r--pyxmpp/interface.py2
-rw-r--r--pyxmpp/interface_micro_impl.py23
-rw-r--r--pyxmpp/interfaces.py11
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."""