sinatra 1.4.6 → 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 (125) hide show
  1. checksums.yaml +4 -4
  2. data/AUTHORS.md +5 -2
  3. data/{CHANGES → CHANGELOG.md} +126 -46
  4. data/CONTRIBUTING.md +100 -0
  5. data/Gemfile +12 -17
  6. data/LICENSE +5 -2
  7. data/MAINTENANCE.md +42 -0
  8. data/README.de.md +711 -466
  9. data/README.es.md +206 -171
  10. data/README.fr.md +370 -344
  11. data/README.hu.md +44 -10
  12. data/README.ja.md +300 -210
  13. data/README.ko.md +230 -191
  14. data/README.md +675 -528
  15. data/README.pt-br.md +149 -115
  16. data/README.pt-pt.md +65 -65
  17. data/README.ru.md +198 -97
  18. data/README.zh.md +1943 -1237
  19. data/Rakefile +72 -49
  20. data/SECURITY.md +35 -0
  21. data/lib/sinatra/base.rb +141 -207
  22. data/lib/sinatra/indifferent_hash.rb +150 -0
  23. data/lib/sinatra/main.rb +1 -0
  24. data/lib/sinatra/show_exceptions.rb +70 -56
  25. data/lib/sinatra/version.rb +1 -1
  26. data/sinatra.gemspec +19 -7
  27. metadata +32 -163
  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/rabl_test.rb +0 -89
  56. data/test/rack_test.rb +0 -45
  57. data/test/radius_test.rb +0 -59
  58. data/test/rdoc_test.rb +0 -66
  59. data/test/readme_test.rb +0 -130
  60. data/test/request_test.rb +0 -100
  61. data/test/response_test.rb +0 -63
  62. data/test/result_test.rb +0 -76
  63. data/test/route_added_hook_test.rb +0 -59
  64. data/test/routing_test.rb +0 -1412
  65. data/test/sass_test.rb +0 -115
  66. data/test/scss_test.rb +0 -88
  67. data/test/server_test.rb +0 -56
  68. data/test/settings_test.rb +0 -582
  69. data/test/sinatra_test.rb +0 -12
  70. data/test/slim_test.rb +0 -102
  71. data/test/static_test.rb +0 -236
  72. data/test/streaming_test.rb +0 -149
  73. data/test/stylus_test.rb +0 -90
  74. data/test/templates_test.rb +0 -382
  75. data/test/textile_test.rb +0 -65
  76. data/test/views/a/in_a.str +0 -1
  77. data/test/views/ascii.erb +0 -2
  78. data/test/views/b/in_b.str +0 -1
  79. data/test/views/calc.html.erb +0 -1
  80. data/test/views/error.builder +0 -3
  81. data/test/views/error.erb +0 -3
  82. data/test/views/error.haml +0 -3
  83. data/test/views/error.sass +0 -2
  84. data/test/views/explicitly_nested.str +0 -1
  85. data/test/views/foo/hello.test +0 -1
  86. data/test/views/hello.asciidoc +0 -1
  87. data/test/views/hello.builder +0 -1
  88. data/test/views/hello.coffee +0 -1
  89. data/test/views/hello.creole +0 -1
  90. data/test/views/hello.erb +0 -1
  91. data/test/views/hello.haml +0 -1
  92. data/test/views/hello.less +0 -5
  93. data/test/views/hello.liquid +0 -1
  94. data/test/views/hello.mab +0 -1
  95. data/test/views/hello.md +0 -1
  96. data/test/views/hello.mediawiki +0 -1
  97. data/test/views/hello.nokogiri +0 -1
  98. data/test/views/hello.rabl +0 -2
  99. data/test/views/hello.radius +0 -1
  100. data/test/views/hello.rdoc +0 -1
  101. data/test/views/hello.sass +0 -2
  102. data/test/views/hello.scss +0 -3
  103. data/test/views/hello.slim +0 -1
  104. data/test/views/hello.str +0 -1
  105. data/test/views/hello.styl +0 -2
  106. data/test/views/hello.test +0 -1
  107. data/test/views/hello.textile +0 -1
  108. data/test/views/hello.wlang +0 -1
  109. data/test/views/hello.yajl +0 -1
  110. data/test/views/layout2.builder +0 -3
  111. data/test/views/layout2.erb +0 -2
  112. data/test/views/layout2.haml +0 -2
  113. data/test/views/layout2.liquid +0 -2
  114. data/test/views/layout2.mab +0 -2
  115. data/test/views/layout2.nokogiri +0 -3
  116. data/test/views/layout2.rabl +0 -3
  117. data/test/views/layout2.radius +0 -2
  118. data/test/views/layout2.slim +0 -3
  119. data/test/views/layout2.str +0 -2
  120. data/test/views/layout2.test +0 -1
  121. data/test/views/layout2.wlang +0 -2
  122. data/test/views/nested.str +0 -1
  123. data/test/views/utf8.erb +0 -2
  124. data/test/wlang_test.rb +0 -87
  125. data/test/yajl_test.rb +0 -86
