Fix kv set with a closure argument (#15588)

<!--
if this PR closes one or more issues, you can automatically link the PR
with
them by using one of the [*linking
keywords*](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword),
e.g.
- this PR should close #xxxx
- fixes #xxxx

you can also mention related issues, PRs or discussions!
-->
Fixes #15528 
# Description
Fixed `kv set` passing the pipeline input to the closure instead of the
value stored in that key.

# User-Facing Changes
Now `kv set` will pass the value in that key to the closure.

# Tests + Formatting


# After Submitting
This commit is contained in:
Tyarel 2025-04-22 16:30:38 +02:00 committed by GitHub
parent a9657e17ad
commit 6193679dfc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 43 additions and 9 deletions

View File

@ -38,7 +38,7 @@ export def "kv set" [
# If passed a closure, execute it # If passed a closure, execute it
let arg_type = ($value_or_closure | describe) let arg_type = ($value_or_closure | describe)
let value = match $arg_type { let value = match $arg_type {
closure => { $input | do $value_or_closure } closure => { kv get $key --universal=$universal | do $value_or_closure }
_ => ($value_or_closure | default $input) _ => ($value_or_closure | default $input)
} }

View File

@ -83,7 +83,7 @@ def local-transpose_to_record [] {
} }
@test @test
def local-using_closure [] { def local-using_cellpaths [] {
if ('sqlite' not-in (version).features) { return } if ('sqlite' not-in (version).features) { return }
let key = (random uuid) let key = (random uuid)
@ -91,8 +91,8 @@ def local-using_closure [] {
let size_key = (random uuid) let size_key = (random uuid)
ls ls
| kv set $name_key { get name } | kv set $name_key $in.name
| kv set $size_key { get size } | kv set $size_key $in.size
let expected = "list<string>" let expected = "list<string>"
let actual = (kv get $name_key | describe) let actual = (kv get $name_key | describe)
@ -106,6 +106,22 @@ def local-using_closure [] {
kv drop $size_key kv drop $size_key
} }
@test
def local-using_closure [] {
if ('sqlite' not-in (version).features) { return }
let key = (random uuid)
kv set $key 5
kv set $key { $in + 1 }
let expected = 6
let actual = (kv get $key)
assert equal $actual $expected
kv drop $key
}
@test @test
def local-return-entire-list [] { def local-return-entire-list [] {
if ('sqlite' not-in (version).features) { return } if ('sqlite' not-in (version).features) { return }
@ -137,7 +153,7 @@ def local-return_value_only [] {
let key = (random uuid) let key = (random uuid)
let expected = 'VALUE' let expected = 'VALUE'
let actual = ('value' | kv set -r v $key {str upcase}) let actual = ('value' | kv set -r v $key ($in | str upcase))
assert equal $actual $expected assert equal $actual $expected
@ -233,7 +249,7 @@ def universal-transpose_to_record [] {
} }
@test @test
def universal-using_closure [] { def universal-using_cellpaths [] {
if ('sqlite' not-in (version).features) { return } if ('sqlite' not-in (version).features) { return }
let key = (random uuid) let key = (random uuid)
@ -243,8 +259,8 @@ def universal-using_closure [] {
let size_key = (random uuid) let size_key = (random uuid)
ls ls
| kv set -u $name_key { get name } | kv set -u $name_key $in.name
| kv set -u $size_key { get size } | kv set -u $size_key $in.size
let expected = "list<string>" let expected = "list<string>"
let actual = (kv get -u $name_key | describe) let actual = (kv get -u $name_key | describe)
@ -259,6 +275,24 @@ def universal-using_closure [] {
rm $env.NU_UNIVERSAL_KV_PATH rm $env.NU_UNIVERSAL_KV_PATH
} }
@test
def universal-using_closure [] {
if ('sqlite' not-in (version).features) { return }
let key = (random uuid)
$env.NU_UNIVERSAL_KV_PATH = (mktemp -t --suffix .sqlite3)
kv set -u $key 5
kv set -u $key { $in + 1 }
let expected = 6
let actual = (kv get -u $key)
assert equal $actual $expected
kv drop -u $key
rm $env.NU_UNIVERSAL_KV_PATH
}
@test @test
def universal-return-entire-list [] { def universal-return-entire-list [] {
if ('sqlite' not-in (version).features) { return } if ('sqlite' not-in (version).features) { return }
@ -295,7 +329,7 @@ def universal-return_value_only [] {
let key = (random uuid) let key = (random uuid)
let expected = 'VALUE' let expected = 'VALUE'
let actual = ('value' | kv set --universal -r v $key {str upcase}) let actual = ('value' | kv set --universal -r v $key ($in | str upcase))
assert equal $actual $expected assert equal $actual $expected