pretty_backtrace 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +42 -10
- data/lib/pretty_backtrace.rb +74 -27
- data/lib/pretty_backtrace/version.rb +1 -1
- data/test.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 19a8c64399c2b093fa2ac3a14550b07def30fe4a
|
4
|
+
data.tar.gz: cfd978435567433f61bb149594b1b519104cdba2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b67be67115eea63f4e58a5d5222c7ad4fdf0579a576485459ed0b3f6a20443c825c8bf944ccd1fee93bd2e370b29dd7bcc54011c75f277c617308bd040ab3a01
|
7
|
+
data.tar.gz: 37f4d2e3d9037dd8284554015a5a8b3d07d86d23179490bffa2052f73bfb2e08d4a8ef1caf915810cf2f2d66ce6ee1e2da66eeb702aacbcbb331398d1d6e4af1
|
data/README.md
CHANGED
@@ -57,27 +57,59 @@ PrettyBacktrace::CONFIG can change behaviour. See source code files for details.
|
|
57
57
|
You can use multi-line mode with the following configuration.
|
58
58
|
|
59
59
|
```ruby
|
60
|
-
PrettyBacktrace
|
60
|
+
PrettyBacktrace.multi_line = true
|
61
61
|
```
|
62
62
|
|
63
|
-
Multi-line mode enable to show all variables (and pointing values) in each lines like that:
|
63
|
+
Multi-line mode enable to show file contents and all variables (and pointing values) in each lines like that:
|
64
64
|
|
65
65
|
```
|
66
66
|
test.rb:11:in `recursive'
|
67
|
-
|
68
|
-
|
67
|
+
[FILE]
|
68
|
+
9| recursive n - 1
|
69
|
+
10| else
|
70
|
+
-> 11| raise "bottom of recursive"
|
71
|
+
12| end
|
72
|
+
13|end
|
73
|
+
|
74
|
+
[LOCAL VARIABLES]
|
75
|
+
n = 0
|
76
|
+
str = "Hi 0!! Hi 0!! Hi 0!! Hi 0!! Hi 0!! Hi 0!! Hi 0!! Hi 0...
|
69
77
|
: bottom of recursive (RuntimeError)
|
70
78
|
from test.rb:9:in `recursive'
|
71
|
-
|
72
|
-
|
79
|
+
[FILE]
|
80
|
+
7| str = "Hi #{n}!! " * 128
|
81
|
+
8| if n > 0
|
82
|
+
-> 9| recursive n - 1
|
83
|
+
10| else
|
84
|
+
11| raise "bottom of recursive"
|
85
|
+
|
86
|
+
[LOCAL VARIABLES]
|
87
|
+
n = 1
|
88
|
+
str = "Hi 1!! Hi 1!! Hi 1!! Hi 1!! Hi 1!! Hi 1!! Hi 1!! Hi 1...
|
73
89
|
|
74
90
|
from test.rb:9:in `recursive'
|
75
|
-
|
76
|
-
|
91
|
+
[FILE]
|
92
|
+
7| str = "Hi #{n}!! " * 128
|
93
|
+
8| if n > 0
|
94
|
+
-> 9| recursive n - 1
|
95
|
+
10| else
|
96
|
+
11| raise "bottom of recursive"
|
97
|
+
|
98
|
+
[LOCAL VARIABLES]
|
99
|
+
n = 2
|
100
|
+
str = "Hi 2!! Hi 2!! Hi 2!! Hi 2!! Hi 2!! Hi 2!! Hi 2!! Hi 2...
|
77
101
|
|
78
102
|
from test.rb:9:in `recursive'
|
79
|
-
|
80
|
-
|
103
|
+
[FILE]
|
104
|
+
7| str = "Hi #{n}!! " * 128
|
105
|
+
8| if n > 0
|
106
|
+
-> 9| recursive n - 1
|
107
|
+
10| else
|
108
|
+
11| raise "bottom of recursive"
|
109
|
+
|
110
|
+
[LOCAL VARIABLES]
|
111
|
+
n = 3
|
112
|
+
str = "Hi 3!! Hi 3!! Hi 3!! Hi 3!! Hi 3!! Hi 3!! Hi 3!! Hi 3...
|
81
113
|
|
82
114
|
from test.rb:15:in `<main>'
|
83
115
|
```
|
data/lib/pretty_backtrace.rb
CHANGED
@@ -5,6 +5,10 @@ module PrettyBacktrace
|
|
5
5
|
CONFIG = {
|
6
6
|
truncate_length: 20,
|
7
7
|
disabled_exception_classes: {},
|
8
|
+
effective_lines: 0, # 0 is infinite
|
9
|
+
file_contents: true,
|
10
|
+
file_contents_lines: 2,
|
11
|
+
|
8
12
|
multi_line: false,
|
9
13
|
multi_line_truncate_length: 60,
|
10
14
|
multi_line_indent: 10,
|
@@ -20,8 +24,13 @@ module PrettyBacktrace
|
|
20
24
|
|
21
25
|
RubyVM::DebugInspector.open{|dc|
|
22
26
|
locs = dc.backtrace_locations
|
27
|
+
|
28
|
+
effective_lines = CONFIG[:effective_lines]
|
29
|
+
effective_lines = locs.size - 2 if effective_lines == 0
|
30
|
+
|
23
31
|
pretty_backtrace = locs.map.with_index{|loc, i|
|
24
32
|
next if i < 2
|
33
|
+
next loc.to_s unless (effective_lines -= 1) >= 0
|
25
34
|
|
26
35
|
iseq = dc.frame_iseq(i)
|
27
36
|
|
@@ -36,7 +45,7 @@ module PrettyBacktrace
|
|
36
45
|
lvs_val = {}
|
37
46
|
end
|
38
47
|
|
39
|
-
modify_trace_line loc, lvs_val
|
48
|
+
modify_trace_line loc, loc.absolute_path, loc.lineno, lvs_val
|
40
49
|
}.compact
|
41
50
|
e.set_backtrace pretty_backtrace
|
42
51
|
}
|
@@ -47,26 +56,6 @@ module PrettyBacktrace
|
|
47
56
|
end
|
48
57
|
}
|
49
58
|
|
50
|
-
def self.enable
|
51
|
-
if block_given?
|
52
|
-
EXCEPTION_MODIFIER_TRACE.enable{
|
53
|
-
yield
|
54
|
-
}
|
55
|
-
else
|
56
|
-
EXCEPTION_MODIFIER_TRACE.enable
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def self.disable
|
61
|
-
if block_given?
|
62
|
-
EXCEPTION_MODIFIER_TRACE.disable{
|
63
|
-
yield
|
64
|
-
}
|
65
|
-
else
|
66
|
-
EXCEPTION_MODIFIER_TRACE.disable
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
59
|
def self.iseq_local_variables iseq
|
71
60
|
_,_,_,_,arg_info,name,path,a_path,_,type,lvs, * = iseq.to_a
|
72
61
|
lvs
|
@@ -76,16 +65,40 @@ module PrettyBacktrace
|
|
76
65
|
# local_variables_values is a Hash object containing pairs of
|
77
66
|
# a local variable name and value of local variable.
|
78
67
|
#
|
79
|
-
def self.modify_trace_line backtrace_location, local_variables_values
|
68
|
+
def self.modify_trace_line backtrace_location, absolute_path, lineno, local_variables_values
|
80
69
|
trace_line = backtrace_location.to_s
|
81
70
|
|
82
71
|
unless local_variables_values.empty?
|
83
72
|
if CONFIG[:multi_line]
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
73
|
+
indent = ' ' * CONFIG[:multi_line_indent]
|
74
|
+
additional = ''
|
75
|
+
|
76
|
+
# file scope
|
77
|
+
if CONFIG[:file_contents] && File.exists?(absolute_path)
|
78
|
+
fclines = CONFIG[:file_contents_lines]
|
79
|
+
start_line = lineno - 1 - 1 * fclines
|
80
|
+
start_line = 0 if start_line < 0
|
81
|
+
|
82
|
+
additional << indent + "[FILE]\n"
|
83
|
+
additional << open(absolute_path){|f| f.readlines[start_line, 1 + 2 * fclines]}.map.with_index{|line, i|
|
84
|
+
ln = start_line + i + 1
|
85
|
+
line = line.chomp
|
86
|
+
'%s%4d|%s' % [ln == lineno ? indent[0..-3] + "->" : indent, ln, line]
|
87
|
+
}.join("\n")
|
88
|
+
additional << "\n"
|
89
|
+
additional << "\n"
|
90
|
+
end
|
91
|
+
|
92
|
+
# local variables
|
93
|
+
unless local_variables_values.empty?
|
94
|
+
additional << indent + "[LOCAL VARIABLES]\n"
|
95
|
+
additional << local_variables_values.map{|lv, v|
|
96
|
+
v = v[0..CONFIG[:multi_line_truncate_length]] + '...' if v.length > CONFIG[:multi_line_truncate_length]
|
97
|
+
indent + " #{lv} = #{v.to_s}"
|
98
|
+
}.join("\n") + "\n"
|
99
|
+
end
|
100
|
+
|
101
|
+
trace_line = "#{trace_line}\n#{additional}" unless additional.empty?
|
89
102
|
else
|
90
103
|
additional = local_variables_values.map{|lv, v|
|
91
104
|
v = v[0..CONFIG[:truncate_length]] + '...' if v.length > CONFIG[:truncate_length]
|
@@ -97,4 +110,38 @@ module PrettyBacktrace
|
|
97
110
|
|
98
111
|
trace_line
|
99
112
|
end
|
113
|
+
|
114
|
+
# configuration
|
115
|
+
|
116
|
+
def self.enable
|
117
|
+
if block_given?
|
118
|
+
EXCEPTION_MODIFIER_TRACE.enable{
|
119
|
+
yield
|
120
|
+
}
|
121
|
+
else
|
122
|
+
EXCEPTION_MODIFIER_TRACE.enable
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def self.disable
|
127
|
+
if block_given?
|
128
|
+
EXCEPTION_MODIFIER_TRACE.disable{
|
129
|
+
yield
|
130
|
+
}
|
131
|
+
else
|
132
|
+
EXCEPTION_MODIFIER_TRACE.disable
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def self.multi_line=(setting)
|
137
|
+
CONFIG[:multi_line] = setting
|
138
|
+
end
|
139
|
+
|
140
|
+
def self.file_contents=(setting)
|
141
|
+
CONFIG[:file_contents] = setting
|
142
|
+
end
|
143
|
+
|
144
|
+
def self.effective_lines=(lines)
|
145
|
+
CONFIG[:effective_lines] = lines
|
146
|
+
end
|
100
147
|
end
|
data/test.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pretty_backtrace
|
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
|
- Koichi Sasada
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-02-
|
11
|
+
date: 2015-02-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: debug_inspector
|