redis_object 1.0 → 1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.coveralls.yml +1 -0
- data/.gitignore +2 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/README.markdown +24 -15
- data/Rakefile +8 -0
- data/lib/redis_object.rb +11 -1
- data/lib/redis_object/base.rb +210 -60
- data/lib/redis_object/collection.rb +130 -100
- data/lib/redis_object/defaults.rb +21 -8
- data/lib/redis_object/{history.rb → experimental/history.rb} +0 -0
- data/lib/redis_object/ext/filters.rb +34 -16
- data/lib/redis_object/ext/script_cache.rb +92 -0
- data/lib/redis_object/ext/shardable.rb +18 -0
- data/lib/redis_object/ext/triggers.rb +75 -13
- data/lib/redis_object/ext/view_caching.rb +258 -0
- data/lib/redis_object/ext/views.rb +102 -0
- data/lib/redis_object/indices.rb +44 -39
- data/lib/redis_object/inheritance_tracking.rb +23 -0
- data/lib/redis_object/keys.rb +4 -4
- data/lib/redis_object/storage.rb +30 -1
- data/lib/redis_object/storage/adapter.rb +6 -3
- data/lib/redis_object/storage/redis.rb +98 -3
- data/lib/redis_object/timestamps.rb +42 -21
- data/lib/redis_object/types.rb +172 -30
- data/lib/redis_object/version.rb +1 -1
- data/redis_object.gemspec +1 -0
- data/spec/adapter_spec.rb +43 -0
- data/spec/base_spec.rb +41 -6
- data/spec/benchmark_spec.rb +46 -0
- data/spec/collections_spec.rb +144 -0
- data/spec/defaults_spec.rb +56 -0
- data/spec/filters_spec.rb +29 -0
- data/spec/indices_spec.rb +45 -0
- data/spec/rename_class_spec.rb +96 -0
- data/spec/spec_helper.rb +32 -1
- data/spec/timestamp_spec.rb +28 -0
- data/spec/trigger_spec.rb +51 -0
- data/spec/types_spec.rb +103 -0
- data/spec/view_caching_spec.rb +130 -0
- data/spec/views_spec.rb +72 -0
- metadata +111 -116
- data/doc/Object.html +0 -185
- data/doc/Seabright.html +0 -181
- data/doc/Seabright/Adapter.html +0 -442
- data/doc/Seabright/Collection.html +0 -797
- data/doc/Seabright/Collections.html +0 -635
- data/doc/Seabright/Collections/ClassMethods.html +0 -212
- data/doc/Seabright/ExternalIndex.html +0 -217
- data/doc/Seabright/History.html +0 -382
- data/doc/Seabright/History/ClassMethods.html +0 -276
- data/doc/Seabright/Indices.html +0 -324
- data/doc/Seabright/Indices/ClassMethods.html +0 -348
- data/doc/Seabright/Keys.html +0 -314
- data/doc/Seabright/Keys/ClassMethods.html +0 -276
- data/doc/Seabright/ObjectBase.html +0 -852
- data/doc/Seabright/ObjectBase/ClassMethods.html +0 -677
- data/doc/Seabright/RedisObject.html +0 -230
- data/doc/Seabright/References.html +0 -280
- data/doc/Seabright/Storage.html +0 -252
- data/doc/Seabright/Storage/ClassMethods.html +0 -276
- data/doc/Seabright/Storage/MySQL.html +0 -442
- data/doc/Seabright/Storage/Redis.html +0 -218
- data/doc/Seabright/Template.html +0 -212
- data/doc/Seabright/Template/ClassMethods.html +0 -166
- data/doc/Seabright/Timestamps.html +0 -292
- data/doc/Seabright/Timestamps/ClassMethods.html +0 -214
- data/doc/Seabright/Types.html +0 -410
- data/doc/Seabright/Types/ClassMethods.html +0 -308
- data/doc/created.rid +0 -17
- data/doc/images/add.png +0 -0
- data/doc/images/brick.png +0 -0
- data/doc/images/brick_link.png +0 -0
- data/doc/images/bug.png +0 -0
- data/doc/images/bullet_black.png +0 -0
- data/doc/images/bullet_toggle_minus.png +0 -0
- data/doc/images/bullet_toggle_plus.png +0 -0
- data/doc/images/date.png +0 -0
- data/doc/images/delete.png +0 -0
- data/doc/images/find.png +0 -0
- data/doc/images/loadingAnimation.gif +0 -0
- data/doc/images/macFFBgHack.png +0 -0
- data/doc/images/package.png +0 -0
- data/doc/images/page_green.png +0 -0
- data/doc/images/page_white_text.png +0 -0
- data/doc/images/page_white_width.png +0 -0
- data/doc/images/plugin.png +0 -0
- data/doc/images/ruby.png +0 -0
- data/doc/images/tag_blue.png +0 -0
- data/doc/images/tag_green.png +0 -0
- data/doc/images/transparent.png +0 -0
- data/doc/images/wrench.png +0 -0
- data/doc/images/wrench_orange.png +0 -0
- data/doc/images/zoom.png +0 -0
- data/doc/index.html +0 -125
- data/doc/js/darkfish.js +0 -153
- data/doc/js/jquery.js +0 -18
- data/doc/js/navigation.js +0 -142
- data/doc/js/search.js +0 -94
- data/doc/js/search_index.js +0 -1
- data/doc/js/searcher.js +0 -228
- data/doc/rdoc.css +0 -543
- data/doc/table_of_contents.html +0 -394
@@ -2,20 +2,6 @@ module Seabright
|
|
2
2
|
|
3
3
|
module Collections
|
4
4
|
|
5
|
-
def dump
|
6
|
-
require "utf8_utils"
|
7
|
-
out = ["puts \"Creating: #{id}\""]
|
8
|
-
s_id = id.gsub(/\W/,"_")
|
9
|
-
out << "a#{s_id} = #{self.class.cname}.new(#{actual.to_s.tidy_bytes})"
|
10
|
-
collections.each do |col|
|
11
|
-
col.each do |sobj|
|
12
|
-
out << sobj.dump(self)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
out << "a#{s_id}.save"
|
16
|
-
out.join("\n")
|
17
|
-
end
|
18
|
-
|
19
5
|
def hkey_col(ident = nil)
|
20
6
|
"#{hkey}:collections"
|
21
7
|
end
|
@@ -24,49 +10,24 @@ module Seabright
|
|
24
10
|
super(o_id)
|
25
11
|
store.smembers(hkey_col).each do |name|
|
26
12
|
collections[name] = Seabright::Collection.load(name,self)
|
13
|
+
define_access(name) do
|
14
|
+
get_collection(name)
|
15
|
+
end
|
16
|
+
define_access(name.to_s.singularize) do
|
17
|
+
get_collection(name).latest
|
18
|
+
end
|
27
19
|
end
|
28
|
-
# TODO: Here's an example of dynamic method creation - should do this instead of method_missing + module intercepts...
|
29
|
-
# %w[report alert error summary].each do |kind|
|
30
|
-
# class_eval <<-END
|
31
|
-
# if "#{kind}" == "summary"
|
32
|
-
# def summaries
|
33
|
-
# data_for_server[:summaries]
|
34
|
-
# end
|
35
|
-
# else
|
36
|
-
# def #{kind}s
|
37
|
-
# data_for_server[:#{kind}s]
|
38
|
-
# end
|
39
|
-
# end
|
40
|
-
#
|
41
|
-
# if "#{kind}" == "report"
|
42
|
-
# def report(new_entry)
|
43
|
-
# reports << new_entry
|
44
|
-
# end
|
45
|
-
# elsif "#{kind}" == "summary"
|
46
|
-
# def summary(new_entry)
|
47
|
-
# summaries << new_entry
|
48
|
-
# end
|
49
|
-
# else
|
50
|
-
# def #{kind}(*fields)
|
51
|
-
# #{kind}s << ( fields.first.is_a?(Hash) ?
|
52
|
-
# fields.first :
|
53
|
-
# {:subject => fields.first, :body => fields.last} )
|
54
|
-
# end
|
55
|
-
# end
|
56
|
-
# alias_method :add_#{kind}, :#{kind}
|
57
|
-
# END
|
58
|
-
# end
|
59
20
|
true
|
60
21
|
end
|
61
22
|
|
62
23
|
def delete_child(obj)
|
63
|
-
if col =
|
64
|
-
col.delete obj
|
24
|
+
if col = get_collection(obj.collection_name)
|
25
|
+
col.delete obj
|
65
26
|
end
|
66
27
|
end
|
67
28
|
|
68
29
|
def collection_name
|
69
|
-
self.class.
|
30
|
+
self.class.collection_name
|
70
31
|
end
|
71
32
|
|
72
33
|
def ref_key(ident = nil)
|
@@ -74,14 +35,18 @@ module Seabright
|
|
74
35
|
end
|
75
36
|
|
76
37
|
def reference(obj)
|
77
|
-
|
78
|
-
|
79
|
-
collections[name.to_s] ||= Seabright::Collection.load(name,self)
|
80
|
-
collections[name.to_s] << obj.hkey
|
38
|
+
raise "Not an object." unless obj.is_a?(RedisObject)
|
39
|
+
get_collection(obj.collection_name) << obj.hkey
|
81
40
|
obj.referenced_by self
|
82
41
|
end
|
83
|
-
|
84
|
-
|
42
|
+
|
43
|
+
def <<(obj)
|
44
|
+
reference obj
|
45
|
+
end
|
46
|
+
|
47
|
+
def push(obj)
|
48
|
+
reference obj
|
49
|
+
end
|
85
50
|
|
86
51
|
def remove_collection!(name)
|
87
52
|
store.srem hkey_col, name
|
@@ -124,11 +89,23 @@ module Seabright
|
|
124
89
|
end
|
125
90
|
|
126
91
|
def has_collection?(name)
|
127
|
-
|
92
|
+
collection_names.include?(name.to_s)
|
128
93
|
end
|
129
94
|
|
130
95
|
def get_collection(name)
|
131
|
-
|
96
|
+
if has_collection?(name)
|
97
|
+
collections[name.to_s] ||= Collection.load(name,self)
|
98
|
+
else
|
99
|
+
store.sadd hkey_col, name
|
100
|
+
@collection_names << name.to_s
|
101
|
+
collections[name.to_s] ||= Collection.load(name,self)
|
102
|
+
define_access(name.to_s.pluralize) do
|
103
|
+
get_collection(name)
|
104
|
+
end
|
105
|
+
define_access(name.to_s.singularize) do
|
106
|
+
get_collection(name).latest
|
107
|
+
end
|
108
|
+
end
|
132
109
|
collections[name.to_s]
|
133
110
|
end
|
134
111
|
|
@@ -136,22 +113,77 @@ module Seabright
|
|
136
113
|
@collections ||= {}
|
137
114
|
end
|
138
115
|
|
116
|
+
def collection_names
|
117
|
+
@collection_names ||= store.smembers(hkey_col)
|
118
|
+
end
|
119
|
+
|
139
120
|
def mset(dat)
|
140
121
|
dat.select! {|k,v| !collections[k.to_s] }
|
141
122
|
super(dat)
|
142
123
|
end
|
143
124
|
|
144
125
|
def set(k,v)
|
145
|
-
@data ? super(k,v) :
|
126
|
+
@data ? super(k,v) : has_collection?(k) ? get_collection(k.to_s).replace(v) : super(k,v)
|
146
127
|
v
|
147
128
|
end
|
148
129
|
|
149
130
|
module ClassMethods
|
150
131
|
|
151
|
-
def hkey_col(ident =
|
132
|
+
def hkey_col(ident = nil)
|
152
133
|
"#{hkey(ident)}:collections"
|
153
134
|
end
|
154
135
|
|
136
|
+
def delete_child(obj)
|
137
|
+
if col = get_collection(obj.collection_name)
|
138
|
+
col.delete obj
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def collection_name
|
143
|
+
self.name.split('::').last.pluralize.underscore.to_sym
|
144
|
+
end
|
145
|
+
|
146
|
+
def reference(obj)
|
147
|
+
name = obj.collection_name
|
148
|
+
store.sadd hkey_col, name
|
149
|
+
get_collection(name) << obj.hkey
|
150
|
+
end
|
151
|
+
|
152
|
+
def <<(obj)
|
153
|
+
reference obj
|
154
|
+
end
|
155
|
+
|
156
|
+
def push(obj)
|
157
|
+
reference obj
|
158
|
+
end
|
159
|
+
|
160
|
+
def remove_collection!(name)
|
161
|
+
store.srem hkey_col, name
|
162
|
+
end
|
163
|
+
|
164
|
+
def get(k)
|
165
|
+
if has_collection?(k)
|
166
|
+
get_collection(k)
|
167
|
+
elsif has_collection?(pk = k.to_s.pluralize)
|
168
|
+
get_collection(pk).first
|
169
|
+
else
|
170
|
+
super(k)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
def has_collection?(name)
|
175
|
+
store.sismember(hkey_col,name.to_s)
|
176
|
+
end
|
177
|
+
|
178
|
+
def get_collection(name)
|
179
|
+
collections[name.to_s] ||= Collection.load(name,self)
|
180
|
+
collections[name.to_s]
|
181
|
+
end
|
182
|
+
|
183
|
+
def collections
|
184
|
+
@collections ||= {}
|
185
|
+
end
|
186
|
+
|
155
187
|
end
|
156
188
|
|
157
189
|
def self.included(base)
|
@@ -162,24 +194,26 @@ module Seabright
|
|
162
194
|
|
163
195
|
class Collection < Array
|
164
196
|
|
165
|
-
|
197
|
+
include Seabright::CachedScripts
|
198
|
+
|
199
|
+
def initialize(name,owner)
|
166
200
|
@name = name.to_s
|
167
|
-
@
|
201
|
+
@owner = owner
|
168
202
|
end
|
169
203
|
|
170
204
|
def remove!
|
171
|
-
@
|
205
|
+
@owner.remove_collection! @name
|
172
206
|
end
|
173
207
|
|
174
208
|
def latest
|
175
|
-
indexed(:created_at,5,true).first
|
209
|
+
indexed(:created_at,5,true).first || first
|
176
210
|
end
|
177
211
|
|
178
212
|
def indexed(idx,num=-1,reverse=false)
|
179
213
|
keys = keys_by_index(idx,num,reverse)
|
180
214
|
out = Enumerator.new do |y|
|
181
215
|
keys.each do |member|
|
182
|
-
if a =
|
216
|
+
if a = class_const.find_by_key(member)
|
183
217
|
y << a
|
184
218
|
end
|
185
219
|
end
|
@@ -194,18 +228,16 @@ module Seabright
|
|
194
228
|
end
|
195
229
|
|
196
230
|
def temp_key
|
197
|
-
"zintersect_temp"
|
231
|
+
"#{key}::zintersect_temp::#{RedisObject.new_id(4)}"
|
198
232
|
end
|
199
233
|
|
234
|
+
RedisObject::ScriptSources::FwdScript = "redis.call('ZINTERSTORE', KEYS[1], 2, KEYS[2], KEYS[3], 'WEIGHTS', 1, 0)\nlocal keys = redis.call('ZRANGE', KEYS[1], 0, KEYS[4])\nredis.call('DEL', KEYS[1])\nreturn keys".freeze
|
235
|
+
RedisObject::ScriptSources::RevScript = "redis.call('ZINTERSTORE', KEYS[1], 2, KEYS[2], KEYS[3], 'WEIGHTS', 1, 0)\nlocal keys = redis.call('ZREVRANGE', KEYS[1], 0, KEYS[4])\nredis.call('DEL', KEYS[1])\nreturn keys".freeze
|
236
|
+
|
200
237
|
def keys_by_index(idx,num=-1,reverse=false)
|
201
|
-
keys =
|
202
|
-
store.multi do
|
203
|
-
store.zinterstore(temp_key, [index_key(idx), key], {:weights => ["1","0"]})
|
204
|
-
keys = store.send(reverse ? :zrevrange : :zrange, temp_key, 0, num)
|
205
|
-
store.del temp_key
|
206
|
-
end
|
238
|
+
keys = run_script(reverse ? :RevScript : :FwdScript, [temp_key, index_key(idx), key, num])
|
207
239
|
Enumerator.new do |y|
|
208
|
-
keys.
|
240
|
+
keys.each do |member|
|
209
241
|
y << member
|
210
242
|
end
|
211
243
|
end
|
@@ -224,12 +256,15 @@ module Seabright
|
|
224
256
|
return real_at(item_key(k))
|
225
257
|
elsif k.is_a? Hash
|
226
258
|
return match(k)
|
227
|
-
elsif k.is_a?
|
259
|
+
elsif k.is_a? Integer
|
228
260
|
return real_at(at(k))
|
229
261
|
end
|
230
262
|
return nil
|
231
263
|
end
|
232
|
-
|
264
|
+
|
265
|
+
def [](k)
|
266
|
+
find k
|
267
|
+
end
|
233
268
|
|
234
269
|
def match(pkt)
|
235
270
|
Enumerator.new do |y|
|
@@ -242,29 +277,25 @@ module Seabright
|
|
242
277
|
end
|
243
278
|
|
244
279
|
def real_at(key)
|
245
|
-
|
280
|
+
class_const.find_by_key(key)
|
246
281
|
end
|
247
282
|
|
248
|
-
# def [](idx)
|
249
|
-
# class_const.find_by_key(at(idx))
|
250
|
-
# end
|
251
|
-
|
252
283
|
def objects
|
253
284
|
each.to_a
|
254
285
|
end
|
255
286
|
|
256
287
|
def first
|
257
|
-
|
288
|
+
class_const.find_by_key(super)
|
258
289
|
end
|
259
290
|
|
260
291
|
def last
|
261
|
-
|
292
|
+
class_const.find_by_key(super)
|
262
293
|
end
|
263
294
|
|
264
295
|
def each
|
265
296
|
out = Enumerator.new do |y|
|
266
297
|
each_index do |key|
|
267
|
-
if a =
|
298
|
+
if a = class_const.find_by_key(at(key))
|
268
299
|
y << a
|
269
300
|
end
|
270
301
|
end
|
@@ -280,7 +311,7 @@ module Seabright
|
|
280
311
|
|
281
312
|
def cleanup!
|
282
313
|
each_index do |key|
|
283
|
-
unless a =
|
314
|
+
unless a = class_const.find_by_key(at(key))
|
284
315
|
puts "Deleting #{key} because not #{a.inspect}" if DEBUG
|
285
316
|
delete at(key)
|
286
317
|
end
|
@@ -299,7 +330,7 @@ module Seabright
|
|
299
330
|
return nil unless block_given?
|
300
331
|
Enumerator.new do |y|
|
301
332
|
each_index do |key|
|
302
|
-
if (a =
|
333
|
+
if (a = class_const.find_by_key(at(key))) && block.call(a)
|
303
334
|
y << a
|
304
335
|
end
|
305
336
|
end
|
@@ -321,36 +352,35 @@ module Seabright
|
|
321
352
|
store.zadd(key,store.zcount(key,"-inf", "+inf"),k)
|
322
353
|
super(k)
|
323
354
|
end
|
324
|
-
|
355
|
+
|
356
|
+
def push(obj)
|
357
|
+
self << obj
|
358
|
+
end
|
325
359
|
|
326
360
|
def class_const
|
327
|
-
|
361
|
+
self.class.class_const_for(@name)
|
362
|
+
end
|
363
|
+
|
364
|
+
def store
|
365
|
+
class_const.store
|
328
366
|
end
|
329
367
|
|
330
368
|
def key
|
331
|
-
"#{@
|
369
|
+
"#{@owner ? "#{@owner.key}:" : ""}COLLECTION:#{@name}"
|
332
370
|
end
|
333
371
|
|
334
372
|
class << self
|
335
373
|
|
336
|
-
def load(name,
|
337
|
-
out = new(name,
|
338
|
-
out.replace store.zrange(out.key,0,-1)
|
374
|
+
def load(name,owner)
|
375
|
+
out = new(name,owner)
|
376
|
+
out.replace class_const_for(name).store.zrange(out.key,0,-1)
|
339
377
|
out
|
340
378
|
end
|
341
379
|
|
342
|
-
|
343
|
-
|
344
|
-
def store
|
345
|
-
@@store ||= RedisObject.store
|
380
|
+
def class_const_for(name)
|
381
|
+
Object.const_get(name.to_s.classify.to_sym) rescue RedisObject
|
346
382
|
end
|
347
|
-
|
348
|
-
end
|
349
|
-
|
350
|
-
private
|
351
|
-
|
352
|
-
def store
|
353
|
-
@@store ||= RedisObject.store
|
383
|
+
|
354
384
|
end
|
355
385
|
|
356
386
|
end
|
@@ -1,23 +1,36 @@
|
|
1
1
|
module Seabright
|
2
2
|
module DefaultValues
|
3
3
|
|
4
|
-
def get(k)
|
5
|
-
if (d = self.class.default_vals[k.to_sym]) && !d.nil?
|
6
|
-
return d unless is_set?(k)
|
7
|
-
end
|
8
|
-
super(k)
|
9
|
-
end
|
10
|
-
|
11
4
|
module ClassMethods
|
12
5
|
|
13
6
|
def default_vals
|
14
7
|
@default_vals ||= {}
|
15
8
|
end
|
16
9
|
|
10
|
+
def intercept_for_defaults!
|
11
|
+
return if @intercepted_for_defaults
|
12
|
+
self.class_eval do
|
13
|
+
|
14
|
+
alias_method :undefaulted_get, :get unless method_defined?(:undefaulted_get)
|
15
|
+
def get(k)
|
16
|
+
if !is_set?(k) && (d = self.class.default_vals[k.to_sym]) && !d.nil?
|
17
|
+
return d
|
18
|
+
end
|
19
|
+
undefaulted_get(k)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
@intercepted_for_defaults = true
|
24
|
+
end
|
25
|
+
|
17
26
|
def register_default(k,vl)
|
18
27
|
default_vals[k.to_sym] = vl
|
28
|
+
intercept_for_defaults!
|
29
|
+
end
|
30
|
+
|
31
|
+
def default_for(k,vl)
|
32
|
+
register_default k, vl
|
19
33
|
end
|
20
|
-
alias_method :default_for, :register_default
|
21
34
|
|
22
35
|
end
|
23
36
|
|
File without changes
|
@@ -1,19 +1,43 @@
|
|
1
1
|
module Seabright
|
2
2
|
module Filters
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
module ClassMethods
|
5
|
+
|
6
|
+
def intercept_for_filters!
|
7
|
+
return if @intercept_for_filters
|
8
|
+
self.class_eval do
|
9
|
+
|
10
|
+
def filtered_method_call(method,*args)
|
11
|
+
if filters = self.class.filters_for(method)
|
12
|
+
filters.each do |f|
|
13
|
+
args = send(f,*args)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
send("unfiltered_#{method.to_s}".to_sym,*args)
|
17
|
+
end
|
18
|
+
|
19
|
+
alias_method :unfiltered_get, :get unless method_defined?(:unfiltered_get)
|
20
|
+
def get(k)
|
21
|
+
filtered_method_call(:get,k)
|
22
|
+
end
|
23
|
+
|
24
|
+
alias_method :unfiltered_set, :set unless method_defined?(:unfiltered_set)
|
25
|
+
def set(k,v)
|
26
|
+
filtered_method_call(:set,k,v)
|
27
|
+
end
|
28
|
+
|
29
|
+
alias_method :unfiltered_setnx, :setnx unless method_defined?(:unfiltered_setnx)
|
30
|
+
def setnx(k,v)
|
31
|
+
filtered_method_call(:setnx,k,v)
|
32
|
+
end
|
33
|
+
|
8
34
|
end
|
35
|
+
@intercept_for_filters = true
|
9
36
|
end
|
10
|
-
method(*args)
|
11
|
-
end
|
12
|
-
|
13
|
-
module ClassMethods
|
14
37
|
|
15
38
|
def set_filter(filter)
|
16
39
|
filter_method(:set,filter)
|
40
|
+
filter_method(:setnx,filter)
|
17
41
|
end
|
18
42
|
|
19
43
|
def get_filter(filter)
|
@@ -21,15 +45,9 @@ module Seabright
|
|
21
45
|
end
|
22
46
|
|
23
47
|
def filter_method(method, filter)
|
24
|
-
|
25
|
-
method_filters[method.to_sym] ||= []
|
26
|
-
filter!(method.to_sym)
|
27
|
-
end
|
48
|
+
method_filters[method.to_sym] ||= []
|
28
49
|
method_filters[method.to_sym] << filter.to_sym unless method_filters[method.to_sym].include?(filter.to_sym)
|
29
|
-
|
30
|
-
|
31
|
-
def filter!(method)
|
32
|
-
self.class.instance_exec("")
|
50
|
+
intercept_for_filters!
|
33
51
|
end
|
34
52
|
|
35
53
|
def method_filters
|