did_you_mean 1.3.0 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +8 -0
- data/CHANGELOG.md +56 -0
- data/Gemfile +1 -0
- data/README.md +34 -0
- data/Rakefile +27 -3
- data/benchmark/jaro_winkler/memory_usage.rb +4 -4
- data/benchmark/jaro_winkler/speed.rb +14 -6
- data/benchmark/levenshtein/memory_usage.rb +4 -4
- data/benchmark/levenshtein/speed.rb +13 -8
- data/benchmark/speed.yml +13 -0
- data/lib/did_you_mean/core_ext/name_error.rb +2 -4
- data/lib/did_you_mean/spell_checker.rb +1 -7
- data/lib/did_you_mean/spell_checkers/method_name_checker.rb +1 -1
- data/lib/did_you_mean/version.rb +1 -1
- data/test/core_ext/name_error_extension_test.rb +2 -2
- data/test/spell_checking/method_name_check_test.rb +12 -0
- data/test/spell_checking/variable_name_check_test.rb +6 -4
- data/test/verbose_formatter_test.rb +3 -4
- metadata +4 -6
- data/.ruby-version +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '088f268582576b904e0d73ca3efc4d0f5b1f1b0502a215215e0d7a93d8e3fd27'
|
4
|
+
data.tar.gz: fa0582301402135a7ea58e974a9314ec4aeb0f4866d18233bbd8d68e2354d24b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 176153acc0119212a3cff509cc5abefed1ae8ae0a99a92131882242b5a4f0dd7a5dcddf3da7aff492c0d00bfa3ea2c155f549c4430b36775ed7d66de0cf1dd9a
|
7
|
+
data.tar.gz: 24b2ae0af79e1a359e25174412a431d53a122a5cce658e02c1c511ebfeab17708b86e62fb8a9a66b79334d5ea6788ca3972ed2bc30a1b1a2092eb105d5fe6331
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,41 @@
|
|
1
|
+
## v1.4.0 (Next)
|
2
|
+
|
3
|
+
- Remove the empty `tmp/` directory to comply with `rpmlint` ([#122](https://github.com/yuki24/did_you_mean/issues/122))
|
4
|
+
- Fixes a bug where suggestions are not shown on subsequent errors ([#120](https://github.com/yuki24/did_you_mean/issues/120))
|
5
|
+
|
6
|
+
## [v1.3.0](https://github.com/yuki24/did_you_mean/tree/v1.3.0)
|
7
|
+
|
8
|
+
_<sup>released at 2018-12-18 15:37:10 UTC</sup>_
|
9
|
+
|
10
|
+
**Starting version 1.3, the `did_you_mean` gem will be compatible with 2.6 and 2.5, and we will try to keep all subsequent versions compatible with Ruby 2.5 on an best-effort basis.**
|
11
|
+
|
12
|
+
- Version 1.2.0 only has support for Ruby 2.5.0 and later as it uses new features that are only available in 2.5.
|
13
|
+
- Versions earlier than 1.1.\* will still be maintained until Ruby 2.4 is deprecated.
|
14
|
+
- Versions earlier than 1.0.\* is still maintained, but are likely to be deprecated as Ruby 2.3 will (probably) be deprecated in 2019.
|
15
|
+
- Support for versions below 1.0 has already ended.
|
16
|
+
|
17
|
+
#### New features
|
18
|
+
|
19
|
+
- Suggest reserved words if there are close matches ([<tt>2a082a7</tt>](https://github.com/yuki24/did_you_mean/commit/2a082a71991f5afe2e27ce9538103eac4c428025))
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
results = yiedl
|
23
|
+
# NameError => undefined local variable or method `yiedl' for ...
|
24
|
+
# Did you mean? yield
|
25
|
+
```
|
26
|
+
|
27
|
+
#### Bug fixes
|
28
|
+
|
29
|
+
- Fixes a bug where name errors can not be dumped ([#108](https://github.com/yuki24/did_you_mean/issues/108), [@jessebs](https://github.com/jessebs))
|
30
|
+
|
31
|
+
## [v1.2.2](https://github.com/yuki24/did_you_mean/tree/v1.2.2)
|
32
|
+
|
33
|
+
_<sup>released at 2019-03-09 23:17:22 UTC</sup>_
|
34
|
+
|
35
|
+
#### Bug fixes
|
36
|
+
|
37
|
+
- Fixes a bug where name errors can not be dumped ([#108](https://github.com/yuki24/did_you_mean/issues/108), [@jessebs](https://github.com/jessebs))
|
38
|
+
|
1
39
|
## [v1.2.1](https://github.com/yuki24/did_you_mean/tree/v1.2.1)
|
2
40
|
|
3
41
|
_<sup>released at 2018-04-03 04:44:47 UTC</sup>_
|
@@ -23,6 +61,15 @@ _<sup>released at 2018-01-02 20:49:35 UTC</sup>_
|
|
23
61
|
- Now suggests `true`, `false` or `nil` if a NameError occurs because of a typo in these names ([#94](https://github.com/yuki24/did_you_mean/pull/94), [@styd](https://github.com/styd))
|
24
62
|
- New Formatter API: This provides a clean way to customize DidYouMean’s formatter without overriding the default formatter. Please refer to [the built-in verbose formatter](https://github.com/yuki24/did_you_mean/blob/671cdff/lib/did_you_mean/verbose.rb) for how to use it
|
25
63
|
|
64
|
+
## [v1.1.3](https://github.com/yuki24/did_you_mean/tree/v1.1.3)
|
65
|
+
|
66
|
+
_<sup>released at 2019-03-09 23:16:54 UTC</sup>_
|
67
|
+
|
68
|
+
#### Bug fixes
|
69
|
+
|
70
|
+
- Fixes a bug where name errors can not be dumped ([#108](https://github.com/yuki24/did_you_mean/issues/108), [@jessebs](https://github.com/jessebs))
|
71
|
+
- Fixed a bug where DYM suggests the same class name in the error message ([#102](https://github.com/yuki24/did_you_mean/issues/102), [@schneems](https://github.com/schneems))
|
72
|
+
|
26
73
|
## [v1.1.2](https://github.com/yuki24/did_you_mean/tree/v1.1.2)
|
27
74
|
|
28
75
|
_<sup>released at 2017-09-24 07:28:48 UTC</sup>_
|
@@ -69,6 +116,15 @@ The version `1.1.0` only has support for Ruby 2.4.0 and later. Also, all patch r
|
|
69
116
|
|
70
117
|
- 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))
|
71
118
|
|
119
|
+
## [v1.0.4](https://github.com/yuki24/did_you_mean/tree/v1.0.4)
|
120
|
+
|
121
|
+
_<sup>released at 2019-03-09 23:16:38 UTC</sup>_
|
122
|
+
|
123
|
+
#### Bug fixes
|
124
|
+
|
125
|
+
- Fixes a bug where name errors can not be dumped ([#108](https://github.com/yuki24/did_you_mean/issues/108), [@jessebs](https://github.com/jessebs))
|
126
|
+
- Fixed a bug where DYM suggests the same class name in the error message ([#102](https://github.com/yuki24/did_you_mean/issues/102), [@schneems](https://github.com/schneems))
|
127
|
+
|
72
128
|
## [v1.0.3](https://github.com/yuki24/did_you_mean/tree/v1.0.3)
|
73
129
|
|
74
130
|
_<sup>released at 2017-09-24 07:22:07 UTC</sup>_
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -108,6 +108,17 @@ OBject
|
|
108
108
|
#
|
109
109
|
```
|
110
110
|
|
111
|
+
## Using the `DidYouMean::SpellChecker`
|
112
|
+
|
113
|
+
If you need to programmatically find the closest matches to the user input, you could do so by re-using the `DidYouMean::SpellChecker` object.
|
114
|
+
|
115
|
+
```ruby
|
116
|
+
spell_checker = DidYouMean::SpellChecker.new(dictionary: ['email', 'fail', 'eval'])
|
117
|
+
|
118
|
+
spell_checker.correct('meail') # => ['email']
|
119
|
+
spell_checker.correct('afil') # => ['fail']
|
120
|
+
```
|
121
|
+
|
111
122
|
## Disabling `did_you_mean`
|
112
123
|
|
113
124
|
Occasionally, you may want to disable the `did_you_mean` gem for e.g. debugging issues in the error object itself. You
|
@@ -147,6 +158,29 @@ no_method_error.original_message
|
|
147
158
|
# => NoMethodError (undefined method `zeor?' for 1:Integer)
|
148
159
|
```
|
149
160
|
|
161
|
+
## Benchmarking
|
162
|
+
|
163
|
+
Performance is very important as the `did_you_mean` gem attempts to find the closest matches on the fly right after an exception
|
164
|
+
is thrown. You could use the following rake tasks to get insights into how the gem performs:
|
165
|
+
|
166
|
+
```bash
|
167
|
+
bundle exec rake benchmark:ips:jaro
|
168
|
+
bundle exec rake benchmark:ips:levenshtein
|
169
|
+
bundle exec rake benchmark:memory
|
170
|
+
bundle exec rake benchmark:memory:jaro
|
171
|
+
bundle exec rake benchmark:memory:levenshtein
|
172
|
+
```
|
173
|
+
|
174
|
+
**Be sure to always use `bundle exec` otherwise it will activate the pre-installed version of the `did_you_mean`
|
175
|
+
gem rather than using what's in the `lib/`.**
|
176
|
+
|
177
|
+
You could also use the [`benchmark-driver`](https://github.com/benchmark-driver/benchmark-driver) gem to know how each
|
178
|
+
Ruby performs differently.
|
179
|
+
|
180
|
+
```bash
|
181
|
+
bundle exec benchmark-driver benchmark/speed.yml --rbenv '2.6.0 --jit;2.6.0;2.5.3;truffleruby-1.0.0-rc10' --run-duration 30
|
182
|
+
```
|
183
|
+
|
150
184
|
## Contributing
|
151
185
|
|
152
186
|
1. Fork it (http://github.com/yuki24/did_you_mean/fork)
|
data/Rakefile
CHANGED
@@ -27,7 +27,7 @@ namespace :test do
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
desc "Calculate accuracy of the
|
30
|
+
desc "Calculate accuracy of the gem's spell checker"
|
31
31
|
task :accuracy do
|
32
32
|
if !File.exist?("evaluation/dictionary.yml")
|
33
33
|
puts 'Generating dictionary for evaluation:'
|
@@ -40,8 +40,32 @@ namespace :test do
|
|
40
40
|
end
|
41
41
|
|
42
42
|
namespace :benchmark do
|
43
|
-
|
43
|
+
namespace :ips do
|
44
|
+
desc "Measure performance of the gem's Jaro distance implementation"
|
45
|
+
task :jaro do
|
46
|
+
sh "ruby benchmark/jaro_winkler/speed.rb"
|
47
|
+
end
|
48
|
+
|
49
|
+
desc "Benchmark performance of the gem's Levenshtein distance implementation"
|
50
|
+
task :levenshtein do
|
51
|
+
sh "ruby benchmark/levenshtein/speed.rb"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
desc "Benchmark memory usage in the gem's spell checker"
|
44
56
|
task :memory do
|
45
|
-
sh
|
57
|
+
sh "ruby benchmark/memory_usage.rb"
|
58
|
+
end
|
59
|
+
|
60
|
+
namespace :memory do
|
61
|
+
desc "Benchmark memory usage in the gem's Jaro distance implementation"
|
62
|
+
task :jaro do
|
63
|
+
sh "ruby benchmark/jaro_winkler/memory_usage.rb"
|
64
|
+
end
|
65
|
+
|
66
|
+
desc "Benchmark memory usage in the gem's Levenshtein distance implementation"
|
67
|
+
task :levenshtein do
|
68
|
+
sh "ruby benchmark/levenshtein/memory_usage.rb"
|
69
|
+
end
|
46
70
|
end
|
47
71
|
end
|
@@ -1,11 +1,11 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
1
3
|
require 'memory_profiler'
|
2
4
|
require 'did_you_mean/jaro_winkler'
|
3
5
|
|
4
|
-
str1, str2 = "user_signed_in?", "user_logged_in?"
|
5
|
-
|
6
6
|
report = MemoryProfiler.report do
|
7
|
-
|
8
|
-
DidYouMean::Jaro.distance
|
7
|
+
1000.times do
|
8
|
+
DidYouMean::Jaro.distance "user_signed_in?", "user_logged_in?"
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
@@ -1,14 +1,22 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
1
3
|
require 'benchmark/ips'
|
2
|
-
require 'did_you_mean'
|
4
|
+
require 'did_you_mean/jaro_winkler'
|
3
5
|
|
4
6
|
Benchmark.ips do |x|
|
5
|
-
x.report "
|
6
|
-
DidYouMean::Jaro.
|
7
|
+
x.report "original" do
|
8
|
+
DidYouMean::Jaro.distance "user_signed_in?", "user_logged_in?"
|
7
9
|
end
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
|
11
|
+
# This #proposed method is not defined. Write your own method using this
|
12
|
+
# name so we can reliably run the benchmark and measure the difference.
|
13
|
+
#
|
14
|
+
# Alternatively, you could directly update the #distance method and remove
|
15
|
+
# this completely.
|
16
|
+
#
|
17
|
+
# x.report "proposed" do
|
18
|
+
# DidYouMean::Jaro.proposed "user_signed_in?", "user_logged_in?"
|
19
|
+
# end
|
12
20
|
|
13
21
|
x.compare!
|
14
22
|
end
|
@@ -1,11 +1,11 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
1
3
|
require 'memory_profiler'
|
2
4
|
require 'did_you_mean/levenshtein'
|
3
5
|
|
4
|
-
str1, str2 = "user_signed_in?", "user_logged_in?"
|
5
|
-
|
6
6
|
report = MemoryProfiler.report do
|
7
|
-
|
8
|
-
DidYouMean::Levenshtein.distance
|
7
|
+
1000.times do
|
8
|
+
DidYouMean::Levenshtein.distance "user_signed_in?", "user_logged_in?"
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
@@ -1,17 +1,22 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
1
3
|
require 'benchmark/ips'
|
2
|
-
require 'did_you_mean'
|
3
4
|
require 'did_you_mean/levenshtein'
|
4
5
|
|
5
|
-
STR1, STR2 = "user_signed_in?", "user_logged_in?"
|
6
|
-
|
7
6
|
Benchmark.ips do |x|
|
8
|
-
x.report "
|
9
|
-
DidYouMean::Levenshtein.
|
7
|
+
x.report "original" do
|
8
|
+
DidYouMean::Levenshtein.distance "user_signed_in?", "user_logged_in?"
|
10
9
|
end
|
11
10
|
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
# This #proposed method is not defined. Write your own method using this
|
12
|
+
# name so we can reliably run the benchmark and measure the difference.
|
13
|
+
#
|
14
|
+
# Alternatively, you could directly update the #distance method and remove
|
15
|
+
# this completely.
|
16
|
+
#
|
17
|
+
# x.report "proposed" do
|
18
|
+
# DidYouMean::Levenshtein.proposed "user_signed_in?", "user_logged_in?"
|
19
|
+
# end
|
15
20
|
|
16
21
|
x.compare!
|
17
22
|
end
|
data/benchmark/speed.yml
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
prelude: |
|
2
|
+
require 'did_you_mean/spell_checker'
|
3
|
+
|
4
|
+
str1, str2 = "user_signed_in?", "user_logged_in?"
|
5
|
+
METHODS = ''.methods
|
6
|
+
INPUT = 'starts_with?'
|
7
|
+
collection = DidYouMean::SpellChecker.new(dictionary: METHODS)
|
8
|
+
|
9
|
+
benchmark:
|
10
|
+
Jaro: DidYouMean::Jaro.distance(str1, str2)
|
11
|
+
Jaro Winkler: DidYouMean::JaroWinkler.distance(str1, str2)
|
12
|
+
Levenshtein: DidYouMean::Levenshtein.distance(str1, str2)
|
13
|
+
Spell checker: collection.correct(INPUT)
|
@@ -6,11 +6,9 @@ module DidYouMean
|
|
6
6
|
|
7
7
|
def to_s
|
8
8
|
msg = super.dup
|
9
|
+
suggestion = DidYouMean.formatter.message_for(corrections)
|
9
10
|
|
10
|
-
if !
|
11
|
-
msg << DidYouMean.formatter.message_for(corrections)
|
12
|
-
end
|
13
|
-
|
11
|
+
msg << suggestion if !msg.end_with?(suggestion)
|
14
12
|
msg
|
15
13
|
rescue
|
16
14
|
super
|
@@ -38,13 +38,7 @@ module DidYouMean
|
|
38
38
|
private
|
39
39
|
|
40
40
|
def normalize(str_or_symbol) #:nodoc:
|
41
|
-
str =
|
42
|
-
str_or_symbol.dup
|
43
|
-
else
|
44
|
-
str_or_symbol.to_s
|
45
|
-
end
|
46
|
-
|
47
|
-
str.downcase!
|
41
|
+
str = str_or_symbol.to_s.downcase
|
48
42
|
str.tr!("@", "")
|
49
43
|
str
|
50
44
|
end
|
@@ -9,7 +9,7 @@ module DidYouMean
|
|
9
9
|
|
10
10
|
# +MethodNameChecker::RB_RESERVED_WORDS+ is the list of reserved words in
|
11
11
|
# Ruby that take an argument. Unlike
|
12
|
-
# +VariableNameChecker::RB_RESERVED_WORDS+,
|
12
|
+
# +VariableNameChecker::RB_RESERVED_WORDS+, these reserved words require
|
13
13
|
# an argument, and a +NoMethodError+ is raised due to the presence of the
|
14
14
|
# argument.
|
15
15
|
#
|
data/lib/did_you_mean/version.rb
CHANGED
@@ -39,13 +39,13 @@ class NameErrorExtensionTest < Minitest::Test
|
|
39
39
|
|
40
40
|
def test_correctable_error_objects_are_dumpable
|
41
41
|
error = begin
|
42
|
-
File.open('
|
42
|
+
File.open('did_you_mean.gemspec').sizee
|
43
43
|
rescue NoMethodError => e
|
44
44
|
e
|
45
45
|
end
|
46
46
|
|
47
47
|
error.to_s
|
48
48
|
|
49
|
-
assert_equal "undefined method `sizee' for #<File
|
49
|
+
assert_equal "undefined method `sizee' for #<File:did_you_mean.gemspec>", Marshal.load(Marshal.dump(error)).original_message
|
50
50
|
end
|
51
51
|
end
|
@@ -117,6 +117,18 @@ class MethodNameCheckTest < Minitest::Test
|
|
117
117
|
assert_equal 1, error.to_s.scan(/Did you mean/).count
|
118
118
|
end
|
119
119
|
|
120
|
+
def test_suggests_corrections_on_nested_error
|
121
|
+
error = assert_raises NoMethodError do
|
122
|
+
begin
|
123
|
+
@user.firstname
|
124
|
+
rescue NoMethodError
|
125
|
+
@user.firstname
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
assert_equal 1, error.to_s.scan(/Did you mean/).count
|
130
|
+
end
|
131
|
+
|
120
132
|
def test_suggests_yield
|
121
133
|
error = assert_raises(NoMethodError) { yeild(1) }
|
122
134
|
|
@@ -50,11 +50,13 @@ class VariableNameCheckTest < Minitest::Test
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def test_corrections_include_local_variable_name
|
53
|
-
|
54
|
-
|
53
|
+
if RUBY_ENGINE != "jruby"
|
54
|
+
person = person = nil
|
55
|
+
error = (eprson rescue $!) # Do not use @assert_raises here as it changes a scope.
|
55
56
|
|
56
|
-
|
57
|
-
|
57
|
+
assert_correction :person, error.corrections
|
58
|
+
assert_match "Did you mean? person", error.to_s
|
59
|
+
end
|
58
60
|
end
|
59
61
|
|
60
62
|
def test_corrections_include_ruby_predefined_objects
|
@@ -4,8 +4,7 @@ class VerboseFormatterTest < Minitest::Test
|
|
4
4
|
def setup
|
5
5
|
require 'did_you_mean/verbose'
|
6
6
|
|
7
|
-
|
8
|
-
@error = assert_raises(NameError){ doesnt_exist }
|
7
|
+
@error = assert_raises(NameError){ 1.zeor? }
|
9
8
|
end
|
10
9
|
|
11
10
|
def teardown
|
@@ -14,9 +13,9 @@ class VerboseFormatterTest < Minitest::Test
|
|
14
13
|
|
15
14
|
def test_message
|
16
15
|
assert_equal <<~MESSAGE.chomp, @error.message
|
17
|
-
undefined
|
16
|
+
undefined method `zeor?' for 1:Integer
|
18
17
|
|
19
|
-
Did you mean?
|
18
|
+
Did you mean? zero?
|
20
19
|
|
21
20
|
MESSAGE
|
22
21
|
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.3.
|
4
|
+
version: 1.3.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:
|
11
|
+
date: 2019-09-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -60,7 +60,6 @@ extensions: []
|
|
60
60
|
extra_rdoc_files: []
|
61
61
|
files:
|
62
62
|
- ".gitignore"
|
63
|
-
- ".ruby-version"
|
64
63
|
- ".travis.yml"
|
65
64
|
- CHANGELOG.md
|
66
65
|
- Gemfile
|
@@ -72,6 +71,7 @@ files:
|
|
72
71
|
- benchmark/levenshtein/memory_usage.rb
|
73
72
|
- benchmark/levenshtein/speed.rb
|
74
73
|
- benchmark/memory_usage.rb
|
74
|
+
- benchmark/speed.yml
|
75
75
|
- did_you_mean.gemspec
|
76
76
|
- doc/CHANGELOG.md.erb
|
77
77
|
- doc/changelog_generator.rb
|
@@ -106,7 +106,6 @@ files:
|
|
106
106
|
- test/spell_checking/variable_name_check_test.rb
|
107
107
|
- test/test_helper.rb
|
108
108
|
- test/verbose_formatter_test.rb
|
109
|
-
- tmp/.keep
|
110
109
|
homepage: https://github.com/yuki24/did_you_mean
|
111
110
|
licenses:
|
112
111
|
- MIT
|
@@ -126,8 +125,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
126
125
|
- !ruby/object:Gem::Version
|
127
126
|
version: '0'
|
128
127
|
requirements: []
|
129
|
-
|
130
|
-
rubygems_version: 2.7.4
|
128
|
+
rubygems_version: 3.0.3
|
131
129
|
signing_key:
|
132
130
|
specification_version: 4
|
133
131
|
summary: '"Did you mean?" experience in Ruby'
|
data/.ruby-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
2.5.0
|