Skip to content

Commit ddf555f

Browse files
committed
refactor init_default_in_multi to not use multi if default not defined
1 parent 5c4664b commit ddf555f

File tree

11 files changed

+115
-88
lines changed

11 files changed

+115
-88
lines changed

lib/kredis/types/counter.rb

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,11 @@ class Kredis::Types::Counter < Kredis::Types::Proxying
44
attr_accessor :expires_in
55

66
def increment(by: 1)
7-
multi do
8-
initialize_with_default
9-
incrby by
10-
end[-1]
7+
init_default_in_multi { incrby by }
118
end
129

1310
def decrement(by: 1)
14-
multi do
15-
initialize_with_default
16-
decrby by
17-
end[-1]
11+
init_default_in_multi { decrby by }
1812
end
1913

2014
def value
@@ -26,7 +20,11 @@ def reset
2620
end
2721

2822
private
29-
def initialize_with_default
30-
set default.to_i, ex: expires_in, nx: true
23+
def set_default(value)
24+
set value.to_i, ex: expires_in, nx: true
25+
end
26+
27+
def default
28+
super.to_i
3129
end
3230
end

lib/kredis/types/enum.rb

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
require "active_support/core_ext/object/inclusion"
22

33
class Kredis::Types::Enum < Kredis::Types::Proxying
4-
proxying :multi, :set, :get, :del, :exists?
4+
proxying :set, :get, :del, :exists?
55

66
attr_accessor :values
77

@@ -17,10 +17,7 @@ def value=(value)
1717
end
1818

1919
def value
20-
multi do
21-
initialize_with_default
22-
get
23-
end[-1]
20+
get || default.presence_in(values)
2421
end
2522

2623
def reset
@@ -34,10 +31,4 @@ def define_predicates_for_values
3431
define_singleton_method("#{defined_value}!") { self.value = defined_value }
3532
end
3633
end
37-
38-
def set_default(value)
39-
if validated_choice = value.presence_in(values)
40-
set validated_choice, nx: true
41-
end
42-
end
4334
end

lib/kredis/types/hash.rb

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
require "active_support/core_ext/hash"
22

33
class Kredis::Types::Hash < Kredis::Types::Proxying
4+
ZERO_FIELDS_ADDED = 0
5+
46
proxying :hset, :hdel, :hgetall, :del, :exists?, :multi, :callnx
57

68
attr_accessor :typed
@@ -15,9 +17,10 @@ def []=(key, value)
1517

1618

1719
def update(**entries)
18-
multi do
19-
initialize_with_default
20-
hset entries.transform_values{ |val| type_to_string(val, typed) } if entries.flatten.any?
20+
return ZERO_FIELDS_ADDED if entries.flatten.blank?
21+
22+
init_default_in_multi do
23+
hset entries.transform_values{ |val| type_to_string(val, typed) }
2124
end
2225
end
2326

@@ -26,10 +29,9 @@ def values_at(*keys)
2629
end
2730

2831
def delete(*keys)
29-
multi do
30-
initialize_with_default
31-
hdel keys if keys.flatten.any?
32-
end
32+
return ZERO_FIELDS_ADDED if keys.flatten.blank?
33+
34+
init_default_in_multi { hdel keys }
3335
end
3436

3537
def remove

lib/kredis/types/list.rb

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,38 +4,32 @@ class Kredis::Types::List < Kredis::Types::Proxying
44
attr_accessor :typed
55

66
def elements
7-
values = multi do
8-
initialize_with_default
9-
lrange(0, -1)
10-
end[-1]
7+
values = init_default_in_multi { lrange(0, -1) }
118
strings_to_types(values || [], typed)
129
end
1310
alias to_a elements
1411

1512
def remove(*elements)
16-
return if elements.empty?
13+
return [] if elements.flatten.blank?
1714

18-
multi do
19-
initialize_with_default
15+
init_default_in_multi do
2016
types_to_strings(elements, typed).each { |element| lrem 0, element }
2117
end
2218
end
2319

