sinatra 1.3.0.e → 1.3.0.f

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/README.fr.rdoc CHANGED
@@ -1,12 +1,13 @@
1
- = Sinatra
1
+ = Sinatra
2
2
  <i>Attention : Ce document correspond à la traduction de la version anglaise et
3
3
  il n'est peut être plus à jour.</i>
4
4
 
5
- Sinatra est un DSL pour créer rapidement des applications web en Ruby et sans
6
- effort :
5
+ Sinatra est un DSL pour créer rapidement et facilement des applications web en
6
+ Ruby :
7
7
 
8
8
  # mon_application.rb
9
9
  require 'sinatra'
10
+
10
11
  get '/' do
11
12
  'Bonjour le monde !'
12
13
  end
@@ -18,14 +19,13 @@ Installez la gem et lancez avec :
18
19
 
19
20
  Le résultat est visible sur : http://localhost:4567
20
21
 
21
- Il est également recommandé d'exécuter <tt>gem install thin</tt>, que Sinatra
22
- utilisera si disponible.
22
+ Il est recommandé d'exécuter également <tt>gem install thin</tt>, pour que
23
+ Sinatra utilise le server Thin quand il est disponible.
23
24
 
24
25
  == Routes
25
26
 
26
27
  Dans Sinatra, une route est une méthode HTTP couplée à un masque (pattern)
27
- URL.
28
- Chaque route est associée à un bloc :
28
+ URL. Chaque route est associée à un bloc :
29
29
 
30
30
  get '/' do
31
31
  .. montrer quelque chose ..
@@ -51,8 +51,8 @@ Chaque route est associée à un bloc :
51
51
  .. apaiser quelquechose ..
52
52
  end
53
53
 
54
- Les routes sont comparées dans l'ordre où elles ont été définies. La première
55
- route qui correspond à la requête est invoquée.
54
+ Les routes sont évaluées dans l'ordre où elles ont été définies. La première
55
+ route qui correspond à la requête est appelée.
56
56
 
57
57
  Les masques peuvent inclure des paramètres nommés, accessibles par
58
58
  l'intermédiaire du hash <tt>params</tt> :
@@ -63,38 +63,50 @@ l'intermédiaire du hash <tt>params</tt> :
63
63
  "Bonjour #{params[:nom]} !"
64
64
  end
65
65
 
66
- Vous pouvez aussi les nommer directement dans les paramètres du bloc comme
67
- ceci :
66
+ Vous pouvez aussi accéder aux paramètres nommés directement grâce aux
67
+ paramètres du bloc comme ceci :
68
68
 
69
69
  get '/bonjour/:nom' do |n|
70
70
  "Bonjour #{n} !"
71
71
  end
72
72
 
73
73
  Une route peut contenir un splat (caractère joker), accessible par
74
- l'intermédiaire de la liste <tt>params[:splat]</tt> :
74
+ l'intermédiaire du tableau <tt>params[:splat]</tt> :
75
75
 
76
76
  get '/dire/*/a/*' do
77
- # répondrait à /dire/bonjour/a/monde
77
+ # répond à /dire/bonjour/a/monde
78
78
  params[:splat] # => ["bonjour", "monde"]
79
79
  end
80
80
 
81
81
  get '/telecharger/*.*' do
82
- # répondrait à /telecharger/chemin/vers/fichier.xml
82
+ # répond à /telecharger/chemin/vers/fichier.xml
83
83
  params[:splat] # => ["chemin/vers/fichier", "xml"]
84
84
  end
85
85
 
86
- Une route peut s'exprimer avec une Expression Régulière :
86
+ Ou par l'intermédiaire des paramètres du bloc :
87
+
88
+ get '/telecharger/*.*' do |chemin, ext|
89
+ [chemin, ext] # => ["path/to/file", "xml"]
90
+ end
91
+
92
+ Une route peut aussi être définie par une Expression Régulière :
87
93
 
88
94
  get %r{/bonjour/([\w]+)} do
89
95
  "Bonjour, #{params[:captures].first} !"
