Yurik has uploaded a new change for review. https://gerrit.wikimedia.org/r/153852
Change subject: cleaned up api lib ...................................................................... cleaned up api lib Change-Id: I11081c38634ce21e7ca5db3eb62d6e3d116b1ebc --- M maintenance/api.py 1 file changed, 41 insertions(+), 35 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/ZeroPortal refs/changes/52/153852/1 diff --git a/maintenance/api.py b/maintenance/api.py index 7125c87..d980ab9 100644 --- a/maintenance/api.py +++ b/maintenance/api.py @@ -2,9 +2,9 @@ import json import requests from requests.structures import CaseInsensitiveDict -from collections import Iterable import os import sys + try: import urllib.parse as urlparse except ImportError: @@ -15,6 +15,7 @@ """ Basic console logger. Most frameworks would probably want to implement their own. """ + def __init__(self, verbosity=5): self.verbosity = verbosity @@ -32,19 +33,23 @@ """ Any error reported by the API is included in this exception """ + def __init__(self, message, data): self.message = message self.data = data def __str__(self): - return message + ': ' + json.dumps(self.data) + return self.message + ': ' + json.dumps(self.data) + class ApiPagesModifiedError(ApiError): """ This error is thrown by queryPage() if revision of some pages was changed between calls. """ + def __init__(self, data): - super(ApiError,self).__init__('Pages modified during iteration', data) + super(ApiError, self).__init__('Pages modified during iteration', data) + class Site(object): """ @@ -63,9 +68,8 @@ script = os.path.abspath(sys.modules['__main__'].__file__) except (KeyError, AttributeError): script = sys.executable - path, file = os.path.split(script) - self.headers = CaseInsensitiveDict({u'User-Agent': u'%s-%s BareboneMWReq/0.1' % (os.path.basename(path), file)}) - # self.headers = {u'User-Agent': u'test'} #u'%s-%s BareboneMWReq/0.1' % (os.path.basename(path), file)} + path, f = os.path.split(script) + self.headers = CaseInsensitiveDict({u'User-Agent': u'%s-%s BareboneMWReq/0.1' % (os.path.basename(path), f)}) if headers: self.headers.update(headers) @@ -97,11 +101,11 @@ if k in kwargs: del kwargs[k] - for k, v in kwargs.items(): + for k, val in kwargs.items(): # Only support the well known types. # Everything else should be client's responsibility - if isinstance(v, list) or isinstance(v, tuple): - kwargs[k] = '|'.join(v) + if isinstance(val, list) or isinstance(val, tuple): + kwargs[k] = '|'.join(val) # Make server call kwargs['action'] = action @@ -131,7 +135,7 @@ def query(self, **kwargs): """ - Call Query API with given paramaters, and yield all results returned + Call Query API with given parameters, and yield all results returned by the server, properly handling result continuation. """ if 'continue' not in kwargs: @@ -151,33 +155,33 @@ """ Query the server and return all page objects individually. """ - incomplete={} - changed=set() + incomplete = {} + changed = set() for result in self.query(**kwargs): if 'pages' not in result: raise ApiError('Missing pages element in query result', result) finished = incomplete.copy() - for id, page in result['pages'].items(): - if id in changed: + for pageId, page in result['pages'].items(): + if pageId in changed: continue - if id in incomplete: - del finished[id] # If server returned it => not finished - p = incomplete[id] + if pageId in incomplete: + del finished[pageId] # If server returned it => not finished + p = incomplete[pageId] if 'lastrevid' in page and p['lastrevid'] != page['lastrevid']: # someone else modified this page, it must be requested anew separately - changed.add(id) - del incomplete[id] + changed.add(pageId) + del incomplete[pageId] continue self._mergePage(p, page) else: p = page - incomplete[id] = p - for id, page in finished.items(): - if id not in changed: + incomplete[pageId] = p + for pageId, page in finished.items(): + if pageId not in changed: yield page - for id, page in incomplete.items(): + for pageId, page in incomplete.items(): yield page if changed: # some pages have been changed between api calls, notify caller @@ -185,22 +189,22 @@ def _mergePage(self, a, b): """ - Recursivelly merge two page objects + Recursively merge two page objects """ for k in b: - v = b[k] + val = b[k] if k in a: - if isinstance(v, dict): - self._mergePage(a[k], v) - elif isinstance(v, list): - a[k] = a[k] + v + if isinstance(val, dict): + self._mergePage(a[k], val) + elif isinstance(val, list): + a[k] = a[k] + val else: - a[k] = v + a[k] = val else: - a[k] = v + a[k] = val - def token(self, type='edit'): - return self('tokens', type=type)['tokens'][type+'token'] + def token(self, tokenType='edit'): + return self('tokens', type=tokenType)['tokens'][tokenType + 'token'] def request(self, method, forceSSL=False, headers=None, **request_kw): """Make either a low level request to the server""" @@ -225,15 +229,17 @@ self.log(5, dbg) return r + def wikimedia(language='en', site='wikipedia', scheme='http', session=None, log=None): """Create a Site object for Wikimedia Foundation site in this format: [scheme]://[language].[site].org/w/api.php """ return Site(scheme + '://' + language + '.' + site + '.org/w/api.php', session, log) + if __name__ == "__main__": w = wikimedia() - #r = w.query(meta='siteinfo') - for v in w.queryPages(titles=('Test','API'), prop=('links','info'), pllimit=20): + # r = w.query(meta='siteinfo') + for v in w.queryPages(titles=('Test', 'API'), prop=('links', 'info'), pllimit=20): print(v) print('end') -- To view, visit https://gerrit.wikimedia.org/r/153852 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I11081c38634ce21e7ca5db3eb62d6e3d116b1ebc Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/ZeroPortal Gerrit-Branch: master Gerrit-Owner: Yurik <yu...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits