typofixer 0.0.1
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 +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: []
|