data/README.ru.md CHANGED
@@ -1,10 +1,96 @@
1
1
  # Sinatra
2
2
 
3
+ ## Содержание
4
+
5
+ * [Sinatra](#sinatra)
6
+ * [Маршруты](#Маршруты)
7
+ * [Условия](#Условия)
8
+ * [Возвращаемые значения](#Возвращаемые-значения)
9
+ * [Собственные детекторы совпадений для маршрутов](#Собственные-детекторы-совпадений-для-маршрутов)
10
+ * [Статические файлы](#Статические-файлы)
11
+ * [Представления / Шаблоны](#Представления--Шаблоны)
12
+ * [Буквальные шаблоны](#Буквальные-шаблоны)
13
+ * [Доступные шаблонизаторы](#Доступные-шаблонизаторы)
14
+ * [Haml шаблоны](#haml-шаблоны)
15
+ * [Erb шаблоны](#erb-шаблоны)
16
+ * [Builder шаблоны](#builder-шаблоны)
17
+ * [Nokogiri шаблоны](#nokogiri-шаблоны)
18
+ * [Sass шаблоны](#sass-шаблоны)
19
+ * [SCSS шаблоны](#scss-шаблоны)
20
+ * [Less шаблоны](#less-шаблоны)
21
+ * [Liquid шаблоны](#liquid-шаблоны)
22
+ * [Markdown шаблоны](#markdown-шаблоны)
23
+ * [Textile шаблоны](#textile-шаблоны)
24
+ * [RDoc шаблоны](#rdoc-шаблоны)
25
+ * [AsciiDoc шаблоны](#asciidoc-шаблоны)
26
+ * [Radius шаблоны](#radius-шаблоны)
27
+ * [Markaby шаблоны](#markaby-шаблоны)
28
+ * [RABL шаблоны](#rabl-шаблоны)
29
+ * [Slim шаблоны](#slim-шаблоны)
30
+ * [Creole шаблоны](#creole-шаблоны)
31
+ * [MediaWiki шаблоны](#mediawiki-шаблоны)
32
+ * [CoffeeScript шаблоны](#coffeescript-шаблоны)
33
+ * [Stylus шаблоны](#stylus-шаблоны)
34
+ * [Yajl шаблоны](#yajl-шаблоны)
35
+ * [WLang шаблоны](#wlang-шаблоны)
36
+ * [Доступ к переменным в шаблонах](#Доступ-к-переменным-в-шаблонах)
37
+ * [Шаблоны с `yield` и вложенные раскладки (layout)](#Шаблоны-с-yield-и-вложенные-раскладки-layout)
38
+ * [Включённые шаблоны](#Включённые-шаблоны)
39
+ * [Именованные шаблоны](#Именованные-шаблоны)
40
+ * [Привязка файловых расширений](#Привязка-файловых-расширений)
41
+ * [Добавление собственного движка рендеринга](#Добавление-собственного-движка-рендеринга)
42
+ * [Фильтры](#Фильтры)
43
+ * [Методы-помощники](#Методы-помощники)
44
+ * [Использование сессий](#Использование-сессий)
45
+ * [Выбор вашей собственной "прослойки" сессии](#Выбор-вашей-собственной-прослойки-сессий)
46
+ * [Прерывание](#Прерывание)
47
+ * [Передача](#Передача)
48
+ * [Вызов другого маршрута](#Вызов-другого-маршрута)
49
+ * [Задание тела, кода и заголовков ответа](#Задание-тела-кода-и-заголовков-ответа)
50
+ * [Стриминг ответов](#Стриминг-ответов)
51
+ * [Логирование](#Логирование)
52
+ * [Mime-типы](#mime-типы)
53
+ * [Генерирование URL](#Генерирование-url)
54
+ * [Перенаправление (редирект)](#Перенаправление-редирект)
55
+ * [Управление кэшированием](#Управление-кэшированием)
56
+ * [Отправка файлов](#Отправка-файлов)
57
+ * [Доступ к объекту запроса](#Доступ-к-объекту-запроса)
58
+ * [Вложения](#Вложения)
59
+ * [Работа со временем и датами](#Работа-со-временем-и-датами)
60
+ * [Поиск шаблонов](#Поиск-шаблонов)
61
+ * [Конфигурация](#Конфигурация)
62
+ * [Настройка защиты от атак](#Настройка-защиты-от-атак)
63
+ * [Доступные настройки](#Доступные-настройки)
64
+ * [Режим, окружение](#Режим-окружение)
65
+ * [Обработка ошибок](#Обработка-ошибок)
66
+ * [Not Found](#not-found)
67
+ * [Error](#error)
68
+ * [Rack "прослойки"](#rack-прослойки)
69
+ * [Тестирование](#Тестирование)
70
+ * [Sinatra::Base — "прослойки", библиотеки и модульные приложения](#sinatrabase--прослойки-библиотеки-и-модульные-приложения)
71
+ * [Модульные приложения против классических](#Модульные-приложения-против-классических)
72
+ * [Запуск модульных приложений](#Запуск-модульных-приложений)
73
+ * [Запуск классических приложений с config.ru](#Запуск-классических-приложений-с-configru)
74
+ * [Когда использовать config.ru?](#Когда-использовать-configru)
75
+ * [Использование Sinatra в качестве "прослойки"](#Использование-sinatra-в-качестве-прослойки)
76
+ * [Создание приложений "на лету"](#Создание-приложений-на-лету)
77
+ * [Области видимости и привязка](#Области-видимости-и-привязка)
78
+ * [Область видимости приложения / класса](#Область-видимости-приложения--класса)
79
+ * [Область видимости запроса / экземпляра](#Область-видимости-запроса--экземпляра)
80
+ * [Область видимости делегирования](#Область-видимости-делегирования)
81
+ * [Командная строка](#Командная-строка)
82
+ * [Multi-threading](#multi-threading)
83
+ * [Системные требования](#Системные-требования)
84
+ * [На острие](#На-острие)
85
+ * [С помощью Bundler](#С-помощью-bundler)
86
+ * [Версии](#Версии)
87
+ * [Дальнейшее чтение](#Дальнейшее-чтение)
88
+
3
89
  *Внимание: Этот документ является переводом английской версии и может быть
4
90
  устаревшим*
5
91
 
6
92
  Sinatra — это предметно-ориентированный каркас
7
- ([DSL](http://ru.wikipedia.org/wiki/Предметно-ориентированный_язык_программирования))
93
+ ([DSL](https://ru.wikipedia.org/wiki/Предметно-ориентированный_язык))
8
94
  для быстрого создания функциональных веб-приложений на Ruby с минимумом усилий:
9
95
 
10
96
  ```ruby
@@ -18,17 +104,17 @@ end
18
104
 
19
105
  Установите gem:
20
106
 
21
- ``` shell
107
+ ```shell
22
108
  gem install sinatra
23
109
  ```
24
110
 
25
111
  и запустите приложение с помощью:
26
112
 
27
- ``` shell
113
+ ```shell
28
114
  ruby myapp.rb
29
115
  ```
30
116
 
31
- Оцените результат: http://localhost:4567
117
+ Оцените результат: [http://localhost:4567](http://localhost:4567)
32
118
 
33
119
  Рекомендуется также установить Thin, сделать это можно командой: `gem install
34
120
  thin`. Thin — это более производительный и функциональный сервер для
@@ -121,7 +207,7 @@ end
121
207
  Регулярные выражения в качестве шаблонов маршрутов:
122
208
 
123
209
  ```ruby
124
- get /\A\/hello\/([\w]+)\z/ do
210
+ get /\/hello\/([\w]+)/ do
125
211
  "Hello, #{params['captures'].first}!"
126
212
  end
127
213
  ```
@@ -138,8 +224,8 @@ end
138
224
  Шаблоны маршрутов могут иметь необязательные параметры:
139
225
 
140
226
  ```ruby
141
- get '/posts.?:format?' do
142
- # соответствует "GET /posts", "GET /posts.json", "GET /posts.xml" и т.д.
227
+ get '/posts/:format?' do
228
+ # соответствует "GET /posts/", "GET /posts/json", "GET /posts/xml" и т.д.
143
229
  end
144
230
  ```
145
231
 
@@ -290,7 +376,7 @@ end
290
376
  Или с использованием негативного просмотра вперед:
291
377
 
292
378
  ```ruby
293
- get %r{^(?!/index$)} do
379
+ get %r{(?!/index)} do
294
380
  # ...
295
381
  end
296
382
  ```
@@ -508,7 +594,7 @@ get('/') { markdown :index }
508
594
  <table>
509
595
  <tr>
510
596
  <td>Зависимости</td>
511
- <td><a href="http://nokogiri.org/" title="nokogiri">nokogiri</a></td>
597
+ <td><a href="http://www.nokogiri.org/" title="nokogiri">nokogiri</a></td>
512
598
  </tr>
513
599
  <tr>
514
600
  <td>Расширения файлов</td>
@@ -561,7 +647,7 @@ get('/') { markdown :index }
561
647
  <table>
562
648
  <tr>
563
649
  <td>Зависимости</td>
564
- <td><a href="http://www.lesscss.org/" title="less">less</a></td>
650
+ <td><a href="http://lesscss.org/" title="less">less</a></td>
565
651
  </tr>
566
652
  <tr>
567
653
  <td>Расширения файлов</td>
@@ -578,7 +664,7 @@ get('/') { markdown :index }
578
664
  <table>
579
665
  <tr>
580
666
  <td>Зависимости</td>
581
- <td><a href="http://www.liquidmarkup.org/" title="liquid">liquid</a></td>
667
+ <td><a href="http://liquidmarkup.org/" title="liquid">liquid</a></td>
582
668
  </tr>
583
669
  <tr>
584
670
  <td>Расширения файлов</td>
@@ -600,7 +686,7 @@ get('/') { markdown :index }
600
686
  <td>Зависимости</td>
601
687
  <td>
602
688
  Любая из библиотек:
603
- <a href="https://github.com/rtomayko/rdiscount" title="RDiscount">RDiscount</a>,
689
+ <a href="https://github.com/davidfstr/rdiscount" title="RDiscount">RDiscount</a>,
604
690
  <a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
605
691
  <a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
606
692
  <a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a>,
@@ -756,7 +842,7 @@ erb :overview, :locals => { :text => rdoc(:introduction) }
756
842
  <table>
757
843
  <tr>
758
844
  <td>Зависимости</td>
759
- <td><a href="http://markaby.github.com/" title="Markaby">Markaby</a></td>
845
+ <td><a href="http://markaby.github.io/" title="Markaby">Markaby</a></td>
760
846
  </tr>
761
847
  <tr>
762
848
  <td>Расширения файлов</td>
@@ -908,7 +994,7 @@ erb :overview, :locals => { :text => mediawiki(:introduction) }
908
994
  <tr>
909
995
  <td>Зависимости</td>
910
996
  <td>
911
- <a href="https://github.com/lucasmazza/ruby-stylus" title="Ruby Stylus">
997
+ <a href="https://github.com/forgecrafted/ruby-stylus" title="Ruby Stylus">
912
998
  Stylus
913
999
  </a> и
914
1000
  <a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
@@ -929,7 +1015,7 @@ erb :overview, :locals => { :text => mediawiki(:introduction) }
929
1015
  Перед тем, как использовать шаблоны стилус, загрузите `stylus` и
930
1016
  `stylus/tilt`:
931
1017
 
932
- ``` ruby
1018
+ ```ruby
933
1019
  require 'sinatra'
934
1020
  require 'stylus'
935
1021
  require 'stylus/tilt'
@@ -1254,25 +1340,6 @@ get '/:value' do
1254
1340
  end
1255
1341
  ```
1256
1342
 
1257
- Заметьте, что при использовании `enable :sessions` все данные сохраняются в
1258
- куках (cookies). Это может быть не совсем то, что вы хотите (например,
1259
- сохранение больших объемов данных увеличит ваш трафик). В таком случае вы
1260
- можете использовать альтернативную Rack "прослойку" (middleware), реализующую
1261
- механизм сессий. Для этого *не надо* вызывать `enable :sessions`, вместо этого
1262
- следует подключить ее так же, как и любую другую "прослойку":
1263
-
1264
- ```ruby
1265
- use Rack::Session::Pool, :expire_after => 2592000
1266
-
1267
- get '/' do
1268
- "value = " << session['value'].inspect
1269
- end
1270
-
1271
- get '/:value' do
1272
- session['value'] = params['value']
1273
- end
1274
- ```
1275
-
1276
1343
  Для повышения безопасности данные сессии в куках подписываются секретным
1277
1344
  ключом. Секретный ключ генерируется Sinatra. Тем не менее, так как этот ключ
1278
1345
  будет меняться с каждым запуском приложения, вы, возможно, захотите установить
@@ -1293,10 +1360,44 @@ set :sessions, :domain => 'foo.com'
1293
1360
  Чтобы сделать сессию доступной другим приложениям, размещенным на поддоменах
1294
1361
  foo.com, добавьте *.* перед доменом:
1295
1362
 
1296
- ``` ruby
1363
+ ```ruby
1297
1364
  set :sessions, :domain => '.foo.com'
1298
1365
  ```
1299
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
+
1300
1401
  ### Прерывание
1301
1402
 
1302
1403
  Чтобы незамедлительно прервать обработку запроса внутри фильтра или маршрута,
@@ -1439,17 +1540,17 @@ end
1439
1540
  ```
1440
1541
 
1441
1542
  Что позволяет вам реализовать стриминговые API,
1442
- [Server Sent Events](http://dev.w3.org/html5/eventsource/),
1443
- и может служить основой для [WebSockets](http://en.wikipedia.org/wiki/WebSocket).
1543
+ [Server Sent Events](https://w3c.github.io/eventsource/),
1544
+ и может служить основой для [WebSockets](https://en.wikipedia.org/wiki/WebSocket).
1444
1545
  Также такой подход можно использовать для увеличения производительности в случае,
1445
1546
  когда какая-то часть контента зависит от медленного ресурса.
1446
1547
 
1447
1548
  Заметьте, что возможности стриминга, особенно количество одновременно
1448
1549
  обслуживаемых запросов, очень сильно зависят от используемого веб-сервера.
1449
- Некоторые серверы, например, WEBRick, могут и вовсе не поддерживать стриминг.
1450
- Если сервер не поддерживает стриминг, то все данные будут отправлены за один
1451
- раз сразу после того, как блок, переданный в `stream`, завершится. Стриминг
1452
- вообще не работает при использовании Shotgun.
1550
+ Некоторые серверы могут и вовсе не поддерживать стриминг. Если сервер не
1551
+ поддерживает стриминг, то все данные будут отправлены за один раз сразу после
1552
+ того, как блок, переданный в `stream`, завершится. Стриминг вообще не работает
1553
+ при использовании Shotgun.
1453
1554
 
1454
1555
  Если метод используется с параметром `keep_open`, то он не будет вызывать
1455
1556
  `close` у объекта потока, что позволит вам закрыть его позже в любом другом
@@ -1567,7 +1668,7 @@ end
1567
1668
 
1568
1669
  ```ruby
1569
1670
  redirect to('/bar'), 303
1570
- redirect 'http://google.com', 'wrong place, buddy'
1671
+ redirect 'http://www.google.com/', 'wrong place, buddy'
1571
1672
  ```
1572
1673
 
1573
1674
  Вы также можете перенаправить пользователя обратно, на страницу, с которой он
@@ -1651,7 +1752,7 @@ end
1651
1752
  ```
1652
1753
 
1653
1754
  Также вы можете использовать
1654
- [weak ETag](http://en.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation):
1755
+ [weak ETag](https://en.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation):
1655
1756
 
1656
1757
  ```ruby
1657
1758
  etag @article.sha1, :weak
@@ -1935,7 +2036,7 @@ configure do
1935
2036
  end
1936
2037
  ```
1937
2038
 
1938
- Будет запущено, когда окружение (RACK_ENV переменная) `:production`:
2039
+ Будет запущено, когда окружение (APP_ENV переменная) `:production`:
1939
2040
 
1940
2041
  ```ruby
1941
2042
  configure :production do
@@ -1968,7 +2069,7 @@ end
1968
2069
  ### Настройка защиты от атак
1969
2070
 
1970
2071
  Sinatra использует
1971
- [Rack::Protection](https://github.com/rkh/rack-protection#readme) для защиты
2072
+ [Rack::Protection](https://github.com/sinatra/rack-protection#readme) для защиты
1972
2073
  приложения от простых атак. Вы можете легко выключить эту защиту (что сделает
1973
2074
  ваше приложение чрезвычайно уязвимым):
1974
2075
 
@@ -2034,8 +2135,8 @@ set :protection, :except => [:path_traversal, :session_hijacking]
2034
2135
 
2035
2136
  <dt>environment</dt>
2036
2137
  <dd>
2037
- текущее окружение, по умолчанию, значение <tt>ENV['RACK_ENV']</tt> или
2038
- <tt>"development"</tt>, если <tt>ENV['RACK_ENV']</tt> недоступна.
2138
+ текущее окружение, по умолчанию, значение <tt>ENV['APP_ENV']</tt> или
2139
+ <tt>"development"</tt>, если <tt>ENV['APP_ENV']</tt> недоступна.
2039
2140
  </dd>
2040
2141
 
2041
2142
  <dt>logging</dt>
@@ -2162,7 +2263,7 @@ set :protection, :except => [:path_traversal, :session_hijacking]
2162
2263
  ## Режим, окружение
2163
2264
 
2164
2265
  Есть 3 предопределенных режима, окружения: `"development"`, `"production"` и
2165
- `"test"`. Режим может быть задан через переменную окружения `RACK_ENV`.
2266
+ `"test"`. Режим может быть задан через переменную окружения `APP_ENV`.
2166
2267
  Значение по умолчанию — `"development"`. В этом режиме работы все шаблоны
2167
2268
  перезагружаются между запросами. А также задаются специальные обработчики
2168
2269
  `not_found` и `error`, чтобы вы могли увидеть стек вызовов. В окружениях
@@ -2275,7 +2376,7 @@ end
2275
2376
  ```
2276
2377
 
2277
2378
  Семантика `use` идентична той, что определена для
2278
- [Rack::Builder](http://rubydoc.info/github/rack/rack/master/Rack/Builder) DSL
2379
+ [Rack::Builder](http://www.rubydoc.info/github/rack/rack/master/Rack/Builder) DSL
2279
2380
  (чаще всего используется в rackup файлах). Например, метод `use` принимает как
2280
2381
  множественные переменные, так и блоки:
2281
2382
 
@@ -2300,7 +2401,7 @@ Rack распространяется с различными стандартн
2300
2401
 
2301
2402
  Тесты для Sinatra приложений могут быть написаны с помощью библиотек,
2302
2403
  фреймворков, поддерживающих тестирование Rack.
2303
- [Rack::Test](http://rdoc.info/github/brynary/rack-test/master/frames)
2404
+ [Rack::Test](http://www.rubydoc.info/github/brynary/rack-test/master/frames)
2304
2405
  рекомендован:
2305
2406
 
2306
2407
  ```ruby
@@ -2325,7 +2426,7 @@ class MyAppTest < Minitest::Test
2325
2426
  assert_equal 'Hello Frank!', last_response.body
2326
2427
  end
2327
2428
 
2328
- def test_with_rack_env
2429
+ def test_with_user_agent
2329
2430
  get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
2330
2431
  assert_equal "You're using Songbird!", last_response.body
2331
2432
  end
@@ -2392,7 +2493,7 @@ end
2392
2493
  logging true false
2393
2494
  method_override true false
2394
2495
  inline_templates true false
2395
- static true false
2496
+ static true File.exist?(public_folder)
2396
2497
 
2397
2498
  ### Запуск модульных приложений
2398
2499
 
@@ -2594,7 +2695,7 @@ end
2594
2695
  * через объект, переданный блокам конфигурации (`configure { |c| ... }`);
2595
2696
  * `settings` внутри области видимости запроса.
2596
2697
 
2597
- ### Область видимости запроса/экземпляра
2698
+ ### Область видимости запроса / экземпляра
2598
2699
 
2599
2700
  Для каждого входящего запроса будет создан новый экземпляр вашего приложения,
2600
2701
  и все блоки обработчика будут запущены в этом контексте. В этой области
@@ -2665,6 +2766,40 @@ ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
2665
2766
  -x # включить мьютекс-блокировку (по умолчанию выключена)
2666
2767
  ```
2667
2768
 
2769
+ ### Multi-threading
2770
+
2771
+ _Данный раздел является перефразированным [ответом пользователя Konstantin][so-answer] на StackOverflow_
2772
+
2773
+ Sinatra не навязывает каких-либо моделей параллелизма, но для этих целей можно
2774
+ использовать любой Rack обработчик, например Thin, Puma или WEBrick. Сама
2775
+ по себе Sinatra потокобезопасна, поэтому нет никаких проблем в использовании
2776
+ поточной модели параллелизма в Rack обработчике. Это означает, что когда
2777
+ запускается сервер, вы должны указать правильный метод вызова для конкретного
2778
+ Rack обработчика. Пример ниже показывает, как можно запустить мультитредовый
2779
+ Thin сервер:
2780
+
2781
+ ```ruby
2782
+ # app.rb
2783
+
2784
+ require 'sinatra/base'
2785
+
2786
+ class App < Sinatra::Base
2787
+ get '/' do
2788
+ "Hello, World"
2789
+ end
2790
+ end
2791
+
2792
+ App.run!
2793
+ ```
2794
+
2795
+ Чтобы запустить сервер, вы должны выполнить следующую команду:
2796
+
2797
+ ```shell
2798
+ thin --threaded start
2799
+ ```
2800
+
2801
+ [so-answer]: http://stackoverflow.com/questions/6278817/is-sinatra-multi-threaded/6282999#6282999)
2802
+
2668
2803
  ## Системные требования
2669
2804
 
2670
2805
  Следующие версии Ruby официально поддерживаются:
@@ -2747,7 +2882,7 @@ gem install sinatra --pre
2747
2882
  ### С помощью Bundler
2748
2883
 
2749
2884
  Если вы хотите запускать свое приложение с последней версией Sinatra, то
2750
- рекомендуем использовать [Bundler](http://gembundler.com/).
2885
+ рекомендуем использовать [Bundler](http://bundler.io).
2751
2886
 
2752
2887
  Сначала установите Bundler, если у вас его еще нет:
2753
2888
 
@@ -2776,42 +2911,6 @@ Bundler автоматически скачает и добавит.
2776
2911
  bundle exec ruby myapp.rb
2777
2912
  ```
2778
2913
 
2779
- ### Вручную
2780
-
2781
- Создайте локальный клон репозитория и запускайте свое приложение с
2782
- `sinatra/lib` директорией в `$LOAD_PATH`:
2783
-
2784
- ```
2785
- cd myapp
2786
- git clone git://github.com/sinatra/sinatra.git
2787
- ruby -Isinatra/lib myapp.rb
2788
- ```
2789
-
2790
- Чтобы обновить исходники Sinatra:
2791
-
2792
- ```
2793
- cd myapp/sinatra
2794
- git pull
2795
- ```
2796
-
2797
- ### Установка глобально
2798
-
2799
- Вы можете самостоятельно собрать gem:
2800
-
2801
- ```
2802
- git clone git://github.com/sinatra/sinatra.git
2803
- cd sinatra
2804
- rake sinatra.gemspec
2805
- rake install
2806
- ```
2807
-
2808
- Если вы устанавливаете пакеты (gem) от пользователя root, то вашим последним
2809
- шагом должна быть команда
2810
-
2811
- ```
2812
- sudo rake install
2813
- ```
2814
-
2815
2914
  ## Версии
2816
2915
 
2817
2916
  Sinatra использует [Semantic Versioning](http://semver.org/), SemVer и
@@ -2823,13 +2922,15 @@ SemVerTag.
2823
2922
  документация, новости и ссылки на другие ресурсы.
2824
2923
  * [Участие в проекте](http://www.sinatrarb.com/contributing) — Обнаружили
2825
2924
  баг? Нужна помощь? Написали патч?
2826
- * [Слежение за проблемами/ошибками](http://github.com/sinatra/sinatra/issues)
2827
- * [Twitter](http://twitter.com/sinatra)
2925
+ * [Отслеживание проблем/ошибок](https://github.com/sinatra/sinatra/issues)
2926
+ * [Twitter](https://twitter.com/sinatra)
2828
2927
  * [Группы рассылки](http://groups.google.com/group/sinatrarb/topics)
2829
- * [#sinatra](irc://chat.freenode.net/#sinatra) на http://freenode.net
2928
+ * IRC: [#sinatra](irc://chat.freenode.net/#sinatra) на http://freenode.net
2929
+ * [Sinatra и Друзья](https://sinatrarb.slack.com) на Slack, а так же
2930
+ [ссылка](https://sinatra-slack.herokuapp.com/) для инвайта.
2830
2931
  * [Sinatra Book](https://github.com/sinatra/sinatra-book/) учебник и сборник рецептов
2831
2932
  * [Sinatra Recipes](http://recipes.sinatrarb.com/) сборник рецептов
2832
- * API документация к [последнему релизу](http://rubydoc.info/gems/sinatra)
2833
- или [текущему HEAD](http://rubydoc.info/github/sinatra/sinatra) на
2834
- http://rubydoc.info
2835
- * [Сервер непрерывной интеграции](http://travis-ci.org/sinatra/sinatra)
2933
+ * API документация к [последнему релизу](http://www.rubydoc.info/gems/sinatra)
2934
+ или [текущему HEAD](http://www.rubydoc.info/github/sinatra/sinatra) на
2935
+ http://www.rubydoc.info/
2936
+ * [Сервер непрерывной интеграции](https://travis-ci.org/sinatra/sinatra)