did_you_mean 1.1.3 → 1.2.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.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +0 -1
  4. data/CHANGELOG.md +84 -27
  5. data/README.md +13 -13
  6. data/Rakefile +4 -15
  7. data/did_you_mean.gemspec +1 -1
  8. data/evaluation/incorrect_words.yaml +2 -0
  9. data/lib/did_you_mean.rb +37 -3
  10. data/lib/did_you_mean/core_ext/name_error.rb +4 -7
  11. data/lib/did_you_mean/experimental.rb +0 -15
  12. data/lib/did_you_mean/experimental/initializer_name_correction.rb +2 -0
  13. data/lib/did_you_mean/experimental/ivar_name_correction.rb +36 -9
  14. data/lib/did_you_mean/formatters/plain_formatter.rb +9 -0
  15. data/lib/did_you_mean/formatters/verbose_formatter.rb +13 -0
  16. data/lib/did_you_mean/spell_checkers/key_error_checker.rb +14 -0
  17. data/lib/did_you_mean/spell_checkers/method_name_checker.rb +2 -0
  18. data/lib/did_you_mean/spell_checkers/name_error_checkers.rb +2 -6
  19. data/lib/did_you_mean/spell_checkers/name_error_checkers/class_name_checker.rb +3 -5
  20. data/lib/did_you_mean/spell_checkers/name_error_checkers/variable_name_checker.rb +4 -1
  21. data/lib/did_you_mean/verbose.rb +4 -0
  22. data/lib/did_you_mean/verbose_formatter.rb +5 -14
  23. data/lib/did_you_mean/version.rb +1 -1
  24. data/test/core_ext/name_error_extension_test.rb +5 -43
  25. data/test/edit_distance/jaro_winkler_test.rb +7 -0
  26. data/test/spell_checking/{class_name_test.rb → class_name_check_test.rb} +1 -13
  27. data/test/spell_checking/key_name_check_test.rb +44 -0
  28. data/test/spell_checking/{method_name_test.rb → method_name_check_test.rb} +1 -1
  29. data/test/spell_checking/{uncorrectable_name_test.rb → uncorrectable_name_check_test.rb} +1 -1
  30. data/test/spell_checking/{variable_name_test.rb → variable_name_check_test.rb} +26 -1
  31. data/test/verbose_formatter_test.rb +7 -1
  32. metadata +18 -19
  33. data/lib/did_you_mean/experimental/key_error_name_correction.rb +0 -32
  34. data/lib/did_you_mean/formatter.rb +0 -16
  35. data/test/experimental/key_error_test.rb +0 -15
  36. data/test/fixtures/book.rb +0 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 412c345b8350b7d64bcbcf09ea72178bce0fdb02
4
- data.tar.gz: 4918c2d1c307b4d30d9b00178d5e62e932b0b042
3
+ metadata.gz: 79a0131dfb1348a1f49293ca29cbfa12eab5f896
4
+ data.tar.gz: 274dd39aacc7583c0877cb3313cd938390d11003
5
5
  SHA512:
6
- metadata.gz: ab04de77990d06fe206dbc98424e812d8cdf94df29ec472c30624e3738a2ea9eb9e5b67f931c09a70baf05fb84854ceefbf4d00d03ada0e05cdefa47aa73a5ad
7
- data.tar.gz: db122760d256332aac2626d3b438e0ed25a33833e9390bfc06ce6fee4ca5623027485315521da541eebafd193c25b251962b92c7a95a0799f5d8925de2010a1b
6
+ metadata.gz: 31fc5df24553e10482afff9bd425c055f4b0ffbf4d4267927979b3c314a589ff40e13b6597a1e22f5415a221a6e6e0853e0a608d6aab7dafd2b6f71551d23490
7
+ data.tar.gz: 5739306a3ddbed14ffe321a114ce5eda17513303d3e6d887da1978c781e694994addb383faf5c178bf46405fa49cc7e5630ad281b33caccdc66ba455eae297ff
@@ -1 +1 @@
1
- 2.4.1
1
+ 2.5.0-dev
@@ -11,5 +11,4 @@ after_success:
11
11
  - bundle exec rake benchmark:memory
12
12
 
13
13
  rvm:
14
- - 2.4.0
15
14
  - ruby-head
