did_you_mean 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4765e62fea49eb8f8863c01825a7ec89b1be951e
4
- data.tar.gz: 4c993cb9c366008086539cf047ba7a81eddf7450
3
+ metadata.gz: b69ea3a675f27d9da3419e086c21bd5930f16f90
4
+ data.tar.gz: 56d723b6a3ab08a92e07412bc0efa2051920626f
5
5
  SHA512:
6
- metadata.gz: e68859b53e91e551e698168bdb06a1ad0034e5a12457ca974a2d2147504f2627344af672de248c156d4a8df64afb0e298bf523b6242c1192f84f5cea94a9bcb2
7
- data.tar.gz: 16f2eb958b3494439251ae0c33fb5f924370f7fab9632bbddaa062b8d6023214247bd98af7b0c806f1b0a17aa3e059a986a048bba1b93141dcfb658b1c96d84d
6
+ metadata.gz: 1aaf379cad209d36b9df5ed695a42a97bde164cb52619b6c47f1a2c1163ee3ebe1d040c906a46ba89cb3f6e78570f994cf357c08bb87044f7a46aadfbac70810
7
+ data.tar.gz: 374348aefc081447d3e27f86feb1628ce6914140931e35738e3b230e66e077d245591671dc6c787798c8f4a06edad083051f92e4babfd882e386e051044006d3
data/.gitignore CHANGED
@@ -3,9 +3,7 @@
3
3
  .bundle
4
4
  .config
5
5
  .yardoc
6
- .DS_Store
7
6
  Gemfile.lock
8
- gemfiles/*.lock
9
7
  InstalledFiles
10
8
  _yardoc
11
9
  coverage
@@ -13,19 +11,9 @@ doc/
13
11
  lib/bundler/man
14
12
  pkg
15
13
  rdoc
16
- spec/reports
17
14
  test/tmp
18
15
  test/version_tmp
19
16
  tmp
20
17
  log
21
-
22
18
  evaluation/dictionary.yml
23
19
  benchmark/results
24
-
25
- ext/**/*.o
26
- ext/**/*.so
27
- ext/**/Makefile
28
-
29
- lib/**/*.so
30
-
31
- .travis.yml.osx
@@ -3,9 +3,14 @@ script: bundle exec rake
3
3
  cache: bundler
4
4
  sudo: false
5
5
 
6
+ before_install:
7
+ - gem install bundler
8
+
6
9
  after_success:
7
10
  - bundle exec rake test:accuracy
8
11
  - bundle exec rake benchmark:memory
9
12
 
10
13
  rvm:
14
+ - 2.3.0
11
15
  - ruby-head
