tablesalt 0.8.3 → 0.8.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/tablesalt/redis_hash/accessors.rb +44 -0
- data/lib/tablesalt/redis_hash/callbacks.rb +15 -0
- data/lib/tablesalt/redis_hash/comparisons.rb +19 -0
- data/lib/tablesalt/redis_hash/converters.rb +23 -0
- data/lib/tablesalt/redis_hash/core.rb +32 -0
- data/lib/tablesalt/redis_hash/default.rb +46 -0
- data/lib/tablesalt/redis_hash/deletions.rb +27 -0
- data/lib/tablesalt/redis_hash/enumerators.rb +52 -0
- data/lib/tablesalt/redis_hash/identity.rb +26 -0
- data/lib/tablesalt/redis_hash/insertions.rb +25 -0
- data/lib/tablesalt/redis_hash/mutations.rb +24 -0
- data/lib/tablesalt/redis_hash/predicates.rb +32 -0
- data/lib/tablesalt/redis_hash_base.rb +32 -0
- data/lib/tablesalt/version.rb +1 -1
- data/lib/tablesalt.rb +9 -2
- metadata +58 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d4f0e11454d95394d0070ffa386056836628db24f0070be4524ea5cf70a17912
|
4
|
+
data.tar.gz: 1b27619517487c59c84324b3c8313755ad2274a15eecba5b8ff1e17355cae3e7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 92d11b14fe9b71135e9b75e23bc885070854fac486982be65802aec6b2462b9a724fc75d5e5345985b0cd7e973cd213ecfa285c5089827632759501b3b3773c2
|
7
|
+
data.tar.gz: 11a193ee36b492d3c3167cb9ad6668de036b99dd8341924c05b47ec7e63d847b53855d83e416c8ee9cb146cd8350b015ef9a612afef780621ef9e240d05a442e
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Accessors allow for the retrieval of data from the Hash.
|
4
|
+
module Tablesalt
|
5
|
+
module RedisHash
|
6
|
+
module Accessors
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
delegate :assoc, :compact, :dig, :fetch_values, :flatten, :key, :rassoc, :rehash, to: :to_h
|
11
|
+
end
|
12
|
+
|
13
|
+
def [](field)
|
14
|
+
hget(redis_key, field) || default(field)
|
15
|
+
end
|
16
|
+
|
17
|
+
def fetch(field, default = nil)
|
18
|
+
value = self[field]
|
19
|
+
return value if value.present?
|
20
|
+
return yield(field) if block_given?
|
21
|
+
return default unless default.nil?
|
22
|
+
|
23
|
+
raise KeyError, "key not found: \"#{field}\""
|
24
|
+
end
|
25
|
+
|
26
|
+
def keys
|
27
|
+
hkeys(redis_key)
|
28
|
+
end
|
29
|
+
|
30
|
+
def length
|
31
|
+
hlen(redis_key)
|
32
|
+
end
|
33
|
+
alias_method :size, :length
|
34
|
+
|
35
|
+
def values
|
36
|
+
hvals(redis_key)
|
37
|
+
end
|
38
|
+
|
39
|
+
def values_at(*fields)
|
40
|
+
hmget(*fields.flatten.unshift(redis_key))
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Callbacks provide an extensible mechanism for hooking into a RedisHash.
|
4
|
+
module Tablesalt
|
5
|
+
module RedisHash
|
6
|
+
module Callbacks
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
include ActiveSupport::Callbacks
|
11
|
+
define_callbacks :initialize, :reload
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Comparisons encompasses equality and set inclusion.
|
4
|
+
module Tablesalt
|
5
|
+
module RedisHash
|
6
|
+
module Comparisons
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
delegate :<, :<=, :>, :>=, :compare_by_identity, :compare_by_identity?, to: :to_h
|
11
|
+
end
|
12
|
+
|
13
|
+
def eql?(other)
|
14
|
+
other.hash == hash
|
15
|
+
end
|
16
|
+
alias_method :==, :eql?
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Converters allow for other objects to be coerced into a RedisHash.
|
4
|
+
module Tablesalt
|
5
|
+
module RedisHash
|
6
|
+
module Converters
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
class_methods do
|
10
|
+
def [](*arguments)
|
11
|
+
options = block_given? ? yield({}) : {}
|
12
|
+
new(**options).merge!(Hash[*arguments])
|
13
|
+
end
|
14
|
+
|
15
|
+
def try_convert(object, &block)
|
16
|
+
return object if object.is_a?(RedisHash)
|
17
|
+
|
18
|
+
self[object, &block] if object.respond_to?(:to_hash)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# A RedisHash is a wrapper around a h<key> stored in Redis.
|
4
|
+
module Tablesalt
|
5
|
+
module RedisHash
|
6
|
+
module Core
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
attr_reader :redis_key, :redis
|
11
|
+
delegate :del, :hdel, :hexists, :hget, :hgetall, :hkeys, :hlen, :hmget, :hmset, :hset, :hvals, to: :redis
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def set_default(default, &block)
|
16
|
+
self.default = default if default.present?
|
17
|
+
self.default_proc = block if block_given?
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(default = nil, redis_key: SecureRandom.hex, redis: Redis.new, &block)
|
22
|
+
raise ArgumentError, "cannot specify both block and static default" if block_given? && default.present?
|
23
|
+
|
24
|
+
run_callbacks(:initialize) do
|
25
|
+
set_default(default, &block)
|
26
|
+
@redis_key = redis_key
|
27
|
+
@redis = redis
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# A Default allows a static or procedurally generated value to be returned on failed lookups.
|
4
|
+
module Tablesalt
|
5
|
+
module RedisHash
|
6
|
+
module Default
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
attr_reader :default_proc
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def to_default(field = nil, allow_nil_field: true)
|
15
|
+
@default.presence || (default_proc&.call(self, field) if !field.nil? || allow_nil_field)
|
16
|
+
end
|
17
|
+
|
18
|
+
def validate_proc(proc)
|
19
|
+
raise TypeError, "wrong default_proc type #{proc.class.name} (expected Proc)" unless proc.is_a? Proc
|
20
|
+
|
21
|
+
validate_lambda_arity(proc.arity) if proc.lambda?
|
22
|
+
end
|
23
|
+
|
24
|
+
def validate_lambda_arity(arity)
|
25
|
+
raise TypeError, "default_proc takes two arguments (2 for #{arity})" if arity >= 0 && arity != 2
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def default=(value)
|
30
|
+
@default = value
|
31
|
+
@default_proc = nil
|
32
|
+
end
|
33
|
+
|
34
|
+
def default_proc=(value)
|
35
|
+
validate_proc(value) unless value.nil?
|
36
|
+
|
37
|
+
@default = nil
|
38
|
+
@default_proc = value
|
39
|
+
end
|
40
|
+
|
41
|
+
def default(field = nil)
|
42
|
+
to_default(field, allow_nil_field: false)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Deletions allow for the removal of data from the Hash.
|
4
|
+
module Tablesalt
|
5
|
+
module RedisHash
|
6
|
+
module Deletions
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
def clear
|
10
|
+
del(redis_key) and {}
|
11
|
+
end
|
12
|
+
|
13
|
+
def delete(field)
|
14
|
+
value = self[field]
|
15
|
+
result = hdel(redis_key, field)
|
16
|
+
(result == 0 && block_given?) ? yield(field) : value
|
17
|
+
end
|
18
|
+
|
19
|
+
def shift
|
20
|
+
return to_default if empty?
|
21
|
+
|
22
|
+
field = keys.first
|
23
|
+
[ field, delete(field) ]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Enumerators allow for the traversal and manipulation of data in the Hash.
|
4
|
+
module Tablesalt
|
5
|
+
module RedisHash
|
6
|
+
module Enumerators
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
delegate :each, :each_pair, :each_key, :each_value, :reject, :select, :transform_values, to: :to_h
|
11
|
+
end
|
12
|
+
|
13
|
+
def delete_if
|
14
|
+
return enum_for(__method__) unless block_given?
|
15
|
+
|
16
|
+
each { |field, value| delete(field) if yield(field, value) }
|
17
|
+
|
18
|
+
to_h
|
19
|
+
end
|
20
|
+
|
21
|
+
def keep_if
|
22
|
+
return enum_for(__method__) unless block_given?
|
23
|
+
|
24
|
+
delete_if { |field, value| !yield(field, value) }
|
25
|
+
end
|
26
|
+
|
27
|
+
def reject!(&block)
|
28
|
+
return enum_for(__method__) unless block_given?
|
29
|
+
|
30
|
+
original = to_h
|
31
|
+
delete_if(&block)
|
32
|
+
current = to_h
|
33
|
+
|
34
|
+
(original == current) ? nil : current
|
35
|
+
end
|
36
|
+
|
37
|
+
def select!
|
38
|
+
return enum_for(__method__) unless block_given?
|
39
|
+
|
40
|
+
reject! { |*arguments| !yield(*arguments) }
|
41
|
+
end
|
42
|
+
|
43
|
+
def transform_values!
|
44
|
+
return enum_for(__method__) unless block_given?
|
45
|
+
|
46
|
+
each { |field, value| store(field, yield(value)) }
|
47
|
+
|
48
|
+
to_h
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Identity relates to the specific object instance.
|
4
|
+
module Tablesalt
|
5
|
+
module RedisHash
|
6
|
+
module Identity
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
delegate :inspect, :to_proc, :to_s, to: :to_h
|
11
|
+
end
|
12
|
+
|
13
|
+
def hash
|
14
|
+
{ redis_id: redis.id, redis_key: redis_key }.hash
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_hash
|
18
|
+
to_h
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_h
|
22
|
+
hgetall(redis_key)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Insertions allow for the addition of data into the RedisHash.
|
4
|
+
module Tablesalt
|
5
|
+
module RedisHash
|
6
|
+
module Insertions
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
delegate :merge, to: :to_h
|
11
|
+
end
|
12
|
+
|
13
|
+
def merge!(other_hash)
|
14
|
+
hmset(*other_hash.to_a.unshift(redis_key))
|
15
|
+
self
|
16
|
+
end
|
17
|
+
alias_method :update, :merge!
|
18
|
+
|
19
|
+
def store(field, value)
|
20
|
+
hset(redis_key, field, value)
|
21
|
+
end
|
22
|
+
alias_method :[]=, :store
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Mutations allow for the manipulation of data in the Hash.
|
4
|
+
module Tablesalt
|
5
|
+
module RedisHash
|
6
|
+
module Mutations
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
def compact!
|
10
|
+
delete_if { |_, value| value.blank? }
|
11
|
+
end
|
12
|
+
|
13
|
+
def invert
|
14
|
+
inversion = to_h.invert
|
15
|
+
clear
|
16
|
+
inversion.each { |key, value| self[key] = value }
|
17
|
+
end
|
18
|
+
|
19
|
+
def replace(other_hash)
|
20
|
+
clear and merge!(other_hash)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Predicates enable querying the Hash for data.
|
4
|
+
module Tablesalt
|
5
|
+
module RedisHash
|
6
|
+
module Predicates
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
def any?(&block)
|
10
|
+
return length > 0 unless block_given?
|
11
|
+
|
12
|
+
to_h.any?(&block)
|
13
|
+
end
|
14
|
+
|
15
|
+
def empty?
|
16
|
+
length == 0
|
17
|
+
end
|
18
|
+
|
19
|
+
def include?(field)
|
20
|
+
hexists(redis_key, field)
|
21
|
+
end
|
22
|
+
alias_method :has_key?, :include?
|
23
|
+
alias_method :key?, :include?
|
24
|
+
alias_method :member?, :include?
|
25
|
+
|
26
|
+
def value?(value)
|
27
|
+
values.include? value
|
28
|
+
end
|
29
|
+
alias_method :has_value?, :value?
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "redis_hash/default"
|
4
|
+
require_relative "redis_hash/callbacks"
|
5
|
+
require_relative "redis_hash/core"
|
6
|
+
require_relative "redis_hash/identity"
|
7
|
+
require_relative "redis_hash/accessors"
|
8
|
+
require_relative "redis_hash/comparisons"
|
9
|
+
require_relative "redis_hash/predicates"
|
10
|
+
require_relative "redis_hash/insertions"
|
11
|
+
require_relative "redis_hash/deletions"
|
12
|
+
require_relative "redis_hash/enumerators"
|
13
|
+
require_relative "redis_hash/mutations"
|
14
|
+
require_relative "redis_hash/converters"
|
15
|
+
|
16
|
+
module Tablesalt
|
17
|
+
class RedisHashBase
|
18
|
+
include Technologic
|
19
|
+
include Tablesalt::RedisHash::Default
|
20
|
+
include Tablesalt::RedisHash::Callbacks
|
21
|
+
include Tablesalt::RedisHash::Core
|
22
|
+
include Tablesalt::RedisHash::Identity
|
23
|
+
include Tablesalt::RedisHash::Accessors
|
24
|
+
include Tablesalt::RedisHash::Comparisons
|
25
|
+
include Tablesalt::RedisHash::Predicates
|
26
|
+
include Tablesalt::RedisHash::Insertions
|
27
|
+
include Tablesalt::RedisHash::Deletions
|
28
|
+
include Tablesalt::RedisHash::Enumerators
|
29
|
+
include Tablesalt::RedisHash::Mutations
|
30
|
+
include Tablesalt::RedisHash::Converters
|
31
|
+
end
|
32
|
+
end
|
data/lib/tablesalt/version.rb
CHANGED
data/lib/tablesalt.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tablesalt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jordan Minneti
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-05-
|
12
|
-
dependencies:
|
11
|
+
date: 2019-05-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 5.2.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 5.2.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: technologic
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.8.4
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.8.4
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: redis
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '4.0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '4.0'
|
13
55
|
description: A package of helpers that introduce some conventions and convenience
|
14
56
|
for common behaviors
|
15
57
|
email:
|
@@ -21,6 +63,19 @@ files:
|
|
21
63
|
- LICENSE.txt
|
22
64
|
- README.md
|
23
65
|
- lib/tablesalt.rb
|
66
|
+
- lib/tablesalt/redis_hash/accessors.rb
|
67
|
+
- lib/tablesalt/redis_hash/callbacks.rb
|
68
|
+
- lib/tablesalt/redis_hash/comparisons.rb
|
69
|
+
- lib/tablesalt/redis_hash/converters.rb
|
70
|
+
- lib/tablesalt/redis_hash/core.rb
|
71
|
+
- lib/tablesalt/redis_hash/default.rb
|
72
|
+
- lib/tablesalt/redis_hash/deletions.rb
|
73
|
+
- lib/tablesalt/redis_hash/enumerators.rb
|
74
|
+
- lib/tablesalt/redis_hash/identity.rb
|
75
|
+
- lib/tablesalt/redis_hash/insertions.rb
|
76
|
+
- lib/tablesalt/redis_hash/mutations.rb
|
77
|
+
- lib/tablesalt/redis_hash/predicates.rb
|
78
|
+
- lib/tablesalt/redis_hash_base.rb
|
24
79
|
- lib/tablesalt/version.rb
|
25
80
|
homepage: https://www.freshly.com
|
26
81
|
licenses:
|