jenkins-bot has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/626731 )
Change subject: Always return raw generators from APISite methods, not objects ......................................................................
Always return raw generators from APISite methods, not objects
Callers should treat these as iterators, they shouldn't be able to customize their parameters (doing so in runtime could naturally produce weird results or be unstable in other way). Customization should happen prior to executing them, e.g. via kwargs.
Change-Id: I62cf16579f2972f8158bb87ed6d7ccd9919e2b8a --- M pywikibot/site/__init__.py M tests/pagegenerators_tests.py 2 files changed, 46 insertions(+), 48 deletions(-)
Approvals: Xqt: Looks good to me, approved jenkins-bot: Verified
diff --git a/pywikibot/site/__init__.py b/pywikibot/site/__init__.py index 8a4200e..eadc2a4 100644 --- a/pywikibot/site/__init__.py +++ b/pywikibot/site/__init__.py @@ -3440,8 +3440,9 @@ namespaces=namespaces, content=content ) - return itertools.chain(*genlist.values()) - return blgen + yield from itertools.chain(*genlist.values()) + else: + yield from blgen
@deprecated_args(step=None, filterRedirects='filter_redirects') def page_embeddedin(self, page, *, filter_redirects=None, namespaces=None, @@ -3471,9 +3472,9 @@ if filter_redirects is not None: eiargs['geifilterredir'] = ('redirects' if filter_redirects else 'nonredirects') - return self._generator(api.PageGenerator, type_arg='embeddedin', - namespaces=namespaces, total=total, - g_content=content, **eiargs) + yield from self._generator(api.PageGenerator, type_arg='embeddedin', + namespaces=namespaces, total=total, + g_content=content, **eiargs)
@deprecated_args( step=None, followRedirects='follow_redirects', @@ -3544,10 +3545,10 @@ else: pltitle = page.title(with_section=False).encode(self.encoding()) plargs['titles'] = pltitle - return self._generator(api.PageGenerator, type_arg='links', - namespaces=namespaces, total=total, - g_content=content, redirects=follow_redirects, - **plargs) + yield from self._generator( + api.PageGenerator, type_arg='links', namespaces=namespaces, + total=total, g_content=content, redirects=follow_redirects, + **plargs)
# Sortkey doesn't work with generator @deprecated_args(withSortKey=None, step=None) @@ -3566,9 +3567,8 @@ else: clargs['titles'] = page.title( with_section=False).encode(self.encoding()) - return self._generator(api.PageGenerator, - type_arg='categories', total=total, - g_content=content, **clargs) + yield from self._generator(api.PageGenerator, type_arg='categories', + total=total, g_content=content, **clargs)
@deprecated_args(step=None) def pageimages(self, page, *, total=None, content=False): @@ -3582,9 +3582,9 @@
""" imtitle = page.title(with_section=False).encode(self.encoding()) - return self._generator(api.PageGenerator, type_arg='images', - titles=imtitle, total=total, - g_content=content) + yield from self._generator(api.PageGenerator, type_arg='images', + titles=imtitle, total=total, + g_content=content)
@deprecated_args(step=None) def pagetemplates(self, page, *, namespaces=None, total=None, @@ -3605,9 +3605,9 @@ type such as NoneType or bool """ tltitle = page.title(with_section=False).encode(self.encoding()) - return self._generator(api.PageGenerator, type_arg='templates', - titles=tltitle, namespaces=namespaces, - total=total, g_content=content) + yield from self._generator(api.PageGenerator, type_arg='templates', + titles=tltitle, namespaces=namespaces, + total=total, g_content=content)
@deprecated_args(step=None) def categorymembers(self, category, *, namespaces=None, sortby=None, @@ -3776,8 +3776,8 @@ raise ValueError('categorymembers: ' "invalid combination of 'sortby' and 'endsort'")
- return self._generator(api.PageGenerator, namespaces=namespaces, - total=total, g_content=content, **cmargs) + yield from self._generator(api.PageGenerator, namespaces=namespaces, + total=total, g_content=content, **cmargs)
@deprecated_args(getText='content', sysop=None) @remove_last_args(['rollback']) @@ -4060,7 +4060,7 @@ apgen.request['gapprlevel'] = protect_level if reverse: apgen.request['gapdir'] = 'descending' - return apgen + yield from apgen
@deprecated_args(step=None) def alllinks(self, start='!', prefix='', namespace=0, unique=False, @@ -4127,7 +4127,7 @@ acgen.request['gacprefix'] = prefix if reverse: acgen.request['gacdir'] = 'descending' - return acgen + yield from acgen
def isBot(self, username): """Return True is username is a bot user.""" @@ -4175,7 +4175,7 @@ augen.request['auprefix'] = prefix if group: augen.request['augroup'] = group - return augen + yield from augen
@deprecated_args(step=None) def allimages(self, start='!', prefix='', minsize=None, maxsize=None, @@ -4214,7 +4214,7 @@ aigen.request['gaisha1'] = sha1 if sha1base36: aigen.request['gaisha1base36'] = sha1base36 - return aigen + yield from aigen
@need_version('1.17') @deprecated_args(limit='total') # ignore falimit setting @@ -4247,7 +4247,7 @@ fagen.request['fa' + k] = v if reverse: fagen.request['fadir'] = 'descending' - return fagen + yield from fagen
@deprecated_args(step=None) def blocks(self, starttime=None, endtime=None, reverse=False, @@ -4308,7 +4308,7 @@ bkgen.request['bkusers'] = users elif iprange: bkgen.request['bkip'] = iprange - return bkgen + yield from bkgen
@deprecated_args(step=None) def exturlusage(self, url=None, protocol=None, namespaces=None, @@ -4344,10 +4344,10 @@ # with any URL. if url == '*': url = None - return self._generator(api.PageGenerator, type_arg='exturlusage', - geuquery=url, geuprotocol=protocol, - namespaces=namespaces, - total=total, g_content=content) + yield from self._generator(api.PageGenerator, type_arg='exturlusage', + geuquery=url, geuprotocol=protocol, + namespaces=namespaces, total=total, + g_content=content)
@deprecated_args(step=None) def imageusage(self, image, namespaces=None, filterredir=None, @@ -4375,9 +4375,9 @@ if filterredir is not None: iuargs['giufilterredir'] = ('redirects' if filterredir else 'nonredirects') - return self._generator(api.PageGenerator, type_arg='imageusage', - namespaces=namespaces, - total=total, g_content=content, **iuargs) + yield from self._generator(api.PageGenerator, type_arg='imageusage', + namespaces=namespaces, total=total, + g_content=content, **iuargs)
@property def logtypes(self): @@ -4446,7 +4446,7 @@ # Supported in version 1.16+; earlier sites will cause APIError legen.request['letag'] = tag
- return legen + yield from legen
@deprecated_args(returndict=None, nobots=None, rcshow=None, rcprop=None, rctype='changetype', revision=None, repeat=None, @@ -4550,7 +4550,7 @@ if excludeuser: rcgen.request['rcexcludeuser'] = excludeuser rcgen.request['rctag'] = tag - return rcgen + yield from rcgen
@deprecated_args(number='total', step=None, key='searchstring', getredirects='get_redirects') @@ -4609,7 +4609,7 @@ total=total, g_content=content) if self.mw_version < '1.23': srgen.request['gsrredirects'] = get_redirects - return srgen + yield from srgen
@deprecated_args(step=None, showMinor='minor') def usercontribs(self, user=None, userprefix=None, start=None, end=None, @@ -4667,7 +4667,7 @@ option_set = api.OptionSet(self, 'usercontribs', 'show') option_set['minor'] = minor ucgen.request['ucshow'] = option_set - return ucgen + yield from ucgen
@deprecated_args(step=None, showMinor='minor', showAnon='anon', showBot='bot') @@ -4715,7 +4715,7 @@ filters = {'minor': minor, 'bot': bot, 'anon': anon} wlgen.request['wlshow'] = api.OptionSet(self, 'watchlist', 'show', filters) - return wlgen + yield from wlgen
@deprecated_args(step=None, get_text='content', page='titles', limit='total') @@ -4852,7 +4852,7 @@ usgen = api.ListGenerator( 'users', site=self, parameters={ 'ususers': usernames, 'usprop': usprop}) - return usgen + yield from usgen
@deprecated_args(step=None) def randompages(self, total=None, namespaces=None, @@ -4894,9 +4894,9 @@ params['grnredirect'] = redirects == 'redirects' else: params['grnfilterredir'] = redirects - return self._generator(api.PageGenerator, type_arg='random', - namespaces=namespaces, total=total, - g_content=content, **params) + yield from self._generator(api.PageGenerator, type_arg='random', + namespaces=namespaces, total=total, + g_content=content, **params)
# Catalog of editpage error codes, for use in generating messages. # The block at the bottom are page related errors. @@ -6435,9 +6435,8 @@ assert special_page in param['type'], ( '{0} not in {1}'.format(special_page, param['type']))
- return self._generator(api.PageGenerator, - type_arg='querypage', gqppage=special_page, - total=total) + yield from self._generator(api.PageGenerator, type_arg='querypage', + gqppage=special_page, total=total)
@deprecated_args(number='total', step=None, repeat=None) def longpages(self, total=None): @@ -7201,7 +7200,7 @@ gen = api.PageGenerator(site=self, generator='watchlistraw', expiry=expiry) gen.set_maximum_items(total) - return gen + yield from gen
@need_extension('UrlShortener') def create_short_link(self, url): @@ -8099,4 +8098,4 @@ gen = api.APIGenerator('wbsearchentities', data_name='search', site=self, parameters=parameters) gen.set_maximum_items(total) - return gen + yield from gen diff --git a/tests/pagegenerators_tests.py b/tests/pagegenerators_tests.py index ffbe993..e97ea01 100755 --- a/tests/pagegenerators_tests.py +++ b/tests/pagegenerators_tests.py @@ -1663,7 +1663,6 @@ protocol='https', site=self.site, total=1) - self.assertIsInstance(gen, pywikibot.data.api.PageGenerator) self.assertEqual(len(list(gen)), 1)
pywikibot-commits@lists.wikimedia.org