did_you_mean 0.3.1 → 0.4.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d9eea98979aeabd698ae78189646cefa0314cec5
4
- data.tar.gz: ace02ada986efdff6a6a533ae0b5d99b199fb3b5
3
+ metadata.gz: 7304160d0a724a77cd37f5c0ad3068f6469117ea
4
+ data.tar.gz: 398c18be7e4768cb7bab4a1e5c335a70d2b005dc
5
5
  SHA512:
6
- metadata.gz: 42e54d2533c9ac9d507c0490538cf3020e40f9a0fde864ebdfa7ca728549953d4527e0e7310c31fb62e7e56375d257db54c23137929b3d25e0fa80e0d87907bf
7
- data.tar.gz: cde32b820adfee6dfc0efce16a6653dab84fcb9ffc7bef07e495e44d3b9c5629bbe5bf2acd10512b40e92befded13793980b2ce1e7d2cb1cd5056953a85e1a54
6
+ metadata.gz: 0bc3de404cf9341f59d6068e9c768c6592735e7152b3c6e0698c34d73a6c2b72ea7e9c87a0b2de8b4f6bef84ea1b2eb3f5205af8e4e3d2d4ecbb3bc2824771e5
7
+ data.tar.gz: f48fc7b6ba5fbeb05f8994f0892eeeedf62b3270424e0001d9a232a03c1111bce626c77804ae3ebbc14fdc3e7c40a2f36700c6391d6701943b93d3a8f0f0ade0
data/.gitignore CHANGED
@@ -5,6 +5,7 @@
5
5
  .yardoc
6
6
  .DS_Store
7
7
  Gemfile.lock