16
+ - jruby-head
@@ -1,8 +1,65 @@
1
+ ## [v1.0.0](https://github.com/yuki24/did_you_mean/tree/v1.0.0)
2
+
3
+ _<sup>released on 2015-12-25 05:13:04 UTC</sup>_
4
+
5
+ #### Features
6
+
7
+ - Introduced a [verbose formatter](https://github.com/yuki24/did_you_mean#verbose-formatter)
8
+ - Introduced an easy way to enabling [extra features](https://github.com/yuki24/did_you_mean#extra-features)
9
+
10
+ #### Bug Fixes
11
+
12
+ - Fixed a bug where the Jaro-Winkler implementation returns the wrong distance when 2 identical strings are given
13
+
14
+ #### Internal Changes
15
+
16
+ - Slightly changed the spell checking algorithm. Take a look at [<tt>e2f5b24</tt>](https://github.com/yuki24/did_you_mean/commit/e2f5b2437f967565e4830eab6077f73ae166e0a7) for more details. fixes [#60](https://github.com/yuki24/did_you_mean/issues/60)
17
+
18
+ ## [v1.0.0.rc1](https://github.com/yuki24/did_you_mean/tree/v1.0.0.rc1)
19
+
20
+ _<sup>released on 2015-12-25 05:02:25 UTC</sup>_
21
+
22
+ #### Internal Chagens
23
+
24
+ - No longer uses `TracePoint` API by default. fixes [#55](https://github.com/yuki24/did_you_mean/issues/55) and [#56](https://github.com/yuki24/did_you_mean/issues/56)
25
+
26
+ ## [v1.0.0.beta3](https://github.com/yuki24/did_you_mean/tree/v1.0.0.beta3)
27
+
28
+ _<sup>released on 2015-12-25 04:56:13 UTC</sup>_
29
+
30
+ #### Internal Changes
31
+
32
+ - Enable the `frozen-string-literal` pragma rather than calling `.freeze` everywhere
33
+ - Use the `NameError#receiver` method in `DidYouMean:: ClassNameChecker` to know the namespace where the constant call is made
34
+ - Refactored the `SpellCheckerTest`
35
+
36
+ ## [v1.0.0.beta2](https://github.com/yuki24/did_you_mean/tree/v1.0.0.beta2)
37
+
38
+ _<sup>released on 2015-12-25 04:50:36 UTC</sup>_
39
+
40
+ #### Bug Fixes
41
+
42
+ - Fixed a bug where the gem doesn't install properly on Ruby 2.3.0dev
43
+
44
+ ## [v1.0.0.beta1](https://github.com/yuki24/did_you_mean/tree/v1.0.0.beta1)
45
+
46
+ _<sup>released on 2015-12-25 05:27:53 UTC</sup>_
47
+
48
+ #### Breaking Changes
49
+
50
+ - Dropped support for MRIs older than 2.3, JRuby and Rubinus
51
+
52
+ #### Internal Changes
53
+
54
+ - The C extension has been removed since the `NameError#receiver` method has become part of the MRI 2.3
55
+ - The interception gem has been removed from the dependencies
56
+ - Removed code that was needed to support multiple Ruby implementations
57
+
1
58
  ## [v0.10.0](https://github.com/yuki24/did_you_mean/tree/v0.10.0)
2
59
 
3
60
  _<sup>released on 2015-08-21 06:44:11 UTC</sup>_
4
61
 
5
- #### New Features
62
+ #### Features
6
63
 
7
64
  - Now it corrects an instance variable name if the ivar name is mistyped and `NoMethodError` is raised:
8
65
 
@@ -35,9 +92,12 @@ _<sup>released on 2015-05-14 03:04:47 UTC</sup>_
35
92
 
36
93
  _<sup>released on 2015-05-13 03:48:19 UTC</sup>_
37
94
 
38
- #### Small/Internal Changes
95
+ #### Features
96
+
97
+ - Order word suggestions based on Levenshtein distance ( [@tleish](https://github.com/tleish), [#31](https://github.com/yuki24/did_you_mean/pull/31))
98
+
99
+ #### Internal Changes
39
100
 
40
- - Order word corrections based on Levenshtein distance ( [@tleish](https://github.com/tleish), [#31](https://github.com/yuki24/did_you_mean/pull/31 "Order word corrections based on Levenshtein.distance."))
41
101
  - Reduce memory allocation by about 40%
42
102
  - Speed up Levenshtein distance calculation by about 40%
43
103
  - The Java extension has been replaced with a pure JRuby implementation
@@ -80,7 +140,7 @@ _<sup>released on 2014-11-19 20:00:00 UTC</sup>_
80
140
 
81
141
  #### Bug Fixes
82
142
 
83
- - Fixed a bug where no corrections will be made on JRuby
143
+ - Fixed a bug where no suggestions will be made on JRuby
84
144
 
85
145
  ## [v0.9.3](https://github.com/yuki24/did_you_mean/tree/v0.9.3)
86
146
 
@@ -115,7 +175,7 @@ _<sup>released on 2014-11-16 18:54:24 UTC</sup>_
115
175
 
116
176
  _<sup>released on 2014-11-09 01:26:31 UTC</sup>_
117
177
 
118
- #### New Features
178
+ #### Features
119
179
 
120
180
  - did\_you\_mean now suggests instance variable names if `@` is missing ( [#12](https://github.com/yuki24/did_you_mean/issues/12 "Suggest instance- and class-vars"), [<tt>39d1e2b</tt>](https://github.com/yuki24/did_you_mean/commit/39d1e2bd66d6ff8acbc4dd5da922fc7e5fcefb20))
121
181
 
@@ -139,7 +199,7 @@ _<sup>released on 2014-10-27 02:03:13 UTC</sup>_
139
199
 
140
200
  **This version has been yanked from rubygems.org as it has a serious bug with Ruby 2.1.3 and 2.1.4 installed on Max OS X. Please upgrade to 0.9.4 or higher as soon as possible.**
141
201
 
142
- #### New Features
202
+ #### Features
143
203
 
144
204
  - JRuby support!
145
205
 
@@ -155,7 +215,7 @@ _<sup>released on 2014-09-26 03:37:18 UTC</sup>_
155
215
 
156
216
  **This version has been yanked from rubygems.org as it has a serious bug with Ruby 2.1.3 and 2.1.4 installed on Max OS X. Please upgrade to 0.9.4 or higher as soon as possible.**
157
217
 
158
- #### New Features
218
+ #### Features
159
219
 
160
220
  - Added support for Ruby 2.1.3, 2.2.0-preview1 and ruby-head
161
221
  - Added support for ActiveRecord 4.2.0.beta1
@@ -163,7 +223,7 @@ _<sup>released on 2014-09-26 03:37:18 UTC</sup>_
163
223
  - Removed `text` gem dependency
164
224
  - Better output on pry and Rspec
165
225
 
166
- #### Small/Internal Changes
226
+ #### Internal Changes
167
227
 
168
228
  - A lot of internal refactoring
169
229
 
@@ -171,11 +231,11 @@ _<sup>released on 2014-09-26 03:37:18 UTC</sup>_
171
231
 
172
232
  _<sup>released on 2014-05-18 00:23:24 UTC</sup>_
173
233
 
174
- **This version has been yanked from rubygems.org as it has a serious bug with Ruby 2.1.3 and 2.1.4 installed on Max OS X. Please upgrade to 0.9.0 as soon as possible.**
234
+ **This version has been yanked from rubygems.org as it has a serious bug with Ruby 2.1.3 and 2.1.4 installed on Max OS X. Please upgrade to 0.9.4 or higher as soon as possible.**
175
235
 
176
- #### New Features
236
+ #### Features
177
237
 
178
- - Added basic support for constants. Now you'll see class name corrections when you misspelled a class names/module names:
238
+ - Added basic support for constants. Now you'll see class name suggestions when you misspelled a class names/module names:
179
239
 
180
240
  ```ruby
181
241
  > Ocject
@@ -193,7 +253,7 @@ _<sup>released on 2014-05-18 00:23:24 UTC</sup>_
193
253
 
194
254
  _<sup>released on 2014-05-10 17:59:54 UTC</sup>_
195
255
 
196
- #### New Features
256
+ #### Features
197
257
 
198
258
  - Added support for Ruby 2.1.2
199
259
 
@@ -201,7 +261,7 @@ _<sup>released on 2014-05-10 17:59:54 UTC</sup>_
201
261
 
202
262
  _<sup>released on 2014-04-20 02:10:31 UTC</sup>_
203
263
 
204
- #### New Features
264
+ #### Features
205
265
 
206
266
  - did\_you\_mean now suggests a similar attribute name when you misspelled it.
207
267
 
@@ -221,16 +281,16 @@ User.new(flrst_name: "wrong flrst name")
221
281
 
222
282
  _<sup>released on 2014-03-20 23:16:20 UTC</sup>_
223
283
 
224
- #### Small/Internal Changes
284
+ #### Features
225
285
 
226
286
  - Changed output for readability.
227
- - Better algorithm to find the correct method.
287
+ - Made the spell checking algorithm slight better to find the correct method.
228
288
 
229
289
  ## [v0.3.0](https://github.com/yuki24/did_you_mean/tree/v0.3.0)
230
290
 
231
291
  _<sup>released on 2014-03-20 23:13:13 UTC</sup>_
232
292
 
233
- #### New Features
293
+ #### Features
234
294
 
235
295
  - Added support for Ruby 2.1.1 and 2.2.0(head).
236
296
 
@@ -238,13 +298,13 @@ _<sup>released on 2014-03-20 23:13:13 UTC</sup>_
238
298
 
239
299
  _<sup>released on 2014-03-20 23:12:13 UTC</sup>_
240
300
 
241
- #### Incompatible Changes
301
+ #### Features
242
302
 
243
- - dropped support for JRuby and Rubbinious.
303
+ - did\_you\_mean no longer makes Ruby slow.
244
304
 
245
- #### New Features
305
+ #### Breaking Changes
246
306
 
247
- - did\_you\_mean no longer makes Ruby slow.
307
+ - dropped support for JRuby and Rubbinious.
248
308
 
249
309
  ## [v0.1.0: First Release](https://github.com/yuki24/did_you_mean/tree/v0.1.0)
250
310
 
data/Gemfile CHANGED
@@ -5,4 +5,4 @@ gemspec
5
5
 
6
6
  gem 'benchmark-ips'
7
7
  gem 'memory_profiler'
8
- gem 'jaro_winkler', '~> 1.3.6'
8
+ gem 'jaro_winkler', '>= 1.4.0' if RUBY_VERSION < '2.4.0'
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014 Yuki Nishijima
1
+ Copyright (c) 2014-2016 Yuki Nishijima
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -1,10 +1,8 @@
1
1
  # did_you_mean [![Gem Version](https://badge.fury.io/rb/did_you_mean.svg)](https://rubygems.org/gems/did_you_mean) [![Build Status](https://travis-ci.org/yuki24/did_you_mean.svg?branch=master)](https://travis-ci.org/yuki24/did_you_mean)
2
2
 
3
- 'Did you mean?' experience in Ruby. No, Really.
4
-
5
3
  ## Installation
6
4
 
7
- This gem will automatically be activated when a Ruby process starts up. No special setup is required.
5
+ Ruby 2.3 ships with this gem and it will automatically be `require`d when a Ruby process starts up. No special setup is required.
8
6
 
9
7
  ## Examples
10
8
 
@@ -13,73 +11,102 @@ This gem will automatically be activated when a Ruby process starts up. No speci
13
11
  #### Correcting a Misspelled Method Name
14
12
 
15
13
  ```ruby
16
- class User
17
- attr_accessor :first_name, :last_name
18
-
19
- def to_s
20
- "#{f1rst_name} #{last_name}" # f1rst_name ???
21
- end
22
- end
23
-
24
- user.to_s
25
- # => NameError: undefined local variable or method `f1rst_name' for #<User:0x0000000928fad8>
26
- #
27
- # Did you mean? #first_name
28
- #
14
+ methosd
15
+ # => NameError: undefined local variable or method `methosd' for main:Object
16
+ # Did you mean? methods
17
+ # method
29
18
  ```
30
19
 
31
20
  #### Correcting a Misspelled Class Name
32
21
 
33
22
  ```ruby
34
- class Book
35
- class TableOfContents
36
- # ...
37
- end
38
- end
39
-
40
- Book::TableofContents # TableofContents ???
41
- # => NameError: uninitialized constant Book::TableofContents
42
- #
43
- # Did you mean? Book::TableOfContents
44
- #
23
+ OBject
24
+ # => NameError: uninitialized constant OBject
25
+ # Did you mean? Object
45
26
  ```
46
27
 
47
- #### Suggesting an instance variable name
28
+ #### Suggesting an Instance Variable Name
48
29
 
49
30
  ```ruby
50
31
  @full_name = "Yuki Nishijima"
51
32
  first_name, last_name = full_name.split(" ")
52
33
  # => NameError: undefined local variable or method `full_name' for main:Object
53
- #
54
- # Did you mean? @full_name
55
- #
34
+ # Did you mean? @full_name
35
+ ```
36
+
37
+ #### Correcting a Class Variable Name
38
+
39
+ ```ruby
40
+ @@full_name = "Yuki Nishijima"
41
+ @@full_anme
42
+ # => NameError: uninitialized class variable @@full_anme in Object
43
+ # Did you mean? @@full_name
56
44
  ```
57
45
 
58
46
  ### NoMethodError
59
47
 
60
48
  ```ruby
61
- # In a Rails controller:
62
- params.with_inddiferent_access
63
- # => NoMethodError: undefined method `with_inddiferent_access' for {}:Hash
64
- #
65
- # Did you mean? #with_indifferent_access
66
- #
49
+ full_name = "Yuki Nishijima"
50
+ full_name.starts_with?("Y")
51
+ # => NoMethodError: undefined method `starts_with?' for "Yuki Nishijima":String
52
+ # Did you mean? start_with?
67
53
  ```
68
54
 
69
- ## 'Did You Mean' Experience is Everywhere
55
+ ## Extra Features
70
56
 
71
- _did\_you\_mean_ gem automagically puts method corrections into the error message. This means you'll have the "Did you mean?" experience almost everywhere:
57
+ Aside from the basic features above, the `did_you_mean` gem comes with 2 extra features. They can be enabled by calling `require 'did_you_mean/extra_features'`.
72
58
 
73
- ![Did you mean? on BetterErrors](https://raw.githubusercontent.com/yuki24/did_you_mean/master/doc/did_you_mean_example.png)
59
+ **Keep in mind that these extra features should never be enabled in production as they impact Ruby's performance and uses an unstable Ruby API.**
60
+
61
+ ### Correcting an Instance Variable When It's Incorrectly Typed
62
+
63
+ ```ruby
64
+ require 'did_you_mean/extra_features'
65
+
66
+ @full_name = "Yuki Nishijima"
67
+ @full_anme.split(" ")
68
+ # => NoMethodError: undefined method `split' for nil:NilClass
69
+ # Did you mean? @full_name
70
+ ```
71
+
72
+ ### Displaying a Warning When `initialize` is Incorrectly Typed
73
+ ```ruby
74
+ require 'did_you_mean/extra_features'
75
+
76
+ class Person
77
+ def intialize
78
+ ...
79
+ end
80
+ end
81
+ # => warning: intialize might be misspelled, perhaps you meant initialize?
82
+ ```
83
+
84
+ ## Verbose Formatter
85
+
86
+ This verbose formatter changes the error message format to take more lines/spaces so it'll be slightly easier to read the suggestions. This formatter can totally be used in any environment including production.
87
+
88
+ ```ruby
89
+ OBject
90
+ # => NameError: uninitialized constant OBject
91
+ # Did you mean? Object
92
+
93
+ require 'did_you_mean/verbose_formatter'
94
+ OBject
95
+ # => NameError: uninitialized constant OBject
96
+ #
97
+ # Did you mean? Object
98
+ #
99
+ ```
74
100
 
75
101
  ## Contributing
76
102
 
77
103
  1. Fork it (http://github.com/yuki24/did_you_mean/fork)
78
104
  2. Create your feature branch (`git checkout -b my-new-feature`)
79
105
  3. Commit your changes (`git commit -am 'Add some feature'`)
80
- 4. Push to the branch (`git push origin my-new-feature`)
81
- 5. Create new Pull Request
106
+ 4. Make sure all tests pass (`bundle exec rake`)
107
+ 5. Push to the branch (`git push origin my-new-feature`)
108
+ 6. Create new Pull Request
82
109
 
83
110
  ## License
84
111
 
85
- Copyright (c) 2015 Yuki Nishijima. See MIT-LICENSE for further details.
112
+ Copyright (c) 2014-16 Yuki Nishijima. See MIT-LICENSE for further details.
data/Rakefile CHANGED
@@ -28,7 +28,12 @@ Rake::TestTask.new("test:extra_features") do |task|
28
28
  task.ruby_opts << "-rdid_you_mean/extra_features"
29
29
  end
30
30
 
31
- task default: %i(test test:verbose_formatter test:extra_features)
31
+ if RUBY_ENGINE != 'jruby'
32
+ task default: %i(test test:verbose_formatter test:extra_features)
33
+ else
34
+ task default: %i(test test:verbose_formatter)
35
+ end
36
+
32
37
 
33
38
  namespace :test do
34
39
  namespace :accuracy do
@@ -7,14 +7,14 @@ require 'did_you_mean'
7
7
  # error = (self.fooo rescue $!)
8
8
  # executable = -> { error.to_s }
9
9
 
10
- class DidYouMean::WordCollection
10
+ class SpellChecker
11
11
  include DidYouMean::SpellCheckable
12
12
 
13
13
  def initialize(words)
14
14
  @words = words
15
15
  end
16
16
 
17
- def similar_to(input, filter = '')
17
+ def correct(input)
18
18
  @corrections, @input = nil, input
19
19
  corrections
20
20
  end
@@ -22,12 +22,12 @@ class DidYouMean::WordCollection
22
22
  def candidates
23
23
  { @input => @words }
24
24
  end
25
- end if !defined?(DidYouMean::WordCollection)
25
+ end
26
26
 
27
27
  METHODS = ''.methods
28
28
  INPUT = 'start_with?'
29
- collection = DidYouMean::WordCollection.new(METHODS)
30
- executable = proc { collection.similar_to(INPUT) }
29
+ collection = SpellChecker.new(METHODS)
30
+ executable = proc { collection.correct(INPUT) }
31
31
 
32
32
  GC.disable
33
33
  MemoryProfiler.report { 100.times(&executable) }.pretty_print
@@ -18,9 +18,9 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.required_ruby_version = '>= 2.3.0dev'
21
+ spec.required_ruby_version = '>= 2.3.0'
22
22
 
23
- spec.add_development_dependency "bundler", "~> 1.5"
23
+ spec.add_development_dependency "bundler", "~> 1.10"
24
24
  spec.add_development_dependency "rake"
25
25
  spec.add_development_dependency "minitest"
26
26
  end
@@ -26,7 +26,6 @@ puts "\n"
26
26
  report "loading program" do
27
27
  require 'yaml'
28
28
  require 'set'
29
- require 'did_you_mean'
30
29
 
31
30
  begin
32
31
  require 'jaro_winkler'
@@ -39,14 +38,14 @@ report "loading program" do
39
38
  rescue LoadError, NameError
40
39
  end
41
40
 
42
- class DidYouMean::WordCollection
41
+ class SpellChecker
43
42
  include DidYouMean::SpellCheckable
44
43
 
45
44
  def initialize(words)
46
45
  @words = words
47
46
  end
48
47
 
49
- def similar_to(input, filter = '')
48
+ def correct(input)
50
49
  @corrections, @input = nil, input
51
50
  corrections
52
51
  end
@@ -55,9 +54,8 @@ report "loading program" do
55
54
  { @input => @words }
56
55
  end
57
56
 
58
- private
59
- def normalize(str); str; end
60
- end if !defined?(DidYouMean::WordCollection)
57
+ private def normalize(str); str; end
58
+ end
61
59
  end
62
60
 
63
61
  report "loading dictionary" do
@@ -68,7 +66,7 @@ report "loading dictionary" do
68
66
  end
69
67
 
70
68
  report "loading corrent/incorrect words" do
71
- COLLECTION = DidYouMean::WordCollection.new(DICTIONARY)
69
+ SPELL_CHECKER = SpellChecker.new(DICTIONARY)
72
70
  INCORRECT_WORDS = YAML.load(open("evaluation/incorrect_words.yaml").read)
73
71
  end
74
72
 
@@ -77,44 +75,45 @@ correct_count = 0
77
75
  words_not_corrected = []
78
76
  filename = "log/words_not_corrected_#{Time.now.to_i}.yml"
79
77
 
80
- puts "
78
+ puts <<-MSG
79
+
81
80
  Total number of test data: #{INCORRECT_WORDS.size}
82
81
  did_you_mean version: #{DidYouMean::VERSION}
83
82
 
84
- "
83
+ MSG
85
84
 
86
85
  report "calculating accuracy" do
87
- index = 0
88
- INCORRECT_WORDS.each do |correct, incorrect|
89
- if DICTIONARY.include?(correct)
86
+ INCORRECT_WORDS.each_with_index do |(expected, user_input), index|
87
+ if DICTIONARY.include?(expected)
90
88
  total_count += 1
91
89
 
92
- corrections = COLLECTION.similar_to(incorrect)
93
- if corrections.first == correct
90
+ corrections = SPELL_CHECKER.correct(user_input)
91
+ if corrections.first == expected
94
92
  correct_count += 1
95
93
  else
96
94
  words_not_corrected << {
97
- correct => incorrect,
98
- 'result' => corrections
95
+ 'input' => user_input,
96
+ 'expected' => expected,
97
+ 'actual' => corrections
99
98
  }
100
99
  end
101
100
  end
102
101
 
103
- index += 1
104
102
  puts "processed #{index} items" if index % 100 == 0
105
103
  end
106
104
 
107
105
  puts "\n"
108
106
  end
109
107
 
110
- puts "
108
+ puts <<-MSG
109
+
111
110
  Evaulation result
112
111
 
113
112
  Total count : #{total_count}
114
113
  Correct count: #{correct_count}
115
114
  Accuracy : #{correct_count.to_f / total_count}
116
115
 
117
- "
116
+ MSG
118
117
 
119
118
  Dir.mkdir('log') unless File.exist?('log')
120
119
  File.open(filename, 'w') do |file|
@@ -5,12 +5,11 @@ require 'json'
5
5
  per_page = 500
6
6
  base_url = "https://simple.wiktionary.org/w/api.php?action=query&aplimit=#{per_page}&list=allpages&format=json"
7
7
  filename = "evaluation/dictionary.yml"
8
- count = nil
9
8
  apfrom = ""
10
9
  num = 0
11
10
  titles = []
12
11
 
13
- begin
12
+ loop do
14
13
  url = base_url + "&apfrom=#{apfrom}"
15
14
 
16
15
  puts "downloading page %2d: #{url}" % num
@@ -22,7 +21,9 @@ begin
22
21
 
23
22
  titles += json["query"]["allpages"].map {|hash| hash["title"] }
24
23
  num += 1
25
- end while count == per_page
24
+
25
+ break if count != per_page
26
+ end
26
27
 
27
28
  require 'yaml'
28
29
 
@@ -1,6 +1,6 @@
1
1
  module DidYouMean
2
2
  module ExtraFeatures
3
- module IvarNameCorrectable
3
+ module IvarNameCorrection
4
4
  REPLS = {
5
5
  "(irb)" => -> { Readline::HISTORY.to_a.last }
6
6
  }
@@ -38,6 +38,6 @@ module DidYouMean
38
38
  end
39
39
  end
40
40
 
41
- SPELL_CHECKERS['NoMethodError'].prepend(IvarNameCorrectable)
41
+ SPELL_CHECKERS['NoMethodError'].prepend(IvarNameCorrection)
42
42
  end
43
43
  end
@@ -11,8 +11,9 @@ module DidYouMean
11
11
  threshold = input.length > 3 ? 0.834 : 0.77
12
12
 
13
13
  seed = candidates.select {|candidate| JaroWinkler.distance(normalize(candidate), input) >= threshold }
14
- .sort_by! {|candidate| JaroWinkler.distance(candidate.to_s, input) }
15
- .reverse!
14
+ seed.reject! {|candidate| input == candidate.to_s }
15
+ seed.sort_by! {|candidate| JaroWinkler.distance(candidate.to_s, input) }
16
+ seed.reverse!
16
17
 
17
18
  # Correct mistypes
18
19
  threshold = (input.length * 0.25).ceil
@@ -16,7 +16,6 @@ module DidYouMean
16
16
  def method_names
17
17
  method_names = receiver.methods + receiver.singleton_methods
18
18
  method_names += receiver.private_methods if @has_args
19
- method_names.delete(method_name)
20
19
  method_names.uniq!
21
20
  method_names
22
21
  end
@@ -7,7 +7,7 @@ module DidYouMean
7
7
 
8
8
  def initialize(exception)
9
9
  @name = exception.name.to_s.tr("@", "")
10
- @lvar_names = exception.local_variables
10
+ @lvar_names = RUBY_ENGINE == 'jruby' ? [] : exception.local_variables
11
11
  receiver = exception.receiver
12
12
 
13
13
  @method_names = receiver.methods + receiver.private_methods
@@ -1,3 +1,3 @@
1
1
  module DidYouMean
2
- VERSION = "1.0.0"
2
+ VERSION = "1.0.1"
3
3
  end
@@ -5,7 +5,7 @@ class NameErrorExtensionTest < Minitest::Test
5
5
 
6
6
  class TestSpellChecker
7
7
  def initialize(*); end
8
- def corrections; ["Y U SO SLOW?"]; end
8
+ def corrections; ["does_exist"]; end
9
9
  end
10
10
 
11
11
  def setup
@@ -18,13 +18,14 @@ class NameErrorExtensionTest < Minitest::Test
18
18
  SPELL_CHECKERS['NameError'] = @org
19
19
  end
20
20
 
21
- def test_message_provides_original_message
22
- assert_match "undefined local variable or method", @error.to_s
23
- end
24
-
25
21
  def test_message
26
- assert_match "Did you mean? Y U SO SLOW?", @error.to_s
27
- assert_match "Did you mean? Y U SO SLOW?", @error.message
22
+ message = <<~MESSAGE.chomp
23
+ undefined local variable or method `doesnt_exist' for #{method(:to_s).super_method.call}
24
+ Did you mean? does_exist
25
+ MESSAGE
26
+
27
+ assert_equal message, @error.to_s
28
+ assert_equal message, @error.message
28
29
  end
29
30
 
30
31
  def test_to_s_does_not_make_disruptive_changes_to_error_message
@@ -32,6 +33,7 @@ class NameErrorExtensionTest < Minitest::Test
32
33
  raise NameError, "uninitialized constant Object"
33
34
  end
34
35
 
36
+ error.to_s
35
37
  assert_equal 1, error.to_s.scan("Did you mean?").count
36
38
  end
37
39
  end
@@ -53,8 +53,12 @@ class VariableNameTest < Minitest::Test
53
53
  person = person = nil
54
54
  error = (eprson rescue $!) # Do not use @assert_raises here as it changes a scope.
55
55
 
56
- assert_correction :person, error.corrections
57
- assert_match "Did you mean? person", error.to_s
56
+ if RUBY_ENGINE != 'jruby'
57
+ assert_correction :person, error.corrections
58
+ assert_match "Did you mean? person", error.to_s
59
+ else
60
+ assert_empty error.corrections
61
+ end
58
62
  end
59
63
 
60
64
  def test_corrections_include_instance_variable_name
@@ -55,7 +55,6 @@ class SpellCheckerTest < Minitest::Test
55
55
 
56
56
  def test_spell_checker_sorts_results_by_simiarity
57
57
  expected = %w(
58
- name123456
59
58
  name12345
60
59
  name1234
61
60
  name123
@@ -72,6 +71,12 @@ class SpellCheckerTest < Minitest::Test
72
71
  assert_equal expected, actual
73
72
  end
74
73
 
74
+ def test_spell_checker_excludes_input_from_dictionary
75
+ assert_empty SpellChecker.new('input', ['input']).corrections
76
+ assert_empty SpellChecker.new('input', [:input]).corrections
77
+ assert_empty SpellChecker.new(:input, ['input']).corrections
78
+ end
79
+
75
80
  private
76
81
 
77
82
  def assert_spell(expected, input: , dictionary: )
@@ -2,15 +2,14 @@ require 'test_helper'
2
2
 
3
3
  class VerboseFormatterTest < Minitest::Test
4
4
  def setup
5
- does_exist = does_exist = nil
6
- @error = assert_raises(NameError){ doesnt_exist }
5
+ @error = assert_raises(NameError){ self.inspectt }
7
6
  end
8
7
 
9
8
  def test_message
10
9
  assert_equal <<~MESSAGE.chomp, @error.message
11
- undefined local variable or method `doesnt_exist' for #{method(:to_s).super_method.call}
10
+ undefined method `inspectt' for #{method(:to_s).super_method.call}
12
11
 
13
- Did you mean? does_exist
12
+ Did you mean? inspect
14
13
 
15
14
  MESSAGE
16
15
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: did_you_mean
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuki Nishijima
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-22 00:00:00.000000000 Z
11
+ date: 2016-05-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.5'
19
+ version: '1.10'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.5'
26
+ version: '1.10'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -75,7 +75,6 @@ files:
75
75
  - did_you_mean.gemspec
76
76
  - doc/CHANGELOG.md.erb
77
77
  - doc/changelog_generator.rb
78
- - doc/did_you_mean_example.png
79
78
  - evaluation/calculator.rb
80
79
  - evaluation/dictionary_generator.rb
81
80
  - evaluation/incorrect_words.yaml
@@ -118,7 +117,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
118
117
  requirements:
119
118
  - - ">="
120
119
  - !ruby/object:Gem::Version
121
- version: 2.3.0dev
120
+ version: 2.3.0
122
121
  required_rubygems_version: !ruby/object:Gem::Requirement
123
122
  requirements:
124
123
  - - ">="