前回の記事はこちら。 前回のアップデートからrfコマンドはv1.21.0からv1.22.0に、mruby-yyjsonはv1.2.0からv1.5.0になった。 このアップデートで念願のjson出力時の色付けに対応した!やったぜ!
jsonの色付け対応に併せてminify(-mオプション)にも対応してみた。
jsonの色つけ対応はmruby-yyjsonで行っているので、rfのアップデートはそのバージョンのmruby-yyjsonにアップデートしたという感じ。 以下はmruby-yyjsonのアップデート内容について記載する。
mrubyからJSONへの変換をyyjsonから自作ジェネレータにしたが、yyjsonに戻した
mrubyオブジェクトからJSONへの変換にyyjsonのWriter機能を使っていた。 しかし、色をつけるためにエスケープシーケンスを含めようとすると、Writerの機能でエスケープされてしまうということがわかった… JSONの仕様では制御コードは文字列に含められないのでエスケープするという決まりなので、これは仕方ないとおもう。
そこで、JSONへの変換部分を自作することにした。それがv1.3.0になる。 それ自体はうまく動いていたのだが、色々テストしていたらものすごく遅くなってしまった。。 さすがに許容できない遅さだったのでyyjsonに戻すことにした。
yyjsonに戻すとなると先述の制御コードのエスケープ問題があるが、これを回避するためにyyjsonにはRAWタイプという指定ができるAPIがある。 これを使うと指定した文字列をそのまま出力することができるので、制御コードを含めてもエスケープされずに出力される。 しかし、ハッシュ*1のキーにこのRAWを指定すると正しく出力されないことがわかった。
JSON.dump({foo: "bar"}) #=> {"foo", "bar"} キーをRAWにすると:じゃなくて,区切りになってしまう #=> {"foo": "bar"} 本来はこのように出力してほしい
これもJSONの仕様でRAWをキーに指定することはない*2ので考慮されていないとおもわれる。 これは仕方ないのでパッチを当てることにした。
このパッチでRAWをハッシュのキーに指定できるようになったので色付け表示もできるようになった。