X-Git-Url: https://jfr.im/git/z_archive/twitter.git/blobdiff_plain/0d6c06464366d66e458910da81d62ce0eda811a0..ea519acc830f0f76ccef212ffbbf3d13aed1e953:/twitter/api.py diff --git a/twitter/api.py b/twitter/api.py index f07b77d..b7ba198 100644 --- a/twitter/api.py +++ b/twitter/api.py @@ -49,16 +49,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): """ @@ -77,10 +70,20 @@ class TwitterResponse(object): # 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): +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__ -class TwitterXmlResponse(str, TwitterResponse): + def __init__(self, d, headers): + TwitterResponse.__init__(self, headers) + dict.__init__(self, d) + +class TwitterXmlResponse(TwitterResponse, str): __doc__ = """Twitter XML Response """ + TwitterResponse.__doc__ @@ -112,8 +115,8 @@ 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)) - uri = '/'.join(uriparts) + uriparts.append(unicode(kwargs.pop(uripart, uripart))) + uri = u'/'.join(uriparts) method = "GET" for action in POST_ACTIONS: @@ -151,9 +154,15 @@ class TwitterCall(object): try: handle = urllib2.urlopen(req) if "json" == self.format: - return TwitterJsonResponse(json.loads(handle.read())) + res = json.loads(handle.read()) + response_cls = ( + TwitterJsonListResponse if type(res) is list + else TwitterJsonDictResponse) + return response_cls(res, handle.headers) else: - return TwitterXmlResponse(handle.read()) + r = TwitterXmlResponse(handle.read()) + r.headers = handle.headers + return r except urllib2.HTTPError, e: if (e.code == 304): return [] @@ -279,5 +288,6 @@ class Twitter(TwitterCall): secure=secure, uriparts=uriparts) -__all__ = ["Twitter", "TwitterError", "TwitterHTTPError", "TwitterJsonResponse", +__all__ = ["Twitter", "TwitterError", "TwitterHTTPError", + "TwitterJsonListResponse", "TwitterJsonDictResponse", "TwitterXmlResponse"]