jenkins-bot submitted this change.

View Change

Approvals: Xqt: Looks good to me, approved jenkins-bot: Verified
[cleanup] Drop startsort/endsort parameter for site.categorymembers method

- startsort/endsort parameter is deprecated since MW 1.24 and their
usage is confusing. startsort/endsort were replaced by
starthexsortkey/endhexsortkey which are required as hexlified byte
strings but they aren't supported by Pywikibot. Since MW 1.23 is the
only supported MW version which has startsort/endsort parameters for
categorymembers, I guess we can drop that support of
startsort/endsort parameter now. The human readable corresponding
parameters are startprefix/endprefix which is supported already.
- update the corresponding Page.articles() method accordingly

Bug: T74101
Change-Id: I6fa0bd11a68dad3ff0ac6a1c0136b6bad68eacd3
---
M pywikibot/page/__init__.py
M pywikibot/site/_apisite.py
2 files changed, 46 insertions(+), 70 deletions(-)

diff --git a/pywikibot/page/__init__.py b/pywikibot/page/__init__.py
index 4cd0970..c4fbe38 100644
--- a/pywikibot/page/__init__.py
+++ b/pywikibot/page/__init__.py
@@ -2594,7 +2594,7 @@
if total == 0:
return

- @deprecated_args(startFrom='startprefix')
+ @deprecated_args(startFrom='startprefix', startsort=None, endsort=None)
def articles(self,
recurse: Union[int, bool] = False,
total: Optional[int] = None,
@@ -2603,11 +2603,8 @@
sortby: Optional[str] = None,
reverse: bool = False,
starttime=None, endtime=None,
- startsort: Optional[str] = None,
- endsort: Optional[str] = None,
startprefix: Optional[str] = None,
- endprefix: Optional[str] = None,
- ):
+ endprefix: Optional[str] = None):
"""
Yield all articles in the current category.

@@ -2635,32 +2632,24 @@
@param endtime: if provided, only generate pages added before this
time; not valid unless sortby="timestamp"
@type endtime: pywikibot.Timestamp
- @param startsort: if provided, only generate pages that have a
- sortkey >= startsort; not valid if sortby="timestamp"
- (Deprecated in MW 1.24)
- @param endsort: if provided, only generate pages that have a
- sortkey <= endsort; not valid if sortby="timestamp"
- (Deprecated in MW 1.24)
@param startprefix: if provided, only generate pages >= this title
- lexically; not valid if sortby="timestamp"; overrides "startsort"
+ lexically; not valid if sortby="timestamp"
@param endprefix: if provided, only generate pages < this title
- lexically; not valid if sortby="timestamp"; overrides "endsort"
+ lexically; not valid if sortby="timestamp"
@rtype: typing.Iterable[pywikibot.Page]
"""
seen = set()
for member in self.site.categorymembers(self,
namespaces=namespaces,
total=total,
- content=content, sortby=sortby,
+ content=content,
+ sortby=sortby,
reverse=reverse,
starttime=starttime,
endtime=endtime,
- startsort=startsort,
- endsort=endsort,
startprefix=startprefix,
endprefix=endprefix,
- member_type=['page', 'file']
- ):
+ member_type=['page', 'file']):
if recurse:
seen.add(hash(member))
yield member
@@ -2668,22 +2657,21 @@
total -= 1
if total == 0:
return
+
if recurse:
if not isinstance(recurse, bool) and recurse:
- recurse = recurse - 1
+ recurse -= 1
for subcat in self.subcategories():
- for article in subcat.articles(recurse, total=total,
+ for article in subcat.articles(recurse=recurse,
+ total=total,
content=content,
namespaces=namespaces,
sortby=sortby,
reverse=reverse,
starttime=starttime,
endtime=endtime,
- startsort=startsort,
- endsort=endsort,
startprefix=startprefix,
- endprefix=endprefix,
- ):
+ endprefix=endprefix):
hash_value = hash(article)
if hash_value in seen:
continue
diff --git a/pywikibot/site/_apisite.py b/pywikibot/site/_apisite.py
index 8e142c2..a821623 100644
--- a/pywikibot/site/_apisite.py
+++ b/pywikibot/site/_apisite.py
@@ -1888,12 +1888,18 @@
titles=tltitle, namespaces=namespaces,
total=total, g_content=content)

