active_remote-cached 0.2.0 → 1.1.1

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.
@@ -1,38 +1,41 @@
1
- require "active_support"
2
- require "active_support/cache"
3
- require "active_support/concern"
4
- require "active_support/core_ext/array/extract_options"
1
+ require 'active_support'
2
+ require 'active_support/cache'
3
+ require 'active_support/concern'
4
+ require 'active_support/core_ext/array/extract_options'
5
5
 
6
- require "active_remote/cached/argument_keys"
7
- require "active_remote/cached/cache"
8
- require "active_remote/cached/version"
9
- require "active_remote/errors"
6
+ require 'active_remote/cached/argument_keys'
7
+ require 'active_remote/cached/cache'
8
+ require 'active_remote/cached/version'
9
+ require 'active_remote/errors'
10
10
 
11
11
  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.
15
+ # When upgrading Rails versions, don't reuse the same cache key,
16
+ # because you can't rely upon the serialized objects to be consistent across versions.
17
+ # To fix, this adds a cache key that caches the ruby engine version
18
+ # and the activesupport version to prevent cache re-use across different versions.
17
19
  RUBY_AND_ACTIVE_SUPPORT_VERSION = "#{RUBY_ENGINE_VERSION}:#{ActiveSupport::VERSION::STRING}".freeze
18
20
 
19
21
  def self.cache(cache_provider = nil)
20
- if cache_provider
21
- @cache_provider = ::ActiveRemote::Cached::Cache.new(cache_provider)
22
- end
22
+ @cache_provider = ::ActiveRemote::Cached::Cache.new(cache_provider) if cache_provider
23
23
 
24
24
  @cache_provider
25
25
  end
26
26
 
27
27
  def self.default_options(options = nil)
28
- if options
29
- @default_options = options
30
- end
28
+ @default_options = options if options
31
29
 
32
30
  @default_options || {}
33
31
  end
34
32
 
35
33
  module ClassMethods
34
+ def cached_methods
35
+ @cached_methods ||= []
36
+ @cached_methods
37
+ end
38
+
36
39
  def cached_finders_for(*cached_finder_keys)
37
40
  options = cached_finder_keys.extract_options!
38
41
 
@@ -45,102 +48,157 @@ module ActiveRemote
45
48
  cached_finders_for(*keys)
46
49
  end
47
50
 
48
- def cached_find(argument_hash, options = {})
51
+ def cached_find(argument_hash, options = {}, &block)
49
52
  method_name = _cached_find_method_name(argument_hash.keys)
50
- arguments = argument_hash.values
53
+ arguments = argument_hash.keys.sort.map { |k| argument_hash[k] }
51
54
 
52
55
  if block_given?
53
- __send__(method_name, *arguments, options) do
54
- yield
55
- end
56
+ __send__(method_name, *arguments, options, &block)
56
57
  else
57
58
  __send__(method_name, *arguments, options)
58
59
  end
59
60
  end
60
61
 
61
- def cached_search(argument_hash, options = {})
62
+ def cached_search(argument_hash, options = {}, &block)
62
63
  method_name = _cached_search_method_name(argument_hash.keys)
63
- arguments = argument_hash.values
64
+ arguments = argument_hash.keys.sort.map { |k| argument_hash[k] }
64
65
 
65
66
  if block_given?
66
- __send__(method_name, *arguments, options) do
67
- yield
68
- end
67
+ __send__(method_name, *arguments, options, &block)
69
68
  else
70
69
  __send__(method_name, *arguments, options)
71
70
  end
72
71
  end
73
72
 
73
+ def method_missing(m, *args, &block)
74
+ method_name = _method_missing_name(m)
75
+
76
+ if method_name.nil? || !cached_methods.include?(method_name.to_s)
77
+ super(m, *args, &block)
78
+ else
79
+ new_args = _args_in_sorted_order(m, args)
80
+ __send__(method_name, *new_args, &block)
81
+ end
82
+ end
83
+
84
+ def respond_to_missing?(m, include_private = false)
85
+ method_name = _method_missing_name(m)
86
+
87
+ if !method_name.nil? && cached_methods.include?(method_name.to_s)
88
+ true
89
+ else
90
+ super
91
+ end
92
+ end
93
+
74
94
  ##
