From 828223ad829f40938175aec924bb065ddd6b3948 Mon Sep 17 00:00:00 2001 From: j <0x006A@0x2620.org> Date: Sun, 3 Nov 2013 16:39:57 +0100 Subject: [PATCH] dont break ox.API subclasses --- ox/api.py | 173 +++++++++++++++++++++++++++--------------------------- 1 file changed, 88 insertions(+), 85 deletions(-) diff --git a/ox/api.py b/ox/api.py index b2cc5cd..9982bd7 100644 --- a/ox/api.py +++ b/ox/api.py @@ -8,102 +8,105 @@ import gzip import StringIO import urllib2 +from . import __version__ from .utils import json from .form import MultiPartForm -__all__ = ['API'] +__all__ = ['getAPI', 'API'] -def API(url, cj=None): - class API(object): - __version__ = 0.0 - __name__ = 'ox' - DEBUG = False - debuglevel = 0 +def getAPI(url, cj=None): + class A(API): + pass + return A(url, cj) - def __init__(self, url, cj=None): - if cj: - self._cj = cj - else: - self._cj = cookielib.CookieJar() - self._opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self._cj), - urllib2.HTTPHandler(debuglevel=self.debuglevel)) - self._opener.addheaders = [ - ('User-Agent', '%s/%s' % (self.__name__, self.__version__)) - ] +class API(object): + __version__ = __version__ + __name__ = 'ox' + DEBUG = False + debuglevel = 0 - self.url = url - r = self._request('api', {'docs': True}) - self._properties = r['data']['actions'] - self._actions = r['data']['actions'].keys() - for a in r['data']['actions']: - self._add_action(a) + def __init__(self, url, cj=None): + if cj: + self._cj = cj + else: + self._cj = cookielib.CookieJar() + self._opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self._cj), + urllib2.HTTPHandler(debuglevel=self.debuglevel)) + self._opener.addheaders = [ + ('User-Agent', '%s/%s' % (self.__name__, self.__version__)) + ] - def _add_method(self, method, name): - if name is None: - name = method.func_name - setattr(self.__class__, name, method) + self.url = url + r = self._request('api', {'docs': True}) + self._properties = r['data']['actions'] + self._actions = r['data']['actions'].keys() + for a in r['data']['actions']: + self._add_action(a) - def _add_action(self, action): - def method(self, *args, **kw): - if not kw: - if args: - kw = args[0] - else: - kw = None - return self._request(action, kw) - method.__doc__ = self._properties[action]['doc'] - method.func_name = str(action) - self._add_method(method, action) + def _add_method(self, method, name): + if name is None: + name = method.func_name + setattr(self.__class__, name, method) - def _json_request(self, url, form): - result = {} + def _add_action(self, action): + def method(self, *args, **kw): + if not kw: + if args: + kw = args[0] + else: + kw = None + return self._request(action, kw) + method.__doc__ = self._properties[action]['doc'] + method.func_name = str(action) + self._add_method(method, action) + + def _json_request(self, url, form): + result = {} + try: + body = str(form) + request = urllib2.Request(str(url)) + request.add_header('Content-type', form.get_content_type()) + request.add_header('Content-Length', str(len(body))) + request.add_header('Accept-Encoding', 'gzip, deflate') + request.add_data(body) + f = self._opener.open(request) + result = f.read() + if f.headers.get('content-encoding', None) == 'gzip': + result = gzip.GzipFile(fileobj=StringIO.StringIO(result)).read() + result = result.decode('utf-8') + return json.loads(result) + except urllib2.HTTPError, e: + if self.DEBUG: + import webbrowser + if e.code >= 500: + with open('/tmp/error.html', 'w') as f: + f.write(e.read()) + webbrowser.open_new_tab('/tmp/error.html') + + result = e.read() try: - body = str(form) - request = urllib2.Request(str(url)) - request.add_header('Content-type', form.get_content_type()) - request.add_header('Content-Length', str(len(body))) - request.add_header('Accept-Encoding', 'gzip, deflate') - request.add_data(body) - f = self._opener.open(request) - result = f.read() - if f.headers.get('content-encoding', None) == 'gzip': - result = gzip.GzipFile(fileobj=StringIO.StringIO(result)).read() result = result.decode('utf-8') - return json.loads(result) - except urllib2.HTTPError, e: - if self.DEBUG: - import webbrowser - if e.code >= 500: - with open('/tmp/error.html', 'w') as f: - f.write(e.read()) - webbrowser.open_new_tab('/tmp/error.html') - - result = e.read() - try: - result = result.decode('utf-8') - result = json.loads(result) - except: - result = {'status':{}} - result['status']['code'] = e.code - result['status']['text'] = str(e) - return result + result = json.loads(result) except: - if self.DEBUG: - import webbrowser - import traceback - traceback.print_exc() - if result: - with open('/tmp/error.html', 'w') as f: - f.write(str(result)) - webbrowser.open_new_tab('/tmp/error.html') - raise + result = {'status':{}} + result['status']['code'] = e.code + result['status']['text'] = str(e) + return result + except: + if self.DEBUG: + import webbrowser + import traceback + traceback.print_exc() + if result: + with open('/tmp/error.html', 'w') as f: + f.write(str(result)) + webbrowser.open_new_tab('/tmp/error.html') + raise - def _request(self, action, data=None): - form = MultiPartForm() - form.add_field('action', action) - if data: - form.add_field('data', json.dumps(data)) - return self._json_request(self.url, form) - - return API(url, cj) + def _request(self, action, data=None): + form = MultiPartForm() + form.add_field('action', action) + if data: + form.add_field('data', json.dumps(data)) + return self._json_request(self.url, form)