Use FeederHandler to filter accounts to feed from
darcs-hash:20070605192322-86b55-7cf7caacfd8e9b0f52fc00f5eaef6fbf32bf94cc.gz
This commit is contained in:
@@ -28,7 +28,7 @@ __revision__ = "$Id: feeder.py,v 1.3 2005/09/18 20:24:07 dax Exp $"
|
|||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from jcl.jabber.component import JCLComponent
|
from jcl.jabber.component import JCLComponent, Handler
|
||||||
from jcl.lang import Lang
|
from jcl.lang import Lang
|
||||||
from jcl.model.account import Account
|
from jcl.model.account import Account
|
||||||
|
|
||||||
@@ -54,8 +54,7 @@ class FeederComponent(JCLComponent):
|
|||||||
db_connection_str,
|
db_connection_str,
|
||||||
lang=lang)
|
lang=lang)
|
||||||
# Define default feeder and sender, can be override
|
# Define default feeder and sender, can be override
|
||||||
self.feeder = Feeder(self)
|
self.handler = FeederHandler(Feeder(self), Sender(self))
|
||||||
self.sender = Sender(self)
|
|
||||||
self.check_interval = 1
|
self.check_interval = 1
|
||||||
|
|
||||||
self.__logger = logging.getLogger("jcl.jabber.FeederComponent")
|
self.__logger = logging.getLogger("jcl.jabber.FeederComponent")
|
||||||
@@ -63,10 +62,10 @@ class FeederComponent(JCLComponent):
|
|||||||
def handle_tick(self):
|
def handle_tick(self):
|
||||||
"""Implement main feed/send behavior"""
|
"""Implement main feed/send behavior"""
|
||||||
self.db_connect()
|
self.db_connect()
|
||||||
for _account in Account.select(clauseTables=["account"],
|
self.handler.handle(\
|
||||||
orderBy="user_jid"):
|
None, self.lang.get_default_lang_class(),
|
||||||
for subject, body in self.feeder.feed(_account):
|
self.handler.filter(None,
|
||||||
self.sender.send(_account, subject, body)
|
self.lang.get_default_lang_class()))
|
||||||
self.db_disconnect()
|
self.db_disconnect()
|
||||||
|
|
||||||
|
|
||||||
@@ -110,3 +109,31 @@ class HeadlineSender(Sender):
|
|||||||
subject=subject,
|
subject=subject,
|
||||||
stanza_type="headline",
|
stanza_type="headline",
|
||||||
body=body))
|
body=body))
|
||||||
|
|
||||||
|
class FeederHandler(Handler):
|
||||||
|
"""Filter (nothing by default) and call sender for each message from
|
||||||
|
Feeder.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, feeder, sender):
|
||||||
|
"""DefaultFeederHandler constructor"""
|
||||||
|
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.select(clauseTables=["account"],
|
||||||
|
orderBy="user_jid")
|
||||||
|
return accounts
|
||||||
|
|
||||||
|
def handle(self, stanza, lang_class, accounts):
|
||||||
|
"""Apply actions to do on given accounts
|
||||||
|
Do nothing by default.
|
||||||
|
"""
|
||||||
|
for _account in accounts:
|
||||||
|
for subject, body in self.feeder.feed(_account):
|
||||||
|
self.sender.send(_account, subject, body)
|
||||||
|
return []
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,8 @@ from sqlobject.dbconnection import TheURIOpener
|
|||||||
from pyxmpp.message import Message
|
from pyxmpp.message import Message
|
||||||
|
|
||||||
from jcl.jabber.component import JCLComponent
|
from jcl.jabber.component import JCLComponent
|
||||||
from jcl.jabber.feeder import FeederComponent, Feeder, Sender, MessageSender, HeadlineSender
|
from jcl.jabber.feeder import FeederComponent, Feeder, Sender, MessageSender, \
|
||||||
|
HeadlineSender, FeederHandler
|
||||||
from jcl.model.account import Account
|
from jcl.model.account import Account
|
||||||
from jcl.model import account
|
from jcl.model import account
|
||||||
|
|
||||||
@@ -46,6 +47,17 @@ else:
|
|||||||
DB_PATH = "/tmp/jcl_test.db"
|
DB_PATH = "/tmp/jcl_test.db"
|
||||||
DB_URL = DB_PATH #+ "?debug=1&debugThreading=1"
|
DB_URL = DB_PATH #+ "?debug=1&debugThreading=1"
|
||||||
|
|
||||||
|
class FeederMock(object):
|
||||||
|
def feed(self, _account):
|
||||||
|
return [("subject", "body")]
|
||||||
|
|
||||||
|
class SenderMock(object):
|
||||||
|
def __init__(self):
|
||||||
|
self.sent = []
|
||||||
|
|
||||||
|
def send(self, _account, subject, body):
|
||||||
|
self.sent.append((_account, subject, body))
|
||||||
|
|
||||||
class FeederComponent_TestCase(JCLComponent_TestCase):
|
class FeederComponent_TestCase(JCLComponent_TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
if os.path.exists(DB_PATH):
|
if os.path.exists(DB_PATH):
|
||||||
@@ -114,8 +126,8 @@ class FeederComponent_TestCase(JCLComponent_TestCase):
|
|||||||
account2 = Account(user_jid = "user2@test.com", \
|
account2 = Account(user_jid = "user2@test.com", \
|
||||||
name = "account2", \
|
name = "account2", \
|
||||||
jid = "account2@jcl.test.com")
|
jid = "account2@jcl.test.com")
|
||||||
self.comp.feeder = AccountFeeder(self.comp)
|
self.comp.handler.feeder = AccountFeeder(self.comp)
|
||||||
self.comp.sender = MessageSender(self.comp)
|
self.comp.handler.sender = MessageSender(self.comp)
|
||||||
self.comp.handle_tick()
|
self.comp.handle_tick()
|
||||||
|
|
||||||
messages_sent = self.comp.stream.sent
|
messages_sent = self.comp.stream.sent
|
||||||
@@ -216,6 +228,56 @@ class HeadlineSender_TestCase(MessageSender_TestCase):
|
|||||||
self.sender = HeadlineSender(self.comp)
|
self.sender = HeadlineSender(self.comp)
|
||||||
self.message_type = "headline"
|
self.message_type = "headline"
|
||||||
|
|
||||||
|
class FeederHandler_TestCase(unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.handler = FeederHandler(FeederMock(), SenderMock())
|
||||||
|
if os.path.exists(DB_PATH):
|
||||||
|
os.unlink(DB_PATH)
|
||||||
|
account.hub.threadConnection = connectionForURI('sqlite://' + DB_URL)
|
||||||
|
Account.createTable(ifNotExists = True)
|
||||||
|
ExampleAccount.createTable(ifNotExists = True)
|
||||||
|
del account.hub.threadConnection
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
self.handler = None
|
||||||
|
account.hub.threadConnection = connectionForURI('sqlite://' + DB_URL)
|
||||||
|
ExampleAccount.dropTable(ifExists = True)
|
||||||
|
Account.dropTable(ifExists = True)
|
||||||
|
del TheURIOpener.cachedURIs['sqlite://' + DB_URL]
|
||||||
|
account.hub.threadConnection.close()
|
||||||
|
del account.hub.threadConnection
|
||||||
|
if os.path.exists(DB_PATH):
|
||||||
|
os.unlink(DB_PATH)
|
||||||
|
|
||||||
|
def test_filter(self):
|
||||||
|
account.hub.threadConnection = connectionForURI('sqlite://' + DB_URL)
|
||||||
|
account12 = ExampleAccount(user_jid="user2@test.com",
|
||||||
|
name="account12",
|
||||||
|
jid="account12@jcl.test.com")
|
||||||
|
account11 = ExampleAccount(user_jid="user1@test.com",
|
||||||
|
name="account11",
|
||||||
|
jid="account11@jcl.test.com")
|
||||||
|
accounts = self.handler.filter(None, None)
|
||||||
|
self.assertEquals(accounts.count(), 2)
|
||||||
|
# accounts must be ordered by user_jid
|
||||||
|
self.assertEquals(accounts[0].name, "account11")
|
||||||
|
self.assertEquals(accounts[1].name, "account12")
|
||||||
|
del account.hub.threadConnection
|
||||||
|
|
||||||
|
def test_handle(self):
|
||||||
|
account.hub.threadConnection = connectionForURI('sqlite://' + DB_URL)
|
||||||
|
account11 = ExampleAccount(user_jid="user1@test.com",
|
||||||
|
name="account11",
|
||||||
|
jid="account11@jcl.test.com")
|
||||||
|
account12 = ExampleAccount(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
|
||||||
|
self.assertEquals(len(sent), 2)
|
||||||
|
self.assertEquals(sent[0], (account11, "subject", "body"))
|
||||||
|
self.assertEquals(sent[1], (account12, "subject", "body"))
|
||||||
|
del account.hub.threadConnection
|
||||||
|
|
||||||
def suite():
|
def suite():
|
||||||
suite = unittest.TestSuite()
|
suite = unittest.TestSuite()
|
||||||
@@ -224,6 +286,7 @@ def suite():
|
|||||||
suite.addTest(unittest.makeSuite(Sender_TestCase, 'test'))
|
suite.addTest(unittest.makeSuite(Sender_TestCase, 'test'))
|
||||||
suite.addTest(unittest.makeSuite(MessageSender_TestCase, 'test'))
|
suite.addTest(unittest.makeSuite(MessageSender_TestCase, 'test'))
|
||||||
suite.addTest(unittest.makeSuite(HeadlineSender_TestCase, 'test'))
|
suite.addTest(unittest.makeSuite(HeadlineSender_TestCase, 'test'))
|
||||||
|
suite.addTest(unittest.makeSuite(FeederHandler_TestCase, 'test'))
|
||||||
return suite
|
return suite
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|||||||
Reference in New Issue
Block a user