Bug 1272414 - 'true' and 'false' literals in manifests should work irrespective of case, r?chmanchester
MozReview-Commit-ID: Lgw4GO033fk
--- a/testing/mozbase/manifestparser/manifestparser/expression.py
+++ b/testing/mozbase/manifestparser/manifestparser/expression.py
@@ -31,16 +31,18 @@ import traceback
# | INT
# | STRING
# | IDENT
# BOOL := true|false
# INT := [0-9]+
# STRING := "[^"]*"
# IDENT := [A-Za-z_]\w*
+# Note that BOOL reading is case insensitive.
+
# Identifiers take their values from a mapping dictionary passed as the second
# argument.
# Glossary (see above URL for details):
# - nud: null denotation
# - led: left detonation
# - lbp: left binding power
# - rbp: right binding power
@@ -118,17 +120,17 @@ class rparen_token(object):
class end_token(object):
"""always ends parsing"""
### derived literal tokens
class bool_token(literal_token):
def __init__(self, scanner, value):
- value = {'true':True, 'false':False}[value]
+ value = {'true':True, 'false':False}[value.lower()]
literal_token.__init__(self, scanner, value)
class int_token(literal_token):
def __init__(self, scanner, value):
literal_token.__init__(self, scanner, int(value))
class string_token(literal_token):
def __init__(self, scanner, value):
@@ -211,17 +213,17 @@ class ExpressionParser(object):
(r"<", lt_op_token()),
(r">", gt_op_token()),
(r"\|\|", or_op_token()),
(r"!", not_op_token()),
(r"&&", and_op_token()),
(r"\(", lparen_token()),
(r"\)", rparen_token()),
(r"\s+", None), # skip whitespace
- ])
+ ], flags=re.IGNORECASE)
tokens, remainder = ExpressionParser.scanner.scan(self.text)
for t in tokens:
yield t
yield end_token()
def value(self, ident):
"""
Look up the value of |ident| in the value mapping passed in the
--- a/testing/mozbase/manifestparser/tests/test_expressionparser.py
+++ b/testing/mozbase/manifestparser/tests/test_expressionparser.py
@@ -7,16 +7,18 @@ class ExpressionParserTest(unittest.Test
"""Test the conditional expression parser."""
def test_basic(self):
self.assertEqual(parse("1"), 1)
self.assertEqual(parse("100"), 100)
self.assertEqual(parse("true"), True)
self.assertEqual(parse("false"), False)
+ self.assertEqual(parse("True"), True)
+ self.assertEqual(parse("False"), False)
self.assertEqual('', parse('""'))
self.assertEqual(parse('"foo bar"'), 'foo bar')
self.assertEqual(parse("'foo bar'"), 'foo bar')
self.assertEqual(parse("foo", foo=1), 1)
self.assertEqual(parse("bar", bar=True), True)
self.assertEqual(parse("abc123", abc123="xyz"), 'xyz')
def test_equality(self):