guessmethod 0.0.2 → 0.0.3
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.
- data/History.txt +6 -3
- data/lib/guessmethod.rb +82 -15
- data/lib/guessmethod/version.rb +1 -1
- data/website/index.html +30 -18
- data/website/index.txt +24 -16
- metadata +2 -2
data/History.txt
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
-
== 0.0.
|
1
|
+
== 0.0.3 2007-07-18
|
2
2
|
|
3
|
-
* 1
|
4
|
-
*
|
3
|
+
* 1 major bit:
|
4
|
+
* added an override for const_missing, now you can mistype even more!
|
5
|
+
* a few minor bits:
|
6
|
+
* DRYed up getting the replacement candidates
|
7
|
+
* actively dirtied code that needed cleaning (I'm looking at you GuessMethod::Outputter)
|
data/lib/guessmethod.rb
CHANGED
@@ -24,28 +24,48 @@ module GuessMethod
|
|
24
24
|
end
|
25
25
|
alias_method :old_method_missing, :method_missing
|
26
26
|
alias_method :method_missing, :guess_method_missing
|
27
|
+
|
28
|
+
unless respond_to? :const_missing
|
29
|
+
def self.const_missing(sym); super; end
|
30
|
+
end
|
31
|
+
base.extend(GuessMethodClassMethods)
|
32
|
+
class << self
|
33
|
+
alias_method :old_const_missing, :const_missing
|
34
|
+
alias_method :const_missing, :guess_const_missing
|
35
|
+
end
|
27
36
|
end
|
28
37
|
end
|
29
38
|
|
30
39
|
def guess_method_missing(meth, *args, &block)
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
40
|
+
possible_methods = Guesser.find_closest(self.methods, meth)
|
41
|
+
case possible_methods.size
|
42
|
+
when 1
|
43
|
+
call_method = possible_methods.first
|
44
|
+
$stderr.puts Outputter.replacing_method(meth, call_method, self)
|
45
|
+
self.send(call_method, *args, &block)
|
46
|
+
when 0
|
47
|
+
$stderr.puts Outputter.no_method_in_threshold(meth, self)
|
48
|
+
old_method_missing(meth, *args, &block)
|
49
|
+
else
|
50
|
+
$stderr.puts Outputter.ambiguous_method(meth, possible_methods, self)
|
51
|
+
old_method_missing(meth, *args, &block)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# GuessMethod::Guesser uses map, min, and levensthtein to find the closest
|
56
|
+
# match(es) in an array of strings
|
57
|
+
class Guesser
|
58
|
+
def self.find_closest(haystack, needle)
|
59
|
+
closest_distance = haystack.map {|x| x.levenshtein(needle.to_s,
|
36
60
|
Options[:insert_weight], Options[:delete_weight],
|
37
|
-
Options[:substitution_weight])
|
38
|
-
if
|
39
|
-
|
40
|
-
|
41
|
-
|
61
|
+
Options[:substitution_weight])}.min
|
62
|
+
if closest_distance <= Options[:threshold]
|
63
|
+
haystack.find_all {|x| x.levenshtein(needle.to_s,
|
64
|
+
Options[:insert_weight], Options[:delete_weight],
|
65
|
+
Options[:substitution_weight]) == closest_distance}
|
42
66
|
else
|
43
|
-
|
44
|
-
old_method_missing(meth, *args, &block)
|
67
|
+
[]
|
45
68
|
end
|
46
|
-
else
|
47
|
-
$stderr.puts Outputter.no_method_in_threshold(meth, self)
|
48
|
-
old_method_missing(meth, *args, &block)
|
49
69
|
end
|
50
70
|
end
|
51
71
|
|
@@ -90,8 +110,55 @@ module GuessMethod
|
|
90
110
|
message << Outputter.object(obj)
|
91
111
|
end
|
92
112
|
|
113
|
+
def self.ambigious_const(sym, possibilities, obj) #:nodoc:
|
114
|
+
message = Formatter.color('ambigious constant:', :red)
|
115
|
+
message << ' '
|
116
|
+
message << Formatter.color(sym, :green)
|
117
|
+
message << ' possible matches '
|
118
|
+
message << possibilities.map {|m| Formatter.color(m, :cyan)}.join(', ')
|
119
|
+
message << ' for '
|
120
|
+
message << Outputter.object(obj)
|
121
|
+
end
|
122
|
+
|
123
|
+
def self.no_const_in_threshold(sym, obj) #:nodoc:
|
124
|
+
message = Formatter.color('no constant in threshold:', :red)
|
125
|
+
message << ' for '
|
126
|
+
message << Formatter.color(sym, :green)
|
127
|
+
message << ', sending to '
|
128
|
+
message << Formatter.color(obj, :green, :bold)
|
129
|
+
message << "'s const_missing"
|
130
|
+
end
|
131
|
+
|
132
|
+
def self.replacing_const(sym, call_const, obj) #:nodoc:
|
133
|
+
message = Formatter.color('attention:', :red)
|
134
|
+
message << ' replacing non-existant constant '
|
135
|
+
message << Formatter.color(sym, :cyan)
|
136
|
+
message << ' with '
|
137
|
+
message << Formatter.color(call_const, :cyan)
|
138
|
+
message << ' for '
|
139
|
+
message << Formatter.color(obj, :green, :bold)
|
140
|
+
end
|
141
|
+
|
93
142
|
end
|
94
143
|
|
95
144
|
end
|
96
145
|
|
146
|
+
module GuessMethodClassMethods
|
147
|
+
def guess_const_missing(sym)
|
148
|
+
possible_consts = GuessMethod::Guesser.find_closest(self.constants, sym)
|
149
|
+
case possible_consts.size
|
150
|
+
when 1
|
151
|
+
call_const = possible_consts.first
|
152
|
+
$stderr.puts GuessMethod::Outputter.replacing_const(sym, call_const, self) #FIXME
|
153
|
+
self.const_get(call_const)
|
154
|
+
when 0
|
155
|
+
$stderr.puts GuessMethod::Outputter.no_const_in_threshold(sym, self)
|
156
|
+
old_const_missing(sym)
|
157
|
+
else
|
158
|
+
$stderr.puts GuessMethod::Outputter.ambigious_const(sym, possible_consts, self)
|
159
|
+
old_const_missing(sym)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
97
164
|
require 'guessmethod/version'
|
data/lib/guessmethod/version.rb
CHANGED
data/website/index.html
CHANGED
@@ -33,7 +33,7 @@
|
|
33
33
|
<h1>Guess Method</h1>
|
34
34
|
<div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/guessmethod"; return false'>
|
35
35
|
<p>Get Version</p>
|
36
|
-
<a href="http://rubyforge.org/projects/guessmethod" class="numbers">0.0.
|
36
|
+
<a href="http://rubyforge.org/projects/guessmethod" class="numbers">0.0.3</a>
|
37
37
|
</div>
|
38
38
|
<h1>→ ‘guessmethod’</h1>
|
39
39
|
|
@@ -45,6 +45,18 @@
|
|
45
45
|
slow you down. Let GuessMethod take care of you.</p>
|
46
46
|
|
47
47
|
|
48
|
+
<h3>How</h3>
|
49
|
+
|
50
|
+
|
51
|
+
<p>GuessMethod aliases out method_missing and const_missing and replaces it with
|
52
|
+
a version that tries to find a close match for your possibly mistyped method or
|
53
|
+
constant. You can see that GuessMethod has already outgrown its name.</p>
|
54
|
+
|
55
|
+
|
56
|
+
<p>When GuessMethod can’t figure anything out, it lets the original method_missing or
|
57
|
+
const_missing handle the problem.</p>
|
58
|
+
|
59
|
+
|
48
60
|
<h2>Installing</h2>
|
49
61
|
|
50
62
|
|
@@ -58,24 +70,21 @@ slow you down. Let GuessMethod take care of you.</p>
|
|
58
70
|
true
|
59
71
|
002:0> class Object; include GuessMethod; end
|
60
72
|
Object
|
61
|
-
003:0>
|
62
|
-
attention:
|
63
|
-
attention: sending
|
64
|
-
|
65
|
-
|
66
|
-
[1, 2, 3]
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
from ./mm.rb:9:in `old_method_missing’
|
72
|
-
from ./mm.rb:34:in `method_missing’
|
73
|
+
003:0> Stirng.tos
|
74
|
+
attention: replacing non-existant constant Stirng with String for Object
|
75
|
+
attention: sending to_s instead of tos to String:Class
|
76
|
+
"String"
|
77
|
+
004:0> ['1','2','3'].mp {|x| x.to_}
|
78
|
+
attention: sending map instead of mp to ["1", "2", "3"]:Array
|
79
|
+
ambigious method: to_ possible matches to_a, to_i, to_s, to_f for "1":String
|
80
|
+
NoMethodError: undefined method `to_' for "1":String
|
81
|
+
from /usr/local/lib/ruby/gems/1.8/gems/guessmethod-0.0.3/lib/guessmethod.rb:23:in `old_method_missing'
|
82
|
+
from /usr/local/lib/ruby/gems/1.8/gems/guessmethod-0.0.3/lib/guessmethod.rb:50:in `method_missing'
|
73
83
|
from (irb):4
|
74
|
-
from
|
75
|
-
from
|
76
|
-
from
|
84
|
+
from /usr/local/lib/ruby/gems/1.8/gems/guessmethod-0.0.3/lib/guessmethod.rb:44:in `map'
|
85
|
+
from /usr/local/lib/ruby/gems/1.8/gems/guessmethod-0.0.3/lib/guessmethod.rb:44:in `send'
|
86
|
+
from /usr/local/lib/ruby/gems/1.8/gems/guessmethod-0.0.3/lib/guessmethod.rb:44:in `method_missing'
|
77
87
|
from (irb):4
|
78
|
-
from (irb):3
|
79
88
|
005:0> eixt
|
80
89
|
attention: sending exit instead of eixt to main:Object
|
81
90
|
mvb:~ cms$</pre>
|
@@ -86,6 +95,9 @@ mvb:~ cms$</pre>
|
|
86
95
|
<p>You can submit patches through the RubyForge page for <a href="http://rubyforge.org/projects/guessmethod/">guessmethod</a>.</p>
|
87
96
|
|
88
97
|
|
98
|
+
<p>You can check out guessmethod from the svn repository at http://code.tie-rack.org/cms/guessmethod/.</p>
|
99
|
+
|
100
|
+
|
89
101
|
<p>Read the <a href="http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/">8 steps for fixing other people’s code</a></p>
|
90
102
|
|
91
103
|
|
@@ -100,7 +112,7 @@ mvb:~ cms$</pre>
|
|
100
112
|
|
101
113
|
<p>Comments are welcome. Send an email to chris @@ tie-rack .. org.</p>
|
102
114
|
<p class="coda">
|
103
|
-
<a href="mailto:drnicwilliams@gmail.com">Dr Nic</a>,
|
115
|
+
<a href="mailto:drnicwilliams@gmail.com">Dr Nic</a>, 22nd July 2007<br>
|
104
116
|
Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
|
105
117
|
</p>
|
106
118
|
</div>
|
data/website/index.txt
CHANGED
@@ -8,6 +8,15 @@ h2. What
|
|
8
8
|
GuessMethod is an aggressive spell checker for irb. Don't let sloppy typing
|
9
9
|
slow you down. Let GuessMethod take care of you.
|
10
10
|
|
11
|
+
h3. How
|
12
|
+
|
13
|
+
GuessMethod aliases out method_missing and const_missing and replaces it with
|
14
|
+
a version that tries to find a close match for your possibly mistyped method or
|
15
|
+
constant. You can see that GuessMethod has already outgrown its name.
|
16
|
+
|
17
|
+
When GuessMethod can't figure anything out, it lets the original method_missing or
|
18
|
+
const_missing handle the problem.
|
19
|
+
|
11
20
|
h2. Installing
|
12
21
|
|
13
22
|
<pre syntax="ruby">sudo gem install guessmethod</pre>
|
@@ -19,24 +28,21 @@ h2. Demonstration of usage
|
|
19
28
|
true
|
20
29
|
002:0> class Object; include GuessMethod; end
|
21
30
|
Object
|
22
|
-
003:0>
|
23
|
-
attention:
|
24
|
-
attention: sending
|
25
|
-
|
26
|
-
|
27
|
-
[1, 2, 3]
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
from ./mm.rb:9:in `old_method_missing’
|
33
|
-
from ./mm.rb:34:in `method_missing’
|
31
|
+
003:0> Stirng.tos
|
32
|
+
attention: replacing non-existant constant Stirng with String for Object
|
33
|
+
attention: sending to_s instead of tos to String:Class
|
34
|
+
"String"
|
35
|
+
004:0> ['1','2','3'].mp {|x| x.to_}
|
36
|
+
attention: sending map instead of mp to ["1", "2", "3"]:Array
|
37
|
+
ambigious method: to_ possible matches to_a, to_i, to_s, to_f for "1":String
|
38
|
+
NoMethodError: undefined method `to_' for "1":String
|
39
|
+
from /usr/local/lib/ruby/gems/1.8/gems/guessmethod-0.0.3/lib/guessmethod.rb:23:in `old_method_missing'
|
40
|
+
from /usr/local/lib/ruby/gems/1.8/gems/guessmethod-0.0.3/lib/guessmethod.rb:50:in `method_missing'
|
34
41
|
from (irb):4
|
35
|
-
from
|
36
|
-
from
|
37
|
-
from
|
42
|
+
from /usr/local/lib/ruby/gems/1.8/gems/guessmethod-0.0.3/lib/guessmethod.rb:44:in `map'
|
43
|
+
from /usr/local/lib/ruby/gems/1.8/gems/guessmethod-0.0.3/lib/guessmethod.rb:44:in `send'
|
44
|
+
from /usr/local/lib/ruby/gems/1.8/gems/guessmethod-0.0.3/lib/guessmethod.rb:44:in `method_missing'
|
38
45
|
from (irb):4
|
39
|
-
from (irb):3
|
40
46
|
005:0> eixt
|
41
47
|
attention: sending exit instead of eixt to main:Object
|
42
48
|
mvb:~ cms$</pre>
|
@@ -45,6 +51,8 @@ h2. How to submit patches
|
|
45
51
|
|
46
52
|
You can submit patches through the RubyForge page for "guessmethod":http://rubyforge.org/projects/guessmethod/.
|
47
53
|
|
54
|
+
You can check out guessmethod from the svn repository at http://code.tie-rack.org/cms/guessmethod/.
|
55
|
+
|
48
56
|
Read the "8 steps for fixing other people's code":http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/
|
49
57
|
|
50
58
|
h2. License
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: guessmethod
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0.
|
7
|
-
date: 2007-07-
|
6
|
+
version: 0.0.3
|
7
|
+
date: 2007-07-22 00:00:00 -06:00
|
8
8
|
summary: hijacks method_missing to act as a spellchecker
|
9
9
|
require_paths:
|
10
10
|
- lib
|