aquarium 0.1.0 → 0.1.5
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/CHANGES +53 -0
- data/README +20 -4
- data/Rakefile +19 -4
- data/UPGRADE +41 -1
- data/examples/aspect_design_example.rb +4 -1
- data/examples/aspect_design_example_spec.rb +41 -0
- data/examples/design_by_contract_example.rb +2 -3
- data/examples/design_by_contract_example_spec.rb +92 -0
- data/examples/method_missing_example.rb +1 -1
- data/examples/method_missing_example_spec.rb +59 -0
- data/examples/method_tracing_example.rb +4 -2
- data/examples/method_tracing_example_spec.rb +141 -0
- data/lib/aquarium/aspects/advice.rb +2 -2
- data/lib/aquarium/aspects/aspect.rb +20 -35
- data/lib/aquarium/aspects/dsl.rb +2 -1
- data/lib/aquarium/aspects/dsl/aspect_dsl.rb +12 -8
- data/lib/aquarium/aspects/dsl/object_dsl.rb +8 -0
- data/lib/aquarium/aspects/join_point.rb +16 -10
- data/lib/aquarium/aspects/pointcut.rb +3 -3
- data/lib/aquarium/extras/design_by_contract.rb +20 -11
- data/lib/aquarium/utils.rb +1 -0
- data/lib/aquarium/utils/method_utils.rb +41 -0
- data/lib/aquarium/utils/name_utils.rb +35 -0
- data/lib/aquarium/utils/type_utils.rb +9 -0
- data/lib/aquarium/version.rb +3 -5
- data/rake_tasks/examples.rake +1 -1
- data/spec/aquarium/aspects/aspect_invocation_spec.rb +30 -28
- data/spec/aquarium/aspects/aspect_spec.rb +90 -0
- data/spec/aquarium/aspects/concurrent_aspects_spec.rb +5 -3
- data/spec/aquarium/aspects/concurrent_aspects_with_objects_and_types_spec.rb +3 -1
- data/spec/aquarium/aspects/dsl/aspect_dsl_spec.rb +174 -110
- data/spec/aquarium/aspects/join_point_spec.rb +120 -19
- data/spec/aquarium/aspects/pointcut_spec.rb +24 -14
- data/spec/aquarium/extras/design_by_contract_spec.rb +3 -0
- data/spec/aquarium/finders/finder_result_spec.rb +1 -1
- data/spec/aquarium/finders/method_finder_spec.rb +3 -4
- data/spec/aquarium/spec_example_classes.rb +4 -0
- data/spec/aquarium/utils/method_utils_spec.rb +124 -1
- data/spec/aquarium/utils/name_utils_spec.rb +56 -0
- data/spec/aquarium/utils/type_utils_spec.rb +17 -0
- metadata +12 -4
- data/spec/aquarium/finders/method_sorting_spec.rb +0 -16
@@ -5,6 +5,8 @@ require File.dirname(__FILE__) + '/../spec_example_classes'
|
|
5
5
|
require File.dirname(__FILE__) + '/concurrently_accessed'
|
6
6
|
require 'aquarium/aspects'
|
7
7
|
|
8
|
+
include Aquarium::Aspects
|
9
|
+
|
8
10
|
module ConcurrentAspectsSpecSupport
|
9
11
|
def add_m_then_remove_n_aspects_and_run iteration, for_type
|
10
12
|
reset_attrs
|
@@ -69,11 +71,11 @@ module ConcurrentAspectsSpecSupport
|
|
69
71
|
method = @advice_kinds[n] == :after_raising ? :invoke_raises : :invoke
|
70
72
|
@advice_invocation_counts[n] = 0
|
71
73
|
if for_type
|
72
|
-
pointcut =
|
74
|
+
pointcut = Pointcut.new(:methods => method, :type => ConcurrentlyAccessed)
|
73
75
|
else
|
74
|
-
pointcut =
|
76
|
+
pointcut = Pointcut.new(:methods => method, :object => @accessed)
|
75
77
|
end
|
76
|
-
@aspects[n] =
|
78
|
+
@aspects[n] = Aspect.new @advice_kinds[n], :pointcut => pointcut do |jp, *args|
|
77
79
|
@contexts[n] = jp.context
|
78
80
|
@argss[n] = *args
|
79
81
|
@advice_invocation_counts[n] += 1
|
@@ -6,8 +6,10 @@ require File.dirname(__FILE__) + '/../spec_example_classes'
|
|
6
6
|
require File.dirname(__FILE__) + '/concurrently_accessed'
|
7
7
|
require 'aquarium/aspects'
|
8
8
|
|
9
|
+
include Aquarium::Aspects
|
10
|
+
|
9
11
|
def make_aspect method, advice_kind, type_or_object_key, type_or_object
|
10
|
-
|
12
|
+
Aspect.new advice_kind, :pointcut => {type_or_object_key => type_or_object, :method => method} do |jp, *args|
|
11
13
|
@invoked << type_or_object_key
|
12
14
|
jp.proceed if advice_kind == :around
|
13
15
|
end
|
@@ -2,7 +2,11 @@ require File.dirname(__FILE__) + '/../../spec_helper.rb'
|
|
2
2
|
require File.dirname(__FILE__) + '/../../spec_example_classes'
|
3
3
|
require 'aquarium/aspects/dsl/aspect_dsl'
|
4
4
|
|
5
|
-
|
5
|
+
class DSLClass
|
6
|
+
include Aquarium::Aspects::DSL::AspectDSL
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "DSL method #before" do
|
6
10
|
before :each do
|
7
11
|
@advice = proc {|jp,*args| "advice"}
|
8
12
|
@aspects = []
|
@@ -12,13 +16,13 @@ describe Object, "#before" do
|
|
12
16
|
end
|
13
17
|
|
14
18
|
it "should be equivalent to advise :before." do
|
15
|
-
@aspects << advise(:before, :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
16
|
-
@aspects << before( :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
19
|
+
@aspects << DSLClass.advise(:before, :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
20
|
+
@aspects << DSLClass.before( :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
17
21
|
@aspects[1].should == @aspects[0]
|
18
22
|
end
|
19
23
|
end
|
20
24
|
|
21
|
-
describe
|
25
|
+
describe "DSL method #after" do
|
22
26
|
before :each do
|
23
27
|
@advice = proc {|jp,*args| "advice"}
|
24
28
|
@aspects = []
|
@@ -28,14 +32,15 @@ describe Object, "#after" do
|
|
28
32
|
end
|
29
33
|
|
30
34
|
it "should be equivalent to advise :after." do
|
31
|
-
@aspects << advise(:after, :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
32
|
-
@aspects << after( :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
35
|
+
@aspects << DSLClass.advise(:after, :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
36
|
+
@aspects << DSLClass.after( :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
33
37
|
@aspects[1].should == @aspects[0]
|
34
38
|
end
|
35
39
|
end
|
36
40
|
|
37
|
-
describe
|
41
|
+
describe "DSL method #after_raising_within_or_returning_from" do
|
38
42
|
before :each do
|
43
|
+
@dsl = DSLClass.new
|
39
44
|
@advice = proc {|jp,*args| "advice"}
|
40
45
|
@aspects = []
|
41
46
|
end
|
@@ -44,14 +49,15 @@ describe Object, "#after_raising_within_or_returning_from" do
|
|
44
49
|
end
|
45
50
|
|
46
51
|
it "should be equivalent to advise :after." do
|
47
|
-
@aspects << after( :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
48
|
-
@aspects << after_raising_within_or_returning_from(:noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
52
|
+
@aspects << DSLClass.after( :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
53
|
+
@aspects << DSLClass.after_raising_within_or_returning_from(:noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
49
54
|
@aspects[1].should == @aspects[0]
|
50
55
|
end
|
51
56
|
end
|
52
57
|
|
53
|
-
describe
|
58
|
+
describe "DSL method #after_returning" do
|
54
59
|
before :each do
|
60
|
+
@dsl = DSLClass.new
|
55
61
|
@advice = proc {|jp,*args| "advice"}
|
56
62
|
@aspects = []
|
57
63
|
end
|
@@ -60,14 +66,15 @@ describe Object, "#after_returning" do
|
|
60
66
|
end
|
61
67
|
|
62
68
|
it "should be equivalent to advise :after_returning." do
|
63
|
-
@aspects << advise(:after_returning, :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
64
|
-
@aspects << after_returning( :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
69
|
+
@aspects << DSLClass.advise(:after_returning, :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
70
|
+
@aspects << DSLClass.after_returning( :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
65
71
|
@aspects[1].should == @aspects[0]
|
66
72
|
end
|
67
73
|
end
|
68
74
|
|
69
|
-
describe
|
75
|
+
describe "DSL method #after_returning_from" do
|
70
76
|
before :each do
|
77
|
+
@dsl = DSLClass.new
|
71
78
|
@advice = proc {|jp,*args| "advice"}
|
72
79
|
@aspects = []
|
73
80
|
end
|
@@ -76,14 +83,15 @@ describe Object, "#after_returning_from" do
|
|
76
83
|
end
|
77
84
|
|
78
85
|
it "should be equivalent to advise :after_returning." do
|
79
|
-
@aspects << advise(:after_returning, :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
80
|
-
@aspects << after_returning_from( :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
86
|
+
@aspects << DSLClass.advise(:after_returning, :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
87
|
+
@aspects << DSLClass.after_returning_from( :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
81
88
|
@aspects[1].should == @aspects[0]
|
82
89
|
end
|
83
90
|
end
|
84
91
|
|
85
|
-
describe
|
92
|
+
describe "DSL method #after_raising" do
|
86
93
|
before :each do
|
94
|
+
@dsl = DSLClass.new
|
87
95
|
@advice = proc {|jp,*args| "advice"}
|
88
96
|
@aspects = []
|
89
97
|
end
|
@@ -95,14 +103,15 @@ describe Object, "#after_raising" do
|
|
95
103
|
class ThrowsUp
|
96
104
|
def tosses_cookies *args; raise Exception.new(args.inspect); end
|
97
105
|
end
|
98
|
-
@aspects << advise(:after_raising, :noop, :pointcut => {:type => ThrowsUp, :methods => :tosses_cookies}, &@advice)
|
99
|
-
@aspects << after_raising( :noop, :pointcut => {:type => ThrowsUp, :methods => :tosses_cookies}, &@advice)
|
106
|
+
@aspects << DSLClass.advise(:after_raising, :noop, :pointcut => {:type => ThrowsUp, :methods => :tosses_cookies}, &@advice)
|
107
|
+
@aspects << DSLClass.after_raising( :noop, :pointcut => {:type => ThrowsUp, :methods => :tosses_cookies}, &@advice)
|
100
108
|
@aspects[1].should == @aspects[0]
|
101
109
|
end
|
102
110
|
end
|
103
111
|
|
104
|
-
describe
|
112
|
+
describe "DSL method #after_raising_within" do
|
105
113
|
before :each do
|
114
|
+
@dsl = DSLClass.new
|
106
115
|
@advice = proc {|jp,*args| "advice"}
|
107
116
|
@aspects = []
|
108
117
|
end
|
@@ -114,14 +123,15 @@ describe Object, "#after_raising_within" do
|
|
114
123
|
class ThrowsUp
|
115
124
|
def tosses_cookies *args; raise Exception.new(args.inspect); end
|
116
125
|
end
|
117
|
-
@aspects << advise(:after_raising, :noop, :pointcut => {:type => ThrowsUp, :methods => :tosses_cookies}, &@advice)
|
118
|
-
@aspects << after_raising_within( :noop, :pointcut => {:type => ThrowsUp, :methods => :tosses_cookies}, &@advice)
|
126
|
+
@aspects << DSLClass.advise(:after_raising, :noop, :pointcut => {:type => ThrowsUp, :methods => :tosses_cookies}, &@advice)
|
127
|
+
@aspects << DSLClass.after_raising_within( :noop, :pointcut => {:type => ThrowsUp, :methods => :tosses_cookies}, &@advice)
|
119
128
|
@aspects[1].should == @aspects[0]
|
120
129
|
end
|
121
130
|
end
|
122
131
|
|
123
|
-
describe
|
132
|
+
describe "DSL method #before_and_after" do
|
124
133
|
before :each do
|
134
|
+
@dsl = DSLClass.new
|
125
135
|
@advice = proc {|jp,*args| "advice"}
|
126
136
|
@aspects = []
|
127
137
|
end
|
@@ -130,14 +140,15 @@ describe Object, "#before_and_after" do
|
|
130
140
|
end
|
131
141
|
|
132
142
|
it "should be equivalent to advise :before, :after." do
|
133
|
-
@aspects << advise(:before, :after, :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
134
|
-
@aspects << before_and_after(:noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
143
|
+
@aspects << DSLClass.advise(:before, :after, :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
144
|
+
@aspects << DSLClass.before_and_after(:noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
135
145
|
@aspects[1].should == @aspects[0]
|
136
146
|
end
|
137
147
|
end
|
138
148
|
|
139
|
-
describe
|
149
|
+
describe "DSL method #before_and_after_raising_within_or_returning_from" do
|
140
150
|
before :each do
|
151
|
+
@dsl = DSLClass.new
|
141
152
|
@advice = proc {|jp,*args| "advice"}
|
142
153
|
@aspects = []
|
143
154
|
end
|
@@ -146,14 +157,15 @@ describe Object, "#before_and_after_raising_within_or_returning_from" do
|
|
146
157
|
end
|
147
158
|
|
148
159
|
it "should be equivalent to advise :before and advise :after." do
|
149
|
-
@aspects << advise(:before, :after, :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
150
|
-
@aspects << before_and_after_raising_within_or_returning_from(:noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
160
|
+
@aspects << DSLClass.advise(:before, :after, :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
161
|
+
@aspects << DSLClass.before_and_after_raising_within_or_returning_from(:noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
151
162
|
@aspects[1].should == @aspects[0]
|
152
163
|
end
|
153
164
|
end
|
154
165
|
|
155
|
-
describe
|
166
|
+
describe "DSL method #before_and_after_returning" do
|
156
167
|
before :each do
|
168
|
+
@dsl = DSLClass.new
|
157
169
|
@advice = proc {|jp,*args| "advice"}
|
158
170
|
@aspects = []
|
159
171
|
end
|
@@ -162,14 +174,15 @@ describe Object, "#before_and_after_returning" do
|
|
162
174
|
end
|
163
175
|
|
164
176
|
it "should be equivalent to advise :before and advise :after_returning." do
|
165
|
-
@aspects << advise(:before, :after_returning, :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
166
|
-
@aspects << before_and_after_returning( :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
177
|
+
@aspects << DSLClass.advise(:before, :after_returning, :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
178
|
+
@aspects << DSLClass.before_and_after_returning( :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
167
179
|
@aspects[1].should == @aspects[0]
|
168
180
|
end
|
169
181
|
end
|
170
182
|
|
171
|
-
describe
|
183
|
+
describe "DSL method #before_and_after_returning_from" do
|
172
184
|
before :each do
|
185
|
+
@dsl = DSLClass.new
|
173
186
|
@advice = proc {|jp,*args| "advice"}
|
174
187
|
@aspects = []
|
175
188
|
end
|
@@ -178,14 +191,15 @@ describe Object, "#before_and_after_returning_from" do
|
|
178
191
|
end
|
179
192
|
|
180
193
|
it "should be equivalent to advise :before and advise :after_returning." do
|
181
|
-
@aspects << advise(:before, :after_returning, :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
182
|
-
@aspects << before_and_after_returning_from(:noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
194
|
+
@aspects << DSLClass.advise(:before, :after_returning, :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
195
|
+
@aspects << DSLClass.before_and_after_returning_from(:noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
183
196
|
@aspects[1].should == @aspects[0]
|
184
197
|
end
|
185
198
|
end
|
186
199
|
|
187
|
-
describe
|
200
|
+
describe "DSL method #before_and_after_raising" do
|
188
201
|
before :each do
|
202
|
+
@dsl = DSLClass.new
|
189
203
|
@advice = proc {|jp,*args| "advice"}
|
190
204
|
@aspects = []
|
191
205
|
end
|
@@ -194,14 +208,15 @@ describe Object, "#before_and_after_raising" do
|
|
194
208
|
end
|
195
209
|
|
196
210
|
it "should be equivalent to advise :before and advise :after_raising." do
|
197
|
-
@aspects << advise(:before, :after_raising, :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
198
|
-
@aspects << before_and_after_raising(:noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
211
|
+
@aspects << DSLClass.advise(:before, :after_raising, :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
212
|
+
@aspects << DSLClass.before_and_after_raising(:noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
199
213
|
@aspects[1].should == @aspects[0]
|
200
214
|
end
|
201
215
|
end
|
202
216
|
|
203
|
-
describe
|
217
|
+
describe "DSL method #around" do
|
204
218
|
before :each do
|
219
|
+
@dsl = DSLClass.new
|
205
220
|
@advice = proc {|jp,*args| "advice"}
|
206
221
|
@aspects = []
|
207
222
|
end
|
@@ -210,15 +225,14 @@ describe Object, "#around" do
|
|
210
225
|
end
|
211
226
|
|
212
227
|
it "should be equivalent to advise :around." do
|
213
|
-
@aspects << advise(:around, :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
214
|
-
@aspects << around( :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
228
|
+
@aspects << DSLClass.advise(:around, :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
229
|
+
@aspects << DSLClass.around( :noop, :pointcut => {:type => Watchful, :methods => :public_watchful_method}, &@advice)
|
215
230
|
@aspects[1].should == @aspects[0]
|
216
231
|
end
|
217
232
|
end
|
218
233
|
|
219
|
-
describe
|
234
|
+
describe "DSL method #advise, when determining the \"self\" to advise," do
|
220
235
|
before :each do
|
221
|
-
@watchful = Watchful.new
|
222
236
|
@aspects = []
|
223
237
|
end
|
224
238
|
after :each do
|
@@ -226,46 +240,109 @@ describe Object, "#advise (inferred arguments)" do
|
|
226
240
|
end
|
227
241
|
|
228
242
|
it "should ignore the default object \"self\" when an :object is specified." do
|
229
|
-
class
|
230
|
-
|
243
|
+
class Watchful1
|
244
|
+
include Aquarium::Aspects::DSL::AspectDSL
|
245
|
+
@@watchful = Watchful1.new
|
231
246
|
@@aspect = after(:object => @@watchful, :method => :public_watchful_method) {|jp,*args|}
|
232
247
|
def self.watchful; @@watchful; end
|
233
248
|
def self.aspect; @@aspect; end
|
234
249
|
end
|
235
|
-
@aspects << after(:object =>
|
236
|
-
@aspects <<
|
250
|
+
@aspects << DSLClass.after(:object => Watchful1.watchful, :method => :public_watchful_method) {|jp,*args|}
|
251
|
+
@aspects << Watchful1.aspect
|
237
252
|
@aspects[1].join_points_matched.should == @aspects[0].join_points_matched
|
238
253
|
@aspects[1].pointcuts.should == @aspects[0].pointcuts
|
239
254
|
end
|
240
255
|
|
241
256
|
it "should ignore the default object \"self\" when a :type is specified." do
|
242
|
-
class
|
243
|
-
|
257
|
+
class Watchful2
|
258
|
+
include Aquarium::Aspects::DSL::AspectDSL
|
259
|
+
@@aspect = after(:type => Watchful2, :method => :public_watchful_method) {|jp,*args|}
|
244
260
|
def self.aspect; @@aspect; end
|
245
261
|
end
|
246
|
-
@aspects << after(:type =>
|
247
|
-
@aspects <<
|
262
|
+
@aspects << DSLClass.after(:type => Watchful2, :method => :public_watchful_method) {|jp,*args|}
|
263
|
+
@aspects << Watchful2.aspect
|
248
264
|
@aspects[1].join_points_matched.should == @aspects[0].join_points_matched
|
249
265
|
@aspects[1].pointcuts.should == @aspects[0].pointcuts
|
250
266
|
end
|
267
|
+
end
|
268
|
+
|
269
|
+
describe "DSL method #advise, when determining the type or object to advise," do
|
270
|
+
before :each do
|
271
|
+
@aspects = []
|
272
|
+
end
|
273
|
+
after :each do
|
274
|
+
@aspects.each {|a| a.unadvise}
|
275
|
+
end
|
276
|
+
|
277
|
+
class WatchfulSelf
|
278
|
+
include Aquarium::Aspects::DSL::AspectDSL
|
279
|
+
@@aspect = nil
|
280
|
+
def self.aspect; @@aspect; end
|
281
|
+
def public_watchful_method; "public_watchful_method"; end
|
282
|
+
end
|
251
283
|
|
252
|
-
it "should infer the type
|
253
|
-
@aspects << after(:type =>
|
254
|
-
class
|
284
|
+
it "should infer the type as \"self\" when no :object, :type, or :pointcut is specified." do
|
285
|
+
@aspects << DSLClass.after(:type => WatchfulSelf, :method => :public_watchful_method) {|jp,*args|}
|
286
|
+
class WatchfulSelf
|
255
287
|
@@aspect = after(:method => :public_watchful_method) {|jp,*args|}
|
256
|
-
def self.aspect; @@aspect; end
|
257
288
|
end
|
258
|
-
@aspects <<
|
289
|
+
@aspects << WatchfulSelf.aspect
|
290
|
+
@aspects[1].join_points_matched.should == @aspects[0].join_points_matched
|
291
|
+
@aspects[1].pointcuts.should == @aspects[0].pointcuts
|
292
|
+
end
|
293
|
+
|
294
|
+
it "should infer the object as \"self\" when no :object, :type, or :pointcut is specified." do
|
295
|
+
watchful_self = WatchfulSelf.new
|
296
|
+
watchful_self.extend Aquarium::Aspects::DSL::AspectDSL
|
297
|
+
@aspects << watchful_self.after(:method => :public_watchful_method) {|jp,*args|}
|
298
|
+
@aspects << DSLClass.advise( :after, :pointcut => {:object => watchful_self, :method => :public_watchful_method}) {|jp,*args|}
|
259
299
|
@aspects[1].join_points_matched.should == @aspects[0].join_points_matched
|
260
300
|
@aspects[1].pointcuts.should == @aspects[0].pointcuts
|
261
301
|
end
|
262
302
|
|
303
|
+
it "should infer no types or objects if a :pointcut => {...} parameter is used and it does not specify a type or object." do
|
304
|
+
@aspects << DSLClass.after(:pointcut => {:method => /method/}) {|jp,*args|}
|
305
|
+
@aspects[0].join_points_matched.size.should == 0
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
describe "DSL method #advise, when parsing the parameter list," do
|
310
|
+
class Watchful3
|
311
|
+
include Aquarium::Aspects::DSL::AspectDSL
|
312
|
+
def public_watchful_method; "public_watchful_method"; end
|
313
|
+
end
|
314
|
+
|
315
|
+
before :each do
|
316
|
+
@aspects = []
|
317
|
+
end
|
318
|
+
after :each do
|
319
|
+
@aspects.each {|a| a.unadvise}
|
320
|
+
end
|
321
|
+
|
322
|
+
it "should infer the first symbol parameter after the advice kind parameter to be the method name to advise if no other :method => ... parameter is used." do
|
323
|
+
@aspects << Watchful3.after(:public_watchful_method) {|jp,*args|}
|
324
|
+
@aspects.each do |aspect|
|
325
|
+
aspect.join_points_matched.size.should == 1
|
326
|
+
aspect.specification[:methods].should == Set.new([:public_watchful_method])
|
327
|
+
end
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
331
|
+
describe "DSL method #advise, when determining instance or class methods to advise," do
|
332
|
+
before :each do
|
333
|
+
@aspects = []
|
334
|
+
end
|
335
|
+
after :each do
|
336
|
+
@aspects.each {|a| a.unadvise}
|
337
|
+
end
|
338
|
+
|
263
339
|
it "should treat \"ClassName.advise\" as advising instance methods, by default." do
|
264
340
|
class WatchfulExampleWithSeparateAdviseCall
|
341
|
+
include Aquarium::Aspects::DSL::AspectDSL
|
265
342
|
def public_watchful_method *args; end
|
266
343
|
end
|
267
344
|
advice_called = 0
|
268
|
-
WatchfulExampleWithSeparateAdviseCall.before :public_watchful_method do |jp, *args|
|
345
|
+
WatchfulExampleWithSeparateAdviseCall.advise :before, :public_watchful_method do |jp, *args|
|
269
346
|
advice_called += 1
|
270
347
|
end
|
271
348
|
WatchfulExampleWithSeparateAdviseCall.new.public_watchful_method :a1, :a2
|
@@ -275,11 +352,12 @@ describe Object, "#advise (inferred arguments)" do
|
|
275
352
|
|
276
353
|
it "should treat \"ClassName.advise\" as advising instance methods when the :instance method option is specified." do
|
277
354
|
class WatchfulExampleWithSeparateAdviseCall2
|
355
|
+
include Aquarium::Aspects::DSL::AspectDSL
|
278
356
|
def self.class_public_watchful_method *args; end
|
279
357
|
def public_watchful_method *args; end
|
280
358
|
end
|
281
359
|
advice_called = 0
|
282
|
-
|
360
|
+
WatchfulExampleWithSeparateAdviseCall2.advise :before, :type => WatchfulExampleWithSeparateAdviseCall2, :methods => /public_watchful_method/, :method_options =>[:instance] do |jp, *args|
|
283
361
|
advice_called += 1
|
284
362
|
end
|
285
363
|
WatchfulExampleWithSeparateAdviseCall2.class_public_watchful_method :a1, :a2
|
@@ -291,24 +369,26 @@ describe Object, "#advise (inferred arguments)" do
|
|
291
369
|
end
|
292
370
|
|
293
371
|
it "should treat \"ClassName.advise\" as advising class methods when the :class method option is specified." do
|
294
|
-
class
|
372
|
+
class WatchfulExampleWithSeparateAdviseCall3
|
373
|
+
include Aquarium::Aspects::DSL::AspectDSL
|
295
374
|
def self.class_public_watchful_method *args; end
|
296
375
|
def public_watchful_method *args; end
|
297
376
|
end
|
298
377
|
advice_called = 0
|
299
|
-
|
378
|
+
WatchfulExampleWithSeparateAdviseCall3.advise :before, :methods => /public_watchful_method/, :method_options =>[:class] do |jp, *args|
|
300
379
|
advice_called += 1
|
301
380
|
end
|
302
|
-
|
303
|
-
|
381
|
+
WatchfulExampleWithSeparateAdviseCall3.class_public_watchful_method :a1, :a2
|
382
|
+
WatchfulExampleWithSeparateAdviseCall3.class_public_watchful_method :a3, :a4
|
304
383
|
advice_called.should == 2
|
305
|
-
|
306
|
-
|
384
|
+
WatchfulExampleWithSeparateAdviseCall3.new.public_watchful_method :a1, :a2
|
385
|
+
WatchfulExampleWithSeparateAdviseCall3.new.public_watchful_method :a3, :a4
|
307
386
|
advice_called.should == 2
|
308
387
|
end
|
309
388
|
|
310
389
|
it "should invoke the type-based advise for all objects when the aspect is defined by calling #advise within the class definition." do
|
311
390
|
class WatchfulExampleWithBeforeAdvice
|
391
|
+
include Aquarium::Aspects::DSL::AspectDSL
|
312
392
|
@@advice_called = 0
|
313
393
|
def public_watchful_method *args; end
|
314
394
|
before :public_watchful_method do |jp, *args|
|
@@ -320,32 +400,16 @@ describe Object, "#advise (inferred arguments)" do
|
|
320
400
|
WatchfulExampleWithBeforeAdvice.new.public_watchful_method :a3, :a4
|
321
401
|
WatchfulExampleWithBeforeAdvice.advice_called.should == 2
|
322
402
|
end
|
403
|
+
end
|
323
404
|
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
@aspects[1].pointcuts.should == @aspects[0].pointcuts
|
329
|
-
end
|
330
|
-
|
331
|
-
it "should infer no types or objects if a :pointcut => {...} parameter is used and it does not specify a type or object." do
|
332
|
-
@aspects << after(:pointcut => {:method => /method/}) {|jp,*args|}
|
333
|
-
@aspects[0].join_points_matched.size.should == 0
|
334
|
-
end
|
335
|
-
|
336
|
-
it "should infer the first symbol parameter after the advice kind parameter is the method name to advise if no other :method => ... parameter is used." do
|
337
|
-
@aspects << @watchful.after( :public_watchful_method) {|jp,*args|}
|
338
|
-
@aspects.each do |aspect|
|
339
|
-
aspect.join_points_matched.size.should == 1
|
340
|
-
aspect.specification[:methods].should == Set.new([:public_watchful_method])
|
341
|
-
end
|
405
|
+
describe "DSL methods for the advice kind, when determining instance or class methods to advise," do
|
406
|
+
class Watchful4
|
407
|
+
include Aquarium::Aspects::DSL::AspectDSL
|
408
|
+
def public_watchful_method; "public_watchful_method"; end
|
342
409
|
end
|
343
|
-
end
|
344
410
|
|
345
|
-
describe Object, "advice kind convenience methods (inferred arguments)" do
|
346
411
|
before :each do
|
347
412
|
@advice = proc {|jp,*args| "advice"}
|
348
|
-
@watchful = Watchful.new
|
349
413
|
@aspects = []
|
350
414
|
end
|
351
415
|
after :each do
|
@@ -354,7 +418,7 @@ describe Object, "advice kind convenience methods (inferred arguments)" do
|
|
354
418
|
|
355
419
|
(Aquarium::Aspects::Advice.kinds + [:after_raising_within_or_returning_from]).each do |advice_kind|
|
356
420
|
it "##{advice_kind} method should infer the first symbol parameter as the method name to advise if no other :method => ... parameter is used." do
|
357
|
-
@aspects <<
|
421
|
+
@aspects << Watchful4.method(advice_kind).call(:public_watchful_method, &@advice)
|
358
422
|
@aspects.each do |aspect|
|
359
423
|
aspect.join_points_matched.size.should == 1
|
360
424
|
aspect.specification[:methods].should == Set.new([:public_watchful_method])
|
@@ -366,24 +430,24 @@ end
|
|
366
430
|
describe "Synonyms for :types" do
|
367
431
|
before :each do
|
368
432
|
@advice = proc {|jp,*args| "advice"}
|
369
|
-
@aspects = [after(:noop, :types => Watchful, :methods => :public_watchful_method, &@advice)]
|
433
|
+
@aspects = [DSLClass.after(:noop, :types => Watchful, :methods => :public_watchful_method, &@advice)]
|
370
434
|
end
|
371
435
|
after :each do
|
372
436
|
@aspects.each {|a| a.unadvise}
|
373
437
|
end
|
374
438
|
|
375
439
|
it ":type is a synonym for :types" do
|
376
|
-
@aspects << after(:noop, :type => Watchful, :methods => :public_watchful_method, &@advice)
|
440
|
+
@aspects << DSLClass.after(:noop, :type => Watchful, :methods => :public_watchful_method, &@advice)
|
377
441
|
@aspects[1].should == @aspects[0]
|
378
442
|
end
|
379
443
|
|
380
444
|
it ":within_types is a synonym for :types" do
|
381
|
-
@aspects << after(:noop, :within_type => Watchful, :methods => :public_watchful_method, &@advice)
|
445
|
+
@aspects << DSLClass.after(:noop, :within_type => Watchful, :methods => :public_watchful_method, &@advice)
|
382
446
|
@aspects[1].should == @aspects[0]
|
383
447
|
end
|
384
448
|
|
385
449
|
it ":within_types is a synonym for :types" do
|
386
|
-
@aspects << after(:noop, :within_types => Watchful, :methods => :public_watchful_method, &@advice)
|
450
|
+
@aspects << DSLClass.after(:noop, :within_types => Watchful, :methods => :public_watchful_method, &@advice)
|
387
451
|
@aspects[1].should == @aspects[0]
|
388
452
|
end
|
389
453
|
end
|
@@ -391,25 +455,24 @@ end
|
|
391
455
|
describe "Synonyms for :objects" do
|
392
456
|
before :each do
|
393
457
|
@advice = proc {|jp,*args| "advice"}
|
394
|
-
@
|
395
|
-
@aspects = [after(:noop, :objects => @watchful, :methods => :public_watchful_method, &@advice)]
|
458
|
+
@aspects = [DSLClass.after(:noop, :objects => @watchful, :methods => :public_watchful_method, &@advice)]
|
396
459
|
end
|
397
460
|
after :each do
|
398
461
|
@aspects.each {|a| a.unadvise}
|
399
462
|
end
|
400
463
|
|
401
464
|
it ":object is a synonym for :objects" do
|
402
|
-
@aspects << after(:noop, :object => @watchful, :methods => :public_watchful_method, &@advice)
|
465
|
+
@aspects << DSLClass.after(:noop, :object => @watchful, :methods => :public_watchful_method, &@advice)
|
403
466
|
@aspects[1].should == @aspects[0]
|
404
467
|
end
|
405
468
|
|
406
469
|
it ":within_objects is a synonym for :objects" do
|
407
|
-
@aspects << after(:noop, :within_object => @watchful, :methods => :public_watchful_method, &@advice)
|
470
|
+
@aspects << DSLClass.after(:noop, :within_object => @watchful, :methods => :public_watchful_method, &@advice)
|
408
471
|
@aspects[1].should == @aspects[0]
|
409
472
|
end
|
410
473
|
|
411
474
|
it ":within_objects is a synonym for :objects" do
|
412
|
-
@aspects << after(:noop, :within_objects => @watchful, :methods => :public_watchful_method, &@advice)
|
475
|
+
@aspects << DSLClass.after(:noop, :within_objects => @watchful, :methods => :public_watchful_method, &@advice)
|
413
476
|
@aspects[1].should == @aspects[0]
|
414
477
|
end
|
415
478
|
end
|
@@ -417,25 +480,24 @@ end
|
|
417
480
|
describe "Synonyms for :methods" do
|
418
481
|
before :each do
|
419
482
|
@advice = proc {|jp,*args| "advice"}
|
420
|
-
@
|
421
|
-
@aspects = [after(:noop, :objects => @watchful, :methods => :public_watchful_method, &@advice)]
|
483
|
+
@aspects = [DSLClass.after(:noop, :objects => @watchful, :methods => :public_watchful_method, &@advice)]
|
422
484
|
end
|
423
485
|
after :each do
|
424
486
|
@aspects.each {|a| a.unadvise}
|
425
487
|
end
|
426
488
|
|
427
489
|
it ":method is a synonym for :methods" do
|
428
|
-
@aspects << after(:noop, :object => @watchful, :method => :public_watchful_method, &@advice)
|
490
|
+
@aspects << DSLClass.after(:noop, :object => @watchful, :method => :public_watchful_method, &@advice)
|
429
491
|
@aspects[1].should == @aspects[0]
|
430
492
|
end
|
431
493
|
|
432
494
|
it ":within_methods is a synonym for :methods" do
|
433
|
-
@aspects << after(:noop, :within_object => @watchful, :within_methods => :public_watchful_method, &@advice)
|
495
|
+
@aspects << DSLClass.after(:noop, :within_object => @watchful, :within_methods => :public_watchful_method, &@advice)
|
434
496
|
@aspects[1].should == @aspects[0]
|
435
497
|
end
|
436
498
|
|
437
499
|
it ":within_methods is a synonym for :methods" do
|
438
|
-
@aspects << after(:noop, :within_objects => @watchful, :within_method => :public_watchful_method, &@advice)
|
500
|
+
@aspects << DSLClass.after(:noop, :within_objects => @watchful, :within_method => :public_watchful_method, &@advice)
|
439
501
|
@aspects[1].should == @aspects[0]
|
440
502
|
end
|
441
503
|
end
|
@@ -443,32 +505,32 @@ end
|
|
443
505
|
describe "Synonyms for :pointcut" do
|
444
506
|
before :each do
|
445
507
|
@advice = proc {|jp,*args| "advice"}
|
446
|
-
@
|
447
|
-
@aspects = [after(:noop, :pointcut => {:objects => @watchful, :methods => :public_watchful_method}, &@advice)]
|
508
|
+
@aspects = [DSLClass.after(:noop, :pointcut => {:objects => @watchful, :methods => :public_watchful_method}, &@advice)]
|
448
509
|
end
|
449
510
|
after :each do
|
450
511
|
@aspects.each {|a| a.unadvise}
|
451
512
|
end
|
452
513
|
|
453
514
|
it ":pointcuts is a synonym for :pointcut" do
|
454
|
-
@aspects << after(:noop, :pointcuts => {:objects => @watchful, :methods => :public_watchful_method}, &@advice)
|
515
|
+
@aspects << DSLClass.after(:noop, :pointcuts => {:objects => @watchful, :methods => :public_watchful_method}, &@advice)
|
455
516
|
@aspects[1].should == @aspects[0]
|
456
517
|
end
|
457
518
|
|
458
519
|
it "should accept :within_pointcuts as a synonym for :pointcut." do
|
459
|
-
@aspects << after(:noop, :within_pointcuts => {:objects => @watchful, :methods => :public_watchful_method}, &@advice)
|
520
|
+
@aspects << DSLClass.after(:noop, :within_pointcuts => {:objects => @watchful, :methods => :public_watchful_method}, &@advice)
|
460
521
|
@aspects[1].should == @aspects[0]
|
461
522
|
end
|
462
523
|
|
463
524
|
it "should accept :within_pointcut as a synonym for :pointcut." do
|
464
|
-
@aspects << after(:noop, :within_pointcut => {:objects => @watchful, :methods => :public_watchful_method}, &@advice)
|
525
|
+
@aspects << DSLClass.after(:noop, :within_pointcut => {:objects => @watchful, :methods => :public_watchful_method}, &@advice)
|
465
526
|
@aspects[1].should == @aspects[0]
|
466
527
|
end
|
467
528
|
end
|
468
529
|
|
469
|
-
describe
|
530
|
+
describe "DSL method #advise (or synonyms) called within a type body" do
|
470
531
|
it "will not advise a method whose definition hasn't been seen yet in the type body." do
|
471
532
|
class WatchfulWithMethodAlreadyDefined
|
533
|
+
include Aquarium::Aspects::DSL::AspectDSL
|
472
534
|
@@advice_called = 0
|
473
535
|
def public_watchful_method *args; end
|
474
536
|
before :public_watchful_method do |jp, *args|
|
@@ -480,6 +542,7 @@ describe Object, "#advise (or synonyms) called within a type body" do
|
|
480
542
|
WatchfulWithMethodAlreadyDefined.new.public_watchful_method :a3, :a4
|
481
543
|
WatchfulWithMethodAlreadyDefined.advice_called.should == 2
|
482
544
|
class WatchfulWithMethodNotYetDefined
|
545
|
+
include Aquarium::Aspects::DSL::AspectDSL
|
483
546
|
@@advice_called = 0
|
484
547
|
before(:public_watchful_method) {|jp, *args| @@advice_called += 1}
|
485
548
|
def public_watchful_method *args; end
|
@@ -491,24 +554,25 @@ describe Object, "#advise (or synonyms) called within a type body" do
|
|
491
554
|
end
|
492
555
|
end
|
493
556
|
|
494
|
-
describe
|
557
|
+
describe "DSL method #pointcut" do
|
495
558
|
class PC1;
|
496
559
|
def doit; end
|
497
560
|
end
|
498
561
|
|
499
562
|
it "should match equivalent join points as Pointcut.new" do
|
500
|
-
pointcut1 = pointcut :type => PC1, :method => :doit
|
563
|
+
pointcut1 = DSLClass.pointcut :type => PC1, :method => :doit
|
501
564
|
pointcut2 = Aquarium::Aspects::Pointcut.new :type => PC1, :method => :doit
|
502
565
|
pointcut1.join_points_matched.should == pointcut2.join_points_matched
|
503
566
|
pointcut1.join_points_not_matched.should == pointcut2.join_points_not_matched
|
504
567
|
end
|
505
568
|
|
506
569
|
it "should use self as the object if no object or type is specified." do
|
507
|
-
class
|
570
|
+
class PC2
|
571
|
+
include Aquarium::Aspects::DSL::AspectDSL
|
508
572
|
POINTCUT = pointcut :method => :doit
|
509
573
|
end
|
510
|
-
pointcut2 = Aquarium::Aspects::Pointcut.new :type =>
|
511
|
-
|
512
|
-
|
574
|
+
pointcut2 = Aquarium::Aspects::Pointcut.new :type => PC2, :method => :doit
|
575
|
+
PC2::POINTCUT.join_points_matched.should == pointcut2.join_points_matched
|
576
|
+
PC2::POINTCUT.join_points_not_matched.should == pointcut2.join_points_not_matched
|
513
577
|
end
|
514
578
|
end
|