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]