jenkins-bot submitted this change.

View Change

Approvals: Xqt: Looks good to me, approved jenkins-bot: Verified
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(-)

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)



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

Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: I62cf16579f2972f8158bb87ed6d7ccd9919e2b8a
Gerrit-Change-Number: 626731
Gerrit-PatchSet: 2
Gerrit-Owner: Matěj Suchánek <matejsuchanek97@gmail.com>
Gerrit-Reviewer: Xqt <info@gno.de>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged