]> granicus.if.org Git - python/commitdiff
#20476: use EmailMessage as factory if non-compat32 policy is used.
authorR David Murray <rdmurray@bitdance.com>
Fri, 7 Feb 2014 15:44:16 +0000 (10:44 -0500)
committerR David Murray <rdmurray@bitdance.com>
Fri, 7 Feb 2014 15:44:16 +0000 (10:44 -0500)
In 3.5 I will fix this right by adding a message_factory attribute
to the policy.

Lib/email/feedparser.py
Lib/email/parser.py
Lib/test/test_email/test_message.py
Misc/NEWS

index eb75fe35793a75a9b676b943c8c23947eab159d1..6cf9b91c1f96c7071f7bcad3e42678af6cc6fd08 100644 (file)
@@ -126,7 +126,7 @@ class BufferedSubFile(object):
 class FeedParser:
     """A feed-style parser of email."""
 
-    def __init__(self, _factory=message.Message, *, policy=compat32):
+    def __init__(self, _factory=None, *, policy=compat32):
         """_factory is called with no arguments to create a new message obj
 
         The policy keyword specifies a policy object that controls a number of
@@ -134,14 +134,23 @@ class FeedParser:
         backward compatibility.
 
         """
-        self._factory = _factory
         self.policy = policy
-        try:
-            _factory(policy=self.policy)
-            self._factory_kwds = lambda: {'policy': self.policy}
-        except TypeError:
-            # Assume this is an old-style factory
-            self._factory_kwds = lambda: {}
+        self._factory_kwds = lambda: {'policy': self.policy}
+        if _factory is None:
+            # What this should be:
+            #self._factory = policy.default_message_factory
+            # but, because we are post 3.4 feature freeze, fix with temp hack:
+            if self.policy is compat32:
+                self._factory = message.Message
+            else:
+                self._factory = message.EmailMessage
+        else:
+            self._factory = _factory
+            try:
+                _factory(policy=self.policy)
+            except TypeError:
+                # Assume this is an old-style factory
+                self._factory_kwds = lambda: {}
         self._input = BufferedSubFile()
         self._msgstack = []
         self._parse = self._parsegen().__next__
index f49d31d43dfc531a4b276044c6dd9739efe9e24b..ed512b114f2c187bc1413f8be99bdf61497763f9 100644 (file)
@@ -17,7 +17,7 @@ from email._policybase import compat32
 
 \f
 class Parser:
-    def __init__(self, _class=Message, *, policy=compat32):
+    def __init__(self, _class=None, *, policy=compat32):
         """Parser of RFC 2822 and MIME email messages.
 
         Creates an in-memory object tree representing the email message, which
index e0ebb8ad6c52d18267e537a7d10730ad25706069..c761c62d04a0b8d62f2e53887c951a1f5909b9ab 100644 (file)
@@ -1,6 +1,6 @@
 import unittest
 import textwrap
-from email import policy
+from email import policy, message_from_string
 from email.message import EmailMessage, MIMEPart
 from test.test_email import TestEmailBase, parameterize
 
@@ -20,6 +20,20 @@ class Test(TestEmailBase):
         with self.assertRaises(ValueError):
             m['To'] = 'xyz@abc'
 
+    def test_rfc2043_auto_decoded_and_emailmessage_used(self):
+        m = message_from_string(textwrap.dedent("""\
+            Subject: Ayons asperges pour le =?utf-8?q?d=C3=A9jeuner?=
+            From: =?utf-8?q?Pep=C3=A9?= Le Pew <pepe@example.com>
+            To: "Penelope Pussycat" <"penelope@example.com">
+            MIME-Version: 1.0
+            Content-Type: text/plain; charset="utf-8"
+
+            sample text
+            """), policy=policy.default)
+        self.assertEqual(m['subject'], "Ayons asperges pour le déjeuner")
+        self.assertEqual(m['from'], "Pepé Le Pew <pepe@example.com>")
+        self.assertIsInstance(m, EmailMessage)
+
 
 @parameterize
 class TestEmailMessageBase:
index 6ec058b6a28bcb09d115cae6d43f601a2374c299..6c2352ff750e5ba8abe37976c12d621e4d8716d7 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -24,6 +24,10 @@ Core and Builtins
 Library
 -------
 
+- Issue #20476: If a non-compat32 policy is used with any of the email parsers,
+  EmailMessage is now used as the factory class.  The factory class should
+  really come from the policy; that will get fixed in 3.5.
+
 - Issue #19920: TarFile.list() no longer fails when outputs a listing
   containing non-encodable characters.  Based on patch by Vajrasky Kok.