sinatra 1.4.8 → 2.0.0

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 (126) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +111 -47
  3. data/CONTRIBUTING.md +1 -1
  4. data/Gemfile +41 -49
  5. data/LICENSE +4 -1
  6. data/MAINTENANCE.md +42 -0
  7. data/README.de.md +644 -436
  8. data/README.es.md +6 -6
  9. data/README.fr.md +9 -9
  10. data/README.hu.md +37 -3
  11. data/README.ja.md +103 -45
  12. data/README.ko.md +8 -8
  13. data/README.md +471 -363
  14. data/README.pt-br.md +3 -3
  15. data/README.pt-pt.md +2 -2
  16. data/README.ru.md +42 -64
  17. data/README.zh.md +8 -8
  18. data/Rakefile +72 -49
  19. data/SECURITY.md +35 -0
  20. data/lib/sinatra/base.rb +137 -195
  21. data/lib/sinatra/indifferent_hash.rb +150 -0
  22. data/lib/sinatra/main.rb +1 -0
  23. data/lib/sinatra/show_exceptions.rb +63 -55
  24. data/lib/sinatra/version.rb +1 -1
  25. data/sinatra.gemspec +19 -7
  26. metadata +30 -164
  27. data/lib/sinatra/ext.rb +0 -17
  28. data/test/asciidoctor_test.rb +0 -72
  29. data/test/base_test.rb +0 -167
  30. data/test/builder_test.rb +0 -91
  31. data/test/coffee_test.rb +0 -96
  32. data/test/compile_test.rb +0 -183
  33. data/test/contest.rb +0 -91
  34. data/test/creole_test.rb +0 -65
  35. data/test/delegator_test.rb +0 -160
  36. data/test/encoding_test.rb +0 -20
  37. data/test/erb_test.rb +0 -116
  38. data/test/extensions_test.rb +0 -98
  39. data/test/filter_test.rb +0 -487
  40. data/test/haml_test.rb +0 -109
  41. data/test/helper.rb +0 -132
  42. data/test/helpers_test.rb +0 -1917
  43. data/test/integration/app.rb +0 -79
  44. data/test/integration_helper.rb +0 -236
  45. data/test/integration_test.rb +0 -104
  46. data/test/less_test.rb +0 -69
  47. data/test/liquid_test.rb +0 -77
  48. data/test/mapped_error_test.rb +0 -285
  49. data/test/markaby_test.rb +0 -80
  50. data/test/markdown_test.rb +0 -85
  51. data/test/mediawiki_test.rb +0 -68
  52. data/test/middleware_test.rb +0 -68
  53. data/test/nokogiri_test.rb +0 -67
  54. data/test/public/favicon.ico +0 -0
  55. data/test/public/hello+world.txt +0 -1
  56. data/test/rabl_test.rb +0 -89
  57. data/test/rack_test.rb +0 -45
  58. data/test/radius_test.rb +0 -59
  59. data/test/rdoc_test.rb +0 -66
  60. data/test/readme_test.rb +0 -130
  61. data/test/request_test.rb +0 -100
  62. data/test/response_test.rb +0 -63
  63. data/test/result_test.rb +0 -76
  64. data/test/route_added_hook_test.rb +0 -59
  65. data/test/routing_test.rb +0 -1456
  66. data/test/sass_test.rb +0 -115
  67. data/test/scss_test.rb +0 -88
  68. data/test/server_test.rb +0 -56
  69. data/test/settings_test.rb +0 -582
  70. data/test/sinatra_test.rb +0 -12
  71. data/test/slim_test.rb +0 -102
  72. data/test/static_test.rb +0 -266
  73. data/test/streaming_test.rb +0 -149
  74. data/test/stylus_test.rb +0 -90
  75. data/test/templates_test.rb +0 -382
  76. data/test/textile_test.rb +0 -65
  77. data/test/views/a/in_a.str +0 -1
  78. data/test/views/ascii.erb +0 -2
  79. data/test/views/b/in_b.str +0 -1
  80. data/test/views/calc.html.erb +0 -1
  81. data/test/views/error.builder +0 -3
  82. data/test/views/error.erb +0 -3
  83. data/test/views/error.haml +0 -3
  84. data/test/views/error.sass +0 -2
  85. data/test/views/explicitly_nested.str +0 -1
  86. data/test/views/foo/hello.test +0 -1
  87. data/test/views/hello.asciidoc +0 -1
  88. data/test/views/hello.builder +0 -1
  89. data/test/views/hello.coffee +0 -1
  90. data/test/views/hello.creole +0 -1
  91. data/test/views/hello.erb +0 -1
  92. data/test/views/hello.haml +0 -1
  93. data/test/views/hello.less +0 -5
  94. data/test/views/hello.liquid +0 -1
  95. data/test/views/hello.mab +0 -1
  96. data/test/views/hello.md +0 -1
  97. data/test/views/hello.mediawiki +0 -1
  98. data/test/views/hello.nokogiri +0 -1
  99. data/test/views/hello.rabl +0 -2
  100. data/test/views/hello.radius +0 -1
  101. data/test/views/hello.rdoc +0 -1
  102. data/test/views/hello.sass +0 -2
  103. data/test/views/hello.scss +0 -3
  104. data/test/views/hello.slim +0 -1
  105. data/test/views/hello.str +0 -1
  106. data/test/views/hello.styl +0 -2
  107. data/test/views/hello.test +0 -1
  108. data/test/views/hello.textile +0 -1
  109. data/test/views/hello.wlang +0 -1
  110. data/test/views/hello.yajl +0 -1
  111. data/test/views/layout2.builder +0 -3
  112. data/test/views/layout2.erb +0 -2
  113. data/test/views/layout2.haml +0 -2
  114. data/test/views/layout2.liquid +0 -2
  115. data/test/views/layout2.mab +0 -2
  116. data/test/views/layout2.nokogiri +0 -3
  117. data/test/views/layout2.rabl +0 -3
  118. data/test/views/layout2.radius +0 -2
  119. data/test/views/layout2.slim +0 -3
  120. data/test/views/layout2.str +0 -2
  121. data/test/views/layout2.test +0 -1
  122. data/test/views/layout2.wlang +0 -2
  123. data/test/views/nested.str +0 -1
  124. data/test/views/utf8.erb +0 -2
  125. data/test/wlang_test.rb +0 -87
  126. data/test/yajl_test.rb +0 -86
