jenkins-bot has submitted this change and it was merged.
Change subject: Preload connected ItemPage for Page objects ......................................................................
Preload connected ItemPage for Page objects
DataSite.preloaditems currently require an ItemPage. It should accept Page object for an item, or Page objects for client pages connected to an item.
Change-Id: Ibca36593333ed99117aded2a0da3eaf7218a44c6 --- M pywikibot/site.py M tests/aspects.py M tests/site_tests.py 3 files changed, 92 insertions(+), 17 deletions(-)
Approvals: XZise: Looks good to me, approved jenkins-bot: Verified
diff --git a/pywikibot/site.py b/pywikibot/site.py index 71f04c1..936c0bd 100644 --- a/pywikibot/site.py +++ b/pywikibot/site.py @@ -4775,16 +4775,26 @@ Note that pages will be iterated in a different order than in the underlying pagelist.
- @param pagelist: an iterable that yields ItemPage objects + @param pagelist: an iterable that yields either WikibasePage objects, + or Page objects linked to an ItemPage. @param groupsize: how many pages to query at a time @type groupsize: int """ for sublist in itergroup(pagelist, groupsize): req = {'ids': [], 'titles': [], 'sites': []} for p in sublist: - ident = p._defined_by() - for key in ident: - req[key].append(ident[key]) + if isinstance(p, pywikibot.page.WikibasePage): + ident = p._defined_by() + for key in ident: + req[key].append(ident[key]) + else: + assert(p.site.has_data_repository) + if (p.site == p.site.data_repository() and + p.namespace() == p.data_repository.item_namespace): + req['ids'].append(p.title(withNamespace=False)) + else: + req['sites'].append(p.site.dbName()) + req['titles'].append(p._link._text)
req = api.Request(site=self, action='wbgetentities', **req) data = req.submit() diff --git a/tests/aspects.py b/tests/aspects.py index 08783fc..be86bd9 100644 --- a/tests/aspects.py +++ b/tests/aspects.py @@ -599,6 +599,14 @@ % (cls.__name__, site['site']))
+class DefaultWikibaseClientTestCase(WikibaseClientTestCase, + DefaultSiteTestCase): + + """Run tests against any site connected to a Wikibase.""" + + pass + + class WikidataTestCase(WikibaseTestCase):
"""Test cases use Wikidata.""" @@ -609,6 +617,25 @@ cached = True
+class DefaultWikidataClientTestCase(DefaultWikibaseClientTestCase): + + """Run tests against any site connected to Wikidata.""" + + @classmethod + def setUpClass(cls): + """ + Set up the test class. + + Require the data repository is wikidata.org. + """ + super(WikibaseClientTestCase, cls).setUpClass() + + if str(cls.get_repo()) != 'wikidata:wikidata': + raise unittest.SkipTest( + u'%s: %s is not connected to Wikidata.' + % (cls.__name__, cls.get_site())) + + class PwbTestCase(TestCase):
"""Test cases use pwb.py to invoke scripts.""" diff --git a/tests/site_tests.py b/tests/site_tests.py index 6b8295f..49d0310 100644 --- a/tests/site_tests.py +++ b/tests/site_tests.py @@ -19,6 +19,8 @@ unittest, TestCase, DefaultSiteTestCase, WikimediaDefaultSiteTestCase, + WikidataTestCase, + DefaultWikidataClientTestCase, )
if sys.version_info[0] > 2: @@ -266,19 +268,6 @@ count += 1 if count >= 5: break - - def testItemPreload(self): - """Test that ItemPage preloading works.""" - mysite = self.get_site() - if not mysite.has_data_repository: - raise unittest.SkipTest('%s does not have a data repository' - % mysite) - - datasite = mysite.data_repository() - - items = [pywikibot.ItemPage(datasite, 'q' + str(num)) for num in range(1, 6)] - for page in datasite.preloaditempages(items): - self.assertTrue(hasattr(page, '_content'))
def testLinkMethods(self): """Test site methods for getting links to and from a page.""" @@ -1405,6 +1394,55 @@ self.assertTrue(site.is_uploaddisabled())
+class TestDataSitePreloading(WikidataTestCase): + + """Test DataSite.preloaditempages for repo pages.""" + + def test_item(self): + """Test that ItemPage preloading works for Item objects.""" + datasite = self.get_repo() + items = [pywikibot.ItemPage(datasite, 'q' + str(num)) + for num in range(1, 6)] + + seen = [] + for item in datasite.preloaditempages(items): + self.assertIsInstance(item, pywikibot.ItemPage) + self.assertTrue(hasattr(item, '_content')) + self.assertNotIn(item, seen) + seen.append(item) + self.assertEqual(len(seen), 5) + + def test_item_as_page(self): + """Test that ItemPage preloading works for Page objects.""" + site = self.get_site() + datasite = self.get_repo() + pages = [pywikibot.Page(site, 'q' + str(num)) + for num in range(1, 6)] + + seen = [] + for item in datasite.preloaditempages(pages): + self.assertIsInstance(item, pywikibot.ItemPage) + self.assertTrue(hasattr(item, '_content')) + self.assertNotIn(item, seen) + seen.append(item) + self.assertEqual(len(seen), 5) + + +class TestDataSiteClientPreloading(DefaultWikidataClientTestCase): + + """Test DataSite.preloaditempages for client pages.""" + + def test_non_item(self): + """Test that ItemPage preloading works with Page generator.""" + mainpage = self.get_mainpage() + datasite = self.get_repo() + + item = next(datasite.preloaditempages([mainpage])) + self.assertIsInstance(item, pywikibot.ItemPage) + self.assertTrue(hasattr(item, '_content')) + self.assertEqual(item.id, 'Q5296') + + if __name__ == '__main__': try: unittest.main()