Skip to content

Using new JSONPath module implementing RFC 9535#4655

Merged
hurl-bot merged 1 commit intomasterfrom
jsonpath/using-new-module
Jan 10, 2026
Merged

Using new JSONPath module implementing RFC 9535#4655
hurl-bot merged 1 commit intomasterfrom
jsonpath/using-new-module

Conversation

@fabricereix
Copy link
Collaborator

No description provided.

@fabricereix fabricereix marked this pull request as draft December 24, 2025 10:33
@jcamiel
Copy link
Collaborator

jcamiel commented Jan 7, 2026

@fabricereix grepping Hurl files on GitHub, we have 3190 source files. When I grep for "filter like expression" (rg '"\$.*\[.*\?.*\]' files/ ):

~30 files that may be impact or not. For instance:

files/rhpds/sandbox/tests/002_ocp.hurl
524:jsonpath "$[?(@.service_uuid=='{{uuid}}')]" count == 1
535:jsonpath "$[?(@.service_uuid=='{{uuid}}')]" count == 1
608:jsonpath "$.resources[?(@.annotations.namespace_suffix == 'dev')].namespace" contains "sandbox-{{guid}}-1-dev"
609:jsonpath "$.resources[?(@.annotations.namespace_suffix == 'test')].namespace" contains "sandbox-{{guid}}-2-test"
610:jsonpath "$.resources[?(@.annotations.namespace_suffix == 'prod')].namespace" contains "sandbox-{{guid}}-3-prod"
621:jsonpath "$[?(@.service_uuid=='{{uuid}}')]" count == 3
677:jsonpath "$.resources[?(@.annotations.purpose == 'ocp')]" count == 1
678:jsonpath "$.resources[?(@.annotations.purpose == 'aws')]" count == 1
679:jsonpath "$.resources[?(@.annotations.purpose == 'ocp')].status" contains "success"
680:jsonpath "$.resources[?(@.annotations.purpose == 'ocp')].credentials[0].kind" contains "ServiceAccount"
681:jsonpath "$.resources[?(@.annotations.purpose == 'aws')].available" contains false
682:jsonpath "$.resources[?(@.annotations.purpose == 'aws')].kind" contains "AwsSandbox"
11:jsonpath "$.invoices[?(@.invoiceStatus == 'VOID')]" count == 1
12:jsonpath "$.invoices[?(@.invoiceStatus == 'VOID')].number" includes "PPG-04195"
13:jsonpath "$.invoices[?(@.invoiceStatus == 'VOID')].amount" includes 2.06
14:jsonpath "$.invoices[?(@.invoiceStatus == 'VOID')].currency" includes "USD"
15:jsonpath "$.invoices[?(@.invoiceStatus == 'VOID')].id" exists
16:jsonpath "$.invoices[?(@.invoiceStatus == 'VOID')].dueDate" exists
17:jsonpath "$.invoices[?(@.invoiceStatus == 'VOID')].publicUrl" exists
18:jsonpath "$.invoices[?(@.invoiceStatus == 'PAID')]" count == 1
19:jsonpath "$.invoices[?(@.invoiceStatus == 'PAID')].number" includes "XGG-87291"
20:jsonpath "$.invoices[?(@.invoiceStatus == 'PAID')].amount" includes 2.06
21:jsonpath "$.invoices[?(@.invoiceStatus == 'PAID')].currency" includes "USD"
22:jsonpath "$.invoices[?(@.invoiceStatus == 'PAID')].id" exists
23:jsonpath "$.invoices[?(@.invoiceStatus == 'PAID')].dueDate" exists
24:jsonpath "$.invoices[?(@.invoiceStatus == 'PAID')].publicUrl" exists
25:jsonpath "$.invoices[?(@.invoiceStatus == 'OVERDUE')]" count == 1
26:jsonpath "$.invoices[?(@.invoiceStatus == 'OVERDUE')].number" includes "ZXL-37829"
27:jsonpath "$.invoices[?(@.invoiceStatus == 'OVERDUE')].amount" includes 2.06
28:jsonpath "$.invoices[?(@.invoiceStatus == 'OVERDUE')].currency" includes "USD"
29:jsonpath "$.invoices[?(@.invoiceStatus == 'OVERDUE')].id" exists
30:jsonpath "$.invoices[?(@.invoiceStatus == 'OVERDUE')].dueDate" exists
31:jsonpath "$.invoices[?(@.invoiceStatus == 'OVERDUE')].publicUrl" exists
32:jsonpath "$.invoices[?(@.invoiceStatus == 'DUE')]" count == 1
33:jsonpath "$.invoices[?(@.invoiceStatus == 'DUE')].number" includes "FMW-53533"
34:jsonpath "$.invoices[?(@.invoiceStatus == 'DUE')].amount" includes 2.06
35:jsonpath "$.invoices[?(@.invoiceStatus == 'DUE')].currency" includes "USD"
36:jsonpath "$.invoices[?(@.invoiceStatus == 'DUE')].id" exists
37:jsonpath "$.invoices[?(@.invoiceStatus == 'DUE')].dueDate" exists
38:jsonpath "$.invoices[?(@.invoiceStatus == 'DUE')].publicUrl" exists

