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.
- 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
@@ -34,34 +34,6 @@
|
|
34
34
|
#define VMDEBUG 3
|
35
35
|
#endif
|
36
36
|
|
37
|
-
enum {
|
38
|
-
BOP_PLUS,
|
39
|
-
BOP_MINUS,
|
40
|
-
BOP_MULT,
|
41
|
-
BOP_DIV,
|
42
|
-
BOP_MOD,
|
43
|
-
BOP_EQ,
|
44
|
-
BOP_EQQ,
|
45
|
-
BOP_LT,
|
46
|
-
BOP_LE,
|
47
|
-
BOP_LTLT,
|
48
|
-
BOP_AREF,
|
49
|
-
BOP_ASET,
|
50
|
-
BOP_LENGTH,
|
51
|
-
BOP_SIZE,
|
52
|
-
BOP_EMPTY_P,
|
53
|
-
BOP_SUCC,
|
54
|
-
BOP_GT,
|
55
|
-
BOP_GE,
|
56
|
-
BOP_NOT,
|
57
|
-
BOP_NEQ,
|
58
|
-
BOP_MATCH,
|
59
|
-
BOP_FREEZE,
|
60
|
-
|
61
|
-
BOP_LAST_
|
62
|
-
};
|
63
|
-
|
64
|
-
extern short ruby_vm_redefined_flag[BOP_LAST_];
|
65
37
|
extern VALUE ruby_vm_const_missing_count;
|
66
38
|
|
67
39
|
#if VM_COLLECT_USAGE_DETAILS
|
@@ -231,18 +203,6 @@ enum vm_regan_acttype {
|
|
231
203
|
/**********************************************************/
|
232
204
|
|
233
205
|
/* optimize insn */
|
234
|
-
#define FIXNUM_REDEFINED_OP_FLAG (1 << 0)
|
235
|
-
#define FLOAT_REDEFINED_OP_FLAG (1 << 1)
|
236
|
-
#define STRING_REDEFINED_OP_FLAG (1 << 2)
|
237
|
-
#define ARRAY_REDEFINED_OP_FLAG (1 << 3)
|
238
|
-
#define HASH_REDEFINED_OP_FLAG (1 << 4)
|
239
|
-
#define BIGNUM_REDEFINED_OP_FLAG (1 << 5)
|
240
|
-
#define SYMBOL_REDEFINED_OP_FLAG (1 << 6)
|
241
|
-
#define TIME_REDEFINED_OP_FLAG (1 << 7)
|
242
|
-
#define REGEXP_REDEFINED_OP_FLAG (1 << 8)
|
243
|
-
|
244
|
-
#define BASIC_OP_UNREDEFINED_P(op, klass) (LIKELY((ruby_vm_redefined_flag[(op)]&(klass)) == 0))
|
245
|
-
|
246
206
|
#define FIXNUM_2_P(a, b) ((a) & (b) & 1)
|
247
207
|
#if USE_FLONUM
|
248
208
|
#define FLONUM_2_P(a, b) (((((a)^2) | ((b)^2)) & 3) == 0) /* (FLONUM_P(a) && FLONUM_P(b)) */
|
@@ -4,4 +4,18 @@ source "https://rubygems.org"
|
|
4
4
|
|
5
5
|
gem "activerecord", "~> 3.0.0"
|
6
6
|
|
7
|
+
platforms :ruby do
|
8
|
+
gem "sqlite3"
|
9
|
+
end
|
10
|
+
|
11
|
+
platforms :jruby do
|
12
|
+
gem "activerecord-jdbcsqlite3-adapter"
|
13
|
+
end
|
14
|
+
|
15
|
+
platforms :rbx do
|
16
|
+
gem "rubysl", "~> 2.0"
|
17
|
+
gem "racc"
|
18
|
+
gem "rubinius-developer_tools"
|
19
|
+
end
|
20
|
+
|
7
21
|
gemspec :path => "../"
|
@@ -4,4 +4,18 @@ source "https://rubygems.org"
|
|
4
4
|
|
5
5
|
gem "activerecord", "~> 3.1.0"
|
6
6
|
|
7
|
+
platforms :ruby do
|
8
|
+
gem "sqlite3"
|
9
|
+
end
|
10
|
+
|
11
|
+
platforms :jruby do
|
12
|
+
gem "activerecord-jdbcsqlite3-adapter"
|
13
|
+
end
|
14
|
+
|
15
|
+
platforms :rbx do
|
16
|
+
gem "rubysl", "~> 2.0"
|
17
|
+
gem "racc"
|
18
|
+
gem "rubinius-developer_tools"
|
19
|
+
end
|
20
|
+
|
7
21
|
gemspec :path => "../"
|
@@ -4,4 +4,18 @@ source "https://rubygems.org"
|
|
4
4
|
|
5
5
|
gem "activerecord", "~> 3.2.0"
|
6
6
|
|
7
|
+
platforms :ruby do
|
8
|
+
gem "sqlite3"
|
9
|
+
end
|
10
|
+
|
11
|
+
platforms :jruby do
|
12
|
+
gem "activerecord-jdbcsqlite3-adapter"
|
13
|
+
end
|
14
|
+
|
15
|
+
platforms :rbx do
|
16
|
+
gem "rubysl", "~> 2.0"
|
17
|
+
gem "racc"
|
18
|
+
gem "rubinius-developer_tools"
|
19
|
+
end
|
20
|
+
|
7
21
|
gemspec :path => "../"
|
@@ -4,4 +4,18 @@ source "https://rubygems.org"
|
|
4
4
|
|
5
5
|
gem "activerecord", "~> 4.0.0"
|
6
6
|
|
7
|
+
platforms :ruby do
|
8
|
+
gem "sqlite3"
|
9
|
+
end
|
10
|
+
|
11
|
+
platforms :jruby do
|
12
|
+
gem "activerecord-jdbcsqlite3-adapter"
|
13
|
+
end
|
14
|
+
|
15
|
+
platforms :rbx do
|
16
|
+
gem "rubysl", "~> 2.0"
|
17
|
+
gem "racc"
|
18
|
+
gem "rubinius-developer_tools"
|
19
|
+
end
|
20
|
+
|
7
21
|
gemspec :path => "../"
|
@@ -4,4 +4,18 @@ source "https://rubygems.org"
|
|
4
4
|
|
5
5
|
gem "activerecord", "~> 4.1.0"
|
6
6
|
|
7
|
+
platforms :ruby do
|
8
|
+
gem "sqlite3"
|
9
|
+
end
|
10
|
+
|
11
|
+
platforms :jruby do
|
12
|
+
gem "activerecord-jdbcsqlite3-adapter"
|
13
|
+
end
|
14
|
+
|
15
|
+
platforms :rbx do
|
16
|
+
gem "rubysl", "~> 2.0"
|
17
|
+
gem "racc"
|
18
|
+
gem "rubinius-developer_tools"
|
19
|
+
end
|
20
|
+
|
7
21
|
gemspec :path => "../"
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# This file was generated by Appraisal
|
2
|
+
|
3
|
+
source "https://rubygems.org"
|
4
|
+
|
5
|
+
gem "activerecord", "~> 4.2.0.beta4"
|
6
|
+
|
7
|
+
platforms :ruby do
|
8
|
+
gem "sqlite3"
|
9
|
+
end
|
10
|
+
|
11
|
+
platforms :jruby do
|
12
|
+
gem "activerecord-jdbcsqlite3-adapter"
|
13
|
+
end
|
14
|
+
|
15
|
+
platforms :rbx do
|
16
|
+
gem "rubysl", "~> 2.0"
|
17
|
+
gem "racc"
|
18
|
+
gem "rubinius-developer_tools"
|
19
|
+
end
|
20
|
+
|
21
|
+
gemspec :path => "../"
|
@@ -6,4 +6,20 @@ git "git://github.com/rails/rails.git" do
|
|
6
6
|
gem "activerecord", :require => "activerecord"
|
7
7
|
end
|
8
8
|
|
9
|
+
gem "arel", :github => "rails/arel"
|
10
|
+
|
11
|
+
platforms :ruby do
|
12
|
+
gem "sqlite3"
|
13
|
+
end
|
14
|
+
|
15
|
+
platforms :jruby do
|
16
|
+
gem "activerecord-jdbcsqlite3-adapter"
|
17
|
+
end
|
18
|
+
|
19
|
+
platforms :rbx do
|
20
|
+
gem "rubysl", "~> 2.0"
|
21
|
+
gem "racc"
|
22
|
+
gem "rubinius-developer_tools"
|
23
|
+
end
|
24
|
+
|
9
25
|
gemspec :path => "../"
|
data/lib/did_you_mean.rb
CHANGED
@@ -1,6 +1,16 @@
|
|
1
|
-
require "
|
2
|
-
require "did_you_mean/method_missing"
|
3
|
-
require "did_you_mean/method_finder"
|
4
|
-
require "did_you_mean/strategies"
|
1
|
+
require "interception"
|
5
2
|
|
3
|
+
require "did_you_mean/version"
|
6
4
|
require "did_you_mean/core_ext/name_error"
|
5
|
+
require "did_you_mean/finders"
|
6
|
+
|
7
|
+
module DidYouMean
|
8
|
+
Interception.listen(->(exception, binding) {
|
9
|
+
# On IRB/pry console, this event is called twice. In the second event,
|
10
|
+
# we get IRB/pry binding. So it shouldn't override @frame_binding if
|
11
|
+
# it's already defined.
|
12
|
+
if exception.is_a?(NameError) && !exception.instance_variable_defined?(:@frame_binding)
|
13
|
+
exception.instance_variable_set(:@frame_binding, binding)
|
14
|
+
end
|
15
|
+
})
|
16
|
+
end
|
@@ -1,61 +1,28 @@
|
|
1
|
-
begin
|
2
|
-
require "binding_of_caller"
|
3
|
-
rescue LoadError => e
|
4
|
-
puts "could not load binding_of_caller. please make sure it is included in the Gemfile."
|
5
|
-
raise e
|
6
|
-
end
|
7
|
-
|
8
1
|
class NameError
|
2
|
+
attr_reader :frame_binding
|
3
|
+
|
9
4
|
begin
|
10
5
|
require "active_support/core_ext/name_error"
|
11
6
|
|
12
|
-
|
13
|
-
|
14
|
-
if /
|
15
|
-
$1 if /((::)?([A-Z]\w*)(::[A-Z]\w*)*)$/ =~ original_message
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
alias missing_name_with_did_you_mean missing_name
|
20
|
-
alias missing_name missing_name_without_did_you_mean
|
21
|
-
end
|
22
|
-
rescue LoadError
|
23
|
-
end
|
24
|
-
|
25
|
-
original_set_backtrace = instance_method(:set_backtrace)
|
26
|
-
|
27
|
-
define_method :set_backtrace do |*args|
|
28
|
-
unless Thread.current[:__did_you_mean_exception_lock]
|
29
|
-
Thread.current[:__did_you_mean_exception_lock] = true
|
30
|
-
begin
|
31
|
-
@__did_you_mean_bindings_stack = binding.callers.drop(1)
|
32
|
-
ensure
|
33
|
-
Thread.current[:__did_you_mean_exception_lock] = false
|
7
|
+
def missing_name
|
8
|
+
if /undefined local variable or method/ !~ original_message
|
9
|
+
$1 if /((::)?([A-Z]\w*)(::[A-Z]\w*)*)$/ =~ original_message
|
34
10
|
end
|
35
|
-
end
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
def __did_you_mean_bindings_stack
|
40
|
-
@__did_you_mean_bindings_stack || []
|
41
|
-
end
|
42
|
-
|
43
|
-
def frame_binding
|
44
|
-
@frame_binding ||= __did_you_mean_bindings_stack.first
|
45
|
-
end
|
11
|
+
end if method_defined?(:missing_name)
|
12
|
+
rescue LoadError; end
|
46
13
|
|
47
14
|
def to_s_with_did_you_mean
|
48
|
-
original_message + did_you_mean?.to_s
|
15
|
+
original_message + did_you_mean?.to_s rescue original_message
|
49
16
|
end
|
50
17
|
|
51
18
|
alias original_message to_s
|
52
19
|
alias to_s to_s_with_did_you_mean
|
53
20
|
|
54
21
|
def did_you_mean?
|
55
|
-
|
22
|
+
finder.did_you_mean?
|
56
23
|
end
|
57
24
|
|
58
|
-
def
|
59
|
-
@
|
25
|
+
def finder
|
26
|
+
@finder ||= DidYouMean.finders[self.class.to_s].new(self)
|
60
27
|
end
|
61
28
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require "did_you_mean/word_collection"
|
2
|
+
|
3
|
+
module DidYouMean
|
4
|
+
module BaseFinder
|
5
|
+
def did_you_mean?
|
6
|
+
return if similar_words.empty?
|
7
|
+
|
8
|
+
output = "\n\n"
|
9
|
+
output << " Did you mean? #{format(similar_words.first)}\n"
|
10
|
+
output << similar_words[1..-1].map{|word| "#{' ' * 18}#{format(word)}\n" }.join
|
11
|
+
output << " " # for pry
|
12
|
+
end
|
13
|
+
|
14
|
+
def similar_words
|
15
|
+
@similar_words ||= WordCollection.new(words).similar_to(target_word)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class NullFinder
|
20
|
+
def initialize(*); end
|
21
|
+
def did_you_mean?; end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.finders
|
25
|
+
@@finders ||= Hash.new(NullFinder)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
require 'did_you_mean/finders/name_error_finders'
|
30
|
+
require 'did_you_mean/finders/similar_attribute_finder'
|
31
|
+
require 'did_you_mean/finders/similar_method_finder'
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module DidYouMean
|
2
|
+
module NameErrorFinders
|
3
|
+
def self.included(*)
|
4
|
+
raise "Do not include this module since it overrides Class.new method."
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.new(exception)
|
8
|
+
klass = if /uninitialized constant/ =~ exception.original_message
|
9
|
+
SimilarClassFinder
|
10
|
+
elsif /undefined local variable or method/ =~ exception.original_message
|
11
|
+
SimilarNameFinder
|
12
|
+
else
|
13
|
+
NullFinder
|
14
|
+
end
|
15
|
+
|
16
|
+
klass.new(exception)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
finders["NameError"] = NameErrorFinders
|
21
|
+
end
|
22
|
+
|
23
|
+
require 'did_you_mean/finders/name_error_finders/similar_name_finder'
|
24
|
+
require 'did_you_mean/finders/name_error_finders/similar_class_finder'
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module DidYouMean
|
2
|
+
class SimilarClassFinder
|
3
|
+
include BaseFinder
|
4
|
+
attr_reader :class_name, :original_message
|
5
|
+
|
6
|
+
def initialize(exception)
|
7
|
+
@class_name, @original_message = exception.name, exception.original_message
|
8
|
+
end
|
9
|
+
|
10
|
+
def words
|
11
|
+
scopes.flat_map do |scope|
|
12
|
+
scope.constants.map {|name| ConstantName.new(name, scope) }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def name_from_message
|
17
|
+
class_name || /([A-Z]\w*$)/.match(original_message)[0]
|
18
|
+
end
|
19
|
+
alias target_word name_from_message
|
20
|
+
|
21
|
+
def similar_words
|
22
|
+
super.map(&:full_name)
|
23
|
+
end
|
24
|
+
|
25
|
+
def scopes
|
26
|
+
@scopes ||= scope_base.size.times.map do |count|
|
27
|
+
eval(scope_base[0..(- count)].join("::"))
|
28
|
+
end.reverse << Object
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def scope_base
|
34
|
+
@scope_base ||= (/(([A-Z]\w*::)*)([A-Z]\w*)$/ =~ original_message ? $1 : "").split("::")
|
35
|
+
end
|
36
|
+
|
37
|
+
class ConstantName < String
|
38
|
+
attr_reader :scope
|
39
|
+
|
40
|
+
def initialize(str, scope)
|
41
|
+
super(str.to_s)
|
42
|
+
@scope = scope.to_s
|
43
|
+
end
|
44
|
+
|
45
|
+
def full_name
|
46
|
+
scope == "Object" ? to_s : "#{scope}::#{to_s}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module DidYouMean
|
2
|
+
class SimilarNameFinder
|
3
|
+
include BaseFinder
|
4
|
+
attr_reader :name, :_methods, :_local_variables, :_instance_variables
|
5
|
+
|
6
|
+
def initialize(exception)
|
7
|
+
@name = exception.name
|
8
|
+
@_methods = exception.frame_binding.eval("methods")
|
9
|
+
@_local_variables = exception.frame_binding.eval("local_variables")
|
10
|
+
@_instance_variables = exception.frame_binding.eval("instance_variables").map do |name|
|
11
|
+
name.to_s.tr("@", "")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def words
|
16
|
+
local_variable_names + method_names + instance_variable_names
|
17
|
+
end
|
18
|
+
|
19
|
+
alias target_word name
|
20
|
+
|
21
|
+
def local_variable_names
|
22
|
+
_local_variables.map {|word| LocalVariableName.new(word.to_s) }
|
23
|
+
end
|
24
|
+
|
25
|
+
def similar_local_variables
|
26
|
+
similar_words.select{|word| word.is_a?(LocalVariableName) }
|
27
|
+
end
|
28
|
+
|
29
|
+
def method_names
|
30
|
+
_methods.map {|word| MethodName.new(word.to_s) }
|
31
|
+
end
|
32
|
+
|
33
|
+
def similar_methods
|
34
|
+
similar_words.select{|word| word.is_a?(MethodName) }
|
35
|
+
end
|
36
|
+
|
37
|
+
def instance_variable_names
|
38
|
+
_instance_variables.map {|word| InstanceVariableName.new(word.to_s) }
|
39
|
+
end
|
40
|
+
|
41
|
+
def similar_instance_variables
|
42
|
+
similar_words.select {|word| word.is_a?(InstanceVariableName) }
|
43
|
+
end
|
44
|
+
|
45
|
+
def format(word)
|
46
|
+
"#{word.prefix}#{word}"
|
47
|
+
end
|
48
|
+
|
49
|
+
class MethodName < String
|
50
|
+
def prefix; "#"; end
|
51
|
+
end
|
52
|
+
|
53
|
+
class LocalVariableName < String
|
54
|
+
def prefix; ""; end
|
55
|
+
end
|
56
|
+
|
57
|
+
class InstanceVariableName < String
|
58
|
+
def prefix; "@"; end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|