spellr 0.8.5 → 0.9.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 80438eca6b5b281ceab331e0ab9886fcb9c622cfe1e91ca2762ed10628c44ee1
4
- data.tar.gz: 434910ca88653cb6a7d4bb11dabc32e4c782b22df4e65cc488ebaf6439bb3b38
3
+ metadata.gz: 901a89f14415b3993f210ac2f0f94cb82efdbfc55565f8e1c9fd51347790b3d6
4
+ data.tar.gz: 113d25fcdfc5d70c9e50f4a061092728c1349452e88e0dd0d6268d10851c47b9
5
5
  SHA512:
6
- metadata.gz: b14f3fe397b01f9a7e1742246a451e68238833c98e98b6716e36a11bb38d556463d992a0cdb8577f2dac2b65bb39eb0a9f3d050f884814c7449d0b6d2239e013
7
- data.tar.gz: 45fe01c33fd31faafd21248751f2a85f38c3807b75eb242fa994ffbdd14735f2dde343cf397b5f14281a24107ca5532d45b4c107b720546ac4994121c5599e58
6
+ metadata.gz: adcfec5ea17125517f445fb7e895b5ee049d1540f7626ab5c55d835d600b149d844b9a052f2324784038f5098a392a8f51b16d01c56ace9cffa773b34e27bbca
7
+ data.tar.gz: 922c16526b3e0dd8600ca5ef836de2419dda0237e3b3c2d8a2674d1ca7b0f0dcebf1fe0d0deded671522ee526c7e185a338ef98e762c4385e00b25f8e3ae94e8
data/CHANGELOG.md CHANGED
@@ -1,3 +1,19 @@
1
+ # v0.9.1
2
+ - Assume all files are utf8, more comprehensively. (Sets ::Encoding.default_external and default_internal while running)
3
+
4
+ # v0.9.0
5
+ - Recognize url with _ in query string and zero length path
6
+ - Assume all files are utf8
7
+
8
+ # v0.8.8
9
+ - output a suggested `spellr --interactive` command with filenames, when running this without --interactive
10
+
11
+ # v0.8.7
12
+ - Recognize URL with tilde in path
13
+
14
+ # v0.8.6
15
+ - `--suppress--file-rules` so you can check files that would usually be ignored
16
+
1
17
  # v0.8.5
2
18
  - Single line disable! use `spellr:disable-line` #25
3
19
 
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Spellr
2
2
 
3
+ [![Build Status](https://travis-ci.com/robotdana/spellr.svg?branch=main)](https://travis-ci.com/robotdana/spellr)
3
4
  [![Gem Version](https://badge.fury.io/rb/spellr.svg)](https://rubygems.org/gems/spellr)
4
- [![Build Status](https://travis-ci.org/robotdana/spellr.svg?branch=master)](https://travis-ci.org/robotdana/spellr)
5
5
 
6
6
  Spell check your source code for fun and occasionally finding bugs
7
7
 
@@ -27,6 +27,8 @@ However, in a programming context spelling things _consistently_ is useful, wher
27
27
 
28
28
  ## Installation
29
29
 
30
+ This is tested against ruby 2.4-3.0.
31
+
30
32
  ### With Bundler
31
33
 
32
34
  Add this line to your application's `Gemfile`:
@@ -195,7 +197,7 @@ If your language supports inline comments you can also surround with `spellr:dis
195
197
  ```
196
198
  ## Configuration
197
199
 
198
- 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).
200
+ 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/main/lib/.spellr.yml).
199
201
  There are top-level keys and per-language keys.
200
202
  ```yml
201
203
  word_minimum_length: 3 # any words shorter than this will be ignored
@@ -304,6 +306,18 @@ Spellr::RakeTask.generate_task(:spellr, **spellr_arguments)
304
306
  task default: :spellr
305
307
  ```
306
308
 
309
+ ## Ignoring the configured patterns
310
+
311
+ Sometimes you'll want to spell check something that would usually be ignored,
312
+ e.g. `.git/COMMIT_EDITMSG` even though `spellr` ignores the `.git` directory.
313
+
314
+ For this you can use the `--suppress-file-rules` command line argument.
315
+ ```bash
316
+ $ spellr --suppress-file-rules .git/COMMIT_EDITMSG
317
+ ```
318
+
319
+ **Note: This still ignores files outside of the current directory**
320
+
307
321
  ## Development
308
322
 
309
323
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests.
@@ -317,4 +331,4 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/robotd
317
331
  ## License
318
332
 
319
333
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
320
- Wordlists packaged with this gem have their own licenses, see them in https://github.com/robotdana/spellr/tree/master/wordlists
334
+ Wordlists packaged with this gem have their own licenses, see them in https://github.com/robotdana/spellr/tree/main/wordlists
data/exe/spellr CHANGED
@@ -3,4 +3,7 @@
3
3
 
4
4
  require_relative '../lib/spellr/cli'
5
5
 
6
+ ::Encoding.default_external = ::Encoding::UTF_8
7
+ ::Encoding.default_internal = ::Encoding::UTF_8
8
+
6
9
  exit Spellr::CLI.new(ARGV).run
@@ -28,6 +28,9 @@ module Spellr
28
28
  opts.separator('')
29
29
  opts.on('--[no-]parallel', 'Run in parallel or not, default --parallel', &method(:parallel_option))
30
30
  opts.on('-d', '--dry-run', 'List files to be checked', &method(:dry_run_option))
31
+ opts.on('-f', '--suppress-file-rules', <<~HELP, &method(:suppress_file_rules))
32
+ Suppress all configured, default, and gitignore include and exclude patterns
33
+ HELP
31
34
  opts.separator('')
32
35
  opts.on('-c', '--config FILENAME', String, <<~HELP, &method(:config_option))
33
36
  Path to the config file (default ./.spellr.yml)
@@ -56,6 +59,10 @@ module Spellr
56
59
  Spellr.config.checker = Spellr::CheckInteractive unless @parallel_option
57
60
  end
58
61
 
62
+ def suppress_file_rules(_)
63
+ Spellr.config.suppress_file_rules = true
64
+ end
65
+
59
66
  def config_option(file)
60
67
  file = Spellr.pwd.join(file).expand_path
61
68
 
@@ -4,8 +4,8 @@ require_relative 'line_location'
4
4
 
5
5
  module Spellr
6
6
  class ColumnLocation
7
- attr_reader :char_offset
8
- attr_reader :byte_offset
7
+ attr_reader :char_offset, :byte_offset
8
+
9
9
  attr_accessor :line_location
10
10
 
11
11
  def initialize(char_offset: 0, byte_offset: 0, line_location: LineLocation.new)
data/lib/spellr/config.rb CHANGED
@@ -10,10 +10,11 @@ require 'pathname'
10
10
 
11
11
  module Spellr
12
12
  class Config
13
- attr_writer :reporter
14
- attr_writer :checker
13
+ attr_writer :reporter, :checker
14
+
15
+ attr_accessor :suppress_file_rules, :dry_run
16
+
15
17
  attr_reader :config_file
16
- attr_accessor :dry_run
17
18
  alias_method :dry_run?, :dry_run
18
19
 
19
20
  def initialize
@@ -77,7 +78,7 @@ module Spellr
77
78
  Spellr::ConfigValidator.new.valid?
78
79
  end
79
80
 
80
- def reset! # rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity
81
+ def reset! # rubocop:disable Metrics/MethodLength
81
82
  @config = ConfigLoader.new
82
83
  remove_instance_variable(:@languages) if defined?(@languages)
83
84
  remove_instance_variable(:@excludes) if defined?(@excludes)
@@ -26,10 +26,18 @@ module Spellr
26
26
 
27
27
  private
28
28
 
29
+ def configured_rules
30
+ return { gitignore: false } if Spellr.config.suppress_file_rules
31
+
32
+ {
33
+ ignore_rules: Spellr.config.excludes,
34
+ include_rules: Spellr.config.includes
35
+ }
36
+ end
37
+
29
38
  def fast_ignore # rubocop:disable Metrics/MethodLength
30
39
  FastIgnore.new(
31
- ignore_rules: Spellr.config.excludes,
32
- include_rules: Spellr.config.includes,
40
+ **configured_rules,
33
41
  argv_rules: @patterns,
34
42
  follow_symlinks: true,
35
43
  root: Spellr.pwd_s
@@ -58,7 +58,7 @@ module Spellr
58
58
  Process.clock_gettime(Process::CLOCK_MONOTONIC)
59
59
  end
60
60
 
61
- def stdin_getch(legal_chars) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
61
+ def stdin_getch(legal_chars) # rubocop:disable Metrics/MethodLength
62
62
  choice = output.stdin.getch
63
63
 
64
64
  if legal_chars.include?(choice)
@@ -13,10 +13,7 @@ class NaiveBayes
13
13
 
14
14
  YAML_PATH = File.join(__dir__, 'data.yml')
15
15
 
16
- attr_reader :feature_set
17
- attr_reader :num_classes
18
- attr_reader :classes
19
- attr_reader :features
16
+ attr_reader :feature_set, :num_classes, :classes, :features
20
17
 
21
18
  def initialize(path = YAML_PATH)
22
19
  load_from_yaml(path)
@@ -7,8 +7,7 @@ require 'fast_ignore'
7
7
 
8
8
  module Spellr
9
9
  class Language
10
- attr_reader :name
11
- attr_reader :key
10
+ attr_reader :name, :key
12
11
 
13
12
  def initialize(name, key: name[0], includes: [], hashbangs: [], locale: [], addable: true) # rubocop:disable Metrics/ParameterLists
14
13
  @name = name
@@ -4,10 +4,7 @@ require_relative 'file'
4
4
 
5
5
  module Spellr
6
6
  class LineLocation
7
- attr_reader :line_number
8
- attr_reader :char_offset
9
- attr_reader :byte_offset
10
- attr_reader :file
7
+ attr_reader :line_number, :char_offset, :byte_offset, :file
11
8
 
12
9
  def initialize(
13
10
  file = ::Spellr::File.new('[string]'),
@@ -9,8 +9,8 @@ require_relative 'token_regexps'
9
9
 
10
10
  module Spellr
11
11
  class LineTokenizer < StringScanner
12
- attr_reader :line
13
- attr_reader :skip_key
12
+ attr_reader :line, :skip_key
13
+
14
14
  alias_method :skip_key?, :skip_key
15
15
 
16
16
  include TokenRegexps
@@ -16,7 +16,7 @@ module Spellr
16
16
  @stderr ||= StringIO.new
17
17
  end
18
18
 
19
- def marshal_dump # rubocop:disable Metrics/MethodLength
19
+ def marshal_dump # rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
20
20
  l_exit_code = @exit_code if defined?(@exit_code)
21
21
  l_counts = @counts if defined?(@counts)
22
22
  l_stdin = @stdin if defined?(@stdin)
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'rake'
4
- require 'spellr/cli'
5
4
  require 'shellwords'
6
5
 
7
6
  module Spellr
@@ -36,11 +35,13 @@ module Spellr
36
35
  desc("Run spellr (default args: #{escaped_argv})")
37
36
  end
38
37
 
39
- def define_task
38
+ def define_task # rubocop:disable Metrics/MethodLength
40
39
  task(@name, :'*args') do |_, task_argv|
41
- argv = argv_or_default(task_argv)
42
- write_cli_cmd(argv)
43
- run(argv)
40
+ with_utf_8 do
41
+ argv = argv_or_default(task_argv)
42
+ write_cli_cmd(argv)
43
+ run(argv)
44
+ end
44
45
  end
45
46
  end
46
47
 
@@ -49,6 +50,7 @@ module Spellr
49
50
  end
50
51
 
51
52
  def run(argv)
53
+ require 'spellr/cli'
52
54
  status = Spellr::CLI.new(argv).run
53
55
  exit 1 unless status == 0
54
56
  end
@@ -57,5 +59,15 @@ module Spellr
57
59
  task_argv = task_argv.to_a.compact
58
60
  task_argv.empty? ? @default_argv : task_argv
59
61
  end
62
+
63
+ def with_utf_8 # rubocop:disable Metrics/MethodLength
64
+ old_default_external = ::Encoding.default_external
65
+ old_default_internal = ::Encoding.default_internal
66
+ ::Encoding.default_external = ::Encoding::UTF_8
67
+ ::Encoding.default_internal = ::Encoding::UTF_8
68
+ yield
69
+ ::Encoding.default_external = old_default_external
70
+ ::Encoding.default_internal = old_default_internal
71
+ end
60
72
  end
61
73
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'base_reporter'
4
+ require 'shellwords'
4
5
 
5
6
  module Spellr
6
7
  class Reporter < Spellr::BaseReporter
@@ -8,12 +9,31 @@ module Spellr
8
9
  puts "\n"
9
10
  puts "#{pluralize 'file', counts[:checked]} checked"
10
11
  puts "#{pluralize 'error', counts[:total]} found"
12
+
13
+ interactive_command if counts[:total].positive?
11
14
  end
12
15
 
13
16
  def call(token)
14
17
  super
15
18
 
19
+ filenames << token.location.file.relative_path.to_s
16
20
  increment(:total)
17
21
  end
22
+
23
+ private
24
+
25
+ def interactive_command
26
+ puts "\nto add or replace words interactively, run:"
27
+ command = ['spellr', '--interactive']
28
+ # sort is purely for repeatability for tests. so
29
+ command.concat(counts[:filenames].to_a.sort) unless counts[:filenames].length > 20
30
+
31
+ puts " #{Shellwords.join(command)}"
32
+ end
33
+
34
+ def filenames
35
+ output.counts[:filenames] = Set.new unless output.counts.key?(:filenames)
36
+ output.counts[:filenames]
37
+ end
18
38
  end
19
39
  end
@@ -39,8 +39,9 @@ module Spellr
39
39
  # literal \ so that i can match on domains in regexps. no-one cares but me.
40
40
  URL_HOSTNAME = /(?:[[:alnum:]\-\\]+(?:\.[[:alnum:]\-\\]+)+|localhost|#{URL_IP_ADDRESS})/.freeze
41
41
  URL_PORT = /:\d+/.freeze
42
- URL_PATH = %r{/(?:[[:alnum:]=@!$&\-/._\\]|%\h{2})+}.freeze
43
- URL_QUERY = %r{\?(?:[[:alnum:]=!$\-/.\\]|%\h{2})+(?:&(?:[[:alnum:]=!$\-/.\\]|%\h{2})+)*}.freeze
42
+ URL_PATH = %r{/(?:[[:alnum:]=@!$&~\-/._\\]|%\h{2})*}.freeze
43
+ URL_QUERY_PART = %r{(?:[[:alnum:]=!$\-/._\\]|%\h{2})+}.freeze
44
+ URL_QUERY = /\?#{URL_QUERY_PART}(?:&#{URL_QUERY_PART})*/.freeze
44
45
  URL_FRAGMENT = %r{#(?:[[:alnum:]=!$&\-/.\\]|%\h{2})+}.freeze
45
46
 
46
47
  # URL can be any valid hostname, it must have either a scheme, userinfo, or path
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Spellr
4
- VERSION = '0.8.5'
4
+ VERSION = '0.9.1'
5
5
  end
data/spellr.gemspec CHANGED
@@ -14,6 +14,12 @@ Gem::Specification.new do |spec|
14
14
  spec.homepage = 'http://github.com/robotdana/spellr'
15
15
  spec.license = 'MIT'
16
16
 
17
+ if spec.respond_to?(:metadata)
18
+ spec.metadata['homepage_uri'] = spec.homepage
19
+ spec.metadata['source_code_uri'] = spec.homepage
20
+ spec.metadata['changelog_uri'] = "#{spec.homepage}/blob/main/CHANGELOG.md"
21
+ end
22
+
17
23
  spec.required_ruby_version = '>= 2.4'
18
24
 
19
25
  spec.files = Dir.glob('{lib,exe,wordlists}/**/{*,.*}') + %w{
@@ -28,17 +34,17 @@ Gem::Specification.new do |spec|
28
34
  spec.require_paths = ['lib']
29
35
 
30
36
  spec.add_development_dependency 'bundler', '~> 2.0'
31
- spec.add_development_dependency 'leftovers', '>= 0.2.2'
37
+ spec.add_development_dependency 'leftovers', '>= 0.4.0'
32
38
  spec.add_development_dependency 'mime-types', '~> 3.3.1'
33
39
  spec.add_development_dependency 'nokogiri'
34
40
  spec.add_development_dependency 'pry'
35
41
  spec.add_development_dependency 'rake', '>= 12.3.3'
36
42
  spec.add_development_dependency 'rspec', '~> 3.0'
37
- spec.add_development_dependency 'rubocop'
38
- spec.add_development_dependency 'rubocop-rspec'
43
+ spec.add_development_dependency 'rubocop', '~> 0.93.1'
44
+ spec.add_development_dependency 'rubocop-rspec', '~> 1.44.1'
39
45
  spec.add_development_dependency 'simplecov', '~> 0.18.5'
40
46
  spec.add_development_dependency 'simplecov-console'
41
- spec.add_development_dependency 'tty_string', '>= 0.2.1'
47
+ spec.add_development_dependency 'tty_string', '>= 1.1.0'
42
48
  spec.add_development_dependency 'webmock', '~> 3.8'
43
49
 
44
50
  spec.add_dependency 'fast_ignore', '>= 0.11.0'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spellr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.5
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dana Sherson
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-06-06 00:00:00.000000000 Z
11
+ date: 2021-06-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 0.2.2
33
+ version: 0.4.0
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 0.2.2
40
+ version: 0.4.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: mime-types
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -112,30 +112,30 @@ dependencies:
112
112
  name: rubocop
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - ">="
115
+ - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '0'
117
+ version: 0.93.1
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - ">="
122
+ - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '0'
124
+ version: 0.93.1
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: rubocop-rspec
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - ">="
129
+ - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: '0'
131
+ version: 1.44.1
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - ">="
136
+ - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: '0'
138
+ version: 1.44.1
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: simplecov
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -170,14 +170,14 @@ dependencies:
170
170
  requirements:
171
171
  - - ">="
172
172
  - !ruby/object:Gem::Version
173
- version: 0.2.1
173
+ version: 1.1.0
174
174
  type: :development
175
175
  prerelease: false
176
176
  version_requirements: !ruby/object:Gem::Requirement
177
177
  requirements:
178
178
  - - ">="
179
179
  - !ruby/object:Gem::Version
180
- version: 0.2.1
180
+ version: 1.1.0
181
181
  - !ruby/object:Gem::Dependency
182
182
  name: webmock
183
183
  requirement: !ruby/object:Gem::Requirement
@@ -220,7 +220,7 @@ dependencies:
220
220
  - - "~>"
221
221
  - !ruby/object:Gem::Version
222
222
  version: '1.0'
223
- description:
223
+ description:
224
224
  email:
225
225
  - robot@dana.sh
226
226
  executables:
@@ -299,8 +299,11 @@ files:
299
299
  homepage: http://github.com/robotdana/spellr
300
300
  licenses:
301
301
  - MIT
302
- metadata: {}
303
- post_install_message:
302
+ metadata:
303
+ homepage_uri: http://github.com/robotdana/spellr
304
+ source_code_uri: http://github.com/robotdana/spellr
305
+ changelog_uri: http://github.com/robotdana/spellr/blob/main/CHANGELOG.md
306
+ post_install_message:
304
307
  rdoc_options: []
305
308
  require_paths:
306
309
  - lib
@@ -315,8 +318,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
315
318
  - !ruby/object:Gem::Version
316
319
  version: '0'
317
320
  requirements: []
318
- rubygems_version: 3.0.8
319
- signing_key:
321
+ rubygems_version: 3.2.15
322
+ signing_key:
320
323
  specification_version: 4
321
324
  summary: Spell check your source code
322
325
  test_files: []