active_remote-cached 0.0.5 → 0.0.6

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
2
  SHA1:
3
- metadata.gz: d0f5c9001aeadeb02257a3a6cbc8206e0209e3e7
4
- data.tar.gz: b50ea3df9a27c2cd8f38c47f49687880a67aa8af
3
+ metadata.gz: 8ab07ab8e11e7520b6bfb6d309943f8824076362
4
+ data.tar.gz: ad6a3abff29c918cd16e9dc94a283f222cfdb606
5
5
  SHA512:
6
- metadata.gz: 60eaeea21dfc61be402f4ca821e2a2d3f3ce6e5f8f7359e57c5591c62f609d20b1ba2f24389694d9e75f83e9e6011dd7651b358380a19e5446f1da128464967c
7
- data.tar.gz: b1056bf3a13952433b28b7ebb13904d8511bc2e88bd90783dd728468c8d6157406677be137129123e42a61ae43b8578509a49de378d868c6331961ea80aff3f4
6
+ metadata.gz: fcecd3db779daa85deb56636edd9511c670cca9c079a02f861a09e1547e3758af0f5423471bce501d7156d51267dd845dff5b76e6884966ef2679a8cfc7f442a
7
+ data.tar.gz: 1811c6219eb8123a54dc4e6a95bd75952fd71a28ef70038b57f5a5b6f50d9073a4f67d7f0bb4b3873b45da28d4e69f3fadf471216347551bcb0774bf1759f075
data/README.md CHANGED
@@ -18,38 +18,76 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
- include `::ActiveRemote::Cached` into your ActiveRemote models that can support cached finders
21
+ ### Defining cache finders
22
+
23
+ Include `::ActiveRemote::Cached` into your ActiveRemote models that can support cached finders*
24
+
25
+ ```ruby
26
+ class Customer < ::ActiveRemote::Base
27
+ include ::ActiveRemote::Cached
28
+ end
29
+ ```
30
+
31
+ _*This is already done for you in Rails_
32
+
33
+ Then declare some cache finder methods. Cached finders can be defined for individual fields or defined as composites for mulitple fields
22
34
 
23
35
  ```ruby
24
- class Customer < ::ActiveRemote::Base
25
- include ::ActiveRemote::Cached
36
+ class Customer < ::ActiveRemote::Base
37
+ # Create a cached finder for id
38
+ cached_finders_for :id
26
39
 
27
- # Declare the cached finder methods that will be supported
28
- cached_finders_for :id
29
- cached_finders_for [:name, :email]
30
- end
40
+ # Create a composite cached finder for name and email
41
+ cached_finders_for [:name, :email]
42
+ end
31
43
  ```
32
44
 
33
45
  Now that you have a model that has cached finders on it you can use the `cached_search`, `cached_find`, or dynamic cached finder methods on the model to use the cache before you issue the AR search/find method.
34
46
 
35
47
  ```ruby
36
- customer = ::Customer.cached_find_by_id(1) # => <Customer id=1>
37
- customer = ::Customer.cached_find(:id => 1) # => <Customer id=1>
38
- customer = ::Customer.cached_search_by_id(1) # => [ <Customer id=1> ]
39
- customer = ::Customer.cached_search(:id => 1) # => [ <Customer id=1> ]
48
+ customer = ::Customer.cached_find_by_id(1) # => <Customer id=1>
49
+ customer = ::Customer.cached_find(:id => 1) # => <Customer id=1>
50
+ customer = ::Customer.cached_search_by_id(1) # => [ <Customer id=1> ]
51
+ customer = ::Customer.cached_search(:id => 1) # => [ <Customer id=1> ]
40
52
  ```
41
53
 
