読者です 読者をやめる 読者になる 読者になる

たごもりすメモ

コードとかその他の話とか。

Sinatra1.1.0の変更点を翻訳してみる

ruby sinatra

Sinatra 1.1.0 がリリースされました。
sinatra/CHANGES at 1.1.0 · sinatra/sinatra · GitHub

手元のコードをSinatra 1.1対応しようと思ってCHANGESを眺めて、簡単に翻訳してみようかなと思った。のでだらだら。いいかげん訳なのであんまり本気で信じないで、みんなちゃんと英語の原文に当たるといいと思います。
あと 1.0 が理解の前提になってるのは言うまでもありません。

  • before/after フィルタに、パスのパターンマッチ(パラメータキャプチャつき)が使えるようになった
before('/user/:name') { |name| ... }
  • scssテンプレートをレンダリングするために scss というメソッドおよびファイル拡張子 .scss が使えるようになった
  • 以下のテンプレート(用のメソッド)が使えるようになった
    • `liquid`, `markdown`, `nokogiri`, `textile`, `rdoc`, `radius`, `markaby`
  • 静的ファイルに対する HTTP_RANGE ヘッダのサポート
    • ただし Multi-range リクエストはまだサポートされていない
  • #settings メソッドがクラス内でもトップレベルでも使えるようになった
  • set で複数の値を指定する際に #to_hash に依存しなくなった
    • Enumerable なものはなんでも使用可能となった
  • ネストしたテンプレートについては :layout のデフォルト値が false になった
    • partial を描画するときにいちいち :layout => false を指定しなくてよくなった
  • レンダリング関数が複数の値(ひとつめが content body でふたつめが content type であるような値)を返して、かつ content-type が明示的にセットされていない場合に 'text/html' でなく渡された値を content-type として使うようにした
    • (訳注) こみいった英語で正しく読めているかいまいち自信がない
  • 以下の言語の README も含まれた(日本語は古かったのがアップデートされた)
    • Chinese (Wu Jiang), French (Mickael Riga), German (Bernhard Essl, Konstantin Haase, burningTyger), Hungarian (Janos Hardi) and Spanish (Gabriel Andretta). Japanese (Kouhei Yanagita)
  • Sinatraが保持する template_cache に外からアクセスできるようになった
  • last-modified をセットするときに DateTime が使えるようになった(出力はちゃんと文字列で出るよ)
  • ステータスコード 599 が正しく出せるようになった
    • なにこれ? と思ってぐぐってみたら、返すWebサーバがちらほらあるみたい……まあRFC的に予約された範囲内のコードなのは確かだが
  • 1.9.2 に対応しています
    • これまではSinatraRubyがcall stackに積んだが実在しないファイルを読み込もうとしてしまっていた
    • もしかして require 'ldap' したあと LDAP::Conn.new したときに死亡してたのはこれが原因なのかな?
  • 1.8.6 使用時のメモリリークに対応するコードを入れた
    • ただし本質的には 1.8.6 のバグのせいで、対応コードはテンプレートのparseに余計なオーバーヘッドをかけている
    • できれば 1.8.7 以降を使いましょう
  • Rails3 と同居できるようになった
    • Rails3アプリケーションの subpath にSinatraをマウントできるようになった
    • PATH_INFO の先頭には / がつかないので、routeは何もマッチしない
      • PATH_INFO 云々の話は rails 側の route について? Sinatra のパス指定は / が先頭につくから、それで棲み分けられるよってことかなあ
      • だれかくわしいひとー
  • 1.9 におけるエンコーディングの扱いがよくなった
    • params のデフォルトエンコーディングutf-8 になった
    • 自分で before で変換してたのをやらなくてよくなった!
  • 開発環境におけるエラー画面処理(stack traceとか出してた特殊なフック出力)が、 :after_handlers がセットされている場合、カスタムのエラーハンドラ( error ExceptionName do ... end ) より後に処理されるようになった
    • このため、開発環境においてこのエラー出力画面を抑制できるようになった
  • 重みづけ HTTP_ACCEPT ヘッダが使えるようになった
    • 品質値 とか言われたりすることもあるらしい。(参考)
  • send_file はセットされた :type オプションを常に優先するようになった
    • これまでは mime-type に見付からなかったら無視されていたが、今後はマッチしなくても指定された内容がそのまま送られるようになった
  • redirect メソッドによるリダイレクトは、必ず絶対パスとしてリダイレクトすることになった
    • 相対パスっぽい文字列がリダイレクト先に指定された場合でも絶対パスに対してリダイレクトする (RFC 2616 section 14.30)
    • これって相対パスっぽいURIを現在のパスに対して解決して絶対パスに直すのか、それとも単に頭に / をつけるのかがよくわからん
  • README の Erubis、 Haml および Test::Unit についてダメな感じのサンプルが載っていたのを修正
  • SIGTERM が送られてきたらちゃんと処理するようになった
  • インラインテンプレートつき modular タイプのアプリケーションが 'run!' でちゃんと起動するように修正した
  • インラインテンプレートの末尾にあるスペースが無視されるようになった
  • カスタムのrequireが定義されたなんか別のパッケージマネジメントシステムと同居できるようになった
  • GitHub の問題があったので Lighthouse を外した
  • Tilt はまだあるけど、次からバンドルされなくなるよ (Tilt is now a dependency and therefore no longer ships bundled with Sinatra.)
    • "dependency" の意味ってそういう解釈でいいのかなあ
  • TiltはSinatraの依存パッケージ、ということにして外部に出したので、もうSinatra自体にはバンドルされなくなった
  • Rack 1.1 依存で、Rack 1.0 はもうサポート外

思ったより激しく修正されてるなー。自分が嬉しそうな項目がいくつかあるので Sinatra++ という感じ。