75
95
  # Underscored Methods
76
96
  #
77
- def _create_cached_finder_for(cached_finder_key, options = {})
78
- cached_finder_key_set = [ cached_finder_key ].flatten.sort
79
-
80
- ##
81
- # Run each permutation of the arguments passed in
82
- # and define each finder/searcher
83
- #
84
- cached_finder_key_set.permutation do |arguments|
85
- delete_method_name = _cached_delete_method_name(arguments)
86
- exist_find_method_name = _cached_exist_find_method_name(arguments)
87
- exist_search_method_name = _cached_exist_search_method_name(arguments)
88
- find_method_name = _cached_find_method_name(arguments)
89
- search_method_name = _cached_search_method_name(arguments)
90
- search_bang_method_name = "#{search_method_name}!"
91
-
92
- unless self.respond_to?(delete_method_name)
93
- _define_cached_delete_method(delete_method_name, arguments, options)
94
- end
97
+ def _method_missing_name(m)
98
+ regex = /(cached_(?:delete|exist_search|search|exist_find|find)_by_)([0-9a-zA-Z_]*)(!|\?)?/
95
99
 
96
- unless self.respond_to?(exist_find_method_name)
97
- _define_cached_exist_find_method(exist_find_method_name, arguments, options)
98
- end
100
+ return unless m.to_s =~ regex
99
101
 
100
- unless self.respond_to?(exist_search_method_name)
101
- _define_cached_exist_search_method(exist_search_method_name, arguments, options)
102
- end
102
+ params = ::Regexp.last_match(2).split('_and_')
103
+ "#{::Regexp.last_match(1)}#{params.sort.join('_and_')}#{::Regexp.last_match(3)}".to_sym
104
+ end
103
105
 
104
- unless self.respond_to?(find_method_name)
105
- _define_cached_find_method(find_method_name, arguments, options)
106
- end
106
+ # rubocop:disable Metrics/AbcSize
107
+ def _args_in_sorted_order(m, args)
108
+ regex = /cached_(?:delete|exist_search|search|exist_find|find)_by_([0-9a-zA-Z_]*)(!|\?)?/
107
109
 
108
- unless self.respond_to?(search_bang_method_name)
109
- _define_cached_search_bang_method(search_bang_method_name, arguments, options)
110
+ method_name = _method_missing_name(m)
111
+
112
+ match_1 = m.match(regex)
113
+ match_2 = method_name.match(regex)
114
+
115
+ args_in_order = []
116
+
117
+ if match_1[1] && match_2[1]
118
+ orignal_args_name = match_1[1].split('_and_')
119
+ args_names_in_order = match_2[1].split('_and_')
120
+
121
+ args_names_in_order.each do |arg_name|
122
+ index = orignal_args_name.index(arg_name)
123
+ args_in_order << args[index]
110
124
  end
111
125
 
112
- unless self.respond_to?(search_method_name)
113
- _define_cached_search_method(search_method_name, arguments, options)
126
+ if args.size > args_in_order.size
127
+ # Add options if passed
128
+ args_in_order << args.last
114
129
  end
130
+
131
+ args_in_order
132
+ else
133
+ args
134
+ end
135
+ end
136
+ # rubocop:enable Metrics/AbcSize
137
+
138
+ # rubocop:disable Metrics/AbcSize
139
+ def _create_cached_finder_for(cached_finder_key, options = {})
140
+ cached_finder_key_set = [cached_finder_key].flatten.sort
141
+
142
+ delete_method_name = _cached_delete_method_name(cached_finder_key_set)
143
+ exist_find_method_name = _cached_exist_find_method_name(cached_finder_key_set)
144
+ exist_search_method_name = _cached_exist_search_method_name(cached_finder_key_set)
145
+ find_method_name = _cached_find_method_name(cached_finder_key_set)
146
+ search_method_name = _cached_search_method_name(cached_finder_key_set)
147
+ search_bang_method_name = "#{search_method_name}!"
148
+
149
+ unless cached_methods.include?(delete_method_name)
150
+ _define_cached_delete_method(delete_method_name, cached_finder_key_set, options)
151
+ end
152
+
153
+ unless cached_methods.include?(exist_find_method_name)
154
+ _define_cached_exist_find_method(exist_find_method_name, cached_finder_key_set, options)
115
155
  end