2420
def prepend(*elements)
25-
return if elements.empty?
21+
return self.elements.count if elements.flatten.blank?
2622

27-
multi do
28-
initialize_with_default
29-
lpush types_to_strings(elements, typed) if elements.flatten.any?
23+
init_default_in_multi do
24+
lpush types_to_strings(elements, typed)
3025
end
3126
end
3227

3328
def append(*elements)
34-
return if elements.empty?
29+
return self.elements.count if elements.flatten.blank?
3530

36-
multi do
37-
initialize_with_default
38-
rpush types_to_strings(elements, typed) if elements.flatten.any?
31+
init_default_in_multi do
32+
rpush types_to_strings(elements, typed)
3933
end
4034
end
4135
alias << append

lib/kredis/types/proxying.rb

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,19 @@ def default
2929
end
3030
end
3131

32-
def initialize_with_default
33-
default_value = default
34-
set_default(default_value) if default_value.present?
32+
def init_default_in_multi(&block)
33+
if (default_value = default).blank?
34+
block.call
35+
else
36+
multi_results = multi do
37+
set_default(default_value)
38+
block.call
39+
end
40+
Array(multi_results)[-1] # convert to array in case in the middle of nested multi
41+
end
3542
end
3643

3744
def set_default(value)
38-
set type_to_string(value, typed), ex: expires_in, nx: true
45+
raise NotImplementedError, "kredis type needs to define #set_default"
3946
end
4047
end

lib/kredis/types/scalar.rb

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,7 @@ def value=(value)
88
end
99

1010
def value
11-
get_value = multi do
12-
initialize_with_default
13-
get
14-
end[-1]
15-
string_to_type(get_value, typed)
11+
string_to_type(init_default_in_multi{ get }, typed)
1612
end
1713

1814
def to_s
@@ -34,4 +30,9 @@ def expire_in(seconds)
3430
def expire_at(datetime)
3531
expireat datetime.to_i
3632
end
33+
34+
private
35+
def set_default(value)
36+
set type_to_string(value, typed), ex: expires_in, nx: true
37+
end
3738
end

lib/kredis/types/set.rb

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,55 +4,47 @@ class Kredis::Types::Set < Kredis::Types::Proxying
44
attr_accessor :typed
55

66
def members
7-
values = multi do
8-
initialize_with_default
9-
smembers
10-
end[-1]
7+
values = init_default_in_multi { smembers }
118
strings_to_types(values || [], typed).sort
129
end
1310
alias to_a members
1411

1512
def add(*members)
16-
multi do
17-
initialize_with_default
18-
sadd types_to_strings(members, typed) if members.flatten.any?
13+
return size if members.flatten.blank?
14+
15+
init_default_in_multi do
16+
sadd types_to_strings(members, typed)
1917
end
2018
end
2119
alias << add
2220

2321
def remove(*members)
24-
multi do
25-
initialize_with_default
26-
srem types_to_strings(members, typed) if members.flatten.any?
22+
return size if members.flatten.blank?
23+
24+
init_default_in_multi do
25+
srem types_to_strings(members, typed)
2726
end
2827
end
2928

3029
def replace(*members)
30+
return size if members.flatten.blank?
31+
3132
multi do
3233
del
3334
add members
34-
end
35+
end[-1]
3536
end
3637

3738
def include?(member)
38-
multi do
39-
initialize_with_default
40-
sismember type_to_string(member, typed)
41-
end[-1]
39+
init_default_in_multi { sismember type_to_string(member, typed) }
4240
end
4341

4442
def size
45-
multi do
46-
initialize_with_default
47-
scard
48-
end[-1].to_i
43+
init_default_in_multi { scard }.to_i
4944
end
5045

5146
def take
52-
multi do
53-
initialize_with_default
54-
spop
55-
end[-1]
47+
init_default_in_multi { spop }
5648
end
5749

