jenkins-bot has submitted this change. ( 
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1178033?usp=email )

Change subject: [IMPR] Add `strict` parameter to unconnected_pages()
......................................................................

[IMPR] Add `strict` parameter to unconnected_pages()

Introduce a new `strict` flag to verify that pages from
Special:UnconnectedPages are still unconnected before yielding.

- Pass `total` directly to querypage() when strict=False to limit API calls
- Stop iteration when `total` is reached
- Return nothing if total<=0
- Updated docstring with description of strict and versionchanged note
- Add a new `strict` flag to UnconnectedPageGenerator
- Update pagegenerators_tests.TestUnconnectedPageGenerator
- Update site_generators_tests.TestUnconnectedPages
- Deprecation warning for UnconnectedPageGenerator was withdrawn

Bug: T401699
Change-Id: Ib88712dfd88d92d585dce4739c3696d1e9e39ae1
---
M HISTORY.rst
M pywikibot/pagegenerators/_generators.py
M pywikibot/site/_extensions.py
M tests/pagegenerators_tests.py
M tests/site_generators_tests.py
5 files changed, 53 insertions(+), 38 deletions(-)

Approvals:
  jenkins-bot: Verified
  Xqt: Looks good to me, approved




diff --git a/HISTORY.rst b/HISTORY.rst
index 0559415..9a4b6dc 100644
--- a/HISTORY.rst
+++ b/HISTORY.rst
@@ -2000,7 +2000,7 @@
 * UploadBot got a filename prefix parameter (:phab:`T170123`)
 * cosmetic_changes is able to remove empty sections (:phab:`T140570`)
 * Pywikibot is following :pep:`396` versioning
-* pagegenerators AllpagesPageGenerator, CombinedPageGenerator, 
UnconnectedPageGenerator are deprecated
+* CombinedPageGenerator is deprecated, itertools.chain can be used instead
 * Some DayPageGenerator parameters has been renamed
 * unicodedata2, httpbin and Flask dependency was removed
   (:phab:`T102461`, :phab:`T108068`, :phab:`T178864`, :phab:`T193383`)
diff --git a/pywikibot/pagegenerators/_generators.py 
b/pywikibot/pagegenerators/_generators.py
index 4e04b8c..c74a972 100644
--- a/pywikibot/pagegenerators/_generators.py
+++ b/pywikibot/pagegenerators/_generators.py
@@ -282,18 +282,26 @@

 def UnconnectedPageGenerator(
     site: BaseSite | None = None,
-    total: int | None = None
+    total: int | None = None,
+    *,
+    strict: bool = False
 ) -> Iterable[pywikibot.page.Page]:
     """Iterate Page objects for all unconnected pages to a Wikibase repository.
 
-    :param total: Maximum number of pages to retrieve in total
+    .. versionchanged::
+       The *strict* parameter was added.
+
     :param site: Site for generator results.
+    :param total: Maximum number of pages to retrieve in total
+    :param strict: If ``True``, verify that each page still has no data
+        item before yielding it.
+    :raises ValueError: The given site does not have Wikibase repository
     """
     if site is None:
         site = pywikibot.Site()
     if not site.data_repository():
         raise ValueError('The given site does not have Wikibase repository.')
