fix regression with cookiejar.iteritems()
authorKonstantin Podshumok <kpp.live@gmail.com>
Wed, 18 Dec 2013 02:56:53 +0000 (06:56 +0400)
committerKonstantin Podshumok <kpp.live@gmail.com>
Wed, 18 Dec 2013 02:56:53 +0000 (06:56 +0400)
AUTHORS.rst
requests/cookies.py
test_requests.py

index e94a4bf..6e66844 100644 (file)
@@ -145,3 +145,4 @@ Patches and Suggestions
 - Pengfei.X <pengphy@gmail.com>
 - Kamil Madac <kamil.madac@gmail.com>
 - Michael Becker <mike@beckerfuffle.com> @beckerfuffle
+- Константин Подшумок @podshumok
index 35dacfc..053847e 100644 (file)
@@ -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."""
index 093b37c..7e8a5b2 100755 (executable)
@@ -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