data/README.pt-br.md CHANGED
@@ -180,7 +180,7 @@ end
180
180
  Rotas podem casar com expressões regulares:
181
181
 
182
182
  ```ruby
183
- get /\A\/ola\/([\w]+)\z/ do
183
+ get /\/ola\/([\w]+)/ do
184
184
  "Olá, #{params['captures'].first}!"
185
185
  end
186
186
  ```
@@ -362,7 +362,7 @@ end
362
362
  Ou, usando algo mais denso à frente:
363
363
 
364
364
  ```ruby
365
- get %r{^(?!/index$)} do
365
+ get %r{(?!/index)} do
366
366
  # ...
367
367
  end
368
368
  ```
@@ -1417,7 +1417,7 @@ configure do
1417
1417
  end
1418
1418
  ```
1419
1419
 
1420
- Rodando somente quando o ambiente (`RACK_ENV` environment variável) é
1420
+ Rodando somente quando o ambiente (`APP_ENV` environment variável) é
1421
1421
  setado para `:production`:
1422
1422
 
1423
1423
  ```ruby
data/README.pt-pt.md CHANGED
@@ -88,7 +88,7 @@ end
88
88
  Rotas correspondem-se com expressões regulares:
89
89
 
90
90
  ```ruby
91
- get /\A\/ola\/([\w]+)\z/ do
91
+ get /\/ola\/([\w]+)/ do
92
92
  "Olá, #{params['captures'].first}!"
93
93
  end
94
94
  ```
@@ -477,7 +477,7 @@ configure do
477
477
  end
478
478
  ```
479
479
 
480
- Correndo somente quando o ambiente (`RACK_ENV` environment variável) é
480
+ Correndo somente quando o ambiente (`APP_ENV` environment variável) é
481
481
  definido para `:production`:
482
482
 
483
483
  ```ruby
