Skip to content

Commit d528b28

Browse files
authored
Add support for the NX (not exists) option to flags (#51)
* Add support for the NX (not exists) option to flags * Revert the version change * Rename the param * Update readme
1 parent f907aee commit d528b28

File tree

4 files changed

+30
-3
lines changed

4 files changed

+30
-3
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,8 @@ true == flag.marked? # => EXISTS myflag
144144
flag.remove # => DEL myflag
145145
false == flag.marked? # => EXISTS myflag
146146

147-
flag.mark(expires_in: 1.second) #=> SET myflag 1 EX 1
147+
true == flag.mark(expires_in: 1.second, force: false) #=> SET myflag 1 EX 1 NX
148+
false == flag.mark(expires_in: 10.seconds, force: false) #=> SET myflag 10 EX 1 NX
148149
true == flag.marked? #=> EXISTS myflag
149150
sleep 0.5.seconds
150151
true == flag.marked? #=> EXISTS myflag

lib/kredis/types/flag.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ class Kredis::Types::Flag < Kredis::Types::Proxying
33

44
attr_accessor :expires_in
55

6-
def mark(expires_in: nil)
7-
set 1, ex: expires_in || self.expires_in
6+
def mark(expires_in: nil, force: true)
7+
set 1, ex: expires_in || self.expires_in, nx: !force
88
end
99

1010
def marked?

test/attributes_test.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,4 +244,15 @@ def suddenly_implemented_person.id; 8; end
244244
sleep 1.1.seconds
245245
end
246246
end
247+
248+
test "expiring flag with force" do
249+
assert @person.temporary_special.mark
250+
251+
sleep 0.5.seconds
252+
assert_not @person.temporary_special.mark(force: false)
253+
254+
assert_changes "@person.temporary_special.marked?", from: true, to: false do
255+
sleep 0.6.seconds
256+
end
257+
end
247258
end

test/types/flag_test.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,19 @@ class FlagTest < ActiveSupport::TestCase
2323
sleep 0.6.seconds
2424
assert_not @flag.marked?
2525
end
26+
27+
test "mark with force" do
28+
assert @flag.mark(expires_in: 1.second, force: false)
29+
assert @flag.mark(expires_in: 1.second)
30+
assert @flag.mark(expires_in: 1.second, force: true)
31+
assert_not @flag.mark(expires_in: 10.seconds, force: false)
32+
33+
assert @flag.marked?
34+
35+
sleep 0.5.seconds
36+
assert @flag.marked?
37+
38+
sleep 0.6.seconds
39+
assert_not @flag.marked?
40+
end
2641
end

0 commit comments

Comments
 (0)