156
+
157
+ unless cached_methods.include?(exist_search_method_name)
158
+ _define_cached_exist_search_method(exist_search_method_name, cached_finder_key_set, options)
159
+ end
160
+
161
+ unless cached_methods.include?(find_method_name)
162
+ _define_cached_find_method(find_method_name, cached_finder_key_set, options)
163
+ end
164
+
165
+ unless cached_methods.include?(search_bang_method_name)
166
+ _define_cached_search_bang_method(search_bang_method_name, cached_finder_key_set, options)
167
+ end
168
+
169
+ return if cached_methods.include?(search_method_name)
170
+
171
+ _define_cached_search_method(search_method_name, cached_finder_key_set, options)
116
172
  end
173
+ # rubocop:enable Metrics/AbcSize
117
174
 
118
175
  def _cached_delete_method_name(arguments)
119
- "cached_delete_by_#{arguments.join('_and_')}"
176
+ "cached_delete_by_#{arguments.sort.join('_and_')}"
120
177
  end
121
178
 
122
179
  def _cached_exist_find_method_name(arguments)
123
- "cached_exist_find_by_#{arguments.join('_and_')}"
180
+ "cached_exist_find_by_#{arguments.sort.join('_and_')}"
124
181
  end
125
182
 
126
183
  def _cached_exist_search_method_name(arguments)
127
- "cached_exist_search_by_#{arguments.join('_and_')}"
184
+ "cached_exist_search_by_#{arguments.sort.join('_and_')}"
128
185
  end
129
186
 
130
187
  def _cached_find_method_name(arguments)
131
- "cached_find_by_#{arguments.join('_and_')}"
188
+ "cached_find_by_#{arguments.sort.join('_and_')}"
132
189
  end
133
190
 
134
191
  def _cached_search_method_name(arguments)
135
- "cached_search_by_#{arguments.join('_and_')}"
192
+ "cached_search_by_#{arguments.sort.join('_and_')}"
136
193
  end
137
194
 
138
195
  def _define_cached_delete_method(method_name, *method_arguments, cached_finder_options)
139
196
  method_arguments.flatten!
140
- expanded_method_args = method_arguments.join(",")
141
- sorted_method_args = method_arguments.sort.join(",")
197
+ expanded_method_args = method_arguments.join(',')
198
+ sorted_method_args = method_arguments.sort.join(',')
199
+ cached_methods << method_name
142
200
 
143
- self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
201
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
144
202
  # def self.cached_delete_by_user_guid(user_guid, options = {})
145
203
  # ::ActiveRemote::Cached.cache.delete([name, user_guid])
146
204
  # end
@@ -171,10 +229,12 @@ module ActiveRemote
171
229
 
172
230
  def _define_cached_exist_find_method(method_name, *method_arguments, cached_finder_options)
173
231
  method_arguments.flatten!
174
- expanded_method_args = method_arguments.join(",")
175
- sorted_method_args = method_arguments.sort.join(",")
232
+ expanded_method_args = method_arguments.join(',')
233
+ sorted_method_args = method_arguments.sort.join(',')
234
+ cached_methods << method_name
235
+ cached_methods << "#{method_name}?"
176
236
 
177
- self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
237
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
178
238
  # def self.cached_exist_find_by_user_guid(user_guid, options = {})
179
239
  # ::ActiveRemote::Cached.cache.exist?([name, user_guid])
180
240
  # end
@@ -198,10 +258,12 @@ module ActiveRemote
198
258
 
199
259
  def _define_cached_exist_search_method(method_name, *method_arguments, cached_finder_options)
200
260
  method_arguments.flatten!
