From 23402a080c0c8eaf15dfb42aed22bdeba733ec88 Mon Sep 17 00:00:00 2001 From: Bryan Tong Minh <bryan.tongminh@gmail.com> Date: Sat, 16 Feb 2008 19:59:55 +0000 Subject: [PATCH] Fix 1.11 compatibility issues with imageinfo, userinfo and lists --- mwclient/client.py | 26 +++++++++++++++++--------- mwclient/compatibility.py | 18 ++++++++++++++++-- mwclient/listing.py | 9 ++++++++- mwclient/page.py | 10 +++++----- 4 files changed, 46 insertions(+), 17 deletions(-) diff --git a/mwclient/client.py b/mwclient/client.py index 6d866d6..dc08069 100644 --- a/mwclient/client.py +++ b/mwclient/client.py @@ -61,6 +61,8 @@ class Site(object): else: self.connection = pool + self.version = None + self.Pages = listing.PageList(self) self.Categories = listing.PageList(self, namespace = 14) self.Images = listing.PageList(self, namespace = 6) @@ -127,15 +129,17 @@ class Site(object): while True: info = self.raw_api(action, **kwargs) if not info: info = {} - if 'userinfo' in info.get('query', ()): - userinfo = info['query']['userinfo'] - if 'blockedby' in userinfo: - self.blocked = (userinfo['blockedby'], - userinfo.get('blockreason', u'')) - else: - self.blocked = False - self.hasmsg = 'message' in userinfo - self.logged_in = 'anon' not in userinfo + + try: + userinfo = compatibility.userinfo(info, self.require(1, 12, raise_error = None)) + except KeyError: + userinfo = () + if 'blockedby' in userinfo: + self.blocked = (userinfo['blockedby'], userinfo.get('blockreason', u'')) + else: + self.blocked = False + self.hasmsg = 'message' in userinfo + self.logged_in = 'anon' not in userinfo if 'error' in info: if info['error']['code'] in (u'internal_api_error_DBConnectionError', ): self.wait(token) @@ -212,6 +216,10 @@ class Site(object): return self.wait_tokens[token] def require(self, major, minor, revision = None, raise_error = True): + if self.version is None: + if raise_error is None: return + raise RuntimeError('Site %s has not yet been initialized' % repr(self)) + if revision is None: if self.version[:2] >= (major, minor): return True diff --git a/mwclient/compatibility.py b/mwclient/compatibility.py index 65392aa..4bd7625 100644 --- a/mwclient/compatibility.py +++ b/mwclient/compatibility.py @@ -4,8 +4,22 @@ def title(prefix, new_format): else: return 'titles' -def userinfo(data, new_format): - if new_format: +def userinfo(data, new_format = None): + if new_format is None: + # Unknown version; trying to guess + if 'userinfo' in data: + return data['userinfo'] + elif 'userinfo' in data.get('query', ()): + return data['query']['userinfo'] + else: + return {} + elif new_format: return data['query']['userinfo'] else: return data['userinfo'] + +def iiprop(post_112): + if post_112: + return 'timestamp|user|comment|url|size|sha1|metadata' + else: + return 'timestamp|user|comment|url|size|sha1' \ No newline at end of file diff --git a/mwclient/listing.py b/mwclient/listing.py index 0df0431..2b34a94 100644 --- a/mwclient/listing.py +++ b/mwclient/listing.py @@ -1,4 +1,5 @@ import client, page +import compatibility class List(object): def __init__(self, site, list_name, prefix, limit = None, return_values = None, *args, **kwargs): @@ -95,7 +96,6 @@ class GeneratorList(List): self.args['prop'] = 'info|imageinfo' self.args['inprop'] = 'protection' - self.args['iiprop'] = 'timestamp|user|comment|url|size|sha1|metadata' self.result_member = 'pages' @@ -108,6 +108,13 @@ class GeneratorList(List): if info['ns'] == 6: return page.Image(self.site, u'', info) return page.Page(self.site, u'', info) + + def load_chunk(self): + # Put this here so that the constructor does not fail + # on uninitialized sites + self.args['iiprop'] = compatibility.iiprop(site.require(1, 12, raise_error = False)) + return List.load_chunk(self) + class Category(page.Page, GeneratorList): def __init__(self, site, name, info = None, namespace = None): diff --git a/mwclient/page.py b/mwclient/page.py index 1e6ac1a..e41b1b8 100644 --- a/mwclient/page.py +++ b/mwclient/page.py @@ -184,7 +184,7 @@ class Page(object): kwargs = dict(listing.List.generate_kwargs(prefix, namespace = namespace, filterredir = filterredir)) if redirect: kwargs['%sredirect' % prefix] = '1' - kwargs[compatibility.title(prefix, self.site.require(1, 11))] = self.name + kwargs[compatibility.title(prefix, self.site.require(1, 11, raise_error = False))] = self.name return listing.List.get_list(generator)(self.site, 'backlinks', 'bl', limit = limit, return_values = 'title', **kwargs) def categories(self, generator = True): @@ -201,7 +201,7 @@ class Page(object): kwargs = dict(listing.List.generate_kwargs(prefix, namespace = namespace, filterredir = filterredir)) if redirect: kwargs['%sredirect' % prefix] = '1' - kwargs[compatibility.title(prefix, self.site.require(1, 11))] = self.name + kwargs[compatibility.title(prefix, self.site.require(1, 11, raise_error = False))] = self.name return listing.List.get_list(generator)(self.site, 'embeddedin', 'ei', limit = limit, return_values = 'title', **kwargs) def extlinks(self): @@ -247,14 +247,14 @@ class Image(Page): def __init__(self, site, name, info = None): site.require(1, 11) Page.__init__(self, site, name, info, - extra_properties = {'imageinfo': (('iiprop', - 'timestamp|user|comment|url|size|sha1|metadata'), )}) + extra_properties = {'imageinfo': (('iiprop', compatibility.iiprop( + site.require(1, 12, raise_error = False))), )}) self.imagerepository = self._info.get('imagerepository', '') self.imageinfo = self._info.get('imageinfo', ((), ))[0] def imagehistory(self): return listing.PageProperty(self, 'imageinfo', 'ii', - iiprop = 'timestamp|user|comment|url|size|sha1|metadata') + iiprop = compatibility.iiprop(self.site.require(1, 12, raise_error = False))) def imageusage(self, namespace = None, filterredir = 'all', redirect = False, limit = None, generator = True): self.site.require(1, 11) -- GitLab