Full List:

files/nordic-institute/X-Road/development/hurl/scenarios/setup.hurl
667:ss1_token_id: jsonpath "$[?(@.type == 'HARDWARE')].id" nth 0
1115:# TODO: Once it does, replace the jsonpath below with following: "$.endpoints[?(@.path == '/api/members' && @.method == 'GET')].id" nth 0
1116:ss0_test_rest_openapi_service_get_members_endpoint_id: jsonpath "$.endpoints[?(@.path == '/api/members')].id" nth 0

files/dukeofharen/httplaceholder/test/tests/01_conditions/07_jsonpath.hurl
15:    - "$.phoneNumbers[?(@.type=='iPhone')]"

files/dukeofharen/httplaceholder/test/tests/03_api/10_config.hurl
22:jsonpath "$[?(@.key=='storeResponses')].value" includes "false"
38:jsonpath "$[?(@.key=='storeResponses')].value" includes "true"

files/rhpds/sandbox/tests/002_ocp.hurl
524:jsonpath "$[?(@.service_uuid=='{{uuid}}')]" count == 1
535:jsonpath "$[?(@.service_uuid=='{{uuid}}')]" count == 1
608:jsonpath "$.resources[?(@.annotations.namespace_suffix == 'dev')].namespace" contains "sandbox-{{guid}}-1-dev"
609:jsonpath "$.resources[?(@.annotations.namespace_suffix == 'test')].namespace" contains "sandbox-{{guid}}-2-test"
610:jsonpath "$.resources[?(@.annotations.namespace_suffix == 'prod')].namespace" contains "sandbox-{{guid}}-3-prod"
621:jsonpath "$[?(@.service_uuid=='{{uuid}}')]" count == 3
677:jsonpath "$.resources[?(@.annotations.purpose == 'ocp')]" count == 1
678:jsonpath "$.resources[?(@.annotations.purpose == 'aws')]" count == 1
679:jsonpath "$.resources[?(@.annotations.purpose == 'ocp')].status" contains "success"
680:jsonpath "$.resources[?(@.annotations.purpose == 'ocp')].credentials[0].kind" contains "ServiceAccount"
681:jsonpath "$.resources[?(@.annotations.purpose == 'aws')].available" contains false
682:jsonpath "$.resources[?(@.annotations.purpose == 'aws')].kind" contains "AwsSandbox"

