aspector 0.12.2 → 0.12.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +13 -0
- data/Gemfile +2 -2
- data/Gemfile.lock +18 -11
- data/README.rdoc +13 -0
- data/VERSION +1 -1
- data/aspector.gemspec +5 -2
- data/examples/design_by_contract.rb +71 -0
- data/examples/implicit_method_option_test.rb +0 -1
- data/lib/aspector.rb +1 -0
- data/lib/aspector/base.rb +70 -66
- data/lib/aspector/base_class_methods.rb +17 -9
- data/lib/aspector/logger.rb +18 -61
- data/lib/aspector/logging.rb +38 -0
- data/lib/aspector/module_extension.rb +4 -2
- data/spec/spec_helper.rb +1 -0
- metadata +6 -3
data/.travis.yml
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
language: ruby
|
2
|
+
rvm:
|
3
|
+
- 1.8.7
|
4
|
+
- 1.9.2
|
5
|
+
- 1.9.3
|
6
|
+
- jruby-18mode # JRuby in 1.8 mode
|
7
|
+
- jruby-19mode # JRuby in 1.9 mode
|
8
|
+
#- rbx-18mode
|
9
|
+
#- rbx-19mode
|
10
|
+
# uncomment this line if your project needs to run something other than `rake`:
|
11
|
+
script: bundle exec rspec spec
|
12
|
+
#gemfile: Gemfile.travis
|
13
|
+
|
data/Gemfile
CHANGED
@@ -4,13 +4,13 @@ group :development do
|
|
4
4
|
gem "rspec"
|
5
5
|
gem "jeweler", "~> 1.6.4"
|
6
6
|
|
7
|
-
gem 'ruby-prof'
|
7
|
+
gem 'ruby-prof', :platforms => [:mri]
|
8
8
|
|
9
9
|
gem "guard", "~> 0.8.4"
|
10
10
|
gem "guard-bundler", "~> 0.1.3"
|
11
11
|
gem "guard-rspec", "~> 0.5.2"
|
12
12
|
gem "guard-shell", "~> 0.1.1"
|
13
|
-
gem 'rb-fsevent', "~> 0.4.3.1"
|
13
|
+
gem 'rb-fsevent', "~> 0.4.3.1", :platforms => [:mri]
|
14
14
|
gem 'growl', "~> 1.0.3"
|
15
15
|
|
16
16
|
gem 'awesome_print'
|
data/Gemfile.lock
CHANGED
@@ -2,7 +2,7 @@ GEM
|
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
4
|
awesome_print (1.0.2)
|
5
|
-
coderay (1.0.
|
5
|
+
coderay (1.0.7)
|
6
6
|
diff-lcs (1.1.3)
|
7
7
|
git (1.2.5)
|
8
8
|
growl (1.0.3)
|
@@ -20,25 +20,32 @@ GEM
|
|
20
20
|
git (>= 1.2.5)
|
21
21
|
rake
|
22
22
|
method_source (0.7.1)
|
23
|
-
pry (0.9.
|
23
|
+
pry (0.9.9.6)
|
24
24
|
coderay (~> 1.0.5)
|
25
25
|
method_source (~> 0.7.1)
|
26
26
|
slop (>= 2.4.4, < 3)
|
27
|
+
pry (0.9.9.6-java)
|
28
|
+
coderay (~> 1.0.5)
|
29
|
+
method_source (~> 0.7.1)
|
30
|
+
slop (>= 2.4.4, < 3)
|
31
|
+
spoon (~> 0.0)
|
27
32
|
rake (0.9.2.2)
|
28
33
|
rb-fsevent (0.4.3.1)
|
29
|
-
rspec (2.
|
30
|
-
rspec-core (~> 2.
|
31
|
-
rspec-expectations (~> 2.
|
32
|
-
rspec-mocks (~> 2.
|
33
|
-
rspec-core (2.
|
34
|
-
rspec-expectations (2.
|
35
|
-
diff-lcs (~> 1.1.
|
36
|
-
rspec-mocks (2.
|
37
|
-
ruby-prof (0.
|
34
|
+
rspec (2.10.0)
|
35
|
+
rspec-core (~> 2.10.0)
|
36
|
+
rspec-expectations (~> 2.10.0)
|
37
|
+
rspec-mocks (~> 2.10.0)
|
38
|
+
rspec-core (2.10.1)
|
39
|
+
rspec-expectations (2.10.0)
|
40
|
+
diff-lcs (~> 1.1.3)
|
41
|
+
rspec-mocks (2.10.1)
|
42
|
+
ruby-prof (0.11.2)
|
38
43
|
slop (2.4.4)
|
44
|
+
spoon (0.0.1)
|
39
45
|
thor (0.14.6)
|
40
46
|
|
41
47
|
PLATFORMS
|
48
|
+
java
|
42
49
|
ruby
|
43
50
|
|
44
51
|
DEPENDENCIES
|
data/README.rdoc
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
= aspector
|
2
|
+
{<img src="https://secure.travis-ci.org/gcao/aspector.png" />}[http://travis-ci.org/gcao/aspector]
|
2
3
|
|
3
4
|
aspector = ASPECT Oriented Ruby programming
|
4
5
|
|
@@ -50,6 +51,18 @@ gem install aspector
|
|
50
51
|
# do_that
|
51
52
|
# test
|
52
53
|
|
54
|
+
== Notes
|
55
|
+
To use a different logger, e.g. Logem::Logger, run below command
|
56
|
+
|
57
|
+
ASPECTOR_LOGGER=Logem::Logger LOGEM_LOG_LEVEL=trace ruby -rlogem examples/cache_aspect.rb
|
58
|
+
|
59
|
+
Explanation:
|
60
|
+
ASPECTOR_LOGGER=Logem::Logger => set logger to Logem::Logger class
|
61
|
+
LOGEM_LOG_LEVEL=trace => set logem log level to trace
|
62
|
+
-rlogem => require logem otherwise it might not be available
|
63
|
+
when the logger is initialized. This could be handled by
|
64
|
+
bundler etc though.
|
65
|
+
|
53
66
|
== Contributing to aspector
|
54
67
|
|
55
68
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.12.
|
1
|
+
0.12.3
|
data/aspector.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "aspector"
|
8
|
-
s.version = "0.12.
|
8
|
+
s.version = "0.12.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Guoliang Cao"]
|
12
|
-
s.date = "2012-
|
12
|
+
s.date = "2012-10-09"
|
13
13
|
s.description = ""
|
14
14
|
s.email = "gcao99@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -21,6 +21,7 @@ Gem::Specification.new do |s|
|
|
21
21
|
".irbrc",
|
22
22
|
".rspec",
|
23
23
|
".rvmrc",
|
24
|
+
".travis.yml",
|
24
25
|
"Gemfile",
|
25
26
|
"Gemfile.lock",
|
26
27
|
"Guardfile",
|
@@ -34,6 +35,7 @@ Gem::Specification.new do |s|
|
|
34
35
|
"examples/aspector_apply_example.rb",
|
35
36
|
"examples/aspector_example.rb",
|
36
37
|
"examples/cache_aspect.rb",
|
38
|
+
"examples/design_by_contract.rb",
|
37
39
|
"examples/exception_handler.rb",
|
38
40
|
"examples/implicit_method_option_test.rb",
|
39
41
|
"examples/logging_aspect.rb",
|
@@ -47,6 +49,7 @@ Gem::Specification.new do |s|
|
|
47
49
|
"lib/aspector/deferred_logic.rb",
|
48
50
|
"lib/aspector/deferred_option.rb",
|
49
51
|
"lib/aspector/logger.rb",
|
52
|
+
"lib/aspector/logging.rb",
|
50
53
|
"lib/aspector/method_matcher.rb",
|
51
54
|
"lib/aspector/module_extension.rb",
|
52
55
|
"lib/aspector/object_extension.rb",
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# Design by contract example
|
2
|
+
|
3
|
+
class A
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@transactions = []
|
7
|
+
@total = 0
|
8
|
+
end
|
9
|
+
|
10
|
+
def buy price
|
11
|
+
@transactions << price
|
12
|
+
@total += price
|
13
|
+
end
|
14
|
+
|
15
|
+
def sell price
|
16
|
+
@transactions << price # Wrong
|
17
|
+
@total -= price
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
##############################
|
23
|
+
|
24
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
25
|
+
|
26
|
+
require 'aspector'
|
27
|
+
|
28
|
+
class Object
|
29
|
+
def assert bool, message = 'Assertion failure'
|
30
|
+
unless bool
|
31
|
+
$stderr.puts message
|
32
|
+
$stderr.puts caller
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class ContractExample < Aspector::Base
|
38
|
+
|
39
|
+
before do |price, &block|
|
40
|
+
assert price > 0, "Price is #{price}, should be greater than 0"
|
41
|
+
end
|
42
|
+
|
43
|
+
after :result_arg => false do |*_, &block|
|
44
|
+
sum = @transactions.reduce(&:+)
|
45
|
+
assert @total == sum, "Total(#{@total}) and sum of transactions(#{sum}) do not match"
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
##############################
|
51
|
+
|
52
|
+
ContractExample.apply A, :methods => %w[buy sell]
|
53
|
+
|
54
|
+
a = A.new
|
55
|
+
a.buy 10
|
56
|
+
a.sell 10
|
57
|
+
a.sell -10
|
58
|
+
|
59
|
+
##############################
|
60
|
+
|
61
|
+
class A
|
62
|
+
include DesignByContract
|
63
|
+
|
64
|
+
precond { |price| assert price < 0, "Price is less than 0" }
|
65
|
+
postcond { }
|
66
|
+
# invariant block will be executed before and after the method
|
67
|
+
invariant { assert @total != @transactions.reduce(&:sum), "Total and sum of transactions do not equal" }
|
68
|
+
def buy price
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
data/lib/aspector.rb
CHANGED
data/lib/aspector/base.rb
CHANGED
@@ -64,7 +64,11 @@ module Aspector
|
|
64
64
|
end
|
65
65
|
|
66
66
|
def aop_logger
|
67
|
-
@aop_logger
|
67
|
+
return @aop_logger if @aop_logger
|
68
|
+
|
69
|
+
@aop_logger = Logging.get_logger(self)
|
70
|
+
@aop_logger.level = self.class.logger.level
|
71
|
+
@aop_logger
|
68
72
|
end
|
69
73
|
alias logger aop_logger
|
70
74
|
|
@@ -120,7 +124,7 @@ module Aspector
|
|
120
124
|
advices = aop_filter_advices advices, method
|
121
125
|
return if advices.empty?
|
122
126
|
|
123
|
-
aop_logger.log
|
127
|
+
aop_logger.log Logging::DEBUG, 'apply-to-method', method
|
124
128
|
before_apply_to_method method, advices
|
125
129
|
|
126
130
|
scope ||=
|
@@ -255,7 +259,7 @@ module Aspector
|
|
255
259
|
rescue
|
256
260
|
# ignore undefined method error
|
257
261
|
if @aop_options[:old_methods_only]
|
258
|
-
aop_logger.log
|
262
|
+
aop_logger.log Logging::WARN, 'method-not-found', method
|
259
263
|
end
|
260
264
|
|
261
265
|
return
|
@@ -281,7 +285,7 @@ module Aspector
|
|
281
285
|
aspect = self
|
282
286
|
|
283
287
|
code = METHOD_TEMPLATE.result(binding)
|
284
|
-
aspect.aop_logger.log
|
288
|
+
aspect.aop_logger.log Logging::DEBUG, 'generate-code', method, code
|
285
289
|
@aop_context.class_eval code, __FILE__, __LINE__ + 4
|
286
290
|
end
|
287
291
|
|
@@ -293,116 +297,116 @@ module Aspector
|
|
293
297
|
% end
|
294
298
|
|
295
299
|
define_method :<%= method %> do |*args, &block|
|
296
|
-
% if aop_logger.visible?(
|
297
|
-
aspect.aop_logger.
|
300
|
+
% if aop_logger.visible?(Logging::TRACE)
|
301
|
+
aspect.aop_logger.log <%= Logging::TRACE %>, '<%= method %>', 'enter-generated-method'
|
298
302
|
% end
|
299
303
|
|
300
304
|
if aspect.aop_disabled?
|
301
|
-
% if aop_logger.visible?(
|
302
|
-
aspect.aop_logger.
|
305
|
+
% if aop_logger.visible?(Logging::TRACE)
|
306
|
+
aspect.aop_logger.log <%= Logging::TRACE %>, '<%= method %>', 'exit--generated-method'
|
303
307
|
% end
|
304
308
|
return orig_method.bind(self).call(*args, &block)
|
305
309
|
end
|
306
310
|
|
307
311
|
% if is_outermost
|
308
|
-
|
312
|
+
result = catch(:aop_returns) do
|
309
313
|
% end
|
310
314
|
|
311
315
|
% unless before_advices.empty?
|
312
|
-
|
316
|
+
# Before advices
|
313
317
|
% end
|
314
318
|
% before_advices.each do |advice|
|
315
|
-
% if aop_logger.visible?(
|
316
|
-
|
319
|
+
% if aop_logger.visible?(Logging::TRACE)
|
320
|
+
aspect.aop_logger.log <%= Logging::TRACE %>, '<%= method %>', 'before-invoke-advice', '<advice <%= advice.index %>>'
|
317
321
|
% end
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
% if aop_logger.visible?(
|
323
|
-
|
322
|
+
result = <%= advice.with_method %> <%
|
323
|
+
if advice.options[:aspect_arg] %>aspect, <% end %><%
|
324
|
+
if advice.options[:method_arg] %>'<%= method %>', <% end
|
325
|
+
%>*args
|
326
|
+
% if aop_logger.visible?(Logging::TRACE)
|
327
|
+
aspect.aop_logger.log <%= Logging::TRACE %>, '<%= method %>', 'after--invoke-advice', '<advice <%= advice.index %>>'
|
324
328
|
% end
|
325
329
|
% if advice.options[:skip_if_false]
|
326
|
-
|
327
|
-
% if aop_logger.visible?(
|
328
|
-
|
330
|
+
unless result
|
331
|
+
% if aop_logger.visible?(Logging::TRACE)
|
332
|
+
aspect.aop_logger.log <%= Logging::TRACE %>, '<%= method %>', 'exit-method-due-to-before-filter', '<advice <%= advice.index %>>'
|
329
333
|
% end
|
330
|
-
|
334
|
+
return
|
331
335
|
end
|
332
336
|
% end
|
333
337
|
% end
|
334
338
|
|
335
339
|
% if around_advice
|
336
|
-
|
337
|
-
% if aop_logger.visible?(
|
338
|
-
|
340
|
+
# Around advice
|
341
|
+
% if aop_logger.visible?(Logging::TRACE)
|
342
|
+
aspect.aop_logger.log <%= Logging::TRACE %>, '<%= method %>', 'before-invoke-advice', '<advice <%= around_advice.index %>>'
|
339
343
|
% end
|
340
|
-
% if aop_logger.visible?(
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
344
|
+
% if aop_logger.visible?(Logging::TRACE)
|
345
|
+
proxy = lambda do |*args, &block|
|
346
|
+
aspect.aop_logger.log <%= Logging::TRACE %>, '<%= method %>', 'before-invoke-proxy'
|
347
|
+
res = wrapped_method.bind(self).call *args, &block
|
348
|
+
aspect.aop_logger.log <%= Logging::TRACE %>, '<%= method %>', 'after--invoke-proxy'
|
349
|
+
res
|
350
|
+
end
|
351
|
+
result = <%= around_advice.with_method %> <%
|
352
|
+
if around_advice.options[:aspect_arg] %>aspect, <% end %><%
|
353
|
+
if around_advice.options[:method_arg] %>'<%= method %>', <% end
|
354
|
+
%>proxy, *args, &block
|
351
355
|
% else
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
+
result = <%= around_advice.with_method %> <%
|
357
|
+
if around_advice.options[:aspect_arg] %>aspect, <% end %><%
|
358
|
+
if around_advice.options[:method_arg] %>'<%= method %>', <% end
|
359
|
+
%>wrapped_method.bind(self), *args, &block
|
356
360
|
% end
|
357
|
-
% if aop_logger.visible?(
|
358
|
-
|
361
|
+
% if aop_logger.visible?(Logging::TRACE)
|
362
|
+
aspect.aop_logger.log <%= Logging::TRACE %>, '<%= method %>', 'after--invoke-advice', '<advice <%= around_advice.index %>>'
|
359
363
|
% end
|
360
364
|
|
361
365
|
% else
|
362
366
|
|
363
|
-
|
364
|
-
% if aop_logger.visible?(
|
365
|
-
|
367
|
+
# Invoke original method
|
368
|
+
% if aop_logger.visible?(Logging::TRACE)
|
369
|
+
aspect.aop_logger.log <%= Logging::TRACE %>, '<%= method %>', 'before-wrapped-method'
|
366
370
|
% end
|
367
|
-
|
368
|
-
% if aop_logger.visible?(
|
369
|
-
|
371
|
+
result = orig_method.bind(self).call *args, &block
|
372
|
+
% if aop_logger.visible?(Logging::TRACE)
|
373
|
+
aspect.aop_logger.log <%= Logging::TRACE %>, '<%= method %>', 'after--wrapped-method'
|
370
374
|
% end
|
371
375
|
|
372
376
|
% end
|
373
377
|
|
374
378
|
% unless after_advices.empty?
|
375
|
-
|
379
|
+
# After advices
|
376
380
|
% after_advices.each do |advice|
|
377
|
-
% if aop_logger.visible?(
|
378
|
-
|
381
|
+
% if aop_logger.visible?(Logging::TRACE)
|
382
|
+
aspect.aop_logger.log <%= Logging::TRACE %>, '<%= method %>', 'before-invoke-advice', '<advice <%= advice.index %>>'
|
379
383
|
% end
|
380
384
|
% if advice.options[:result_arg]
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
385
|
+
result = <%= advice.with_method %> <%
|
386
|
+
if advice.options[:aspect_arg] %>aspect, <% end %><%
|
387
|
+
if advice.options[:method_arg] %>'<%= method %>', <% end %><%
|
388
|
+
if advice.options[:result_arg] %>result, <% end
|
389
|
+
%>*args
|
386
390
|
% else
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
+
<%= advice.with_method %> <%
|
392
|
+
if advice.options[:aspect_arg] %>aspect, <% end %><%
|
393
|
+
if advice.options[:method_arg] %>'<%= method %>', <% end
|
394
|
+
%>*args
|
391
395
|
% end
|
392
|
-
% if aop_logger.visible?(
|
393
|
-
|
396
|
+
% if aop_logger.visible?(Logging::TRACE)
|
397
|
+
aspect.aop_logger.log <%= Logging::TRACE %>, '<%= method %>', 'after--invoke-advice', '<advice <%= advice.index %>>'
|
394
398
|
% end
|
395
399
|
% end
|
396
400
|
% end
|
397
401
|
|
398
402
|
% if is_outermost
|
399
|
-
|
403
|
+
result
|
400
404
|
|
401
|
-
|
405
|
+
end # end of catch
|
402
406
|
% end
|
403
407
|
|
404
|
-
% if aop_logger.visible?(
|
405
|
-
aspect.aop_logger.
|
408
|
+
% if aop_logger.visible?(Logging::TRACE)
|
409
|
+
aspect.aop_logger.log <%= Logging::TRACE %>, '<%= method %>', 'exit--generated-method'
|
406
410
|
% end
|
407
411
|
result
|
408
412
|
end
|
@@ -4,7 +4,7 @@ module Aspector
|
|
4
4
|
::Aspector::Base.extend(self)
|
5
5
|
|
6
6
|
def aop_enable
|
7
|
-
aop_logger.log
|
7
|
+
aop_logger.log Logging::INFO, 'enable-aspect'
|
8
8
|
send :define_method, :aop_disabled? do
|
9
9
|
end
|
10
10
|
|
@@ -13,7 +13,7 @@ module Aspector
|
|
13
13
|
alias enable aop_enable
|
14
14
|
|
15
15
|
def aop_disable
|
16
|
-
aop_logger.log
|
16
|
+
aop_logger.log Logging::INFO, 'disable-aspect'
|
17
17
|
send :define_method, :aop_disabled? do
|
18
18
|
true
|
19
19
|
end
|
@@ -22,11 +22,19 @@ module Aspector
|
|
22
22
|
end
|
23
23
|
alias disable aop_disable
|
24
24
|
|
25
|
+
# if ENV["ASPECTOR_LOGGER"] is set, use it
|
26
|
+
# else try to load logem and use Logem::Logger
|
27
|
+
# else use built in logger
|
25
28
|
def aop_logger
|
26
|
-
@aop_logger ||=
|
29
|
+
@aop_logger ||= Logging.get_logger(self)
|
27
30
|
end
|
28
31
|
alias logger aop_logger
|
29
32
|
|
33
|
+
def aop_logger= logger
|
34
|
+
@aop_logger = logger
|
35
|
+
end
|
36
|
+
alias logger= aop_logger=
|
37
|
+
|
30
38
|
def aop_advices
|
31
39
|
@aop_advices ||= []
|
32
40
|
end
|
@@ -42,7 +50,7 @@ module Aspector
|
|
42
50
|
|
43
51
|
targets = rest.unshift target
|
44
52
|
result = targets.map do |target|
|
45
|
-
aop_logger.log
|
53
|
+
aop_logger.log Logging::INFO, 'apply', target, options.inspect
|
46
54
|
aspect_instance = new(target, options)
|
47
55
|
aspect_instance.send :aop_apply
|
48
56
|
aspect_instance
|
@@ -64,7 +72,7 @@ module Aspector
|
|
64
72
|
def aop_before *methods, &block
|
65
73
|
aop_advices << advice = aop_create_advice(Aspector::AdviceMetadata::BEFORE, self, methods, &block)
|
66
74
|
advice.index = aop_advices.size
|
67
|
-
aop_logger.log
|
75
|
+
aop_logger.log Logging::INFO, 'define-advice', advice
|
68
76
|
advice
|
69
77
|
end
|
70
78
|
alias before aop_before
|
@@ -72,7 +80,7 @@ module Aspector
|
|
72
80
|
def aop_before_filter *methods, &block
|
73
81
|
aop_advices << advice = aop_create_advice(Aspector::AdviceMetadata::BEFORE_FILTER, self, methods, &block)
|
74
82
|
advice.index = aop_advices.size
|
75
|
-
aop_logger.log
|
83
|
+
aop_logger.log Logging::INFO, 'define-advice', advice
|
76
84
|
advice
|
77
85
|
end
|
78
86
|
alias before_filter aop_before_filter
|
@@ -80,7 +88,7 @@ module Aspector
|
|
80
88
|
def aop_after *methods, &block
|
81
89
|
aop_advices << advice = aop_create_advice(Aspector::AdviceMetadata::AFTER, self, methods, &block)
|
82
90
|
advice.index = aop_advices.size
|
83
|
-
aop_logger.log
|
91
|
+
aop_logger.log Logging::INFO, 'define-advice', advice
|
84
92
|
advice
|
85
93
|
end
|
86
94
|
alias after aop_after
|
@@ -88,7 +96,7 @@ module Aspector
|
|
88
96
|
def aop_around *methods, &block
|
89
97
|
aop_advices << advice = aop_create_advice(Aspector::AdviceMetadata::AROUND, self, methods, &block)
|
90
98
|
advice.index = aop_advices.size
|
91
|
-
aop_logger.log
|
99
|
+
aop_logger.log Logging::INFO, 'define-advice', advice
|
92
100
|
advice
|
93
101
|
end
|
94
102
|
alias around aop_around
|
@@ -96,7 +104,7 @@ module Aspector
|
|
96
104
|
def aop_raw *methods, &block
|
97
105
|
aop_advices << advice = aop_create_advice(Aspector::AdviceMetadata::RAW, self, methods, &block)
|
98
106
|
advice.index = aop_advices.size
|
99
|
-
aop_logger.log
|
107
|
+
aop_logger.log Logging::INFO, 'define-advice', advice
|
100
108
|
advice
|
101
109
|
end
|
102
110
|
alias raw aop_raw
|
data/lib/aspector/logger.rb
CHANGED
@@ -1,67 +1,23 @@
|
|
1
1
|
module Aspector
|
2
2
|
class Logger
|
3
|
-
# Log levels
|
4
|
-
ERROR = 50
|
5
|
-
WARN = 40
|
6
|
-
INFO = 30
|
7
|
-
DEBUG = 20
|
8
|
-
TRACE = 10
|
9
|
-
|
10
|
-
DEFAULT_VISIBLE_LEVEL = INFO
|
11
|
-
|
12
|
-
# Actions
|
13
|
-
DEFINE_ADVICE = ["define-advice" , INFO]
|
14
|
-
APPLY = ["apply" , INFO]
|
15
|
-
APPLY_TO_METHOD = ["apply-to-method", DEBUG]
|
16
|
-
ENABLE_ASPECT = ["enable-aspect" , INFO]
|
17
|
-
DISABLE_ASPECT = ["disable-aspect" , INFO]
|
18
|
-
GENERATE_CODE = ["generate-code" , DEBUG]
|
19
|
-
|
20
|
-
ENTER_GENERATED_METHOD = ["enter-generated-method", TRACE]
|
21
|
-
EXIT_GENERATED_METHOD = ["exit--generated-method", TRACE]
|
22
|
-
EXIT_BECAUSE_DISABLED = ["exit--because-disabled", TRACE]
|
23
|
-
BEFORE_INVOKE_ADVICE = ["before-invoke-advice" , TRACE]
|
24
|
-
AFTER_INVOKE_ADVICE = ["after--invoke-advice" , TRACE]
|
25
|
-
BEFORE_WRAPPED_METHOD = ["before-wrapped-method" , TRACE]
|
26
|
-
AFTER_WRAPPED_METHOD = ["after--wrapped-method" , TRACE]
|
27
|
-
BEFORE_INVOKE_PROXY = ["before-invoke-proxy" , TRACE]
|
28
|
-
AFTER_INVOKE_PROXY = ["after--invoke-proxy" , TRACE]
|
29
|
-
|
30
|
-
# Unexpected behaviors
|
31
|
-
METHOD_NOT_FOUND = ["method-not-found" , WARN]
|
32
3
|
|
33
4
|
attr_reader :context
|
34
|
-
|
5
|
+
attr_accessor :level
|
35
6
|
|
36
|
-
def initialize context
|
7
|
+
def initialize context
|
37
8
|
@context = context
|
38
|
-
@level = level
|
39
|
-
end
|
40
|
-
|
41
|
-
def level
|
42
|
-
return @level if @level
|
43
9
|
|
44
10
|
if (level_string = ENV['ASPECTOR_LOG_LEVEL'])
|
45
11
|
@level = string_to_level(level_string)
|
46
12
|
else
|
47
|
-
@level = DEFAULT_VISIBLE_LEVEL
|
13
|
+
@level = Logging::DEFAULT_VISIBLE_LEVEL
|
48
14
|
end
|
49
15
|
end
|
50
16
|
|
51
|
-
def log
|
52
|
-
action, level = *action_level
|
53
|
-
|
54
|
-
return if self.level > level
|
55
|
-
|
56
|
-
puts log_prefix(level) << action << " | " << args.join(" | ")
|
57
|
-
end
|
58
|
-
|
59
|
-
def log_method_call method, action_level, *args
|
60
|
-
action, level = *action_level
|
61
|
-
|
17
|
+
def log level, *args
|
62
18
|
return if self.level > level
|
63
19
|
|
64
|
-
puts log_prefix(level) <<
|
20
|
+
puts log_prefix(level) << args.join(" | ")
|
65
21
|
end
|
66
22
|
|
67
23
|
def visible? level
|
@@ -71,7 +27,7 @@ module Aspector
|
|
71
27
|
private
|
72
28
|
|
73
29
|
def log_prefix level
|
74
|
-
s = "Aspector | " << level_to_string(level) << " | "
|
30
|
+
s = "#{Time.now} | Aspector | " << level_to_string(level) << " | "
|
75
31
|
if context.is_a? Aspector::Base
|
76
32
|
s << context.class.to_s << " | " << context.aop_target.to_s << " | "
|
77
33
|
else
|
@@ -81,24 +37,25 @@ module Aspector
|
|
81
37
|
|
82
38
|
def level_to_string level
|
83
39
|
case level
|
84
|
-
when ERROR then "ERROR"
|
85
|
-
when WARN then "WARN "
|
86
|
-
when INFO then "INFO "
|
87
|
-
when DEBUG then "DEBUG"
|
88
|
-
when TRACE then "TRACE"
|
40
|
+
when Logging::ERROR then "ERROR"
|
41
|
+
when Logging::WARN then "WARN "
|
42
|
+
when Logging::INFO then "INFO "
|
43
|
+
when Logging::DEBUG then "DEBUG"
|
44
|
+
when Logging::TRACE then "TRACE"
|
89
45
|
else level.to_s
|
90
46
|
end
|
91
47
|
end
|
92
48
|
|
93
49
|
def string_to_level level_string
|
94
|
-
return DEFAULT_VISIBLE_LEVEL if level_string.nil? or level_string.strip == ''
|
50
|
+
return Logging::DEFAULT_VISIBLE_LEVEL if level_string.nil? or level_string.strip == ''
|
95
51
|
|
96
52
|
case level_string.downcase
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
53
|
+
when 'error' then Logging::ERROR
|
54
|
+
when 'warn' then Logging::WARN
|
55
|
+
when 'info' then Logging::INFO
|
56
|
+
when 'debug' then Logging::DEBUG
|
57
|
+
when 'trace' then Logging::TRACE
|
58
|
+
when 'none' then Logging::NONE
|
102
59
|
end
|
103
60
|
end
|
104
61
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Aspector
|
2
|
+
module Logging
|
3
|
+
# Log levels
|
4
|
+
NONE = 10000
|
5
|
+
ERROR = 50
|
6
|
+
WARN = 40
|
7
|
+
INFO = 30
|
8
|
+
DEBUG = 20
|
9
|
+
TRACE = 10
|
10
|
+
|
11
|
+
DEFAULT_VISIBLE_LEVEL = INFO
|
12
|
+
|
13
|
+
def self.get_logger context
|
14
|
+
if logger_class_name = ENV["ASPECTOR_LOGGER"]
|
15
|
+
begin
|
16
|
+
logger_class = constanize(logger_class_name)
|
17
|
+
logger_class.new(context)
|
18
|
+
rescue => e
|
19
|
+
$stderr.puts e.message
|
20
|
+
|
21
|
+
Logger.new(context)
|
22
|
+
end
|
23
|
+
else
|
24
|
+
Logger.new(context)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def self.constanize class_name
|
31
|
+
unless /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)+)\z/ =~ class_name
|
32
|
+
raise NameError, "#{class_name} is not a valid constant name!"
|
33
|
+
end
|
34
|
+
|
35
|
+
Object.module_eval("::#{$1}", __FILE__, __LINE__)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -20,7 +20,7 @@ module Aspector
|
|
20
20
|
|
21
21
|
yield if block_given?
|
22
22
|
ensure
|
23
|
-
remove_instance_variable aop_applied_flag
|
23
|
+
remove_instance_variable aop_applied_flag if instance_variable_defined? aop_applied_flag
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
@@ -44,7 +44,9 @@ module Aspector
|
|
44
44
|
|
45
45
|
yield if block_given?
|
46
46
|
ensure
|
47
|
-
eigen_class.
|
47
|
+
if eigen_class.instance_variable_defined? aop_applied_flag
|
48
|
+
eigen_class.send :remove_instance_variable, aop_applied_flag
|
49
|
+
end
|
48
50
|
end
|
49
51
|
end
|
50
52
|
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aspector
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.12.
|
4
|
+
version: 0.12.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-10-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -199,6 +199,7 @@ files:
|
|
199
199
|
- .irbrc
|
200
200
|
- .rspec
|
201
201
|
- .rvmrc
|
202
|
+
- .travis.yml
|
202
203
|
- Gemfile
|
203
204
|
- Gemfile.lock
|
204
205
|
- Guardfile
|
@@ -212,6 +213,7 @@ files:
|
|
212
213
|
- examples/aspector_apply_example.rb
|
213
214
|
- examples/aspector_example.rb
|
214
215
|
- examples/cache_aspect.rb
|
216
|
+
- examples/design_by_contract.rb
|
215
217
|
- examples/exception_handler.rb
|
216
218
|
- examples/implicit_method_option_test.rb
|
217
219
|
- examples/logging_aspect.rb
|
@@ -225,6 +227,7 @@ files:
|
|
225
227
|
- lib/aspector/deferred_logic.rb
|
226
228
|
- lib/aspector/deferred_option.rb
|
227
229
|
- lib/aspector/logger.rb
|
230
|
+
- lib/aspector/logging.rb
|
228
231
|
- lib/aspector/method_matcher.rb
|
229
232
|
- lib/aspector/module_extension.rb
|
230
233
|
- lib/aspector/object_extension.rb
|
@@ -268,7 +271,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
268
271
|
version: '0'
|
269
272
|
segments:
|
270
273
|
- 0
|
271
|
-
hash:
|
274
|
+
hash: 117622238641443179
|
272
275
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
273
276
|
none: false
|
274
277
|
requirements:
|