-    return site.unconnected_pages(total=total)
+    return site.unconnected_pages(total=total, strict=strict)


 def FileLinksGenerator(
diff --git a/pywikibot/site/_extensions.py b/pywikibot/site/_extensions.py
index e30f130..66d342b 100644
--- a/pywikibot/site/_extensions.py
+++ b/pywikibot/site/_extensions.py
@@ -9,6 +9,7 @@
 from typing import TYPE_CHECKING, Protocol

 import pywikibot
+from pywikibot.backports import Generator
 from pywikibot.data import api
 from pywikibot.echo import Notification
 from pywikibot.exceptions import (
@@ -285,14 +286,41 @@
     """APISite mixin for WikibaseClient extension."""

     @need_extension('WikibaseClient')
-    def unconnected_pages(self, total=None):
+    def unconnected_pages(
+        self,
+        total: int | None = None,
+        *,
+        strict: bool = False
+    ) -> Generator[pywikibot.Page, None, None]:
         """Yield Page objects from Special:UnconnectedPages.

         .. warning:: The retrieved pages may be connected in meantime.
+           To avoid this, use *strict* parameter to check.

-        :param total: number of pages to return
+        .. versionchanged::
+           The *strict* parameter was added.
+
+        :param total: Maximum number of pages to return, or ``None`` for
+            all.
+        :param strict: If ``True``, verify that each page still has no
+            data item before yielding it.
         """
-        return self.querypage('UnconnectedPages', total)
+        if total <= 0:
+            return
+
+        if not strict:
+            return self.querypage('UnconnectedPages', total)
+
+        count = 0
+        for page in self.querypage('UnconnectedPages'):
+            if total is not None and count >= total:
+                break
+
+            try:
+                page.data_item()
+            except NoPageError:
+                yield page
+                count += 1


 class LinterMixin:
diff --git a/tests/pagegenerators_tests.py b/tests/pagegenerators_tests.py
index b639797..9a651d7 100755
--- a/tests/pagegenerators_tests.py
+++ b/tests/pagegenerators_tests.py
@@ -27,7 +27,7 @@
     PreloadingGenerator,
     WikibaseItemFilterPageGenerator,
 )
-from tests import join_data_path, unittest_print
+from tests import join_data_path
 from tests.aspects import (
     DefaultSiteTestCase,
     DeprecationTestCase,
@@ -1687,26 +1687,16 @@
         if not site:
             self.skipTest('Site is not using a Wikibase repository')

-        pages = list(pagegenerators.UnconnectedPageGenerator(self.site, 3))
+        pages = list(
+            pagegenerators.UnconnectedPageGenerator(self.site, 3, strict=True))
         self.assertLessEqual(len(pages), 3)

         pattern = (fr'Page \[\[({site.sitename}:|{site.code}:)-1\]\]'
                    r" doesn't exist\.")
-        found = []
         for page in pages:
-            with self.subTest(page=page):
-                try:
-                    page.data_item()
-                except NoPageError as e:
-                    self.assertRegex(str(e), pattern)
-                else:
-                    found.append(page)
-        if found:
-            unittest_print('connection found for ',
-                           ', '.join(str(p) for p in found))
-
-        # assume that we have at least one unconnected page
-        self.assertLess(len(found), 3)
+            with self.subTest(page=page), self.assertRaisesRegex(NoPageError,
+                                                                 pattern):
+                page.data_item()

     def test_unconnected_without_repo(self) -> None:
         """Test that it raises a ValueError on sites without repository."""
diff --git a/tests/site_generators_tests.py b/tests/site_generators_tests.py
index 1deb37b..7fbf716 100755
--- a/tests/site_generators_tests.py
+++ b/tests/site_generators_tests.py
@@ -689,26 +689,15 @@
         if not site:
             self.skipTest('Site is not using a Wikibase repository')

-        pages = list(self.site.unconnected_pages(total=3))
+        pages = list(self.site.unconnected_pages(total=3, strict=True))
         self.assertLessEqual(len(pages), 3)

         pattern = (fr'Page \[\[({site.sitename}:|{site.code}:)-1\]\]'
                    r" doesn't exist\.")
-        found = []
         for page in pages:
-            with self.subTest(page=page):
-                try:
-                    page.data_item()
-                except NoPageError as e:
-                    self.assertRegex(str(e), pattern)
-                else:
-                    found.append(page)
-        if found:
-            unittest_print('connection found for ',
-                           ', '.join(str(p) for p in found))
-
-        # assume that we have at least one unconnected page
-        self.assertLess(len(found), 3)
+            with self.subTest(page=page), self.assertRaisesRegex(NoPageError,
+                                                                 pattern):
+                page.data_item()


 class TestSiteGeneratorsUsers(DefaultSiteTestCase):

--
To view, visit 
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1178033?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: Ib88712dfd88d92d585dce4739c3696d1e9e39ae1
Gerrit-Change-Number: 1178033
Gerrit-PatchSet: 2
Gerrit-Owner: Xqt <[email protected]>
Gerrit-Reviewer: Xqt <[email protected]>
Gerrit-Reviewer: jenkins-bot
_______________________________________________
Pywikibot-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to