dead_end 2.0.0 → 2.0.1
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/.circleci/config.yml +9 -0
- data/.standard.yml +1 -1
- data/CHANGELOG.md +8 -0
- data/Gemfile.lock +2 -2
- data/exe/dead_end +9 -1
- data/lib/dead_end/around_block_scan.rb +1 -1
- data/lib/dead_end/banner.rb +58 -0
- data/lib/dead_end/clean_document.rb +4 -4
- data/lib/dead_end/display_invalid_blocks.rb +9 -40
- data/lib/dead_end/lex_all.rb +1 -1
- data/lib/dead_end/version.rb +1 -1
- data/lib/dead_end/who_dis_syntax_error.rb +11 -2
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7d7d236a8a3634efc153e2a20f511072c2b10f97553595ddb3309b88f74dbbb8
|
4
|
+
data.tar.gz: 5cb84a34d16f9c7714791f01864cfb1b05095b8eb9587be5cfbc86aed1c31a20
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41f2022c9faba2cd907b91f9dbd2200172af5ddaa6117f80c7dc7229665026e89d06284cfd43d439dfe879f541ee77b57cb09334c49d1f7732ba1ab484197852
|
7
|
+
data.tar.gz: 667597674b31cda70837d9e11c46ccf3f4d7374445f56d8fc1f1f4fda3bd4cad0fdf2c2517620224aea683be21b7142101787aac0cb40e7a296ac039be2af0d3
|
data/.circleci/config.yml
CHANGED
@@ -13,6 +13,14 @@ references:
|
|
13
13
|
command: bundle exec standardrb
|
14
14
|
|
15
15
|
jobs:
|
16
|
+
"ruby-2-5":
|
17
|
+
docker:
|
18
|
+
- image: circleci/ruby:2.5
|
19
|
+
steps:
|
20
|
+
- checkout
|
21
|
+
- ruby/install-deps
|
22
|
+
- <<: *unit
|
23
|
+
|
16
24
|
"ruby-2-6":
|
17
25
|
docker:
|
18
26
|
- image: circleci/ruby:2.6
|
@@ -49,6 +57,7 @@ workflows:
|
|
49
57
|
version: 2
|
50
58
|
build:
|
51
59
|
jobs:
|
60
|
+
- "ruby-2-5"
|
52
61
|
- "ruby-2-6"
|
53
62
|
- "ruby-2-7"
|
54
63
|
- "ruby-3-0"
|
data/.standard.yml
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby_version: 2.
|
1
|
+
ruby_version: 2.5.9
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
## HEAD (unreleased)
|
2
2
|
|
3
|
+
## 2.0.1
|
4
|
+
|
5
|
+
- Reintroduce Ruby 2.5 support (https://github.com/zombocom/dead_end/pull/90)
|
6
|
+
- Support naked braces/brackets/parens, invert labels on banner (https://github.com/zombocom/dead_end/pull/89)
|
7
|
+
- Handle mismatched end when using rescue without begin (https://github.com/zombocom/dead_end/pull/83)
|
8
|
+
- CLI returns non-zero exit code when syntax error is found (https://github.com/zombocom/dead_end/pull/86)
|
9
|
+
- Let -v respond with gem version instead of 'unknown' (https://github.com/zombocom/dead_end/pull/82)
|
10
|
+
|
3
11
|
## 2.0.0
|
4
12
|
|
5
13
|
- Support "endless" oneline method definitions for Ruby 3+ (https://github.com/zombocom/dead_end/pull/80)
|
data/Gemfile.lock
CHANGED
data/exe/dead_end
CHANGED
@@ -35,6 +35,8 @@ parser = OptionParser.new do |opts|
|
|
35
35
|
Options:
|
36
36
|
EOM
|
37
37
|
|
38
|
+
opts.version = DeadEnd::VERSION
|
39
|
+
|
38
40
|
opts.on("--help", "Help - displays this message") do |v|
|
39
41
|
puts opts
|
40
42
|
exit
|
@@ -62,9 +64,15 @@ options[:record_dir] = "tmp" if ENV["DEBUG"]
|
|
62
64
|
|
63
65
|
warn "Record dir: #{options[:record_dir]}" if options[:record_dir]
|
64
66
|
|
65
|
-
DeadEnd.call(
|
67
|
+
display = DeadEnd.call(
|
66
68
|
source: file.read,
|
67
69
|
filename: file.expand_path,
|
68
70
|
terminal: options[:terminal],
|
69
71
|
record_dir: options[:record_dir]
|
70
72
|
)
|
73
|
+
|
74
|
+
if display.document_ok?
|
75
|
+
exit(0)
|
76
|
+
else
|
77
|
+
exit(1)
|
78
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DeadEnd
|
4
|
+
class Banner
|
5
|
+
attr_reader :invalid_obj
|
6
|
+
|
7
|
+
def initialize(invalid_obj:)
|
8
|
+
@invalid_obj = invalid_obj
|
9
|
+
end
|
10
|
+
|
11
|
+
def call
|
12
|
+
case invalid_obj.error_symbol
|
13
|
+
when :missing_end
|
14
|
+
<<~EOM
|
15
|
+
DeadEnd: Missing `end` detected
|
16
|
+
|
17
|
+
This code has a missing `end`. Ensure that all
|
18
|
+
syntax keywords (`def`, `do`, etc.) have a matching `end`.
|
19
|
+
EOM
|
20
|
+
when :unmatched_syntax
|
21
|
+
case unmatched_symbol
|
22
|
+
when :end
|
23
|
+
<<~EOM
|
24
|
+
DeadEnd: Unmatched `end` detected
|
25
|
+
|
26
|
+
This code has an unmatched `end`. Ensure that all `end` lines
|
27
|
+
in your code have a matching syntax keyword (`def`, `do`, etc.)
|
28
|
+
and that you don't have any extra `end` lines.
|
29
|
+
EOM
|
30
|
+
when :|
|
31
|
+
<<~EOM
|
32
|
+
DeadEnd: Unmatched `|` character detected
|
33
|
+
|
34
|
+
Example:
|
35
|
+
|
36
|
+
`do |x` should be `do |x|`
|
37
|
+
EOM
|
38
|
+
when *WhoDisSyntaxError::CHARACTERS.keys
|
39
|
+
<<~EOM
|
40
|
+
DeadEnd: Unmatched `#{unmatched_symbol}` character detected
|
41
|
+
|
42
|
+
It appears a `#{missing_character}` might be missing.
|
43
|
+
EOM
|
44
|
+
else
|
45
|
+
"DeadEnd: Unmatched `#{unmatched_symbol}` detected"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
private def unmatched_symbol
|
51
|
+
invalid_obj.unmatched_symbol
|
52
|
+
end
|
53
|
+
|
54
|
+
private def missing_character
|
55
|
+
WhoDisSyntaxError::CHARACTERS[unmatched_symbol]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -231,7 +231,7 @@ module DeadEnd
|
|
231
231
|
#
|
232
232
|
def join_consecutive!
|
233
233
|
consecutive_groups = @document.select(&:ignore_newline_not_beg?).map do |code_line|
|
234
|
-
take_while_including(code_line.index
|
234
|
+
take_while_including(code_line.index..-1) do |line|
|
235
235
|
line.ignore_newline_not_beg?
|
236
236
|
end
|
237
237
|
end
|
@@ -252,7 +252,7 @@ module DeadEnd
|
|
252
252
|
# expect(lines[1].to_s).to eq("")
|
253
253
|
def join_trailing_slash!
|
254
254
|
trailing_groups = @document.select(&:trailing_slash?).map do |code_line|
|
255
|
-
take_while_including(code_line.index
|
255
|
+
take_while_including(code_line.index..-1) { |x| x.trailing_slash? }
|
256
256
|
end
|
257
257
|
join_groups(trailing_groups)
|
258
258
|
self
|
@@ -286,7 +286,7 @@ module DeadEnd
|
|
286
286
|
)
|
287
287
|
|
288
288
|
# Hide the rest of the lines
|
289
|
-
lines[1
|
289
|
+
lines[1..-1].each do |line|
|
290
290
|
# The above lines already have newlines in them, if add more
|
291
291
|
# then there will be double newline, use an empty line instead
|
292
292
|
@document[line.index] = CodeLine.new(line: "", index: line.index, lex: [])
|
@@ -300,7 +300,7 @@ module DeadEnd
|
|
300
300
|
# Like `take_while` except when it stops
|
301
301
|
# iterating, it also returns the line
|
302
302
|
# that caused it to stop
|
303
|
-
def take_while_including(range = 0
|
303
|
+
def take_while_including(range = 0..-1)
|
304
304
|
take_next_and_stop = false
|
305
305
|
@document[range].take_while do |line|
|
306
306
|
next if take_next_and_stop
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative "banner"
|
3
4
|
require_relative "capture_code_context"
|
4
5
|
require_relative "display_code_with_line_numbers"
|
5
6
|
|
@@ -21,11 +22,15 @@ module DeadEnd
|
|
21
22
|
@invalid_obj = invalid_obj
|
22
23
|
end
|
23
24
|
|
25
|
+
def document_ok?
|
26
|
+
@blocks.none? { |b| !b.hidden? }
|
27
|
+
end
|
28
|
+
|
24
29
|
def call
|
25
|
-
if
|
26
|
-
found_invalid_blocks
|
27
|
-
else
|
30
|
+
if document_ok?
|
28
31
|
@io.puts "Syntax OK"
|
32
|
+
else
|
33
|
+
found_invalid_blocks
|
29
34
|
end
|
30
35
|
self
|
31
36
|
end
|
@@ -50,43 +55,7 @@ module DeadEnd
|
|
50
55
|
end
|
51
56
|
|
52
57
|
def banner
|
53
|
-
|
54
|
-
when :missing_end
|
55
|
-
<<~EOM
|
56
|
-
DeadEnd: Missing `end` detected
|
57
|
-
|
58
|
-
This code has a missing `end`. Ensure that all
|
59
|
-
syntax keywords (`def`, `do`, etc.) have a matching `end`.
|
60
|
-
EOM
|
61
|
-
when :unmatched_syntax
|
62
|
-
case @invalid_obj.unmatched_symbol
|
63
|
-
when :end
|
64
|
-
<<~EOM
|
65
|
-
DeadEnd: Unmatched `end` detected
|
66
|
-
|
67
|
-
This code has an unmatched `end`. Ensure that all `end` lines
|
68
|
-
in your code have a matching syntax keyword (`def`, `do`, etc.)
|
69
|
-
and that you don't have any extra `end` lines.
|
70
|
-
EOM
|
71
|
-
when :|
|
72
|
-
<<~EOM
|
73
|
-
DeadEnd: Unmatched `|` character detected
|
74
|
-
|
75
|
-
Example:
|
76
|
-
|
77
|
-
`do |x` should be `do |x|`
|
78
|
-
EOM
|
79
|
-
when :"}"
|
80
|
-
<<~EOM
|
81
|
-
DeadEnd: Unmatched `}` character detected
|
82
|
-
|
83
|
-
This code has an unmatched `}`. Ensure that opening curly braces are
|
84
|
-
closed: `{ }`.
|
85
|
-
EOM
|
86
|
-
else
|
87
|
-
"DeadEnd: Unmatched `#{@invalid_obj.unmatched_symbol}` detected"
|
88
|
-
end
|
89
|
-
end
|
58
|
+
Banner.new(invalid_obj: @invalid_obj).call
|
90
59
|
end
|
91
60
|
|
92
61
|
def indent(string, with: " ")
|
data/lib/dead_end/lex_all.rb
CHANGED
data/lib/dead_end/version.rb
CHANGED
@@ -8,6 +8,7 @@ module DeadEnd
|
|
8
8
|
# puts WhoDisSyntaxError.new("def foo;").call.error_symbol
|
9
9
|
# # => :missing_end
|
10
10
|
class WhoDisSyntaxError < Ripper
|
11
|
+
CHARACTERS = {"{": :"}", "}": :"{", "[": :"]", "]": :"[", "(": :")", ")": :"("}
|
11
12
|
class Null
|
12
13
|
def error_symbol
|
13
14
|
:missing_end
|
@@ -58,8 +59,16 @@ module DeadEnd
|
|
58
59
|
when /expecting end-of-input/
|
59
60
|
@unmatched_symbol = :end
|
60
61
|
@error_symbol = :unmatched_syntax
|
61
|
-
when /unexpected .* expecting '(?<unmatched_symbol
|
62
|
-
|
62
|
+
when /unexpected .* expecting ['`]?(?<unmatched_symbol>[^']*)/
|
63
|
+
if $1
|
64
|
+
character = $1.to_sym
|
65
|
+
@unmatched_symbol = CHARACTERS[character] || character
|
66
|
+
@unmatched_symbol = :end if @unmatched_symbol == :keyword_end
|
67
|
+
end
|
68
|
+
@error_symbol = :unmatched_syntax
|
69
|
+
when /unexpected '(?<unmatched_symbol>.*)'/
|
70
|
+
@unmatched_symbol = $1.to_sym
|
71
|
+
@unmatched_symbol = :end if @unmatched_symbol == :keyword_end
|
63
72
|
@error_symbol = :unmatched_syntax
|
64
73
|
when /unexpected `end'/, # Ruby 2.7 and 3.0
|
65
74
|
/unexpected end/, # Ruby 2.6
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dead_end
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- schneems
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-10-
|
11
|
+
date: 2021-10-19 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: When you get an "unexpected end" in your syntax this gem helps you find
|
14
14
|
it
|
@@ -38,6 +38,7 @@ files:
|
|
38
38
|
- lib/dead_end.rb
|
39
39
|
- lib/dead_end/around_block_scan.rb
|
40
40
|
- lib/dead_end/auto.rb
|
41
|
+
- lib/dead_end/banner.rb
|
41
42
|
- lib/dead_end/block_expand.rb
|
42
43
|
- lib/dead_end/capture_code_context.rb
|
43
44
|
- lib/dead_end/clean_document.rb
|