benschwarz-merb-cache 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. data/LICENSE +20 -0
  2. data/README +224 -0
  3. data/Rakefile +17 -0
  4. data/lib/merb-cache.rb +15 -0
  5. data/lib/merb-cache/cache.rb +91 -0
  6. data/lib/merb-cache/cache_request.rb +48 -0
  7. data/lib/merb-cache/core_ext/enumerable.rb +9 -0
  8. data/lib/merb-cache/core_ext/hash.rb +21 -0
  9. data/lib/merb-cache/merb_ext/controller/class_methods.rb +244 -0
  10. data/lib/merb-cache/merb_ext/controller/instance_methods.rb +163 -0
  11. data/lib/merb-cache/stores/fundamental/abstract_store.rb +101 -0
  12. data/lib/merb-cache/stores/fundamental/file_store.rb +113 -0
  13. data/lib/merb-cache/stores/fundamental/memcached_store.rb +110 -0
  14. data/lib/merb-cache/stores/strategy/abstract_strategy_store.rb +119 -0
  15. data/lib/merb-cache/stores/strategy/action_store.rb +61 -0
  16. data/lib/merb-cache/stores/strategy/adhoc_store.rb +69 -0
  17. data/lib/merb-cache/stores/strategy/gzip_store.rb +63 -0
  18. data/lib/merb-cache/stores/strategy/mintcache_store.rb +75 -0
  19. data/lib/merb-cache/stores/strategy/page_store.rb +68 -0
  20. data/lib/merb-cache/stores/strategy/sha1_store.rb +62 -0
  21. data/spec/merb-cache/cache_request_spec.rb +78 -0
  22. data/spec/merb-cache/cache_spec.rb +88 -0
  23. data/spec/merb-cache/core_ext/enumerable_spec.rb +26 -0
  24. data/spec/merb-cache/core_ext/hash_spec.rb +51 -0
  25. data/spec/merb-cache/merb_ext/controller_spec.rb +5 -0
  26. data/spec/merb-cache/stores/fundamental/abstract_store_spec.rb +118 -0
  27. data/spec/merb-cache/stores/fundamental/file_store_spec.rb +205 -0
  28. data/spec/merb-cache/stores/fundamental/memcached_store_spec.rb +258 -0
  29. data/spec/merb-cache/stores/strategy/abstract_strategy_store_spec.rb +78 -0
  30. data/spec/merb-cache/stores/strategy/action_store_spec.rb +208 -0
  31. data/spec/merb-cache/stores/strategy/adhoc_store_spec.rb +227 -0
  32. data/spec/merb-cache/stores/strategy/gzip_store_spec.rb +68 -0
  33. data/spec/merb-cache/stores/strategy/mintcache_store_spec.rb +59 -0
  34. data/spec/merb-cache/stores/strategy/page_store_spec.rb +146 -0
  35. data/spec/merb-cache/stores/strategy/sha1_store_spec.rb +84 -0
  36. data/spec/spec_helper.rb +95 -0
  37. metadata +112 -0
