jenkins-bot submitted this change.

View Change


Approvals: Xqt: Looks good to me, approved jenkins-bot: Verified
[bugfix] Upcast page types in pagegenerators.RecentChangesPageGenerator()

Yield Page, User, FilePage or Category objects with
RecentChangesPageGenerator. This also solves T340450 because a User
object can be created for anonymous users but creating a Page object
would fail.

Bug: T340450
Change-Id: Ibe6a64cb1ce67ac685747144231ad5d8ee501ea2
---
M pywikibot/pagegenerators/_generators.py
1 file changed, 49 insertions(+), 9 deletions(-)

diff --git a/pywikibot/pagegenerators/_generators.py b/pywikibot/pagegenerators/_generators.py
index 3d781a9..335f435 100644
--- a/pywikibot/pagegenerators/_generators.py
+++ b/pywikibot/pagegenerators/_generators.py
@@ -22,6 +22,7 @@
from pywikibot.backports import (
Callable,
Dict,
+ Generator,
Iterable,
Iterator,
List,
@@ -30,6 +31,7 @@
)
from pywikibot.comms import http
from pywikibot.exceptions import APIError, ServerError
+from pywikibot.site import Namespace
from pywikibot.tools import deprecated
from pywikibot.tools.collections import GeneratorWrapper
from pywikibot.tools.itertools import filter_unique, itergroup
@@ -169,26 +171,49 @@
total=total, returndict=True))


-def RecentChangesPageGenerator(site: OPT_SITE_TYPE = None,
- _filter_unique: Optional[Callable[
- [Iterable['pywikibot.page.Page']],
- Iterable['pywikibot.page.Page']]] = None,
- **kwargs: Any
- ) -> Iterable['pywikibot.page.Page']:
+def RecentChangesPageGenerator(
+ site: OPT_SITE_TYPE = None,
+ _filter_unique: Optional[Callable[[Iterable['pywikibot.Page']],
+ Iterable['pywikibot.Page']]] = None,
+ **kwargs: Any
+) -> Generator['pywikibot.Page', None, None]:
"""
Generate pages that are in the recent changes list, including duplicates.

- For parameters refer pywikibot.site.recentchanges
+ For keyword parameters refer :meth:`APISite.recentchanges()
+ <pywikibot.site._generators.GeneratorsMixin.recentchanges>`.
+
+ .. versionchanged:: 8.2
+ The YieldType depends on namespace. It can be
+ :class:`pywikibot.Page`, :class:`pywikibot.User`,
+ :class:`pywikibot.FilePage` or :class:`pywikibot.Category`.

:param site: Site for generator results.
"""
+ def upcast(gen):
+ """Upcast pywikibot.Page type."""
+ for rc in gen:
+ # The title in a log entry may have been suppressed
+ if rc['type'] == 'log' and 'title' not in rc:
+ continue
+
+ ns = rc['ns']
+ if ns == Namespace.USER:
+ pageclass = pywikibot.User
+ elif ns == Namespace.FILE:
+ pageclass = pywikibot.FilePage
+ elif ns == Namespace.CATEGORY:
+ pageclass = pywikibot.Category
+ else:
+ pageclass = pywikibot.Page
+ yield pageclass(site, rc['title'])
+
if site is None:
site = pywikibot.Site()

gen = site.recentchanges(**kwargs)
gen.request['rcprop'] = 'title'
- gen = (pywikibot.Page(site, rc['title'])
- for rc in gen if rc['type'] != 'log' or 'title' in rc)
+ gen = upcast(gen)

if _filter_unique:
gen = _filter_unique(gen)

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

Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: Ibe6a64cb1ce67ac685747144231ad5d8ee501ea2
Gerrit-Change-Number: 933138
Gerrit-PatchSet: 1
Gerrit-Owner: Xqt <info@gno.de>
Gerrit-Reviewer: Xqt <info@gno.de>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged