tablesalt 0.8.3 → 0.8.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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:
|