aspect4r 0.7.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.
- data/.document +5 -0
- data/.gitignore +22 -0
- data/LICENSE +20 -0
- data/NOTES.rdoc +42 -0
- data/README.rdoc +70 -0
- data/Rakefile +45 -0
- data/VERSION +1 -0
- data/aspect4r.gemspec +108 -0
- data/examples/after_example.rb +30 -0
- data/examples/around_example.rb +29 -0
- data/examples/before_example.rb +62 -0
- data/examples/combined_example.rb +39 -0
- data/lib/aspect4r/after.rb +29 -0
- data/lib/aspect4r/around.rb +29 -0
- data/lib/aspect4r/base.rb +32 -0
- data/lib/aspect4r/before.rb +37 -0
- data/lib/aspect4r/classic.rb +12 -0
- data/lib/aspect4r/errors.rb +5 -0
- data/lib/aspect4r/extensions/class_extension.rb +20 -0
- data/lib/aspect4r/extensions/module_extension.rb +30 -0
- data/lib/aspect4r/helper.rb +171 -0
- data/lib/aspect4r/model/advice.rb +29 -0
- data/lib/aspect4r/model/advice_metadata.rb +27 -0
- data/lib/aspect4r/model/advices_for_method.rb +45 -0
- data/lib/aspect4r/model/aspect_data.rb +19 -0
- data/lib/aspect4r/return_this.rb +9 -0
- data/lib/aspect4r.rb +10 -0
- data/spec/aspect4r/after_spec.rb +121 -0
- data/spec/aspect4r/around_spec.rb +128 -0
- data/spec/aspect4r/before_spec.rb +148 -0
- data/spec/aspect4r/class_inheritance_spec.rb +254 -0
- data/spec/aspect4r/classic_spec.rb +44 -0
- data/spec/aspect4r/helper_spec.rb +117 -0
- data/spec/aspect4r/inheritance_inclusion_combined_spec.rb +98 -0
- data/spec/aspect4r/module_inclusion_spec.rb +208 -0
- data/spec/aspect4r/super_in_method_spec.rb +118 -0
- data/spec/aspect4r_spec.rb +295 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +11 -0
- data/test/after_test.rb +30 -0
- data/test/around_test.rb +28 -0
- data/test/before_test.rb +28 -0
- data/test/combined_test.rb +40 -0
- data/test/method_invocation_test.rb +28 -0
- data/test/test_helper.rb +9 -0
- metadata +147 -0
@@ -0,0 +1,118 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "super in method body" do
|
4
|
+
it "advice in child class and no advice in parent class" do
|
5
|
+
parent = Class.new do
|
6
|
+
def test
|
7
|
+
@value << "parent"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
klass = Class.new(parent) do
|
12
|
+
include Aspect4r
|
13
|
+
|
14
|
+
attr :value
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
@value = []
|
18
|
+
end
|
19
|
+
|
20
|
+
before :test do
|
21
|
+
@value << "before"
|
22
|
+
end
|
23
|
+
|
24
|
+
def test
|
25
|
+
super
|
26
|
+
@value << "self"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
o = klass.new
|
31
|
+
o.test
|
32
|
+
|
33
|
+
o.value.should == %w(before parent self)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "no advice in child class and advice in parent class" do
|
37
|
+
parent = Class.new do
|
38
|
+
include Aspect4r
|
39
|
+
|
40
|
+
before :test do
|
41
|
+
@value << "before"
|
42
|
+
end
|
43
|
+
|
44
|
+
def test
|
45
|
+
@value << "parent"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
klass = Class.new(parent) do
|
50
|
+
attr :value
|
51
|
+
|
52
|
+
def initialize
|
53
|
+
@value = []
|
54
|
+
end
|
55
|
+
|
56
|
+
def test
|
57
|
+
super
|
58
|
+
@value << "self"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
o = klass.new
|
63
|
+
o.test
|
64
|
+
|
65
|
+
o.value.should == %w(before parent self)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "advices in grand parent and parent and self" do
|
69
|
+
grand_parent = Class.new do
|
70
|
+
include Aspect4r
|
71
|
+
|
72
|
+
before :test do
|
73
|
+
@value << "before(grand_parent)"
|
74
|
+
end
|
75
|
+
|
76
|
+
def test
|
77
|
+
@value << "test(grand_parent)"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
parent = Class.new(grand_parent) do
|
82
|
+
include Aspect4r
|
83
|
+
|
84
|
+
before :test do
|
85
|
+
@value << "before(parent)"
|
86
|
+
end
|
87
|
+
|
88
|
+
def test
|
89
|
+
super
|
90
|
+
@value << "test(parent)"
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
klass = Class.new(parent) do
|
95
|
+
include Aspect4r
|
96
|
+
|
97
|
+
attr :value
|
98
|
+
|
99
|
+
def initialize
|
100
|
+
@value = []
|
101
|
+
end
|
102
|
+
|
103
|
+
before :test do
|
104
|
+
@value << "before"
|
105
|
+
end
|
106
|
+
|
107
|
+
def test
|
108
|
+
super
|
109
|
+
@value << "test"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
o = klass.new
|
114
|
+
o.test
|
115
|
+
|
116
|
+
o.value.should == %w(before before(parent) before(grand_parent) test(grand_parent) test(parent) test)
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,295 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "Aspect4r execution order" do
|
4
|
+
before do
|
5
|
+
@klass = Class.new do
|
6
|
+
include Aspect4r
|
7
|
+
|
8
|
+
attr :value
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@value = []
|
12
|
+
end
|
13
|
+
|
14
|
+
def test
|
15
|
+
@value << "test"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
it "around + before + after" do
|
21
|
+
@klass.class_eval do
|
22
|
+
around :test do |proxy|
|
23
|
+
@value << "around1"
|
24
|
+
a4r_invoke proxy
|
25
|
+
@value << "around2"
|
26
|
+
end
|
27
|
+
|
28
|
+
before :test do
|
29
|
+
@value << "before"
|
30
|
+
end
|
31
|
+
|
32
|
+
after :test do |result|
|
33
|
+
@value << "after"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
o = @klass.new
|
38
|
+
o.test
|
39
|
+
|
40
|
+
o.value.should == %w(before around1 test around2 after)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "before + after + around" do
|
44
|
+
@klass.class_eval do
|
45
|
+
|
46
|
+
before :test do
|
47
|
+
@value << "before"
|
48
|
+
end
|
49
|
+
|
50
|
+
after :test do |result|
|
51
|
+
@value << "after"
|
52
|
+
end
|
53
|
+
|
54
|
+
around :test do |proxy|
|
55
|
+
@value << "around1"
|
56
|
+
a4r_invoke proxy
|
57
|
+
@value << "around2"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
o = @klass.new
|
62
|
+
o.test
|
63
|
+
|
64
|
+
o.value.should == %w(around1 before test after around2)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "2 around + 2 before + 2 after" do
|
68
|
+
@klass.class_eval do
|
69
|
+
around :test do |proxy|
|
70
|
+
@value << "around11"
|
71
|
+
a4r_invoke proxy
|
72
|
+
@value << "around12"
|
73
|
+
end
|
74
|
+
|
75
|
+
around :test do |proxy|
|
76
|
+
@value << "around21"
|
77
|
+
a4r_invoke proxy
|
78
|
+
@value << "around22"
|
79
|
+
end
|
80
|
+
|
81
|
+
before :test do
|
82
|
+
@value << "before1"
|
83
|
+
end
|
84
|
+
|
85
|
+
before :test do
|
86
|
+
@value << "before2"
|
87
|
+
end
|
88
|
+
|
89
|
+
after :test do |result|
|
90
|
+
@value << "after1"
|
91
|
+
end
|
92
|
+
|
93
|
+
after :test do
|
94
|
+
@value << "after2"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
o = @klass.new
|
99
|
+
o.test
|
100
|
+
|
101
|
+
o.value.should == %w(before1 before2 around21 around11 test around12 around22 after1 after2)
|
102
|
+
end
|
103
|
+
|
104
|
+
it "before + after + around + before + after" do
|
105
|
+
@klass.class_eval do
|
106
|
+
before :test do
|
107
|
+
@value << "before1"
|
108
|
+
end
|
109
|
+
|
110
|
+
after :test do |result|
|
111
|
+
@value << "after1"
|
112
|
+
end
|
113
|
+
|
114
|
+
around :test do |proxy|
|
115
|
+
@value << "around1"
|
116
|
+
a4r_invoke proxy
|
117
|
+
@value << "around2"
|
118
|
+
end
|
119
|
+
|
120
|
+
before :test do
|
121
|
+
@value << "before2"
|
122
|
+
end
|
123
|
+
|
124
|
+
after :test do |result|
|
125
|
+
@value << "after2"
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
o = @klass.new
|
130
|
+
o.test
|
131
|
+
|
132
|
+
o.value.should == %w(before2 around1 before1 test after1 around2 after2)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
describe "Aspect4r result handling" do
|
137
|
+
it "should return correct result" do
|
138
|
+
@klass = Class.new do
|
139
|
+
include Aspect4r
|
140
|
+
|
141
|
+
def test
|
142
|
+
"test"
|
143
|
+
end
|
144
|
+
|
145
|
+
around :test do |proxy|
|
146
|
+
result = a4r_invoke proxy
|
147
|
+
"around1 #{result} around2"
|
148
|
+
end
|
149
|
+
|
150
|
+
after :test do |result|
|
151
|
+
result + " after"
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
o = @klass.new
|
156
|
+
o.test.should == "around1 test around2 after"
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
describe "Aspect4r chaining (add advice to advice method)" do
|
161
|
+
it "execution order" do
|
162
|
+
@klass = Class.new do
|
163
|
+
include Aspect4r
|
164
|
+
|
165
|
+
attr :value
|
166
|
+
|
167
|
+
def initialize
|
168
|
+
@value = []
|
169
|
+
end
|
170
|
+
|
171
|
+
def test
|
172
|
+
@value << "test"
|
173
|
+
end
|
174
|
+
|
175
|
+
def do_something
|
176
|
+
@value << "do_something"
|
177
|
+
end
|
178
|
+
|
179
|
+
def process_result result
|
180
|
+
@value << "process_result"
|
181
|
+
end
|
182
|
+
|
183
|
+
around :test do |proxy|
|
184
|
+
@value << "around11"
|
185
|
+
a4r_invoke proxy
|
186
|
+
@value << "around12"
|
187
|
+
end
|
188
|
+
|
189
|
+
before :test do
|
190
|
+
@value << "before1"
|
191
|
+
end
|
192
|
+
|
193
|
+
before :test, :do_something
|
194
|
+
|
195
|
+
before :do_something do
|
196
|
+
@value << "before(do_something)"
|
197
|
+
end
|
198
|
+
|
199
|
+
after :do_something do
|
200
|
+
@value << "after(do_something)"
|
201
|
+
end
|
202
|
+
|
203
|
+
after :test do |result|
|
204
|
+
@value << "after1"
|
205
|
+
end
|
206
|
+
|
207
|
+
after :test, :process_result
|
208
|
+
|
209
|
+
before :process_result do
|
210
|
+
@value << "before(process_result)"
|
211
|
+
end
|
212
|
+
|
213
|
+
after :process_result do
|
214
|
+
@value << "after(process_result)"
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
o = @klass.new
|
219
|
+
o.test
|
220
|
+
|
221
|
+
o.value.should == %w(before1 before(do_something) do_something after(do_something)
|
222
|
+
around11 test around12
|
223
|
+
after1 before(process_result) process_result after(process_result))
|
224
|
+
end
|
225
|
+
|
226
|
+
it "should return correct result (after advice on advices)" do
|
227
|
+
@klass = Class.new do
|
228
|
+
include Aspect4r
|
229
|
+
|
230
|
+
def test
|
231
|
+
"test"
|
232
|
+
end
|
233
|
+
|
234
|
+
def around_test proxy
|
235
|
+
result = a4r_invoke proxy
|
236
|
+
"around1 #{result} around2"
|
237
|
+
end
|
238
|
+
|
239
|
+
def after_test result
|
240
|
+
result + " after_test"
|
241
|
+
end
|
242
|
+
|
243
|
+
around :test, :around_test
|
244
|
+
|
245
|
+
after :test, :after_test
|
246
|
+
|
247
|
+
after :after_test do |result, *args|
|
248
|
+
result + " after(after_test)"
|
249
|
+
end
|
250
|
+
|
251
|
+
after :around_test do |result, *args|
|
252
|
+
result + " after(around_test)"
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
o = @klass.new
|
257
|
+
o.test.should == "around1 test around2 after(around_test) after_test after(after_test)"
|
258
|
+
end
|
259
|
+
|
260
|
+
it "should return correct result (around advice on advices)" do
|
261
|
+
@klass = Class.new do
|
262
|
+
include Aspect4r
|
263
|
+
|
264
|
+
def test
|
265
|
+
"test"
|
266
|
+
end
|
267
|
+
|
268
|
+
def around_test proxy
|
269
|
+
result = a4r_invoke proxy
|
270
|
+
"around1 #{result} around2"
|
271
|
+
end
|
272
|
+
|
273
|
+
def after_test result
|
274
|
+
result + " after_test"
|
275
|
+
end
|
276
|
+
|
277
|
+
around :test, :around_test
|
278
|
+
|
279
|
+
after :test, :after_test
|
280
|
+
|
281
|
+
around :after_test do |proxy, *args|
|
282
|
+
result = a4r_invoke proxy, *args
|
283
|
+
"around1(after_test) " + result + " around2(after_test)"
|
284
|
+
end
|
285
|
+
|
286
|
+
around :around_test do |proxy, *args|
|
287
|
+
result = a4r_invoke proxy, *args
|
288
|
+
"around1(around_test) " + result + " around2(around_test)"
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
o = @klass.new
|
293
|
+
o.test.should == "around1(after_test) around1(around_test) around1 test around2 around2(around_test) after_test around2(after_test)"
|
294
|
+
end
|
295
|
+
end
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/spec/spec_helper.rb
ADDED
data/test/after_test.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/test_helper')
|
2
|
+
|
3
|
+
class AfterTest < Test::Unit::TestCase
|
4
|
+
include RubyProf::Test
|
5
|
+
|
6
|
+
class Test
|
7
|
+
include Aspect4r
|
8
|
+
|
9
|
+
after :test, :after_test
|
10
|
+
|
11
|
+
def test_no_aspect
|
12
|
+
result = nil
|
13
|
+
|
14
|
+
after_test result
|
15
|
+
end
|
16
|
+
|
17
|
+
def test; end
|
18
|
+
|
19
|
+
def after_test result; end
|
20
|
+
end
|
21
|
+
|
22
|
+
def setup
|
23
|
+
@obj = Test.new
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_after
|
27
|
+
@obj.test_no_aspect
|
28
|
+
@obj.test
|
29
|
+
end
|
30
|
+
end
|
data/test/around_test.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/test_helper')
|
2
|
+
|
3
|
+
class AroundTest < Test::Unit::TestCase
|
4
|
+
include RubyProf::Test
|
5
|
+
|
6
|
+
class Test
|
7
|
+
include Aspect4r
|
8
|
+
|
9
|
+
around :test, :around_test
|
10
|
+
|
11
|
+
def test_no_aspect; end
|
12
|
+
|
13
|
+
def test; end
|
14
|
+
|
15
|
+
def around_test proxy
|
16
|
+
a4r_invoke proxy
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def setup
|
21
|
+
@obj = Test.new
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_around
|
25
|
+
@obj.test_no_aspect
|
26
|
+
@obj.test
|
27
|
+
end
|
28
|
+
end
|
data/test/before_test.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/test_helper')
|
2
|
+
|
3
|
+
class BeforeTest < Test::Unit::TestCase
|
4
|
+
include RubyProf::Test
|
5
|
+
|
6
|
+
class Test
|
7
|
+
include Aspect4r
|
8
|
+
|
9
|
+
before :test, :before_test
|
10
|
+
|
11
|
+
def test_no_aspect
|
12
|
+
before_test
|
13
|
+
end
|
14
|
+
|
15
|
+
def test; end
|
16
|
+
|
17
|
+
def before_test; end
|
18
|
+
end
|
19
|
+
|
20
|
+
def setup
|
21
|
+
@obj = Test.new
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_before
|
25
|
+
@obj.test_no_aspect
|
26
|
+
@obj.test
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/test_helper')
|
2
|
+
|
3
|
+
class CombinedTest < Test::Unit::TestCase
|
4
|
+
include RubyProf::Test
|
5
|
+
|
6
|
+
class Test
|
7
|
+
include Aspect4r
|
8
|
+
|
9
|
+
before :test, :before_test
|
10
|
+
after :test, :after_test
|
11
|
+
around :test, :around_test
|
12
|
+
|
13
|
+
def test_no_aspect
|
14
|
+
before_test
|
15
|
+
|
16
|
+
result = nil
|
17
|
+
|
18
|
+
after_test result
|
19
|
+
end
|
20
|
+
|
21
|
+
def test; end
|
22
|
+
|
23
|
+
def before_test; end
|
24
|
+
|
25
|
+
def after_test result; end
|
26
|
+
|
27
|
+
def around_test proxy
|
28
|
+
a4r_invoke proxy
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def setup
|
33
|
+
@obj = Test.new
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_combined
|
37
|
+
@obj.test_no_aspect
|
38
|
+
@obj.test
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/test_helper')
|
2
|
+
|
3
|
+
class MethodInvokationTest < Test::Unit::TestCase
|
4
|
+
include RubyProf::Test
|
5
|
+
|
6
|
+
class Test
|
7
|
+
def do_something; end
|
8
|
+
|
9
|
+
def test
|
10
|
+
do_something
|
11
|
+
end
|
12
|
+
|
13
|
+
do_something_method = instance_method(:do_something)
|
14
|
+
|
15
|
+
define_method :test_with_method_object do
|
16
|
+
do_something_method.bind(self).call
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def setup
|
21
|
+
@obj = Test.new
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_method_invocation
|
25
|
+
@obj.test
|
26
|
+
@obj.test_with_method_object
|
27
|
+
end
|
28
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'test/unit'
|
5
|
+
require 'ruby-prof/test'
|
6
|
+
require 'aspect4r'
|
7
|
+
|
8
|
+
RubyProf::Test::PROFILE_OPTIONS[:count ] = 10000
|
9
|
+
RubyProf::Test::PROFILE_OPTIONS[:output_dir] = File.dirname(__FILE__) + "/output"
|