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 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(-)
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."""