render_me_pretty 0.5.0 → 0.6.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/CHANGELOG.md +4 -0
- data/Gemfile.lock +1 -1
- data/lib/render_me_pretty/erb.rb +23 -38
- data/lib/render_me_pretty/erb/base_handler.rb +75 -0
- data/lib/render_me_pretty/erb/main_error_handler.rb +21 -0
- data/lib/render_me_pretty/erb/syntax_error_handler.rb +26 -0
- data/lib/render_me_pretty/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9175cf8f3c94175794b0bc0f5ed0ef8e9620193889d9fb17da206bd1eda235b9
|
4
|
+
data.tar.gz: aa14dc5c61c60629ab3e6871a65c9a80e2ec51523e0bfd252aba1f3401949668
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 40315ff34828109eca1823fa9e4238021fc333d2311d8b22cc0d752b2b962d7cf53114b146737ba2954fcb8d52bbffdaadaae2de9fcf266f56845450dec2ce60
|
7
|
+
data.tar.gz: a9067cc69cb6316cd37af1dd0d9175c18402d07c71e33afac2f04a0c31173134fa5247d0f47b87768eae5dbf0d4593ceaaa1a713bf65d289fbb0b1b8e14aef08
|
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,10 @@
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
4
4
|
This project *tries* to adhere to [Semantic Versioning](http://semver.org/), even before v1.0.
|
5
5
|
|
6
|
+
## [0.6.0]
|
7
|
+
- Handle SyntaxError errors correctly
|
8
|
+
- refactor into MainErrorHandler and SyntaxError classes
|
9
|
+
|
6
10
|
## [0.5.0]
|
7
11
|
- fix find_template_error_line
|
8
12
|
- remove some of the filtering for backtrace lines
|
data/Gemfile.lock
CHANGED
data/lib/render_me_pretty/erb.rb
CHANGED
@@ -43,6 +43,10 @@ require 'tilt/erb'
|
|
43
43
|
|
44
44
|
module RenderMePretty
|
45
45
|
class Erb
|
46
|
+
autoload :BaseHandler, 'render_me_pretty/erb/base_handler'
|
47
|
+
autoload :SyntaxErrorHandler, "render_me_pretty/erb/syntax_error_handler"
|
48
|
+
autoload :MainErrorHandler, "render_me_pretty/erb/main_error_handler"
|
49
|
+
|
46
50
|
def initialize(path, variables={})
|
47
51
|
@path = path
|
48
52
|
@init_vars = variables
|
@@ -76,47 +80,28 @@ module RenderMePretty
|
|
76
80
|
end
|
77
81
|
end
|
78
82
|
|
79
|
-
#
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
# For Tilt, first line of the baacktrace that contains the path of the file
|
87
|
-
# we're rendeirng has the line number. Example:
|
83
|
+
# Handles Tilt error in prettier manner.
|
84
|
+
#
|
85
|
+
# When there's a syntax error Tilt does not include the line nubmer of the
|
86
|
+
# error in the backtrace it is instead included in the e.message itself.
|
87
|
+
#
|
88
|
+
# When for other errors the line_number is included in the backtrace.
|
88
89
|
#
|
89
|
-
#
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
90
|
+
# Refer to specs and uncomment puts out to see the different types of errors.
|
91
|
+
def handle_exception(e)
|
92
|
+
# puts "*" * 30
|
93
|
+
# puts e.class.to_s.colorize(:cyan)
|
94
|
+
# puts e.message.colorize(:cyan)
|
95
|
+
# puts e.backtrace
|
96
|
+
# puts "*" * 30
|
97
|
+
handler = e.is_a?(SyntaxError) ?
|
98
|
+
SyntaxErrorHandler.new(@path, e) :
|
99
|
+
MainErrorHandler.new(@path, e)
|
100
|
+
io = handler.handle
|
101
|
+
print_result(io)
|
95
102
|
end
|
96
103
|
|
97
|
-
|
98
|
-
def pretty_error(e, line)
|
99
|
-
pretty_path = @path.sub(/^\.\//, '')
|
100
|
-
io = StringIO.new
|
101
|
-
io.puts "#{e.class}: #{e.message}"
|
102
|
-
io.puts "Error evaluating ERB template on line #{line.to_s.colorize(:red)} of: #{pretty_path}:"
|
103
|
-
|
104
|
-
template = IO.read(@path)
|
105
|
-
template_lines = template.split("\n")
|
106
|
-
context = 5 # lines of context
|
107
|
-
top, bottom = [line-context-1, 0].max, line+context-1
|
108
|
-
spacing = template_lines.size.to_s.size
|
109
|
-
template_lines[top..bottom].each_with_index do |line_content, index|
|
110
|
-
line_number = top+index+1
|
111
|
-
if line_number == line
|
112
|
-
io.printf("%#{spacing}d %s\n".colorize(:red), line_number, line_content)
|
113
|
-
else
|
114
|
-
io.printf("%#{spacing}d %s\n", line_number, line_content)
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
io.puts backtrace_lines(e)
|
119
|
-
|
104
|
+
def print_result(io)
|
120
105
|
if ENV['TEST']
|
121
106
|
io.string
|
122
107
|
else
|
@@ -0,0 +1,75 @@
|
|
1
|
+
class RenderMePretty::Erb
|
2
|
+
class BaseHandler
|
3
|
+
def initialize(path, exception)
|
4
|
+
@path = path
|
5
|
+
@exception = exception
|
6
|
+
end
|
7
|
+
|
8
|
+
def pretty_trace(error_line_number, full_message=true)
|
9
|
+
io = StringIO.new
|
10
|
+
|
11
|
+
message = full_message ? ": #{@exception.message}" : ""
|
12
|
+
io.puts "#{@exception.class}#{message}".colorize(:red)
|
13
|
+
|
14
|
+
pretty_path = @path.sub(/^\.\//, '')
|
15
|
+
io.puts "Error evaluating ERB template on line #{error_line_number.to_s.colorize(:red)} of: #{pretty_path}:"
|
16
|
+
|
17
|
+
context = 5 # lines of context
|
18
|
+
top, bottom = [error_line_number-context-1, 0].max, error_line_number+context-1
|
19
|
+
|
20
|
+
lines = IO.read(@path).split("\n")
|
21
|
+
spacing = lines.size.to_s.size
|
22
|
+
lines[top..bottom].each_with_index do |line_content, index|
|
23
|
+
current_line_number = top+index+1
|
24
|
+
if current_line_number == error_line_number
|
25
|
+
io.printf("%#{spacing}d %s\n".colorize(:red), current_line_number, line_content)
|
26
|
+
else
|
27
|
+
io.printf("%#{spacing}d %s\n", current_line_number, line_content)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
io.puts backtrace_lines
|
32
|
+
io
|
33
|
+
end
|
34
|
+
|
35
|
+
# Method produces a filtered original stack trace that can be appended to
|
36
|
+
# the pretty backtrace output.
|
37
|
+
#
|
38
|
+
# It parses the original backtrace that looks something like this:
|
39
|
+
#
|
40
|
+
# (erb):380:in `get_binding'
|
41
|
+
# /Users/tung/.rbenv/versions/2.5.0/lib/ruby/2.5.0/erb.rb:885:in `eval'
|
42
|
+
# /Users/tung/.rbenv/versions/2.5.0/lib/ruby/2.5.0/erb.rb:885:in `result'
|
43
|
+
# /Users/tung/src/tongueroo/lono/vendor/render_me_pretty/lib/render_me_pretty/erb.rb:67:in `render'
|
44
|
+
# /Users/tung/src/tongueroo/lono/vendor/render_me_pretty/lib/render_me_pretty.rb:11:in `result'
|
45
|
+
# /Users/tung/src/tongueroo/lono/lib/lono/template/template.rb:32:in `build'
|
46
|
+
# /Users/tung/src/tongueroo/lono/lib/lono/template/dsl.rb:82:in `block in build_templates'
|
47
|
+
# /Users/tung/src/tongueroo/lono/lib/lono/template/dsl.rb:81:in `each'
|
48
|
+
def backtrace_lines
|
49
|
+
full = ENV['FULL_BACKTRACE']
|
50
|
+
if full
|
51
|
+
lines = @exception.backtrace
|
52
|
+
else
|
53
|
+
lines = @exception.backtrace
|
54
|
+
# This filtering business makes is hiding useful info.
|
55
|
+
# Think it was needed for ERB but Tilt provides a better stack trace.
|
56
|
+
# Commenting out for now.
|
57
|
+
|
58
|
+
# filter out internal lines
|
59
|
+
# removal_index = lines.find_index { |l| l =~ %r[lib/render_me_pretty] }
|
60
|
+
# lines = lines[removal_index..-1] # remove leading lines above the lib/
|
61
|
+
# render_me_pretty lines by keeping lines past the removal index
|
62
|
+
# lines.reject! { |l| l =~ %r[lib/render_me_pretty] } # now filter out
|
63
|
+
# render_me_pretty lines
|
64
|
+
lines = lines[0..7] # keep 8 lines
|
65
|
+
end
|
66
|
+
lines[0] = lines[0].colorize(:red)
|
67
|
+
|
68
|
+
# header
|
69
|
+
lines.unshift "\nOriginal backtrace#{full ? '' : ' (last 8 lines)'}:"
|
70
|
+
# footer
|
71
|
+
lines << "\nRe-run with FULL_BACKTRACE=1 to see all lines"
|
72
|
+
lines.join("\n")
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class RenderMePretty::Erb
|
2
|
+
class MainErrorHandler < BaseHandler
|
3
|
+
def handle
|
4
|
+
line_number = find_line_number
|
5
|
+
pretty_trace(line_number, full_message=true) # returns StringIO
|
6
|
+
end
|
7
|
+
|
8
|
+
# For general Tilt errors first line of the backtrace that contains the path
|
9
|
+
# of the file we're rendeirng and has the line number. Example:
|
10
|
+
#
|
11
|
+
# spec/fixtures/invalid.erb:2:in `block in singleton class'
|
12
|
+
# error_info = e.backtrace[0]
|
13
|
+
def find_line_number
|
14
|
+
lines = @exception.backtrace
|
15
|
+
error_line = lines.select do |line|
|
16
|
+
line.include?(@path)
|
17
|
+
end.first
|
18
|
+
error_line.split(':')[1].to_i
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class RenderMePretty::Erb
|
2
|
+
class SyntaxErrorHandler < BaseHandler
|
3
|
+
def handle
|
4
|
+
line_number = find_line_number
|
5
|
+
pretty_trace(line_number, full_message=false) # returns StringIO
|
6
|
+
end
|
7
|
+
|
8
|
+
# spec/fixtures/invalid/syntax.erb:2: syntax error, unexpected ';', expecting ']'
|
9
|
+
# ); if ENV['TEST' ; _erbout.<<(-" missing ending...
|
10
|
+
# ^
|
11
|
+
# spec/fixtures/invalid/syntax.erb:12: syntax error, unexpected keyword_end, expecting end-of-input
|
12
|
+
# end;end;end;end
|
13
|
+
# ^~~
|
14
|
+
#
|
15
|
+
# We will only find the first line number for the error.
|
16
|
+
def find_line_number
|
17
|
+
pattern = Regexp.new("#{@path}:(\\\d+): syntax error")
|
18
|
+
lines = @exception.message.split("\n")
|
19
|
+
found_line = lines.find do |line|
|
20
|
+
line.match(pattern)
|
21
|
+
end
|
22
|
+
md = found_line.match(pattern)
|
23
|
+
md[1].to_i # line_number
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: render_me_pretty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tung Nguyen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-02-
|
11
|
+
date: 2018-02-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -112,6 +112,9 @@ files:
|
|
112
112
|
- bin/setup
|
113
113
|
- lib/render_me_pretty.rb
|
114
114
|
- lib/render_me_pretty/erb.rb
|
115
|
+
- lib/render_me_pretty/erb/base_handler.rb
|
116
|
+
- lib/render_me_pretty/erb/main_error_handler.rb
|
117
|
+
- lib/render_me_pretty/erb/syntax_error_handler.rb
|
115
118
|
- lib/render_me_pretty/version.rb
|
116
119
|
- render_me_pretty.gemspec
|
117
120
|
- tilt_examples.rb
|