From 1428f0fae3b0c8144c7108641300a9582dc23b19 Mon Sep 17 00:00:00 2001 From: viralpraxis Date: Thu, 17 Jul 2025 12:30:55 +0400 Subject: [PATCH] Make `unlink` consistent with `del` when an empty keyset passed `del` returns zero immideately if no keys were passed, I think it makes sense to do the same for `unlink`? It simplifies and makes safer migration to unlinking --- lib/redis/commands/keys.rb | 3 +++ test/redis/commands_on_value_types_test.rb | 17 +++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/redis/commands/keys.rb b/lib/redis/commands/keys.rb index e7a39172f..22214c861 100644 --- a/lib/redis/commands/keys.rb +++ b/lib/redis/commands/keys.rb @@ -261,6 +261,9 @@ def del(*keys) # @param [String, Array] keys # @return [Integer] number of keys that were unlinked def unlink(*keys) + keys.flatten!(1) + return 0 if keys.empty? + send_command([:unlink] + keys) end diff --git a/test/redis/commands_on_value_types_test.rb b/test/redis/commands_on_value_types_test.rb index b79d6898b..897bacf11 100644 --- a/test/redis/commands_on_value_types_test.rb +++ b/test/redis/commands_on_value_types_test.rb @@ -49,6 +49,10 @@ def test_unlink assert_equal ["bar", "baz", "foo"], r.keys("*").sort + assert_equal 0, r.unlink("") + + assert_equal ["bar", "baz", "foo"], r.keys("*").sort + assert_equal 1, r.unlink("foo") assert_equal ["bar", "baz"], r.keys("*").sort @@ -62,15 +66,24 @@ def test_unlink_with_array_argument r.set "foo", "s1" r.set "bar", "s2" r.set "baz", "s3" + r.set "bad", "s4" - assert_equal ["bar", "baz", "foo"], r.keys("*").sort + assert_equal ["bad", "bar", "baz", "foo"], r.keys("*").sort + + assert_equal 0, r.unlink([]) + + assert_equal ["bad", "bar", "baz", "foo"], r.keys("*").sort assert_equal 1, r.unlink(["foo"]) - assert_equal ["bar", "baz"], r.keys("*").sort + assert_equal ["bad", "bar", "baz"], r.keys("*").sort assert_equal 2, r.unlink(["bar", "baz"]) + assert_equal ["bad"], r.keys("*").sort + + assert_equal 1, r.unlink([["bad"]]) + assert_equal [], r.keys("*").sort end