sinatra 1.4.5 → 1.4.6

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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/AUTHORS.md +77 -0
  3. data/CHANGES +30 -0
  4. data/Gemfile +5 -5
  5. data/README.de.md +186 -56
  6. data/README.es.md +76 -76
  7. data/README.fr.md +120 -56
  8. data/README.hu.md +19 -19
  9. data/README.ja.md +44 -46
  10. data/README.ko.md +163 -67
  11. data/README.md +151 -127
  12. data/README.pt-br.md +905 -144
  13. data/README.pt-pt.md +17 -17
  14. data/README.ru.md +88 -52
  15. data/README.zh.md +76 -68
  16. data/lib/sinatra.rb +0 -1
  17. data/lib/sinatra/base.rb +21 -15
  18. data/lib/sinatra/show_exceptions.rb +10 -4
  19. data/lib/sinatra/version.rb +1 -1
  20. data/sinatra.gemspec +1 -1
  21. data/test/asciidoctor_test.rb +2 -2
  22. data/test/base_test.rb +1 -5
  23. data/test/builder_test.rb +2 -2
  24. data/test/coffee_test.rb +8 -2
  25. data/test/compile_test.rb +1 -1
  26. data/test/contest.rb +3 -12
  27. data/test/creole_test.rb +2 -2
  28. data/test/delegator_test.rb +1 -1
  29. data/test/encoding_test.rb +1 -1
  30. data/test/erb_test.rb +1 -1
  31. data/test/extensions_test.rb +1 -1
  32. data/test/filter_test.rb +2 -2
  33. data/test/haml_test.rb +2 -2
  34. data/test/helper.rb +8 -7
  35. data/test/helpers_test.rb +6 -6
  36. data/test/integration_test.rb +3 -3
  37. data/test/less_test.rb +2 -2
  38. data/test/liquid_test.rb +3 -3
  39. data/test/mapped_error_test.rb +5 -5
  40. data/test/markaby_test.rb +2 -2
  41. data/test/markdown_test.rb +6 -3
  42. data/test/mediawiki_test.rb +2 -2
  43. data/test/middleware_test.rb +1 -1
  44. data/test/nokogiri_test.rb +2 -2
  45. data/test/rabl_test.rb +2 -2
  46. data/test/rack_test.rb +1 -1
  47. data/test/radius_test.rb +2 -2
  48. data/test/rdoc_test.rb +4 -4
  49. data/test/readme_test.rb +1 -1
  50. data/test/request_test.rb +4 -1
  51. data/test/response_test.rb +1 -1
  52. data/test/result_test.rb +2 -2
  53. data/test/route_added_hook_test.rb +1 -1
  54. data/test/routing_test.rb +7 -7
  55. data/test/sass_test.rb +3 -3
  56. data/test/scss_test.rb +2 -2
  57. data/test/server_test.rb +10 -2
  58. data/test/settings_test.rb +4 -4
  59. data/test/sinatra_test.rb +1 -1
  60. data/test/slim_test.rb +2 -2
  61. data/test/static_test.rb +2 -2
  62. data/test/streaming_test.rb +2 -2
  63. data/test/stylus_test.rb +2 -2
  64. data/test/templates_test.rb +3 -3
  65. data/test/textile_test.rb +2 -2
  66. data/test/wlang_test.rb +1 -1
  67. data/test/yajl_test.rb +2 -2
  68. metadata +10 -11
  69. data/AUTHORS +0 -61
@@ -165,8 +165,8 @@ end
165
165
  ``` ruby
166
166
  get '/hello/:name' do
167
167
  # "GET /hello/foo" と "GET /hello/bar" にマッチ
168
- # params[:name] は 'foo' か 'bar'
169
- "Hello #{params[:name]}!"
168
+ # params['name'] は 'foo' か 'bar'
169
+ "Hello #{params['name']}!"
170
170
  end
171
171
  ```
172
172
 
@@ -175,24 +175,24 @@ end
175
175
  ``` ruby
176
176
  get '/hello/:name' do |n|
177
177
  # "GET /hello/foo" と "GET /hello/bar" にマッチ
178
- # params[:name] は 'foo' か 'bar'
179
- # n が params[:name] を保持
178
+ # params['name'] は 'foo' か 'bar'
179
+ # n が params['name'] を保持
180
180
  "Hello #{n}!"
181
181
  end
182
182
  ```
183
183
 
184
184
  ルーティングパターンはアスタリスク(すなわちワイルドカード)を含むこともでき、
185
- `params[:splat]` で取得できます。
185
+ `params['splat']` で取得できます。
186
186
 
187
187
  ``` ruby
188
188
  get '/say/*/to/*' do
189
189
  # /say/hello/to/world にマッチ
190
- params[:splat] # => ["hello", "world"]
190
+ params['splat'] # => ["hello", "world"]
191
191
  end
192
192
 
193
193
  get '/download/*.*' do
194
194
  # /download/path/to/file.xml にマッチ
195
- params[:splat] # => ["path/to/file", "xml"]
195
+ params['splat'] # => ["path/to/file", "xml"]
196
196
  end
197
197
  ```
198
198
 
@@ -207,8 +207,8 @@ end
207
207
  ルーティングを正規表現にマッチさせることもできます。
208
208
 
209
209
  ``` ruby
210
- get %r{/hello/([\w]+)} do
211
- "Hello, #{params[:captures].first}!"
210
+ get /\A\/hello\/([\w]+)\z/ do
211
+ "Hello, #{params['captures'].first}!"
212
212
  end
213
213
  ```
214
214
 
@@ -237,7 +237,7 @@ end
237
237
 
238
238
  ``` ruby
239
239
  get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
240
- "Songbirdのバージョン #{params[:agent][0]}を使ってます。"
240
+ "Songbirdのバージョン #{params['agent'][0]}を使ってます。"
241
241
  end
242
242
 
243
243
  get '/foo' do
@@ -557,7 +557,7 @@ get('/') { markdown :index }
557
557
  <tr>
558
558
  <td>依存</td>
559
559
  <td>
560
- <a href="http://builder.rubyforge.org/" title="builder">builder</a>
560
+ <a href="https://github.com/jimweirich/builder" title="builder">builder</a>
561
561
  </td>
562
562
  </tr>
563
563
  <tr>
@@ -673,8 +673,8 @@ LiquidテンプレートからRubyのメソッド(`yield`を除く)を呼び出
673
673
  <a href="https://github.com/rtomayko/rdiscount" title="RDiscount">RDiscount</a>,
674
674
  <a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
675
675
  <a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
676
- <a href="http://kramdown.rubyforge.org/" title="kramdown">kramdown</a>,
677
- <a href="http://maruku.rubyforge.org/" title="maruku">maruku</a>
676
+ <a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a>,
677
+ <a href="https://github.com/bhollis/maruku" title="maruku">maruku</a>
678
678
  </td>
679
679
  </tr>
680
680
  <tr>
@@ -742,7 +742,7 @@ TexttileからはRubyを呼ぶことができないので、Textileで書かれ
742
742
  <table>
743
743
  <tr>
744
744
  <td>依存</td>
745
- <td><a href="http://rdoc.rubyforge.org/" title="RDoc">RDoc</a></td>
745
+ <td><a href="http://rdoc.sourceforge.net/" title="RDoc">RDoc</a></td>
746
746
  </tr>
747
747
  <tr>
748
748
  <td>ファイル拡張子</td>
@@ -795,7 +795,7 @@ AsciiDocテンプレートからRubyのメソッドを直接呼び出すこと
795
795
  <table>
796
796
  <tr>
797
797
  <td>依存</td>
798
- <td><a href="http://radius.rubyforge.org/" title="Radius">Radius</a></td>
798
+ <td><a href="https://github.com/jlong/radius" title="Radius">Radius</a></td>
799
799
  </tr>
800
800
  <tr>
801
801
  <td>ファイル拡張子</td>
@@ -1044,7 +1044,7 @@ WLang内でのRubyメソッドの呼び出しは一般的ではないので、
1044
1044
 
1045
1045
  ``` ruby
1046
1046
  get '/:id' do
1047
- @foo = Foo.find(params[:id])
1047
+ @foo = Foo.find(params['id'])
1048
1048
  haml '%h1= @foo.name'
1049
1049
  end
1050
1050
  ```
@@ -1053,7 +1053,7 @@ end
1053
1053
 
1054
1054
  ``` ruby
1055
1055
  get '/:id' do
1056
- foo = Foo.find(params[:id])
1056
+ foo = Foo.find(params['id'])
1057
1057
  haml '%h1= bar.name', :locals => { :bar => foo }
1058
1058
  end
1059
1059
  ```
@@ -1183,7 +1183,7 @@ end
1183
1183
 
1184
1184
  get '/foo/*' do
1185
1185
  @note #=> 'Hi!'
1186
- params[:splat] #=> 'bar/baz'
1186
+ params['splat'] #=> 'bar/baz'
1187
1187
  end
1188
1188
  ```
1189
1189
 
@@ -1233,7 +1233,7 @@ helpers do
1233
1233
  end
1234
1234
 
1235
1235
  get '/:name' do
1236
- bar(params[:name])
1236
+ bar(params['name'])
1237
1237
  end
1238
1238
  ```
1239
1239
 
@@ -1266,7 +1266,7 @@ get '/' do
1266
1266
  end
1267
1267
 
1268
1268
  get '/:value' do
1269
- session[:value] = params[:value]
1269
+ session[:value] = params['value']
1270
1270
  end
1271
1271
  ```
1272
1272
 
@@ -1280,7 +1280,7 @@ get '/' do
1280
1280
  end
1281
1281
 
1282
1282
  get '/:value' do
1283
- session[:value] = params[:value]
1283
+ session[:value] = params['value']
1284
1284
  end
1285
1285
  ```
1286
1286
 
@@ -1346,7 +1346,7 @@ halt erb(:error)
1346
1346
 
1347
1347
  ``` ruby
1348
1348
  get '/guess/:who' do
1349
- pass unless params[:who] == 'Frank'
1349
+ pass unless params['who'] == 'Frank'
1350
1350
  "見つかっちゃった!"
1351
1351
  end
1352
1352
 
@@ -1439,19 +1439,17 @@ connections = []
1439
1439
 
1440
1440
  get '/subscribe' do
1441
1441
  # サーバイベントにおけるクライアントの関心を登録
1442
- stream(:keep_open) { |out| connections << out }
1443
-
1444
- # 死んでいるコネクションを排除
1445
- connections.reject!(&:closed?)
1446
-
1447
- # 肯定応答
1448
- "subscribed"
1442
+ stream(:keep_open) do |out|
1443
+ connections << out
1444
+ # 死んでいるコネクションを排除
1445
+ connections.reject!(&:closed?)
1446
+ end
1449
1447
  end
1450
1448
 
1451
1449
  post '/message' do
1452
1450
  connections.each do |out|
1453
1451
  # クライアントへ新規メッセージ到着の通知
1454
- out << params[:message] << "\n"
1452
+ out << params['message'] << "\n"
1455
1453
 
1456
1454
  # クライアントへの再接続の指示
1457
1455
  out.close
@@ -1604,7 +1602,7 @@ end
1604
1602
 
