source_route 0.0.9 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 37be5d396bcfb224e69e6e3577f1e71ddeffe4ba
4
- data.tar.gz: 544985519acf978873b41219ace7e89e115423f2
3
+ metadata.gz: 3a497dac48db0ce73092b5fd0b1bff7a3d43b017
4
+ data.tar.gz: 5008e83d2a398c35c5fc0a6dc379a19d2641ed53
5
5
  SHA512:
6
- metadata.gz: c4db59f01f059e29e2ceb2ff78101aaecb7298b66a9503ed2e5d8ebdc2f8c756a1a36165f099877a60ea9e41d9cdd47aa091153121bcb5090550d57c13af2a36
7
- data.tar.gz: 57ddfee91d7f69b7295e2b87e1184582934ffd11da00ede3ff9bc7bb32aed2b817330a6e78d5308958b39c3f4b3c83ff9078d5e5bfb1e8642aa336a2a139c72e
6
+ metadata.gz: b751bcd35cd72c63133c4367e57d15ae26929084c70c372afe07ca2ec8e35db78f4ad5e94aa8504cb17b50d0d8d20d10fe5e741b77ee2e5a53f8fbd8209908ed
7
+ data.tar.gz: bbd3f567b24261dee0a075fb1a2e180eae2cd49761a10fca7eefdf474a5911b07a29c7088bbaae68b4926e57d7b21719e03b8ee3d17ab14d69dffcafe56e9fe9
data/README.md CHANGED
@@ -77,4 +77,11 @@ see more usage in examples.
77
77
 
78
78
  ### TODO
79
79
 
