From: Mike Verdone Date: Mon, 6 Sep 2010 11:49:44 +0000 (+0200) Subject: Use a generic wrap_response with dynamic class instead. This is kind of scary but... X-Git-Tag: twitter-1.5~7 X-Git-Url: https://jfr.im/git/z_archive/twitter.git/commitdiff_plain/abddd41987c3993efd3dbc9cd1f6f2b6dd5a9751?hp=dda98f55989f0f76f9c2d45cf903c4098d68a8c0 Use a generic wrap_response with dynamic class instead. This is kind of scary but I think it will work. --- diff --git a/twitter/api.py b/twitter/api.py index b7ba198..c46b52d 100644 --- a/twitter/api.py +++ b/twitter/api.py @@ -67,25 +67,17 @@ 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) - -class TwitterXmlResponse(TwitterResponse, str): - __doc__ = """Twitter XML Response - """ + TwitterResponse.__doc__ +def wrap_response(response, headers): + response_typ = type(response) + class WrappedTwitterResponse(TwitterResponse, response_typ): + __doc__ = TwitterResponse.__doc__ + + def __init__(self, response, headers): + response_typ.__init__(self, response) + TwitterResponse.__init__(self, headers) + + return WrappedTwitterResponse(response, headers) + class TwitterCall(object): @@ -155,14 +147,9 @@ class TwitterCall(object): 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) + return wrap_response(res, handle.headers) else: - r = TwitterXmlResponse(handle.read()) - r.headers = handle.headers - return r + return wrap_response(handle.read(), handle.headers) except urllib2.HTTPError, e: if (e.code == 304): return [] @@ -288,6 +275,4 @@ class Twitter(TwitterCall): secure=secure, uriparts=uriparts) -__all__ = ["Twitter", "TwitterError", "TwitterHTTPError", - "TwitterJsonListResponse", "TwitterJsonDictResponse", - "TwitterXmlResponse"] +__all__ = ["Twitter", "TwitterError", "TwitterHTTPError", "TwitterResponse"]