aspector 0.7.0 → 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 (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