42
54
  ```ruby
43
- # All permutations of "complex" dynamic finders are defined
44
- customer = ::Customer.cached_find_by_name_and_email("name", "email") # => <Customer id=1>
45
- customer = ::Customer.cached_find_by_email_and_name("email", "name") # => <Customer id=1>
55
+ # All permutations of "complex" dynamic finders are defined
56
+ customer = ::Customer.cached_find_by_name_and_email("name", "email") # => <Customer id=1>
57
+ customer = ::Customer.cached_find_by_email_and_name("email", "name") # => <Customer id=1>
58
+
59
+ # Only declared finders are defined
60
+ customer = ::Customer.cached_find_by_name("name") # => NoMethodError
61
+ ```
62
+
63
+ ### Configuring the cache provider
64
+
65
+ ActiveRemote::Cached relies on an ActiveSupport::Cache-compatible cache provider. The cache is initialized with a simple memory store (defaults to 32MB), but can be overridden via `ActiveRemote::Cached.cache`:
66
+
67
+ ```ruby
68
+ ActiveRemote::Cached.cache(Your::ActiveSupport::Cache::Compatible::Provider.new)
69
+ ```
70
+
71
+ In Rails apps, the memory store is replaced the whatever Rails is using as it's cache store.
46
72
 
47
- # Only declared finders are defined
48
- customer = ::Customer.cached_find_by_name("name") # => NoMethodError
73
+ #### Default options
74
+
75
+ The default cache options used when interacting with the cache can be specified via `ActiveRemote::Cached.default_options`:
76
+
77
+ ```ruby
78
+ ActiveRemote::Cached.default_options(:expires_in => 1.hour)
49
79
  ```
50
80
 
81
+ In Rails apps, the :race_condition_ttl option defaults to 5 seconds.
82
+
83
+ #### Local overrides
84
+
51
85
  Each finder as takes an optional options hash that will override the options passed to the caching provider (override from the global defaults setup for ActiveRemote::Cached)
52
86
 
87
+ ```ruby
88
+ customer = ::Customer.cached_find_by_id(1, :expires_in => 15.minutes)
89
+ ```
90
+
53
91
  ## Contributing
54
92
 
55
93
  1. Fork it
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'active_remote-cached/version'
4
+ require 'active_remote/cached/version'
5
5
 
6
6
  Gem::Specification.new do |gem|
7
7
  gem.name = "active_remote-cached"
