John Vandenberg has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/237610

Change subject: Fix ItemPage.exists() for redirects
......................................................................

Fix ItemPage.exists() for redirects

Change-Id: I9d49992cb27dd30faabd31328be9bb28f96d8c55
---
M pywikibot/page.py
M tests/edit_failure_tests.py
M tests/wikibase_edit_tests.py
M tests/wikibase_tests.py
4 files changed, 139 insertions(+), 8 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/pywikibot/core 
refs/changes/10/237610/1

diff --git a/pywikibot/page.py b/pywikibot/page.py
index 2ba2b0c..f48b3eb 100644
--- a/pywikibot/page.py
+++ b/pywikibot/page.py
@@ -52,6 +52,7 @@
 from pywikibot.exceptions import (
     AutoblockUser,
     _EmailUserError,
+    Error,
     NotEmailableError,
     SiteDefinitionError,
     UserRightsError,
@@ -3252,7 +3253,7 @@
         """
         if not hasattr(self, '_content'):
             try:
-                self.get()
+                self.get(get_redirect=True)
                 return True
             except pywikibot.NoPage:
                 return False
@@ -3712,11 +3713,21 @@
                              redirect, do not raise an exception.
         @type get_redirect: bool
         @param args: values of props
+
+        @raises IsRedirectPage: item is a redirect and get_redirect was False
         """
         data = super(ItemPage, self).get(force=force, *args, **kwargs)
 
-        if self.isRedirectPage() and not get_redirect:
-            raise pywikibot.IsRedirectPage(self)
+        if self.isRedirectPage():
+            if get_redirect:
+                # Undo the attribute set in the super method.
+                delattr(self, 'labels')
+                delattr(self, 'descriptions')
+                delattr(self, 'aliases')
+                delattr(self, 'claims')
+                return
+            else:
+                raise pywikibot.IsRedirectPage(self)
 
         # sitelinks
         self.sitelinks = {}
@@ -3749,8 +3760,13 @@
         @param diffto: JSON containing claim data
         @type diffto: dict
 
-        @return: dict
+        @rtype: dict
+        @raises NotImplementedError: item is a redirect
         """
+        if self.isRedirectPage():
+            raise NotImplementedError(
+                'ItemPage.toJSON does not support redirects')
+
         data = super(ItemPage, self).toJSON(diffto=diffto)
 
         self._diff_to('sitelinks', 'site', 'title', diffto, data)
diff --git a/tests/edit_failure_tests.py b/tests/edit_failure_tests.py
index 112d98c..5b0bfbc 100644
--- a/tests/edit_failure_tests.py
+++ b/tests/edit_failure_tests.py
@@ -8,7 +8,7 @@
 These tests use special code 'write = -1' for edit failures.
 """
 #
-# (C) Pywikibot team, 2014
+# (C) Pywikibot team, 2014-2015
 #
 # Distributed under the terms of the MIT license.
 #
@@ -17,7 +17,9 @@
 __version__ = '$Id$'
 
 import pywikibot
-from pywikibot import (
+
+from pywikibot.data.api import APIError
+from pywikibot.exceptions import (
     Error,
     NoPage,
     LockedPage,
@@ -26,6 +28,8 @@
     NoCreateError,
     PageCreatedConflict,
 )
+from pywikibot.page import Claim, ItemPage
+
 from tests.aspects import unittest, TestCase, WikibaseTestCase
 
 
@@ -130,6 +134,48 @@
         self.assertRaises(pywikibot.PageNotSaved, item.save)
 
 
+class TestWikibaseRedirectFailure(WikibaseTestCase):
+
+    """Run general wikibase write tests."""
+
+    family = 'wikidata'
+    code = 'test'
+
+    user = True
+    write = True
+
+    def test_non_empty_create_redirect(self):
+        """Test converting a non-empty item into a redirect."""
+        target = ItemPage(self.repo, 'Q1593')
+
+        redirect = ItemPage(self.repo, 'Q1592')
+        self.assertFalse(target.isRedirectPage())
+
+        self.assertRaisesRegexp(
+            APIError,
+            'The redirect can only be created on top of an empty entity',
+            redirect.set_redirect_target,
+            target, save=True, force=True)
+
+    def test_add_claim_using_redirect(self):
+        """Test using a redirect in addClaim."""
+        item = ItemPage(self.repo, 'Q68')
+        item.get()
+        if 'P115' in item.claims:
+            item.removeClaims(item.claims['P115'])
+
+        target = ItemPage(self.repo, 'Q1603')
+        self.assertTrue(target.isRedirectPage())
+
+        claim = Claim(self.repo, 'P115', datatype='wikibase-item')
+        claim.setTarget(target)
+
+        self.assertRaisesRegexp(
+            APIError,
+            'modification-failed: [[Q1603|Q1603]] not found',
+            item.addClaim, claim)
+
+
 if __name__ == '__main__':
     try:
         unittest.main()
diff --git a/tests/wikibase_edit_tests.py b/tests/wikibase_edit_tests.py
index 27c22b6..3e667dc 100644
--- a/tests/wikibase_edit_tests.py
+++ b/tests/wikibase_edit_tests.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8  -*-
 """Tests for editing Wikibase items."""
 #
-# (C) Pywikibot team, 2014
+# (C) Pywikibot team, 2014-2015
 #
 # Distributed under the terms of the MIT license.
 #
@@ -11,7 +11,10 @@
 #
 
 import time
+
 import pywikibot
+
+from pywikibot.page import ItemPage
 
 from tests.aspects import unittest, WikibaseTestCase
 
@@ -155,6 +158,46 @@
         item.editEntity(data)
 
 
+class TestWikibaseWriteRedirect(WikibaseTestCase):
+
+    """Run general wikibase write tests."""
+
+    family = 'wikidata'
+    code = 'test'
+
+    user = True
+    write = True
+
+    def test_create_redirect(self):
+        """Test converting a non-empty item into a redirect."""
+        target = ItemPage(self.repo, 'Q1593')
+
+        redirect = ItemPage(self.repo)
+        redirect.editEntity({})
+
+        redirect.set_redirect_target(target, save=True, force=True)
+
+    @unittest.expectedFailure  # T112243
+    def test_edit_redirect(self):
+        """Test Itempage.editEntity with a redirect."""
+        target = ItemPage(self.repo, 'Q1593')
+
+        # create an empty item
+        redirect = ItemPage(self.repo)
+        redirect.editEntity({})
+
+        new_id = redirect.id
+
+        # make it a redirect
+        redirect.set_redirect_target(target, save=True, force=True)
+
+        # try to convert it back to a normal item
+        # fails here
+        redirect.editEntity({})
+        self.assertFalse(redirect.isRedirectPage())
+        self.assertEqual(redirect.id, new_id)
+
+
 if __name__ == '__main__':
     try:
         unittest.main()
diff --git a/tests/wikibase_tests.py b/tests/wikibase_tests.py
index 5f37a54..c785647 100644
--- a/tests/wikibase_tests.py
+++ b/tests/wikibase_tests.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8  -*-
 """Tests for the Wikidata parts of the page module."""
 #
-# (C) Pywikibot team, 2008-2014
+# (C) Pywikibot team, 2013-2015
 #
 # Distributed under the terms of the MIT license.
 #
@@ -512,12 +512,16 @@
     """Test redirect and non-redirect items."""
 
     def test_normal_item(self):
+        """Test ItemPage redirect methods with non-redirect."""
         wikidata = self.get_repo()
         item = pywikibot.ItemPage(wikidata, 'Q1')
         self.assertFalse(item.isRedirectPage())
         self.assertRaises(pywikibot.IsNotRedirectPage, item.getRedirectTarget)
+        item.get(get_redirect=True)
+        self.assertEqual(item.id, 'Q1')
 
     def test_redirect_item(self):
+        """Test Itempage redirect methods with non-redirect."""
         wikidata = self.get_repo()
         item = pywikibot.ItemPage(wikidata, 'Q10008448')
         item.get(get_redirect=True)
@@ -525,6 +529,28 @@
         self.assertTrue(item.isRedirectPage())
         self.assertEqual(item.getRedirectTarget(), target)
         self.assertIsInstance(item.getRedirectTarget(), pywikibot.ItemPage)
+
+    def test_redirect_item_base_methods(self):
+        """Test BasePage methods with a redirect ItemPage."""
+        item = ItemPage(self.repo, 'Q10008448')
+        self.assertFalse(hasattr(item, 'claims'))
+        self.assertTrue(item.exists())
+        self.assertFalse(hasattr(item, 'claims'))
+        self.assertTrue(item.isRedirectPage())
+        self.assertFalse(hasattr(item, 'claims'))
+        self.assertEqual(item.id, 'Q10008448')
+        self.assertFalse(hasattr(item, 'claims'))
+        self.assertEqual(item.getID(), 'Q10008448')
+        self.assertFalse(hasattr(item, 'claims'))
+        self.assertEqual(item.id, 'Q10008448')
+        self.assertFalse(hasattr(item, 'claims'))
+        self.assertIsInstance(item.latest_revision_id, int)
+        self.assertFalse(hasattr(item, 'claims'))
+        self.assertEqual(item.id, 'Q10008448')
+        self.assertFalse(hasattr(item, 'claims'))
+        self.assertRaises(NotImplementedError, item.toJSON)
+
+        # get with default get_redirect=False
         self.assertRaises(pywikibot.IsRedirectPage, item.get)
 
 

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I9d49992cb27dd30faabd31328be9bb28f96d8c55
Gerrit-PatchSet: 1
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: John Vandenberg <jay...@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to