summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLance Stout <lancestout@gmail.com>2012-03-10 12:48:35 -0800
committerLance Stout <lancestout@gmail.com>2012-03-10 12:48:35 -0800
commit91155444c0f66ed3172ff8fc669a5eebe514e9cc (patch)
tree0444b5ba230a9aceb28fd5977b45ac63218c60d4
parent7f71ac7e0a43ca7a7b4347fe8f1bab0cb76e9741 (diff)
downloadslixmpp-91155444c0f66ed3172ff8fc669a5eebe514e9cc.tar.gz
slixmpp-91155444c0f66ed3172ff8fc669a5eebe514e9cc.tar.bz2
slixmpp-91155444c0f66ed3172ff8fc669a5eebe514e9cc.tar.xz
slixmpp-91155444c0f66ed3172ff8fc669a5eebe514e9cc.zip
Resolve plugin dependency chains with XEP-0115.
The post_init() system can only reliably handle a single layer of dependencies between plugins, but PEP plugins with XEP-0115 exceed that limit and plugins can be post_init'ed out of order. To resolve this, we will special case XEP-0115 to be post_init'ed first until the new plugin system with dependency tracking is stable.
-rw-r--r--sleekxmpp/basexmpp.py14
-rw-r--r--sleekxmpp/plugins/__init__.py2
-rw-r--r--tests/test_stream_presence.py12
-rw-r--r--tests/test_stream_roster.py4
4 files changed, 17 insertions, 15 deletions
diff --git a/sleekxmpp/basexmpp.py b/sleekxmpp/basexmpp.py
index dcb90582..f655783a 100644
--- a/sleekxmpp/basexmpp.py
+++ b/sleekxmpp/basexmpp.py
@@ -185,6 +185,16 @@ class BaseXMPP(XMLStream):
- The send queue processor
- The scheduler
"""
+
+ # The current post_init() process can only resolve a single
+ # layer of inter-plugin dependencies. However, XEP-0115 and
+ # plugins which depend on it exceeds this limit and can cause
+ # failures if plugins are post_inited out of order, so we must
+ # manually process XEP-0115 first.
+ if 'xep_0115' in self.plugin:
+ if not self.plugin['xep_0115'].post_inited:
+ self.plugin['xep_0115'].post_init()
+
for name in self.plugin:
if not self.plugin[name].post_inited:
self.plugin[name].post_init()
@@ -257,10 +267,6 @@ class BaseXMPP(XMLStream):
else:
raise NameError("Plugin %s not in plugins.__all__." % plugin)
- # Resolve plugin inter-dependencies.
- for plugin in self.plugin:
- self.plugin[plugin].post_init()
-
def __getitem__(self, key):
"""Return a plugin given its name, if it has been registered."""
if key in self.plugin:
diff --git a/sleekxmpp/plugins/__init__.py b/sleekxmpp/plugins/__init__.py
index 0b2fa119..8c5d38f0 100644
--- a/sleekxmpp/plugins/__init__.py
+++ b/sleekxmpp/plugins/__init__.py
@@ -27,7 +27,9 @@ __all__ = [
'xep_0086', # Legacy Error Codes
'xep_0092', # Software Version
'xep_0115', # Entity Capabilities
+ 'xep_0118', # User Tune
'xep_0128', # Extended Service Discovery
+ 'xep_0163', # Personal Eventing Protocol
'xep_0199', # Ping
'xep_0202', # Entity Time
'xep_0203', # Delayed Delivery
diff --git a/tests/test_stream_presence.py b/tests/test_stream_presence.py
index 63ccb043..4f2ede16 100644
--- a/tests/test_stream_presence.py
+++ b/tests/test_stream_presence.py
@@ -7,6 +7,9 @@ class TestStreamPresence(SleekTest):
Test handling roster updates.
"""
+ def setUp(self):
+ self.stream_start(jid='tester@localhost', plugins=[])
+
def tearDown(self):
self.stream_close()
@@ -25,7 +28,6 @@ class TestStreamPresence(SleekTest):
# The presence_unavailable event should be triggered.
events.add('unavailable')
- self.stream_start()
self.xmpp.add_event_handler('got_offline', got_offline)
self.xmpp.add_event_handler('presence_unavailable', unavailable)
@@ -48,7 +50,6 @@ class TestStreamPresence(SleekTest):
def got_offline(presence):
events.append('got_offline')
- self.stream_start()
self.xmpp.add_event_handler('got_offline', got_offline)
# Setup roster. Use a 'set' instead of 'result' so we
@@ -98,7 +99,6 @@ class TestStreamPresence(SleekTest):
def got_online(p):
events.add('got_online')
- self.stream_start()
self.xmpp.add_event_handler('presence_available', presence_available)
self.xmpp.add_event_handler('got_online', got_online)
@@ -128,7 +128,6 @@ class TestStreamPresence(SleekTest):
def changed_subscription(p):
events.add('changed_subscription')
- self.stream_start(jid='tester@localhost')
self.xmpp.add_event_handler('changed_subscription',
changed_subscription)
@@ -175,8 +174,6 @@ class TestStreamPresence(SleekTest):
def changed_subscription(p):
events.add('changed_subscription')
- self.stream_start(jid='tester@localhost')
-
self.xmpp.add_event_handler('changed_subscription',
changed_subscription)
self.xmpp.add_event_handler('presence_subscribe',
@@ -205,8 +202,6 @@ class TestStreamPresence(SleekTest):
events = []
- self.stream_start()
-
ptypes = ['available', 'away', 'dnd', 'xa', 'chat',
'unavailable', 'subscribe', 'subscribed',
'unsubscribe', 'unsubscribed']
@@ -254,7 +249,6 @@ class TestStreamPresence(SleekTest):
def test_changed_status(self):
"""Test that the changed_status event is handled properly."""
events = []
- self.stream_start()
def changed_status(presence):
events.append(presence['type'])
diff --git a/tests/test_stream_roster.py b/tests/test_stream_roster.py
index 535a0080..2d0da173 100644
--- a/tests/test_stream_roster.py
+++ b/tests/test_stream_roster.py
@@ -226,7 +226,7 @@ class TestStreamRoster(SleekTest):
def testRosterUnicode(self):
"""Test that JIDs with Unicode values are handled properly."""
- self.stream_start()
+ self.stream_start(plugins=[])
self.recv("""
<iq to="tester@localhost" type="set" id="1">
<query xmlns="jabber:iq:roster">
@@ -267,7 +267,7 @@ class TestStreamRoster(SleekTest):
def testSendLastPresence(self):
"""Test that sending the last presence works."""
- self.stream_start()
+ self.stream_start(plugins=[])
self.xmpp.send_presence(pshow='dnd')
self.xmpp.auto_authorize = True
self.xmpp.auto_subscribe = True