redcord 0.0.2.alpha → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/redcord.rb +29 -2
- data/lib/redcord.rbi +0 -16
- data/lib/redcord/actions.rb +77 -42
- data/lib/redcord/base.rb +4 -0
- data/lib/redcord/configurations.rb +4 -0
- data/lib/redcord/logger.rb +1 -1
- data/lib/redcord/prepared_redis.rb +136 -7
- data/lib/redcord/railtie.rb +19 -0
- data/lib/redcord/redis_connection.rb +0 -11
- data/lib/redcord/relation.rb +34 -24
- data/lib/redcord/tracer.rb +48 -0
- metadata +4 -4
- data/lib/redcord/server_scripts.rb +0 -78
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7612a04876a98367ab0b8a6d94a0254d0d79aa564b3bd43e5119785f114d962c
|
4
|
+
data.tar.gz: 9b679659f7087bfd65d202a58be3f0836b1a7e8bc889f16d34e423340ce8c4ed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 44796213c268dfb63e59472c9b59470e3b01dd7a26b0acc63aa48e0f7ff537c25906957d3700b24639eb41d9526708898dc8ff82a4eeea193fc7ec1a3a5cfe43
|
7
|
+
data.tar.gz: d656f40756c62507113ac660429e9dc10751f40158c8768d47ccdb238ac2d392ccdfc055744ef68837608e7ed33f5673527178a9d0ef77a928d4cabd49da055f
|
data/lib/redcord.rb
CHANGED
@@ -1,9 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# typed: strict
|
2
|
-
module Redcord
|
3
|
-
end
|
4
4
|
|
5
5
|
require 'sorbet-runtime'
|
6
6
|
|
7
|
+
module Redcord
|
8
|
+
extend T::Sig
|
9
|
+
|
10
|
+
@@configuration_blks = T.let(
|
11
|
+
[],
|
12
|
+
T::Array[T.proc.params(arg0: T.untyped).void],
|
13
|
+
)
|
14
|
+
|
15
|
+
sig {
|
16
|
+
params(
|
17
|
+
blk: T.proc.params(arg0: T.untyped).void,
|
18
|
+
).void
|
19
|
+
}
|
20
|
+
def self.configure(&blk)
|
21
|
+
@@configuration_blks << blk
|
22
|
+
end
|
23
|
+
|
24
|
+
sig { void }
|
25
|
+
def self._after_initialize!
|
26
|
+
@@configuration_blks.each do |blk|
|
27
|
+
blk.call(Redcord::Base)
|
28
|
+
end
|
29
|
+
|
30
|
+
@@configuration_blks.clear
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
7
34
|
require 'redcord/base'
|
8
35
|
require 'redcord/migration'
|
9
36
|
require 'redcord/migration/migrator'
|
data/lib/redcord.rbi
CHANGED
@@ -45,22 +45,6 @@ module Redcord::TTL::ClassMethods
|
|
45
45
|
include Redcord::Serializer::ClassMethods
|
46
46
|
end
|
47
47
|
|
48
|
-
module Redcord::ServerScripts
|
49
|
-
include Kernel
|
50
|
-
|
51
|
-
sig do
|
52
|
-
params(
|
53
|
-
sha: String,
|
54
|
-
keys: T::Array[T.untyped],
|
55
|
-
argv: T::Array[T.untyped],
|
56
|
-
).returns(T.untyped)
|
57
|
-
end
|
58
|
-
def evalsha(sha, keys: [], argv:[]); end
|
59
|
-
|
60
|
-
sig { returns(T::Hash[Symbol, String]) }
|
61
|
-
def redcord_server_script_shas; end
|
62
|
-
end
|
63
|
-
|
64
48
|
module Redcord::Actions::ClassMethods
|
65
49
|
include Kernel
|
66
50
|
include Redcord::RedisConnection::ClassMethods
|
data/lib/redcord/actions.rb
CHANGED
@@ -26,27 +26,42 @@ module Redcord::Actions
|
|
26
26
|
|
27
27
|
sig { params(args: T::Hash[Symbol, T.untyped]).returns(T.untyped) }
|
28
28
|
def create!(args)
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
29
|
+
Redcord::Base.trace(
|
30
|
+
'redcord_actions_class_methods_create!',
|
31
|
+
model_name: name,
|
32
|
+
) do
|
33
|
+
args[:created_at] = args[:updated_at] = Time.zone.now
|
34
|
+
instance = TypeCoerce[self].new.from(args)
|
35
|
+
id = redis.create_hash_returning_id(model_key, to_redis_hash(args))
|
36
|
+
instance.send(:id=, id)
|
37
|
+
instance
|
38
|
+
end
|
34
39
|
end
|
35
40
|
|
36
41
|
sig { params(id: T.untyped).returns(T.untyped) }
|
37
42
|
def find(id)
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
43
|
+
Redcord::Base.trace(
|
44
|
+
'redcord_actions_class_methods_find',
|
45
|
+
model_name: name,
|
46
|
+
) do
|
47
|
+
instance_key = "#{model_key}:id:#{id}"
|
48
|
+
args = redis.hgetall(instance_key)
|
49
|
+
if args.empty?
|
50
|
+
raise Redcord::RecordNotFound, "Couldn't find #{name} with 'id'=#{id}"
|
51
|
+
end
|
52
|
+
|
53
|
+
coerce_and_set_id(args, id)
|
42
54
|
end
|
43
|
-
|
44
|
-
coerce_and_set_id(args, id)
|
45
55
|
end
|
46
56
|
|
47
57
|
sig { params(args: T::Hash[Symbol, T.untyped]).returns(T.untyped) }
|
48
58
|
def find_by(args)
|
49
|
-
|
59
|
+
Redcord::Base.trace(
|
60
|
+
'redcord_actions_class_methods_find_by_args',
|
61
|
+
model_name: name,
|
62
|
+
) do
|
63
|
+
where(args).to_a.first
|
64
|
+
end
|
50
65
|
end
|
51
66
|
|
52
67
|
sig { params(args: T::Hash[Symbol, T.untyped]).returns(Redcord::Relation) }
|
@@ -56,7 +71,12 @@ module Redcord::Actions
|
|
56
71
|
|
57
72
|
sig { params(id: T.untyped).returns(T::Boolean) }
|
58
73
|
def destroy(id)
|
59
|
-
|
74
|
+
Redcord::Base.trace(
|
75
|
+
'redcord_actions_class_methods_destroy',
|
76
|
+
model_name: name,
|
77
|
+
) do
|
78
|
+
redis.delete_hash(model_key, id) == 1
|
79
|
+
end
|
60
80
|
end
|
61
81
|
end
|
62
82
|
|
@@ -88,46 +108,61 @@ module Redcord::Actions
|
|
88
108
|
|
89
109
|
sig { void }
|
90
110
|
def save!
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
_id
|
104
|
-
|
105
|
-
|
111
|
+
Redcord::Base.trace(
|
112
|
+
'redcord_actions_instance_methods_save!',
|
113
|
+
model_name: self.class.name,
|
114
|
+
) do
|
115
|
+
self.updated_at = Time.zone.now
|
116
|
+
_id = id
|
117
|
+
if _id.nil?
|
118
|
+
self.created_at = T.must(self.updated_at)
|
119
|
+
_id = redis.create_hash_returning_id(
|
120
|
+
self.class.model_key,
|
121
|
+
self.class.to_redis_hash(serialize),
|
122
|
+
)
|
123
|
+
send(:id=, _id)
|
124
|
+
else
|
125
|
+
redis.update_hash(
|
126
|
+
self.class.model_key,
|
127
|
+
_id,
|
128
|
+
self.class.to_redis_hash(serialize),
|
129
|
+
)
|
130
|
+
end
|
106
131
|
end
|
107
132
|
end
|
108
133
|
|
109
134
|
sig { params(args: T::Hash[Symbol, T.untyped]).void }
|
110
135
|
def update!(args = {})
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
136
|
+
Redcord::Base.trace(
|
137
|
+
'redcord_actions_instance_methods_update!',
|
138
|
+
model_name: self.class.name,
|
139
|
+
) do
|
140
|
+
_id = id
|
141
|
+
if _id.nil?
|
142
|
+
_set_args!(args)
|
143
|
+
save!
|
144
|
+
else
|
145
|
+
args[:updated_at] = Time.zone.now
|
146
|
+
_set_args!(args)
|
147
|
+
redis.update_hash(
|
148
|
+
self.class.model_key,
|
149
|
+
_id,
|
150
|
+
self.class.to_redis_hash(args),
|
151
|
+
)
|
152
|
+
end
|
123
153
|
end
|
124
154
|
end
|
125
155
|
|
126
156
|
sig { returns(T::Boolean) }
|
127
157
|
def destroy
|
128
|
-
|
158
|
+
Redcord::Base.trace(
|
159
|
+
'redcord_actions_instance_methods_destroy',
|
160
|
+
model_name: self.class.name,
|
161
|
+
) do
|
162
|
+
return false if id.nil?
|
129
163
|
|
130
|
-
|
164
|
+
self.class.destroy(T.must(id))
|
165
|
+
end
|
131
166
|
end
|
132
167
|
|
133
168
|
sig { returns(String) }
|
data/lib/redcord/base.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
1
3
|
# typed: strict
|
2
4
|
#
|
3
5
|
# A Redis ORM API inspired by ActiveRecord:
|
@@ -11,6 +13,7 @@ require 'redcord/configurations'
|
|
11
13
|
require 'redcord/logger'
|
12
14
|
require 'redcord/redis_connection'
|
13
15
|
require 'redcord/serializer'
|
16
|
+
require 'redcord/tracer'
|
14
17
|
|
15
18
|
module Redcord::Base
|
16
19
|
extend T::Sig
|
@@ -23,6 +26,7 @@ module Redcord::Base
|
|
23
26
|
include Redcord::Configurations
|
24
27
|
include Redcord::Logger
|
25
28
|
include Redcord::RedisConnection
|
29
|
+
include Redcord::Tracer
|
26
30
|
|
27
31
|
abstract!
|
28
32
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
1
3
|
# typed: strict
|
2
4
|
#
|
3
5
|
# This allows us to configure Redis connections for Redcord. Redis
|
@@ -40,6 +42,8 @@
|
|
40
42
|
# ```
|
41
43
|
#
|
42
44
|
require 'redcord/redis_connection'
|
45
|
+
require 'redcord/tracer'
|
46
|
+
|
43
47
|
module Redcord::Configurations
|
44
48
|
extend T::Sig
|
45
49
|
extend T::Helpers
|
data/lib/redcord/logger.rb
CHANGED
@@ -1,18 +1,147 @@
|
|
1
1
|
# typed: strict
|
2
2
|
require 'redis'
|
3
|
-
require 'redcord/server_scripts'
|
4
3
|
|
4
|
+
# TODO: Rename Redcord::PreparedRedis -> Redcord::Redis
|
5
5
|
class Redcord::PreparedRedis < Redis
|
6
6
|
extend T::Sig
|
7
|
-
|
7
|
+
|
8
|
+
sig do
|
9
|
+
params(
|
10
|
+
key: T.any(String, Symbol),
|
11
|
+
args: T::Hash[T.untyped, T.untyped],
|
12
|
+
).returns(Integer)
|
13
|
+
end
|
14
|
+
def create_hash_returning_id(key, args)
|
15
|
+
Redcord::Base.trace(
|
16
|
+
'redcord_redis_create_hash_returning_id',
|
17
|
+
model_name: key,
|
18
|
+
) do
|
19
|
+
evalsha(
|
20
|
+
self.class.server_script_shas[:create_hash_returning_id],
|
21
|
+
keys: [key],
|
22
|
+
argv: args.to_a.flatten,
|
23
|
+
).to_i
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
sig do
|
28
|
+
params(
|
29
|
+
model: String,
|
30
|
+
id: Integer,
|
31
|
+
args: T::Hash[T.untyped, T.untyped],
|
32
|
+
).void
|
33
|
+
end
|
34
|
+
def update_hash(model, id, args)
|
35
|
+
Redcord::Base.trace(
|
36
|
+
'redcord_redis_update_hash',
|
37
|
+
model_name: model,
|
38
|
+
) do
|
39
|
+
evalsha(
|
40
|
+
self.class.server_script_shas[:update_hash],
|
41
|
+
keys: [model, id],
|
42
|
+
argv: args.to_a.flatten,
|
43
|
+
)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
sig do
|
48
|
+
params(
|
49
|
+
model: String,
|
50
|
+
id: Integer
|
51
|
+
).returns(Integer)
|
52
|
+
end
|
53
|
+
def delete_hash(model, id)
|
54
|
+
Redcord::Base.trace(
|
55
|
+
'redcord_redis_delete_hash',
|
56
|
+
model_name: model,
|
57
|
+
) do
|
58
|
+
evalsha(
|
59
|
+
self.class.server_script_shas[:delete_hash],
|
60
|
+
keys: [model, id]
|
61
|
+
)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
sig do
|
66
|
+
params(
|
67
|
+
model: String,
|
68
|
+
query_conditions: T::Hash[T.untyped, T.untyped],
|
69
|
+
select_attrs: T::Set[Symbol]
|
70
|
+
).returns(T::Hash[Integer, T::Hash[T.untyped, T.untyped]])
|
71
|
+
end
|
72
|
+
def find_by_attr(model, query_conditions, select_attrs=Set.new)
|
73
|
+
Redcord::Base.trace(
|
74
|
+
'redcord_redis_find_by_attr',
|
75
|
+
model_name: model,
|
76
|
+
) do
|
77
|
+
res = evalsha(
|
78
|
+
self.class.server_script_shas[:find_by_attr],
|
79
|
+
keys: [model] + query_conditions.to_a.flatten,
|
80
|
+
argv: select_attrs.to_a.flatten
|
81
|
+
)
|
82
|
+
# The Lua script will return this as a flattened array.
|
83
|
+
# Convert the result into a hash of {id -> model hash}
|
84
|
+
res_hash = res.each_slice(2)
|
85
|
+
res_hash.map { |key, val| [key.to_i, val.each_slice(2).to_h] }.to_h
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
sig do
|
90
|
+
params(
|
91
|
+
model: String,
|
92
|
+
query_conditions: T::Hash[T.untyped, T.untyped]
|
93
|
+
).returns(Integer)
|
94
|
+
end
|
95
|
+
def find_by_attr_count(model, query_conditions)
|
96
|
+
Redcord::Base.trace(
|
97
|
+
'redcord_redis_find_by_attr_count',
|
98
|
+
model_name: model,
|
99
|
+
) do
|
100
|
+
evalsha(
|
101
|
+
self.class.server_script_shas[:find_by_attr_count],
|
102
|
+
keys: [model] + query_conditions.to_a.flatten,
|
103
|
+
)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
sig { void }
|
108
|
+
def load_server_scripts!
|
109
|
+
script_names = Dir[File.join(
|
110
|
+
__dir__,
|
111
|
+
'server_scripts/*.lua',
|
112
|
+
)].map do |filename|
|
113
|
+
# lib/redcord/server_scripts/find_by_attr.erb.lua -> find_by_attr
|
114
|
+
T.must(filename.split('/').last).split('.').first&.to_sym
|
115
|
+
end
|
116
|
+
|
117
|
+
res = pipelined do
|
118
|
+
script_names.each do |script_name|
|
119
|
+
script(
|
120
|
+
:load,
|
121
|
+
Redcord::LuaScriptReader.read_lua_script(script_name.to_s),
|
122
|
+
)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
if self.class.class_variable_get(:@@server_script_shas).nil?
|
127
|
+
self.class.class_variable_set(
|
128
|
+
:@@server_script_shas,
|
129
|
+
script_names.zip(res).to_h
|
130
|
+
)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
@@server_script_shas = T.let(nil, T.nilable(T::Hash[Symbol, String]))
|
8
135
|
|
9
136
|
sig { returns(T::Hash[Symbol, String]) }
|
10
|
-
def
|
11
|
-
|
137
|
+
def self.server_script_shas
|
138
|
+
T.must(@@server_script_shas)
|
12
139
|
end
|
13
140
|
|
14
|
-
sig {
|
15
|
-
def
|
16
|
-
|
141
|
+
sig { void }
|
142
|
+
def self.load_server_scripts!
|
143
|
+
Redcord::Base.configurations[Rails.env].each do |_, config|
|
144
|
+
new(**(config.symbolize_keys)).load_server_scripts!
|
145
|
+
end
|
17
146
|
end
|
18
147
|
end
|
data/lib/redcord/railtie.rb
CHANGED
@@ -1,5 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# typed: strict
|
4
|
+
|
2
5
|
require 'rails'
|
6
|
+
require 'yaml'
|
3
7
|
|
4
8
|
class Redcord::Railtie < Rails::Railtie
|
5
9
|
railtie_name 'redcord'
|
@@ -13,4 +17,19 @@ class Redcord::Railtie < Rails::Railtie
|
|
13
17
|
config.before_configuration do
|
14
18
|
require 'redcord/base'
|
15
19
|
end
|
20
|
+
|
21
|
+
config.after_initialize do
|
22
|
+
Redcord::Base.logger = Rails.logger
|
23
|
+
|
24
|
+
config_file = 'config/redcord.yml'
|
25
|
+
|
26
|
+
if File.file?(config_file)
|
27
|
+
Redcord::Base.configurations = YAML.load(
|
28
|
+
ERB.new(File.read(config_file)).result
|
29
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
Redcord::PreparedRedis.load_server_scripts!
|
33
|
+
Redcord._after_initialize!
|
34
|
+
end
|
16
35
|
end
|
@@ -71,17 +71,6 @@ module Redcord::RedisConnection
|
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
|
-
script_names = Redcord::ServerScripts.instance_methods
|
75
|
-
res = client.pipelined do
|
76
|
-
script_names.each do |script_name|
|
77
|
-
client.script(
|
78
|
-
:load,
|
79
|
-
Redcord::LuaScriptReader.read_lua_script(script_name.to_s),
|
80
|
-
)
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
client.redcord_server_script_shas = script_names.zip(res).to_h
|
85
74
|
client
|
86
75
|
end
|
87
76
|
end
|
data/lib/redcord/relation.rb
CHANGED
@@ -51,14 +51,19 @@ class Redcord::Relation
|
|
51
51
|
).returns(T.any(Redcord::Relation, T::Array[T.untyped]))
|
52
52
|
end
|
53
53
|
def select(*args, &blk)
|
54
|
-
|
55
|
-
|
56
|
-
|
54
|
+
Redcord::Base.trace(
|
55
|
+
'redcord_relation_select',
|
56
|
+
model_name: model.name,
|
57
|
+
) do
|
58
|
+
if block_given?
|
59
|
+
return execute_query.select do |*item|
|
60
|
+
blk.call(*item)
|
61
|
+
end
|
57
62
|
end
|
58
|
-
end
|
59
63
|
|
60
|
-
|
61
|
-
|
64
|
+
select_attrs.merge(args)
|
65
|
+
self
|
66
|
+
end
|
62
67
|
end
|
63
68
|
|
64
69
|
sig { returns(Integer) }
|
@@ -134,25 +139,30 @@ class Redcord::Relation
|
|
134
139
|
|
135
140
|
sig { returns(T::Array[T.untyped]) }
|
136
141
|
def execute_query
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
142
|
+
Redcord::Base.trace(
|
143
|
+
'redcord_relation_execute_query',
|
144
|
+
model_name: model.name,
|
145
|
+
) do
|
146
|
+
if !select_attrs.empty?
|
147
|
+
res_hash = redis.find_by_attr(
|
148
|
+
model.model_key,
|
149
|
+
query_conditions,
|
150
|
+
select_attrs,
|
151
|
+
)
|
152
|
+
|
153
|
+
res_hash.map do |id, args|
|
154
|
+
model.from_redis_hash(args).map do |k, v|
|
155
|
+
[k.to_sym, TypeCoerce[model.get_attr_type(k.to_sym)].new.from(v)]
|
156
|
+
end.to_h.merge(id: id)
|
157
|
+
end
|
158
|
+
else
|
159
|
+
res_hash = redis.find_by_attr(
|
160
|
+
model.model_key,
|
161
|
+
query_conditions,
|
162
|
+
)
|
163
|
+
|
164
|
+
res_hash.map { |id, args| model.coerce_and_set_id(args, id) }
|
148
165
|
end
|
149
|
-
else
|
150
|
-
res_hash = redis.find_by_attr(
|
151
|
-
model.model_key,
|
152
|
-
query_conditions,
|
153
|
-
)
|
154
|
-
|
155
|
-
res_hash.map { |id, args| model.coerce_and_set_id(args, id) }
|
156
166
|
end
|
157
167
|
end
|
158
168
|
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# typed: strict
|
4
|
+
|
5
|
+
module Redcord::Tracer
|
6
|
+
extend T::Sig
|
7
|
+
extend T::Helpers
|
8
|
+
|
9
|
+
sig { params(klass: Module).void }
|
10
|
+
def self.included(klass)
|
11
|
+
klass.extend(ClassMethods)
|
12
|
+
end
|
13
|
+
|
14
|
+
module ClassMethods
|
15
|
+
include Kernel
|
16
|
+
|
17
|
+
extend T::Sig
|
18
|
+
|
19
|
+
@@tracer = T.let(nil, T.untyped)
|
20
|
+
|
21
|
+
sig {
|
22
|
+
params(
|
23
|
+
span_name: String,
|
24
|
+
model_name: String,
|
25
|
+
tags: T::Array[String],
|
26
|
+
blk: T.proc.returns(T.untyped),
|
27
|
+
).returns(T.untyped)
|
28
|
+
}
|
29
|
+
def trace(span_name, model_name:, tags: [], &blk)
|
30
|
+
return blk.call if @@tracer.nil?
|
31
|
+
|
32
|
+
@@tracer.call.trace(
|
33
|
+
span_name,
|
34
|
+
resource: model_name,
|
35
|
+
service: 'redcord',
|
36
|
+
tags: tags,
|
37
|
+
&blk
|
38
|
+
)
|
39
|
+
end
|
40
|
+
|
41
|
+
sig { params(blk: T.proc.returns(T.untyped)).void }
|
42
|
+
def tracer(&blk)
|
43
|
+
@@tracer = blk
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
mixes_in_class_methods(ClassMethods)
|
48
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redcord
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chan Zuckerberg Initiative
|
@@ -174,7 +174,6 @@ files:
|
|
174
174
|
- lib/redcord/redis_connection.rb
|
175
175
|
- lib/redcord/relation.rb
|
176
176
|
- lib/redcord/serializer.rb
|
177
|
-
- lib/redcord/server_scripts.rb
|
178
177
|
- lib/redcord/server_scripts/create_hash_returning_id.erb.lua
|
179
178
|
- lib/redcord/server_scripts/delete_hash.erb.lua
|
180
179
|
- lib/redcord/server_scripts/find_by_attr.erb.lua
|
@@ -184,6 +183,7 @@ files:
|
|
184
183
|
- lib/redcord/server_scripts/shared/query_helper_methods.erb.lua
|
185
184
|
- lib/redcord/server_scripts/update_hash.erb.lua
|
186
185
|
- lib/redcord/tasks/redis.rake
|
186
|
+
- lib/redcord/tracer.rb
|
187
187
|
homepage: https://github.com/chanzuckerberg/redis-record
|
188
188
|
licenses:
|
189
189
|
- MIT
|
@@ -199,9 +199,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
199
199
|
version: 2.5.0
|
200
200
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
201
201
|
requirements:
|
202
|
-
- - "
|
202
|
+
- - ">="
|
203
203
|
- !ruby/object:Gem::Version
|
204
|
-
version:
|
204
|
+
version: '0'
|
205
205
|
requirements: []
|
206
206
|
rubyforge_project:
|
207
207
|
rubygems_version: 2.7.6.2
|
@@ -1,78 +0,0 @@
|
|
1
|
-
# typed: strict
|
2
|
-
module Redcord::ServerScripts
|
3
|
-
extend T::Sig
|
4
|
-
|
5
|
-
sig do
|
6
|
-
params(
|
7
|
-
key: T.any(String, Symbol),
|
8
|
-
args: T::Hash[T.untyped, T.untyped],
|
9
|
-
).returns(Integer)
|
10
|
-
end
|
11
|
-
def create_hash_returning_id(key, args)
|
12
|
-
evalsha(
|
13
|
-
T.must(redcord_server_script_shas[:create_hash_returning_id]),
|
14
|
-
keys: [key],
|
15
|
-
argv: args.to_a.flatten,
|
16
|
-
).to_i
|
17
|
-
end
|
18
|
-
|
19
|
-
sig do
|
20
|
-
params(
|
21
|
-
model: String,
|
22
|
-
id: Integer,
|
23
|
-
args: T::Hash[T.untyped, T.untyped],
|
24
|
-
).void
|
25
|
-
end
|
26
|
-
def update_hash(model, id, args)
|
27
|
-
evalsha(
|
28
|
-
T.must(redcord_server_script_shas[:update_hash]),
|
29
|
-
keys: [model, id],
|
30
|
-
argv: args.to_a.flatten,
|
31
|
-
)
|
32
|
-
end
|
33
|
-
|
34
|
-
sig do
|
35
|
-
params(
|
36
|
-
model: String,
|
37
|
-
id: Integer
|
38
|
-
).returns(Integer)
|
39
|
-
end
|
40
|
-
def delete_hash(model, id)
|
41
|
-
evalsha(
|
42
|
-
T.must(redcord_server_script_shas[:delete_hash]),
|
43
|
-
keys: [model, id]
|
44
|
-
)
|
45
|
-
end
|
46
|
-
|
47
|
-
sig do
|
48
|
-
params(
|
49
|
-
model: String,
|
50
|
-
query_conditions: T::Hash[T.untyped, T.untyped],
|
51
|
-
select_attrs: T::Set[Symbol]
|
52
|
-
).returns(T::Hash[Integer, T::Hash[T.untyped, T.untyped]])
|
53
|
-
end
|
54
|
-
def find_by_attr(model, query_conditions, select_attrs=Set.new)
|
55
|
-
res = evalsha(
|
56
|
-
T.must(redcord_server_script_shas[:find_by_attr]),
|
57
|
-
keys: [model] + query_conditions.to_a.flatten,
|
58
|
-
argv: select_attrs.to_a.flatten
|
59
|
-
)
|
60
|
-
# The Lua script will return this as a flattened array.
|
61
|
-
# Convert the result into a hash of {id -> model hash}
|
62
|
-
res_hash = res.each_slice(2)
|
63
|
-
res_hash.map { |key, val| [key.to_i, val.each_slice(2).to_h] }.to_h
|
64
|
-
end
|
65
|
-
|
66
|
-
sig do
|
67
|
-
params(
|
68
|
-
model: String,
|
69
|
-
query_conditions: T::Hash[T.untyped, T.untyped]
|
70
|
-
).returns(Integer)
|
71
|
-
end
|
72
|
-
def find_by_attr_count(model, query_conditions)
|
73
|
-
evalsha(
|
74
|
-
T.must(redcord_server_script_shas[:find_by_attr_count]),
|
75
|
-
keys: [model] + query_conditions.to_a.flatten,
|
76
|
-
)
|
77
|
-
end
|
78
|
-
end
|