Skip to content

Commit ccf063c

Browse files
committed
Updating to recent JMESPath changes
1 parent 7955602 commit ccf063c

18 files changed

+2680
-2454
lines changed

src/FnDispatcher.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,24 @@ private function fn_values(array $args)
246246
return array_values((array) $args[0]);
247247
}
248248

249+
private function fn_merge(array $args)
250+
{
251+
if (!$args) {
252+
throw new \RuntimeException(
253+
"merge() expects 1 or more arguments, 0 were provided"
254+
);
255+
}
256+
257+
return call_user_func_array('array_replace', $args);
258+
}
259+
260+
private function fn_to_array(array $args)
261+
{
262+
$this->validate('to_array', $args, [['any']]);
263+
264+
return Utils::isArray($args[0]) ? $args[0] : [$args[0]];
265+
}
266+
249267
private function typeError($from, $msg)
250268
{
251269
if (strpos($from, ':')) {

src/Parser.php

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,15 @@ class Parser
2727
'number' => 0,
2828
'current' => 0,
2929
'expref' => 0,
30+
'colon' => 1,
3031
'pipe' => 1,
3132
'comparator' => 2,
3233
'or' => 5,
3334
'flatten' => 6,
3435
'star' => 20,
36+
'filter' => 20,
3537
'dot' => 40,
3638
'lbrace' => 50,
37-
'filter' => 50,
3839
'lbracket' => 55,
3940
'lparen' => 60,
4041
];
@@ -395,15 +396,24 @@ private function parseArrayIndexExpression()
395396
// Consume the closing bracket
396397
$this->next();
397398

398-
if ($pos == 0) {
399+
if ($pos === 0) {
399400
// No colons were found so this is a simple index extraction
400401
return ['type' => 'index', 'value' => $parts[0]];
401-
} elseif ($pos > 2) {
402+
}
403+
404+
if ($pos > 2) {
402405
throw $this->syntax('Invalid array slice syntax: too many colons');
403-
} else {
404-
// Sliced array from start (e.g., [2:])
405-
return ['type' => 'slice', 'value' => $parts];
406406
}
407+
408+
// Sliced array from start (e.g., [2:])
409+
return [
410+
'type' => 'projection',
411+
'from' => 'array',
412+
'children' => [
413+
['type' => 'slice', 'value' => $parts],
414+
$this->parseProjection(self::$bp['flatten'])
415+
]
416+
];
407417
}
408418

409419
private function parseMultiSelectList()

tests/EnvTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public function testCleansCompileDir()
2323
{
2424
$dir = sys_get_temp_dir();
2525
$runtime = new CompilerRuntime($dir);
26-
$runtime('@', []);
26+
$runtime('@ | @ | @[0][0][0]', []);
2727
$this->assertNotEmpty(glob($dir . '/jmespath_*.php'));
2828
$this->assertGreaterThan(0, Env::cleanCompileDir());
2929
$this->assertEmpty(glob($dir . '/jmespath_*.php'));

tests/compliance/basic.json

Lines changed: 80 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,92 +1,92 @@
11
[{
2-
"given":
3-
{"foo": {"bar": {"baz": "correct"}}},
4-
"cases": [
5-
{
6-
"expression": "foo",
7-
"result": {"bar": {"baz": "correct"}}
8-
},
9-
{
10-
"expression": "foo.bar",
11-
"result": {"baz": "correct"}
12-
},
13-
{
14-
"expression": "foo.bar.baz",
15-
"result": "correct"
16-
},
17-
{
18-
"expression": "foo.bar.baz.bad",
19-
"result": null
20-
},
21-
{
22-
"expression": "foo.bar.bad",
23-
"result": null
24-
},
25-
{
26-
"expression": "foo.bad",
27-
"result": null
28-
},
29-
{
30-
"expression": "bad",
31-
"result": null
32-
},
33-
{
34-
"expression": "bad.morebad.morebad",
35-
"result": null
36-
}
37-
]
2+
"given":
3+
{"foo": {"bar": {"baz": "correct"}}},
4+
"cases": [
5+
{
6+
"expression": "foo",
7+
"result": {"bar": {"baz": "correct"}}
8+
},
9+
{
10+
"expression": "foo.bar",
11+
"result": {"baz": "correct"}
12+
},
13+
{
14+
"expression": "foo.bar.baz",
15+
"result": "correct"
16+
},
17+
{
18+
"expression": "foo.bar.baz.bad",
19+
"result": null
20+
},
21+
{
22+
"expression": "foo.bar.bad",
23+
"result": null
24+
},
25+
{
26+
"expression": "foo.bad",
27+
"result": null
28+
},
29+
{
30+
"expression": "bad",
31+
"result": null
32+
},
33+
{
34+
"expression": "bad.morebad.morebad",
35+
"result": null
36+
}
37+
]
3838
},
39-
{
39+
{
4040
"given":
41-
{"foo": {"bar": ["one", "two", "three"]}},
41+
{"foo": {"bar": ["one", "two", "three"]}},
4242
"cases": [
43-
{
44-
"expression": "foo",
45-
"result": {"bar": ["one", "two", "three"]}
46-
},
47-
{
48-
"expression": "foo.bar",
49-
"result": ["one", "two", "three"]
50-
}
43+
{
44+
"expression": "foo",
45+
"result": {"bar": ["one", "two", "three"]}
46+
},
47+
{
48+
"expression": "foo.bar",
49+
"result": ["one", "two", "three"]
50+
}
5151
]
52-
},
53-
{
52+
},
53+
{
5454
"given": ["one", "two", "three"],
5555
"cases": [
56-
{
57-
"expression": "one",
58-
"result": null
59-
},
60-
{
61-
"expression": "two",
62-
"result": null
63-
},
64-
{
65-
"expression": "three",
66-
"result": null
67-
},
68-
{
69-
"expression": "one.two",
70-
"result": null
71-
}
56+
{
57+
"expression": "one",
58+
"result": null
59+
},
60+
{
61+
"expression": "two",
62+
"result": null
63+
},
64+
{
65+
"expression": "three",
66+
"result": null
67+
},
68+
{
69+
"expression": "one.two",
70+
"result": null
71+
}
7272
]
73-
},
74-
{
73+
},
74+
{
7575
"given":
76-
{"foo": {"1": ["one", "two", "three"], "-1": "bar"}},
76+
{"foo": {"1": ["one", "two", "three"], "-1": "bar"}},
7777
"cases": [
78-
{
79-
"expression": "foo.\"1\"",
80-
"result": ["one", "two", "three"]
81-
},
82-
{
83-
"expression": "foo.\"1\"[0]",
84-
"result": "one"
85-
},
86-
{
87-
"expression": "foo.\"-1\"",
88-
"result": "bar"
89-
}
78+
{
79+
"expression": "foo.\"1\"",
80+
"result": ["one", "two", "three"]
81+
},
82+
{
83+
"expression": "foo.\"1\"[0]",
84+
"result": "one"
85+
},
86+
{
87+
"expression": "foo.\"-1\"",
88+
"result": "bar"
89+
}
9090
]
91-
}
91+
}
9292
]

tests/compliance/current.json

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
[
2+
{
3+
"given": {
4+
"foo": [{"name": "a"}, {"name": "b"}],
5+
"bar": {"baz": "qux"}
6+
},
7+
"cases": [
8+
{
9+
"expression": "@",
10+
"result": {
11+
"foo": [{"name": "a"}, {"name": "b"}],
12+
"bar": {"baz": "qux"}
13+
}
14+
},
15+
{
16+
"expression": "@.bar",
17+
"result": {"baz": "qux"}
18+
},
19+
{
20+
"expression": "@.foo[0]",
21+
"result": {"name": "a"}
22+
}
23+
]
24+
}
25+
]

tests/compliance/escape.json

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,46 @@
11
[{
2-
"given": {
3-
"foo.bar": "dot",
4-
"foo bar": "space",
5-
"foo\nbar": "newline",
6-
"foo\"bar": "doublequote",
7-
"c:\\\\windows\\path": "windows",
8-
"/unix/path": "unix",
9-
"\"\"\"": "threequotes",
10-
"bar": {"baz": "qux"}
11-
},
12-
"cases": [
13-
{
14-
"expression": "\"foo.bar\"",
15-
"result": "dot"
16-
},
17-
{
18-
"expression": "\"foo bar\"",
19-
"result": "space"
20-
},
21-
{
22-
"expression": "\"foo\\nbar\"",
23-
"result": "newline"
24-
},
25-
{
26-
"expression": "\"foo\\\"bar\"",
27-
"result": "doublequote"
28-
},
29-
{
30-
"expression": "\"c:\\\\\\\\windows\\\\path\"",
31-
"result": "windows"
32-
},
33-
{
34-
"expression": "\"/unix/path\"",
35-
"result": "unix"
36-
},
37-
{
38-
"expression": "\"\\\"\\\"\\\"\"",
39-
"result": "threequotes"
40-
},
41-
{
42-
"expression": "\"bar\".\"baz\"",
43-
"result": "qux"
44-
}
45-
]
2+
"given": {
3+
"foo.bar": "dot",
4+
"foo bar": "space",
5+
"foo\nbar": "newline",
6+
"foo\"bar": "doublequote",
7+
"c:\\\\windows\\path": "windows",
8+
"/unix/path": "unix",
9+
"\"\"\"": "threequotes",
10+
"bar": {"baz": "qux"}
11+
},
12+
"cases": [
13+
{
14+
"expression": "\"foo.bar\"",
15+
"result": "dot"
16+
},
17+
{
18+
"expression": "\"foo bar\"",
19+
"result": "space"
20+
},
21+
{
22+
"expression": "\"foo\\nbar\"",
23+
"result": "newline"
24+
},
25+
{
26+
"expression": "\"foo\\\"bar\"",
27+
"result": "doublequote"
28+
},
29+
{
30+
"expression": "\"c:\\\\\\\\windows\\\\path\"",
31+
"result": "windows"
32+
},
33+
{
34+
"expression": "\"/unix/path\"",
35+
"result": "unix"
36+
},
37+
{
38+
"expression": "\"\\\"\\\"\\\"\"",
39+
"result": "threequotes"
40+
},
41+
{
42+
"expression": "\"bar\".\"baz\"",
43+
"result": "qux"
44+
}
45+
]
4646
}]

tests/compliance/filters.json

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,5 +294,22 @@
294294
"result": []
295295
}
296296
]
297+
},
298+
{
299+
"given": {
300+
"foo": [
301+
{"a": 1, "b": {"c": "x"}},
302+
{"a": 1, "b": {"c": "y"}},
303+
{"a": 1, "b": {"c": "z"}},
304+
{"a": 2, "b": {"c": "z"}},
305+
{"a": 1, "baz": 2}
306+
]
307+
},
308+
"cases": [
309+
{
310+
"expression": "foo[?a==`1`].b.c",
311+
"result": ["x", "y", "z"]
312+
}
313+
]
297314
}
298315
]

0 commit comments

Comments
 (0)