pretty_backtrace 0.0.2 → 0.1.0
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/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
|