data/README.ru.md CHANGED
@@ -42,6 +42,7 @@
42
42
  * [Фильтры](#Фильтры)
43
43
  * [Методы-помощники](#Методы-помощники)
44
44
  * [Использование сессий](#Использование-сессий)
45
+ * [Выбор вашей собственной "прослойки" сессии](#Выбор-вашей-собственной-прослойки-сессий)
45
46
  * [Прерывание](#Прерывание)
46
47
  * [Передача](#Передача)
47
48
  * [Вызов другого маршрута](#Вызов-другого-маршрута)
@@ -82,8 +83,6 @@
82
83
  * [Системные требования](#Системные-требования)
83
84
  * [На острие](#На-острие)
84
85
  * [С помощью Bundler](#С-помощью-bundler)
85
- * [Вручную](#Вручную)
86
- * [Установка глобально](#Установка-глобально)
87
86
  * [Версии](#Версии)
88
87
  * [Дальнейшее чтение](#Дальнейшее-чтение)
89
88
 
@@ -208,7 +207,7 @@ end
208
207
  Регулярные выражения в качестве шаблонов маршрутов:
209
208
 
210
209
  ```ruby
211
- get /\A\/hello\/([\w]+)\z/ do
210
+ get /\/hello\/([\w]+)/ do
212
211
  "Hello, #{params['captures'].first}!"
213
212
  end
214
213
  ```
@@ -377,7 +376,7 @@ end
377
376
  Или с использованием негативного просмотра вперед:
378
377
 
379
378
  ```ruby
380
- get %r{^(?!/index$)} do
379
+ get %r{(?!/index)} do
381
380
  # ...
382
381
  end
383
382
  ```
@@ -1341,25 +1340,6 @@ get '/:value' do
1341
1340
  end
1342
1341
  ```
1343
1342
 
1344
- Заметьте, что при использовании `enable :sessions` все данные сохраняются в
1345
- куках (cookies). Это может быть не совсем то, что вы хотите (например,
1346
- сохранение больших объемов данных увеличит ваш трафик). В таком случае вы
1347
- можете использовать альтернативную Rack "прослойку" (middleware), реализующую
1348
- механизм сессий. Для этого *не надо* вызывать `enable :sessions`, вместо этого
1349
- следует подключить ее так же, как и любую другую "прослойку":
1350
-
1351
- ```ruby
1352
- use Rack::Session::Pool, :expire_after => 2592000
1353
-
1354
- get '/' do
1355
- "value = " << session['value'].inspect
1356
- end
1357
-
1358
- get '/:value' do
1359
- session['value'] = params['value']
1360
- end
1361
- ```
1362
-
1363
1343
  Для повышения безопасности данные сессии в куках подписываются секретным
1364
1344
  ключом. Секретный ключ генерируется Sinatra. Тем не менее, так как этот ключ
1365
1345
  будет меняться с каждым запуском приложения, вы, возможно, захотите установить
@@ -1384,6 +1364,40 @@ foo.com, добавьте *.* перед доменом:
1384
1364
  set :sessions, :domain => '.foo.com'
1385
1365
  ```
1386
1366
 
1367
+ #### Выбор вашей собственной "прослойки" сессии
1368
+
1369
+ Заметьте, что при использовании `enable :sessions` все данные сохраняются в
1370
+ куках (cookies). Это может быть не совсем то, что вы хотите (например,
1371
+ сохранение больших объемов данных увеличит ваш трафик). В таком случае вы
1372
+ можете использовать альтернативную Rack "прослойку" (middleware), реализующую
1373
+ механизм сессий. Для этого используете один из способов ниже:
1374
+
1375
+ ```ruby
1376
+ enable :sessions
1377
+ set :session_store, Rack::Session::Pool
1378
+ ```
1379
+
1380
+ Или установите параметры сессии с помощью хеша опций:
1381
+
1382
+ ```ruby
1383
+ set :sessions, :expire_after => 2592000
1384
+ set :session_store, Rack::Session::Pool
1385
+ ```
1386
+
1387
+ Вы так же можете не вызывать `enable :sessions`, а вместо этого вызывать
1388
+ необходимую вам прослойку так же, как вы это обычно делаете. Очень важно
1389
+ обратить внимание на то, что когда вы используете этот метод, основной способ
1390
+ защиты сессии **не будет включен по умолчанию**. Если вы хотите включить защиту,
1391
+ вам нужно добавить следующие строчки:
1392
+
1393
+ ```ruby
1394
+ use Rack::Session::Pool, :expire_after => 2592000
1395
+ use Rack::Protection::RemoteToken
1396
+ use Rack::Protection::SessionHijacking
1397
+ ```
1398
+
1399
+ Смотрите секцию "Настройка защиты от атак" для более подробной информации.
1400
+
1387
1401
  ### Прерывание
1388
1402
 
1389
1403
  Чтобы незамедлительно прервать обработку запроса внутри фильтра или маршрута,
@@ -2022,7 +2036,7 @@ configure do
2022
2036
  end
2023
2037
  ```
2024
2038
 
2025
- Будет запущено, когда окружение (RACK_ENV переменная) `:production`:
2039
+ Будет запущено, когда окружение (APP_ENV переменная) `:production`:
2026
2040
 
2027
2041
  ```ruby
2028
2042
  configure :production do
@@ -2121,8 +2135,8 @@ set :protection, :except => [:path_traversal, :session_hijacking]
2121
2135
 
2122
2136
  <dt>environment</dt>
2123
2137
  <dd>
2124
- текущее окружение, по умолчанию, значение <tt>ENV['RACK_ENV']</tt> или
2125
- <tt>"development"</tt>, если <tt>ENV['RACK_ENV']</tt> недоступна.
2138
+ текущее окружение, по умолчанию, значение <tt>ENV['APP_ENV']</tt> или
2139
+ <tt>"development"</tt>, если <tt>ENV['APP_ENV']</tt> недоступна.
2126
2140
  </dd>
2127
2141
 
2128
2142
  <dt>logging</dt>
@@ -2249,7 +2263,7 @@ set :protection, :except => [:path_traversal, :session_hijacking]
2249
2263
  ## Режим, окружение
2250
2264
 
2251
2265
  Есть 3 предопределенных режима, окружения: `"development"`, `"production"` и
2252
- `"test"`. Режим может быть задан через переменную окружения `RACK_ENV`.
2266
+ `"test"`. Режим может быть задан через переменную окружения `APP_ENV`.
2253
2267
  Значение по умолчанию — `"development"`. В этом режиме работы все шаблоны
2254
2268
  перезагружаются между запросами. А также задаются специальные обработчики
2255
2269
  `not_found` и `error`, чтобы вы могли увидеть стек вызовов. В окружениях
@@ -2412,7 +2426,7 @@ class MyAppTest < Minitest::Test
2412
2426
  assert_equal 'Hello Frank!', last_response.body
2413
2427
  end
2414
2428
 
2415
- def test_with_rack_env
2429
+ def test_with_user_agent
2416
2430
  get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
2417
2431
  assert_equal "You're using Songbird!", last_response.body
2418
2432
  end
@@ -2897,42 +2911,6 @@ Bundler автоматически скачает и добавит.
2897
2911
  bundle exec ruby myapp.rb
2898
2912
  ```
2899
2913
 
2900
- ### Вручную
2901
-
2902
- Создайте локальный клон репозитория и запускайте свое приложение с
2903
- `sinatra/lib` директорией в `$LOAD_PATH`:
2904
-
2905
- ```
2906
- cd myapp
2907
- git clone git://github.com/sinatra/sinatra.git
2908
- ruby -Isinatra/lib myapp.rb
2909
- ```
2910
-
2911
- Чтобы обновить исходники Sinatra:
2912
-
2913
- ```
2914
- cd myapp/sinatra
2915
- git pull
2916
- ```
2917
-
2918
- ### Установка глобально
2919
-
2920
- Вы можете самостоятельно собрать gem:
2921
-
2922
- ```
2923
- git clone git://github.com/sinatra/sinatra.git
2924
- cd sinatra
2925
- rake sinatra.gemspec
2926
- rake install
2927
- ```
2928
-
2929
- Если вы устанавливаете пакеты (gem) от пользователя root, то вашим последним
2930
- шагом должна быть команда
2931
-
2932
- ```
2933
- sudo rake install
2934
- ```
2935
-
2936
2914
  ## Версии
2937
2915
 
2938
2916
  Sinatra использует [Semantic Versioning](http://semver.org/), SemVer и
data/README.zh.md CHANGED
@@ -205,7 +205,7 @@ end
205
205
  通过正则表达式匹配路由:
206
206
 
207
207
  ```ruby
208
- get /\A\/hello\/([\w]+)\z/ do
208
+ get /\/hello\/([\w]+)/ do
209
209
  "Hello, #{params['captures'].first}!"
210
210
  end
211
211
  ```
@@ -372,7 +372,7 @@ end
372
372
  或者,使用消极向前查找:
373
373
 
374
374
  ```ruby
375
- get %r{^(?!/index$)} do
375
+ get %r{(?!/index)} do
376
376
  # ...
377
377
  end
378
378
  ```
@@ -1933,7 +1933,7 @@ configure do
1933
1933
  end
1934
1934
  ```
1935
1935
 
1936
- 只有当环境 (`RACK_ENV` 环境变量) 被设定为 `:production` 时才运行:
1936
+ 只有当环境 (`APP_ENV` 环境变量) 被设定为 `:production` 时才运行:
1937
1937
 
1938
1938
  ```ruby
1939
1939
  configure :production do
@@ -2033,8 +2033,8 @@ set :protection, :session => true
2033
2033
 
2034
2034
  <dt>environment</dt>
2035
2035
  <dd>
2036
- 当前环境,默认是 <tt>ENV['RACK_ENV']</tt>,
2037
- 或者 <tt>"development"</tt> (如果 ENV['RACK_ENV'] 不可用)。
2036
+ 当前环境,默认是 <tt>ENV['APP_ENV']</tt>,
2037
+ 或者 <tt>"development"</tt> (如果 ENV['APP_ENV'] 不可用)。
2038
2038
  </dd>
2039
2039
 
2040
2040
  <dt>logging</dt>
@@ -2145,15 +2145,15 @@ set :protection, :session => true
2145
2145
  ## 环境
2146
2146
 
2147
2147
  Sinatra 中有三种预先定义的环境:"development"、"production" 和 "test"。
2148
- 环境可以通过 `RACK_ENV` 环境变量设置。默认值为 "development"。
2148
+ 环境可以通过 `APP_ENV` 环境变量设置。默认值为 "development"。
2149
2149
  在开发环境下,每次请求都会重新加载所有模板,
2150
2150
  特殊的 `not_found` 和 `error` 错误处理器会在浏览器中显示 stack trace。
2151
2151
  在测试和生产环境下,模板默认会缓存。
2152
2152
 
2153
- 在不同的环境下运行,设置 `RACK_ENV` 环境变量:
2153
+ 在不同的环境下运行,设置 `APP_ENV` 环境变量:
2154
2154
 
2155
2155
  ```shell
2156
- RACK_ENV=production ruby my_app.rb
2156
+ APP_ENV=production ruby my_app.rb
2157
2157
  ```
2158
2158
 
2159
2159
  可以使用预定义的三种方法: `development?`、`test?` 和 `production?` 来检查当前环境:
data/Rakefile CHANGED
@@ -3,22 +3,13 @@ require 'rake/testtask'
3
3
  require 'fileutils'
4
4
  require 'date'
5
5
 
6
- # CI Reporter is only needed for the CI
7
- begin
8
- require 'ci/reporter/rake/test_unit'
9
- rescue LoadError
10
- end
11
-
12
6
  task :default => :test
13
7
  task :spec => :test
14
8
 
15
9
  CLEAN.include "**/*.rbc"
16
10
 
17
11
  def source_version
18
- @source_version ||= begin
19
- load './lib/sinatra/version.rb'
20
- Sinatra::VERSION
21
- end
12
+ @source_version ||= File.read(File.expand_path("../VERSION", __FILE__)).strip
22
13
  end
23
14
 
24
15
  def prev_feature
@@ -61,7 +52,8 @@ namespace :test do
61
52
  desc 'Measures test coverage'
62
53
  task :coverage do
63
54
  rm_f "coverage"
64
- sh "rcov -Ilib test/*_test.rb"
55
+ ENV['COVERAGE'] = '1'
56
+ Rake::Task['test'].invoke
65
57
  end
66
58
  end
67
59
 
@@ -95,9 +87,9 @@ end
95
87
 
96
88
  # Thanks in announcement ===============================================
97
89
 
98
- team = ["Ryan Tomayko", "Blake Mizerany", "Simon Rozet", "Konstantin Haase"]
90
+ team = ["Ryan Tomayko", "Blake Mizerany", "Simon Rozet", "Konstantin Haase", "Zachary Scott"]
99
91
  desc "list of contributors"
100
- task :thanks, [:release,:backports] do |t, a|
92
+ task :thanks, ['release:all', :backports] do |t, a|
101
93
  a.with_defaults :release => "#{prev_version}..HEAD",
102
94
  :backports => "#{prev_feature}.0..#{prev_feature}.x"
103
95
  included = `git log --format=format:"%aN\t%s" #{a.release}`.lines.map { |l| l.force_encoding('binary') }
@@ -146,54 +138,85 @@ end
146
138
  # PACKAGING ============================================================
147
139
 
148
140
  if defined?(Gem)
149
- # Load the gemspec using the same limitations as github
150
- def spec
151
- require 'rubygems' unless defined? Gem::Specification
152
- @spec ||= eval(File.read('sinatra.gemspec'))
141
+ GEMS_AND_ROOT_DIRECTORIES = {
142
+ "sinatra" => ".",
143
+ "sinatra-contrib" => "./sinatra-contrib",
144
+ "rack-protection" => "./rack-protection"
145
+ }
146
+
147
+ def package(gem, ext='')
148
+ "pkg/#{gem}-#{source_version}" + ext
153
149
  end
154
150
 
155
- def package(ext='')
156
- "pkg/sinatra-#{spec.version}" + ext
157
- end
151
+ directory 'pkg/'
152
+ CLOBBER.include('pkg')
158
153
 
159
- desc 'Build packages'
160
- task :package => %w[.gem .tar.gz].map {|e| package(e)}
154
+ GEMS_AND_ROOT_DIRECTORIES.each do |gem, directory|
155
+ file package(gem, '.gem') => ["pkg/", "#{directory + '/' + gem}.gemspec"] do |f|
156
+ sh "cd #{directory} && gem build #{gem}.gemspec"
157
+ mv directory + "/" + File.basename(f.name), f.name
158
+ end
161
159
 
162
- desc 'Build and install as local gem'
163
- task :install => package('.gem') do
164
- sh "gem install #{package('.gem')}"
160
+ file package(gem, '.tar.gz') => ["pkg/"] do |f|
161
+ sh <<-SH
162
+ git archive \
163
+ --prefix=#{gem}-#{source_version}/ \
164
+ --format=tar \
165
+ HEAD -- #{directory} | gzip > #{f.name}
166
+ SH
167
+ end
165
168
  end
166
169
 
167
- directory 'pkg/'
168
- CLOBBER.include('pkg')
170
+ namespace :package do
171
+ GEMS_AND_ROOT_DIRECTORIES.each do |gem, directory|
172
+ desc "Build #{gem} packages"
173
+ task gem => %w[.gem .tar.gz].map { |e| package(gem, e) }
174
+ end
169
175
 
170
- file package('.gem') => %w[pkg/ sinatra.gemspec] + spec.files do |f|
171
- sh "gem build sinatra.gemspec"
172
- mv File.basename(f.name), f.name
176
+ desc "Build all packages"
177
+ task :all => GEMS_AND_ROOT_DIRECTORIES.keys
173
178
  end
174
179
 
175
- file package('.tar.gz') => %w[pkg/] + spec.files do |f|
176
- sh <<-SH
177
- git archive \
178
- --prefix=sinatra-#{source_version}/ \
179
- --format=tar \
180
- HEAD | gzip > #{f.name}
181
- SH
180
+ namespace :install do
181
+ GEMS_AND_ROOT_DIRECTORIES.each do |gem, directory|
182
+ desc "Build and install #{gem} as local gem"
183
+ task gem => package(gem, '.gem') do
184
+ sh "gem install #{package(gem, '.gem')}"
185
+ end
186
+ end
187
+
188
+ desc "Build and install all of the gems as local gems"
189
+ task :all => GEMS_AND_ROOT_DIRECTORIES.keys
182
190
  end
183
191
 
184
- task 'release' => ['test', package('.gem')] do
185
- if File.binread("CHANGELOG.md") =~ /= \d\.\d\.\d . not yet released$/i
186
- fail 'please update the changelog first' unless %x{git symbolic-ref HEAD} == "refs/heads/prerelease\n"
192
+ namespace :release do
193
+ GEMS_AND_ROOT_DIRECTORIES.each do |gem, directory|
194
+ desc "Release #{gem} as a package"
195
+ task gem => "package:#{gem}" do
196
+ sh <<-SH
197
+ gem install #{package(gem, '.gem')} --local &&
198
+ gem push #{package(gem, '.gem')}
199
+ SH
200
+ end
201
+ end
202
+
203
+ desc "Commits the version to github repository"
204
+ task :commit_version do
205
+ sh <<-SH
206
+ sed -i "s/.*VERSION.*/ VERSION = '#{source_version}'/" lib/sinatra/version.rb
207
+ sed -i "s/.*VERSION.*/ VERSION = '#{source_version}'/" sinatra-contrib/lib/sinatra/contrib/version.rb
208
+ sed -i "s/.*VERSION.*/ VERSION = '#{source_version}'/" rack-protection/lib/rack/protection/version.rb
209
+ SH
210
+
211
+ sh <<-SH
212
+ git commit --allow-empty -a -m '#{source_version} release' &&
213
+ git tag -s v#{source_version} -m '#{source_version} release' &&
214
+ git push && (git push origin || true) &&
215
+ git push --tags && (git push origin --tags || true)
216
+ SH
187
217
  end
188
218
 
189
- sh <<-SH
190
- gem install #{package('.gem')} --local &&
191
- gem push #{package('.gem')} &&
192
- git commit --allow-empty -a -m '#{source_version} release' &&
193
- git tag -s v#{source_version} -m '#{source_version} release' &&
194
- git tag -s #{source_version} -m '#{source_version} release' &&
195
- git push && (git push sinatra || true) &&
196
- git push --tags && (git push sinatra --tags || true)
197
- SH
219
+ desc "Release all gems as packages"
220
+ task :all => [:test, :commit_version] + GEMS_AND_ROOT_DIRECTORIES.keys
198
221
  end
199
222
  end
data/SECURITY.md ADDED
@@ -0,0 +1,35 @@
1
+ # Reporting a security bug
2
+
3
+ All security bugs in Sinatra should be reported to the core team through our private mailing list [sinatra-security@googlegroups.com](https://groups.google.com/group/sinatra-security). Your report will be acknowledged within 24 hours, and you’ll receive a more detailed response to your email within 48 hours indicating the next steps in handling your report.
4
+
5
+ After the initial reply to your report the security team will endeavor to keep you informed of the progress being made towards a fix and full announcement. These updates will be sent at least every five days, in reality this is more likely to be every 24-48 hours.
6
+
7
+ If you have not received a reply to your email within 48 hours, or have not heard from the security team for the past five days there are a few steps you can take:
8
+
9
+ * Contact the current security coordinator [Zachary Scott](mailto:zzak@ruby-lang.org) directly
10
+
11
+ ## Disclosure Policy
12
+
13
+ Sinatra has a 5 step disclosure policy, that is upheld to the best of our ability.
14
+
15
+ 1. Security report received and is assigned a primary handler. This person will coordinate the fix and release process.
16
+ 2. Problem is confirmed and, a list of all affected versions is determined. Code is audited to find any potential similar problems.
17
+ 3. Fixes are prepared for all releases which are still supported. These fixes are not committed to the public repository but rather held locally pending the announcement.
18
+ 4. A suggested embargo date for this vulnerability is chosen and distros@openwall is notified. This notification will include patches for all versions still under support and a contact address for packagers who need advice back-porting patches to older versions.
19
+ 5. On the embargo date, the [mailing list][mailing-list] and [security list][security-list] are sent a copy of the announcement. The changes are pushed to the public repository and new gems released to rubygems.
20
+
21
+ Typically the embargo date will be set 72 hours from the time vendor-sec is first notified, however this may vary depending on the severity of the bug or difficulty in applying a fix.
22
+
23
+ This process can take some time, especially when coordination is required with maintainers of other projects. Every effort will be made to handle the bug in as timely a manner as possible, however it’s important that we follow the release process above to ensure that the disclosure is handled in a consistent manner.
24
+
25
+ ## Security Updates
26
+
27
+ Security updates will be posted on the [mailing list][mailing-list] and [security list][security-list].
28
+
29
+ ## Comments on this Policy
30
+
31
+ If you have any suggestions to improve this policy, please send an email the core team at [sinatrarb@googlegroups.com](https://groups.google.com/group/sinatrarb).
32
+
33
+
34
+ [mailing-list]: http://groups.google.com/group/sinatrarb/topics
35
+ [security-list]: http://groups.google.com/group/sinatra-security/topics