@@ -1,262 +1 @@
1
- require "active_support/concern"
2
- require "active_support/core_ext/array/extract_options"
3
- require "active_remote-cached/version"
4
- require "active_remote-cached/cache"
5
-
6
- module ActiveRemote
7
- module Cached
8
- extend ::ActiveSupport::Concern
9
-
10
- def self.cache(cache_provider = nil)
11
- if cache_provider
12
- @cache_provider = ::ActiveRemote::Cached::Cache.new(cache_provider)
13
- end
14
-
15
- @cache_provider
16
- end
17
-
18
- def self.default_options(options = nil)
19
- if options
20
- @default_options = options
21
- end
22
-
23
- @default_options || {}
24
- end
25
-
26
- module ClassMethods
27
-
28
- def cached_finders_for(*cached_finder_keys)
29
- options = cached_finder_keys.extract_options!
30
-
31
- cached_finder_keys.each do |cached_finder_key|
32
- _create_cached_finder_for(cached_finder_key, options)
33
- end
34
- end
35
-
36
- def cached_finders(*keys)
37
- cached_finders_for(*keys)
38
- end
39
-
40
- def cached_find(argument_hash, options = {})
41
- method_name = _cached_find_method_name(argument_hash.keys)
42
- arguments = argument_hash.values
43
-
44
- if block_given?
45
- __send__(method_name, *arguments, options) do
46
- yield
47
- end
48
- else
49
- __send__(method_name, *arguments, options)
50
- end
51
- end
52
-
53
- def cached_search(argument_hash, options = {})
54
- method_name = _cached_search_method_name(argument_hash.keys)
55
- arguments = argument_hash.values
56
-
57
- if block_given?
58
- __send__(method_name, *arguments, options) do
59
- yield
60
- end
61
- else
62
- __send__(method_name, *arguments, options)
63
- end
64
- end
65
-
66
- ##
67
- # Underscored Methods
68
- #
69
- def _create_cached_finder_for(cached_finder_key, options = {})
70
- cached_finder_key_set = [ cached_finder_key ].flatten.sort
71
-
72
- ##
73
- # Run each permutation of the arguments passed in
74
- # and define each finder/searcher
75
- #
76
- cached_finder_key_set.permutation do |arguments|
77
- delete_method_name = _cached_delete_method_name(arguments)
78
- exist_find_method_name = _cached_exist_find_method_name(arguments)
79
- exist_search_method_name = _cached_exist_search_method_name(arguments)
80
- find_method_name = _cached_find_method_name(arguments)
81
- search_method_name = _cached_search_method_name(arguments)
82
-
83
- unless self.respond_to?(delete_method_name)
84
- _define_cached_delete_method(delete_method_name, arguments)
85
- end
86
-
87
- unless self.respond_to?(exist_find_method_name)
88
- _define_cached_exist_find_method(exist_find_method_name, arguments)
89
- end
90
-
91
- unless self.respond_to?(exist_search_method_name)
92
- _define_cached_exist_search_method(exist_search_method_name, arguments)
93
- end
94
-
95
- unless self.respond_to?(find_method_name)
96
- _define_cached_find_method(find_method_name, arguments)
97
- end
98
-
99
- unless self.respond_to?(search_method_name)
100
- _define_cached_search_method(search_method_name, arguments)
101
- end
102
- end
103
- end
104
-
105
- def _cached_delete_method_name(arguments)
106
- "cached_delete_by_#{arguments.join('_and_')}"
107
- end
108
-
109
- def _cached_exist_find_method_name(arguments)
110
- "cached_exist_find_by_#{arguments.join('_and_')}"
111
- end
112
-
113
- def _cached_exist_search_method_name(arguments)
114
- "cached_exist_search_by_#{arguments.join('_and_')}"
115
- end
116
-
117
- def _cached_find_method_name(arguments)
118
- "cached_find_by_#{arguments.join('_and_')}"
119
- end
120
-
121
- def _cached_search_method_name(arguments)
122
- "cached_search_by_#{arguments.join('_and_')}"
123
- end
124
-
125
- def _define_cached_delete_method(method_name, *method_arguments)
126
- method_arguments.flatten!
127
- expanded_method_args = method_arguments.join(",")
128
- sorted_method_args = method_arguments.sort.join(",")
129
-
130
- self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
131
- # def self.cached_delete_by_user_guid(user_guid, options = {})
132
- # ::ActiveRemote::Cached.cache.delete([name, user_guid])
133
- # end
134
- def self.#{method_name}(#{expanded_method_args}, options = {})
135
- ::ActiveRemote::Cached.cache.delete([name, "#search", #{sorted_method_args}])
136
- ::ActiveRemote::Cached.cache.delete([name, "#find", #{sorted_method_args}])
137
- end
138
- RUBY
139
- end
140
-
141
- def _define_cached_exist_find_method(method_name, *method_arguments)
142
- method_arguments.flatten!
143
- expanded_method_args = method_arguments.join(",")
144
- sorted_method_args = method_arguments.sort.join(",")
145
-
146
- self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
147
- # def self.cached_exist_find_by_user_guid(user_guid, options = {})
148
- # ::ActiveRemote::Cached.cache.exist?([name, user_guid])
149
- # end
150
- def self.#{method_name}(#{expanded_method_args}, options = {})
151
- ::ActiveRemote::Cached.cache.exist?([name, "#find", #{sorted_method_args}])
152
- end
153
- RUBY
154
-
155
- self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
156
- # def self.cached_exist_find_by_user_guid?(user_guid, options = {})
157
- # ::ActiveRemote::Cached.cache.exist?([name, user_guid])
158
- # end
159
- def self.#{method_name}?(#{expanded_method_args}, options = {})
160
- ::ActiveRemote::Cached.cache.exist?([name, "#find", #{sorted_method_args}])
161
- end
162
- RUBY
163
- end
164
-
165
- def _define_cached_exist_search_method(method_name, *method_arguments)
166
- method_arguments.flatten!
167
- expanded_method_args = method_arguments.join(",")
168
- sorted_method_args = method_arguments.sort.join(",")
169
-
170
- self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
171
- # def self.cached_exist_search_by_user_guid(user_guid, options = {})
172
- # ::ActiveRemote::Cached.cache.exist?([name, user_guid])
173
- # end
174
- def self.#{method_name}(#{expanded_method_args}, options = {})
175
- ::ActiveRemote::Cached.cache.exist?([name, "#search", #{sorted_method_args}])
176
- end
177
- RUBY
178
-
179
- self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
180
- # def self.cached_exist_search_by_user_guid?(user_guid, options = {})
181
- # ::ActiveRemote::Cached.cache.exist?([name, user_guid])
182
- # end
183
- def self.#{method_name}?(#{expanded_method_args}, options = {})
184
- ::ActiveRemote::Cached.cache.exist?([name, "#search", #{sorted_method_args}])
185
- end
186
- RUBY
187
- end
188
-
189
- def _define_cached_find_method(method_name, *method_arguments)
190
- method_arguments.flatten!
191
- expanded_method_args = method_arguments.join(",")
192
- sorted_method_args = method_arguments.sort.join(",")
193
-
194
- expanded_search_args = ""
195
- method_arguments.each do |method_argument|
196
- expanded_search_args << ":#{method_argument} => #{method_argument},"
197
- end
198
-
199
- self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
200
- # def self.cached_find_by_user_guid(user_guid, options = {})
201
- # options = ::ActiveRemote::Cached.default_options.merge(options)
202
- #
203
- # ::ActiveRemote::Cached.cache.fetch([name, "#find", user_guid], options) do
204
- # self.find(:user_guid => user_guid)
205
- # end
206
- # end
207
- #
208
- # If a block is given, it is incumbent on the caller to make sure the expectation
209
- # of the result object is maintained for requests/responses
210
- #
211
- def self.#{method_name}(#{expanded_method_args}, options = {})
212
- options = ::ActiveRemote::Cached.default_options.merge(options)
213
-
214
- ::ActiveRemote::Cached.cache.fetch([name, "#find", #{sorted_method_args}], options) do
215
- if block_given?
216
- yield
217
- else
218
- self.find(#{expanded_search_args})
219
- end
220
- end
221
- end
222
- RUBY
223
- end
224
-
225
- def _define_cached_search_method(method_name, *method_arguments)
226
- method_arguments.flatten!
227
- expanded_method_args = method_arguments.join(",")
228
- sorted_method_args = method_arguments.sort.join(",")
229
-
230
- expanded_search_args = ""
231
- method_arguments.each do |method_argument|
232
- expanded_search_args << ":#{method_argument} => #{method_argument},"
233
- end
234
-
235
- self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
236
- # def self.cached_search_by_user_guid(user_guid, options = {})
237
- # options = ::ActiveRemote::Cached.default_options.merge(options)
238
- #
239
- # ::ActiveRemote::Cached.cache.fetch([name, "#search", user_guid], options) do
240
- # self.search(:user_guid => user_guid)
241
- # end
242
- # end
243
- #
244
- # If a block is given, it is incumbent on the caller to make sure the expectation
245
- # of the result object is maintained for requests/responses
246
- #
247
- def self.#{method_name}(#{expanded_method_args}, options = {})
248
- options = ::ActiveRemote::Cached.default_options.merge(options)
249
-
250
- ::ActiveRemote::Cached.cache.fetch([name, "#search", #{sorted_method_args}], options) do
251
- if block_given?
252
- yield
253
- else
254
- self.search(#{expanded_search_args})
255
- end
256
- end
257
- end
258
- RUBY
259
- end
260
- end
261
- end
262
- end
1
+ require "active_remote/cached"
@@ -0,0 +1,269 @@
1
+ require "active_support"
2
+ require "active_support/cache"
3
+ require "active_support/concern"
4
+ require "active_support/core_ext/array/extract_options"
5
+
6
+ require "active_remote/cached/cache"
7
+ require "active_remote/cached/version"
8
+
9
+ require "active_remote/cached/railtie" if defined?(Rails)
10
+
11
+ module ActiveRemote
12
+ module Cached
13
+ extend ::ActiveSupport::Concern
14
+
15
+ def self.cache(cache_provider = nil)
16
+ if cache_provider
17
+ @cache_provider = ::ActiveRemote::Cached::Cache.new(cache_provider)
18
+ end
19
+
20
+ @cache_provider
21
+ end
22
+
23
+ def self.default_options(options = nil)
24
+ if options
25
+ @default_options = options
26
+ end
27
+
28
+ @default_options || {}
29
+ end
30
+
31
+ module ClassMethods
32
+ def cached_finders_for(*cached_finder_keys)
33
+ options = cached_finder_keys.extract_options!
34
+
35
+ cached_finder_keys.each do |cached_finder_key|
36
+ _create_cached_finder_for(cached_finder_key, options)
37
+ end
38
+ end
39
+
40
+ def cached_finders(*keys)
41
+ cached_finders_for(*keys)
42
+ end
43
+
44
+ def cached_find(argument_hash, options = {})
45
+ method_name = _cached_find_method_name(argument_hash.keys)
46
+ arguments = argument_hash.values
47
+
48
+ if block_given?
49
+ __send__(method_name, *arguments, options) do
50
+ yield
51
+ end
52
+ else
53
+ __send__(method_name, *arguments, options)
54
+ end
55
+ end
56
+
57
+ def cached_search(argument_hash, options = {})
58
+ method_name = _cached_search_method_name(argument_hash.keys)
59
+ arguments = argument_hash.values
60
+
61
+ if block_given?
62
+ __send__(method_name, *arguments, options) do
63
+ yield
64
+ end
65
+ else
66
+ __send__(method_name, *arguments, options)
67
+ end
68
+ end
69
+
70
+ ##
71
+ # Underscored Methods
72
+ #
73
+ def _create_cached_finder_for(cached_finder_key, options = {})
74
+ cached_finder_key_set = [ cached_finder_key ].flatten.sort
75
+
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
+
87
+ unless self.respond_to?(delete_method_name)
88
+ _define_cached_delete_method(delete_method_name, arguments)
89
+ end
90
+
91
+ unless self.respond_to?(exist_find_method_name)
92
+ _define_cached_exist_find_method(exist_find_method_name, arguments)
93
+ end
94
+
95
+ unless self.respond_to?(exist_search_method_name)
96
+ _define_cached_exist_search_method(exist_search_method_name, arguments)
97
+ end
98
+
99
+ unless self.respond_to?(find_method_name)
100
+ _define_cached_find_method(find_method_name, arguments)
101
+ end
102
+
103
+ unless self.respond_to?(search_method_name)
104
+ _define_cached_search_method(search_method_name, arguments)
105
+ end
106
+ end
107
+ end
108
+
109
+ def _cached_delete_method_name(arguments)
110
+ "cached_delete_by_#{arguments.join('_and_')}"
111
+ end
112
+
113
+ def _cached_exist_find_method_name(arguments)
114
+ "cached_exist_find_by_#{arguments.join('_and_')}"
115
+ end
116
+
117
+ def _cached_exist_search_method_name(arguments)
118
+ "cached_exist_search_by_#{arguments.join('_and_')}"
119
+ end
120
+
121
+ def _cached_find_method_name(arguments)
122
+ "cached_find_by_#{arguments.join('_and_')}"
123
+ end
124
+
125
+ def _cached_search_method_name(arguments)
126
+ "cached_search_by_#{arguments.join('_and_')}"
127
+ end
128
+
129
+ def _define_cached_delete_method(method_name, *method_arguments)
130
+ method_arguments.flatten!
131
+ expanded_method_args = method_arguments.join(",")
132
+ sorted_method_args = method_arguments.sort.join(",")
133
+
134
+ self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
135
+ # def self.cached_delete_by_user_guid(user_guid, options = {})
136
+ # ::ActiveRemote::Cached.cache.delete([name, user_guid])
137
+ # end
138
+ def self.#{method_name}(#{expanded_method_args}, options = {})
139
+ ::ActiveRemote::Cached.cache.delete([name, "#search", #{sorted_method_args}])
140
+ ::ActiveRemote::Cached.cache.delete([name, "#find", #{sorted_method_args}])
141
+ end
142
+ RUBY
143
+ end
144
+
145
+ def _define_cached_exist_find_method(method_name, *method_arguments)
146
+ method_arguments.flatten!
147
+ expanded_method_args = method_arguments.join(",")
148
+ sorted_method_args = method_arguments.sort.join(",")
149
+
150
+ self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
151
+ # def self.cached_exist_find_by_user_guid(user_guid, options = {})
152
+ # ::ActiveRemote::Cached.cache.exist?([name, user_guid])
153
+ # end
154
+ def self.#{method_name}(#{expanded_method_args}, options = {})
155
+ ::ActiveRemote::Cached.cache.exist?([name, "#find", #{sorted_method_args}])
156
+ end
157
+ RUBY
158
+
159
+ self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
160
+ # def self.cached_exist_find_by_user_guid?(user_guid, options = {})
161
+ # ::ActiveRemote::Cached.cache.exist?([name, user_guid])
162
+ # end
163
+ def self.#{method_name}?(#{expanded_method_args}, options = {})
164
+ ::ActiveRemote::Cached.cache.exist?([name, "#find", #{sorted_method_args}])
165
+ end
166
+ RUBY
167
+ end
168
+
169
+ def _define_cached_exist_search_method(method_name, *method_arguments)
170
+ method_arguments.flatten!
171
+ expanded_method_args = method_arguments.join(",")
172
+ sorted_method_args = method_arguments.sort.join(",")
173
+
174
+ self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
175
+ # def self.cached_exist_search_by_user_guid(user_guid, options = {})
176
+ # ::ActiveRemote::Cached.cache.exist?([name, user_guid])
177
+ # end
178
+ def self.#{method_name}(#{expanded_method_args}, options = {})
179
+ ::ActiveRemote::Cached.cache.exist?([name, "#search", #{sorted_method_args}])
180
+ end
181
+ RUBY
182
+
183
+ self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
184
+ # def self.cached_exist_search_by_user_guid?(user_guid, options = {})
185
+ # ::ActiveRemote::Cached.cache.exist?([name, user_guid])
186
+ # end
187
+ def self.#{method_name}?(#{expanded_method_args}, options = {})
188
+ ::ActiveRemote::Cached.cache.exist?([name, "#search", #{sorted_method_args}])
189
+ end
190
+ RUBY
191
+ end
192
+
193
+ def _define_cached_find_method(method_name, *method_arguments)
194
+ method_arguments.flatten!
195
+ expanded_method_args = method_arguments.join(",")
196
+ sorted_method_args = method_arguments.sort.join(",")
197
+
198
+ expanded_search_args = ""
199
+ method_arguments.each do |method_argument|
200
+ expanded_search_args << ":#{method_argument} => #{method_argument},"
201
+ end
202
+
203
+ self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
204
+ # def self.cached_find_by_user_guid(user_guid, options = {})
205
+ # options = ::ActiveRemote::Cached.default_options.merge(options)
206
+ #
207
+ # ::ActiveRemote::Cached.cache.fetch([name, "#find", user_guid], options) do
208
+ # self.find(:user_guid => user_guid)
209
+ # end
210
+ # end
211
+ #
212
+ # If a block is given, it is incumbent on the caller to make sure the expectation
213
+ # of the result object is maintained for requests/responses
214
+ #
215
+ def self.#{method_name}(#{expanded_method_args}, options = {})
216
+ options = ::ActiveRemote::Cached.default_options.merge(options)
217
+
218
+ ::ActiveRemote::Cached.cache.fetch([name, "#find", #{sorted_method_args}], options) do
219
+ if block_given?
220
+ yield
221
+ else
222
+ self.find(#{expanded_search_args})
223
+ end
224
+ end
225
+ end
226
+ RUBY
227
+ end
228
+
229
+ def _define_cached_search_method(method_name, *method_arguments)
230
+ method_arguments.flatten!
231
+ expanded_method_args = method_arguments.join(",")
232
+ sorted_method_args = method_arguments.sort.join(",")
233
+
234
+ expanded_search_args = ""
235
+ method_arguments.each do |method_argument|
236
+ expanded_search_args << ":#{method_argument} => #{method_argument},"
237
+ end
238
+
239
+ self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
240
+ # def self.cached_search_by_user_guid(user_guid, options = {})
241
+ # options = ::ActiveRemote::Cached.default_options.merge(options)
242
+ #
243
+ # ::ActiveRemote::Cached.cache.fetch([name, "#search", user_guid], options) do
244
+ # self.search(:user_guid => user_guid)
245
+ # end
246
+ # end
247
+ #
248
+ # If a block is given, it is incumbent on the caller to make sure the expectation
249
+ # of the result object is maintained for requests/responses
250
+ #
251
+ def self.#{method_name}(#{expanded_method_args}, options = {})
252
+ options = ::ActiveRemote::Cached.default_options.merge(options)
253
+
254
+ ::ActiveRemote::Cached.cache.fetch([name, "#search", #{sorted_method_args}], options) do
255
+ if block_given?
256
+ yield
257
+ else
258
+ self.search(#{expanded_search_args})
259
+ end
260
+ end
261
+ end
262
+ RUBY
263
+ end
264
+ end
265
+
266
+ # Initialize the cache provider with a MemoryStore cache
267
+ cache(ActiveSupport::Cache::MemoryStore.new)
268
+ end
269
+ end
@@ -0,0 +1,14 @@
1
+ module ActiveRemote
2
+ module Cached
3
+ class Railtie < Rails::Railtie
4
+ initializer "active_remote-cached.initialize_cache" do |app|
5
+ ActiveRemote::Cached.cache(app.cache)
6
+ ActiveRemote::Cached.default_options(:race_condition_ttl => 5.seconds)
7
+ end
8
+
9
+ ActiveSupport.on_load(:active_remote) do
10
+ include ActiveRemote::Cached
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,5 +1,5 @@
1
1
  module ActiveRemote
2
2
  module Cached
3
- VERSION = "0.0.5"
3
+ VERSION = "0.0.6"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,97 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_remote-cached
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandon Dewitt
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-08 00:00:00.000000000 Z
11
+ date: 2014-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_remote
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activesupport
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: mocha
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: pry
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rake
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - '>='
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - '>='
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  description: ' Provides "cached" finders and a DSL to enumerate which finders should
@@ -102,20 +102,22 @@ executables: []
102
102
  extensions: []
103
103
  extra_rdoc_files: []
104
104
  files:
105
- - .gitignore
105
+ - ".gitignore"
106
106
  - Gemfile
107
107
  - LICENSE.txt
108
108
  - README.md
109
109
  - Rakefile
110
110
  - active_remote-cached.gemspec
111
111
  - lib/active_remote-cached.rb
112
- - lib/active_remote-cached/cache.rb
113
- - lib/active_remote-cached/version.rb
114
- - spec/cache_spec.rb
115
- - spec/cached_delete_methods_spec.rb
116
- - spec/cached_exist_methods_spec.rb
117
- - spec/cached_find_methods_spec.rb
118
- - spec/cached_search_methods_spec.rb
112
+ - lib/active_remote/cached.rb
113
+ - lib/active_remote/cached/cache.rb
114
+ - lib/active_remote/cached/railtie.rb
115
+ - lib/active_remote/cached/version.rb
116
+ - spec/active_remote/cached/cache_spec.rb
117
+ - spec/active_remote/cached_delete_methods_spec.rb
118
+ - spec/active_remote/cached_exist_methods_spec.rb
119
+ - spec/active_remote/cached_find_methods_spec.rb
120
+ - spec/active_remote/cached_search_methods_spec.rb
119
121
  - spec/spec_helper.rb
120
122
  homepage: ''
121
123
  licenses: []
@@ -126,12 +128,12 @@ require_paths:
126
128
  - lib
127
129
  required_ruby_version: !ruby/object:Gem::Requirement
128
130
  requirements:
129
- - - '>='
131
+ - - ">="
130
132
  - !ruby/object:Gem::Version
131
133
  version: '0'
132
134
  required_rubygems_version: !ruby/object:Gem::Requirement
133
135
  requirements:
134
- - - '>='
136
+ - - ">="
135
137
  - !ruby/object:Gem::Version
136
138
  version: '0'
137
139
  requirements: []
@@ -142,9 +144,9 @@ specification_version: 4
142
144
  summary: Provides a configuration for caching mechanisms and finders on ActiveRemote
143
145
  models that are cached/cacheable
144
146
  test_files:
145
- - spec/cache_spec.rb
146
- - spec/cached_delete_methods_spec.rb
147
- - spec/cached_exist_methods_spec.rb
148
- - spec/cached_find_methods_spec.rb
149
- - spec/cached_search_methods_spec.rb
147
+ - spec/active_remote/cached/cache_spec.rb
148
+ - spec/active_remote/cached_delete_methods_spec.rb
149
+ - spec/active_remote/cached_exist_methods_spec.rb
150
+ - spec/active_remote/cached_find_methods_spec.rb
151
+ - spec/active_remote/cached_search_methods_spec.rb
150
152
  - spec/spec_helper.rb