did_you_mean 0.5.0 → 0.9.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 +4 -4
- data/.travis.yml +12 -4
- data/Appraisals +6 -0
- data/Gemfile +14 -0
- data/README.md +69 -13
- data/Rakefile +47 -22
- data/did_you_mean.gemspec +3 -5
- data/docs/did_you_mean_example.png +0 -0
- data/ext/did_you_mean/extconf.rb +16 -11
- data/ext/did_you_mean/org/yukinishijima/ReceiverCapturer.java +58 -0
- data/ext/did_you_mean/ruby_headers/210/id.h +11 -9
- data/ext/did_you_mean/ruby_headers/210/version.h +6 -6
- data/ext/did_you_mean/ruby_headers/211/addr2line.h +21 -0
- data/ext/did_you_mean/ruby_headers/211/constant.h +36 -0
- data/ext/did_you_mean/ruby_headers/211/dln.h +51 -0
- data/ext/did_you_mean/ruby_headers/211/encdb.h +170 -0
- data/ext/did_you_mean/ruby_headers/211/eval_intern.h +260 -0
- data/ext/did_you_mean/ruby_headers/211/gc.h +101 -0
- data/ext/did_you_mean/ruby_headers/211/id.h +173 -0
- data/ext/did_you_mean/ruby_headers/211/internal.h +889 -0
- data/ext/did_you_mean/ruby_headers/211/iseq.h +136 -0
- data/ext/did_you_mean/ruby_headers/211/method.h +142 -0
- data/ext/did_you_mean/ruby_headers/211/node.h +543 -0
- data/ext/did_you_mean/ruby_headers/211/parse.h +183 -0
- data/ext/did_you_mean/ruby_headers/211/probes.h +83 -0
- data/ext/did_you_mean/ruby_headers/211/probes_helper.h +67 -0
- data/ext/did_you_mean/ruby_headers/211/regenc.h +223 -0
- data/ext/did_you_mean/ruby_headers/211/regint.h +911 -0
- data/ext/did_you_mean/ruby_headers/211/regparse.h +363 -0
- data/ext/did_you_mean/ruby_headers/211/revision.h +1 -0
- data/ext/did_you_mean/ruby_headers/211/ruby_atomic.h +170 -0
- data/ext/did_you_mean/ruby_headers/211/siphash.h +48 -0
- data/ext/did_you_mean/ruby_headers/211/thread_native.h +23 -0
- data/ext/did_you_mean/ruby_headers/211/thread_pthread.h +56 -0
- data/ext/did_you_mean/ruby_headers/211/thread_win32.h +45 -0
- data/ext/did_you_mean/ruby_headers/211/timev.h +42 -0
- data/ext/did_you_mean/ruby_headers/211/transcode_data.h +123 -0
- data/ext/did_you_mean/ruby_headers/211/transdb.h +190 -0
- data/ext/did_you_mean/ruby_headers/211/verconf.h +13 -0
- data/ext/did_you_mean/ruby_headers/211/version.h +52 -0
- data/ext/did_you_mean/ruby_headers/211/vm_core.h +1043 -0
- data/ext/did_you_mean/ruby_headers/211/vm_debug.h +37 -0
- data/ext/did_you_mean/ruby_headers/211/vm_exec.h +182 -0
- data/ext/did_you_mean/ruby_headers/211/vm_insnhelper.h +273 -0
- data/ext/did_you_mean/ruby_headers/211/vm_opts.h +56 -0
- data/ext/did_you_mean/ruby_headers/212/addr2line.h +21 -0
- data/ext/did_you_mean/ruby_headers/212/constant.h +36 -0
- data/ext/did_you_mean/ruby_headers/212/dln.h +51 -0
- data/ext/did_you_mean/ruby_headers/212/encdb.h +170 -0
- data/ext/did_you_mean/ruby_headers/212/eval_intern.h +260 -0
- data/ext/did_you_mean/ruby_headers/212/gc.h +101 -0
- data/ext/did_you_mean/ruby_headers/212/id.h +173 -0
- data/ext/did_you_mean/ruby_headers/212/internal.h +889 -0
- data/ext/did_you_mean/ruby_headers/212/iseq.h +136 -0
- data/ext/did_you_mean/ruby_headers/212/method.h +142 -0
- data/ext/did_you_mean/ruby_headers/212/node.h +543 -0
- data/ext/did_you_mean/ruby_headers/212/parse.h +183 -0
- data/ext/did_you_mean/ruby_headers/212/probes.h +83 -0
- data/ext/did_you_mean/ruby_headers/212/probes_helper.h +67 -0
- data/ext/did_you_mean/ruby_headers/212/regenc.h +223 -0
- data/ext/did_you_mean/ruby_headers/212/regint.h +911 -0
- data/ext/did_you_mean/ruby_headers/212/regparse.h +363 -0
- data/ext/did_you_mean/ruby_headers/212/revision.h +1 -0
- data/ext/did_you_mean/ruby_headers/212/ruby_atomic.h +170 -0
- data/ext/did_you_mean/ruby_headers/212/siphash.h +48 -0
- data/ext/did_you_mean/ruby_headers/212/thread_native.h +23 -0
- data/ext/did_you_mean/ruby_headers/212/thread_pthread.h +56 -0
- data/ext/did_you_mean/ruby_headers/212/thread_win32.h +45 -0
- data/ext/did_you_mean/ruby_headers/212/timev.h +42 -0
- data/ext/did_you_mean/ruby_headers/212/transcode_data.h +123 -0
- data/ext/did_you_mean/ruby_headers/212/transdb.h +190 -0
- data/ext/did_you_mean/ruby_headers/212/verconf.h +13 -0
- data/ext/did_you_mean/ruby_headers/212/version.h +52 -0
- data/ext/did_you_mean/ruby_headers/212/vm_core.h +1043 -0
- data/ext/did_you_mean/ruby_headers/212/vm_debug.h +37 -0
- data/ext/did_you_mean/ruby_headers/212/vm_exec.h +182 -0
- data/ext/did_you_mean/ruby_headers/212/vm_insnhelper.h +273 -0
- data/ext/did_you_mean/ruby_headers/212/vm_opts.h +56 -0
- data/ext/did_you_mean/ruby_headers/213/addr2line.h +21 -0
- data/ext/did_you_mean/ruby_headers/213/constant.h +36 -0
- data/ext/did_you_mean/ruby_headers/213/dln.h +51 -0
- data/ext/did_you_mean/ruby_headers/213/encdb.h +170 -0
- data/ext/did_you_mean/ruby_headers/213/eval_intern.h +270 -0
- data/ext/did_you_mean/ruby_headers/213/gc.h +101 -0
- data/ext/did_you_mean/ruby_headers/213/id.h +173 -0
- data/ext/did_you_mean/ruby_headers/213/internal.h +892 -0
- data/ext/did_you_mean/ruby_headers/213/iseq.h +136 -0
- data/ext/did_you_mean/ruby_headers/213/method.h +142 -0
- data/ext/did_you_mean/ruby_headers/213/node.h +543 -0
- data/ext/did_you_mean/ruby_headers/213/parse.h +183 -0
- data/ext/did_you_mean/ruby_headers/213/probes.h +83 -0
- data/ext/did_you_mean/ruby_headers/213/probes_helper.h +67 -0
- data/ext/did_you_mean/ruby_headers/213/regenc.h +223 -0
- data/ext/did_you_mean/ruby_headers/213/regint.h +911 -0
- data/ext/did_you_mean/ruby_headers/213/regparse.h +363 -0
- data/ext/did_you_mean/ruby_headers/213/revision.h +1 -0
- data/ext/did_you_mean/ruby_headers/213/ruby_atomic.h +170 -0
- data/ext/did_you_mean/ruby_headers/213/siphash.h +48 -0
- data/ext/did_you_mean/ruby_headers/213/thread_native.h +23 -0
- data/ext/did_you_mean/ruby_headers/213/thread_pthread.h +56 -0
- data/ext/did_you_mean/ruby_headers/213/thread_win32.h +45 -0
- data/ext/did_you_mean/ruby_headers/213/timev.h +42 -0
- data/ext/did_you_mean/ruby_headers/213/transcode_data.h +123 -0
- data/ext/did_you_mean/ruby_headers/213/transdb.h +190 -0
- data/ext/did_you_mean/ruby_headers/213/verconf.h +13 -0
- data/ext/did_you_mean/ruby_headers/213/version.h +52 -0
- data/ext/did_you_mean/ruby_headers/213/vm_core.h +1052 -0
- data/ext/did_you_mean/ruby_headers/213/vm_debug.h +37 -0
- data/ext/did_you_mean/ruby_headers/213/vm_exec.h +182 -0
- data/ext/did_you_mean/ruby_headers/213/vm_insnhelper.h +273 -0
- data/ext/did_you_mean/ruby_headers/213/vm_opts.h +56 -0
- data/ext/did_you_mean/ruby_headers/214/addr2line.h +21 -0
- data/ext/did_you_mean/ruby_headers/214/constant.h +36 -0
- data/ext/did_you_mean/ruby_headers/214/dln.h +51 -0
- data/ext/did_you_mean/ruby_headers/214/encdb.h +170 -0
- data/ext/did_you_mean/ruby_headers/214/eval_intern.h +270 -0
- data/ext/did_you_mean/ruby_headers/214/gc.h +101 -0
- data/ext/did_you_mean/ruby_headers/214/id.h +173 -0
- data/ext/did_you_mean/ruby_headers/214/internal.h +892 -0
- data/ext/did_you_mean/ruby_headers/214/iseq.h +136 -0
- data/ext/did_you_mean/ruby_headers/214/method.h +142 -0
- data/ext/did_you_mean/ruby_headers/214/node.h +543 -0
- data/ext/did_you_mean/ruby_headers/214/parse.h +183 -0
- data/ext/did_you_mean/ruby_headers/214/probes.h +83 -0
- data/ext/did_you_mean/ruby_headers/214/probes_helper.h +67 -0
- data/ext/did_you_mean/ruby_headers/214/regenc.h +223 -0
- data/ext/did_you_mean/ruby_headers/214/regint.h +911 -0
- data/ext/did_you_mean/ruby_headers/214/regparse.h +363 -0
- data/ext/did_you_mean/ruby_headers/214/revision.h +1 -0
- data/ext/did_you_mean/ruby_headers/214/ruby_atomic.h +170 -0
- data/ext/did_you_mean/ruby_headers/214/siphash.h +48 -0
- data/ext/did_you_mean/ruby_headers/214/thread_native.h +23 -0
- data/ext/did_you_mean/ruby_headers/214/thread_pthread.h +56 -0
- data/ext/did_you_mean/ruby_headers/214/thread_win32.h +45 -0
- data/ext/did_you_mean/ruby_headers/214/timev.h +42 -0
- data/ext/did_you_mean/ruby_headers/214/transcode_data.h +123 -0
- data/ext/did_you_mean/ruby_headers/214/transdb.h +190 -0
- data/ext/did_you_mean/ruby_headers/214/verconf.h +13 -0
- data/ext/did_you_mean/ruby_headers/214/version.h +52 -0
- data/ext/did_you_mean/ruby_headers/214/vm_core.h +1055 -0
- data/ext/did_you_mean/ruby_headers/214/vm_debug.h +37 -0
- data/ext/did_you_mean/ruby_headers/214/vm_exec.h +182 -0
- data/ext/did_you_mean/ruby_headers/214/vm_insnhelper.h +273 -0
- data/ext/did_you_mean/ruby_headers/214/vm_opts.h +56 -0
- data/ext/did_you_mean/ruby_headers/220/addr2line.h +1 -1
- data/ext/did_you_mean/ruby_headers/220/ccan/build_assert/build_assert.h +40 -0
- data/ext/did_you_mean/ruby_headers/220/ccan/check_type/check_type.h +63 -0
- data/ext/did_you_mean/ruby_headers/220/ccan/container_of/container_of.h +106 -0
- data/ext/did_you_mean/ruby_headers/220/ccan/licenses/BSD-MIT +17 -0
- data/ext/did_you_mean/ruby_headers/220/ccan/licenses/CC0 +28 -0
- data/ext/did_you_mean/ruby_headers/220/ccan/list/list.h +602 -0
- data/ext/did_you_mean/ruby_headers/220/ccan/str/str.h +16 -0
- data/ext/did_you_mean/ruby_headers/220/constant.h +10 -3
- data/ext/did_you_mean/ruby_headers/220/eval_intern.h +24 -5
- data/ext/did_you_mean/ruby_headers/220/gc.h +5 -0
- data/ext/did_you_mean/ruby_headers/220/id.h +11 -9
- data/ext/did_you_mean/ruby_headers/220/internal.h +116 -21
- data/ext/did_you_mean/ruby_headers/220/iseq.h +28 -7
- data/ext/did_you_mean/ruby_headers/220/method.h +0 -1
- data/ext/did_you_mean/ruby_headers/220/node.h +5 -4
- data/ext/did_you_mean/ruby_headers/220/regenc.h +18 -7
- data/ext/did_you_mean/ruby_headers/220/regint.h +72 -11
- data/ext/did_you_mean/ruby_headers/220/regparse.h +2 -2
- data/ext/did_you_mean/ruby_headers/220/ruby_atomic.h +2 -2
- data/ext/did_you_mean/ruby_headers/220/symbol.h +87 -0
- data/ext/did_you_mean/ruby_headers/220/thread_pthread.h +4 -6
- data/ext/did_you_mean/ruby_headers/220/thread_win32.h +0 -9
- data/ext/did_you_mean/ruby_headers/220/timev.h +2 -2
- data/ext/did_you_mean/ruby_headers/220/version.h +3 -3
- data/ext/did_you_mean/ruby_headers/220/vm_core.h +200 -65
- data/ext/did_you_mean/ruby_headers/220/vm_insnhelper.h +0 -40
- data/gemfiles/activerecord_30.gemfile +14 -0
- data/gemfiles/activerecord_31.gemfile +14 -0
- data/gemfiles/activerecord_32.gemfile +14 -0
- data/gemfiles/activerecord_40.gemfile +14 -0
- data/gemfiles/activerecord_41.gemfile +14 -0
- data/gemfiles/activerecord_42.gemfile +21 -0
- data/gemfiles/activerecord_edge.gemfile +16 -0
- data/lib/did_you_mean.rb +14 -4
- data/lib/did_you_mean/core_ext/name_error.rb +11 -44
- data/lib/did_you_mean/finders.rb +31 -0
- data/lib/did_you_mean/finders/name_error_finders.rb +24 -0
- data/lib/did_you_mean/finders/name_error_finders/similar_class_finder.rb +50 -0
- data/lib/did_you_mean/finders/name_error_finders/similar_name_finder.rb +61 -0
- data/lib/did_you_mean/finders/similar_attribute_finder.rb +26 -0
- data/lib/did_you_mean/finders/similar_method_finder.rb +42 -0
- data/lib/did_you_mean/levenshtein.rb +49 -0
- data/lib/did_you_mean/test_helper.rb +11 -0
- data/lib/did_you_mean/version.rb +1 -1
- data/lib/did_you_mean/word_collection.rb +27 -0
- data/test/all_test.rb +16 -2
- data/test/name_error_extension_test.rb +24 -0
- data/test/no_method_error_extension_test.rb +20 -0
- data/test/null_finder_test.rb +19 -0
- data/test/similar_attribute_finder_test.rb +2 -6
- data/test/similar_class_finder_test.rb +85 -0
- data/test/similar_method_finder_test.rb +16 -35
- data/test/similar_name_finder_test.rb +31 -23
- data/test/test_helper.rb +19 -11
- metadata +168 -45
- data/docs/better_errors_example.png +0 -0
- data/docs/irb_example.png +0 -0
- data/docs/rspec_example.png +0 -0
- data/lib/did_you_mean/method_finder.rb +0 -24
- data/lib/did_you_mean/strategies.rb +0 -23
- data/lib/did_you_mean/strategies/similar_attribute_finder.rb +0 -41
- data/lib/did_you_mean/strategies/similar_method_finder.rb +0 -46
- data/lib/did_you_mean/strategies/similar_name_finder.rb +0 -57
- data/test.sh +0 -18
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: cd9d59c048043e845d5b06679a4fdbe62acfd85d
|
|
4
|
+
data.tar.gz: 6fe293723080c17dd050e4ea0acb2febbd72a225
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0e70e7a9193f3b3961c35cc49fe5ec8a57e319277fbfd5a6947c0f4a25da79b51e673e0ad20b6e48be1a30800e94032e9e725a96a2f2c1885b2fc484fbd1b749
|
|
7
|
+
data.tar.gz: f080b95967a4180e0e8ce0ff31a546931de10ca0ee6b4dfba5627573641138c52818987d71b11888faf3676e841de40c9d86c5358499f0c7061f3dbd2b3f6c3e
|
data/.travis.yml
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
script:
|
|
1
|
+
script: bundle exec rake test
|
|
2
2
|
|
|
3
3
|
rvm:
|
|
4
4
|
- 1.9.3
|
|
5
5
|
- 2.0.0
|
|
6
|
-
- 2.1
|
|
7
|
-
- 2.
|
|
8
|
-
- 2.1.2
|
|
6
|
+
- 2.1
|
|
7
|
+
- 2.2.0-preview1
|
|
9
8
|
- ruby-head
|
|
9
|
+
- jruby
|
|
10
|
+
- rbx
|
|
10
11
|
|
|
11
12
|
gemfile:
|
|
12
13
|
- gemfiles/activerecord_30.gemfile
|
|
@@ -14,7 +15,14 @@ gemfile:
|
|
|
14
15
|
- gemfiles/activerecord_32.gemfile
|
|
15
16
|
- gemfiles/activerecord_40.gemfile
|
|
16
17
|
- gemfiles/activerecord_41.gemfile
|
|
18
|
+
- gemfiles/activerecord_42.gemfile
|
|
17
19
|
- gemfiles/activerecord_edge.gemfile
|
|
18
20
|
|
|
19
21
|
matrix:
|
|
22
|
+
allow_failures:
|
|
23
|
+
- rvm: jruby
|
|
24
|
+
gemfile: gemfiles/activerecord_42.gemfile
|
|
25
|
+
- rvm: jruby
|
|
26
|
+
gemfile: gemfiles/activerecord_edge.gemfile
|
|
27
|
+
- rvm: rbx
|
|
20
28
|
fast_finish: true
|
data/Appraisals
CHANGED
|
@@ -18,8 +18,14 @@ appraise "activerecord_41" do
|
|
|
18
18
|
gem "activerecord", "~> 4.1.0"
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
+
appraise "activerecord_42" do
|
|
22
|
+
gem "activerecord", "~> 4.2.0.beta4"
|
|
23
|
+
end
|
|
24
|
+
|
|
21
25
|
appraise "activerecord_edge" do
|
|
22
26
|
git 'git://github.com/rails/rails.git' do
|
|
23
27
|
gem 'activerecord', require: 'activerecord'
|
|
24
28
|
end
|
|
29
|
+
|
|
30
|
+
gem 'arel', :github => 'rails/arel'
|
|
25
31
|
end
|
data/Gemfile
CHANGED
|
@@ -2,3 +2,17 @@ source 'https://rubygems.org'
|
|
|
2
2
|
|
|
3
3
|
# Specify your gem's dependencies in did_you_mean.gemspec
|
|
4
4
|
gemspec
|
|
5
|
+
|
|
6
|
+
platforms :ruby do
|
|
7
|
+
gem 'sqlite3'
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
platforms :jruby do
|
|
11
|
+
gem 'activerecord-jdbcsqlite3-adapter'
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
platforms :rbx do
|
|
15
|
+
gem 'rubysl', '~> 2.0'
|
|
16
|
+
gem 'racc'
|
|
17
|
+
gem 'rubinius-developer_tools'
|
|
18
|
+
end
|
data/README.md
CHANGED
|
@@ -1,32 +1,88 @@
|
|
|
1
|
-
#
|
|
1
|
+
# did_you_mean [](https://rubygems.org/gems/did_you_mean) [](https://travis-ci.org/yuki24/did_you_mean)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
'Did you mean?' experience in Ruby. No, Really.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
Add this line to your application's Gemfile:
|
|
8
|
+
|
|
9
|
+
```ruby
|
|
10
|
+
gem 'did_you_mean', group: [:development, :test]
|
|
11
|
+
```
|
|
4
12
|
|
|
5
13
|
## Examples
|
|
6
14
|
|
|
7
|
-
|
|
15
|
+
### NameError
|
|
8
16
|
|
|
9
|
-
|
|
17
|
+
#### Correcting a Misspelled Method Name
|
|
10
18
|
|
|
11
|
-
|
|
19
|
+
```ruby
|
|
20
|
+
class User
|
|
21
|
+
attr_accessor :first_name, :last_name
|
|
12
22
|
|
|
13
|
-
|
|
23
|
+
def to_s
|
|
24
|
+
"#{f1rst_name} #{last_name}" # f1rst_name ???
|
|
25
|
+
end
|
|
26
|
+
end
|
|
14
27
|
|
|
15
|
-
|
|
28
|
+
user.to_s
|
|
29
|
+
# => NameError: undefined local variable or method `f1rst_name' for #<User:0x0000000928fad8>
|
|
30
|
+
#
|
|
31
|
+
# Did you mean? #first_name
|
|
32
|
+
#
|
|
33
|
+
```
|
|
16
34
|
|
|
17
|
-
|
|
35
|
+
#### Correcting a Misspelled Class Name
|
|
18
36
|
|
|
19
|
-
|
|
37
|
+
```ruby
|
|
38
|
+
class Book
|
|
39
|
+
class TableOfContents
|
|
40
|
+
# ...
|
|
41
|
+
end
|
|
42
|
+
end
|
|
20
43
|
|
|
21
|
-
|
|
44
|
+
Book::TableofContents # TableofContents ???
|
|
45
|
+
# => NameError: uninitialized constant Book::TableofContents
|
|
46
|
+
#
|
|
47
|
+
# Did you mean? Book::TableOfContents
|
|
48
|
+
#
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### NoMethodError
|
|
22
52
|
|
|
53
|
+
```ruby
|
|
54
|
+
# In a Rails controller:
|
|
55
|
+
params.with_inddiferent_access
|
|
56
|
+
# => NoMethodError: undefined method `with_inddiferent_access' for {}:Hash
|
|
57
|
+
#
|
|
58
|
+
# Did you mean? #with_indifferent_access
|
|
59
|
+
#
|
|
23
60
|
```
|
|
24
|
-
|
|
61
|
+
|
|
62
|
+
### ActiveRecord::UnknownAttributeError
|
|
63
|
+
|
|
64
|
+
```ruby
|
|
65
|
+
User.new(nmee: "wrong flrst name")
|
|
66
|
+
# => ActiveRecord::UnknownAttributeError: unknown attribute: nmee
|
|
67
|
+
#
|
|
68
|
+
# Did you mean? name: string
|
|
69
|
+
#
|
|
25
70
|
```
|
|
26
71
|
|
|
27
|
-
|
|
72
|
+
## 'Did You Mean' Experience is Everywhere
|
|
73
|
+
|
|
74
|
+
_did\_you\_mean_ gem automagically puts method suggestions into the error message. This means you'll have the "Did you mean?" experience almost everywhere:
|
|
75
|
+
|
|
76
|
+

|
|
77
|
+
|
|
78
|
+
## Support
|
|
79
|
+
|
|
80
|
+
_did\_you\_mean_ gem supports the following implementations:
|
|
81
|
+
|
|
82
|
+
* MRI 1.9.3, 2.0.0, 2.1.x, 2.2.0-preview1 and ruby-head
|
|
83
|
+
* JRuby (tested against 1.7.16)
|
|
28
84
|
|
|
29
|
-
|
|
85
|
+
Any other implementations are **NOT** supported (Rubinius support is work in progress).
|
|
30
86
|
|
|
31
87
|
## Contributing
|
|
32
88
|
|
data/Rakefile
CHANGED
|
@@ -1,34 +1,59 @@
|
|
|
1
|
-
require
|
|
1
|
+
require 'bundler/gem_tasks'
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
def mri?
|
|
4
|
+
defined?(RUBY_ENGINE) && RUBY_ENGINE == "ruby"
|
|
5
|
+
end
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
ext.lib_dir = "lib/did_you_mean"
|
|
9
|
-
end
|
|
10
|
-
rescue LoadError
|
|
11
|
-
abort "This Rakefile requires rake-compiler (gem install rake-compiler)"
|
|
7
|
+
def jruby?
|
|
8
|
+
defined?(JRuby)
|
|
12
9
|
end
|
|
13
10
|
|
|
14
11
|
desc "run tests"
|
|
15
|
-
task :
|
|
12
|
+
task default: [:test]
|
|
16
13
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
Rake::Task['compile'].invoke
|
|
14
|
+
if mri? || jruby?
|
|
15
|
+
if mri?
|
|
16
|
+
require 'rake/extensiontask'
|
|
21
17
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
18
|
+
Rake::ExtensionTask.new('did_you_mean') do |ext|
|
|
19
|
+
ext.name = "method_missing"
|
|
20
|
+
ext.lib_dir = "lib/did_you_mean"
|
|
21
|
+
end
|
|
22
|
+
elsif jruby?
|
|
23
|
+
require 'rake/javaextensiontask'
|
|
25
24
|
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
Rake::JavaExtensionTask.new('did_you_mean') do |ext|
|
|
26
|
+
ext.name = "receiver_capturer"
|
|
27
|
+
ext.lib_dir = "lib/did_you_mean"
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
desc "Run tests"
|
|
32
|
+
task :test do
|
|
33
|
+
Rake::Task['compile'].reenable
|
|
34
|
+
Rake::Task['compile'].invoke
|
|
28
35
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
36
|
+
begin
|
|
37
|
+
$stdout.puts("\033[33m")
|
|
38
|
+
sh "bundle exec ruby test/all_test.rb"
|
|
39
|
+
ensure
|
|
40
|
+
$stdout.puts("\033[0m")
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
Rake::Task['clobber'].execute
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
namespace :test do
|
|
47
|
+
desc "Run tests without re-compiling extensions"
|
|
48
|
+
task :without_compile do
|
|
49
|
+
$stdout.puts("\033[33m")
|
|
50
|
+
sh "bundle exec ruby test/all_test.rb"
|
|
51
|
+
$stdout.puts("\033[0m")
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
else # for Rubinius
|
|
55
|
+
desc "Run tests"
|
|
56
|
+
task :test do
|
|
32
57
|
$stdout.puts("\033[33m")
|
|
33
58
|
sh "bundle exec ruby test/all_test.rb"
|
|
34
59
|
$stdout.puts("\033[0m")
|
data/did_you_mean.gemspec
CHANGED
|
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
|
|
|
9
9
|
spec.authors = ["Yuki Nishijima"]
|
|
10
10
|
spec.email = ["mail@yukinishijima.net"]
|
|
11
11
|
spec.summary = '"Did you mean?" experience in Ruby'
|
|
12
|
-
spec.description = '
|
|
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
15
|
|
|
@@ -19,13 +19,11 @@ Gem::Specification.new do |spec|
|
|
|
19
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
20
20
|
spec.require_paths = ["lib"]
|
|
21
21
|
|
|
22
|
-
spec.add_dependency "
|
|
23
|
-
spec.add_dependency "binding_of_caller"
|
|
22
|
+
spec.add_dependency "interception"
|
|
24
23
|
|
|
25
24
|
spec.add_development_dependency "bundler", "~> 1.5"
|
|
26
25
|
spec.add_development_dependency "rake"
|
|
27
26
|
spec.add_development_dependency "rake-compiler"
|
|
28
|
-
spec.add_development_dependency "appraisal"
|
|
29
|
-
spec.add_development_dependency "sqlite3"
|
|
30
27
|
spec.add_development_dependency "minitest"
|
|
28
|
+
spec.add_development_dependency "mail"
|
|
31
29
|
end
|
|
Binary file
|
data/ext/did_you_mean/extconf.rb
CHANGED
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
require 'mkmf'
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
abs_ruby_header_path = File.join(File.dirname(File.realpath(__FILE__)), "ruby_headers")
|
|
3
|
+
LATEST_RUBY_VERSION = "2.1.4"
|
|
4
|
+
RUBY_TRUNK_VERSION = "2.2.0"
|
|
6
5
|
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
version =
|
|
7
|
+
case RUBY_VERSION
|
|
8
|
+
when /1.9.3/, /2.0.0/
|
|
9
|
+
RUBY_VERSION
|
|
10
|
+
when /^2.1.\d/, /^2.2.\d/
|
|
11
|
+
if LATEST_RUBY_VERSION < RUBY_VERSION && RUBY_VERSION < RUBY_TRUNK_VERSION
|
|
12
|
+
LATEST_RUBY_VERSION
|
|
13
|
+
else
|
|
14
|
+
RUBY_VERSION
|
|
15
|
+
end
|
|
9
16
|
else
|
|
10
|
-
|
|
11
|
-
end
|
|
17
|
+
raise "Sorry, but did_you_mean #{DidYouMean::VERSION} doesn't work with Ruby #{RUBY_VERSION}."
|
|
18
|
+
end.tr(".", "")
|
|
12
19
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
raise "Sorry, but did_you_mean #{DidYouMean::VERSION} doesn't work with Ruby #{RUBY_VERSION}."
|
|
16
|
-
end
|
|
20
|
+
ruby_header_path = File.join(File.dirname(File.realpath(__FILE__)), "ruby_headers")
|
|
21
|
+
$CFLAGS += " -I#{ruby_header_path}/#{version}"
|
|
17
22
|
|
|
18
23
|
create_makefile 'did_you_mean/method_missing'
|
|
@@ -0,0 +1,58 @@
|
|
|
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
|
+
RubyArray array = (RubyArray) noMethodError.args();
|
|
55
|
+
array.append(self);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -14,18 +14,20 @@
|
|
|
14
14
|
#define RUBY_ID_H
|
|
15
15
|
|
|
16
16
|
enum ruby_id_types {
|
|
17
|
+
RUBY_ID_STATIC_SYM = 0x01,
|
|
17
18
|
RUBY_ID_LOCAL = 0x00,
|
|
18
|
-
RUBY_ID_INSTANCE = 0x01,
|
|
19
|
-
RUBY_ID_GLOBAL = 0x03,
|
|
20
|
-
RUBY_ID_ATTRSET = 0x04,
|
|
21
|
-
RUBY_ID_CONST = 0x05,
|
|
22
|
-
RUBY_ID_CLASS = 0x06,
|
|
23
|
-
RUBY_ID_JUNK = 0x07,
|
|
19
|
+
RUBY_ID_INSTANCE = (0x01<<1),
|
|
20
|
+
RUBY_ID_GLOBAL = (0x03<<1),
|
|
21
|
+
RUBY_ID_ATTRSET = (0x04<<1),
|
|
22
|
+
RUBY_ID_CONST = (0x05<<1),
|
|
23
|
+
RUBY_ID_CLASS = (0x06<<1),
|
|
24
|
+
RUBY_ID_JUNK = (0x07<<1),
|
|
24
25
|
RUBY_ID_INTERNAL = RUBY_ID_JUNK,
|
|
25
|
-
RUBY_ID_SCOPE_SHIFT =
|
|
26
|
-
RUBY_ID_SCOPE_MASK = ~(~0U<<RUBY_ID_SCOPE_SHIFT)
|
|
26
|
+
RUBY_ID_SCOPE_SHIFT = 4,
|
|
27
|
+
RUBY_ID_SCOPE_MASK = (~(~0U<<(RUBY_ID_SCOPE_SHIFT-1))<<1)
|
|
27
28
|
};
|
|
28
29
|
|
|
30
|
+
#define ID_STATIC_SYM RUBY_ID_STATIC_SYM
|
|
29
31
|
#define ID_SCOPE_SHIFT RUBY_ID_SCOPE_SHIFT
|
|
30
32
|
#define ID_SCOPE_MASK RUBY_ID_SCOPE_MASK
|
|
31
33
|
#define ID_LOCAL RUBY_ID_LOCAL
|
|
@@ -136,7 +138,7 @@ enum ruby_method_ids {
|
|
|
136
138
|
tInitialize_clone,
|
|
137
139
|
tInitialize_dup,
|
|
138
140
|
tUScore,
|
|
139
|
-
#define TOKEN2LOCALID(n) id##n = ((t##n<<ID_SCOPE_SHIFT)|ID_LOCAL)
|
|
141
|
+
#define TOKEN2LOCALID(n) id##n = ((t##n<<ID_SCOPE_SHIFT)|ID_LOCAL|ID_STATIC_SYM)
|
|
140
142
|
TOKEN2LOCALID(Freeze),
|
|
141
143
|
TOKEN2LOCALID(Inspect),
|
|
142
144
|
TOKEN2LOCALID(Intern),
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
#define RUBY_VERSION "2.1.
|
|
2
|
-
#define RUBY_RELEASE_DATE "
|
|
3
|
-
#define RUBY_PATCHLEVEL
|
|
1
|
+
#define RUBY_VERSION "2.1.0"
|
|
2
|
+
#define RUBY_RELEASE_DATE "2013-12-25"
|
|
3
|
+
#define RUBY_PATCHLEVEL 0
|
|
4
4
|
|
|
5
|
-
#define RUBY_RELEASE_YEAR
|
|
6
|
-
#define RUBY_RELEASE_MONTH
|
|
7
|
-
#define RUBY_RELEASE_DAY
|
|
5
|
+
#define RUBY_RELEASE_YEAR 2013
|
|
6
|
+
#define RUBY_RELEASE_MONTH 12
|
|
7
|
+
#define RUBY_RELEASE_DAY 25
|
|
8
8
|
|
|
9
9
|
#include "ruby/version.h"
|
|
10
10
|
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**********************************************************************
|
|
2
|
+
|
|
3
|
+
addr2line.h -
|
|
4
|
+
|
|
5
|
+
$Author$
|
|
6
|
+
|
|
7
|
+
Copyright (C) 2010 Shinichiro Hamaji
|
|
8
|
+
|
|
9
|
+
**********************************************************************/
|
|
10
|
+
|
|
11
|
+
#ifndef RUBY_ADDR2LINE_H
|
|
12
|
+
#define RUBY_ADDR2LINE_H
|
|
13
|
+
|
|
14
|
+
#ifdef USE_ELF
|
|
15
|
+
|
|
16
|
+
void
|
|
17
|
+
rb_dump_backtrace_with_lines(int num_traces, void **traces, char **syms);
|
|
18
|
+
|
|
19
|
+
#endif /* USE_ELF */
|
|
20
|
+
|
|
21
|
+
#endif /* RUBY_ADDR2LINE_H */
|