aspector 0.7.0 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/Gemfile +2 -2
  2. data/Gemfile.lock +6 -9
  3. data/README.rdoc +5 -4
  4. data/VERSION +1 -1
  5. data/aspector.gemspec +29 -20
  6. data/examples/activerecord_hooks.rb +2 -2
  7. data/examples/around_example.rb +1 -0
  8. data/examples/aspector_apply_example.rb +4 -3
  9. data/examples/aspector_example.rb +1 -0
  10. data/examples/cache_aspect.rb +2 -2
  11. data/examples/exception_handler.rb +36 -0
  12. data/examples/logging_aspect.rb +35 -0
  13. data/examples/retry_aspect.rb +41 -0
  14. data/lib/aspector/advice.rb +3 -7
  15. data/lib/aspector/base.rb +52 -29
  16. data/lib/aspector/context.rb +2 -1
  17. data/lib/aspector/deferred_logic.rb +3 -7
  18. data/lib/aspector/method_matcher.rb +6 -9
  19. data/performance-tests/after_test.rb +25 -0
  20. data/performance-tests/around_test.rb +27 -0
  21. data/performance-tests/before_test.rb +25 -0
  22. data/performance-tests/combined_test.rb +33 -0
  23. data/performance-tests/method_invocation_test.rb +25 -0
  24. data/performance-tests/test_helper.rb +9 -0
  25. data/spec/functional/advices_on_private_methods_spec.rb +21 -0
  26. data/spec/functional/aspect_on_eigen_class_spec.rb +66 -0
  27. data/spec/functional/aspect_on_object_spec.rb +20 -0
  28. data/spec/{aspector_spec.rb → functional/aspector_spec.rb} +13 -57
  29. data/spec/functional/aspects_combined_spec.rb +42 -0
  30. data/spec/functional/execution_order_spec.rb +36 -0
  31. data/spec/spec_helper.rb +16 -1
  32. data/spec/unit/advice_spec.rb +4 -0
  33. data/spec/{aspector → unit}/after_spec.rb +42 -38
  34. data/spec/{aspector → unit}/around_spec.rb +22 -18
  35. data/spec/unit/base_class_methods_spec.rb +28 -0
  36. data/spec/unit/base_spec.rb +81 -0
  37. data/spec/{aspector → unit}/before_spec.rb +27 -18
  38. data/spec/unit/deferred_logic_spec.rb +23 -0
  39. data/spec/unit/method_matcher_spec.rb +43 -0
  40. metadata +63 -69
  41. data/spec/advices_on_private_methods_spec.rb +0 -29
  42. data/spec/aspect_on_eigen_class_spec.rb +0 -86
  43. data/spec/aspect_on_object_spec.rb +0 -32
  44. data/spec/aspector/aspect_spec.rb +0 -86
  45. data/spec/aspector/base_spec.rb +0 -35
  46. data/spec/aspects_combined_spec.rb +0 -55
  47. data/spec/execution_order_spec.rb +0 -62
@@ -0,0 +1,81 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe "Aspector::Base" do
4
+ it "default options" do
5
+ aspect = Aspector do
6
+ default :test => 'value'
7
+ end
8
+
9
+ aspect.default_options[:test].should == 'value'
10
+ end
11
+
12
+ it "#options is used to access options set when aspect is applied" do
13
+ klass = create_test_class
14
+
15
+ aspect = Aspector do
16
+ before options[:methods] do
17
+ value << "do_this"
18
+ end
19
+ end
20
+
21
+ aspect.apply(klass, :methods => :test)
22
+
23
+ obj = klass.new
24
+ obj.test
25
+ obj.value.should == %w"do_this test"
26
+ end
27
+
28
+ it "#apply" do
29
+ klass = create_test_class
30
+
31
+ aspect = Aspector do
32
+ before :test do value << "do_before" end
33
+ end
34
+
35
+ aspect.apply(klass)
36
+
37
+ obj = klass.new
38
+ obj.test
39
+ obj.value.should == %w"do_before test"
40
+ end
41
+
42
+ it "use #target to add method to target class/module" do
43
+ klass = create_test_class
44
+
45
+ aspector(klass) do
46
+ target do
47
+ def do_this
48
+ value << "do_this"
49
+ end
50
+ end
51
+
52
+ before :test, :do_this
53
+ end
54
+
55
+ obj = klass.new
56
+ obj.test
57
+ obj.value.should == %w"do_this test"
58
+ end
59
+
60
+ it "#target takes aspect as argument" do
61
+ klass = create_test_class
62
+
63
+ class TargetArgumentTestAspect < Aspector::Base
64
+ target do |aspect|
65
+ define_method :do_this do
66
+ value << "do_this(#{aspect.class})"
67
+ end
68
+ end
69
+
70
+ before :test, :do_this
71
+ end
72
+
73
+ TargetArgumentTestAspect.apply(klass)
74
+
75
+ obj = klass.new
76
+ obj.test
77
+ obj.value.should == %w"do_this(TargetArgumentTestAspect) test"
78
+ end
79
+
80
+ end
81
+
@@ -2,15 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
3
  describe "Before advices" do
