saino.me

都内でひっそりと生きる IT エンジニアの個人ブログです

MiniDiff (仮) gem を作ることを考える

個人用で後で作ろうと思っていたものなので、メモみたいな形になっています。

概要

diffy gem は 内部で diff コマンドを利用しているため、 実行環境に diff コマンドをインストールすることが必須になっている

diff-lcs は一部 ldiff という形でコマンドが提供されているが、bin に関しては多機能になりすぎないようにしている。

diff-lcs の挙動は十分に優秀なので、これらを活用して、使うことが簡単な diff の gem を作ることを目指す

機能的なこと

必要な機能としては man diff 相当でいうと

  • --label でラベルが付与できること
    • とはいえ --label オプションは暗黙的に 1つ目が old、2つ目が new となっているので、もう少しオプションはわかりやすい名前にしてもいいかもしれない
  • また、-I オプション(ignore-matching-lines) オプションである

とりあえず上記をサポートしつつ、diffy のようなインタフェースがあることを目指す (diffy の API の切り方にはセンスを感じる)

バイナリファイルのサポートはしない

context (-c) 形式 と unified (-u) 形式をサポートする

主にフォーカスする箇所

github.com

  • この部分(ldiff.rb)を徹底的に作り込む形にする

参考情報: diff-lcs から返ってくるデータ構造

=> #<Diff::LCS::Hunk:0x00007f907110e9c0
 @blocks=
  [#<Diff::LCS::Block:0x00007f907110e998
    @changes=[["-", 0, "all: build"], ["+", 0, "all: built"]],
    @insert=[["+", 0, "all: built"]],
    @remove=[["-", 0, "all: build"]]>],
 @data_new=
  ["all: built",
   "",
   "build: depend peg bindata",
   "\tgo build",
   "",
   "peg:",
   "\tpeg erd.peg",
   "",
   "run: build",
   "\tcat examples/nfldb.er | ./erd-go -o nfldb.dot",
   "",
   "depend:",
   "\tglide install",
   "",
   "bindata:",
   "\tgo-bindata -o=templates_bindata.go ./templates/...",
   "",
   "examples: build",
   "\tcat examples/simple.er | ./erd-go -o examples/outputs/simple.dot",
   "\tcat examples/simple.er | ./erd-go | dot -Tpng -o examples/outputs/simple.png",
   "\tcat examples/nfldb.er | ./erd-go -o examples/outputs/nfldb.dot",
   "\tcat examples/nfldb.er | ./erd-go | dot -Tpng -o examples/outputs/nfldb.png"],
 @data_old=
  ["all: build",
   "",
   "build: depend peg bindata",
   "\tgo build",
   "",
   "peg:",
   "\tpeg erd.peg",
   "",
   "run: build",
   "\tcat examples/nfldb.er | ./erd-go -o nfldb.dot",
   "",
   "depend:",
   "\tglide install",
   "",
   "bindata:",
   "\tgo-bindata -o=templates_bindata.go ./templates/...",
   "",
   "examples: build",
   "\tcat examples/example.er | ./erd-go -o examples/outputs/simple.dot",
   "\tcat examples/simple.er | ./erd-go | dot -Tpng -o examples/outputs/simple.png",
   "\tcat examples/nfldb.er | ./erd-go -o examples/outputs/nfldb.dot",
   "\tcat examples/nfldb.er | ./erd-go | dot -Tpng -o examples/outputs/nfldb.png"],
 @end_new=3,
 @end_old=3,
 @file_length_difference=0,
 @preferred_data_encoding=#<Encoding:UTF-8>,
 @start_new=0,
 @start_old=0>