sinatra-base 1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. data/AUTHORS +43 -0
  2. data/CHANGES +511 -0
  3. data/LICENSE +22 -0
  4. data/README.jp.rdoc +552 -0
  5. data/README.rdoc +636 -0
  6. data/Rakefile +116 -0
  7. data/lib/sinatra.rb +7 -0
  8. data/lib/sinatra/base.rb +1167 -0
  9. data/lib/sinatra/images/404.png +0 -0
  10. data/lib/sinatra/images/500.png +0 -0
  11. data/lib/sinatra/main.rb +28 -0
  12. data/lib/sinatra/showexceptions.rb +307 -0
  13. data/lib/sinatra/tilt.rb +746 -0
  14. data/sinatra-base.gemspec +94 -0
  15. data/test/base_test.rb +160 -0
  16. data/test/builder_test.rb +65 -0
  17. data/test/contest.rb +64 -0
  18. data/test/erb_test.rb +81 -0
  19. data/test/erubis_test.rb +82 -0
  20. data/test/extensions_test.rb +100 -0
  21. data/test/filter_test.rb +221 -0
  22. data/test/haml_test.rb +95 -0
  23. data/test/helper.rb +76 -0
  24. data/test/helpers_test.rb +582 -0
  25. data/test/less_test.rb +37 -0
  26. data/test/mapped_error_test.rb +197 -0
  27. data/test/middleware_test.rb +68 -0
  28. data/test/public/favicon.ico +0 -0
  29. data/test/request_test.rb +33 -0
  30. data/test/response_test.rb +42 -0
  31. data/test/result_test.rb +98 -0
  32. data/test/route_added_hook_test.rb +59 -0
  33. data/test/routing_test.rb +860 -0
  34. data/test/sass_test.rb +85 -0
  35. data/test/server_test.rb +47 -0
  36. data/test/settings_test.rb +368 -0
  37. data/test/sinatra_test.rb +13 -0
  38. data/test/static_test.rb +93 -0
  39. data/test/templates_test.rb +159 -0
  40. data/test/views/error.builder +3 -0
  41. data/test/views/error.erb +3 -0
  42. data/test/views/error.erubis +3 -0
  43. data/test/views/error.haml +3 -0
  44. data/test/views/error.sass +2 -0
  45. data/test/views/foo/hello.test +1 -0
  46. data/test/views/hello.builder +1 -0
  47. data/test/views/hello.erb +1 -0
  48. data/test/views/hello.erubis +1 -0
  49. data/test/views/hello.haml +1 -0
  50. data/test/views/hello.less +5 -0
  51. data/test/views/hello.sass +2 -0
  52. data/test/views/hello.test +1 -0
  53. data/test/views/layout2.builder +3 -0
  54. data/test/views/layout2.erb +2 -0
  55. data/test/views/layout2.erubis +2 -0
  56. data/test/views/layout2.haml +2 -0
  57. data/test/views/layout2.test +1 -0
  58. metadata +257 -0
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2007, 2008, 2009 Blake Mizerany
2
+
3
+ Permission is hereby granted, free of charge, to any person
4
+ obtaining a copy of this software and associated documentation
5
+ files (the "Software"), to deal in the Software without
6
+ restriction, including without limitation the rights to use,
7
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the
9
+ Software is furnished to do so, subject to the following
10
+ conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
@@ -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