From cf9055722959ed355a4295b1497ebd89f1403c8f Mon Sep 17 00:00:00 2001 From: Ben Kurtovic Date: Tue, 15 Oct 2013 18:23:11 -0400 Subject: [PATCH] Template.has() should be passed ignore_empty=False by default. **Breaking change**; closes #51. --- CHANGELOG | 3 +++ docs/changelog.rst | 4 ++++ mwparserfromhell/nodes/template.py | 4 ++-- tests/test_template.py | 19 +++++++++++-------- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 43309f6..a22463a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,8 @@ v0.4 (unreleased): +- Template.has() is now passed 'ignore_empty=False' by default instead of True. + This fixes a bug when adding parameters to templates with empty fields, and + is a breaking change if you rely on the default behavior. - The 'matches' argument of Wikicode's filter methods now accepts a function (taking one argument, a Node, and returning a bool) in addition to a regex. - Wikicode.matches() now accepts a tuple of strings/Wikicode objects instead of diff --git a/docs/changelog.rst b/docs/changelog.rst index 7ac5c9a..7d9ced7 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -7,6 +7,10 @@ v0.4 Unreleased (`changes `__): +- :py:meth:`.Template.has` is now passed *ignore_empty=False* by default + instead of *True*. This fixes a bug when adding parameters to templates with + empty fields, **and is a breaking change if you rely on the default + behavior.** - The *matches* argument of :py:class:`Wikicode's <.Wikicode>` :py:meth:`.filter` methods now accepts a function (taking one argument, a :py:class:`.Node`, and returning a bool) in addition to a regex. diff --git a/mwparserfromhell/nodes/template.py b/mwparserfromhell/nodes/template.py index 1b4e3fa..7a9779b 100644 --- a/mwparserfromhell/nodes/template.py +++ b/mwparserfromhell/nodes/template.py @@ -174,7 +174,7 @@ class Template(Node): def name(self, value): self._name = parse_anything(value) - def has(self, name, ignore_empty=True): + def has(self, name, ignore_empty=False): """Return ``True`` if any parameter in the template is named *name*. With *ignore_empty*, ``False`` will be returned even if the template @@ -190,7 +190,7 @@ class Template(Node): return True return False - has_param = lambda self, name, ignore_empty=True: \ + has_param = lambda self, name, ignore_empty=False: \ self.has(name, ignore_empty) has_param.__doc__ = "Alias for :py:meth:`has`." diff --git a/tests/test_template.py b/tests/test_template.py index 26a2e39..2294baf 100644 --- a/tests/test_template.py +++ b/tests/test_template.py @@ -123,15 +123,15 @@ class TestTemplate(TreeEqualityTestCase): node3 = Template(wraptext("foo"), [pgenh("1", "a"), pgens("b", "c"), pgens("1", "d")]) node4 = Template(wraptext("foo"), [pgenh("1", "a"), pgens("b", " ")]) - self.assertFalse(node1.has("foobar")) - self.assertTrue(node2.has(1)) - self.assertTrue(node2.has("abc")) - self.assertFalse(node2.has("def")) - self.assertTrue(node3.has("1")) - self.assertTrue(node3.has(" b ")) - self.assertFalse(node4.has("b")) - self.assertTrue(node3.has("b", False)) + self.assertFalse(node1.has("foobar", False)) + self.assertTrue(node2.has(1, False)) + self.assertTrue(node2.has("abc", False)) + self.assertFalse(node2.has("def", False)) + self.assertTrue(node3.has("1", False)) + self.assertTrue(node3.has(" b ", False)) self.assertTrue(node4.has("b", False)) + self.assertTrue(node3.has("b", True)) + self.assertFalse(node4.has("b", True)) def test_get(self): """test Template.get()""" @@ -223,6 +223,7 @@ class TestTemplate(TreeEqualityTestCase): pgenh("1", "c"), pgenh("2", "d")]) node40 = Template(wraptext("a"), [pgens("b", "c"), pgens("d", "e"), pgens("f", "g")]) + node41 = Template(wraptext("a"), [pgenh("1", "")]) node1.add("e", "f", showkey=True) node2.add(2, "g", showkey=False) @@ -266,6 +267,7 @@ class TestTemplate(TreeEqualityTestCase): node38.add("1", "e") node39.add("1", "e") node40.add("d", "h", before="b") + node41.add(1, "b") self.assertEqual("{{a|b=c|d|e=f}}", node1) self.assertEqual("{{a|b=c|d|g}}", node2) @@ -312,6 +314,7 @@ class TestTemplate(TreeEqualityTestCase): self.assertEqual("{{a|1=e|x=y|2=d}}", node38) self.assertEqual("{{a|x=y|e|d}}", node39) self.assertEqual("{{a|b=c|d=h|f=g}}", node40) + self.assertEqual("{{a|b}}", node41) def test_remove(self): """test Template.remove()"""