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.
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