diff --git a/muppet/puppet/format/parser.py b/muppet/puppet/format/parser.py index 78022861a48100e9bb1cf0e428cbb666f16b3719..a6e9de87aa465d6d926f0b3e536f37708f2c67db 100644 --- a/muppet/puppet/format/parser.py +++ b/muppet/puppet/format/parser.py @@ -433,7 +433,7 @@ class ParserFormatter(Serializer[ParseDirective]): parser &= ws & self.s(x) for x in xs: parser &= ws & ',' & ws & self.s(x) - parser &= optional(ws & ')') + parser &= optional(ws & ',') & optional(ws & ')') return parser @override diff --git a/tests/test_parse_elsif.py b/tests/test_parse_elsif.py index 3ef6a7f9228823af2e67eb9bee8fd2cafdfa5190..4e8c5328e4c18441f1bdacb46b8418237a05f9dc 100644 --- a/tests/test_parse_elsif.py +++ b/tests/test_parse_elsif.py @@ -4,6 +4,7 @@ from muppet.puppet.format.parser import ParserFormatter from muppet.puppet.ast import build_ast from muppet.puppet.parser import puppet_parser from muppet.parser_combinator import ParserCombinator +from pprint import pprint def test_parse_else_if(): @@ -57,9 +58,6 @@ def test_parse_elsif(): # '}'] -from pprint import pprint - - def test_chained(): s = "x.filter().join()" ast = build_ast(puppet_parser(s)) @@ -88,3 +86,38 @@ def test_chained_and_lambda(): print("parser:\n" + str(parser)) match_objects = ParserCombinator(s, "s").get(parser) pprint(match_objects) + + +def test_invoke(): + s = """ + assert_type( + Enum['always','daily','weekly','reluctantly'], + $update['frequency'], + ) + """ + ast = build_ast(puppet_parser(s)) + pprint(ast) + parser = ParserFormatter(s, "s").serialize(ast) + print("parser:\n" + str(parser)) + match_objects = ParserCombinator(s, "s").get(parser) + pprint(match_objects) + + +def test_invoke_inside_if(): + # This previously failed due to invoke not handling trailing + # commas. The above example (test_invoke) apparently worked, + # because reasons. + s = """ + if $update['frequency'] { + assert_type( + Enum['always','daily','weekly','reluctantly'], + $update['frequency'], + ) + } + """ + ast = build_ast(puppet_parser(s)) + pprint(ast) + parser = ParserFormatter(s, "s").serialize(ast) + print("parser:\n" + str(parser)) + match_objects = ParserCombinator(s, "s").get(parser) + pprint(match_objects)