Skip to content

Commit afa091f

Browse files
committed
Support expiration time for lists
1 parent 61c5c17 commit afa091f

File tree

3 files changed

+39
-6
lines changed

3 files changed

+39
-6
lines changed

lib/kredis/types.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ def hash(key, typed: :string, default: nil, config: :shared, after_change: nil)
6161
type_from(Hash, config, key, after_change: after_change, default: default, typed: typed)
6262
end
6363

64-
def list(key, default: nil, typed: :string, config: :shared, after_change: nil)
65-
type_from(List, config, key, after_change: after_change, default: default, typed: typed)
64+
def list(key, default: nil, typed: :string, config: :shared, after_change: nil, expires_in: nil)
65+
type_from(List, config, key, after_change: after_change, default: default, typed: typed, expires_in: expires_in)
6666
end
6767

6868
def unique_list(key, default: nil, typed: :string, limit: nil, config: :shared, after_change: nil)

lib/kredis/types/list.rb

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
class Kredis::Types::List < Kredis::Types::Proxying
44
prepend Kredis::DefaultValues
55

6-
proxying :lrange, :lrem, :lpush, :ltrim, :rpush, :exists?, :del
6+
proxying :lrange, :lrem, :lpush, :ltrim, :rpush, :exists?, :del, :expire
77

8-
attr_accessor :typed
8+
attr_accessor :typed, :expires_in
99

1010
def elements
1111
strings_to_types(lrange(0, -1) || [], typed)
@@ -17,11 +17,19 @@ def remove(*elements)
1717
end
1818

1919
def prepend(*elements)
20-
lpush types_to_strings(elements, typed) if elements.flatten.any?
20+
return if elements.flatten.empty?
21+
22+
lpush types_to_strings(elements, typed)
23+
expire_in expires_in if expires_in.present?
24+
elements
2125
end
2226

2327
def append(*elements)
24-
rpush types_to_strings(elements, typed) if elements.flatten.any?
28+
return if elements.flatten.empty?
29+
30+
rpush types_to_strings(elements, typed)
31+
expire_in expires_in if expires_in.present?
32+
elements
2533
end
2634
alias << append
2735

@@ -33,6 +41,10 @@ def last(n = nil)
3341
n ? lrange(-n, -1) : lrange(-1, -1).first
3442
end
3543

44+
def expire_in(seconds)
45+
expire seconds.to_i
46+
end
47+
3648
private
3749
def set_default
3850
append default

test/types/list_test.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,27 @@ class ListTest < ActiveSupport::TestCase
7676
assert_equal %w[ 2 3 ], @list.elements
7777
end
7878

79+
test "append with expiring list" do
80+
@list = Kredis.list "mylist", expires_in: 1.second
81+
@list.append(%w[1 2 3])
82+
83+
sleep 0.5.seconds
84+
assert_equal %w[ 1 2 3 ], @list.elements
85+
86+
sleep 0.6.seconds
87+
assert_equal [], @list.elements
88+
end
89+
90+
test "prepend with expiring list" do
91+
@list = Kredis.list "mylist", expires_in: 1.second
92+
@list.prepend(%w[1 2 3])
93+
94+
sleep 0.5.seconds
95+
assert_equal %w[ 3 2 1 ], @list.elements
96+
97+
sleep 0.6.seconds
98+
assert_equal [], @list.elements
99+
end
79100

80101
test "default" do
81102
@list = Kredis.list "mylist", default: %w[ 1 2 3 ]

0 commit comments

Comments
 (0)