90
96
  end
91
97
 
92
- aussi on peut utiliser les paramètres de bloc :
98
+ encore on peut utiliser les paramètres de bloc :
93
99
 
94
100
  get %r{/bonjour/([\w]+)} do |c|
95
101
  "Bonjour, #{c} !"
96
102
  end
97
103
 
104
+ Les routes peuvent aussi comporter des paramètres optionnels :
105
+
106
+ get '/posts.?:format?' do
107
+ # répond à "GET /posts" et aussi à "GET /posts.json", "GET /posts.xml" etc...
108
+ end
109
+
98
110
  === Conditions
99
111
 
100
112
  Les routes peuvent définir toutes sortes de conditions, comme par exemple le
@@ -134,26 +146,45 @@ Vous pouvez facilement définir vos propres conditions :
134
146
  "Désolé, vous avez perdu."
135
147
  end
136
148
 
149
+ Utilisez un splat (caractère joker) dans le cas d'une condition qui prend
150
+ plusieurs valeurs :
151
+
152
+ set(:auth) do |*roles| # <- ici on utilise un splat
153
+ condition do
154
+ unless logged_in? && roles.any? {|role| current_user.in_role? role }
155
+ redirect "/login/", 303
156
+ end
157
+ end
158
+ end
159
+
160
+ get "/mon/compte/", :auth => [:user, :admin] do
161
+ "Informations sur votre compte"
162
+ end
163
+
164
+ get "/reserve/aux/admins/", :auth => :admin do
165
+ "Seuls les administrateurs sont acceptés ici !"
166
+ end
167
+
137
168
  === Valeurs de retour
138
169
 
139
- La valeur de retour d'un bloc définissant une route détermine le corps de la
140
- réponse qui sera transmise au client HTTP ou du moins au prochain middleware
141
- dans la pile Rack. Le plus généralement, il s'agit d'une chaîne de caractères,
170
+ La valeur renvoyée par le bloc correspondant à une route constitue le corps de
171
+ la réponse qui sera transmise au client HTTP ou du moins au prochain middleware
172
+ dans la pile Rack. Le plus souvent, il s'agit d'une chaîne de caractères,
142
173
  comme dans les exemples précédents. Cependant, d'autres valeurs sont
143
174
  acceptées.
144
175
 
145
- Vous pouvez renvoyer n'importe quel objet qui soit une réponse Rack valide, un
146
- corps de réponse Rack ou un code retour HTTP :
176
+ Vous pouvez renvoyer n'importe quel objet qu'il s'agisse d'une réponse Rack
177
+ valide, d'un corps de réponse Rack ou d'un code statut HTTP :
147
178
 
