sinatra 0.9.6 → 1.0.a

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of sinatra might be problematic. Click here for more details.

Files changed (67) hide show
  1. data/CHANGES +83 -29
  2. data/README.jp.rdoc +552 -0
  3. data/README.rdoc +31 -9
  4. data/Rakefile +73 -91
  5. data/lib/sinatra.rb +0 -1
  6. data/lib/sinatra/base.rb +248 -269
  7. data/lib/sinatra/main.rb +3 -11
  8. data/lib/sinatra/tilt.rb +509 -0
  9. data/sinatra.gemspec +15 -49
  10. data/test/erubis_test.rb +82 -0
  11. data/test/extensions_test.rb +1 -1
  12. data/test/filter_test.rb +125 -3
  13. data/test/helpers_test.rb +59 -2
  14. data/test/mapped_error_test.rb +31 -0
  15. data/test/middleware_test.rb +1 -1
  16. data/test/request_test.rb +15 -0
  17. data/test/routing_test.rb +76 -0
  18. data/test/{options_test.rb → settings_test.rb} +46 -50
  19. data/test/static_test.rb +13 -0
  20. data/test/templates_test.rb +43 -10
  21. data/test/views/error.erubis +3 -0
  22. data/test/views/hello.erubis +1 -0
  23. data/test/views/layout2.erubis +2 -0
  24. metadata +61 -88
  25. data/compat/app_test.rb +0 -282
  26. data/compat/application_test.rb +0 -262
  27. data/compat/builder_test.rb +0 -101
  28. data/compat/compat_test.rb +0 -12
  29. data/compat/custom_error_test.rb +0 -62
  30. data/compat/erb_test.rb +0 -136
  31. data/compat/events_test.rb +0 -78
  32. data/compat/filter_test.rb +0 -30
  33. data/compat/haml_test.rb +0 -237
  34. data/compat/helper.rb +0 -34
  35. data/compat/mapped_error_test.rb +0 -72
  36. data/compat/pipeline_test.rb +0 -45
  37. data/compat/public/foo.xml +0 -1
  38. data/compat/sass_test.rb +0 -67
  39. data/compat/sessions_test.rb +0 -42
  40. data/compat/streaming_test.rb +0 -133
  41. data/compat/sym_params_test.rb +0 -18
  42. data/compat/template_test.rb +0 -30
  43. data/compat/use_in_file_templates_test.rb +0 -47
  44. data/compat/views/foo.builder +0 -1
  45. data/compat/views/foo.erb +0 -1
  46. data/compat/views/foo.haml +0 -1
  47. data/compat/views/foo.sass +0 -2
  48. data/compat/views/foo_layout.erb +0 -2
  49. data/compat/views/foo_layout.haml +0 -2
  50. data/compat/views/layout_test/foo.builder +0 -1
  51. data/compat/views/layout_test/foo.erb +0 -1
  52. data/compat/views/layout_test/foo.haml +0 -1
  53. data/compat/views/layout_test/foo.sass +0 -2
  54. data/compat/views/layout_test/layout.builder +0 -3
  55. data/compat/views/layout_test/layout.erb +0 -1
  56. data/compat/views/layout_test/layout.haml +0 -1
  57. data/compat/views/layout_test/layout.sass +0 -2
  58. data/compat/views/no_layout/no_layout.builder +0 -1
  59. data/compat/views/no_layout/no_layout.haml +0 -1
  60. data/lib/sinatra/compat.rb +0 -258
  61. data/lib/sinatra/test.rb +0 -129
  62. data/lib/sinatra/test/bacon.rb +0 -19
  63. data/lib/sinatra/test/rspec.rb +0 -13
  64. data/lib/sinatra/test/spec.rb +0 -11
  65. data/lib/sinatra/test/unit.rb +0 -13
  66. data/test/render_backtrace_test.rb +0 -145
  67. data/test/test_test.rb +0 -155
data/CHANGES CHANGED
@@ -1,50 +1,104 @@
1
- = 0.9.6 / 2010-03-07
1
+ = 1.0 / unreleased
2
2
 
