Skip to content

Commit 10a3ce9

Browse files
committed
Merge branch 'latest-tests'
* latest-tests: Update to pass the latest compliance tests
2 parents 1874cda + 7431e52 commit 10a3ce9

File tree

3 files changed

+90
-5
lines changed

3 files changed

+90
-5
lines changed

jmespath.js

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -403,9 +403,9 @@
403403
"Or": 5,
404404
"Flatten": 6,
405405
"Star": 20,
406+
"Filter": 20,
406407
"Dot": 40,
407408
"Lbrace": 50,
408-
"Filter": 50,
409409
"Lbracket": 55,
410410
"Lparen": 60
411411
};
@@ -1122,6 +1122,10 @@
11221122
max: {
11231123
func: this.functionMax,
11241124
signature: [{types: ["array-number", "array-string"]}]},
1125+
"merge": {
1126+
func: this.functionMerge,
1127+
signature: [{types: ["object"], variadic: true}]
1128+
},
11251129
"max_by": {
11261130
func: this.functionMaxBy,
11271131
signature: [{types: ["array"]}, {types: ["expref"]}]
@@ -1155,6 +1159,7 @@
11551159
reverse: {
11561160
func: this.functionReverse,
11571161
signature: [{types: ["string", "array"]}]},
1162+
"to_array": {func: this.functionToArray, signature: [{types: ["any"]}]},
11581163
"to_string": {func: this.functionToString, signature: [{types: ["any"]}]},
11591164
"to_number": {func: this.functionToNumber, signature: [{types: ["any"]}]},
11601165
"not_null": {
@@ -1329,6 +1334,17 @@
13291334
}
13301335
},
13311336

1337+
functionMerge: function(resolvedArgs) {
1338+
var merged = {};
1339+
for (var i = 0; i < resolvedArgs.length; i++) {
1340+
var current = resolvedArgs[i];
1341+
for (var key in current) {
1342+
merged[key] = current[key];
1343+
}
1344+
}
1345+
return merged;
1346+
},
1347+
13321348
functionMax: function(resolvedArgs) {
13331349
if (resolvedArgs[0].length > 0) {
13341350
var typeName = this.getTypeName(resolvedArgs[0][0]);
@@ -1402,6 +1418,14 @@
14021418
return listJoin.join(joinChar);
14031419
},
14041420

1421+
functionToArray: function(resolvedArgs) {
1422+
if (this.getTypeName(resolvedArgs[0]) === "array") {
1423+
return resolvedArgs[0];
1424+
} else {
1425+
return [resolvedArgs[0]];
1426+
}
1427+
},
1428+
14051429
functionToString: function(resolvedArgs) {
14061430
if (this.getTypeName(resolvedArgs[0]) === "string") {
14071431
return resolvedArgs[0];
@@ -1441,7 +1465,7 @@
14411465

14421466
functionSortBy: function(resolvedArgs) {
14431467
var sortedArray = resolvedArgs[0].slice(0);
1444-
if (!sortedArray) {
1468+
if (sortedArray.length === 0) {
14451469
return sortedArray;
14461470
}
14471471
var interpreter = this.interpreter;

test/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
]

test/compliance/functions.json

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,26 @@
239239
"expression": "max(empty_list)",
240240
"result": null
241241
},
242+
{
243+
"expression": "merge(`{}`)",
244+
"result": {}
245+
},
246+
{
247+
"expression": "merge(`{}`, `{}`)",
248+
"result": {}
249+
},
250+
{
251+
"expression": "merge(`{\"a\": 1}`, `{\"b\": 2}`)",
252+
"result": {"a": 1, "b": 2}
253+
},
254+
{
255+
"expression": "merge(`{\"a\": 1}`, `{\"a\": 2}`)",
256+
"result": {"a": 2}
257+
},
258+
{
259+
"expression": "merge(`{\"a\": 1, \"b\": 2}`, `{\"a\": 2, \"c\": 3}`, `{\"d\": 4}`)",
260+
"result": {"a": 2, "b": 2, "c": 3, "d": 4}
261+
},
242262
{
243263
"expression": "min(numbers)",
244264
"result": -1
@@ -431,6 +451,26 @@
431451
"expression": "sum(`[]`)",
432452
"result": 0
433453
},
454+
{
455+
"expression": "to_array(`foo`)",
456+
"result": ["foo"]
457+
},
458+
{
459+
"expression": "to_array(`0`)",
460+
"result": [0]
461+
},
462+
{
463+
"expression": "to_array(objects)",
464+
"result": [{"foo": "bar", "bar": "baz"}]
465+
},
466+
{
467+
"expression": "to_array(`[1, 2, 3]`)",
468+
"result": [1, 2, 3]
469+
},
470+
{
471+
"expression": "to_array(false)",
472+
"result": [false]
473+
},
434474
{
435475
"expression": "to_string(`foo`)",
436476
"result": "foo"
@@ -569,7 +609,7 @@
569609
},
570610
"cases": [
571611
{
572-
"description": "function projection on variadic function",
612+
"description": "sort by field expression",
573613
"expression": "sort_by(people, &age)",
574614
"result": [
575615
{"age": 10, "age_str": "10", "bool": true, "name": 3},
@@ -580,7 +620,7 @@
580620
]
581621
},
582622
{
583-
"description": "function projection on variadic function",
623+
"description": "sort by function expression",
584624
"expression": "sort_by(people, &to_number(age_str))",
585625
"result": [
586626
{"age": 10, "age_str": "10", "bool": true, "name": 3},
@@ -591,7 +631,7 @@
591631
]
592632
},
593633
{
594-
"description": "function projection on variadic function",
634+
"description": "function projection on sort_by function",
595635
"expression": "sort_by(people, &age)[].name",
596636
"result": [3, "a", "c", "b", "d"]
597637
},
@@ -615,6 +655,10 @@
615655
"expression": "sort_by(people, &age)[].extra",
616656
"result": ["foo", "bar"]
617657
},
658+
{
659+
"expression": "sort_by(`[]`, &age)",
660+
"result": []
661+
},
618662
{
619663
"expression": "max_by(people, &age)",
620664
"result": {"age": 50, "age_str": "50", "bool": false, "name": "d"}

0 commit comments

Comments
 (0)