did_you_mean 0.5.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (209) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +12 -4
  3. data/Appraisals +6 -0
  4. data/Gemfile +14 -0
  5. data/README.md +69 -13
  6. data/Rakefile +47 -22
  7. data/did_you_mean.gemspec +3 -5
  8. data/docs/did_you_mean_example.png +0 -0
  9. data/ext/did_you_mean/extconf.rb +16 -11
  10. data/ext/did_you_mean/org/yukinishijima/ReceiverCapturer.java +58 -0
  11. data/ext/did_you_mean/ruby_headers/210/id.h +11 -9
  12. data/ext/did_you_mean/ruby_headers/210/version.h +6 -6
  13. data/ext/did_you_mean/ruby_headers/211/addr2line.h +21 -0
  14. data/ext/did_you_mean/ruby_headers/211/constant.h +36 -0
  15. data/ext/did_you_mean/ruby_headers/211/dln.h +51 -0
  16. data/ext/did_you_mean/ruby_headers/211/encdb.h +170 -0
  17. data/ext/did_you_mean/ruby_headers/211/eval_intern.h +260 -0
  18. data/ext/did_you_mean/ruby_headers/211/gc.h +101 -0
  19. data/ext/did_you_mean/ruby_headers/211/id.h +173 -0
  20. data/ext/did_you_mean/ruby_headers/211/internal.h +889 -0
  21. data/ext/did_you_mean/ruby_headers/211/iseq.h +136 -0
  22. data/ext/did_you_mean/ruby_headers/211/method.h +142 -0
  23. data/ext/did_you_mean/ruby_headers/211/node.h +543 -0
  24. data/ext/did_you_mean/ruby_headers/211/parse.h +183 -0
  25. data/ext/did_you_mean/ruby_headers/211/probes.h +83 -0
  26. data/ext/did_you_mean/ruby_headers/211/probes_helper.h +67 -0
  27. data/ext/did_you_mean/ruby_headers/211/regenc.h +223 -0
  28. data/ext/did_you_mean/ruby_headers/211/regint.h +911 -0
  29. data/ext/did_you_mean/ruby_headers/211/regparse.h +363 -0
  30. data/ext/did_you_mean/ruby_headers/211/revision.h +1 -0
  31. data/ext/did_you_mean/ruby_headers/211/ruby_atomic.h +170 -0
  32. data/ext/did_you_mean/ruby_headers/211/siphash.h +48 -0
  33. data/ext/did_you_mean/ruby_headers/211/thread_native.h +23 -0
  34. data/ext/did_you_mean/ruby_headers/211/thread_pthread.h +56 -0
  35. data/ext/did_you_mean/ruby_headers/211/thread_win32.h +45 -0
  36. data/ext/did_you_mean/ruby_headers/211/timev.h +42 -0
  37. data/ext/did_you_mean/ruby_headers/211/transcode_data.h +123 -0
  38. data/ext/did_you_mean/ruby_headers/211/transdb.h +190 -0
  39. data/ext/did_you_mean/ruby_headers/211/verconf.h +13 -0
  40. data/ext/did_you_mean/ruby_headers/211/version.h +52 -0
  41. data/ext/did_you_mean/ruby_headers/211/vm_core.h +1043 -0
  42. data/ext/did_you_mean/ruby_headers/211/vm_debug.h +37 -0
  43. data/ext/did_you_mean/ruby_headers/211/vm_exec.h +182 -0
  44. data/ext/did_you_mean/ruby_headers/211/vm_insnhelper.h +273 -0
  45. data/ext/did_you_mean/ruby_headers/211/vm_opts.h +56 -0
  46. data/ext/did_you_mean/ruby_headers/212/addr2line.h +21 -0
  47. data/ext/did_you_mean/ruby_headers/212/constant.h +36 -0
  48. data/ext/did_you_mean/ruby_headers/212/dln.h +51 -0
  49. data/ext/did_you_mean/ruby_headers/212/encdb.h +170 -0
  50. data/ext/did_you_mean/ruby_headers/212/eval_intern.h +260 -0
  51. data/ext/did_you_mean/ruby_headers/212/gc.h +101 -0
  52. data/ext/did_you_mean/ruby_headers/212/id.h +173 -0
  53. data/ext/did_you_mean/ruby_headers/212/internal.h +889 -0
  54. data/ext/did_you_mean/ruby_headers/212/iseq.h +136 -0
  55. data/ext/did_you_mean/ruby_headers/212/method.h +142 -0
  56. data/ext/did_you_mean/ruby_headers/212/node.h +543 -0
  57. data/ext/did_you_mean/ruby_headers/212/parse.h +183 -0
  58. data/ext/did_you_mean/ruby_headers/212/probes.h +83 -0
  59. data/ext/did_you_mean/ruby_headers/212/probes_helper.h +67 -0
  60. data/ext/did_you_mean/ruby_headers/212/regenc.h +223 -0
  61. data/ext/did_you_mean/ruby_headers/212/regint.h +911 -0
  62. data/ext/did_you_mean/ruby_headers/212/regparse.h +363 -0
  63. data/ext/did_you_mean/ruby_headers/212/revision.h +1 -0
  64. data/ext/did_you_mean/ruby_headers/212/ruby_atomic.h +170 -0
  65. data/ext/did_you_mean/ruby_headers/212/siphash.h +48 -0
  66. data/ext/did_you_mean/ruby_headers/212/thread_native.h +23 -0
  67. data/ext/did_you_mean/ruby_headers/212/thread_pthread.h +56 -0
  68. data/ext/did_you_mean/ruby_headers/212/thread_win32.h +45 -0
  69. data/ext/did_you_mean/ruby_headers/212/timev.h +42 -0
  70. data/ext/did_you_mean/ruby_headers/212/transcode_data.h +123 -0
  71. data/ext/did_you_mean/ruby_headers/212/transdb.h +190 -0
  72. data/ext/did_you_mean/ruby_headers/212/verconf.h +13 -0
  73. data/ext/did_you_mean/ruby_headers/212/version.h +52 -0
  74. data/ext/did_you_mean/ruby_headers/212/vm_core.h +1043 -0
  75. data/ext/did_you_mean/ruby_headers/212/vm_debug.h +37 -0
  76. data/ext/did_you_mean/ruby_headers/212/vm_exec.h +182 -0
  77. data/ext/did_you_mean/ruby_headers/212/vm_insnhelper.h +273 -0
  78. data/ext/did_you_mean/ruby_headers/212/vm_opts.h +56 -0
  79. data/ext/did_you_mean/ruby_headers/213/addr2line.h +21 -0
  80. data/ext/did_you_mean/ruby_headers/213/constant.h +36 -0
  81. data/ext/did_you_mean/ruby_headers/213/dln.h +51 -0
  82. data/ext/did_you_mean/ruby_headers/213/encdb.h +170 -0
  83. data/ext/did_you_mean/ruby_headers/213/eval_intern.h +270 -0
  84. data/ext/did_you_mean/ruby_headers/213/gc.h +101 -0
  85. data/ext/did_you_mean/ruby_headers/213/id.h +173 -0
  86. data/ext/did_you_mean/ruby_headers/213/internal.h +892 -0
  87. data/ext/did_you_mean/ruby_headers/213/iseq.h +136 -0
  88. data/ext/did_you_mean/ruby_headers/213/method.h +142 -0
  89. data/ext/did_you_mean/ruby_headers/213/node.h +543 -0
  90. data/ext/did_you_mean/ruby_headers/213/parse.h +183 -0
  91. data/ext/did_you_mean/ruby_headers/213/probes.h +83 -0
  92. data/ext/did_you_mean/ruby_headers/213/probes_helper.h +67 -0
  93. data/ext/did_you_mean/ruby_headers/213/regenc.h +223 -0
  94. data/ext/did_you_mean/ruby_headers/213/regint.h +911 -0
  95. data/ext/did_you_mean/ruby_headers/213/regparse.h +363 -0
  96. data/ext/did_you_mean/ruby_headers/213/revision.h +1 -0
  97. data/ext/did_you_mean/ruby_headers/213/ruby_atomic.h +170 -0
  98. data/ext/did_you_mean/ruby_headers/213/siphash.h +48 -0
  99. data/ext/did_you_mean/ruby_headers/213/thread_native.h +23 -0
  100. data/ext/did_you_mean/ruby_headers/213/thread_pthread.h +56 -0
  101. data/ext/did_you_mean/ruby_headers/213/thread_win32.h +45 -0
  102. data/ext/did_you_mean/ruby_headers/213/timev.h +42 -0
  103. data/ext/did_you_mean/ruby_headers/213/transcode_data.h +123 -0
  104. data/ext/did_you_mean/ruby_headers/213/transdb.h +190 -0
  105. data/ext/did_you_mean/ruby_headers/213/verconf.h +13 -0
  106. data/ext/did_you_mean/ruby_headers/213/version.h +52 -0
  107. data/ext/did_you_mean/ruby_headers/213/vm_core.h +1052 -0
  108. data/ext/did_you_mean/ruby_headers/213/vm_debug.h +37 -0
  109. data/ext/did_you_mean/ruby_headers/213/vm_exec.h +182 -0
  110. data/ext/did_you_mean/ruby_headers/213/vm_insnhelper.h +273 -0
  111. data/ext/did_you_mean/ruby_headers/213/vm_opts.h +56 -0
  112. data/ext/did_you_mean/ruby_headers/214/addr2line.h +21 -0
  113. data/ext/did_you_mean/ruby_headers/214/constant.h +36 -0
  114. data/ext/did_you_mean/ruby_headers/214/dln.h +51 -0
  115. data/ext/did_you_mean/ruby_headers/214/encdb.h +170 -0
  116. data/ext/did_you_mean/ruby_headers/214/eval_intern.h +270 -0
  117. data/ext/did_you_mean/ruby_headers/214/gc.h +101 -0
  118. data/ext/did_you_mean/ruby_headers/214/id.h +173 -0
  119. data/ext/did_you_mean/ruby_headers/214/internal.h +892 -0
  120. data/ext/did_you_mean/ruby_headers/214/iseq.h +136 -0
  121. data/ext/did_you_mean/ruby_headers/214/method.h +142 -0
  122. data/ext/did_you_mean/ruby_headers/214/node.h +543 -0
  123. data/ext/did_you_mean/ruby_headers/214/parse.h +183 -0
  124. data/ext/did_you_mean/ruby_headers/214/probes.h +83 -0
  125. data/ext/did_you_mean/ruby_headers/214/probes_helper.h +67 -0
  126. data/ext/did_you_mean/ruby_headers/214/regenc.h +223 -0
  127. data/ext/did_you_mean/ruby_headers/214/regint.h +911 -0
  128. data/ext/did_you_mean/ruby_headers/214/regparse.h +363 -0
  129. data/ext/did_you_mean/ruby_headers/214/revision.h +1 -0
  130. data/ext/did_you_mean/ruby_headers/214/ruby_atomic.h +170 -0
  131. data/ext/did_you_mean/ruby_headers/214/siphash.h +48 -0
  132. data/ext/did_you_mean/ruby_headers/214/thread_native.h +23 -0
  133. data/ext/did_you_mean/ruby_headers/214/thread_pthread.h +56 -0
  134. data/ext/did_you_mean/ruby_headers/214/thread_win32.h +45 -0
  135. data/ext/did_you_mean/ruby_headers/214/timev.h +42 -0
  136. data/ext/did_you_mean/ruby_headers/214/transcode_data.h +123 -0
  137. data/ext/did_you_mean/ruby_headers/214/transdb.h +190 -0
  138. data/ext/did_you_mean/ruby_headers/214/verconf.h +13 -0
  139. data/ext/did_you_mean/ruby_headers/214/version.h +52 -0
  140. data/ext/did_you_mean/ruby_headers/214/vm_core.h +1055 -0
  141. data/ext/did_you_mean/ruby_headers/214/vm_debug.h +37 -0
  142. data/ext/did_you_mean/ruby_headers/214/vm_exec.h +182 -0
  143. data/ext/did_you_mean/ruby_headers/214/vm_insnhelper.h +273 -0
  144. data/ext/did_you_mean/ruby_headers/214/vm_opts.h +56 -0
  145. data/ext/did_you_mean/ruby_headers/220/addr2line.h +1 -1
  146. data/ext/did_you_mean/ruby_headers/220/ccan/build_assert/build_assert.h +40 -0
  147. data/ext/did_you_mean/ruby_headers/220/ccan/check_type/check_type.h +63 -0
  148. data/ext/did_you_mean/ruby_headers/220/ccan/container_of/container_of.h +106 -0
  149. data/ext/did_you_mean/ruby_headers/220/ccan/licenses/BSD-MIT +17 -0
  150. data/ext/did_you_mean/ruby_headers/220/ccan/licenses/CC0 +28 -0
  151. data/ext/did_you_mean/ruby_headers/220/ccan/list/list.h +602 -0
  152. data/ext/did_you_mean/ruby_headers/220/ccan/str/str.h +16 -0
  153. data/ext/did_you_mean/ruby_headers/220/constant.h +10 -3
  154. data/ext/did_you_mean/ruby_headers/220/eval_intern.h +24 -5
  155. data/ext/did_you_mean/ruby_headers/220/gc.h +5 -0
  156. data/ext/did_you_mean/ruby_headers/220/id.h +11 -9
  157. data/ext/did_you_mean/ruby_headers/220/internal.h +116 -21
  158. data/ext/did_you_mean/ruby_headers/220/iseq.h +28 -7
  159. data/ext/did_you_mean/ruby_headers/220/method.h +0 -1
  160. data/ext/did_you_mean/ruby_headers/220/node.h +5 -4
  161. data/ext/did_you_mean/ruby_headers/220/regenc.h +18 -7
  162. data/ext/did_you_mean/ruby_headers/220/regint.h +72 -11
  163. data/ext/did_you_mean/ruby_headers/220/regparse.h +2 -2
  164. data/ext/did_you_mean/ruby_headers/220/ruby_atomic.h +2 -2
  165. data/ext/did_you_mean/ruby_headers/220/symbol.h +87 -0
  166. data/ext/did_you_mean/ruby_headers/220/thread_pthread.h +4 -6
  167. data/ext/did_you_mean/ruby_headers/220/thread_win32.h +0 -9
  168. data/ext/did_you_mean/ruby_headers/220/timev.h +2 -2
  169. data/ext/did_you_mean/ruby_headers/220/version.h +3 -3
  170. data/ext/did_you_mean/ruby_headers/220/vm_core.h +200 -65
  171. data/ext/did_you_mean/ruby_headers/220/vm_insnhelper.h +0 -40
  172. data/gemfiles/activerecord_30.gemfile +14 -0
  173. data/gemfiles/activerecord_31.gemfile +14 -0
  174. data/gemfiles/activerecord_32.gemfile +14 -0
  175. data/gemfiles/activerecord_40.gemfile +14 -0
  176. data/gemfiles/activerecord_41.gemfile +14 -0
  177. data/gemfiles/activerecord_42.gemfile +21 -0
  178. data/gemfiles/activerecord_edge.gemfile +16 -0
  179. data/lib/did_you_mean.rb +14 -4
  180. data/lib/did_you_mean/core_ext/name_error.rb +11 -44
  181. data/lib/did_you_mean/finders.rb +31 -0
  182. data/lib/did_you_mean/finders/name_error_finders.rb +24 -0
  183. data/lib/did_you_mean/finders/name_error_finders/similar_class_finder.rb +50 -0
  184. data/lib/did_you_mean/finders/name_error_finders/similar_name_finder.rb +61 -0
  185. data/lib/did_you_mean/finders/similar_attribute_finder.rb +26 -0
  186. data/lib/did_you_mean/finders/similar_method_finder.rb +42 -0
  187. data/lib/did_you_mean/levenshtein.rb +49 -0
  188. data/lib/did_you_mean/test_helper.rb +11 -0
  189. data/lib/did_you_mean/version.rb +1 -1
  190. data/lib/did_you_mean/word_collection.rb +27 -0
  191. data/test/all_test.rb +16 -2
  192. data/test/name_error_extension_test.rb +24 -0
  193. data/test/no_method_error_extension_test.rb +20 -0
  194. data/test/null_finder_test.rb +19 -0
  195. data/test/similar_attribute_finder_test.rb +2 -6
  196. data/test/similar_class_finder_test.rb +85 -0
  197. data/test/similar_method_finder_test.rb +16 -35
  198. data/test/similar_name_finder_test.rb +31 -23
  199. data/test/test_helper.rb +19 -11
  200. metadata +168 -45
  201. data/docs/better_errors_example.png +0 -0
  202. data/docs/irb_example.png +0 -0
  203. data/docs/rspec_example.png +0 -0
  204. data/lib/did_you_mean/method_finder.rb +0 -24
  205. data/lib/did_you_mean/strategies.rb +0 -23
  206. data/lib/did_you_mean/strategies/similar_attribute_finder.rb +0 -41
  207. data/lib/did_you_mean/strategies/similar_method_finder.rb +0 -46
  208. data/lib/did_you_mean/strategies/similar_name_finder.rb +0 -57
  209. data/test.sh +0 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d961ee3cd423185852392b303ed54736ca80bebb
