active_remote-cached 0.1.4 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/active_remote-cached.gemspec +2 -2
- data/lib/active_remote/cached/version.rb +1 -1
- data/lib/active_remote/cached.rb +117 -37
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c89a29c20fea4fff1a59ab534285774e7758620a73fc4005866011326b67ddbe
|
4
|
+
data.tar.gz: 1fbb57ba895a2aedb8067e399ac747cd6428b2e11c18c043e0fc9fbd8e3a63a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e07972d8b297ad00be81d09dc05330075db0f744d6d40f0323135f326368846325cc66975f8771260d14ba5cd96156c36e134e9bf500df4bff924d6bdcc9ef82
|
7
|
+
data.tar.gz: 5a1818958e13bac846e04616c1762f1fdbb3d7e5e664d8d7c56e86b36e1fa10d608bf242bd666e43ba1bea5eef6f3a17be01e2c1f715bab205413aabe3a764eb
|
@@ -6,8 +6,8 @@ require 'active_remote/cached/version'
|
|
6
6
|
Gem::Specification.new do |gem|
|
7
7
|
gem.name = "active_remote-cached"
|
8
8
|
gem.version = ActiveRemote::Cached::VERSION
|
9
|
-
gem.authors = ["Brandon Dewitt"]
|
10
|
-
gem.email = ["brandonsdewitt@gmail.com"]
|
9
|
+
gem.authors = ["Brandon Dewitt", "MXDevExperience"]
|
10
|
+
gem.email = ["brandonsdewitt@gmail.com", "devexperience@mx.com"]
|
11
11
|
gem.description = %q{ Provides "cached" finders and a DSL to enumerate which finders should have cached versions }
|
12
12
|
gem.summary = %q{ Provides a configuration for caching mechanisms and finders on ActiveRemote models that are cached/cacheable }
|
13
13
|
gem.homepage = ""
|
data/lib/active_remote/cached.rb
CHANGED
@@ -12,6 +12,10 @@ module ActiveRemote
|
|
12
12
|
module Cached
|
13
13
|
extend ::ActiveSupport::Concern
|
14
14
|
|
15
|
+
# When upgrading Rails versions, don't reuse the same cache key, because you can't rely upon the serialized objects to be consistent across versions.
|
16
|
+
# To fix, this adds a cache key that caches the ruby engine version and the activesupport version to prevent cache re-use across different versions.
|
17
|
+
RUBY_AND_ACTIVE_SUPPORT_VERSION = "#{RUBY_ENGINE_VERSION}:#{ActiveSupport::VERSION::STRING}".freeze
|
18
|
+
|
15
19
|
def self.cache(cache_provider = nil)
|
16
20
|
if cache_provider
|
17
21
|
@cache_provider = ::ActiveRemote::Cached::Cache.new(cache_provider)
|
@@ -29,6 +33,11 @@ module ActiveRemote
|
|
29
33
|
end
|
30
34
|
|
31
35
|
module ClassMethods
|
36
|
+
def cached_methods
|
37
|
+
@cached_methods ||= []
|
38
|
+
@cached_methods
|
39
|
+
end
|
40
|
+
|
32
41
|
def cached_finders_for(*cached_finder_keys)
|
33
42
|
options = cached_finder_keys.extract_options!
|
34
43
|
|
@@ -43,7 +52,7 @@ module ActiveRemote
|
|
43
52
|
|
44
53
|
def cached_find(argument_hash, options = {})
|
45
54
|
method_name = _cached_find_method_name(argument_hash.keys)
|
46
|
-
arguments = argument_hash.
|
55
|
+
arguments = argument_hash.keys.sort.map { |k| argument_hash[k] }
|
47
56
|
|
48
57
|
if block_given?
|
49
58
|
__send__(method_name, *arguments, options) do
|
@@ -56,7 +65,7 @@ module ActiveRemote
|
|
56
65
|
|
57
66
|
def cached_search(argument_hash, options = {})
|
58
67
|
method_name = _cached_search_method_name(argument_hash.keys)
|
59
|
-
arguments = argument_hash.
|
68
|
+
arguments = argument_hash.keys.sort.map { |k| argument_hash[k] }
|
60
69
|
|
61
70
|
if block_given?
|
62
71
|
__send__(method_name, *arguments, options) do
|
@@ -67,74 +76,131 @@ module ActiveRemote
|
|
67
76
|
end
|
68
77
|
end
|
69
78
|
|
79
|
+
def method_missing(m, *args, &block)
|
80
|
+
method_name = _method_missing_name(m)
|
81
|
+
|
82
|
+
if method_name.nil? || !cached_methods.include?(method_name.to_s)
|
83
|
+
super(m, *args, &block)
|
84
|
+
else
|
85
|
+
new_args = _args_in_sorted_order(m, args)
|
86
|
+
__send__(method_name, *new_args, &block)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def respond_to_missing?(m, include_private = false)
|
91
|
+
method_name = _method_missing_name(m)
|
92
|
+
|
93
|
+
if !method_name.nil? && cached_methods.include?(method_name.to_s)
|
94
|
+
true
|
95
|
+
else
|
96
|
+
super
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
70
100
|
##
|
71
101
|
# Underscored Methods
|
72
102
|
#
|
73
|
-
def
|
74
|
-
|
103
|
+
def _method_missing_name(m)
|
104
|
+
regex = /(cached_(?:delete|exist_search|search|exist_find|find)_by_)([a-zA-Z_]*)(!|\?)?/
|
75
105
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
exist_search_method_name = _cached_exist_search_method_name(arguments)
|
84
|
-
find_method_name = _cached_find_method_name(arguments)
|
85
|
-
search_method_name = _cached_search_method_name(arguments)
|
86
|
-
search_bang_method_name = "#{search_method_name}!"
|
87
|
-
|
88
|
-
unless self.respond_to?(delete_method_name)
|
89
|
-
_define_cached_delete_method(delete_method_name, arguments, options)
|
90
|
-
end
|
106
|
+
if m.to_s =~ regex
|
107
|
+
params = $2.split("_and_")
|
108
|
+
"#{$1}#{params.sort.join("_and_")}#{$3}".to_sym
|
109
|
+
else
|
110
|
+
nil
|
111
|
+
end
|
112
|
+
end
|
91
113
|
|
92
|
-
|
93
|
-
|
94
|
-
end
|
114
|
+
def _args_in_sorted_order(m, args)
|
115
|
+
regex = /cached_(?:delete|exist_search|search|exist_find|find)_by_([a-zA-Z_]*)(!|\?)?/
|
95
116
|
|
96
|
-
|
97
|
-
_define_cached_exist_search_method(exist_search_method_name, arguments, options)
|
98
|
-
end
|
117
|
+
method_name = _method_missing_name(m)
|
99
118
|
|
100
|
-
|
101
|
-
|
102
|
-
|
119
|
+
match_1 = m.match(regex)
|
120
|
+
match_2 = method_name.match(regex)
|
121
|
+
|
122
|
+
args_in_order = []
|
123
|
+
|
124
|
+
if match_1[1] && match_2[1]
|
125
|
+
orignal_args_name = match_1[1].split("_and_")
|
126
|
+
args_names_in_order = match_2[1].split("_and_")
|
103
127
|
|
104
|
-
|
105
|
-
|
128
|
+
args_names_in_order.each do |arg_name|
|
129
|
+
index = orignal_args_name.index(arg_name)
|
130
|
+
args_in_order << args[index]
|
106
131
|
end
|
107
132
|
|
108
|
-
|
109
|
-
|
133
|
+
if args.size > args_in_order.size
|
134
|
+
# Add options if passed
|
135
|
+
args_in_order << args.last
|
110
136
|
end
|
137
|
+
|
138
|
+
args_in_order
|
139
|
+
else
|
140
|
+
args
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def _create_cached_finder_for(cached_finder_key, options = {})
|
145
|
+
cached_finder_key_set = [ cached_finder_key ].flatten.sort
|
146
|
+
|
147
|
+
delete_method_name = _cached_delete_method_name(cached_finder_key_set)
|
148
|
+
exist_find_method_name = _cached_exist_find_method_name(cached_finder_key_set)
|
149
|
+
exist_search_method_name = _cached_exist_search_method_name(cached_finder_key_set)
|
150
|
+
find_method_name = _cached_find_method_name(cached_finder_key_set)
|
151
|
+
search_method_name = _cached_search_method_name(cached_finder_key_set)
|
152
|
+
search_bang_method_name = "#{search_method_name}!"
|
153
|
+
|
154
|
+
unless cached_methods.include?(delete_method_name)
|
155
|
+
_define_cached_delete_method(delete_method_name, cached_finder_key_set, options)
|
156
|
+
end
|
157
|
+
|
158
|
+
unless cached_methods.include?(exist_find_method_name)
|
159
|
+
_define_cached_exist_find_method(exist_find_method_name, cached_finder_key_set, options)
|
160
|
+
end
|
161
|
+
|
162
|
+
unless cached_methods.include?(exist_search_method_name)
|
163
|
+
_define_cached_exist_search_method(exist_search_method_name, cached_finder_key_set, options)
|
164
|
+
end
|
165
|
+
|
166
|
+
unless cached_methods.include?(find_method_name)
|
167
|
+
_define_cached_find_method(find_method_name, cached_finder_key_set, options)
|
168
|
+
end
|
169
|
+
|
170
|
+
unless cached_methods.include?(search_bang_method_name)
|
171
|
+
_define_cached_search_bang_method(search_bang_method_name, cached_finder_key_set, options)
|
172
|
+
end
|
173
|
+
|
174
|
+
unless cached_methods.include?(search_method_name)
|
175
|
+
_define_cached_search_method(search_method_name, cached_finder_key_set, options)
|
111
176
|
end
|
112
177
|
end
|
113
178
|
|
114
179
|
def _cached_delete_method_name(arguments)
|
115
|
-
"cached_delete_by_#{arguments.join('_and_')}"
|
180
|
+
"cached_delete_by_#{arguments.sort.join('_and_')}"
|
116
181
|
end
|
117
182
|
|
118
183
|
def _cached_exist_find_method_name(arguments)
|
119
|
-
"cached_exist_find_by_#{arguments.join('_and_')}"
|
184
|
+
"cached_exist_find_by_#{arguments.sort.join('_and_')}"
|
120
185
|
end
|
121
186
|
|
122
187
|
def _cached_exist_search_method_name(arguments)
|
123
|
-
"cached_exist_search_by_#{arguments.join('_and_')}"
|
188
|
+
"cached_exist_search_by_#{arguments.sort.join('_and_')}"
|
124
189
|
end
|
125
190
|
|
126
191
|
def _cached_find_method_name(arguments)
|
127
|
-
"cached_find_by_#{arguments.join('_and_')}"
|
192
|
+
"cached_find_by_#{arguments.sort.join('_and_')}"
|
128
193
|
end
|
129
194
|
|
130
195
|
def _cached_search_method_name(arguments)
|
131
|
-
"cached_search_by_#{arguments.join('_and_')}"
|
196
|
+
"cached_search_by_#{arguments.sort.join('_and_')}"
|
132
197
|
end
|
133
198
|
|
134
199
|
def _define_cached_delete_method(method_name, *method_arguments, cached_finder_options)
|
135
200
|
method_arguments.flatten!
|
136
201
|
expanded_method_args = method_arguments.join(",")
|
137
202
|
sorted_method_args = method_arguments.sort.join(",")
|
203
|
+
cached_methods << method_name
|
138
204
|
|
139
205
|
self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
140
206
|
# def self.cached_delete_by_user_guid(user_guid, options = {})
|
@@ -144,6 +210,7 @@ module ActiveRemote
|
|
144
210
|
__active_remote_cached_options = ::ActiveRemote::Cached.default_options.merge(#{cached_finder_options}).merge(__active_remote_cached_options)
|
145
211
|
namespace = __active_remote_cached_options.delete(:namespace)
|
146
212
|
find_cache_key = [
|
213
|
+
RUBY_AND_ACTIVE_SUPPORT_VERSION,
|
147
214
|
namespace,
|
148
215
|
name,
|
149
216
|
"#find",
|
@@ -151,6 +218,7 @@ module ActiveRemote
|
|
151
218
|
].compact
|
152
219
|
|
153
220
|
search_cache_key = [
|
221
|
+
RUBY_AND_ACTIVE_SUPPORT_VERSION,
|
154
222
|
namespace,
|
155
223
|
name,
|
156
224
|
"#search",
|
@@ -167,6 +235,8 @@ module ActiveRemote
|
|
167
235
|
method_arguments.flatten!
|
168
236
|
expanded_method_args = method_arguments.join(",")
|
169
237
|
sorted_method_args = method_arguments.sort.join(",")
|
238
|
+
cached_methods << method_name
|
239
|
+
cached_methods << "#{method_name}?"
|
170
240
|
|
171
241
|
self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
172
242
|
# def self.cached_exist_find_by_user_guid(user_guid, options = {})
|
@@ -176,6 +246,7 @@ module ActiveRemote
|
|
176
246
|
__active_remote_cached_options = ::ActiveRemote::Cached.default_options.merge(#{cached_finder_options}).merge(__active_remote_cached_options)
|
177
247
|
namespace = __active_remote_cached_options.delete(:namespace)
|
178
248
|
cache_key = [
|
249
|
+
RUBY_AND_ACTIVE_SUPPORT_VERSION,
|
179
250
|
namespace,
|
180
251
|
name,
|
181
252
|
"#find",
|
@@ -193,6 +264,8 @@ module ActiveRemote
|
|
193
264
|
method_arguments.flatten!
|
194
265
|
expanded_method_args = method_arguments.join(",")
|
195
266
|
sorted_method_args = method_arguments.sort.join(",")
|
267
|
+
cached_methods << method_name
|
268
|
+
cached_methods << "#{method_name}?"
|
196
269
|
|
197
270
|
self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
198
271
|
# def self.cached_exist_search_by_user_guid(user_guid, options = {})
|
@@ -202,6 +275,7 @@ module ActiveRemote
|
|
202
275
|
__active_remote_cached_options = ::ActiveRemote::Cached.default_options.merge(#{cached_finder_options}).merge(__active_remote_cached_options)
|
203
276
|
namespace = __active_remote_cached_options.delete(:namespace)
|
204
277
|
cache_key = [
|
278
|
+
RUBY_AND_ACTIVE_SUPPORT_VERSION,
|
205
279
|
namespace,
|
206
280
|
name,
|
207
281
|
"#search",
|
@@ -219,6 +293,7 @@ module ActiveRemote
|
|
219
293
|
method_arguments.flatten!
|
220
294
|
expanded_method_args = method_arguments.join(",")
|
221
295
|
sorted_method_args = method_arguments.sort.join(",")
|
296
|
+
cached_methods << method_name
|
222
297
|
|
223
298
|
expanded_search_args = ""
|
224
299
|
method_arguments.each do |method_argument|
|
@@ -241,6 +316,7 @@ module ActiveRemote
|
|
241
316
|
__active_remote_cached_options = ::ActiveRemote::Cached.default_options.merge(#{cached_finder_options}).merge(__active_remote_cached_options)
|
242
317
|
namespace = __active_remote_cached_options.delete(:namespace)
|
243
318
|
cache_key = [
|
319
|
+
RUBY_AND_ACTIVE_SUPPORT_VERSION,
|
244
320
|
namespace,
|
245
321
|
name,
|
246
322
|
"#find",
|
@@ -262,6 +338,7 @@ module ActiveRemote
|
|
262
338
|
method_arguments.flatten!
|
263
339
|
expanded_method_args = method_arguments.join(",")
|
264
340
|
sorted_method_args = method_arguments.sort.join(",")
|
341
|
+
cached_methods << method_name
|
265
342
|
|
266
343
|
expanded_search_args = ""
|
267
344
|
method_arguments.each do |method_argument|
|
@@ -288,6 +365,7 @@ module ActiveRemote
|
|
288
365
|
__active_remote_cached_options = ::ActiveRemote::Cached.default_options.merge(#{cached_finder_options}).merge(__active_remote_cached_options)
|
289
366
|
namespace = __active_remote_cached_options.delete(:namespace)
|
290
367
|
cache_key = [
|
368
|
+
RUBY_AND_ACTIVE_SUPPORT_VERSION,
|
291
369
|
namespace,
|
292
370
|
name,
|
293
371
|
"#search",
|
@@ -309,6 +387,7 @@ module ActiveRemote
|
|
309
387
|
method_arguments.flatten!
|
310
388
|
expanded_method_args = method_arguments.join(",")
|
311
389
|
sorted_method_args = method_arguments.sort.join(",")
|
390
|
+
cached_methods << method_name
|
312
391
|
|
313
392
|
expanded_search_args = ""
|
314
393
|
method_arguments.each do |method_argument|
|
@@ -340,6 +419,7 @@ module ActiveRemote
|
|
340
419
|
__active_remote_cached_options = ::ActiveRemote::Cached.default_options.merge(#{cached_finder_options}).merge(__active_remote_cached_options)
|
341
420
|
namespace = __active_remote_cached_options.delete(:namespace)
|
342
421
|
cache_key = [
|
422
|
+
RUBY_AND_ACTIVE_SUPPORT_VERSION,
|
343
423
|
namespace,
|
344
424
|
name,
|
345
425
|
"#search",
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_remote-cached
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Dewitt
|
8
|
-
|
8
|
+
- MXDevExperience
|
9
|
+
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
+
date: 2024-04-26 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: active_remote
|
@@ -98,6 +99,7 @@ description: ' Provides "cached" finders and a DSL to enumerate which finders sh
|
|
98
99
|
have cached versions '
|
99
100
|
email:
|
100
101
|
- brandonsdewitt@gmail.com
|
102
|
+
- devexperience@mx.com
|
101
103
|
executables: []
|
102
104
|
extensions: []
|
103
105
|
extra_rdoc_files: []
|
@@ -124,7 +126,7 @@ files:
|
|
124
126
|
homepage: ''
|
125
127
|
licenses: []
|
126
128
|
metadata: {}
|
127
|
-
post_install_message:
|
129
|
+
post_install_message:
|
128
130
|
rdoc_options: []
|
129
131
|
require_paths:
|
130
132
|
- lib
|
@@ -139,9 +141,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
139
141
|
- !ruby/object:Gem::Version
|
140
142
|
version: '0'
|
141
143
|
requirements: []
|
142
|
-
|
143
|
-
|
144
|
-
signing_key:
|
144
|
+
rubygems_version: 3.3.7
|
145
|
+
signing_key:
|
145
146
|
specification_version: 4
|
146
147
|
summary: Provides a configuration for caching mechanisms and finders on ActiveRemote
|
147
148
|
models that are cached/cacheable
|