files/jazzytomato/intellij-hurl-plugin/sample.hurl
126:jsonpath "$.errors[?(@.id)].id" nth 0 == "error1"
127:jsonpath "$.errors[?(@.id=='error1')].id" nth 0 == "error1"
196:jsonpath "$.[?(@.id == 1)].name" nth 0 == "Bob"
197:jsonpath "$[?(@.id == 1)].name" nth 0 == "Bob"
203:jsonpath "$.fruit[?(@.price.US==200)].name" nth 0 == "grape"
204:jsonpath "$.fruit.[?(@.US == 100)]" count == 0   # To be clarified with spec: the first fruit is return by jsonpath.com
229:jsonpath "$..*[?(@.name)]" count == 5
230:jsonpath "$..*[?(@.name=='car')].id" nth 0 == 1
231:jsonpath "$..*[?(@.name=='wheel')].id" nth 0 == 4
233:jsonpath "$..items[?(@.name)]" count == 5
234:jsonpath "$..items[?(@.name=='car')].id" nth 0 == 1
235:jsonpath "$..items[?(@.name=='wheel')].id" nth 0 == 4
237:jsonpath "$.main.items[?(@.name)]" count == 3
238:jsonpath "$.main.items[?(@.name=='car')].id" nth 0 == 1
239:jsonpath "$.main.items[?(@.name=='wheel')].id" isEmpty
241:jsonpath "$.main..items[?(@.name)]" count == 4
242:jsonpath "$.main..items[?(@.name=='car')].id" nth 0 == 1
243:jsonpath "$.main..items[?(@.name=='wheel')].id" nth 0 == 4
2187:jsonpath "$..book[?(@.isbn)]" count == 2                                   # filter all books with isbn number
2188:jsonpath "$..book[?(@.isbn)].title" nth 0 == "Moby Dick"
2189:jsonpath "$..book[?(@.isbn)].title" nth 1 == "The Lord of the Rings"
2190:jsonpath "$..book[?(@.price<10)]" count == 2                               # filter all books cheaper than 10
2191:jsonpath "$..book[?(@.price<10)].title" nth 0 == "Sayings of the Century"
2192:jsonpath "$..book[?(@.price<10)].title" nth 1 == "Moby Dick"

files/ionos-cloud/external-dns-ionos-webhook/test/hurl/service_nodeport.hurl
100:node_ip: jsonpath "$.items[0].status.addresses[?(@.type=='InternalIP')].address" nth 0

files/cerbos/cerbos/hack/dev/playground.hurl
31:jsonpath "$.failure.errors[?(@.file == 'resource.yaml')].error" nth 0 == "cannot find derived roles 'apatr_common_roles' imported by policy resource.album_object.vdefault"
32:jsonpath "$.failure.errors[?(@.file == 'common_roles.yaml')].error" nth 0 == "Failed to read: policyType: exactly one field is required in oneof"
43:jsonpath "$.success.results[?(@.action == 'view')].effect" nth 0 == "EFFECT_ALLOW"
44:jsonpath "$.success.results[?(@.action == 'view')].policy" nth 0 == "resource.album_object.vdefault"
48:jsonpath "$.success.results[?(@.action == 'delete')].effect" nth 0 == "EFFECT_ALLOW"
49:jsonpath "$.success.results[?(@.action == 'delete')].policy" nth 0 == "resource.album_object.vdefault"

files/customeros/customeros/packages/server/customer-os-api/test/hurl/flow-routes/deactivate-webhook/deactivate-non-existing-webhook.hurl
31:jsonpath "$.hooks[?(@.url == '{{hook_url}}')].active" includes true

files/customeros/customeros-playground/packages/server/customer-os-api/test/hurl/invoice-routes/get-invoices-for-existing-organization.hurl
11:jsonpath "$.invoices[?(@.invoiceStatus == 'VOID')]" count == 1
12:jsonpath "$.invoices[?(@.invoiceStatus == 'VOID')].number" includes "PPG-04195"
13:jsonpath "$.invoices[?(@.invoiceStatus == 'VOID')].amount" includes 2.06
14:jsonpath "$.invoices[?(@.invoiceStatus == 'VOID')].currency" includes "USD"
15:jsonpath "$.invoices[?(@.invoiceStatus == 'VOID')].id" exists
16:jsonpath "$.invoices[?(@.invoiceStatus == 'VOID')].dueDate" exists
17:jsonpath "$.invoices[?(@.invoiceStatus == 'VOID')].publicUrl" exists
18:jsonpath "$.invoices[?(@.invoiceStatus == 'PAID')]" count == 1
19:jsonpath "$.invoices[?(@.invoiceStatus == 'PAID')].number" includes "XGG-87291"
20:jsonpath "$.invoices[?(@.invoiceStatus == 'PAID')].amount" includes 2.06
21:jsonpath "$.invoices[?(@.invoiceStatus == 'PAID')].currency" includes "USD"
22:jsonpath "$.invoices[?(@.invoiceStatus == 'PAID')].id" exists
23:jsonpath "$.invoices[?(@.invoiceStatus == 'PAID')].dueDate" exists
24:jsonpath "$.invoices[?(@.invoiceStatus == 'PAID')].publicUrl" exists
25:jsonpath "$.invoices[?(@.invoiceStatus == 'OVERDUE')]" count == 1
26:jsonpath "$.invoices[?(@.invoiceStatus == 'OVERDUE')].number" includes "ZXL-37829"
27:jsonpath "$.invoices[?(@.invoiceStatus == 'OVERDUE')].amount" includes 2.06
28:jsonpath "$.invoices[?(@.invoiceStatus == 'OVERDUE')].currency" includes "USD"
29:jsonpath "$.invoices[?(@.invoiceStatus == 'OVERDUE')].id" exists
30:jsonpath "$.invoices[?(@.invoiceStatus == 'OVERDUE')].dueDate" exists
31:jsonpath "$.invoices[?(@.invoiceStatus == 'OVERDUE')].publicUrl" exists
32:jsonpath "$.invoices[?(@.invoiceStatus == 'DUE')]" count == 1
33:jsonpath "$.invoices[?(@.invoiceStatus == 'DUE')].number" includes "FMW-53533"
34:jsonpath "$.invoices[?(@.invoiceStatus == 'DUE')].amount" includes 2.06
35:jsonpath "$.invoices[?(@.invoiceStatus == 'DUE')].currency" includes "USD"
36:jsonpath "$.invoices[?(@.invoiceStatus == 'DUE')].id" exists
37:jsonpath "$.invoices[?(@.invoiceStatus == 'DUE')].dueDate" exists
38:jsonpath "$.invoices[?(@.invoiceStatus == 'DUE')].publicUrl" exists