148
- * Un tableau de 3 éléments : <tt>[code retour (Fixnum), entêtes (Hash), corps
149
- de réponse (répondant à #each)]</tt>
150
- * Un tableau de 2 élements : <tt>[code retour (Fixnum), corps de réponse
179
+ * Un tableau de 3 éléments : <tt>[code statut (Fixnum), entêtes (Hash), corps
180
+ de la réponse (répondant à #each)]</tt>
181
+ * Un tableau de 2 élements : <tt>[code statut (Fixnum), corps de la réponse
151
182
  (répondant à #each)]</tt>
152
183
  * Un objet qui répond à <tt>#each</tt> et qui ne transmet que des chaînes de
153
184
  caractères au bloc fourni
154
- * Un Fixnum représentant le code retour
185
+ * Un Fixnum représentant le code statut
155
186
 
156
- Ainsi, on peut facilement implémenter un streaming par exemple :
187
+ Avec cela, on peut facilement implémenter un streaming par exemple :
157
188
 
158
189
  class Stream
159
190
  def each
@@ -163,11 +194,15 @@ Ainsi, on peut facilement implémenter un streaming par exemple :
163
194
 
164
195
  get('/') { Stream.new }
165
196
 
197
+ Vous pouvez aussi utiliser le helper +stream+ (présenté un peu plus loin) pour
198
+ éviter la surcharge et intégrer le traitement relatif au streaming dans le bloc
199
+ de code de la route.
200
+
166
201
  === Masques de route spécifiques
167
202
 
168
- Comme montré plus haut, Sinatra embarque le support pour l'utilisation de
169
- masques utilisant des chaînes de caractères ou des expressions régulières
170
- pour définir les routes. Toutefois, cela ne s'arrête pas là. Vous pouvez
203
+ Comme cela a été vu auparavant, Sinatra offre la possibilité d'utiliser des
204
+ masques sous forme de chaines de caractères ou des expressions régulières
205
+ pour définir les routes. Mais il est possible de faire bien plus. Vous pouvez
171
206
  facilement définir vos propres masques :
172
207
 
173
208
  class MasqueToutSauf
@@ -191,7 +226,7 @@ facilement définir vos propres masques :
191
226
  # ...
192
227
  end
193
228
 
194
- Notez que l'exemple ci-dessus est bien trop compliqué et le même résultat
229
+ Notez que l'exemple ci-dessus est bien trop compliqué et que le même résultat
195
230
  peut être obtenu avec :
196
231
 
197
232
  get // do
@@ -207,45 +242,49 @@ Ou bien en utilisant la forme négative :
207
242
 
208
243
  == Fichiers statiques
209
244
 
210
- Par défaut, le dossier <tt>./public</tt> est utilisé pour servir les fichiers
211
- statiques. Vous pouvez changer ce dossier pour un autre nom grâce au paramètre
212
- <tt>:public</tt> :
245
+ Les fichiers du dossier <tt>./public</tt> sont servis de façon statique. Vous
246
+ avez la possibilité d'utiliser un autre répertoire en définissant le paramètre
247
+ <tt>:public_folder</tt> :
213
248
 
214
- set :public, File.dirname(__FILE__) + '/statique'
249
+ set :public_folder, File.dirname(__FILE__) + '/statique'
215
250
 
216
- Notez que le nom du dossier public n'est pas inclus dans l'URL. Un fichier
217
- sous <tt>./public/css/style.css</tt> est appelé avec l'URL : <tt>http://exemple.com/css/style.css</tt>.
251
+ Notez que le nom du dossier public n'apparait pas dans l'URL. Le fichier
252
+ <tt>./public/css/style.css</tt> sera appelé via l'URL :
253
+ <tt>http://exemple.com/css/style.css</tt>.
254
+
255
+ Utilisez le paramètre <tt>:static_cache_control</tt> pour ajouter l'information
256
+ d'en-tête <tt>Cache-Control</tt> (voir plus loin).
218
257
 
219
258
  == Vues / Templates
220
259
 
221
- Chaque langage de template est exposé via sa propre méthode de rendu.
222
- Ces méthodes retournent tout simplement une chaîne de caractères.
260
+ Chaqie langage de template est disponible via sa propre méthode de rendu,
261
+ lesquelles renvoient tout simplement une chaîne de caractères.
223
262
 
224
263
  get '/' do
225
264
  erb :index
226
265
  end
227
266
 
228
- Ceci effectue le rendu de <tt>views/index.erb</tt>.
267
+ Ceci effectue le rendu de la vue <tt>views/index.erb</tt>.
229
268
 
230
- Plutôt que le nom d'un template, vous pouvez directement passer le contenu du
231
- template :
269
+ Plutôt que d'utiliser le nom d'un template, vous pouvez directement passer
270
+ le contenu du template :
232
271
 
233
272
  get '/' do
234
273
  code = "<%= Time.now %>"
235
274
  erb code
236
275
  end
237
276
 
238
- Les templates prennent un second paramètre, un hash d'options :
277
+ Les méthodes de templates acceptent un second paramètre, un hash d'options :
239
278
 
240
279
  get '/' do
241
280
  erb :index, :layout => :post
242
281
  end
243
282
 
244
- Cecie effectue le rendu de <tt>views/index.erb</tt> embarqué dans
245
- <tt>views/post.erb</tt> (<tt>views/layout.erb</tt> est la valeur par défaut
246
- si ce fichier existe).
283
+ Ceci effectuera le rendu de la vue <tt>views/index.erb</tt> en l'intégrant
284
+ au +layout+ <tt>views/post.erb</tt> (les vues Erb sont intégrées par défaut
285
+ au +layout+ <tt>views/layout.erb</tt> quand ce fichier existe).
247
286
 
248
- Toute option que Sinatra ne comprends pas sera passée au moteur de rendu :
287
+ Toute option que Sinatra ne comprend pas sera passée au moteur de rendu :
249
288
 
250
289
  get '/' do
251
290
  haml :index, :format => :html5
@@ -280,8 +319,8 @@ Options disponibles :
280
319
 
281
320
  [layout]
282
321
  S'il faut ou non utiliser un +layout+ (+true+ or +false+). Indique le
283
- template à utiliser lorsque c'est un Symbol. Exemple : <tt>erb :index,
284
- :layout => request.xhr?</tt>.
322
+ template à utiliser lorsque c'est un symbole. Exemple : <tt>erb :index,
323
+ :layout => !request.xhr?</tt>.
285
324
 
286
325
  [content_type]
287
326
  Content-Type que le template produit, dépend par défaut du langage de
@@ -302,17 +341,17 @@ Les templates sont supposés se trouver directement dans le dossier
302
341
 
303
342
  set :views, settings.root + '/templates'
304
343
 
305
- Il est important de noter que les templates sont toujours référencés
306
- sous forme de symboles, même s'il s'agit d'un sous-répertoire (dans ce
307
- cas, utilisez <tt>:'sous_repertoire/template'</tt>). Vous devez utiliser un
308
- symbole car les méthodes de rendu évalueront le contenu des chaînes de
344
+ Il est important de se souvenir que les templates sont toujours référencés
345
+ sous forme de symboles, même lorsqu'ils sont dans un sous-répertoire (dans
346
+ ce cas, utilisez <tt>:'sous_repertoire/template'</tt>). Il faut utiliser
347
+ un symbole car les méthodes de rendu évaluent le contenu des chaînes de
309
348
  caractères au lieu de les considérer comme un chemin vers un fichier.
310
349
 
311
350
  === Langages de template disponibles
312
351
 
313
352
  Certains langages ont plusieurs implémentations. Pour préciser l'implémentation
314
- à utiliser (et garantir l'aspect thread-safe), vous devriez simplement la
315
- charger au préalable :
353
+ à utiliser (et garantir l'aspect thread-safe), vous devez simplement l'avoir
354
+ chargée au préalable :
316
355
 
317
356
  require 'rdiscount' # ou require 'bluecloth'
318
357
  get('/') { markdown :index }
@@ -327,7 +366,7 @@ Exemple:: <tt>haml :index, :format => :html5</tt>
327
366
 
328
367
  Dépendances:: {erubis}[http://www.kuwata-lab.com/erubis/] ou
329
368
  erb (inclus avec Ruby)
330
- Extensions de fichier:: <tt>.erb</tt>, <tt>.rhtml</tt> or <tt>.erubis</tt>
369
+ Extensions de fichier:: <tt>.erb</tt>, <tt>.rhtml</tt> ou <tt>.erubis</tt>
331
370
  (Erubis seulement)
332
371
  Exemple:: <tt>erb :index</tt>
333
372
 
@@ -335,7 +374,7 @@ Exemple:: <tt>erb :index</tt>
335
374
 
336
375
  Dépendances:: {builder}[http://builder.rubyforge.org/]
337
376
  Extensions de fichier:: <tt>.builder</tt>
338
- Exemple:: <tt>builder { |xml| xml.em "hi" }</tt>
377
+ Exemple:: <tt>builder { |xml| xml.em "salut" }</tt>
339
378
 
340
379
  Ce moteur accepte également un bloc pour des templates en ligne (voir exemple).
341
380
 
@@ -343,7 +382,7 @@ Ce moteur accepte également un bloc pour des templates en ligne (voir exemple).
343
382
 
344
383
  Dépendances:: {nokogiri}[http://nokogiri.org/]
345
384
  Extensions de fichier:: <tt>.nokogiri</tt>
346
- Exemple:: <tt>builder { |xml| xml.em "hi" }</tt>
385
+ Exemple:: <tt>builder { |xml| xml.em "salut" }</tt>
347
386
 
348
387
  Ce moteur accepte également un bloc pour des templates en ligne (voir exemple).
349
388
 
@@ -381,10 +420,10 @@ Dépendances:: {rdiscount}[https://github.com/rtomayko/rdiscount],
381
420
  {bluecloth}[http://deveiate.org/projects/BlueCloth],
382
421
  {kramdown}[http://kramdown.rubyforge.org/] *ou*
383
422
  {maruku}[http://maruku.rubyforge.org/]
384
- Extensions de fichier:: <tt>.markdown</tt>, <tt>.mkd</tt> and <tt>.md</tt>
423
+ Extensions de fichier:: <tt>.markdown</tt>, <tt>.mkd</tt> et <tt>.md</tt>
385
424
  Exemple:: <tt>markdown :index, :layout_engine => :erb</tt>
386
425
 
387
- Il n'est pas possible d'appeler des méthodes depuis markdown, ni même de lui
426
+ Il n'est pas possible d'appeler des méthodes depuis markdown, ni de lui
388
427
  passer des variables locales. Par conséquent, il sera souvent utilisé en
389
428
  combinaison avec un autre moteur de rendu :
390
429
 
@@ -398,8 +437,8 @@ templates :
398
437
 
399
438
  Comme vous ne pouvez pas appeler de Ruby au sein de Markdown, vous ne pouvez
400
439
  pas utiliser de +layouts+ écrits en Markdown. Toutefois, il est possible
401
- d'utiliser un autre moteur de rendu pour le template que pour le +layout+ en
402
- utilisant l'option <tt>:layout_engine</tt>.
440
+ d'utiliser un moteur de rendu différent pour le template et pour le +layout+
441
+ en utilisant l'option <tt>:layout_engine</tt>.
403
442
 
404
443
  === Templates Textile
405
444
 
@@ -407,7 +446,7 @@ Dépendances:: {RedCloth}[http://redcloth.org/]
407
446
  Extensions de fichier:: <tt>.textile</tt>
408
447
  Exemple:: <tt>textile :index, :layout_engine => :erb</tt>
409
448
 
410
- Il n'est pas possible d'appeler des méthodes depuis textile, ni même de lui
449
+ Il n'est pas possible d'appeler des méthodes depuis textile, ni de lui
411
450
  passer des variables locales. Par conséquent, il sera souvent utilisé en
412
451
  combinaison avec un autre moteur de rendu :
413
452
 
@@ -421,16 +460,16 @@ templates :
421
460
 
422
461
  Comme vous ne pouvez pas appeler de Ruby au sein de Textile, vous ne pouvez
423
462
  pas utiliser de +layouts+ écrits en Textile. Toutefois, il est possible
424
- d'utiliser un autre moteur de rendu pour le template que pour le +layout+ en
425
- utilisant l'option <tt>:layout_engine</tt>.
463
+ d'utiliser un moteur de rendu différent pour le template et pour le +layout+
464
+ en utilisant l'option <tt>:layout_engine</tt>.
426
465
 
427
466
  === Templates RDoc
428
467
 
429
468
  Dépendances:: {rdoc}[http://rdoc.rubyforge.org/]
430
469
  Extensions de fichier:: <tt>.rdoc</tt>
431
- Exemple:: <tt>textile :README, :layout_engine => :erb</tt>
470
+ Exemple:: <tt>rdoc :README, :layout_engine => :erb</tt>
432
471
 
433
- Il n'est pas possible d'appeler des méthodes depuis rdoc, ni même de lui
472
+ Il n'est pas possible d'appeler des méthodes depuis rdoc, ni de lui
434
473
  passer des variables locales. Par conséquent, il sera souvent utilisé en
435
474
  combinaison avec un autre moteur de rendu :
436
475
 
@@ -444,8 +483,8 @@ templates :
444
483
 
445
484
  Comme vous ne pouvez pas appeler de Ruby au sein de RDoc, vous ne pouvez
446
485
  pas utiliser de +layouts+ écrits en RDoc. Toutefois, il est possible
447
- d'utiliser un autre moteur de rendu pour le template que pour le +layout+ en
448
- utilisant l'option <tt>:layout_engine</tt>.
486
+ d'utiliser un moteur de rendu différent pour le template et pour le +layout+
487
+ en utilisant l'option <tt>:layout_engine</tt>.
449
488
 
450
489
  === Templates Radius
451
490
 
@@ -454,7 +493,7 @@ Extensions de fichier:: <tt>.radius</tt>
454
493
  Exemple:: <tt>radius :index, :locals => { :key => 'value' }</tt>
455
494
 
456
495
  Comme vous ne pouvez pas appeler de méthodes Ruby depuis un template Radius,
457
- vous aurez sûrement à lui passer des variables locales
496
+ vous aurez sûrement à lui passer des variables locales.
458
497
 
459
498
  === Templates Markaby
460
499
 
@@ -476,7 +515,7 @@ Dépendances:: {creole}[https://github.com/minad/creole]
476
515
  Extensions de fichier:: <tt>.creole</tt>
477
516
  Exemple:: <tt>creole :wiki, :layout_engine => :erb</tt>
478
517
 
479
- Il n'est pas possible d'appeler des méthodes depuis creole, ni même de lui
518
+ Il n'est pas possible d'appeler des méthodes depuis creole, ni de lui
480
519
  passer des variables locales. Par conséquent, il sera souvent utilisé en
481
520
  combinaison avec un autre moteur de rendu :
482
521
 
@@ -490,8 +529,8 @@ templates :
490
529
 
491
530
  Comme vous ne pouvez pas appeler de Ruby au sein de Creole, vous ne pouvez
492
531
  pas utiliser de +layouts+ écrits en Creole. Toutefois, il est possible
493
- d'utiliser un autre moteur de rendu pour le template que pour le +layout+ en
494
- utilisant l'option <tt>:layout_engine</tt>.
532
+ d'utiliser un moteur de rendu différent pour le template et pour le +layout+
533
+ en utilisant l'option <tt>:layout_engine</tt>.
495
534
 
496
535
  === Templates CoffeeScript
497
536
 
@@ -506,7 +545,7 @@ Exemple:: <tt>coffee :index</tt>
506
545
  haml '%div.title Bonjour le monde'
507
546
  end
508
547
 
509
- Générera le template embarqué spécifié dans la chaîne de caractères.
548
+ Générera le code du template spécifié dans la chaîne de caractères.
510
549
 
511
550
  === Accéder aux variables dans un Template
512
551
 
@@ -718,7 +757,7 @@ Si vous souhaitez avoir plus de contrôle, vous pouvez également enregistrer un
718
757
 
719
758
  set :sessions, :domain => 'foo.com'
720
759
 
721
- == Halt
760
+ === Halt
722
761
 
723
762
  Pour arrêter immédiatement la requête dans un filtre ou un gestionnaire de
724
763
  route :
@@ -745,7 +784,7 @@ Bien sûr il est possible de combiner un template avec +halt+ :
745
784
 
746
785
  halt erb(:erreur)
747
786
 
748
- == Passer
787
+ === Passer
749
788
 
750
789
  Une route peut passer le relais aux autres routes qui correspondent également
751
790
  avec <tt>pass</tt> :
@@ -816,7 +855,7 @@ retour et les entêtes :
816
855
  get '/foo' do
817
856
  status 418
818
857
  headers \
819
- "Allow" => "BREW, POST, GET, PROPFIND, WHEN"
858
+ "Allow" => "BREW, POST, GET, PROPFIND, WHEN",
820
859
  "Refresh" => "Refresh: 20; http://www.ietf.org/rfc/rfc2324.txt"
821
860
  body "Je suis une théière !"
822
861
  end
@@ -824,6 +863,56 @@ retour et les entêtes :
824
863
  Comme +body+, +headers+ et +status+ peuvent être utilisés sans arguments
825
864
  pour accéder à leurs valeurs.
826
865
 
866
+ === Faire du streaming
867
+
868
+ Il y a des cas où vous voulez commencer à renvoyer des données pendant que
869
+ vous êtes en train de générer le reste de la réponse. Dans les cas les plus
870
+ extrèmes, vous souhaitez continuer à envoyer des données tant que le client
871
+ n'abandonne pas la connection. Vous pouvez alors utiliser le helper +stream+
872
+ pour éviter de créer votre propre système :
873
+
874
+ get '/' do
875
+ stream do |out|
876
+ out << "Ca va être hallu -\n"
877
+ sleep 0.5
878
+ out << " (attends la suite) \n"
879
+ sleep 1
880
+ out << "- cinant !\n"
881
+ end
882
+ end
883
+
884
+ Cela permet d'implémenter des API de streaming ou de
885
+ {Server Sent Events}[http://dev.w3.org/html5/eventsource/] et peut servir de
886
+ base pour des {WebSockets}[http://en.wikipedia.org/wiki/WebSocket]. Vous
887
+ pouvez aussi l'employer pour augmenter le débit quand une partie du contenu
888
+ provient d'une resource lente.
889
+
890
+ Le fonctionnement du streaming, notamment le nombre de requêtes simultanées,
891
+ dépend énormément du serveur web utilisé. Certains ne prennent pas du tout en
892
+ charge le streaming (WEBRick par exemple). Lorsque le serveur ne gère pas le
893
+ streaming, la partie body de la réponse sera envoyée au client en une seule
894
+ fois, après que l'exécution du bloc passé au helper +stream+ sera terminée.
895
+
896
+ En utilisant le helper +stream+ avec le paramètre +keep_open+, il n'appelera
897
+ pas la méthode +close+ du flux, vous laissant la possibilité de le fermer à
898
+ tout moment au cours de l'exécution. Ceci ne fonctionne qu'avec les serveurs
899
+ evented (ie non threadés) tels que Thin et Rainbows. Les autres serveurs
900
+ fermeront malgré tout le flux.
901
+
902
+ set :server, :thin
903
+ connections = []
904
+
905
+ get '/' do
906
+ # conserve le flux ouvert
907
+ stream(:keep_open) { |out| connections << out }
908
+ end
909
+
910
+ post '/' do
911
+ # écrit dans tous les flux ouverts
912
+ connections.each { |out| out << params[:message] << "\n" }
913
+ "message sent"
914
+ end
915
+
827
916
  === Journalisation (Logging)
828
917
 
829
918
  Dans le contexte de la requête, la méthode utilitaire +logger+ expose une
@@ -911,7 +1000,7 @@ Pour passer des arguments à une redirection, ajoutez-les soit à la requête :
911
1000
 
912
1001
  Ou bien utilisez une session :
913
1002
 
914
- enable :session
1003
+ enable :sessions
915
1004
 
916
1005
  get '/foo' do
917
1006
  session[:secret] = 'foo'
@@ -946,7 +1035,7 @@ Si vous utilisez la méthode +expires+ pour définir l'entête correspondant,
946
1035
  expires 500, :public, :must_revalidate
947
1036
  end
948
1037
 
949
- Pour utiliser correctement les caches, vous devriez utiliser +etag+ et
1038
+ Pour utiliser correctement les caches, vous devriez utiliser +etag+ ou
950
1039
  +last_modified+. Il est recommandé d'utiliser ces méthodes *avant* de faire
951
1040
  d'importantes modifications, car elles vont immédiatement déclencher la réponse
952
1041
  si le client a déjà la version courante dans son cache :
@@ -965,7 +1054,7 @@ Il est également possible d'utiliser un
965
1054
 
966
1055
  Ces méthodes ne sont pas chargées de mettre des données en cache, mais elles
967
1056
  fournissent les informations nécessaires pour votre cache. Si vous êtes à la
968
- recherche de solutions rapides de cache, essayez
1057
+ recherche de solutions rapides pour un reverse-proxy de cache, essayez
969
1058
  {rack-cache}[http://rtomayko.github.com/rack-cache/] :
970
1059
 
971
1060
  require "rack/cache"
@@ -1016,7 +1105,7 @@ Si le gestionnaire Rack le supporte, d'autres moyens que le +streaming+ via le
1016
1105
  processus Ruby seront utilisés. Si vous utilisez cette méthode, Sinatra gérera
1017
1106
  automatiquement les requêtes de type +range+.
1018
1107
 
1019
- == Accéder à l'objet requête
1108
+ === Accéder à l'objet requête
1020
1109
 
1021
1110
  L'objet correspondant à la requête envoyée peut être récupéré dans le contexte
1022
1111
  de la requête (filtres, routes, gestionnaires d'erreur) au moyen de la méthode
@@ -1090,6 +1179,38 @@ Vous pouvez également lui passer un nom de fichier :
1090
1179
  "enregistre-le !"
1091
1180
  end
1092
1181
 
1182
+ === Gérer Date et Time
1183
+
1184
+ Sinatra fourni un helper +time_for+ pour convertir une valeur donnée en
1185
+ objet +Time+. Il peut aussi faire la conversion à partir d'objets +DateTime+,
1186
+ +Date+ ou de classes similaires.
1187
+
1188
+ get '/' do
1189
+ pass if Time.now > time_for('Dec 23, 2012')
1190
+ "encore temps"
1191
+ end
1192
+
1193
+ Cette méthode est utilisée en interne par +expires+, +last_modified+ et
1194
+ consorts. Par conséquent, vous pouvez très facilement étendre le
1195
+ fonctionnement de ces méthodes en surchargeant le helper +time_for+ dans
1196
+ votre application :
1197
+
1198
+ helpers do
1199
+ def time_for(value)
1200
+ case value
1201
+ when :yesterday then Time.now - 24*60*60
1202
+ when :tomorrow then Time.now + 24*60*60
1203
+ else super
1204
+ end
1205
+ end
1206
+ end
1207
+
1208
+ get '/' do
1209
+ last_modified :yesterday
1210
+ expires :tomorrow
1211
+ "salut"
1212
+ end
1213
+
1093
1214
  === Chercher les fichiers de templates
1094
1215
 
1095
1216
  La méthode <tt>find_template</tt> est utilisée pour trouver les fichiers de
@@ -1243,7 +1364,7 @@ Vous pouvez accéder à ces paramètres via <tt>settings</tt> :
1243
1364
  comportera comme <tt>redirect to('/foo')</tt>.
1244
1365
  Désactivé par défaut.
1245
1366
 
1246
- [public] dossier duquel les fichiers publics sont servis
1367
+ [public_folder] dossier duquel les fichiers publics sont servis
1247
1368
 
1248
1369
  [reload_templates] si oui ou non les templates doivent être rechargés
1249
1370
  entre les requêtes. Activé en mode développement.
@@ -1275,6 +1396,9 @@ Vous pouvez accéder à ces paramètres via <tt>settings</tt> :
1275
1396
  Activé par défaut pour le style classique, désactivé pour
1276
1397
  le style modulaire.
1277
1398
 
1399
+ [threaded] à définir à +true+ pour indiquer à Thin d'utiliser
1400
+ <tt>EventMachine.defer</tt> pour traiter la requête.
1401
+
1278
1402
  [views] dossier des vues.
1279
1403
 
1280
1404
  == Gérer les erreurs
@@ -1585,6 +1709,7 @@ sans avoir à les assigner à une constante, vous pouvez le faire grâce à
1585
1709
 
1586
1710
  L'application dont elle hérite peut être passé en argument optionnel :
1587
1711
 
1712
+ # config.ru
1588
1713
  require 'sinatra/base'
1589
1714
 
1590
1715
  controleur = Sinatra.new do