Skip to content

Commit efa429b

Browse files
committed
Set default values on type initialization
1 parent 4b1ab12 commit efa429b

21 files changed

+158
-195
lines changed

lib/kredis.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
require "kredis/log_subscriber"
99
require "kredis/namespace"
1010
require "kredis/type_casting"
11+
require "kredis/default_values"
1112
require "kredis/types"
1213
require "kredis/attributes"
1314

lib/kredis/attributes.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ module Kredis::Attributes
22
extend ActiveSupport::Concern
33

44
class_methods do
5-
def kredis_proxy(name, key: nil, default: nil, config: :shared, after_change: nil)
6-
kredis_connection_with __method__, name, key, default: default, config: config, after_change: after_change
5+
def kredis_proxy(name, key: nil, config: :shared, after_change: nil)
6+
kredis_connection_with __method__, name, key, config: config, after_change: after_change
77
end
88

99
def kredis_string(name, key: nil, default: nil, config: :shared, after_change: nil, expires_in: nil)

lib/kredis/default_values.rb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
module Kredis::DefaultValues
2+
extend ActiveSupport::Concern
3+
4+
prepended do
5+
attr_writer :default
6+
7+
def default
8+
case @default
9+
when Proc then @default.call
10+
when Symbol then send(@default)
11+
else @default
12+
end
13+
end
14+
15+
private
16+
def set_default
17+
raise NotImplementedError, "Kredis type #{self.class} needs to define #set_default"
18+
end
19+
end
20+
21+
def initialize(...)
22+
super
23+
24+
if default.present? && !exists?
25+
set_default
26+
end
27+
end
28+
end

lib/kredis/types.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
module Kredis::Types
22
autoload :CallbacksProxy, "kredis/types/callbacks_proxy"
33

4-
def proxy(key, default: nil, config: :shared, after_change: nil)
5-
type_from(Proxy, config, key, after_change: after_change, default: default)
4+
def proxy(key, config: :shared, after_change: nil)
5+
type_from(Proxy, config, key, after_change: after_change)
66
end
77

88

@@ -71,8 +71,8 @@ def set(key, default: nil, typed: :string, config: :shared, after_change: nil)
7171
type_from(Set, config, key, after_change: after_change, default: default, typed: typed)
7272
end
7373

74-
def ordered_set(key, typed: :string, limit: nil, config: :shared, after_change: nil)
75-
type_from(OrderedSet, config, key, after_change: after_change, typed: typed, limit: limit)
74+
def ordered_set(key, default: nil, typed: :string, limit: nil, config: :shared, after_change: nil)
75+
type_from(OrderedSet, config, key, after_change: after_change, default: default, typed: typed, limit: limit)
7676
end
7777

7878
def slot(key, config: :shared, after_change: nil)

lib/kredis/types/counter.rb

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,34 @@
11
class Kredis::Types::Counter < Kredis::Types::Proxying
2+
prepend Kredis::DefaultValues
3+
24
proxying :multi, :set, :incrby, :decrby, :get, :del, :exists?
35

46
attr_accessor :expires_in
57

68
def increment(by: 1)
7-
init_default_in_multi { incrby by }
9+
multi do
10+
set 0, ex: expires_in, nx: true
11+
incrby by
12+
end[-1]
813
end
914

1015
def decrement(by: 1)
11-
init_default_in_multi { decrby by }
16+
multi do
17+
set 0, ex: expires_in, nx: true
18+
decrby by
19+
end[-1]
1220
end
1321

1422
def value
15-
(get || default).to_i
23+
get.to_i
1624
end
1725

1826
def reset
1927
del
2028
end
2129

2230
private
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
31+
def set_default
32+
increment by: default
2933
end
3034
end

lib/kredis/types/enum.rb

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

33
class Kredis::Types::Enum < Kredis::Types::Proxying
4-
proxying :set, :get, :del, :exists?
4+
prepend Kredis::DefaultValues
5+
6+
proxying :set, :get, :del, :exists?, :multi
57

68
attr_accessor :values
79

@@ -17,11 +19,14 @@ def value=(value)
1719
end
1820

1921
def value
20-
get || default.presence_in(values)
22+
get
2123
end
2224

2325
def reset
24-
del
26+
multi do
27+
del
28+
set_default
29+
end
2530
end
2631

2732
private
@@ -31,4 +36,8 @@ def define_predicates_for_values
3136
define_singleton_method("#{defined_value}!") { self.value = defined_value }
3237
end
3338
end
39+
40+
def set_default
41+
self.value = default
42+
end
3443
end

lib/kredis/types/flag.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
class Kredis::Types::Flag < Kredis::Types::Proxying
2+
prepend Kredis::DefaultValues
3+
24
proxying :set, :exists?, :del
35

