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 @@

 &params;

-.. 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]

Reply via email to