From d6e2395e379e7863ee7aba6276249643f7b080a6 Mon Sep 17 00:00:00 2001 From: Seiichi Yonezawa Date: Tue, 7 Nov 2023 01:37:13 +0900 Subject: [PATCH 1/3] Support expiration time for lists --- lib/kredis/types.rb | 4 ++-- lib/kredis/types/list.rb | 20 ++++++++++++++++---- test/types/list_test.rb | 21 +++++++++++++++++++++ 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/lib/kredis/types.rb b/lib/kredis/types.rb index 6ccdb2a..acd7262 100644 --- a/lib/kredis/types.rb +++ b/lib/kredis/types.rb @@ -61,8 +61,8 @@ def hash(key, typed: :string, default: nil, config: :shared, after_change: nil) type_from(Hash, config, key, after_change: after_change, default: default, typed: typed) end - def list(key, default: nil, typed: :string, config: :shared, after_change: nil) - type_from(List, config, key, after_change: after_change, default: default, typed: typed) + def list(key, default: nil, typed: :string, config: :shared, after_change: nil, expires_in: nil) + type_from(List, config, key, after_change: after_change, default: default, typed: typed, expires_in: expires_in) end def unique_list(key, default: nil, typed: :string, limit: nil, config: :shared, after_change: nil) diff --git a/lib/kredis/types/list.rb b/lib/kredis/types/list.rb index 0c1e06f..133ed3a 100644 --- a/lib/kredis/types/list.rb +++ b/lib/kredis/types/list.rb @@ -3,9 +3,9 @@ class Kredis::Types::List < Kredis::Types::Proxying prepend Kredis::DefaultValues - proxying :lrange, :lrem, :lpush, :ltrim, :rpush, :exists?, :del + proxying :lrange, :lrem, :lpush, :ltrim, :rpush, :exists?, :del, :expire - attr_accessor :typed + attr_accessor :typed, :expires_in def elements strings_to_types(lrange(0, -1) || [], typed) @@ -17,11 +17,19 @@ def remove(*elements) end def prepend(*elements) - lpush types_to_strings(elements, typed) if elements.flatten.any? + return if elements.flatten.empty? + + lpush types_to_strings(elements, typed) + expire_in expires_in if expires_in.present? + elements end def append(*elements) - rpush types_to_strings(elements, typed) if elements.flatten.any? + return if elements.flatten.empty? + + rpush types_to_strings(elements, typed) + expire_in expires_in if expires_in.present? + elements end alias << append @@ -33,6 +41,10 @@ def last(n = nil) n ? lrange(-n, -1) : lrange(-1, -1).first end + def expire_in(seconds) + expire seconds.to_i + end + private def set_default append default diff --git a/test/types/list_test.rb b/test/types/list_test.rb index 7507548..25ec713 100644 --- a/test/types/list_test.rb +++ b/test/types/list_test.rb @@ -76,6 +76,27 @@ class ListTest < ActiveSupport::TestCase assert_equal %w[ 2 3 ], @list.elements end + test "append with expiring list" do + @list = Kredis.list "mylist", expires_in: 1.second + @list.append(%w[1 2 3]) + + sleep 0.5.seconds + assert_equal %w[ 1 2 3 ], @list.elements + + sleep 0.6.seconds + assert_equal [], @list.elements + end + + test "prepend with expiring list" do + @list = Kredis.list "mylist", expires_in: 1.second + @list.prepend(%w[1 2 3]) + + sleep 0.5.seconds + assert_equal %w[ 3 2 1 ], @list.elements + + sleep 0.6.seconds + assert_equal [], @list.elements + end test "default" do @list = Kredis.list "mylist", default: %w[ 1 2 3 ] From 3328ddac8bd20cda836dc997e7dc593eac654bc5 Mon Sep 17 00:00:00 2001 From: Seiichi Yonezawa Date: Sat, 23 Dec 2023 14:16:14 +0900 Subject: [PATCH 2/3] Remove present? --- lib/kredis/types/list.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/kredis/types/list.rb b/lib/kredis/types/list.rb index 133ed3a..67d13dc 100644 --- a/lib/kredis/types/list.rb +++ b/lib/kredis/types/list.rb @@ -20,7 +20,7 @@ def prepend(*elements) return if elements.flatten.empty? lpush types_to_strings(elements, typed) - expire_in expires_in if expires_in.present? + expire_in expires_in if expires_in elements end @@ -28,7 +28,7 @@ def append(*elements) return if elements.flatten.empty? rpush types_to_strings(elements, typed) - expire_in expires_in if expires_in.present? + expire_in expires_in if expires_in elements end alias << append From cc7758be85fd3104dad4aea2751245e5d068fd17 Mon Sep 17 00:00:00 2001 From: Seiichi Yonezawa Date: Fri, 29 Dec 2023 07:51:37 +0900 Subject: [PATCH 3/3] Support nx and remove expire_in --- lib/kredis/types/list.rb | 8 ++------ test/types/list_test.rb | 16 +++++++++++----- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/lib/kredis/types/list.rb b/lib/kredis/types/list.rb index 67d13dc..cb4e767 100644 --- a/lib/kredis/types/list.rb +++ b/lib/kredis/types/list.rb @@ -20,7 +20,7 @@ def prepend(*elements) return if elements.flatten.empty? lpush types_to_strings(elements, typed) - expire_in expires_in if expires_in + expire expires_in.to_i, nx: true if expires_in elements end @@ -28,7 +28,7 @@ def append(*elements) return if elements.flatten.empty? rpush types_to_strings(elements, typed) - expire_in expires_in if expires_in + expire expires_in.to_i, nx: true if expires_in elements end alias << append @@ -41,10 +41,6 @@ def last(n = nil) n ? lrange(-n, -1) : lrange(-1, -1).first end - def expire_in(seconds) - expire seconds.to_i - end - private def set_default append default diff --git a/test/types/list_test.rb b/test/types/list_test.rb index 25ec713..06c57c9 100644 --- a/test/types/list_test.rb +++ b/test/types/list_test.rb @@ -78,9 +78,12 @@ class ListTest < ActiveSupport::TestCase test "append with expiring list" do @list = Kredis.list "mylist", expires_in: 1.second - @list.append(%w[1 2 3]) - - sleep 0.5.seconds + @list.append(%w[1 2]) + + sleep 0.2.seconds + @list.append(3) + + sleep 0.3.seconds assert_equal %w[ 1 2 3 ], @list.elements sleep 0.6.seconds @@ -89,9 +92,12 @@ class ListTest < ActiveSupport::TestCase test "prepend with expiring list" do @list = Kredis.list "mylist", expires_in: 1.second - @list.prepend(%w[1 2 3]) + @list.prepend(%w[1 2]) + + sleep 0.2.seconds + @list.prepend(3) - sleep 0.5.seconds + sleep 0.3.seconds assert_equal %w[ 3 2 1 ], @list.elements sleep 0.6.seconds