jenkins-bot has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/953197 )
Change subject: [bugfix] Extract code and family from dbname in APISite.fromDBName ......................................................................
[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(-)
Approvals: MisterSynergy: Looks good to me, but someone else must approve Xqt: Looks good to me, approved jenkins-bot: Verified
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