jenkins-bot has submitted this change and it was merged.
Change subject: Move templatesWithParams from BasePage into Page ......................................................................
Move templatesWithParams from BasePage into Page
templatesWithParams has no suitable implementation for a WikibasePage, and causes exceptions when mwparserfromhell is not available and textlib.extract_templates_and_params_regex is used as a fallback.
Bug: T71664 Change-Id: Ia225ba19426c8819a23aa3c9a803d58302bf796e --- M pywikibot/page.py M tests/wikibase_tests.py 2 files changed, 53 insertions(+), 58 deletions(-)
Approvals: Merlijn van Deen: Looks good to me, approved jenkins-bot: Verified
diff --git a/pywikibot/page.py b/pywikibot/page.py index 192d3e1..08eddc3 100644 --- a/pywikibot/page.py +++ b/pywikibot/page.py @@ -1282,57 +1282,6 @@ return self.site.pageimages(self, step=step, total=total, content=content)
- @deprecate_arg("get_redirect", None) - def templatesWithParams(self): - """Iterate templates used on this Page. - - @return: a generator that yields a tuple for each use of a template - in the page, with the template Page as the first entry and a list of - parameters as the second entry. - - """ - # WARNING: may not return all templates used in particularly - # intricate cases such as template substitution - titles = list(t.title() for t in self.templates()) - templates = textlib.extract_templates_and_params(self.text) - # backwards-compatibility: convert the dict returned as the second - # element into a list in the format used by old scripts - result = [] - for template in templates: - link = pywikibot.Link(template[0], self.site, - defaultNamespace=10) - try: - if link.canonical_title() not in titles: - continue - except pywikibot.Error: - # this is a parser function or magic word, not template name - continue - args = template[1] - intkeys = {} - named = {} - positional = [] - for key in sorted(args): - try: - intkeys[int(key)] = args[key] - except ValueError: - named[key] = args[key] - for i in range(1, len(intkeys) + 1): - # only those args with consecutive integer keys can be - # treated as positional; an integer could also be used - # (out of order) as the key for a named argument - # example: {{tmp|one|two|5=five|three}} - if i in intkeys: - positional.append(intkeys[i]) - else: - for k in intkeys: - if k < 1 or k >= i: - named[str(k)] = intkeys[k] - break - for name in named: - positional.append("%s=%s" % (name, named[name])) - result.append((pywikibot.Page(link, self.site), positional)) - return result - @deprecated_args(nofollow_redirects=None, get_redirect=None) def categories(self, withSortKey=False, step=None, total=None, content=False): @@ -1845,6 +1794,57 @@ 'if source is a Site.') super(Page, self).__init__(source, title, ns)
+ @deprecate_arg("get_redirect", None) + def templatesWithParams(self): + """Iterate templates used on this Page. + + @return: a generator that yields a tuple for each use of a template + in the page, with the template Page as the first entry and a list of + parameters as the second entry. + + """ + # WARNING: may not return all templates used in particularly + # intricate cases such as template substitution + titles = list(t.title() for t in self.templates()) + templates = textlib.extract_templates_and_params(self.text) + # backwards-compatibility: convert the dict returned as the second + # element into a list in the format used by old scripts + result = [] + for template in templates: + link = pywikibot.Link(template[0], self.site, + defaultNamespace=10) + try: + if link.canonical_title() not in titles: + continue + except pywikibot.Error: + # this is a parser function or magic word, not template name + continue + args = template[1] + intkeys = {} + named = {} + positional = [] + for key in sorted(args): + try: + intkeys[int(key)] = args[key] + except ValueError: + named[key] = args[key] + for i in range(1, len(intkeys) + 1): + # only those args with consecutive integer keys can be + # treated as positional; an integer could also be used + # (out of order) as the key for a named argument + # example: {{tmp|one|two|5=five|three}} + if i in intkeys: + positional.append(intkeys[i]) + else: + for k in intkeys: + if k < 1 or k >= i: + named[str(k)] = intkeys[k] + break + for name in named: + positional.append("%s=%s" % (name, named[name])) + result.append((pywikibot.Page(link, self.site), positional)) + return result +
class FilePage(Page):
diff --git a/tests/wikibase_tests.py b/tests/wikibase_tests.py index ca49782..caf3b30 100644 --- a/tests/wikibase_tests.py +++ b/tests/wikibase_tests.py @@ -538,20 +538,15 @@
class TestPageMethods(WikidataTestCase):
- """Test cases to test methods of Page() behave correctly with Wikibase.""" + """Test behavior of WikibasePage methods inherited from BasePage."""
def test_page_methods(self): - """Test ItemPage methods inherited from superclass Page.""" + """Test ItemPage methods inherited from superclass BasePage.""" self.wdp = pywikibot.ItemPage(self.get_repo(), 'Q60') self.wdp.previousRevision() self.assertEqual(self.wdp.langlinks(), []) self.assertEqual(self.wdp.templates(), []) self.assertFalse(self.wdp.isCategoryRedirect()) - - def test_item_templates(self): - """Test templatesWithParams.""" - self.wdp = pywikibot.ItemPage(self.get_repo(), 'Q60') - self.wdp.templatesWithParams()
def test_item_bot_may_edit(self): """Test botMayEdit."""