spellr 0.6.0 → 0.7.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 +7 -0
- data/README.md +34 -15
- data/exe/spellr +8 -1
- data/lib/spellr/backports.rb +48 -21
- data/lib/spellr/base_reporter.rb +0 -4
- data/lib/spellr/check.rb +7 -47
- data/lib/spellr/check_dry_run.rb +14 -0
- data/lib/spellr/check_interactive.rb +24 -0
- data/lib/spellr/check_parallel.rb +23 -0
- data/lib/spellr/cli.rb +5 -90
- data/lib/spellr/cli_options.rb +98 -0
- data/lib/spellr/column_location.rb +2 -4
- data/lib/spellr/config.rb +39 -41
- data/lib/spellr/config_loader.rb +3 -29
- data/lib/spellr/config_validator.rb +63 -0
- data/lib/spellr/file_list.rb +7 -24
- data/lib/spellr/interactive.rb +80 -45
- data/lib/spellr/interactive_add.rb +20 -16
- data/lib/spellr/interactive_replacement.rb +52 -29
- data/lib/spellr/key_tuner/naive_bayes.rb +7 -59
- data/lib/spellr/key_tuner/possible_key.rb +5 -24
- data/lib/spellr/key_tuner/stats.rb +2 -0
- data/lib/spellr/language.rb +7 -8
- data/lib/spellr/line_location.rb +2 -7
- data/lib/spellr/line_tokenizer.rb +1 -9
- data/lib/spellr/output.rb +5 -7
- data/lib/spellr/output_stubbed.rb +16 -16
- data/lib/spellr/quiet_reporter.rb +1 -0
- data/lib/spellr/reporter.rb +0 -4
- data/lib/spellr/string_format.rb +8 -15
- data/lib/spellr/token.rb +13 -29
- data/lib/spellr/token_regexps.rb +2 -2
- data/lib/spellr/tokenizer.rb +0 -10
- data/lib/spellr/validations.rb +31 -0
- data/lib/spellr/version.rb +1 -1
- data/lib/spellr/wordlist.rb +9 -17
- data/lib/spellr/wordlist_reporter.rb +0 -4
- data/lib/spellr.rb +12 -0
- data/spellr.gemspec +12 -7
- data/wordlists/ruby.txt +1 -0
- metadata +59 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c712613dec647be23db6a02ac4612afe8ec9af7347bb5aae0b6068f4c8b609e6
|
4
|
+
data.tar.gz: ccb5af415199801c8d68b278105cb93156e3ab2d8d73c2a0a5221a7307e39102
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e2003cd517d9e915d8e154474bf404ee64c87796e7a59ea47710e3963c681e90b52cb6a93be80ca1ccfe810062b4882f344b0ac2ba04c6f85ab9685f3bb0bcc6
|
7
|
+
data.tar.gz: 1e8144ed3b9f86b194e91952acfac4536ad432cd47ee2ccadc22dbbc6d5f3d126f6db0a7a219a31a3b0dfb5ff8d7627b470f9ea32c91868edf0e23f102678e48
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
# v0.7.0
|
2
|
+
- dry_run checks config validity
|
3
|
+
- require fast_ignore 0.6.0
|
4
|
+
- new interactive UI
|
5
|
+
- misc performance improvements
|
6
|
+
- drop ruby 2.4 support because simplecov does
|
7
|
+
|
1
8
|
# v0.6.0
|
2
9
|
- add CSS wordlist from MDN
|
3
10
|
- improve html wordlist comprehensiveness from MDN and W3C
|
data/README.md
CHANGED
@@ -124,37 +124,52 @@ $ spellr --interactive
|
|
124
124
|
You'll be shown each word that's not found in a dictionary, it's location (path:line:column), along with a prompt.
|
125
125
|
```
|
126
126
|
file.rb:1:0 notaword
|
127
|
-
[r,
|
127
|
+
[a]dd, [r]eplace, [s]kip, [h]elp, [^C] to exit: [ ]
|
128
128
|
```
|
129
129
|
|
130
|
-
Type
|
130
|
+
Type `h` for this list of what each letter command does
|
131
131
|
```
|
132
|
+
[a] Add notaword to a word list
|
132
133
|
[r] Replace notaword
|
133
|
-
[R] Replace all future instances of notaword
|
134
|
+
[R] Replace this and all future instances of notaword
|
134
135
|
[s] Skip notaword
|
135
|
-
[S] Skip all future instances of notaword
|
136
|
-
[
|
137
|
-
[
|
138
|
-
|
136
|
+
[S] Skip this and all future instances of notaword
|
137
|
+
[h] Show this help
|
138
|
+
[ctrl] + [C] Exit spellr
|
139
|
+
|
140
|
+
What do you want to do? [ ]
|
139
141
|
```
|
140
142
|
|
141
|
-
|
143
|
+
---
|
144
|
+
|
145
|
+
If you type `r` or `R` you'll be shown a prompt with the original word and it prefilled ready for correcting:
|
142
146
|
```
|
143
147
|
file.txt:1:0 notaword
|
144
|
-
|
145
|
-
|
148
|
+
[a]dd, [r]eplace, [s]kip, [h]elp, [^C] to exit: [r]
|
149
|
+
|
150
|
+
[^C] to go back
|
151
|
+
Replace notaword with: notaword
|
146
152
|
```
|
147
153
|
To submit your choice and continue with the spell checking click enter. Your replacement word will be immediately spellchecked. To instead go back press Ctrl-C once (pressing it twice will exit the spell checking).
|
148
154
|
|
155
|
+
Lowercase `r` will correct this particular use of the word, uppercase `R` will also all the future times that word is used.
|
156
|
+
|
157
|
+
---
|
158
|
+
|
149
159
|
If you instead type `s` or `S` it will skip this word and continue with the spell checking.
|
150
160
|
|
161
|
+
Lowercase `s` will skip this particular use of the word, uppercase `S` will also skip future uses of the word.
|
162
|
+
|
151
163
|
---
|
152
164
|
|
153
165
|
If you instead type `a` you'll be shown a list of possible wordlists to add to. This list is based on the file path, and is configurable in `.spellr.yml`.
|
154
166
|
```
|
155
|
-
|
156
|
-
[
|
157
|
-
|
167
|
+
file.txt:1:0 notaword
|
168
|
+
[a]dd, [r]eplace, [s]kip, [h]elp, [^C] to exit: [a]
|
169
|
+
|
170
|
+
[e] english
|
171
|
+
[^C] to go back
|
172
|
+
Add notaword to which wordlist? [ ]
|
158
173
|
```
|
159
174
|
Type `e` to add this word to the english wordlist and continue on through the spell checking. To instead go back to the prompt press Ctrl-C once (pressing it twice will exit the spell checking).
|
160
175
|
|
@@ -167,6 +182,10 @@ If the tokenizer finds a word you don't want to add to the wordlist (perhaps it'
|
|
167
182
|
# spellr:enable
|
168
183
|
```
|
169
184
|
|
185
|
+
This works with any kind of comment, even in the same line
|
186
|
+
```html
|
187
|
+
<span><!-- spellr:disable -->nonsenseword<!-- spellr:enable --></span>
|
188
|
+
```
|
170
189
|
## Configuration
|
171
190
|
|
172
191
|
Spellr's configuration is a `.spellr.yml` file in your project root. This is combined with the gem defaults defined [here](https://github.com/robotdana/spellr/blob/master/lib/.spellr.yml).
|
@@ -206,8 +225,8 @@ languages:
|
|
206
225
|
- /applies_to/
|
207
226
|
key: r # this is the letter used to choose this wordlist when using `spellr --interactive`.
|
208
227
|
hashbangs:
|
209
|
-
- ruby # if the
|
210
|
-
# even if it doesn't otherwise match the includes pattern.
|
228
|
+
- ruby # if the file has no extension and the hashbang/shebang contains ruby
|
229
|
+
# this file will match even if it doesn't otherwise match the includes pattern.
|
211
230
|
```
|
212
231
|
|
213
232
|
## Development
|
data/exe/spellr
CHANGED
@@ -2,4 +2,11 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require_relative '../lib/spellr/cli'
|
5
|
-
|
5
|
+
|
6
|
+
begin
|
7
|
+
Spellr::CLI.new(ARGV).check
|
8
|
+
rescue Spellr::Error => e
|
9
|
+
require_relative '../lib/spellr/string_format'
|
10
|
+
warn Spellr::StringFormat.red(e.message)
|
11
|
+
exit 1
|
12
|
+
end
|
data/lib/spellr/backports.rb
CHANGED
@@ -1,27 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
unless RUBY_VERSION >= '2.4'
|
5
|
-
def sum
|
6
|
-
if block_given?
|
7
|
-
reduce(0) { |total, value| total + yield(value) }
|
8
|
-
else
|
9
|
-
reduce(:+)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
class Regexp
|
16
|
-
alias_method :match?, :match unless RUBY_VERSION >= '2.4'
|
17
|
-
end
|
18
|
-
|
19
|
-
class String
|
20
|
-
alias_method :match?, :match unless RUBY_VERSION >= '2.4'
|
21
|
-
end
|
3
|
+
ruby_version = Gem::Version.new(RUBY_VERSION)
|
22
4
|
|
23
|
-
|
24
|
-
|
5
|
+
unless ruby_version >= Gem::Version.new('2.5')
|
6
|
+
class Hash
|
25
7
|
def slice!(*keys)
|
26
8
|
delete_if { |k| !keys.include?(k) }
|
27
9
|
end
|
@@ -30,4 +12,49 @@ class Hash
|
|
30
12
|
dup.slice!(*keys)
|
31
13
|
end
|
32
14
|
end
|
15
|
+
|
16
|
+
require 'yaml'
|
17
|
+
module YAML
|
18
|
+
class << self
|
19
|
+
alias_method :safe_load_without_symbolize_names, :safe_load
|
20
|
+
def safe_load(path, *args, symbolize_names: false, **kwargs)
|
21
|
+
if symbolize_names
|
22
|
+
symbolize_names!(safe_load_without_symbolize_names(path, *args, **kwargs))
|
23
|
+
else
|
24
|
+
safe_load_without_symbolize_names(path, *args, **kwargs)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def symbolize_names!(obj) # rubocop:disable Metrics/MethodLength
|
31
|
+
case obj
|
32
|
+
when Hash
|
33
|
+
obj.keys.each do |key| # rubocop:disable Style/HashEachMethods # each_key never finishes.
|
34
|
+
obj[key.to_sym] = symbolize_names!(obj.delete(key))
|
35
|
+
end
|
36
|
+
when Array
|
37
|
+
obj.map! { |ea| symbolize_names!(ea) }
|
38
|
+
end
|
39
|
+
obj
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# all this to avoid a deprecation warning
|
46
|
+
unless ruby_version >= Gem::Version.new('2.6')
|
47
|
+
require 'yaml'
|
48
|
+
module YAML
|
49
|
+
class << self
|
50
|
+
alias_method :safe_load_without_permitted_classes, :safe_load
|
51
|
+
def safe_load(path, *args, permitted_classes: nil, **kwargs)
|
52
|
+
if permitted_classes
|
53
|
+
safe_load_without_permitted_classes(path, permitted_classes, *args, **kwargs)
|
54
|
+
else
|
55
|
+
safe_load_without_permitted_classes(path, *args, **kwargs)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
33
60
|
end
|
data/lib/spellr/base_reporter.rb
CHANGED
data/lib/spellr/check.rb
CHANGED
@@ -2,24 +2,12 @@
|
|
2
2
|
|
3
3
|
require_relative '../spellr'
|
4
4
|
require_relative 'tokenizer'
|
5
|
-
require_relative '
|
6
|
-
require_relative 'column_location'
|
7
|
-
require_relative 'line_location'
|
8
|
-
require_relative 'output_stubbed'
|
9
|
-
require_relative 'backports'
|
10
|
-
|
11
|
-
require 'parallel'
|
5
|
+
require_relative 'string_format'
|
12
6
|
|
13
7
|
module Spellr
|
14
|
-
class InvalidByteSequence
|
15
|
-
def self.===(error)
|
16
|
-
error.is_a?(ArgumentError) &&
|
17
|
-
/invalid byte sequence/.match?(error.message)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
8
|
class Check
|
22
9
|
attr_reader :files, :reporter
|
10
|
+
include StringFormat
|
23
11
|
|
24
12
|
def exit_code
|
25
13
|
reporter.exit_code
|
@@ -32,8 +20,6 @@ module Spellr
|
|
32
20
|
end
|
33
21
|
|
34
22
|
def check
|
35
|
-
return check_parallel if reporter.parallel?
|
36
|
-
|
37
23
|
files.each do |file|
|
38
24
|
check_and_count_file(file)
|
39
25
|
end
|
@@ -41,54 +27,28 @@ module Spellr
|
|
41
27
|
reporter.finish
|
42
28
|
end
|
43
29
|
|
44
|
-
def check_parallel # rubocop:disable Metrics/MethodLength
|
45
|
-
acc_reporter = @reporter
|
46
|
-
Parallel.each(files, finish: ->(_, _, result) { acc_reporter.output << result }) do |file|
|
47
|
-
@reporter = acc_reporter.class.new(Spellr::OutputStubbed.new)
|
48
|
-
check_and_count_file(file)
|
49
|
-
reporter.output
|
50
|
-
end
|
51
|
-
@reporter = acc_reporter
|
52
|
-
|
53
|
-
reporter.finish
|
54
|
-
end
|
55
|
-
|
56
30
|
private
|
57
31
|
|
58
32
|
def check_and_count_file(file)
|
59
33
|
check_file(file)
|
60
34
|
reporter.output.increment(:checked)
|
61
|
-
rescue InvalidByteSequence
|
35
|
+
rescue Spellr::InvalidByteSequence
|
62
36
|
# sometimes files are binary
|
63
|
-
reporter.
|
37
|
+
reporter.warn "Skipped unreadable file: #{aqua file.relative_path}"
|
64
38
|
end
|
65
39
|
|
66
|
-
def
|
40
|
+
def check_file(file, start_at = nil, found_word_proc = wordlist_proc_for(file))
|
67
41
|
Spellr::Tokenizer.new(file, start_at: start_at)
|
68
|
-
.each_token(skip_term_proc:
|
42
|
+
.each_token(skip_term_proc: found_word_proc) do |token|
|
69
43
|
reporter.call(token)
|
70
44
|
reporter.output.exit_code = 1
|
71
45
|
end
|
72
46
|
end
|
73
47
|
|
74
48
|
def wordlist_proc_for(file)
|
75
|
-
wordlists = Spellr.config.wordlists_for(file)
|
49
|
+
wordlists = Spellr.config.wordlists_for(file).sort_by(&:length).reverse
|
76
50
|
|
77
51
|
->(term) { wordlists.any? { |w| w.include?(term) } }
|
78
52
|
end
|
79
|
-
|
80
|
-
def check_file_from_restart(file, restart_token, wordlist_proc)
|
81
|
-
# new wordlist cache when adding a word
|
82
|
-
wordlist_proc = wordlist_proc_for(file) unless restart_token.replacement
|
83
|
-
check_file(file, start_at: restart_token.location, wordlist_proc: wordlist_proc)
|
84
|
-
end
|
85
|
-
|
86
|
-
def check_file(file, start_at: nil, wordlist_proc: wordlist_proc_for(file))
|
87
|
-
restart_token = catch(:check_file_from) do
|
88
|
-
check_tokens_in_file(file, start_at, wordlist_proc)
|
89
|
-
nil
|
90
|
-
end
|
91
|
-
check_file_from_restart(file, restart_token, wordlist_proc) if restart_token
|
92
|
-
end
|
93
53
|
end
|
94
54
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../spellr'
|
4
|
+
require_relative 'check'
|
5
|
+
|
6
|
+
module Spellr
|
7
|
+
class CheckInteractive < Check
|
8
|
+
private
|
9
|
+
|
10
|
+
def check_file_from_restart(file, restart_token, wordlist_proc)
|
11
|
+
# new wordlist cache when adding a word
|
12
|
+
wordlist_proc = wordlist_proc_for(file) unless restart_token.replacement
|
13
|
+
check_file(file, restart_token.location, wordlist_proc)
|
14
|
+
end
|
15
|
+
|
16
|
+
def check_file(file, start_at = nil, wordlist_proc = wordlist_proc_for(file))
|
17
|
+
restart_token = catch(:check_file_from) do
|
18
|
+
super(file, start_at, wordlist_proc)
|
19
|
+
nil
|
20
|
+
end
|
21
|
+
check_file_from_restart(file, restart_token, wordlist_proc) if restart_token
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../spellr'
|
4
|
+
require_relative 'check'
|
5
|
+
require_relative 'output_stubbed'
|
6
|
+
require 'parallel'
|
7
|
+
|
8
|
+
module Spellr
|
9
|
+
class CheckParallel < Check
|
10
|
+
def check # rubocop:disable Metrics/MethodLength
|
11
|
+
acc_reporter = @reporter
|
12
|
+
|
13
|
+
Parallel.each(files, finish: ->(_, _, result) { acc_reporter.output << result }) do |file|
|
14
|
+
@reporter = acc_reporter.class.new(Spellr::OutputStubbed.new)
|
15
|
+
check_and_count_file(file)
|
16
|
+
reporter.output
|
17
|
+
end
|
18
|
+
@reporter = acc_reporter
|
19
|
+
|
20
|
+
reporter.finish
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/spellr/cli.rb
CHANGED
@@ -1,10 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'optparse'
|
4
|
-
require 'pathname'
|
5
|
-
require 'open3'
|
6
|
-
|
7
3
|
require_relative '../spellr'
|
4
|
+
require_relative 'cli_options'
|
8
5
|
|
9
6
|
module Spellr
|
10
7
|
class CLI
|
@@ -12,102 +9,20 @@ module Spellr
|
|
12
9
|
|
13
10
|
def initialize(argv)
|
14
11
|
@argv = argv
|
15
|
-
|
16
|
-
|
12
|
+
CLI::Options.parse(@argv)
|
13
|
+
Spellr.config.valid?
|
17
14
|
end
|
18
15
|
|
19
16
|
def check
|
20
|
-
|
21
|
-
|
22
|
-
validate_config
|
23
|
-
|
24
|
-
checker = Spellr::Check.new(files: files)
|
17
|
+
checker = Spellr.config.checker.new(files: files)
|
25
18
|
checker.check
|
26
19
|
|
27
20
|
exit checker.exit_code
|
28
21
|
end
|
29
22
|
|
30
|
-
def validate_config
|
31
|
-
return true if Spellr.config.valid?
|
32
|
-
|
33
|
-
Spellr.config.print_errors
|
34
|
-
exit 1
|
35
|
-
end
|
36
|
-
|
37
23
|
def files
|
38
24
|
require_relative 'file_list'
|
39
|
-
Spellr::FileList.new(
|
40
|
-
end
|
41
|
-
|
42
|
-
def wordlist_option(_)
|
43
|
-
require_relative 'wordlist_reporter'
|
44
|
-
Spellr.config.reporter = Spellr::WordlistReporter.new
|
45
|
-
end
|
46
|
-
|
47
|
-
def quiet_option(_)
|
48
|
-
Spellr.config.quiet = true
|
49
|
-
require_relative 'quiet_reporter'
|
50
|
-
Spellr.config.reporter = Spellr::QuietReporter.new
|
51
|
-
end
|
52
|
-
|
53
|
-
def interactive_option(_)
|
54
|
-
require_relative 'interactive'
|
55
|
-
Spellr.config.reporter = Spellr::Interactive.new
|
56
|
-
end
|
57
|
-
|
58
|
-
def config_option(file)
|
59
|
-
Spellr.config.config_file = Pathname.pwd.join(file).expand_path
|
60
|
-
end
|
61
|
-
|
62
|
-
def dry_run_option(_)
|
63
|
-
files.each { |f| puts f.relative_path_from(Pathname.pwd) }
|
64
|
-
|
65
|
-
exit
|
66
|
-
end
|
67
|
-
|
68
|
-
def version_option(_)
|
69
|
-
require_relative 'version'
|
70
|
-
puts(Spellr::VERSION)
|
71
|
-
|
72
|
-
exit
|
73
|
-
end
|
74
|
-
|
75
|
-
def parse_command
|
76
|
-
parse_options
|
77
|
-
check
|
78
|
-
end
|
79
|
-
|
80
|
-
def options_help(_)
|
81
|
-
puts options.help
|
82
|
-
|
83
|
-
exit
|
84
|
-
end
|
85
|
-
|
86
|
-
def parse_options
|
87
|
-
options.parse!(argv)
|
88
|
-
end
|
89
|
-
|
90
|
-
def options # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
91
|
-
@options ||= begin
|
92
|
-
opts = OptionParser.new
|
93
|
-
|
94
|
-
opts.banner = 'Usage: spellr [options] [files]'
|
95
|
-
opts.separator('')
|
96
|
-
opts.on('-w', '--wordlist', 'Outputs errors in wordlist format', &method(:wordlist_option))
|
97
|
-
opts.on('-q', '--quiet', 'Silences output', &method(:quiet_option))
|
98
|
-
opts.on('-i', '--interactive', 'Runs the spell check interactively',
|
99
|
-
&method(:interactive_option))
|
100
|
-
opts.separator('')
|
101
|
-
opts.on('-d', '--dry-run', 'List files to be checked', &method(:dry_run_option))
|
102
|
-
opts.separator('')
|
103
|
-
opts.on('-c', '--config FILENAME', String, <<~HELP, &method(:config_option))
|
104
|
-
Path to the config file (default ./.spellr.yml)
|
105
|
-
HELP
|
106
|
-
opts.on('-v', '--version', 'Returns the current version', &method(:version_option))
|
107
|
-
opts.on('-h', '--help', 'Shows this message', &method(:options_help))
|
108
|
-
|
109
|
-
opts
|
110
|
-
end
|
25
|
+
Spellr::FileList.new(@argv)
|
111
26
|
end
|
112
27
|
end
|
113
28
|
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
require 'pathname'
|
5
|
+
require_relative '../spellr'
|
6
|
+
|
7
|
+
module Spellr
|
8
|
+
class CLI
|
9
|
+
class Options
|
10
|
+
class << self
|
11
|
+
def parse(argv)
|
12
|
+
options.parse!(argv)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
# rubocop:disable Layout/LineLength
|
18
|
+
def options # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
19
|
+
opts = OptionParser.new
|
20
|
+
|
21
|
+
opts.banner = 'Usage: spellr [options] [files]'
|
22
|
+
opts.separator('')
|
23
|
+
opts.on('-w', '--wordlist', 'Outputs errors in wordlist format', &method(:wordlist_option))
|
24
|
+
opts.on('-q', '--quiet', 'Silences output', &method(:quiet_option))
|
25
|
+
opts.on('-i', '--interactive', 'Runs the spell check interactively', &method(:interactive_option))
|
26
|
+
opts.separator('')
|
27
|
+
opts.on('--[no-]parallel', 'Run in parallel or not, default --parallel', &method(:parallel_option))
|
28
|
+
opts.on('-d', '--dry-run', 'List files to be checked', &method(:dry_run_option))
|
29
|
+
opts.separator('')
|
30
|
+
opts.on('-c', '--config FILENAME', String, <<~HELP, &method(:config_option))
|
31
|
+
Path to the config file (default ./.spellr.yml)
|
32
|
+
HELP
|
33
|
+
opts.on('-v', '--version', 'Returns the current version', &method(:version_option))
|
34
|
+
opts.on('-h', '--help', 'Shows this message', &method(:options_help))
|
35
|
+
|
36
|
+
opts
|
37
|
+
end
|
38
|
+
# rubocop:enable Layout/LineLength
|
39
|
+
|
40
|
+
def wordlist_option(_)
|
41
|
+
require_relative 'wordlist_reporter'
|
42
|
+
Spellr.config.reporter = Spellr::WordlistReporter.new
|
43
|
+
end
|
44
|
+
|
45
|
+
def quiet_option(_)
|
46
|
+
Spellr.config.quiet = true
|
47
|
+
require_relative 'quiet_reporter'
|
48
|
+
Spellr.config.reporter = Spellr::QuietReporter.new
|
49
|
+
end
|
50
|
+
|
51
|
+
def interactive_option(_)
|
52
|
+
require_relative 'interactive'
|
53
|
+
require_relative 'check_interactive'
|
54
|
+
Spellr.config.reporter = Spellr::Interactive.new
|
55
|
+
Spellr.config.checker = Spellr::CheckInteractive unless @parallel_option
|
56
|
+
end
|
57
|
+
|
58
|
+
def config_option(file)
|
59
|
+
file = Pathname.pwd.join(file).expand_path
|
60
|
+
|
61
|
+
unless ::File.readable?(file)
|
62
|
+
raise Spellr::Config::NotFound, "Config error: #{file} not found or not readable"
|
63
|
+
end
|
64
|
+
|
65
|
+
Spellr.config.config_file = file
|
66
|
+
end
|
67
|
+
|
68
|
+
def parallel_option(parallel) # rubocop:disable Metrics/MethodLength
|
69
|
+
@parallel_option = true
|
70
|
+
Spellr.config.checker = if parallel
|
71
|
+
require_relative 'check_parallel'
|
72
|
+
Spellr::CheckParallel
|
73
|
+
else
|
74
|
+
require_relative 'check'
|
75
|
+
Spellr::Check
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def dry_run_option(_)
|
80
|
+
Spellr.config.dry_run = true
|
81
|
+
end
|
82
|
+
|
83
|
+
def version_option(_)
|
84
|
+
require_relative 'version'
|
85
|
+
puts(Spellr::VERSION)
|
86
|
+
|
87
|
+
exit
|
88
|
+
end
|
89
|
+
|
90
|
+
def options_help(_)
|
91
|
+
puts options.help
|
92
|
+
|
93
|
+
exit
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -30,17 +30,15 @@ module Spellr
|
|
30
30
|
line_location.file
|
31
31
|
end
|
32
32
|
|
33
|
-
def file_name
|
34
|
-
line_location.file_name
|
35
|
-
end
|
36
|
-
|
37
33
|
def to_s
|
38
34
|
"#{line_location}:#{char_offset}"
|
39
35
|
end
|
40
36
|
|
37
|
+
# :nocov:
|
41
38
|
def inspect
|
42
39
|
"#<#{self.class.name} #{self}>"
|
43
40
|
end
|
41
|
+
# :nocov:
|
44
42
|
|
45
43
|
def coordinates
|
46
44
|
[line_number, char_offset]
|