files/customeros/customeros/packages/server/customer-os-api/test/hurl/flow-routes/rotate-webhook/rotate-webhook.hurl
33:jsonpath "$.hooks[?(@.url == '{{hook_url}}')].active" includes true
62:jsonpath "$.hooks[?(@.url == '{{new_hook_url}}')].active" includes true

files/link-society/flowg/tests/e2e/spec/acl_users.hurl
9:jsonpath "$.users[?(@.name == 'root')].roles[*]" count == 1
10:jsonpath "$..users[?(@.name == 'root')].roles[*]" includes "admin"
11:jsonpath "$.users[?(@.name == 'guest')].roles[*]" count == 0

files/fparisotto/bookmark-hub/test.hurl
136:jsonpath "$.tags[?(@.tag=='rust')].count" includes 2
137:jsonpath "$.tags[?(@.tag=='tokio')].count" includes 2
138:jsonpath "$.tags[?(@.tag=='tracing')].count" includes 1
139:jsonpath "$.tags[?(@.tag=='metrics')].count" includes 1

files/fparisotto/bookmark-rs/test.hurl
138:jsonpath "$.tags[?(@.tag=='rust')].count" == 2
139:jsonpath "$.tags[?(@.tag=='tokio')].count" == 2
140:jsonpath "$.tags[?(@.tag=='tracing')].count" == 1
141:jsonpath "$.tags[?(@.tag=='metrics')].count" == 1

files/ues-io/uesio/apps/platform-integration-tests/hurl_specs/component_dependencies.hurl
112:jsonpath "$.dependencies.componenttype[?(@.type=='DECLARATIVE')]" count == 3

files/ues-io/uesio/apps/platform-integration-tests/hurl_specs/labels_translations.hurl
12:jsonpath "$.dependencies.label[?(@.name=='save')].value" nth 0 == "Save"
13:jsonpath "$.dependencies.label[?(@.name=='save')].namespace" nth 0 == "uesio/io"
14:jsonpath "$.dependencies.label[?(@.name=='session_expiration_msg')].value" nth 0 == "Your session has expired. Please login again."
15:jsonpath "$.dependencies.label[?(@.name=='session_expiration_msg')].namespace" nth 0 == "uesio/core"
32:jsonpath "$.dependencies.label[?(@.name=='save')].value" nth 0 == "Guardar"
33:jsonpath "$.dependencies.label[?(@.name=='save')].namespace" nth 0 == "uesio/io"
34:jsonpath "$.dependencies.label[?(@.name=='add')].value" nth 0 == "Añadir"
35:jsonpath "$.dependencies.label[?(@.name=='add')].namespace" nth 0 == "uesio/io"
42:jsonpath "$.dependencies.label[?(@.name=='helloworld')].value" nth 0 == "hola mundo"