3
- * Work around for segfault under Ruby >= 1.8.7p248 and 1.9.2dev. See
4
- MRI bug #2781 for more information:
5
- http://redmine.ruby-lang.org/issues/show/2781
3
+ * It's now possible to register blocks to run after each request using
4
+ after filters. After filters run at the end of each request, after
5
+ routes and error handlers.
6
6
 
7
- = 0.9.5 / 2010-03-04
7
+ * Sinatra now uses Tilt <http://github.com/rtomayko/tilt> for rendering
8
+ templates. This adds support for template caching, consistent
9
+ template backtraces, and support for new template engines, like
10
+ mustache and liquid.
8
11
 
9
- * Fix use_in_file_templates! with jRuby on Windows.
12
+ * New boolean 'reload_templates' setting controls whether template files
13
+ are reread from disk and recompiled on each request. Template read/compile
14
+ is cached by default in all environments except development.
10
15
 
11
- * Fix sinatra/test to work with Rack > 1.0.1
16
+ * New 'settings' method gives access to options in both class and request
17
+ scopes. This replaces the 'options' method.
18
+ * New 'erubis' helper method for rendering Erubis templates.
12
19
 
13
- * UI improvements to the show exception page.
20
+ * New 'cache_control' helper method provides a convenient way of
21
+ setting the Cache-Control response header. Takes a variable number
22
+ of boolean directives followed by a hash of value directives, like
23
+ this:
24
+ cache_control :public, :must_revalidate, :max_age => 60
14
25
 
15
- * Slightly improved doc coverage.
26
+ * New 'expires' helper method is like cache_control but takes an
27
+ integer number of seconds or Time object:
28
+ expires 300, :public, :must_revalidate
16
29
 
