jenkins-bot has submitted this change. (
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1305628?usp=email )
Change subject: [bugfix] Ensure GeneratorFactory.gens is not empty if a
generator is specified
......................................................................
[bugfix] Ensure GeneratorFactory.gens is not empty if a generator is specified
GeneratorFactory.gens is sometimes used to verify that a generator is
specified via pagegenerators options, even this looks like a bad idea.
- Add None to GeneratorFactory.gens with -start or -until if no
generator specified when the option is called.
- Replace None (if present) with the allpages generator; otherwise add
the generator to gens list.
- Add tests to verify that -start adds a placeholder to
GeneratorFactory.gens. and that the placeholder is replaced later.
- Update documentation.
Bug: T430093
Change-Id: Ic4b428cfefcacfa70c0cd9b956f865d195b7e882
---
M pywikibot/pagegenerators/__init__.py
M pywikibot/pagegenerators/_factory.py
M tests/pagegenerators_tests.py
3 files changed, 47 insertions(+), 8 deletions(-)
Approvals:
Xqt: Looks good to me, approved
jenkins-bot: Verified
Zaidusyy: Looks good to me, but someone else must approve
diff --git a/pywikibot/pagegenerators/__init__.py
b/pywikibot/pagegenerators/__init__.py
index d866048..91385f9 100644
--- a/pywikibot/pagegenerators/__init__.py
+++ b/pywikibot/pagegenerators/__init__.py
@@ -16,8 +16,6 @@
¶ms;
-.. version-changed:: 11.3
- The :kbd:`-until` option was added.
"""
from __future__ import annotations
@@ -321,7 +319,9 @@
-until Specifies the page title at which the robot should
stop alphabetically through all pages on the home wiki.
- Can only be used together with -start.
+ .. version-added:: 11.3
+ .. version-changed:: 11.4.1
+ May be used without ``-start``.
-prefixindex Work on pages commencing with a common prefix.
diff --git a/pywikibot/pagegenerators/_factory.py
b/pywikibot/pagegenerators/_factory.py
index db1802a..158c28a 100644
--- a/pywikibot/pagegenerators/_factory.py
+++ b/pywikibot/pagegenerators/_factory.py
@@ -101,6 +101,7 @@
:param disabled_options: Disable these given options and let
them be handled by scripts options handler
"""
+ #: List of generators provided by :meth:`getCombinedGenerator`.
self.gens: list[Iterable[pywikibot.page.BasePage]] = []
self._namespaces: list[str] | frozenset[Namespace] = []
self.limit: int | None = None
@@ -206,6 +207,9 @@
preload: bool = False) -> OPT_GENERATOR_TYPE:
"""Return the combination of all accumulated generators.
+ Most generators are selected by :ref:`Generator Options` and
+ stored in :attr:`gens` list.
+
Only call this after all arguments have been parsed.
.. version-changed:: 7.3
@@ -215,10 +219,12 @@
pages are yieded in a :func:`roundrobin
<tools.itertools.roundrobin_generators>` way.
.. version-changed:: 11.3
- If *preload* optiom is set, the preloading generators
+ If *preload* option is set, the preloading generators
:func:`pagegenerators.PreloadingGenerator` or
:func:`pagegenerators.DequePreloadingGenerator` are called
with the *quiet* option.
+ The generator specified by ``-start`` and ``-until`` is
+ evaluated lazily by this method.
:param gen: Another generator to be combined with
:param preload: Preload pages using PreloadingGenerator
@@ -228,8 +234,12 @@
self.gens.insert(0, gen)
# Handle allpages where args are given by -start and -until
- if self._allpages_args is not None and 'start' in self._allpages_args:
- self.gens.append(self.site.allpages(**self._allpages_args))
+ if self._allpages_args is not None:
+ apgen = self.site.allpages(**self._allpages_args)
+ if self.gens[0] is None:
+ self.gens[0] = apgen
+ else:
+ self.gens.append(apgen)
for i, gen_item in enumerate(self.gens):
if self.namespaces:
@@ -782,13 +792,21 @@
"""Handle `-start` argument."""
if not value:
value = '!'
+
firstpagelink = pywikibot.Link(value, self.site)
self._allpages_args = self._allpages_args or {}
self._allpages_args.update(
start=firstpagelink.title,
- namespace=firstpagelink.namespace,
filterredir=False,
)
+ self._allpages_args.setdefault('namespace', firstpagelink.namespace)
+
+ if not self.gens:
+ # Placeholder to indicate that a generator was specified.
+ # The actual generator will be inserted later by
+ # getCombinedGenerator().
+ self.gens.append(None)
+
return True
def _handle_until(self, value: str) -> Literal[True]:
@@ -797,7 +815,16 @@
value = '!'
lastpagelink = pywikibot.Link(value, self.site)
self._allpages_args = self._allpages_args or {}
- self._allpages_args.update(until=lastpagelink.title)
+ self._allpages_args.update(
+ until=lastpagelink.title,
+ filterredir=False,
+ )
+ self._allpages_args.setdefault('namespace', lastpagelink.namespace)
+
+ if not self.gens:
+ # See comment in _handle_start.
+ self.gens.append(None)
+
return True
def _handle_prefixindex(self, value: str) -> HANDLER_GEN_TYPE:
@@ -1018,6 +1045,15 @@
.. version-added:: 6.0
renamed from ``handleArg``
+ .. version-changed:: 11.3
+ The ``-start`` parameter no longer appends a generator to
+ :attr:`gens`. The generator is added lazily in
+ :meth:`getCombinedGenerator`
+ .. version-changed:: 11.4.1
+ The ``-start`` or ``-until`` parameters appends a placeholder
+ to :attr:`gens`, which indicates that a generator was
+ specified.
+
:param arg: Pywikibot argument consisting of -name:value
:return: True if the argument supplied was recognised by the factory
diff --git a/tests/pagegenerators_tests.py b/tests/pagegenerators_tests.py
index 3dce8b4..1e852d8 100755
--- a/tests/pagegenerators_tests.py
+++ b/tests/pagegenerators_tests.py
@@ -959,9 +959,12 @@
"""Test allpages generator."""
gf = pagegenerators.GeneratorFactory()
self.assertTrue(gf.handle_arg('-start:!'))
+ self.assertIsNotEmpty(gf.gens)
+ self.assertIsNone(gf.gens[0])
gf.handle_arg('-limit:10')
gen = gf.getCombinedGenerator()
self.assertIsNotNone(gen)
+ self.assertIsNotNone(gf.gens[0])
pages = set(gen)
self.assertLessEqual(len(pages), 10)
for page in pages:
--
To view, visit
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1305628?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.wikimedia.org/r/settings?usp=email
Gerrit-MessageType: merged
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: Ic4b428cfefcacfa70c0cd9b956f865d195b7e882
Gerrit-Change-Number: 1305628
Gerrit-PatchSet: 5
Gerrit-Owner: Xqt <[email protected]>
Gerrit-Reviewer: JAn DudÃk <[email protected]>
Gerrit-Reviewer: Xqt <[email protected]>
Gerrit-Reviewer: Zaidusyy <[email protected]>
Gerrit-Reviewer: jenkins-bot
_______________________________________________
Pywikibot-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]