From 537def4a4fb284a216f56f3bae308d28ccc67b1f Mon Sep 17 00:00:00 2001 From: Konstantin Podshumok Date: Wed, 18 Dec 2013 06:56:53 +0400 Subject: [PATCH 1/3] 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 e94a4bff..6e66844d 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 35dacfc4..053847ee 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 093b37c1..7e8a5b2b 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 From e6a32d6283f2c9b98287fb9bf4a071bfcf41a243 Mon Sep 17 00:00:00 2001 From: Konstantin Podshumok Date: Wed, 18 Dec 2013 18:09:24 +0400 Subject: [PATCH 2/3] preserve python2-like dict API for RequestCookieJar --- requests/cookies.py | 17 ++++------------- test_requests.py | 3 +++ 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/requests/cookies.py b/requests/cookies.py index 053847ee..831c49c6 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, is_py3 +from .compat import cookielib, urlparse, urlunparse, Morsel try: import threading @@ -207,10 +207,7 @@ class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): def keys(self): """Dict-like keys() that returns a list of names of cookies from the jar. See values() and items().""" - if is_py3: - return self.iterkeys() - else: - return list(self.iterkeys()) + return list(self.iterkeys()) def itervalues(self): """Dict-like itervalues() that returns an iterator of values of cookies from the jar. @@ -221,10 +218,7 @@ class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): def values(self): """Dict-like values() that returns a list of values of cookies from the jar. See keys() and items().""" - if is_py3: - return self.itervalues() - else: - return list(self.itervalues()) + return list(self.itervalues()) def iteritems(self): """Dict-like iteritems() that returns an iterator of name-value tuples from the jar. @@ -236,10 +230,7 @@ class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): """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.""" - if is_py3: - return self.iteritems() - else: - return list(self.iteritems()) + 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 7e8a5b2b..eeb186dc 100755 --- a/test_requests.py +++ b/test_requests.py @@ -593,6 +593,9 @@ class RequestsTestCase(unittest.TestCase): assert d2['some_cookie'] == 'some_value' assert d3['some_cookie'] == 'some_value' + keys = jar.keys() + assert list(keys) == list(keys) + def test_time_elapsed_blank(self): r = requests.get(httpbin('get')) td = r.elapsed From b8f1263f16777163baa3437e320a75d881430484 Mon Sep 17 00:00:00 2001 From: Konstantin Podshumok Date: Wed, 18 Dec 2013 18:50:53 +0400 Subject: [PATCH 3/3] split cookiejar as dict test --- test_requests.py | 66 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/test_requests.py b/test_requests.py index eeb186dc..1e8e723f 100755 --- a/test_requests.py +++ b/test_requests.py @@ -570,7 +570,7 @@ class RequestsTestCase(unittest.TestCase): assert cookie.domain == domain assert cookie._rest['HttpOnly'] == rest['HttpOnly'] - def test_cookie_as_dict(self): + def test_cookie_as_dict_keeps_len(self): key = 'some_cookie' value = 'some_value' @@ -585,17 +585,79 @@ class RequestsTestCase(unittest.TestCase): d2 = dict(jar.iteritems()) d3 = dict(jar.items()) + assert len(jar) == 2 assert len(d1) == 2 assert len(d2) == 2 assert len(d3) == 2 + def test_cookie_as_dict_keeps_items(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 d1['some_cookie'] == 'some_value' assert d2['some_cookie'] == 'some_value' - assert d3['some_cookie'] == 'some_value' + assert d3['some_cookie1'] == 'some_value1' + + def test_cookie_as_dict_keys(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) keys = jar.keys() + assert keys == list(keys) + # make sure one can use keys multiple times assert list(keys) == list(keys) + def test_cookie_as_dict_values(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) + + values = jar.values() + assert values == list(values) + # make sure one can use values multiple times + assert list(values) == list(values) + + def test_cookie_as_dict_items(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) + + items = jar.items() + assert items == list(items) + # make sure one can use items multiple times + assert list(items) == list(items) + + def test_time_elapsed_blank(self): r = requests.get(httpbin('get')) td = r.elapsed