4
4
  it "should work" do
5
- klass = Class.new do
6
- def value
7
- @value ||= []
8
- end
9
-
10
- def test
11
- value << "test"
12
- end
13
-
5
+ klass = create_test_class do
14
6
  def do_this
15
7
  value << "do_this"
16
8
  end
@@ -26,15 +18,7 @@ describe "Before advices" do
26
18
  end
27
19
 
28
20
  it "logic in block" do
29
- klass = Class.new do
30
- def value
31
- @value ||= []
32
- end
33
-
34
- def test
35
- value << "test"
36
- end
37
- end
21
+ klass = create_test_class
38
22
 
39
23
  aspector(klass) do
40
24
  before(:test){ value << 'do_block' }
@@ -69,4 +53,29 @@ describe "Before advices" do
69
53
  obj.value.should == %w"do_this test"
70
54
  end
71
55
 
56
+ it "method_name_arg" do
57
+ klass = Class.new do
58
+ aspector do
59
+ before :test, :do_this, :method_name_arg => true
60
+ end
61
+
62
+ def value
63
+ @value ||= []
64
+ end
65
+
66
+ def test
67
+ value << "test"
68
+ end
69
+
70
+ def do_this method
71
+ value << "do_this(#{method})"
72
+ end
73
+ end
74
+
75
+ obj = klass.new
76
+ obj.test
77
+ obj.value.should == %w"do_this(test) test"
78
+ end
79
+
72
80
  end
81
+
@@ -0,0 +1,23 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ module Aspector
4
+ describe DeferredLogic do
5
+ it "should work with block" do
6
+ klass = Class.new do
7
+ def self.test; 'test'; end
8
+ end
9
+
10
+ logic = DeferredLogic.new(lambda{ test })
11
+
12
+ logic.apply(klass).should == 'test'
13
+ end
14
+
15
+ it "block can take an argument" do
16
+ logic = DeferredLogic.new(lambda{|arg| arg })
17
+
18
+ logic.apply(Class.new, 'test').should == 'test'
19
+ end
20
+
21
+ end
22
+ end
23
+
@@ -0,0 +1,43 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ module Aspector
4
+ describe MethodMatcher do
5
+ it "should match String" do
6
+ MethodMatcher.new('test').match?('test').should_not be_nil
7
+ end
8
+
9
+ it "should match regular expression" do
10
+ MethodMatcher.new(/test/).match?('test').should_not be_nil
11
+ end
12
+
13
+ it "should return true if any item matches" do
14
+ MethodMatcher.new('test1', 'test2').match?('test2').should_not be_nil
15
+ end
16
+
17
+ it "should return nil if none matches" do
18
+ MethodMatcher.new('test1', 'test2').match?('test3').should be_nil
19
+ end
20
+
21
+ it "deferred logic" do
22
+ logic = DeferredLogic.new ""
23
+ matcher = MethodMatcher.new(logic)
24
+
25
+ aspect = mock(Aspector::Base)
26
+ aspect.should_receive(:deferred_logic_results).with(logic).once.and_return(/test/)
27
+
28
+ matcher.match?('test', aspect).should_not be_nil
29
+ end
30
+
31
+ it "deferred option" do
32
+ option = DeferredOption.new[:methods]
33
+ matcher = MethodMatcher.new(option)
34
+
35
+ aspect = mock(Aspector::Base)
36
+ aspect.should_receive(:options).once.and_return({:methods => /test/})
37
+
38
+ matcher.match?('test', aspect).should_not be_nil
39
+ end
40
+
41
+ end
42
+ end
43
+
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aspector
3
3
  version: !ruby/object:Gem::Version
