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 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