forspell 0.0.7 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +16 -13
- data/lib/forspell/cli.rb +5 -9
- data/lib/forspell/file_list.rb +1 -1
- data/lib/forspell/reporter.rb +15 -4
- data/lib/forspell/speller.rb +2 -2
- metadata +5 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 16e96dc4e732badadf52412ae2cc8d2f6fd1b900e760151b8c8a8b0172eef612
|
4
|
+
data.tar.gz: ffbf262ff89973346045aa6e586ae0a7e31f1fbbfc284d7bd7c3448b8218ab2b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 50ac0b2e6b5b3e243d4ee11abeb84b22374e45623d142521111ebe3bb2e81f0118b944be72099212775f9f64a9b13c0260f04b2255b5d3a541a7b03214a9db3a
|
7
|
+
data.tar.gz: 675033785e77aa12a510589519ee2177f126fb9cf54dab53071d6006a5114fa7fc05d12e465a08ebe8acc01135c2bdd7aad71aee9626bba96fa3ddc7a240e1bd
|
data/README.md
CHANGED
@@ -3,21 +3,21 @@
|
|
3
3
|
[![Gem Version](https://badge.fury.io/rb/forspell.svg)](http://badge.fury.io/rb/forspell)
|
4
4
|
[![Build Status](https://travis-ci.org/kkuprikov/forspell.svg?branch=master)](https://travis-ci.org/kkuprikov/forspell)
|
5
5
|
|
6
|
-
**Forspell** is spellchecker for code and documentation. It uses well-known [hunspell](https://en.wikipedia.org/wiki/Hunspell) tool and dictionary, provides customizable output, and could be easily integrated into CI pipeline.
|
6
|
+
**Forspell** is a spellchecker for code and documentation. It uses the well-known [hunspell](https://en.wikipedia.org/wiki/Hunspell) tool and dictionary, provides customizable output, and could be easily integrated into CI pipeline.
|
7
7
|
|
8
|
-
|
8
|
+
Here's an output example:
|
9
9
|
|
10
10
|
![](https://user-images.githubusercontent.com/713419/55152630-d775a600-5161-11e9-9c56-d9fb45d8a3a4.png)
|
11
11
|
|
12
12
|
## Features
|
13
13
|
|
14
|
-
*
|
15
|
-
*
|
14
|
+
* Ability to check Markdown files and comments in Ruby, C and C++ code;
|
15
|
+
* Skipping over code examples and identifiers inside comments and Markdown most of the time;
|
16
16
|
* Distributed with latest en-US hunspell dictionaries, but can be set to use any other dictionary;
|
17
|
-
* Includes
|
18
|
-
*
|
17
|
+
* Includes a custom Ruby ecosystem-related dictionary (so it will not report words like "Gemfile", "args", "middleware" and alike as misspelled);
|
18
|
+
* Easiness to create a custom dictionary for your project, so your internal terms would not be reported as misspellings;
|
19
19
|
* Option to auto-generate initial custom dictionary;
|
20
|
-
* Several output formats, including pretty
|
20
|
+
* Several output formats, including pretty print, YAML and JSON.
|
21
21
|
|
22
22
|
## Installation
|
23
23
|
|
@@ -25,7 +25,7 @@ Example of output:
|
|
25
25
|
gem install forspell
|
26
26
|
```
|
27
27
|
|
28
|
-
`forspell` requires `libhunspell` >= 1.2.0 to be installed, see [hunspell site](https://github.com/hunspell/hunspell) for installation instructions (it is probably as easy as `<yourpackagemanager> install hunspell` on most of
|
28
|
+
`forspell` requires `libhunspell` >= 1.2.0 to be installed, see [hunspell site](https://github.com/hunspell/hunspell) for installation instructions (it is probably as easy as `<yourpackagemanager> install hunspell` on most of *nix and MacOS).
|
29
29
|
|
30
30
|
## Usage
|
31
31
|
|
@@ -44,26 +44,29 @@ Options:
|
|
44
44
|
--help
|
45
45
|
```
|
46
46
|
|
47
|
-
forspell automatically loads command-line arguments from `.forspell` file in current folder, if it is present.
|
47
|
+
`forspell` automatically loads command-line arguments from `.forspell` file in current folder, if it is present.
|
48
|
+
Arguments for `forspell` command are directories or separate files you want to check.
|
49
|
+
With no arguments provided, a current directory will be processed.
|
50
|
+
Supported file extensions are `.rb`, `.c`, `.cpp`, `.md`.
|
48
51
|
|
49
52
|
### Dictionaries
|
50
53
|
|
51
|
-
|
54
|
+
Forspell uses hunspell dictionaries to check spelling. By default, it is the `en_US` modern dictionary, distributed with forspell itself, but you can specify any other with `-d` option. If you have `/some/custom/path/fr_FR.aff` and `/some/custom/path/fr_FR.dic`, than you can use it instead of `en_US` with `-d /some/custom/path/fr_FR`.
|
52
55
|
|
53
56
|
In addition to the main dictionary, forspell also includes (and always uses) small auxiliary dictionary with words specific for Ruby ecosystem, you can review it in [forspell repo](https://github.com/kkuprikov/forspell/blob/master/lib/forspell/ruby.dict).
|
54
57
|
|
55
|
-
You can also add your project's **custom dictionary** with internal terms, for them not to obstruct spellchecker's output. Custom dictionary (or several)
|
58
|
+
You can also add your project's **custom dictionary** with internal terms, for them not to obstruct spellchecker's output. Custom dictionary (or several) may be passed with `-c` option. Also, `forspell.dict` will be automatically processed, if presented in current directory. Format of custom dictionary:
|
56
59
|
|
57
60
|
* Each word on its own line.
|
58
61
|
* Line contains either just `word` (means only this word in this form).
|
59
62
|
* ...or `word: example` -- in this case, "example" should be existing word from the main dictionary, and it means your custom term can have the same forms as example word. For example, "subclass: class" will mean that "subclass", "subclasses" and "subclass'" should be considered correct.
|
60
63
|
* `#` marks comments.
|
61
64
|
|
62
|
-
For larger projects, it is handy to generate custom dictionary with `forspell your,project,
|
65
|
+
For larger projects, it is handy to generate a custom dictionary with `forspell your,project,paths --gen-dictionary`. This will create `forspell.dict` with all misspellings found in your project, and you can proceed by deleting genuine errors and leave internal terms, which should be considered correct.
|
63
66
|
|
64
67
|
## Integration with CI
|
65
68
|
|
66
|
-
Forspell return codes:
|
69
|
+
Forspell's return codes:
|
67
70
|
|
68
71
|
* 0 - when no errors found
|
69
72
|
* 1 - when there are any errors
|
data/lib/forspell/cli.rb
CHANGED
@@ -38,9 +38,9 @@ module Forspell
|
|
38
38
|
|
39
39
|
def call
|
40
40
|
init_options
|
41
|
+
init_reporter
|
41
42
|
create_files_list
|
42
43
|
init_speller
|
43
|
-
init_reporter
|
44
44
|
run
|
45
45
|
end
|
46
46
|
|
@@ -48,6 +48,9 @@ module Forspell
|
|
48
48
|
|
49
49
|
def create_files_list
|
50
50
|
@files = FileList.new(paths: @opts.arguments, exclude_paths: @opts[:exclude_paths])
|
51
|
+
rescue Forspell::FileList::PathLoadError => path
|
52
|
+
@reporter.path_load_error path
|
53
|
+
exit ERROR_CODE
|
51
54
|
end
|
52
55
|
|
53
56
|
def init_options
|
@@ -55,11 +58,7 @@ module Forspell
|
|
55
58
|
|
56
59
|
@opts = Slop.parse(@options, &DEFINITIONS)
|
57
60
|
|
58
|
-
if @opts.arguments.empty?
|
59
|
-
puts 'Usage: forspell paths to check [options]'
|
60
|
-
puts 'Type --help for more info'
|
61
|
-
exit(ERROR_CODE)
|
62
|
-
end
|
61
|
+
@opts.arguments << '.' if @opts.arguments.empty?
|
63
62
|
|
64
63
|
@opts[:format] = 'dictionary' if @opts[:gen_dictionary]
|
65
64
|
@opts[:format] = @opts[:format]&.downcase
|
@@ -88,9 +87,6 @@ module Forspell
|
|
88
87
|
runner = Forspell::Runner.new(files: @files, speller: @speller, reporter: @reporter)
|
89
88
|
runner.call
|
90
89
|
exit @reporter.finalize
|
91
|
-
rescue Forspell::FileList::PathLoadError => path
|
92
|
-
@reporter.path_load_error path
|
93
|
-
exit ERROR_CODE
|
94
90
|
end
|
95
91
|
end
|
96
92
|
end
|
data/lib/forspell/file_list.rb
CHANGED
data/lib/forspell/reporter.rb
CHANGED
@@ -13,10 +13,16 @@ module Forspell
|
|
13
13
|
ERROR_CODE = 1
|
14
14
|
DICT_PATH = File.join(Dir.pwd, 'forspell.dict')
|
15
15
|
DICT_OVERWRITE = 'Do you want to overwrite forspell.dict? (yN)'
|
16
|
+
DICT_PROMPT = <<~PROMPT
|
17
|
+
# Format: one word per line. Empty lines and #-comments are supported too.
|
18
|
+
# If you want to add word with its forms, you can write 'word: example' (without quotes) on the line,
|
19
|
+
# where 'example' is existing word with the same possible forms (endings) as your word.
|
20
|
+
# Example: deduplicate: duplicate
|
21
|
+
PROMPT
|
16
22
|
SUGGEST_FORMAT = '(suggestions: %<suggestions>s)'
|
17
23
|
ERROR_FORMAT = '%<file>s:%<line>i: %<text>s %<suggest>s'
|
18
24
|
SUMMARY = "Forspell inspects *.rb, *.c, *.cpp, *.md files\n"\
|
19
|
-
'%<files>i inspected, %<errors>s detected'
|
25
|
+
'%<files>i file%<files_plural>s inspected, %<errors>s error%<errors_plural>s detected'
|
20
26
|
|
21
27
|
attr_accessor :progress_bar
|
22
28
|
|
@@ -51,7 +57,7 @@ module Forspell
|
|
51
57
|
@logger.error "Parsing error in #{@files.last}: #{error}"
|
52
58
|
end
|
53
59
|
|
54
|
-
def path_load_error
|
60
|
+
def path_load_error(path)
|
55
61
|
@logger.error "Path not found: #{path}"
|
56
62
|
end
|
57
63
|
|
@@ -93,7 +99,11 @@ module Forspell
|
|
93
99
|
color = err_count.positive? ? :red : :green
|
94
100
|
total_errors_colorized = @pastel.decorate(err_count.to_s, color)
|
95
101
|
|
96
|
-
print format(SUMMARY,
|
102
|
+
print format(SUMMARY,
|
103
|
+
files: @files.size,
|
104
|
+
errors: total_errors_colorized,
|
105
|
+
files_plural: @files.size == 1 ? '' : 's',
|
106
|
+
errors_plural: err_count == 1 ? '' : 's')
|
97
107
|
end
|
98
108
|
|
99
109
|
def print_dictionary
|
@@ -105,6 +115,7 @@ module Forspell
|
|
105
115
|
else
|
106
116
|
out = File.new(DICT_PATH, 'w')
|
107
117
|
end
|
118
|
+
out.puts DICT_PROMPT unless out.tty?
|
108
119
|
@errors.map(&:first)
|
109
120
|
.group_by(&:text)
|
110
121
|
.transform_values { |v| v.map(&:file).uniq }
|
@@ -117,7 +128,7 @@ module Forspell
|
|
117
128
|
|
118
129
|
private
|
119
130
|
|
120
|
-
def print
|
131
|
+
def print(something)
|
121
132
|
$stdout.tty? ? @progress_bar&.log(something) : puts(something)
|
122
133
|
end
|
123
134
|
end
|
data/lib/forspell/speller.rb
CHANGED
@@ -37,12 +37,12 @@ module Forspell
|
|
37
37
|
|
38
38
|
alterations.any?{ |w| dictionary.check?(w) }
|
39
39
|
else
|
40
|
-
parts.all? { |part| correct?(part) }
|
40
|
+
dictionary.check?(word) || parts.all? { |part| correct?(part) }
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
44
|
def suggest(word)
|
45
|
-
@suggestions_size.positive? ? dictionary.suggest(word).first(@suggestions_size) : []
|
45
|
+
@suggestions_size.positive? ? dictionary.suggest(word).first(@suggestions_size) - [word, word.capitalize] : []
|
46
46
|
end
|
47
47
|
end
|
48
48
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: forspell
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kirill Kuprikov
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2024-04-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: slop
|
@@ -73,14 +73,14 @@ dependencies:
|
|
73
73
|
requirements:
|
74
74
|
- - "~>"
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version: '
|
76
|
+
version: '6.0'
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
81
|
- - "~>"
|
82
82
|
- !ruby/object:Gem::Version
|
83
|
-
version: '
|
83
|
+
version: '6.0'
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
85
|
name: yard
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
@@ -257,8 +257,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
257
257
|
- !ruby/object:Gem::Version
|
258
258
|
version: '0'
|
259
259
|
requirements: []
|
260
|
-
|
261
|
-
rubygems_version: 2.6.14
|
260
|
+
rubygems_version: 3.0.3.1
|
262
261
|
signing_key:
|
263
262
|
specification_version: 4
|
264
263
|
summary: For spelling check
|