From 6193679dfc0c0bc6e908c38e5c5dd288ef8f3f0c Mon Sep 17 00:00:00 2001 From: Tyarel <98483313+Tyarel8@users.noreply.github.com> Date: Tue, 22 Apr 2025 16:30:38 +0200 Subject: [PATCH] Fix `kv set` with a closure argument (#15588) 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 --- crates/nu-std/std-rfc/kv/mod.nu | 2 +- crates/nu-std/tests/test_std-rfc_kv.nu | 50 +++++++++++++++++++++----- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/crates/nu-std/std-rfc/kv/mod.nu b/crates/nu-std/std-rfc/kv/mod.nu index 95d90282e1..31c990fd6a 100644 --- a/crates/nu-std/std-rfc/kv/mod.nu +++ b/crates/nu-std/std-rfc/kv/mod.nu @@ -38,7 +38,7 @@ export def "kv set" [ # If passed a closure, execute it let arg_type = ($value_or_closure | describe) 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) } diff --git a/crates/nu-std/tests/test_std-rfc_kv.nu b/crates/nu-std/tests/test_std-rfc_kv.nu index 84467fceee..f30a709dee 100644 --- a/crates/nu-std/tests/test_std-rfc_kv.nu +++ b/crates/nu-std/tests/test_std-rfc_kv.nu @@ -83,7 +83,7 @@ def local-transpose_to_record [] { } @test -def local-using_closure [] { +def local-using_cellpaths [] { if ('sqlite' not-in (version).features) { return } let key = (random uuid) @@ -91,8 +91,8 @@ def local-using_closure [] { let size_key = (random uuid) ls - | kv set $name_key { get name } - | kv set $size_key { get size } + | kv set $name_key $in.name + | kv set $size_key $in.size let expected = "list" let actual = (kv get $name_key | describe) @@ -106,6 +106,22 @@ def local-using_closure [] { 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 def local-return-entire-list [] { if ('sqlite' not-in (version).features) { return } @@ -137,7 +153,7 @@ def local-return_value_only [] { let key = (random uuid) 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 @@ -233,7 +249,7 @@ def universal-transpose_to_record [] { } @test -def universal-using_closure [] { +def universal-using_cellpaths [] { if ('sqlite' not-in (version).features) { return } let key = (random uuid) @@ -243,8 +259,8 @@ def universal-using_closure [] { let size_key = (random uuid) ls - | kv set -u $name_key { get name } - | kv set -u $size_key { get size } + | kv set -u $name_key $in.name + | kv set -u $size_key $in.size let expected = "list" let actual = (kv get -u $name_key | describe) @@ -259,6 +275,24 @@ def universal-using_closure [] { 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 def universal-return-entire-list [] { if ('sqlite' not-in (version).features) { return } @@ -295,7 +329,7 @@ def universal-return_value_only [] { let key = (random uuid) 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