jenkins-bot has submitted this change and it was merged.
Change subject: use OrderedDict instead of builtin dict for params ......................................................................
use OrderedDict instead of builtin dict for params
to preserve their order in both extract_templates_and_params() and extract_templates_and_params_regex()
Bug: 55882 Change-Id: I923e8b188f5212eaa531337617472f4601a43652 Original-Change-Id: I4253824897f3fe4849ad09ed7e7931cf97e6e4a3 --- M pywikibot/textlib.py M tests/textlib_tests.py 2 files changed, 19 insertions(+), 10 deletions(-)
Approvals: John Vandenberg: Looks good to me, approved jenkins-bot: Verified
diff --git a/pywikibot/textlib.py b/pywikibot/textlib.py index f27163c..859c290 100644 --- a/pywikibot/textlib.py +++ b/pywikibot/textlib.py @@ -18,6 +18,12 @@ import mwparserfromhell except ImportError: mwparserfromhell = False + +try: + from collections import OrderedDict +except ImportError: + from ordereddict import OrderedDict + import datetime import re import sys @@ -974,7 +980,7 @@ code = mwparserfromhell.parse(text) result = [] for template in code.filter_templates(recursive=True): - params = {} + params = OrderedDict() for param in template.params: params[unicode(param.name)] = unicode(param.value) result.append((unicode(template.name.strip()), params)) @@ -1104,7 +1110,7 @@
# Parameters paramString = m.group('params') - params = {} + params = OrderedDict() numbered_param = 1 if paramString: # Replace wikilinks with markers diff --git a/tests/textlib_tests.py b/tests/textlib_tests.py index 0e7dab4..10dd200 100644 --- a/tests/textlib_tests.py +++ b/tests/textlib_tests.py @@ -18,6 +18,7 @@ import pywikibot.textlib as textlib from pywikibot import config
+from tests import OrderedDict from tests.aspects import unittest, TestCase, DefaultDrySiteTestCase
files = {} @@ -57,17 +58,19 @@ if not (pywikibot.config.use_mwparserfromhell and mwparserfromhell): raise unittest.SkipTest('mwparserfromhell not available or enabled') func = textlib.extract_templates_and_params # It's really long. - self.assertEqual(func('{{a}}'), [('a', {})]) - self.assertEqual(func('{{a|b=c}}'), [('a', {'b': 'c'})]) - self.assertEqual(func('{{a|b|c=d}}'), [('a', {u'1': 'b', 'c': 'd'})]) - self.assertEqual(func('{{a|b={{c}}}}'), [(u'a', {u'b': u'{{c}}'}), ('c', {})]) + self.assertEqual(func('{{a}}'), [('a', OrderedDict())]) + self.assertEqual(func('{{a|b=c}}'), [('a', OrderedDict((('b', 'c'), )))]) + self.assertEqual(func('{{a|b|c=d}}'), [('a', OrderedDict((('1', 'b'), ('c', 'd'))))]) + self.assertEqual(func('{{a|b={{c}}}}'), [('a', OrderedDict((('b', '{{c}}'), ))), ('c', OrderedDict())]) + self.assertEqual(func('{{a|b=c|f=g|d=e|1=}}'), [('a', OrderedDict((('b', 'c'), ('f', 'g'), ('d', 'e'), ('1', ''))))])
def testExtractTemplatesRegex(self): func = textlib.extract_templates_and_params_regex # It's really long. - self.assertEqual(func('{{a}}'), [('a', {})]) - self.assertEqual(func('{{a|b=c}}'), [('a', {'b': 'c'})]) - self.assertEqual(func('{{a|b|c=d}}'), [('a', {u'1': 'b', 'c': 'd'})]) - self.assertEqual(func('{{a|b={{c}}}}'), [('c', {}), (u'a', {u'b': u'{{c}}'})]) + self.assertEqual(func('{{a}}'), [('a', OrderedDict())]) + self.assertEqual(func('{{a|b=c}}'), [('a', OrderedDict((('b', 'c'), )))]) + self.assertEqual(func('{{a|b|c=d}}'), [('a', OrderedDict((('1', 'b'), ('c', 'd'))))]) + self.assertEqual(func('{{a|b={{c}}}}'), [('c', OrderedDict()), ('a', OrderedDict((('b', '{{c}}'), )))]) + self.assertEqual(func('{{a|b=c|f=g|d=e|1=}}'), [('a', OrderedDict((('b', 'c'), ('f', 'g'), ('d', 'e'), ('1', ''))))])
def testSpacesInSection(self): self.assertContains("enwiki_help_editing", u"Minor_edits")
pywikibot-commits@lists.wikimedia.org