4
- hash: 3
4
+ hash: 1
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 7
9
- - 0
10
- version: 0.7.0
9
+ - 1
10
+ version: 0.7.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Guoliang Cao
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-12-09 00:00:00 -05:00
18
+ date: 2012-02-09 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -34,43 +34,11 @@ dependencies:
34
34
  - 0
35
35
  version: 2.3.0
36
36
  requirement: *id001
37
- - !ruby/object:Gem::Dependency
38
- prerelease: false
39
- name: mocha
40
- type: :development
41
- version_requirements: &id002 !ruby/object:Gem::Requirement
42
- none: false
43
- requirements:
44
- - - ~>
45
- - !ruby/object:Gem::Version
46
- hash: 55
47
- segments:
48
- - 0
49
- - 10
50
- - 0
51
- version: 0.10.0
52
- requirement: *id002
53
- - !ruby/object:Gem::Dependency
54
- prerelease: false
55
- name: bundler
56
- type: :development
57
- version_requirements: &id003 !ruby/object:Gem::Requirement
58
- none: false
59
- requirements:
60
- - - ~>
61
- - !ruby/object:Gem::Version
62
- hash: 23
63
- segments:
64
- - 1
65
- - 0
66
- - 0
67
- version: 1.0.0
68
- requirement: *id003
69
37
  - !ruby/object:Gem::Dependency
70
38
  prerelease: false
71
39
  name: jeweler
72
40
  type: :development
73
- version_requirements: &id004 !ruby/object:Gem::Requirement
41
+ version_requirements: &id002 !ruby/object:Gem::Requirement
74
42
  none: false
75
43
  requirements:
76
44
  - - ~>
@@ -81,12 +49,12 @@ dependencies:
81
49
  - 6
82
50
  - 4
83
51
  version: 1.6.4
84
- requirement: *id004
52
+ requirement: *id002
85
53
  - !ruby/object:Gem::Dependency
86
54
  prerelease: false
87
55
  name: rcov
88
56
  type: :development
89
- version_requirements: &id005 !ruby/object:Gem::Requirement
57
+ version_requirements: &id003 !ruby/object:Gem::Requirement
90
58
  none: false
91
59
  requirements:
92
60
  - - ">="
@@ -95,12 +63,12 @@ dependencies:
95
63
  segments:
96
64
  - 0
97
65
  version: "0"
98
- requirement: *id005
66
+ requirement: *id003
99
67
  - !ruby/object:Gem::Dependency
100
68
  prerelease: false
101
69
  name: reek
102
70
  type: :development
103
- version_requirements: &id006 !ruby/object:Gem::Requirement
71
+ version_requirements: &id004 !ruby/object:Gem::Requirement
104
72
  none: false
105
73
  requirements:
106
74
  - - ~>
@@ -111,12 +79,12 @@ dependencies:
111
79
  - 2
112
80
  - 8
113
81
  version: 1.2.8
114
- requirement: *id006
82
+ requirement: *id004
115
83
  - !ruby/object:Gem::Dependency
116
84
  prerelease: false
117
85
  name: roodi
118
86
  type: :development
119
- version_requirements: &id007 !ruby/object:Gem::Requirement
87
+ version_requirements: &id005 !ruby/object:Gem::Requirement
120
88
  none: false
121
89
  requirements:
122
90
  - - ~>
@@ -127,12 +95,26 @@ dependencies:
127
95
  - 1
128
96
  - 0
129
97
  version: 2.1.0
130
- requirement: *id007
98
+ requirement: *id005
99
+ - !ruby/object:Gem::Dependency
100
+ prerelease: false
101
+ name: ruby-prof
102
+ type: :development
103
+ version_requirements: &id006 !ruby/object:Gem::Requirement
104
+ none: false
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ hash: 3
109
+ segments:
110
+ - 0
111
+ version: "0"
112
+ requirement: *id006
131
113
  - !ruby/object:Gem::Dependency
132
114
  prerelease: false
133
115
  name: guard
134
116
  type: :development
135
- version_requirements: &id008 !ruby/object:Gem::Requirement
117
+ version_requirements: &id007 !ruby/object:Gem::Requirement
136
118
  none: false
137
119
  requirements:
138
120
  - - ~>
@@ -143,12 +125,12 @@ dependencies:
143
125
  - 8
144
126
  - 4
145
127
  version: 0.8.4
146
- requirement: *id008
128
+ requirement: *id007
147
129
  - !ruby/object:Gem::Dependency
148
130
  prerelease: false
