diff --git a/CHANGELOG.rst b/CHANGELOG.rst index dc673df4..2faffa9b 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,7 +1,7 @@ Next Release (TBD) ================== -* No changes yet. +* Reject slice expressions with multiple numbers in the same component. 1.1.0 diff --git a/jmespath/parser.py b/jmespath/parser.py index cc8e804e..d8b5f45a 100644 --- a/jmespath/parser.py +++ b/jmespath/parser.py @@ -237,7 +237,7 @@ def _parse_slice_expression(self): self._raise_parse_error_for_token( self._lookahead_token(0), 'syntax error') self._advance() - elif current_token == 'number': + elif current_token == 'number' and parts[index] is None: parts[index] = self._lookahead_token(0)['value'] self._advance() else: diff --git a/tests/compliance/slice.json b/tests/compliance/slice.json index 35947727..6fc92795 100644 --- a/tests/compliance/slice.json +++ b/tests/compliance/slice.json @@ -14,6 +14,14 @@ "expression": "foo[0:10:1]", "result": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] }, + { + "expression": "foo[ 0 : 4 : 2 ]", + "result": [0, 2] + }, + { + "expression": "foo[0:0:1]", + "result": [] + }, { "expression": "foo[0:10]", "result": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] @@ -118,6 +126,38 @@ "expression": "foo[8:2:0]", "error": "invalid-value" }, + { + "expression": "foo[0:1 3]", + "error": "syntax" + }, + { + "expression": "foo[0:1-2]", + "error": "syntax" + }, + { + "expression": "foo[0:0 2]", + "error": "syntax" + }, + { + "expression": "foo[::1 2]", + "error": "syntax" + }, + { + "expression": "foo[::1-2]", + "error": "syntax" + }, + { + "expression": "foo[::0 2]", + "error": "syntax" + }, + { + "expression": "foo[0:1 3:2]", + "error": "syntax" + }, + { + "expression": "[::1 2]", + "error": "syntax" + }, { "expression": "foo[8:2:0:1]", "error": "syntax"