jenkins-bot has submitted this change and it was merged.
Change subject: (Bug 60406) - site.loadrevisions(): None is returned if no Page param is passed ......................................................................
(Bug 60406) - site.loadrevisions(): None is returned if no Page param is passed
API params passed to API.Generator in keywd dict instead of modifying gen.request.param.
Change-Id: Ia6bd0f191070c51ae0f7c0e945870a462f1640ec --- M pywikibot/site.py M tests/site_tests.py 2 files changed, 74 insertions(+), 49 deletions(-)
Approvals: Xqt: Looks good to me, approved jenkins-bot: Verified
diff --git a/pywikibot/site.py b/pywikibot/site.py index e3b505b..20ee4bb 100644 --- a/pywikibot/site.py +++ b/pywikibot/site.py @@ -1833,14 +1833,14 @@ **cmargs) return cmgen
- def loadrevisions(self, page=None, getText=False, revids=None, + def loadrevisions(self, page, getText=False, revids=None, startid=None, endid=None, starttime=None, endtime=None, rvdir=None, user=None, excludeuser=None, section=None, sysop=False, step=None, total=None): """Retrieve and store revision information.
By default, retrieves the last (current) revision of the page, - I{unless} any of the optional parameters revids, startid, endid, + unless any of the optional parameters revids, startid, endid, starttime, endtime, rvdir, user, excludeuser, or limit are specified. Unless noted below, all parameters not specified default to False. @@ -1857,9 +1857,9 @@ (getText must be True); section must be given by number (top of the article is section 0), not name @type section: int - @param revids: retrieve only the specified revision ids (required - unless page is specified) - @type revids: list of ints + @param revids: retrieve only the specified revision ids (raise + Exception if any of revids does not correspond to page + @type revids: an int, a str or a list of ints or strings @param startid: retrieve revisions starting with this revid @param endid: stop upon retrieving this revid @param starttime: retrieve revisions starting at this Timestamp @@ -1884,9 +1884,6 @@ total is None) # if True, retrieving current revision
# check for invalid argument combinations - if page is None and revids is None: - raise ValueError( - "loadrevisions: either page or revids argument required") if (startid is not None or endid is not None) and \ (starttime is not None or endtime is not None): raise ValueError( @@ -1906,54 +1903,56 @@ raise ValueError( "loadrevisions: endid > startid with rvdir=False")
- # assemble API request + rvargs = dict(type_arg=u"info|revisions") + + if getText: + rvargs[u"rvprop"] = u"ids|flags|timestamp|user|comment|content" + if section is not None: + rvargs[u"rvsection"] = unicode(section) + if revids is None: rvtitle = page.title(withSection=False).encode(self.encoding()) - rvgen = self._generator(api.PropertyGenerator, - type_arg=u"info|revisions", - titles=rvtitle, step=step, total=total) + rvargs[u"titles"] = rvtitle else: if isinstance(revids, (int, basestring)): ids = unicode(revids) else: ids = u"|".join(unicode(r) for r in revids) - rvgen = self._generator(api.PropertyGenerator, - type_arg=u"info|revisions", revids=ids, - step=step, total=total) - if getText: - rvgen.request[u"rvprop"] = u"ids|flags|timestamp|user|comment|content" - if section is not None: - rvgen.request[u"rvsection"] = unicode(section) + rvargs[u"revids"] = ids + + if rvdir: + rvargs[u"rvdir"] = u"newer" + elif rvdir is not None: + rvargs[u"rvdir"] = u"older" + if startid: + rvargs[u"rvstartid"] = startid + if endid: + rvargs[u"rvendid"] = endid + if starttime: + rvargs[u"rvstart"] = str(starttime) + if endtime: + rvargs[u"rvend"] = str(endtime) + if user: + rvargs[u"rvuser"] = user + elif excludeuser: + rvargs[u"rvexcludeuser"] = excludeuser + # TODO if sysop: something + + # assemble API request + rvgen = self._generator(api.PropertyGenerator, + step=step, total=total, **rvargs) + if latest or "revids" in rvgen.request: rvgen.set_maximum_items(-1) # suppress use of rvlimit parameter - if rvdir: - rvgen.request[u"rvdir"] = u"newer" - elif rvdir is not None: - rvgen.request[u"rvdir"] = u"older" - if startid: - rvgen.request[u"rvstartid"] = startid - if endid: - rvgen.request[u"rvendid"] = endid - if starttime: - rvgen.request[u"rvstart"] = str(starttime) - if endtime: - rvgen.request[u"rvend"] = str(endtime) - if user: - rvgen.request[u"rvuser"] = user - elif excludeuser: - rvgen.request[u"rvexcludeuser"] = excludeuser - # TODO if sysop: something + for pagedata in rvgen: - if page is not None: - if not self.sametitle(pagedata['title'], - page.title(withSection=False)): - raise Error( - u"loadrevisions: Query on %s returned data on '%s'" - % (page, pagedata['title'])) - if "missing" in pagedata: - raise NoPage(page) - else: - page = pywikibot.Page(self, pagedata['title']) + if not self.sametitle(pagedata['title'], + page.title(withSection=False)): + raise Error( + u"loadrevisions: Query on %s returned data on '%s'" + % (page, pagedata['title'])) + if "missing" in pagedata: + raise NoPage(page) api.update_page(page, pagedata)
def pageinterwiki(self, page): diff --git a/tests/site_tests.py b/tests/site_tests.py index 8b8498e..6c93c0c 100644 --- a/tests/site_tests.py +++ b/tests/site_tests.py @@ -1003,6 +1003,32 @@ self.assertTrue(hasattr(self.mainpage, "_revisions")) self.assertTrue(self.mainpage._revid in self.mainpage._revisions) self.assertEqual(len(self.mainpage._revisions), 15) + self.assertEqual(self.mainpage._text, None) + + def testLoadRevisions_getText(self): + """Test the site.loadrevisions() method with getText=True""" + + self.mysite.loadrevisions(self.mainpage, getText=True, total=5) + self.assertTrue(len(self.mainpage._text) > 0) + + def testLoadRevisions_revids(self): + """Test the site.loadrevisions() method, listing based on revid.""" + + #revids as list of int + self.mysite.loadrevisions(self.mainpage, revids=[139992, 139993]) + self.assertTrue(all(rev in self.mainpage._revisions for rev in [139992, 139993])) + #revids as list of str + self.mysite.loadrevisions(self.mainpage, revids=['139994', '139995']) + self.assertTrue(all(rev in self.mainpage._revisions for rev in [139994, 139995])) + #revids as int + self.mysite.loadrevisions(self.mainpage, revids=140000) + self.assertTrue(140000 in self.mainpage._revisions) + #revids as str + self.mysite.loadrevisions(self.mainpage, revids='140001') + self.assertTrue(140001 in self.mainpage._revisions) + #revids belonging to a different page raises Exception + self.assertRaises(pywikibot.Error, self.mysite.loadrevisions, + self.mainpage, revids=130000)
def testLoadRevisions_querycontinue(self): """Test the site.loadrevisions() method with query-continue""" @@ -1017,7 +1043,7 @@ self.assertEqual(len(self.mainpage._revisions), 15)
def testLoadRevisions_timestamp(self): - """Test the site.loadrevisions() method, listing based con timestamp.""" + """Test the site.loadrevisions() method, listing based on timestamp."""
self.mysite.loadrevisions(self.mainpage, rvdir=True, total=15) self.assertEqual(len(self.mainpage._revisions), 15) @@ -1037,8 +1063,8 @@ self.mainpage, rvdir=False, starttime="2002-01-01T00:00:00Z", endtime="2002-02-01T000:00:00Z")
- def testLoadRevisions_revid(self): - """Test the site.loadrevisions() method, listing based con revid.""" + def testLoadRevisions_rev_id(self): + """Test the site.loadrevisions() method, listing based on rev_id."""
self.mysite.loadrevisions(self.mainpage, rvdir=True, total=15) self.assertEqual(len(self.mainpage._revisions), 15)
pywikibot-commits@lists.wikimedia.org