source_route 0.1.5 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -2
- data/examples/study_callback.rb +35 -0
- data/lib/source_route/formats/html_template.slim +32 -19
- data/lib/source_route/generate_result.rb +2 -2
- data/lib/source_route/tp_result_chain.rb +5 -2
- data/lib/source_route/version.rb +1 -1
- data/lib/source_route/wrapper.rb +0 -1
- data/test/source_route_test.rb +7 -9
- metadata +3 -3
- data/examples/callback_in_activesupport.rb +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd182d935ed8eb7520d0cebb22fe7af916d0d137
|
4
|
+
data.tar.gz: 44b50d2846f827b6a15cd98a0a49125c34f965da
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4bf100bdc4ff65df991267c0905d9f8546f6a70e7b8860262d0b275c918a73bb17dd953cc6da896280e92a2f24702eb7c4e8edaed551d044acf603b535410fd4
|
7
|
+
data.tar.gz: 6b5a8dc7cf522fbdcd7520c10377d9d5bac16d069e1d6df52ba82b4290c5b82438a42bc1a11042fda38a3ec76e2a007c19fcfc67c9e1b61ed09f29624ddebe0a
|
data/README.md
CHANGED
@@ -64,7 +64,7 @@ Same as the previous example, you will get a html file showing the code trace.
|
|
64
64
|
It will output the trace when you run the application.
|
65
65
|
|
66
66
|
see more usage in examples.
|
67
|
-
see full usage in examples/
|
67
|
+
see full usage in examples/study_callback.rb
|
68
68
|
|
69
69
|
## Why
|
70
70
|
|
@@ -97,10 +97,13 @@ Finally, I expect my working style can change from searching workaround from int
|
|
97
97
|
|
98
98
|
Dynamic indent when new child level comes.
|
99
99
|
|
100
|
+
Is it possible to easily open only direct child
|
100
101
|
Animation when child was click.
|
101
102
|
|
102
103
|
Show loading when click clear. (when $apply() take more than 1 seconds to run)
|
103
104
|
|
104
105
|
Add debug option to provide more verbose messages of what has happened
|
105
106
|
|
106
|
-
|
107
|
+
if instance val contains symbol as value, the json output will be string. It could be confused others.
|
108
|
+
|
109
|
+
Open File directly from browser(chrome) by plugin? Maybe check out how better error implement this
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'active_support/callbacks'
|
2
|
+
|
3
|
+
require 'source_route'
|
4
|
+
|
5
|
+
SourceRoute.enable do
|
6
|
+
method_id 'base_decorate', 'prepare_decorate'
|
7
|
+
defined_class 'ActiveSupport::Callbacks', 'PersonRecord', 'Filters'
|
8
|
+
result_config.filename = 'trace_callback.html'
|
9
|
+
full_feature 10
|
10
|
+
end
|
11
|
+
|
12
|
+
class House
|
13
|
+
include ActiveSupport::Callbacks
|
14
|
+
define_callbacks :decorate
|
15
|
+
|
16
|
+
def base_decorate
|
17
|
+
run_callbacks :decorate do
|
18
|
+
puts "Let's decorate house"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class KattyHouse < House
|
24
|
+
set_callback :decorate, :after, :prepare_decorate
|
25
|
+
|
26
|
+
def prepare_decorate
|
27
|
+
puts "Preparing: buy materials ......"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
katty_house = KattyHouse.new
|
32
|
+
|
33
|
+
katty_house.base_decorate
|
34
|
+
|
35
|
+
SourceRoute.output_html
|
@@ -43,7 +43,7 @@ html
|
|
43
43
|
button.btn.btn-default>(ng-click="outlineTrace()")
|
44
44
|
span> OutLine
|
45
45
|
span
|
46
|
-
button.btn.btn-primary(ng-click="removeOutlineTrace()")
|
46
|
+
button.btn.btn-primary(ng-click="removeOutlineTrace()") Expand ALL
|
47
47
|
|
48
48
|
.trace-flow
|
49
49
|
.row
|
@@ -64,7 +64,7 @@ html
|
|
64
64
|
i.fa.fa-angle-right
|
65
65
|
span Child
|
66
66
|
button.btn.btn-info.btn-sm(ng-show="::containsDetail(trace)" ng-click="showMoreDetail = !showMoreDetail") Details
|
67
|
-
span(ng-bind="trace.
|
67
|
+
span(ng-bind="::tpSelfList[trace.tp_self]")
|
68
68
|
span
|
69
69
|
| .
|
70
70
|
mark.method-value(ng-bind="trace.method_id")
|
@@ -72,9 +72,9 @@ html
|
|
72
72
|
div(ng-if="trace.hasOwnProperty('return_value')")
|
73
73
|
span
|
74
74
|
| =>
|
75
|
-
span<(ng-bind="trace.return_value
|
75
|
+
span<(ng-bind="::trimString(trace.return_value, 200)")
|
76
76
|
|
77
|
-
.details(ng-if="showMoreDetail")
|
77
|
+
.details(ng-if="showMoreDetail" style="margin-top: 10px")
|
78
78
|
.attrs.well.well-sm(ng-if="containsOtherAttrs(trace)")
|
79
79
|
span Attrs
|
80
80
|
div(hljs source="::combinedAttrs(trace) | json")
|
@@ -84,6 +84,9 @@ html
|
|
84
84
|
.ins-vars.well.well-sm(ng-if="trace.instance_var")
|
85
85
|
span Instance Var
|
86
86
|
.ins-values(hljs source="::trace.instance_var | json")
|
87
|
+
.return-value(ng-if="trace.hasOwnProperty('return_value')")
|
88
|
+
span Return Value
|
89
|
+
.value(hljs source="::trace.return_value | json")
|
87
90
|
|
88
91
|
.right-info.col-sm-2
|
89
92
|
|
@@ -94,31 +97,40 @@ html
|
|
94
97
|
javascript:
|
95
98
|
sourceRoute = angular.module('SourceRoute', ['ui.bootstrap', 'hljs'])
|
96
99
|
sourceRoute.controller('MainCtrl', function($scope, $filter) {
|
100
|
+
|
101
|
+
$scope.trimString = function(str, length) {
|
102
|
+
return str.length > length ? str.substring(0, length - 3) + '...' : str;
|
103
|
+
}
|
104
|
+
|
97
105
|
$scope.traces = angular.element("#trace-data").data('trace')
|
98
106
|
$scope.tpSelfList = angular.element("#trace-data").data('tp-self-caches')
|
99
107
|
$scope.tpEvents = angular.element("#trace-data").data('tp-events')
|
100
|
-
$scope.childParentFilter = {
|
108
|
+
$scope.childParentFilter = { hide_trace_ids: [] }
|
101
109
|
|
102
110
|
$scope.childParentFilterFn = function(trace) {
|
103
|
-
if (
|
111
|
+
if (!trace.hasOwnProperty('parent_ids')) {
|
112
|
+
return true;
|
113
|
+
}
|
114
|
+
if (trace.parent_ids.length == 0) {
|
104
115
|
return true;
|
105
116
|
} else {
|
106
|
-
var
|
107
|
-
if (
|
108
|
-
return
|
117
|
+
var shared_hide_parents = _.intersection(trace.parent_ids, $scope.childParentFilter.hide_trace_ids);
|
118
|
+
if (shared_hide_parents.length > 0 ) {
|
119
|
+
return false;
|
109
120
|
}
|
110
121
|
}
|
122
|
+
return true;
|
111
123
|
}
|
112
124
|
|
113
125
|
$scope.removeOutlineTrace = function() {
|
114
126
|
_.each($scope.traces, function(trace) { trace.childClosed = false; });
|
115
|
-
$scope.childParentFilter.
|
127
|
+
$scope.childParentFilter.hide_trace_ids = [];
|
116
128
|
}
|
117
129
|
|
118
130
|
$scope.outlineTrace = function() {
|
119
|
-
$scope.childParentFilter.
|
131
|
+
$scope.childParentFilter.hide_trace_ids = [];
|
120
132
|
_.chain($scope.traces).filter({parent_length: 0})
|
121
|
-
.each(function(trace) { trace.childClosed = true; $scope.childParentFilter.
|
133
|
+
.each(function(trace) { trace.childClosed = true; $scope.childParentFilter.hide_trace_ids.push(trace.order_id) })
|
122
134
|
}
|
123
135
|
|
124
136
|
$scope.traceFilter = {event: $scope.tpEvents[0]}
|
@@ -148,7 +160,7 @@ html
|
|
148
160
|
|
149
161
|
$scope.containsOtherAttrs = function(trace) {
|
150
162
|
return trace.hasOwnProperty('path') || trace.hasOwnProperty('lineno') ||
|
151
|
-
trace.hasOwnProperty('
|
163
|
+
trace.hasOwnProperty('defined_class');
|
152
164
|
}
|
153
165
|
|
154
166
|
$scope.containsDetail = function(trace) {
|
@@ -159,16 +171,17 @@ html
|
|
159
171
|
$scope.combinedAttrs = function(trace) {
|
160
172
|
var attrs = {}
|
161
173
|
if (trace.hasOwnProperty('lineno') && trace.hasOwnProperty('path')) {
|
162
|
-
attrs.
|
174
|
+
attrs.method_defined_on = trace.path + ":" + trace.lineno;
|
163
175
|
} else if (trace.hasOwnProperty('path')) {
|
164
|
-
attrs.
|
176
|
+
attrs.method_defined_on = trace.path;
|
165
177
|
}
|
166
|
-
if (trace.hasOwnProperty('
|
167
|
-
attrs.
|
178
|
+
if (trace.hasOwnProperty('defined_class')) {
|
179
|
+
attrs.method_defined_in = trace.defined_class;
|
168
180
|
}
|
169
181
|
return attrs;
|
170
182
|
}
|
171
183
|
|
184
|
+
$scope.outlineTrace();
|
172
185
|
})
|
173
186
|
|
174
187
|
sourceRoute.controller('TpTraceCtrl', function($scope) {
|
@@ -182,12 +195,12 @@ html
|
|
182
195
|
|
183
196
|
$scope.showChild = function() {
|
184
197
|
$scope.trace.childClosed = false;
|
185
|
-
_.pull($scope.childParentFilter.
|
198
|
+
_.pull($scope.childParentFilter.hide_trace_ids, $scope.trace.order_id);
|
186
199
|
}
|
187
200
|
|
188
201
|
$scope.hideChild = function() {
|
189
202
|
$scope.trace.childClosed = true;
|
190
|
-
$scope.childParentFilter.
|
203
|
+
$scope.childParentFilter.hide_trace_ids.push($scope.trace.order_id);
|
191
204
|
}
|
192
205
|
|
193
206
|
$scope.hasChild = function() {
|
@@ -3,7 +3,7 @@ module SourceRoute
|
|
3
3
|
class GenerateResult
|
4
4
|
|
5
5
|
Config = Struct.new(:format, :show_additional_attrs,
|
6
|
-
:include_local_var, :include_instance_var,
|
6
|
+
:include_local_var, :include_instance_var,
|
7
7
|
:filename, :import_return_to_call) do
|
8
8
|
def initialize(f="silence", s=[], ilr=false, iiv=false)
|
9
9
|
super(f, s, ilr, iiv)
|
@@ -44,7 +44,7 @@ module SourceRoute
|
|
44
44
|
def build(trace_point_instance)
|
45
45
|
@tp = trace_point_instance
|
46
46
|
collect_tp_data
|
47
|
-
collect_tp_self
|
47
|
+
collect_tp_self # NEED more check. Does TracePoint support self for all events?
|
48
48
|
collect_local_var_data if @config[:include_local_var]
|
49
49
|
collect_instance_var_data if @config[:include_instance_var]
|
50
50
|
@collect_data
|
@@ -22,10 +22,13 @@ module SourceRoute
|
|
22
22
|
|
23
23
|
def import_return_value_to_call_chain
|
24
24
|
call_chain.each do |ctp|
|
25
|
-
matched_return_tp = return_chain.
|
25
|
+
matched_return_tp = return_chain.
|
26
|
+
reject { |c| c[:matched] }. # matched return tp should not checked again
|
27
|
+
detect do |rtp|
|
26
28
|
rtp[:tp_self] == ctp[:tp_self] and rtp[:method_id] == ctp[:method_id] and rtp[:defined_class] == ctp[:defined_class]
|
27
29
|
end
|
28
30
|
unless matched_return_tp.nil?
|
31
|
+
matched_return_tp[:matched] = true
|
29
32
|
ctp[:return_value] = matched_return_tp[:return_value]
|
30
33
|
ctp[:local_var] = matched_return_tp[:local_var] if matched_return_tp.key? :local_var
|
31
34
|
ctp[:instance_var] = matched_return_tp[:instance_var] if matched_return_tp.key? :instance_var
|
@@ -66,7 +69,7 @@ module SourceRoute
|
|
66
69
|
# ex: inspect on ActiveRecord_Relation may crash
|
67
70
|
tr[:defined_class] = tr[:defined_class].to_s if tr.key?(:defined_class)
|
68
71
|
if tr.key?(:return_value)
|
69
|
-
if tr[:return_value].nil? or tr[:return_value] == ''
|
72
|
+
if tr[:return_value].nil? or tr[:return_value] == '' or tr[:return_value].is_a? Symbol
|
70
73
|
tr[:return_value] = tr[:return_value].inspect
|
71
74
|
else
|
72
75
|
tr[:return_value] = tr[:return_value].to_s
|
data/lib/source_route/version.rb
CHANGED
data/lib/source_route/wrapper.rb
CHANGED
@@ -46,7 +46,6 @@ module SourceRoute
|
|
46
46
|
|
47
47
|
self.events = [:call, :return]
|
48
48
|
result_config.import_return_to_call = true
|
49
|
-
result_config.include_tp_self = true
|
50
49
|
|
51
50
|
result_config.show_additional_attrs = [:path, :lineno]
|
52
51
|
# JSON serialize trigger many problems when handle complicated object
|
data/test/source_route_test.rb
CHANGED
@@ -108,18 +108,17 @@ class SourceRouteTest < Minitest::Test
|
|
108
108
|
SourceRoute.trace method_id: 'nonsense', full_feature: true do
|
109
109
|
SampleApp.new.nonsense
|
110
110
|
end
|
111
|
-
assert @wrapper.condition.result_config.include_tp_self
|
112
111
|
first_result = @wrapper.tp_result_chain.first
|
113
112
|
assert_equal first_result[:tp_self], 0
|
114
113
|
end
|
115
114
|
|
116
|
-
def test_trace_include_tp_self
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
end
|
115
|
+
# def test_trace_include_tp_self
|
116
|
+
# SourceRoute.trace method_id: 'nonsense', full_feature: true do
|
117
|
+
# SampleApp.new.nonsense
|
118
|
+
# end
|
119
|
+
# assert_equal 1, @wrapper.tp_self_caches.size
|
120
|
+
# assert @wrapper.tp_self_caches.first.is_a? SampleApp
|
121
|
+
# end
|
123
122
|
|
124
123
|
def test_stringify_tp_result_chain
|
125
124
|
SourceRoute.trace method_id: 'nonsense', full_feature: true do
|
@@ -225,7 +224,6 @@ class SourceRouteTest < Minitest::Test
|
|
225
224
|
result_config.include_instance_var = true
|
226
225
|
result_config.include_local_var = true
|
227
226
|
result_config.show_additional_attrs = [:path, :lineno]
|
228
|
-
result_config.include_tp_self = true
|
229
227
|
|
230
228
|
result_config.filename = 'call_and_return_in_sample_app.html'
|
231
229
|
result_config.import_return_to_call = true
|
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.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- raykin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-12-
|
11
|
+
date: 2014-12-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: awesome_print
|
@@ -121,9 +121,9 @@ files:
|
|
121
121
|
- LICENSE.txt
|
122
122
|
- README.md
|
123
123
|
- Rakefile
|
124
|
-
- examples/callback_in_activesupport.rb
|
125
124
|
- examples/show_init_files_when_rails_server_start.rb
|
126
125
|
- examples/show_task_trace_in_rails.rb
|
126
|
+
- examples/study_callback.rb
|
127
127
|
- lib/source_route.rb
|
128
128
|
- lib/source_route/formats/html.rb
|
129
129
|
- lib/source_route/formats/html_template.slim
|
@@ -1,33 +0,0 @@
|
|
1
|
-
require 'active_support/callbacks'
|
2
|
-
|
3
|
-
require 'source_route'
|
4
|
-
|
5
|
-
SourceRoute.enable do
|
6
|
-
defined_class 'ActiveSupport::Callbacks', 'PersonRecord'
|
7
|
-
method_id :base_save, :saving_message, :callback
|
8
|
-
full_feature
|
9
|
-
end
|
10
|
-
|
11
|
-
class Record
|
12
|
-
include ActiveSupport::Callbacks
|
13
|
-
define_callbacks :save
|
14
|
-
|
15
|
-
def base_save
|
16
|
-
run_callbacks :save do
|
17
|
-
puts "- save"
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
class PersonRecord < Record
|
23
|
-
set_callback :save, :before, :saving_message
|
24
|
-
|
25
|
-
def saving_message
|
26
|
-
puts "saving..."
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
person = PersonRecord.new
|
31
|
-
person.base_save
|
32
|
-
|
33
|
-
SourceRoute.build_html_output
|