summaryrefslogtreecommitdiff
path: root/service/pixelated/adapter
diff options
context:
space:
mode:
authorDuda Dornelles <ddornell@thoughtworks.com>2014-09-26 13:11:00 -0300
committerDuda Dornelles <ddornell@thoughtworks.com>2014-09-26 13:11:00 -0300
commit1082f233962953c0927b73e7acac2665d420857b (patch)
treee6bd8fef98930e5f1bb18041643da261a606fdc4 /service/pixelated/adapter
parentb4333d2d0955b3f5774bbd1ea97cfdabd5578fd1 (diff)
Fixing tests
Diffstat (limited to 'service/pixelated/adapter')
-rw-r--r--service/pixelated/adapter/pixelated_mail.py94
-rw-r--r--service/pixelated/adapter/pixelated_mailbox.py26
-rw-r--r--service/pixelated/adapter/pixelated_mailboxes.py19
-rw-r--r--service/pixelated/adapter/soledad_querier.py31
4 files changed, 90 insertions, 80 deletions
diff --git a/service/pixelated/adapter/pixelated_mail.py b/service/pixelated/adapter/pixelated_mail.py
index 9014cb4d..b603ba70 100644
--- a/service/pixelated/adapter/pixelated_mail.py
+++ b/service/pixelated/adapter/pixelated_mail.py
@@ -49,13 +49,8 @@ class InputMail:
@staticmethod
def from_dict(mail_dict):
- input_mail = InputMail()
- input_mail.headers = {key.capitalize(): value for key, value in mail_dict.get('header', {}).items()}
- input_mail.headers['Date'] = pixelated.support.date.iso_now()
- input_mail.body = mail_dict.get('body', '')
- input_mail.tags = set(mail_dict.get('tags', []))
- input_mail.status = set(mail_dict.get('status', []))
- return input_mail
+ return input_mail_from_dict(mail_dict)
+
@property
def _mime_multipart(self):
@@ -73,13 +68,14 @@ class InputMail:
return self._get_chash()
def _raw(self):
- if self._raw_message:
- return self._raw_message
- self._raw_message = self._mime_multipart.as_string()
+ if not self._raw_message:
+ self._raw_message = self._mime_multipart.as_string()
return self._raw_message
def _get_chash(self):
- return sha256.SHA256(self._raw()).hexdigest()
+ if not self._chash:
+ self._chash = sha256.SHA256(self._raw()).hexdigest()
+ return self._chash
def _get_for_save(self, next_uid):
docs = [self._fdoc(next_uid), self._hdoc()]
@@ -133,7 +129,7 @@ class InputMail:
if self.headers[header]:
mime_multipart[header] = ", ".join(self.headers[header])
- if self.headers['subject']:
+ if self.headers['Subject']:
mime_multipart['Subject'] = self.headers['Subject']
mime_multipart['Date'] = self.headers['Date']
@@ -152,7 +148,7 @@ class PixelatedMail:
self.tag_service = tag_service
@staticmethod
- def from_soledad(fdoc, hdoc, bdoc, soledad_querier):
+ def from_soledad(fdoc, hdoc, bdoc, soledad_querier=None):
mail = PixelatedMail()
mail.bdoc = bdoc
mail.fdoc = fdoc
@@ -166,10 +162,18 @@ class PixelatedMail:
@property
def headers(self):
- _headers = ['From', 'Date', 'To', 'Subject', 'Cc', 'Bcc']
+ _headers = ['From', 'To', 'Subject', 'Cc', 'Bcc']
_headers = {header: self.hdoc.content['headers'].get(header) for header in _headers}
+ _headers['Date'] = self._get_date()
return _headers
+ def _get_date(self):
+ date = self.hdoc.content.get('date', None)
+ if not date:
+
+ date = self.hdoc.content['received'].split(";")[-1].strip()
+ return dateparser.parse(date).isoformat()
+
@property
def status(self):
return Status.from_flags(self.fdoc.content.get('flags'))
@@ -180,8 +184,8 @@ class PixelatedMail:
@property
def tags(self):
- _tags = self.headers.get('x-tags', '[]')
- return set(_tags) if type(_tags) is list else set(json.loads(_tags))
+ _tags = self.hdoc.content.get('X-Tags', '[]')
+ return set(_tags) if type(_tags) is list or type(_tags) is set else set(json.loads(_tags))
@property
def ident(self):
@@ -203,45 +207,37 @@ class PixelatedMail:
return self.querier.save_mail(self)
def set_from(self, _from):
- self.headers['from'] = [_from]
+ self.headers['From'] = [_from]
def get_to(self):
- return self.headers['to']
+ return self.headers['To']
def get_cc(self):
- return self.headers['cc']
+ return self.headers['Cc']
def get_bcc(self):
- return self.headers['bcc']
-
- def mark_as_deleted(self):
- # self.remove_all_tags()
- # self.leap_mail.setFlags((Status.PixelatedStatus.DELETED,), 1)
- pass
+ return self.headers['Bcc']
def remove_all_tags(self):
self.update_tags(set([]))
def update_tags(self, tags):
old_tags = self.tags
- self.tags = tags
+ self._persist_mail_tags(tags)
removed = old_tags.difference(tags)
added = tags.difference(old_tags)
- self._persist_mail_tags(tags)
self.tag_service.notify_tags_updated(added, removed, self.ident)
return self.tags
def mark_as_read(self):
- # self.leap_mail.setFlags((Status.PixelatedStatus.SEEN,), 1)
- # self.status = self._extract_status()
- # return self
- pass
+ self.fdoc.content['flags'].append(Status.PixelatedStatus.SEEN)
+ #self.status = self._extract_status()
+ return self
def mark_as_not_recent(self):
- # self.leap_mail.setFlags((Status.PixelatedStatus.RECENT,), -1)
- # self.status = self._extract_status()
- # return self
- pass
+ self.fdoc.content['flags'].remove(Status.PixelatedStatus.RECENT)
+ #self.status = self._extract_status()
+ return self
def _persist_mail_tags(self, current_tags):
self.hdoc.content['headers']['X-Tags'] = json.dumps(list(current_tags))
@@ -261,24 +257,12 @@ class PixelatedMail:
'body': self.body
}
- @staticmethod
- def from_dict(mail_dict):
- return from_dict(mail_dict)
-
- @classmethod
- def _get_date(cls, headers):
- date = headers.get('date', None)
- if not date:
- date = headers['received'].split(";")[-1].strip()
- return dateparser.parse(date).isoformat()
-
-def from_dict(mail_dict):
- mail = PixelatedMail()
- mail.headers = mail_dict.get('header', {})
- mail.headers['date'] = pixelated.support.date.iso_now()
- mail.body = mail_dict.get('body', '')
- mail._ident = mail_dict.get('ident', None)
- mail.tags = set(mail_dict.get('tags', []))
- mail.status = set(mail_dict.get('status', []))
- return mail
+def input_mail_from_dict(mail_dict):
+ input_mail = InputMail()
+ input_mail.headers = {key.capitalize(): value for key, value in mail_dict.get('header', {}).items()}
+ input_mail.headers['Date'] = pixelated.support.date.iso_now()
+ input_mail.body = mail_dict.get('body', '')
+ input_mail.tags = set(mail_dict.get('tags', []))
+ input_mail.status = set(mail_dict.get('status', []))
+ return input_mail
diff --git a/service/pixelated/adapter/pixelated_mailbox.py b/service/pixelated/adapter/pixelated_mailbox.py
index aa00a24f..85d965d1 100644
--- a/service/pixelated/adapter/pixelated_mailbox.py
+++ b/service/pixelated/adapter/pixelated_mailbox.py
@@ -16,24 +16,15 @@
from pixelated.adapter.tag_service import TagService
from pixelated.adapter.soledad_querier import SoledadQuerier
-from crochet import wait_for
class PixelatedMailbox:
- def __init__(self, leap_mailbox, tag_service=TagService.get_instance()):
+ def __init__(self, mailbox_name, querier, tag_service=TagService.get_instance()):
self.tag_service = tag_service
- self.leap_mailbox = leap_mailbox
- self.mailbox_tag = self.leap_mailbox.mbox.lower()
- self.querier = SoledadQuerier.get_instance()
-
- @property
- def messages(self):
- return self.leap_mailbox.messages
-
- @property
- def mailbox_name(self):
- return self.leap_mailbox.mbox
+ self.mailbox_name = mailbox_name
+ self.mailbox_tag = mailbox_name.lower()
+ self.querier = querier
def add_mailbox_tag_if_not_there(self, pixelated_mail):
if not pixelated_mail.has_tag(self.mailbox_tag):
@@ -42,7 +33,7 @@ class PixelatedMailbox:
pixelated_mail.mark_as_not_recent()
def mails(self):
- _mails = self.querier.all_mails_by_mailbox(self.leap_mailbox.mbox)
+ _mails = self.querier.all_mails_by_mailbox(self.mailbox_name)
result = []
for mail in _mails:
@@ -60,14 +51,13 @@ class PixelatedMailbox:
if message.ident == mail_id:
return message
- def add(self, mail, use_smtp_format=False):
+ def add(self, mail):
self.querier.create_mail(mail, self.mailbox_name)
def remove(self, ident):
mail = self.querier.mail(ident)
self.querier.remove_mail(mail)
- self.leap_mailbox.expunge()
@classmethod
- def create(cls, account, mailbox_name='INBOX'):
- return PixelatedMailbox(account.getMailbox(mailbox_name))
+ def create(cls, mailbox_name='INBOX'):
+ return PixelatedMailbox(mailbox_name, SoledadQuerier.get_instance())
diff --git a/service/pixelated/adapter/pixelated_mailboxes.py b/service/pixelated/adapter/pixelated_mailboxes.py
index 890e86e1..f3efe544 100644
--- a/service/pixelated/adapter/pixelated_mailboxes.py
+++ b/service/pixelated/adapter/pixelated_mailboxes.py
@@ -1,3 +1,18 @@
+#
+# Copyright (c) 2014 ThoughtWorks, Inc.
+#
+# Pixelated is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Pixelated is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with Pixelated. If not, see <http://www.gnu.org/licenses/>.
from pixelated.adapter.pixelated_mailbox import PixelatedMailbox
@@ -10,7 +25,7 @@ class PixelatedMailBoxes():
mailbox_name = mailbox_name.upper()
if mailbox_name not in self.account.mailboxes:
self.account.addMailbox(mailbox_name)
- return PixelatedMailbox.create(self.account, mailbox_name)
+ return PixelatedMailbox.create(mailbox_name)
def drafts(self):
return self._create_or_get('DRAFTS')
@@ -20,7 +35,7 @@ class PixelatedMailBoxes():
@property
def mailboxes(self):
- return [PixelatedMailbox.create(self.account, leap_mailbox_name) for leap_mailbox_name in
+ return [PixelatedMailbox.create(leap_mailbox_name) for leap_mailbox_name in
self.account.mailboxes]
def mails_by_tag(self, query_tags):
diff --git a/service/pixelated/adapter/soledad_querier.py b/service/pixelated/adapter/soledad_querier.py
index 179d10f1..7f617767 100644
--- a/service/pixelated/adapter/soledad_querier.py
+++ b/service/pixelated/adapter/soledad_querier.py
@@ -1,6 +1,29 @@
+#
+# Copyright (c) 2014 ThoughtWorks, Inc.
+#
+# Pixelated is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Pixelated is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with Pixelated. If not, see <http://www.gnu.org/licenses/>.
from pixelated.adapter.pixelated_mail import PixelatedMail
+def get_soledad_querier_instance(cls, soledad=None):
+ if not cls.instance:
+ if not soledad:
+ raise Exception("Need a soledad for the first time you call this")
+ cls.instance = SoledadQuerier(soledad)
+ return cls.instance
+
+
class SoledadQuerier:
instance = None
@@ -10,11 +33,7 @@ class SoledadQuerier:
@classmethod
def get_instance(cls, soledad=None):
- if not cls.instance:
- if not soledad:
- raise Exception("Need a soledad for the first time you call this")
- cls.instance = SoledadQuerier(soledad)
- return cls.instance
+ return get_soledad_querier_instance(cls, soledad)
def all_mails(self):
fdocs_chash = [(fdoc, fdoc.content['chash']) for fdoc in self.soledad.get_from_index('by-type', 'flags')]
@@ -48,10 +67,12 @@ class SoledadQuerier:
fdoc = self.soledad.get_from_index('by-type-and-contenthash', 'flags', ident)[0]
hdoc = self.soledad.get_from_index('by-type-and-contenthash', 'head', ident)[0]
bdoc = self.soledad.get_from_index('by-type-and-payloadhash', 'cnt', hdoc.content['body'])[0]
+
return PixelatedMail.from_soledad(fdoc, hdoc, bdoc, soledad_querier=self)
def remove_mail(self, mail):
_mail = self.mail(mail.ident)
+ # FIX-ME: Must go through all the part_map phash to delete all the cdocs
self.soledad.delete_doc(_mail.bdoc)
self.soledad.delete_doc(_mail.hdoc)
self.soledad.delete_doc(_mail.fdoc)