jenkins-bot has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1022453?usp=email )
Change subject: [bugfix] circumvent problems with unique and prefix parameters (T359425) ......................................................................
[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(-)
Approvals: jenkins-bot: Verified Xqt: Looks good to me, approved
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):
pywikibot-commits@lists.wikimedia.org