149
131
  name: guard-bundler
150
132
  type: :development
151
- version_requirements: &id009 !ruby/object:Gem::Requirement
133
+ version_requirements: &id008 !ruby/object:Gem::Requirement
152
134
  none: false
153
135
  requirements:
154
136
  - - ~>
@@ -159,12 +141,12 @@ dependencies:
159
141
  - 1
160
142
  - 3
161
143
  version: 0.1.3
162
- requirement: *id009
144
+ requirement: *id008
163
145
  - !ruby/object:Gem::Dependency
164
146
  prerelease: false
165
147
  name: guard-rspec
166
148
  type: :development
167
- version_requirements: &id010 !ruby/object:Gem::Requirement
149
+ version_requirements: &id009 !ruby/object:Gem::Requirement
168
150
  none: false
169
151
  requirements:
170
152
  - - ~>
@@ -175,12 +157,12 @@ dependencies:
175
157
  - 5
176
158
  - 2
177
159
  version: 0.5.2
178
- requirement: *id010
160
+ requirement: *id009
179
161
  - !ruby/object:Gem::Dependency
180
162
  prerelease: false
181
163
  name: guard-shell
182
164
  type: :development
183
- version_requirements: &id011 !ruby/object:Gem::Requirement
165
+ version_requirements: &id010 !ruby/object:Gem::Requirement
184
166
  none: false
185
167
  requirements:
186
168
  - - ~>
@@ -191,12 +173,12 @@ dependencies:
191
173
  - 1
192
174
  - 1
193
175
  version: 0.1.1
194
- requirement: *id011
176
+ requirement: *id010
195
177
  - !ruby/object:Gem::Dependency
196
178
  prerelease: false
197
179
  name: rb-fsevent
198
180
  type: :development
199
- version_requirements: &id012 !ruby/object:Gem::Requirement
181
+ version_requirements: &id011 !ruby/object:Gem::Requirement
200
182
  none: false
201
183
  requirements:
202
184
  - - ~>
@@ -208,12 +190,12 @@ dependencies:
208
190
  - 3
209
191
  - 1
210
192
  version: 0.4.3.1
211
- requirement: *id012
193
+ requirement: *id011
212
194
  - !ruby/object:Gem::Dependency
213
195
  prerelease: false
214
196
  name: growl
215
197
  type: :development
216
- version_requirements: &id013 !ruby/object:Gem::Requirement
198
+ version_requirements: &id012 !ruby/object:Gem::Requirement
217
199
  none: false
218
200
  requirements:
219
201
  - - ~>
@@ -224,12 +206,12 @@ dependencies:
224
206
  - 0
225
207
  - 3
226
208
  version: 1.0.3
227
- requirement: *id013
209
+ requirement: *id012
228
210
  - !ruby/object:Gem::Dependency
229
211
  prerelease: false
230
212
  name: awesome_print
231
213
  type: :development
232
- version_requirements: &id014 !ruby/object:Gem::Requirement
214
+ version_requirements: &id013 !ruby/object:Gem::Requirement
233
215
  none: false
234
216
  requirements:
235
217
  - - ">="
@@ -238,7 +220,7 @@ dependencies:
238
220
  segments:
239
221
  - 0
240
222
  version: "0"
241
- requirement: *id014
223
+ requirement: *id013
242
224
  description: ""
243
225
  email: gcao99@gmail.com
244
226
  executables: []
@@ -266,6 +248,9 @@ files:
266
248
  - examples/aspector_apply_example.rb
267
249
  - examples/aspector_example.rb
268
250
  - examples/cache_aspect.rb
251
+ - examples/exception_handler.rb
252
+ - examples/logging_aspect.rb
253
+ - examples/retry_aspect.rb
269
254
  - lib/aspector.rb
270
255
  - lib/aspector/advice.rb
271
256
  - lib/aspector/advice_metadata.rb
@@ -279,18 +264,27 @@ files:
279
264
  - lib/aspector/module_extension.rb
280
265
  - lib/aspector/object_extension.rb
281
266
  - lib/aspector/return_this.rb
