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 ADDED
@@ -0,0 +1,2 @@
1
+
2
+ * Alpha
data/Manifest.txt ADDED
@@ -0,0 +1,5 @@
1
+ lib/typofixer.rb
2
+ lib/typofixer/typotracker.rb
3
+ README.rdoc
4
+ History.txt
5
+ Manifest.txt
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,9 @@
1
+ #!/usr/bin/env ruby
2
+ $:.unshift(File.dirname(__FILE__)) unless
3
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
4
+
5
+ module TypoFixer
6
+ VERSION = "0.0.1"
7
+ end
8
+
9
+ require 'typofixer/typotracker'
@@ -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: []