1605
1603
  ``` ruby
1606
1604
  get '/article/:id' do
1607
- @article = Article.find params[:id]
1605
+ @article = Article.find params['id']
1608
1606
  last_modified @article.updated_at
1609
1607
  etag @article.sha1
1610
1608
  erb :article
@@ -1679,7 +1677,7 @@ send_file 'foo.png', :type => :jpg
1679
1677
  <dt>type</dt>
1680
1678
  <dd>コンテンツの種類。設定がない場合、ファイル拡張子から類推される。</dd>
1681
1679
 
1682
- </dt>disposition</dt>
1680
+ <dt>disposition</dt>
1683
1681
  <dd>
1684
1682
  Content-Dispositionに使われる。許容値: <tt>nil</tt> (デフォルト)、
1685
1683
  <tt>:attachment</tt> および <tt>:inline</tt>
@@ -1697,7 +1695,7 @@ send_file 'foo.png', :type => :jpg
1697
1695
  </dl>
1698
1696
 
1699
1697
 
1700
- ## リクエストオブジェクトへのアクセス
1698
+ ### リクエストオブジェクトへのアクセス
1701
1699
 
1702
1700
  受信するリクエストオブジェクトは、`request`メソッドを通じてリクエストレベル(フィルタ、ルーティング、エラーハンドラ)からアクセスすることができます。
1703
1701
 
@@ -1937,10 +1935,10 @@ set :protection, :session => true
1937
1935
  </dd>
1938
1936
  <dd>デフォルトは無効。</dd>
1939
1937
 
1940
- <dt>add_charsets</dt>
1938
+ <dt>add_charset</dt>
1941
1939
  <dd>
1942
1940
  Mimeタイプ <tt>content_type</tt>ヘルパーが自動的にキャラクタセット情報をここに追加する。このオプションは書き換えるのではなく、値を追加するようにすること。
1943
- <tt>settings.add_charsets << "application/foobar"</tt>
1941
+ <tt>settings.add_charset << "application/foobar"</tt>
1944
1942
  </dd>
1945
1943
 
1946
1944
  <dt>app_file</dt>
@@ -1949,7 +1947,7 @@ set :protection, :session => true
1949
1947
  </dd>
1950
1948
 
1951
1949
  <dt>bind</dt>
1952
- <dd>バインドするIPアドレス(デフォルト: `environment`がdevelopmentにセットされているときは、<tt>0.0.0.0</tt> <em>または</em> <tt>localhost</tt>)。ビルトインサーバでのみ使われる。
1950
+ <dd>バインドするIPアドレス(デフォルト: `environment`がdevelopmentにセットされているときは、<tt>0.0.0.0</tt> <em>または</em> <tt>localhost</tt>)。ビルトインサーバでのみ使われる。</dd>
1953
1951
 
1954
1952
  <dt>default_encoding</dt>
1955
1953
  <dd>不明なときに仮定されるエンコーディング(デフォルトは<tt>"utf-8"</tt>)。</dd>
@@ -2111,7 +2109,7 @@ end
2111
2109
 
2112
2110
  ``` ruby
2113
2111
  error do
2114
- 'エラーが発生しました。 - ' + env['sinatra.error'].name
2112
+ 'エラーが発生しました。 - ' + env['sinatra.error'].message
2115
2113
  end
2116
2114
  ```
2117
2115
 
@@ -2162,7 +2160,7 @@ Sinatraを開発環境の下で実行している場合は、特別な`not_found
2162
2160
 
2163
2161
  ## Rackミドルウェア(Rack Middleware)
2164
2162
 
