Last modified: 2014-11-03 02:46:55 UTC
Following on from bug 66120, we now get a TypeError during save (and other Page write methods). The test added in the last changeset is identifying the issue: ERROR: test_page_methods (__main__.TestPageMethods) Test ItemPage methods inherited from superclass Page. ---------------------------------------------------------------------- Traceback (most recent call last): File "tests/wikibase_tests.py", line 418, in test_page_methods self.assertRaises(pywikibot.PageNotSaved, self.wdp.save) File "/usr/local/lib/python2.6/site-packages/unittest2/case.py", line 475, in assertRaises callableObj(*args, **kwargs) File ".../pywikibot/__init__.py", line 476, in wrapper return method(*__args, **__kw) File ".../pywikibot/page.py", line 954, in save if not force and not self.botMayEdit(): File ".../pywikibot/page.py", line 883, in botMayEdit templates = self.templatesWithParams() File ".../pywikibot/__init__.py", line 476, in wrapper return method(*__args, **__kw) File ".../pywikibot/page.py", line 1257, in templatesWithParams templates = textlib.extract_templates_and_params(self.text) File ".../pywikibot/textlib.py", line 923, in extract_templates_and_params return extract_templates_and_params_regex(text) File ".../pywikibot/textlib.py", line 943, in extract_templates_and_params_regex thistxt = removeDisabledParts(text) File ".../pywikibot/textlib.py", line 293, in removeDisabledParts return toRemoveR.sub('', text) TypeError: expected string or buffer That test hasnt caused an error for a while, but this test is against test.wikidata.org which has had a few other bugs needing fixing, and the server config appears to be changing frequently (getting better). The error we see now is: 1. Page.save method calls botMayEdit 2. which calls templatesWithParams to look for {{nobots}} 3. which loads 'self.text' and 4. asks textlib.extract_templates_and_params() to extract all the templates Page.text calls Page.get, which is supposed to return a string. On a WikibasePage, .get returns a dict instead of a string.
*** Bug 70241 has been marked as a duplicate of this bug. ***
Currently I see there two “easy” fixes: One way to fix it would be in the second step to look either if text is a str/unicode. The second would be to check if page is not a WikibasePage. But that one would break as soon as another Page subclass is introduced which also hasn't a text. Maybe it doesn't make sense that Wikibase is a subclass of Page, because the value stored internally are very different (but that now a bit late, because it's in the API now). I'm not sure how redirects work actually. Would they return a string?
The same problem is happening on py3 win32
*** Bug 70978 has been marked as a duplicate of this bug. ***
When I
Okay that didn't go so well: What I meant to write was, that when mwparserfromhell is not installed it uses the regex which get's a dict in all versions of Python. I was able to reproduce the same error in Python 2.7.8. But mwparserfromhell uses the string representation of the text so it quietly tries to interpret the dictionary, and as long as there is no 'template' code in any of the data it won't return any templates. I might have a fix ready (at least in theory).
Duh, I should have figured out it was mwparserfromhell which was the commonality here. I've re-added py3 compatibility, as installing mwparserfromhell on windows is not easy on py3, but has been solved on py2 with a packaged prebuilt dll.
Change 161201 had a related patch set uploaded by XZise: [FIX] WikibasePage: Allow saving wikibase pages without mwpfh https://gerrit.wikimedia.org/r/161201
Change 161201 merged by jenkins-bot: [FIX] WikibasePage: Allow saving wikibase pages without mwpfh https://gerrit.wikimedia.org/r/161201