Rubyのコマンドで標準入力と引数ファイル名で同じように扱いたい

$ foo-command ./bar.file

で扱えるものは

$ cat ./bar.file | foo-command

もしくは

$ cat ./bar.file | foo-command -

で扱えてほしいという話。

主にUnix哲学にかぶれるとこういうことを言い出す。

または、parserというruby gemが提供するruby-parse, ruby-rewriteコマンドが標準入力を受けて、というのが出来ないので、ruby-parse-wrapped, ruby-rewrite-wrapped というコマンドを提供するparser-cli_wrapperというruby gemを書いたという話。

やりたいのはreadmeに書いたとおり、

$ cat Gemfile
source 'https://rubygems.org';

gemspec

$ ruby-parse Gemfile
(begin
  (send nil :source
    (str "https://rubygems.org"))
  (send nil :gemspec))

こう動くコマンドがあったら、こうも動いてほしいよね、という。

$ cat Gemfile | ruby-parse -
(begin
  (send nil :source
    (str "https://rubygems.org"))
  (send nil :gemspec))

で、ここまでだったらparserにそういうpull request作って終わりなんだけど、実際はEnable stdin with ruby-parse commitまで作ったけど実装練れてない感じがしたので踏みとどまって、wrapして別のコマンド提供するgem作った。

うーんってなって書いた実装がコレ 標準入力あったら-e で渡す方に詰めとく
https://github.com/sanemat/parser-cli_wrapper/blob/04fbe925f53fc2ed3110ef3588aef7b9a431c62d/bin/ruby-parse-wrapped
もとがこれ
https://github.com/whitequark/parser/blob/c8897941723c9b94000a1065b007ea71caa18c46/bin/ruby-parse

自分で書くなら、そもそも標準入力で渡される方を先に書いて、fileも読み取れるようにする、から、その点は無理なく書いていけそう(その代わり複数ファイルのときに?? ってなりそう)。parserの場合、ruby-parse FILEruby-parse -e 'some ruby code'で出力されるASTがちょっと異なっていて、具体的にはAST側にファイルを囲むbeginってのが出ない、おそらく普通使うときはファイルベースだよね、ってところでむむむってなった。

むむむってなったので、tempfileにひとまず書き出して、それをファイルとして読む、という二度手間することにした。それどこに書くの? というのも迷って、
binの中に
https://github.com/sanemat/parser-cli_wrapper/blob/04fbe925f53fc2ed3110ef3588aef7b9a431c62d/bin/ruby-parse-wrapped
こんなにロジックでうめつくすのはおかしいだろ、って思うから、なんか解決方法はあるだろうけど知らない。どこにどう書いたもんだろう?

Node.jsに行け、かなあ。

Edited(2014-11-25 2:16): なんでARGFにしなかったんだっけ? 忘れた 標準入力を取りつつ、オプションを活かしつつ、にしたかったからだと思う。ARGV.shiftしてARGF取り出せるようにすると、ARGV壊しちゃわない?あんまり理解できてない
http://stackoverflow.com/questions/20359129/stream-data-through-ruby-script-and-using-parameter-in-argv

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中