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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b27dc3d03a58a63332f7e55bb274c52b526f201c
4
- data.tar.gz: cbfe272959aa634d7d9a87f1d6be8b85bc6dee42
3
+ metadata.gz: e76e237ba83f99628fb902909eef4e7797ceec83
4
+ data.tar.gz: bc65d505c44891b8c5cdde01b71b38dbc28c929a
5
5
  SHA512:
6
- metadata.gz: d42782d5e7304f04860cd56093c325d642d4807427096eaf3d9f57d454b75476eefa64693654b6356797d6c0e85cf91de4783c1940b3c20400a3cc2d4e67902b
7
- data.tar.gz: cf3bb91f1705080677893258d22318aab0a4ec71025157ba97570c81156883a6f705885b9863ff97aded70a8fc4535803ab945df9166687821f6dff28e5b8421
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
- puts "jinyu.debug: #{caller[0]} calls #{method_name}, #{method_args}" if !method_name.to_sym.match(/^__/)
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.2
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