80
+ Hide defined class filter. Add vertical timeline.
81
+
82
+ Add TpResults and GenerateResult(moved from TpResult) class.
83
+ ( http://tympanus.net/codrops/2013/05/02/vertical-timeline/
84
+ http://stackoverflow.com/questions/20896240/responsive-timeline-ui-with-bootstrap3)
85
+
86
+
80
87
  Add debug option to provider more verbose messages of what has happened
@@ -0,0 +1,34 @@
1
+ require 'active_support/callbacks'
2
+
3
+ require 'source_route'
4
+
5
+ SourceRoute.enable do
6
+ event :call, :return
7
+ defined_class 'ActiveSupport::Callbacks', 'PersonRecord'
8
+ method_id :base_save, :saving_message, :callback
9
+ result_config.import_return_to_call = true
10
+ end
11
+
12
+ class Record
13
+ include ActiveSupport::Callbacks
14
+ define_callbacks :save
15
+
16
+ def base_save
17
+ run_callbacks :save do
18
+ puts "- save"
19
+ end
20
+ end
21
+ end
22
+
23
+ class PersonRecord < Record
24
+ set_callback :save, :before, :saving_message
25
+
26
+ def saving_message
27
+ puts "saving..."
28
+ end
29
+ end
30
+
31
+ person = PersonRecord.new
32
+ person.base_save
33
+
34
+ SourceRoute.build_html_output
data/lib/source_route.rb CHANGED
@@ -1,12 +1,14 @@
1
1
  require 'ostruct'
2
2
  require 'logger'
3
3
  require 'singleton'
4
+ require 'forwardable'
4
5
 
5
6
  require 'awesome_print'
6
7
 
7
8
  require "source_route/version"
8
9
  require "source_route/wrapper"
9
- require "source_route/tp_result"
10
+ require "source_route/generate_result"
11
+ require "source_route/tp_result_chain"
10
12
  require "source_route/tp_filter"
11
13
 
12
14
  module SourceRoute
@@ -13,7 +13,8 @@ module SourceRoute
13
13
  filename = result_config[:filename] || "#{Time.now.strftime('%H%M')}-source-route.html"
14
14
 
15
15
  if result_config.import_return_to_call and wrapper.condition.has_call_and_return_event
16
- wrapper.import_return_value_to_call_results
16
+ wrapper.import_return_value_to_call_chain
17
+ wrapper.order_call_chain
17
18
  end
18
19
  html_output_str = slim_template.render(wrapper)
19
20
  File.open(filename, 'w') do |f|
@@ -6,9 +6,15 @@ html
6
6
  script src="http://cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.min.js"
7
7
  script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"
8
8
 
9
+ css:
10
+ .call-level-1 {}
11
+ .call-level-2 { margin-left: 50px }
12
+ .call-level-3 { margin-left: 100px }
13
+ .call-level-4 { margin-left: 150px }
9
14
  body(ng-app="SourceRoute" ng-controller="MainCtrl")
15
+
10
16
  ruby:
11
- local_trace_data = @tp_attrs_results.map do |tp_result|
17
+ local_trace_data = @tp_result_chain.map do |tp_result|
12
18
  if tp_result.key?(:defined_class)
13
19
  tp_result[:defined_class] = tp_result[:defined_class].inspect
14
20
  tp_result[:return_value] = tp_result[:return_value].inspect if tp_result.key?(:return_value)
@@ -25,10 +31,10 @@ html
25
31
  .container
26
32
  .container-fluid
27
33
  .navbar-header
28
- a.navbar-brand(href="#" ng-click="resetTraceFilter()") ALL
34
+ a.navbar-brand(href="#" ng-click="::resetTraceFilter()") ALL
29
35
  ul.nav.navbar-nav
30
36
  li(ng-repeat="event in tpEvents" ng-class="{active: event == traceFilter.event}")
31
- a(href="#" ng-click="traceFilter.event = event" ng-bind="event")
37
+ a(href="#" ng-click="traceFilter.event = event" ng-bind="::event")
32
38
  ul.nav.navbar-nav.navbar-right
33
39
  li
34
40
  a(disabled)
@@ -42,17 +48,17 @@ html
42
48
  .row
43
49
  .left-info.col-sm-4
44
50
  .btn-group-vertical
45
- button.btn.btn-default(ng-repeat="klass in definedClasses"
51
+ button.btn.btn-default(ng-repeat="klass in ::definedClasses"
46
52
  ng-click="traceFilter.defined_class = klass" style="height: 60px")
47
53
  span(ng-bind="klass")
48
- .traces.center-info.col-sm-6(ng-class="{{traceFilter.event}}")
49
- .trace.well.well-lg(ng-repeat="trace in traces | filter:traceFilter:true")
50
-
54
+ .traces.center-info.col-sm-8(ng-class="{{traceFilter.event}}")
55
+ .trace.well.well-lg.call-level.call-level(ng-repeat="trace in traces | filter:traceFilter:true"
56
+ ng-class="callLevelClass(trace)")
51
57
  .header(ng-click="showMoreDetail = !showMoreDetail")
52
58
  span(ng-bind="trace.defined_class")
53
59
  span
54
60
  | .
55
- span(ng-bind="trace.method_id")
61
+ mark.method-value(ng-bind="trace.method_id")
56
62
  / workaround for return_value is 'false' and return_value always to be string when existed
57
63
  div(ng-if="isIncludeReturnValue")
58
64
  span
@@ -66,7 +72,7 @@ html
66
72
  span<>(ng-bind="key")
67
73
  span<>
68
74
  | =>
69
- / to do: could inspect fix it?
75
+ / ? could inspect repaire it ?
70
76
  span<>(ng-bind="value || 'null'")
71
77
  .ins-vars.well.well-sm(ng-if="trace.instance_var" style="color: blue")
72
78
  span Instance Var
@@ -75,10 +81,15 @@ html
75
81
  span<>
76
82
  | =>
77
83
  span<>(ng-bind="value || 'null'")
84
+ .path-value.well.well-sm(ng-if="trace.path")
85
+ span Path
86
+ div
87
+ span<>(ng-bind="trace.path")
88
+ span<>(ng-bind="trace.lineno")
78
89
 
79
90
  .right-info.col-sm-2
80
91
 
81
- script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.25/angular.min.js"
92
+ script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0/angular.min.js"
82
93
 
83
94
  javascript:
84
95
  sourceRoute = angular.module('SourceRoute', [])
@@ -97,6 +108,14 @@ html
97
108
 
98
109
  $scope.definedClasses = _.uniq(_.map($scope.traces, 'defined_class'))
99
110
 
111
+ $scope.callLevelClass = function(trace) {
112
+ if (trace.parent_length > 4) {
113
+ return 'call-level-4'
114
+ } else {
115
+ return 'call-level-' + trace.parent_length
116
+ }
117
+ }
118
+
100
119
  $scope.resetTraceFilter = function() {
101
120
  $scope.traceFilter = {}
102
121
  }
@@ -1,9 +1,10 @@
1
1
  module SourceRoute
2
2
 
3
- class TpResult
3
+ class GenerateResult
4
4
 
5
5
  Config = Struct.new(:format, :show_additional_attrs,
6
- :include_local_var, :include_instance_var, :filename, :import_return_to_call) do
6
+ :include_local_var, :include_instance_var,
7
+ :filename, :import_return_to_call) do
7
8
  def initialize(f="silence", s=[], ilr=false, iiv=false)
8
9
  super(f, s, ilr, iiv)
9
10
  end
@@ -121,6 +122,6 @@ module SourceRoute
121
122
  ap "#{@collect_data[:defined_class].inspect}##{@collect_data[:method_id]}"
122
123
  end
123
124
 
124
- end # END TpResult
125
+ end # END GenerateResult
125
126
 
126
127
  end
@@ -0,0 +1,61 @@
1
+ module SourceRoute
2
+
3
+ class TpResultChain
4
+ extend Forwardable
5
+ def_delegators :@chain, :each, :index, :first, :last, :size, :push, :values_at, :pop
6
+
7
+ include Enumerable
8
+
9
+ def initialize
10
+ @chain = []
11
+ end
12
+
13
+ def call_chain
14
+ select { |tpr| tpr[:event] == :call }
15
+ end
16
+
17
+ def return_chain
18
+ select { |tpr| tpr[:event] == :return }
19
+ end
20
+
21
+ def import_return_value_to_call_chain
22
+ call_chain.each do |ctp|
23
+ ctp[:return_value] = return_chain.detect do |rtp|
24
+ rtp[:defined_class] == ctp[:defined_class] and rtp[:method_id] == ctp[:method_id]
25
+ end[:return_value]
26
+ end
27
+ end
28
+
29
+ def order_call_chain
30
+ init_order_id_and_parent_ids
31
+ call_chain.each do |tpr|
32
+ return_tpr = return_chain.find do |rtpr|
33
+ rtpr[:defined_class] == tpr[:defined_class] and rtpr[:method_id] == tpr[:method_id]
34
+ end
35
+
36
+ start_index, end_index = tpr[:order_id], return_tpr[:order_id]
37
+ unless end_index == start_index + 1
38
+ values_at(start_index+1 ... end_index).select { |tpr| tpr[:event] == :call }.each do |tpr|
39
+ tpr[:parent_ids].push start_index
40
+ end
41
+ end
42
+ end
43
+
44
+ cal_parent_length
45
+ end
46
+
47
+ private
48
+ def init_order_id_and_parent_ids
49
+ each_with_index do |tpr, index|
50
+ tpr[:order_id], tpr[:parent_ids] = index, [-1]
51
+ end
52
+ end
53
+
54
+ def cal_parent_length
55
+ each do |tpr|
56
+ tpr[:parent_length] = tpr[:parent_ids].length
57
+ end
58
+ end
59
+
60
+ end # END TpResultChain
61
+ end
@@ -1,3 +1,3 @@
1
1
  module SourceRoute
2
- VERSION = "0.0.9"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -5,10 +5,14 @@ module SourceRoute
5
5
 
6
6
  TRACE_POINT_METHODS = [:defined_class, :method_id, :path, :lineno]
7
7
 
8
- attr_accessor :condition, :tp, :tp_attrs_results
8
+ attr_accessor :condition, :tp
9
+ attr_reader :tp_result_chain
10
+
11
+ extend Forwardable
12
+ def_delegators :@tp_result_chain, :import_return_value_to_call_chain, :order_call_chain, :call_chain, :return_chain
9
13
 
10
14
  Condition = Struct.new(:events, :negatives, :positive, :result_config) do
11
- def initialize(e=[:call], n={}, p={}, r=TpResult::Config.new)
15
+ def initialize(e=[:call], n={}, p={}, r=GenerateResult::Config.new)
12
16
  super(e, n, p, r)
13
17
  end
14
18
  end
@@ -46,13 +50,13 @@ module SourceRoute
46
50
  def reset
47
51
  @tp.disable if @tp
48
52
  @condition = Condition.new
49
- @tp_attrs_results = []
53
+ @tp_result_chain = TpResultChain.new
50
54
  self
51
55
  end
52
56
 
53
57
  def trace
54
58
  # dont wanna init it in tp block, cause tp block could run thousands of times in one cycle trace
55
- tp_result = TpResult.new(self)
59
+ tp_result = GenerateResult.new(self)
56
60
  tp_filter = TpFilter.new(condition)
57
61
 
58
62
  track = TracePoint.new *condition.events do |tp|
@@ -61,7 +65,7 @@ module SourceRoute
61
65
 
62
66
  unless condition.result_config.format.is_a? Proc
63
67
  ret_data = tp_result.build(tp)
64
- tp_attrs_results.push(ret_data)
68
+ @tp_result_chain.push(ret_data)
65
69
  end
66
70
 
67
71
  tp_result.output(tp)
@@ -71,21 +75,6 @@ module SourceRoute
71
75
  track
72
76
  end
73
77
 
74
- def import_return_value_to_call_results
75
- call_tp_results.each do |ctp|
76
- ctp[:return_value] = return_tp_results.detect do |rtp|
77
- rtp[:defined_class] == ctp[:defined_class] and rtp[:method_id] == ctp[:method_id]
78
- end[:return_value]
79
- end
80
- end
81
-
82
- def call_tp_results
83
- tp_attrs_results.select { |tpr| tpr[:event] == :call }
84
- end
85
-
86
- def return_tp_results
87
- tp_attrs_results.select { |tpr| tpr[:event] == :return }
88
- end
89
- end # Wrapper
78
+ end # END Wrapper
90
79
 
91
80
  end
@@ -35,14 +35,14 @@ class SourceRouteTest < Minitest::Test
35
35
  end
36
36
  SampleApp.new.nonsense
37
37
 
38
- assert_includes @wrapper.tp_attrs_results.first[:path], 'test'
38
+ assert_includes @wrapper.tp_result_chain.first[:path], 'test'
39
39
  end
40
40
 
41
41
  def test_match_class_name_by_first_parameter
42
42
  @source_route = SourceRoute.enable 'SampleApp'
43
43
  SampleApp.new.nonsense
44
44
 
45
- assert @wrapper.tp_attrs_results.size > 0
45
+ assert @wrapper.tp_result_chain.size > 0
46
46
  end
47
47
 
48
48
  def test_match_class_name
@@ -51,26 +51,26 @@ class SourceRouteTest < Minitest::Test
51
51
  end
52
52
 
53
53
  SampleApp.new.nonsense
54
- assert @wrapper.tp_attrs_results.size > 0
54
+ assert @wrapper.tp_result_chain.size > 0
55
55
  end
56
56
 
57
57
  def test_source_route_with_one_parameter
58
58
  @source_route = SourceRoute.enable 'nonsense'
59
59
  SampleApp.new.nonsense
60
60
 
61
- ret_value = @wrapper.tp_attrs_results.last
61
+ ret_value = @wrapper.tp_result_chain.last
62
62
  assert_equal SampleApp, ret_value[:defined_class]
63
63
  end
64
64
 
65
65
  def test_wrapper_reset
66
66
  SourceRoute.enable 'nonsense'
67
67
  SampleApp.new.nonsense
68
- assert_equal 1, @wrapper.tp_attrs_results.size
68
+ assert_equal 1, @wrapper.tp_result_chain.size
69
69
 
70
70
  SourceRoute.reset
71
71
  SampleApp.new.nonsense
72
72
 
73
- assert_equal 0, @wrapper.tp_attrs_results.size
73
+ assert_equal 0, @wrapper.tp_result_chain.size
74
74
  end
75
75
 
76
76
  def test_source_route_with_block_only
@@ -83,7 +83,7 @@ class SourceRouteTest < Minitest::Test
83
83
  end
84
84
  SampleApp.new.nonsense
85
85
 
86
- assert_equal 0, @wrapper.tp_attrs_results.size
86
+ assert_equal 0, @wrapper.tp_result_chain.size
87
87
  assert_equal 1, paths.size
88
88
  assert_includes paths.first, 'sample_app'
89
89
  end
@@ -93,14 +93,14 @@ class SourceRouteTest < Minitest::Test
93
93
  'abc'.upcase
94
94
  end
95
95
 
96
- assert_equal 2, @wrapper.tp_attrs_results.size
96
+ assert_equal 2, @wrapper.tp_result_chain.size
97
97
  end
98
98
 
99
99
  def test_trace_without_first_hash_option
100
100
  SourceRoute.trace output_format: :test do
101
101
  SampleApp.new.nonsense
102
102
  end
103
- assert @wrapper.tp_attrs_results.size > 0
103
+ assert @wrapper.tp_result_chain.size > 0
104
104
  refute @wrapper.tp.enabled?
105
105
  end
106
106
 
@@ -109,7 +109,7 @@ class SourceRouteTest < Minitest::Test
109
109
  event :call, :return
110
110
  end
111
111
  SampleApp.new.nonsense
112
- assert_equal 2, @wrapper.tp_attrs_results.size
112
+ assert_equal 2, @wrapper.tp_result_chain.size
113
113
  end
114
114
 
115
115
  def test_show_local_variables
@@ -119,9 +119,9 @@ class SourceRouteTest < Minitest::Test
119
119
  end
120
120
 
121
121
  SampleApp.new.nonsense_with_params(88)
122
- assert_equal 1, @wrapper.tp_attrs_results.size
122
+ assert_equal 1, @wrapper.tp_result_chain.size
123
123
 
124
- ret_value = @wrapper.tp_attrs_results.last
124
+ ret_value = @wrapper.tp_result_chain.last
125
125
 
126
126
  assert_equal 88, ret_value[:local_var][:param1]
127
127
  assert_equal nil, ret_value[:local_var][:param2]
@@ -134,9 +134,9 @@ class SourceRouteTest < Minitest::Test
134
134
  end
135
135
 
136
136
  SampleApp.new.nonsense_with_params(88)
137
- assert_equal 1, @wrapper.tp_attrs_results.size
137
+ assert_equal 1, @wrapper.tp_result_chain.size
138
138
 
139
- ret_value_for_return_event = @wrapper.tp_attrs_results.last
139
+ ret_value_for_return_event = @wrapper.tp_result_chain.last
140
140
  assert_equal 88, ret_value_for_return_event[:local_var][:param1]
141
141
  assert_equal 5, ret_value_for_return_event[:local_var][:param2]
142
142
  end
@@ -148,22 +148,38 @@ class SourceRouteTest < Minitest::Test
148
148
 
149
149
  SampleApp.new('ins sure').nonsense_with_instance_var
150
150
 
151
- assert_equal 2, @wrapper.tp_attrs_results.size
152
- ret_value = @wrapper.tp_attrs_results.pop
151
+ assert_equal 2, @wrapper.tp_result_chain.size
152
+ ret_value = @wrapper.tp_result_chain.pop
153
153
 
154
154
  assert_equal 'ins sure', ret_value[:instance_var][:@sample]
155
155
  end
156
156
 
157
157
  def test_import_return_to_call
158
- @source_route = SourceRoute.enable 'SampleApp' do
158
+ SourceRoute.enable 'SampleApp' do
159
159
  event :call, :return
160
160
  result_config.include_instance_var = true
161
161
  result_config.include_local_var = true
162
162
  result_config.import_return_to_call = true
163
163
  end
164
164
  SampleApp.new.init_cool_app
165
- @wrapper.import_return_value_to_call_results
166
- assert @wrapper.call_tp_results[0].key?(:return_value), 'call results should contain return_value'
165
+ @wrapper.import_return_value_to_call_chain
166
+ assert @wrapper.call_chain[0].key?(:return_value), 'call results should contain return_value'
167
+ end
168
+
169
+ def test_order_call_sequence
170
+ SourceRoute.enable 'SampleApp' do
171
+ event :call, :return
172
+ end
173
+ SampleApp.new.nonsense_with_instance_var
174
+ @wrapper.order_call_chain
175
+ @wrapper.order_call_chain
176
+ call_results = @wrapper.call_chain
177
+
178
+ nonsense_call_tp = call_results.find { |tp| tp[:method_id] == :nonsense }
179
+ nonsense_with_instance_var_call_tp = call_results.find { |tp| tp[:method_id] == :nonsense_with_instance_var }
180
+
181
+ assert_equal [-1, nonsense_with_instance_var_call_tp[:order_id]], nonsense_call_tp[:parent_ids]
182
+ assert_equal 2, nonsense_call_tp[:parent_length]
167
183
  end
168
184
 
169
185
  # Nothing has tested really when run rake cause ENV['ignore_html_generation'] was set to true
@@ -14,7 +14,7 @@ module SourceRoute
14
14
  @warden_tp = FakeTp.new(:auth, Warden, 6)
15
15
  @user_tp = FakeTp.new(:new, User, 8)
16
16
  @tps = [@devise_tp, @warden_tp, @user_tp]
17
- @result_config = TpResult::Config.new('silence', [], false, false)
17
+ @result_config = GenerateResult::Config.new('silence', [], false, false)
18
18
  end
19
19
 
20
20
  def test_filter_method_not_auth
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.9
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - raykin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-21 00:00:00.000000000 Z
11
+ date: 2014-10-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: awesome_print
@@ -121,13 +121,15 @@ files:
121
121
  - LICENSE.txt
122
122
  - README.md
123
123
  - Rakefile
124
+ - examples/callback_in_activesupport.rb
124
125
  - examples/show_init_files_when_rails_server_start.rb
125
126
  - examples/show_task_trace_in_rails.rb
126
127
  - lib/source_route.rb
127
128
  - lib/source_route/formats/html.rb
128
129
  - lib/source_route/formats/html_template.slim
130
+ - lib/source_route/generate_result.rb
129
131
  - lib/source_route/tp_filter.rb
130
- - lib/source_route/tp_result.rb
132
+ - lib/source_route/tp_result_chain.rb
131
133
  - lib/source_route/version.rb
132
134
  - lib/source_route/wrapper.rb
133
135
  - source_route.gemspec