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.
- checksums.yaml +4 -4
- data/AUTHORS.md +77 -0
- data/CHANGES +30 -0
- data/Gemfile +5 -5
- data/README.de.md +186 -56
- data/README.es.md +76 -76
- data/README.fr.md +120 -56
- data/README.hu.md +19 -19
- data/README.ja.md +44 -46
- data/README.ko.md +163 -67
- data/README.md +151 -127
- data/README.pt-br.md +905 -144
- data/README.pt-pt.md +17 -17
- data/README.ru.md +88 -52
- data/README.zh.md +76 -68
- data/lib/sinatra.rb +0 -1
- data/lib/sinatra/base.rb +21 -15
- data/lib/sinatra/show_exceptions.rb +10 -4
- data/lib/sinatra/version.rb +1 -1
- data/sinatra.gemspec +1 -1
- data/test/asciidoctor_test.rb +2 -2
- data/test/base_test.rb +1 -5
- data/test/builder_test.rb +2 -2
- data/test/coffee_test.rb +8 -2
- data/test/compile_test.rb +1 -1
- data/test/contest.rb +3 -12
- data/test/creole_test.rb +2 -2
- data/test/delegator_test.rb +1 -1
- data/test/encoding_test.rb +1 -1
- data/test/erb_test.rb +1 -1
- data/test/extensions_test.rb +1 -1
- data/test/filter_test.rb +2 -2
- data/test/haml_test.rb +2 -2
- data/test/helper.rb +8 -7
- data/test/helpers_test.rb +6 -6
- data/test/integration_test.rb +3 -3
- data/test/less_test.rb +2 -2
- data/test/liquid_test.rb +3 -3
- data/test/mapped_error_test.rb +5 -5
- data/test/markaby_test.rb +2 -2
- data/test/markdown_test.rb +6 -3
- data/test/mediawiki_test.rb +2 -2
- data/test/middleware_test.rb +1 -1
- data/test/nokogiri_test.rb +2 -2
- data/test/rabl_test.rb +2 -2
- data/test/rack_test.rb +1 -1
- data/test/radius_test.rb +2 -2
- data/test/rdoc_test.rb +4 -4
- data/test/readme_test.rb +1 -1
- data/test/request_test.rb +4 -1
- data/test/response_test.rb +1 -1
- data/test/result_test.rb +2 -2
- data/test/route_added_hook_test.rb +1 -1
- data/test/routing_test.rb +7 -7
- data/test/sass_test.rb +3 -3
- data/test/scss_test.rb +2 -2
- data/test/server_test.rb +10 -2
- data/test/settings_test.rb +4 -4
- data/test/sinatra_test.rb +1 -1
- data/test/slim_test.rb +2 -2
- data/test/static_test.rb +2 -2
- data/test/streaming_test.rb +2 -2
- data/test/stylus_test.rb +2 -2
- data/test/templates_test.rb +3 -3
- data/test/textile_test.rb +2 -2
- data/test/wlang_test.rb +1 -1
- data/test/yajl_test.rb +2 -2
- metadata +10 -11
- data/AUTHORS +0 -61
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ab40363a01800a6eca6fbfd31a92a7bc82eb6324
|
4
|
+
data.tar.gz: 8eb57d7e6f169ce4a8671fb1211c65516ddb21ec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 058b79bc51a5b1e85a9343cfa5552a0f646ebd429721b89101b2b245c491dabe157c0719d82fc85f74193d094d61c62e9b91c0e401dd4dcef5c92292b021e5be
|
7
|
+
data.tar.gz: 05ff1ebc8d85c01b95b17347717e7d0a9da61f3205b36588b9d4228d3373c036549dd0e86c6961a37ce6a70c8bf3f7cb23fceb0d49b5c83cf445a2eb7d206e06
|
data/AUTHORS.md
ADDED
@@ -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.
|
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
|
-
|
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 {:
|
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', '~>
|
49
|
+
gem 'slim', '~> 2.0'
|
50
50
|
gem 'coffee-script', '>= 2.0'
|
51
51
|
gem 'rdoc'
|
52
52
|
gem 'kramdown'
|
data/README.de.md
CHANGED
@@ -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.
|
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[
|
164
|
-
"Hallo #{params[
|
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[
|
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[
|
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[
|
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[
|
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
|
204
|
-
"Hallo, #{params[
|
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[
|
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="
|
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.
|
694
|
-
<a href="
|
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.
|
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="
|
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
|
-
```
|
1006
|
-
var resource = {"foo":"bar","baz":"qux"};
|
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
|
1027
|
-
von
|
1028
|
-
|
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[
|
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[
|
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[
|
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[
|
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[
|
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[
|
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[
|
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)
|
1471
|
-
|
1472
|
-
|
1473
|
-
|
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 '
|
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[
|
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[
|
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
|
-
|
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>
|
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.
|
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.
|
2176
|
-
`
|
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'].
|
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.
|
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://
|
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 '
|
2390
|
+
require 'minitest/autorun'
|
2283
2391
|
require 'rack/test'
|
2284
2392
|
|
2285
|
-
class MyAppTest < Test
|
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[
|
2511
|
-
session['user_name'] = params[
|
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[
|
2640
|
-
# Anfrage-Scope für "/#{params[
|
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
|
-
(
|
2742
|
-
werden, dass Sinatra
|
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](
|
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
|