@@ -1,6 +1,64 @@
1
+ ## [v1.1.2](https://github.com/yuki24/did_you_mean/tree/v1.1.2)
2
+
3
+ _<sup>released at 2017-09-24 07:28:48 UTC</sup>_
4
+
5
+ **This version is compatible with Ruby 2.4 and older**
6
+
7
+ #### Bug Fixes
8
+
9
+ - Fixed a bug where `did_you_mean` shows duplicate suggestions when the exception is raised multiple times ([#84](https://github.com/yuki24/did_you_mean/pull/84), [<tt>c2e4008</tt>](https://github.com/yuki24/did_you_mean/commit/c2e40083cef604c00ccd10efc6d7a5036ad9eb5b))
10
+
11
+ ## [v1.1.1](https://github.com/yuki24/did_you_mean/tree/v1.1.1)
12
+
13
+ _<sup>released at 2017-09-24 07:24:02 UTC</sup>_
14
+
15
+ ### This version has been yanked from Rubygems.org and is not available.
16
+
17
+ ## [v1.1.0](https://github.com/yuki24/did_you_mean/tree/v1.1.0)
18
+
19
+ _<sup>released at 2016-12-19 23:19:06 UTC</sup>_
20
+
21
+ The version `1.1.0` only has support for Ruby 2.4.0 and later. Also, all patch releasess under `1.1.*` will only be compatible with Ruby 2.4.0 and later as well. Versions under `1.0.*` will still be maintained until Ruby 2.3 is deprecated. Any other versions below `1.0` will no longer be maintained.
22
+
23
+ #### New Features
24
+
25
+ - Suggest a method name on a NameError from the `Struct#[]` or `Struct#[]=` method ([#73](https://github.com/yuki24/did_you_mean/pull/73)):
26
+
27
+ ```ruby
28
+ Struct.new(:foo).new[:fooo]
29
+ # => NameError: no member 'fooo' in struct
30
+ # Did you mean? foo
31
+ # foo=
32
+ ```
33
+
34
+ - Added a public interface for the gem's spell checker:
35
+
36
+ ```ruby
37
+ DidYouMean::SpellChecker.new(dictionary: ['email', 'fail', 'eval']).correct('meail')
38
+ # => ['email']
39
+ ```
40
+
41
+ - Methods defined on `nil` by default are no longer suggested. Note that methods, defined after the gem is loaded, will still be suggested (e.g. ActiveSupport).
42
+
43
+ #### Bug Fixes
44
+
45
+ - Fixed a bug where private method names were added to the dictionary when an argument was passed in to a public method. Use the `NoMethodError#private_call?` method instead ([<tt>0a1b761</tt>](https://github.com/yuki24/did_you_mean/commit/0a1b7612252055e583a373b473932f789381ca0f))
46
+
47
+ ## [v1.0.3](https://github.com/yuki24/did_you_mean/tree/v1.0.3)
48
+
49
+ _<sup>released at 2017-09-24 07:22:07 UTC</sup>_
50
+
51
+ **This version is compatible with Ruby 2.3 and older**
52
+
53
+ #### Bug Fixes
54
+
55
+ - Fixed a bug where `did_you_mean` shows duplicate suggestions when the exception is raised multiple times ([#84](https://github.com/yuki24/did_you_mean/pull/84), [<tt>c2e4008</tt>](https://github.com/yuki24/did_you_mean/commit/c2e40083cef604c00ccd10efc6d7a5036ad9eb5b))
56
+
1
57
  ## [v1.0.2](https://github.com/yuki24/did_you_mean/tree/v1.0.2)
2
58
 
3
- _<sup>released on 2016-06-20 18:03:07 UTC</sup>_
59
+ _<sup>released at 2016-11-20 18:03:07 UTC</sup>_
60
+
61
+ **This version is compatible with Ruby 2.3 and older**
4
62
 
5
63
  #### Features
6
64
 
@@ -16,17 +74,16 @@ _<sup>released on 2016-06-20 18:03:07 UTC</sup>_
16
74
 
17
75
  ## [v1.0.1](https://github.com/yuki24/did_you_mean/tree/v1.0.1)
18
76
 
19
- _<sup>released on 2016-05-15 05:17:22 UTC</sup>_
77
+ _<sup>released at 2016-05-15 05:17:22 UTC</sup>_
20
78
 
21
79
  #### Bug Fixes
22
80
 
23
81
  - Fixed a bug where the gem suggests what is actually typed by the user: [<tt>1c52c88</tt>](https://github.com/yuki24/did_you_mean/commit/1c52c887c62b0921e799f94bcc4a846dc7cbc057)
24
82
  - Fixed features that didn't work on JRuby 9.1.0.0: [<tt>dc48dde</tt>](https://github.com/yuki24/did_you_mean/commit/dc48dde1b2a8f05aab1fcf897e1cb3075a206f53), [<tt>4de23f8</tt>](https://github.com/yuki24/did_you_mean/commit/4de23f880502c80c5f321371d39c08bb0fa34040), [<tt>00e3059</tt>](https://github.com/yuki24/did_you_mean/commit/00e305971060d150fae4817b5e895d6478b37579). The local variable name correction is still disabled. Also see: [jruby/jruby#3480](https://github.com/jruby/jruby/issues/3480)
25
83
 
26
-
27
84
  ## [v1.0.0](https://github.com/yuki24/did_you_mean/tree/v1.0.0)
28
85
 
29
- _<sup>released on 2015-12-25 05:13:04 UTC</sup>_
86
+ _<sup>released at 2015-12-25 05:13:04 UTC</sup>_
30
87
 
31
88
  #### Features
32
89
 
@@ -43,7 +100,7 @@ _<sup>released on 2015-12-25 05:13:04 UTC</sup>_
43
100
 
44
101
  ## [v1.0.0.rc1](https://github.com/yuki24/did_you_mean/tree/v1.0.0.rc1)
45
102
 
46
- _<sup>released on 2015-12-25 05:02:25 UTC</sup>_
103
+ _<sup>released at 2015-12-25 05:02:25 UTC</sup>_
47
104
 
48
105
  #### Internal Chagens
49
106
 
@@ -51,7 +108,7 @@ _<sup>released on 2015-12-25 05:02:25 UTC</sup>_
51
108
 
52
109
  ## [v1.0.0.beta3](https://github.com/yuki24/did_you_mean/tree/v1.0.0.beta3)
53
110
 
54
- _<sup>released on 2015-12-25 04:56:13 UTC</sup>_
111
+ _<sup>released at 2015-12-25 04:56:13 UTC</sup>_
55
112
 
56
113
  #### Internal Changes
57
114
 
@@ -61,7 +118,7 @@ _<sup>released on 2015-12-25 04:56:13 UTC</sup>_
61
118
 
62
119
  ## [v1.0.0.beta2](https://github.com/yuki24/did_you_mean/tree/v1.0.0.beta2)
63
120
 
64
- _<sup>released on 2015-12-25 04:50:36 UTC</sup>_
121
+ _<sup>released at 2015-12-25 04:50:36 UTC</sup>_
65
122
 
66
123
  #### Bug Fixes
67
124
 
@@ -69,7 +126,7 @@ _<sup>released on 2015-12-25 04:50:36 UTC</sup>_
69
126
 
70
127
  ## [v1.0.0.beta1](https://github.com/yuki24/did_you_mean/tree/v1.0.0.beta1)
71
128
 
72
- _<sup>released on 2015-12-25 05:27:53 UTC</sup>_
129
+ _<sup>released at 2015-12-25 05:27:53 UTC</sup>_
73
130
 
74
131
  #### Breaking Changes
75
132
 
@@ -83,7 +140,7 @@ _<sup>released on 2015-12-25 05:27:53 UTC</sup>_
83
140
 
84
141
  ## [v0.10.0](https://github.com/yuki24/did_you_mean/tree/v0.10.0)
85
142
 
86
- _<sup>released on 2015-08-21 06:44:11 UTC</sup>_
143
+ _<sup>released at 2015-08-21 06:44:11 UTC</sup>_
87
144
 
88
145
  #### Features
89
146
 
@@ -108,7 +165,7 @@ _<sup>released on 2015-08-21 06:44:11 UTC</sup>_
108
165
 
109
166
  ## [v0.9.10](https://github.com/yuki24/did_you_mean/tree/v0.9.10)
110
167
 
111
- _<sup>released on 2015-05-14 03:04:47 UTC</sup>_
168
+ _<sup>released at 2015-05-14 03:04:47 UTC</sup>_
112
169
 
113
170
  #### Bug Fixes
114
171
 
@@ -116,7 +173,7 @@ _<sup>released on 2015-05-14 03:04:47 UTC</sup>_
116
173
 
117
174
  ## [v0.9.9](https://github.com/yuki24/did_you_mean/tree/v0.9.9)
118
175
 
119
- _<sup>released on 2015-05-13 03:48:19 UTC</sup>_
176
+ _<sup>released at 2015-05-13 03:48:19 UTC</sup>_
120
177
 
121
178
  #### Features
122
179
 
@@ -130,7 +187,7 @@ _<sup>released on 2015-05-13 03:48:19 UTC</sup>_
130
187
 
131
188
  ## [v0.9.8](https://github.com/yuki24/did_you_mean/tree/v0.9.8)
132
189
 
133
- _<sup>released on 2015-04-12 01:55:27 UTC</sup>_
190
+ _<sup>released at 2015-04-12 01:55:27 UTC</sup>_
134
191
 
135
192
  #### Internal Changes
136
193
 
@@ -138,7 +195,7 @@ _<sup>released on 2015-04-12 01:55:27 UTC</sup>_
138
195
 
139
196
  ## [v0.9.7](https://github.com/yuki24/did_you_mean/tree/v0.9.7)
140
197
 
141
- _<sup>released on 2015-04-02 04:20:26 UTC</sup>_
198
+ _<sup>released at 2015-04-02 04:20:26 UTC</sup>_
142
199
 
143
200
  #### Bug Fixes
144
201
 
@@ -146,7 +203,7 @@ _<sup>released on 2015-04-02 04:20:26 UTC</sup>_
146
203
 
147
204
  ## [v0.9.6](https://github.com/yuki24/did_you_mean/tree/v0.9.6)
148
205
 
149
- _<sup>released on 2015-01-24 23:19:27 UTC</sup>_
206
+ _<sup>released at 2015-01-24 23:19:27 UTC</sup>_
150
207
 
151
208
  #### Bug Fixes
152
209
 
@@ -154,7 +211,7 @@ _<sup>released on 2015-01-24 23:19:27 UTC</sup>_
154
211
 
155
212
  ## [v0.9.5](https://github.com/yuki24/did_you_mean/tree/v0.9.5)
156
213
 
157
- _<sup>released on 2015-01-07 12:41:23 UTC</sup>_
214
+ _<sup>released at 2015-01-07 12:41:23 UTC</sup>_
158
215
 
159
216
  #### Bug Fixes
160
217
 
@@ -162,7 +219,7 @@ _<sup>released on 2015-01-07 12:41:23 UTC</sup>_
162
219
 
163
220
  ## [v0.9.4](https://github.com/yuki24/did_you_mean/tree/v0.9.4)
164
221
 
165
- _<sup>released on 2014-11-19 20:00:00 UTC</sup>_
222
+ _<sup>released at 2014-11-19 20:00:00 UTC</sup>_
166
223
 
167
224
  #### Bug Fixes
168
225
 
@@ -170,7 +227,7 @@ _<sup>released on 2014-11-19 20:00:00 UTC</sup>_
170
227
 
171
228
  ## [v0.9.3](https://github.com/yuki24/did_you_mean/tree/v0.9.3)
172
229
 
173
- _<sup>released on 2014-11-18 03:50:11 UTC</sup>_
230
+ _<sup>released at 2014-11-18 03:50:11 UTC</sup>_
174
231
 
175
232
  **This version has been yanked from rubygems.org as it doesn't work with jRuby at all. Please upgrade to 0.9.4 or higher as soon as possible.**
176
233
 
@@ -180,7 +237,7 @@ _<sup>released on 2014-11-18 03:50:11 UTC</sup>_
180
237
 
181
238
  ## [v0.9.2](https://github.com/yuki24/did_you_mean/tree/v0.9.2)
182
239
 
183
- _<sup>released on 2014-11-17 15:32:33 UTC</sup>_
240
+ _<sup>released at 2014-11-17 15:32:33 UTC</sup>_
184
241
 
185
242
  #### Bug Fixes
186
243
 
@@ -188,7 +245,7 @@ _<sup>released on 2014-11-17 15:32:33 UTC</sup>_
188
245
 
189
246
  ## [v0.9.1](https://github.com/yuki24/did_you_mean/tree/v0.9.1)
190
247
 
191
- _<sup>released on 2014-11-16 18:54:24 UTC</sup>_
248
+ _<sup>released at 2014-11-16 18:54:24 UTC</sup>_
192
249
 
193
250
  **This version has been yanked from rubygems.org as it doesn't compile on Ruby 2.1.2 and 2.1.5. Please upgrade to 0.9.4 or higher as soon as possible.**
194
251
 
@@ -199,7 +256,7 @@ _<sup>released on 2014-11-16 18:54:24 UTC</sup>_
199
256
 
200
257
  ## [v0.9.0](https://github.com/yuki24/did_you_mean/tree/v0.9.0)
201
258
 
202
- _<sup>released on 2014-11-09 01:26:31 UTC</sup>_
259
+ _<sup>released at 2014-11-09 01:26:31 UTC</sup>_
203
260
 
204
261
  #### Features
205
262
 
@@ -221,7 +278,7 @@ first_name, last_name = full_name.split(" ")
221
278
 
222
279
  ## [v0.8.0](https://github.com/yuki24/did_you_mean/tree/v0.8.0)
223
280
 
224
- _<sup>released on 2014-10-27 02:03:13 UTC</sup>_
281
+ _<sup>released at 2014-10-27 02:03:13 UTC</sup>_
225
282
 
226
283
  **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.**
227
284
 
@@ -237,7 +294,7 @@ _<sup>released on 2014-10-27 02:03:13 UTC</sup>_
237
294
 
238
295
  ## [v0.7.0](https://github.com/yuki24/did_you_mean/tree/v0.7.0)
239
296
 
240
- _<sup>released on 2014-09-26 03:37:18 UTC</sup>_
297
+ _<sup>released at 2014-09-26 03:37:18 UTC</sup>_
241
298
 
242
299
  **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.**
243
300
 
@@ -255,7 +312,7 @@ _<sup>released on 2014-09-26 03:37:18 UTC</sup>_
255
312
 
256
313
  ## [v0.6.0](https://github.com/yuki24/did_you_mean/tree/v0.6.0)
257
314
 
258
- _<sup>released on 2014-05-18 00:23:24 UTC</sup>_
315
+ _<sup>released at 2014-05-18 00:23:24 UTC</sup>_
259
316
 
260
317
  **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.**
261
318
 
@@ -277,7 +334,7 @@ _<sup>released on 2014-05-18 00:23:24 UTC</sup>_
277
334
 
278
335
  ## [v0.5.0](https://github.com/yuki24/did_you_mean/tree/v0.5.0)
279
336
 
280
- _<sup>released on 2014-05-10 17:59:54 UTC</sup>_
337
+ _<sup>released at 2014-05-10 17:59:54 UTC</sup>_
281
338
 
282
339
  #### Features
283
340
 
@@ -285,7 +342,7 @@ _<sup>released on 2014-05-10 17:59:54 UTC</sup>_
285
342
 
286
343
  ## [v0.4.0](https://github.com/yuki24/did_you_mean/tree/v0.4.0)
287
344
 
288
- _<sup>released on 2014-04-20 02:10:31 UTC</sup>_
345
+ _<sup>released at 2014-04-20 02:10:31 UTC</sup>_
289
346
 
290
347
  #### Features
291
348
 
@@ -305,7 +362,7 @@ User.new(flrst_name: "wrong flrst name")
305
362
 
306
363
  ## [v0.3.1](https://github.com/yuki24/did_you_mean/tree/v0.3.1)
307
364
 
308
- _<sup>released on 2014-03-20 23:16:20 UTC</sup>_
365
+ _<sup>released at 2014-03-20 23:16:20 UTC</sup>_
309
366
 
310
367
  #### Features
311
368
 
@@ -314,7 +371,7 @@ _<sup>released on 2014-03-20 23:16:20 UTC</sup>_
314
371
 
315
372
  ## [v0.3.0](https://github.com/yuki24/did_you_mean/tree/v0.3.0)
316
373
 
317
- _<sup>released on 2014-03-20 23:13:13 UTC</sup>_
374
+ _<sup>released at 2014-03-20 23:13:13 UTC</sup>_
318
375
 
319
376
  #### Features
320
377
 
data/README.md CHANGED
@@ -52,13 +52,22 @@ full_name.starts_with?("Y")
52
52
  # Did you mean? start_with?
53
53
  ```
54
54
 
55
+ ### KeyError
56
+
57
+ ```ruby
58
+ hash = {foo: 1, bar: 2, baz: 3}
59
+ hash.fetch(:fooo)
60
+ # => KeyError: key not found: :fooo
61
+ # Did you mean? :foo
62
+ ```
63
+
55
64
  ## Experimental Features
56
65
 
57
66
  Aside from the basic features above, the `did_you_mean` gem comes with experimental features. They can be enabled by calling `require 'did_you_mean/experimental'`.
58
67
 
59
- **Keep in mind that these experimental features should never be enabled in production as they would impact Ruby's performance and use some unstable Ruby APIs.**
68
+ Note that **these experimental features should never be enabled in production as they would impact Ruby's performance and use some unstable Ruby APIs.**
60
69
 
61
- ### Correcting an Instance Variable When It's Incorrectly Typed
70
+ ### Correcting an Instance Variable When It's Incorrectly Spelled
62
71
 
63
72
  ```ruby
64
73
  require 'did_you_mean/experimental'
@@ -69,16 +78,7 @@ require 'did_you_mean/experimental'
69
78
  # Did you mean? @full_name
70
79
  ```
71
80
 
72
- ### Correcting a Hash Key Name
73
-
74
- ```ruby
75
- hash = {foo: 1, bar: 2, baz: 3}
76
- hash.fetch(:fooo)
77
- # KeyError: key not found: :fooo
78
- # Did you mean? :foo
79
- ```
80
-
81
- ### Displaying a Warning When `initialize` is Incorrectly Typed
81
+ ### Displaying a Warning When `initialize` is Incorrectly Spelled
82
82
 
83
83
  ```ruby
84
84
  require 'did_you_mean/experimental'
@@ -100,7 +100,7 @@ OBject
100
100
  # => NameError: uninitialized constant OBject
101
101
  # Did you mean? Object
102
102
 
103
- require 'did_you_mean/verbose_formatter'
103
+ require 'did_you_mean/verbose'
104
104
  OBject
105
105
  # => NameError: uninitialized constant OBject
106
106
  #
data/Rakefile CHANGED
@@ -4,20 +4,9 @@ require 'rake/testtask'
4
4
  Rake::TestTask.new do |task|
5
5
  task.libs << "test"
6
6
 
7
- task.test_files = Dir['test/**/*_test.rb'].reject do |path|
8
- /(verbose_formatter|experimental)/ =~ path
9
- end
10
-
11
- task.verbose = true
12
- task.warning = true
13
- end
14
-
15
- Rake::TestTask.new("test:verbose_formatter") do |task|
16
- task.libs << "test"
17
- task.pattern = 'test/verbose_formatter_test.rb'
18
- task.verbose = true
19
- task.warning = true
20
- task.ruby_opts << "-rdid_you_mean/verbose_formatter"
7
+ task.test_files = Dir['test/**/*_test.rb'].reject {|path| /(experimental)/ =~ path }
8
+ task.verbose = true
9
+ task.warning = true
21
10
  end
22
11
 
23
12
  Rake::TestTask.new("test:experimental") do |task|
@@ -28,7 +17,7 @@ Rake::TestTask.new("test:experimental") do |task|
28
17
  task.ruby_opts << "-rdid_you_mean/experimental"
29
18
  end
30
19
 
31
- task default: %i(test test:verbose_formatter test:experimental)
20
+ task default: %i(test test:experimental)
32
21
 
33
22
  namespace :test do
34
23
  namespace :accuracy do
@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^(test)/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
- spec.required_ruby_version = '>= 2.4.0'
20
+ spec.required_ruby_version = '>= 2.5.0dev'
21
21
 
22
22
  spec.add_development_dependency "bundler"
23
23
  spec.add_development_dependency "rake"
@@ -1,5 +1,7 @@
1
1
  # This data is based on Birkbeck Spelling Error Corpus: http://ota.ox.ac.uk/headers/0643.xml
2
2
  # More specifically, this is a yaml version of the data in FAWTHROP1DAT.643 and FAWTHROP2DAT.643.
3
+ # released under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
4
+ # https://creativecommons.org/licenses/by-nc-sa/3.0/
3
5
  ---
4
6
  abattoir: abbatoir
5
7
  abhorrence: abhorence
@@ -4,16 +4,50 @@ require "did_you_mean/core_ext/name_error"
4
4
  require "did_you_mean/spell_checker"
5
5
  require 'did_you_mean/spell_checkers/name_error_checkers'
6
6
  require 'did_you_mean/spell_checkers/method_name_checker'
7
+ require 'did_you_mean/spell_checkers/key_error_checker'
7
8
  require 'did_you_mean/spell_checkers/null_checker'
8
9
 
9
- require "did_you_mean/formatter"
10
+ require "did_you_mean/formatters/plain_formatter"
10
11
 
11
12
  module DidYouMean
12
- IGNORED_CALLERS = []
13
+ class DeprecatedIgnoredCallers < Array
14
+ %i(
15
+ +
16
+ <<
17
+ []=
18
+ insert
19
+ unshift
20
+ push
21
+ ).each do |method_name|
22
+ eval <<-RUBY, nil, __FILE__, __LINE__ + 1
23
+ def #{method_name}(*)
24
+ warn "IGNORED_CALLERS has been deprecated and has no effect."
25
+
26
+ super
27
+ end
28
+ RUBY
29
+ end
30
+ end
31
+
32
+ IGNORED_CALLERS = DeprecatedIgnoredCallers.new
13
33
 
14
34
  SPELL_CHECKERS = Hash.new(NullChecker)
15
35
  SPELL_CHECKERS.merge!({
16
36
  "NameError" => NameErrorCheckers,
17
- "NoMethodError" => MethodNameChecker
37
+ "NoMethodError" => MethodNameChecker,
38
+ "KeyError" => KeyErrorChecker
18
39
  })
40
+
41
+ NameError.prepend DidYouMean::Correctable
42
+ KeyError.prepend DidYouMean::Correctable
43
+
44
+ def self.formatter
45
+ @@formatter
46
+ end
47
+
48
+ def self.formatter=(formatter)
49
+ @@formatter = formatter
50
+ end
51
+
52
+ self.formatter = PlainFormatter.new
19
53
  end
@@ -1,17 +1,14 @@
1
1
  module DidYouMean
2
2
  module Correctable
3
- prepend_features NameError
4
-
5
3
  def original_message
6
4
  method(:to_s).super_method.call
7
5
  end
8
6
 
9
7
  def to_s
10
8
  msg = super.dup
11
- bt = caller(1, 6)
12
9
 
13
- if IGNORED_CALLERS.all? {|ignored| bt.grep(ignored).empty? } && (!cause.respond_to?(:corrections) || cause.corrections.empty?)
14
- msg << Formatter.new(corrections).to_s
10
+ if !cause.respond_to?(:corrections) || cause.corrections.empty?
11
+ msg << DidYouMean.formatter.message_for(corrections)
15
12
  end
16
13
 
17
14
  msg
@@ -20,11 +17,11 @@ module DidYouMean
20
17
  end
21
18
 
22
19
  def corrections
23
- @corrections ||= spell_checker.corrections
20
+ spell_checker.corrections
24
21
  end
25
22
 
26
23
  def spell_checker
27
- SPELL_CHECKERS[self.class.to_s].new(self)
24
+ @spell_checker ||= SPELL_CHECKERS[self.class.to_s].new(self)
28
25
  end
29
26
  end
30
27
  end
@@ -1,17 +1,2 @@
1
- require 'did_you_mean'
2
-
3
- module DidYouMean
4
- TRACE = TracePoint.trace(:raise) do |tp|
5
- e = tp.raised_exception
6
-
7
- if SPELL_CHECKERS.include?(e.class.to_s) && !e.instance_variable_defined?(:@frame_binding)
8
- e.instance_variable_set(:@frame_binding, tp.binding)
9
- end
10
- end
11
-
12
- NameError.send(:attr, :frame_binding)
13
- end
14
-
15
1
  require 'did_you_mean/experimental/initializer_name_correction'
16
2
  require 'did_you_mean/experimental/ivar_name_correction'
17
- require 'did_you_mean/experimental/key_error_name_correction'
@@ -1,5 +1,7 @@
1
1
  # frozen-string-literal: true
2
2
 
3
+ require 'did_you_mean/levenshtein'
4
+
3
5
  module DidYouMean
4
6
  module Experimental
5
7
  module InitializerNameCorrection
@@ -1,19 +1,45 @@
1
+ # frozen-string-literal: true
2
+
3
+ require 'did_you_mean'
4
+
1
5
  module DidYouMean
2
- module Experimental
3
- module IvarNameCorrection
6
+ module Experimental #:nodoc:
7
+ class IvarNameCheckerBuilder #:nodoc:
8
+ attr_reader :original_checker
9
+
10
+ def initialize(original_checker) #:nodoc:
11
+ @original_checker = original_checker
12
+ end
13
+
14
+ def new(no_method_error) #:nodoc:
15
+ IvarNameChecker.new(no_method_error, original_checker: @original_checker)
16
+ end
17
+ end
18
+
19
+ class IvarNameChecker #:nodoc:
4
20
  REPLS = {
5
21
  "(irb)" => -> { Readline::HISTORY.to_a.last }
6
22
  }
7
23
 
8
- def initialize(no_method_error)
9
- super
24
+ TRACE = TracePoint.trace(:raise) do |tp|
25
+ e = tp.raised_exception
26
+
27
+ if SPELL_CHECKERS.include?(e.class.to_s) && !e.instance_variable_defined?(:@frame_binding)
28
+ e.instance_variable_set(:@frame_binding, tp.binding)
29
+ end
30
+ end
31
+
32
+ attr_reader :original_checker
33
+
34
+ def initialize(no_method_error, original_checker: )
35
+ @original_checker = original_checker.new(no_method_error)
10
36
 
11
37
  @location = no_method_error.backtrace_locations.first
12
38
  @ivar_names = no_method_error.frame_binding.receiver.instance_variables
13
39
  end
14
40
 
15
41
  def corrections
16
- super + ivar_name_corrections
42
+ original_checker.corrections + ivar_name_corrections
17
43
  end
18
44
 
19
45
  def ivar_name_corrections
@@ -23,12 +49,12 @@ module DidYouMean
23
49
  private
24
50
 
25
51
  def receiver_name
26
- return unless receiver.nil?
52
+ return unless @original_checker.receiver.nil?
27
53
 
28
54
  abs_path = @location.absolute_path
29
55
  lineno = @location.lineno
30
56
 
31
- /@(\w+)*\.#{method_name}/ =~ line(abs_path, lineno).to_s && $1
57
+ /@(\w+)*\.#{@original_checker.method_name}/ =~ line(abs_path, lineno).to_s && $1
32
58
  end
33
59
 
34
60
  def line(abs_path, lineno)
@@ -41,7 +67,8 @@ module DidYouMean
41
67
  end
42
68
  end
43
69
  end
44
-
45
- SPELL_CHECKERS['NoMethodError'].prepend(IvarNameCorrection)
46
70
  end
71
+
72
+ NameError.send(:attr, :frame_binding)
73
+ SPELL_CHECKERS['NoMethodError'] = Experimental::IvarNameCheckerBuilder.new(SPELL_CHECKERS['NoMethodError'])
47
74
  end
@@ -0,0 +1,9 @@
1
+ # frozen-string-literal: true
2
+
3
+ module DidYouMean
4
+ class PlainFormatter
5
+ def message_for(corrections)
6
+ corrections.empty? ? "" : "\nDid you mean? #{corrections.join("\n ")}"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ # frozen-string-literal: true
2
+
3
+ module DidYouMean
4
+ class VerboseFormatter
5
+ def message_for(corrections)
6
+ return "" if corrections.empty?
7
+
8
+ output = "\n\n Did you mean? ".dup
9
+ output << corrections.join("\n ")
10
+ output << "\n "
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ require "did_you_mean/spell_checker"
2
+
3
+ module DidYouMean
4
+ class KeyErrorChecker
5
+ def initialize(key_error)
6
+ @key = key_error.key
7
+ @keys = key_error.receiver.keys
8
+ end
9
+
10
+ def corrections
11
+ @corrections ||= SpellChecker.new(dictionary: @keys).correct(@key).map(&:inspect)
12
+ end
13
+ end
14
+ end
@@ -1,3 +1,5 @@
1
+ require "did_you_mean/spell_checker"
2
+
1
3
  module DidYouMean
2
4
  class MethodNameChecker
3
5
  attr_reader :method_name, :receiver
@@ -2,12 +2,8 @@ require 'did_you_mean/spell_checkers/name_error_checkers/class_name_checker'
2
2
  require 'did_you_mean/spell_checkers/name_error_checkers/variable_name_checker'
3
3
 
4
4
  module DidYouMean
5
- module NameErrorCheckers
6
- def self.included(*)
7
- raise "Do not include this module since it overrides Class.new method."
8
- end
9
-
10
- def self.new(exception)
5
+ class << (NameErrorCheckers = Object.new)
6
+ def new(exception)
11
7
  case exception.original_message
12
8
  when /uninitialized constant/
13
9
  ClassNameChecker
@@ -1,19 +1,17 @@
1
1
  # frozen-string-literal: true
2
2
  require 'delegate'
3
+ require "did_you_mean/spell_checker"
3
4
 
4
5
  module DidYouMean
5
6
  class ClassNameChecker
6
7
  attr_reader :class_name
7
8
 
8
9
  def initialize(exception)
9
- @class_name, @receiver, @original_message = exception.name, exception.receiver, exception.original_message
10
+ @class_name, @receiver = exception.name, exception.receiver
10
11
  end
11
12
 
12
13
  def corrections
13
- @corrections ||= SpellChecker.new(dictionary: class_names)
14
- .correct(class_name)
15
- .map(&:full_name)
16
- .reject {|qualified_name| @original_message.include?(qualified_name) }
14
+ @corrections ||= SpellChecker.new(dictionary: class_names).correct(class_name).map(&:full_name)
17
15
  end
18
16
 
19
17
  def class_names
@@ -1,11 +1,14 @@
1
1
  # frozen-string-literal: true
2
2
 
3
+ require "did_you_mean/spell_checker"
4
+
3
5
  module DidYouMean
4
6
  class VariableNameChecker
5
7
  attr_reader :name, :method_names, :lvar_names, :ivar_names, :cvar_names
6
8
 
7
9
  NAMES_TO_EXCLUDE = { 'foo' => [:fork] }
8
10
  NAMES_TO_EXCLUDE.default = []
11
+ RB_PREDEFINED_OBJECTS = [:false, :true, :nil]
9
12
 
10
13
  def initialize(exception)
11
14
  @name = exception.name.to_s.tr("@", "")
@@ -20,7 +23,7 @@ module DidYouMean
20
23
 
21
24
  def corrections
22
25
  @corrections ||= SpellChecker
23
- .new(dictionary: (lvar_names + method_names + ivar_names + cvar_names))
26
+ .new(dictionary: (RB_PREDEFINED_OBJECTS + lvar_names + method_names + ivar_names + cvar_names))
24
27
  .correct(name) - NAMES_TO_EXCLUDE[@name]
25
28
  end
26
29
  end
@@ -0,0 +1,4 @@
1
+ require 'did_you_mean'
2
+ require 'did_you_mean/formatters/verbose_formatter'
3
+
4
+ DidYouMean.formatter = DidYouMean::VerboseFormatter.new
@@ -1,16 +1,7 @@
1
- # frozen-string-literal: true
2
- require 'did_you_mean/formatter'
1
+ require 'did_you_mean'
2
+ require 'did_you_mean/formatters/verbose_formatter'
3
3
 
4
- module DidYouMean
5
- module VerboseFormatter
6
- prepend_features DidYouMean::Formatter
4
+ DidYouMean.formatter = DidYouMean::VerboseFormatter.new
7
5
 
8
- def to_s
9
- return "" if @corrections.empty?
10
-
11
- output = "\n\n Did you mean? ".dup
12
- output << @corrections.join("\n ")
13
- output << "\n "
14
- end
15
- end
16
- end
6
+ warn '`require "did_you_mean/verbose_formatter"\' has been deprecated and will be removed' \
7
+ " in the next major Ruby version. Please require 'did_you_mean/verbose' instead."
@@ -1,3 +1,3 @@
1
1
  module DidYouMean
2
- VERSION = "1.1.3"
2
+ VERSION = "1.2.0"
3
3
  end
@@ -20,7 +20,7 @@ class NameErrorExtensionTest < Minitest::Test
20
20
 
21
21
  def test_message
22
22
  message = <<~MESSAGE.chomp
23
- undefined local variable or method `doesnt_exist' for #{to_s}
23
+ undefined local variable or method `doesnt_exist' for #{method(:to_s).super_method.call}
24
24
  Did you mean? does_exist
25
25
  MESSAGE
26
26
 
@@ -36,50 +36,12 @@ class NameErrorExtensionTest < Minitest::Test
36
36
  error.to_s
37
37
  assert_equal 1, error.to_s.scan("Did you mean?").count
38
38
  end
39
-
40
- def test_correctable_error_objects_are_dumpable
41
- error = begin
42
- File.open('./tmp/.keep').sizee
43
- rescue NoMethodError => e
44
- e
45
- end
46
-
47
- error.to_s
48
-
49
- assert_equal "undefined method `sizee' for #<File:./tmp/.keep>", Marshal.load(Marshal.dump(error)).original_message
50
- end
51
39
  end
52
40
 
53
- class IgnoreCallersTest < Minitest::Test
54
- SPELL_CHECKERS = DidYouMean::SPELL_CHECKERS
55
-
56
- class Boomer
57
- def initialize(*)
58
- raise Exception, "spell checker was created when it shouldn't!"
59
- end
60
- end
61
-
62
- def setup
63
- @org, SPELL_CHECKERS['NameError'] = SPELL_CHECKERS['NameError'], Boomer
64
- DidYouMean::IGNORED_CALLERS << /( |`)do_not_correct_typo'/
65
-
66
- @error = assert_raises(NameError){ doesnt_exist }
67
- end
68
-
69
- def teardown
70
- SPELL_CHECKERS['NameError'] = @org
71
- DidYouMean::IGNORED_CALLERS.clear
72
- end
73
-
41
+ class DeprecatedIgnoreCallersTest < Minitest::Test
74
42
  def test_ignore
75
- assert_nothing_raised { do_not_correct_typo }
76
- end
77
-
78
- private
79
-
80
- def do_not_correct_typo; @error.message end
81
-
82
- def assert_nothing_raised
83
- yield
43
+ assert_output nil, "IGNORED_CALLERS has been deprecated and has no effect.\n" do
44
+ DidYouMean::IGNORED_CALLERS << /( |`)do_not_correct_typo'/
45
+ end
84
46
  end
85
47
  end
@@ -1,5 +1,12 @@
1
+ # -*- coding: utf-8 -*-
1
2
  require 'test_helper'
2
3
 
4
+ # These tests were originally written by Jian Weihang (簡煒航) as part of his work
5
+ # on the jaro_winkler gem. The original code could be found here:
6
+ # https://github.com/tonytonyjan/jaro_winkler/blob/9bd12421/spec/jaro_winkler_spec.rb
7
+ #
8
+ # Copyright (c) 2014 Jian Weihang
9
+
3
10
  class JaroWinklerTest < Minitest::Test
4
11
  def test_jaro_winkler_distance
5
12
  assert_distance 0.9667, 'henka', 'henkan'
@@ -27,7 +27,7 @@ class Book
27
27
  end
28
28
  end
29
29
 
30
- class ClassNameTest < Minitest::Test
30
+ class ClassNameCheckTest < Minitest::Test
31
31
  def test_corrections
32
32
  error = assert_raises(NameError) { ::Bo0k }
33
33
  assert_correction "Book", error.corrections
@@ -62,16 +62,4 @@ class ClassNameTest < Minitest::Test
62
62
  error = assert_raises(NameError) { ::Book::Page.new.tableof_contents }
63
63
  assert_correction "Book::TableOfContents", error.corrections
64
64
  end
65
-
66
- def test_does_not_suggest_user_input
67
- error = assert_raises(NameError) { ::Book::Cover }
68
-
69
- # This is a weird require, but in a multi-threaded condition, a constant may
70
- # be loaded between when a NameError occurred and when the spell checker
71
- # attemps to find a possible suggestion. The manual require here simulates
72
- # a race condition a single test.
73
- require_relative '../fixtures/book'
74
-
75
- assert_empty error.corrections
76
- end
77
65
  end
@@ -0,0 +1,44 @@
1
+ require "test_helper"
2
+
3
+ class KeyNameCheckTest < Minitest::Test
4
+ def test_corrects_hash_key_name_with_fetch
5
+ hash = { "foo" => 1, bar: 2 }
6
+
7
+ error = assert_raises(KeyError) { hash.fetch(:bax) }
8
+ assert_correction ":bar", error.corrections
9
+ assert_match "Did you mean? :bar", error.to_s
10
+
11
+ error = assert_raises(KeyError) { hash.fetch("fooo") }
12
+ assert_correction %("foo"), error.corrections
13
+ assert_match %(Did you mean? "foo"), error.to_s
14
+ end
15
+
16
+ def test_corrects_hash_key_name_with_fetch_values
17
+ hash = { "foo" => 1, bar: 2 }
18
+
19
+ error = assert_raises(KeyError) { hash.fetch_values("foo", :bar, :bax) }
20
+ assert_correction ":bar", error.corrections
21
+ assert_match "Did you mean? :bar", error.to_s
22
+
23
+ error = assert_raises(KeyError) { hash.fetch_values("foo", :bar, "fooo") }
24
+ assert_correction %("foo"), error.corrections
25
+ assert_match %(Did you mean? "foo"), error.to_s
26
+ end
27
+
28
+ def test_corrects_sprintf_key_name
29
+ error = assert_raises(KeyError) { sprintf("%<foo>d", {fooo: 1}) }
30
+ assert_correction ":fooo", error.corrections
31
+ assert_match "Did you mean? :fooo", error.to_s
32
+ end
33
+
34
+ def test_corrects_env_key_name
35
+ ENV["FOO"] = "1"
36
+ ENV["BAR"] = "2"
37
+ error = assert_raises(KeyError) { ENV.fetch("BAX") }
38
+ assert_correction %("BAR"), error.corrections
39
+ assert_match %(Did you mean? "BAR"), error.to_s
40
+ ensure
41
+ ENV.delete("FOO")
42
+ ENV.delete("BAR")
43
+ end
44
+ end
@@ -1,6 +1,6 @@
1
1
  require 'test_helper'
2
2
 
3
- class MethodNameTest < Minitest::Test
3
+ class MethodNameCheckTest < Minitest::Test
4
4
  class User
5
5
  def friends; end
6
6
  def first_name; end
@@ -1,6 +1,6 @@
1
1
  require 'test_helper'
2
2
 
3
- class UncorrectableNameTest < Minitest::Test
3
+ class UncorrectableNameCheckTest < Minitest::Test
4
4
  class FirstNameError < NameError; end
5
5
 
6
6
  def setup
@@ -1,6 +1,6 @@
1
1
  require 'test_helper'
2
2
 
3
- class VariableNameTest < Minitest::Test
3
+ class VariableNameCheckTest < Minitest::Test
4
4
  class User
5
5
  def initialize
6
6
  @email_address = 'email_address@address.net'
@@ -57,6 +57,31 @@ class VariableNameTest < Minitest::Test
57
57
  assert_match "Did you mean? person", error.to_s
58
58
  end
59
59
 
60
+ def test_corrections_include_ruby_predefined_objects
61
+ some_var = nil
62
+
63
+ false_error = assert_raises(NameError) do
64
+ some_var = fals
65
+ end
66
+
67
+ true_error = assert_raises(NameError) do
68
+ some_var = treu
69
+ end
70
+
71
+ nil_error = assert_raises(NameError) do
72
+ some_var = nol
73
+ end
74
+
75
+ assert_correction :false, false_error.corrections
76
+ assert_match "Did you mean? false", false_error.to_s
77
+
78
+ assert_correction :true, true_error.corrections
79
+ assert_match "Did you mean? true", true_error.to_s
80
+
81
+ assert_correction :nil, nil_error.corrections
82
+ assert_match "Did you mean? nil", nil_error.to_s
83
+ end
84
+
60
85
  def test_corrections_include_instance_variable_name
61
86
  error = assert_raises(NameError){ @user.to_s }
62
87
 
@@ -2,13 +2,19 @@ require 'test_helper'
2
2
 
3
3
  class VerboseFormatterTest < Minitest::Test
4
4
  def setup
5
+ require 'did_you_mean/verbose'
6
+
5
7
  does_exist = does_exist = nil
6
8
  @error = assert_raises(NameError){ doesnt_exist }
7
9
  end
8
10
 
11
+ def teardown
12
+ DidYouMean.formatter = DidYouMean::PlainFormatter.new
13
+ end
14
+
9
15
  def test_message
10
16
  assert_equal <<~MESSAGE.chomp, @error.message
11
- undefined local variable or method `doesnt_exist' for #{to_s}
17
+ undefined local variable or method `doesnt_exist' for #{method(:to_s).super_method.call}
12
18
 
13
19
  Did you mean? does_exist
14
20
 
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.1.3
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuki Nishijima
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-09 00:00:00.000000000 Z
11
+ date: 2017-12-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -83,32 +83,32 @@ files:
83
83
  - lib/did_you_mean/experimental.rb
84
84
  - lib/did_you_mean/experimental/initializer_name_correction.rb
85
85
  - lib/did_you_mean/experimental/ivar_name_correction.rb
86
- - lib/did_you_mean/experimental/key_error_name_correction.rb
87
- - lib/did_you_mean/formatter.rb
86
+ - lib/did_you_mean/formatters/plain_formatter.rb
87
+ - lib/did_you_mean/formatters/verbose_formatter.rb
88
88
  - lib/did_you_mean/jaro_winkler.rb
89
89
  - lib/did_you_mean/levenshtein.rb
90
90
  - lib/did_you_mean/spell_checker.rb
91
+ - lib/did_you_mean/spell_checkers/key_error_checker.rb
91
92
  - lib/did_you_mean/spell_checkers/method_name_checker.rb
92
93
  - lib/did_you_mean/spell_checkers/name_error_checkers.rb
93
94
  - lib/did_you_mean/spell_checkers/name_error_checkers/class_name_checker.rb
94
95
  - lib/did_you_mean/spell_checkers/name_error_checkers/variable_name_checker.rb
95
96
  - lib/did_you_mean/spell_checkers/null_checker.rb
97
+ - lib/did_you_mean/verbose.rb
96
98
  - lib/did_you_mean/verbose_formatter.rb
97
99
  - lib/did_you_mean/version.rb
98
100
  - test/core_ext/name_error_extension_test.rb
99
101
  - test/edit_distance/jaro_winkler_test.rb
100
102
  - test/experimental/initializer_name_correction_test.rb
101
- - test/experimental/key_error_test.rb
102
103
  - test/experimental/method_name_checker_test.rb
103
- - test/fixtures/book.rb
104
104
  - test/spell_checker_test.rb
105
- - test/spell_checking/class_name_test.rb
106
- - test/spell_checking/method_name_test.rb
107
- - test/spell_checking/uncorrectable_name_test.rb
108
- - test/spell_checking/variable_name_test.rb
105
+ - test/spell_checking/class_name_check_test.rb
106
+ - test/spell_checking/key_name_check_test.rb
107
+ - test/spell_checking/method_name_check_test.rb
108
+ - test/spell_checking/uncorrectable_name_check_test.rb
109
+ - test/spell_checking/variable_name_check_test.rb
109
110
  - test/test_helper.rb
110
111
  - test/verbose_formatter_test.rb
111
- - tmp/.keep
112
112
  homepage: https://github.com/yuki24/did_you_mean
113
113
  licenses:
114
114
  - MIT
@@ -121,7 +121,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
- version: 2.4.0
124
+ version: 2.5.0dev
125
125
  required_rubygems_version: !ruby/object:Gem::Requirement
126
126
  requirements:
127
127
  - - ">="
@@ -129,7 +129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
129
129
  version: '0'
130
130
  requirements: []
131
131
  rubyforge_project:
132
- rubygems_version: 2.6.11
132
+ rubygems_version: 2.6.13
133
133
  signing_key:
134
134
  specification_version: 4
135
135
  summary: '"Did you mean?" experience in Ruby'
@@ -137,13 +137,12 @@ test_files:
137
137
  - test/core_ext/name_error_extension_test.rb
138
138
  - test/edit_distance/jaro_winkler_test.rb
139
139
  - test/experimental/initializer_name_correction_test.rb
140
- - test/experimental/key_error_test.rb
141
140
  - test/experimental/method_name_checker_test.rb
142
- - test/fixtures/book.rb
143
141
  - test/spell_checker_test.rb
144
- - test/spell_checking/class_name_test.rb
145
- - test/spell_checking/method_name_test.rb
146
- - test/spell_checking/uncorrectable_name_test.rb
147
- - test/spell_checking/variable_name_test.rb
142
+ - test/spell_checking/class_name_check_test.rb
143
+ - test/spell_checking/key_name_check_test.rb
144
+ - test/spell_checking/method_name_check_test.rb
145
+ - test/spell_checking/uncorrectable_name_check_test.rb
146
+ - test/spell_checking/variable_name_check_test.rb
148
147
  - test/test_helper.rb
149
148
  - test/verbose_formatter_test.rb
@@ -1,32 +0,0 @@
1
- module DidYouMean
2
- module Experimental
3
- module KeyErrorWithNameAndKeys
4
- FILE_REGEXP = %r"#{Regexp.quote(__FILE__)}"
5
-
6
- def fetch(name, *)
7
- super
8
- rescue KeyError => e
9
- e.instance_variable_set(:@name, name)
10
- e.instance_variable_set(:@keys, keys)
11
- $@.delete_if { |s| FILE_REGEXP =~ s } if $@
12
-
13
- raise e
14
- end
15
- end
16
- Hash.prepend KeyErrorWithNameAndKeys
17
-
18
- class KeyNameChecker
19
- def initialize(key_error)
20
- @name = key_error.instance_variable_get(:@name)
21
- @keys = key_error.instance_variable_get(:@keys)
22
- end
23
-
24
- def corrections
25
- @corrections ||= SpellChecker.new(dictionary: @keys).correct(@name).map(&:inspect)
26
- end
27
- end
28
-
29
- SPELL_CHECKERS["KeyError"] = KeyNameChecker
30
- KeyError.prepend DidYouMean::Correctable
31
- end
32
- end
@@ -1,16 +0,0 @@
1
- # frozen-string-literal: true
2
-
3
- module DidYouMean
4
- class Formatter
5
- def initialize(corrections = [])
6
- @corrections = corrections
7
- end
8
-
9
- def to_s
10
- return "" if @corrections.empty?
11
-
12
- output = "\nDid you mean? ".dup
13
- output << @corrections.join("\n ")
14
- end
15
- end
16
- end
@@ -1,15 +0,0 @@
1
- require "test_helper"
2
-
3
- class ExperimentalKeyErrorNameCorrectionTest < Minitest::Test
4
- def test_corrects_hash_key_name
5
- hash = { "foo" => 1, bar: 2 }
6
-
7
- error = assert_raises(KeyError) { hash.fetch(:bax) }
8
- assert_correction ":bar", error.corrections
9
- assert_match "Did you mean? :bar", error.to_s
10
-
11
- error = assert_raises(KeyError) { hash.fetch("fooo") }
12
- assert_correction %("foo"), error.corrections
13
- assert_match %(Did you mean? "foo"), error.to_s
14
- end
15
- end
@@ -1,4 +0,0 @@
1
- class Book
2
- class Cover
3
- end
4
- end