did_you_mean 0.9.6-java → 0.9.9-java
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/Rakefile +5 -18
- data/did_you_mean.gemspec +3 -9
- data/ext/did_you_mean/extconf.rb +0 -1
- data/lib/did_you_mean.rb +1 -0
- data/lib/did_you_mean/core_ext/name_error.rb +3 -1
- data/lib/did_you_mean/core_ext/no_method_error.rb +35 -0
- data/lib/did_you_mean/finders/similar_method_finder.rb +1 -12
- data/lib/did_you_mean/levenshtein.rb +9 -3
- data/lib/did_you_mean/version.rb +1 -1
- data/lib/did_you_mean/word_collection.rb +4 -1
- data/test/all_test.rb +1 -0
- data/test/no_method_error_extension_test.rb +30 -6
- data/test/word_collection_test.rb +26 -0
- metadata +6 -5
- data/ext/did_you_mean/org/yukinishijima/ReceiverCapturer.java +0 -57
- data/lib/did_you_mean/receiver_capturer.jar +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a14f6d52030ffe8485f65b6dd385af94ea7d4ac5
|
|
4
|
+
data.tar.gz: 0141c3bf6c03e228e50183cf53f17249cce51816
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 90654e5f54d4ee208b2c3cdd5e1aab61fddcba22fc65055a709ce54521c8f4f58e456092f5f087215bdce4ae730c13453c4748763c59604b40cd15a271669459
|
|
7
|
+
data.tar.gz: 981f2d3fd6db87e537bfdb44f1ca932065c342c2a059d2b62e65dfdc014e1014d9d24157763bbdb89afd9107c5d6fec59674280fdca6c2f6f0565876356f6ee0
|
data/Rakefile
CHANGED
|
@@ -4,28 +4,15 @@ def mri?
|
|
|
4
4
|
defined?(RUBY_ENGINE) && RUBY_ENGINE == "ruby"
|
|
5
5
|
end
|
|
6
6
|
|
|
7
|
-
def jruby?
|
|
8
|
-
defined?(JRuby)
|
|
9
|
-
end
|
|
10
|
-
|
|
11
7
|
desc "run tests"
|
|
12
8
|
task default: [:test]
|
|
13
9
|
|
|
14
|
-
if mri?
|
|
15
|
-
|
|
16
|
-
require 'rake/extensiontask'
|
|
10
|
+
if mri?
|
|
11
|
+
require 'rake/extensiontask'
|
|
17
12
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
end
|
|
22
|
-
elsif jruby?
|
|
23
|
-
require 'rake/javaextensiontask'
|
|
24
|
-
|
|
25
|
-
Rake::JavaExtensionTask.new('did_you_mean') do |ext|
|
|
26
|
-
ext.name = "receiver_capturer"
|
|
27
|
-
ext.lib_dir = "lib/did_you_mean"
|
|
28
|
-
end
|
|
13
|
+
Rake::ExtensionTask.new('did_you_mean') do |ext|
|
|
14
|
+
ext.name = "method_missing"
|
|
15
|
+
ext.lib_dir = "lib/did_you_mean"
|
|
29
16
|
end
|
|
30
17
|
|
|
31
18
|
desc "Run tests"
|
data/did_you_mean.gemspec
CHANGED
|
@@ -12,16 +12,10 @@ Gem::Specification.new do |spec|
|
|
|
12
12
|
spec.description = '"did you mean?" experience in Ruby: the error message will tell you the right one when you misspelled something.'
|
|
13
13
|
spec.homepage = "https://github.com/yuki24/did_you_mean"
|
|
14
14
|
spec.license = "MIT"
|
|
15
|
-
spec.files = `git ls-files`.split($/)
|
|
16
|
-
|
|
17
|
-
case RUBY_ENGINE
|
|
18
|
-
when 'ruby'
|
|
19
|
-
spec.extensions = ["ext/did_you_mean/extconf.rb"]
|
|
20
|
-
when 'jruby'
|
|
21
|
-
spec.platform = "java"
|
|
22
|
-
spec.files << "lib/did_you_mean/receiver_capturer.jar"
|
|
23
|
-
end
|
|
24
15
|
|
|
16
|
+
spec.files = `git ls-files`.split($/)
|
|
17
|
+
# spec.extensions = ["ext/did_you_mean/extconf.rb"]
|
|
18
|
+
spec.platform = 'java'
|
|
25
19
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
26
20
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
27
21
|
spec.require_paths = ["lib"]
|
data/ext/did_you_mean/extconf.rb
CHANGED
data/lib/did_you_mean.rb
CHANGED
|
@@ -9,7 +9,9 @@ class NameError
|
|
|
9
9
|
|
|
10
10
|
def to_s_with_did_you_mean
|
|
11
11
|
msg = original_message
|
|
12
|
-
|
|
12
|
+
bt = caller.first(6)
|
|
13
|
+
|
|
14
|
+
msg << did_you_mean?.to_s if IGNORED_CALLERS.all? {|ignored| bt.grep(ignored).empty? }
|
|
13
15
|
msg
|
|
14
16
|
rescue
|
|
15
17
|
original_message
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
case RUBY_ENGINE
|
|
2
|
+
when 'ruby'
|
|
3
|
+
require 'did_you_mean/method_missing'
|
|
4
|
+
|
|
5
|
+
when 'jruby'
|
|
6
|
+
NoMethodError.class_eval do
|
|
7
|
+
def to_s
|
|
8
|
+
receiver unless defined?(@receiver)
|
|
9
|
+
super
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def receiver
|
|
13
|
+
@receiver ||= begin
|
|
14
|
+
field = JRuby.reference(__message__).java_class.getDeclaredField("object")
|
|
15
|
+
field.setAccessible(true)
|
|
16
|
+
field.get(__message__)
|
|
17
|
+
rescue
|
|
18
|
+
super
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
if JRUBY_VERSION >= '9.0.0.0'
|
|
25
|
+
def __message__
|
|
26
|
+
JRuby.reference(self).getMessage
|
|
27
|
+
end
|
|
28
|
+
else
|
|
29
|
+
def __message__
|
|
30
|
+
error = JRuby.reference(self)
|
|
31
|
+
error.java_class.getField("message").get(error)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -28,18 +28,7 @@ module DidYouMean
|
|
|
28
28
|
end
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
-
if
|
|
31
|
+
if RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'jruby'
|
|
32
32
|
finders["NoMethodError"] = SimilarMethodFinder
|
|
33
|
-
|
|
34
|
-
case RUBY_ENGINE
|
|
35
|
-
when 'ruby'
|
|
36
|
-
require 'did_you_mean/method_missing'
|
|
37
|
-
when 'jruby'
|
|
38
|
-
require 'did_you_mean/receiver_capturer'
|
|
39
|
-
org.yukinishijima.ReceiverCapturer.setup(JRuby.runtime)
|
|
40
|
-
NoMethodError.send(:attr, :receiver)
|
|
41
|
-
else
|
|
42
|
-
finders.delete("NoMethodError")
|
|
43
|
-
end
|
|
44
33
|
end
|
|
45
34
|
end
|
|
@@ -11,9 +11,13 @@ module DidYouMean
|
|
|
11
11
|
d = (0..m).to_a
|
|
12
12
|
x = nil
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
# to avoid duplicating an enumerable object, create it outside of the loop
|
|
15
|
+
str2_codepoints = str2.codepoints.to_a
|
|
16
|
+
|
|
17
|
+
str1.each_codepoint.with_index(1) do |char1, i|
|
|
18
|
+
j = 0
|
|
19
|
+
while j < m
|
|
20
|
+
cost = (char1 == str2_codepoints[j]) ? 0 : 1
|
|
17
21
|
x = min3(
|
|
18
22
|
d[j+1] + 1, # insertion
|
|
19
23
|
i + 1, # deletion
|
|
@@ -21,6 +25,8 @@ module DidYouMean
|
|
|
21
25
|
)
|
|
22
26
|
d[j] = i
|
|
23
27
|
i = x
|
|
28
|
+
|
|
29
|
+
j += 1
|
|
24
30
|
end
|
|
25
31
|
d[m] = x
|
|
26
32
|
end
|
data/lib/did_you_mean/version.rb
CHANGED
|
@@ -15,7 +15,10 @@ module DidYouMean
|
|
|
15
15
|
target_word = target_word.to_s
|
|
16
16
|
threshold = threshold(target_word)
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
map {|word| [Levenshtein.distance(word.to_s, target_word), word] }
|
|
19
|
+
.select {|distance, _| distance <= threshold }
|
|
20
|
+
.sort
|
|
21
|
+
.map(&:last)
|
|
19
22
|
end
|
|
20
23
|
|
|
21
24
|
private
|
data/test/all_test.rb
CHANGED
|
@@ -1,14 +1,38 @@
|
|
|
1
1
|
require_relative 'test_helper'
|
|
2
2
|
|
|
3
3
|
class NoMethodErrorExtensionTest < Minitest::Test
|
|
4
|
-
def
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
def test_receiver_with_string
|
|
5
|
+
receiver = "receiver"
|
|
6
|
+
error = assert_raises(NoMethodError) do
|
|
7
|
+
receiver.doesnt_exist
|
|
8
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
|
|
9
19
|
end
|
|
10
20
|
|
|
11
|
-
def
|
|
12
|
-
|
|
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
|
|
13
37
|
end
|
|
14
38
|
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require_relative 'test_helper'
|
|
2
|
+
|
|
3
|
+
class WordCollectionTest < Minitest::Test
|
|
4
|
+
def setup
|
|
5
|
+
names = %w(
|
|
6
|
+
name12
|
|
7
|
+
name123
|
|
8
|
+
name1234
|
|
9
|
+
name12345
|
|
10
|
+
name123456
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
@word_collection = DidYouMean::WordCollection.new(names)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_similar_to
|
|
17
|
+
expected = %w(
|
|
18
|
+
name123456
|
|
19
|
+
name12345
|
|
20
|
+
name1234
|
|
21
|
+
name123
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
assert_equal expected, @word_collection.similar_to("name123456")
|
|
25
|
+
end
|
|
26
|
+
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: 0.9.
|
|
4
|
+
version: 0.9.9
|
|
5
5
|
platform: java
|
|
6
6
|
authors:
|
|
7
7
|
- Yuki Nishijima
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2015-
|
|
11
|
+
date: 2015-05-13 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: interception
|
|
@@ -101,7 +101,6 @@ files:
|
|
|
101
101
|
- doc/did_you_mean_example.png
|
|
102
102
|
- ext/did_you_mean/extconf.rb
|
|
103
103
|
- ext/did_you_mean/method_missing.c
|
|
104
|
-
- ext/did_you_mean/org/yukinishijima/ReceiverCapturer.java
|
|
105
104
|
- gemfiles/activerecord_32.gemfile
|
|
106
105
|
- gemfiles/activerecord_40.gemfile
|
|
107
106
|
- gemfiles/activerecord_41.gemfile
|
|
@@ -109,6 +108,7 @@ files:
|
|
|
109
108
|
- gemfiles/activerecord_edge.gemfile
|
|
110
109
|
- lib/did_you_mean.rb
|
|
111
110
|
- lib/did_you_mean/core_ext/name_error.rb
|
|
111
|
+
- lib/did_you_mean/core_ext/no_method_error.rb
|
|
112
112
|
- lib/did_you_mean/finders.rb
|
|
113
113
|
- lib/did_you_mean/finders/name_error_finders.rb
|
|
114
114
|
- lib/did_you_mean/finders/name_error_finders/similar_class_finder.rb
|
|
@@ -116,7 +116,6 @@ files:
|
|
|
116
116
|
- lib/did_you_mean/finders/similar_attribute_finder.rb
|
|
117
117
|
- lib/did_you_mean/finders/similar_method_finder.rb
|
|
118
118
|
- lib/did_you_mean/levenshtein.rb
|
|
119
|
-
- lib/did_you_mean/receiver_capturer.jar
|
|
120
119
|
- lib/did_you_mean/test_helper.rb
|
|
121
120
|
- lib/did_you_mean/version.rb
|
|
122
121
|
- lib/did_you_mean/word_collection.rb
|
|
@@ -129,6 +128,7 @@ files:
|
|
|
129
128
|
- test/similar_method_finder_test.rb
|
|
130
129
|
- test/similar_name_finder_test.rb
|
|
131
130
|
- test/test_helper.rb
|
|
131
|
+
- test/word_collection_test.rb
|
|
132
132
|
homepage: https://github.com/yuki24/did_you_mean
|
|
133
133
|
licenses:
|
|
134
134
|
- MIT
|
|
@@ -149,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
149
149
|
version: '0'
|
|
150
150
|
requirements: []
|
|
151
151
|
rubyforge_project:
|
|
152
|
-
rubygems_version: 2.4.
|
|
152
|
+
rubygems_version: 2.4.6
|
|
153
153
|
signing_key:
|
|
154
154
|
specification_version: 4
|
|
155
155
|
summary: '"Did you mean?" experience in Ruby'
|
|
@@ -163,3 +163,4 @@ test_files:
|
|
|
163
163
|
- test/similar_method_finder_test.rb
|
|
164
164
|
- test/similar_name_finder_test.rb
|
|
165
165
|
- test/test_helper.rb
|
|
166
|
+
- test/word_collection_test.rb
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
package org.yukinishijima;
|
|
2
|
-
|
|
3
|
-
import org.jruby.anno.JRubyMethod;
|
|
4
|
-
import org.jruby.exceptions.RaiseException;
|
|
5
|
-
import org.jruby.runtime.builtin.IRubyObject;
|
|
6
|
-
import org.jruby.runtime.Block;
|
|
7
|
-
import org.jruby.runtime.ThreadContext;
|
|
8
|
-
import org.jruby.runtime.Visibility;
|
|
9
|
-
import org.jruby.Ruby;
|
|
10
|
-
import org.jruby.RubyArray;
|
|
11
|
-
import org.jruby.RubyException;
|
|
12
|
-
import org.jruby.RubyModule;
|
|
13
|
-
import org.jruby.RubyNoMethodError;
|
|
14
|
-
import org.jruby.internal.runtime.methods.CallConfiguration;
|
|
15
|
-
import org.jruby.internal.runtime.methods.DynamicMethod;
|
|
16
|
-
import org.jruby.internal.runtime.methods.JavaMethod.JavaMethodNBlock;
|
|
17
|
-
|
|
18
|
-
public class ReceiverCapturer extends JavaMethodNBlock {
|
|
19
|
-
private DynamicMethod methodMissingMethod;
|
|
20
|
-
|
|
21
|
-
public ReceiverCapturer(RubyModule implementationClass, DynamicMethod methodMissingMethod) {
|
|
22
|
-
super(implementationClass, Visibility.PRIVATE, CallConfiguration.FrameFullScopeNone);
|
|
23
|
-
this.methodMissingMethod = methodMissingMethod;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
@Override
|
|
27
|
-
public IRubyObject call(ThreadContext context, IRubyObject self, RubyModule clazz, String name, IRubyObject[] args, Block block) {
|
|
28
|
-
try {
|
|
29
|
-
return this.methodMissingMethod.call(context, self, clazz, name, args, block);
|
|
30
|
-
} catch (RaiseException exception) {
|
|
31
|
-
appendReceiverToException(exception, self);
|
|
32
|
-
throw exception;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
@JRubyMethod
|
|
37
|
-
public static void setup(Ruby runtime) {
|
|
38
|
-
RubyModule module = runtime.defineModule("Kernel");
|
|
39
|
-
|
|
40
|
-
DynamicMethod privateMethodMissing = runtime.getPrivateMethodMissing();
|
|
41
|
-
DynamicMethod protectedMethodMissing = runtime.getProtectedMethodMissing();
|
|
42
|
-
DynamicMethod superMethodMissing = runtime.getSuperMethodMissing();
|
|
43
|
-
DynamicMethod normalMethodMissing = runtime.getNormalMethodMissing();
|
|
44
|
-
|
|
45
|
-
runtime.setPrivateMethodMissing(new ReceiverCapturer(module, privateMethodMissing));
|
|
46
|
-
runtime.setProtectedMethodMissing(new ReceiverCapturer(module, protectedMethodMissing));
|
|
47
|
-
runtime.setSuperMethodMissing(new ReceiverCapturer(module, superMethodMissing));
|
|
48
|
-
runtime.setNormalMethodMissing(new ReceiverCapturer(module, normalMethodMissing));
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
private void appendReceiverToException(RaiseException exception, IRubyObject self) {
|
|
52
|
-
if (exception.getException() instanceof RubyNoMethodError) {
|
|
53
|
-
RubyNoMethodError noMethodError = (RubyNoMethodError) exception.getException();
|
|
54
|
-
noMethodError.setInstanceVariable("@receiver", self);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
Binary file
|