Xqt has submitted this change. ( 
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1325933?usp=email )

Change subject: interwiki: Safely filter foreign-family links
......................................................................

interwiki: Safely filter foreign-family links

The replacement path removed entries from its working dictionary while
iterating over it. This raised RuntimeError when a foreign-family link
needed filtering.

Iterate over a stable key snapshot and cover the case with an offline
regression test.

Change-Id: If0ab5f12d29d8e0324d09d572e927a5832717196
---
M scripts/interwiki.py
M tests/interwikibot_tests.py
2 files changed, 32 insertions(+), 2 deletions(-)

Approvals:
  Xqt: Verified; Looks good to me, approved




diff --git a/scripts/interwiki.py b/scripts/interwiki.py
index 81995b9..80e0670 100755
--- a/scripts/interwiki.py
+++ b/scripts/interwiki.py
@@ -1662,7 +1662,7 @@
         del new[page.site]
         # Do not add interwiki links to foreign families that page.site() does
         # not forward to
-        for stmp in new:
+        for stmp in list(new):
             if stmp.family != page.site.family \
                and stmp.family.name != page.site.family.interwiki_forward:
                 del new[stmp]
diff --git a/tests/interwikibot_tests.py b/tests/interwikibot_tests.py
index 6d978f4..03ab602 100755
--- a/tests/interwikibot_tests.py
+++ b/tests/interwikibot_tests.py
@@ -9,10 +9,11 @@

 import unittest
 from contextlib import suppress
+from unittest.mock import Mock

 import pywikibot
 from scripts import interwiki
-from tests.aspects import DrySite, PatchingTestCase
+from tests.aspects import DrySite, PatchingTestCase, TestCase


 class TestIwConfig(PatchingTestCase):
@@ -63,6 +64,35 @@
         self.assertLength(iwc.skip, 5)

 
+class TestReplaceLinks(TestCase):
+
+    """Tests for replacing interwiki links."""
+
+    dry = True
+    sites = {
+        'local': {'family': 'wikipedia', 'code': 'en'},
+        'foreign': {'family': 'commons', 'code': 'commons'},
+    }
+
+    def test_foreign_family_link(self) -> None:
+        """Test removing a link to a non-forwarded family."""
+        local_site = self.get_site('local')
+        page = pywikibot.Page(local_site, 'Test page')
+        page._langlinks = set()
+        foreign_page = pywikibot.Page(
+            self.get_site('foreign'), 'File:Test.jpg')
+        pages = {page.site: page, foreign_page.site: foreign_page}
+
+        subject = interwiki.Subject.__new__(interwiki.Subject)
+        subject.conf = interwiki.InterwikiBotConfig()
+        subject.conf.quiet = True
+        subject._fetch_text = Mock(return_value='Test page content')
+
+        self.assertFalse(subject.replaceLinks(page, pages))
+        self.assertEqual(pages,
+                         {page.site: page, foreign_page.site: foreign_page})
+
+
 if __name__ == '__main__':
     with suppress(SystemExit):
         unittest.main()

--
To view, visit 
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1325933?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: If0ab5f12d29d8e0324d09d572e927a5832717196
Gerrit-Change-Number: 1325933
Gerrit-PatchSet: 1
Gerrit-Owner: Mahveotm <[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