- @deprecated_args(step=None)
- def categorymembers(self, category, *, namespaces=None, sortby=None,
- reverse=False, starttime=None, endtime=None,
- startsort=None, endsort=None, total=None,
- content=False, member_type=None,
- startprefix=None, endprefix=None):
+ @deprecated_args(step=None, startsort=None, endsort=None)
+ def categorymembers(self, category, *,
+ namespaces=None,
+ sortby: Optional[str] = None,
+ reverse: bool = False,
+ starttime=None,
+ endtime=None,
+ total: Optional[int] = None,
+ content: bool = False,
+ member_type=None,
+ startprefix: Optional[str] = None,
+ endprefix: Optional[str] = None):
"""Iterate members of specified category.

@see: U{https://www.mediawiki.org/wiki/API:Categorymembers}
@@ -1909,7 +1915,6 @@
valid values are "sortkey" (default, results ordered by category
sort key) or "timestamp" (results ordered by time page was
added to the category)
- @type sortby: str
@param reverse: if True, generate results in reverse order
(default False)
@param starttime: if provided, only generate pages added after this
@@ -1917,23 +1922,12 @@
@type starttime: pywikibot.Timestamp
@param endtime: if provided, only generate pages added before this
time; not valid unless sortby="timestamp"
- @param startsort: if provided, only generate pages that have a
- sortkey >= startsort; not valid if sortby="timestamp"
- (Deprecated in MW 1.24)
- @type startsort: str
- @param endsort: if provided, only generate pages that have a
- sortkey <= endsort; not valid if sortby="timestamp"
- (Deprecated in MW 1.24)
- @type endsort: str
@param startprefix: if provided, only generate pages >= this title
- lexically; not valid if sortby="timestamp"; overrides "startsort"
- @type startprefix: str
+ lexically; not valid if sortby="timestamp"
@param endprefix: if provided, only generate pages < this title
- lexically; not valid if sortby="timestamp"; overrides "endsort"
- @type endprefix: str
+ lexically; not valid if sortby="timestamp"
@param content: if True, load the current content of each iterated page
(default False)
- @type content: bool
@param member_type: member type; if member_type includes 'page' and is
used in conjunction with sortby="timestamp", the API may limit
results to only pages in the first 50 namespaces.
@@ -1945,27 +1939,28 @@
type such as NoneType or bool
"""
if category.namespace() != 14:
- raise Error(
- "categorymembers: non-Category page '%s' specified"
- % category.title())
+ raise Error('categorymembers: non-Category page {!r} specified'
+ .format(category))
+
cmtitle = category.title(with_section=False).encode(self.encoding())
- cmargs = {'type_arg': 'categorymembers', 'gcmtitle': cmtitle,
- 'gcmprop': 'ids|title|sortkey'}
+ cmargs = {
+ 'type_arg': 'categorymembers',
+ 'gcmtitle': cmtitle,
+ 'gcmprop': 'ids|title|sortkey'
+ }
+
if sortby in ['sortkey', 'timestamp']:
cmargs['gcmsort'] = sortby
elif sortby:
- raise ValueError(
- "categorymembers: invalid sortby value '%s'"
- % sortby)
+ raise ValueError('categorymembers: invalid sortby value {!r}'
+ .format(sortby))
+
if starttime and endtime and starttime > endtime:
raise ValueError(
'categorymembers: starttime must be before endtime')
if startprefix and endprefix and startprefix > endprefix:
raise ValueError(
'categorymembers: startprefix must be less than endprefix')
- elif startsort and endsort and startsort > endsort:
- raise ValueError(
- 'categorymembers: startsort must be less than endsort')

if isinstance(member_type, str):
member_type = {member_type}
@@ -1984,8 +1979,8 @@
if namespaces:
if excluded_namespaces.intersection(namespaces):
raise ValueError(
- 'incompatible namespaces %r and member_type %r'
- % (namespaces, member_type))
+ 'incompatible namespaces {!r} and member_type {!r}'
+ .format(namespaces, member_type))
# All excluded namespaces are not present in `namespaces`.
else:
# If the number of namespaces is greater than permitted by
@@ -2011,39 +2006,32 @@
cmargs['gcmdir'] = 'desc'
# API wants start/end params in opposite order if using descending
# sort; we take care of this reversal for the user
- (starttime, endtime) = (endtime, starttime)
- (startsort, endsort) = (endsort, startsort)
- (startprefix, endprefix) = (endprefix, startprefix)
+ starttime, endtime = endtime, starttime
+ startprefix, endprefix = endprefix, startprefix
+
if starttime and sortby == 'timestamp':
cmargs['gcmstart'] = starttime
elif starttime:
raise ValueError('categorymembers: '
"invalid combination of 'sortby' and 'starttime'")
+
if endtime and sortby == 'timestamp':
cmargs['gcmend'] = endtime
elif endtime:
raise ValueError('categorymembers: '
"invalid combination of 'sortby' and 'endtime'")
+
if startprefix and sortby != 'timestamp':
cmargs['gcmstartsortkeyprefix'] = startprefix
elif startprefix:
raise ValueError('categorymembers: invalid combination of '
"'sortby' and 'startprefix'")
- elif startsort and sortby != 'timestamp':
- cmargs['gcmstartsortkey'] = startsort
- elif startsort:
- raise ValueError('categorymembers: '
- "invalid combination of 'sortby' and 'startsort'")
+
if endprefix and sortby != 'timestamp':
cmargs['gcmendsortkeyprefix'] = endprefix
elif endprefix:
raise ValueError('categorymembers: '
"invalid combination of 'sortby' and 'endprefix'")
- elif endsort and sortby != 'timestamp':
- cmargs['gcmendsortkey'] = endsort
- elif endsort:
- raise ValueError('categorymembers: '
- "invalid combination of 'sortby' and 'endsort'")

return self._generator(api.PageGenerator, namespaces=namespaces,
total=total, g_content=content, **cmargs)

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

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