Skip to content
Closed
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
133a0e0
Add default proxy value
tleish Jun 10, 2022
4eff947
Add default list values
tleish Jun 10, 2022
903f2a9
Add default to unique_list
tleish Jun 10, 2022
a668f78
Add default to flag
tleish Jun 10, 2022
35dc9bf
Add default to string
tleish Jun 10, 2022
e6bcbbd
Add default to integer
tleish Jun 10, 2022
ba0092c
Add default to decimal
tleish Jun 10, 2022
52b308b
Add default to datetime
tleish Jun 10, 2022
de0e5b1
Add default to float
tleish Jun 10, 2022
77499ed
Add default proc to enum
tleish Jun 10, 2022
46fa83a
rename default_value method to default
tleish Jun 10, 2022
abdf95a
Add default proc to set
tleish Jun 10, 2022
4933f6c
Add additional unit tests
tleish Jun 10, 2022
321d33c
Add default proc to json and counter
tleish Jun 10, 2022
411d04a
Add default proc to hash and boolean
tleish Jun 11, 2022
ed3cbd8
Add before_method_hook
tleish Jun 11, 2022
1030836
Fix for ruby 3
tleish Jun 11, 2022
1bb9288
refactor Kredis::Types::BeforeMethodsHook#before_methods
tleish Jun 20, 2022
10ceac9
code review updates
tleish Jun 20, 2022
1bff6bf
merge main
tleish Jun 29, 2022
7e85720
fix code review feedback
tleish Jul 15, 2022
180f57c
Match indentation
dhh Jul 15, 2022
bf2ba58
create custom callnx method and refactor
tleish Jul 20, 2022
d0146ee
add additional default options to set
tleish Jul 20, 2022
90d9208
move primary #set_default method to Kredis::Types::Proxying
tleish Jul 20, 2022
5c4664b
updated enum multi block to use standar [-1] pattern instead of .last
tleish Jul 20, 2022
ddf555f
refactor init_default_in_multi to not use multi if default not defined
tleish Jul 20, 2022
ef2eacb
refactor multi in Kredis::Types::Proxying
tleish Jul 21, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 37 additions & 28 deletions lib/kredis/attributes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,56 +2,56 @@ module Kredis::Attributes
extend ActiveSupport::Concern

class_methods do
def kredis_proxy(name, key: nil, config: :shared, after_change: nil)
kredis_connection_with __method__, name, key, config: config, after_change: after_change
def kredis_proxy(name, key: nil, default: nil, config: :shared, after_change: nil)
kredis_connection_with __method__, name, key, default: default, config: config, after_change: after_change
end

def kredis_string(name, key: nil, config: :shared, after_change: nil, expires_in: nil)
kredis_connection_with __method__, name, key, config: config, after_change: after_change, expires_in: expires_in
def kredis_string(name, key: nil, default: nil, config: :shared, after_change: nil, expires_in: nil)
kredis_connection_with __method__, name, key, default: default, config: config, after_change: after_change, expires_in: expires_in
end

def kredis_integer(name, key: nil, config: :shared, after_change: nil, expires_in: nil)
kredis_connection_with __method__, name, key, config: config, after_change: after_change, expires_in: expires_in
def kredis_integer(name, key: nil, default: nil, config: :shared, after_change: nil, expires_in: nil)
kredis_connection_with __method__, name, key, default: default, config: config, after_change: after_change, expires_in: expires_in
end

def kredis_decimal(name, key: nil, config: :shared, after_change: nil, expires_in: nil)
kredis_connection_with __method__, name, key, config: config, after_change: after_change, expires_in: expires_in
def kredis_decimal(name, key: nil, default: nil, config: :shared, after_change: nil, expires_in: nil)
kredis_connection_with __method__, name, key, default: default, config: config, after_change: after_change, expires_in: expires_in
end

def kredis_datetime(name, key: nil, config: :shared, after_change: nil, expires_in: nil)
kredis_connection_with __method__, name, key, config: config, after_change: after_change, expires_in: expires_in
def kredis_datetime(name, key: nil, default: nil, config: :shared, after_change: nil, expires_in: nil)
kredis_connection_with __method__, name, key, default: default, config: config, after_change: after_change, expires_in: expires_in
end