201
- expanded_method_args = method_arguments.join(",")
202
- sorted_method_args = method_arguments.sort.join(",")
261
+ expanded_method_args = method_arguments.join(',')
262
+ sorted_method_args = method_arguments.sort.join(',')
263
+ cached_methods << method_name
264
+ cached_methods << "#{method_name}?"
203
265
 
204
- self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
266
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
205
267
  # def self.cached_exist_search_by_user_guid(user_guid, options = {})
206
268
  # ::ActiveRemote::Cached.cache.exist?([namespace, name, "#search", user_guid])
207
269
  # end
@@ -225,15 +287,16 @@ module ActiveRemote
225
287
 
226
288
  def _define_cached_find_method(method_name, *method_arguments, cached_finder_options)
227
289
  method_arguments.flatten!
228
- expanded_method_args = method_arguments.join(",")
229
- sorted_method_args = method_arguments.sort.join(",")
290
+ expanded_method_args = method_arguments.join(',')
291
+ sorted_method_args = method_arguments.sort.join(',')
292
+ cached_methods << method_name
230
293
 
231
- expanded_search_args = ""
294
+ expanded_search_args = ''
232
295
  method_arguments.each do |method_argument|
233
296
  expanded_search_args << ":#{method_argument} => #{method_argument},"
234
297
  end
235
298
 
236
- self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
299
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
237
300
  # def self.cached_find_by_user_guid(user_guid, options = {})
238
301
  # options = ::ActiveRemote::Cached.default_options.merge({}).merge(options)
239
302
  #
@@ -269,15 +332,16 @@ module ActiveRemote
269
332
 
270
333
  def _define_cached_search_method(method_name, *method_arguments, cached_finder_options)
271
334
  method_arguments.flatten!
272
- expanded_method_args = method_arguments.join(",")
273
- sorted_method_args = method_arguments.sort.join(",")
335
+ expanded_method_args = method_arguments.join(',')
336
+ sorted_method_args = method_arguments.sort.join(',')
337
+ cached_methods << method_name
274
338
 
275
- expanded_search_args = ""
339
+ expanded_search_args = ''
276
340
  method_arguments.each do |method_argument|
277
341
  expanded_search_args << ":#{method_argument} => #{method_argument},"
278
342
  end
279
343
 
280
- self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
344
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
281
345
  # def self.cached_search_by_user_guid(user_guid, options = {})
282
346
  # options = ::ActiveRemote::Cached.default_options.merge({}).merge(options)
283
347
  #
@@ -317,15 +381,16 @@ module ActiveRemote
317
381
 
318
382
  def _define_cached_search_bang_method(method_name, *method_arguments, cached_finder_options)
319
383
  method_arguments.flatten!
320
- expanded_method_args = method_arguments.join(",")
321
- sorted_method_args = method_arguments.sort.join(",")
384
+ expanded_method_args = method_arguments.join(',')
385
+ sorted_method_args = method_arguments.sort.join(',')
386
+ cached_methods << method_name
322
387
 
323
- expanded_search_args = ""
388
+ expanded_search_args = ''
324
389
  method_arguments.each do |method_argument|
325
390
  expanded_search_args << ":#{method_argument} => #{method_argument},"
326
391
  end
327
392
 
328
- self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
393
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
329
394
  # def self.cached_search_by_user_guid!(user_guid, options = {})
330
395
  # options = ::ActiveRemote::Cached.default_options.merge({}).merge(options)
331
396
  #
@@ -379,4 +444,4 @@ module ActiveRemote
379
444
  end
380
445
  end
381
446
 
382
- require "active_remote/cached/railtie" if defined?(Rails)
447
+ require 'active_remote/cached/railtie' if defined?(Rails)
@@ -1 +1,3 @@
1
- require "active_remote/cached"
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_remote/cached'
@@ -1,25 +1,27 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe ::ActiveRemote::Cached::ArgumentKeys do
4
- it "does not mutate a string by default" do
5
- ::ActiveRemote::Cached::ArgumentKeys.new("hello", {}).cache_key.must_equal("hello")
6
+ it 'does not mutate a string by default' do
7
+ expect(::ActiveRemote::Cached::ArgumentKeys.new('hello', {}).cache_key).to eq('hello')
6
8
  end
