Page MenuHomePhabricator

Incubator interwiki makes page.py crash
Open, HighPublic

Description

Steps to reproduce

$ python pwb.py shell
>>> s=pywikibot.Site('cs')
>>> l='voy:Main page'
>>> p=pywikibot.Page(s, l)
>>> p.exists() # or p.isRedirectPage() or whatever similar
Traceback (most recent call last):
  File "/home/pavel/pywikibot/pywikibot/page.py", line 5639, in parse
    newsite = self._site.interwiki(prefix)
  File "/home/pavel/pywikibot/pywikibot/site.py", line 977, in interwiki
    return self._interwikimap[prefix].site
  File "/home/pavel/pywikibot/pywikibot/site.py", line 723, in __getitem__
    raise self._iw_sites[prefix].site
  File "/home/pavel/pywikibot/pywikibot/page.py", line 5639, in parse
    newsite = self._site.interwiki(prefix)
  File "/home/pavel/pywikibot/pywikibot/site.py", line 977, in interwiki
    return self._interwikimap[prefix].site
  File "/home/pavel/pywikibot/pywikibot/site.py", line 723, in __getitem__
    raise self._iw_sites[prefix].site
  File "/home/pavel/pywikibot/pywikibot/page.py", line 5639, in parse
    newsite = self._site.interwiki(prefix)
  File "/home/pavel/pywikibot/pywikibot/site.py", line 977, in interwiki
    return self._interwikimap[prefix].site
  File "/home/pavel/pywikibot/pywikibot/site.py", line 723, in __getitem__
    raise self._iw_sites[prefix].site
  File "/home/pavel/pywikibot/pywikibot/page.py", line 5639, in parse
    newsite = self._site.interwiki(prefix)
  File "/home/pavel/pywikibot/pywikibot/site.py", line 977, in interwiki
    return self._interwikimap[prefix].site
  File "/home/pavel/pywikibot/pywikibot/site.py", line 723, in __getitem__
    raise self._iw_sites[prefix].site
  File "/home/pavel/pywikibot/pywikibot/page.py", line 5639, in parse
    newsite = self._site.interwiki(prefix)
  File "/home/pavel/pywikibot/pywikibot/site.py", line 977, in interwiki
    return self._interwikimap[prefix].site
  File "/home/pavel/pywikibot/pywikibot/site.py", line 723, in __getitem__
    raise self._iw_sites[prefix].site
  File "/home/pavel/pywikibot/pywikibot/page.py", line 5639, in parse
    newsite = self._site.interwiki(prefix)
  File "/home/pavel/pywikibot/pywikibot/site.py", line 977, in interwiki
    return self._interwikimap[prefix].site
  File "/home/pavel/pywikibot/pywikibot/site.py", line 723, in __getitem__
    raise self._iw_sites[prefix].site
  File "/home/pavel/pywikibot/pywikibot/page.py", line 5639, in parse
    newsite = self._site.interwiki(prefix)
  File "/home/pavel/pywikibot/pywikibot/site.py", line 977, in interwiki
    return self._interwikimap[prefix].site
  File "/home/pavel/pywikibot/pywikibot/site.py", line 723, in __getitem__
    raise self._iw_sites[prefix].site
  File "/home/pavel/pywikibot/pywikibot/site.py", line 673, in site
    self._site = pywikibot.Site(url=self.url)
  File "/home/pavel/pywikibot/pywikibot/__init__.py", line 1235, in Site
    code, fam = _code_fam_from_url(url)
  File "/home/pavel/pywikibot/pywikibot/__init__.py", line 1192, in _code_fam_from_url
    raise SiteDefinitionError("Unknown URL '{0}'.".format(url))
pywikibot.exceptions.SiteDefinitionError: Unknown URL 'https://cs.wikivoyage.org/wiki/$1'.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/pavel/pywikibot/pywikibot/page.py", line 806, in exists
    return self.pageid > 0
  File "/home/pavel/pywikibot/pywikibot/page.py", line 287, in pageid
    self.site.loadpageinfo(self)
  File "/home/pavel/pywikibot/pywikibot/page.py", line 222, in site
    return self._link.site
  File "/home/pavel/pywikibot/pywikibot/page.py", line 5735, in site
    self.parse()
  File "/home/pavel/pywikibot/pywikibot/page.py", line 5646, in parse
    .format(self._text, self._site, prefix, e))
pywikibot.exceptions.SiteDefinitionError: voy:Main page is not a local page on wikipedia:cs, and the interwiki prefix voy is not supported by Pywikibot!
Unknown URL 'https://cs.wikivoyage.org/wiki/$1'.

Expected behavior
This should be handled by some skippable warning as you don't want your link-examination script be interrupted by a SiteDefinitionError

Configuration
Python 3.7.2, issue appeared on cswiki: {{Refn|Mantrou Wikicest je [[voy:Wikivoyage:Welcome,_Wikipedians#Style_differences|férovost]]}} in page cs:w:Nadace WIkimedia

Event Timeline

Dvorapa updated the task description. (Show Details)

I think this should either fail on p=pywikibot.Page() or never fail at all. It should definitely not fail on p.exists() or p.isRedirectPage()

Similar error is thrown also for be-x-old/be-tarask Wikipedia: T113461

Dvorapa triaged this task as High priority.Feb 5 2019, 5:07 PM

Both this and T113461 are high priority because the interwiki exists and on WIkipedia is fully functional, just Pywikibot does not accept it:

pywikibot.exceptions.SiteDefinitionError: voy:Main page is not a local page on wikipedia:cs, and the interwiki prefix voy is not supported by Pywikibot!
Unknown URL 'https://cs.wikivoyage.org/wiki/$1'.
pywikibot.exceptions.SiteDefinitionError: be-tarask:Баўгарыя is not a local page on wikipedia:cs, and the interwiki prefix be-tarask is not supported by Pywikibot!
Unknown URL 'https://be-x-old.wikipedia.org/wiki/$1'.

It seems Pywikibot can not handle site redirects well (be-x-old > be-tarask; cs:voy > incubator)