[Python-checkins] cpython (3.4): #21091: make is_attachment a method.

r.david.murray python-checkins at python.org
Sun Sep 21 00:17:15 CEST 2014


https://hg.python.org/cpython/rev/a3df1c24d586
changeset: 92494:a3df1c24d586
branch: 3.4
parent: 92492:0044ed0af96f
user: R David Murray <rdmurray at bitdance.com>
date: Sat Sep 20 18:05:28 2014 -0400
summary:
 #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.
files:
 Doc/library/email.contentmanager.rst | 8 ++++-
 Lib/email/message.py | 20 +++++++++++++--
 Lib/test/test_email/test_message.py | 20 ++++++++++++----
 Misc/NEWS | 5 ++++
 4 files changed, 43 insertions(+), 10 deletions(-)
diff --git a/Doc/library/email.contentmanager.rst b/Doc/library/email.contentmanager.rst
--- a/Doc/library/email.contentmanager.rst
+++ b/Doc/library/email.contentmanager.rst
@@ -70,11 +70,15 @@
 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
--- a/Lib/email/message.py
+++ b/Lib/email/message.py
@@ -9,6 +9,7 @@
 import re
 import uu
 import quopri
+import warnings
 from io import BytesIO, StringIO
 
 # Intrapackage imports
@@ -929,6 +930,17 @@
 # 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 @@
 @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 @@
 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
--- a/Lib/test/test_email/test_message.py
+++ b/Lib/test/test_email/test_message.py
@@ -722,15 +722,25 @@
 
 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):
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -32,6 +32,11 @@
 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.
 
-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /