source_route 0.0.9 → 0.1.0

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 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