From 537def4a4fb284a216f56f3bae308d28ccc67b1f Mon Sep 17 00:00:00 2001 From: Konstantin Podshumok Date: Wed, 18 Dec 2013 06:56:53 +0400 Subject: [PATCH] fix regression with cookiejar.iteritems() --- AUTHORS.rst | 1 + requests/cookies.py | 40 +++++++++++++++++++++++++++++----------- test_requests.py | 23 +++++++++++++++++++++++ 3 files changed, 53 insertions(+), 11 deletions(-) diff --git a/AUTHORS.rst b/AUTHORS.rst index e94a4bf..6e66844 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -145,3 +145,4 @@ Patches and Suggestions - Pengfei.X - Kamil Madac - Michael Becker @beckerfuffle +- Константин Подшумок @podshumok diff --git a/requests/cookies.py b/requests/cookies.py index 35dacfc..053847e 100644 --- a/requests/cookies.py +++ b/requests/cookies.py @@ -8,7 +8,7 @@ requests.utils imports from here, so be careful with imports. import time import collections -from .compat import cookielib, urlparse, urlunparse, Morsel +from .compat import cookielib, urlparse, urlunparse, Morsel, is_py3 try: import threading @@ -198,30 +198,48 @@ class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): self.set_cookie(c) return c + def iterkeys(self): + """Dict-like iterkeys() that returns an iterator of names of cookies from the jar. + See itervalues() and iteritems().""" + for cookie in iter(self): + yield cookie.name + def keys(self): """Dict-like keys() that returns a list of names of cookies from the jar. See values() and items().""" - keys = [] + if is_py3: + return self.iterkeys() + else: + return list(self.iterkeys()) + + def itervalues(self): + """Dict-like itervalues() that returns an iterator of values of cookies from the jar. + See iterkeys() and iteritems().""" for cookie in iter(self): - keys.append(cookie.name) - return keys + yield cookie.value def values(self): """Dict-like values() that returns a list of values of cookies from the jar. See keys() and items().""" - values = [] + if is_py3: + return self.itervalues() + else: + return list(self.itervalues()) + + def iteritems(self): + """Dict-like iteritems() that returns an iterator of name-value tuples from the jar. + See iterkeys() and itervalues().""" for cookie in iter(self): - values.append(cookie.value) - return values + yield cookie.name, cookie.value def items(self): """Dict-like items() that returns a list of name-value tuples from the jar. See keys() and values(). Allows client-code to call "dict(RequestsCookieJar) and get a vanilla python dict of key value pairs.""" - items = [] - for cookie in iter(self): - items.append((cookie.name, cookie.value)) - return items + if is_py3: + return self.iteritems() + else: + return list(self.iteritems()) def list_domains(self): """Utility method to list all the domains in the jar.""" diff --git a/test_requests.py b/test_requests.py index 093b37c..7e8a5b2 100755 --- a/test_requests.py +++ b/test_requests.py @@ -570,6 +570,29 @@ class RequestsTestCase(unittest.TestCase): assert cookie.domain == domain assert cookie._rest['HttpOnly'] == rest['HttpOnly'] + def test_cookie_as_dict(self): + key = 'some_cookie' + value = 'some_value' + + key1 = 'some_cookie1' + value1 = 'some_value1' + + jar = requests.cookies.RequestsCookieJar() + jar.set(key, value) + jar.set(key1, value1) + + d1 = dict(jar) + d2 = dict(jar.iteritems()) + d3 = dict(jar.items()) + + assert len(d1) == 2 + assert len(d2) == 2 + assert len(d3) == 2 + + assert d1['some_cookie'] == 'some_value' + assert d2['some_cookie'] == 'some_value' + assert d3['some_cookie'] == 'some_value' + def test_time_elapsed_blank(self): r = requests.get(httpbin('get')) td = r.elapsed -- 2.34.1