From 02c42fa9ca45485d56cfdae2a68826bb56ab6b6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Barri=C3=A9?= Date: Mon, 22 Aug 2022 16:48:18 +0200 Subject: [PATCH 1/3] Add last to lists For simplicity, this does not strictly respect Array#last when nil or false is passed, returning the last element instead of raising a TypeError. It also doesn't coerce the parameter into an int with to_int like Array#last does. --- lib/kredis/types/list.rb | 14 ++++++++++++++ test/types/list_test.rb | 12 ++++++++++++ 2 files changed, 26 insertions(+) diff --git a/lib/kredis/types/list.rb b/lib/kredis/types/list.rb index cbda3bd..bc872e6 100644 --- a/lib/kredis/types/list.rb +++ b/lib/kredis/types/list.rb @@ -24,4 +24,18 @@ def append(*elements) def clear del end + + def last(n = nil) + if n + if n == 0 + [] + elsif n < 0 + raise ArgumentError, "negative array size" + else + lrange(-n, -1) + end + else + lrange(-1, -1).first + end + end end diff --git a/test/types/list_test.rb b/test/types/list_test.rb index 7e7aa5f..c91f859 100644 --- a/test/types/list_test.rb +++ b/test/types/list_test.rb @@ -41,6 +41,18 @@ class ListTest < ActiveSupport::TestCase assert_equal [], @list.elements end + test "last" do + @list.append(%w[ 1 2 3 ]) + assert_equal "3", @list.last + end + + test "last(n)" do + @list.append(%w[ 1 2 3 ]) + assert_equal %w[ 2 3 ], @list.last(2) + assert_equal [], @list.last(0) + assert_raises(ArgumentError) { @list.last(-2) } + end + test "typed as datetime" do @list = Kredis.list "mylist", typed: :datetime From 0b0c3934440adbfecc20eec8977ce8e5216217c9 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 18 Jun 2023 17:30:28 +0200 Subject: [PATCH 2/3] Update list.rb Drop defensive programming --- lib/kredis/types/list.rb | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/lib/kredis/types/list.rb b/lib/kredis/types/list.rb index bc872e6..a686709 100644 --- a/lib/kredis/types/list.rb +++ b/lib/kredis/types/list.rb @@ -26,16 +26,6 @@ def clear end def last(n = nil) - if n - if n == 0 - [] - elsif n < 0 - raise ArgumentError, "negative array size" - else - lrange(-n, -1) - end - else - lrange(-1, -1).first - end + n ? lrange(-n, -1) : lrange(-1, -1).first end end From 42e4097cf3e5431dd421a8cc9fac074efb0dc6a6 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 18 Jun 2023 17:30:50 +0200 Subject: [PATCH 3/3] Update list_test.rb Drop defensive tests --- test/types/list_test.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/types/list_test.rb b/test/types/list_test.rb index c91f859..cd125a3 100644 --- a/test/types/list_test.rb +++ b/test/types/list_test.rb @@ -49,8 +49,6 @@ class ListTest < ActiveSupport::TestCase test "last(n)" do @list.append(%w[ 1 2 3 ]) assert_equal %w[ 2 3 ], @list.last(2) - assert_equal [], @list.last(0) - assert_raises(ArgumentError) { @list.last(-2) } end test "typed as datetime" do