]> jfr.im git - z_archive/twitter.git/blobdiff - twitter/api.py
More stuff in gitignore.
[z_archive/twitter.git] / twitter / api.py
index b7ba19857e3939586b14eb5b85f521f7f20507ac..6abdd97ab5783bd148311cb2cd271e97a70b823b 100644 (file)
@@ -1,7 +1,5 @@
 import urllib2
 
-from exceptions import Exception
-
 from twitter.twitter_globals import POST_ACTIONS
 from twitter.auth import NoAuth
 
@@ -67,25 +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 TwitterJsonListResponse(TwitterResponse, list):
-    __doc__ = """Twitter JSON Response
-    """ + TwitterResponse.__doc__
-    def __init__(self, lst, headers):
-        TwitterResponse.__init__(self, headers)
-        list.__init__(self, lst)
-class TwitterJsonDictResponse(TwitterResponse, dict):
-    __doc__ = """Twitter JSON Response
-    """ + TwitterResponse.__doc__
-    def __init__(self, d, headers):
-        TwitterResponse.__init__(self, headers)
-        dict.__init__(self, d)
+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 TwitterXmlResponse(TwitterResponse, str):
-    __doc__ = """Twitter XML Response
-    """ + TwitterResponse.__doc__
 
 
 class TwitterCall(object):
@@ -154,16 +149,12 @@ class TwitterCall(object):
         try:
             handle = urllib2.urlopen(req)
             if "json" == self.format:
-                res = json.loads(handle.read())
-                response_cls = (
-                    TwitterJsonListResponse if type(res) is list
-                    else TwitterJsonDictResponse)
-                return response_cls(res, handle.headers)
+                res = json.loads(handle.read().decode('utf8'))
+                return wrap_response(res, handle.headers)
             else:
-                r = TwitterXmlResponse(handle.read())
-                r.headers = handle.headers
-                return r
-        except urllib2.HTTPError, e:
+                return wrap_response(
+                    handle.read().decode('utf8'), handle.headers)
+        except urllib2.HTTPError as e:
             if (e.code == 304):
                 return []
             else:
@@ -288,6 +279,4 @@ class Twitter(TwitterCall):
             secure=secure, uriparts=uriparts)
 
 
-__all__ = ["Twitter", "TwitterError", "TwitterHTTPError",
-           "TwitterJsonListResponse", "TwitterJsonDictResponse",
-           "TwitterXmlResponse"]
+__all__ = ["Twitter", "TwitterError", "TwitterHTTPError", "TwitterResponse"]