did_you_mean 0.10.0 → 1.0.0.beta2
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 +4 -4
- data/.travis.yml +0 -18
- data/CHANGELOG.md +28 -3
- data/Gemfile +0 -7
- data/README.md +2 -16
- data/Rakefile +1 -13
- data/benchmark/memory_usage.rb +4 -4
- data/did_you_mean.gemspec +2 -12
- data/evaluation/calculator.rb +5 -5
- data/lib/did_you_mean.rb +18 -26
- data/lib/did_you_mean/core_ext/name_error.rb +15 -25
- data/lib/did_you_mean/formatter.rb +5 -11
- data/lib/did_you_mean/jaro_winkler.rb +3 -4
- data/lib/did_you_mean/levenshtein.rb +1 -1
- data/lib/did_you_mean/{finders.rb → spell_checkable.rb} +4 -12
- data/lib/did_you_mean/spell_checkers/method_name_checker.rb +54 -0
- data/lib/did_you_mean/{finders/name_error_finders.rb → spell_checkers/name_error_checkers.rb} +7 -7
- data/lib/did_you_mean/{finders/name_error_finders/class_finder.rb → spell_checkers/name_error_checkers/class_name_checker.rb} +8 -26
- data/lib/did_you_mean/spell_checkers/name_error_checkers/variable_name_checker.rb +20 -0
- data/lib/did_you_mean/spell_checkers/null_checker.rb +6 -0
- data/lib/did_you_mean/version.rb +1 -1
- data/test/core_ext/name_error_extension_test.rb +20 -23
- data/test/correctable/class_name_test.rb +14 -14
- data/test/correctable/method_name_test.rb +21 -21
- data/test/correctable/variable_name_test.rb +30 -25
- data/test/{word_collection_test.rb → spell_checker_test.rb} +20 -20
- data/test/test_helper.rb +5 -8
- metadata +15 -50
- data/ext/did_you_mean/extconf.rb +0 -2
- data/ext/did_you_mean/method_receiver.c +0 -20
- data/lib/did_you_mean/core_ext/no_method_error.rb +0 -46
- data/lib/did_you_mean/core_ext/rubinius.rb +0 -16
- data/lib/did_you_mean/finders/method_finder.rb +0 -62
- data/lib/did_you_mean/finders/name_error_finders/name_finder.rb +0 -18
- data/lib/did_you_mean/test_helper.rb +0 -7
- data/test/core_ext/no_method_error_extension_test.rb +0 -38
@@ -1,40 +1,40 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
class
|
3
|
+
class SpellCheckerTest < Minitest::Test
|
4
4
|
class WordCollection
|
5
|
-
include DidYouMean::
|
5
|
+
include DidYouMean::SpellCheckable
|
6
6
|
|
7
7
|
def initialize(words)
|
8
8
|
@words = words
|
9
9
|
end
|
10
10
|
|
11
|
-
def similar_to(input
|
12
|
-
@
|
11
|
+
def similar_to(input)
|
12
|
+
@corrections, @input = nil, input
|
13
13
|
|
14
|
-
|
14
|
+
corrections
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
17
|
+
def candidates
|
18
18
|
{ @input => @words }
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
22
|
def test_similar_to_corrects_mistypes
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
24
|
+
assert_correction 'foo', collection('foo', 'fork') .similar_to('doo')
|
25
|
+
assert_correction 'email', collection('email', 'fail', 'eval').similar_to('meail')
|
26
|
+
assert_correction 'fail', collection('email', 'fail', 'eval').similar_to('fial')
|
27
|
+
assert_correction 'fail', collection('email', 'fail', 'eval').similar_to('afil')
|
28
|
+
assert_correction 'eval', collection('email', 'fail', 'eval').similar_to('eavl')
|
29
|
+
assert_correction 'eval', collection('email', 'fail', 'eval').similar_to('veal')
|
30
|
+
assert_correction 'sub!', collection('sub', 'gsub', 'sub!') .similar_to('suv!')
|
31
|
+
assert_correction 'sub', collection('sub', 'gsub', 'sub!') .similar_to('suv')
|
32
32
|
|
33
33
|
assert_equal %w(gsub! gsub), collection('sub', 'gsub', 'gsub!').similar_to('gsuv!')
|
34
34
|
assert_equal %w(sub! sub gsub!), collection('sub', 'sub!', 'gsub', 'gsub!').similar_to('ssub!')
|
35
35
|
|
36
36
|
group_methods = %w(groups group_url groups_url group_path)
|
37
|
-
|
37
|
+
assert_correction 'groups', collection(group_methods).similar_to('group')
|
38
38
|
|
39
39
|
group_classes = %w(
|
40
40
|
GroupMembership
|
@@ -47,8 +47,8 @@ class FinderTest < Minitest::Test
|
|
47
47
|
NullGroupMembership
|
48
48
|
)
|
49
49
|
|
50
|
-
|
51
|
-
|
50
|
+
assert_correction 'GroupMembership', collection(group_classes).similar_to('GroupMemberhip')
|
51
|
+
assert_correction 'GroupMembershipDecorator', collection(group_classes).similar_to('GroupMemberhipDecorator')
|
52
52
|
|
53
53
|
names = %w(first_name_change first_name_changed? first_name_will_change!)
|
54
54
|
assert_equal names, collection(names).similar_to('first_name_change!')
|
@@ -58,9 +58,9 @@ class FinderTest < Minitest::Test
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def test_similar_to_corrects_misspells
|
61
|
-
|
62
|
-
|
63
|
-
|
61
|
+
assert_correction 'descendants', collection('descendants') .similar_to('dependents')
|
62
|
+
assert_correction 'drag_to', collection('drag_to') .similar_to('drag')
|
63
|
+
assert_correction 'set_result_count', collection('set_result_count').similar_to('set_result')
|
64
64
|
end
|
65
65
|
|
66
66
|
def test_similar_to_sorts_results_by_simiarity
|
data/test/test_helper.rb
CHANGED
@@ -1,14 +1,11 @@
|
|
1
|
-
NAME_ERROR = (___ rescue $!).class
|
2
|
-
|
3
1
|
require 'minitest/autorun'
|
4
2
|
require 'minitest/unit'
|
5
3
|
require 'did_you_mean'
|
6
4
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
5
|
+
module DidYouMean::TestHelper
|
6
|
+
def assert_correction(expected, array)
|
7
|
+
assert_equal [expected], array, "Expected #{array.inspect} to only include #{expected.inspect}"
|
8
|
+
end
|
11
9
|
end
|
12
10
|
|
13
|
-
|
14
|
-
MiniTest::Test.send :include, DidYouMean::TestHelper
|
11
|
+
MiniTest::Test.include(DidYouMean::TestHelper)
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: did_you_mean
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0.beta2
|
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-08
|
11
|
+
date: 2015-09-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: interception
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: bundler
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,20 +38,6 @@ dependencies:
|
|
52
38
|
- - ">="
|
53
39
|
- !ruby/object:Gem::Version
|
54
40
|
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: rake-compiler
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
41
|
- !ruby/object:Gem::Dependency
|
70
42
|
name: minitest
|
71
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -85,8 +57,7 @@ description: '"did you mean?" experience in Ruby: the error message will tell yo
|
|
85
57
|
email:
|
86
58
|
- mail@yukinishijima.net
|
87
59
|
executables: []
|
88
|
-
extensions:
|
89
|
-
- ext/did_you_mean/extconf.rb
|
60
|
+
extensions: []
|
90
61
|
extra_rdoc_files: []
|
91
62
|
files:
|
92
63
|
- ".gitignore"
|
@@ -108,31 +79,26 @@ files:
|
|
108
79
|
- evaluation/calculator.rb
|
109
80
|
- evaluation/dictionary_generator.rb
|
110
81
|
- evaluation/incorrect_words.yaml
|
111
|
-
- ext/did_you_mean/extconf.rb
|
112
|
-
- ext/did_you_mean/method_receiver.c
|
113
82
|
- lib/did_you_mean.rb
|
114
83
|
- lib/did_you_mean/core_ext/name_error.rb
|
115
|
-
- lib/did_you_mean/core_ext/no_method_error.rb
|
116
|
-
- lib/did_you_mean/core_ext/rubinius.rb
|
117
|
-
- lib/did_you_mean/finders.rb
|
118
|
-
- lib/did_you_mean/finders/method_finder.rb
|
119
|
-
- lib/did_you_mean/finders/name_error_finders.rb
|
120
|
-
- lib/did_you_mean/finders/name_error_finders/class_finder.rb
|
121
|
-
- lib/did_you_mean/finders/name_error_finders/name_finder.rb
|
122
84
|
- lib/did_you_mean/formatter.rb
|
123
85
|
- lib/did_you_mean/jaro_winkler.rb
|
124
86
|
- lib/did_you_mean/levenshtein.rb
|
125
|
-
- lib/did_you_mean/
|
87
|
+
- lib/did_you_mean/spell_checkable.rb
|
88
|
+
- lib/did_you_mean/spell_checkers/method_name_checker.rb
|
89
|
+
- lib/did_you_mean/spell_checkers/name_error_checkers.rb
|
90
|
+
- lib/did_you_mean/spell_checkers/name_error_checkers/class_name_checker.rb
|
91
|
+
- lib/did_you_mean/spell_checkers/name_error_checkers/variable_name_checker.rb
|
92
|
+
- lib/did_you_mean/spell_checkers/null_checker.rb
|
126
93
|
- lib/did_you_mean/version.rb
|
127
94
|
- test/core_ext/name_error_extension_test.rb
|
128
|
-
- test/core_ext/no_method_error_extension_test.rb
|
129
95
|
- test/correctable/class_name_test.rb
|
130
96
|
- test/correctable/method_name_test.rb
|
131
97
|
- test/correctable/uncorrectable_name_test.rb
|
132
98
|
- test/correctable/variable_name_test.rb
|
133
99
|
- test/edit_distance/jaro_winkler_test.rb
|
100
|
+
- test/spell_checker_test.rb
|
134
101
|
- test/test_helper.rb
|
135
|
-
- test/word_collection_test.rb
|
136
102
|
homepage: https://github.com/yuki24/did_you_mean
|
137
103
|
licenses:
|
138
104
|
- MIT
|
@@ -145,25 +111,24 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
145
111
|
requirements:
|
146
112
|
- - ">="
|
147
113
|
- !ruby/object:Gem::Version
|
148
|
-
version:
|
114
|
+
version: 2.3.0dev
|
149
115
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
150
116
|
requirements:
|
151
|
-
- - "
|
117
|
+
- - ">"
|
152
118
|
- !ruby/object:Gem::Version
|
153
|
-
version:
|
119
|
+
version: 1.3.1
|
154
120
|
requirements: []
|
155
121
|
rubyforge_project:
|
156
|
-
rubygems_version: 2.
|
122
|
+
rubygems_version: 2.5.0
|
157
123
|
signing_key:
|
158
124
|
specification_version: 4
|
159
125
|
summary: '"Did you mean?" experience in Ruby'
|
160
126
|
test_files:
|
161
127
|
- test/core_ext/name_error_extension_test.rb
|
162
|
-
- test/core_ext/no_method_error_extension_test.rb
|
163
128
|
- test/correctable/class_name_test.rb
|
164
129
|
- test/correctable/method_name_test.rb
|
165
130
|
- test/correctable/uncorrectable_name_test.rb
|
166
131
|
- test/correctable/variable_name_test.rb
|
167
132
|
- test/edit_distance/jaro_winkler_test.rb
|
133
|
+
- test/spell_checker_test.rb
|
168
134
|
- test/test_helper.rb
|
169
|
-
- test/word_collection_test.rb
|
data/ext/did_you_mean/extconf.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
#include <ruby.h>
|
2
|
-
|
3
|
-
static const rb_data_type_t *type;
|
4
|
-
|
5
|
-
static VALUE
|
6
|
-
name_err_receiver(VALUE self)
|
7
|
-
{
|
8
|
-
VALUE *ptr, mesg = rb_attr_get(self, rb_intern("mesg"));
|
9
|
-
TypedData_Get_Struct(mesg, VALUE, type, ptr);
|
10
|
-
return ptr[1];
|
11
|
-
}
|
12
|
-
|
13
|
-
void
|
14
|
-
Init_method_receiver()
|
15
|
-
{
|
16
|
-
VALUE err_mesg = rb_funcall(rb_cNameErrorMesg, '!', 3, Qnil, Qnil, Qnil);
|
17
|
-
type = RTYPEDDATA(err_mesg)->type;
|
18
|
-
|
19
|
-
rb_define_method(rb_eNameError, "receiver", name_err_receiver, 0);
|
20
|
-
}
|
@@ -1,46 +0,0 @@
|
|
1
|
-
case RUBY_ENGINE
|
2
|
-
when 'ruby'
|
3
|
-
name_error = begin
|
4
|
-
raise_name_error
|
5
|
-
rescue NameError => e
|
6
|
-
e
|
7
|
-
end
|
8
|
-
|
9
|
-
unless name_error.respond_to?(:receiver)
|
10
|
-
require 'did_you_mean/method_receiver'
|
11
|
-
end
|
12
|
-
when 'jruby'
|
13
|
-
NoMethodError.class_eval do
|
14
|
-
def to_s
|
15
|
-
receiver unless defined?(@receiver)
|
16
|
-
super
|
17
|
-
end
|
18
|
-
|
19
|
-
def receiver
|
20
|
-
@receiver ||= begin
|
21
|
-
field = JRuby.reference(__message__).java_class.getDeclaredField("object")
|
22
|
-
field.setAccessible(true)
|
23
|
-
field.get(__message__)
|
24
|
-
rescue
|
25
|
-
nil
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
if JRUBY_VERSION >= '9.0.0.0'
|
32
|
-
def __message__
|
33
|
-
JRuby.reference(self).getMessage
|
34
|
-
end
|
35
|
-
else
|
36
|
-
def __message__
|
37
|
-
error = JRuby.reference(self)
|
38
|
-
error.java_class.getField("message").get(error)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
when 'rbx'
|
44
|
-
require 'did_you_mean/core_ext/rubinius'
|
45
|
-
NoMethodError.class_eval { attr_reader :receiver }
|
46
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
if defined?(Rubinius)
|
2
|
-
class << Rubinius
|
3
|
-
alias raise_with_no_receiver_capturer raise_exception
|
4
|
-
|
5
|
-
def raise_exception(exc)
|
6
|
-
if exc.is_a?(NoMethodError)
|
7
|
-
bt = Rubinius::VM.backtrace(0, true).detect do |x|
|
8
|
-
x.method.name == :method_missing
|
9
|
-
end
|
10
|
-
exc.instance_variable_set(:@receiver, bt.variables.self) if bt
|
11
|
-
end
|
12
|
-
|
13
|
-
raise_with_no_receiver_capturer(exc)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,62 +0,0 @@
|
|
1
|
-
module DidYouMean
|
2
|
-
class MethodFinder
|
3
|
-
include BaseFinder
|
4
|
-
attr_reader :method_name, :receiver
|
5
|
-
|
6
|
-
def initialize(exception)
|
7
|
-
@method_name = exception.name
|
8
|
-
@receiver = exception.receiver
|
9
|
-
@binding = exception.frame_binding
|
10
|
-
@location = exception.backtrace.first
|
11
|
-
@ivar_names = NameFinder.new(exception).ivar_names
|
12
|
-
end
|
13
|
-
|
14
|
-
def searches
|
15
|
-
{
|
16
|
-
method_name => method_names,
|
17
|
-
receiver_name.to_s => @ivar_names
|
18
|
-
}
|
19
|
-
end
|
20
|
-
|
21
|
-
def method_names
|
22
|
-
method_names = receiver.methods + receiver.singleton_methods
|
23
|
-
method_names += receiver.private_methods if receiver.equal?(@binding.eval("self"))
|
24
|
-
method_names.delete(method_name)
|
25
|
-
method_names.uniq!
|
26
|
-
method_names
|
27
|
-
end
|
28
|
-
|
29
|
-
def receiver_name
|
30
|
-
return unless @receiver.nil?
|
31
|
-
|
32
|
-
abs_path, lineno, label =
|
33
|
-
/(.*):(.*):in `(.*)'/ =~ @location && [$1, $2.to_i, $3]
|
34
|
-
|
35
|
-
line =
|
36
|
-
case abs_path
|
37
|
-
when "(irb)"
|
38
|
-
Readline::HISTORY.to_a.last
|
39
|
-
when "(pry)"
|
40
|
-
::Pry.history.to_a.last
|
41
|
-
else
|
42
|
-
File.open(abs_path) do |file|
|
43
|
-
file.detect { file.lineno == lineno }
|
44
|
-
end if File.exist?(abs_path)
|
45
|
-
end
|
46
|
-
|
47
|
-
/@(\w+)*\.#{@method_name}/ =~ line.to_s && $1
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
if RUBY_ENGINE == 'rbx'
|
52
|
-
module MethodFinder::RubiniusSupport
|
53
|
-
def self.new(exception)
|
54
|
-
if exception.receiver === exception.frame_binding.eval("self")
|
55
|
-
NameErrorFinders.new(exception)
|
56
|
-
else
|
57
|
-
MethodFinder.new(exception)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
module DidYouMean
|
2
|
-
class NameFinder
|
3
|
-
include BaseFinder
|
4
|
-
attr_reader :name, :method_names, :lvar_names, :ivar_names, :cvar_names
|
5
|
-
|
6
|
-
def initialize(exception)
|
7
|
-
@name = exception.name.to_s.tr(AT, EMPTY)
|
8
|
-
@lvar_names = exception.frame_binding.eval("local_variables")
|
9
|
-
@method_names = exception.frame_binding.eval("methods + private_methods")
|
10
|
-
@cvar_names = exception.frame_binding.eval("self.class.class_variables")
|
11
|
-
@ivar_names = exception.frame_binding.eval("instance_variables")
|
12
|
-
end
|
13
|
-
|
14
|
-
def searches
|
15
|
-
{name => (lvar_names + method_names + ivar_names + cvar_names)}
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class NoMethodErrorExtensionTest < Minitest::Test
|
4
|
-
def test_receiver_with_string
|
5
|
-
receiver = "receiver"
|
6
|
-
error = assert_raises(NoMethodError) do
|
7
|
-
receiver.doesnt_exist
|
8
|
-
end
|
9
|
-
|
10
|
-
assert_same receiver, error.receiver
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_receiver_with_class
|
14
|
-
error = assert_raises(NoMethodError) do
|
15
|
-
Object.doesnt_exist
|
16
|
-
end
|
17
|
-
|
18
|
-
assert_same Object, error.receiver
|
19
|
-
end
|
20
|
-
|
21
|
-
def test_receiver_with_class_after_calling_to_s
|
22
|
-
error = assert_raises(NoMethodError) do
|
23
|
-
Object.doesnt_exist
|
24
|
-
end
|
25
|
-
|
26
|
-
error.to_s
|
27
|
-
assert_same Object, error.receiver
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_receiver_with_class_after_calling_message
|
31
|
-
error = assert_raises(NoMethodError) do
|
32
|
-
Object.doesnt_exist
|
33
|
-
end
|
34
|
-
|
35
|
-
error.message
|
36
|
-
assert_same Object, error.receiver
|
37
|
-
end
|
38
|
-
end
|