From 6dce2d503c78a49c587a6f90d90f954b0b47e309 Mon Sep 17 00:00:00 2001 From: mbarkhau Date: Wed, 11 Oct 2017 15:07:22 +0200 Subject: [PATCH 1/5] Always treat binary op args as string literals Fixes #95 --- fire/parser.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fire/parser.py b/fire/parser.py index a0cef6d1..941c6f62 100644 --- a/fire/parser.py +++ b/fire/parser.py @@ -94,6 +94,9 @@ def _LiteralEval(value): SyntaxError: If the value string has a syntax error. """ root = ast.parse(value, mode='eval') + if isinstance(root.body, ast.BinOp): + return value + for node in ast.walk(root): for field, child in ast.iter_fields(node): if isinstance(child, list): From a34d363b769f7b18a3f61204fc6c28c7cc19e33d Mon Sep 17 00:00:00 2001 From: Manuel Barkhau Date: Wed, 11 Oct 2017 15:16:27 +0200 Subject: [PATCH 2/5] add test for binop --- fire/parser_test.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fire/parser_test.py b/fire/parser_test.py index 2be6b83d..633b55df 100644 --- a/fire/parser_test.py +++ b/fire/parser_test.py @@ -127,13 +127,15 @@ def testDefaultParseValueBadLiteral(self): # If it can't be parsed, we treat it as a string. This behavior may change. self.assertEqual( parser.DefaultParseValue('[(A, 2, "3"), 5'), '[(A, 2, "3"), 5') - self.assertEqual(parser.DefaultParseValue('x=10'), 'x=10') def testDefaultParseValueSyntaxError(self): # If it can't be parsed, we treat it as a string. self.assertEqual(parser.DefaultParseValue('"'), '"') + def testDefaultParseValueIgnoreBinOp(self): + self.assertEqual(parser.DefaultParseValue('2017-10-10'), '2017-10-10') + self.assertEqual(parser.DefaultParseValue('1+1'), '1+1') if __name__ == '__main__': testutils.main() From 2c9fe113e8766c0e94b9171a49cd8b46fec9b607 Mon Sep 17 00:00:00 2001 From: Manuel Barkhau Date: Wed, 11 Oct 2017 15:35:15 +0200 Subject: [PATCH 3/5] fix: trailing whitespace --- fire/parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fire/parser.py b/fire/parser.py index 941c6f62..b9cd9bb5 100644 --- a/fire/parser.py +++ b/fire/parser.py @@ -96,7 +96,7 @@ def _LiteralEval(value): root = ast.parse(value, mode='eval') if isinstance(root.body, ast.BinOp): return value - + for node in ast.walk(root): for field, child in ast.iter_fields(node): if isinstance(child, list): From be0703448010c74e51fa76909da1b574134b17f8 Mon Sep 17 00:00:00 2001 From: Manuel Barkhau Date: Wed, 11 Oct 2017 18:12:47 +0200 Subject: [PATCH 4/5] add assertions for negative numbers --- fire/parser_test.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fire/parser_test.py b/fire/parser_test.py index 633b55df..7fd9ca79 100644 --- a/fire/parser_test.py +++ b/fire/parser_test.py @@ -69,10 +69,12 @@ def testDefaultParseValueSpecialStrings(self): def testDefaultParseValueNumbers(self): self.assertEqual(parser.DefaultParseValue('23'), 23) + self.assertEqual(parser.DefaultParseValue('-23'), -23) self.assertEqual(parser.DefaultParseValue('23.0'), 23.0) self.assertIsInstance(parser.DefaultParseValue('23'), int) self.assertIsInstance(parser.DefaultParseValue('23.0'), float) self.assertEqual(parser.DefaultParseValue('23.5'), 23.5) + self.assertEqual(parser.DefaultParseValue('-23.5'), -23.5) def testDefaultParseValueStringNumbers(self): self.assertEqual(parser.DefaultParseValue("'23'"), '23') From 04f3a6c12cb2fd44fd9f213e5a4665b54b0c3ac7 Mon Sep 17 00:00:00 2001 From: Manuel Barkhau Date: Wed, 11 Oct 2017 18:27:29 +0200 Subject: [PATCH 5/5] raise ValueError for BinOp expressions --- fire/parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fire/parser.py b/fire/parser.py index b9cd9bb5..858201ff 100644 --- a/fire/parser.py +++ b/fire/parser.py @@ -95,7 +95,7 @@ def _LiteralEval(value): """ root = ast.parse(value, mode='eval') if isinstance(root.body, ast.BinOp): - return value + raise ValueError(value) for node in ast.walk(root): for field, child in ast.iter_fields(node):