callbacks triggering
This commit is contained in:
@@ -54,7 +54,7 @@ Registering callbacks
|
|||||||
|
|
||||||
class MyCallback(Callback):
|
class MyCallback(Callback):
|
||||||
|
|
||||||
def callback(self):
|
def trigger(self):
|
||||||
print("Mail received: {O}".format(self.subject))
|
print("Mail received: {O}".format(self.subject))
|
||||||
|
|
||||||
register(MyCallback)
|
register(MyCallback)
|
||||||
@@ -79,7 +79,7 @@ pattern 'Hello ' followed by a word, anywhere in the subject (it uses
|
|||||||
class MyCallback(Callback):
|
class MyCallback(Callback):
|
||||||
rules = {'subject': [r'Hello (\w)']}
|
rules = {'subject': [r'Hello (\w)']}
|
||||||
|
|
||||||
def callback(self):
|
def trigger(self):
|
||||||
print("Mail received for {0}".format(self.matches['subject'][0]))
|
print("Mail received for {0}".format(self.matches['subject'][0]))
|
||||||
|
|
||||||
register(MyCallback)
|
register(MyCallback)
|
||||||
@@ -101,7 +101,7 @@ registering:
|
|||||||
|
|
||||||
class MyCallback(Callback):
|
class MyCallback(Callback):
|
||||||
|
|
||||||
def callback(self):
|
def trigger(self):
|
||||||
print("Mail received for %s!" self.matches['subject'][0])
|
print("Mail received for %s!" self.matches['subject'][0])
|
||||||
|
|
||||||
register(MyCallback, rules={'subject': [r'Hello (\w)']})
|
register(MyCallback, rules={'subject': [r'Hello (\w)']})
|
||||||
@@ -176,7 +176,7 @@ As an example, let's take an email with the subject "Hello Bryan", from
|
|||||||
class MyCallback(Callback):
|
class MyCallback(Callback):
|
||||||
rules = {'subject': [r'Hello (\w)', 'Hi!'], 'from': ['@doe.com']}
|
rules = {'subject': [r'Hello (\w)', 'Hi!'], 'from': ['@doe.com']}
|
||||||
|
|
||||||
def callback(self):
|
def trigger(self):
|
||||||
print("Mail received for {0}".format(self.matches['subject'][0]))
|
print("Mail received for {0}".format(self.matches['subject'][0]))
|
||||||
|
|
||||||
register(MyCallback)
|
register(MyCallback)
|
||||||
|
|||||||
@@ -53,6 +53,12 @@ class Callback(object):
|
|||||||
return any(self.matches[item])
|
return any(self.matches[item])
|
||||||
|
|
||||||
def get_email_body(self, message=None):
|
def get_email_body(self, message=None):
|
||||||
|
"""Return the message text body.
|
||||||
|
|
||||||
|
Return the first 'text/plain' part of the email.Message that doesn't
|
||||||
|
have a filename.
|
||||||
|
|
||||||
|
"""
|
||||||
if message is None:
|
if message is None:
|
||||||
message = self.message
|
message = self.message
|
||||||
|
|
||||||
@@ -65,3 +71,8 @@ class Callback(object):
|
|||||||
if content_type == 'text/plain' and filename is None:
|
if content_type == 'text/plain' and filename is None:
|
||||||
# text body of the mail, not an attachment
|
# text body of the mail, not an attachment
|
||||||
return part.get_payload()
|
return part.get_payload()
|
||||||
|
return ''
|
||||||
|
|
||||||
|
def trigger(self):
|
||||||
|
"""Called when a mail matching the registered rules is received."""
|
||||||
|
raise NotImplementedError("Must be implemented in a child class.")
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ class MailBot(object):
|
|||||||
"""Check if callback matches rules, and if so, trigger."""
|
"""Check if callback matches rules, and if so, trigger."""
|
||||||
callback = callback_class(message, rules)
|
callback = callback_class(message, rules)
|
||||||
if callback.check_rules():
|
if callback.check_rules():
|
||||||
return callback.callback()
|
return callback.trigger()
|
||||||
|
|
||||||
def process_messages(self):
|
def process_messages(self):
|
||||||
"""Process messages: check which callbacks should be triggered."""
|
"""Process messages: check which callbacks should be triggered."""
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ from email import message_from_file, message_from_string
|
|||||||
from os import path
|
from os import path
|
||||||
from re import search
|
from re import search
|
||||||
|
|
||||||
from mock import sentinel, Mock
|
from mock import Mock
|
||||||
|
|
||||||
from . import MailBotTestCase
|
from . import MailBotTestCase
|
||||||
from .. import Callback
|
from .. import Callback
|
||||||
@@ -80,10 +80,21 @@ class CallbackTest(MailBotTestCase):
|
|||||||
self.assertEqual(callback.get_email_body(), None) # not a Message
|
self.assertEqual(callback.get_email_body(), None) # not a Message
|
||||||
self.assertEqual(callback.get_email_body('foo'), None) # not a Message
|
self.assertEqual(callback.get_email_body('foo'), None) # not a Message
|
||||||
|
|
||||||
|
# empty email
|
||||||
empty_message = message_from_string('')
|
empty_message = message_from_string('')
|
||||||
self.assertEqual(callback.get_email_body(empty_message), '')
|
self.assertEqual(callback.get_email_body(empty_message), '')
|
||||||
|
|
||||||
|
# badly formed email without a 'text/plain' part
|
||||||
|
empty_message.set_type('html/plain')
|
||||||
|
self.assertEqual(callback.get_email_body(empty_message), '')
|
||||||
|
|
||||||
|
# real email
|
||||||
email_file = path.join(path.dirname(__file__),
|
email_file = path.join(path.dirname(__file__),
|
||||||
'mails/mail_with_attachment.txt')
|
'mails/mail_with_attachment.txt')
|
||||||
email = message_from_file(open(email_file, 'r'))
|
email = message_from_file(open(email_file, 'r'))
|
||||||
self.assertEqual(callback.get_email_body(email), 'Mail content here\n')
|
self.assertEqual(callback.get_email_body(email), 'Mail content here\n')
|
||||||
|
|
||||||
|
def test_trigger(self):
|
||||||
|
callback = Callback('foo', 'bar')
|
||||||
|
|
||||||
|
self.assertRaises(NotImplementedError, callback.trigger)
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ class MailBotTest(MailBotClientTest):
|
|||||||
def test_process_message_trigger(self):
|
def test_process_message_trigger(self):
|
||||||
callback = Mock()
|
callback = Mock()
|
||||||
callback.check_rules.return_value = True
|
callback.check_rules.return_value = True
|
||||||
callback.callback.return_value = sentinel.callback_result
|
callback.trigger.return_value = sentinel.callback_result
|
||||||
callback_class = Mock(return_value=callback)
|
callback_class = Mock(return_value=callback)
|
||||||
|
|
||||||
res = self.bot.process_message(sentinel.message, callback_class,
|
res = self.bot.process_message(sentinel.message, callback_class,
|
||||||
@@ -65,7 +65,7 @@ class MailBotTest(MailBotClientTest):
|
|||||||
callback_class.assert_called_once_with(sentinel.message,
|
callback_class.assert_called_once_with(sentinel.message,
|
||||||
sentinel.rules)
|
sentinel.rules)
|
||||||
callback.check_rules.assert_called_once_with()
|
callback.check_rules.assert_called_once_with()
|
||||||
callback.callback.assert_called_once_with()
|
callback.trigger.assert_called_once_with()
|
||||||
self.assertEqual(res, sentinel.callback_result)
|
self.assertEqual(res, sentinel.callback_result)
|
||||||
|
|
||||||
def test_process_message_no_trigger(self):
|
def test_process_message_no_trigger(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user