filtration 0.0.1 → 0.0.2
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.
- data/README.rdoc +10 -1
- data/lib/filtration.rb +24 -4
- data/spec/filtration_spec.rb +63 -16
- metadata +2 -2
data/README.rdoc
CHANGED
@@ -15,7 +15,16 @@ Example:
|
|
15
15
|
class Foo < Bar
|
16
16
|
prefilter(:foo){|x| x * 2} # (x * 2) + 2
|
17
17
|
postfilter(:foo_too){|x| x * 2} # (x + 2) * 2
|
18
|
-
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class AnotherFoo < Bar
|
21
|
+
prefilter :foo, :double # (x * 2) + 2
|
22
|
+
postfilter :foo_too, :double # (x + 2) * 2
|
23
|
+
|
24
|
+
def double(x)
|
25
|
+
x * 2
|
26
|
+
end
|
27
|
+
end
|
19
28
|
|
20
29
|
== Requirements
|
21
30
|
Filtration stands on its own!
|
data/lib/filtration.rb
CHANGED
@@ -1,18 +1,38 @@
|
|
1
1
|
module Filtration
|
2
2
|
|
3
|
-
def prefilter(method
|
3
|
+
def prefilter(method, filter=nil, &block)
|
4
4
|
old_method = instance_method(method)
|
5
5
|
raise "Method #{method} takes 0 arguments" if old_method.arity == 0
|
6
|
+
|
7
|
+
raise "Cannot use both filter method and block" if !filter.nil? && !block.nil?
|
8
|
+
raise "Block or filter method missing" if filter.nil? && block.nil?
|
9
|
+
|
6
10
|
define_method(method) do |*args|
|
7
|
-
|
11
|
+
if filter.nil?
|
12
|
+
old_method.bind(self).call(block.call(*args))
|
13
|
+
else
|
14
|
+
filter_method = method(filter)
|
15
|
+
raise "Filter method #{filter} takes 0 arguments" if filter_method.arity == 0
|
16
|
+
old_method.bind(self).call(self.send(filter,*args))
|
17
|
+
end
|
8
18
|
end
|
9
19
|
end
|
10
20
|
|
11
|
-
def postfilter(method
|
21
|
+
def postfilter(method, filter=nil, &block)
|
12
22
|
old_method = instance_method(method)
|
13
23
|
raise "Method #{method} takes 0 arguments" if old_method.arity == 0
|
24
|
+
|
25
|
+
raise "Cannot use both filter method and block" if !filter.nil? && !block.nil?
|
26
|
+
raise "Block or filter method missing" if filter.nil? && block.nil?
|
27
|
+
|
14
28
|
define_method(method) do |*args|
|
15
|
-
|
29
|
+
if filter.nil?
|
30
|
+
block.call(old_method.bind(self).call(*args))
|
31
|
+
else
|
32
|
+
filter_method = method(filter)
|
33
|
+
raise "Filter method #{filter} takes 0 arguments" if filter_method.arity == 0
|
34
|
+
self.send(filter,old_method.bind(self).call(*args))
|
35
|
+
end
|
16
36
|
end
|
17
37
|
end
|
18
38
|
|
data/spec/filtration_spec.rb
CHANGED
@@ -1,40 +1,87 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
+
class Good
|
4
|
+
def foo(x)
|
5
|
+
x + 2
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class Bad
|
10
|
+
def foo
|
11
|
+
2
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
3
15
|
describe Filtration do
|
4
16
|
|
5
17
|
it 'executes a code block before the specified method' do
|
6
|
-
class
|
7
|
-
def foo(x)
|
8
|
-
x + 2
|
9
|
-
end
|
10
|
-
end
|
11
|
-
class Test1 < Foo1
|
18
|
+
class Test1 < Good
|
12
19
|
prefilter(:foo){|x| x * 2}
|
13
20
|
end
|
14
21
|
Test1.new.foo(2).should === 6
|
15
22
|
end
|
16
23
|
|
17
24
|
it 'executes a code block after the specified method' do
|
18
|
-
class
|
19
|
-
|
20
|
-
|
25
|
+
class Test2 < Good
|
26
|
+
postfilter(:foo){|x| x * 2}
|
27
|
+
end
|
28
|
+
Test2.new.foo(2).should === 8
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'executes a code block before the specified method' do
|
32
|
+
class Test3 < Good
|
33
|
+
prefilter :foo, :bar
|
34
|
+
def bar(x)
|
35
|
+
x * 2
|
21
36
|
end
|
22
37
|
end
|
23
|
-
|
24
|
-
|
38
|
+
Test1.new.foo(2).should === 6
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'executes a code block after the specified method' do
|
42
|
+
class Test4 < Good
|
43
|
+
postfilter :foo, :bar
|
44
|
+
def bar(x)
|
45
|
+
x * 2
|
46
|
+
end
|
25
47
|
end
|
26
48
|
Test2.new.foo(2).should === 8
|
27
49
|
end
|
28
50
|
|
29
51
|
it 'raises an error if the method has no arguments' do
|
30
|
-
class
|
31
|
-
|
32
|
-
|
52
|
+
class Test5 < Bad
|
53
|
+
extend RSpec::Matchers
|
54
|
+
lambda { prefilter(:foo){|x| x * 2} }.should raise_error
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'raises an error if the filter method has no arguments' do
|
59
|
+
class Test6 < Good
|
60
|
+
prefilter :foo, :bar
|
61
|
+
def bar
|
62
|
+
nil
|
63
|
+
end
|
64
|
+
end
|
65
|
+
lambda { Test6.new.foo(2) }.should raise_error
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'raises an error if both filter and block are specified' do
|
69
|
+
class Test7 < Good
|
70
|
+
extend RSpec::Matchers
|
71
|
+
def bar(x)
|
72
|
+
x * 2
|
33
73
|
end
|
74
|
+
lambda { prefilter(:foo,:bar){|x| x * 2} }.should raise_error
|
34
75
|
end
|
35
|
-
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'raises an error if neither filter nor block are specified' do
|
79
|
+
class Test8 < Good
|
36
80
|
extend RSpec::Matchers
|
37
|
-
|
81
|
+
def bar(x)
|
82
|
+
x * 2
|
83
|
+
end
|
84
|
+
lambda { prefilter(:foo) }.should raise_error
|
38
85
|
end
|
39
86
|
end
|
40
87
|
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: filtration
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- R. Scott Reis
|
@@ -35,7 +35,7 @@ rdoc_options:
|
|
35
35
|
- -m
|
36
36
|
- README.rdoc
|
37
37
|
- -t
|
38
|
-
-
|
38
|
+
- Filtration
|
39
39
|
require_paths:
|
40
40
|
- lib
|
41
41
|
required_ruby_version: !ruby/object:Gem::Requirement
|