def kredis_flag(name, key: nil, config: :shared, after_change: nil, expires_in: nil)
kredis_connection_with __method__, name, key, config: config, after_change: after_change, expires_in: expires_in
def kredis_flag(name, key: nil, default: nil, config: :shared, after_change: nil, expires_in: nil)
kredis_connection_with __method__, name, key, default: default, config: config, after_change: after_change, expires_in: expires_in

define_method("#{name}?") do
send(name).marked?
end
end

def kredis_float(name, key: nil, config: :shared, after_change: nil, expires_in: nil)
kredis_connection_with __method__, name, key, config: config, after_change: after_change, expires_in: expires_in
def kredis_float(name, key: nil, default: nil, config: :shared, after_change: nil, expires_in: nil)
kredis_connection_with __method__, name, key, default: default, config: config, after_change: after_change, expires_in: expires_in
end

def kredis_enum(name, key: nil, values:, default:, config: :shared, after_change: nil)
kredis_connection_with __method__, name, key, values: values, default: default, config: config, after_change: after_change
end

def kredis_json(name, key: nil, config: :shared, after_change: nil, expires_in: nil)
kredis_connection_with __method__, name, key, config: config, after_change: after_change, expires_in: expires_in
def kredis_json(name, key: nil, default: nil, config: :shared, after_change: nil, expires_in: nil)
kredis_connection_with __method__, name, key, default: default, config: config, after_change: after_change, expires_in: expires_in
end

def kredis_list(name, key: nil, typed: :string, config: :shared, after_change: nil)
kredis_connection_with __method__, name, key, typed: typed, config: config, after_change: after_change
def kredis_list(name, key: nil, default: nil, typed: :string, config: :shared, after_change: nil)
kredis_connection_with __method__, name, key, default: default, typed: typed, config: config, after_change: after_change
end

def kredis_unique_list(name, limit: nil, key: nil, typed: :string, config: :shared, after_change: nil)
kredis_connection_with __method__, name, key, limit: limit, typed: typed, config: config, after_change: after_change
def kredis_unique_list(name, limit: nil, key: nil, default: nil, typed: :string, config: :shared, after_change: nil)
kredis_connection_with __method__, name, key, default: default, limit: limit, typed: typed, config: config, after_change: after_change
end

def kredis_set(name, key: nil, typed: :string, config: :shared, after_change: nil)
kredis_connection_with __method__, name, key, typed: typed, config: config, after_change: after_change
def kredis_set(name, key: nil, default: nil, typed: :string, config: :shared, after_change: nil)
kredis_connection_with __method__, name, key, default: default, typed: typed, config: config, after_change: after_change
end

def kredis_slot(name, key: nil, config: :shared, after_change: nil)
Expand All @@ -62,16 +62,16 @@ def kredis_slots(name, available:, key: nil, config: :shared, after_change: nil)
kredis_connection_with __method__, name, key, available: available, config: config, after_change: after_change
end

def kredis_counter(name, key: nil, config: :shared, after_change: nil, expires_in: nil)
kredis_connection_with __method__, name, key, config: config, after_change: after_change, expires_in: expires_in
def kredis_counter(name, key: nil, default: nil, config: :shared, after_change: nil, expires_in: nil)
kredis_connection_with __method__, name, key, default: default, config: config, after_change: after_change, expires_in: expires_in
end

def kredis_hash(name, key: nil, typed: :string, config: :shared, after_change: nil)
kredis_connection_with __method__, name, key, typed: typed, config: config, after_change: after_change
def kredis_hash(name, key: nil, default: nil, typed: :string, config: :shared, after_change: nil)
kredis_connection_with __method__, name, key, default: default, typed: typed, config: config, after_change: after_change
end

def kredis_boolean(name, key: nil, config: :shared, after_change: nil, expires_in: nil)
kredis_connection_with __method__, name, key, config: config, after_change: after_change, expires_in: expires_in
def kredis_boolean(name, key: nil, default: nil, config: :shared, after_change: nil, expires_in: nil)
kredis_connection_with __method__, name, key, default: default, config: config, after_change: after_change, expires_in: expires_in
end

