summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorptmcg <ptmcg@austin.rr.com>2021-10-29 00:04:02 -0500
committerptmcg <ptmcg@austin.rr.com>2021-10-29 00:04:02 -0500
commitae447cd7d3d816e2dfa2fc0e60a5e2002b3733da (patch)
treedbcd0fdf11da8f5ff11c86cc254e233c70676cb8 /tests
parent8bbc83e50ec9ca488c984466ecf8e242060916e1 (diff)
downloadpyparsing-git-ae447cd7d3d816e2dfa2fc0e60a5e2002b3733da.tar.gz
Fix Dict() bugfix to wrap tokenlist.as_dict() if self.resultsName
Diffstat (limited to 'tests')
-rw-r--r--tests/test_unit.py95
1 files changed, 95 insertions, 0 deletions
diff --git a/tests/test_unit.py b/tests/test_unit.py
index f90e42a..f7d6b17 100644
--- a/tests/test_unit.py
+++ b/tests/test_unit.py
@@ -2914,6 +2914,101 @@ class Test02_WithoutPackrat(ppt.TestParseResultsAsserts, TestCase):
result1, expected, msg="issue with ParseResults.extend(ParseResults)"
)
+ def testParseResultsWithNestedNames(self):
+ from pyparsing import (
+ Dict,
+ Literal,
+ Group,
+ Optional,
+ Regex,
+ QuotedString,
+ oneOf,
+ Or,
+ CaselessKeyword,
+ ZeroOrMore,
+ )
+
+ RELATION_SYMBOLS = "= > < >= <= <> =="
+
+ def _set_info(string, location, tokens):
+ for t in tokens:
+ try:
+ t["_info_"] = (string, location)
+ except TypeError:
+ pass
+ tokens["_info_"] = (string, location)
+
+ def keywords(name):
+ words = "any all within encloses adj".split()
+ return Or(map(CaselessKeyword, words))
+
+ charString1 = Group(Regex(r'[^()=<>"/\s]+'))("identifier")
+ charString1.addParseAction(_set_info)
+ charString2 = Group(QuotedString('"', "\\"))("quoted")
+ charString2.addParseAction(_set_info)
+
+ term = Group(charString1 | charString2)
+ modifier_key = charString1
+
+ # relations
+ comparitor_symbol = oneOf(RELATION_SYMBOLS)
+ named_comparitors = keywords("comparitors")
+ comparitor = Group(comparitor_symbol | named_comparitors)("comparitor")
+ comparitor.addParseAction(_set_info)
+
+ def modifier_list1(key):
+ modifier = Dict(
+ Literal("/")
+ + Group(modifier_key(key))("name")
+ + Optional(comparitor_symbol("symbol") + term("value"))
+ )("modifier")
+ modifier.addParseAction(_set_info)
+ return ZeroOrMore(modifier)("modifier_list")
+
+ def modifier_list2(key):
+ modifier = Dict(
+ Literal("/")
+ + Group(modifier_key(key))("name")
+ + Optional(comparitor_symbol("symbol") + term("value")),
+ asdict=True,
+ )("modifier")
+ modifier.addParseAction(_set_info)
+ return ZeroOrMore(modifier)("modifier_list")
+
+ def modifier_list3(key):
+ modifier = Group( # this line is different from the others, must group to get results names
+ Dict(
+ Literal("/")
+ + Group(modifier_key(key))("name")
+ + Optional(comparitor_symbol("symbol") + term("value"))
+ )
+ )
+ modifier.addParseAction(_set_info)
+ return ZeroOrMore(modifier)("modifier_list")
+
+ def modifier_list4(key):
+ modifier = Dict(
+ Literal("/")
+ + Group(modifier_key(key))("name")
+ + Optional(comparitor_symbol("symbol") + term("value")),
+ asdict=True,
+ )
+ modifier.addParseAction(_set_info)
+ return ZeroOrMore(modifier)("modifier_list")
+
+ for modifier_list_fn in (
+ modifier_list1,
+ modifier_list2,
+ modifier_list3,
+ modifier_list4,
+ ):
+ modifier_parser = modifier_list_fn("default")
+
+ result = modifier_parser.parseString("/respectaccents/ignoreaccents")
+ for r in result:
+ print(r)
+ print(r.get("_info_"))
+
def testParseResultsFromDict(self):
"""test helper classmethod ParseResults.from_dict()"""