summaryrefslogtreecommitdiff
path: root/logilab/common/umessage.py
diff options
context:
space:
mode:
Diffstat (limited to 'logilab/common/umessage.py')
-rw-r--r--logilab/common/umessage.py42
1 files changed, 23 insertions, 19 deletions
diff --git a/logilab/common/umessage.py b/logilab/common/umessage.py
index 77a6272..a759003 100644
--- a/logilab/common/umessage.py
+++ b/logilab/common/umessage.py
@@ -40,14 +40,14 @@ import logilab.common as lgc
def decode_QP(string: str) -> str:
parts: List[str] = []
for maybe_decoded, charset in decode_header(string):
- if not charset :
- charset = 'iso-8859-15'
+ if not charset:
+ charset = "iso-8859-15"
# python 3 sometimes returns str and sometimes bytes.
# the 'official' fix is to use the new 'policy' APIs
# https://bugs.python.org/issue24797
# let's just handle this bug ourselves for now
if isinstance(maybe_decoded, bytes):
- decoded = maybe_decoded.decode(charset, 'replace')
+ decoded = maybe_decoded.decode(charset, "replace")
else:
decoded = maybe_decoded
@@ -57,21 +57,24 @@ def decode_QP(string: str) -> str:
if sys.version_info < (3, 3):
# decoding was non-RFC compliant wrt to whitespace handling
# see http://bugs.python.org/issue1079
- return u' '.join(parts)
+ return " ".join(parts)
+
+ return "".join(parts)
- return u''.join(parts)
def message_from_file(fd):
try:
return UMessage(email.message_from_file(fd))
except email.errors.MessageParseError:
- return ''
+ return ""
+
-def message_from_string(string: str) -> Union['UMessage', str]:
+def message_from_string(string: str) -> Union["UMessage", str]:
try:
return UMessage(email.message_from_string(string))
except email.errors.MessageParseError:
- return ''
+ return ""
+
class UMessage:
"""Encapsulates an email.Message instance and returns only unicode objects.
@@ -92,8 +95,7 @@ class UMessage:
return self.get(header)
def get_all(self, header: str, default: Tuple[()] = ()) -> List[str]:
- return [decode_QP(val) for val in self.message.get_all(header, default)
- if val is not None]
+ return [decode_QP(val) for val in self.message.get_all(header, default) if val is not None]
def is_multipart(self):
return self.message.is_multipart()
@@ -105,7 +107,9 @@ class UMessage:
for part in self.message.walk():
yield UMessage(part)
- def get_payload(self, index: Optional[Any] = None, decode: bool = False) -> Union[str, 'UMessage', List['UMessage']]:
+ def get_payload(
+ self, index: Optional[Any] = None, decode: bool = False
+ ) -> Union[str, "UMessage", List["UMessage"]]:
message = self.message
if index is None:
@@ -118,17 +122,17 @@ class UMessage:
if isinstance(payload, list):
return [UMessage(msg) for msg in payload]
- if message.get_content_maintype() != 'text':
+ if message.get_content_maintype() != "text":
return payload
if isinstance(payload, str):
return payload
- charset = message.get_content_charset() or 'iso-8859-1'
+ charset = message.get_content_charset() or "iso-8859-1"
if search_function(charset) is None:
- charset = 'iso-8859-1'
+ charset = "iso-8859-1"
- return str(payload or b'', charset, "replace")
+ return str(payload or b"", charset, "replace")
else:
payload = UMessage(message.get_payload(index, decode))
@@ -147,7 +151,7 @@ class UMessage:
try:
return str(value)
except UnicodeDecodeError:
- return u'error decoding filename'
+ return "error decoding filename"
# other convenience methods ###############################################
@@ -155,8 +159,8 @@ class UMessage:
"""return an unicode string containing all the message's headers"""
values = []
for header in self.message.keys():
- values.append(u'%s: %s' % (header, self.get(header)))
- return '\n'.join(values)
+ values.append("%s: %s" % (header, self.get(header)))
+ return "\n".join(values)
def multi_addrs(self, header):
"""return a list of 2-uple (name, address) for the given address (which
@@ -172,7 +176,7 @@ class UMessage:
"""return a datetime object for the email's date or None if no date is
set or if it can't be parsed
"""
- value = self.get('date')
+ value = self.get("date")
if value is None and alternative_source:
unix_from = self.message.get_unixfrom()
if unix_from is not None: