sinatra 1.3.2 → 1.3.3

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.

data/CHANGES CHANGED
@@ -1,3 +1,30 @@
1
+ = 1.3.3 / 2012-08-19
2
+
3
+ * Improved documentation. (burningTyger, Konstantin Haase, Gabriel Andretta,
4
+ Anurag Priyam, michelc)
5
+
6
+ * No longer modify the load path. (Konstantin Haase)
7
+
8
+ * When keeping a stream open, set up callback/errback correctly to deal with
9
+ clients closing the connection. (Konstantin Haase)
10
+
11
+ * Fix bug where having a query param and a URL param by the same name would
12
+ concatinate the two values. (Konstantin Haase)
13
+
14
+ * Prevent douplicated log output when application is already wrapped in a
15
+ `Rack::CommonLogger`. (Konstantin Haase)
16
+
17
+ * Fix issue where `Rack::Link` and Rails were preventing indefinite streaming.
18
+ (Konstantin Haase)
19
+
20
+ * No longer cause warnings when running Ruby with `-w`. (Konstantin Haase)
21
+
22
+ * HEAD requests on static files no longer report a Content-Length of 0, but
23
+ instead the proper length. (Konstantin Haase)
24
+
25
+ * When protecting against CSRF attacks, drop the session instead of refusing
26
+ the request. (Konstantin Haase)
27
+
1
28
  = 1.3.2 / 2011-12-30
2
29
 
3
30
  * Don't automatically add `Rack::CommonLogger` if `Rack::Server` is adding it,
data/Gemfile CHANGED
@@ -29,10 +29,10 @@ repos = {'tilt' => github % "rtomayko/tilt", 'rack' => github % "rack/rack"}
29
29
  end
30
30
 
31
31
  gem 'haml', '>= 3.0'
32
- gem 'sass'
32
+ gem 'sass' if RUBY_VERSION < "2.0"
33
33
  gem 'builder'
34
34
  gem 'erubis'
35
- gem 'liquid'
35
+ gem 'liquid' unless RUBY_ENGINE == 'rbx' and RUBY_VERSION > '1.9'
36
36
  gem 'slim', '~> 1.0'
37
37
  gem 'temple', '!= 0.3.3'
38
38
  gem 'coffee-script', '>= 2.0'
@@ -47,19 +47,24 @@ if RUBY_ENGINE == 'jruby'
47
47
  gem 'nokogiri', '!= 1.5.0'
48
48
  gem 'jruby-openssl'
49
49
  else
50
+ gem 'yajl-ruby'
50
51
  gem 'nokogiri'
52
+ gem 'thin'
51
53
  end
52
54
 
53
- if RUBY_ENGINE == "ruby"
55
+ if RUBY_ENGINE == "ruby" and RUBY_VERSION > '1.9'
54
56
  gem 'less', '~> 2.0'
55
57
  else
56
58
  gem 'less', '~> 1.0'
57
59
  end
58
60
 
59
- unless RUBY_ENGINE == 'jruby' && JRUBY_VERSION < "1.6.1" && !ENV['TRAVIS']
61
+ if RUBY_ENGINE != 'jruby' or not ENV['TRAVIS']
60
62
  # C extensions
61
63
  gem 'rdiscount'
62
- platforms(:ruby_18) { gem 'redcarpet' }
64
+ platforms(:ruby_18) do
65
+ gem 'redcarpet'
66
+ gem 'mongrel'
67
+ end
63
68
  gem 'RedCloth' unless RUBY_ENGINE == "macruby"
64
69
 
65
70
  ## bluecloth is broken
@@ -67,7 +72,7 @@ unless RUBY_ENGINE == 'jruby' && JRUBY_VERSION < "1.6.1" && !ENV['TRAVIS']
67
72
  end
68
73
 
69
74
  platforms :ruby_18, :jruby do
70
- gem 'json'
75
+ gem 'json' unless RUBY_VERSION > '1.9' # is there a jruby but 1.8 only selector?
71
76
  end
72
77
 
73
78
  platforms :mri_18 do
@@ -19,7 +19,7 @@ Einfach via +rubygems+ installieren und starten:
19
19
 
20
20
  Die Seite kann nun unter http://localhost:4567 betrachtet werden.
21
21
 
22
- Es wird empfohlen, den Thin-Server via <tt>gem install thin</tt> zu
22
+ Es wird empfohlen, den Thin-Server via <tt>gem install thin</tt> zu
23
23
  installieren, den Sinatra dann, soweit vorhanden, automatisch verwendet.
24
24
 
25
25
  == Routen
@@ -42,7 +42,7 @@ definiert. Jeder dieser Routen wird ein Ruby-Block zugeordnet:
42
42
  delete '/' do
43
43
  .. entferne etwas ..
44
44
  end
45
-
45
+
46
46
  options '/' do
47
47
  .. zeige, was wir können ..
48
48
  end
@@ -83,7 +83,7 @@ Oder mit Block-Parametern:
83
83
  get '/download/*.*' do |pfad, endung|
84
84
  [pfad, endung] # => ["Pfad/zu/Datei", "xml"]
85
85
  end
86
-
86
+
87
87
  Routen mit regulären Ausdrücken sind auch möglich:
88
88
 
89
89
  get %r{/hallo/([\w]+)} do
@@ -99,7 +99,7 @@ Und auch hier können Block-Parameter genutzt werden:
99
99
  Routen-Muster können auch mit optionalen Parametern ausgestattet werden:
100
100
 
101
101
  get '/posts.?:format?' do
102
- # passt auf "GET /posts" sowie jegliche Erweiterung
102
+ # passt auf "GET /posts" sowie jegliche Erweiterung
103
103
  # wie "GET /posts.json", "GET /posts.xml" etc.
104
104
  end
105
105
 
@@ -147,13 +147,13 @@ Es können auch andere Bedingungen relativ einfach hinzugefügt werden:
147
147
  "Tut mir leid, verloren."
148
148
  end
149
149
 
150
- Bei Bedingungen, die mehrere Werte annehmen können, sollte ein Splat verwendet
150
+ Bei Bedingungen, die mehrere Werte annehmen können, sollte ein Splat verwendet
151
151
  werden:
152
152
 
153
153
  set(:auth) do |*roles| # <- hier kommt der Splat ins Spiel
154
154
  condition do
155
155
  unless logged_in? && roles.any? {|role| current_user.in_role? role }
156
- redirect "/login/", 303
156
+ redirect "/login/", 303
157
157
  end
158
158
  end
159
159
  end
@@ -161,7 +161,7 @@ werden:
161
161
  get "/mein/account/", :auth => [:user, :admin] do
162
162
  "Mein Account"
163
163
  end
164
-
164
+
165
165
  get "/nur/admin/", :auth => :admin do
166
166
  "Nur Admins dürfen hier rein!"
167
167
  end
@@ -170,18 +170,18 @@ werden:
170
170
 
171
171
  Durch den Rückgabewert eines Routen-Blocks wird mindestens der Response-Body
172
172
  festgelegt, der an den HTTP-Client, bzw. die nächste Rack-Middleware,
173
- weitergegeben wird. Im Normalfall handelt es sich hierbei, wie in den
174
- vorangehenden Beispielen zu sehen war, um einen String. Es werden allerdings
173
+ weitergegeben wird. Im Normalfall handelt es sich hierbei, wie in den
174
+ vorangehenden Beispielen zu sehen war, um einen String. Es werden allerdings
175
175
  auch andere Werte akzeptiert.
176
176
 
177
177
  Es kann jedes gültige Objekt zurückgegeben werden, bei dem es sich entweder um
178
178
  einen Rack-Rückgabewert, einen Rack-Body oder einen HTTP-Status-Code handelt:
179
179
 
