[Python-checkins] cpython: Restored backward compatibility of pickling http.cookies.Morsel. It was

serhiy.storchaka python-checkins at python.org
Wed Mar 18 17:04:44 CET 2015


https://hg.python.org/cpython/rev/d68cc584bc7d
changeset:   95048:d68cc584bc7d
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Wed Mar 18 18:03:40 2015 +0200
summary:
  Restored backward compatibility of pickling http.cookies.Morsel.  It was
broken after converting instance attributes to properies in issue #2211.

files:
  Lib/http/cookies.py           |  12 ++++++++++++
  Lib/test/test_http_cookies.py |  20 ++++++++++++++++++++
  2 files changed, 32 insertions(+), 0 deletions(-)


diff --git a/Lib/http/cookies.py b/Lib/http/cookies.py
--- a/Lib/http/cookies.py
+++ b/Lib/http/cookies.py
@@ -377,6 +377,18 @@
         self._value = val
         self._coded_value = coded_val
 
+    def __getstate__(self):
+        return {
+            'key': self._key,
+            'value': self._value,
+            'coded_value': self._coded_value,
+        }
+
+    def __setstate__(self, state):
+        self._key = state['key']
+        self._value = state['value']
+        self._coded_value = state['coded_value']
+
     def output(self, attrs=None, header="Set-Cookie:"):
         return "%s %s" % (header, self.OutputString(attrs))
 
diff --git a/Lib/test/test_http_cookies.py b/Lib/test/test_http_cookies.py
--- a/Lib/test/test_http_cookies.py
+++ b/Lib/test/test_http_cookies.py
@@ -1,5 +1,6 @@
 # Simple test suite for http/cookies.py
 
+import copy
 from test.support import run_unittest, run_doctest, check_warnings
 import unittest
 from http import cookies
@@ -325,6 +326,11 @@
         self.assertIsNot(morsel_a, morsel_b)
         self.assertEqual(morsel_a, morsel_b)
 
+        morsel_b = copy.copy(morsel_a)
+        self.assertIsInstance(morsel_b, cookies.Morsel)
+        self.assertIsNot(morsel_a, morsel_b)
+        self.assertEqual(morsel_a, morsel_b)
+
     def test_setitem(self):
         morsel = cookies.Morsel()
         morsel['expires'] = 0
@@ -383,6 +389,20 @@
         self.assertRaises(TypeError, morsel.update)
         self.assertRaises(TypeError, morsel.update, 0)
 
+    def test_pickle(self):
+        morsel_a = cookies.Morsel()
+        morsel_a.set('foo', 'bar', 'baz')
+        morsel_a.update({
+            'version': 2,
+            'comment': 'foo',
+        })
+        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
+            with self.subTest(proto=proto):
+                morsel_b = pickle.loads(pickle.dumps(morsel_a, proto))
+                self.assertIsInstance(morsel_b, cookies.Morsel)
+                self.assertEqual(morsel_b, morsel_a)
+                self.assertEqual(str(morsel_b), str(morsel_a))
+
     def test_repr(self):
         morsel = cookies.Morsel()
         self.assertEqual(repr(morsel), '<Morsel: None=None>')

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list