#12586: add provisional email policy with new header parsing and folding.

When the new policies are used (and only when the new policies are explicitly
used) headers turn into objects that have attributes based on their parsed
values, and can be set using objects that encapsulate the values, as well as
set directly from unicode strings.  The folding algorithm then takes care of
encoding unicode where needed, and folding according to the highest level
syntactic objects.

With this patch only date and time headers are parsed as anything other than
unstructured, but that is all the helper methods in the existing API handle.
I do plan to add more parsers, and complete the set specified in the RFC
before the package becomes stable.
This commit is contained in:
R David Murray 2012-05-25 18:42:14 -04:00
parent 0fa2edd08f
commit 0b6f6c82b5
16 changed files with 6992 additions and 114 deletions

View file

@ -0,0 +1,57 @@
import unittest
import textwrap
import copy
import pickle
from email import policy
from email import message_from_string
from email._headerregistry import HeaderRegistry
from test.test_email import TestEmailBase
class TestPickleCopyHeader(TestEmailBase):
unstructured = HeaderRegistry()('subject', 'this is a test')
def test_deepcopy_unstructured(self):
h = copy.deepcopy(self.unstructured)
self.assertEqual(str(h), str(self.unstructured))
def test_pickle_unstructured(self):
p = pickle.dumps(self.unstructured)
h = pickle.loads(p)
self.assertEqual(str(h), str(self.unstructured))
address = HeaderRegistry()('from', 'frodo@mordor.net')
def test_deepcopy_address(self):
h = copy.deepcopy(self.address)
self.assertEqual(str(h), str(self.address))
def test_pickle_address(self):
p = pickle.dumps(self.address)
h = pickle.loads(p)
self.assertEqual(str(h), str(self.address))
class TestPickleCopyMessage(TestEmailBase):
testmsg = message_from_string(textwrap.dedent("""\
From: frodo@mordor.net
To: bilbo@underhill.org
Subject: help
I think I forgot the ring.
"""), policy=policy.default)
def test_deepcopy(self):
msg2 = copy.deepcopy(self.testmsg)
self.assertEqual(msg2.as_string(), self.testmsg.as_string())
def test_pickle(self):
p = pickle.dumps(self.testmsg)
msg2 = pickle.loads(p)
self.assertEqual(msg2.as_string(), self.testmsg.as_string())
if __name__ == '__main__':
unittest.main()