did_you_mean 0.9.6-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.
Files changed (40) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +27 -0
  3. data/.travis.yml +35 -0
  4. data/Appraisals +23 -0
  5. data/Gemfile +18 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +110 -0
  8. data/Rakefile +61 -0
  9. data/did_you_mean.gemspec +35 -0
  10. data/ext/did_you_mean/extconf.rb +3 -0
  11. data/ext/did_you_mean/method_missing.c +20 -0
  12. data/ext/did_you_mean/org/yukinishijima/ReceiverCapturer.java +57 -0
  13. data/gemfiles/activerecord_32.gemfile +21 -0
  14. data/gemfiles/activerecord_40.gemfile +21 -0
  15. data/gemfiles/activerecord_41.gemfile +21 -0
  16. data/gemfiles/activerecord_42.gemfile +21 -0
  17. data/gemfiles/activerecord_edge.gemfile +25 -0
  18. data/lib/did_you_mean.rb +16 -0
  19. data/lib/did_you_mean/core_ext/name_error.rb +28 -0
  20. data/lib/did_you_mean/finders.rb +31 -0
  21. data/lib/did_you_mean/finders/name_error_finders.rb +24 -0
  22. data/lib/did_you_mean/finders/name_error_finders/similar_class_finder.rb +50 -0
  23. data/lib/did_you_mean/finders/name_error_finders/similar_name_finder.rb +61 -0
  24. data/lib/did_you_mean/finders/similar_attribute_finder.rb +26 -0
  25. data/lib/did_you_mean/finders/similar_method_finder.rb +45 -0
  26. data/lib/did_you_mean/levenshtein.rb +49 -0
  27. data/lib/did_you_mean/receiver_capturer.jar +0 -0
  28. data/lib/did_you_mean/test_helper.rb +7 -0
  29. data/lib/did_you_mean/version.rb +3 -0
  30. data/lib/did_you_mean/word_collection.rb +27 -0
  31. data/test/all_test.rb +17 -0
  32. data/test/name_error_extension_test.rb +65 -0
  33. data/test/no_method_error_extension_test.rb +14 -0
  34. data/test/null_finder_test.rb +19 -0
  35. data/test/similar_attribute_finder_test.rb +17 -0
  36. data/test/similar_class_finder_test.rb +85 -0
  37. data/test/similar_method_finder_test.rb +60 -0
  38. data/test/similar_name_finder_test.rb +62 -0
  39. data/test/test_helper.rb +32 -0
  40. metadata +165 -0
