jinyu-debug-tools 0.0.2 → 0.0.3
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/utils/code_parser.rb +161 -0
- data/lib/utils/method_debugger.rb +2 -1
- data/lib/utils/record_formatter.rb +50 -0
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e76e237ba83f99628fb902909eef4e7797ceec83
|
4
|
+
data.tar.gz: bc65d505c44891b8c5cdde01b71b38dbc28c929a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f7690ed8aa9f9da47d189f967412bfe9dee817734b8e73e5676ef97c51f1809292726704c027ee4c02007eb70f93381273a0a6ea73449b2016802bf1ad65a579
|
7
|
+
data.tar.gz: 258c3fe62b0915556f15507a6e28b165304a8fece43f5d19c0f76514a2eb6365271ff1b5eb30ea1a64f644d6ec535d6bd05246041719c54d80859e535b48c795
|
@@ -0,0 +1,161 @@
|
|
1
|
+
module JinyuDebugTools
|
2
|
+
module CodeParser
|
3
|
+
class CodeNode
|
4
|
+
|
5
|
+
def initialize(name)
|
6
|
+
@name = name
|
7
|
+
@children = []
|
8
|
+
end
|
9
|
+
|
10
|
+
def get_name
|
11
|
+
@name
|
12
|
+
end
|
13
|
+
|
14
|
+
def get_parent
|
15
|
+
@parent
|
16
|
+
end
|
17
|
+
|
18
|
+
def set_parent(parent_node)
|
19
|
+
@parent = parent_node
|
20
|
+
end
|
21
|
+
|
22
|
+
def append_child(child_node)
|
23
|
+
@children << child_node
|
24
|
+
end
|
25
|
+
|
26
|
+
def set_level(level)
|
27
|
+
@level = level
|
28
|
+
end
|
29
|
+
|
30
|
+
def get_level
|
31
|
+
@level
|
32
|
+
end
|
33
|
+
|
34
|
+
def get_index
|
35
|
+
@index
|
36
|
+
end
|
37
|
+
|
38
|
+
def set_index(list_index)
|
39
|
+
@index = list_index
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_s
|
43
|
+
@name
|
44
|
+
end
|
45
|
+
|
46
|
+
def to_hash
|
47
|
+
children = @children.map(&:to_hash)
|
48
|
+
children = nil if children.empty?
|
49
|
+
{@name => children}
|
50
|
+
end
|
51
|
+
|
52
|
+
def delete_child(child_node)
|
53
|
+
@children.delete(child_node)
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
class CodeTree
|
60
|
+
|
61
|
+
ROOT_NAME = 'JiNyUsUpErNoDe'
|
62
|
+
|
63
|
+
def initialize
|
64
|
+
@root = CodeNode.new(ROOT_NAME).tap { |node| node.set_level(0) }
|
65
|
+
@node_level_list = []
|
66
|
+
@node_level_list << [@root, @root.get_level]
|
67
|
+
@root.set_index(@node_level_list.size - 1)
|
68
|
+
end
|
69
|
+
|
70
|
+
def add_record(parent_name, child_name)
|
71
|
+
parent_node, parent_node_index = _find_parent_with_index(parent_name)
|
72
|
+
|
73
|
+
child_level = parent_node.get_level + 1
|
74
|
+
|
75
|
+
mistab_nodes = _find_mistab_nodes(parent_node_index, child_level)
|
76
|
+
if mistab_nodes.any?
|
77
|
+
mistab_nodes.each do |mistab_node|
|
78
|
+
mistab_node.set_parent(parent_node)
|
79
|
+
@root.delete_child(mistab_node)
|
80
|
+
parent_node.append_child(mistab_node)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
child_node = CodeNode.new(child_name)
|
85
|
+
child_node.set_level(child_level)
|
86
|
+
@node_level_list << child_node
|
87
|
+
child_node.set_index(@node_level_list.size - 1)
|
88
|
+
parent_node.append_child(child_node)
|
89
|
+
child_node.set_parent(parent_node)
|
90
|
+
|
91
|
+
return child_node, child_node.get_index
|
92
|
+
end
|
93
|
+
|
94
|
+
def get_reverse_index(index)
|
95
|
+
@node_level_list.size - 1 - index
|
96
|
+
end
|
97
|
+
|
98
|
+
def _find_parent_with_index(parent_name)
|
99
|
+
if parent_name == @root.get_name
|
100
|
+
return @root, @root.get_index
|
101
|
+
end
|
102
|
+
|
103
|
+
target_index_reverse = @node_level_list.size - 1
|
104
|
+
|
105
|
+
node_level_list_reverse = @node_level_list.reverse
|
106
|
+
node_level_list_reverse.each_with_index do |node_level_pair, index|
|
107
|
+
node, level = *node_level_pair
|
108
|
+
|
109
|
+
if node.get_name == parent_name
|
110
|
+
target_index_reverse = index
|
111
|
+
break
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
target_node, target_level = node_level_list_reverse[target_index_reverse]
|
116
|
+
target_index = get_reverse_index(target_index_reverse)
|
117
|
+
|
118
|
+
if target_node == @root
|
119
|
+
target_node, target_index = add_record(@root.get_name, parent_name)
|
120
|
+
end
|
121
|
+
|
122
|
+
return target_node, target_index
|
123
|
+
end
|
124
|
+
|
125
|
+
def _find_mistab_nodes(parent_node_index, child_level)
|
126
|
+
# ... because, the father node which attached on root directly like new
|
127
|
+
# would match this situation, parent is root and level < child_level
|
128
|
+
mistab_nodes = @node_level_list[parent_node_index...-1].select do |node, level|
|
129
|
+
next false if node.get_parent != @root
|
130
|
+
next false if node.get_level >= child_level
|
131
|
+
true
|
132
|
+
end
|
133
|
+
|
134
|
+
return mistab_nodes
|
135
|
+
end
|
136
|
+
|
137
|
+
def to_hash
|
138
|
+
@root.to_hash
|
139
|
+
end
|
140
|
+
|
141
|
+
def my_pretty_print
|
142
|
+
require 'json'
|
143
|
+
output = JSON.pretty_generate(self.to_hash)
|
144
|
+
output.gsub!(/[\{\}\[\],:]| null/,'')
|
145
|
+
output.gsub!(/^\s+$/,'')
|
146
|
+
output.gsub!(/^\n/,'')
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def self.parse_logs(log_str)
|
151
|
+
logs =log_str.each_line.map(&:chomp)
|
152
|
+
records = logs.map {|log| log.split(' ')}
|
153
|
+
tree = CodeTree.new
|
154
|
+
records.each do |parent_name, child_name|
|
155
|
+
tree.add_record(parent_name, child_name)
|
156
|
+
end
|
157
|
+
|
158
|
+
return tree.my_pretty_print
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
@@ -12,7 +12,8 @@ module JinyuDebugTools
|
|
12
12
|
alias_method "__#{method_name}".to_sym, method_name
|
13
13
|
|
14
14
|
define_method(method_name) do |*method_args, &block|
|
15
|
-
|
15
|
+
caller_file = caller[0].split('/').last
|
16
|
+
puts "jinyu.debug: #{caller_file} calls #{method_name}, #{method_args.map(&:class)}" if !method_name.to_sym.match(/^__/)
|
16
17
|
self.send("__#{method_name}".to_sym, *method_args, &block)
|
17
18
|
end
|
18
19
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module JinyuDebugTools
|
2
|
+
class RecordFormatter
|
3
|
+
|
4
|
+
ELEMENT_MAPPING = {
|
5
|
+
:file_name => 1,
|
6
|
+
:line_number => 2,
|
7
|
+
:from_method => 3,
|
8
|
+
:to_method => 4,
|
9
|
+
:arguments => 5
|
10
|
+
}
|
11
|
+
|
12
|
+
# "abc.rb:123:in `cde!' calls fgh?, [String]"
|
13
|
+
REG = /^(.*?)\.rb\:(\d+)\:in \`([a-zA-Z_0-9 \?\!]*?)\' calls ([a-zA-Z0-9_\?\!]+)\, \[(.*?)\]/
|
14
|
+
def self.format_raw_log(raw_log, required_element_names)
|
15
|
+
|
16
|
+
raw_log_lines = raw_log.each_line.map(&:chomp)
|
17
|
+
p raw_log_lines.first
|
18
|
+
raw_log_elements = raw_log_lines.map do |line|
|
19
|
+
_, file_name, line_number, from_method, to_method, arguments_str = *REG.match(line)
|
20
|
+
# [String, Array]
|
21
|
+
arguments = arguments_str.split(', ')
|
22
|
+
|
23
|
+
# in block in cde!
|
24
|
+
from_method = from_method.split(' ').last
|
25
|
+
|
26
|
+
# the same as match result, ignore the matched sentence
|
27
|
+
[nil, file_name, line_number, from_method, to_method, arguments]
|
28
|
+
end
|
29
|
+
|
30
|
+
result = raw_log_elements.map do |raw_log_element|
|
31
|
+
required_element_names.map do |required_element_name|
|
32
|
+
raw_log_element[ELEMENT_MAPPING[required_element_name]]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
return result
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.format_raw_log_file(file_name)
|
40
|
+
output_file_name = "#{file_name}.record"
|
41
|
+
log_raw = File.open(file_name).read
|
42
|
+
result = RecordFormatter.format_raw_log(log_raw, [:from_method, :to_method])
|
43
|
+
File.open(output_file_name, 'w+') do |file|
|
44
|
+
result.each do |line|
|
45
|
+
file.puts(line.join(' '))
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jinyu-debug-tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yukai Jin
|
@@ -16,7 +16,9 @@ executables: []
|
|
16
16
|
extensions: []
|
17
17
|
extra_rdoc_files: []
|
18
18
|
files:
|
19
|
+
- lib/utils/code_parser.rb
|
19
20
|
- lib/utils/method_debugger.rb
|
21
|
+
- lib/utils/record_formatter.rb
|
20
22
|
homepage: https://github.com/fish1928/JinyuDebugTools
|
21
23
|
licenses:
|
22
24
|
- MIT
|