From a541b28d4eba269fa7a4d3427ba9e04057053415 Mon Sep 17 00:00:00 2001 From: Ben Pastene Date: Fri, 24 May 2019 00:25:12 +0000 Subject: [PATCH] Add 'X in tuple()' support to gclient conditionals. This is purely so I can land: https://chromium-review.googlesource.com/c/chromium/src/+/1625812 instead of: https://chromium-review.googlesource.com/c/chromium/src/+/1625813 That is, the former is a slightly cleaner version of the latter. However, it doesn't work w/o this patch. Bug: 947531 Change-Id: If8e7f8080ba5f40408680b598fed511df89be8bb Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/1626479 Reviewed-by: Dirk Pranke Commit-Queue: Ben Pastene --- gclient_eval.py | 9 +++++++-- tests/gclient_eval_unittest.py | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/gclient_eval.py b/gclient_eval.py index 9ad6d2c6fa4d70..6ca0c28869d9db 100644 --- a/gclient_eval.py +++ b/gclient_eval.py @@ -538,9 +538,11 @@ def EvaluateCondition(condition, variables, referenced_variables=None): main_node = ast.parse(condition, mode='eval') if isinstance(main_node, ast.Expression): main_node = main_node.body - def _convert(node): + def _convert(node, allow_tuple=False): if isinstance(node, ast.Str): return node.s + elif isinstance(node, ast.Tuple) and allow_tuple: + return tuple(map(_convert, node.elts)) elif isinstance(node, ast.Name): if node.id in referenced_variables: raise ValueError( @@ -612,12 +614,15 @@ def _convert(node): condition)) left = _convert(node.left) - right = _convert(node.comparators[0]) + right = _convert( + node.comparators[0], allow_tuple=isinstance(node.ops[0], ast.In)) if isinstance(node.ops[0], ast.Eq): return left == right if isinstance(node.ops[0], ast.NotEq): return left != right + if isinstance(node.ops[0], ast.In): + return left in right raise ValueError( 'unexpected operator: %s %s (inside %r)' % ( diff --git a/tests/gclient_eval_unittest.py b/tests/gclient_eval_unittest.py index f9bb6461e6f23a..f8030e01abd93c 100755 --- a/tests/gclient_eval_unittest.py +++ b/tests/gclient_eval_unittest.py @@ -265,6 +265,21 @@ def test_string_bool_typo(self): '(inside \'false_var_str and true_var\')', str(cm.exception)) + def test_tuple_presence(self): + self.assertTrue(gclient_eval.EvaluateCondition( + 'foo in ("bar", "baz")', {'foo': 'bar'})) + self.assertFalse(gclient_eval.EvaluateCondition( + 'foo in ("bar", "baz")', {'foo': 'not_bar'})) + + def test_unsupported_tuple_operation(self): + with self.assertRaises(ValueError) as cm: + gclient_eval.EvaluateCondition('foo == ("bar", "baz")', {'foo': 'bar'}) + self.assertIn('unexpected AST node', str(cm.exception)) + + with self.assertRaises(ValueError) as cm: + gclient_eval.EvaluateCondition('(foo,) == "bar"', {'foo': 'bar'}) + self.assertIn('unexpected AST node', str(cm.exception)) + class VarTest(unittest.TestCase): def assert_adds_var(self, before, after):