4
- data.tar.gz: e23a7b7aba833e604c58a63ddfc75f1bbbf7aee3
3
+ metadata.gz: cd9d59c048043e845d5b06679a4fdbe62acfd85d
4
+ data.tar.gz: 6fe293723080c17dd050e4ea0acb2febbd72a225
5
5
  SHA512:
6
- metadata.gz: cecbf896dc1ae321a3abe9c1accb93b9ba9aedc99f5cdaa5e62cd41ee3aecbbd1d45a5372265c4ebb0ade15ab01de34176453e085b0e9e4b9bfd90108d28ad86
7
- data.tar.gz: e213f5af08467359cefef1b6bc06416b770824251d17385990494cabe2068ec4326368aa21ed61a0dbe3d0481d36891ebba6b0abbf5370087ba98e91ca0a497b
6
+ metadata.gz: 0e70e7a9193f3b3961c35cc49fe5ec8a57e319277fbfd5a6947c0f4a25da79b51e673e0ad20b6e48be1a30800e94032e9e725a96a2f2c1885b2fc484fbd1b749
7
+ data.tar.gz: f080b95967a4180e0e8ce0ff31a546931de10ca0ee6b4dfba5627573641138c52818987d71b11888faf3676e841de40c9d86c5358499f0c7061f3dbd2b3f6c3e
@@ -1,12 +1,13 @@
1
- script: "bundle install && bundle exec rake test"
1
+ script: bundle exec rake test
2
2
 
