error_highlight 0.3.0 → 0.4.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/.github/dependabot.yml +6 -0
- data/.github/workflows/ruby.yml +2 -2
- data/lib/error_highlight/base.rb +53 -7
- data/lib/error_highlight/core_ext.rb +27 -34
- data/lib/error_highlight/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a9ae1f66c6b1151cf65329869a64d4ea9ce7732344a6318aa99dc8a16aabeeff
|
4
|
+
data.tar.gz: d2e52f94f74c6569cea530e8a843d99030c0a2860f38b8591952faedba759419
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6610f3e482792ae7f2eb8a2e8ada6c13f588b8d9fdbf2bac0948d99efb5046d92b9b5c83294661ecc91ffb1239b446b759d206db60da7dedaab5af48c7e3d4c
|
7
|
+
data.tar.gz: 481f0da516eff4f75662bb709f56aeb11b380336f3fbd82465af16c24e48bbaa20d4590e5bdad5373c283f7d8eaba90c458bd807a6f1c1b809aef4710cb5a302
|
data/.github/workflows/ruby.yml
CHANGED
@@ -13,9 +13,9 @@ jobs:
|
|
13
13
|
runs-on: ubuntu-latest
|
14
14
|
strategy:
|
15
15
|
matrix:
|
16
|
-
ruby: [ 'ruby-head' ]
|
16
|
+
ruby: [ 'ruby-head', '3.1' ]
|
17
17
|
steps:
|
18
|
-
- uses: actions/checkout@
|
18
|
+
- uses: actions/checkout@v3
|
19
19
|
- uses: ruby/setup-ruby@v1
|
20
20
|
with:
|
21
21
|
ruby-version: ${{ matrix.ruby }}
|
data/lib/error_highlight/base.rb
CHANGED
@@ -1,12 +1,17 @@
|
|
1
1
|
require_relative "version"
|
2
2
|
|
3
3
|
module ErrorHighlight
|
4
|
-
# Identify the code fragment that
|
4
|
+
# Identify the code fragment at that a given exception occurred.
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
6
|
+
# Options:
|
7
|
+
#
|
8
|
+
# point_type: :name | :args
|
9
|
+
# :name (default) points the method/variable name that the exception occurred.
|
10
|
+
# :args points the arguments of the method call that the exception occurred.
|
11
|
+
#
|
12
|
+
# backtrace_location: Thread::Backtrace::Location
|
13
|
+
# It locates the code fragment of the given backtrace_location.
|
14
|
+
# By default, it uses the first frame of backtrace_locations of the given exception.
|
10
15
|
#
|
11
16
|
# Returns:
|
12
17
|
# {
|
@@ -15,9 +20,49 @@ module ErrorHighlight
|
|
15
20
|
# last_lineno: Integer,
|
16
21
|
# last_column: Integer,
|
17
22
|
# snippet: String,
|
23
|
+
# script_lines: [String],
|
18
24
|
# } | nil
|
19
|
-
def self.spot(
|
20
|
-
|
25
|
+
def self.spot(obj, **opts)
|
26
|
+
case obj
|
27
|
+
when Exception
|
28
|
+
exc = obj
|
29
|
+
loc = opts[:backtrace_location]
|
30
|
+
opts = { point_type: opts.fetch(:point_type, :name) }
|
31
|
+
|
32
|
+
unless loc
|
33
|
+
case exc
|
34
|
+
when TypeError, ArgumentError
|
35
|
+
opts[:point_type] = :args
|
36
|
+
end
|
37
|
+
|
38
|
+
locs = exc.backtrace_locations
|
39
|
+
return nil unless locs
|
40
|
+
|
41
|
+
loc = locs.first
|
42
|
+
return nil unless loc
|
43
|
+
|
44
|
+
opts[:name] = exc.name if NameError === obj
|
45
|
+
end
|
46
|
+
|
47
|
+
return nil unless Thread::Backtrace::Location === loc
|
48
|
+
|
49
|
+
node = RubyVM::AbstractSyntaxTree.of(loc, keep_script_lines: true)
|
50
|
+
|
51
|
+
Spotter.new(node, **opts).spot
|
52
|
+
|
53
|
+
when RubyVM::AbstractSyntaxTree::Node
|
54
|
+
# Just for compatibility
|
55
|
+
Spotter.new(node, **opts).spot
|
56
|
+
|
57
|
+
else
|
58
|
+
raise TypeError, "Exception is expected"
|
59
|
+
end
|
60
|
+
|
61
|
+
rescue SyntaxError,
|
62
|
+
SystemCallError, # file not found or something
|
63
|
+
ArgumentError # eval'ed code
|
64
|
+
|
65
|
+
return nil
|
21
66
|
end
|
22
67
|
|
23
68
|
class Spotter
|
@@ -122,6 +167,7 @@ module ErrorHighlight
|
|
122
167
|
last_lineno: @end_lineno,
|
123
168
|
last_column: @end_column,
|
124
169
|
snippet: @snippet,
|
170
|
+
script_lines: @node.script_lines,
|
125
171
|
}
|
126
172
|
else
|
127
173
|
return nil
|
@@ -2,44 +2,37 @@ require_relative "formatter"
|
|
2
2
|
|
3
3
|
module ErrorHighlight
|
4
4
|
module CoreExt
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
def to_s
|
12
|
-
msg = super.dup
|
13
|
-
|
14
|
-
locs = backtrace_locations
|
15
|
-
return msg unless locs
|
16
|
-
|
17
|
-
loc = locs.first
|
18
|
-
begin
|
19
|
-
node = RubyVM::AbstractSyntaxTree.of(loc, keep_script_lines: true)
|
20
|
-
opts = {}
|
5
|
+
private def generate_snippet
|
6
|
+
spot = ErrorHighlight.spot(self)
|
7
|
+
return "" unless spot
|
8
|
+
return ErrorHighlight.formatter.message_for(spot)
|
9
|
+
end
|
21
10
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
11
|
+
if Exception.method_defined?(:detailed_message)
|
12
|
+
def detailed_message(highlight: false, error_highlight: true, **)
|
13
|
+
return super unless error_highlight
|
14
|
+
snippet = generate_snippet
|
15
|
+
if highlight
|
16
|
+
snippet = snippet.gsub(/.+/) { "\e[1m" + $& + "\e[m" }
|
28
17
|
end
|
29
|
-
|
30
|
-
spot = ErrorHighlight.spot(node, **opts)
|
31
|
-
|
32
|
-
rescue SyntaxError
|
33
|
-
rescue SystemCallError # file not found or something
|
34
|
-
rescue ArgumentError # eval'ed code
|
18
|
+
super + snippet
|
35
19
|
end
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
20
|
+
else
|
21
|
+
# This is a marker to let `DidYouMean::Correctable#original_message` skip
|
22
|
+
# the following method definition of `to_s`.
|
23
|
+
# See https://github.com/ruby/did_you_mean/pull/152
|
24
|
+
SKIP_TO_S_FOR_SUPER_LOOKUP = true
|
25
|
+
private_constant :SKIP_TO_S_FOR_SUPER_LOOKUP
|
26
|
+
|
27
|
+
def to_s
|
28
|
+
msg = super
|
29
|
+
snippet = generate_snippet
|
30
|
+
if snippet != "" && !msg.include?(snippet)
|
31
|
+
msg + snippet
|
32
|
+
else
|
33
|
+
msg
|
34
|
+
end
|
40
35
|
end
|
41
|
-
|
42
|
-
msg
|
43
36
|
end
|
44
37
|
end
|
45
38
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: error_highlight
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yusuke Endoh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-08-10 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: The gem enhances Exception#message by adding a short explanation where
|
14
14
|
the exception is raised
|
@@ -18,6 +18,7 @@ executables: []
|
|
18
18
|
extensions: []
|
19
19
|
extra_rdoc_files: []
|
20
20
|
files:
|
21
|
+
- ".github/dependabot.yml"
|
21
22
|
- ".github/workflows/ruby.yml"
|
22
23
|
- ".gitignore"
|
23
24
|
- Gemfile
|
@@ -49,7 +50,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
49
50
|
- !ruby/object:Gem::Version
|
50
51
|
version: '0'
|
51
52
|
requirements: []
|
52
|
-
rubygems_version: 3.3.
|
53
|
+
rubygems_version: 3.3.7
|
53
54
|
signing_key:
|
54
55
|
specification_version: 4
|
55
56
|
summary: Shows a one-line code snippet with an underline in the error backtrace
|