コマンドラインアプリ作成にちょっと便利なStringの拡張

githubをうろうろしていたら「なるほど」と思ったコードを見つけたのでメモっておく。

get-twitter-oauth-token / bin / get-twitter-oauth-token (gistじゃないので残念ながら埋め込むことができない。コピペするのも微妙なのでリンクだけ提示しておく)

これは@jugyoさん作のコマンドラインからTwitterのOAuthのアクセストークンと秘密鍵を取得するスクリプトで、openコマンドを使ってるあたり多分Mac専用なんだと思う(Linuxとかでもあるのかな?)。

なるほどなーと思ったのはStringを拡張しているcolorとaskという二つのメソッド。

colorはその名のとおり文字列に色をつけるもので、引数numにはANSIエスケープシーケンス(?)で指定できる色の番号を渡す(「bashのプロンプトに色をつける」などを参照。zshでもいける)。

もうひとつのaskはユーザからの入力を受け付けを表示するもので、レシーバの文字列を印字してから入力された内容を返す。凄く短いメソッドだけど、これひとつだけで可読性が向上するから感動してしまった。

ただこれだとパスワードの入力もみえてしまうので、sttyを使って入力中の文字列を表示しないメソッドもあったほうが便利だと思い、ちょっと書いてみた。

#!/usr/bin/env ruby
# coding: utf-8
class String
def color num
"\e[#{num}m#{self}\e[0m"
end
def ask
print "#{self}"
gets.strip
end
def ask_password
system("stty -echo")
print "#{self}"
gets.strip
ensure
system("stty echo")
end
end
if __FILE__ == $0
login = "Login: ".color(36).ask
pass = "Password: ".color(31).ask_password
puts ""
end
view raw cli_support.rb hosted with ❤ by GitHub

ask_passwordなんて長ったらしいけど、パスワードはそうそう聞くものでもないしまぁいいかな、と。askとcolorはそのまま拝借した。これがあるだけでコマンドラインアプリがちょっと書きやすくなるんじゃないかと思う。