3
3
  rvm:
4
4
  - 1.9.3
5
5
  - 2.0.0
6
- - 2.1.0
7
- - 2.1.1
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
- # Did You Mean!?? [![Build Status](https://travis-ci.org/yuki24/did_you_mean.png?branch=master)](https://travis-ci.org/yuki24/did_you_mean)
1
+ # did_you_mean [![Gem Version](https://badge.fury.io/rb/did_you_mean.svg)](https://rubygems.org/gems/did_you_mean) [![Build Status](https://travis-ci.org/yuki24/did_you_mean.svg?branch=master)](https://travis-ci.org/yuki24/did_you_mean)
2
2
 
3
- Google tells you the right keyword if you made a typo. This gem gives similar experience when you get `NoMethodError` or `NameError` in Ruby.
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
- On irb:
15
+ ### NameError
8
16
 
9
- ![Did you mean? on BetterErrors](https://raw2.github.com/yuki24/did_you_mean/86fbb784a6783a20774a34b9d02553cfb5ab54b0/docs/irb_example.png)
17
+ #### Correcting a Misspelled Method Name
10
18
 
11
- On rspec:
19
+ ```ruby
20
+ class User
21
+ attr_accessor :first_name, :last_name
12
22
 
13
- ![Did you mean? on BetterErrors](https://raw2.github.com/yuki24/did_you_mean/1c6cdc7c425325671752d261dcadd1e048e1dcad/docs/rspec_example.png)
23
+ def to_s
24
+ "#{f1rst_name} #{last_name}" # f1rst_name ???
25
+ end
26
+ end
14
27
 
15
- On BetterErrors:
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
- ![Did you mean? on BetterErrors](https://raw2.github.com/yuki24/did_you_mean/4e6d4b405777f44ecb2a0e28c4abb1e438aa33ff/docs/better_errors_example.png)
35
+ #### Correcting a Misspelled Class Name
18
36
 
19
- ## Installation
37
+ ```ruby
38
+ class Book
39
+ class TableOfContents
40
+ # ...
41
+ end
42
+ end
20
43
 
21
- Add this line to your application's Gemfile:
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
- gem 'did_you_mean', :group => :development
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
- ### Support
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
+ ![Did you mean? on BetterErrors](https://raw.githubusercontent.com/yuki24/did_you_mean/master/docs/did_you_mean_example.png)
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
- This gem only supports Ruby 1.9.3, 2.0.0, 2.1.0, 2.1.1, 2.1.2 and ruby-head. All other ruby implementations are **NOT** supported.
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 "bundler/gem_tasks"
1
+ require 'bundler/gem_tasks'
2
2
 
3
- begin
4
- require 'rake/extensiontask'
3
+ def mri?
4
+ defined?(RUBY_ENGINE) && RUBY_ENGINE == "ruby"
5
+ end
5
6
 
6
- Rake::ExtensionTask.new('did_you_mean') do |ext|
7
- ext.name = "method_missing"
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 :default => [:test]
12
+ task default: [:test]
16
13
 
17
- desc "Run tests"
18
- task :test do
19
- Rake::Task['compile'].reenable
20
- Rake::Task['compile'].invoke
14
+ if mri? || jruby?
15
+ if mri?
16
+ require 'rake/extensiontask'
21
17
 
22
- $stdout.puts("\033[33m")
23
- sh "bundle exec ruby test/all_test.rb"
24
- $stdout.puts("\033[0m")
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
- Rake::Task['clobber'].execute
27
- end
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
- namespace :test do
30
- desc "Run tests without re-compiling extensions"
31
- task :without_compile do
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")
@@ -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 = 'It adds "did you mean?" experience on NoMethodError and NameError because of a typo.'
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 "text"
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
@@ -1,18 +1,23 @@
1
1
  require 'mkmf'
2
2
 
3
- case RUBY_VERSION
4
- when /1.9.3/, /2.0.0/, /^2.1.\d/, /2.2.0/
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
- version_suffix = if /^2.1.\d/ =~ RUBY_VERSION
8
- "210"
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
- RUBY_VERSION.tr(".", "")
11
- end
17
+ raise "Sorry, but did_you_mean #{DidYouMean::VERSION} doesn't work with Ruby #{RUBY_VERSION}."
18
+ end.tr(".", "")
12
19
 
13
- $CFLAGS += " -I#{abs_ruby_header_path}/#{version_suffix}"
14
- else
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 = 3,
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.1"
2
- #define RUBY_RELEASE_DATE "2014-02-07"
3
- #define RUBY_PATCHLEVEL 28
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 2014
6
- #define RUBY_RELEASE_MONTH 2
7
- #define RUBY_RELEASE_DAY 7
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 */