jenkins-bot submitted this change.

View Change


Approvals: MisterSynergy: Looks good to me, but someone else must approve Xqt: Looks good to me, approved jenkins-bot: Verified
[bugfix] Extract code and family from dbname in APISite.fromDBName

API:sitematrix does not return any site.code but site.lang instead.
Creating a Site object will fail for any site where lang is different
from code. Therefore extract site code and family from dbname directly.
(Alternatively it could be extracted from url)

Related tests were added.

Bug: T345036
Change-Id: Ic2e5c4d384fef8519bac6c13511c1a0d9479a103
---
M pywikibot/site/_apisite.py
M tests/site_tests.py
2 files changed, 45 insertions(+), 17 deletions(-)

diff --git a/pywikibot/site/_apisite.py b/pywikibot/site/_apisite.py
index f8097cc..ea9ba8c 100644
--- a/pywikibot/site/_apisite.py
+++ b/pywikibot/site/_apisite.py
@@ -184,14 +184,15 @@
"""
return self._interwikimap[prefix].local

- @classmethod
+ @staticmethod
def fromDBName( # noqa: N802
- cls,
dbname: str,
site: Optional[BaseSite] = None
) -> BaseSite:
- """
- Create a site from a database name using the sitematrix.
+ """Create a site from a database name using the sitematrix.
+
+ .. versionchanged:: 8.4
+ changed from classmethod to staticmethod.

:param dbname: database name
:param site: Site to load sitematrix from. (Default meta.wikimedia.org)
@@ -200,19 +201,27 @@
# TODO this only works for some WMF sites
if not site:
site = pywikibot.Site('meta')
+ param = {
+ 'action': 'sitematrix',
+ 'smlangprop': 'site',
+ 'smsiteprop': ('code', 'dbname'),
+ 'formatversion': 2,
+ }
req = site._request(expiry=datetime.timedelta(days=10),
- parameters={'action': 'sitematrix'})
+ parameters=param)
data = req.submit()
for key, val in data['sitematrix'].items():
if key == 'count':
continue
- if 'code' in val:
- lang = val['code']
+ if 'site' in val:
for m_site in val['site']:
if m_site['dbname'] == dbname:
- if m_site['code'] == 'wiki':
- m_site['code'] = 'wikipedia'
- return pywikibot.Site(lang, m_site['code'])
+ # extract site from dbname
+ family = m_site['code']
+ code = removesuffix(dbname, family).replace('_', '-')
+ if family == 'wiki':
+ family = 'wikipedia'
+ return pywikibot.Site(code, family)
else: # key == 'specials'
for m_site in val:
if m_site['dbname'] == dbname:
diff --git a/tests/site_tests.py b/tests/site_tests.py
index add933a..5908217 100755
--- a/tests/site_tests.py
+++ b/tests/site_tests.py
@@ -89,17 +89,19 @@
def test_constructors(self):
"""Test cases for site constructors."""
test_list = [
+ ['alswiki', 'wikipedia:als'], # see T345036
+ ['commonswiki', 'commons:commons'],
+ ['dewikinews', 'wikinews:de'],
['enwiki', 'wikipedia:en'],
['eswikisource', 'wikisource:es'],
- ['dewikinews', 'wikinews:de'],
- ['ukwikivoyage', 'wikivoyage:uk'],
['metawiki', 'meta:meta'],
- ['commonswiki', 'commons:commons'],
- ['wikidatawiki', 'wikidata:wikidata'],
- ['testwikidatawiki', 'wikidata:test'],
- ['testwiki', 'wikipedia:test'], # see T225729, T228300
- ['test2wiki', 'wikipedia:test2'], # see T225729
+ ['roa_rupwiki', 'wikipedia:roa-rup'], # see T345036
['sourceswiki', 'wikisource:mul'], # see T226960
+ ['test2wiki', 'wikipedia:test2'], # see T225729
+ ['testwiki', 'wikipedia:test'], # see T225729, T228300
+ ['testwikidatawiki', 'wikidata:test'],
+ ['ukwikivoyage', 'wikivoyage:uk'],
+ ['wikidatawiki', 'wikidata:wikidata'],
]
if isinstance(self.site.family, pywikibot.family.WikimediaFamily):
site = self.site

To view, visit change 953197. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: Ic2e5c4d384fef8519bac6c13511c1a0d9479a103
Gerrit-Change-Number: 953197
Gerrit-PatchSet: 6
Gerrit-Owner: Xqt <info@gno.de>
Gerrit-Reviewer: MisterSynergy <mister.synergy@yahoo.com>
Gerrit-Reviewer: Xqt <info@gno.de>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged