typofixer 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +2 -0
- data/Manifest.txt +5 -0
- data/README.rdoc +40 -0
- data/lib/typofixer.rb +9 -0
- data/lib/typofixer/typotracker.rb +126 -0
- metadata +76 -0
data/History.txt
ADDED
data/Manifest.txt
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
= TypoFixer
|
2
|
+
|
3
|
+
* https://github.com/pasberth/TypoFixer
|
4
|
+
|
5
|
+
== install
|
6
|
+
|
7
|
+
gem install typofixer
|
8
|
+
|
9
|
+
== description
|
10
|
+
|
11
|
+
puts を purs とか typo したときに推測して puts を呼び出したうえでログを出力するデバッガ的なあれ
|
12
|
+
|
13
|
+
== usage
|
14
|
+
|
15
|
+
普通に使う
|
16
|
+
|
17
|
+
require "typofixer"
|
18
|
+
|
19
|
+
include TypoFixer::TypoTracker
|
20
|
+
|
21
|
+
purs "hello typo"
|
22
|
+
|
23
|
+
# もしかして: puts
|
24
|
+
# ... caller ...
|
25
|
+
# hello typo # 期待される出力.
|
26
|
+
|
27
|
+
出力しないで使う
|
28
|
+
|
29
|
+
self.typoout = nil
|
30
|
+
|
31
|
+
purs "hello typo"
|
32
|
+
|
33
|
+
# hello typo # もしかして: も caller も出力されない
|
34
|
+
|
35
|
+
ログファイルに書き出す
|
36
|
+
|
37
|
+
self.typoout = open "typo.out", "a"
|
38
|
+
|
39
|
+
purs "hello typo"
|
40
|
+
# hello typo # そして typo.out にログが追加書き込みされる
|
data/lib/typofixer.rb
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
|
4
|
+
# typoを検出するデバッガ。Kernelにincludeすればプログラム全体を監視する
|
5
|
+
module TypoFixer::TypoTracker
|
6
|
+
|
7
|
+
def typoin
|
8
|
+
$stdin
|
9
|
+
end
|
10
|
+
|
11
|
+
def typoout
|
12
|
+
$stdout
|
13
|
+
end
|
14
|
+
|
15
|
+
[:typoin, :typoout].each do |a|
|
16
|
+
define_method :"#{a}=" do |v|
|
17
|
+
self.class.send :define_method, a do
|
18
|
+
v
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def typo_hook e, ifn, fn, *as, &b
|
24
|
+
if typoout
|
25
|
+
typoout.write "もしかして: #{ifn}\n"
|
26
|
+
$@.each do |at|
|
27
|
+
typoout.write "\t#{at}\n"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
send ifn, *as, &b
|
31
|
+
end
|
32
|
+
|
33
|
+
def typo e, methods, funcname, *args, &blk
|
34
|
+
typo_cases.each do |_case|
|
35
|
+
begin
|
36
|
+
return _case.call e, methods, funcname, *args, &blk
|
37
|
+
rescue Exception
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
raise e
|
42
|
+
end
|
43
|
+
|
44
|
+
def typo_without_receiver e, fn, *as, &b
|
45
|
+
typo(e, methods + private_methods, fn, *as, &b)
|
46
|
+
end
|
47
|
+
|
48
|
+
def typo_with_receiver e, fn, *as, &b
|
49
|
+
typo(e, methods, fn, *as, &b)
|
50
|
+
end
|
51
|
+
|
52
|
+
def typo_cases
|
53
|
+
return @typo_cases if @typo_cases
|
54
|
+
(@typo_cases = []).tap do |typo_cases|
|
55
|
+
@typo_cases << proc do |e, methods, funcname, *args, &blk|
|
56
|
+
most = []
|
57
|
+
seq = funcname.to_s.split //
|
58
|
+
seq.length.times do |i|
|
59
|
+
t = seq.clone
|
60
|
+
t[i] = '.'
|
61
|
+
that = methods.grep /^#{t.join}$/
|
62
|
+
most += that.reject { |item| most.include? item }
|
63
|
+
end
|
64
|
+
|
65
|
+
if most.one?
|
66
|
+
typo_hook e, most.first, funcname, *args, &blk
|
67
|
+
else
|
68
|
+
raise e
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
@typo_cases << proc do |e, methods, funcname, *args, &blk|
|
74
|
+
most = []
|
75
|
+
seq = funcname.to_s.split //
|
76
|
+
seq.length.times do |i|
|
77
|
+
t = seq.clone
|
78
|
+
t[i] = '.'
|
79
|
+
t[i+1] = '.'
|
80
|
+
that = methods.grep /^#{t.join}$/
|
81
|
+
most += that.reject { |item| most.include? item }
|
82
|
+
end
|
83
|
+
|
84
|
+
if most.one?
|
85
|
+
typo_hook e, most.first, funcname, *args, &blk
|
86
|
+
else
|
87
|
+
raise e
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
@typo_cases << proc do |e, methods, funcname, *args, &blk|
|
92
|
+
most = []
|
93
|
+
seq = funcname.to_s.split //
|
94
|
+
seq.length.times do |i|
|
95
|
+
t = seq.clone
|
96
|
+
t.delete_at i
|
97
|
+
t.delete_at i
|
98
|
+
t[i] = '.{0,4}'
|
99
|
+
that = methods.grep /^#{t.join}$/
|
100
|
+
most += that.reject { |item| most.include? item }
|
101
|
+
end
|
102
|
+
|
103
|
+
if most.one?
|
104
|
+
typo_hook e, most.first, funcname, *args, &blk
|
105
|
+
else
|
106
|
+
raise e
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def method_missing funcname, *args, &blk
|
113
|
+
# システムで予約されたものはキャッチしない
|
114
|
+
if [:to_ary, :to_path, :to_str, :to_hash, :to_int, :to_io, :to_regexp, :to_proc].include? funcname
|
115
|
+
super
|
116
|
+
end
|
117
|
+
|
118
|
+
begin
|
119
|
+
super
|
120
|
+
rescue NameError => e # レシーバが存在しない場合
|
121
|
+
typo_without_receiver e, funcname, *args, &blk
|
122
|
+
rescue NoMethodError => e # レシーバが存在する場合
|
123
|
+
typo_with_receiver e, funcname, *args, &blk
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
metadata
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: typofixer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- pasberth
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-02-19 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rdoc
|
16
|
+
requirement: &70244739883700 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3.10'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70244739883700
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: hoe
|
27
|
+
requirement: &70244739883280 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '2.13'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70244739883280
|
36
|
+
description: puts を purs とか typo したときに推測して puts を呼び出したうえでログを出力するデバッガ的なあれ
|
37
|
+
email:
|
38
|
+
- pasberth@gmail.com
|
39
|
+
executables: []
|
40
|
+
extensions: []
|
41
|
+
extra_rdoc_files:
|
42
|
+
- History.txt
|
43
|
+
- Manifest.txt
|
44
|
+
files:
|
45
|
+
- lib/typofixer.rb
|
46
|
+
- lib/typofixer/typotracker.rb
|
47
|
+
- README.rdoc
|
48
|
+
- History.txt
|
49
|
+
- Manifest.txt
|
50
|
+
homepage: https://github.com/pasberth/TypoFixer
|
51
|
+
licenses: []
|
52
|
+
post_install_message:
|
53
|
+
rdoc_options:
|
54
|
+
- --main
|
55
|
+
- README.rdoc
|
56
|
+
require_paths:
|
57
|
+
- lib
|
58
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
60
|
+
requirements:
|
61
|
+
- - ! '>='
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
requirements: []
|
71
|
+
rubyforge_project: typofixer
|
72
|
+
rubygems_version: 1.8.10
|
73
|
+
signing_key:
|
74
|
+
specification_version: 3
|
75
|
+
summary: puts を purs とか typo したときに推測して puts を呼び出したうえでログを出力するデバッガ的なあれ
|
76
|
+
test_files: []
|