jenkins-bot submitted this change.

View Change

Approvals: jenkins-bot: Verified Xqt: Looks good to me, approved
[bugfix] circumvent problems with unique and prefix parameters (T359425)

Bug: T359427
Change-Id: Iee4c51f934efc446b493c5c98afe1d0f103e38a5
---
M pywikibot/site/_generators.py
M tests/site_generators_tests.py
2 files changed, 24 insertions(+), 11 deletions(-)

diff --git a/pywikibot/site/_generators.py b/pywikibot/site/_generators.py
index a1be9e6..846e626 100644
--- a/pywikibot/site/_generators.py
+++ b/pywikibot/site/_generators.py
@@ -975,7 +975,7 @@

def alllinks(
self,
- start: str = '!',
+ start: str = '',
prefix: str = '',
namespace: SingleNamespaceType = 0,
unique: bool = False,
@@ -1013,20 +1013,30 @@
algen = self._generator(api.ListGenerator, type_arg='alllinks',
namespaces=namespace, alfrom=start,
total=total)
- if prefix:
- algen.request['alprefix'] = prefix
if fromids:
algen.request['alprop'] = 'title|ids'
- if not unique:
- pass
- elif self.mw_version < '1.43':
- algen.request['alunique'] = True
+
+ # circumvent problems with unique and prefix due to T359425 and T359427
+ if self.mw_version < '1.43':
+ if prefix:
+ algen.request['alprefix'] = prefix
+ prefix = '' # don't break the loop later
+ if start:
+ algen.request['alstart'] = start
+ algen.request['alunique'] = unique
else:
- # unique filter for mw >= 1.43, use (title, ns) as key
- # See: T359425, T359427
- algen = filter_unique(algen, key=lambda x: (x['title'], x['ns']))
+ if prefix:
+ algen.request['alstart'] = prefix
+ elif start:
+ algen.request['alstart'] = start
+ if unique:
+ algen = filter_unique(
+ algen, key=lambda link: (link['title'], link['ns']))
+
for link in algen:
p = pywikibot.Page(self, link['title'], link['ns'])
+ if prefix and p.title() > prefix: # T359425, T359427
+ break
if fromids:
p._fromid = link['fromid'] # type: ignore[attr-defined]
yield p
diff --git a/tests/site_generators_tests.py b/tests/site_generators_tests.py
index 5ca8748..3fae8e7 100755
--- a/tests/site_generators_tests.py
+++ b/tests/site_generators_tests.py
@@ -358,7 +358,10 @@
for page in mysite.alllinks(prefix='Fix', total=5):
self.assertIsInstance(page, pywikibot.Page)
self.assertEqual(page.namespace(), 0)
- self.assertTrue(page.title().startswith('Fix'))
+ self.assertTrue(
+ page.title().startswith('Fix'),
+ msg=f"{page.title()} does not start with 'Fix'"
+ )

with self.subTest(msg='Test namespace parameter'):
for page in mysite.alllinks(namespace=1, total=5):

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

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