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.
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 */