visual_call_html 0.0.1 → 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
  SHA256:
3
- metadata.gz: ef3222b170ff9c8d84ef68316682389631dadaa7024b76c8f844f5f09ceb002f
4
- data.tar.gz: 9a6b9c8f25f93eb4030b32d48cb547c4034a89ed0147e7e3d46a453097402cc4
3
+ metadata.gz: 0b3bc8a9e40282d73db18c4fc8c5fe335f67b56215cae90e16798677586c8bf3
4
+ data.tar.gz: 53ce8bf54cc935ec9e38be6de0c803c99cc6845dc556c28058b35d70666e014d
5
5
  SHA512:
6
- metadata.gz: fbc947f31caf6ac24b237f84054ec48005939fd306233e0dbe670c6f615f512a34a7b6c71e61eb4bcf83a64a56ce2c26fc919e8de4527d46ab26ed57a2beb701
7
- data.tar.gz: 03ca4e92d7210b37484e70f7e1af5907af5a80688ed777525115762321394b6c751efdd7bb8980c2dcd29ea5c4876360fc3ccd2529d106364fc0d4ec2a1a3d02
6
+ metadata.gz: 18039c0ce4a18ef08e3a3d22e2ed04162f087f244b65eb64dfa062f165c2991adf9b400a4e647ace2e67a81bc4ef252deb338b0837cd61acdc11b2139568f7b1
7
+ data.tar.gz: 30b9cd2347484b739fc46d03d2016e054eb2dc3da6b906c19ead252e58df32403a10cd97aab549deb791e294f2764fddd3b92da4ec7acfa2899731a9aa161853
data/lib/call.rb ADDED
@@ -0,0 +1,30 @@
1
+ class Call
2
+ attr_reader :key, :class_id, :method_id
3
+ attr_accessor :start_time, :finish_time
4
+
5
+ def initialize(event)
6
+ @start_time = Time.now.to_f
7
+ @class_id = event.defined_class
8
+ @method_id = event.method_id
9
+ @key = generate_key
10
+ end
11
+
12
+ def finish
13
+ @finish_time ||= Time.now.to_f
14
+ execute_time
15
+ end
16
+
17
+ def execute_time
18
+ @finish_time.to_f - @start_time
19
+ end
20
+
21
+ def key?(key)
22
+ @key == key
23
+ end
24
+
25
+ private
26
+
27
+ def generate_key
28
+ [('a'..'z'), (0..9)].map(&:to_a).flatten.shuffle.join
29
+ end
30
+ end
data/lib/html.rb ADDED
@@ -0,0 +1,64 @@
1
+ require 'json'
2
+
3
+ class Html
4
+ def initialize data
5
+ @data = data.to_json
6
+ end
7
+
8
+ def print
9
+ File.write("#{Dir.pwd}/visual_call_html.html", doc)
10
+ end
11
+
12
+ private
13
+
14
+ def doc
15
+ <<-HTML
16
+ <!DOCTYPE html>
17
+ <html>
18
+ <head>
19
+ <script src="https://cdn.jsdelivr.net/npm/gojs/release/go.js">
20
+ </script>
21
+ <style>
22
+ * {
23
+ margin: 0;
24
+ padding: 0;
25
+ }
26
+ html, body, #myDiagramDiv {
27
+ width: 100%;
28
+ height: 100%;
29
+ }
30
+ body {
31
+ overflow: hidden;
32
+ }
33
+ </style>
34
+ </head>
35
+ <body>
36
+ <div id="myDiagramDiv"></div>
37
+ <script>
38
+ var $ = go.GraphObject.make;
39
+ var myDiagram =
40
+ $(go.Diagram, "myDiagramDiv",
41
+ {
42
+ "undoManager.isEnabled": true,
43
+ layout: $(go.TreeLayout, // specify a Diagram.layout that arranges trees
44
+ { angle: 90, layerSpacing: 35 })
45
+ });
46
+
47
+ // the template we defined earlier
48
+ myDiagram.nodeTemplate =
49
+ $(go.Node, "Horizontal",
50
+ new go.Binding("background", "color"),
51
+ $(go.TextBlock, "Default Text",
52
+ { margin: 12, stroke: "white", font: "bold 16px sans-serif" },
53
+ new go.Binding("text", "text"))
54
+ );
55
+
56
+ var model = $(go.TreeModel);
57
+ model.nodeDataArray = JSON.parse('#{@data}')
58
+ myDiagram.model = model;
59
+ </script>
60
+ </body>
61
+ </html>
62
+ HTML
63
+ end
64
+ end
data/lib/tracer.rb ADDED
@@ -0,0 +1,65 @@
1
+ require_relative 'call'
2
+
3
+ class Tracer
4
+ attr_reader :path, :data
5
+
6
+ def initialize(options = {})
7
+ @options = options
8
+ @trace = build_tracer
9
+ @path = []
10
+ @data = []
11
+ end
12
+
13
+ def enable
14
+ @trace.enable
15
+ end
16
+
17
+ def disable
18
+ @trace.disable
19
+ end
20
+
21
+ private
22
+
23
+ def build_tracer
24
+ TracePoint.new(:call, :return) do |event|
25
+ next if not_able_to_add?(event)
26
+
27
+ case event.event
28
+ when :return
29
+ run_when_return(event)
30
+ when :call
31
+ run_when_call(event)
32
+ end
33
+ end
34
+ end
35
+
36
+ def not_able_to_add?(event)
37
+ event.defined_class == self.class || event.defined_class == TracePoint
38
+ end
39
+
40
+ def run_when_call(event)
41
+ call = Call.new(event)
42
+
43
+ data = {
44
+ key: call.key,
45
+ parent: @path.last&.key,
46
+ call: call,
47
+ level: @path.size
48
+ }.compact
49
+
50
+ @data.push(data)
51
+ @path.push(call)
52
+ end
53
+
54
+ def run_when_return(event)
55
+ call = @path.pop
56
+ call&.finish
57
+ if @options[:display_return_value] && event.return_value && call
58
+ @data.push(
59
+ key: "#{call.key}_return",
60
+ parent: call.key,
61
+ return: event.return_value
62
+ )
63
+ end
64
+ end
65
+ end
@@ -1,17 +1,47 @@
1
1
  require_relative 'tracer'
