active_remote-cached 0.1.4 → 1.0.0

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 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