diff -r 20f18e5e8bfc Doc/library/http.cookies.rst --- a/Doc/library/http.cookies.rst Sat Jan 07 00:08:29 2017 +0100 +++ b/Doc/library/http.cookies.rst Sat Jan 07 13:11:01 2017 +0200 @@ -148,39 +148,31 @@ Morsel Objects :meth:`~Morsel.__eq__` now takes :attr:`~Morsel.key` and :attr:`~Morsel.value` into account. + .. versionchanged:: 3.7 + Attributes :attr:`~Morsel.key`, :attr:`~Morsel.value` and + :attr:`~Morsel.coded_value` are read-only. Use :meth:`~Morsel.set` for + setting them. + .. attribute:: Morsel.value The value of the cookie. - .. deprecated:: 3.5 - assigning to ``value``; use :meth:`~Morsel.set` instead. - .. attribute:: Morsel.coded_value The encoded value of the cookie --- this is what should be sent. - .. deprecated:: 3.5 - assigning to ``coded_value``; use :meth:`~Morsel.set` instead. - .. attribute:: Morsel.key The name of the cookie. - .. deprecated:: 3.5 - assigning to ``key``; use :meth:`~Morsel.set` instead. - .. method:: Morsel.set(key, value, coded_value) Set the *key*, *value* and *coded_value* attributes. - .. deprecated:: 3.5 - The undocumented *LegalChars* parameter is ignored and will be removed in - a future version. - .. method:: Morsel.isReservedKey(K) diff -r 20f18e5e8bfc Lib/http/cookies.py --- a/Lib/http/cookies.py Sat Jan 07 00:08:29 2017 +0100 +++ b/Lib/http/cookies.py Sat Jan 07 13:11:01 2017 +0200 @@ -138,12 +138,6 @@ import string _semispacejoin = '; '.join _spacejoin = ' '.join -def _warn_deprecated_setter(setter): - import warnings - msg = ('The .%s setter is deprecated. The attribute will be read-only in ' - 'future releases. Please use the set() method instead.' % setter) - warnings.warn(msg, DeprecationWarning, stacklevel=3) - # # Define an exception visible to External modules # @@ -303,29 +297,14 @@ class Morsel(dict): def key(self): return self._key - @key.setter - def key(self, key): - _warn_deprecated_setter('key') - self._key = key - @property def value(self): return self._value - @value.setter - def value(self, value): - _warn_deprecated_setter('value') - self._value = value - @property def coded_value(self): return self._coded_value - @coded_value.setter - def coded_value(self, coded_value): - _warn_deprecated_setter('coded_value') - self._coded_value = coded_value - def __setitem__(self, K, V): K = K.lower() if not K in self._reserved: @@ -366,14 +345,7 @@ class Morsel(dict): def isReservedKey(self, K): return K.lower() in self._reserved - def set(self, key, val, coded_val, LegalChars=_LegalChars): - if LegalChars != _LegalChars: - import warnings - warnings.warn( - 'LegalChars parameter is deprecated, ignored and will ' - 'be removed in future versions.', DeprecationWarning, - stacklevel=2) - + def set(self, key, val, coded_val): if key.lower() in self._reserved: raise CookieError('Attempt to set a reserved key %r' % (key,)) if not _is_legal_key(key): diff -r 20f18e5e8bfc Lib/test/test_http_cookies.py --- a/Lib/test/test_http_cookies.py Sat Jan 07 00:08:29 2017 +0100 +++ b/Lib/test/test_http_cookies.py Sat Jan 07 13:11:01 2017 +0200 @@ -12,8 +12,8 @@ class CookieTests(unittest.TestCase): def setUp(self): self._warnings_manager = check_warnings() self._warnings_manager.__enter__() - warnings.filterwarnings("ignore", ".* class is insecure.*", - DeprecationWarning) + #warnings.filterwarnings("ignore", ".* class is insecure.*", + #DeprecationWarning) def tearDown(self): self._warnings_manager.__exit__(None, None, None) @@ -256,6 +256,9 @@ class MorselTests(unittest.TestCase): # Check output and js_output. M['path'] = '/foo' # Try a reserved key as well M.set(i, "%s_val" % i, "%s_coded_val" % i) + self.assertEqual(M.key, i) + self.assertEqual(M.value, "%s_val" % i) + self.assertEqual(M.coded_value, "%s_coded_val" % i) self.assertEqual( M.output(), "Set-Cookie: %s=%s; Path=/foo" % (i, "%s_coded_val" % i)) @@ -272,16 +275,14 @@ class MorselTests(unittest.TestCase): self.assertRaises(cookies.CookieError, M.set, i, '%s_value' % i, '%s_value' % i) - def test_deprecation(self): + def test_set_properties(self): morsel = cookies.Morsel() - with self.assertWarnsRegex(DeprecationWarning, r'\bkey\b'): + with self.assertRaises(AttributeError): morsel.key = '' - with self.assertWarnsRegex(DeprecationWarning, r'\bvalue\b'): + with self.assertRaises(AttributeError): morsel.value = '' - with self.assertWarnsRegex(DeprecationWarning, r'\bcoded_value\b'): + with self.assertRaises(AttributeError): morsel.coded_value = '' - with self.assertWarnsRegex(DeprecationWarning, r'\bLegalChars\b'): - morsel.set('key', 'value', 'coded_value', LegalChars='.*') def test_eq(self): base_case = ('key', 'value', '"value"')