7
9
 
8
- it "returns a string of a symbol by default" do
9
- ::ActiveRemote::Cached::ArgumentKeys.new(:hello, {}).cache_key.must_equal("hello")
10
+ it 'returns a string of a symbol by default' do
11
+ expect(::ActiveRemote::Cached::ArgumentKeys.new(:hello, {}).cache_key).to eq('hello')
10
12
  end
11
13
 
12
- it "does not mutate a string with special characters by default" do
13
- ::ActiveRemote::Cached::ArgumentKeys.new("hello {}", {}).cache_key.must_equal("hello {}")
14
+ it 'does not mutate a string with special characters by default' do
15
+ expect(::ActiveRemote::Cached::ArgumentKeys.new('hello {}', {}).cache_key).to eq('hello {}')
14
16
  end
15
17
 
16
- it "removes special characters from string with special characters when :active_remote_cached_remove_characters" do
18
+ it 'removes special characters from string with special characters when :active_remote_cached_remove_characters' do
17
19
  options = { :active_remote_cached_remove_characters => true }
18
- ::ActiveRemote::Cached::ArgumentKeys.new("hello {}", options).cache_key.must_equal("hello")
20
+ expect(::ActiveRemote::Cached::ArgumentKeys.new('hello {}', options).cache_key).to eq('hello')
19
21
  end
20
22
 
21
- it "replaces special characters from string with special characters when :active_remote_cached_replace_characters" do
23
+ it 'replaces special characters from string with special characters when :active_remote_cached_replace_characters' do
22
24
  options = { :active_remote_cached_replace_characters => true }
23
- ::ActiveRemote::Cached::ArgumentKeys.new("hello {}", options).cache_key.must_equal("helloSPLBRB")
25
+ expect(::ActiveRemote::Cached::ArgumentKeys.new('hello {}', options).cache_key).to eq('helloSPLBRB')
24
26
  end
25
27
  end
@@ -1,35 +1,32 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe ::ActiveRemote::Cached::Cache do
4
- describe "API" do
5
- it "validates #delete present" do
6
+ describe 'API' do
7
+ it 'validates #delete present' do
6
8
  cache = OpenStruct.new(:write => nil, :fetch => nil, :read => nil, :exist? => nil)
7
- error = lambda { ::ActiveRemote::Cached.cache(cache) }.must_raise(RuntimeError)
8
- error.message.must_match(/respond_to.*delete/i)
9
+ expect { ::ActiveRemote::Cached.cache(cache) }.to raise_error(RuntimeError, /respond_to.*delete/i)
9
10
  end
10
11
 
11
- it "validates #exist? present" do
12
+ it 'validates #exist? present' do
12
13
  cache = OpenStruct.new(:write => nil, :delete => nil, :read => nil, :fetch => nil)
13
- error = lambda { ::ActiveRemote::Cached.cache(cache) }.must_raise(RuntimeError)
14
- error.message.must_match(/respond_to.*exist/i)
14
+ expect { ::ActiveRemote::Cached.cache(cache) }.to raise_error(RuntimeError, /respond_to.*exist/i)
15
15
  end
16
16
 
17
- it "validates #fetch present" do
17
+ it 'validates #fetch present' do
18
18
  cache = OpenStruct.new(:write => nil, :delete => nil, :read => nil, :exist? => nil)
19
- error = lambda { ::ActiveRemote::Cached.cache(cache) }.must_raise(RuntimeError)
20
- error.message.must_match(/respond_to.*fetch/i)
19
+ expect { ::ActiveRemote::Cached.cache(cache) }.to raise_error(RuntimeError, /respond_to.*fetch/i)
21
20
  end
22
21
 
23
- it "validates #read present" do
22
+ it 'validates #read present' do
24
23
  cache = OpenStruct.new(:write => nil, :delete => nil, :fetch => nil, :exist? => nil)
