From b9fe701df27953cb3fd59f8a26075dfeff600837 Mon Sep 17 00:00:00 2001 From: Laurence Hudson Date: Thu, 10 Dec 2020 12:38:28 +0000 Subject: [PATCH] Make string literal quote types configurable (i.e. make axiacore/py-expression-eval#47 optional) --- py_expression_eval/__init__.py | 6 ++++-- py_expression_eval/tests.py | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/py_expression_eval/__init__.py b/py_expression_eval/__init__.py index 849d6a0..4450543 100644 --- a/py_expression_eval/__init__.py +++ b/py_expression_eval/__init__.py @@ -329,7 +329,9 @@ def append(self, a, b): a.append(b) return a - def __init__(self): + def __init__(self, string_literal_quotes = ("'", "\"")): + self.string_literal_quotes = string_literal_quotes + self.success = False self.errormsg = '' self.expression = '' @@ -662,7 +664,7 @@ def isString(self): r = False str = '' startpos = self.pos - if self.pos < len(self.expression) and self.expression[self.pos] in ("'", "\""): + if self.pos < len(self.expression) and self.expression[self.pos] in self.string_literal_quotes: quote_type = self.expression[self.pos] self.pos += 1 while self.pos < len(self.expression): diff --git a/py_expression_eval/tests.py b/py_expression_eval/tests.py index b981286..b296b44 100755 --- a/py_expression_eval/tests.py +++ b/py_expression_eval/tests.py @@ -32,6 +32,9 @@ def test_parser(self): # but '"a b"' can *not* be used as a variable self.assertEqual(parser.parse('"a b"*2').evaluate({'"a b"': 2}), "a ba b") + # unless parse configured to allow double quoted variables (i.e. allow multi-word vars) + parser2 = Parser(string_literal_quotes=("'")) # only single, not double! + self.assertEqual(parser2.parse('"a b"*2').evaluate({'"a b"':2}),4) # evaluate self.assertExactEqual(parser.parse('1').evaluate({}), 1) @@ -215,15 +218,31 @@ def test_custom_functions_with_inline_strings(self): expr = parser.parse("func(1, \"func(2, 4)\")") self.assertEqual(expr.variables(), ['func']) + expr = parser.parse("func(1, 'func(2, 4)')") + self.assertEqual(expr.variables(), ['func']) + + parser2 = Parser(string_literal_quotes=("'")) + expr = parser2.parse("func(1, \"func(2, 4)\")") + self.assertEqual(expr.variables(), ['func', "\"func(2, 4)\""]) + + expr = parser2.parse("func(1, 'func(2, 4)')") + self.assertEqual(expr.variables(), ['func']) + def test_custom_functions_substitute_strings(self): def func(var, str): if str == "custom text": return 1 + if str == "foo": + return 2 return 0 parser = Parser() expr = parser.parse("func(1, \"custom text\")") self.assertEqual(expr.evaluate({"func": func}), 1) + + parser = Parser(string_literal_quotes=("'")) + expr = parser.parse("func(1, \"custom text\")") + self.assertEqual(expr.evaluate({"func": func, "\"custom text\"": "foo" }), 2) def test_decimals(self): parser = Parser()