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()
--
To view, visit
https://gerrit.wikimedia.org/r/161420
To unsubscribe, visit
https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: Ibca36593333ed99117aded2a0da3eaf7218a44c6
Gerrit-PatchSet: 4
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: John Vandenberg <jayvdb(a)gmail.com>
Gerrit-Reviewer: John Vandenberg <jayvdb(a)gmail.com>
Gerrit-Reviewer: Ladsgroup <ladsgroup(a)gmail.com>
Gerrit-Reviewer: Merlijn van Deen <valhallasw(a)arctus.nl>
Gerrit-Reviewer: Mpaa <mpaa.wiki(a)gmail.com>
Gerrit-Reviewer: XZise <CommodoreFabianus(a)gmx.de>
Gerrit-Reviewer: jenkins-bot <>