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:

-- 
To view, visit https://gerrit.wikimedia.org/r/213856
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Iad97e7571fb5a1cdb16ec8ef72b26b4ea5be677c
Gerrit-PatchSet: 10
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: Xqt <[email protected]>
Gerrit-Reviewer: John Vandenberg <[email protected]>
Gerrit-Reviewer: Ladsgroup <[email protected]>
Gerrit-Reviewer: Merlijn van Deen <[email protected]>
Gerrit-Reviewer: Mpaa <[email protected]>
Gerrit-Reviewer: XZise <[email protected]>
Gerrit-Reviewer: Xqt <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
Pywikibot-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/pywikibot-commits

Reply via email to