diff options
author | R David Murray <rdmurray@bitdance.com> | 2014-09-20 22:05:28 (GMT) |
---|---|---|
committer | R David Murray <rdmurray@bitdance.com> | 2014-09-20 22:05:28 (GMT) |
commit | 8a97896a765e4b1ef8753b4a410a8f3e981cb9b8 (patch) | |
tree | f21bd8d39436e5bb9b8d8937511fbcaab2ddcff6 | |
parent | 97dfad7856df5d9c681fa74d576a23247cc55a33 (diff) | |
download | cpython-8a97896a765e4b1ef8753b4a410a8f3e981cb9b8.zip cpython-8a97896a765e4b1ef8753b4a410a8f3e981cb9b8.tar.gz cpython-8a97896a765e4b1ef8753b4a410a8f3e981cb9b8.tar.bz2 |
#21091: make is_attachment a method.
Since EmailMessage is a provisional API we can fix API bugs in a
maintenance release, but I used a trick suggested by Serhiy to
maintain backward compatibility with 3.4.0/1.
-rw-r--r-- | Doc/library/email.contentmanager.rst | 8 | ||||
-rw-r--r-- | Lib/email/message.py | 20 | ||||
-rw-r--r-- | Lib/test/test_email/test_message.py | 20 | ||||
-rw-r--r-- | Misc/NEWS | 5 |
4 files changed, 43 insertions, 10 deletions
diff --git a/Doc/library/email.contentmanager.rst b/Doc/library/email.contentmanager.rst index 8f0bfdb..8f33a14 100644 --- a/Doc/library/email.contentmanager.rst +++ b/Doc/library/email.contentmanager.rst @@ -70,11 +70,15 @@ this module. the following methods: - .. attribute:: is_attachment + .. method:: is_attachment - Set to ``True`` if there is a :mailheader:`Content-Disposition` header + Return ``True`` if there is a :mailheader:`Content-Disposition` header and its (case insensitive) value is ``attachment``, ``False`` otherwise. + .. versionchanged:: 3.4.2 + is_attachment is now a method instead of a property, for consistency + with :meth:`~email.message.Message.is_multipart`. + .. method:: get_body(preferencelist=('related', 'html', 'plain')) diff --git a/Lib/email/message.py b/Lib/email/message.py index 124071d..a179f8e 100644 --- a/Lib/email/message.py +++ b/Lib/email/message.py @@ -9,6 +9,7 @@ __all__ = ['Message'] import re import uu import quopri +import warnings from io import BytesIO, StringIO # Intrapackage imports @@ -929,6 +930,17 @@ class Message: # I.e. def walk(self): ... from email.iterators import walk +# XXX Support for temporary deprecation hack for is_attachment property. +class _IsAttachment: + def __init__(self, value): + self.value = value + def __call__(self): + return self.value + def __bool__(self): + warnings.warn("is_attachment will be a method, not a property, in 3.5", + DeprecationWarning, + stacklevel=3) + return self.value class MIMEPart(Message): @@ -941,10 +953,12 @@ class MIMEPart(Message): @property def is_attachment(self): c_d = self.get('content-disposition') - return False if c_d is None else c_d.content_disposition == 'attachment' + result = False if c_d is None else c_d.content_disposition == 'attachment' + # XXX transitional hack to raise deprecation if not called. + return _IsAttachment(result) def _find_body(self, part, preferencelist): - if part.is_attachment: + if part.is_attachment(): return maintype, subtype = part.get_content_type().split('/') if maintype == 'text': @@ -1037,7 +1051,7 @@ class MIMEPart(Message): for part in parts: maintype, subtype = part.get_content_type().split('/') if ((maintype, subtype) in self._body_types and - not part.is_attachment and subtype not in seen): + not part.is_attachment() and subtype not in seen): seen.append(subtype) continue yield part diff --git a/Lib/test/test_email/test_message.py b/Lib/test/test_email/test_message.py index 51ddf36..50e1a63 100644 --- a/Lib/test/test_email/test_message.py +++ b/Lib/test/test_email/test_message.py @@ -722,15 +722,25 @@ class TestEmailMessageBase: def test_is_attachment(self): m = self._make_message() - self.assertFalse(m.is_attachment) + self.assertFalse(m.is_attachment()) + with self.assertWarns(DeprecationWarning): + self.assertFalse(m.is_attachment) m['Content-Disposition'] = 'inline' - self.assertFalse(m.is_attachment) + self.assertFalse(m.is_attachment()) + with self.assertWarns(DeprecationWarning): + self.assertFalse(m.is_attachment) m.replace_header('Content-Disposition', 'attachment') - self.assertTrue(m.is_attachment) + self.assertTrue(m.is_attachment()) + with self.assertWarns(DeprecationWarning): + self.assertTrue(m.is_attachment) m.replace_header('Content-Disposition', 'AtTachMent') - self.assertTrue(m.is_attachment) + self.assertTrue(m.is_attachment()) + with self.assertWarns(DeprecationWarning): + self.assertTrue(m.is_attachment) m.set_param('filename', 'abc.png', 'Content-Disposition') - self.assertTrue(m.is_attachment) + self.assertTrue(m.is_attachment()) + with self.assertWarns(DeprecationWarning): + self.assertTrue(m.is_attachment) class TestEmailMessage(TestEmailMessageBase, TestEmailBase): @@ -32,6 +32,11 @@ Core and Builtins Library ------- +- Issue #21091: Fix API bug: email.message.EmailMessage.is_attachment is now + a method. Since EmailMessage is provisional, we can change the API in a + maintenance release, but we use a trick to remain backward compatible with + 3.4.0/1. + - Issue #21079: Fix email.message.EmailMessage.is_attachment to return the correct result when the header has parameters as well as a value. |