jinyu-debug-tools 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|