2008/12/09

command-line-with-ruby

コマンドラインで対話するためのクラスを作ってみた。
http://doc.loveruby.net/refm/api/view/class/Timeout
を参考にした。
リファレンスに書かれているように何秒かするとタイムアウトし終了するようにした。$stdin で受けとる文字列が yes or no の場合と、数字の場合と、アルファベットなど文字を1文字の場合とを用意してみた。timeout() は、require 'timeout'しないと使えないけれど、もしもほかの用事で require 'net/http' していたら require 'timeout' を書かなくても timeout() を使うことができた。

CommandLine.new().yesorno
y or yes のとき true をそれ以外の場合 false をかえす。

% ruby19 -rmyttymess.rb -ve "Myttymess::CommandLine.new().yesorno"
ruby 1.9.1 (2008-10-28 revision 19983) [i386-darwin9.5.0]
Please Select [y/n]:
y
true
% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().yesorno"
Please Select [y/n]:
n
false
% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().yesorno"
Please Select [y/n]:
a
false
% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().yesorno"
Please Select [y/n]:
Timeout...bye.
false


CommandLine.new().character
1つの文字であればその文字を返し、そうでない場合 false が返る。数字の場合も1桁の数字ならok。
ruby 1.9 の場合 日本語の「あ」も1文字と解釈してくれた。
ruby 1.8.6 の場合は false になった。

% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().character"
Please input one char:
a
"a"
% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().character"
Please input one char:
abc
false
% ruby19  -rmyttymess.rb -ve "Myttymess::CommandLine.new().character"
ruby 1.9.1 (2008-10-28 revision 19983) [i386-darwin9.5.0]
Please input one char:
あ
"あ"
% ruby -rmyttymess.rb -ve "Myttymess::CommandLine.new().character"
ruby 1.8.6 (2008-03-03 patchlevel 114) [universal-darwin9.0]
Please input one char:
あ
false


CommandLine.new().number(max)
max に指定した数字以下なら入力された数字を それ以外の場合 falseを アルファベットなど文字の場合 false を

% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().number(10)"
Please Select Number:
9
"9"
% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().number(10)"
Please Select Number:
10
"10"
% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().number(10)"
Please Select Number:
11
false
% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().number(10)"
Please Select Number:
a
false


myttymess.rb

1 #!/pathto/ruby19/bin/ruby
2 # -*- coding: utf-8 -*-
3 
4 # myttymess.rb
5 # ruby 1.9.1 (2008-10-28 revision 19983) [i386-darwin9.5.0]
6 # 2008-12-06.
7 
8 ######################################################
9 # reference:
10 # http://doc.loveruby.net/refm/api/view/class/Timeout
11 ######################################################
12 
13 # if require 'net/http', unnecessarily require 'timeout'.
14 # 'net/http.rb' require 'net/protocol.rb'. 'net/protocol.rb' require 'timeout'.
15 
16 require 'timeout'
17 
18 module Myttymess
19 
20   class MyError < Exception; end
21 
22   class StdinGets
23 
24     def interactive(mess, opt)
25       return false unless $stdin.tty? == true
26       print "#{mess}:\n"
27       ans = $stdin.gets.chop
28       m = /^y$|^yes$/.match(ans)
29       return false if /n/.match(ans) # n or no == stop
30       return false if ans.empty?     # ans is String class
31       case opt
32       when true   # yes or no
33         return false if m.nil?
34         return true
35       when false  # return one character
36         return false if ans.size > 1
37         return ans
38       else        # return number =< Max Number
39         return false if ans == "0"
40         return false if ans =~ /\D/
41         return false if ans.to_i > opt.to_i
42         return ans
43       end
44     end
45 
46     def message(str,opt)
47       ans = ''
48       begin
49         timeout(5, MyError){ans = interactive(str, opt)}
50       rescue MyError => err
51         puts "Timeout...bye.\n"
52         return false
53       end
54       return ans
55     end
56 
57   end
58 
59   class CommandLine
60 
61     def yesorno
62       str =  "Please Select [y/n]"
63       p ans = StdinGets.new().message(str, true)
64       return ans
65     end
66 
67     def number(max)
68       str =  "Please Select Number"
69       p ans = StdinGets.new().message(str, max)
70     end
71 
72     def character
73       str =  "Please input one char"
74       p ans = StdinGets.new().message(str, false)
75     end
76 
77   end
78 
79 end
80 
81 #Myttymess::CommandLine.new().yesorno
82 #Myttymess::CommandLine.new().number(max)
83 #Myttymess::CommandLine.new().character


--imported_from
http://www.midore.net/daybook/2008/12/1228833000.html

0 件のコメント: