aspect4r 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/.document +5 -0
  2. data/.gitignore +22 -0
  3. data/LICENSE +20 -0
  4. data/NOTES.rdoc +42 -0
  5. data/README.rdoc +70 -0
  6. data/Rakefile +45 -0
  7. data/VERSION +1 -0
  8. data/aspect4r.gemspec +108 -0
  9. data/examples/after_example.rb +30 -0
  10. data/examples/around_example.rb +29 -0
  11. data/examples/before_example.rb +62 -0
  12. data/examples/combined_example.rb +39 -0
  13. data/lib/aspect4r/after.rb +29 -0
  14. data/lib/aspect4r/around.rb +29 -0
  15. data/lib/aspect4r/base.rb +32 -0
  16. data/lib/aspect4r/before.rb +37 -0
  17. data/lib/aspect4r/classic.rb +12 -0
  18. data/lib/aspect4r/errors.rb +5 -0
  19. data/lib/aspect4r/extensions/class_extension.rb +20 -0
  20. data/lib/aspect4r/extensions/module_extension.rb +30 -0
  21. data/lib/aspect4r/helper.rb +171 -0
  22. data/lib/aspect4r/model/advice.rb +29 -0
  23. data/lib/aspect4r/model/advice_metadata.rb +27 -0
  24. data/lib/aspect4r/model/advices_for_method.rb +45 -0
  25. data/lib/aspect4r/model/aspect_data.rb +19 -0
  26. data/lib/aspect4r/return_this.rb +9 -0
  27. data/lib/aspect4r.rb +10 -0
  28. data/spec/aspect4r/after_spec.rb +121 -0
  29. data/spec/aspect4r/around_spec.rb +128 -0
  30. data/spec/aspect4r/before_spec.rb +148 -0
  31. data/spec/aspect4r/class_inheritance_spec.rb +254 -0
  32. data/spec/aspect4r/classic_spec.rb +44 -0
  33. data/spec/aspect4r/helper_spec.rb +117 -0
  34. data/spec/aspect4r/inheritance_inclusion_combined_spec.rb +98 -0
  35. data/spec/aspect4r/module_inclusion_spec.rb +208 -0
  36. data/spec/aspect4r/super_in_method_spec.rb +118 -0
  37. data/spec/aspect4r_spec.rb +295 -0
  38. data/spec/spec.opts +1 -0
  39. data/spec/spec_helper.rb +11 -0
  40. data/test/after_test.rb +30 -0
  41. data/test/around_test.rb +28 -0
  42. data/test/before_test.rb +28 -0
  43. data/test/combined_test.rb +40 -0
  44. data/test/method_invocation_test.rb +28 -0
  45. data/test/test_helper.rb +9 -0
  46. metadata +147 -0