2165
- SinatraはRuby製Webフレームワークのミニマルな標準的インタフェースである[Rack](http://rack.rubyforge.org/)上に構築されています。アプリケーションデベロッパーにとってRackにおける最も興味深い機能は、「ミドルウェア(middleware)」をサポートしていることであり、これは、サーバとアプリケーションとの間に置かれ、HTTPリクエスト/レスポンスを監視および/または操作することで、各種の汎用的機能を提供するコンポーネントです。
2163
+ SinatraはRuby製Webフレームワークのミニマルな標準的インタフェースである[Rack](http://rack.github.io/)上に構築されています。アプリケーションデベロッパーにとってRackにおける最も興味深い機能は、「ミドルウェア(middleware)」をサポートしていることであり、これは、サーバとアプリケーションとの間に置かれ、HTTPリクエスト/レスポンスを監視および/または操作することで、各種の汎用的機能を提供するコンポーネントです。
2166
2164
 
2167
2165
  Sinatraはトップレベルの`use`メソッドを通して、Rackミドルウェアパイプラインの構築を楽にします。
2168
2166
 
@@ -2178,7 +2176,7 @@ get '/hello' do
2178
2176
  end
2179
2177
  ```
2180
2178
 
2181
- `use`の文法は、[Rack::Builder](http://rack.rubyforge.org/doc/classes/Rack/Builder.html)DSLで定義されているそれ(rackupファイルで最もよく使われる)と同じです。例えば `use`メソッドは複数の引数、そしてブロックも取ることができます。
2179
+ `use`の文法は、[Rack::Builder](http://rubydoc.info/github/rack/rack/master/Rack/Builder)DSLで定義されているそれ(rackupファイルで最もよく使われる)と同じです。例えば `use`メソッドは複数の引数、そしてブロックも取ることができます。
2182
2180
 
2183
2181
  ``` ruby
2184
2182
  use Rack::Auth::Basic do |username, password|
@@ -2200,10 +2198,10 @@ SinatraでのテストはRackベースのテストライブラリまたはフレ
2200
2198
 
2201
2199
  ``` ruby
2202
2200
  require 'my_sinatra_app'
2203
- require 'test/unit'
2201
+ require 'minitest/autorun'
2204
2202
  require 'rack/test'
2205
2203
 
2206
- class MyAppTest < Test::Unit::TestCase
2204
+ class MyAppTest < Minitest::Test
2207
2205
  include Rack::Test::Methods
2208
2206
 
2209
2207
  def app
@@ -2407,8 +2405,8 @@ class LoginScreen < Sinatra::Base
2407
2405
  get('/login') { haml :login }
2408
2406
 
2409
2407
  post('/login') do
2410
- if params[:name] = 'admin' and params[:password] = 'admin'
2411
- session['user_name'] = params[:name]
2408
+ if params['name'] = 'admin' and params['password'] = 'admin'
2409
+ session['user_name'] = params['name']
2412
2410
  else
2413
2411
  redirect '/login'
2414
2412
  end
@@ -2525,8 +2523,8 @@ class MyApp < Sinatra::Base
2525
2523
  # '/define_route/:name'のためのリクエストスコープ
2526
2524
  @value = 42
2527
2525
 
2528
- settings.get("/#{params[:name]}") do
2529
- # "/#{params[:name]}"のためのリクエストスコープ
2526
+ settings.get("/#{params['name']}") do
2527
+ # "/#{params['name']}"のためのリクエストスコープ
2530
2528
  @value # => nil (not the same request)
2531
2529
  end
2532
2530
 
@@ -2719,7 +2717,7 @@ Sinatraは、[Semantic Versioning](http://semver.org/)におけるSemVerおよ
2719
2717
  * [Twitter](http://twitter.com/sinatra)
2720
2718
  * [メーリングリスト](http://groups.google.com/group/sinatrarb/topics)
2721
2719
  * http://freenode.net上のIRC: [#sinatra](irc://chat.freenode.net/#sinatra)
2722
- * [Sinatra Book](http://sinatra-book.gittr.com) クックブック、チュートリアル
2720
+ * [Sinatra Book](https://github.com/sinatra/sinatra-book/) クックブック、チュートリアル
2723
2721
  * [Sinatra Recipes](http://recipes.sinatrarb.com/) コミュニティによるレシピ集
2724
2722
  * http://rubydoc.info上のAPIドキュメント: [最新版(latest release)用](http://rubydoc.info/gems/sinatra)または[現在のHEAD用](http://rubydoc.info/github/sinatra/sinatra)
2725
2723
  * [CIサーバ](http://travis-ci.org/sinatra/sinatra)
@@ -54,11 +54,13 @@ thin이 설치되어 있을 경우 Sinatra는 thin을 통해 실행합니다.
54
54
  * [Markdown 템플릿](#markdown-템플릿)
55
55
  * [Textile 템플릿](#textile-템플릿)
56
56
  * [RDoc 템플릿](#rdoc-템플릿)
57
+ * [AsciiDoc 템플릿](#asciidoc-템플릿)
57
58
  * [Radius 템플릿](#radius-템플릿)
58
59
  * [Markaby 템플릿](#markaby-템플릿)
59
60
  * [RABL 템플릿](#rabl-템플릿)
60
61
  * [Slim 템플릿](#slim-템플릿)
61
62
  * [Creole 템플릿](#creole-템플릿)
63
+ * [MediaWiki 템플릿](#mediawiki-템플릿)
62
64
  * [CoffeeScript 템플릿](#coffeescript-템플릿)
63
65
  * [Stylus 템플릿](#stylus-템플릿)
64
66
  * [Yajl 템플릿](#yajl-템플릿)
@@ -69,6 +71,7 @@ thin이 설치되어 있을 경우 Sinatra는 thin을 통해 실행합니다.
69
71
  * [이름을 가지는 템플릿(Named Templates)](#이름을-가지는-템플릿named-templates)
70
72
  * [파일 확장자 연결하기](#파일-확장자-연결하기)
71
73
  * [나만의 고유한 템플릿 엔진 추가하기](#나만의-고유한-템플릿-엔진-추가하기)
74
+ * [템플릿 검사를 위한 커스텀 로직 사용하기](#템플릿-검사를-위한-커스텀-로직-사용하기)
72
75
  * [필터(Filters)](#필터filters)
73
76
  * [헬퍼(Helpers)](#헬퍼helpers)
74
77
  * [세션(Sessions) 사용하기](#세션sessions-사용하기)
@@ -162,8 +165,8 @@ end
162
165
  ``` ruby
163
166
  get '/hello/:name' do
164
167
  # "GET /hello/foo" 및 "GET /hello/bar"와 매치
165
- # params[:name]은 'foo' 또는 'bar'
166
- "Hello #{params[:name]}!"
168
+ # params['name']은 'foo' 또는 'bar'
169
+ "Hello #{params['name']}!"
167
170
  end
168
171
  ```
169
172
 
@@ -172,22 +175,23 @@ end
172
175
  ``` ruby
173
176
  get '/hello/:name' do |n|
174
177
  # "GET /hello/foo" 및 "GET /hello/bar"와 매치
175
- # params[:name]은 'foo' 또는 'bar'
178
+ # params['name']은 'foo' 또는 'bar'
179
+ # n 에는 params['name']가 저장
176
180
  "Hello #{n}!"
177
181
  end
178
182
  ```
179
183
 
180
- 라우터 패턴에는 스플랫(splat, 또는 와일드카드)도 매개변수도 포함될 수 있으며, 이럴 경우 `params[:splat]` 배열을 통해 접근할 수 있습니다.
184
+ 라우터 패턴에는 스플랫(splat, 또는 와일드카드)도 매개변수도 포함될 수 있으며, 이럴 경우 `params['splat']` 배열을 통해 접근할 수 있습니다.
181
185
 
182
186
  ``` ruby
183
187
  get '/say/*/to/*' do
184
188
  # /say/hello/to/world와 매치
185
- params[:splat] # => ["hello", "world"]
189
+ params['splat'] # => ["hello", "world"]
186
190
  end
187
191
 
188
192
  get '/download/*.*' do
189
193
  # /download/path/to/file.xml과 매치
190
- params[:splat] # => ["path/to/file", "xml"]
194
+ params['splat'] # => ["path/to/file", "xml"]
191
195
  end
192
196
  ```
193
197
 
@@ -202,8 +206,8 @@ end
202
206
  라우터는 정규표현식으로 매치할 수 있습니다.
203
207
 
204
208
  ``` ruby
205
- get %r{/hello/([\w]+)} do
206
- "Hello, #{params[:captures].first}!"
209
+ get /\A\/hello\/([\w]+)\z/ do
210
+ "Hello, #{params['captures'].first}!"
207
211
  end
208
212
  ```
209
213
 
@@ -211,6 +215,7 @@ end
211
215
 
212
216
  ``` ruby
213
217
  get %r{/hello/([\w]+)} do |c|
218
+ # "GET /meta/hello/world", "GET /hello/world/1234" 등과 매치
214
219
  "Hello, #{c}!"
215
220
  end
216
221
  ```
@@ -223,6 +228,17 @@ get '/posts.?:format?' do
223
228
  end
224
229
  ```
225
230
 
231
+ 쿼리 파라메터로도 이용가능 합니다.
232
+
233
+ ``` ruby
234
+ get '/posts' do
235
+ # matches "GET /posts?title=foo&author=bar"
236
+ title = params['title']
237
+ author = params['author']
238
+ # uses title and author variables; query is optional to the /posts route
239
+ end
240
+ ```
241
+
226
242
  한편, 경로 탐색 공격 방지(path traversal attack protection, 아래 참조)를 비활성화시키지 않았다면,
227
243
  요청 경로는 라우터와 매칭되기 이전에 수정될 수 있습니다.
228
244
 
@@ -232,7 +248,7 @@ end
232
248
 
233
249
  ``` ruby
234
250
  get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
235
- "Songbird 버전 #{params[:agent][0]}을 사용하는군요!"
251
+ "Songbird 버전 #{params['agent'][0]}을 사용하는군요!"
236
252
  end
237
253
 
238
254
  get '/foo' do
@@ -255,6 +271,7 @@ get '/', :provides => ['rss', 'atom', 'xml'] do
255
271
  builder :feed
256
272
  end
257
273
  ```
274
+ `provides`는 request의 허용된 해더를 검색합니다.
258
275
 
259
276
  사용자 정의 조건도 쉽게 만들 수 있습니다.
260
277
 
@@ -451,8 +468,9 @@ render 메서드에서 전달된 옵션값들은 `set`을 통해 설정한 옵
451
468
 
452
469
  <dt>layout</dt>
453
470
  <dd>
454
- 레이아웃을 사용할지 여부 (<tt>true</tt> 또는 <tt>false</tt>), 만약 이 값이 심볼일 경우,
455
- 사용할 템플릿을 지정. 예제: <tt>erb :index, :layout => !request.xhr?</tt>
471
+ 레이아웃을 사용할지 여부 (<tt>true</tt> 또는 <tt>false</tt>), 만약
472
+ 이 값이 심볼일 경우, 사용할 템플릿을 지정. 예제:
473
+ <tt>erb :index, :layout => !request.xhr?</tt>
456
474
  </dd>
457
475
 
458
476
  <dt>content_type</dt>
@@ -545,7 +563,7 @@ get('/') { markdown :index }
545
563
  <table>
546
564
  <tr>
547
565
  <td>의존성</td>
548
- <td><a href="http://builder.rubyforge.org/">builder</a></td>
566
+ <td><a href="https://github.com/jimweirich/builder">builder</a></td>
549
567
  </tr>
550
568
  <tr>
551
569
  <td>파일 확장자</td>
@@ -658,8 +676,8 @@ Liquid 템플릿에서는 루비 메서드(`yield` 제외)를 호출할 수 없
658
676
  <a href="https://github.com/rtomayko/rdiscount" title="RDiscount">RDiscount</a>,
659
677
  <a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
660
678
  <a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
661
- <a href="http://kramdown.rubyforge.org/" title="kramdown">kramdown</a>,
662
- <a href="http://maruku.rubyforge.org/" title="maruku">maruku</a>
679
+ <a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a>,
680
+ <a href="https://github.com/bhollis/maruku" title="maruku">maruku</a>
663
681
  중 아무거나
664
682
  </td>
665
683
  </tr>
@@ -731,7 +749,7 @@ Textile에서 루비를 호출할 수 없기 때문에, Textile으로 작성된
731
749
  <table>
732
750
  <tr>
733
751
  <td>의존성</td>
734
- <td><a href="http://rdoc.rubyforge.org/">rdoc</a></td>
752
+ <td><a href="http://rdoc.sourceforge.net/" title="RDoc">rdoc</a></td>
735
753
  </tr>
736
754
  <tr>
737
755
  <td>파일 확장자</td>
@@ -761,12 +779,32 @@ RDoc에서 루비를 호출할 수 없기 때문에, RDoc으로 작성된 레이
761
779
  사용할 수 없습니다. 하지만, `:layout_engine` 옵션으로 레이아웃의 템플릿을
762
780
  다른 렌더링 엔진으로 렌더링 할 수는 있습니다.
763
781
 
782
+ #### AsciiDoc 템플릿
783
+
784
+ <table>
785
+ <tr>
786
+ <td>의존성</td>
787
+ <td><a href="http://asciidoctor.org/" title="Asciidoctor">Asciidoctor</a></td>
788
+ </tr>
789
+ <tr>
790
+ <td>파일 확장자</td>
791
+ <td><tt>.asciidoc</tt>, <tt>.adoc</tt> and <tt>.ad</tt></td>
792
+ </tr>
793
+ <tr>
794
+ <td>예제</td>
795
+ <td><tt>asciidoc :README, :layout_engine => :erb</tt></td>
796
+ </tr>
797
+ </table>
798
+
799
+ AsciiDoc 템플릿에서는 루비 메서드를 호출할 수 없기
800
+ 때문에, 거의 대부분의 경우 locals를 전달해야 합니다.
801
+
764
802
  #### Radius 템플릿
765
803
 
766
804
  <table>
767
805
  <tr>
768
806
  <td>의존성</td>
769
- <td><a href="http://radius.rubyforge.org/">radius</a></td>
807
+ <td><a href="https://github.com/jlong/radius" title="Radius">radius</a></td>
770
808
  </tr>
771
809
  <tr>
772
810
  <td>파일 확장자</td>
@@ -869,6 +907,41 @@ Creole에서 루비를 호출할 수 없기 때문에, Creole으로 작성된
869
907
  사용할 수 없습니다. 하지만, `:layout_engine` 옵션으로 레이아웃의 템플릿을
870
908
  다른 렌더링 엔진으로 렌더링 할 수는 있습니다.
871
909
 
910
+ #### MediaWiki 템플릿
911
+
912
+ <table>
913
+ <tr>
914
+ <td>의존성</td>
915
+ <td><a href="https://github.com/nricciar/wikicloth" title="WikiCloth">WikiCloth</a></td>
916
+ </tr>
917
+ <tr>
918
+ <td>파일 확장자</td>
919
+ <td><tt>.mediawiki</tt> and <tt>.mw</tt></td>
920
+ </tr>
921
+ <tr>
922
+ <td>예제</td>
923
+ <td><tt>mediawiki :wiki, :layout_engine => :erb</tt></td>
924
+ </tr>
925
+ </table>
926
+
927
+ MediaWiki 마크업에서는 메서드 호출 뿐 아니라 locals 전달도 불가능합니다.
928
+ 따라서 일반적으로는 다른 렌더링 엔진과 함께 사용하게 됩니다.
929
+
930
+ ``` ruby
931
+ erb :overview, :locals => { :text => mediawiki(:introduction) }
932
+ ```
933
+
934
+ 다른 템플릿 속에서 `mediawiki` 메서드를 호출할 수도 있습니다.
935
+
936
+ ``` ruby
937
+ %h1 Hello From Haml!
938
+ %p= mediawiki(:greetings)
939
+ ```
940
+
941
+ MediaWiki에서 루비를 호출할 수 없기 때문에, MediaWiki으로 작성된 레이아웃은
942
+ 사용할 수 없습니다. 하지만, `:layout_engine` 옵션으로 레이아웃의 템플릿을
943
+ 다른 렌더링 엔진으로 렌더링 할 수는 있습니다.
944
+
872
945
  #### CoffeeScript 템플릿
873
946
 
874
947
  <table>
@@ -985,8 +1058,8 @@ present(resource);
985
1058
  </tr>
986
1059
  </table>
987
1060
 
988
- WLang 템플릿에서는 루비 메서드(`yield` 제외)를 호출할 수 없기
989
- 때문에, 거의 대부분의 경우 locals를 전달해야 합니다. 그래도
1061
+ WLang 템플릿에서는 루비 메서드를 사용하는게 일반적이지 않기
1062
+ 때문에, 거의 대부분의 경우 locals를 전달합니다. 그래도
990
1063
  WLang으로 쓰여진 레이아웃과 `yield`는 지원합니다.
991
1064
 
992
1065
  ### 템플릿에서 변수에 접근하기
@@ -996,7 +1069,7 @@ WLang으로 쓰여진 레이아웃과 `yield`는 지원합니다.
996
1069
 
997
1070
  ``` ruby
998
1071
  get '/:id' do
999
- @foo = Foo.find(params[:id])
1072
+ @foo = Foo.find(params['id'])
1000
1073
  haml '%h1= @foo.name'
1001
1074
  end
1002
1075
  ```
@@ -1005,7 +1078,7 @@ end
1005
1078
 
1006
1079
  ``` ruby
1007
1080
  get '/:id' do
1008
- foo = Foo.find(params[:id])
1081
+ foo = Foo.find(params['id'])
1009
1082
  haml '%h1= bar.name', :locals => { :bar => foo }
1010
1083
  end
1011
1084
  ```
@@ -1131,6 +1204,22 @@ end
1131
1204
  위 코드는 `./views/index.myat` 를 렌더합니다.
1132
1205
  Tilt에 대한 더 자세한 내용은 https://github.com/rtomayko/tilt 참조하세요.
1133
1206
 
1207
+ ### 템플릿 검사를 위한 커스텀 로직 사용하기
1208
+
1209
+ 고유한 템플릿 룩업을 구현하기 위해서는 `#find_template` 메서드를 만드셔야 합니다.
1210
+
1211
+ ``` ruby
1212
+ configure do
1213
+ set :views [ './views/a', './views/b' ]
1214
+ end
1215
+
1216
+ def find_template(views, name, engine, &block)
1217
+ Array(views).each do |v|
1218
+ super(v, name, engine, &block)
1219
+ end
1220
+ end
1221
+ ```
1222
+
1134
1223
  ## 필터(Filters)
1135
1224
 
1136
1225
  사전 필터(before filter)는 라우터와 동일한 맥락에서 매 요청 전에 평가되며
@@ -1145,7 +1234,7 @@ end
1145
1234
 
1146
1235
  get '/foo/*' do
1147
1236
  @note #=> 'Hi!'
1148
- params[:splat] #=> 'bar/baz'
1237
+ params['splat'] #=> 'bar/baz'
1149
1238
  end
1150
1239
  ```
1151
1240
 
@@ -1172,7 +1261,7 @@ before '/protected/*' do
1172
1261
  end
1173
1262
 
1174
1263
  after '/create/:slug' do |slug|
1175
- session[:last_slug] = slug
1264
+ session['last_slug'] = slug
1176
1265
  end
1177
1266
  ```
1178
1267
 
@@ -1201,7 +1290,7 @@ helpers do
1201
1290
  end
1202
1291
 
1203
1292
  get '/:name' do
1204
- bar(params[:name])
1293
+ bar(params['name'])
1205
1294
  end
1206
1295
  ```
1207
1296
 
@@ -1230,11 +1319,11 @@ helpers FooUtils, BarUtils
1230
1319
  enable :sessions
1231
1320
 
1232
1321
  get '/' do
1233
- "value = " << session[:value].inspect
1322
+ "value = " << session['value'].inspect
1234
1323
  end
1235
1324
 
1236
1325
  get '/:value' do
1237
- session[:value] = params[:value]
1326
+ session['value'] = params['value']
1238
1327
  end
1239
1328
  ```
1240
1329
 
@@ -1249,11 +1338,11 @@ end
1249
1338
  use Rack::Session::Pool, :expire_after => 2592000
1250
1339
 
1251
1340
  get '/' do
1252
- "value = " << session[:value].inspect
1341
+ "value = " << session['value'].inspect
1253
1342
  end
1254
1343
 
1255
1344
  get '/:value' do
1256
- session[:value] = params[:value]
1345
+ session['value'] = params['value']
1257
1346
  end
1258
1347
  ```
1259
1348
 
@@ -1324,7 +1413,7 @@ halt erb(:error)
1324
1413
 
1325
1414
  ``` ruby
1326
1415
  get '/guess/:who' do
1327
- pass unless params[:who] == 'Frank'
1416
+ pass unless params['who'] == 'Frank'
1328
1417
  'You got me!'
1329
1418
  end
1330
1419
 
@@ -1440,19 +1529,17 @@ connections = []
1440
1529
 
1441
1530
  get '/subscribe' do
1442
1531
  # register a client's interest in server events
1443
- stream(:keep_open) { |out| connections << out }
1444
-
1445
- # purge dead connections
1446
- connections.reject!(&:closed?)
1447
-
1448
- # acknowledge
1449
- "subscribed"
1532
+ stream(:keep_open) do |out|
1533
+ connections << out
1534
+ # purge dead connections
1535
+ connections.reject!(&:closed?)
1536
+ end
1450
1537
  end
1451
1538
 
1452
- post '/message' do
1539
+ post '/:message' do
1453
1540
  connections.each do |out|
1454
1541
  # notify client that a new message has arrived
1455
- out << params[:message] << "\n"
1542
+ out << params['message'] << "\n"
1456
1543
 
1457
1544
  # indicate client to connect again
1458
1545
  out.close
@@ -1572,12 +1659,12 @@ redirect to('/bar?sum=42')
1572
1659
  enable :sessions
1573
1660
 
1574
1661
  get '/foo' do
1575
- session[:secret] = 'foo'
1662
+ session['secret'] = 'foo'
1576
1663
  redirect to('/bar')
1577
1664
  end
1578
1665
 
1579
1666
  get '/bar' do
1580
- session[:secret]
1667
+ session['secret']
1581
1668
  end
1582
1669
  ```
1583
1670
 
@@ -1611,14 +1698,14 @@ before do
1611
1698
  end
1612
1699
  ```
1613
1700
 
1614
- 캐시를 잘 사용하려면, `etag` 또는 `last_modified`의 사용을 고려해야 할 것이다.
1701
+ 캐시를 잘 사용하려면, `etag` 또는 `last_modified`을 사용해 보세요.
1615
1702
  무거운 작업을 하기 *전*에 이들 헬퍼를 호출하길 권장합니다. 이렇게 하면,
1616
1703
  클라이언트 캐시에 현재 버전이 이미 들어 있을 경우엔 즉각 응답을
1617
1704
  뿌릴(flush) 것입니다.
1618
1705
 
1619
1706
  ``` ruby
1620
- get '/article/:id' do
1621
- @article = Article.find params[:id]
1707
+ get "/article/:id" do
1708
+ @article = Article.find params['id']
1622
1709
  last_modified @article.updated_at
1623
1710
  etag @article.sha1
1624
1711
  erb :article
@@ -1674,7 +1761,7 @@ etag '', :new_resource => true, :kind => :weak
1674
1761
 
1675
1762
  ### 파일 전송하기(Sending Files)
1676
1763
 
1677
- 파일을 전송하려면, `send_file` 헬퍼 메서드를 사용하면 됩니다.
1764
+ 응답(response)으로 파일의 컨탠츠를 리턴하려면, `send_file` 헬퍼 메서드를 사용하면 됩니다.
1678
1765
 
1679
1766
  ``` ruby
1680
1767
  get '/' do
@@ -1692,22 +1779,22 @@ send_file 'foo.png', :type => :jpg
1692
1779
 
1693
1780
  <dl>
1694
1781
  <dt>filename</dt>
1695
- <dd>응답에서의 파일명. 기본값은 실제 파일명.</dd>
1782
+ <dd>응답에서 사용되는 파일명. 기본값은 실제 파일명.</dd>
1696
1783
 
1697
1784
  <dt>last_modified</dt>
1698
1785
  <dd>Last-Modified 헤더값. 기본값은 파일의 mtime.</dd>
1699
1786
 
1700
1787
  <dt>type</dt>
1701
- <dd>사용할 컨텐츠 유형. 없으면 파일 확장자로부터 유추.</dd>
1788
+ <dd>Content-Type 헤더값. 없으면 파일 확장자로부터 유추.</dd>
1702
1789
 
1703
1790
  <dt>disposition</dt>
1704
1791
  <dd>
1705
- Content-Disposition에서 사용됨. 가능한 값들: <tt>nil</tt> (기본값),
1792
+ Content-Disposition 헤더값. 가능한 값들: <tt>nil</tt> (기본값),
1706
1793
  <tt>:attachment</tt> 및 <tt>:inline</tt>
1707
1794
  </dd>
1708
1795
 
1709
1796
  <dt>length</dt>
1710
- <dd>Content-Length, 기본값은 파일 크기.</dd>
1797
+ <dd>Content-Length 헤더값, 기본값은 파일 크기.</dd>
1711
1798
 
1712
1799
  <dt>status</dt>
1713
1800
  <dd>
@@ -1980,11 +2067,11 @@ set :protection, :session => true
1980
2067
  </dd>
1981
2068
  <dd>기본값은 비활성.</dd>
1982
2069
 
1983
- <dt>add_charsets</dt>
2070
+ <dt>add_charset</dt>
1984
2071
  <dd>
1985
2072
  <tt>content_type</tt>가 문자셋 정보에 자동으로 추가하게 될 마임(mime) 타입.
1986
2073
  이 옵션은 오버라이딩하지 말고 추가해야 함.
1987
- <tt>settings.add_charsets << "application/foobar"</tt>
2074
+ <tt>settings.add_charset << "application/foobar"</tt>
1988
2075
  </dd>
1989
2076
 
1990
2077
  <dt>app_file</dt>
@@ -1994,7 +2081,9 @@ set :protection, :session => true
1994
2081
  </dd>
1995
2082
 
1996
2083
  <dt>bind</dt>
1997
- <dd>바인드할 IP 주소(기본값: <tt>0.0.0.0</tt> <em>이나</em> `environment`가 개발로 설정 되어있으면 <tt>localhost</tt>). 오직 빌트인(built-in) 서버에서만 사용됨.</dd>
2084
+ <dd>바인드할 IP 주소(기본값: <tt>0.0.0.0</tt> <em>이나</em>
2085
+ `environment`가 개발로 설정 되어있으면 <tt>localhost</tt>). 오직
2086
+ 빌트인(built-in) 서버에서만 사용됨.</dd>
1998
2087
 
1999
2088
  <dt>default_encoding</dt>
2000
2089
  <dd>인코딩을 알 수 없을 때 인코딩(기본값은 <tt>"utf-8"</tt>).</dd>
@@ -2180,15 +2269,22 @@ end
2180
2269
  ### 에러
2181
2270
 
2182
2271
  `error` 핸들러는 라우터 또는 필터에서 뭐든 오류가 발생할 경우에 호출됩니다.
2272
+ 하지만 개발 환경에서는 예외 확인 옵션을 `:after_handler`로 설정되어 있을 경우에만
2273
+ 실행됨을 주의하세요.
2274
+
2275
+ ``` ruby
2276
+ set :show_exceptions, :after_handler
2277
+ ```
2278
+
2183
2279
  예외 객체는 Rack 변수 `sinatra.error`로부터 얻을 수 있습니다.
2184
2280
 
2185
2281
  ``` ruby
2186
2282
  error do
2187
- '고약한 오류가 발생했군요 - ' + env['sinatra.error'].name
2283
+ '고약한 오류가 발생했군요 - ' + env['sinatra.error'].message
2188
2284
  end
2189
2285
  ```
2190
2286
 
2191
- 사용자 정의 오류는 이렇게 정의한다.
2287
+ 사용자 정의 오류는 이렇게 정의합니다.
2192
2288
 
2193
2289
  ``` ruby
2194
2290
  error MyCustomError do
@@ -2196,7 +2292,7 @@ error MyCustomError do
2196
2292
  end
2197
2293
  ```
2198
2294
 
2199
- 그런 다음, 이 오류가 발생하면 이렇게 처리한다.
2295
+ 그런 다음, 이 오류가 발생하면 이렇게 처리합니다.
2200
2296
 
2201
2297
  ``` ruby
2202
2298
  get '/' do
@@ -2233,9 +2329,9 @@ end
2233
2329
  Sinatra는 개발 환경에서 동작할 때 브라우저에 괜찮은 스택 트레이스와 추가적인
2234
2330
  디버그 정보를 보여주기 위해 특별한 `not_found` 와 `error` 핸들러를 설치합니다.
2235
2331
 
2236
- ## Rack 미들웨어(Rack Middleware)
2332
+ ## Rack 미들웨어(Middleware)
2237
2333
 
2238
- Sinatra는 [Rack](http://rack.rubyforge.org/) 위에서 동작하며, Rack은 루비 웹
2334
+ Sinatra는 [Rack](http://rack.github.io/) 위에서 동작하며, Rack은 루비 웹
2239
2335
  프레임워크를 위한 최소한의 표준 인터페이스입니다. Rack이 애플리케이션 개발자들에게
2240
2336
  제공하는 가장 흥미로운 기능은 "미들웨어(middleware)"에 대한 지원입니다.
2241
2337
  여기서 미들웨어란 서버와 여러분의 애플리케이션 사이에 위치하면서 HTTP 요청/응답을
@@ -2256,7 +2352,7 @@ get '/hello' do
2256
2352
  end
2257
2353
  ```
2258
2354
 
2259
- `use`문법은 [Rack::Builder](http://rack.rubyforge.org/doc/classes/Rack/Builder.html]) DSL
2355
+ `use`문법은 [Rack::Builder](http://rubydoc.info/github/rack/rack/master/Rack/Builder) DSL
2260
2356
  (rackup 파일에서 가장 많이 사용)에서 정의한 것과 동일합니다. 예를 들어, `use` 메서드는
2261
2357
  블록이나 여러 개의/가변적인 인자도 받을 수 있습니다.
2262
2358
 
@@ -2283,10 +2379,10 @@ Sinatra 테스트는 많은 Rack 기반 테스팅 라이브러리, 프레임워
2283
2379
 
2284
2380
  ``` ruby
2285
2381
  require 'my_sinatra_app'
2286
- require 'test/unit'
2382
+ require 'minitest/autorun'
2287
2383
  require 'rack/test'
2288
2384
 
2289
- class MyAppTest < Test::Unit::TestCase
2385
+ class MyAppTest < Minitest::Test
2290
2386
  include Rack::Test::Methods
2291
2387
 
2292
2388
  def app
@@ -2485,8 +2581,8 @@ class LoginScreen < Sinatra::Base
2485
2581
  get('/login') { haml :login }
2486
2582
 
2487
2583
  post('/login') do
2488
- if params[:name] == 'admin' && params[:password] == 'admin'
2489
- session['user_name'] = params[:name]
2584
+ if params['name'] == 'admin' && params['password'] == 'admin'
2585
+ session['user_name'] = params['name']
2490
2586
  else
2491
2587
  redirect '/login'
2492
2588
  end
@@ -2607,8 +2703,8 @@ class MyApp < Sinatra::Base
2607
2703
  # '/define_route/:name'의 요청 범위
2608
2704
  @value = 42
2609
2705
 
2610
- settings.get("/#{params[:name]}") do
2611
- # "/#{params[:name]}"의 요청 범위
2706
+ settings.get("/#{params['name']}") do
2707
+ # "/#{params['name']}"의 요청 범위
2612
2708
  @value # => nil (동일한 요청이 아님)
2613
2709
  end
2614
2710
 
@@ -2687,9 +2783,9 @@ ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
2687
2783
  중단되지 않을 것입니다.
2688
2784
  </dd>
2689
2785
 
2690
- <dt>Ruby 2.0.0</dt>
2786
+ <dt>Ruby 2.x</dt>
2691
2787
  <dd>
2692
- 2.0.0은 완전하게 지원되고 권장합니다. 현재 공식 지원 중지 계획은 없습니다.
2788
+ 2.x은 완전하게 지원되고 권장합니다. 현재 공식 지원 중지 계획은 없습니다.
2693
2789
  </dd>
2694
2790
 
2695
2791
  <dt>Rubinius</dt>
@@ -2720,9 +2816,9 @@ ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
2720
2816
  지원되는 플랫폼에서는 그러지 않을 경우, 우리의 문제가 아니라 그 플랫폼의 문제로
2721
2817
  간주한다는 뜻입니다.
2722
2818
 
2723
- 또한 우리는 CI를 ruby-head ( 나올 2.1.0) 브랜치에 맞춰 실행하지만,
2819
+ 또한 우리는 CI를 ruby-head (MRI의 이후 릴리즈) 브랜치에 맞춰 실행하지만,
2724
2820
  계속해서 변하고 있기 때문에 아무 것도 보장할 수는 없습니다.
2725
- 2.1.0가 완전히 지원되길 기대합시다.
2821
+ 앞으로 나올 2.x가 완전히 지원되길 기대합시다.
2726
2822
 
2727
2823
  Sinatra는 선택한 루비 구현체가 지원하는 어떠한 운영체제에서도 작동해야
2728
2824
  합니다.
@@ -2825,7 +2921,7 @@ SemVerTag를 준수합니다.
2825
2921
  * [트위터](http://twitter.com/sinatra)
2826
2922
  * [메일링 리스트](http://groups.google.com/group/sinatrarb/topics)
2827
2923
  * IRC: [#sinatra](irc://chat.freenode.net/#sinatra) http://freenode.net
2828
- * [Sinatra Book](http://sinatra-book.gittr.com) Cookbook 튜토리얼
2924
+ * [Sinatra Book](https://github.com/sinatra/sinatra-book/) Cookbook 튜토리얼
2829
2925
  * [Sinatra Recipes](http://recipes.sinatrarb.com/) 커뮤니티가 만드는 레시피
2830
2926
  * http://rubydoc.info에 있는 [최종 릴리스](http://rubydoc.info/gems/sinatra)
2831
2927
  또는 [current HEAD](http://rubydoc.info/github/sinatra/sinatra)에 대한 API 문서