source_route 0.0.1 → 0.0.2
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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +2 -2
- data/lib/source_route/formats/html_template.slim +35 -7
- data/lib/source_route/tp_result.rb +17 -11
- data/lib/source_route/version.rb +1 -1
- data/lib/source_route/wrapper.rb +6 -7
- data/lib/source_route.rb +1 -1
- data/source_route.gemspec +3 -1
- data/test/sample_app.rb +21 -2
- data/test/test_helper.rb +2 -1
- data/test/wrapper_test.rb +37 -12
- metadata +18 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 67d1a63084f0e5b6a0f2e7fb6f066d8b02510590
|
4
|
+
data.tar.gz: f7cc2c6ddc3632cde00f74a97b634834df307154
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 001a12df5c3bbb0c3ae80d92f1661732ddbd44689f72cb214b84a3b55e01d266282273e094347ed795816fe3d66fc524247ffa4b3a6a3a5d4cce87f8da70b3b2
|
7
|
+
data.tar.gz: 8bd9da28ab7372e981ca605e63402f6bd7637db273be83c920db5b3548a9c6b0af01082b78cf6762a230fda79678be491586ec156168251b5b17195ce6c84a21
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -10,7 +10,7 @@ Wrapper of TracePoint
|
|
10
10
|
|
11
11
|
Add this line to your application's Gemfile:
|
12
12
|
|
13
|
-
gem 'source_route'
|
13
|
+
gem 'source_route'
|
14
14
|
|
15
15
|
And then execute:
|
16
16
|
|
@@ -26,7 +26,7 @@ Or install it yourself as:
|
|
26
26
|
|
27
27
|
## Contributing
|
28
28
|
|
29
|
-
1. Fork it ( https://github.com/
|
29
|
+
1. Fork it ( https://github.com/raykin/source_route/fork )
|
30
30
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
31
31
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
32
32
|
4. Push to the branch (`git push origin my-new-feature`)
|
@@ -11,7 +11,9 @@ html
|
|
11
11
|
/ pry(main)> ActiveRecord::Inheritance::ClassMethods.to_json => {} # Dont know why
|
12
12
|
ruby:
|
13
13
|
trace_data = @tp_attrs_results.map do |tp_result|
|
14
|
-
|
14
|
+
if tp_result.has_key?(:defined_class)
|
15
|
+
tp_result[:defined_class] = tp_result[:defined_class].nature_value
|
16
|
+
end
|
15
17
|
tp_result
|
16
18
|
end
|
17
19
|
|
@@ -25,16 +27,33 @@ html
|
|
25
27
|
=< @conditions.event
|
26
28
|
.trace-flow
|
27
29
|
.row
|
28
|
-
.left-info.col-sm-
|
30
|
+
.left-info.col-sm-4
|
29
31
|
.well.well-sm(ng-repeat="klass in definedClasses")
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
32
|
+
button.btn.btn-default(ng-click="selectKlass(klass)")
|
33
|
+
span(ng-bind="klass")
|
34
|
+
.center-info.col-sm-6
|
35
|
+
.well.well-lg(ng-repeat="trace in traces | filter:{defined_class: selectedKlass}")
|
36
|
+
div(ng-click="showMoreDetail = !showMoreDetail")
|
34
37
|
span(ng-bind="trace.defined_class")
|
35
38
|
span #
|
36
39
|
span(ng-bind="trace.method_id")
|
37
|
-
|
40
|
+
.details(ng-if="showMoreDetail")
|
41
|
+
.local-vars.well.well-sm(ng-if="trace.local_var" style="color: green")
|
42
|
+
span Local Var
|
43
|
+
.local-values(ng-repeat="(key, value) in trace.local_var")
|
44
|
+
span<>(ng-bind="key")
|
45
|
+
span<>
|
46
|
+
| =>
|
47
|
+
span<>(ng-bind="value || 'null'")
|
48
|
+
.ins-vars.well.well-sm(ng-if="trace.instance_var" style="color: blue")
|
49
|
+
span Instance Var
|
50
|
+
.ins-values(ng-repeat="(key, value) in trace.instance_var")
|
51
|
+
span<>(ng-bind="key")
|
52
|
+
span<>
|
53
|
+
| =>
|
54
|
+
span<>(ng-bind="value || 'null'")
|
55
|
+
|
56
|
+
.right-info.col-sm-2
|
38
57
|
|
39
58
|
script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.25/angular.min.js"
|
40
59
|
|
@@ -45,4 +64,13 @@ html
|
|
45
64
|
// it is possible to prevent dirty check on definedClasses after it was generated
|
46
65
|
$scope.definedClasses = _.uniq(_.map($scope.traces, 'defined_class'))
|
47
66
|
$scope.definedClasses.unshift('ALL')
|
67
|
+
|
68
|
+
$scope.selectKlass = function(klass) {
|
69
|
+
if (klass == 'ALL') {
|
70
|
+
$scope.selectedKlass = undefined
|
71
|
+
} else {
|
72
|
+
$scope.selectedKlass = klass
|
73
|
+
}
|
74
|
+
}
|
75
|
+
|
48
76
|
})
|
@@ -3,8 +3,8 @@ module SourceRoute
|
|
3
3
|
class TpResult
|
4
4
|
|
5
5
|
DEFAULT_ATTRS = {
|
6
|
-
call: [:defined_class, :
|
7
|
-
return: [:defined_class, :
|
6
|
+
call: [:defined_class, :method_id],
|
7
|
+
return: [:defined_class, :method_id, :return_value]
|
8
8
|
}
|
9
9
|
|
10
10
|
def initialize(wrapper)
|
@@ -12,10 +12,13 @@ module SourceRoute
|
|
12
12
|
|
13
13
|
@output_config = @wrapper.conditions.result_config
|
14
14
|
|
15
|
-
@
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
@tp_events = @wrapper.conditions.events
|
16
|
+
end
|
17
|
+
|
18
|
+
def output_attributes(event)
|
19
|
+
attrs = @output_config[:selected_attrs] || DEFAULT_ATTRS[event]
|
20
|
+
attrs.push(:event) if @tp_events.size > 1
|
21
|
+
attrs
|
19
22
|
end
|
20
23
|
|
21
24
|
def build(trace_point_instance)
|
@@ -26,7 +29,7 @@ module SourceRoute
|
|
26
29
|
@collect_data
|
27
30
|
end
|
28
31
|
|
29
|
-
#
|
32
|
+
# must run build before it # not a good design
|
30
33
|
def output
|
31
34
|
|
32
35
|
format = @output_config[:output_format].to_sym
|
@@ -53,7 +56,7 @@ module SourceRoute
|
|
53
56
|
private
|
54
57
|
|
55
58
|
def collect_tp_data
|
56
|
-
@collect_data = @
|
59
|
+
@collect_data = output_attributes(@tp.event).inject({}) do |memo, key|
|
57
60
|
memo[key.to_sym] = @tp.send(key) if @tp.respond_to?(key)
|
58
61
|
memo
|
59
62
|
end
|
@@ -66,8 +69,9 @@ module SourceRoute
|
|
66
69
|
@tp.binding.eval('local_variables').each do |v|
|
67
70
|
local_var_hash[v] = @tp.binding.local_variable_get v
|
68
71
|
end
|
69
|
-
|
70
|
-
|
72
|
+
if local_var_hash != {}
|
73
|
+
@collect_data.merge!(local_var: local_var_hash)
|
74
|
+
end
|
71
75
|
end
|
72
76
|
end
|
73
77
|
|
@@ -77,7 +81,9 @@ module SourceRoute
|
|
77
81
|
@tp.self.instance_variables.each do |key|
|
78
82
|
instance_var_hash[key] = @tp.self.instance_variable_get(key)
|
79
83
|
end
|
80
|
-
|
84
|
+
if instance_var_hash != {}
|
85
|
+
@collect_data.merge!(instance_var: instance_var_hash)
|
86
|
+
end
|
81
87
|
end
|
82
88
|
end
|
83
89
|
|
data/lib/source_route/version.rb
CHANGED
data/lib/source_route/wrapper.rb
CHANGED
@@ -13,7 +13,7 @@ module SourceRoute
|
|
13
13
|
# output_format can be console, html
|
14
14
|
def reset
|
15
15
|
@tp.disable if @tp
|
16
|
-
@conditions = OpenStruct.new(
|
16
|
+
@conditions = OpenStruct.new(events: :call, negative: {}, positive: {},
|
17
17
|
result_config: { output_format: 'none',
|
18
18
|
selected_attrs: nil,
|
19
19
|
include_local_var: false,
|
@@ -23,11 +23,10 @@ module SourceRoute
|
|
23
23
|
self
|
24
24
|
end
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
@conditions.event = v.to_sym unless v.nil?
|
26
|
+
def events(v)
|
27
|
+
@conditions.events = Array(v).map(&:to_sym) unless v.nil?
|
29
28
|
end
|
30
|
-
|
29
|
+
alias :event :events
|
31
30
|
def set_result_config(value)
|
32
31
|
unless value.is_a? Hash
|
33
32
|
conditions.result_config = value
|
@@ -70,7 +69,7 @@ module SourceRoute
|
|
70
69
|
# dont wanna init it in tp block, cause tp block could run thousands of time in one cycle trace
|
71
70
|
tp_result = TpResult.new(self)
|
72
71
|
|
73
|
-
track = TracePoint.new conditions.
|
72
|
+
track = TracePoint.new *conditions.events do |tp|
|
74
73
|
negative_break = conditions.negative.any? do |method_key, value|
|
75
74
|
tp.send(method_key).nature_value =~ Regexp.new(value)
|
76
75
|
end
|
@@ -81,8 +80,8 @@ module SourceRoute
|
|
81
80
|
next if positive_break
|
82
81
|
|
83
82
|
ret_data = tp_result.build(tp)
|
84
|
-
tp_result.output
|
85
83
|
tp_attrs_results.push(ret_data)
|
84
|
+
tp_result.output
|
86
85
|
end
|
87
86
|
track.enable
|
88
87
|
self.tp = track
|
data/lib/source_route.rb
CHANGED
data/source_route.gemspec
CHANGED
@@ -10,8 +10,9 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ["raykincoldxiao@gmail.com"]
|
11
11
|
spec.summary = %q{Wrapper of TracePoint.}
|
12
12
|
spec.description = %q{Wrapper of TracePoint.}
|
13
|
-
spec.homepage = ""
|
13
|
+
spec.homepage = "http://github.com/raykin/source-route"
|
14
14
|
spec.license = "MIT"
|
15
|
+
spec.required_ruby_version = '>= 2'
|
15
16
|
|
16
17
|
spec.files = `git ls-files -z`.split("\x0")
|
17
18
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
@@ -23,4 +24,5 @@ Gem::Specification.new do |spec|
|
|
23
24
|
spec.add_development_dependency "bundler", "~> 1.6"
|
24
25
|
spec.add_development_dependency "rake"
|
25
26
|
spec.add_development_dependency 'slim'
|
27
|
+
spec.add_development_dependency 'minitest'
|
26
28
|
end
|
data/test/sample_app.rb
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
# When add more complex test, update FakeApp
|
3
3
|
class SampleApp
|
4
4
|
|
5
|
-
def initialize(
|
6
|
-
@
|
5
|
+
def initialize(sample=nil)
|
6
|
+
@sample = sample if sample
|
7
7
|
end
|
8
8
|
|
9
9
|
def nonsense
|
@@ -17,4 +17,23 @@ class SampleApp
|
|
17
17
|
def nonsense_with_instance_var
|
18
18
|
nonsense
|
19
19
|
end
|
20
|
+
|
21
|
+
def init_cool_app
|
22
|
+
CoolApp.new.foo
|
23
|
+
end
|
24
|
+
|
25
|
+
class CoolApp
|
26
|
+
def initialize
|
27
|
+
@cool = ['test', 'data']
|
28
|
+
# todo: cant display on html easily
|
29
|
+
@cool_hash = {first: :run, second: :halt, third: :stop}
|
30
|
+
cool_in_init = 'init data in cool app'
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
def foo
|
35
|
+
cool_in_foo = 'foo data'
|
36
|
+
@cool_ins_after = 'will shown in result?'
|
37
|
+
end
|
38
|
+
end
|
20
39
|
end
|
data/test/test_helper.rb
CHANGED
data/test/wrapper_test.rb
CHANGED
@@ -19,7 +19,7 @@ module SourceRoute
|
|
19
19
|
assert_equal @wrapper, SourceRoute.wrapper
|
20
20
|
end
|
21
21
|
|
22
|
-
def
|
22
|
+
def test_catch_call_event
|
23
23
|
SourceRoute.enable do
|
24
24
|
event :call
|
25
25
|
method_id /nonsense/
|
@@ -48,7 +48,7 @@ module SourceRoute
|
|
48
48
|
assert @wrapper.tp_attrs_results.size > 0
|
49
49
|
end
|
50
50
|
|
51
|
-
def
|
51
|
+
def test_source_route_with_one_parameter
|
52
52
|
@source_route = SourceRoute.enable 'nonsense'
|
53
53
|
SampleApp.new.nonsense
|
54
54
|
|
@@ -68,23 +68,31 @@ module SourceRoute
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def test_source_route_with_block
|
71
|
-
SourceRoute.trace method_id: 'nonsense', output_format: :
|
71
|
+
SourceRoute.trace method_id: 'nonsense', output_format: :test do
|
72
72
|
SampleApp.new.nonsense
|
73
73
|
end
|
74
74
|
assert_equal 1, @wrapper.tp_attrs_results.size
|
75
75
|
refute @wrapper.tp.enabled?
|
76
76
|
end
|
77
77
|
|
78
|
-
def
|
79
|
-
SourceRoute.trace output_format: :
|
78
|
+
def test_trace_without_first_hash_option
|
79
|
+
SourceRoute.trace output_format: :test do
|
80
80
|
SampleApp.new.nonsense
|
81
81
|
end
|
82
82
|
assert @wrapper.tp_attrs_results.size > 0
|
83
83
|
refute @wrapper.tp.enabled?
|
84
84
|
end
|
85
85
|
|
86
|
+
def test_trace_two_events
|
87
|
+
SourceRoute.enable 'nonsense' do
|
88
|
+
events [:call, :return]
|
89
|
+
end
|
90
|
+
SampleApp.new.nonsense
|
91
|
+
assert_equal 2, @wrapper.tp_attrs_results.size
|
92
|
+
end
|
93
|
+
|
86
94
|
def test_show_local_variables
|
87
|
-
|
95
|
+
SourceRoute.enable 'nonsense_with_params' do
|
88
96
|
output_include_local_variables
|
89
97
|
end
|
90
98
|
|
@@ -94,6 +102,21 @@ module SourceRoute
|
|
94
102
|
ret_value = @wrapper.tp_attrs_results.last
|
95
103
|
|
96
104
|
assert_equal 88, ret_value[:local_var][:param1]
|
105
|
+
assert_equal nil, ret_value[:local_var][:param2]
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_track_local_var_when_event_is_return
|
109
|
+
SourceRoute.enable 'nonsense_with_params' do
|
110
|
+
events :return
|
111
|
+
output_include_local_variables
|
112
|
+
end
|
113
|
+
|
114
|
+
SampleApp.new.nonsense_with_params(88)
|
115
|
+
assert_equal 1, @wrapper.tp_attrs_results.size
|
116
|
+
|
117
|
+
ret_value_for_return_event = @wrapper.tp_attrs_results.last
|
118
|
+
assert_equal 88, ret_value_for_return_event[:local_var][:param1]
|
119
|
+
assert_equal 5, ret_value_for_return_event[:local_var][:param2]
|
97
120
|
end
|
98
121
|
|
99
122
|
def test_show_instance_vars
|
@@ -101,21 +124,23 @@ module SourceRoute
|
|
101
124
|
output_include_instance_variables
|
102
125
|
end
|
103
126
|
|
104
|
-
SampleApp.new(
|
127
|
+
SampleApp.new('ins sure').nonsense_with_instance_var
|
105
128
|
|
106
129
|
assert_equal 2, @wrapper.tp_attrs_results.size
|
107
130
|
ret_value = @wrapper.tp_attrs_results.pop
|
108
131
|
|
109
|
-
assert_equal
|
132
|
+
assert_equal 'ins sure', ret_value[:instance_var][:@sample]
|
110
133
|
end
|
111
134
|
|
112
|
-
# Nothing has tested really
|
113
|
-
def
|
114
|
-
@source_route = SourceRoute.enable
|
135
|
+
# Nothing has tested really when run rake cause ENV['ignore_html_generation'] was set to true
|
136
|
+
def test_html_format_output_only
|
137
|
+
@source_route = SourceRoute.enable do
|
138
|
+
defined_class 'SampleApp'
|
115
139
|
output_include_instance_variables
|
140
|
+
output_include_local_variables
|
116
141
|
end
|
117
142
|
|
118
|
-
SampleApp.new
|
143
|
+
SampleApp.new.init_cool_app
|
119
144
|
|
120
145
|
if ENV['ignore_html_generation'] == 'true'
|
121
146
|
# do nothing. it was set in Rakefile, so rake test will not generate html file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: source_route
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- raykin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: awesome_print
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: minitest
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
83
97
|
description: Wrapper of TracePoint.
|
84
98
|
email:
|
85
99
|
- raykincoldxiao@gmail.com
|
@@ -105,7 +119,7 @@ files:
|
|
105
119
|
- test/sample_app.rb
|
106
120
|
- test/test_helper.rb
|
107
121
|
- test/wrapper_test.rb
|
108
|
-
homepage:
|
122
|
+
homepage: http://github.com/raykin/source-route
|
109
123
|
licenses:
|
110
124
|
- MIT
|
111
125
|
metadata: {}
|
@@ -117,7 +131,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
117
131
|
requirements:
|
118
132
|
- - ">="
|
119
133
|
- !ruby/object:Gem::Version
|
120
|
-
version: '
|
134
|
+
version: '2'
|
121
135
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
122
136
|
requirements:
|
123
137
|
- - ">="
|
@@ -134,4 +148,3 @@ test_files:
|
|
134
148
|
- test/sample_app.rb
|
135
149
|
- test/test_helper.rb
|
136
150
|
- test/wrapper_test.rb
|
137
|
-
has_rdoc:
|