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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f1645efe5e7501a42837edc4140436b65e22136c
4
- data.tar.gz: d4c73c743fbe629f14eb90bf4c7d5a05dc92814c
3
+ metadata.gz: ab40363a01800a6eca6fbfd31a92a7bc82eb6324
4
+ data.tar.gz: 8eb57d7e6f169ce4a8671fb1211c65516ddb21ec
5
5
  SHA512:
6
- metadata.gz: 2afe7b808fdfadf39a82152a69ff6afd615d362d26a37f67940e8e952ba2356002c151d9d477153e431e054fb463ec4e04a1dcf30124dcf8510f21dbdf2399b2
7
- data.tar.gz: 69b62d40f43141f5874d8d0c41dd694717beadd9a8967275d354585362820f9f8824fd1a39a7f9f5035d708a5392cd0a734b4e4f764f48b83ab9df7befffdca2
6
+ metadata.gz: 058b79bc51a5b1e85a9343cfa5552a0f646ebd429721b89101b2b245c491dabe157c0719d82fc85f74193d094d61c62e9b91c0e401dd4dcef5c92292b021e5be
7
+ data.tar.gz: 05ff1ebc8d85c01b95b17347717e7d0a9da61f3205b36588b9d4228d3373c036549dd0e86c6961a37ce6a70c8bf3f7cb23fceb0d49b5c83cf445a2eb7d206e06
@@ -0,0 +1,77 @@
1
+ Sinatra was designed and developed by Blake Mizerany in California.
2
+
3
+ ### Current Team
4
+
5
+ * **Konstantin Haase** (maintainer)
6
+ * **Zachary Scott**
7
+ * **Katrina Owen**
8
+
9
+ ### Alumni
10
+
11
+ * **Blake Mizerany** (creator)
12
+ * **Ryan Tomayko**
13
+ * **Simon Rozet**
14
+
15
+ ### Thanks
16
+
17
+ Sinatra would not have been possible without strong company backing.
18
+ In the past, financial and emotional support have been provided mainly by
19
+ [Heroku](http://heroku.com), [GitHub](https://github.com) and
20
+ [Engine Yard](http://www.engineyard.com/), and is now taken care of by
21
+ [Travis CI](http://travis-ci.com/).
22
+
23
+ Special thanks to the following extraordinary individuals, without whom
24
+ Sinatra would not be possible:
25
+
26
+ * [Ryan Tomayko](http://tomayko.com/) (rtomayko) for constantly fixing
27
+ whitespace errors __60d5006__
28
+ * [Ezra Zygmuntowicz](http://brainspl.at/) (ezmobius) for initial help and
29
+ letting Blake steal some of merbs internal code.
30
+ * [Chris Schneider](http://gittr.com) (cschneid) for The Book, the blog,
31
+ [irclogger.com](http://irclogger.com/sinatra/), and a bunch of useful
32
+ patches.
33
+ * [Markus Prinz](http://nuclearsquid.com/) (cypher) for patches over the
34
+ years, caring about the README, and hanging in there when times were rough.
35
+ * [Erik Kastner](http://metaatem.net/) (kastner) for fixing `MIME_TYPES` under
36
+ Rack 0.5.
37
+ * [Ben Bleything](http://blog.bleything.net/) (bleything) for caring about HTTP
38
+ status codes and doc fixes.
39
+ * [Igal Koshevoy](http://twitter.com/igalko) (igal) for root path detection under
40
+ Thin/Passenger.
41
+ * [Jon Crosby](http://joncrosby.me/) (jcrosby) for coffee breaks, doc fixes, and
42
+ just because, man.
43
+ * [Karel Minarik](https://github.com/karmi) (karmi) for screaming until the
44
+ website came back up.
45
+ * [Jeremy Evans](http://code.jeremyevans.net/) (jeremyevans) for unbreaking
46
+ optional path params (twice!)
47
+ * [The GitHub guys](https://github.com/) for stealing Blake's table.
48
+ * [Nickolas Means](http://nmeans.org/) (nmeans) for Sass template support.
49
+ * [Victor Hugo Borja](https://github.com/vic) (vic) for splat'n routes specs and
50
+ doco.
51
+ * [Avdi Grimm](http://avdi.org/) (avdi) for basic RSpec support.
52
+ * [Jack Danger Canty](http://jåck.com/) for a more accurate root directory
53
+ and for making me watch [this](http://www.youtube.com/watch?v=ueaHLHgskkw) just
54
+ now.
55
+ * Mathew Walker for making escaped paths work with static files.
56
+ * Millions of Us for having the problem that led to Sinatra's conception.
57
+ * [Songbird](http://getsongbird.com/) for the problems that helped Sinatra's
58
+ future become realized.
59
+ * [Rick Olson](http://techno-weenie.net/) (technoweenie) for the killer plug
60
+ at RailsConf '08.
61
+ * Steven Garcia for the amazing custom artwork you see on 404's and 500's
62
+ * [Pat Nakajima](http://patnakajima.com/) (nakajima) for fixing non-nested
63
+ params in nested params Hash's.
64
+ * Gabriel Andretta for having people wonder whether our documentation is
65
+ actually in English or in Spanish.
66
+ * Vasily Polovnyov, Nickolay Schwarz, Luciano Sousa, Wu Jiang,
67
+ Mickael Riga, Bernhard Essl, Janos Hardi, Kouhei Yanagita and
68
+ "burningTyger" for willingly translating whatever ends up in the README.
69
+ * [Wordy](https://wordy.com/) for proofreading our README. **73e137d**
70
+ * cactus for digging through code and specs, multiple times.
71
+ * Nicolás Sanguinetti (foca) for strong demand of karma and shaping
72
+ helpers/register.
73
+
74
+ And last but not least:
75
+
76
+ * [Frank Sinatra](http://www.sinatra.com/) (chairman of the board) for having so much class he
77
+ deserves a web-framework named after him.
data/CHANGES CHANGED
@@ -1,3 +1,33 @@
1
+ = 1.4.6 / 2015-03-2x
2
+
3
+ * Improve tests and documentation. (Darío Hereñú, Seiichi Yonezawa, kyoendo,
4
+ John Voloski, Ferenc-, Renaud Martinet, Christian Haase, marocchino,
5
+ huoxito, Damir Svrtan, Amaury Medeiros, Jeremy Evans, Kashyap, shenqihui,
6
+ Ausmarton Fernandes, kami, Vipul A M, Lei Wu, 7stud, Taylor Shuler,
7
+ namusyaka, burningTyger, Cornelius Bock, detomastah, hakeda, John Hope,
8
+ Ruben Gonzalez, Andrey Deryabin, attilaolah, Anton Davydov, Nikita Penzin,
9
+ Dyego Costa)
10
+
11
+ * Remove duplicate require of sinatra/base. (Alexey Muranov)
12
+
13
+ * Escape HTML in 404 error page. (Andy Brody)
14
+
15
+ * Refactor to method call in `Stream#close` and `#callback`. (Damir Svrtan)
16
+
17
+ * Depend on latest version of Slim. (Damir Svrtan)
18
+
19
+ * Fix compatibility with Tilt version 2. (Yegor Timoschenko)
20
+
21
+ * Fix compatibility issue with Rack `pretty` method from ShowExceptions.
22
+ (Kashyap)
23
+
24
+ * Show date in local time in exception messages. (tayler1)
25
+
26
+ * Fix logo on error pages when using Ruby 1.8. (Jeremy Evans)
27
+
28
+ * Upgrade test suite to Minitest version 5 and fix Ruby 2.2 compatibility.
29
+ (Vipul A M)
30
+
1
31
  = 1.4.5 / 2014-04-08
2
32
 
3
33
  * Improve tests and documentation. (Seiichi Yonezawa, Mike Gehard, Andrew
data/Gemfile CHANGED
@@ -11,18 +11,18 @@ source 'https://rubygems.org' unless ENV['QUICK']
11
11
  gemspec
12
12
 
13
13
  gem 'rake'
14
- gem 'rack-test', '>= 0.5.6'
14
+ gem 'rack-test', '>= 0.6.2'
15
+ gem "minitest", "~> 5.0"
15
16
 
16
17
  # Allows stuff like `tilt=1.2.2 bundle install` or `tilt=master ...`.
17
18
  # Used by the CI.
18
- github = "git://github.com/%s.git"
19
- repos = {'tilt' => github % "rtomayko/tilt", 'rack' => github % "rack/rack"}
19
+ repos = {'tilt' => "rtomayko/tilt", 'rack' => "rack/rack"}
20
20
 
21
21
  %w[tilt rack].each do |lib|
22
22
  dep = case ENV[lib]
23
23
  when 'stable', nil then nil
24
24
  when /(\d+\.)+\d+/ then "~> " + ENV[lib].sub("#{lib}-", '')
25
- else {:git => repos[lib], :branch => dep}
25
+ else {:github => repos[lib], :branch => dep}
26
26
  end
27
27
  gem lib, dep
28
28
  end
@@ -46,7 +46,7 @@ if RUBY_ENGINE == "ruby" and RUBY_VERSION > '1.9.2'
46
46
  gem 'yajl-ruby'
47
47
  gem 'nokogiri'
48
48
  gem 'thin'
49
- gem 'slim', '~> 1.0'
49
+ gem 'slim', '~> 2.0'
50
50
  gem 'coffee-script', '>= 2.0'
51
51
  gem 'rdoc'
52
52
  gem 'kramdown'
@@ -1,7 +1,7 @@
1
1
  # Sinatra
2
2
 
3
3
  *Wichtig: Dieses Dokument ist eine Übersetzung aus dem Englischen und unter
4
- Umständen nicht auf dem aktuellen Stand (aktuell Sinatra 1.4.2).*
4
+ Umständen nicht auf dem aktuellen Stand (aktuell Sinatra 1.4.5).*
5
5
 
6
6
  Sinatra ist eine
7
7
  [DSL](http://de.wikipedia.org/wiki/Domänenspezifische_Sprache), die das
@@ -54,11 +54,13 @@ aufgerufen werden.
54
54
  * [Markdown Templates](#markdown-templates)
55
55
  * [Textile Templates](#textile-templates)
56
56
  * [RDoc Templates](#rdoc-templates)
57
+ * [AsciiDoc Templates](#asciidoc-templates)
57
58
  * [Radius Templates](#radius-templates)
58
59
  * [Markaby Templates](#markaby-templates)
59
60
  * [RABL Templates](#rabl-templates)
60
61
  * [Slim Templates](#slim-templates)
61
62
  * [Creole Templates](#creole-templates)
63
+ * [MediaWiki Templates](#mediawiki-templates)
62
64
  * [CoffeeScript Templates](#coffeescript-templates)
63
65
  * [Stylus Templates](#stylus-templates)
64
66
  * [Yajl Templates](#yajl-templates)
@@ -69,6 +71,7 @@ aufgerufen werden.
69
71
  * [Benannte Templates](#benannte-templates)
70
72
  * [Dateiendungen zuordnen](#dateiendungen-zuordnen)
71
73
  * [Eine eigene Template-Engine hinzufügen](#eine-eigene-template-engine-hinzufgen)
74
+ * [Eigene Methoden zum Aufsuchen von Templates verwenden](#eigene-methoden-zum-aufsuchen-von-templates-verwenden)
72
75
  * [Filter](#filter)
73
76
  * [Helfer](#helfer)
74
77
  * [Sessions verwenden](#sessions-verwenden)
@@ -160,8 +163,8 @@ Die Muster der Routen können benannte Parameter beinhalten, die über den
160
163
  ```ruby
161
164
  get '/hallo/:name' do
162
165
  # passt auf "GET /hallo/foo" und "GET /hallo/bar"
163
- # params[:name] ist dann 'foo' oder 'bar'
164
- "Hallo #{params[:name]}!"
166
+ # params['name'] ist dann 'foo' oder 'bar'
167
+ "Hallo #{params['name']}!"
165
168
  end
166
169
  ```
167
170
 
@@ -169,23 +172,23 @@ Man kann auf diese auch mit Block-Parametern zugreifen:
169
172
 
170
173
  ```ruby
171
174
  get '/hallo/:name' do |n|
172
- # n entspricht hier params[:name]
175
+ # n entspricht hier params['name']
173
176
  "Hallo #{n}!"
174
177
  end
175
178
  ```
176
179
 
177
180
  Routen-Muster können auch mit sog. Splat- oder Wildcard-Parametern über das
178
- `params[:splat]`-Array angesprochen werden:
181
+ `params['splat']`-Array angesprochen werden:
179
182
 
180
183
  ```ruby
181
184
  get '/sag/*/zu/*' do
182
185
  # passt z.B. auf /sag/hallo/zu/welt
183
- params[:splat] # => ["hallo", "welt"]
186
+ params['splat'] # => ["hallo", "welt"]
184
187
  end
185
188
 
186
189
  get '/download/*.*' do
187
190
  # passt auf /download/pfad/zu/datei.xml
188
- params[:splat] # => ["pfad/zu/datei", "xml"]
191
+ params['splat'] # => ["pfad/zu/datei", "xml"]
189
192
  end
190
193
  ```
191
194
 
@@ -200,8 +203,8 @@ end
200
203
  Routen mit regulären Ausdrücken sind auch möglich:
201
204
 
202
205
  ```ruby
203
- get %r{/hallo/([\w]+)} do
204
- "Hallo, #{params[:captures].first}!"
206
+ get /\A\/hallo\/([\w]+)\z/ do
207
+ "Hallo, #{params['captures'].first}!"
205
208
  end
206
209
  ```
207
210
 
@@ -222,6 +225,17 @@ get '/posts.?:format?' do
222
225
  end
223
226
  ```
224
227
 
228
+ Routen können auch den query-Parameter verwenden:
229
+
230
+ ``` ruby
231
+ get '/posts' do
232
+ # matches "GET /posts?title=foo&author=bar"
233
+ title = params['title']
234
+ author = params['author']
235
+ # uses title and author variables; query is optional to the /posts route
236
+ end
237
+ ```
238
+
225
239
  Anmerkung: Solange man den sog. Path Traversal Attack-Schutz nicht deaktiviert
226
240
  (siehe weiter unten), kann es sein, dass der Request-Pfad noch vor dem
227
241
  Abgleich mit den Routen modifiziert wird.
@@ -234,7 +248,7 @@ Einschränkung des User-Agents über die interne Bedingung `:agent`:
234
248
 
235
249
  ```ruby
236
250
  get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
237
- "Du verwendest Songbird Version #{params[:agent][0]}"
251
+ "Du verwendest Songbird Version #{params['agent'][0]}"
238
252
  end
239
253
  ```
240
254
 
@@ -261,6 +275,7 @@ get '/', :provides => ['rss', 'atom', 'xml'] do
261
275
  builder :feed
262
276
  end
263
277
  ```
278
+ `provides` durchsucht den Accept-Header der Anfrage
264
279
 
265
280
  Eigene Bedingungen können relativ einfach hinzugefügt werden:
266
281
 
@@ -573,7 +588,7 @@ get('/') { markdown :index }
573
588
  <table>
574
589
  <tr>
575
590
  <td>Abhängigkeit</td>
576
- <td><a href="http://builder.rubyforge.org/">builder</a></td>
591
+ <td><a href="https://github.com/jimweirich/builder">builder</a></td>
577
592
  </tr>
578
593
  <tr>
579
594
  <td>Dateierweiterung</td>
@@ -690,8 +705,8 @@ denen man Variablen weitergibt.
690
705
  <a href="https://github.com/rtomayko/rdiscount" title="RDiscount">RDiscount</a>,
691
706
  <a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
692
707
  <a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
693
- <a href="http://kramdown.rubyforge.org/" title="kramdown">kramdown</a> oder
694
- <a href="http://maruku.rubyforge.org/" title="maruku">maruku</a>
708
+ <a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a> oder
709
+ <a href="https://github.com/bhollis/maruku" title="maruku">maruku</a>
695
710
  </td>
696
711
  </tr>
697
712
  <tr>
@@ -768,7 +783,7 @@ Templates zu verwenden und einen anderen für das Layout, indem die
768
783
  <table>
769
784
  <tr>
770
785
  <td>Abhängigkeit</td>
771
- <td><a href="http://rdoc.rubyforge.org/">rdoc</a></td>
786
+ <td><a href="http://rdoc.sourceforge.net/">rdoc</a></td>
772
787
  </tr>
773
788
  <tr>
774
789
  <td>Dateierweiterung</td>
@@ -801,12 +816,33 @@ RDoc geschrieben werden. Es ist aber möglich, einen Renderer für die Templates
801
816
  zu verwenden und einen anderen für das Layout, indem die
802
817
  `:layout_engine`-Option verwendet wird.
803
818
 
819
+ #### AsciiDoc Templates
820
+
821
+ <table>
822
+ <tr>
823
+ <td>Abhängigkeit</td>
824
+ <td><a href="http://asciidoctor.org/" title="Asciidoctor">Asciidoctor</a></td>
825
+ </tr>
826
+ <tr>
827
+ <td>Dateierweiterungen</td>
828
+ <td><tt>.asciidoc</tt>, <tt>.adoc</tt> und <tt>.ad</tt></td>
829
+ </tr>
830
+ <tr>
831
+ <td>Beispiel</td>
832
+ <td><tt>asciidoc :README, :layout_engine => :erb</tt></td>
833
+ </tr>
834
+ </table>
835
+
836
+ Da man aus dem AsciiDoc-Template heraus keine Ruby-Methoden aufrufen kann
837
+ (ausgenommen `yield`), wird man üblicherweise locals verwenden wollen, mit
838
+ denen man Variablen weitergibt.
839
+
804
840
  #### Radius Templates
805
841
 
806
842
  <table>
807
843
  <tr>
808
844
  <td>Abhängigkeit</td>
809
- <td><a href="http://radius.rubyforge.org/">radius</a></td>
845
+ <td><a href="https://github.com/jlong/radius">radius</a></td>
810
846
  </tr>
811
847
  <tr>
812
848
  <td>Dateierweiterung</td>
@@ -912,6 +948,44 @@ Creole geschrieben werden. Es ist aber möglich, einen Renderer für die Templat
912
948
  zu verwenden und einen anderen für das Layout, indem die `:layout_engine`-Option
913
949
  verwendet wird.
914
950
 
951
+ #### MediaWiki Templates
952
+
953
+ <table>
954
+ <tr>
955
+ <td>Abhängigkeit</td>
956
+ <td><a href="https://github.com/nricciar/wikicloth" title="WikiCloth">WikiCloth</a></td>
957
+ </tr>
958
+ <tr>
959
+ <td>Dateierweiterungen</td>
960
+ <td><tt>.mediawiki</tt> und <tt>.mw</tt></td>
961
+ </tr>
962
+ <tr>
963
+ <td>Beispiel</td>
964
+ <td><tt>mediawiki :wiki, :layout_engine => :erb</tt></td>
965
+ </tr>
966
+ </table>
967
+
968
+ Da man aus dem Mediawiki-Template heraus keine Ruby-Methoden aufrufen und auch
969
+ keine locals verwenden kann, wird man Mediawiki üblicherweise in Kombination mit
970
+ anderen Renderern verwenden wollen:
971
+
972
+ ``` ruby
973
+ erb :overview, :locals => { :text => mediawiki(:introduction) }
974
+ ```
975
+
976
+ Beachte: Man kann die `mediawiki`-Methode auch aus anderen Templates
977
+ heraus aufrufen:
978
+
979
+ ``` ruby
980
+ %h1 Grüße von Haml!
981
+ %p= mediawiki(:greetings)
982
+ ```
983
+
984
+ Da man Ruby nicht von MediaWiki heraus aufrufen kann, können auch Layouts nicht
985
+ in MediaWiki geschrieben werden. Es ist aber möglich, einen Renderer für die
986
+ Templates zu verwenden und einen anderen für das Layout, indem die
987
+ `:layout_engine`-Option verwendet wird.
988
+
915
989
  #### CoffeeScript Templates
916
990
 
917
991
  <table>
@@ -1002,8 +1076,9 @@ json[:baz] = key
1002
1076
  Die `:callback` und `:variable` Optionen können mit dem gerenderten Objekt
1003
1077
  verwendet werden:
1004
1078
 
1005
- ``` ruby
1006
- var resource = {"foo":"bar","baz":"qux"}; present(resource);
1079
+ ``` javascript
1080
+ var resource = {"foo":"bar","baz":"qux"};
1081
+ present(resource);
1007
1082
  ```
1008
1083
 
1009
1084
  #### WLang Templates
@@ -1023,9 +1098,9 @@ var resource = {"foo":"bar","baz":"qux"}; present(resource);
1023
1098
  </tr>
1024
1099
  </table>
1025
1100
 
1026
- Ruby-Methoden in wlang aufzurufen entspricht nicht den idiomatischen Vorgaben
1027
- von wlang, es bietet sich deshalb an, `:locals` zu verwenden. Layouts, die
1028
- wlang und `yield` verwenden, werden aber trotzdem unterstützt.
1101
+ Ruby-Methoden in Wlang aufzurufen entspricht nicht den idiomatischen Vorgaben
1102
+ von Wlang, es bietet sich deshalb an, `:locals` zu verwenden. Layouts, die
1103
+ Wlang und `yield` verwenden, werden aber trotzdem unterstützt.
1029
1104
 
1030
1105
  Rendert den eingebetteten Template-String.
1031
1106
 
@@ -1036,7 +1111,7 @@ in Routen sind auch direkt im Template verfügbar:
1036
1111
 
1037
1112
  ```ruby
1038
1113
  get '/:id' do
1039
- @foo = Foo.find(params[:id])
1114
+ @foo = Foo.find(params['id'])
1040
1115
  haml '%h1= @foo.name'
1041
1116
  end
1042
1117
  ```
@@ -1045,7 +1120,7 @@ Oder durch einen expliziten Hash von lokalen Variablen:
1045
1120
 
1046
1121
  ```ruby
1047
1122
  get '/:id' do
1048
- foo = Foo.find(params[:id])
1123
+ foo = Foo.find(params['id'])
1049
1124
  haml '%h1= bar.name', :locals => { :bar => foo }
1050
1125
  end
1051
1126
  ```
@@ -1177,6 +1252,23 @@ Dieser Code rendert `./views/application.mtt`. Siehe
1177
1252
  [github.com/rtomayko/tilt](https://github.com/rtomayko/tilt), um mehr über
1178
1253
  Tilt zu erfahren.
1179
1254
 
1255
+ ### Eigene Methoden zum Aufsuchen von Templates verwenden
1256
+
1257
+ Um einen eigenen Mechanismus zum Aufsuchen von Templates zu
1258
+ implementieren, muss `#find_template` definiert werden:
1259
+
1260
+ ``` ruby
1261
+ configure do
1262
+ set :views [ './views/a', './views/b' ]
1263
+ end
1264
+
1265
+ def find_template(views, name, engine, &block)
1266
+ Array(views).each do |v|
1267
+ super(v, name, engine, &block)
1268
+ end
1269
+ end
1270
+ ```
1271
+
1180
1272
  ## Filter
1181
1273
 
1182
1274
  Before-Filter werden vor jedem Request in demselben Kontext, wie danach die
@@ -1192,7 +1284,7 @@ end
1192
1284
 
1193
1285
  get '/foo/*' do
1194
1286
  @note #=> 'Hi!'
1195
- params[:splat] #=> 'bar/baz'
1287
+ params['splat'] #=> 'bar/baz'
1196
1288
  end
1197
1289
  ```
1198
1290
 
@@ -1245,7 +1337,7 @@ helpers do
1245
1337
  end
1246
1338
 
1247
1339
  get '/:name' do
1248
- bar(params[:name])
1340
+ bar(params['name'])
1249
1341
  end
1250
1342
  ```
1251
1343
 
@@ -1261,7 +1353,7 @@ get '/' do
1261
1353
  end
1262
1354
 
1263
1355
  get '/:value' do
1264
- session[:value] = params[:value]
1356
+ session[:value] = params['value']
1265
1357
  end
1266
1358
  ```
1267
1359
 
@@ -1279,7 +1371,7 @@ get '/' do
1279
1371
  end
1280
1372
 
1281
1373
  get '/:value' do
1282
- session[:value] = params[:value]
1374
+ session[:value] = params['value']
1283
1375
  end
1284
1376
  ```
1285
1377
 
@@ -1300,6 +1392,13 @@ Einstellungen ablegen.
1300
1392
  set :sessions, :domain => 'foo.com'
1301
1393
  ```
1302
1394
 
1395
+ Um eine Session mit anderen Apps und zwischen verschiedenen Subdomains
1396
+ von foo.com zu teilen, wird ein *.* der Domain vorangestellt:
1397
+
1398
+ ``` ruby
1399
+ set :sessions, :domain => '.foo,com'
1400
+ ```
1401
+
1303
1402
  ### Anhalten
1304
1403
 
1305
1404
  Zum sofortigen Stoppen eines Request in einem Filter oder einer Route:
@@ -1344,7 +1443,7 @@ Eine Route kann mittels `pass` zu der nächsten passenden Route springen:
1344
1443
 
1345
1444
  ```ruby
1346
1445
  get '/raten/:wer' do
1347
- pass unless params[:wer] == 'Frank'
1446
+ pass unless params['wer'] == 'Frank'
1348
1447
  'Du hast mich!'
1349
1448
  end
1350
1449
 
@@ -1467,20 +1566,18 @@ connections = []
1467
1566
 
1468
1567
  get '/subscribe' do
1469
1568
  # Client-Registrierung beim Server, damit Events mitgeteilt werden können
1470
- stream(:keep_open) { |out| connections << out }
1471
-
1472
- # tote Verbindungen entfernen
1473
- connections.reject!(&:closed?)
1474
-
1475
- # Rückmeldung
1476
- "Angemeldet"
1569
+ stream(:keep_open) do |out|
1570
+ connections << out
1571
+ # tote Verbindungen entfernen
1572
+ connections.reject!(&:closed?)
1573
+ end
1477
1574
  end
1478
1575
 
1479
- post '/message' do
1576
+ post '/:message' do
1480
1577
  connections.each do |out|
1481
1578
  # Den Client über eine neue Nachricht in Kenntnis setzen
1482
1579
  # notify client that a new message has arrived
1483
- out << params[:message] << "\n"
1580
+ out << params['message'] << "\n"
1484
1581
 
1485
1582
  # Den Client zur erneuten Verbindung auffordern
1486
1583
  out.close
@@ -1651,7 +1748,7 @@ eine aktuelle Version im Cache vorhält:
1651
1748
 
1652
1749
  ```ruby
1653
1750
  get '/article/:id' do
1654
- @article = Article.find params[:id]
1751
+ @article = Article.find params['id']
1655
1752
  last_modified @article.updated_at
1656
1753
  etag @article.sha1
1657
1754
  erb :article
@@ -1711,7 +1808,8 @@ etag '', :new_resource => true, :kind => :weak
1711
1808
 
1712
1809
  ### Dateien versenden
1713
1810
 
1714
- Zum Versenden von Dateien kann die `send_file`-Helfer-Methode verwendet werden:
1811
+ Um den Inhalt einer Datei als Response zurückzugeben, kann die
1812
+ `send_file`-Helfer-Methode verwendet werden:
1715
1813
 
1716
1814
  ```ruby
1717
1815
  get '/' do
@@ -2010,10 +2108,10 @@ set :protection, :except => [:path_traversal, :session_hijacking]
2010
2108
  wird, es sei denn, es wird als zweiter Parameter <tt>false</tt> angegeben.
2011
2109
  Standardmäßig nicht aktiviert.</dd>
2012
2110
 
2013
- <dt>add_charsets</dt>
2111
+ <dt>add_charset</dt>
2014
2112
  <dd>Mime-Types werden hier automatisch der Helfer-Methode
2015
2113
  <tt>content_type</tt> zugeordnet. Es empfielt sich, Werte hinzuzufügen statt
2016
- sie zu überschreiben: <tt>settings.add_charsets << "application/foobar"</tt>
2114
+ sie zu überschreiben: <tt>settings.add_charset << "application/foobar"</tt>
2017
2115
  </dd>
2018
2116
 
2019
2117
  <dt>app_file</dt>
@@ -2125,6 +2223,9 @@ set :protection, :except => [:path_traversal, :session_hijacking]
2125
2223
  <dd>Wird es auf <tt>true</tt> gesetzt, wird Thin aufgefordert
2126
2224
  <tt>EventMachine.defer</tt> zur Verarbeitung des Requests einzusetzen.</dd>
2127
2225
 
2226
+ <dt>traps</dt>
2227
+ <dd>Einstellung, Sinatra System signalen umgehen soll.</dd>
2228
+
2128
2229
  <dt>views</dt>
2129
2230
  <dd>Verzeichnis der Views. Leitet sich von der <tt>app_file</tt> Einstellung
2130
2231
  ab, wenn nicht gesetzt.</dd>
@@ -2172,12 +2273,19 @@ end
2172
2273
  ### Fehler
2173
2274
 
2174
2275
  Der `error`-Handler wird immer ausgeführt, wenn eine Exception in einem
2175
- Routen-Block oder in einem Filter geworfen wurde. Die Exception kann über die
2176
- `sinatra.error`-Rack-Variable angesprochen werden:
2276
+ Routen-Block oder in einem Filter geworfen wurde. In der
2277
+ `development`-Umgebung wird es nur dann funktionieren, wenn die
2278
+ `:show_exceptions`-Option auf `:after_handler` eingestellt wurde:
2279
+
2280
+ ```ruby
2281
+ set :show_exceptions, :after_handler
2282
+ ```
2283
+
2284
+ Die Exception kann über die `sinatra.error`-Rack-Variable angesprochen werden:
2177
2285
 
2178
2286
  ```ruby
2179
2287
  error do
2180
- 'Entschuldige, es gab einen hässlichen Fehler - ' + env['sinatra.error'].name
2288
+ 'Entschuldige, es gab einen hässlichen Fehler - ' + env['sinatra.error'].message
2181
2289
  end
2182
2290
  ```
2183
2291
 
@@ -2229,7 +2337,7 @@ anzuzeigen.
2229
2337
 
2230
2338
  ## Rack-Middleware
2231
2339
 
2232
- Sinatra baut auf [Rack](http://rack.rubyforge.org/), einem minimalistischen
2340
+ Sinatra baut auf [Rack](http://rack.github.io/), einem minimalistischen
2233
2341
  Standard-Interface für Ruby-Webframeworks. Eines der interessantesten Features
2234
2342
  für Entwickler ist der Support von Middlewares, die zwischen den Server und
2235
2343
  die Anwendung geschaltet werden und so HTTP-Request und/oder Antwort
@@ -2251,7 +2359,7 @@ end
2251
2359
  ```
2252
2360
 
2253
2361
  Die Semantik von `use` entspricht der gleichnamigen Methode der
2254
- [Rack::Builder](http://rack.rubyforge.org/doc/classes/Rack/Builder.html)-DSL
2362
+ [Rack::Builder](http://rubydoc.info/github/rack/rack/master/Rack/Builder)-DSL
2255
2363
  (meist verwendet in Rackup-Dateien). Ein Beispiel dafür ist, dass die
2256
2364
  `use`-Methode mehrere/verschiedene Argumente und auch Blöcke entgegennimmt:
2257
2365
 
@@ -2268,7 +2376,7 @@ muss `use` häufig nicht explizit verwendet werden.
2268
2376
 
2269
2377
  Hilfreiche Middleware gibt es z.B. hier:
2270
2378
  [rack](https://github.com/rack/rack/tree/master/lib/rack),
2271
- [rack-contrib](https://github.com/rack/rack-contrib#readme),
2379
+ [rack-contrib](https://github.com/rack/rack-contrib#readme),
2272
2380
  oder im [Rack wiki](https://github.com/rack/rack/wiki/List-of-Middleware).
2273
2381
 
2274
2382
  ## Testen
@@ -2279,10 +2387,10 @@ wird empfohlen:
2279
2387
 
2280
2388
  ```ruby
2281
2389
  require 'my_sinatra_app'
2282
- require 'test/unit'
2390
+ require 'minitest/autorun'
2283
2391
  require 'rack/test'
2284
2392
 
2285
- class MyAppTest < Test::Unit::TestCase
2393
+ class MyAppTest < Minitest::Test
2286
2394
  include Rack::Test::Methods
2287
2395
 
2288
2396
  def app
@@ -2353,12 +2461,24 @@ Veränderungen zu `Sinatra::Base` konvertiert werden:
2353
2461
  * Alle Routen, Error-Handler, Filter und Optionen der Applikation müssen in
2354
2462
  einer Subklasse von `Sinatra::Base` definiert werden.
2355
2463
 
2356
-
2357
2464
  `Sinatra::Base` ist ein unbeschriebenes Blatt. Die meisten Optionen sind per
2358
2465
  Standard deaktiviert. Das betrifft auch den eingebauten Server. Siehe
2359
2466
  [Optionen und Konfiguration](http://sinatra.github.com/configuration.html) für
2360
2467
  Details über mögliche Optionen.
2361
2468
 
2469
+ Damit eine App sich ähnlich wie eine klassische App verhält, kann man
2470
+ auch eine Subclass von `Sinatra::Application` erstellen:
2471
+
2472
+ ``` ruby
2473
+ require 'sinatra/base'
2474
+
2475
+ class MyApp < Sinatra::Application
2476
+ get '/' do
2477
+ 'Hello world!'
2478
+ end
2479
+ end
2480
+ ```
2481
+
2362
2482
  ### Modularer vs. klassischer Stil
2363
2483
 
2364
2484
  Entgegen häufiger Meinungen gibt es nichts gegen den klassischen Stil
@@ -2379,42 +2499,49 @@ werden:
2379
2499
  <th>Szenario</th>
2380
2500
  <th>Classic</th>
2381
2501
  <th>Modular</th>
2502
+ <th>Modular</th>
2382
2503
  </tr>
2383
2504
 
2384
2505
  <tr>
2385
2506
  <td>app_file</td>
2386
2507
  <td>Sinatra ladende Datei</td>
2387
2508
  <td>Sinatra::Base subklassierende Datei</td>
2509
+ <td>Sinatra::Application subklassierende Datei</td>
2388
2510
  </tr>
2389
2511
 
2390
2512
  <tr>
2391
2513
  <td>run</td>
2392
2514
  <td>$0 == app_file</td>
2393
2515
  <td>false</td>
2516
+ <td>false</td>
2394
2517
  </tr>
2395
2518
 
2396
2519
  <tr>
2397
2520
  <td>logging</td>
2398
2521
  <td>true</td>
2399
2522
  <td>false</td>
2523
+ <td>true</td>
2400
2524
  </tr>
2401
2525
 
2402
2526
  <tr>
2403
2527
  <td>method_override</td>
2404
2528
  <td>true</td>
2405
2529
  <td>false</td>
2530
+ <td>true</td>
2406
2531
  </tr>
2407
2532
 
2408
2533
  <tr>
2409
2534
  <td>inline_templates</td>
2410
2535
  <td>true</td>
2411
2536
  <td>false</td>
2537
+ <td>true</td>
2412
2538
  </tr>
2413
2539
 
2414
2540
  <tr>
2415
2541
  <td>static</td>
2416
2542
  <td>true</td>
2417
2543
  <td>false</td>
2544
+ <td>true</td>
2418
2545
  </tr>
2419
2546
  </table>
2420
2547
 
@@ -2507,8 +2634,8 @@ class LoginScreen < Sinatra::Base
2507
2634
  get('/login') { haml :login }
2508
2635
 
2509
2636
  post('/login') do
2510
- if params[:name] == 'admin' && params[:password] == 'admin'
2511
- session['user_name'] = params[:name]
2637
+ if params['name'] == 'admin' && params['password'] == 'admin'
2638
+ session['user_name'] = params['name']
2512
2639
  else
2513
2640
  redirect '/login'
2514
2641
  end
@@ -2636,8 +2763,8 @@ class MyApp < Sinatra::Base
2636
2763
  # Anfrage-Scope für '/neue_route/:name'
2637
2764
  @value = 42
2638
2765
 
2639
- settings.get "/#{params[:name]}" do
2640
- # Anfrage-Scope für "/#{params[:name]}"
2766
+ settings.get "/#{params['name']}" do
2767
+ # Anfrage-Scope für "/#{params['name']}"
2641
2768
  @value # => nil (nicht dieselbe Anfrage)
2642
2769
  end
2643
2770
 
@@ -2714,6 +2841,9 @@ auftreten.</dd>
2714
2841
  Upgrade von einer früheren Version von Ruby zu Ruby 1.9.3 werden alle Sessions
2715
2842
  ungültig. Ruby 1.9.3 wird bis Sinatra 2.0 unterstützt werden.</dd>
2716
2843
 
2844
+ <dt>Ruby 2.x</dt>
2845
+ <dd>2.x wird vollständig unterstützt.</dd>
2846
+
2717
2847
  <dt>Rubinius</dt>
2718
2848
  <dd>Rubinius (Version >= 2.x) wird offiziell unterstützt. Es wird empfohlen, den
2719
2849
  <a href="http://puma.io">Puma Server</a> zu installieren (<tt>gem install puma
@@ -2738,8 +2868,8 @@ wir davon ausgehen, dass es nicht an Sinatra sondern an der jeweiligen
2738
2868
  Implementierung liegt.
2739
2869
 
2740
2870
  Im Rahmen unserer CI (Kontinuierlichen Integration) wird bereits ruby-head
2741
- (das kommende Ruby 2.1.0) mit eingebunden. Es kann davon ausgegangen
2742
- werden, dass Sinatra Ruby 2.1.0 vollständig unterstützen wird.
2871
+ (zukünftige Versionen von MRI) mit eingebunden. Es kann davon ausgegangen
2872
+ werden, dass Sinatra MRI auch weiterhin vollständig unterstützen wird.
2743
2873
 
2744
2874
  Sinatra sollte auf jedem Betriebssystem laufen, dass einen funktionierenden
2745
2875
  Ruby-Interpreter aufweist.
@@ -2855,7 +2985,7 @@ SemVer und SemVerTag.
2855
2985
  * [Mailing-Liste](http://groups.google.com/group/sinatrarb)
2856
2986
  * [#sinatra](irc://chat.freenode.net/#sinatra) auf http://freenode.net Es
2857
2987
  gibt dort auch immer wieder deutschsprachige Entwickler, die gerne weiterhelfen.
2858
- * [Sinatra Book](http://sinatra-book.gittr.com) Kochbuch Tutorial
2988
+ * [Sinatra Book](https://github.com/sinatra/sinatra-book/) Kochbuch Tutorial
2859
2989
  * [Sinatra Recipes](http://recipes.sinatrarb.com/) Sinatra-Rezepte aus der
2860
2990
  Community
2861
2991
  * API Dokumentation für die [aktuelle