jenkins-bot has submitted this change. ( 
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/981631 )

Change subject: [FEAT] Add PagePile PageGenerator
......................................................................

[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 <[email protected]>
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(-)

Approvals:
  Xqt: Looks good to me, approved
  jenkins-bot: Verified




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 https://gerrit.wikimedia.org/r/c/pywikibot/core/+/981631
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.wikimedia.org/r/settings

Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: Ia9f6f977b6a9816f877bdc72065141bfb819b6e6
Gerrit-Change-Number: 981631
Gerrit-PatchSet: 9
Gerrit-Owner: Strainu <[email protected]>
Gerrit-Reviewer: Xqt <[email protected]>
Gerrit-Reviewer: jenkins-bot
Gerrit-CC: Mpaa <[email protected]>
Gerrit-MessageType: merged
_______________________________________________
Pywikibot-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to