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 +4 -4
- data/lib/call.rb +30 -0
- data/lib/html.rb +64 -0
- data/lib/tracer.rb +65 -0
- data/lib/visual_call_html.rb +33 -3
- metadata +9 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0b3bc8a9e40282d73db18c4fc8c5fe335f67b56215cae90e16798677586c8bf3
|
4
|
+
data.tar.gz: 53ce8bf54cc935ec9e38be6de0c803c99cc6845dc556c28058b35d70666e014d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
data/lib/visual_call_html.rb
CHANGED
@@ -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
|
-
|
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
|
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:
|
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
|
-
|
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.
|