X-Git-Url: https://projects.mako.cc/source/python-simplemediawiki.debian/blobdiff_plain/c2c978f25fc626681c7d8ba477bea9082ae8ce93..HEAD:/simplemediawiki.py diff --git a/simplemediawiki.py b/simplemediawiki.py index 940fb2b..ec12a11 100644 --- a/simplemediawiki.py +++ b/simplemediawiki.py @@ -33,12 +33,18 @@ of namespaces are provided for your convenience. import cookielib import gzip -from iso8601 import iso8601 +import iso8601 import json from StringIO import StringIO import urllib import urllib2 +__author__ = 'Ian Weller ' +__version__ = '1.0.2' +DEFAULT_UA = ('python-simplemediawiki/%s ' + '+https://github.com/ianweller/python-simplemediawiki') \ + % __version__ + class MediaWiki(): """ @@ -61,10 +67,16 @@ class MediaWiki(): self._cj.load() else: self._cj = cookielib.CookieJar() - self._opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self._cj)) + self._opener = urllib2.build_opener( + urllib2.HTTPCookieProcessor(self._cj) + ) self._opener.addheaders = [('User-agent', user_agent)] def _fetch_http(self, url, params): + """ + Standard HTTP request handler for this class with gzip and cookie + support. + """ request = urllib2.Request(url, urllib.urlencode(params)) request.add_header('Accept-encoding', 'gzip') response = self._opener.open(request) @@ -92,7 +104,20 @@ class MediaWiki(): returns that URL, while also helpfully setting this object's API URL to it. If it can't magically conjure an API endpoint, it returns False. """ - data, data_json = self._normalize_api_url_tester(self._api_url) + def tester(self, api_url): + """ + Attempts to fetch general information about the MediaWiki instance + in order to test whether the given URL will return JSON. + """ + data = self._fetch_http(api_url, {'action': 'query', + 'meta': 'siteinfo'}) + try: + data_json = json.loads(data) + return (data, data_json) + except ValueError: + return (data, None) + + data, data_json = tester(self, self._api_url) if data_json: return self._api_url else: @@ -100,30 +125,13 @@ class MediaWiki(): if 'index.php' in self._api_url: test_api_url = self._api_url.split('index.php')[0] + 'api.php' print test_api_url - test_data, test_data_json = \ - self._normalize_api_url_tester(test_api_url) + test_data, test_data_json = tester(self, test_api_url) print (test_data, test_data_json) if test_data_json: self._api_url = test_api_url return self._api_url return False - def _normalize_api_url_tester(self, api_url): - data = self._fetch_http(api_url, {'action': 'query', - 'meta': 'siteinfo', - 'siprop': 'general', - 'format': 'json'}) - try: - data_json = json.loads(data) - # may as well set the version - try: - version_string = data_json['query']['general']['generator'] - self._mediawiki_version = version_string.split(' ', 1)[1] - except KeyError: - pass - return (data, data_json) - except ValueError: - return (data, None) def login(self, user, passwd, token=None): """ @@ -138,12 +146,22 @@ class MediaWiki(): data['lgtoken'] = token result = self.call(data) if result['login']['result'] == 'Success': + self._high_limits = None return True elif result['login']['result'] == 'NeedToken' and not token: return self.login(user, passwd, result['login']['token']) else: return False + def logout(self): + """ + Conveinence function for logging out of the wiki. + """ + data = {'action': 'logout'} + self.call(data) + self._high_limits = None + return True + def limits(self, low, high): """ Convenience function for determining appropriate limits in the API. If @@ -193,10 +211,3 @@ class MediaWiki(): objects. """ return iso8601.parse_date(date) - - -__author__ = 'Ian Weller ' -__version__ = '1.0.1' -DEFAULT_UA = 'python-simplemediawiki/%s ' + \ - '+https://github.com/ianweller/python-simplemediawiki' \ - % __version__