private
Expand All @@ -84,6 +84,7 @@ def kredis_connection_with(method, name, key, **options)
if instance_variable_defined?(ivar_symbol)
instance_variable_get(ivar_symbol)
else
options.merge!(default: kredis_default_evaluated(options[:default])) if options[:default]
new_type = Kredis.send(type, kredis_key_evaluated(key) || kredis_key_for_attribute(name), **options)
instance_variable_set ivar_symbol,
after_change ? enrich_after_change_with_record_access(new_type, after_change) : new_type
Expand Down Expand Up @@ -115,4 +116,12 @@ def enrich_after_change_with_record_access(type, original_after_change)
when Symbol then Kredis::Types::CallbacksProxy.new(type, ->(_) { send(original_after_change) })
end
end

def kredis_default_evaluated(default)
case default
when Proc then Proc.new { default.call(self) }
when Symbol then send(default)
else default
end
end
end
6 changes: 5 additions & 1 deletion lib/kredis/type/json.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,11 @@ def type
end

def cast_value(value)
JSON.load(value)
if value.is_a? Hash
value.stringify_keys
else
JSON.load(value)
end
end

def serialize(value)
Expand Down
28 changes: 14 additions & 14 deletions lib/kredis/types.rb
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
module Kredis::Types
autoload :CallbacksProxy, "kredis/types/callbacks_proxy"

def proxy(key, config: :shared, after_change: nil)
type_from(Proxy, config, key, after_change: after_change)
def proxy(key, default: nil, config: :shared, after_change: nil)
type_from(Proxy, config, key, after_change: after_change, default: default)
end


Expand Down Expand Up @@ -39,36 +39,36 @@ def json(key, default: nil, config: :shared, after_change: nil, expires_in: nil)
end


def counter(key, expires_in: nil, config: :shared, after_change: nil)
type_from(Counter, config, key, after_change: after_change, expires_in: expires_in)
def counter(key, expires_in: nil, default: nil, config: :shared, after_change: nil)
type_from(Counter, config, key, after_change: after_change, default: default, expires_in: expires_in)
end

def cycle(key, values:, expires_in: nil, config: :shared, after_change: nil)
type_from(Cycle, config, key, after_change: after_change, values: values, expires_in: expires_in)
end

def flag(key, config: :shared, after_change: nil, expires_in: nil)
type_from(Flag, config, key, after_change: after_change, expires_in: expires_in)
def flag(key, default: nil, config: :shared, after_change: nil, expires_in: nil)
type_from(Flag, config, key, after_change: after_change, default: default, expires_in: expires_in)
end

def enum(key, values:, default:, config: :shared, after_change: nil)
type_from(Enum, config, key, after_change: after_change, values: values, default: default)
end

def hash(key, typed: :string, config: :shared, after_change: nil)
type_from(Hash, config, key, after_change: after_change, typed: typed)
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, typed: :string, config: :shared, after_change: nil)
type_from(List, config, key, after_change: after_change, typed: typed)
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)
end

def unique_list(key, typed: :string, limit: nil, config: :shared, after_change: nil)
type_from(UniqueList, config, key, after_change: after_change, typed: typed, limit: limit)
def unique_list(key, default: nil, typed: :string, limit: nil, config: :shared, after_change: nil)
type_from(UniqueList, config, key, after_change: after_change, default: default, typed: typed, limit: limit)
end

def set(key, typed: :string, config: :shared, after_change: nil)
type_from(Set, config, key, after_change: after_change, typed: typed)
def set(key, default: nil, typed: :string, config: :shared, after_change: nil)
type_from(Set, config, key, after_change: after_change, default: default, typed: typed)
end