@@ -0,0 +1,254 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Aspect4r do
4
+ it "basic inheritance should work" do
5
+ parent = 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
+
18
+ around :test do |proxy|
19
+ @value << "around1"
20
+ a4r_invoke proxy
21
+ @value << "around2"
22
+ end
23
+
24
+ before :test do
25
+ @value << "before"
26
+ end
27
+
28
+ after :test do |result|
29
+ @value << "after"
30
+ end
31
+ end
32
+
33
+ child = Class.new(parent)
34
+
35
+ o = child.new
36
+ o.test
37
+
38
+ o.value.should == %w(before around1 test around2 after)
39
+ end
40
+
41
+ it "override method" do
42
+ parent = Class.new do
43
+ include Aspect4r
44
+
45
+ attr :value
46
+
47
+ def initialize
48
+ @value = []
49
+ end
50
+
51
+ def test
52
+ @value << "test(parent)"
53
+ end
54
+
55
+ before :test do
56
+ @value << "before"
57
+ end
58
+ end
59
+
60
+ child = Class.new(parent) do
61
+ def test
62
+ @value << "test"
63
+ end
64
+ end
65
+
66
+ o = child.new
67
+ o.test
68
+
69
+ o.value.should == %w(test)
70
+ end
71
+
72
+ it "override method and call super" do
73
+ parent = Class.new do
74
+ include Aspect4r
75
+
76
+ attr :value
77
+
78
+ def initialize
79
+ @value = []
80
+ end
81
+
82
+ def test
83
+ @value << "test(parent)"
84
+ end
85
+
86
+ before :test do
87
+ @value << "before"
88
+ end
89
+ end
90
+
91
+ child = Class.new(parent) do
92
+ def test
93
+ super
94
+ @value << "test"
95
+ end
96
+ end
97
+
98
+ o = child.new
99
+ o.test
100
+
101
+ o.value.should == %w(before test(parent) test)
102
+ end
103
+
104
+ it "override method with advices and call super" do
105
+ parent = Class.new do
106
+ include Aspect4r
107
+
108
+ attr :value
109
+
110
+ def initialize
111
+ @value = []
112
+ end
113
+
114
+ def test
115
+ @value << "test(parent)"
116
+ end
117
+
118
+ before :test do
119
+ @value << "before(parent)"
120
+ end
121
+ end
122
+
123
+ child = Class.new(parent) do
124
+ include Aspect4r
125
+
126
+ def test
127
+ super
128
+ @value << "test"
129
+ end
130
+
131
+ before :test do
132
+ @value << "before"
133
+ end
134
+ end
135
+
136
+ o = child.new
137
+ o.test
138
+
139
+ o.value.should == %w(before before(parent) test(parent) test)
140
+ end
141
+
142
+ it "method+advices in child class and method+advices in parent class" do
143
+ parent = Class.new do
144
+ include Aspect4r
145
+
146
+ attr :value
147
+
148
+ def initialize
149
+ @value = []
150
+ end
151
+
152
+ def test
153
+ @value << "test(parent)"
154
+ end
155
+
156
+ before :test do
157
+ @value << "before(parent)"
158
+ end
159
+
160
+ after :test do |result|
161
+ @value << "after(parent)"
162
+ end
163
+ end
164
+
165
+ class Child < parent
166
+ include Aspect4r
167
+
168
+ def test
169
+ @value << "test"
170
+ end
171
+
172
+ before :test do
173
+ @value << "before"
174
+ end
175
+
176
+ after :test do |result|
177
+ @value << "after"
178
+ end
179
+ end
180
+
181
+ o = Child.new
182
+ o.test
183
+
184
+ o.value.should == %w(before test after)
185
+ end
186
+
187
+ it "around advice in child class and method in parent class" do
188
+ parent = Class.new do
189
+ attr :value
190
+
191
+ def initialize
192
+ @value = []
193
+ end
194
+
195
+ def test
196
+ @value << "test"
197
+ end
198
+ end
199
+
200
+ class Child1 < parent
201
+ include Aspect4r
202
+
203
+ around :test do |proxy|
204
+ @value << "around(before)"
205
+ a4r_invoke proxy
206
+ @value << "around(after)"
207
+ end
208
+ end
209
+
210
+ o = Child1.new
211
+ o.test
212
+
213
+ o.value.should == %w(around(before) test around(after))
214
+ end
215
+
216
+ it "around advice in child class and method+advices in parent class" do
217
+ parent = Class.new do
218
+ include Aspect4r
219
+
220
+ attr :value
221
+
222
+ def initialize
223
+ @value = []
224
+ end
225
+
226
+ def test
227
+ @value << "test"
228
+ end
229
+
230
+ before :test do
231
+ @value << "before"
232
+ end
233
+
234
+ after :test do |result|
235
+ @value << "after"
236
+ end
237
+ end
238
+
239
+ class Child2 < parent
240
+ include Aspect4r
241
+
242
+ around :test do |proxy|
243
+ @value << "around(before)"
244
+ a4r_invoke proxy
245
+ @value << "around(after)"
246
+ end
247
+ end
248
+
249
+ o = Child2.new
250
+ o.test
251
+
252
+ o.value.should == %w(around(before) before test after around(after))
253
+ end
254
+ end
@@ -0,0 +1,44 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ require 'aspect4r/classic'
4
+
5
+ describe Aspect4r::Classic do
6
+ it "should work" do
7
+ klass = Class.new do
8
+ include Aspect4r::Classic
9
+
10
+ attr :value
11
+
12
+ def initialize
13
+ @value = []
14
+ end
15
+
16
+ def test
17
+ @value << "test"
18
+ end
19
+
20
+ a4r_around :test do |proxy_method|
21
+ @value << "around1"
22
+ a4r_invoke proxy_method
23
+ @value << "around2"
24
+ end
25
+
26
+ a4r_before :test do
27
+ @value << "before"
28
+ end
29
+
30
+ a4r_before_filter :test do
31
+ @value << "before_filter"
32
+ end
33
+
34
+ a4r_after :test do |result|
35
+ @value << "after"
36
+ end
37
+ end
38
+
39
+ o = klass.new
40
+ o.test
41
+
42
+ o.value.should == %w(before before_filter around1 test around2 after)
43
+ end
44
+ end
@@ -0,0 +1,117 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Aspect4r::Helper do
4
+ describe "self.find_available_name" do
5
+ it "should return test0 as first available method" do
6
+ Aspect4r::Helper.find_available_method_name(Class.new, "test").should =~ /test0/
7
+ end
8
+
9
+ it "should return test1 if find_available_method_name is called once already" do
10
+ klass = Class.new
11
+ klass.class_eval do
12
+ first = Aspect4r::Helper.find_available_method_name(klass, "test")
13
+
14
+ define_method first do end
15
+
16
+ private first
17
+ end
18
+ Aspect4r::Helper.find_available_method_name(klass, "test").should =~ /test1/
19
+ end
20
+ end
21
+
22
+ describe "self.create_method" do
23
+ before do
24
+ @klass = Class.new do
25
+ include Aspect4r
26
+
27
+ attr :value
28
+
29
+ def initialize
30
+ @value = []
31
+ end
32
+
33
+ def test
34
+ @value << "test"
35
+ end
36
+
37
+ def before_test
38
+ @value << "before_test"
39
+ end
40
+
41
+ def after_test result
42
+ @value << "after_test"
43
+ result
44
+ end
45
+
46
+ def around_test proxy
47
+ @value << "around_test_before"
48
+ result = a4r_invoke proxy
49
+ @value << "around_test_after"
50
+ result
51
+ end
52
+ end
53
+ end
54
+
55
+ it "No advice" do
56
+ Aspect4r::Helper.create_method @klass, :test
57
+
58
+ o = @klass.new
59
+ o.test
60
+
61
+ o.value.should == %w(test)
62
+ end
63
+
64
+ it "before advices" do
65
+ @klass.before :test, :before_test
66
+ Aspect4r::Helper.create_method @klass, :test
67
+
68
+ o = @klass.new
69
+ o.test
70
+
71
+ o.value.should == %w(before_test test)
72
+ end
73
+
74
+ it "after advices" do
75
+ @klass.after :test, :after_test
76
+ Aspect4r::Helper.create_method @klass, :test
77
+
78
+ o = @klass.new
79
+ o.test
80
+
81
+ o.value.should == %w(test after_test)
82
+ end
83
+
84
+ it "around advices" do
85
+ @klass.around :test, :around_test
86
+ Aspect4r::Helper.create_method @klass, :test
87
+
88
+ o = @klass.new
89
+ o.test
90
+
91
+ o.value.should == %w(around_test_before test around_test_after)
92
+ end
93
+
94
+ it "before + after advices" do
95
+ @klass.before :test, :before_test
96
+ @klass.after :test, :after_test
97
+ Aspect4r::Helper.create_method @klass, :test
98
+
99
+ o = @klass.new
100
+ o.test
101
+
102
+ o.value.should == %w(before_test test after_test)
103
+ end
104
+
105
+ it "around + before + after advices" do
106
+ @klass.around :test, :around_test
107
+ @klass.before :test, :before_test
108
+ @klass.after :test, :after_test
109
+ Aspect4r::Helper.create_method @klass, :test
110
+
111
+ o = @klass.new
112
+ o.test
113
+
114
+ o.value.should == %w(before_test around_test_before test around_test_after after_test)
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,98 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Aspect4r do
4
+ it "inherit from parent class which includes method+advices from module" do
5
+ module Mod
6
+ include Aspect4r
7
+
8
+ def test
9
+ @value << "test"
10
+ end
11
+
12
+ around :test do |proxy|
13
+ @value << "around1"
14
+ a4r_invoke proxy
15
+ @value << "around2"
16
+ end
17
+
18
+ before :test do
19
+ @value << "before"
20
+ end
21
+
22
+ after :test do |result|
23
+ @value << "after"
24
+ end
25
+ end
26
+
27
+ parent = Class.new do
28
+ include Mod
29
+
30
+ attr :value
31
+
32
+ def initialize
33
+ @value = []
34
+ end
35
+ end
36
+
37
+ child = Class.new(parent) do
38
+ end
39
+
40
+
41
+ o = child.new
42
+ o.test
43
+
44
+ o.value.should == %w(before around1 test around2 after)
45
+ end
46
+
47
+ it "method+advices in parent class and included modules - modules takes precedence" do
48
+ module Mod3
49
+ include Aspect4r
50
+
51
+ def test
52
+ @value << "test(module)"
53
+ end
54
+
55
+ around :test do |proxy|
56
+ @value << "around1"
57
+ a4r_invoke proxy
58
+ @value << "around2"
59
+ end
60
+
61
+ before :test do
62
+ @value << "before(module)"
63
+ end
64
+
65
+ after :test do |result|
66
+ @value << "after"
67
+ end
68
+ end
69
+
70
+ class Parent3
71
+ include Aspect4r
72
+
73
+ before :test do
74
+ @value << "before(parent)"
75
+ end
76
+
77
+ attr :value
78
+
79
+ def initialize
80
+ @value = []
81
+ end
82
+
83
+ def test
84
+ @value << "test(parent)"
85
+ end
86
+ end
87
+
88
+ class Child3 < Parent3
89
+ include Mod3
90
+ end
91
+
92
+
93
+ o = Child3.new
94
+ o.test
95
+
96
+ o.value.should == %w(before(module) around1 test(module) around2 after)
97
+ end
98
+ end
@@ -0,0 +1,208 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Aspect4r do
4
+ it "basic module inclusion should work" do
5
+ klass = Class.new do
6
+ attr :value
7
+
8
+ def initialize
9
+ @value = []
10
+ end
11
+ end
12
+
13
+ mod = Module.new do
14
+ include Aspect4r
15
+
16
+ def test
17
+ @value << "test"
18
+ end
19
+
20
+ around :test do |proxy|
21
+ @value << "around1"
22
+ a4r_invoke proxy
23
+ @value << "around2"
24
+ end
25
+
26
+ before :test do
27
+ @value << "before"
28
+ end
29
+
30
+ after :test do |result|
31
+ @value << "after"
32
+ end
33
+ end
34
+
35
+ klass.send :include, mod
36
+
37
+ o = klass.new
38
+ o.test
39
+
40
+ o.value.should == %w(before around1 test around2 after)
41
+ end
42
+
43
+ it "override method" do
44
+ klass = Class.new do
45
+ attr :value
46
+
47
+ def initialize
48
+ @value = []
49
+ end
50
+
51
+ def test
52
+ @value << "test"
53
+ end
54
+ end
55
+
56
+ mod = Module.new do
57
+ include Aspect4r
58
+
59
+ def test
60
+ @value << "test(module)"
61
+ end
62
+
63
+ around :test do |proxy|
64
+ @value << "around1"
65
+ send proxy
66
+ @value << "around2"
67
+ end
68
+
69
+ before :test do
70
+ @value << "before"
71
+ end
72
+
73
+ after :test do |result|
74
+ @value << "after"
75
+ end
76
+ end
77
+
78
+ klass.send :include, mod
79
+
80
+ o = klass.new
81
+ o.test
82
+
83
+ o.value.should == %w(test)
84
+ end
85
+
86
+ it "override method and call super" do
87
+ klass = Class.new do
88
+ attr :value
89
+
90
+ def initialize
91
+ @value = []
92
+ end
93
+
94
+ def test
95
+ super
96
+ @value << "test"
97
+ end
98
+ end
99
+
100
+ mod = Module.new do
101
+ include Aspect4r
102
+
103
+ def test
104
+ @value << "test(module)"
105
+ end
106
+
107
+ before :test do
108
+ @value << "before"
109
+ end
110
+ end
111
+
112
+ klass.send :include, mod
113
+
114
+ o = klass.new
115
+ o.test
116
+
117
+ o.value.should == %w(before test(module) test)
118
+ end
119
+
120
+ it "method+advices in child class and method+advices in module" do
121
+ module AspectMod
122
+ include Aspect4r
123
+
124
+ def test
125
+ @value << "test(module)"
126
+ end
127
+
128
+ around :test do |proxy|
129
+ @value << "around1"
130
+ a4r_invoke proxy
131
+ @value << "around2"
132
+ end
133
+
134
+ after :test do |result|
135
+ @value << "after"
136
+ end
137
+ end
138
+
139
+ class AspectMix
140
+ include Aspect4r
141
+ include AspectMod
142
+
143
+ attr :value
144
+
145
+ def initialize
146
+ @value = []
147
+ end
148
+
149
+ def test
150
+ @value << "test"
151
+ end
152
+
153
+ before :test do
154
+ @value << "before"
155
+ end
156
+ end
157
+
158
+ o = AspectMix.new
159
+ o.test
160
+
161
+ o.value.should == %w(before test)
162
+ end
163
+
164
+ it "method+advices in child class and method+advices in module and call super" do
165
+ module AspectMod1
166
+ include Aspect4r
167
+
168
+ def test
169
+ @value << "test(module)"
170
+ end
171
+
172
+ around :test do |proxy|
173
+ @value << "around1"
174
+ a4r_invoke proxy
175
+ @value << "around2"
176
+ end
177
+
178
+ after :test do |result|
179
+ @value << "after"
180
+ end
181
+ end
182
+
183
+ class AspectMix1
184
+ include Aspect4r
185
+ include AspectMod1
186
+
187
+ attr :value
188
+
189
+ def initialize
190
+ @value = []
191
+ end
192
+
193
+ def test
194
+ super
195
+ @value << "test"
196
+ end
197
+
198
+ before :test do
199
+ @value << "before"
200
+ end
201
+ end
202
+
203
+ o = AspectMix1.new
204
+ o.test
205
+
206
+ o.value.should == %w(before around1 test(module) around2 after test)
207
+ end
208
+ end