180
- * Ein Array mit drei Elementen: <tt>[Status (Fixnum), Headers (Hash),
180
+ * Ein Array mit drei Elementen: <tt>[Status (Fixnum), Headers (Hash),
181
181
  Response-Body (antwortet auf #each)]</tt>.
182
182
  * Ein Array mit zwei Elementen: <tt>[Status (Fixnum), Response-Body (antwortet
183
183
  auf #each)]</tt>.
184
- * Ein Objekt, das auf <tt>#each</tt> antwortet und den an diese Methode
184
+ * Ein Objekt, das auf <tt>#each</tt> antwortet und den an diese Methode
185
185
  übergebenen Block nur mit Strings als Übergabewerte aufruft.
186
186
  * Ein Fixnum, das den Status-Code festlegt.
187
187
 
@@ -198,9 +198,9 @@ Damit lässt sich relativ einfach Streaming implementieren:
198
198
  Ebenso kann die +stream+-Helfer-Methode (s.u.) verwendet werden, die Streaming
199
199
  direkt in die Route integriert.
200
200
 
201
- === Eigene Routen-Muster
201
+ === Eigene Routen-Muster
202
202
 
203
- Wie oben schon beschrieben, ist Sinatra von Haus aus mit Unterstützung für
203
+ Wie oben schon beschrieben, ist Sinatra von Haus aus mit Unterstützung für
204
204
  String-Muster und Reguläre Ausdrücke zum Abgleichen von Routen ausgestattet.
205
205
  Das muss aber noch nicht alles sein, es können ohne großen Aufwand eigene
206
206
  Routen-Muster erstellt werden:
@@ -226,7 +226,7 @@ Routen-Muster erstellt werden:
226
226
  # ...
227
227
  end
228
228
 
229
- Beachte, dass das obige Beispiel etwas übertrieben wirkt. Es geht auch
229
+ Beachte, dass das obige Beispiel etwas übertrieben wirkt. Es geht auch
230
230
  einfacher:
231
231
 
232
232
  get // do
@@ -257,13 +257,92 @@ man die <tt>:static_cache_control</tt>-Einstellung (s.u.).
257
257
 
258
258
  == Views/Templates
259
259
 
260
- Standardmäßig wird davon ausgegangen, dass sich Templates im
261
- <tt>./views</tt>-Ordner befinden. Es kann jedoch ein anderer Ordner festgelegt
262
- werden:
260
+ Alle Templatesprachen verwenden ihre eigene Renderingmethode, die jeweils
261
+ einen String zurückgibt:
262
+
263
+ get '/' do
264
+ erb :index
265
+ end
266
+
267
+ Dieses Beispiel rendert <tt>views/index.erb</tt>.
268
+
269
+ Anstelle eines Templatenamens kann man auch direkt die Templatesprache
270
+ verwenden:
271
+
272
+ get '/' do
273
+ code = "<%= Time.now %>"
274
+ erb code
275
+ end
276
+
277
+ Templates nehmen ein zweite Argument an, den Options-Hash:
278
+
279
+ get '/' do
280
+ erb :index, :layout => :post
281
+ end
282
+
283
+ Dieses Beispiel rendert <tt>views/index.erb</tt> eingebettet in
284
+ <tt>views/post.erb</tt> (Voreinstellung ist <tt>views/layout.erb</tt>, sofern
285
+ es vorhanden ist.)
286
+
287
+ Optionen, die Sinatra nicht versteht, werden an das Template weitergereicht:
288
+
289
+ get '/' do
290
+ haml :index, :format => :html5
291
+ end
292
+
293
+ Für alle Templates können auch generelle Einstellungen festgelegt werden:
263
294
 
264
- set :views, File.dirname(__FILE__) + '/templates'
295
+ set :haml, :format => :html5
265
296
 
266
- Es ist zu beachten, dass immer mit Symbolen auf Templates verwiesen werden
297
+ get '/' do
298
+ haml :index
299
+ end
300
+
301
+ Optionen, die an die Rendermethode weitergegeben werden, überschreiben die
302
+ Einstellungen, die mit +set+ festgelegt wurden.
303
+
304
+ Mögliche Einstellungen:
305
+
306
+ [locals]
307
+ Liste von lokalen Variablen, die and das Dokument weitergegeben werden.
308
+ Praktisch für Partials.
309
+ Beispiel: <tt>erb "<%= foo %>", :locals => {:foo => "bar"}</tt>
310
+
311
+ [default_encoding]
312
+ Gibt die Stringkodierung an, die verwendet werden soll. Voreingestellt auf
313
+ <tt>settings.default_encoding</tt>.
314
+
315
+ [views]
316
+ Ordner, aus dem die Templates heraus geladen werden. Voreingestellt auf
317
+ <tt>settings.views</tt>.
318
+
319
+ [layout]
320
+ Legt fest, ob ein Layouttemplate verwendet werden soll oder nicht (+true+
321
+ oder +false+). Ist es ein Symbol, dass legt es fest, welches Template als
322
+ Layout verwendet wird. Beispiel:
323
+ <tt>erb :index, :layout => !request.xhr?</tt>
324
+
325
+ [content_type]
326
+ Content-Type den das Template ausgibt. Voreinstellung hängt von der
327
+ Templatesprache ab.
328
+
329
+ [scope]
330
+ Scope, in dem das Template gerendert wird. Liegt standardmäßig innerhalb der
331
+ App-Instanz. Wird Scope geändert, sind Instanzvariablen und Helfermethoden
332
+ nicht verfügbar.
333
+
334
+ [layout_engine]
335
+ Legt fest, welcher Renderer für das Layout verantwortlich ist.
336
+ Hilfreich für Sprachen, die sonst keine Templates unterstützen.
337
+ Voreingestellt auf den Renderer, der für das Template verwendet wird.
338
+ Beispiel: <tt>set :rdoc, :layout_engine => :erb</tt>
339
+
340
+ Sinatra geht davon aus, dass die Templates sich im <tt>./views</tt> Verzeichnis
341
+ befinden. Es kann jedoch ein anderer Ordner festgelegt werden:
342
+
343
+ set :views, settings.root + '/templates'
344
+
345
+ Es ist zu beachten, dass immer mit Symbolen auf Templates verwiesen werden
267
346
  muss, auch dann, wenn sie sich in einem Unterordner befinden:
268
347
 
269
348
  haml :'unterverzeichnis/template'
@@ -281,7 +360,7 @@ Beginn ein 'require':
281
360
 
282
361
  === Haml Templates
283
362
 
284
- Abhängigkeit:: {haml}[http://haml-lang.com/]
363
+ Abhängigkeit:: {haml}[http://haml.info/]
285
364
  Dateierweiterungs:: <tt>.haml</tt>
286
365
  Beispiel:: <tt>haml :index, :format => :html5</tt>
287
366
 
@@ -289,7 +368,7 @@ Beispiel:: <tt>haml :index, :format => :html5</tt>
289
368
 
290
369
  Abhängigkeit:: {erubis}[http://www.kuwata-lab.com/erubis/] oder
291
370
  erb (included in Ruby)
292
- Dateierweiterungs:: <tt>.erb</tt>, <tt>.rhtml</tt> oder <tt>.erubis</tt>
371
+ Dateierweiterungs:: <tt>.erb</tt>, <tt>.rhtml</tt> oder <tt>.erubis</tt>
293
372
  (nur Erubis)
294
373
  Beispiel:: <tt>erb :index</tt>
295
374
 
@@ -333,8 +412,8 @@ Abhängigkeit:: {liquid}[http://www.liquidmarkup.org/]
333
412
  Dateierweiterungs:: <tt>.liquid</tt>
334
413
  Beispiel:: <tt>liquid :index, :locals => { :key => 'Wert' }</tt>
335
414
 
336
- Da man aus dem Liquid-Template heraus keine Ruby-Methoden aufrufen kann
337
- (ausgenommen +yield+), wird man üblicherweise locals verwenden wollen, mit
415
+ Da man aus dem Liquid-Template heraus keine Ruby-Methoden aufrufen kann
416
+ (ausgenommen +yield+), wird man üblicherweise locals verwenden wollen, mit
338
417
  denen man Variablen weitergibt.
339
418
 
340
419
  === Markdown Templates
@@ -357,11 +436,11 @@ Beachte, dass man die +markdown+-Methode auch aus anderen Templates heraus
357
436
  aufrufen kann:
358
437
 
359
438
  %h1 Gruß von Haml!
360
- %p= markdown(:Grüsse)
439
+ %p= markdown(:Grüße)
361
440
 
362
441
  Da man Ruby nicht von Markdown heraus aufrufen kann, können auch Layouts nicht
363
- in Markdown geschrieben werden. Es ist aber möglich, einen Renderer für die
364
- Templates zu verwenden und einen anderen für das Layout, indem die
442
+ in Markdown geschrieben werden. Es ist aber möglich, einen Renderer für die
443
+ Templates zu verwenden und einen anderen für das Layout, indem die
365
444
  <tt>:layout_engine</tt>-Option verwendet wird.
366
445
 
367
446
  === Textile Templates
@@ -380,11 +459,11 @@ Beachte, dass man die +textile+-Methode auch aus anderen Templates heraus
380
459
  aufrufen kann:
381
460
 
382
461
  %h1 Gruß von Haml!
383
- %p= textile(:Grüsse)
462
+ %p= textile(:Grüße)
384
463
 
385
464
  Da man Ruby nicht von Textile heraus aufrufen kann, können auch Layouts nicht
386
- in Textile geschrieben werden. Es ist aber möglich, einen Renderer für die
387
- Templates zu verwenden und einen anderen für das Layout, indem die
465
+ in Textile geschrieben werden. Es ist aber möglich, einen Renderer für die
466
+ Templates zu verwenden und einen anderen für das Layout, indem die
388
467
  <tt>:layout_engine</tt>-Option verwendet wird.
389
468
 
390
469
  === RDoc Templates
@@ -406,8 +485,8 @@ aufrufen kann:
406
485
  %p= rdoc(:Grüße)
407
486
 
408
487
  Da man Ruby nicht von RDoc heraus aufrufen kann, können auch Layouts nicht
409
- in RDoc geschrieben werden. Es ist aber möglich, einen Renderer für die
410
- Templates zu verwenden und einen anderen für das Layout, indem die
488
+ in RDoc geschrieben werden. Es ist aber möglich, einen Renderer für die
489
+ Templates zu verwenden und einen anderen für das Layout, indem die
411
490
  <tt>:layout_engine</tt>-Option verwendet wird.
412
491
 
413
492
  === Radius Templates
@@ -452,8 +531,8 @@ aufrufen kann:
452
531
  %p= creole(:Grüße)
453
532
 
454
533
  Da man Ruby nicht von Creole heraus aufrufen kann, können auch Layouts nicht
455
- in Creole geschrieben werden. Es ist aber möglich, einen Renderer für die
456
- Templates zu verwenden und einen anderen für das Layout, indem die
534
+ in Creole geschrieben werden. Es ist aber möglich, einen Renderer für die
535
+ Templates zu verwenden und einen anderen für das Layout, indem die
457
536
  <tt>:layout_engine</tt>-Option verwendet wird.
458
537
 
459
538
  === CoffeeScript Templates
@@ -473,7 +552,7 @@ Rendert den eingebetteten Template-String.
473
552
 
474
553
  === Auf Variablen in Templates zugreifen
475
554
 
476
- Templates werden in demselben Kontext ausgeführt wie Routen. Instanzvariablen
555
+ Templates werden in demselben Kontext ausgeführt wie Routen. Instanzvariablen
477
556
  in Routen sind auch direkt im Template verfügbar:
478
557
 
479
558
  get '/:id' do
@@ -512,7 +591,7 @@ Templates können auch am Ende der Datei definiert werden:
512
591
 
513
592
  Anmerkung: Inline-Templates, die in der Datei definiert sind, die <tt>require
514
593
  'sinatra'</tt> aufruft, werden automatisch geladen. Um andere Inline-Templates
515
- in anderen Dateien aufzurufen, muss explizit <tt>enable :inline_templates</tt>
594
+ in anderen Dateien aufzurufen, muss explizit <tt>enable :inline_templates</tt>
516
595
  verwendet werden.
517
596
 
518
597
  === Benannte Templates
@@ -533,7 +612,7 @@ werden:
533
612
  end
534
613
 
535
614
  Wenn ein Template mit dem Namen "layout" existiert, wird es bei jedem Aufruf
536
- verwendet. Durch <tt>:layout => false</tt> kann das Ausführen verhindert
615
+ verwendet. Durch <tt>:layout => false</tt> kann das Ausführen verhindert
537
616
  werden:
538
617
 
539
618
  get '/' do
@@ -542,16 +621,16 @@ werden:
542
621
 
543
622
  === Dateiendungen zuordnen
544
623
 
545
- Um eine Dateiendung einer Template-Engine zuzuordnen, kann
546
- <tt>Tilt.register</tt> genutzt werden. Wenn etwa die Dateiendung +tt+ für
547
- Textile-Templates genutzt werden soll, lässt sich dies wie folgt
624
+ Um eine Dateiendung einer Template-Engine zuzuordnen, kann
625
+ <tt>Tilt.register</tt> genutzt werden. Wenn etwa die Dateiendung +tt+ für
626
+ Textile-Templates genutzt werden soll, lässt sich dies wie folgt
548
627
  bewerkstelligen:
549
628
 
550
629
  Tilt.register :tt, Tilt[:textile]
551
630
 
552
631
  === Eine eigene Template-Engine hinzufügen
553
632
 
554
- Zu allererst muss die Engine bei Tilt registriert und danach eine
633
+ Zu allererst muss die Engine bei Tilt registriert und danach eine
555
634
  Rendering-Methode erstellt werden:
556
635
 
557
636
  Tilt.register :mtt, MeineTolleTemplateEngine
@@ -565,12 +644,12 @@ Rendering-Methode erstellt werden:
565
644
  end
566
645
 
567
646
  Dieser Code rendert <tt>./views/application.mtt</tt>. Siehe
568
- github.com/rtomayko/tilt[https://github.com/rtomayko/tilt], um mehr über Tilt
647
+ github.com/rtomayko/tilt[https://github.com/rtomayko/tilt], um mehr über Tilt
569
648
  zu lernen.
570
649
 
571
650
  == Filter
572
651
 
573
- Before-Filter werden vor jedem Request in demselben Kontext, wie danach die
652
+ Before-Filter werden vor jedem Request in demselben Kontext, wie danach die
574
653
  Routen, ausgeführt. So können etwa Request und Antwort geändert werden.
575
654
  Gesetzte Instanzvariablen in Filtern können in Routen und Templates verwendet
576
655
  werden:
@@ -610,7 +689,7 @@ werden:
610
689
  before :agent => /Songbird/ do
611
690
  # ...
612
691
  end
613
-
692
+
614
693
  after '/blog/*', :host_name => 'example.com' do
615
694
  # ...
616
695
  end
@@ -731,7 +810,7 @@ anderen Route gefordert wird. Um das zu erreichen, lässt sich +call+ nutzen:
731
810
  end
732
811
 
733
812
  Beachte, dass in dem oben angegeben Beispiel die Performance erheblich erhöht
734
- werden kann, wenn <tt>"bar"</tt> in eine Helfer-Methode umgewandelt wird, auf
813
+ werden kann, wenn <tt>"bar"</tt> in eine Helfer-Methode umgewandelt wird, auf
735
814
  die <tt>/foo</tt> und <tt>/bar</tt> zugreifen können.
736
815
 
737
816
  Wenn der Request innerhalb derselben Applikations-Instanz aufgerufen und keine
@@ -751,13 +830,13 @@ verwendet, lässt sich der Body jederzeit über diese Methode aufrufen:
751
830
  get '/foo' do
752
831
  body "bar"
753
832
  end
754
-
833
+
755
834
  after do
756
835
  puts body
757
836
  end
758
837
 
759
838
  Ebenso ist es möglich, einen Block an +body+ weiterzureichen, der dann vom
760
- Rack-Handler ausgeführt wird (lässt sich z.B. zur Umsetzung von Streaming
839
+ Rack-Handler ausgeführt wird (lässt sich z.B. zur Umsetzung von Streaming
761
840
  einsetzen, siehe auch "Rückgabewerte").
762
841
 
763
842
  Vergleichbar mit +body+ lassen sich auch Status-Code und Header setzen:
@@ -775,10 +854,10 @@ Argumente den aktuellen Wert aus.
775
854
 
776
855
  === Response-Streams
777
856
 
778
- In manchen Situationen sollen Daten bereits an den Client zurückgeschickt
779
- werden, bevor ein vollständiger Response bereit steht. Manchmal will man die
780
- Verbindung auch erst dann beenden und Daten so lange an den Client
781
- zurückschicken, bis er die Verbindung abbricht. Für diese Fälle gibt es die
857
+ In manchen Situationen sollen Daten bereits an den Client zurückgeschickt
858
+ werden, bevor ein vollständiger Response bereit steht. Manchmal will man die
859
+ Verbindung auch erst dann beenden und Daten so lange an den Client
860
+ zurückschicken, bis er die Verbindung abbricht. Für diese Fälle gibt es die
782
861
  +stream+-Helfer-Methode, die es einem erspart eigene Lösungen zu schreiben:
783
862
 
784
863
  get '/' do
@@ -791,20 +870,22 @@ zurückschicken, bis er die Verbindung abbricht. Für diese Fälle gibt es die
791
870
  end
792
871
  end
793
872
 
794
- Damit lassen sich Streaming-APIs realisieren, sog. {Server Sent Events}[http://dev.w3.org/html5/eventsource/]
795
- die als Basis für {WebSockets}[http://en.wikipedia.org/wiki/WebSocket] dienen.
796
- Ebenso können sie verwendet werden, um den Durchsatz zu erhöhen, wenn ein Teil
797
- der Daten von langsamen Ressourcen abhängig ist.
873
+ Damit lassen sich Streaming-APIs realisieren, sog.
874
+ {Server Sent Events}[http://dev.w3.org/html5/eventsource/] die als Basis für
875
+ {WebSockets}[http://en.wikipedia.org/wiki/WebSocket] dienen. Ebenso können sie
876
+ verwendet werden, um den Durchsatz zu erhöhen, wenn ein Teil der Daten von
877
+ langsamen Ressourcen abhängig ist.
798
878
 
799
879
  Es ist zu beachten, dass das Verhalten beim Streaming, insbesondere die Anzahl
800
- nebenläufiger Anfragen, stark davon abhängt, welcher Webserver für die
880
+ nebenläufiger Anfragen, stark davon abhängt, welcher Webserver für die
801
881
  Applikation verwendet wird. Einige Server, z.B. WEBRick, unterstützen Streaming
802
882
  nicht oder nur teilweise. Sollte der Server Streaming nicht unterstützen, wird
803
- ein vollständiger Response-Body zurückgeschickt, sobald der an +stream+
804
- weitergegebene Block abgearbeitet ist.
883
+ ein vollständiger Response-Body zurückgeschickt, sobald der an +stream+
884
+ weitergegebene Block abgearbeitet ist. Mit Shotgun funktioniert Streaming z.B.
885
+ überhaupt nicht.
805
886
 
806
887
  Ist der optionale Parameter +keep_open+ aktiviert, wird beim gestreamten Objekt
807
- +close+ nicht aufgerufen und es ist einem überlassen dies an einem beliebigen
888
+ +close+ nicht aufgerufen und es ist einem überlassen dies an einem beliebigen
808
889
  späteren Zeitpunkt nachholen. Die Funktion ist jedoch nur bei Event-gesteuerten
809
890
  Serven wie Thin oder Rainbows möglich, andere Server werden trotzdem den Stream
810
891
  beenden:
@@ -822,7 +903,7 @@ beenden:
822
903
  connections.each { |out| out << params[:message] << "\n" }
823
904
  "Nachricht verschickt"
824
905
  end
825
-
906
+
826
907
  === Logger
827
908
 
828
909
  Im Geltungsbereich eines Request stellt die +logger+ Helfer-Methode eine
@@ -842,11 +923,17 @@ voreingestellt ist. Wird über <tt>Sinatra::Base</tt> vererbt, muss es erst
842
923
  aktiviert werden:
843
924
 
844
925
  class MyApp < Sinatra::Base
845
- configure(:production, :development) do
926
+ configure :production, :development do
846
927
  enable :logging
847
928
  end
848
929
  end
849
930
 
931
+ Damit auch keine Middleware das Logging aktivieren kann, muss die +logging+
932
+ Einstellung auf +nil+ gesetzt werden. Das heißt aber auch, dass +logger+ in
933
+ diesem Fall +nil+ zurückgeben wird. Üblicherweise wird das eingesetzt, wenn ein
934
+ eigener Logger eingerichtet werden soll. Sinatra wird dann verwenden, was in
935
+ <tt>env['rack.logger']</tt> eingetragen ist.
936
+
850
937
  == Mime-Types
851
938
 
852
939
  Wenn <tt>send_file</tt> oder statische Dateien verwendet werden, kann es
@@ -856,7 +943,7 @@ vorkommen, dass Sinatra den Mime-Typ nicht kennt. Registriert wird dieser mit
856
943
  configure do
857
944
  mime_type :foo, 'text/foo'
858
945
  end
859
-
946
+
860
947
  Es kann aber auch der +content_type+-Helfer verwendet werden:
861
948
 
862
949
  get '/' do
@@ -866,7 +953,7 @@ Es kann aber auch der +content_type+-Helfer verwendet werden:
866
953
 
867
954
  === URLs generieren
868
955
 
869
- Zum Generieren von URLs sollte die +url+-Helfer-Methode genutzen werden, so
956
+ Zum Generieren von URLs sollte die +url+-Helfer-Methode genutzen werden, so
870
957
  z.B. beim Einsatz von Haml:
871
958
 
872
959
  %a{:href => url('/foo')} foo
@@ -890,7 +977,7 @@ Weitere Parameter werden wie Argumente der +halt+-Methode behandelt:
890
977
  redirect to('/bar'), 303
891
978
  redirect 'http://google.com', 'Hier bist du falsch'
892
979
 
893
- Ebenso leicht lässt sich ein Schritt zurück mit dem Alias
980
+ Ebenso leicht lässt sich ein Schritt zurück mit dem Alias
894
981
  <tt>redirect back</tt> erreichen:
895
982
 
896
983
  get '/foo' do
@@ -910,12 +997,12 @@ Um Argumente an ein Redirect weiterzugeben, können sie entweder dem Query
910
997
  oder eine Session verwendet werden:
911
998
 
912
999
  enable :sessions
913
-
1000
+
914
1001
  get '/foo' do
915
1002
  session[:secret] = 'foo'
916
1003
  redirect to('/bar')
917
1004
  end
918
-
1005
+
919
1006
  get '/bar' do
920
1007
  session[:secret]
921
1008
  end
@@ -964,23 +1051,42 @@ ebenso ist es möglich einen
964
1051
  etag @article.sha1, :weak
965
1052
 
966
1053
  Diese Helfer führen nicht das eigentliche Caching aus, sondern geben die dafür
967
- notwendigen Informationen an den Cache weiter. Für schnelle Reverse-Proxy
968
- Cache-Lösungen bietet sich z.B.
1054
+ notwendigen Informationen an den Cache weiter. Für schnelle Reverse-Proxy
1055
+ Cache-Lösungen bietet sich z.B.
969
1056
  {rack-cache}[http://rtomayko.github.com/rack-cache/] an:
970
1057
 
971
1058
  require "rack/cache"
972
1059
  require "sinatra"
973
-
1060
+
974
1061
  use Rack::Cache
975
-
1062
+
976
1063
  get '/' do
977
1064
  cache_control :public, :max_age => 36000
978
1065
  sleep 5
979
1066
  "hello"
980
1067
  end
981
-
1068
+
982
1069
  Um den <tt>Cache-Control</tt>-Header mit Informationen zu versorgen, verwendet
983
- man die <tt>:static_cache_control</tt>-Einstellung (s.u.).
1070
+ man die <tt>:static_cache_control</tt>-Einstellung (s.u.).
1071
+
1072
+ Nach RFC 2616 sollte sich die Anwendung anders verhalten, wenn ein
1073
+ If-Match oder ein If-None_match Header auf <tt>*</tt> gesetzt wird in
1074
+ Abhängigkeit davon, ob die Resource bereits existiert. Sinatra geht
1075
+ davon aus, dass Ressourcen bei sicheren Anfragen (z.B. bei get oder Idempotenten
1076
+ Anfragen wie put) bereits existieren, wobei anderen Ressourcen
1077
+ (besipielsweise bei post), als neue Ressourcen behandelt werden. Dieses
1078
+ Verhalten lässt sich mit der <tt>:new_resource</tt> Option ändern:
1079
+
1080
+ get '/create' do
1081
+ etag '', :new_resource => true
1082
+ Article.create
1083
+ erb :new_article
1084
+ end
1085
+
1086
+ Soll das schwache ETag trotzdem verwendet werden, verwendet man die
1087
+ <tt>:kind</tt> Option:
1088
+
1089
+ etag '', :new_resource => true, :kind => :weak
984
1090
 
985
1091
  === Dateien versenden
986
1092
 
@@ -1004,7 +1110,7 @@ Für <tt>send_file</tt> stehen einige Hash-Optionen zur Verfügung:
1004
1110
  [type]
1005
1111
  Content-Type, der verwendet werden soll. Wird, wenn nicht angegeben, von der
1006
1112
  Dateiendung abgeleitet.
1007
-
1113
+
1008
1114
  [disposition]
1009
1115
  Verwendet für Content-Disposition. Mögliche Werte sind: +nil+ (Standard),
1010
1116
  <tt>:attachment</tt> und <tt>:inline</tt>.
@@ -1057,7 +1163,7 @@ Manche Optionen, wie etwa <tt>script_name</tt> oder <tt>path_info</tt>, sind
1057
1163
  auch schreibbar:
1058
1164
 
1059
1165
  before { request.path_info = "/" }
1060
-
1166
+
1061
1167
  get "/" do
1062
1168
  "Alle Anfragen kommen hier an!"
1063
1169
  end
@@ -1089,8 +1195,8 @@ Ebenso kann eine Dateiname als Parameter hinzugefügt werden:
1089
1195
 
1090
1196
  === Umgang mit Datum und Zeit
1091
1197
 
1092
- Sinatra bietet eine <tt>time_for</tt>-Helfer-Methode, die aus einem gegebenen
1093
- Wert ein Time-Objekt generiert. Ebenso kann sie nach +DateTime+, +Date+ und
1198
+ Sinatra bietet eine <tt>time_for</tt>-Helfer-Methode, die aus einem gegebenen
1199
+ Wert ein Time-Objekt generiert. Ebenso kann sie nach +DateTime+, +Date+ und
1094
1200
  ähnliche Klassen konvertieren:
1095
1201
 
1096
1202
  get '/' do
@@ -1099,7 +1205,7 @@ Wert ein Time-Objekt generiert. Ebenso kann sie nach +DateTime+, +Date+ und
1099
1205
  end
1100
1206
 
1101
1207
  Diese Methode wird intern für +expires, +last_modiefied+ und Freunde verwendet.
1102
- Mit ein paar Handgriffen lässt sich diese Methode also in ihrem Verhalten
1208
+ Mit ein paar Handgriffen lässt sich diese Methode also in ihrem Verhalten
1103
1209
  erweitern, indem man +time_for+ in der eigenen Applikation überschreibt:
1104
1210
 
1105
1211
  helpers do
@@ -1117,7 +1223,7 @@ erweitern, indem man +time_for+ in der eigenen Applikation überschreibt:
1117
1223
  expires :tomorrow
1118
1224
  "Hallo"
1119
1225
  end
1120
-
1226
+
1121
1227
  === Nachschlagen von Template-Dateien
1122
1228
 
1123
1229
  Die <tt>find_template</tt>-Helfer-Methode wird genutzt, um Template-Dateien zum
@@ -1170,16 +1276,16 @@ Wird einmal beim Starten in jedweder Umgebung ausgeführt:
1170
1276
  configure do
1171
1277
  # setze eine Option
1172
1278
  set :option, 'wert'
1173
-
1279
+
1174
1280
  # setze mehrere Optionen
1175
1281
  set :a => 1, :b => 2
1176
-
1282
+
1177
1283
  # das gleiche wie `set :option, true`
1178
1284
  enable :option
1179
-
1285
+
1180
1286
  # das gleiche wie `set :option, false`
1181
1287
  disable :option
1182
-
1288
+
1183
1289
  # dynamische Einstellungen mit Blöcken
1184
1290
  set(:css_dir) { File.join(views, 'css') }
1185
1291
  end
@@ -1212,10 +1318,10 @@ Diese Einstellungen sind über +settings+ erreichbar:
1212
1318
 
1213
1319
  === Einstellung des Angriffsschutzes
1214
1320
 
1215
- Sinatra verwendet
1321
+ Sinatra verwendet
1216
1322
  {Rack::Protection}[https://github.com/rkh/rack-protection#readme], um die
1217
1323
  Anwendung vor häufig vorkommenden Angriffen zu schützen. Diese Voreinstellung
1218
- lässt sich selbstverständlich auch deaktivieren, z.B. um
1324
+ lässt sich selbstverständlich auch deaktivieren, z.B. um
1219
1325
  Geschwindigkeitsvorteile zu gewinnen:
1220
1326
 
1221
1327
  disable :protection
@@ -1225,42 +1331,41 @@ einen Hash mit Optionen hinzu:
1225
1331
 
1226
1332
  set :protection, :except => :path_traversal
1227
1333
 
1228
- Neben Strings akzeptiert <tt>:except</tt> auch Arrays, um gleich mehrere
1334
+ Neben Strings akzeptiert <tt>:except</tt> auch Arrays, um gleich mehrere
1229
1335
  Schutzmechanismen zu deaktivieren:
1230
1336
 
1231
- set :protections, :except => [:path_traversal, :session_hijacking]
1232
-
1337
+ set :protection, :except => [:path_traversal, :session_hijacking]
1338
+
1233
1339
  === Mögliche Einstellungen
1234
1340
 
1235
1341
  [absolute_redirects] Wenn ausgeschaltet, wird Sinatra relative Redirects
1236
- zulassen. Jedoch ist Sinatra dann nicht mehr mit RFC
1237
- 2616 (HTTP 1.1) konform, das nur absolute Redirects
1342
+ zulassen. Jedoch ist Sinatra dann nicht mehr mit RFC
1343
+ 2616 (HTTP 1.1) konform, das nur absolute Redirects
1238
1344
  zulässt.
1239
1345
 
1240
1346
  Sollte eingeschaltet werden, wenn die Applikation
1241
- hinter einem Reverse-Proxy liegt, der nicht ordentlich
1242
- eingerichtet ist. Beachte, dass die
1243
- +url+-Helfer-Methode nach wie vor absolute URLs
1244
- erstellen wird, es sei denn, es wird als zweiter
1347
+ hinter einem Reverse-Proxy liegt, der nicht ordentlich
1348
+ eingerichtet ist. Beachte, dass die
1349
+ +url+-Helfer-Methode nach wie vor absolute URLs
1350
+ erstellen wird, es sei denn, es wird als zweiter
1245
1351
  Parameter +false+ angegeben.
1246
1352
 
1247
1353
  Standardmäßig nicht aktiviert.
1248
-
1249
1354
 
1250
1355
  [add_charsets] Mime-Types werden hier automatisch der Helfer-Methode
1251
1356
  <tt>content_type</tt> zugeordnet.
1252
-
1357
+
1253
1358
  Es empfielt sich, Werte hinzuzufügen statt sie zu
1254
1359
  überschreiben:
1255
-
1360
+
1256
1361
  settings.add_charsets << "application/foobar"
1257
1362
 
1258
- [app_file] Hauptdatei der Applikation. Wird verwendet, um das
1259
- Wurzel-, Inline-, View- und öffentliche Verzeichnis des
1260
- Projekts festzustellen.
1261
-
1262
- [bind] IP-Address, an die gebunden wird
1263
- (Standardwert: 0.0.0.0). Wird nur für den eingebauten
1363
+ [app_file] Pfad zur Hauptdatei der Applikation. Wird verwendet, um
1364
+ das Wurzel-, Inline-, View- und öffentliche Verzeichnis
1365
+ des Projekts festzustellen.
1366
+
1367
+ [bind] IP-Address, an die gebunden wird
1368
+ (Standardwert: 0.0.0.0). Wird nur für den eingebauten
1264
1369
  Server verwendet.
1265
1370
 
1266
1371
  [default_encoding] Das Encoding, falls keines angegeben wurde.
@@ -1276,7 +1381,7 @@ Schutzmechanismen zu deaktivieren:
1276
1381
 
1277
1382
  [lock] Jeder Request wird gelocked. Es kann nur ein Request
1278
1383
  pro Ruby-Prozess gleichzeitig verarbeitet werden.
1279
-
1384
+
1280
1385
  Eingeschaltet, wenn die Applikation threadsicher ist.
1281
1386
  Standardmäßig nicht aktiviert.
1282
1387
 
@@ -1287,27 +1392,34 @@ Schutzmechanismen zu deaktivieren:
1287
1392
  [port] Port für die Applikation. Wird nur im internen Server
1288
1393
  verwendet.
1289
1394
 
1290
- [prefixed_redirects] Entscheidet, ob <tt>request.script_name</tt> in
1291
- Redirects eingefügt wird oder nicht, wenn kein
1292
- absoluter Pfad angegeben ist. Auf diese Weise verhält
1395
+ [prefixed_redirects] Entscheidet, ob <tt>request.script_name</tt> in
1396
+ Redirects eingefügt wird oder nicht, wenn kein
1397
+ absoluter Pfad angegeben ist. Auf diese Weise verhält
1293
1398
  sich <tt>redirect '/foo'</tt> so, als wäre es ein
1294
- <tt>redirect to('/foo')</tt>. Standardmäßig nicht
1399
+ <tt>redirect to('/foo')</tt>. Standardmäßig nicht
1295
1400
  aktiviert.
1296
-
1297
- [protection] Legt fest, ob der Schutzmechanismus für häufig
1298
- Vorkommende Webangriffe auf Webapplikationen aktiviert
1299
- wird oder nicht. Weitere Informationen im vorhergehenden
1401
+
1402
+ [protection] Legt fest, ob der Schutzmechanismus für häufig
1403
+ Vorkommende Webangriffe auf Webapplikationen aktiviert
1404
+ wird oder nicht. Weitere Informationen im vorhergehenden
1300
1405
  Abschnitt.
1301
1406
 
1302
1407
  [public_folder] Das öffentliche Verzeichnis, aus dem Daten zur
1303
- Verfügung gestellt werden können.
1408
+ Verfügung gestellt werden können. Wird nur dann
1409
+ verwendet, wenn statische Daten zur Verfügung
1410
+ gestellt werden können (s.u. <tt>static</tt>
1411
+ Option). Leitet sich von der <tt>app_file</tt>
1412
+ Einstellung ab, wenn nicht gesetzt.
1304
1413
 
1305
1414
  [reload_templates] Im development-Modus aktiviert.
1306
1415
 
1307
- [root] Wurzelverzeichnis des Projekts.
1416
+ [root] Wurzelverzeichnis des Projekts. Leitet sich von der
1417
+ <tt>app_file</tt> Einstellung ab, wenn nicht gesetzt.
1308
1418
 
1309
- [raise_errors] Einen Ausnahmezustand aufrufen. Beendet die
1310
- Applikation.
1419
+ [raise_errors] Einen Ausnahmezustand aufrufen. Beendet die
1420
+ Applikation. Ist automatisch aktiviert, wenn die
1421
+ Umgebung auf <tt>"test"</tt> eingestellt ist.
1422
+ Ansonsten ist diese Option deaktiviert.
1311
1423
 
1312
1424
  [run] Wenn aktiviert, wird Sinatra versuchen, den Webserver
1313
1425
  zu starten. Nicht verwenden, wenn Rackup oder anderes
@@ -1316,32 +1428,58 @@ Schutzmechanismen zu deaktivieren:
1316
1428
  [running] Läuft der eingebaute Server? Diese Einstellung nicht
1317
1429
  ändern!
1318
1430
 
1319
- [server] Server oder Liste von Servern, die als eingebaute
1431
+ [server] Server oder Liste von Servern, die als eingebaute
1320
1432
  Server zur Verfügung stehen.
1321
1433
  Standardmäßig auf ['thin', 'mongrel', 'webrick']
1322
1434
  voreingestellt. Die Anordnung gibt die Priorität vor.
1323
1435
 
1324
- [sessions] Sessions auf Cookiebasis aktivieren.
1436
+ [sessions] Sessions auf Cookiebasis mittels
1437
+ <tt>Rack::Session::Cookie</tt>aktivieren. Für
1438
+ weitere Infos bitte in der Sektion 'Sessions
1439
+ verwenden' nachschauen.
1440
+
1441
+ [show_exceptions] Bei Fehlern einen Stacktrace im Browseranzeigen. Ist
1442
+ automatisch aktiviert, wenn die Umgebung auf
1443
+ <tt>"development"</tt> eingestellt ist. Ansonsten ist
1444
+ diese Option deaktiviert.
1325
1445
 
1326
- [show_exceptions] Stacktrace im Browser bei Fehlern anzeigen.
1327
1446
 
1328
1447
  [static] Entscheidet, ob Sinatra statische Dateien zur Verfügung
1329
1448
  stellen soll oder nicht.
1330
- Sollte nicht aktiviert werden, wenn ein Server
1331
- verwendet wird, der dies auch selbstständig erledigen
1449
+ Sollte nicht aktiviert werden, wenn ein Server
1450
+ verwendet wird, der dies auch selbstständig erledigen
1332
1451
  kann. Deaktivieren wird die Performance erhöhen.
1333
1452
  Standardmäßig aktiviert.
1334
1453
 
1335
- [static_cache_control] Wenn Sinatra statische Daten zur Verfügung stellt,
1336
- können mit dieser Einstellung die +Cache-Control+
1337
- Header zu den Responses hinzugefügt werden. Die
1454
+ [static_cache_control] Wenn Sinatra statische Daten zur Verfügung stellt,
1455
+ können mit dieser Einstellung die +Cache-Control+
1456
+ Header zu den Responses hinzugefügt werden. Die
1338
1457
  Einstellung verwendet dazu die +cache_control+
1339
1458
  Helfer-Methode. Standardmäßig deaktiviert.
1340
1459
  Ein Array wird verwendet, um mehrere Werte gleichzeitig
1341
1460
  zu übergeben:
1342
- <tt>set :static_cache_control, [:public, :max_age => 300]</tt>
1461
+ <tt>set :static_cache_control, [:public, :max_age => 300]</tt>
1462
+
1463
+ [views] Verzeichnis der Views. Leitet sich von der
1464
+ <tt>app_file</tt> Einstellung ab, wenn nicht gesetzt.
1465
+
1466
+ == Umgebungen
1467
+
1468
+ Es gibt drei voreingestellte Umgebungen in Sinatra: <tt>"development"</tt>,
1469
+ <tt>"production"</tt> und <tt>"test"</tt>. Umgebungen können über die
1470
+ +RACK_ENV+ Umgebungsvariable gesetzt werden. Die Standardeinstellung ist
1471
+ <tt>"development"</tt>. In diesem Modus werden alle Templates zwischen
1472
+ Requests neu geladen. Dazu gibt es besondere Fehlerseiten für 404 Stati
1473
+ und Fehlermeldungen. In <tt>"production"</tt> und <tt>"test"</tt> werden
1474
+ Templates automatisch gecached.
1475
+
1476
+ Um die Anwendung in einer anderen Umgebung auszuführen kann man die
1477
+ <tt>-e</tt> Option verwenden:
1478
+
1479
+ ruby my_app.rb -e [ENVIRONMENT]
1343
1480
 
1344
- [views] Verzeichnis der Views.
1481
+ In der Anwendung kann man die die Methoden +development?+, +test?+ und
1482
+ +production?+ verwenden, um die aktuelle Umgebung zu erfahren.
1345
1483
 
1346
1484
  == Fehlerbehandlung
1347
1485
 
@@ -1407,11 +1545,11 @@ der Development-Umgebung.
1407
1545
 
1408
1546
  Sinatra baut auf Rack[http://rack.rubyforge.org/], einem minimalistischen
1409
1547
  Standard-Interface für Ruby-Webframeworks. Eines der interessantesten
1410
- Features für Entwickler ist der Support von Middlewares, die zwischen den
1548
+ Features für Entwickler ist der Support von Middlewares, die zwischen den
1411
1549
  Server und die Anwendung geschaltet werden und so HTTP-Request und/oder Antwort
1412
1550
  überwachen und/oder manipulieren können.
1413
1551
 
1414
- Sinatra macht das Erstellen von Middleware-Verkettungen mit der
1552
+ Sinatra macht das Erstellen von Middleware-Verkettungen mit der
1415
1553
  Top-Level-Methode +use+ zu einem Kinderspiel:
1416
1554
 
1417
1555
  require 'sinatra'
@@ -1434,8 +1572,8 @@ Rack::Builder[http://rack.rubyforge.org/doc/classes/Rack/Builder.html]-DSL
1434
1572
  end
1435
1573
 
1436
1574
  Rack bietet eine Vielzahl von Standard-Middlewares für Logging, Debugging,
1437
- URL-Routing, Authentifizierung und Session-Verarbeitung. Sinatra verwendet
1438
- viele von diesen Komponenten automatisch, abhängig von der Konfiguration. So
1575
+ URL-Routing, Authentifizierung und Session-Verarbeitung. Sinatra verwendet
1576
+ viele von diesen Komponenten automatisch, abhängig von der Konfiguration. So
1439
1577
  muss +use+ häufig nicht explizit verwendet werden.
1440
1578
 
1441
1579
  Hilfreiche Middleware gibt es z.B. hier:
@@ -1479,14 +1617,14 @@ wird empfohlen:
1479
1617
 
1480
1618
  == Sinatra::Base - Middleware, Bibliotheken und modulare Anwendungen
1481
1619
 
1482
- Das Definieren einer Top-Level-Anwendung funktioniert gut für
1483
- Mikro-Anwendungen, hat aber Nachteile, wenn wiederverwendbare Komponenten wie
1620
+ Das Definieren einer Top-Level-Anwendung funktioniert gut für
1621
+ Mikro-Anwendungen, hat aber Nachteile, wenn wiederverwendbare Komponenten wie
1484
1622
  Middleware, Rails Metal, einfache Bibliotheken mit Server-Komponenten oder auch
1485
1623
  Sinatra-Erweiterungen geschrieben werden sollen.
1486
1624
 
1487
- Die Top-Level-DSL belastet den Objekt-Namespace und setzt einen
1488
- Mikro-Anwendungsstil voraus (eine einzelne Anwendungsdatei, <tt>./public</tt>
1489
- und <tt>./views</tt> Ordner, Logging, Exception-Detail-Seite, usw.). Genau
1625
+ Das Top-Level geht von einer Konfiguration für eine Mikro-Anwendung aus
1626
+ (wie sie z.B. bei einer einzelnen Anwendungsdatei, <tt>./public</tt>
1627
+ und <tt>./views</tt> Ordner, Logging, Exception-Detail-Seite, usw.). Genau
1490
1628
  hier kommt <tt>Sinatra::Base</tt> ins Spiel:
1491
1629
 
1492
1630
  require 'sinatra/base'
@@ -1502,13 +1640,13 @@ hier kommt <tt>Sinatra::Base</tt> ins Spiel:
1502
1640
 
1503
1641
  Die MyApp-Klasse ist eine unabhängige Rack-Komponente, die als Middleware,
1504
1642
  Endpunkt oder via Rails Metal verwendet werden kann. Verwendet wird sie durch
1505
- +use+ oder +run+ von einer Rackup-<tt>config.ru</tt>-Datei oder als
1643
+ +use+ oder +run+ von einer Rackup-<tt>config.ru</tt>-Datei oder als
1506
1644
  Server-Komponente einer Bibliothek:
1507
1645
 
1508
1646
  MyApp.run! :host => 'localhost', :port => 9090
1509
1647
 
1510
1648
  Die Methoden der <tt>Sinatra::Base</tt>-Subklasse sind genau dieselben wie die
1511
- der Top-Level-DSL. Die meisten Top-Level-Anwendungen können mit nur zwei
1649
+ der Top-Level-DSL. Die meisten Top-Level-Anwendungen können mit nur zwei
1512
1650
  Veränderungen zu <tt>Sinatra::Base</tt> konvertiert werden:
1513
1651
 
1514
1652
  * Die Datei sollte <tt>require 'sinatra/base'</tt> anstelle von
@@ -1528,20 +1666,14 @@ Entgegen häufiger Meinungen gibt es nichts gegen den klassischen Stil
1528
1666
  einzuwenden. Solange es die Applikation nicht beeinträchtigt, besteht kein
1529
1667
  Grund, eine modulare Applikation zu erstellen.
1530
1668
 
1531
- Lediglich zwei Nachteile gegenüber dem modularen Stil sollten beachtet werden:
1669
+ Der größte Nachteil der klassischen Sinatra Anwendung gegenüber einer modularen
1670
+ ist die Einschränkung auf eine Sinatra Anwendung pro Ruby-Prozess. Sollen
1671
+ mehrere zum Einsatz kommen, muss auf den modularen Stil umgestiegen werden.
1672
+ Dabei ist es kein Problem klassische und modulare Anwendungen miteinander zu
1673
+ vermischen.
1532
1674
 
1533
- * Es kann nur eine Sinatra Applikation pro Ruby-Prozess laufen. Sollten mehrere
1534
- zum Einsatz kommen, muss auf den modularen Stil umgestiegen werden.
1535
-
1536
- * Der klassische Stil füllt Object mit Delegations-Methoden. Sollte die
1537
- Applikation als Gem/Bibliothek zum Einsatz kommen, sollte auf den modularen
1538
- Stil umgestiegen werden.
1539
-
1540
- Es gibt keinen Grund, warum modulare und klassische Elemente nicht
1541
- vermischt werden sollten.
1542
-
1543
- Will man jedoch von einem Stil auf den anderen umsteigen, sollten einige
1544
- Unterschiede beachtet werden:
1675
+ Bei einem Umstieg, sollten einige Unterschiede in den Einstellungen beachtet
1676
+ werden:
1545
1677
 
1546
1678
  Szenario Classic Modular
1547
1679
 
@@ -1558,10 +1690,10 @@ Es gibt zwei übliche Wege, eine modulare Anwendung zu starten. Zum einen über
1558
1690
 
1559
1691
  # mein_app.rb
1560
1692
  require 'sinatra/base'
1561
-
1693
+
1562
1694
  class MeinApp < Sinatra::Base
1563
1695
  # ... Anwendungscode hierhin ...
1564
-
1696
+
1565
1697
  # starte den Server, wenn die Ruby-Datei direkt ausgeführt wird
1566
1698
  run! if app_file == $0
1567
1699
  end
@@ -1587,7 +1719,7 @@ Schreibe eine Anwendungsdatei:
1587
1719
 
1588
1720
  # app.rb
1589
1721
  require 'sinatra'
1590
-
1722
+
1591
1723
  get '/' do
1592
1724
  'Hallo Welt!'
1593
1725
  end
@@ -1607,15 +1739,15 @@ Anzeichen dafür, dass eine <tt>config.ru</tt>-Datei gebraucht wird:
1607
1739
  * Sinatra soll als Middleware verwendet werden, nicht als Endpunkt.
1608
1740
 
1609
1741
  <b>Es gibt keinen Grund, eine <tt>config.ru</tt>-Datei zu verwenden, nur weil
1610
- eine Anwendung im modularen Stil betrieben werden soll. Ebenso wird keine
1611
- Anwendung mit modularem Stil benötigt, um eine <tt>config.ru</tt>-Datei zu
1742
+ eine Anwendung im modularen Stil betrieben werden soll. Ebenso wird keine
1743
+ Anwendung mit modularem Stil benötigt, um eine <tt>config.ru</tt>-Datei zu
1612
1744
  verwenden.</b>
1613
1745
 
1614
1746
  === Sinatra als Middleware nutzen
1615
1747
 
1616
1748
  Es ist nicht nur möglich, andere Rack-Middleware mit Sinatra zu nutzen, es kann
1617
- außerdem jede Sinatra-Anwendung selbst als Middleware vor jeden beliebigen
1618
- Rack-Endpunkt gehangen werden. Bei diesem Endpunkt muss es sich nicht um eine
1749
+ außerdem jede Sinatra-Anwendung selbst als Middleware vor jeden beliebigen
1750
+ Rack-Endpunkt gehangen werden. Bei diesem Endpunkt muss es sich nicht um eine
1619
1751
  andere Sinatra-Anwendung handeln, es kann jede andere Rack-Anwendung sein
1620
1752
  (Rails/Ramaze/Camping/...):
1621
1753
 
@@ -1623,9 +1755,9 @@ andere Sinatra-Anwendung handeln, es kann jede andere Rack-Anwendung sein
1623
1755
 
1624
1756
  class LoginScreen < Sinatra::Base
1625
1757
  enable :sessions
1626
-
1758
+
1627
1759
  get('/login') { haml :login }
1628
-
1760
+
1629
1761
  post('/login') do
1630
1762
  if params[:name] == 'admin' && params[:password] == 'admin'
1631
1763
  session['user_name'] = params[:name]
@@ -1638,20 +1770,20 @@ andere Sinatra-Anwendung handeln, es kann jede andere Rack-Anwendung sein
1638
1770
  class MyApp < Sinatra::Base
1639
1771
  # Middleware wird vor Filtern ausgeführt
1640
1772
  use LoginScreen
1641
-
1773
+
1642
1774
  before do
1643
1775
  unless session['user_name']
1644
1776
  halt "Zugriff verweigert, bitte <a href='/login'>einloggen</a>."
1645
1777
  end
1646
1778
  end
1647
-
1779
+
1648
1780
  get('/') { "Hallo #{session['user_name']}." }
1649
1781
  end
1650
1782
 
1651
1783
  === Dynamische Applikationserstellung
1652
1784
 
1653
1785
  Manche Situationen erfordern die Erstellung neuer Applikationen zur Laufzeit,
1654
- ohne dass sie einer Konstanten zugeordnet werden. Dies lässt sich mit
1786
+ ohne dass sie einer Konstanten zugeordnet werden. Dies lässt sich mit
1655
1787
  <tt>Sinatra.new</tt> erreichen:
1656
1788
 
1657
1789
  require 'sinatra/base'
@@ -1698,10 +1830,10 @@ Verfügung stehen.
1698
1830
 
1699
1831
  Jede Sinatra-Anwendung entspricht einer <tt>Sinatra::Base</tt>-Subklasse. Falls
1700
1832
  die Top- Level-DSL verwendet wird (<tt>require 'sinatra'</tt>), handelt es sich
1701
- um <tt>Sinatra::Application</tt>, andernfalls ist es jene Subklasse, die
1702
- explizit angelegt wurde. Auf Klassenebene stehen Methoden wie +get+ oder
1703
- +before+ zur Verfügung, es gibt aber keinen Zugriff auf das +request+-Object
1704
- oder die +session+, da nur eine einzige Klasse für alle eingehenden Anfragen
1833
+ um <tt>Sinatra::Application</tt>, andernfalls ist es jene Subklasse, die
1834
+ explizit angelegt wurde. Auf Klassenebene stehen Methoden wie +get+ oder
1835
+ +before+ zur Verfügung, es gibt aber keinen Zugriff auf das +request+-Object
1836
+ oder die +session+, da nur eine einzige Klasse für alle eingehenden Anfragen
1705
1837
  genutzt wird.
1706
1838
 
1707
1839
  Optionen, die via +set+ gesetzt werden, sind Methoden auf Klassenebene:
@@ -1710,7 +1842,7 @@ Optionen, die via +set+ gesetzt werden, sind Methoden auf Klassenebene:
1710
1842
  # Hey, ich bin im Anwendungsscope!
1711
1843
  set :foo, 42
1712
1844
  foo # => 42
1713
-
1845
+
1714
1846
  get '/foo' do
1715
1847
  # Hey, ich bin nicht mehr im Anwendungs-Scope!
1716
1848
  end
@@ -1743,12 +1875,12 @@ Anwendungs-Scope zugegriffen werden:
1743
1875
  get '/neue_route/:name' do
1744
1876
  # Anfrage-Scope für '/neue_route/:name'
1745
1877
  @value = 42
1746
-
1878
+
1747
1879
  settings.get "/#{params[:name]}" do
1748
1880
  # Anfrage-Scope für "/#{params[:name]}"
1749
1881
  @value # => nil (nicht dieselbe Anfrage)
1750
1882
  end
1751
-
1883
+
1752
1884
  "Route definiert!"
1753
1885
  end
1754
1886
  end
@@ -1767,13 +1899,13 @@ weitergeleitet. Dieser verhält sich jedoch nicht 100%ig wie der Klassen-Scope,
1767
1899
  da man nicht die Bindung der Klasse besitzt: Nur Methoden, die explizit als
1768
1900
  delegierbar markiert wurden, stehen hier zur Verfügung und es kann nicht auf
1769
1901
  die Variablen des Klassenscopes zugegriffen werden (mit anderen Worten: es gibt
1770
- ein anderes +self+). Weitere Delegationen können mit
1902
+ ein anderes +self+). Weitere Delegationen können mit
1771
1903
  <tt>Sinatra::Delegator.delegate :methoden_name</tt> hinzugefügt werden.
1772
1904
 
1773
1905
  Im Delegation-Scop befindet man sich:
1774
1906
 
1775
1907
  * Im Top-Level, wenn <tt>require 'sinatra'</tt> aufgerufen wurde.
1776
- * In einem Objekt, das mit dem <tt>Sinatra::Delegator</tt>-Mixin erweitert
1908
+ * In einem Objekt, das mit dem <tt>Sinatra::Delegator</tt>-Mixin erweitert
1777
1909
  wurde.
1778
1910
 
1779
1911
  Schau am besten im Code nach: Hier ist
@@ -1801,13 +1933,13 @@ Die Optionen sind:
1801
1933
  Die folgenden Versionen werden offiziell unterstützt:
1802
1934
 
1803
1935
  [ Ruby 1.8.7 ]
1804
- 1.8.7 wird vollständig unterstützt, aber solange nichts dagegen spricht,
1936
+ 1.8.7 wird vollständig unterstützt, aber solange nichts dagegen spricht,
1805
1937
  wird ein Update auf 1.9.2 oder ein Umstieg auf JRuby/Rubinius empfohlen.
1806
1938
  Unterstützung für 1.8.7 wird es mindestens bis Sinatra 2.0 und Ruby 2.0 geben,
1807
- es sei denn, dass der unwahrscheinliche Fall eintritt und 1.8.8 rauskommt. Doch
1808
- selbst dann ist es eher wahrscheinlich, dass 1.8.7 weiterhin unterstützt wird.
1809
- <b>Ruby 1.8.6 wird nicht mehr unterstützt.</b> Soll Sinatra unter 1.8.6
1810
- eingesetzt werden, muss Sinatra 1.2 verwendet werden, dass noch bis zum
1939
+ es sei denn, dass der unwahrscheinliche Fall eintritt und 1.8.8 rauskommt.
1940
+ Doch selbst dann ist es eher wahrscheinlich, dass 1.8.7 weiterhin unterstützt
1941
+ wird. <b>Ruby 1.8.6 wird nicht mehr unterstützt.</b> Soll Sinatra unter 1.8.6
1942
+ eingesetzt werden, muss Sinatra 1.2 verwendet werden, dass noch bis zum
1811
1943
  Release von Sinatra 1.4.0 fortgeführt wird.
1812
1944
 
1813
1945
  [ Ruby 1.9.2 ]
@@ -1815,30 +1947,34 @@ Die folgenden Versionen werden offiziell unterstützt:
1815
1947
  momentan noch nicht kompatibel mit 1.9 sind. Version 1.9.2p0 sollte nicht
1816
1948
  verwendet werden, da unter Sinatra immer wieder Segfaults auftreten.
1817
1949
  Unterstützung wird es mindestens bis zum Release von Ruby 1.9.4/2.0 geben und
1818
- das letzte Sinatra Release für 1.9 wird so lange unterstützt, wie das Ruby
1950
+ das letzte Sinatra Release für 1.9 wird so lange unterstützt, wie das Ruby
1819
1951
  Core-Team 1.9 pflegt.
1820
1952
 
1821
1953
  [ Ruby 1.9.3 ]
1822
- Obwohl Tests bereits auf 1.9.3 laufen, sind bisher keine Applikationen auf
1954
+ 1.9.3 wird vollständig unterstützt. Momentan wird empfohlen auf einen
1955
+ höheren Pachtlevel zu warten, bevor Sinatra in der Produktion
1956
+ eingesetzt wird (aktueller Patchlevel ist p0). Bei einem Wechsel zu
1957
+ 1.9.3 werden alle Sessions ungültig.
1958
+ Obwohl Tests bereits auf 1.9.3 laufen, sind bisher keine Applikationen auf
1823
1959
  1.9.3 in Produktion bekannt. Ebenso wie bei 1.9.2 besteht die gleiche Warnung
1824
1960
  zum Patchlevel 0.
1825
-
1961
+
1826
1962
  [ Rubinius ]
1827
- Rubinius (rbx >= 1.2.4) wird offiziell unter Einbezug aller Templates
1828
- unterstützt.
1963
+ Rubinius (rbx >= 1.2.4) wird offiziell unter Einbezug aller Templates
1964
+ unterstützt. Die kommende 2.0 Version wird ebenfalls unterstützt.
1829
1965
 
1830
1966
  [ JRuby ]
1831
- JRuby wird offiziell unterstützt (JRuby >= 1.6.3). Probleme mit Template-
1832
- Bibliotheken Dritter sind nicht bekannt. Falls JRuby zum Einsatz kommt,
1833
- sollte aber darauf geachtet werden, dass ein JRuby-Rack-Handler zum Einsatz
1834
- kommt – der Thin-Web-Server wird bisher nicht unterstütz. JRubys
1967
+ JRuby wird offiziell unterstützt (JRuby >= 1.6.5). Probleme mit Template-
1968
+ Bibliotheken Dritter sind nicht bekannt. Falls JRuby zum Einsatz kommt,
1969
+ sollte aber darauf geachtet werden, dass ein JRuby-Rack-Handler zum Einsatz
1970
+ kommt – der Thin-Web-Server wird bisher nicht unterstütz. JRubys
1835
1971
  Unterstützung für C-Erweiterungen sind zur Zeit noch experimenteller Natur,
1836
- betrifft im Moment aber nur RDiscount und Redcarpet.
1972
+ betrifft im Moment aber nur RDiscount, Redcarpet und RedCloth.
1837
1973
 
1838
1974
 
1839
1975
  Weiterhin werden wir auf kommende Ruby-Versionen ein Auge haben.
1840
1976
 
1841
- Die nachfolgend aufgeführten Ruby-Implementierungen werden offiziell nicht von
1977
+ Die nachfolgend aufgeführten Ruby-Implementierungen werden offiziell nicht von
1842
1978
  Sinatra unterstützt, funktionieren aber normalerweise:
1843
1979
 
1844
1980
  * Ruby Enterprise Edition
@@ -1846,14 +1982,14 @@ Sinatra unterstützt, funktionieren aber normalerweise:
1846
1982
  * MacRuby, Maglev, IronRuby
1847
1983
  * Ruby 1.9.0 und 1.9.1 (wird jedoch nicht empfohlen, s.o.)
1848
1984
 
1849
- Nicht offiziell unterstützt bedeutet, dass wenn Sachen nicht funktionieren,
1850
- wir davon ausgehen, dass es nicht an Sinatra sondern an der jeweiligen
1985
+ Nicht offiziell unterstützt bedeutet, dass wenn Sachen nicht funktionieren,
1986
+ wir davon ausgehen, dass es nicht an Sinatra sondern an der jeweiligen
1851
1987
  Implentierung liegt.
1852
1988
 
1853
1989
  Im Rahmen unserer CI (Kontinuierlichen Integration) wird bereits ruby-head
1854
- (das kommende Ruby 1.9.4) mit eingebunden. Da noch alles im Fluss ist, kann zur
1855
- Zeit für nichts garantiert werden. Es kann aber erwartet werden, dass Ruby
1856
- 1.9.4p0 von Sinatra unterstützt werden wird.
1990
+ (das kommende Ruby 2.0.0) und 1.9.4 mit eingebunden. Da noch alles im Fluss ist,
1991
+ kann zur Zeit für nichts garantiert werden. Es kann aber erwartet werden, dass
1992
+ Ruby 2.0.0p0 und 1.9.4p0 von Sinatra unterstützt werden wird.
1857
1993
 
1858
1994
  Sinatra sollte auf jedem Betriebssystem laufen, dass den gewählten Ruby-
1859
1995
  Interpreter unterstützt.
@@ -1864,9 +2000,9 @@ Version von Ruby vor 1.8.7 laufen.
1864
2000
  == Der neuste Stand (The Bleeding Edge)
1865
2001
 
1866
2002
  Um auf dem neusten Stand zu bleiben, kann der Master-Branch verwendet werden.
1867
- Er sollte recht stabil sein. Ebenso gibt es von Zeit zu Zeit prerelease Gems,
2003
+ Er sollte recht stabil sein. Ebenso gibt es von Zeit zu Zeit prerelease Gems,
1868
2004
  die so installiert werden:
1869
-
2005
+
1870
2006
  gem install sinatra --pre
1871
2007
 
1872
2008
  === Mit Bundler
@@ -1884,7 +2020,7 @@ Inhalt erstellt:
1884
2020
 
1885
2021
  source :rubygems
1886
2022
  gem 'sinatra', :git => "git://github.com/sinatra/sinatra.git"
1887
-
2023
+
1888
2024
  # evtl. andere Abhängigkeiten
1889
2025
  gem 'haml' # z.B. wenn du Haml verwendest...
1890
2026
  gem 'activerecord', '~> 3.0' # ...oder ActiveRecord 3.x
@@ -1897,7 +2033,6 @@ Jetzt kannst du deine Applikation starten:
1897
2033
 
1898
2034
  bundle exec ruby myapp.rb
1899
2035
 
1900
-
1901
2036
  === Eigenes Repository
1902
2037
  Um auf dem neuesten Stand von Sinatras Code zu sein, kann eine lokale Kopie
1903
2038
  angelegt werden. Gestartet wird in der Anwendung mit dem <tt>sinatra/lib</tt>-
@@ -1932,14 +2067,14 @@ Aus der eigenen lokalen Kopie kann nun auch ein globales Gem gebaut werden:
1932
2067
  rake sinatra.gemspec
1933
2068
  rake install
1934
2069
 
1935
- Falls Gems als Root installiert werden sollen, sollte die letzte Zeile
2070
+ Falls Gems als Root installiert werden sollen, sollte die letzte Zeile
1936
2071
  folgendermaßen lauten:
1937
2072
 
1938
2073
  sudo rake install
1939
2074
 
1940
2075
  == Versions-Verfahren
1941
2076
 
1942
- Sinatra folgt dem sogenannten {Semantic Versioning}[http://semver.org/], d.h.
2077
+ Sinatra folgt dem sogenannten {Semantic Versioning}[http://semver.org/], d.h.
1943
2078
  SemVer und SemVerTag.
1944
2079
 
1945
2080
  == Mehr
@@ -1959,3 +2094,4 @@ SemVer und SemVerTag.
1959
2094
  oder für {HEAD}[http://rubydoc.info/github/sinatra/sinatra] auf
1960
2095
  http://rubydoc.info
1961
2096
  * {CI Server}[http://ci.rkh.im/view/Sinatra/]
2097
+