46
attr_accessor :expires_in
@@ -14,4 +16,9 @@ def marked?
1416
def remove
1517
del
1618
end
19+
20+
private
21+
def set_default
22+
mark if default
23+
end
1724
end

lib/kredis/types/hash.rb

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,30 @@
11
require "active_support/core_ext/hash"
22

33
class Kredis::Types::Hash < Kredis::Types::Proxying
4-
ZERO_FIELDS_ADDED = 0
4+
prepend Kredis::DefaultValues
55

6-
proxying :hset, :hdel, :hgetall, :del, :exists?, :multi, :callnx
6+
proxying :hget, :hset, :hmget, :hdel, :hgetall, :hkeys, :hvals, :del, :exists?
77

88
attr_accessor :typed
99

1010
def [](key)
11-
string_to_type(entries[key], typed)
11+
string_to_type(hget(key), typed)
1212
end
1313

1414
def []=(key, value)
1515
update key => value
1616
end
1717

18-
1918
def update(**entries)
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) }
24-
end
19+
hset entries.transform_values{ |val| type_to_string(val, typed) } if entries.flatten.any?
2520
end
2621

2722
def values_at(*keys)
28-
strings_to_types(entries.values_at(*keys) || [], typed)
23+
strings_to_types(hmget(keys) || [], typed)
2924
end
3025

3126
def delete(*keys)
32-
return ZERO_FIELDS_ADDED if keys.flatten.blank?
33-
34-
init_default_in_multi { hdel keys }
27+
hdel keys if keys.flatten.any?
3528
end
3629

3730
def remove
@@ -40,20 +33,20 @@ def remove
4033
alias clear remove
4134

4235
def entries
43-
(hgetall.presence || default || {}).transform_values { |val| string_to_type(val, typed) }.with_indifferent_access
36+
(hgetall || {}).transform_values { |val| string_to_type(val, typed) }.with_indifferent_access
4437
end
4538
alias to_h entries
4639

4740
def keys
48-
entries.keys || []
41+
hkeys || []
4942
end
5043

5144
def values
52-
strings_to_types(entries.values || [], typed)
45+
strings_to_types(hvals || [], typed)
5346
end
5447

5548
private
56-
def set_default(entries)
57-
callnx(:hset, entries.transform_values{ |val| type_to_string(val, typed) })
49+
def set_default
50+
update **default
5851
end
5952
end

lib/kredis/types/list.rb

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,38 @@
11
class Kredis::Types::List < Kredis::Types::Proxying
2-
proxying :lrange, :lrem, :lpush, :rpush, :exists?, :del, :callnx
2+
prepend Kredis::DefaultValues
3+
4+
proxying :lrange, :lrem, :lpush, :ltrim, :rpush, :exists?, :del
35

46
attr_accessor :typed
57

68
def elements
7-
values = init_default_in_multi { lrange(0, -1) }
8-
strings_to_types(values || [], typed)
9+
strings_to_types(lrange(0, -1) || [], typed)
910
end
1011
alias to_a elements
1112

1213
def remove(*elements)
13-
return [] if elements.flatten.blank?
14-
15-
init_default_in_multi do
16-
types_to_strings(elements, typed).each { |element| lrem 0, element }
17-
end
14+
types_to_strings(elements, typed).each { |element| lrem 0, element }
1815
end
1916

2017
def prepend(*elements)
21-
return self.elements.count if elements.flatten.blank?
22-
23-
init_default_in_multi do
24-
lpush types_to_strings(elements, typed)
25-
end
18+
lpush types_to_strings(elements, typed) if elements.flatten.any?
2619
end
2720

2821
def append(*elements)
29-
return self.elements.count if elements.flatten.blank?
30-
31-
init_default_in_multi do
32-
rpush types_to_strings(elements, typed)
33-
end
22+
rpush types_to_strings(elements, typed) if elements.flatten.any?
3423
end
3524
alias << append
3625

3726
def clear
3827
del
3928
end
4029

30+
def last(n = nil)
31+
n ? lrange(-n, -1) : lrange(-1, -1).first
32+
end
33+
4134
private
42-
def set_default(elements)
43-
callnx(:rpush, types_to_strings(Array(elements), typed))
35+
def set_default
36+
append default
4437
end
4538
end

lib/kredis/types/ordered_set.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
class Kredis::Types::OrderedSet < Kredis::Types::Proxying
2+
prepend Kredis::DefaultValues
3+
24
proxying :multi, :zrange, :zrem, :zadd, :zremrangebyrank, :zcard, :exists?, :del
35

46
attr_accessor :typed
@@ -72,4 +74,8 @@ def trim(from_beginning:)
7274
zremrangebyrank(0, -(limit + 1))
7375
end
7476
end
77+
78+
def set_default
79+
append default
80+
end
7581
end

0 commit comments

Comments
 (0)