jenkins-bot submitted this change.

View Change


Approvals: Xqt: Looks good to me, approved jenkins-bot: Verified
[FEAT] Add PagePile PageGenerator

Retrieve a list of pages using a PagePile id. This is better than using the
`-url` option as it does not require to know the site beforehand.

Signed-off-by: Strainu <github@strainu.ro>
Bug: T353086
Change-Id: Ia9f6f977b6a9816f877bdc72065141bfb819b6e6
---
M pywikibot/pagegenerators/_generators.py
M pywikibot/pagegenerators/__init__.py
M pywikibot/pagegenerators/_factory.py
M tests/pagegenerators_tests.py
4 files changed, 98 insertions(+), 0 deletions(-)

diff --git a/pywikibot/pagegenerators/__init__.py b/pywikibot/pagegenerators/__init__.py
index df0adea..35f2b87 100644
--- a/pywikibot/pagegenerators/__init__.py
+++ b/pywikibot/pagegenerators/__init__.py
@@ -60,6 +60,7 @@
NewpagesPageGenerator,
PagesFromPageidGenerator,
PagesFromTitlesGenerator,
+ PagePilePageGenerator,
PetScanPageGenerator,
PrefixingPageGenerator,
RandomPageGenerator,
@@ -130,6 +131,7 @@
'page_with_property_generator',
'PagesFromPageidGenerator',
'PagesFromTitlesGenerator',
+ 'PagePilePageGenerator',
'PetScanPageGenerator',
'PrefixingPageGenerator',
'RandomPageGenerator',
@@ -397,6 +399,8 @@
"-pageid:'pageid1|pageid2|..'"
and supplied multiple times for multiple pages.

+-pagepile Work on a PagePile. Argument is the pile id (an integer)
+
-linter Work on pages that contain lint errors. Extension Linter
must be available on the site.
-linter select all categories.
diff --git a/pywikibot/pagegenerators/_factory.py b/pywikibot/pagegenerators/_factory.py
index 73f8385..47cb2ec 100644
--- a/pywikibot/pagegenerators/_factory.py
+++ b/pywikibot/pagegenerators/_factory.py
@@ -48,6 +48,7 @@
MySQLPageGenerator,
NewimagesPageGenerator,
NewpagesPageGenerator,
+ PagePilePageGenerator,
PrefixingPageGenerator,
RecentChangesPageGenerator,
SubCategoriesPageGenerator,
@@ -925,6 +926,14 @@
self.redirectfilter = strtobool(value)
return True

+ def _handle_pagepile(self, value: str) -> HANDLER_RETURN_TYPE:
+ """Handle `-pagepile` argument."""
+ if not value.isnumeric():
+ raise ValueError(
+ f'PagePile id must be an int. I was given "{value}"')
+ pile = PagePilePageGenerator(int(value))
+ return pile.generator
+
def handle_args(self, args: Iterable[str]) -> list[str]:
"""Handle command line arguments and return the rest as a list.

diff --git a/pywikibot/pagegenerators/_generators.py b/pywikibot/pagegenerators/_generators.py
index 316972f..8129c20 100644
--- a/pywikibot/pagegenerators/_generators.py
+++ b/pywikibot/pagegenerators/_generators.py
@@ -1231,3 +1231,59 @@
page = pywikibot.Page(self.site, raw_page['title'],
int(raw_page['namespace']))
yield page
+
+
+class PagePilePageGenerator(GeneratorWrapper):
+ """Queries PagePile to generate pages.
+
+ .. seealso:: https://pagepile.toolforge.org/
+ .. versionadded:: 9.0
+ subclassed from :class:`tools.collections.GeneratorWrapper`
+ """
+
+ def __init__(self, id: int):
+ """Initializer.
+
+ :param id: The PagePile id to query
+ """
+ self.opts = self.buildQuery(id)
+
+ def buildQuery(self, id: int):
+ """Get the querystring options to query PagePile.
+
+ :param id: int
+ :return: Dictionary of querystring parameters to use in the query
+ """
+ query = {
+ 'id': id,
+ 'action': 'get_data',
+ 'format': 'json',
+ 'doit': ''
+ }
+
+ return query
+
+ def query(self) -> Iterator[dict[str, Any]]:
+ """Query PagePile.
+
+ :raises ServerError: Either ReadTimeout or server status error
+ :raises APIError: error response from petscan
+ """
+ url = 'https://pagepile.toolforge.org/api.php'
+
+ req = http.fetch(url, params=self.opts)
+
+ data = req.json()
+ if 'error' in data:
+ raise APIError('PagePile', data['error'], **self.opts)
+
+ self.site = pywikibot.site.APISite.fromDBName(data['wiki'])
+ raw_pages = data['pages']
+ yield from raw_pages
+
+ @property
+ def generator(self) -> Iterator['pywikibot.page.Page']:
+ """Yield results from :meth:`query`."""
+ for raw_page in self.query():
+ page = pywikibot.Page(self.site, raw_page)
+ yield page
diff --git a/tests/pagegenerators_tests.py b/tests/pagegenerators_tests.py
index 1b43633..811605f 100755
--- a/tests/pagegenerators_tests.py
+++ b/tests/pagegenerators_tests.py
@@ -398,6 +398,21 @@
site=site)


+class PagePilePageGeneratorTestCase(TestCase):
+
+ """Test PagePilePageGenerator."""
+
+ family = 'wikipedia'
+ code = 'ro'
+
+ def test_PagePilePageGenerator(self):
+ """Test PagePilePageGenerator."""
+ gen = pagegenerators.PagePilePageGenerator(id=53158)
+ pages = list(gen.generator)
+ self.assertLength(pages, 215)
+ self.assertEqual(gen.site, pywikibot.Site('wikipedia:ro'))
+
+
class TestRepeatingGenerator(RecentChangesTestCase):

"""Test RepeatingGenerator."""

To view, visit change 981631. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: Ia9f6f977b6a9816f877bdc72065141bfb819b6e6
Gerrit-Change-Number: 981631
Gerrit-PatchSet: 9
Gerrit-Owner: Strainu <wiki@strainu.ro>
Gerrit-Reviewer: Xqt <info@gno.de>
Gerrit-Reviewer: jenkins-bot
Gerrit-CC: Mpaa <mpaa.wiki@gmail.com>
Gerrit-MessageType: merged