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..cb4e767 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 expires_in.to_i, nx: true if expires_in + 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 expires_in.to_i, nx: true if expires_in + elements end alias << append diff --git a/test/types/list_test.rb b/test/types/list_test.rb index 7507548..06c57c9 100644 --- a/test/types/list_test.rb +++ b/test/types/list_test.rb @@ -76,6 +76,33 @@ 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]) + + sleep 0.2.seconds + @list.append(3) + + sleep 0.3.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]) + + sleep 0.2.seconds + @list.prepend(3) + + sleep 0.3.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 ]