(original) (raw)

changeset: 89013:77082b818676 user: R David Murray rdmurray@bitdance.com date: Fri Feb 07 10:44:16 2014 -0500 files: Lib/email/feedparser.py Lib/email/parser.py Lib/test/test_email/test_message.py Misc/NEWS description: #20476: use EmailMessage as factory if non-compat32 policy is used. In 3.5 I will fix this right by adding a message_factory attribute to the policy. diff -r f3f92d55f942 -r 77082b818676 Lib/email/feedparser.py --- a/Lib/email/feedparser.py Fri Feb 07 23:46:38 2014 +1000 +++ b/Lib/email/feedparser.py Fri Feb 07 10:44:16 2014 -0500 @@ -126,7 +126,7 @@ 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 @@ 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__ diff -r f3f92d55f942 -r 77082b818676 Lib/email/parser.py --- a/Lib/email/parser.py Fri Feb 07 23:46:38 2014 +1000 +++ b/Lib/email/parser.py Fri Feb 07 10:44:16 2014 -0500 @@ -17,7 +17,7 @@ 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 diff -r f3f92d55f942 -r 77082b818676 Lib/test/test_email/test_message.py --- a/Lib/test/test_email/test_message.py Fri Feb 07 23:46:38 2014 +1000 +++ b/Lib/test/test_email/test_message.py Fri Feb 07 10:44:16 2014 -0500 @@ -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 @@ 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: diff -r f3f92d55f942 -r 77082b818676 Misc/NEWS --- a/Misc/NEWS Fri Feb 07 23:46:38 2014 +1000 +++ b/Misc/NEWS Fri Feb 07 10:44:16 2014 -0500 @@ -24,6 +24,10 @@ 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. /pepe@example.com/pepe@example.com/rdmurray@bitdance.com