def slot(key, config: :shared, after_change: nil)
Expand Down
11 changes: 11 additions & 0 deletions lib/kredis/types/before_methods_hook.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
module Kredis::Types::BeforeMethodsHook
def before_methods(*methods, invoke:)
prepend(@method_wrapper = Module.new) unless @method_wrapper
methods.each do |method_name|
@method_wrapper.send(:define_method, method_name) do |*args, **kwargs, &block|
send invoke
super(*args, **kwargs, &block)
end
end
end
end
17 changes: 9 additions & 8 deletions lib/kredis/types/counter.rb
Original file line number Diff line number Diff line change
@@ -1,20 +1,16 @@
class Kredis::Types::Counter < Kredis::Types::Proxying
proxying :multi, :set, :incrby, :decrby, :get, :del, :exists?

before_methods :value, :increment, :decrement, invoke: :set_default

attr_accessor :expires_in

def increment(by: 1)
multi do
set 0, ex: expires_in, nx: true
incrby by
end[-1]
incrby by
end

def decrement(by: 1)
multi do
set 0, ex: expires_in, nx: true
decrby by
end[-1]
decrby by
end

def value
Expand All @@ -24,4 +20,9 @@ def value
def reset
del
end

private
def set_default
set(default.to_i, ex: expires_in, nx: true) unless exists?
end
end
8 changes: 6 additions & 2 deletions lib/kredis/types/enum.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
class Kredis::Types::Enum < Kredis::Types::Proxying
proxying :set, :get, :del, :exists?

attr_accessor :values, :default
attr_accessor :values

def initialize(...)
super
Expand All @@ -17,7 +17,7 @@ def value=(value)
end

def value
get || default
get || initialize_with_default
end

def reset
Expand All @@ -31,4 +31,8 @@ def define_predicates_for_values
define_singleton_method("#{defined_value}!") { self.value = defined_value }
end
end

def initialize_with_default
default { |default_value| self.value = default_value }
end
end
10 changes: 9 additions & 1 deletion lib/kredis/types/flag.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,18 @@ def mark(expires_in: nil, force: true)
end

def marked?
exists?
exists? || exists_after_default_value?
end

def remove
del
end

private
def exists_after_default_value?
!!default do |default_value|
mark if default_value
!!default_value
end
end
end
7 changes: 7 additions & 0 deletions lib/kredis/types/hash.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
class Kredis::Types::Hash < Kredis::Types::Proxying
proxying :hget, :hset, :hmget, :hdel, :hgetall, :hkeys, :hvals, :del, :exists?

before_methods :[], :[]=, :entries, :keys, :values, :values_at, :delete, invoke: :set_default

attr_accessor :typed

def [](key)
Expand Down Expand Up @@ -42,4 +44,9 @@ def keys
def values
strings_to_types(hvals || [], typed)
end

private
def set_default
update(**default) unless exists? || default.nil?
end
end
11 changes: 10 additions & 1 deletion lib/kredis/types/list.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ class Kredis::Types::List < Kredis::Types::Proxying
attr_accessor :typed

def elements
strings_to_types(lrange(0, -1) || [], typed)
value = exists? ? lrange(0, -1) : initialize_with_default || []
strings_to_types(value, typed)
end
alias to_a elements

Expand All @@ -24,4 +25,12 @@ def append(*elements)
def clear
del
end

private
def initialize_with_default
default do |default_value|
append(default_value)
elements
end
end
end
18 changes: 16 additions & 2 deletions lib/kredis/types/proxying.rb
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
require "active_support/core_ext/module/delegation"
require "kredis/types/before_methods_hook"

class Kredis::Types::Proxying
attr_accessor :proxy, :key
extend Kredis::Types::BeforeMethodsHook

attr_accessor :proxy, :redis, :key

def self.proxying(*commands)
delegate *commands, to: :proxy
end

def initialize(redis, key, **options)
@key = key
@redis, @key = redis, key
@default = options.delete(:default)
@proxy = Kredis::Types::Proxy.new(redis, key)
options.each { |key, value| send("#{key}=", value) }
end
Expand All @@ -19,4 +23,14 @@ def failsafe(returning: nil, &block)

private
delegate :type_to_string, :string_to_type, :types_to_strings, :strings_to_types, to: :Kredis

def default
if @default.is_a?(Proc) && block_given?
yield(@default.call)
elsif @default.is_a?(Proc)
@default.call
else
@default
end
end
end
Loading