diff options
Diffstat (limited to 'logilab/common/umessage.py')
-rw-r--r-- | logilab/common/umessage.py | 42 |
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: |