@@ -0,0 +1,244 @@
1
+ module Merb::Cache::Controller
2
+ module ClassMethods
3
+ def self.extended(base)
4
+ base.send :class_inheritable_accessor, :_cache
5
+ base._cache = {}
6
+ end
7
+
8
+
9
+ def cache!(conditions = {})
10
+ before(:_cache_before, conditions.only(:if, :unless).merge(:with => conditions))
11
+ after(:_cache_after, conditions.only(:if, :unless).merge(:with => conditions))
12
+ end
13
+
14
+ # cache is an alias to cache_action, it will take multiple :actions and pass the conditions hash for each action
15
+ #
16
+ # @param *actions<Array[Symbol]> actions to cache
17
+ #
18
+ # @param options<Hash> Conditions passed to the store and two options specific to cache
19
+ #
20
+ # @note
21
+ # Specific options for cache:
22
+ # - :store (or :stores) use the specified store
23
+ # - :params list of params to pass to the store (see _parameters_and_conditions)
24
+ #
25
+ # @example cache :index, :show, :expire_in => 30 # caches the index and show action for 30 seconds
26
+ # @example cache :index, :store => :page_store # caches the index action using the page store
27
+ # @example cache :index, :params => [:page, :q], :store => :action_store # caches the index action using the action store and passing the :page and :q params to the action store (NB. :params => <Array> has no effect on the page store)
28
+ #
29
+ # @api public
30
+ def cache(*actions)
31
+ options = extract_options_from_args!(actions) || {}
32
+ actions.each {|a| cache_action(a, options)}
33
+ end
34
+
35
+ # cache action will cache the action
36
+ # Parameters are the same as cache but only one action is allowed
37
+ #
38
+ # @api private
39
+ def cache_action(action, conditions = {})
40
+ self._cache[action] = conditions
41
+ before("_cache_#{action}_before", conditions.only(:if, :unless).merge(:with => [conditions], :only => action))
42
+ after("_cache_#{action}_after", conditions.only(:if, :unless).merge(:with => [conditions], :only => action))
43
+ alias_method "_cache_#{action}_before", :_cache_before
44
+ alias_method "_cache_#{action}_after", :_cache_after
45
+ end
46
+
47
+ # Checks if the action called with a certain request would be cached or not. Usefull for troubleshooting problems
48
+ #
49
+ # @param action<String> action to check
50
+ #
51
+ # @param request_hash<Hash> The params that the request would have. :uri and :method are also supported to indicate the :uri and :method of the request. :store and :stores indicate the cache store to use.
52
+ #
53
+ # @note
54
+ # if not specified, the default http method is :get and the default uri is '/'
55
+ #
56
+ # @return <TrueClass, FalseClass>
57
+ # True if such a request would be cached
58
+ #
59
+ # @example Project.caches? :index, :uri => '/projects', :params => {:q => 'test'}, :method => :get
60
+ # @example Project.caches? :show, :uri => url(:project, @project), :params => {:id => @project.id}
61
+ #
62
+ # @api public
63
+ def caches?(action, params = {})
64
+ controller, conditions = _controller_and_conditions(action, params)
65
+ Merb::Cache[controller._lookup_store(conditions)].writable?(controller, *controller._parameters_and_conditions(conditions))
66
+ end
67
+
68
+ # Checks if the action called with a certain request has been cached or not.
69
+ #
70
+ # @param action<String> action to check
71
+ #
72
+ # @param request_hash<Hash> The params that the request would have. :uri and :method are also supported to indicate the :uri and :method of the request. :store and :stores indicate the cache store to use.
73
+ #
74
+ # @note
75
+ # if not specified, the default http method is :get and the default uri is '/'
76
+ #
77
+ # @return <TrueClass, FalseClass>
78
+ # True if such a request has been cached
79
+ #
80
+ # @example Project.caches? :index, :uri => '/projects', :params => {:q => 'test'}, :method => :get
81
+ #
82
+ # @api public
83
+ def cached?(action, params = {})
84
+ controller, conditions = _controller_and_conditions(action, params)
85
+ Merb::Cache[controller._lookup_store(conditions)].exists?(controller, *controller._parameters_and_conditions(conditions))
86
+ end
87
+
88
+ # Returns the cache for the action with the given request
89
+ #
90
+ # @param action<String> action to check
91
+ #
92
+ # @param request_hash<Hash> The params that the request would have. :uri and :method are also supported to indicate the :uri and :method of the request. :store and :stores indicate the cache store to use.
93
+ #
94
+ # @note
95
+ # if not specified, the default http method is :get and the default uri is '/'
96
+ #
97
+ # @return <Object>
98
+ # The content of the cache if available, else nil
99
+ #
100
+ # @example Project.cache_for :index, :uri => '/projects', :params => {:q => 'test'}, :method => :get
101
+ #
102
+ # @api public
103
+ def cache_for(action, params = {})
104
+ controller, conditions = _controller_and_conditions(action, params)
105
+ Merb::Cache[controller._lookup_store(conditions)].read(controller, *controller._parameters_and_conditions(conditions).first)
106
+ end
107
+
108
+ # Deletes the cache for the action with the given request
109
+ #
110
+ # @param action<String> action
111
+ #
112
+ # @param request_hash<Hash> The params that the request would have. :uri and :method are also supported to indicate the :uri and :method of the request. :store and :stores indicate the cache store to use.
113
+ #
114
+ # @note
115
+ # if not specified, the default http method is :get and the default uri is '/'
116
+ #
117
+ #
118
+ # @example Project.delete_cache_for :index, :uri => '/projects', :params => {:q => 'test'}, :method => :get
119
+ #
120
+ # @api public
121
+ def delete_cache_for(action, params = {})
122
+ controller, conditions = _controller_and_conditions(action, params)
123
+ Merb::Cache[controller._lookup_store(conditions)].delete(controller, *controller._parameters_and_conditions(conditions).first)
124
+ end
125
+
126
+ # Caches specified with eager_cache will be run after #trigger_action has been run
127
+ # without holding some poor user up generating the cache (through run_later)
128
+ #
129
+ # @param trigger_action<Symbol, Array[*Symbol]> The actions that will trigger the eager caching
130
+ # @param target<Array[Controller,Symbol], Symbol> the target option to cache (if no controller is given, the current controller is used)
131
+ # @param opts<Hash> Request options. See note for details.
132
+ # @param blk<Block> Block run to generate the request or controller used for eager caching after trigger_action has run
133
+ #
134
+ # @note
135
+ # Valid request options are:
136
+ # - :uri the uri of the resource you want to eager cache (needed by the page store but can be provided instead by a block)
137
+ # - :method http method used (defaults to :get)
138
+ #
139
+ # @example eager_cache :update, :index, :uri => '/articles' # When the update action is completed, a get request to :index with '/articles' uri will be cached (if you use the page store, this will be stored in '/articles.html')
140
+ # @example eager_cache :create, :index # Same after the create action but since no uri is given, the current uri is used with the default http method (:get). Useful default for resource controllers
141
+ # @example eager_cache(:create, [Timeline, :index]) {{ :uri => build_url(:timelines)}}
142
+ #
143
+ # @api public
144
+ def eager_cache(trigger_actions, target = nil, opts = {}, &blk)
145
+ trigger_actions = [*trigger_actions]
146
+ target, conditions = nil, target if target.is_a? Hash
147
+
148
+ trigger_actions.each do |trigger_action|
149
+
150
+ if target.is_a? Array
151
+ target_controller, target_action = *target
152
+ else
153
+ target_controller, target_action = self, (target || trigger_action)
154
+ end
155
+
156
+ after("_eager_cache_#{trigger_action}_to_#{target_controller.name.snake_case}__#{target_action}_after", opts.only(:if, :unless).merge(:with => [target_controller, target_action, opts, blk], :only => trigger_action))
157
+ alias_method "_eager_cache_#{trigger_action}_to_#{target_controller.name.snake_case}__#{target_action}_after", :_eager_cache_after
158
+ end
159
+ end
160
+
161
+ # Dispatches eager caches to a worker process
162
+ #
163
+ # @param action<String> The actiont to dispatch
164
+ # @param params<Hash> params of the request (passed to the block)
165
+ # @param env<Hash> environment variables of the request (passed to the block)
166
+ # @param blk<Block> block used to build the request (should return a hash, request or a controller)
167
+ #
168
+ # @api private
169
+ def eager_dispatch(action, params = {}, env = {}, blk = nil)
170
+ kontroller = if blk.nil?
171
+ new(build_request(env))
172
+ else
173
+ result = case blk.arity
174
+ when 0 then blk[]
175
+ when 1 then blk[params]
176
+ else blk[*[params, env]]
177
+ end
178
+
179
+ case result
180
+ when NilClass then new(build_request(env))
181
+ when Hash, Mash then new(build_request(result))
182
+ when Merb::Request then new(result)
183
+ when Merb::Controller then result
184
+ else raise ArgumentError, "Block to eager_cache must return nil, the env Hash, a Request object, or a Controller object"
185
+ end
186
+ end
187
+
188
+ kontroller.force_cache!
189
+
190
+ kontroller._dispatch(action)
191
+
192
+ kontroller
193
+ end
194
+
195
+ # Builds a request that will be sent to the merb worker process to be
196
+ # cached without holding some poor user up generating the cache (through run_later)
197
+ #
198
+ # @param request_hash<Hash> hash used to describe the request
199
+ #
200
+ # @note Acceptable options for the request hash
201
+ # - :uri The uri of the request
202
+ # - :method The http method (defaults to :get)
203
+ # - :params The params
204
+ # - any env variable you may need
205
+ #
206
+ # @return <Request>
207
+ # A request for the given arguments
208
+ #
209
+ # @example build_request(:params => {:id => @article.id}, :method => :put, :uri => build_url(:article, @article)}) # a request corresponding to the update action of a resourceful controller
210
+ #
211
+ # @api public
212
+ def build_request(request_hash = {})
213
+ Merb::Cache::CacheRequest.new(request_hash.delete(:uri), request_hash.delete(:params), request_hash)
214
+ end
215
+
216
+ # @see Router.url
217
+ def build_url(*args)
218
+ Merb::Router.url(*args)
219
+ end
220
+
221
+ # Used by cache?, cached?, cache_for and delete_cache_for to generate the controller from the given parameters.
222
+ #
223
+ # @param action<String> the cached action
224
+ # @param request_hash<Hash> params from the request.
225
+ #
226
+ # @note
227
+ # in the request hash, :params, :uri and :method are supported. Additionally :store and :stores specify which store to use.
228
+ #
229
+ # @return <Array[Controller, Hash]>
230
+ # the controller built using the request corresponding to params
231
+ # the conditions for the cached action
232
+ #
233
+ # @api private
234
+ def _controller_and_conditions(action, request_hash)
235
+ conditions = self._cache[action]
236
+ conditions.merge!(request_hash.only(:store, :stores))
237
+ request_hash.extract!(:store, :stores)
238
+ controller = new(build_request(request_hash))
239
+ controller.action_name = action
240
+
241
+ [controller, conditions]
242
+ end
243
+ end
244
+ end
@@ -0,0 +1,163 @@
1
+ module Merb::Cache::Controller
2
+ module InstanceMethods
3
+ # Partial / fragment caches are written / retrieved using fetch_partial
4
+ #
5
+ # @params template<String, Symbol> The path to the template, relative to the current controller or the template root
6
+ # @params opts<Hash> Options for the partial (@see Merb::RenderMixin#partial)
7
+ # @params conditions<Hash> conditions for the store (also accept :store for specifying the store)
8
+ #
9
+ # @note
10
+ # The opts hash supports :params_for_cache which can be used to specify which parameters will be passed to the store.
11
+ # If you call `fetch_partial` with parameters that are instance of model it will fail, so you need to use :params_for_cache in this case
12
+ #
13
+ # @example fetch_partial :bar
14
+ # @example fetch_partial :foo, :with => @foo, :params_for_cache => {:foo => @foo.id}
15
+ # @example fetch_partial :store, :with => @items, :params_for_cache => {:store_version => @store.version, :store_id => @store.id}
16
+ def fetch_partial(template, opts={}, conditions = {})
17
+ template_id = template.to_s
18
+ if template_id =~ %r{^/}
19
+ template_path = File.dirname(template_id) / "_#{File.basename(template_id)}"
20
+ else
21
+ kontroller = (m = template_id.match(/.*(?=\/)/)) ? m[0] : controller_name
22
+ template_id = "_#{File.basename(template_id)}"
23
+ end
24
+
25
+ unused, template_key = _template_for(template_id, opts.delete(:format) || content_type, kontroller, template_path)
26
+ template_key.gsub!(File.expand_path(Merb.root),'')
27
+
28
+ fetch_proc = lambda { partial(template, opts) }
29
+ params_for_cache = opts.delete(:params_for_cache) || opts.dup
30
+
31
+ concat(Merb::Cache[_lookup_store(conditions)].fetch(template_key, params_for_cache, conditions, &fetch_proc), fetch_proc.binding)
32
+ end
33
+
34
+
35
+
36
+ # Used to cache the result of a long running block
37
+ #
38
+ # @params opts<Hash> options (only uses :cache_key to define the key used)
39
+ # @params conditions<Hash> conditions passed to the store (also accept :store for specifying the store)
40
+ # @params &proc<Block> block generating the result to cache
41
+ #
42
+ # @example fetch_fragment { #stuff to do}
43
+ #
44
+ # @api public
45
+ def fetch_fragment(opts = {}, conditions = {}, &proc)
46
+ if opts[:cache_key].blank?
47
+ file, line = proc.to_s.scan(%r{^#<Proc:0x\w+@(.+):(\d+)>$}).first
48
+ fragment_key = "#{file}[#{line}]"
49
+ else
50
+ fragment_key = opts.delete(:cache_key)
51
+ end
52
+
53
+ concat(Merb::Cache[_lookup_store(conditions)].fetch(fragment_key, opts, conditions) { capture(&proc) }, proc.binding)
54
+ end
55
+
56
+ def _cache_before(conditions = {})
57
+ unless @_force_cache
58
+ if @_skip_cache.nil? && data = Merb::Cache[_lookup_store(conditions)].read(self, _parameters_and_conditions(conditions).first)
59
+ throw(:halt, data)
60
+ @_cached = true
61
+ else
62
+ @_cached = false
63
+ end
64
+ end
65
+ end
66
+
67
+ def _cache_after(conditions = {})
68
+ if @_cached == false
69
+ if Merb::Cache[_lookup_store(conditions)].write(self, nil, *_parameters_and_conditions(conditions))
70
+ @_cache_write = true
71
+ end
72
+ end
73
+ end
74
+
75
+ def _eager_cache_after(klass, action, options = {}, blk = nil)
76
+ unless @skip_cache
77
+ run_later do
78
+ env = request.env.dup
79
+ env.merge!(options.only(:method, :uri))
80
+
81
+ controller = klass.eager_dispatch(action, request.params.dup, env, blk)
82
+ conditions = self.class._cache[action]
83
+
84
+ Merb::Cache[controller._lookup_store(conditions)].write(controller, nil, *controller._parameters_and_conditions(conditions))
85
+ end
86
+ end
87
+ end
88
+
89
+ # After the request has finished, cache the action without holding some poor user up generating the cache (through run_later)
90
+ #
91
+ # @param action<Array[Controller,Symbol], Symbol> the target option to cache (if no controller is given, the current controller is used)
92
+ # @param options<Hash> Request options. See note for details
93
+ # @param env<Hash> request environment variables
94
+ # @param blk<Block> Block run to generate the request or controller used for eager caching after trigger_action has run
95
+ #
96
+ # @note
97
+ # There are a number of options specific to eager_cache in the conditions hash
98
+ # - :uri the uri of the resource you want to eager cache (needed by the page store but can be provided instead by a block)
99
+ # - :method http method used (defaults to :get)
100
+ # - :params hash of params to use when sending the request to cache
101
+ #
102
+ # @example eager_cache :index, :uri => '/articles' # When the update action is completed, a get request to :index with '/articles' uri will be cached (if you use the page store, this will be stored in '/articles.html')
103
+ # @example eager_cache :index # Same after the create action but since no uri is given, the current uri is used with the default http method (:get). Useful default for resource controllers
104
+ # @example eager_cache([Timeline, :index]) :uri => url(:timelines)}}
105
+ #
106
+ # @api public
107
+ def eager_cache(action, options = {}, env = request.env.dup, &blk)
108
+ unless @_skip_cache
109
+ if action.is_a?(Array)
110
+ klass, action = *action
111
+ else
112
+ klass = self.class
113
+ end
114
+
115
+ run_later do
116
+ env = request.env.dup
117
+ env.merge!(options.only(:method, :uri, :params))
118
+ controller = klass.eager_dispatch(action, {}, env, blk)
119
+ end
120
+ end
121
+ end
122
+
123
+ def skip_cache!; @_skip_cache = true; end
124
+ def force_cache!; @_force_cache = true; end
125
+
126
+ def _lookup_store(conditions = {})
127
+ conditions[:store] || conditions[:stores] || default_cache_store
128
+ end
129
+
130
+ # Overwrite this in your controller to change the default store for a given controller
131
+ def default_cache_store
132
+ Merb::Cache.default_store_name
133
+ end
134
+
135
+ #ugly, please make me purdy'er
136
+ def _parameters_and_conditions(conditions)
137
+ parameters = {}
138
+
139
+ if self.class.respond_to? :action_argument_list
140
+ arguments, defaults = self.class.action_argument_list[action_name]
141
+ arguments.inject(parameters) do |parameters, arg|
142
+ if defaults.include?(arg.first)
143
+ parameters[arg.first] = self.params[arg.first] || arg.last
144
+ else
145
+ parameters[arg.first] = self.params[arg.first]
146
+ end
147
+ parameters
148
+ end
149
+ end
150
+
151
+ case conditions[:params]
152
+ when Symbol
153
+ parameters[conditions[:params]] = self.params[conditions[:params]]
154
+ when Array
155
+ conditions[:params].each do |param|
156
+ parameters[param] = self.params[param]
157
+ end
158
+ end
159
+
160
+ return parameters, conditions.except(:params, :store, :stores, :method, :uri)
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,101 @@
1
+ class Merb::Cache::AbstractStore
2
+
3
+ def initialize(config = {}); end
4
+
5
+ # determines if the store is able to persist data identified by the key & parameters
6
+ # with the given conditions.
7
+ #
8
+ # @param [#to_s] key the key used to identify an entry
9
+ # @param [Hash] parameters optional parameters used to identify an entry
10
+ # @param [Hash] conditions optional conditions that place constraints or detail instructions for storing an entry
11
+ # @return [TrueClass] the ability of the store to write an entry based on the key, parameters, and conditions
12
+ # @raise [NotImplementedError] API method has not been implemented
13
+ def writable?(key, parameters = {}, conditions = {})
14
+ raise NotImplementedError
15
+ end
16
+
17
+ # gets the data from the store identified by the key & parameters.
18
+ # return nil if the entry does not exist.
19
+ #
20
+ # @param [#to_s] key the key used to identify an entry
21
+ # @param [Hash] parameters optional parameters used to identify an entry
22
+ # @return [Object, NilClass] the match entry, or nil if no entry exists matching the key and parameters
23
+ # @raise [NotImplementedError] API method has not been implemented
24
+ def read(key, parameters = {})
25
+ raise NotImplementedError
26
+ end
27
+
28
+ # persists the data so that it can be retrieved by the key & parameters.
29
+ # returns nil if it is unable to persist the data.
30
+ # returns true if successful.
31
+ #
32
+ # @param [#to_s] key the key used to identify an entry
33
+ # @param data the object to persist as an entry
34
+ # @param [Hash] parameters optional parameters used to identify an entry
35
+ # @param [Hash] conditions optional conditions that place constraints or detail instructions for storing an entry
36
+ # @return [TrueClass, NilClass] true if the entry was successfully written, otherwise nil
37
+ # @raise [NotImplementedError] API method has not been implemented
38
+ def write(key, data = nil, parameters = {}, conditions = {})
39
+ raise NotImplementedError
40
+ end
41
+
42
+ # @param [#to_s] key the key used to identify an entry
43
+ # @param data the object to persist as an entry
44
+ # @param [Hash] parameters optional parameters used to identify an entry
45
+ # @param [Hash] conditions optional conditions that place constraints or detail instructions for storing an entry
46
+ # @return [TrueClass, NilClass] true if the entry was successfully written, otherwise nil
47
+ # @raise [NotImplementedError] API method has not been implemented
48
+ def write_all(key, data = nil, parameters = {}, conditions = {})
49
+ write(key, data, parameters, conditions)
50
+ end
51
+
52
+ # tries to read the data from the store. If that fails, it calls
53
+ # the block parameter and persists the result.
54
+ #
55
+ # @param [#to_s] key the key used to identify an entry
56
+ # @param [Hash] parameters optional parameters used to identify an entry
57
+ # @param [Hash] conditions optional conditions that place constraints or detail instructions for storing an entry
58
+ # @return [Object, NilClass] the match entry or the result of the block call, or nil if the entry is not successfully written
59
+ # @raise [NotImplementedError] API method has not been implemented
60
+ def fetch(key, parameters = {}, conditions = {}, &blk)
61
+ raise NotImplementedError
62
+ end
63
+
64
+ # returns true/false based on if data identified by the key & parameters
65
+ # is persisted in the store.
66
+ #
67
+ # @param [#to_s] key the key used to identify an entry
68
+ # @param [Hash] parameters optional parameters used to identify an entry
69
+ # @return [TrueClass] true if the key and parameters match an entry in the store, false otherwise
70
+ # @raise [NotImplementedError] API method has not been implemented
71
+ def exists?(key, parameters = {})
72
+ raise NotImplementedError
73
+ end
74
+
75
+ # deletes the entry for the key & parameter from the store.
76
+ #
77
+ # @param [#to_s] key the key used to identify an entry
78
+ # @param [Hash] parameters optional parameters used to identify an entry
79
+ # @raise [TrueClass] true if the an entry matching the key and parameters is successfully deleted, false otherwise
80
+ # @raise [NotImplementedError] API method has not been implemented
81
+ def delete(key, parameters = {})
82
+ raise NotImplementedError
83
+ end
84
+
85
+ # deletes all entries for the key & parameters for the store.
86
+ #
87
+ # @return [TrueClass] true if all entries in the store are erased, false otherwise
88
+ # @raise [NotImplementedError] API method has not been implemented
89
+ def delete_all
90
+ raise NotImplementedError
91
+ end
92
+
93
+ # dangerous version of delete_all. Used by strategy stores, which may delete entries not associated with the strategy
94
+ # store making the call.
95
+ #
96
+ # @return [TrueClass] true if all entries in the store are erased, false otherwise
97
+ # @raise [NotImplementedError] API method has not been implemented
98
+ def delete_all!
99
+ delete_all
100
+ end
101
+ end