282
- - spec/advices_on_private_methods_spec.rb
283
- - spec/aspect_on_eigen_class_spec.rb
284
- - spec/aspect_on_object_spec.rb
285
- - spec/aspector/after_spec.rb
286
- - spec/aspector/around_spec.rb
287
- - spec/aspector/aspect_spec.rb
288
- - spec/aspector/base_spec.rb
289
- - spec/aspector/before_spec.rb
290
- - spec/aspector_spec.rb
291
- - spec/aspects_combined_spec.rb
292
- - spec/execution_order_spec.rb
267
+ - performance-tests/after_test.rb
268
+ - performance-tests/around_test.rb
269
+ - performance-tests/before_test.rb
270
+ - performance-tests/combined_test.rb
271
+ - performance-tests/method_invocation_test.rb
272
+ - performance-tests/test_helper.rb
273
+ - spec/functional/advices_on_private_methods_spec.rb
274
+ - spec/functional/aspect_on_eigen_class_spec.rb
275
+ - spec/functional/aspect_on_object_spec.rb
276
+ - spec/functional/aspector_spec.rb
277
+ - spec/functional/aspects_combined_spec.rb
278
+ - spec/functional/execution_order_spec.rb
293
279
  - spec/spec_helper.rb
280
+ - spec/unit/advice_spec.rb
281
+ - spec/unit/after_spec.rb
282
+ - spec/unit/around_spec.rb
283
+ - spec/unit/base_class_methods_spec.rb
284
+ - spec/unit/base_spec.rb
285
+ - spec/unit/before_spec.rb
286
+ - spec/unit/deferred_logic_spec.rb
287
+ - spec/unit/method_matcher_spec.rb
294
288
  has_rdoc: true
295
289
  homepage: http://github.com/gcao/aspector
296
290
  licenses:
@@ -1,29 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- describe "Advices on private methods" do
4
- it "should work" do
5
- klass = Class.new do
6
- def value
7
- @value ||= []
8
- end
9
-
10
- private
11
-
12
- def test
13
- value << "test"
14
- end
15
-
16
- def do_before
17
- value << "do_before"
18
- end
19
- end
20
-
21
- aspector(klass, :private_methods => true) do
22
- before :test, :do_before
23
- end
24
-
25
- obj = klass.new
26
- obj.send :test
27
- obj.value.should == %w"do_before test"
28
- end
29
- end
@@ -1,86 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- describe "Aspector for eigen class" do
4
- it "should work" do
5
- klass = Class.new do
6
- class << self
7
- def value
8
- @value ||= []
9
- end
10
-
11
- def test
12
- value << "test"
13
- end
14
-
15
- def do_before
16
- value << "do_before"
17
- end
18
-
19
- def do_after result
20
- value << "do_after"
21
- result
22
- end
23
-
24
- def do_around &block
25
- value << "do_around_before"
26
- result = block.call
27
- value << "do_around_after"
28
- result
29
- end
30
- end
31
- end
32
-
33
- aspector(klass, :eigen_class => true) do
34
- before :test, :do_before
35
- after :test, :do_after
36
- around :test, :do_around
37
- end
38
-
39
- klass.test
40
- klass.value.should == %w"do_before do_around_before test do_around_after do_after"
41
- end
42
-
43
- it "new methods" do
44
- klass = Class.new do
45
- class << self
46
- def value
47
- @value ||= []
48
- end
49
-
50
- def do_before
51
- value << "do_before"
52
- end
53
-
54
- def do_after result
55
- value << "do_after"
56
- result
57
- end
58
-
59
- def do_around &block
60
- value << "do_around_before"
61
- result = block.call
62
- value << "do_around_after"
63
- result
64
- end
65
- end
66
- end
67
-
68
- aspector(klass, :eigen_class => true) do
69
- before :test, :do_before
70
- after :test, :do_after
71
- around :test, :do_around
72
- end
73
-
74
- klass.class_eval do
75
- class << self
76
- def test
77
- value << "test"
78
- end
79
- end
80
- end
81
-
82
- klass.test
83
- klass.value.should == %w"do_before do_around_before test do_around_after do_after"
84
- end
85
-
86
- end
@@ -1,32 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- describe "Aspector for object" do
4
- it "should work" do
5
- klass = Class.new do
6
- def value
7
- @value ||= []
8
- end
9
-
10
- def test
11
- value << "test"
12
- end
13
-
14
- def do_before
15
- value << "do_before"
16
- end
17
- end
18
-
19
- obj = klass.new
20
-
21
- aspector(obj) do
22
- before :test, :do_before
23
- end
24
-
25
- obj.test
26
- obj.value.should == %w"do_before test"
27
-
28
- obj2 = klass.new
29
- obj2.test
30
- obj2.value.should == %w"test"
31
- end
32
- end