25
- error = lambda { ::ActiveRemote::Cached.cache(cache) }.must_raise(RuntimeError)
26
- error.message.must_match(/respond_to.*read/i)
24
+ expect { ::ActiveRemote::Cached.cache(cache) }.to raise_error(RuntimeError, /respond_to.*read/i)
27
25
  end
28
26
 
29
- it "validates #write present" do
27
+ it 'validates #write present' do
30
28
  cache = OpenStruct.new(:read => nil, :delete => nil, :fetch => nil, :exist? => nil)
31
- error = lambda { ::ActiveRemote::Cached.cache(cache)}.must_raise(RuntimeError)
32
- error.message.must_match(/respond_to.*write/i)
29
+ expect { ::ActiveRemote::Cached.cache(cache) }.to raise_error(RuntimeError, /respond_to.*write/i)
33
30
  end
34
31
  end
35
32
  end
@@ -1,45 +1,52 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  class DeleteMethodClass
4
6
  include ::ActiveRemote::Cached
5
7
 
6
- def self.find; nil; end
7
- def self.search; nil; end
8
+ def self.find
9
+ nil
10
+ end
11
+
12
+ def self.search
13
+ nil
14
+ end
8
15
 
9
16
  cached_finders_for :guid
10
17
  cached_finders_for :guid, :user_guid
11
- cached_finders_for [:user_guid, :client_guid]
12
- cached_finders_for [:derp, :user_guid, :client_guid]
18
+ cached_finders_for %i[user_guid client_guid]
19
+ cached_finders_for %i[derp user_guid client_guid]
13
20
  end
14
21
 
15
22
  describe DeleteMethodClass do
16
- describe "API" do
23
+ describe 'API' do
17
24
  it "creates 'cached_delete_by_guid'" do
18
- DeleteMethodClass.must_respond_to("cached_delete_by_guid")
25
+ expect(DeleteMethodClass).to respond_to(:cached_delete_by_guid)
19
26
  end
20
27
 
21
28
  it "creates 'cached_delete_by_user_guid'" do
22
- DeleteMethodClass.must_respond_to("cached_delete_by_user_guid")
29
+ expect(DeleteMethodClass).to respond_to(:cached_delete_by_user_guid)
23
30
  end
24
31
 
25
32
  it "creates 'cached_delete_by_user_guid_and_client_guid'" do
26
- DeleteMethodClass.must_respond_to("cached_delete_by_user_guid_and_client_guid")
33
+ expect(DeleteMethodClass).to respond_to(:cached_delete_by_user_guid_and_client_guid)
27
34
  end
28
35
 
29
36
  it "creates 'cached_delete_by_client_guid_and_user_guid'" do
30
- DeleteMethodClass.must_respond_to("cached_delete_by_client_guid_and_user_guid")
37
+ expect(DeleteMethodClass).to respond_to(:cached_delete_by_client_guid_and_user_guid)
31
38
  end
32
39
 
33
40
  it "creates 'cached_delete_by_derp_and_user_guid_and_client_guid'" do
34
- DeleteMethodClass.must_respond_to("cached_delete_by_derp_and_user_guid_and_client_guid")
41
+ expect(DeleteMethodClass).to respond_to(:cached_delete_by_derp_and_user_guid_and_client_guid)
35
42
  end
36
43
 
37
44
  it "creates 'cached_delete_by_client_guid_and_derp_and_user_guid'" do
38
- DeleteMethodClass.must_respond_to("cached_delete_by_client_guid_and_derp_and_user_guid")
45
+ expect(DeleteMethodClass).to respond_to(:cached_delete_by_client_guid_and_derp_and_user_guid)
39
46
  end
40
47
 
41
48
  it "creates 'cached_delete_by_client_guid_and_user_guid_and_derp'" do
42
- DeleteMethodClass.must_respond_to("cached_delete_by_client_guid_and_user_guid_and_derp")
49
+ expect(DeleteMethodClass).to respond_to(:cached_delete_by_client_guid_and_user_guid_and_derp)
43
50
  end
44
51
  end
45
52
  end