17
- * New 'settings' method gives access to options in both class and request
18
- scopes. This replaces the 'options' method. (Chris Wanstrath)
30
+ * Sinatra apps can now be run with a `-h <addr>` argument to specify
31
+ the address to bind to.
32
+
33
+ * Rack::Session::Cookie is now added to the middleware pipeline when
34
+ running in test environments if the :sessions option is set.
35
+
36
+ * Route handlers, before filters, templates, error mappings, and
37
+ middleware are now resolved dynamically up the inheritance hierarchy
38
+ when needed instead of duplicating the superclass's version when
39
+ a new Sinatra::Base subclass is created. This should fix a variety
40
+ of issues with extensions that need to add any of these things
41
+ to the base class.
42
+
43
+ The following Sinatra features have been obsoleted in the 1.0 release:
44
+
45
+ * The `sinatra/test` library is obsolete. This includes the
46
+ `Sinatra::Test` module, the `Sinatra::TestHarness` class,
47
+ and the `get_it`, `post_it`, `put_it`, `delete_it`, and `head_it`
48
+ helper methods. The
49
+ [`Rack::Test` library](http://gitrdoc.com/brynary/rack-test) should
50
+ be used instead.
19
51
 
20
- * `Sinatra::Default` is obsolete; use `Sinatra::Base` instead.
21
- `Sinatra::Base` acts more like `Sinatra::Default` in development mode.
22
- For example, static file serving and sexy development error pages are
23
- enabled by default.
52
+ * Test framework specific libraries (`sinatra/test/spec`,
53
+ `sinatra/test/bacon`,`sinatra/test/rspec`, etc.) are obsolete.
54
+ See http://www.sinatrarb.com/testing.html for instructions on
55
+ setting up a testing environment under each of these frameworks.
24
56
 
25
- * The `:methodoverride' option to enable/disable the POST _method hack is
26
- obsolete; use `:method_override` instead.
57
+ * Auto-requiring template libraries in the `erb`, `builder`, `haml`,
58
+ and `sass` methods is obsolete due to thread-safety issues. You must
59
+ require the template libraries explicitly in your app.
27
60
 
28
- * The 'media_type' helper method is deprecated. Use 'mime_type' instead.
61
+ * The `:views_directory` option to rendering methods is obsolete; use
62
+ `:views` instead.
29
63
 
30
- * The 'mime' main and class method is deprecated. Use 'mime_type' instead.
64
+ * The `:haml` and `:sass` options to rendering methods are obsolete.
65
+ Template engine options should be passed in the second Hash argument
66
+ instead.
31
67
 
32
- = 0.9.4 / 2009-07-26
68
+ * The 'media_type' helper method is obsolete. Use 'mime_type' instead.
33
69
 
34
- * The app_file and run options should be properly detected
35
- on Debian when installed from apt package.
70
+ * The request-level `send_data` method is no longer supported.
36
71
 
37
- * The :show_exceptions option now defaults to false in all
38
- cases for subclasses of Sinatra::Base.
72
+ * The `Sinatra::Event` and `Sinatra::EventContext` classes are no longer
73
+ supported. This may effect extensions written for versions prior to 0.9.2.
74
+ See [Writing Sinatra Extensions](http://www.sinatrarb.com/extensions.html)
75
+ for the officially supported extensions API.
39
76
 
40
- * Fix webrick server handler not found errors when starting
41
- from the command line without mongrel or thin [#231].
77
+ * The `set_option` and `set_options` methods are obsolete; use `set`
78
+ instead.
42
79
 
43
- * Fix locals not being passed to layouts.
80
+ * The `:env` setting (`settings.env`) is obsolete; use `:environment`
81
+ instead.
82
+
83
+ * The request level `stop` method is obsolete; use `halt` instead.
84
+
85
+ * The request level `entity_tag` method is obsolete; use `etag`
86
+ instead.
87
+
88
+ * The request level `headers` method (HTTP response headers) is obsolete;
89
+ use `response['Header-Name']` instead.
90
+
91
+ * `Sinatra.application` is obsolete; use `Sinatra::Application` instead.
92
+
93
+ * Using `Sinatra.application = nil` to reset an application is obsolete.
94
+ This should no longer be necessary.
44
95
 
45
- * Fix 'Illegal Seek' errors running under Apache/CGI.
96
+ * Using `Sinatra.default_options` to set base configuration items is
97
+ obsolete; use `Sinatra::Base.set(key, value)` instead.
46
98
 
47
- = 0.9.3 / unreleased
99
+ * The `Sinatra::ServerError` exception is obsolete. All exceptions raised
100
+ within a request are now treated as internal server errors and result in
101
+ a 500 response status.
48
102
 
49
103
  = 0.9.2 / 2009-05-18
50
104
 
@@ -0,0 +1,552 @@
1
+ = Sinatra
2
+
3
+ SinatraはRubyで下記のような最小労力で手早くウェブアプリケーションを作成するためのDSLです。
4
+
5
+ # myapp.rb
6
+ require 'rubygems'
7
+ require 'sinatra'
8
+ get '/' do
9
+ 'Hello world!'
10
+ end
11
+
12
+ gemをインストールして動かしてみる。
13
+
14
+ sudo gem install sinatra
15
+ ruby myapp.rb
16
+
17
+ http://localhost:4567 を見る。
18
+
19
+ == ルート
20
+
21
+ Sinatraでは、ルートはHTTPメソッドとURLマッチングパターンがペアになっています。
22
+ ルートはブロックに結び付けられています。
23
+
24
+ get '/' do
25
+ .. 何か見せる ..
26
+ end
27
+
28
+ post '/' do
29
+ .. 何か生成する ..
30
+ end
31
+
32
+ put '/' do
33
+ .. 何か更新する ..
34
+ end
35
+
36
+ delete '/' do
37
+ .. 何か削除する ..
38
+ end
39
+
40
+ ルートは定義された順番にマッチします。 リクエストに最初にマッチしたルートが呼び出されます。
41
+
42
+ ルートのパターンは名前付きパラメータを含むことができ、
43
+ <tt>params</tt>ハッシュで取得できます。
44
+
45
+ get '/hello/:name' do
46
+ # matches "GET /hello/foo" and "GET /hello/bar"
47
+ # params[:name] is 'foo' or 'bar'
48
+ "Hello #{params[:name]}!"
49
+ end
50
+
51
+ また、ブロックパラメータで名前付きパラメータにアクセスすることもできます。
52
+
53
+ get '/hello/:name' do |n|
54
+ "Hello #{n}!"
55
+ end
56
+
57
+ ルートパターンはsplat(またはワイルドカード)を含むこともでき、
58
+ <tt>params[:splat]</tt> で取得できます。
59
+
60
+ get '/say/*/to/*' do
61
+ # matches /say/hello/to/world
62
+ params[:splat] # => ["hello", "world"]
63
+ end
64
+
65
+ get '/download/*.*' do
66
+ # matches /download/path/to/file.xml
67
+ params[:splat] # => ["path/to/file", "xml"]
68
+ end
69
+
70
+ 正規表現を使ったルート:
71
+
72
+ get %r{/hello/([\w]+)} do
73
+ "Hello, #{params[:captures].first}!"
74
+ end
75
+
76
+ ブロックパラーメータを使用した場合:
77
+
78
+ get %r{/hello/([\w]+)} do |c|
79
+ "Hello, #{c}!"
80
+ end
81
+
82
+ ルートにはユーザエージェントのようなさまざまな条件を含めることができます。
83
+
84
+ get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
85
+ "You're using Songbird version #{params[:agent][0]}"
86
+ end
87
+
88
+ get '/foo' do
89
+ # Matches non-songbird browsers
90
+ end
91
+
92
+ == 静的ファイル
93
+
94
+ 静的ファイルは<tt>./public</tt>ディレクトリから配信されます。
95
+ <tt>:public</tt>オプションを指定することで別の場所を指定することができます。
96
+
97
+ set :public, File.dirname(__FILE__) + '/static'
98
+
99
+ 注意: この静的ファイル用のディレクトリ名はURL中に含まれません。
100
+ 例えば、<tt>./public/css/style.css</tt>は<tt>http://example.com/css/style.css</tt>でアクセスできます。
101
+
102
+ == ビュー / テンプレート
103
+
104
+ テンプレートは<tt>./views</tt>ディレクトリ下に配置されています。
105
+ 他のディレクトリを使用する場合の例:
106
+
107
+ set :views, File.dirname(__FILE__) + '/templates'
108
+
109
+ テンプレートはシンボルを使用して参照させることを覚えておいて下さい。
110
+ サブデレクトリでもこの場合は<tt>:'subdir/template'</tt>のようにします。
111
+ レンダリングメソッドは文字列が渡されると、そのまま文字列を出力します。
112
+
113
+ === Haml テンプレート
114
+
115
+ hamlを使うにはhamlライブラリが必要です:
116
+
117
+ ## hamlを読み込みます
118
+ require 'haml'
119
+
120
+ get '/' do
121
+ haml :index
122
+ end
123
+
124
+ <tt>./views/index.haml</tt>を表示します。
125
+
126
+ {Haml's options}[http://haml.hamptoncatlin.com/docs/rdoc/classes/Haml.html]
127
+ はSinatraの設定でグローバルに設定することができます。
128
+ {Options and Configurations}[http://www.sinatrarb.com/configuration.html],
129
+ を参照してそれぞれ設定を上書きして下さい。
130
+
131
+ set :haml, {:format => :html5 } # デフォルトのフォーマットは:xhtml
132
+
133
+ get '/' do
134
+ haml :index, :haml_options => {:format => :html4 } # 上書き
135
+ end
136
+
137
+
138
+ === Erb テンプレート
139
+
140
+ ## erbを読み込みます
141
+ require 'erb'
142
+
143
+ get '/' do
144
+ erb :index
145
+ end
146
+
147
+ <tt>./views/index.erb</tt>を表示します。
148
+
149
+ === Builder テンプレート
150
+
151
+ builderを使うにはbuilderライブラリが必要です:
152
+
153
+ ## builderを読み込みます
154
+ require 'builder'
155
+
156
+ get '/' do
157
+ content_type 'application/xml', :charset => 'utf-8'
158
+ builder :index
159
+ end
160
+
161
+ <tt>./views/index.builder</tt>を表示します。
162
+
163
+ === Sass テンプレート
164
+
165
+ Sassテンプレートを使うにはsassライブラリが必要です:
166
+
167
+ ## hamlかsassを読み込みます
168
+ require 'sass'
169
+
170
+ get '/stylesheet.css' do
171
+ content_type 'text/css', :charset => 'utf-8'
172
+ sass :stylesheet
173
+ end
174
+
175
+ <tt>./views/stylesheet.sass</tt>を表示します。
176
+
177
+ {Sass' options}[http://haml.hamptoncatlin.com/docs/rdoc/classes/Sass.html]
178
+ はSinatraの設定でグローバルに設定することができます。
179
+ see {Options and Configurations}[http://www.sinatrarb.com/configuration.html],
180
+ を参照してそれぞれ設定を上書きして下さい。
181
+
182
+ set :sass, {:style => :compact } # デフォルトのSass styleは :nested
183
+
184
+ get '/stylesheet.css' do
185
+ content_type 'text/css', :charset => 'utf-8'
186
+ sass :stylesheet, :sass_options => {:style => :expanded } # 上書き
187
+ end
188
+
189
+
190
+ === インラインテンプレート
191
+
192
+ get '/' do
193
+ haml '%div.title Hello World'
194
+ end
195
+
196
+ 文字列をテンプレートとして表示します。
197
+
198
+ === テンプレート内で変数にアクセスする
199
+
200
+ テンプレートはルートハンドラと同じコンテキストの中で評価されます。. ルートハンドラでセットされたインスタンス変数は
201
+ テンプレート内で直接使うことができます。
202
+
203
+ get '/:id' do
204
+ @foo = Foo.find(params[:id])
205
+ haml '%h1= @foo.name'
206
+ end
207
+
208
+ ローカル変数を明示的に定義することもできます。
209
+
210
+ get '/:id' do
211
+ foo = Foo.find(params[:id])
212
+ haml '%h1= foo.name', :locals => { :foo => foo }
213
+ end
214
+
215
+ このやり方は他のテンプレート内で部分テンプレートとして表示する時に典型的に使用されます。
216
+
217
+ === ファイル内テンプレート
218
+
219
+ テンプレートはソースファイルの最後で定義することもできます。
220
+
221
+ require 'rubygems'
222
+ require 'sinatra'
223
+
224
+ get '/' do
225
+ haml :index
226
+ end
227
+
228
+ __END__
229
+
230
+ @@ layout
231
+ %html
232
+ = yield
233
+
234
+ @@ index
235
+ %div.title Hello world!!!!!
236
+
237
+ 注意: sinatraをrequireするファイル内で定義されたファイル内テンプレートは自動的に読み込まれます。
238
+ 他のファイルで定義されているテンプレートを使うには <tt>use_in_file_templates!</tt>メソッドで指定します。
239
+
240
+ === 名前付きテンプレート
241
+
242
+ テンプレートはトップレベルの<tt>template</tt>メソッドで定義することができます。
243
+
244
+ template :layout do
245
+ "%html\n =yield\n"
246
+ end
247
+
248
+ template :index do
249
+ '%div.title Hello World!'
250
+ end
251
+
252
+ get '/' do
253
+ haml :index
254
+ end
255
+
256
+ 「layout」というテンプレートが存在する場合、そのテンプレートファイルは他のテンプレートが
257
+ 表示される度に使用されます。<tt>:layout => false</tt>.することでlayoutsを無効にできます。
258
+
259
+ get '/' do
260
+ haml :index, :layout => !request.xhr?
261
+ end
262
+
263
+ == ヘルパー
264
+
265
+ トップレベルの<tt>helpers</tt>を使用してルートハンドラやテンプレートで使うヘルパメソッドを
266
+ 定義できます。
267
+
268
+ helpers do
269
+ def bar(name)
270
+ "#{name}bar"
271
+ end
272
+ end
273
+
274
+ get '/:name' do
275
+ bar(params[:name])
276
+ end
277
+
278
+ == フィルタ
279
+
280
+ beforeフィルタはリクエストされたコンテキストを実行する前に評価され、
281
+ リクエストとレスポンスを変更することができます。フィルタ内でセットされた
282
+ インスタンス変数はルーティングとテンプレートで使用できます。
283
+
284
+ before do
285
+ @note = 'Hi!'
286
+ request.path_info = '/foo/bar/baz'
287
+ end
288
+
289
+ get '/foo/*' do
290
+ @note #=> 'Hi!'
291
+ params[:splat] #=> 'bar/baz'
292
+ end
293
+
294
+ == 強制終了
295
+
296
+ ルートかbeforeフィルタ内で直ちに実行を終了する方法:
297
+
298
+ halt
299
+
300
+ body部を指定することもできます ...
301
+
302
+ halt 'ここにbodyを書く'
303
+
304
+ ステータスとbody部を指定する ...
305
+
306
+ halt 401, '立ち去れ!'
307
+
308
+ == パッシング(Passing)
309
+
310
+ ルートは<tt>pass</tt>を使って次のルートに飛ばすことができます:
311
+
312
+ get '/guess/:who' do
313
+ pass unless params[:who] == 'Frank'
314
+ "見つかっちゃった!"
315
+ end
316
+
317
+ get '/guess/*' do
318
+ "はずれです!"
319
+ end
320
+
321
+ ルートブロックからすぐに抜け出し、次にマッチするルートを実行します。
322
+ マッチするルートが見当たらない場合は404が返されます。
323
+
324
+ == 設定
325
+
326
+ どの環境でも起動時に1回だけ実行されます。
327
+
328
+ configure do
329
+ ...
330
+ end
331
+
332
+ 環境変数<tt>:production</tt>(RACK_ENV環境変数) がセットされている時だけ実行する方法:
333
+
334
+ configure :production do
335
+ ...
336
+ end
337
+
338
+ 環境変数<tt>:production</tt> か<tt>:test</tt>の場合に設定する方法:
339
+
340
+ configure :production, :test do
341
+ ...
342
+ end
343
+
344
+ == エラーハンドリング
345
+
346
+ エラーハンドラーはルートコンテキストとbeforeフィルタ内で実行します。
347
+ <tt>haml</tt>、<tt>erb</tt>、<tt>halt</tt>などを使うこともできます。
348
+
349
+ === Not Found
350
+
351
+ <tt>Sinatra::NotFound</tt>が起きた時か レスポンスのステータスコードが
352
+ 404の時に<tt>not_found</tt>ハンドラーが発動します。
353
+
354
+ not_found do
355
+ 'ファイルが存在しません'
356
+ end
357
+
358
+ === エラー
359
+
360
+ +error+ ハンドラーはルートブロックかbeforeフィルタ内で例外が発生した時はいつでも発動します。
361
+ block or before filter. 例外オブジェクトはRack変数<tt>sinatra.error</tt>から取得されます。
362
+
363
+ error do
364
+ 'エラーが発生しました。 - ' + env['sinatra.error'].name
365
+ end
366
+
367
+ エラーをカスタマイズする場合は、
368
+
369
+ error MyCustomError do
370
+ 'エラーメッセージ...' + request.env['sinatra.error'].message
371
+ end
372
+
373
+ と書いておいて,下記のように呼び出します。
374
+
375
+ get '/' do
376
+ raise MyCustomError, '何かがまずかったようです'
377
+ end
378
+
379
+ そうするとこうなります:
380
+
381
+ エラーメッセージ... 何かがまずかったようです
382
+
383
+ 開発環境として実行している場合、Sinatraは特別な<tt>not_found</tt>と<tt>error</tt>ハンドラーを
384
+ インストールしています。
385
+
386
+ == MIMEタイプ
387
+
388
+ <tt>send_file</tt>か静的ファイルを使う時、Sinatraが理解でいないMIMEタイプがある場合があります。
389
+ その時は +mime_type+ を使ってファイル拡張子毎に登録して下さい。
390
+
391
+ mime_type :foo, 'text/foo'
392
+
393
+ == Rackミドルウェア
394
+
395
+ SinatraはRack[http://rack.rubyforge.org/]というRubyのWEBフレームワーク用の
396
+ 最小限の標準インターフェース 上で動作しています。Rack中でもアプリケーションデベロッパー
397
+ 向けに一番興味深い機能はミドルウェア(サーバとアプリケーション間に介在し、モニタリング、HTTPリクエストとレスポンス
398
+ の手動操作ができるなど、一般的な機能のいろいろなことを提供するもの)をサポートすることです。
399
+
400
+ Sinatraではトップレベルの+user+ メソッドを使ってRackにパイプラインを構築します。
401
+
402
+ require 'sinatra'
403
+ require 'my_custom_middleware'
404
+
405
+ use Rack::Lint
406
+ use MyCustomMiddleware
407
+
408
+ get '/hello' do
409
+ 'Hello World'
410
+ end
411
+
412
+ <tt>use</tt> の意味は{Rack::Builder}[http://rack.rubyforge.org/doc/classes/Rack/Builder.html] DSLで定義されていることと全て一致します。
413
+ 例えば +use+ メソッドはブロック構文のように複数の引数を受け取ることができます。
414
+
415
+ use Rack::Auth::Basic do |username, password|
416
+ username == 'admin' && password == 'secret'
417
+ end
418
+
419
+ Rackはログ、デバッギング、URLルーティング、認証、セッションなどいろいろな機能を備えた標準的ミドルウェアです。
420
+ Sinatraはその多くのコンポーネントを自動で使うよう基本設定されているため、+use+で明示的に指定する必要はありません。
421
+
422
+ == テスト
423
+
424
+ SinatraでのテストはRack-basedのテストライブラリかフレームワークを使って書くことができます。
425
+ {Rack::Test}[http://gitrdoc.com/brynary/rack-test] をおすすめします。やり方:
426
+
427
+ require 'my_sinatra_app'
428
+ require 'rack/test'
429
+
430
+ class MyAppTest < Test::Unit::TestCase
431
+ include Rack::Test::Methods
432
+
433
+ def app
434
+ Sinatra::Application
435
+ end
436
+
437
+ def test_my_default
438
+ get '/'
439
+ assert_equal 'Hello World!', last_response.body
440
+ end
441
+
442
+ def test_with_params
443
+ get '/meet', :name => 'Frank'
444
+ assert_equal 'Hello Frank!', last_response.body
445
+ end
446
+
447
+ def test_with_rack_env
448
+ get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
449
+ assert_equal "あなたはSongbirdを使ってますね!", last_response.body
450
+ end
451
+ end
452
+
453
+ 注意: ビルトインのSinatra::TestモジュールとSinatra::TestHarnessクラスは
454
+ 0.9.2リリース以降、廃止予定になっています。
455
+
456
+ == Sinatra::Base - ミドルウェア、ライブラリ、 モジュラーアプリ
457
+
458
+ トップレベル(グローバル領域)上でいろいろ定義していくのは軽量アプリならうまくいきますが、
459
+ RackミドルウェアやRails metal、サーバのコンポーネントを含んだシンプルな
460
+ ライブラリやSinatraの拡張プログラムを考慮するような場合はそうとは限りません。
461
+ トップレベルのDSLがネームスペースを汚染したり、設定を変えてしまうこと(例:./publicや./view)がありえます。
462
+ そこでSinatra::Baseの出番です。
463
+
464
+ require 'sinatra/base'
465
+
466
+ class MyApp < Sinatra::Base
467
+ set :sessions, true
468
+ set :foo, 'bar'
469
+
470
+ get '/' do
471
+ 'Hello world!'
472
+ end
473
+ end
474
+
475
+ このMyAppは独立したRackコンポーネントで、RackミドルウェアやRackアプリケーション
476
+ Rails metalとして使用することができます。<tt>config.ru</tt>ファイル内で +use+ か、または
477
+ +run+ でこのクラスを指定するか、ライブラリとしてサーバコンポーネントをコントロールします。
478
+
479
+ MyApp.run! :host => 'localhost', :port => 9090
480
+
481
+ Sinatra::Baseのサブクラスで使えるメソッドはトップレベルのDSLを経由して確実に使うことができます。
482
+ ほとんどのトップレベルで記述されたアプリは、以下の2点を修正することでSinatra::Baseコンポーネントに変えることができます。
483
+
484
+ * +sinatra+の代わりに<tt>sinatra/base</tt>を読み込む
485
+ (そうしない場合、SinatraのDSLメソッドの全てがメインネームスペースにインポートされます)
486
+ * ルート、エラーハンドラー、フィルター、オプションをSinatra::Baseのサブクラスに書く
487
+
488
+ <tt>Sinatra::Base</tt> はまっさらです。ビルトインサーバを含む、ほとんどのオプションがデフォルト
489
+ で無効になっています。オプション詳細については{Options and Configuration}[http://sinatra.github.com/configuration.html]
490
+ をご覧下さい。
491
+
492
+ 補足: SinatraのトップレベルDSLはシンプルな委譲(delgation)システムで実装されています。
493
+ <tt>Sinatra::Application</tt>クラス(Sinatra::Baseの特別なサブクラス)は、トップレベルに送られる
494
+ :get、 :put、 :post、:delete、 :before、:error、:not_found、 :configure、:set messagesのこれら
495
+ 全てを受け取ります。 詳細を閲覧されたい方はこちら(英語):
496
+ {Sinatra::Delegator mixin}[http://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L1064]
497
+ {included into the main namespace}[http://github.com/sinatra/sinatra/blob/master/lib/sinatra/main.rb#L25].
498
+
499
+ == コマンドライン
500
+
501
+ Sinatraアプリケーションは直接実行できます。
502
+
503
+ ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-s HANDLER]
504
+
505
+ オプション:
506
+
507
+ -h # ヘルプ
508
+ -p # ポート指定(デフォルトは4567)
509
+ -e # 環境を指定 (デフォルトはdevelopment)
510
+ -s # rackserver/handlerを指定 (デフォルトはthin)
511
+ -x # mutex lockを付ける (デフォルトはoff)
512
+
513
+ == 最新開発版について
514
+
515
+ Sinatraの開発版を使いたい場合は、ローカルに開発版を落として、
516
+ <tt>LOAD_PATH</tt>の<tt>sinatra/lib</tt>ディレクトリを指定して実行して下さい。
517
+
518
+ cd myapp
519
+ git clone git://github.com/sinatra/sinatra.git
520
+ ruby -Isinatra/lib myapp.rb
521
+
522
+ <tt>sinatra/lib</tt>ディレクトリをto the<tt>LOAD_PATH</tt>に追加する方法もあります。
523
+
524
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/sinatra/lib'
525
+ require 'rubygems'
526
+ require 'sinatra'
527
+
528
+ get '/about' do
529
+ "今使ってるバージョンは" + Sinatra::VERSION
530
+ end
531
+
532
+ Sinatraのソースを更新する方法:
533
+
534
+ cd myproject/sinatra
535
+ git pull
536
+
537
+ == その他
538
+
539
+ 日本語サイト
540
+
541
+ * {Greenbear Laboratory Rack日本語マニュアル}[http://mono.kmc.gr.jp/~yhara/w/?RackReferenceJa] - Rackの日本語マニュアル
542
+
543
+ 英語サイト
544
+
545
+ * {プロジェクトサイト}[http://sinatra.github.com/] - ドキュメント、
546
+ ニュース、他のリソースへのリンクがあります。
547
+ * {プロジェクトに参加(貢献)する}[http://sinatra.github.com/contributing.html] - バグレポート
548
+ パッチの送信、サポートなど
549
+ * {Lighthouse}[http://sinatra.lighthouseapp.com] - チケット管理とリリース計画
550
+ * {Twitter}[http://twitter.com/sinatra]
551
+ * {メーリングリスト}[http://groups.google.com/group/sinatrarb]
552
+ * {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] on http://freenode.net