did_you_mean 0.9.6-java → 0.9.9-java
Sign up to get free protection for your applications and to get access to all the features.
- 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
|