@@ -0,0 +1,3 @@
1
+ module DidYouMean
2
+ VERSION = "0.9.6"
3
+ end
@@ -0,0 +1,27 @@
1
+ require 'did_you_mean/levenshtein'
2
+
3
+ module DidYouMean
4
+ class WordCollection
5
+ include Enumerable
6
+ attr_reader :words
7
+
8
+ def initialize(words)
9
+ @words = words
10
+ end
11
+
12
+ def each(&block) words.each(&block); end
13
+
14
+ def similar_to(target_word)
15
+ target_word = target_word.to_s
16
+ threshold = threshold(target_word)
17
+
18
+ select {|word| Levenshtein.distance(word.to_s, target_word) <= threshold }
19
+ end
20
+
21
+ private
22
+
23
+ def threshold(word)
24
+ (word.size * 0.3).ceil
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,17 @@
1
+ require_relative 'null_finder_test'
2
+ require_relative 'name_error_extension_test'
3
+ require_relative 'similar_name_finder_test'
4
+
5
+ if defined?(RUBY_ENGINE) && %w(ruby jruby).include?(RUBY_ENGINE)
6
+ require_relative 'similar_method_finder_test'
7
+ require_relative 'no_method_error_extension_test'
8
+ else
9
+ puts "didn't run the tests for NoMethodError extension."
10
+ puts "running tests for #{RUBY_ENGINE}." if defined?(RUBY_ENGINE)
11
+ end
12
+
13
+ if defined?(ActiveRecord)
14
+ require_relative 'similar_attribute_finder_test'
15
+ end
16
+
17
+ require_relative 'similar_class_finder_test'
@@ -0,0 +1,65 @@
1
+ require_relative 'test_helper'
2
+
3
+ class NameErrorExtensionTest < Minitest::Test
4
+ class TestFinder
5
+ def initialize(*); end
6
+ def did_you_mean?; "Y U SO SLOW?"; end
7
+ end
8
+
9
+ def setup
10
+ @old_finder = DidYouMean.finders["NameError"]
11
+ DidYouMean.finders["NameError"] = TestFinder
12
+
13
+ @error = assert_raises(NameError){ doesnt_exist }
14
+ end
15
+
16
+ def teardown
17
+ DidYouMean.finders["NameError"] = @old_finder
18
+ end
19
+
20
+ def test_message
21
+ assert_match "Y U SO SLOW?", @error.to_s
22
+ assert_match "Y U SO SLOW?", @error.message
23
+ end
24
+ end
25
+
26
+ class IgnoreCallersTest < Minitest::Test
27
+ class Boomer
28
+ def initialize(*)
29
+ raise Exception, "finder was created when it shouldn't!"
30
+ end
31
+ end
32
+
33
+ def setup
34
+ @org = DidYouMean.finders["NameError"]
35
+ DidYouMean.finders["NameError"] = Boomer
36
+
37
+ @error = assert_raises(NameError){ doesnt_exist }
38
+ end
39
+
40
+ def teardown
41
+ DidYouMean.finders["NameError"] = @org
42
+ end
43
+
44
+ def test_ignore_missing_name
45
+ assert_nothing_raised { missing_name }
46
+ end
47
+
48
+ def test_ignore_safe_constantize
49
+ assert_nothing_raised { safe_constantize }
50
+ end
51
+
52
+ private
53
+
54
+ def safe_constantize
55
+ @error.message
56
+ end
57
+
58
+ def missing_name
59
+ @error.message
60
+ end
61
+
62
+ def assert_nothing_raised
63
+ yield
64
+ end
65
+ end
@@ -0,0 +1,14 @@
1
+ require_relative 'test_helper'
2
+
3
+ class NoMethodErrorExtensionTest < Minitest::Test
4
+ def setup
5
+ @receiver = "receiver"
6
+ @error = assert_raises(NoMethodError) do
7
+ @receiver.doesnt_exist
8
+ end
9
+ end
10
+
11
+ def test_receiver
12
+ assert_same @receiver, @error.receiver
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ require_relative 'test_helper'
2
+
3
+ class NullFinderTest < Minitest::Test
4
+ class FirstNameError < NameError; end
5
+
6
+ def setup
7
+ @error = assert_raises(FirstNameError) do
8
+ raise FirstNameError, "Other name error"
9
+ end
10
+ end
11
+
12
+ def test_did_you_mean?
13
+ assert_nil @error.did_you_mean?
14
+ end
15
+
16
+ def test_message
17
+ refute_includes "Did you mean?", @error.message
18
+ end
19
+ end
@@ -0,0 +1,17 @@
1
+ require_relative 'test_helper'
2
+
3
+ class SimilarAttributeFinderTest < Minitest::Test
4
+ def setup
5
+ @error = assert_raises(ActiveRecord::UnknownAttributeError) do
6
+ User.new(flrst_name: "wrong flrst name")
7
+ end
8
+ end
9
+
10
+ def test_similar_words
11
+ assert_suggestion @error.finder.similar_words, "first_name"
12
+ end
13
+
14
+ def test_did_you_mean?
15
+ assert_match "Did you mean? first_name: string", @error.did_you_mean?
16
+ end
17
+ end
@@ -0,0 +1,85 @@
1
+ require_relative 'test_helper'
2
+
3
+ class Project
4
+ def self.bo0k
5
+ Bo0k
6
+ end
7
+ end
8
+
9
+ class Book
10
+ class TableOfContents; end
11
+
12
+ def tableof_contents
13
+ TableofContents
14
+ end
15
+
16
+ class Page
17
+ def tableof_contents
18
+ TableofContents
19
+ end
20
+
21
+ def self.tableof_contents
22
+ TableofContents
23
+ end
24
+ end
25
+ end
26
+
27
+ class SimpleSimilarClassFinderTest < Minitest::Test
28
+ def setup
29
+ @error = assert_raises(NameError) { ::Bo0k }
30
+ end
31
+
32
+ def test_similar_words
33
+ assert_suggestion @error.finder.similar_words, "Book"
34
+ end
35
+ end
36
+
37
+ class SimilarClassFinderInsideClassTest < Minitest::Test
38
+ def setup
39
+ @error = assert_raises(NameError) { Project.bo0k }
40
+ end
41
+
42
+ def test_similar_words
43
+ assert_suggestion @error.finder.similar_words, "Book"
44
+ end
45
+ end
46
+
47
+ class SimilarClassFinderInsideNestedClassTest < Minitest::Test
48
+ def setup
49
+ @error = assert_raises(NameError) { Book::Page.tableof_contents }
50
+ end
51
+
52
+ def test_similar_words
53
+ assert_suggestion @error.finder.similar_words, "Book::TableOfContents"
54
+ end
55
+ end
56
+
57
+ class SimilarClassFinderForClassWithNamespaceTest < Minitest::Test
58
+ def setup
59
+ @error = assert_raises(NameError) { ::Book::TableofContents }
60
+ end
61
+
62
+ def test_similar_words
63
+ assert_suggestion @error.finder.similar_words, "Book::TableOfContents"
64
+ end
65
+ end
66
+
67
+ class SimilarClassFinderFromInstanceTest < Minitest::Test
68
+ def setup
69
+ @error = assert_raises(NameError) { ::Book.new.tableof_contents }
70
+ end
71
+
72
+ def test_similar_words
73
+ assert_suggestion @error.finder.similar_words, "Book::TableOfContents"
74
+ end
75
+ end
76
+
77
+ class SimilarClassFinderFromNestedInstanceTest < Minitest::Test
78
+ def setup
79
+ @error = assert_raises(NameError) { ::Book::Page.new.tableof_contents }
80
+ end
81
+
82
+ def test_similar_words
83
+ assert_suggestion @error.finder.similar_words, "Book::TableOfContents"
84
+ end
85
+ end
@@ -0,0 +1,60 @@
1
+ require_relative 'test_helper'
2
+
3
+ class SimilarMethodFinderTest < Minitest::Test
4
+ class User
5
+ def friends; end
6
+ def first_name; end
7
+ def descendants; end
8
+
9
+ protected
10
+ def the_protected_method; end
11
+
12
+ private
13
+ def friend; end
14
+ def the_private_method; end
15
+
16
+ class << self
17
+ def load; end
18
+ end
19
+ end
20
+
21
+ module UserModule
22
+ def from_module; end
23
+ end
24
+
25
+ def setup
26
+ user = User.new.extend(UserModule)
27
+
28
+ @error_from_instance_method = assert_raises(NoMethodError){ user.flrst_name }
29
+ @error_from_private_method = assert_raises(NoMethodError){ user.friend }
30
+ @error_from_module_method = assert_raises(NoMethodError){ user.fr0m_module }
31
+ @error_from_class_method = assert_raises(NoMethodError){ User.l0ad }
32
+ end
33
+
34
+ def test_similar_words
35
+ assert_suggestion @error_from_instance_method.finder.similar_words, :first_name
36
+ assert_suggestion @error_from_private_method.finder.similar_words, :friends
37
+ assert_suggestion @error_from_module_method.finder.similar_words, :from_module
38
+ assert_suggestion @error_from_class_method.finder.similar_words, :load
39
+ end
40
+
41
+ def test_did_you_mean?
42
+ assert_match "Did you mean? #first_name", @error_from_instance_method.did_you_mean?
43
+ assert_match "Did you mean? #friends", @error_from_private_method.did_you_mean?
44
+ assert_match "Did you mean? #from_module", @error_from_module_method.did_you_mean?
45
+ assert_match "Did you mean? .load", @error_from_class_method.did_you_mean?
46
+ end
47
+
48
+ def test_similar_words_for_long_method_name
49
+ error = assert_raises(NoMethodError){ User.new.dependents }
50
+ assert_suggestion error.finder.similar_words, :descendants
51
+ end
52
+
53
+ def test_private_methods_should_not_be_suggested
54
+ error = assert_raises(NoMethodError){ User.new.the_protected_method }
55
+ refute_includes error.finder.similar_words, 'the_protected_method'
56
+
57
+ error = assert_raises(NoMethodError){ User.new.the_private_method }
58
+ refute_includes error.finder.similar_words, 'the_private_method'
59
+ end
60
+ end
@@ -0,0 +1,62 @@
1
+ require_relative 'test_helper'
2
+
3
+ class SimilarNameFinderTest < Minitest::Test
4
+ class User
5
+ def initialize(options = {})
6
+ @email = options[:email]
7
+ end
8
+
9
+ def call_flrst_name; f1rst_name; end
10
+ def call_fr0m_module; fr0m_module; end
11
+ def first_name; end
12
+ def to_s
13
+ "#{@first_name} #{@last_name} <#{email}>"
14
+ end
15
+ end
16
+
17
+ module UserModule
18
+ def from_module; end
19
+ end
20
+
21
+ def setup
22
+ user = User.new.extend(UserModule)
23
+
24
+ @error_from_instance_method = assert_raises(NameError){ user.call_flrst_name }
25
+ @error_from_module_method = assert_raises(NameError){ user.call_fr0m_module }
26
+ @error_from_missing_at_sign = assert_raises(NameError){ user.to_s }
27
+
28
+ # Use begin + rescue as #assert_raises changes a scope.
29
+ @error_from_local_variable = begin
30
+ userr
31
+ rescue NameError => e
32
+ e
33
+ end
34
+ end
35
+
36
+ def test_similar_words
37
+ assert_suggestion @error_from_instance_method.finder.similar_words, "first_name"
38
+ assert_suggestion @error_from_module_method.finder.similar_words, "from_module"
39
+ assert_suggestion @error_from_local_variable.finder.similar_words, "user"
40
+ assert_suggestion @error_from_missing_at_sign.finder.similar_words, "email"
41
+ end
42
+
43
+ def test_similar_instance_methods
44
+ assert_suggestion @error_from_instance_method.finder.similar_methods, "first_name"
45
+ assert_suggestion @error_from_module_method.finder.similar_methods, "from_module"
46
+ end
47
+
48
+ def test_similar_local_variables
49
+ assert_suggestion @error_from_local_variable.finder.similar_local_variables, "user"
50
+ end
51
+
52
+ def test_similar_instance_variables
53
+ assert_suggestion @error_from_missing_at_sign.finder.similar_instance_variables, "email"
54
+ end
55
+
56
+ def test_did_you_mean?
57
+ assert_match "Did you mean? #first_name", @error_from_instance_method.did_you_mean?
58
+ assert_match "Did you mean? #from_module", @error_from_module_method.did_you_mean?
59
+ assert_match "Did you mean? user", @error_from_local_variable.did_you_mean?
60
+ assert_match "Did you mean? @email", @error_from_missing_at_sign.did_you_mean?
61
+ end
62
+ end
@@ -0,0 +1,32 @@
1
+ require 'minitest/autorun'
2
+ require 'minitest/unit'
3
+ require 'did_you_mean'
4
+
5
+ begin
6
+ MiniTest::Test
7
+ rescue NameError
8
+ MiniTest::Test = MiniTest::Unit::TestCase
9
+ end
10
+
11
+ require 'did_you_mean/test_helper'
12
+ MiniTest::Test.send :include, DidYouMean::TestHelper
13
+
14
+ begin
15
+ require 'active_record'
16
+
17
+ # database
18
+ ActiveRecord::Base.configurations = {'test' => {adapter: 'sqlite3', database: ':memory:'}}
19
+ ActiveRecord::Base.establish_connection(:test)
20
+
21
+ # models
22
+ class User < ActiveRecord::Base; end
23
+
24
+ class CreateAllTables < ActiveRecord::Migration
25
+ def self.up
26
+ create_table(:users) {|t| t.string :first_name }
27
+ end
28
+ end
29
+ ActiveRecord::Migration.verbose = false
30
+ CreateAllTables.up
31
+ rescue LoadError
32
+ end
metadata ADDED
@@ -0,0 +1,165 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: did_you_mean
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.6
5
+ platform: java
6
+ authors:
7
+ - Yuki Nishijima
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-04-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: interception
15
+ version_requirements: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ requirement: !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - - '>='
23
+ - !ruby/object:Gem::Version
24
+ version: '0'
25
+ prerelease: false
26
+ type: :runtime
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.5'
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ~>
37
+ - !ruby/object:Gem::Version
38
+ version: '1.5'
39
+ prerelease: false
40
+ type: :development
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ prerelease: false
54
+ type: :development
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake-compiler
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ prerelease: false
68
+ type: :development
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - '>='
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ prerelease: false
82
+ type: :development
83
+ description: '"did you mean?" experience in Ruby: the error message will tell you
84
+ the right one when you misspelled something.'
85
+ email:
86
+ - mail@yukinishijima.net
87
+ executables: []
88
+ extensions: []
89
+ extra_rdoc_files: []
90
+ files:
91
+ - .gitignore
92
+ - .travis.yml
93
+ - Appraisals
94
+ - Gemfile
95
+ - LICENSE.txt
96
+ - README.md
97
+ - Rakefile
98
+ - did_you_mean.gemspec
99
+ - doc/CHANGELOG.md.erb
100
+ - doc/changelog_generator.rb
101
+ - doc/did_you_mean_example.png
102
+ - ext/did_you_mean/extconf.rb
103
+ - ext/did_you_mean/method_missing.c
104
+ - ext/did_you_mean/org/yukinishijima/ReceiverCapturer.java
105
+ - gemfiles/activerecord_32.gemfile
106
+ - gemfiles/activerecord_40.gemfile
107
+ - gemfiles/activerecord_41.gemfile
108
+ - gemfiles/activerecord_42.gemfile
109
+ - gemfiles/activerecord_edge.gemfile
110
+ - lib/did_you_mean.rb
111
+ - lib/did_you_mean/core_ext/name_error.rb
112
+ - lib/did_you_mean/finders.rb
113
+ - lib/did_you_mean/finders/name_error_finders.rb
114
+ - lib/did_you_mean/finders/name_error_finders/similar_class_finder.rb
115
+ - lib/did_you_mean/finders/name_error_finders/similar_name_finder.rb
116
+ - lib/did_you_mean/finders/similar_attribute_finder.rb
117
+ - lib/did_you_mean/finders/similar_method_finder.rb
118
+ - lib/did_you_mean/levenshtein.rb
119
+ - lib/did_you_mean/receiver_capturer.jar
120
+ - lib/did_you_mean/test_helper.rb
121
+ - lib/did_you_mean/version.rb
122
+ - lib/did_you_mean/word_collection.rb
123
+ - test/all_test.rb
124
+ - test/name_error_extension_test.rb
125
+ - test/no_method_error_extension_test.rb
126
+ - test/null_finder_test.rb
127
+ - test/similar_attribute_finder_test.rb
128
+ - test/similar_class_finder_test.rb
129
+ - test/similar_method_finder_test.rb
130
+ - test/similar_name_finder_test.rb
131
+ - test/test_helper.rb
132
+ homepage: https://github.com/yuki24/did_you_mean
133
+ licenses:
134
+ - MIT
135
+ metadata: {}
136
+ post_install_message:
137
+ rdoc_options: []
138
+ require_paths:
139
+ - lib
140
+ required_ruby_version: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - '>='
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ required_rubygems_version: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ requirements: []
151
+ rubyforge_project:
152
+ rubygems_version: 2.4.5
153
+ signing_key:
154
+ specification_version: 4
155
+ summary: '"Did you mean?" experience in Ruby'
156
+ test_files:
157
+ - test/all_test.rb
158
+ - test/name_error_extension_test.rb
159
+ - test/no_method_error_extension_test.rb
160
+ - test/null_finder_test.rb
161
+ - test/similar_attribute_finder_test.rb
162
+ - test/similar_class_finder_test.rb
163
+ - test/similar_method_finder_test.rb
164
+ - test/similar_name_finder_test.rb
165
+ - test/test_helper.rb