spellr 0.2.0 → 0.3.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/.spellr.yml +0 -4
- data/.spellr_wordlists/english.txt +120 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile.lock +1 -1
- data/lib/.spellr.yml +1 -0
- data/lib/spellr/cli.rb +5 -0
- data/lib/spellr/config.rb +44 -49
- data/lib/spellr/config_loader.rb +66 -0
- data/lib/spellr/file_list.rb +0 -5
- data/lib/spellr/interactive.rb +5 -6
- data/lib/spellr/language.rb +6 -24
- data/lib/spellr/tokenizer.rb +1 -1
- data/lib/spellr/version.rb +1 -1
- metadata +2 -2
- data/.spellr_wordlists/dictionary.txt +0 -120
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 90aae5e24ba00624fea110acb2efb0a796cbf154
|
4
|
+
data.tar.gz: f46b4df50970c2043937aab35e2771a96ee6a3f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc31f2cbe8f1870a4eae00d4fcf1dc88eaf905a5fc477605650c67a50768950da5cd3e6e845405c713be073104c778a4c2d50a1d377a2efb5da0329311c4ce09
|
7
|
+
data.tar.gz: 58763f377f33faa8465fe69e06558da8ed97eb783d3c814dcb642920aa7ecfa99d6ce6488df8e3acace87a9a8a77875ad278919e475246984354260a79ae69f5
|
data/.spellr.yml
CHANGED
@@ -1,3 +1,123 @@
|
|
1
|
+
abc
|
2
|
+
addable
|
3
|
+
arg
|
4
|
+
args
|
5
|
+
baz
|
6
|
+
bundler
|
7
|
+
changelog
|
8
|
+
charpos
|
9
|
+
cli
|
10
|
+
cmd
|
11
|
+
codebase
|
12
|
+
colours
|
13
|
+
config
|
14
|
+
configs
|
15
|
+
css
|
16
|
+
customisations
|
17
|
+
cyclomatic
|
18
|
+
def
|
19
|
+
dict
|
20
|
+
diffable
|
21
|
+
diffs
|
22
|
+
dockerfile
|
23
|
+
downloader
|
24
|
+
env
|
25
|
+
eos
|
26
|
+
eot
|
27
|
+
erb
|
28
|
+
exclusions
|
29
|
+
exe
|
30
|
+
executables
|
31
|
+
exitstatus
|
32
|
+
ext
|
33
|
+
filename
|
34
|
+
filenames
|
35
|
+
foo
|
36
|
+
gemfile
|
37
|
+
gemspec
|
38
|
+
getch
|
39
|
+
git
|
40
|
+
github
|
41
|
+
gitignore
|
42
|
+
gitignored
|
43
|
+
gitkeep
|
44
|
+
haml
|
45
|
+
hashbang
|
46
|
+
hashbangs
|
47
|
+
hashbangs
|
48
|
+
heuristically
|
49
|
+
hml
|
50
|
+
hostnames
|
51
|
+
href
|
52
|
+
htt
|
53
|
+
ico
|
54
|
+
inclusions
|
55
|
+
jbuilder
|
56
|
+
jpg
|
1
57
|
json
|
58
|
+
jsx
|
59
|
+
klass
|
60
|
+
localhost
|
61
|
+
lstripped
|
62
|
+
mailto
|
63
|
+
marketplacer
|
64
|
+
matcher
|
65
|
+
matchers
|
66
|
+
maths
|
67
|
+
merchantability
|
68
|
+
multiline
|
69
|
+
newlines
|
70
|
+
noninfringement
|
71
|
+
nonwords
|
72
|
+
optparse
|
73
|
+
org
|
74
|
+
param
|
75
|
+
params
|
76
|
+
png
|
77
|
+
pwd
|
78
|
+
rakefile
|
79
|
+
rdoc
|
80
|
+
readme
|
81
|
+
redisplay
|
82
|
+
repo
|
83
|
+
rspec
|
84
|
+
rubocop
|
85
|
+
rvm
|
86
|
+
scss
|
87
|
+
shelljoin
|
88
|
+
shellsplit
|
89
|
+
shellwords
|
90
|
+
sherson
|
91
|
+
spellr
|
92
|
+
stderr
|
93
|
+
stdlib
|
94
|
+
stdout
|
95
|
+
str
|
96
|
+
stringscanner
|
97
|
+
strscan
|
98
|
+
sublicense
|
99
|
+
subwords
|
100
|
+
sudo
|
101
|
+
svg
|
102
|
+
thu
|
103
|
+
tlds
|
104
|
+
tmp
|
105
|
+
todo
|
106
|
+
tokenize
|
107
|
+
tokenizes
|
108
|
+
tsx
|
109
|
+
ttf
|
110
|
+
txt
|
111
|
+
uploader
|
112
|
+
uri
|
113
|
+
usr
|
114
|
+
utf
|
2
115
|
woff
|
116
|
+
wordlist
|
117
|
+
wordlists
|
118
|
+
wordn't
|
119
|
+
xdescribe
|
120
|
+
xit
|
3
121
|
xlsx
|
122
|
+
yardoc
|
123
|
+
yml
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/lib/.spellr.yml
CHANGED
data/lib/spellr/cli.rb
CHANGED
data/lib/spellr/config.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative '../spellr'
|
4
|
+
require_relative 'config_loader'
|
4
5
|
|
5
6
|
module Spellr
|
6
7
|
class Config
|
@@ -10,8 +11,25 @@ module Spellr
|
|
10
11
|
alias_method :quiet?, :quiet
|
11
12
|
|
12
13
|
def initialize
|
13
|
-
@
|
14
|
-
|
14
|
+
@config = ConfigLoader.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def valid?
|
18
|
+
only_has_one_key_per_language
|
19
|
+
keys_are_single_characters
|
20
|
+
errors.empty?
|
21
|
+
end
|
22
|
+
|
23
|
+
def print_errors
|
24
|
+
if $stderr.tty?
|
25
|
+
errors.each { |e| warn "\e[31m#{e}\e[0m" }
|
26
|
+
else
|
27
|
+
errors.each { |e| warn e }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def errors
|
32
|
+
@errors ||= []
|
15
33
|
end
|
16
34
|
|
17
35
|
def word_minimum_length
|
@@ -33,26 +51,23 @@ module Spellr
|
|
33
51
|
def clear_cache
|
34
52
|
remove_instance_variable(:@wordlists) if defined?(@wordlists)
|
35
53
|
remove_instance_variable(:@languages) if defined?(@languages)
|
54
|
+
remove_instance_variable(:@errors) if defined?(@errors)
|
36
55
|
end
|
37
56
|
|
38
57
|
def languages
|
39
58
|
require_relative 'language'
|
40
59
|
|
41
60
|
@languages ||= @config[:languages].map do |key, args|
|
42
|
-
|
43
|
-
end
|
61
|
+
Spellr::Language.new(key, args)
|
62
|
+
end
|
44
63
|
end
|
45
64
|
|
46
65
|
def languages_for(file)
|
47
|
-
languages.
|
66
|
+
languages.select { |l| l.matches?(file) }
|
48
67
|
end
|
49
68
|
|
50
69
|
def wordlists
|
51
|
-
@wordlists ||= languages.
|
52
|
-
end
|
53
|
-
|
54
|
-
def all_wordlist_paths
|
55
|
-
languages.values.flat_map(&:all_wordlist_paths)
|
70
|
+
@wordlists ||= languages.flat_map(&:wordlists)
|
56
71
|
end
|
57
72
|
|
58
73
|
def wordlists_for(file)
|
@@ -61,8 +76,7 @@ module Spellr
|
|
61
76
|
|
62
77
|
def config_file=(value)
|
63
78
|
::File.read(value) # raise Errno::ENOENT if the file doesn't exist
|
64
|
-
@
|
65
|
-
load_config
|
79
|
+
@config = ConfigLoader.new(value)
|
66
80
|
end
|
67
81
|
|
68
82
|
def reporter
|
@@ -71,52 +85,33 @@ module Spellr
|
|
71
85
|
|
72
86
|
private
|
73
87
|
|
74
|
-
def
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
end
|
88
|
+
def only_has_one_key_per_language
|
89
|
+
conflicting_languages = languages
|
90
|
+
.group_by(&:key)
|
91
|
+
.values.select { |g| g.length > 1 }
|
79
92
|
|
80
|
-
|
81
|
-
default_config = load_yaml(::File.join(__dir__, '..', '.spellr.yml'))
|
82
|
-
project_config = load_yaml(config_file)
|
93
|
+
return if conflicting_languages.empty?
|
83
94
|
|
84
|
-
|
95
|
+
conflicting_languages.each do |conflicts|
|
96
|
+
errors << "Error: #{conflicts.map(&:name).join(' & ')} share the same language key (#{conflicts.first.key}). "\
|
97
|
+
'Please define one to be different with `key:`'
|
98
|
+
end
|
85
99
|
end
|
86
100
|
|
87
|
-
def
|
88
|
-
|
101
|
+
def keys_are_single_characters
|
102
|
+
bad_languages = languages.select { |l| l.key.length > 1 }
|
103
|
+
return if bad_languages.empty?
|
89
104
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
YAML.safe_load(::File.read(path), symbolize_names: true)
|
94
|
-
else
|
95
|
-
symbolize_names!(YAML.safe_load(::File.read(path)))
|
105
|
+
bad_languages.each do |language|
|
106
|
+
errors << "Error: #{language.name} defines a key that is too long (#{language.key}). "\
|
107
|
+
'Please change it to be a single character'
|
96
108
|
end
|
97
109
|
end
|
98
110
|
|
99
|
-
def
|
100
|
-
|
101
|
-
when Hash
|
102
|
-
obj.keys.each do |key|
|
103
|
-
value = obj.delete(key)
|
104
|
-
obj[key.to_sym] = symbolize_names!(value)
|
105
|
-
end
|
106
|
-
when Array
|
107
|
-
obj.map! { |ea| symbolize_names!(ea) }
|
108
|
-
end
|
109
|
-
obj
|
110
|
-
end
|
111
|
+
def default_reporter
|
112
|
+
require_relative 'reporter'
|
111
113
|
|
112
|
-
|
113
|
-
if project.is_a?(Array) && default.is_a?(Array)
|
114
|
-
default | project
|
115
|
-
elsif project.is_a?(Hash) && default.is_a?(Hash)
|
116
|
-
default.merge(project) { |_k, d, p| merge_config(d, p) }
|
117
|
-
else
|
118
|
-
project
|
119
|
-
end
|
114
|
+
Spellr::Reporter.new
|
120
115
|
end
|
121
116
|
end
|
122
117
|
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Spellr
|
4
|
+
class ConfigLoader
|
5
|
+
attr_reader :config_file
|
6
|
+
|
7
|
+
def initialize(config_file = ::File.join(Dir.pwd, '.spellr.yml'))
|
8
|
+
@config_file = config_file
|
9
|
+
end
|
10
|
+
|
11
|
+
def config_file=(value)
|
12
|
+
::File.read(value) # raise Errno::ENOENT if the file doesn't exist
|
13
|
+
@config_file = value
|
14
|
+
@config = nil
|
15
|
+
end
|
16
|
+
|
17
|
+
def [](value)
|
18
|
+
load_config unless @config
|
19
|
+
@config[value]
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def load_config
|
25
|
+
default_config = load_yaml(::File.join(__dir__, '..', '.spellr.yml'))
|
26
|
+
project_config = load_yaml(config_file)
|
27
|
+
|
28
|
+
@config = merge_config(default_config, project_config)
|
29
|
+
end
|
30
|
+
|
31
|
+
def load_yaml(path)
|
32
|
+
require 'yaml'
|
33
|
+
|
34
|
+
return {} unless ::File.exist?(path)
|
35
|
+
|
36
|
+
if RUBY_VERSION >= '2.5'
|
37
|
+
YAML.safe_load(::File.read(path), symbolize_names: true)
|
38
|
+
else
|
39
|
+
symbolize_names!(YAML.safe_load(::File.read(path)))
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def symbolize_names!(obj)
|
44
|
+
case obj
|
45
|
+
when Hash
|
46
|
+
obj.keys.each do |key|
|
47
|
+
value = obj.delete(key)
|
48
|
+
obj[key.to_sym] = symbolize_names!(value)
|
49
|
+
end
|
50
|
+
when Array
|
51
|
+
obj.map! { |ea| symbolize_names!(ea) }
|
52
|
+
end
|
53
|
+
obj
|
54
|
+
end
|
55
|
+
|
56
|
+
def merge_config(default, project)
|
57
|
+
if project.is_a?(Array) && default.is_a?(Array)
|
58
|
+
default | project
|
59
|
+
elsif project.is_a?(Hash) && default.is_a?(Hash)
|
60
|
+
default.merge(project) { |_k, d, p| merge_config(d, p) }
|
61
|
+
else
|
62
|
+
project
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/spellr/file_list.rb
CHANGED
@@ -12,10 +12,6 @@ module Spellr
|
|
12
12
|
@patterns = patterns
|
13
13
|
end
|
14
14
|
|
15
|
-
def wordlist?(file)
|
16
|
-
Spellr.config.all_wordlist_paths.any? { |w| w == file }
|
17
|
-
end
|
18
|
-
|
19
15
|
def config_only?(file)
|
20
16
|
Spellr.config.only.empty? || Spellr.config.only.any? { |o| file.fnmatch?(o) }
|
21
17
|
end
|
@@ -31,7 +27,6 @@ module Spellr
|
|
31
27
|
FastIgnore.new(rules: Spellr.config.ignored, gitignore: gitignore).each do |file|
|
32
28
|
file = Spellr::File.new(file)
|
33
29
|
next unless cli_only?(file)
|
34
|
-
next if wordlist?(file)
|
35
30
|
next unless config_only?(file)
|
36
31
|
|
37
32
|
yield(file)
|
data/lib/spellr/interactive.rb
CHANGED
@@ -117,10 +117,10 @@ module Spellr
|
|
117
117
|
# TODO: handle more than 16 options
|
118
118
|
def handle_add(token) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
119
119
|
puts "Add #{red(token)} to wordlist:"
|
120
|
-
|
120
|
+
languages = Spellr.config.languages_for(token.location.file)
|
121
121
|
|
122
|
-
|
123
|
-
puts "[#{
|
122
|
+
languages.each do |wordlist|
|
123
|
+
puts "[#{wordlist.key}] #{wordlist.name}"
|
124
124
|
end
|
125
125
|
choice = STDIN.getch
|
126
126
|
clear_current_line
|
@@ -128,9 +128,8 @@ module Spellr
|
|
128
128
|
when "\u0003" # ctrl c
|
129
129
|
puts '^C again to exit'
|
130
130
|
call(token)
|
131
|
-
when
|
132
|
-
wl =
|
133
|
-
return handle_add(token) unless wl
|
131
|
+
when *languages.map(&:key)
|
132
|
+
wl = languages.find { |w| w.key == choice }.project_wordlist
|
134
133
|
|
135
134
|
wl.add(token)
|
136
135
|
self.total_added += 1
|
data/lib/spellr/language.rb
CHANGED
@@ -5,17 +5,18 @@ require_relative 'wordlist'
|
|
5
5
|
module Spellr
|
6
6
|
class Language
|
7
7
|
attr_reader :name
|
8
|
+
attr_reader :key
|
8
9
|
|
9
10
|
def initialize(name, # rubocop:disable Metrics/ParameterLists
|
10
|
-
|
11
|
+
key: name[0],
|
11
12
|
generate: nil,
|
12
13
|
only: [],
|
13
14
|
description: '',
|
14
15
|
hashbangs: [])
|
15
16
|
@name = name
|
17
|
+
@key = key
|
16
18
|
@description = description
|
17
19
|
@generate = generate
|
18
|
-
@wordlist_paths = wordlists
|
19
20
|
@only = only
|
20
21
|
@hashbangs = hashbangs
|
21
22
|
end
|
@@ -28,19 +29,9 @@ module Spellr
|
|
28
29
|
return true if file.hashbang && @hashbangs.any? { |h| file.hashbang.include?(h) }
|
29
30
|
end
|
30
31
|
|
31
|
-
def config_wordlists
|
32
|
-
@config_wordlists ||= @wordlist_paths.map(&Spellr::Wordlist.method(:new))
|
33
|
-
end
|
34
|
-
|
35
|
-
def all_wordlist_paths
|
36
|
-
@wordlist_paths + default_wordlists.map(&:path)
|
37
|
-
end
|
38
|
-
|
39
32
|
def wordlists
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
w
|
33
|
+
generate_wordlist unless generated_project_wordlist.exist?
|
34
|
+
default_wordlists.select(&:exist?)
|
44
35
|
end
|
45
36
|
|
46
37
|
def generate_wordlist
|
@@ -52,11 +43,7 @@ module Spellr
|
|
52
43
|
|
53
44
|
Spellr::CLI.new(generate.shellsplit)
|
54
45
|
|
55
|
-
|
56
|
-
end
|
57
|
-
|
58
|
-
def addable_wordlists
|
59
|
-
((config_wordlists - default_wordlists) + [project_wordlist]).uniq(&:path)
|
46
|
+
default_wordlists
|
60
47
|
end
|
61
48
|
|
62
49
|
def gem_wordlist
|
@@ -88,11 +75,6 @@ module Spellr
|
|
88
75
|
wordlists.map(&Spellr::Wordlist.method(:new))
|
89
76
|
end
|
90
77
|
|
91
|
-
def custom_addable_wordlists(wordlists)
|
92
|
-
default_paths = default_wordlist_paths
|
93
|
-
wordlists.map { |w| Spellr::Wordlist.new(w) }.reject { |w| default_paths.include?(w.path) }
|
94
|
-
end
|
95
|
-
|
96
78
|
def default_wordlists
|
97
79
|
[
|
98
80
|
gem_wordlist,
|
data/lib/spellr/tokenizer.rb
CHANGED
data/lib/spellr/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spellr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dana Sherson
|
@@ -149,7 +149,6 @@ files:
|
|
149
149
|
- ".rubocop.yml"
|
150
150
|
- ".ruby-version"
|
151
151
|
- ".spellr.yml"
|
152
|
-
- ".spellr_wordlists/dictionary.txt"
|
153
152
|
- ".spellr_wordlists/english.txt"
|
154
153
|
- ".spellr_wordlists/lorem.txt"
|
155
154
|
- ".spellr_wordlists/ruby.txt"
|
@@ -171,6 +170,7 @@ files:
|
|
171
170
|
- lib/spellr/cli.rb
|
172
171
|
- lib/spellr/column_location.rb
|
173
172
|
- lib/spellr/config.rb
|
173
|
+
- lib/spellr/config_loader.rb
|
174
174
|
- lib/spellr/file.rb
|
175
175
|
- lib/spellr/file_list.rb
|
176
176
|
- lib/spellr/interactive.rb
|
@@ -1,120 +0,0 @@
|
|
1
|
-
abc
|
2
|
-
addable
|
3
|
-
arg
|
4
|
-
args
|
5
|
-
baz
|
6
|
-
bundler
|
7
|
-
changelog
|
8
|
-
charpos
|
9
|
-
cli
|
10
|
-
cmd
|
11
|
-
codebase
|
12
|
-
colours
|
13
|
-
config
|
14
|
-
configs
|
15
|
-
css
|
16
|
-
customisations
|
17
|
-
cyclomatic
|
18
|
-
def
|
19
|
-
dict
|
20
|
-
diffable
|
21
|
-
diffs
|
22
|
-
dockerfile
|
23
|
-
downloader
|
24
|
-
env
|
25
|
-
eos
|
26
|
-
eot
|
27
|
-
erb
|
28
|
-
exclusions
|
29
|
-
exe
|
30
|
-
executables
|
31
|
-
exitstatus
|
32
|
-
ext
|
33
|
-
filename
|
34
|
-
filenames
|
35
|
-
foo
|
36
|
-
gemfile
|
37
|
-
gemspec
|
38
|
-
getch
|
39
|
-
git
|
40
|
-
github
|
41
|
-
gitignore
|
42
|
-
gitignored
|
43
|
-
gitkeep
|
44
|
-
haml
|
45
|
-
hashbang
|
46
|
-
hashbangs
|
47
|
-
hashbangs
|
48
|
-
heuristically
|
49
|
-
hml
|
50
|
-
hostnames
|
51
|
-
href
|
52
|
-
htt
|
53
|
-
ico
|
54
|
-
inclusions
|
55
|
-
jbuilder
|
56
|
-
jpg
|
57
|
-
jsx
|
58
|
-
klass
|
59
|
-
localhost
|
60
|
-
lstripped
|
61
|
-
mailto
|
62
|
-
marketplacer
|
63
|
-
matcher
|
64
|
-
matchers
|
65
|
-
maths
|
66
|
-
merchantability
|
67
|
-
multiline
|
68
|
-
newlines
|
69
|
-
noninfringement
|
70
|
-
nonwords
|
71
|
-
optparse
|
72
|
-
org
|
73
|
-
param
|
74
|
-
params
|
75
|
-
png
|
76
|
-
pwd
|
77
|
-
rakefile
|
78
|
-
rdoc
|
79
|
-
readme
|
80
|
-
redisplay
|
81
|
-
repo
|
82
|
-
rspec
|
83
|
-
rubocop
|
84
|
-
rvm
|
85
|
-
scss
|
86
|
-
shelljoin
|
87
|
-
shellsplit
|
88
|
-
shellwords
|
89
|
-
sherson
|
90
|
-
spellr
|
91
|
-
stderr
|
92
|
-
stdlib
|
93
|
-
stdout
|
94
|
-
str
|
95
|
-
stringscanner
|
96
|
-
strscan
|
97
|
-
sublicense
|
98
|
-
subwords
|
99
|
-
sudo
|
100
|
-
svg
|
101
|
-
thu
|
102
|
-
tlds
|
103
|
-
tmp
|
104
|
-
todo
|
105
|
-
tokenize
|
106
|
-
tokenizes
|
107
|
-
tsx
|
108
|
-
ttf
|
109
|
-
txt
|
110
|
-
uploader
|
111
|
-
uri
|
112
|
-
usr
|
113
|
-
utf
|
114
|
-
wordlist
|
115
|
-
wordlists
|
116
|
-
wordn't
|
117
|
-
xdescribe
|
118
|
-
xit
|
119
|
-
yardoc
|
120
|
-
yml
|