]> jfr.im git - z_archive/twitter.git/blobdiff - twitter/api.py
Merge branch 'master' into py3-2
[z_archive/twitter.git] / twitter / api.py
index f07b77d4a3c37d240ee165d9fbb522f9e575ec75..570c78868c3dbbe1d25323a41b42c12f1c3780e9 100644 (file)
@@ -1,6 +1,4 @@
-import urllib2
-
-from exceptions import Exception
+import urllib.request, urllib.error, urllib.parse
 
 from twitter.twitter_globals import POST_ACTIONS
 from twitter.auth import NoAuth
@@ -49,16 +47,9 @@ class TwitterResponse(object):
     httplib.HTTPHeaders instance. You can do
     `response.headers.getheader('h')` to retrieve a header.
     """
-    def __init__(self, real_response, headers):
-        self._real_response = real_response
+    def __init__(self, headers):
         self.headers = headers
 
-    def __getattr__(self, k):
-        try:
-            return object.__getattr__(self, k)
-        except AttributeError:
-            return getattr(self._real_response, k)
-
     @property
     def rate_limit_remaining(self):
         """
@@ -74,15 +65,22 @@ class TwitterResponse(object):
         return int(self.headers.getheader('X-RateLimit-Reset'))
 
 
-# Multiple inheritance makes my inner Java nerd cry. Why can't I just
-# add arbitrary attributes to list or str objects?! Guido, we need to
-# talk.
-class TwitterJsonResponse(list, TwitterResponse):
-    __doc__ = """Twitter JSON Response
-    """ + TwitterResponse.__doc__
-class TwitterXmlResponse(str, TwitterResponse):
-    __doc__ = """Twitter XML Response
-    """ + TwitterResponse.__doc__
+def wrap_response(response, headers):
+    response_typ = type(response)
+    if response_typ is bool:
+        # HURF DURF MY NAME IS PYTHON AND I CAN'T SUBCLASS bool.
+        response_typ = int
+
+    class WrappedTwitterResponse(response_typ, TwitterResponse):
+        __doc__ = TwitterResponse.__doc__
+
+        def __init__(self, response):
+            if response_typ is not int:
+                response_typ.__init__(self, response)
+            TwitterResponse.__init__(self, headers)
+
+    return WrappedTwitterResponse(response)
+
 
 
 class TwitterCall(object):
@@ -112,7 +110,7 @@ class TwitterCall(object):
         for uripart in self.uriparts:
             # If this part matches a keyword argument, use the
             # supplied value otherwise, just use the part.
-            uriparts.append(kwargs.pop(uripart, uripart))
+            uriparts.append(str(kwargs.pop(uripart, uripart)))
         uri = '/'.join(uriparts)
 
         method = "GET"
@@ -146,15 +144,17 @@ class TwitterCall(object):
             else:
                 body = arg_data
 
-        req = urllib2.Request(uriBase, body, headers)
+        req = urllib.request.Request(uriBase, body, headers)
 
         try:
-            handle = urllib2.urlopen(req)
+            handle = urllib.request.urlopen(req)
             if "json" == self.format:
-                return TwitterJsonResponse(json.loads(handle.read()))
+                res = json.loads(handle.read().decode('utf8'))
+                return wrap_response(res, handle.headers)
             else:
-                return TwitterXmlResponse(handle.read())
-        except urllib2.HTTPError, e:
+                return wrap_response(
+                    handle.read().decode('utf8'), handle.headers)
+        except urllib.error.HTTPError as e:
             if (e.code == 304):
                 return []
             else:
@@ -279,5 +279,4 @@ class Twitter(TwitterCall):
             secure=secure, uriparts=uriparts)
 
 
-__all__ = ["Twitter", "TwitterError", "TwitterHTTPError", "TwitterJsonResponse",
-           "TwitterXmlResponse"]
+__all__ = ["Twitter", "TwitterError", "TwitterHTTPError", "TwitterResponse"]