source_route 0.1.8 → 0.2.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: 3b4bfd9535b257febd357416089fee4ff68b38b2
4
- data.tar.gz: f2c7a60553434e0a0430f9919764f0d97dcd5780
3
+ metadata.gz: a900afbf3890bf31f01041e72ac6a65f61f3a477
4
+ data.tar.gz: 85e3915fb47c64ac5cbbe9312c2435a4720758f2
5
5
  SHA512:
6
- metadata.gz: 5d551e9a2364336fb6603633b0da2748eb3e27b2f0eba4b51bdaaffcf579af2956e269536a1e4d7cf7f47b3b05c1821fca533fb716d2d7888e1216472e96c436
7
- data.tar.gz: d4b009feb8524193ad9d90776b60ff8a37213b45189838e4ce910975e697c720e0f9c9e3e01b6729b5db2130286480e63b437ee325d5972cbd5e2ebfa1adf6da
6
+ metadata.gz: 91e0b7a0a43e00dddf0d1b8f278324c197f9d62179c066d490c8049913c7eb19e32bb500966938ae2914a5b76541caa77e84508da96b9454dd5a667bcfdeb8ec
7
+ data.tar.gz: bdc789e2660545ec2b6c0aaac975d2b276bbaf618d4414d46a944fafe383eccd8e9ba1cf38b92a6564541d4ff69e2ce246f3a00da3047cf499f63d695db470b7
data/Guardfile ADDED
@@ -0,0 +1,23 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ ## Uncomment and set this to only include directories you want to watch
5
+ # directories %w(lib) \
6
+ # .select{|d| Dir.exists?(d) ? d : UI.warning("Directory #{d} does not exist")}
7
+
8
+ ## Note: if you are using the `directories` clause above and you are not
9
+ ## watching the project directory ('.'), then you will want to move
10
+ ## the Guardfile to a watched dir and symlink it back, e.g.
11
+ #
12
+ # $ mkdir config
13
+ # $ mv Guardfile config/
14
+ # $ ln -s config/Guardfile .
15
+ #
16
+ # and, you'll have to watch "config/Guardfile" instead of "Guardfile"
17
+ guard :shell do
18
+ watch(%r{^lib/(.+)/*$}) { `rake` }
19
+ end
20
+
21
+ guard :livereload, grace_period: 0.5, override_url: true do
22
+ watch(%r{.+\.(css|js|html)})
23
+ end
data/README.md CHANGED
@@ -62,7 +62,7 @@ It will output the trace when you run the application.
62
62
  see more usage in examples.
63
63
  see full usage in examples/study_callback.rb
64
64
 
65
- ![Study Callback Example](https://cloud.githubusercontent.com/assets/490502/5468821/decbb8fe-860e-11e4-9b74-7aef7f8679fd.png)
65
+ ![Study Callback Example](https://cloud.githubusercontent.com/assets/490502/9052549/746b36d2-3a9b-11e5-9e3e-fc9f149bc56c.png)
66
66
 
67
67
  ## Why
68
68
 
@@ -93,12 +93,9 @@ Finally, I expect my working style can changes from searching workaround from in
93
93
 
94
94
  ### TODO
95
95
 
96
- Dynamic indent when new child level comes.
97
-
98
- Is it possible to easily open only direct child
99
- Animation when child was click.
96
+ Cleanup Code and remove useless comments.
100
97
 
101
- Show loading when click clear. (when $apply() take more than 1 seconds to run)
98
+ Dynamic indent when new child level comes.
102
99
 
103
100
  Add debug option to provide more verbose messages of what has happened
104
101
 
data/Rakefile CHANGED
@@ -2,7 +2,7 @@ require "bundler/gem_tasks"
2
2
 
3
3
  task default: :test
4
4
  task :test do
5
- ENV['ignore_html_generation'] = 'true'
5
+ ENV['ignore_html_generation'] = 'false'
6
6
  $LOAD_PATH.unshift('lib', 'test')
7
7
  Dir.glob('./test/**/*_test.rb') { |f| require f }
8
8
  end
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # usage: cover bin/rails with this file and run bundle exec rails c to start your console then exit your console
4
+
5
+ require 'rails'
6
+
7
+ require 'source_route'
8
+
9
+ SourceRoute.enable do
10
+ defined_class 'ActiveSupport::Configurable'
11
+ method_id :logger
12
+ full_feature 10
13
+ end
14
+
15
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
16
+
17
+ require_relative '../config/boot'
18
+
19
+ require 'rails/commands'
20
+
21
+ at_exit do
22
+ SourceRoute.output_html
23
+ end
@@ -31,3 +31,5 @@ end
31
31
  APP_PATH = File.expand_path('../../config/application', __FILE__)
32
32
  require_relative '../config/boot'
33
33
  require 'rails/commands'
34
+
35
+ SourceRoute.output_html
@@ -12,5 +12,5 @@ end
12
12
  Rails.application.load_tasks
13
13
 
14
14
  at_exit do
15
- SourceRoute.build_html_output
15
+ SourceRoute.output_html
16
16
  end
@@ -1,12 +1,6 @@
1
1
  class Object
2
2
  def source_route_display
3
- to_s
4
- end
5
-
6
- end
7
-
8
- class Numeric
9
- def source_route_display
3
+ # to_s # cause crash?
10
4
  self
11
5
  end
12
6
  end
@@ -7,17 +7,17 @@ module SourceRoute
7
7
 
8
8
  def self.slim_render(wrapper)
9
9
  result_config = wrapper.condition.result_config
10
- template_path = File.expand_path "../html_template.slim", __FILE__
10
+ template_path = File.expand_path "../html_semantic.slim", __FILE__
11
11
  slim_template = Slim::Template.new(template_path, pretty: true)
12
12
 
13
13
  filename = result_config[:filename] || "#{Time.now.strftime('%H')}-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_chain
17
- wrapper.treeize_call_chain
16
+ wrapper.result_builder.import_return_value_to_call_chain
17
+ wrapper.result_builder.treeize_call_chain
18
18
  end
19
19
  # TODO: any exception triggered in render method will be absorb totally, how to fix it?
20
- html_output_str = slim_template.render(wrapper)
20
+ html_output_str = slim_template.render(wrapper.result_builder)
21
21
  File.open(filename, 'w') do |f|
22
22
  f << html_output_str
23
23
  end
@@ -0,0 +1,242 @@
1
+ doctype html
2
+ html
3
+ head
4
+ title Source Route Result
5
+ link rel="stylesheet" href="https://cdn.rawgit.com/Urigo/angular-spinkit/master/build/angular-spinkit.min.css"
6
+ link rel="stylesheet" href="https://cdn.rawgit.com/mohsen1/json-formatter/master/dist/json-formatter.css"
7
+ link rel="stylesheet" href="http://oss.maxcdn.com/semantic-ui/2.0.7/semantic.min.css"
8
+
9
+ script async=true src="http://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.0/lodash.js"
10
+ script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"
11
+ script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular.min.js"
12
+ script async=true src="http://oss.maxcdn.com/semantic-ui/2.0.7/semantic.min.js"
13
+
14
+ css:
15
+ .call-level-0 {}
16
+ .item.trace.call-level-1 { padding-left: 50px }
17
+ .item.trace.call-level-2 { padding-left: 100px }
18
+ .item.trace.call-level-3 { padding-left: 150px }
19
+ .item.trace.call-level-4 { padding-left: 200px }
20
+ .item.trace.call-level-5 { padding-left: 250px }
21
+ .item.trace.call-level-6 { padding-left: 300px }
22
+ .item.trace.call-level-7 { padding-left: 300px }
23
+ // level more than 7 seems not reasonable
24
+
25
+ body(ng-app="SourceRoute" ng-controller="MainCtrl" ng-cloak)
26
+
27
+ .ui.menu.pointing.stackable.attached
28
+ .ui.container
29
+ .item
30
+ a.navbar-brand(href="#" ng-click="::resetTraceFilter()") ALL
31
+ .item(ng-repeat="event in tpEvents" ng-class="{active: event == traceFilter.event}")
32
+ a(href="#" ng-click="traceFilter.event = event" ng-bind="::event")
33
+ .item
34
+ .ui.buttons
35
+ button.ui.labeled.icon.button.olive(ng-click="outlineTrace()" ng-class="{loading: outlineTraceLoading}")
36
+ i.angle.double.right.icon
37
+ span OutLine
38
+ .or
39
+ button.ui.right.labeled.icon.button.green(ng-click="expandAllTrace()" ng-class="{loading: expandAllTraceLoading}")
40
+ i.angle.double.down.icon
41
+ span Expand
42
+ .right.menu
43
+ .item
44
+ span Trace Count
45
+ .ui.teal.pointing.left.label(ng-bind="currentCounter()")
46
+
47
+ .ui.container
48
+ .row
49
+ .ui.relaxed.items(ng-class="{{traceFilter.event}}")
50
+ .item.trace(ng-repeat="trace in traces | filter:traceFilter:true | filter:childParentFilterFn" ng-class="callLevelClass(trace)" ng-controller="TpTraceCtrl")
51
+ .content(ng-init="showMoreDetail = false")
52
+ .ui.segment.left.floated.padded
53
+ .header
54
+ span(ng-bind="::tpSelfList[trace.tp_self_refer]")
55
+ i.circle.icon.grey(style="font-size: 0.3em")
56
+ span.method-value(ng-bind="::trace.method_id")
57
+ / workaround for return_value is 'false' and return_value always to be string when existed
58
+ .meta(ng-if="trace.hasOwnProperty('return_value')")
59
+ i.icon.pointing.right.small
60
+ json-formatter(open="1" json="::trace.return_value")
61
+ .description
62
+ .ui.vertical.buttons.basic
63
+ button.ui.labeled.icon.button(ng-show="::containsDetail(trace)" ng-click="showMoreDetail = !showMoreDetail")
64
+ i.info.icon
65
+ span Details
66
+ button.ui.labeled.icon.button(ng-if="::hasChild()" ng-click="toggleChild()" ng-class="{loading: togglingChild}")
67
+ i.icon.angle.down(ng-show="trace.childOpened")
68
+ i.icon.angle.right(ng-hide="trace.childOpened")
69
+ span Child
70
+ pulse-spinner(ng-show="togglingChild")
71
+
72
+ .details.right.floated(ng-if="showMoreDetail")
73
+ .ui.segments(style="border-color: blue")
74
+ .ui.segment(ng-if="::trace.hasOwnProperty('return_value')")
75
+ .ui.grey.right.ribbon.label Return Value
76
+ json-formatter(json="::trace.return_value")
77
+ .ui.segment(ng-if="::containsOtherAttrs(trace)")
78
+ .ui.orange.right.ribbon.label Trace Attrs
79
+ json-formatter(open="1" json="::plusTraceAttrs[trace.order_id]")
80
+ .ui.segment(ng-if="::trace.params_var")
81
+ .ui.teal.right.ribbon.label Params Var
82
+ json-formatter(open="1" json="::trace.params_var")
83
+ .ui.segment(ng-if="::trace.local_var")
84
+ .ui.teal.right.ribbon.label Local Var
85
+ json-formatter(open="1" json="::trace.local_var")
86
+ .ui.segment(ng-if="::trace.instance_var")
87
+ .ui.blue.right.ribbon.label Instance Var
88
+ json-formatter(open="1" json="::trace.instance_var")
89
+
90
+ script src="https://cdn.rawgit.com/Urigo/angular-spinkit/master/build/angular-spinkit.min.js"
91
+ script src="https://cdn.rawgit.com/mohsen1/json-formatter/master/dist/json-formatter.js"
92
+ // script async src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular-sanitize.js"
93
+
94
+ javascript:
95
+ sourceRoute = angular.module('SourceRoute', ['jsonFormatter', 'angular-spinkit'])
96
+ sourceRoute.controller('MainCtrl', function($scope, $filter, $timeout) {
97
+
98
+ // setup different color on menu item may not be a good solution
99
+ // $scope.menuColorList = ['yellow', 'olive', 'green', 'teal', 'violet', 'purple', 'brown']
100
+ $scope.trimString = function(str, length) {
101
+ return str.length > length ? str.substring(0, length - 3) + '...' : str;
102
+ }
103
+
104
+ $scope.traces = angular.element("#trace-data").data('trace')
105
+ $scope.tpSelfList = angular.element("#trace-data").data('tp-self-caches')
106
+ $scope.tpEvents = angular.element("#trace-data").data('tp-events')
107
+ $scope.childParentFilter = { hide_trace_ids: [] }
108
+
109
+ $scope.childParentFilterFn = function(trace) {
110
+ if (!trace.hasOwnProperty('parent_ids')) {
111
+ return true;
112
+ }
113
+ if (trace.parent_ids.length == 0) {
114
+ return true;
115
+ } else {
116
+ var shared_hide_parents = _.intersection(trace.parent_ids, $scope.childParentFilter.hide_trace_ids);
117
+ if (shared_hide_parents.length > 0 ) {
118
+ return false;
119
+ }
120
+ }
121
+ return true;
122
+ }
123
+
124
+ $scope.expandAllTrace = function() {
125
+ $scope.expandAllTraceLoading = true
126
+ $timeout(function() {
127
+ _.each($scope.traces, function(trace) { trace.childOpened = true; });
128
+ $scope.childParentFilter.hide_trace_ids = [];
129
+ $scope.expandAllTraceLoading = false
130
+ $scope.expandAllTraceLoading = false
131
+ }, 100)
132
+ }
133
+
134
+ $scope.outlineTrace = function() {
135
+ $scope.outlineTraceLoading = true
136
+ $scope.childParentFilter.hide_trace_ids = [];
137
+ _.chain($scope.traces).filter({parent_length: 0, event: $scope.traceFilter.event})
138
+ .each(function(trace) {
139
+ trace.childOpened = false;
140
+ $scope.childParentFilter.hide_trace_ids.push(trace.order_id) }
141
+ ).value()
142
+ $scope.outlineTraceLoading = false
143
+ }
144
+
145
+ $scope.traceFilter = {event: $scope.tpEvents[0]}
146
+ if ($scope.tpEvents.length == 1 && angular.isUndefined($scope.traces[0].event)) {
147
+ _.each($scope.traces, function(trace) {
148
+ trace.event = $scope.tpEvents[0]
149
+ })
150
+ }
151
+
152
+ $scope.definedClasses = _.uniq(_.map($scope.traces, 'defined_class'))
153
+
154
+ $scope.callLevelClass = function(trace) {
155
+ if (trace.parent_length > 7) {
156
+ return 'call-level-7';
157
+ } else {
158
+ return 'call-level-' + trace.parent_length;
159
+ }
160
+ }
161
+
162
+ $scope.resetTraceFilter = function() {
163
+ $scope.traceFilter = {};
164
+ }
165
+
166
+ $scope.currentCounter = function() {
167
+ return $filter('filter')($scope.traces, $scope.traceFilter, true).length;
168
+ }
169
+
170
+ $scope.containsOtherAttrs = function(trace) {
171
+ return trace.hasOwnProperty('path') || trace.hasOwnProperty('lineno')
172
+ }
173
+
174
+ $scope.containsDetail = function(trace) {
175
+ return $scope.containsOtherAttrs(trace) || trace.hasOwnProperty('local_var') ||
176
+ trace.hasOwnProperty('instance_var')
177
+ }
178
+
179
+ combinedAttrs = function(trace) {
180
+ var attrs = {}
181
+ if (trace.hasOwnProperty('lineno') && trace.hasOwnProperty('path')) {
182
+ attrs.method_defined_on = trace.path + ":" + trace.lineno;
183
+ } else if (trace.hasOwnProperty('path')) {
184
+ attrs.method_defined_on = trace.path;
185
+ }
186
+ if (trace.hasOwnProperty('defined_class')) {
187
+ attrs.method_defined_in = trace.defined_class;
188
+ }
189
+ return attrs;
190
+ }
191
+
192
+ $scope.plusTraceAttrs = _.map($scope.traces, combinedAttrs)
193
+
194
+ $scope.outlineTrace();
195
+ })
196
+
197
+ sourceRoute.controller('TpTraceCtrl', function($scope, $timeout) {
198
+
199
+ $scope.toggleChild = function() {
200
+ $scope.togglingChild = true
201
+ $timeout(function() {
202
+ if ($scope.trace.childOpened) {
203
+ $scope.hideChild();
204
+ $scope.togglingChild = false
205
+ } else {
206
+ $scope.showChild();
207
+ $scope.togglingChild = false
208
+ }
209
+ }, 0)
210
+ }
211
+
212
+ $scope.showChild = function() {
213
+ $scope.trace.childOpened = true;
214
+ _.pull($scope.childParentFilter.hide_trace_ids, $scope.trace.order_id);
215
+ if ($scope.trace.direct_child_order_ids.length > 0) {
216
+ $scope.childParentFilter.hide_trace_ids.push($scope.trace.direct_child_order_ids);
217
+ $scope.childParentFilter.hide_trace_ids = _.chain($scope.childParentFilter.hide_trace_ids).flatten().uniq().value();
218
+ }
219
+ }
220
+
221
+ $scope.hideChild = function() {
222
+ $scope.trace.childOpened = false;
223
+ $scope.childParentFilter.hide_trace_ids.push($scope.trace.order_id);
224
+ if ($scope.trace.direct_child_order_ids.length > 0) {
225
+ _.each($scope.trace.direct_child_order_ids, function(ele) {
226
+ _.pull($scope.childParentFilter.hide_trace_ids, ele);
227
+ });
228
+ }
229
+ }
230
+
231
+ $scope.hasChild = function() {
232
+ return _.find($scope.traces, function(trace) {
233
+ return _.contains(trace.parent_ids, $scope.trace.order_id)
234
+ });
235
+ }
236
+ })
237
+
238
+ .data-collect
239
+ / dont use local_trace_data.to_json, because ActiveSupport override it and can introduce unexpected crash for some data
240
+ #trace-data(data-trace="#{jsonify_tp_result_chain}"
241
+ data-tp-events="#{jsonify_events}"
242
+ data-tp-self-caches="#{jsonify_tp_self_caches}")
@@ -1,11 +1,23 @@
1
1
  module SourceRoute
2
-
2
+ # How it work
3
+ # 0. Config collect route options
4
+ # 1. Proxy generate TracePoint Filter
5
+ # 2. Proxy generate TracePoint Monitor Block
6
+ # 3. Generator collect Wanted TracePoint
7
+ # 4. Parse and Generate Useful data from wanted TracePoint
8
+ # 5. Output data with correct format
3
9
  class GenerateResult
4
10
 
11
+ attr_reader :tp_result_chain, :tp_self_caches, :collected_data
12
+
13
+ extend Forwardable
14
+
15
+ def_delegators :@tp_result_chain, :import_return_value_to_call_chain, :treeize_call_chain, :call_chain, :return_chain, :parent_length_list
16
+
5
17
  Config = Struct.new(:format, :show_additional_attrs,
6
18
  :include_local_var, :include_instance_var,
7
19
  :filename, :import_return_to_call) do
8
- def initialize(f="silence", s=[], ilr=false, iiv=false)
20
+ def initialize(f=:test, s=[], ilr=false, iiv=false)
9
21
  super(f, s, ilr, iiv)
10
22
  end
11
23
  end
@@ -32,39 +44,48 @@ module SourceRoute
32
44
 
33
45
  @config = @wrapper.condition.result_config
34
46
 
35
- @tp_events = @wrapper.condition.events
47
+ @tp_result_chain = TpResultChain.new
48
+
49
+ @tp_self_caches = []
50
+ @wanted_attributes = {}
36
51
  end
37
52
 
38
- def output_attributes(event)
39
- attrs = DEFAULT_ATTRS[event] + Array(@config.show_additional_attrs)
40
- attrs.push(:event) if @tp_events.size > 1
41
- attrs.uniq
53
+ # it cached and only calculate once for one trace point block round
54
+ def self.wanted_attributes(eve)
55
+ event = eve.to_sym
56
+ @wanted_attributes.fetch event do
57
+ attrs = DEFAULT_ATTRS[event] + Array(SourceRoute.wrapper.condition.result_config.show_additional_attrs)
58
+ attrs.push(:event)
59
+ @wanted_attributes[event] = attrs.uniq
60
+ @wanted_attributes[event]
61
+ end
42
62
  end
43
63
 
44
- def build(trace_point_instance)
45
- @tp = trace_point_instance
46
- collect_tp_data
47
- collect_tp_self # NEED more check. Does TracePoint support self for all events?
48
- collect_local_var_data if @config[:include_local_var]
49
- collect_instance_var_data if @config[:include_instance_var]
50
- @collect_data
64
+ def self.clear_wanted_attributes
65
+ @wanted_attributes = {}
51
66
  end
52
67
 
53
68
  def output(tp_ins)
54
-
55
69
  format = @config.format
56
70
  format = format.to_sym if format.respond_to? :to_sym
57
71
 
72
+ assign_tp_self_caches(tp_ins)
73
+ # we cant call method on tp_ins outside of track block,
74
+ # so we have to run it immediately
75
+
76
+ @collected_data = TpResult.new(tp_ins)
77
+
58
78
  case format
59
- when :none
60
- # do nothing
61
- when :console # need @collect_data
62
- console_put
79
+ when :console
80
+ console_put(tp_ins)
63
81
  when :html
64
- # I cant solve the problem: to generate html at the end,
65
- # I have to know when the application is end
66
- when :test, :silence
67
- # do nothing at now
82
+ # we cant generate html right now becase the tp collection is still in process
83
+ # so we collect tp here
84
+ @tp_result_chain.push(TpResult.new(tp_ins))
85
+ when :silence, :none
86
+ # do nothing at now
87
+ when :test
88
+ @tp_result_chain.push(TpResult.new(tp_ins))
68
89
  when :stack_overflow
69
90
  console_stack_overflow
70
91
  when Proc
@@ -75,52 +96,94 @@ module SourceRoute
75
96
  end
76
97
  end
77
98
 
78
- private
99
+ # def build(trace_point_instance)
100
+ # TpResult.new(trace_point_instance)
101
+ # # tp_result.collect_self
79
102
 
80
- def collect_tp_data
81
- tp_data = output_attributes(@tp.event).inject({}) do |memo, key|
82
- memo[key.to_sym] = @tp.send(key) if @tp.respond_to?(key)
83
- memo
84
- end
85
- @collect_data = TpResult.new(tp_data)
86
- puts @collect_data.inspect if @wrapper.condition.is_debug?
87
- end
103
+ # # @tp = trace_point_instance
104
+ # # collect_tp_data
105
+ # # collect_tp_self # NEED more check. Does TracePoint support self for all events?
106
+ # # collect_local_var_data if @config[:include_local_var]
107
+ # # collect_instance_var_data if @config[:include_instance_var]
108
+ # # @collected_data
109
+ # end
110
+
111
+ # def collect_tp_result
112
+ # tp_result = TpResult.new(tp)
113
+ # end
88
114
 
89
115
  # include? will evaluate @tp.self, if @tp.self is AR::Relation, it could cause problems
90
116
  # So that's why I use object_id as replace
91
- def collect_tp_self
92
- unless @wrapper.tp_self_caches.find { |tp_cache| tp_cache.equal? @tp.self }
93
- @wrapper.tp_self_caches.push @tp.self
117
+ def assign_tp_self_caches(tp_ins)
118
+ unless tp_self_caches.find { |tp_cache| tp_cache.object_id.equal? tp_ins.self.object_id }
119
+ tp_self_caches.push tp_ins.self
94
120
  end
95
- @collect_data[:tp_self] = @wrapper.tp_self_caches.map(&:__id__).index(@tp.self.__id__)
96
121
  end
97
122
 
98
- def collect_local_var_data
99
- local_var_hash = {}
123
+ def jsonify_events
124
+ Oj.dump(@wrapper.condition.events.map(&:to_s))
125
+ end
100
126
 
101
- # Warn: @tp.binding.eval('local_variables') =! @tp.binding.send('local_variables')
102
- @tp.binding.eval('local_variables').each do |v|
103
- local_var_hash[v] = @tp.binding.local_variable_get(v).source_route_display
104
- end
105
- if local_var_hash != {}
106
- @collect_data.merge!(local_var: local_var_hash)
107
- end
127
+ def jsonify_tp_result_chain
128
+ Oj.dump(tp_result_chain.chain.map(&:to_hash))
129
+ # tp_result_chain.to_json
130
+ # json_array = tp_result_chain.map { |result| Jsonify.dump(result) }
131
+ # '[ ' + json_array.join(',') + ' ]'
108
132
  end
109
133
 
110
- def collect_instance_var_data
111
- instance_var_hash = {}
112
- @tp.self.instance_variables.each do |key|
113
- instance_var_hash[key] = @tp.self.instance_variable_get(key).source_route_display
114
- end
115
- if instance_var_hash != {}
116
- @collect_data.merge!(instance_var: instance_var_hash)
117
- end
134
+ def jsonify_tp_self_caches
135
+ Oj.dump(tp_self_caches.clone
136
+ .map(&:to_s))
118
137
  end
119
138
 
120
- def console_put
139
+ private
140
+
141
+ # def collect_tp_data
142
+ # tp_data = wanted_attributes(@tp.event).inject({}) do |memo, key|
143
+ # memo[key.to_sym] = @tp.send(key) if @tp.respond_to?(key)
144
+ # memo
145
+ # end
146
+ # @collected_data = TpResult.new(tp_data)
147
+ # puts @collected_data.inspect if @wrapper.condition.is_debug?
148
+ # end
149
+
150
+ # def collect_tp_self(tp)
151
+ # unless tp_self_caches.find { |tp_cache| tp_cache.object_id.equal? tp.self.object_id }
152
+ # tp_self_caches.push tp.self
153
+ # end
154
+ # @collected_data[:tp_self_refer] = tp_self_caches.map(&:__id__).index(tp.self.__id__)
155
+ # end
156
+
157
+ # def collect_local_var_data
158
+ # local_var_hash = {}
159
+ # # Warn: @tp.binding.eval('local_variables') =! @tp.binding.send('local_variables')
160
+ # @tp.binding.eval('local_variables').each do |v|
161
+ # # I need rememeber why i need source_route_display
162
+ # local_var_hash[v] = @tp.binding.local_variable_get(v).source_route_display
163
+ # end
164
+ # if local_var_hash != {}
165
+ # @collected_data.merge!(local_var: local_var_hash)
166
+ # end
167
+ # end
168
+
169
+ # def collect_instance_var_data
170
+ # instance_var_hash = {}
171
+ # @tp.self.instance_variables.each do |key|
172
+ # instance_var_hash[key] = @tp.self.instance_variable_get(key).source_route_display
173
+ # end
174
+ # if instance_var_hash != {}
175
+ # @collected_data.merge!(instance_var: instance_var_hash)
176
+ # end
177
+ # end
178
+
179
+ def console_put(tp)
121
180
  ret = []
122
- ret << "#{@collect_data[:defined_class].inspect}##{@collect_data[:method_id]}"
123
- left_values = @collect_data.reject { |k, v| %w[defined_class method_id].include? k.to_s }
181
+ ret << "#{collected_data.defined_class.inspect}##{collected_data.method_id}"
182
+ left_attrs = self.class.wanted_attributes(tp.event) - [:defined_class, :method_id]
183
+ left_values = left_attrs.inject({}) do |memo, key|
184
+ memo[key] = collected_data.send(key)
185
+ memo
186
+ end
124
187
  unless left_values == {}
125
188
  ret << left_values
126
189
  end
@@ -128,7 +191,7 @@ module SourceRoute
128
191
  end
129
192
 
130
193
  def console_stack_overflow
131
- ap "#{@collect_data[:defined_class].inspect}##{@collect_data[:method_id]}"
194
+ ap "#{collected_data.defined_class.inspect}##{collected_data.method_id}"
132
195
  end
133
196
 
134
197
  end # END GenerateResult
@@ -4,7 +4,8 @@ module Jsonify
4
4
  if obj.respond_to? :stringify
5
5
  JSON.dump(obj.stringify)
6
6
  else
7
- JSON.dump(obj.to_s)
7
+ # JSON.dump(obj.to_s)
8
+ JSON.dump(obj.inspect)
8
9
  end
9
10
  end
10
11