2
2
  require_relative 'html'
3
+ require_relative 'call'
3
4
 
4
5
  module VisualCallHtml
5
6
  class << self
6
- def trace
7
+ def trace(options = {})
7
8
  return unless block_given?
8
9
 
9
- tracer = Tracer.new
10
+ tracer = Tracer.new(options)
10
11
  tracer.enable
11
12
  yield
12
13
  tracer.disable
13
14
 
14
- Html.new(tracer.data).print
15
+ data = tracer.data.map do |o|
16
+ next if o[:call].nil? && o[:return].nil?
17
+
18
+ text = if !o[:return].nil?
19
+ o[:return]
20
+ else
21
+ r = o[:call]&.class_id.to_s + "#" + o[:call]&.method_id.to_s
22
+ r += " (#{(o[:call].execute_time * 1000).round}ms)" if options[:display_time]
23
+ end
24
+
25
+ color = if o[:return]
26
+ "red"
27
+ else
28
+ "#44CCFF"
29
+ end
30
+
31
+ {
32
+ key: o[:key],
33
+ parent: o[:parent],
34
+ text: text,
35
+ color: color,
36
+ level: o[:level]
37
+ }.compact
38
+ end
39
+
40
+ if options[:level]
41
+ data = data.select{|o| o[:level].to_i <= options[:level]}
42
+ end
43
+
44
+ Html.new(data.compact).print
15
45
  end
16
46
  end
17
47
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: visual_call_html
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - hungkieu
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-22 00:00:00.000000000 Z
11
+ date: 2022-03-29 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Uses the TracePoint class & GoJS to generate a visual representation
14
14
  of all the methods called by another method.
@@ -17,9 +17,13 @@ executables: []
17
17
  extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
+ - lib/call.rb
21
+ - lib/html.rb
22
+ - lib/tracer.rb
20
23
  - lib/visual_call_html.rb
21
- homepage:
22
- licenses: []
24
+ homepage: https://github.com/muoihai-com/visual_call_html
25
+ licenses:
26
+ - MIT
23
27
  metadata: {}
24
28
  post_install_message:
25
29
  rdoc_options: []
@@ -36,8 +40,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
36
40
  - !ruby/object:Gem::Version
37
41
  version: '0'
38
42
  requirements: []
39
- rubyforge_project:
40
- rubygems_version: 2.7.6
43
+ rubygems_version: 3.3.3
41
44
  signing_key:
42
45
  specification_version: 4
43
46
  summary: This gem helps you see all the other methods called by another method.