jenkins-bot has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/933138 )
Change subject: [bugfix] Upcast page types in pagegenerators.RecentChangesPageGenerator() ......................................................................
[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(-)
Approvals: Xqt: Looks good to me, approved jenkins-bot: Verified
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)