From 5fd76ef4970a081a9f3f92028f2af287d4cc4cfc Mon Sep 17 00:00:00 2001 From: David Rousselie Date: Tue, 4 Nov 2008 08:22:33 +0100 Subject: [PATCH] Support for multiple feeder handlers darcs-hash:20081104072233-86b55-e6450860c2c462f5007bdd173d493eef00f2dddc.gz --- src/jcl/jabber/component.py | 6 +--- src/jcl/jabber/feeder.py | 21 ++++-------- src/jcl/jabber/presence.py | 8 ++--- src/jcl/jabber/tests/feeder.py | 59 ++++++++++++++++++++++++++++------ src/jcl/model/account.py | 2 +- 5 files changed, 62 insertions(+), 34 deletions(-) diff --git a/src/jcl/jabber/component.py b/src/jcl/jabber/component.py index 8db175d..c470ee4 100644 --- a/src/jcl/jabber/component.py +++ b/src/jcl/jabber/component.py @@ -27,20 +27,16 @@ JCL base component __revision__ = "$Id: component.py,v 1.3 2005/09/18 20:24:07 dax Exp $" -import sys - import threading import logging import signal import re -import traceback -import string import time import socket +import string from Queue import Queue -import pyxmpp.error as error from pyxmpp.jid import JID from pyxmpp.jabberd.component import Component from pyxmpp.message import Message diff --git a/src/jcl/jabber/feeder.py b/src/jcl/jabber/feeder.py index 8204d2d..3e15e62 100644 --- a/src/jcl/jabber/feeder.py +++ b/src/jcl/jabber/feeder.py @@ -31,8 +31,6 @@ import logging from jcl.jabber import Handler from jcl.jabber.component import JCLComponent, AccountManager from jcl.lang import Lang -import jcl.model as model -from jcl.model import account from jcl.jabber.command import JCLCommandManager from pyxmpp.message import Message @@ -66,15 +64,16 @@ class FeederComponent(JCLComponent): account_manager_class=account_manager_class, command_manager_class=command_manager_class) # Define default feeder and sender, can be override - self.handler = FeederHandler(Feeder(self), Sender(self)) + self.tick_handlers = [FeederHandler(Feeder(self), Sender(self))] self.__logger = logging.getLogger("jcl.jabber.FeederComponent") def handle_tick(self): """Implement main feed/send behavior""" - self.handler.handle(\ - None, self.lang.get_default_lang_class(), - self.handler.filter(None, - self.lang.get_default_lang_class())) + for handler in self.tick_handlers: + handler.handle(\ + None, self.lang.get_default_lang_class(), + handler.filter(None, + self.lang.get_default_lang_class())) class Feeder(object): """Abstract feeder class""" @@ -136,14 +135,6 @@ class FeederHandler(Handler): self.feeder = feeder self.sender = sender - def filter(self, stanza, lang_class): - """ - Filter account to be processed by the handler - return all accounts. - """ - accounts = account.get_all_accounts() - return accounts - def handle(self, stanza, lang_class, data): """ Apply actions to do on given accounts diff --git a/src/jcl/jabber/presence.py b/src/jcl/jabber/presence.py index 53c8622..9cec5a0 100644 --- a/src/jcl/jabber/presence.py +++ b/src/jcl/jabber/presence.py @@ -152,7 +152,7 @@ class AccountPresenceSubscribeHandler(Handler): filter = jabber.get_account_filter def handle(self, stanza, lang_class, data): - """Handle \"subscribe\" iq sent to an account JID""" + """Handle 'subscribe' iq sent to an account JID""" return [stanza.make_accept_response()] class RootPresenceSubscribeHandler(AccountPresenceSubscribeHandler): @@ -161,7 +161,7 @@ class RootPresenceSubscribeHandler(AccountPresenceSubscribeHandler): filter = jabber.get_accounts_root_filter def handle(self, stanza, lang_class, data): - """Handle \"subscribe\" iq sent to component JID""" + """Handle 'subscribe' iq sent to component JID""" if list(data) != []: return AccountPresenceSubscribeHandler.handle(self, stanza, lang_class, None) @@ -174,7 +174,7 @@ class AccountPresenceUnsubscribeHandler(Handler): filter = jabber.get_account_filter def handle(self, stanza, lang_class, data): - """Handle \"unsubscribe\" iq sent to account JID""" + """Handle 'unsubscribe' iq sent to account JID""" from_jid = stanza.get_from() _account = data return self.component.account_manager.remove_account(_account, from_jid) @@ -185,7 +185,7 @@ class RootPresenceUnsubscribeHandler(Handler): filter = jabber.get_accounts_root_filter def handle(self, stanza, lang_class, data): - """Handle \"unsubscribe\" iq sent to account JID""" + """Handle 'unsubscribe' iq sent to account JID""" from_jid = stanza.get_from() _account = data return self.component.account_manager.remove_all_accounts(from_jid) diff --git a/src/jcl/jabber/tests/feeder.py b/src/jcl/jabber/tests/feeder.py index 71e07a5..030a7c9 100644 --- a/src/jcl/jabber/tests/feeder.py +++ b/src/jcl/jabber/tests/feeder.py @@ -107,12 +107,14 @@ class FeederComponent_TestCase(JCLComponent_TestCase): account2 = Account(user=User(jid="user2@test.com"), name="account2", jid="account2@jcl.test.com") - self.comp.handler.feeder = AccountFeeder(self.comp) - self.comp.handler.sender = MessageSender(self.comp) + self.comp.tick_handlers = [FeederHandler(AccountFeeder(self.comp), + MessageSender(self.comp)), + FeederHandler(AccountFeeder(self.comp), + MessageSender(self.comp))] self.comp.handle_tick() messages_sent = self.comp.stream.sent - self.assertEquals(len(messages_sent), 6) + self.assertEquals(len(messages_sent), 12) self.assertEquals(messages_sent[0].get_from(), "account11@jcl.test.com") self.assertEquals(messages_sent[0].get_to(), "user1@test.com") self.assertEquals(messages_sent[0].get_subject(), @@ -152,6 +154,45 @@ class FeederComponent_TestCase(JCLComponent_TestCase): self.assertEquals(messages_sent[5].get_body(), "jid: account2@jcl.test.com") + self.assertEquals(messages_sent[6].get_from(), "account11@jcl.test.com") + self.assertEquals(messages_sent[6].get_to(), "user1@test.com") + self.assertEquals(messages_sent[6].get_subject(), + "Simple Message for account account11") + self.assertEquals(messages_sent[6].get_body(), + "user_jid: user1@test.com") + self.assertEquals(messages_sent[7].get_from(), "account11@jcl.test.com") + self.assertEquals(messages_sent[7].get_to(), "user1@test.com") + self.assertEquals(messages_sent[7].get_subject(), + "Simple Message for account account11") + self.assertEquals(messages_sent[7].get_body(), + "jid: account11@jcl.test.com") + + self.assertEquals(messages_sent[8].get_from(), "account12@jcl.test.com") + self.assertEquals(messages_sent[8].get_to(), "user1@test.com") + self.assertEquals(messages_sent[8].get_subject(), + "Simple Message for account account12") + self.assertEquals(messages_sent[8].get_body(), + "user_jid: user1@test.com") + self.assertEquals(messages_sent[9].get_from(), "account12@jcl.test.com") + self.assertEquals(messages_sent[9].get_to(), "user1@test.com") + self.assertEquals(messages_sent[9].get_subject(), + "Simple Message for account account12") + self.assertEquals(messages_sent[9].get_body(), + "jid: account12@jcl.test.com") + + self.assertEquals(messages_sent[10].get_from(), "account2@jcl.test.com") + self.assertEquals(messages_sent[10].get_to(), "user2@test.com") + self.assertEquals(messages_sent[10].get_subject(), + "Simple Message for account account2") + self.assertEquals(messages_sent[10].get_body(), + "user_jid: user2@test.com") + self.assertEquals(messages_sent[11].get_from(), "account2@jcl.test.com") + self.assertEquals(messages_sent[11].get_to(), "user2@test.com") + self.assertEquals(messages_sent[11].get_subject(), + "Simple Message for account account2") + self.assertEquals(messages_sent[11].get_body(), + "jid: account2@jcl.test.com") + class Feeder_TestCase(unittest.TestCase): def test_feed_exist(self): feeder = Feeder() @@ -208,7 +249,7 @@ class HeadlineSender_TestCase(MessageSender_TestCase): class FeederHandler_TestCase(JCLTestCase): def setUp(self): JCLTestCase.setUp(self, tables=[Account, ExampleAccount, User]) - self.handler = FeederHandler(FeederMock(), SenderMock()) + self.tick_handlers = [FeederHandler(FeederMock(), SenderMock())] def test_filter(self): model.db_connect() @@ -218,7 +259,7 @@ class FeederHandler_TestCase(JCLTestCase): account11 = ExampleAccount(user=User(jid="user1@test.com"), name="account11", jid="account11@jcl.test.com") - accounts = self.handler.filter(None, None) + accounts = self.tick_handlers[0].filter(None, None) i = 0 for _account in accounts: i += 1 @@ -237,8 +278,8 @@ class FeederHandler_TestCase(JCLTestCase): account12 = ExampleAccount(user=User(jid="user2@test.com"), name="account12", jid="account12@jcl.test.com") - accounts = self.handler.handle(None, None, [account11, account12]) - sent = self.handler.sender.sent + accounts = self.tick_handlers[0].handle(None, None, [account11, account12]) + sent = self.tick_handlers[0].sender.sent self.assertEquals(len(sent), 2) self.assertEquals(sent[0], (account11, ("subject", "body"))) self.assertEquals(sent[1], (account12, ("subject", "body"))) @@ -253,8 +294,8 @@ class FeederHandler_TestCase(JCLTestCase): account12 = ExampleAccount(user=User(jid="user2@test.com"), name="account12", jid="account12@jcl.test.com") - accounts = self.handler.handle(None, None, [account11, account12]) - sent = self.handler.sender.sent + accounts = self.tick_handlers[0].handle(None, None, [account11, account12]) + sent = self.tick_handlers[0].sender.sent self.assertEquals(len(sent), 1) self.assertEquals(sent[0], (account12, ("subject", "body"))) model.db_disconnect() diff --git a/src/jcl/model/account.py b/src/jcl/model/account.py index 8f850d8..2b1d4b5 100644 --- a/src/jcl/model/account.py +++ b/src/jcl/model/account.py @@ -60,7 +60,7 @@ def mandatory_field(field_name, field_value): if field_value is None or str(field_value) == "": raise MandatoryFieldError(field_name) return field_value - + class User(InheritableSQLObject): _connection = model.hub