diff --git a/fire/parser.py b/fire/parser.py index a0cef6d1..858201ff 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): + raise ValueError(value) + for node in ast.walk(root): for field, child in ast.iter_fields(node): if isinstance(child, list): diff --git a/fire/parser_test.py b/fire/parser_test.py index 2be6b83d..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') @@ -127,13 +129,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()