spellr 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|