From 50049e17edff98762839d55650b6516f2d5e81ab Mon Sep 17 00:00:00 2001 From: Patrick Maia Date: Thu, 14 Aug 2014 11:52:52 -0300 Subject: You can now list all tags and creating an email identify the tags --- service/app/adapter/mail_service.py | 6 +++-- service/app/adapter/pixelated_mail.py | 38 ++++++++++++++++++++--------- service/app/tags.py | 12 ++++++--- service/test/adapter/pixelated_mail_test.py | 29 +++++++++------------- service/test/adapter/test_helper.py | 16 ++++++++++++ 5 files changed, 67 insertions(+), 34 deletions(-) create mode 100644 service/test/adapter/test_helper.py diff --git a/service/app/adapter/mail_service.py b/service/app/adapter/mail_service.py index 25fb5188..b5ae09f2 100644 --- a/service/app/adapter/mail_service.py +++ b/service/app/adapter/mail_service.py @@ -5,6 +5,8 @@ from app.bitmask_libraries.config import LeapConfig from app.bitmask_libraries.provider import LeapProvider from app.bitmask_libraries.session import LeapSessionFactory from app.bitmask_libraries.auth import LeapCredentials +from app.adapter.pixelated_mail import PixelatedMail +from app.tags import Tags import logging @@ -36,7 +38,7 @@ class MailService: self.server_name = 'example.wazokazi.is' self.mailbox_name = 'INBOX' self.leapdir = os.path.join(os.path.abspath("."), "leap") - + self.tags = Tags() self._open_leap_session() except: traceback.print_exc(file=sys.stdout) @@ -108,7 +110,7 @@ class MailService: raise NotImplementedError() def all_tags(self): - raise NotImplementedError() + return self.tags def all_contacts(self, query): raise NotImplementedError() diff --git a/service/app/adapter/pixelated_mail.py b/service/app/adapter/pixelated_mail.py index 412414ed..cdfd9a29 100644 --- a/service/app/adapter/pixelated_mail.py +++ b/service/app/adapter/pixelated_mail.py @@ -1,4 +1,5 @@ from app.tags import Tag +from app.tags import Tags class PixelatedMail: @@ -25,28 +26,43 @@ class PixelatedMail: def __init__(self, leap_mail): self.leap_mail = leap_mail self.body = leap_mail.bdoc.content['raw'] - self.headers = self.extract_headers(leap_mail) + self.headers = self.extract_headers() self.ident = leap_mail.getUID() - self.status = self.extract_status(leap_mail) + self.status = self.extract_status() self.security_casing = {} - self.tags = self.extract_tags(leap_mail) + self.tags = self.extract_tags() - def extract_status(self, leap_mail): - flags = leap_mail.getFlags() + def extract_status(self): + flags = self.leap_mail.getFlags() return [converted for flag, converted in self.LEAP_FLAGS_STATUSES.items() if flag in flags] - def extract_headers(self, leap_mail): + def extract_headers(self): temporary_headers = {} - for header, value in leap_mail.hdoc.content['headers'].items(): + for header, value in self.leap_mail.hdoc.content['headers'].items(): temporary_headers[header.lower()] = value return temporary_headers - def extract_tags(self, leap_mail): - flags = leap_mail.getFlags() - converted_tags = [Tag(converted) for flag, converted in self.LEAP_FLAGS_TAGS.items() if flag in flags] - tags = converted_tags + [Tag(flag) for flag in leap_mail.getFlags() if flag not in self.LEAP_FLAGS] + def extract_tags(self): + flags = self.leap_mail.getFlags() + tag_names = self._converted_tags(flags) + self._custom_tags(flags) + tags = [] + for tag in tag_names: + tags.append(Tag(tag)) return tags + def _converted_tags(self, flags): + return [converted for flag, converted in self.LEAP_FLAGS_TAGS.items() if flag in flags] + + def _custom_tags(self, flags): + return [self._remove_prefix(flag) for flag in self.leap_mail.getFlags() if flag.startswith('tag_')] + + def _remove_prefix(self, flag_name): + return flag_name.replace('tag_', '', 1) + + def update_tags(self, tags): + self.tags = [Tag(tag) for tag in tags] + return self.tags + def has_tag(self, tag): return Tag(tag) in self.tags diff --git a/service/app/tags.py b/service/app/tags.py index 0f874850..302e046c 100644 --- a/service/app/tags.py +++ b/service/app/tags.py @@ -40,10 +40,14 @@ class Tags: for name in self.SPECIAL_TAGS: self.tags[name] = self.add(name) - def add(self, name): - tag = Tag(name, name in self.SPECIAL_TAGS) - self.tags[name] = tag - return tag + def add(self, tag_input): + if tag_input.__class__.__name__ == 'str': + tag = Tag(tag_input, tag_input in self.SPECIAL_TAGS) + self.tags[tag_input] = tag + return tag + elif tag_input.__class__.__name__ == 'Tag': + self.tags[tag_input.name] = tag_input + return tag_input def find(self, name): return self.tags[name] diff --git a/service/test/adapter/pixelated_mail_test.py b/service/test/adapter/pixelated_mail_test.py index 9193464b..72ac06b4 100644 --- a/service/test/adapter/pixelated_mail_test.py +++ b/service/test/adapter/pixelated_mail_test.py @@ -1,33 +1,28 @@ import unittest from app.adapter.pixelated_mail import PixelatedMail -from mock import Mock from app.tags import Tag +from app.tags import Tags +import test_helper class TestPixelatedMail(unittest.TestCase): - LEAP_FLAGS = ['\\Seen', - '\\Answered', - '\\Flagged', - '\\Deleted', - '\\Draft', - '\\Recent', - 'List'] - - def setUp(self): - self.leap_mail = Mock(getUID=Mock(return_value=0), - getFlags=Mock(return_value=self.LEAP_FLAGS), - bdoc=Mock(content={'raw': 'test'}), - hdoc=Mock(content={'headers': {}})) - def test_leap_flags_that_are_tags_are_handled(self): - pixelated_mail = PixelatedMail(self.leap_mail) + pixelated_mail = PixelatedMail(test_helper.leap_mail()) self.assertIn(Tag('inbox'), pixelated_mail.tags) self.assertIn(Tag('trash'), pixelated_mail.tags) self.assertIn(Tag('drafts'), pixelated_mail.tags) def test_leap_flags_that_are_status_are_handled(self): - pixelated_mail = PixelatedMail(self.leap_mail) + pixelated_mail = PixelatedMail(test_helper.leap_mail()) self.assertIn('read', pixelated_mail.status) self.assertIn('replied', pixelated_mail.status) + + def test_leap_flags_that_are_custom_tags_are_handled(self): + pixelated_mail = PixelatedMail(test_helper.leap_mail(extra_flags=['tag_work'])) + self.assertIn(Tag('work'), pixelated_mail.tags) + + def test_custom_tags_containing_our_prefix_are_handled(self): + pixelated_mail = PixelatedMail(test_helper.leap_mail(extra_flags=['tag_tag_work_tag_'])) + self.assertIn(Tag('tag_work_tag_'), pixelated_mail.tags) diff --git a/service/test/adapter/test_helper.py b/service/test/adapter/test_helper.py new file mode 100644 index 00000000..94158f1c --- /dev/null +++ b/service/test/adapter/test_helper.py @@ -0,0 +1,16 @@ +from mock import Mock + +LEAP_FLAGS = ['\\Seen', + '\\Answered', + '\\Flagged', + '\\Deleted', + '\\Draft', + '\\Recent', + 'List'] + +def leap_mail(uid=0, extra_flags=[], headers={}): + flags = LEAP_FLAGS + extra_flags + return Mock(getUID=Mock(return_value=uid), + getFlags=Mock(return_value=flags), + bdoc=Mock(content={'raw': 'test'}), + hdoc=Mock(content={'headers': headers})) -- cgit v1.2.3