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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: da0c6caa85c4c4bc50f0df7e6b3315783b546628
4
- data.tar.gz: 408733b9f1a0708bbd7fb8289df0d55c454efe1c
2
+ SHA256:
3
+ metadata.gz: c89a29c20fea4fff1a59ab534285774e7758620a73fc4005866011326b67ddbe
4
+ data.tar.gz: 1fbb57ba895a2aedb8067e399ac747cd6428b2e11c18c043e0fc9fbd8e3a63a1
5
5
  SHA512:
6
- metadata.gz: 535e2f65f6933679c321832536c61d3048399ea18899403d090f8dfe5f74c885b45e13bac36933e4b7732a05d106e6e277bf391539f2ff40dbb145c4476b0622
7
- data.tar.gz: 240613cf4187528adf150f8ff7b6e3ab111b12653b4fdf45ca62e635a66566635a6d9a285a1246758b3c00ebc84677e49b1a510059da52e3e0281c5e151250ca
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 = ""
@@ -1,5 +1,5 @@
1
1
  module ActiveRemote
2
2
  module Cached
3
- VERSION = "0.1.4"
3
+ VERSION = "1.0.0"
4
4
  end
5
5
  end
@@ -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.values
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.values
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 _create_cached_finder_for(cached_finder_key, options = {})
74
- cached_finder_key_set = [ cached_finder_key ].flatten.sort
103
+ def _method_missing_name(m)
104
+ regex = /(cached_(?:delete|exist_search|search|exist_find|find)_by_)([a-zA-Z_]*)(!|\?)?/
75
105
 
76
- ##
77
- # Run each permutation of the arguments passed in
78
- # and define each finder/searcher
79
- #
80
- cached_finder_key_set.permutation do |arguments|
81
- delete_method_name = _cached_delete_method_name(arguments)
82
- exist_find_method_name = _cached_exist_find_method_name(arguments)
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
- unless self.respond_to?(exist_find_method_name)
93
- _define_cached_exist_find_method(exist_find_method_name, arguments, options)
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
- unless self.respond_to?(exist_search_method_name)
97
- _define_cached_exist_search_method(exist_search_method_name, arguments, options)
98
- end
117
+ method_name = _method_missing_name(m)
99
118
 
100
- unless self.respond_to?(find_method_name)
101
- _define_cached_find_method(find_method_name, arguments, options)
102
- end
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
- unless self.respond_to?(search_bang_method_name)
105
- _define_cached_search_bang_method(search_bang_method_name, arguments, options)
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
- unless self.respond_to?(search_method_name)
109
- _define_cached_search_method(search_method_name, arguments, options)
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.1.4
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandon Dewitt
8
- autorequire:
8
+ - MXDevExperience
9
+ autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2017-06-06 00:00:00.000000000 Z
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
- rubyforge_project:
143
- rubygems_version: 2.5.1
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