Make subcommands finally work properly
[mw] / src / mw / api.py
1 ###
2 # mw - VCS-like nonsense for MediaWiki websites
3 # Copyright (C) 2009  Ian Weller <ian@ianweller.org>
4 #
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 2 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License along
16 # with this program; if not, write to the Free Software Foundation, Inc.,
17 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 ###
19
20 import cookielib
21 import gzip
22 import json
23 from StringIO import StringIO
24 import urllib
25 import urllib2
26
27 class API(object):
28     def __init__(self, api_url):
29         self.api_url = api_url
30         self.cookiejar = cookielib.CookieJar()
31         self.opener = urllib2.build_opener(
32                 urllib2.HTTPCookieProcessor(self.cookiejar))
33         self._high_limits = None
34
35     def call(self, data):
36         data['format'] = 'json'
37         request = urllib2.Request(self.api_url, urllib.urlencode(data))
38         request.add_header('Accept-encoding', 'gzip')
39         response = self.opener.open(request)
40         if response.headers.get('Content-Encoding') == 'gzip':
41             compressed = StringIO(response.read())
42             gzipper = gzip.GzipFile(fileobj=compressed)
43             data = gzipper.read()
44         else:
45             data = response.read()
46         return json.loads(data)
47
48     def limits(self, low, high):
49         if self._high_limits == None:
50             result = self.call({'action': 'query',
51                                 'meta': 'userinfo',
52                                 'uiprop': 'rights'})
53             self._high_limits = 'apihighlimits' in \
54                     result['query']['userinfo']['rights']
55         if self._high_limits:
56             return high
57         else:
58             return low

Benjamin Mako Hill || Want to submit a patch?