8
+ gemfiles/*.lock
8
9
  InstalledFiles
9
10
  _yardoc
10
11
  coverage
data/.travis.yml CHANGED
@@ -1,4 +1,4 @@
1
- script: "rake test"
1
+ script: "bundle install && bundle exec rake test"
2
2
 
3
3
  rvm:
4
4
  - 1.9.3
@@ -6,3 +6,14 @@ rvm:
6
6
  - 2.1.0
7
7
  - 2.1.1
8
8
  - ruby-head
9
+
10
+ gemfile:
11
+ - gemfiles/activerecord_30.gemfile
12
+ - gemfiles/activerecord_31.gemfile
13
+ - gemfiles/activerecord_32.gemfile
14
+ - gemfiles/activerecord_40.gemfile
15
+ - gemfiles/activerecord_41.gemfile
16
+ - gemfiles/activerecord_edge.gemfile
17
+
18
+ matrix:
19
+ fast_finish: true
data/Appraisals ADDED
@@ -0,0 +1,25 @@
1
+ appraise "activerecord_30" do
2
+ gem "activerecord", "~> 3.0.0"
3
+ end
4
+
5
+ appraise "activerecord_31" do
6
+ gem "activerecord", "~> 3.1.0"
7
+ end
8
+
9
+ appraise "activerecord_32" do
10
+ gem "activerecord", "~> 3.2.0"
11
+ end
12
+
13
+ appraise "activerecord_40" do
14
+ gem "activerecord", "~> 4.0.0"
15
+ end
16
+
17
+ appraise "activerecord_41" do
18
+ gem "activerecord", "~> 4.1.0"
19
+ end
20
+
21
+ appraise "activerecord_edge" do
22
+ git 'git://github.com/rails/rails.git' do
23
+ gem 'activerecord', require: 'activerecord'
24
+ end
25
+ end
data/Rakefile CHANGED
@@ -25,3 +25,12 @@ task :test do
25
25
 
26
26
  Rake::Task['clobber'].execute
27
27
  end
28
+
29
+ namespace :test do
30
+ desc "Run tests without re-compiling extensions"
31
+ task :without_compile do
32
+ $stdout.puts("\033[33m")
33
+ sh "bundle exec ruby test/all_test.rb"
34
+ $stdout.puts("\033[0m")
35
+ end
36
+ end
data/did_you_mean.gemspec CHANGED
@@ -25,8 +25,7 @@ Gem::Specification.new do |spec|
25
25
  spec.add_development_dependency "bundler", "~> 1.5"
26
26
  spec.add_development_dependency "rake"
27
27
  spec.add_development_dependency "rake-compiler"
28
-
29
- if RUBY_VERSION == "2.2.0"
30
- spec.add_development_dependency "minitest", '< 5.0.0'
31
- end
28
+ spec.add_development_dependency "appraisal"
29
+ spec.add_development_dependency "sqlite3"
30
+ spec.add_development_dependency "minitest"
32
31
  end
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "~> 3.0.0"
6
+
7
+ gemspec :path => "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "~> 3.1.0"
6
+
7
+ gemspec :path => "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "~> 3.2.0"
6
+
7
+ gemspec :path => "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "~> 4.0.0"
6
+
7
+ gemspec :path => "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "~> 4.1.0"
6
+
7
+ gemspec :path => "../"
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ git "git://github.com/rails/rails.git" do
6
+ gem "activerecord", :require => "activerecord"
7
+ end
8
+
9
+ gemspec :path => "../"
data/lib/did_you_mean.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require "did_you_mean/version"
2
2
  require "did_you_mean/method_missing"
3
3
  require "did_you_mean/method_finder"
4
+ require "did_you_mean/strategies"
4
5
 
5
6
  require "did_you_mean/core_ext/name_error"
6
- require "did_you_mean/core_ext/no_method_error"
@@ -40,48 +40,22 @@ class NameError
40
40
  @__did_you_mean_bindings_stack || []
41
41
  end
42
42
 
43
- def to_s_with_did_you_mean
44
- original_to_s + did_you_mean?.to_s
45
- end
46
-
47
- alias original_to_s to_s
48
- alias to_s to_s_with_did_you_mean
49
- alias original_message original_to_s
50
-
51
- def did_you_mean?
52
- return if !undefined_local_variable_or_method? || (similar_methods.empty? && similar_local_variables.empty?)
53
-
54
- output = "\n\n"
55
- output << " Did you mean?\n"
56
-
57
- unless similar_methods.empty?
58
- output << " instance methods: ##{similar_methods.first}\n"
59
- output << similar_methods[1..-1].map{|word| "#{' ' * 23}##{word}\n" }.join
60
- end
61
-
62
- output << "\n" if !similar_methods.empty? && !similar_local_variables.empty?
63
-
64
- unless similar_local_variables.empty?
65
- output << " local variables: #{similar_local_variables.map.first}\n"
66
- output << similar_local_variables[1..-1].map{|word| "#{' ' * 23}##{word}\n" }.join
67
- end
68
-
69
- output
43
+ def frame_binding
44
+ @frame_binding ||= __did_you_mean_bindings_stack.first
70
45
  end
71
46
 
72
- def similar_methods
73
- @similar_methods ||= DidYouMean::MethodFinder.new(frame_binding.eval("methods"), name).similar_methods
47
+ def to_s_with_did_you_mean
48
+ original_message + did_you_mean?.to_s
74
49
  end
75
50
 
76
- def similar_local_variables
77
- @similar_local_variables ||= DidYouMean::MethodFinder.new(frame_binding.eval("local_variables"), name).similar_methods
78
- end
51
+ alias original_message to_s
52
+ alias to_s to_s_with_did_you_mean
79
53
 
80
- def undefined_local_variable_or_method?
81
- original_to_s.include?("undefined local variable or method")
54
+ def did_you_mean?
55
+ method_finder.did_you_mean? if not method_finder.empty?
82
56
  end
83
57
 
84
- def frame_binding
85
- @frame_binding ||= __did_you_mean_bindings_stack.first
58
+ def method_finder
59
+ @method_finder ||= DidYouMean.strategies[self.class.to_s].build(self)
86
60
  end
87
61
  end
@@ -1,7 +1,7 @@
1
1
  require "text"
2
2
 
3
3
  module DidYouMean
4
- class MethodFinder
4
+ class MethodMatcher
5
5
  def initialize(method_collection, target_method)
6
6
  @method_collection = method_collection.uniq
7
7
  @target_method = target_method
@@ -0,0 +1,23 @@
1
+ module DidYouMean
2
+ class NullFinder
3
+ def self.build(*)
4
+ new
5
+ end
6
+
7
+ def did_you_mean?; end
8
+
9
+ def empty?
10
+ true
11
+ end
12
+ end
13
+
14
+ @@strategies = Hash.new(NullFinder)
15
+
16
+ def self.strategies
17
+ @@strategies
18
+ end
19
+ end
20
+
21
+ require 'did_you_mean/strategies/similar_name_finder'
22
+ require 'did_you_mean/strategies/similar_method_finder'
23
+ require 'did_you_mean/strategies/similar_attribute_finder'
@@ -0,0 +1,41 @@
1
+ module DidYouMean
2
+ class SimilarAttributeFinder
3
+ attr_reader :columns, :attribute_name
4
+
5
+ def self.build(exception)
6
+ columns = exception.frame_binding.eval("self.class").columns
7
+ attribute_name = exception.original_message.gsub("unknown attribute: ", "")
8
+
9
+ new(attribute_name, columns)
10
+ end
11
+
12
+ def initialize(attribute_name, columns)
13
+ @attribute_name, @columns = attribute_name, columns
14
+ end
15
+
16
+ def did_you_mean?
17
+ return if empty?
18
+
19
+ output = "\n\n"
20
+ output << " Did you mean? #{format(similar_columns.first)}\n"
21
+ output << similar_columns[1..-1].map{|word| "#{' ' * 18}#{format(word)}\n" }.join
22
+ output
23
+ end
24
+
25
+ def empty?
26
+ similar_columns.empty?
27
+ end
28
+
29
+ def similar_columns
30
+ @similar_columns ||= MethodMatcher.new(columns.map(&:name), attribute_name).similar_methods
31
+ end
32
+
33
+ private
34
+
35
+ def format(name)
36
+ "%s: %s" % [name, columns.detect{|c| c.name == name }.type]
37
+ end
38
+ end
39
+
40
+ strategies["ActiveRecord::UnknownAttributeError"] = SimilarAttributeFinder
41
+ end
@@ -0,0 +1,46 @@
1
+ module DidYouMean
2
+ class SimilarMethodFinder
3
+ attr_reader :name, :receiver
4
+
5
+ def self.build(exception)
6
+ new(exception.name, exception.args.first)
7
+ end
8
+
9
+ def initialize(name, receiver)
10
+ @name, @receiver = name, receiver
11
+ end
12
+
13
+ def did_you_mean?
14
+ return if empty?
15
+
16
+ output = "\n\n"
17
+ output << " Did you mean? #{separator}#{similar_methods.first}\n"
18
+ output << similar_methods[1..-1].map{|word| "#{' ' * 17}#{separator}#{word}\n" }.join
19
+ output
20
+ end
21
+
22
+ def empty?
23
+ similar_methods.empty?
24
+ end
25
+
26
+ def similar_methods
27
+ @similar_methods ||= MethodMatcher.new(receiver.methods + receiver.singleton_methods, name).similar_methods
28
+ end
29
+
30
+ private
31
+
32
+ def receiver_name
33
+ class_method? ? receiver.name : receiver.class.name
34
+ end
35
+
36
+ def separator
37
+ class_method? ? "." : "#"
38
+ end
39
+
40
+ def class_method?
41
+ receiver.is_a? Class
42
+ end
43
+ end
44
+
45
+ strategies["NoMethodError"] = SimilarMethodFinder
46
+ end
@@ -0,0 +1,57 @@
1
+ module DidYouMean
2
+ class SimilarNameFinder
3
+ attr_reader :name, :_methods, :_local_variables, :original_message
4
+
5
+ def self.build(exception)
6
+ methods = exception.frame_binding.eval("methods")
7
+ local_variables = exception.frame_binding.eval("local_variables")
8
+ original_message = exception.original_message
9
+
10
+ new(exception.name, methods, local_variables, original_message)
11
+ end
12
+
13
+ def initialize(name, methods, local_variables, original_message)
14
+ @name, @_methods, @_local_variables, @original_message =
15
+ name, methods, local_variables, original_message
16
+ end
17
+
18
+ def did_you_mean?
19
+ return if empty?
20
+
21
+ output = "\n\n"
22
+ output << " Did you mean?\n"
23
+
24
+ unless similar_methods.empty?
25
+ output << " instance methods: ##{similar_methods.first}\n"
26
+ output << similar_methods[1..-1].map{|word| "#{' ' * 23}##{word}\n" }.join
27
+ end
28
+
29
+ output << "\n" if !similar_methods.empty? && !similar_local_variables.empty?
30
+
31
+ unless similar_local_variables.empty?
32
+ output << " local variables: #{similar_local_variables.map.first}\n"
33
+ output << similar_local_variables[1..-1].map{|word| "#{' ' * 23}##{word}\n" }.join
34
+ end
35
+
36
+ output
37
+ end
38
+
39
+ def empty?
40
+ !undefined_local_variable_or_method? || (similar_methods.empty? && similar_local_variables.empty?)
41
+ end
42
+
43
+ def similar_methods
44
+ @similar_methods ||= DidYouMean::MethodMatcher.new(_methods, name).similar_methods
45
+ end
46
+
47
+ def similar_local_variables
48
+ @similar_local_variables ||= DidYouMean::MethodMatcher.new(_local_variables, name).similar_methods
49
+ end
50
+
51
+ def undefined_local_variable_or_method?
52
+ original_message.include?("undefined local variable or method")
53
+ end
54
+ end
55
+
56
+ strategies["NameError"] = SimilarNameFinder
57
+ end
@@ -1,3 +1,3 @@
1
1
  module DidYouMean
2
- VERSION = "0.3.1"
2
+ VERSION = "0.4.0"
3
3
  end
data/test.sh ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env bash
2
+
3
+ for ruby_version in 1.9.3-p545 2.0.0-p451 2.1.0 2.1.1 head
4
+ do
5
+ echo -e "\e[32mTesting did_you_mean for Ruby $ruby_version\e[39m"
6
+
7
+ source ~/.rvm/environments/ruby-$ruby_version
8
+ ruby -v
9
+
10
+ bundle install
11
+ appraisal install
12
+
13
+ rake compile
14
+ appraisal rake test:without_compile
15
+ rake clobber
16
+
17
+ echo ""
18
+ done
data/test/all_test.rb CHANGED
@@ -1,2 +1,3 @@
1
- require_relative 'name_error_extension_test'
2
- require_relative 'no_method_error_extension_test'
1
+ require_relative 'similar_name_finder_test'
2
+ require_relative 'similar_method_finder_test'
3
+ require_relative 'similar_attribute_finder_test'
@@ -0,0 +1,21 @@
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_columns
11
+ assert @error.method_finder.similar_columns.include?("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
+
18
+ def test_message
19
+ assert_match @error.did_you_mean?, @error.message
20
+ end
21
+ end
@@ -1,6 +1,6 @@
1
1
  require_relative 'test_helper'
2
2
 
3
- class NoMethodErrorExtensionTest < Test::Unit::TestCase
3
+ class SimilarMethodFinderTest < Minitest::Test
4
4
  class User
5
5
  def friends; end
6
6
  def first_name; end
@@ -23,23 +23,33 @@ class NoMethodErrorExtensionTest < Test::Unit::TestCase
23
23
  user = User.new.extend(UserModule)
24
24
 
25
25
  @errors = {
26
- from_instance_method: assert_raise(NoMethodError){ user.flrst_name },
27
- from_private_method: assert_raise(NoMethodError){ user.friend },
28
- from_module_method: assert_raise(NoMethodError){ user.fr0m_module },
29
- from_class_method: assert_raise(NoMethodError){ User.l0ad }
26
+ from_instance_method: assert_raises(NoMethodError){ user.flrst_name },
27
+ from_private_method: assert_raises(NoMethodError){ user.friend },
28
+ from_module_method: assert_raises(NoMethodError){ user.fr0m_module },
29
+ from_class_method: assert_raises(NoMethodError){ User.l0ad }
30
30
  }
31
31
  end
32
32
 
33
+ def test_unknown_attribute_error_with_did_you_mean
34
+ error = assert_raises(ActiveRecord::UnknownAttributeError) do
35
+ ::User.new(flrst_name: "wrong flrst name")
36
+ end
37
+
38
+ assert error.method_finder.similar_columns.include?("first_name")
39
+ assert_match "Did you mean? first_name", error.did_you_mean?
40
+ assert_match error.did_you_mean?, error.message
41
+ end
42
+
33
43
  def test_similar_methods
34
- assert @errors[:from_instance_method].similar_methods.include?(:first_name)
35
- assert @errors[:from_private_method].similar_methods.include?(:friends)
36
- assert @errors[:from_module_method].similar_methods.include?(:from_module)
37
- assert @errors[:from_class_method].similar_methods.include?(:load)
44
+ assert @errors[:from_instance_method].method_finder.similar_methods.include?(:first_name)
45
+ assert @errors[:from_private_method].method_finder.similar_methods.include?(:friends)
46
+ assert @errors[:from_module_method].method_finder.similar_methods.include?(:from_module)
47
+ assert @errors[:from_class_method].method_finder.similar_methods.include?(:load)
38
48
  end
39
49
 
40
50
  def test_similar_methods_for_long_method_name
41
- error = assert_raise(NoMethodError){ User.new.dependents }
42
- assert error.similar_methods.include?(:descendants)
51
+ error = assert_raises(NoMethodError){ User.new.dependents }
52
+ assert error.method_finder.similar_methods.include?(:descendants)
43
53
  end
44
54
 
45
55
  def test_did_you_mean?
@@ -1,6 +1,6 @@
1
1
  require_relative 'test_helper'
2
2
 
3
- class NameErrorExtensionTest < Test::Unit::TestCase
3
+ class SimilarNameFinderTest < Minitest::Test
4
4
  class User
5
5
  def call_flrst_name; f1rst_name; end
6
6
  def call_fr0m_module; fr0m_module; end
@@ -15,8 +15,8 @@ class NameErrorExtensionTest < Test::Unit::TestCase
15
15
  user = User.new.extend(UserModule)
16
16
 
17
17
  @errors = {
18
- from_instance_method: assert_raise(NameError){ user.call_flrst_name },
19
- from_module_method: assert_raise(NameError){ user.call_fr0m_module }
18
+ from_instance_method: assert_raises(NameError){ user.call_flrst_name },
19
+ from_module_method: assert_raises(NameError){ user.call_fr0m_module }
20
20
  }
21
21
 
22
22
  begin
@@ -27,12 +27,12 @@ class NameErrorExtensionTest < Test::Unit::TestCase
27
27
  end
28
28
 
29
29
  def test_similar_methods
30
- assert @errors[:from_instance_method].similar_methods.include?(:first_name)
31
- assert @errors[:from_module_method].similar_methods.include?(:from_module)
30
+ assert @errors[:from_instance_method].method_finder.similar_methods.include?(:first_name)
31
+ assert @errors[:from_module_method].method_finder.similar_methods.include?(:from_module)
32
32
  end
33
33
 
34
34
  def test_similar_local_variables
35
- assert @instance_variable_error.similar_local_variables.include?(:user)
35
+ assert @instance_variable_error.method_finder.similar_local_variables.include?(:user)
36
36
  end
37
37
 
38
38
  def test_did_you_mean?
data/test/test_helper.rb CHANGED
@@ -1,2 +1,25 @@
1
- require 'test/unit'
1
+ require 'minitest/autorun'
2
+ require 'minitest/unit'
2
3
  require 'did_you_mean'
4
+ require 'active_record'
5
+
6
+ begin
7
+ MiniTest::Test
8
+ rescue NameError
9
+ MiniTest::Test = MiniTest::Unit::TestCase
10
+ end
11
+
12
+ # database
13
+ ActiveRecord::Base.configurations = {'test' => {adapter: 'sqlite3', database: ':memory:'}}
14
+ ActiveRecord::Base.establish_connection('test')
15
+
16
+ # models
17
+ class User < ActiveRecord::Base; end
18
+
19
+ class CreateAllTables < ActiveRecord::Migration
20
+ def self.up
21
+ create_table(:users) {|t| t.string :first_name; t.integer :last_name }
22
+ end
23
+ end
24
+ ActiveRecord::Migration.verbose = false
25
+ CreateAllTables.up
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.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuki Nishijima
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-20 00:00:00.000000000 Z
11
+ date: 2014-04-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: text
@@ -80,6 +80,48 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: appraisal
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: sqlite3
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: minitest
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
83
125
  description: It adds "did you mean?" experience on NoMethodError and NameError because
84
126
  of a typo.
85
127
  email:
@@ -91,6 +133,7 @@ extra_rdoc_files: []
91
133
  files:
92
134
  - ".gitignore"
93
135
  - ".travis.yml"
136
+ - Appraisals
94
137
  - Gemfile
95
138
  - LICENSE.txt
96
139
  - README.md
@@ -231,14 +274,25 @@ files:
231
274
  - ext/did_you_mean/ruby_headers/220/vm_insnhelper.h
232
275
  - ext/did_you_mean/ruby_headers/220/vm_opts.h
233
276
  - ext/did_you_mean/vm_method.c
277
+ - gemfiles/activerecord_30.gemfile
278
+ - gemfiles/activerecord_31.gemfile
279
+ - gemfiles/activerecord_32.gemfile
280
+ - gemfiles/activerecord_40.gemfile
281
+ - gemfiles/activerecord_41.gemfile
282
+ - gemfiles/activerecord_edge.gemfile
234
283
  - lib/did_you_mean.rb
235
284
  - lib/did_you_mean/core_ext/name_error.rb
236
- - lib/did_you_mean/core_ext/no_method_error.rb
237
285
  - lib/did_you_mean/method_finder.rb
286
+ - lib/did_you_mean/strategies.rb
287
+ - lib/did_you_mean/strategies/similar_attribute_finder.rb
288
+ - lib/did_you_mean/strategies/similar_method_finder.rb
289
+ - lib/did_you_mean/strategies/similar_name_finder.rb
238
290
  - lib/did_you_mean/version.rb
291
+ - test.sh
239
292
  - test/all_test.rb
240
- - test/name_error_extension_test.rb
241
- - test/no_method_error_extension_test.rb
293
+ - test/similar_attribute_finder_test.rb
294
+ - test/similar_method_finder_test.rb
295
+ - test/similar_name_finder_test.rb
242
296
  - test/test_helper.rb
243
297
  homepage: https://github.com/yuki24/did_you_mean
244
298
  licenses:
@@ -266,6 +320,7 @@ specification_version: 4
266
320
  summary: '"Did you mean?" experience in Ruby'
267
321
  test_files:
268
322
  - test/all_test.rb
269
- - test/name_error_extension_test.rb
270
- - test/no_method_error_extension_test.rb
323
+ - test/similar_attribute_finder_test.rb
324
+ - test/similar_method_finder_test.rb
325
+ - test/similar_name_finder_test.rb
271
326
  - test/test_helper.rb
@@ -1,29 +0,0 @@
1
- class NoMethodError
2
- def receiver
3
- args.first
4
- end
5
-
6
- def did_you_mean?
7
- return if similar_methods.empty?
8
-
9
- output = "\n\n"
10
- output << " Did you mean? #{separator}#{similar_methods.first}\n"
11
- output << similar_methods[1..-1].map{|word| "#{' ' * 17}#{separator}#{word}\n" }.join
12
- end
13
-
14
- def similar_methods
15
- @similar_methods ||= DidYouMean::MethodFinder.new(receiver.methods + receiver.singleton_methods, name).similar_methods
16
- end
17
-
18
- def receiver_name
19
- class_method? ? receiver.name : receiver.class.name
20
- end
21
-
22
- def separator
23
- class_method? ? "." : "#"
24
- end
25
-
26
- def class_method?
27
- receiver.is_a? Class
28
- end
29
- end