Time to Read

5分

スィナトゥラパデュリ~ノの最新バージョンがめでたく リリースされました。 1.3.0 は大変難産だったようなので、おめでとうございます。

ブログCHANGELOG等を見て、まずはざっくり Sinatra 1.3.0 を紹介させていただきます。で、こっそりとリリースされ続けてきた Padrino 0.10.0~0.10.3 での主な変更点は明日紹介させていただきます……。

ということで。

stream API の追加

一番の目玉はこれです。きっと。

1
2
3
4
5
6
7
8
9
get '/' do
  stream do |out|
    out << "It's gonna be legen -\n"
    sleep 0.5
    out << " (wait for it) \n"
    sleep 1
    out << "- dary!\n"
  end
end

要するに、「レスポンスボディをちょっとずつ返す」ことが出来るようになりました、ただ、現状 WEBRick でのみ意図した挙動にならないそうです。開発用でも Thin などの導入をすると良いかと思います。

また、 Thin のような「Evented」なサーバであれば、コネクションを保ったまま、増えていくメッセージを受け取りつづけたりすることができるそうです。ツイッタ~の何とかストリーミングAPIみたいなことができる、っつーことでしょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
set :server, :thin
connections = []
 
get '/' do
  # keep stream open
  stream(:keep_open) { |out| connections << out }
end
 
post '/' do
  # write to all open streams
  connections.each { |out| out << params[:message] << "\n" }
  "message sent"
end

ドキュメントが十分でないようなので、RDoc当該クラス、また、ソース自体もご参照ください。スケジューラが切り替え可能なようですし、具体的な使い方を色々試して見るのが良さそう。

HTTP の PATCH メソッドをサポート

Github API を利用するにあたり有利なようですね?

logger ヘルパーが使えるようになった

い、今まで使えなかったの…… disable :logging しても問題なくログをとるそうです した場合はloggerはすべて無効になるようです。

A logger helper for logging is available now, and if it writes to the logs depends on whether you enabled or disabled logging:

1
2
3
4
5
6
configure(:test) { disable :logging }
 
get '/' do
  logger.info "I just want to let you know: I'll take care of the request!"
  "Hello World!"
end

erubis を読み込んでいれば、 erb ヘルパーが erubis を使ってくれる

Padrino なら元々そういう動きをするんですけど、 Sinatra だけの場合もサポートされました。

rack-protection の利用を開始

rack-protection は、各種攻撃をRack層で防ぐミドルウェアスイートです。デフォルトで有効になるようになりました。具体的にどういうのを防いでくれるかは README をご参照ください。 CSRF、XSS、クリックジャック、セッションハイジャック、ディレクトリトラバーサルなどなど……。

使えばとりあえずOK、ということでもないと思いますが、その手の対応がだいぶ楽になるのではないかと。

その他目についたところ

  • request.accept? が追加され、 Accept ヘッダーを解釈するようになりました。
  • informal?, success?, redirect?, client_error?, server_error?, not_found? といったショートカットヘルパーが用意されました。ステータスコードに応じて適切なbool値を返します。
  • If-Unmodified-Since ヘッダーをサポートします。
  • etag, last_modified といったヘルパーがより望ましい挙動をします。
  • Creole テンプレートをサポート。 “Creole is a standardized wiki markup” だそうです。たくさんのテンプレートをサポートしていますね。
  • URL のパターンマッチ (get '/hogehoge/:foo') が、エスケープされたPATH_INFOにマッチするようになりました。なので、 /foo%2Fbar/foo/bar は扱いが変わるということです。
  • settings.app_file が、 Sinatra::Base のサブクラスが定義されたファイルを自動的に検出してセットされるようになりました。
  • :public セッティングが :public_folder にリネームされています。「public」は組み込みのメソッドなので衝突を避けるためです。 set(:public, ...) はまだ動作しますが、警告を出します。
  • set(:x, :a => 1); set(:x :b => 2) のようなコードは、 settings.x の中身を {:a => 1, :b => 2} のようにマージします。 set(:x, {:a => 1}, true) と書けば上書きになるようです。

まだまだ、大変たくさんあります、、、 CHANGELOG をざっくり見ると楽しいかもしれません。関係ないデスが「Not Yet Released」を外す前にタグを打っちゃったみたいですね……

バックポートリリース: Sinatra 1.2.7

Sinatra 1.3.0 では、 1.3 より前の Rack と、 Ruby 1.8.6 のサポートを打ちっています。また互換性が軽視されてると思った? でも残念、Sayaka Sinatra 1.2 系はメンテナンスされ続けるんでした!

具体的には、Rack 1.2.x が死ぬその日までバグフィックスが出され、なおかつ Ruby 1.8.6 とずっとコンパッチブルなんだそうです。 Ruby 1.8.6 と頑張りつづける宣言は結構デカい気もします。

ということで一緒に 1.2.7 が出ています。バグフィックス中心のようですが、 CHANGELOG を見てみてください。

sinatra-contrib

Sinatra 本体と同じバージョンが振られるようになったそうです。参考。 全体的に便利にしてくれます。

  • Rails 風 #content_for ヘルパー
  • namespace の導入
  • Rails 風 #respond_with
  • Sinatra::Reloader
  • テスト向けの簡単なヘルパー

なんかが入っています。 Padrino を大々的に使うと(たとえば Padrino::Routing)、 Sinatra の文法からそれなりに離れてしまうので、 Sinatra 感をキープしたいときなどに便利に使えそうですね。

閑話休題: Sinatra の本のお話し

Sinatra: Up and Running

著者/訳者:Alan Harris Konstantin Haase

出版社:Oreilly & Associates Inc( 2011-12-06 )

ペーパーバック ( 103 ページ )


こういう洋書が出ます。円高で大変お買い得な感じですが、さっき見たら 発売日: 2011/10/31 となっていましたし、こないだは 発売日: 2011/09/30 だったような気がします。いつ出るんでしょう。予約しておけばきっといつか届くのでとりあえず押さえといてもいいかもしれませんね[PR]

で、

Padrino 0.10.3 も無事リリースされています。じつは 0.10.0 辺りから色々と変わっているので、次回はこの辺の変更をまとめて紹介しつつ、 Padrino framework を宣伝したいと思います。

ということで、書きました -> Sinatra 1.3.0 & Padrino 0.10.3 がリリースされました。ざっくり紹介(2)。

* * *

なお、あんまり確認しないで書いてたりするので、間違いがあったら教えてください。お手柔らかに…。