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

Change subject: [bugfix] Compare full URLs in APISite.interwiki_prefix()
......................................................................

[bugfix] Compare full URLs in APISite.interwiki_prefix()

The interwiki map of a site holds full URLs with a $1 placeholder like
"https://en.wikipedia.org/wiki/$1";, but interwiki_prefix() looked them
up with the relative paths of BaseSite._interwiki_urls() like
"/wiki/{}". These never match, so the method raised KeyError for every
site.

Build the full URL with base_url() and the $1 placeholder before the
lookup. _interwiki_urls() is unchanged because other callers need the
relative paths.

Bug: T312699
Change-Id: I4e53091c6056b91e0654187952d71040fac6e110
---
M pywikibot/site/_apisite.py
M tests/interwikimap_tests.py
2 files changed, 71 insertions(+), 1 deletion(-)

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




diff --git a/pywikibot/site/_apisite.py b/pywikibot/site/_apisite.py
index c4027b2..48553c7 100644
--- a/pywikibot/site/_apisite.py
+++ b/pywikibot/site/_apisite.py
@@ -182,7 +182,9 @@
         """
         assert site is not None, 'Site must not be None'
         prefixes = set()
-        for url in site._interwiki_urls():
+        for path in site._interwiki_urls():
+            # the interwiki map holds full URLs with a $1 placeholder
+            url = site.base_url(path.replace('{}', '$1'))
             prefixes.update(self._interwikimap.get_by_url(url))
         if not prefixes:
             raise KeyError(
diff --git a/tests/interwikimap_tests.py b/tests/interwikimap_tests.py
index 118243e..0219e47 100755
--- a/tests/interwikimap_tests.py
+++ b/tests/interwikimap_tests.py
@@ -152,6 +152,74 @@
                 self.iw_map[prefix]


+class TestInterwikiPrefix(TestCase):
+
+    """Test interwiki_prefix method with a dry interwiki map."""
+
+    dry = True
+
+    sites = {
+        'dewp': {
+            'family': 'wikipedia',
+            'code': 'de',
+        },
+        'enwp': {
+            'family': 'wikipedia',
+            'code': 'en',
+        },
+        'frwp': {
+            'family': 'wikipedia',
+            'code': 'fr',
+        },
+        'commons': {
+            'family': 'commons',
+            'code': 'commons',
+        },
+    }
+
+    interwikimap = [
+        {'prefix': 'c', 'local': True,
+         'url': 'https://commons.wikimedia.org/wiki/$1'},
+        {'prefix': 'de', 'local': True, 'localinterwiki': True,
+         'url': 'https://de.wikipedia.org/wiki/$1'},
+        {'prefix': 'en', 'local': True,
+         'url': 'https://en.wikipedia.org/wiki/$1'},
+        {'prefix': 'w', 'local': True,
+         'url': 'https://en.wikipedia.org/wiki/$1'},
+        {'prefix': 'wikipedia', 'local': True,
+         'url': 'https://en.wikipedia.org/wiki/$1'},
+        {'prefix': 'wikipediawikipedia', 'local': True,
+         'url': 'https://en.wikipedia.org/wiki/Wikipedia:$1'},
+    ]
+
+    @classmethod
+    def setUpClass(cls) -> None:
+        """Set up the article paths and the interwiki map."""
+        super().setUpClass()
+        for key in cls.sites:
+            cls.get_site(key).siteinfo._cache['articlepath'] = (
+                '/wiki/$1', True)
+        cls.get_site('dewp').siteinfo._cache['interwikimap'] = (
+            cls.interwikimap, True)
+
+    def test_interwiki_prefix(self) -> None:
+        """Test interwiki_prefix method."""
+        site = self.get_site('dewp')
+        for key, prefixes in (('dewp', ['de']),
+                              ('enwp', ['w', 'en', 'wikipedia']),
+                              ('commons', ['c'])):
+            with self.subTest(site=key):
+                self.assertEqual(
+                    site.interwiki_prefix(self.get_site(key)), prefixes)
+
+    def test_no_interwiki_prefix(self) -> None:
+        """Test interwiki_prefix method without a prefix to the site."""
+        site = self.get_site('dewp')
+        with self.assertRaisesRegex(
+                KeyError, "There is no interwiki prefix to 'wikipedia:fr'"):
+            site.interwiki_prefix(self.get_site('frwp'))
+
+
 if __name__ == '__main__':
     with suppress(SystemExit):
         unittest.main()

--
To view, visit 
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1358406?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: I4e53091c6056b91e0654187952d71040fac6e110
Gerrit-Change-Number: 1358406
Gerrit-PatchSet: 2
Gerrit-Owner: AkashKumar7902 <[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