5850
def clear

test/types/enum_test.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ class EnumTest < ActiveSupport::TestCase
1313
end
1414

1515
test "does not set default for invalid option" do
16-
@enum = Kredis.enum "myenum", values: %w[ one two three ], default: ->() { "four" }
17-
assert_nil @enum.value
16+
enum = Kredis.enum "myenum1", values: [ 1, 2, 3 ], default: ->() { nil }
17+
assert_nil enum.value
18+
enum = Kredis.enum "myenum2", values: [ 1, 2, 3 ], default: ->() { 4 }
19+
assert_nil enum.value
1820
end
1921

2022
test "predicates" do

test/types/hash_test.rb

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,15 @@ class HashTest < ActiveSupport::TestCase
1818
end
1919

2020
test "update" do
21-
@hash.update(key: :value)
21+
update_count = @hash.update(key: :value)
22+
assert_equal(1, update_count)
23+
24+
update_count = @hash.update(key: :value)
25+
assert_equal(0, update_count)
26+
27+
update_count = @hash.update
28+
assert_equal(0, update_count)
29+
2230
@hash.update("key2" => "value2", "key3" => "value3")
2331
assert_equal({ "key" => "value", "key2" => "value2", "key3" => "value3" }, @hash.to_h)
2432
end
@@ -33,12 +41,17 @@ class HashTest < ActiveSupport::TestCase
3341
@hash.update("key2" => "value2", "key3" => "value3")
3442
assert_equal({ "key" => "value", "key2" => "value2", "key3" => "value3" }, @hash.to_h)
3543

36-
@hash.delete("key")
44+
delete_count = @hash.delete("key")
45+
assert_equal(1, delete_count)
3746
assert_equal({ "key2" => "value2", "key3" => "value3" }, @hash.to_h)
3847

39-
@hash.delete("bogus")
48+
delete_count = @hash.delete("bogus")
49+
assert_equal(0, delete_count)
4050
assert_equal({ "key2" => "value2", "key3" => "value3" }, @hash.to_h)
4151

52+
delete_count = @hash.delete
53+
assert_equal(0, delete_count)
54+
4255
@hash.delete("key2", "key3")
4356
assert_equal({}, @hash.to_h)
4457
end

test/types/list_test.rb

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@ class ListTest < ActiveSupport::TestCase
1111
end
1212

1313
test "append nothing" do
14-
@list.append(%w[ 1 2 3 ])
15-
@list.append([])
14+
list_length = @list.append(%w[ 1 2 3 ])
15+
assert_equal 3, list_length
16+
list_length = @list.append([])
17+
assert_equal 3, list_length
1618
assert_equal %w[ 1 2 3 ], @list.to_a
1719
end
1820

@@ -23,8 +25,10 @@ class ListTest < ActiveSupport::TestCase
2325
end
2426

2527
test "prepend nothing" do
26-
@list.prepend("1", "2", "3")
27-
@list.prepend([])
28+
list_length = @list.prepend("1", "2", "3")
29+
assert_equal 3, list_length
30+
list_length = @list.prepend([])
31+
assert_equal 3, list_length
2832
assert_equal %w[ 3 2 1 ], @list.elements
2933
end
3034

@@ -35,6 +39,16 @@ class ListTest < ActiveSupport::TestCase
3539
assert_equal %w[ 4 ], @list.elements
3640
end
3741

42+
test "remove nothing" do
43+
@list.append(%w[ 1 2 3 4 ])
44+
@list.remove(%w[ 1 2 ])
45+
removed_items = @list.remove(3)
46+
assert_equal %w[ 3 ], removed_items
47+
removed_items = @list.remove
48+
assert_equal [], removed_items
49+
assert_equal %w[ 4 ], @list.elements
50+
end
51+
3852
test "clear" do
3953
@list.append(%w[ 1 2 3 4 ])
4054
@list.clear

0 commit comments

Comments
 (0)