# HG changeset patch # User Paul Boddie # Date 1351546576 -3600 # Node ID 0ffbf71dd873af0abbc71e25380f26db29608d67 # Parent 0f5dbd59c2fe8f813822770b5aecad3f83f072b1 Added message interpretation and parsing to the Message class. Changed the PostMessage action to use the Message class for the interpretation of messages. Changed the message test to use the Message class and added a test of message parsing using the class. Added a Mailbox class for reading and writing bundles of messages. diff -r 0f5dbd59c2fe -r 0ffbf71dd873 MoinMessage.py --- a/MoinMessage.py Sun Oct 28 22:27:35 2012 +0100 +++ b/MoinMessage.py Mon Oct 29 22:36:16 2012 +0100 @@ -17,12 +17,38 @@ import httplib import os +def is_collection(message): + return message.get("Update-Type") == "collection" + class Message: "An update message." - def __init__(self): + def __init__(self, text=None): self.updates = [] + if text: + self.parse_text(text) + + def parse_text(self, text): + + "Parse the given 'text' as a message." + + self.handle_message(message_from_string(text)) + + def handle_message(self, message): + + "Handle the given 'message', recording the separate updates." + + # The message either consists of a collection of updates. + + if message.is_multipart() and is_collection(message): + for part in message.get_payload(): + self.updates.append(part) + + # Or the message is a single update. + + else: + self.updates.append(message) def add_update(self, alternatives): @@ -54,6 +80,43 @@ return message +class Mailbox: + + "A collection of messages within a multipart message." + + def __init__(self, text=None): + self.messages = [] + if text: + self.parse_text(text) + + def parse_text(self, text): + + "Parse the given 'text' as a mailbox." + + message = message_from_string(text) + + if message.is_multipart(): + for part in message.get_payload(): + self.messages.append(part) + else: + self.messages.append(message) + + def add_message(self, message): + + "Add the given 'message' to the mailbox." + + self.messages.append(message) + + def get_payload(self): + + "Get the multipart payload for the mailbox." + + mailbox = MIMEMultipart() + for message in self.messages: + mailbox.attach(message) + + return mailbox + class MoinMessageError(Exception): pass diff -r 0f5dbd59c2fe -r 0ffbf71dd873 actions/PostMessage.py --- a/actions/PostMessage.py Sun Oct 28 22:27:35 2012 +0100 +++ b/actions/PostMessage.py Mon Oct 29 22:36:16 2012 +0100 @@ -10,7 +10,7 @@ from MoinMoin.log import getLogger from MoinMoin.user import User from MoinSupport import * -from MoinMessage import GPG, MoinMessageError +from MoinMessage import GPG, Message, MoinMessageError from email.parser import Parser try: @@ -199,34 +199,29 @@ writeHeaders(request, "text/plain", getMetadata(self.page), "403 Forbidden") request.write("The message could not be verified.") - def handle_message_content(self, message): + def handle_message_content(self, content): - "Handle the given 'message'." + "Handle the given message 'content'." request = self.request - # Handle a single part. - - if not message.is_multipart(): - self.handle_message_parts([message], to_replace(message)) + # Interpret the content as one or more updates. - # Handle multiple parts. + message = Message() + message.handle_message(content) - # This can be a collection of updates, with each update potentially being a - # collection of alternative representations. + for update in message.updates: + + # Handle a single part. - elif is_collection(message): - for part in message.get_payload(): - if part.is_multipart(): - self.handle_message_parts(part.get_payload(), to_replace(part)) - else: - self.handle_message_parts([part], to_replace(part)) + if not update.is_multipart(): + self.handle_message_parts([update], to_replace(update)) - # Or it can be a collection of alternative representations for a single - # update. + # Or a collection of alternative representations for a single + # update. - else: - self.handle_message_parts(message.get_payload(), to_replace(message)) + else: + self.handle_message_parts(update.get_payload(), to_replace(update)) # Default output. diff -r 0f5dbd59c2fe -r 0ffbf71dd873 tests/test_message.py --- a/tests/test_message.py Sun Oct 28 22:27:35 2012 +0100 +++ b/tests/test_message.py Mon Oct 29 22:36:16 2012 +0100 @@ -1,17 +1,16 @@ #!/usr/bin/env python -from email.mime.multipart import MIMEMultipart +from MoinMessage import Message from email.mime.text import MIMEText import sys if __name__ == "__main__": - message = MIMEMultipart() + message = Message() for arg in sys.argv[1:]: - text = MIMEText(arg, "moin") - message.attach(text) + message.add_update([MIMEText(arg, "moin")]) - text = message.as_string() + text = message.get_payload() print text # vim: tabstop=4 expandtab shiftwidth=4 diff -r 0f5dbd59c2fe -r 0ffbf71dd873 tests/test_message_input.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test_message_input.py Mon Oct 29 22:36:16 2012 +0100 @@ -0,0 +1,13 @@ +#!/usr/bin/env python + +from MoinMessage import Message +import sys + +if __name__ == "__main__": + message = Message(sys.stdin.read()) + + for update in message.updates: + print update.get_payload() + print + +# vim: tabstop=4 expandtab shiftwidth=4