files/StyraInc/styra-demo-tickethub/tests/api/conditions.hurl
31:jsonpath "$.tickets[?(@.id == 4)].resolved" includes false
32:jsonpath "$.tickets[?(@.id == 4)].assignee" includes null
33:jsonpath "$.tickets[?(@.id == 2)].resolved" includes true
34:jsonpath "$.tickets[?(@.id == 2)].assignee" includes "ceasar"
60:jsonpath "$.tickets[?(@.id == 4)]" count == 0

files/Keyrunes/keyrunes/hurl/verify_ui_hidden.hurl
43:group_id: jsonpath "$[?(@.name=='admin')].group_id" nth 0

files/ues-io/uesio/libs/apps/uesio/tests/hurl_specs/labels_translations.hurl
12:jsonpath "$.dependencies.label[?(@.name=='save')].value" nth 0 == "Save"
13:jsonpath "$.dependencies.label[?(@.name=='save')].namespace" nth 0 == "uesio/io"
14:jsonpath "$.dependencies.label[?(@.name=='session_expiration_msg')].value" nth 0 == "Your session has expired. Please login again."
15:jsonpath "$.dependencies.label[?(@.name=='session_expiration_msg')].namespace" nth 0 == "uesio/core"
32:jsonpath "$.dependencies.label[?(@.name=='save')].value" nth 0 == "Guardar"
33:jsonpath "$.dependencies.label[?(@.name=='save')].namespace" nth 0 == "uesio/io"
34:jsonpath "$.dependencies.label[?(@.name=='add')].value" nth 0 == "Añadir"
35:jsonpath "$.dependencies.label[?(@.name=='add')].namespace" nth 0 == "uesio/io"
42:jsonpath "$.dependencies.label[?(@.name=='helloworld')].value" nth 0 == "hola mundo"

files/ScottyLabs/courses-backend/crates/datafetcher/scripts/file_urls.hurl
7:items_url: jsonpath "$[?(@.name == 'Available Syllabi')].items_url" nth 0
8:items_count: jsonpath "$[?(@.name == 'Available Syllabi')].items_count" nth 0

files/doublewordai/control-layer/tests/authenticated/admin-crud-group.hurl
51:jsonpath "$.data[?(@.name == '{{group_name}}')]" count == 1

files/clintjedwards/gofer/gofer/tests/namespaces.hurl
20:jsonpath "$.namespaces[?(@.id == 'default')]" exists
21:jsonpath "$.namespaces[?(@.id == 'testing')]" exists

files/NamandeepWadhwa/fragments/tests/integration/lab-10-dynamodb.hurl
62:jsonpath "$.fragments[?(@.id=='{{id}}')]" exists
63:jsonpath "$.fragments[?(@.id=='{{fragment2_id}}')]" exists
88:jsonpath "$.fragments[?(@.id=='{{id}}')]" isEmpty

@fabricereix fabricereix force-pushed the jsonpath/using-new-module branch 4 times, most recently from 2cdadc7 to 7965f2c Compare January 10, 2026 18:56
@fabricereix fabricereix force-pushed the jsonpath/using-new-module branch from 7965f2c to 5cf61b7 Compare January 10, 2026 18:57
@fabricereix fabricereix marked this pull request as ready for review January 10, 2026 19:09
@fabricereix
Copy link
Collaborator Author

/accept

@hurl-bot
Copy link
Collaborator

🕗 /accept is running, please wait for completion.

@hurl-bot
Copy link
Collaborator

✅ Pull request merged with fast forward by fabricereix..

# List of commits merged from Orange-OpenSource/hurl/jsonpath/using-new-module branch into Orange-OpenSource/hurl/master branch:

  • 5cf61b7 Using new jsonpath module

@hurl-bot hurl-bot merged commit 5cf61b7 into master Jan 10, 2026
25 checks passed
@hurl-bot hurl-bot deleted the jsonpath/using-new-module branch January 10, 2026 19:19
@fabricereix fabricereix linked an issue Jan 12, 2026 that may be closed by this pull request
@jcamiel jcamiel changed the title Using new JSONPath module Using new JSONPath module implementing RFC 9535 Jan 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

JSONPath Refactoring / Alignment with Spec RFC 9535

3 participants