jenkins-bot has submitted this change and it was merged.
Change subject: Re-implement page.getMovedTarget() from compat ......................................................................
Re-implement page.getMovedTarget() from compat
- Re-implement page.getMovedTarget() from compat which is used by fixing_redirect and redirect scripts - Implement a new NoMoveTarget exception derived from NoPage
Tests are added
bug: T100126 Change-Id: Iad97e7571fb5a1cdb16ec8ef72b26b4ea5be677c --- M pywikibot/__init__.py M pywikibot/exceptions.py M pywikibot/page.py M tests/logentry_tests.py 4 files changed, 113 insertions(+), 6 deletions(-)
Approvals: John Vandenberg: Looks good to me, approved jenkins-bot: Verified
diff --git a/pywikibot/__init__.py b/pywikibot/__init__.py index 266a054..b1d2cc3 100644 --- a/pywikibot/__init__.py +++ b/pywikibot/__init__.py @@ -38,7 +38,7 @@ handleArgs, ) from pywikibot.exceptions import ( - Error, InvalidTitle, BadTitle, NoPage, SectionError, + Error, InvalidTitle, BadTitle, NoPage, NoMoveTarget, SectionError, SiteDefinitionError, NoSuchSite, UnknownSite, UnknownFamily, UnknownExtension, NoUsername, UserBlocked, @@ -76,7 +76,8 @@ 'exception', 'input_choice', 'input', 'input_yn', 'inputChoice', 'handle_args', 'handleArgs', 'showHelp', 'ui', 'log', 'calledModuleName', 'Bot', 'CurrentPageBot', 'WikidataBot', - 'Error', 'InvalidTitle', 'BadTitle', 'NoPage', 'SectionError', + 'Error', 'InvalidTitle', 'BadTitle', 'NoPage', 'NoMoveTarget', + 'SectionError', 'SiteDefinitionError', 'NoSuchSite', 'UnknownSite', 'UnknownFamily', 'UnknownExtension', 'NoUsername', 'UserBlocked', 'UserActionRefuse', diff --git a/pywikibot/exceptions.py b/pywikibot/exceptions.py index ad09618..a8a8beb 100644 --- a/pywikibot/exceptions.py +++ b/pywikibot/exceptions.py @@ -27,6 +27,7 @@ - InterwikiRedirectPage: Page is a redirect to another site - SectionError: The section specified by # does not exist - NotEmailableError: The target user has disabled email + - NoMoveTarget: An expected move target page does not exist
PageSaveRelatedError: page exceptions within the save operation on a Page (alias: PageNotSaved). @@ -210,6 +211,15 @@ pass
+class NoMoveTarget(PageRelatedError): + + """Expected move target page not found.""" + + message = "Move target page of %s not found." + + pass + + class SiteDefinitionError(Error): # noqa
"""Site does not exist""" diff --git a/pywikibot/page.py b/pywikibot/page.py index 07d68ff..2b9801b 100644 --- a/pywikibot/page.py +++ b/pywikibot/page.py @@ -1440,10 +1440,44 @@ If this page is not a redirect page, will raise an IsNotRedirectPage exception. This method also can raise a NoPage exception.
- @return: Page + @rtype: pywikibot.Page """ return self.site.getredirtarget(self)
+ @deprecated('moved_target()') + def getMovedTarget(self): + """Return a Page object for the target this Page was moved to. + + DEPRECATED: Use Page.moved_target(). + + If this page was not moved, it will raise a NoPage exception. + This method also works if the source was already deleted. + + @rtype: pywikibot.Page + @raises NoPage: this page was not moved + """ + try: + return self.moved_target() + except pywikibot.NoMoveTarget: + raise pywikibot.NoPage(self) + + def moved_target(self): + """Return a Page object for the target this Page was moved to. + + If this page was not moved, it will raise a PageNotFound exception. + This method also works if the source was already deleted. + + @rtype: pywikibot.Page + @raises NoMoveTarget: this page was not moved + """ + gen = iter(self.site.logevents(logtype='move', page=self, total=1)) + try: + lastmove = next(gen) + except StopIteration: + raise pywikibot.NoMoveTarget(self) + else: + return lastmove.target_page + @deprecated_args(getText='content', reverseOrder='reverse') def revisions(self, reverse=False, step=None, total=None, content=False, rollback=False): diff --git a/tests/logentry_tests.py b/tests/logentry_tests.py index ea17f2e..55fbcb5 100644 --- a/tests/logentry_tests.py +++ b/tests/logentry_tests.py @@ -39,15 +39,18 @@ sites = { 'tewp': { 'family': 'wikipedia', - 'code': 'test' + 'code': 'test', + 'target': 'Main Page on wheels', }, 'dewp': { 'family': 'wikipedia', - 'code': 'de' + 'code': 'de', + 'target': 'Hauptseite', }, 'old': { 'family': 'lyricwiki', - 'code': 'en' + 'code': 'en', + 'target': None, } }
@@ -184,6 +187,30 @@ self.assertIsInstance(logentry.previous_id, int) self.assertIsInstance(logentry.auto, bool)
+ def test_moved_target(self, key): + """Test moved_target method.""" + # main page was moved around + mainpage = self.get_mainpage(self.site) + if self.sites[key]['target'] is not None: + target = mainpage.moved_target() + self.assertIsInstance(target, pywikibot.Page) + self.assertEqual(target.title(), + self.sites[key]['target']) + # main page was moved back again, we test it. + self.assertEqual(mainpage, target.moved_target()) + + def test_moved_target_fail_old(self): + """Test moved_target method failing on older wiki.""" + site = self.get_site('old') + with self.assertRaises(pywikibot.NoMoveTarget): + self.get_mainpage(site).moved_target() + + def test_moved_target_fail_de(self): + """Test moved_target method failing on de-wiki.""" + page = pywikibot.Page(self.get_site('dewp'), 'Main Page') + with self.assertRaises(pywikibot.NoMoveTarget): + page.moved_target() +
class TestDeprecatedMethods(TestLogentriesBase, DeprecationTestCase):
@@ -194,6 +221,12 @@ logentry = self._get_logentry('move') self.assertIsInstance(logentry.new_ns(), int) self.assertEqual(logentry.new_title(), logentry.target_page) + + self._do_test_warning_filename = False + self.assertDeprecation('pywikibot.logentries.MoveEntry.new_ns is ' + 'deprecated, use target_ns.id instead.') + self.assertDeprecation('pywikibot.logentries.MoveEntry.new_title is ' + 'deprecated, use target_page instead.')
def test_LogEntry_title(self, key): """Test title and page return the same instance.""" @@ -208,6 +241,35 @@ self.assertDeprecation() self._reset_messages()
+ def test_getMovedTarget(self, key): + """Test getMovedTarget method.""" + # main page was moved around + if self.sites[key]['target'] is None: + raise unittest.SkipTest('No moved target') + mainpage = self.get_mainpage(self.site) + target = mainpage.getMovedTarget() + self.assertIsInstance(target, pywikibot.Page) + self.assertEqual(target.title(), + self.sites[key]['target']) + # main page was moved back again, we test it. + self.assertEqual(mainpage, target.getMovedTarget()) + + self._do_test_warning_filename = False + self.assertDeprecation('pywikibot.page.BasePage.getMovedTarget is ' + 'deprecated, use moved_target() instead.') + + def test_moved_target_fail_old(self): + """Test getMovedTarget method failing on older wiki.""" + site = self.get_site('old') + with self.assertRaises(pywikibot.NoPage): + self.get_mainpage(site).getMovedTarget() + + def test_moved_target_fail_de(self): + """Test getMovedTarget method failing on de-wiki.""" + page = pywikibot.Page(self.get_site('dewp'), 'Main Page') + with self.assertRaises(pywikibot.NoPage): + page.getMovedTarget() +
if __name__ == '__main__': try:
pywikibot-commits@lists.wikimedia.org