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