sinatra 1.4.6 → 1.4.7

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.

@@ -1,11 +1,11 @@
1
1
  # Sinatra
2
2
  *Attention : Ce document correspond à la traduction de la version anglaise et
3
- il n'est peut être plus à jour.*
3
+ il n'est peut-être plus à jour.*
4
4
 
5
- Sinatra est un [DSL](http://fr.wikipedia.org/wiki/Langage_dédié) pour
5
+ Sinatra est un [DSL](https://fr.wikipedia.org/wiki/Langage_dédié) pour
6
6
  créer rapidement et facilement des applications web en Ruby :
7
7
 
8
- ``` ruby
8
+ ```ruby
9
9
  # mon_application.rb
10
10
  require 'sinatra'
11
11
 
@@ -16,17 +16,18 @@ end
16
16
 
17
17
  Installez la gem Sinatra :
18
18
 
19
- ``` shell
19
+ ```shell
20
20
  gem install sinatra
21
21
  ```
22
22
 
23
23
  Puis lancez votre programme :
24
24
 
25
- ``` shell
25
+ ```shell
26
26
  ruby mon_application.rb
27
27
  ```
28
28
 
29
- Le résultat est visible sur : http://localhost:4567
29
+ Le résultat est visible sur :
30
+ [http://localhost:4567](http://localhost:4567)
30
31
 
31
32
  Il est recommandé d'exécuter également `gem install thin`, pour que
32
33
  Sinatra utilise le server Thin quand il est disponible.
@@ -75,7 +76,7 @@ Sinatra utilise le server Thin quand il est disponible.
75
76
  * [Halt](#halt)
76
77
  * [Passer](#passer)
77
78
  * [Déclencher une autre route](#déclencher-une-autre-route)
78
- * [Définir le corps, le code retour et les entêtes](#définir-le-corps-le-code-retour-et-les-entêtes)
79
+ * [Définir le corps, le code retour et les en-têtes](#définir-le-corps-le-code-retour-et-les-en-têtes)
79
80
  * [Faire du streaming](#faire-du-streaming)
80
81
  * [Journalisation (Logging)](#journalisation-logging)
81
82
  * [Types Mime](#types-mime)
@@ -108,6 +109,7 @@ Sinatra utilise le server Thin quand il est disponible.
108
109
  * [Contexte de la requête/instance](#contexte-de-la-requêteinstance)
109
110
  * [Le contexte de délégation](#le-contexte-de-délégation)
110
111
  * [Ligne de commande](#ligne-de-commande)
112
+ * [Multi-threading](#multi-threading)
111
113
  * [Configuration nécessaire](#configuration-nécessaire)
112
114
  * [Essuyer les plâtres](#essuyer-les-plâtres)
113
115
  * [Installer avec Bundler](#installer-avec-bundler)
@@ -121,7 +123,7 @@ Sinatra utilise le server Thin quand il est disponible.
121
123
  Dans Sinatra, une route est une méthode HTTP couplée à un masque (pattern)
122
124
  URL. Chaque route est associée à un bloc :
123
125
 
124
- ``` ruby
126
+ ```ruby
125
127
  get '/' do
126
128
  .. montrer quelque chose ..
127
129
  end
@@ -161,7 +163,7 @@ route qui correspond à la requête est appelée.
161
163
  Les masques peuvent inclure des paramètres nommés, accessibles par
162
164
  l'intermédiaire du hash `params` :
163
165
 
164
- ``` ruby
166
+ ```ruby
165
167
  get '/bonjour/:nom' do
166
168
  # répond aux requêtes "GET /bonjour/foo" et "GET /bonjour/bar"
167
169
  # params['nom'] est 'foo' ou 'bar'
@@ -172,7 +174,7 @@ end
172
174
  Vous pouvez aussi accéder aux paramètres nommés directement grâce aux
173
175
  paramètres du bloc comme ceci :
174
176
 
175
- ``` ruby
177
+ ```ruby
176
178
  get '/bonjour/:nom' do |n|
177
179
  # répond aux requêtes "GET /bonjour/foo" et "GET /bonjour/bar"
178
180
  # params['nom'] est 'foo' ou 'bar'
@@ -181,10 +183,10 @@ get '/bonjour/:nom' do |n|
181
183
  end
182
184
  ```
183
185
 
184
- Une route peut contenir un splat (caractère joker), accessible par
186
+ Une route peut contenir un `splat` (caractère joker), accessible par
185
187
  l'intermédiaire du tableau `params['splat']` :
186
188
 
187
- ``` ruby
189
+ ```ruby
188
190
  get '/dire/*/a/*' do
189
191
  # répond à /dire/bonjour/a/monde
190
192
  params['splat'] # => ["bonjour", "monde"]
@@ -198,7 +200,7 @@ end
198
200
 
199
201
  Ou par l'intermédiaire des paramètres du bloc :
200
202
 
201
- ``` ruby
203
+ ```ruby
202
204
  get '/telecharger/*.*' do |chemin, ext|
203
205
  [chemin, ext] # => ["path/to/file", "xml"]
204
206
  end
@@ -206,7 +208,7 @@ end
206
208
 
207
209
  Une route peut aussi être définie par une expression régulière :
208
210
 
209
- ``` ruby
211
+ ```ruby
210
212
  get /\A\/bonjour\/([\w]+)\z/ do
211
213
  "Bonjour, #{params['captures'].first} !"
212
214
  end
@@ -214,28 +216,29 @@ end
214
216
 
215
217
  Là encore on peut utiliser les paramètres de bloc :
216
218
 
217
- ``` ruby
219
+ ```ruby
218
220
  get %r{/bonjour/([\w]+)} do |c|
221
+ # répond à "GET /meta/bonjour/monde", "GET /bonjour/monde/1234" etc.
219
222
  "Bonjour, #{c} !"
220
223
  end
221
224
  ```
222
225
 
223
226
  Les routes peuvent aussi comporter des paramètres optionnels :
224
227
 
225
- ``` ruby
226
- get '/posts.?:format?' do
227
- # répond à "GET /posts" et aussi à "GET /posts.json", "GET /posts.xml" etc...
228
+ ```ruby
229
+ get '/articles/:format?' do
230
+ # répond à "GET /articles/" ou avec une extension "GET /articles/json", "GET /articles/xml" etc...
228
231
  end
229
232
  ```
230
233
 
231
234
  Ainsi que des paramètres d'URL :
232
235
 
233
- ``` ruby
234
- get '/posts' do
235
- # répond à "GET /posts?titre=foo&auteur=bar"
236
+ ```ruby
237
+ get '/articles' do
238
+ # répond à "GET /articles?titre=foo&auteur=bar"
236
239
  titre = params['titre']
237
240
  auteur = params['auteur']
238
- # utilise les variables titre et auteur, ces paramètres d'URL sont optionnels pour la route /posts
241
+ # utilise les variables titre et auteur qui sont des paramètres d'URL optionnels pour la route /articles
239
242
  end
240
243
  ```
241
244
 
@@ -248,7 +251,7 @@ avant d'être comparée à vos routes.
248
251
  Les routes peuvent définir toutes sortes de conditions, comme par exemple le
249
252
  "user agent" :
250
253
 
251
- ``` ruby
254
+ ```ruby
252
255
  get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
253
256
  "Vous utilisez Songbird version #{params['agent'][0]}"
254
257
  end
@@ -260,7 +263,7 @@ end
260
263
 
261
264
  Les autres conditions disponibles sont `host_name` et `provides` :
262
265
 
263
- ``` ruby
266
+ ```ruby
264
267
  get '/', :host_name => /^admin\./ do
265
268
  "Zone Administrateur, Accès refusé !"
266
269
  end
@@ -273,13 +276,14 @@ get '/', :provides => ['rss', 'atom', 'xml'] do
273
276
  builder :feed
274
277
  end
275
278
  ```
279
+ `provides` se base sur l'en-tête `Accept` de la requête.
276
280
 
277
281
  Vous pouvez facilement définir vos propres conditions :
278
282
 
279
- ``` ruby
280
- set(:probability) { |value| condition { rand <= value } }
283
+ ```ruby
284
+ set(:chance) { |valeur| condition { rand <= valeur } }
281
285
 
282
- get '/gagner_une_voiture', :probability => 0.1 do
286
+ get '/gagner_une_voiture', :chance => 0.1 do
283
287
  "Vous avez gagné !"
284
288
  end
285
289
 
@@ -288,10 +292,10 @@ get '/gagner_une_voiture' do
288
292
  end
289
293
  ```
290
294
 
291
- Utilisez un splat (caractère joker) dans le cas d'une condition qui prend
295
+ Utilisez un `splat` (caractère joker) dans le cas d'une condition qui prend
292
296
  plusieurs valeurs :
293
297
 
294
- ``` ruby
298
+ ```ruby
295
299
  set(:auth) do |*roles| # <- ici on utilise un splat
296
300
  condition do
297
301
  unless logged_in? && roles.any? {|role| current_user.in_role? role }
@@ -312,7 +316,7 @@ end
312
316
  ## Valeurs de retour
313
317
 
314
318
  La valeur renvoyée par le bloc correspondant à une route constitue le corps de
315
- la réponse qui sera transmise au client HTTP ou du moins au prochain middleware
319
+ la réponse qui sera transmise au client HTTP ou du moins au prochain `middleware`
316
320
  dans la pile Rack. Le plus souvent, il s'agit d'une chaîne de caractères,
317
321
  comme dans les exemples précédents. Cependant, d'autres valeurs sont
318
322
  acceptées.
@@ -320,7 +324,7 @@ acceptées.
320
324
  Vous pouvez renvoyer n'importe quel objet qu'il s'agisse d'une réponse Rack
321
325
  valide, d'un corps de réponse Rack ou d'un code statut HTTP :
322
326
 
323
- * Un tableau de 3 éléments : `[code statut (Fixnum), entêtes (Hash), corps
327
+ * Un tableau de 3 éléments : `[code statut (Fixnum), en-têtes (Hash), corps
324
328
  de la réponse (répondant à #each)]`
325
329
  * Un tableau de 2 élements : `[code statut (Fixnum), corps de la réponse
326
330
  (répondant à #each)]`
@@ -328,9 +332,9 @@ valide, d'un corps de réponse Rack ou d'un code statut HTTP :
328
332
  caractères au bloc fourni
329
333
  * Un Fixnum représentant le code statut
330
334
 
331
- Avec cela, on peut facilement implémenter un streaming par exemple :
335
+ Ainsi, on peut facilement implémenter un exemple de streaming :
332
336
 
333
- ``` ruby
337
+ ```ruby
334
338
  class Stream
335
339
  def each
336
340
  100.times { |i| yield "#{i}\n" }
@@ -341,7 +345,7 @@ get('/') { Stream.new }
341
345
  ```
342
346
 
343
347
  Vous pouvez aussi utiliser le helper `stream` (présenté un peu plus loin) pour
344
- éviter la surcharge et intégrer le traitement relatif au streaming dans le bloc
348
+ éviter les répétitions et intégrer le traitement relatif au streaming dans le bloc
345
349
  de code de la route.
346
350
 
347
351
  ## Masques de route spécifiques
@@ -351,7 +355,7 @@ masques sous forme de chaines de caractères ou des expressions régulières
351
355
  pour définir les routes. Mais il est possible de faire bien plus. Vous pouvez
352
356
  facilement définir vos propres masques :
353
357
 
354
- ``` ruby
358
+ ```ruby
355
359
  class MasqueToutSauf
356
360
  Masque = Struct.new(:captures)
357
361
 
@@ -374,19 +378,18 @@ get tout_sauf("/index") do
374
378
  end
375
379
  ```
376
380
 
377
- Notez que l'exemple ci-dessus est bien trop compliqué et que le même résultat
378
- peut être obtenu avec :
381
+ Notez que l'exemple ci-dessus est plus compliqué qu'il ne devrait et peut être implémenté de la façon suivante :
379
382
 
380
- ``` ruby
383
+ ```ruby
381
384
  get // do
382
385
  pass if request.path_info == "/index"
383
386
  # ...
384
387
  end
385
388
  ```
386
389
 
387
- Ou bien en utilisant la forme négative :
390
+ Ou bien en utilisant cette expression regulière :
388
391
 
389
- ``` ruby
392
+ ```ruby
390
393
  get %r{^(?!/index$)} do
391
394
  # ...
392
395
  end
@@ -394,68 +397,64 @@ end
394
397
 
395
398
  ## Fichiers statiques
396
399
 
397
- Les fichiers du dossier `./public` sont servis de façon statique. Vous
398
- avez la possibilité d'utiliser un autre répertoire en définissant le paramètre
399
- `:public_folder` :
400
+ Les fichiers du dossier `./public` sont servis de façon statique. Vous pouvez spécifier un autre dossier avec le paramètre `:public_folder` :
400
401
 
401
- ``` ruby
402
+ ```ruby
402
403
  set :public_folder, File.dirname(__FILE__) + '/statique'
403
404
  ```
404
405
 
405
406
  Notez que le nom du dossier public n'apparait pas dans l'URL. Le fichier
406
- `./public/css/style.css` sera appelé via l'URL :
407
+ `./public/css/style.css` sera accessible à l'URL :
407
408
  `http://exemple.com/css/style.css`.
408
409
 
409
410
  Utilisez le paramètre `:static_cache_control` pour ajouter l'information
410
- d'en-tête <tt>Cache-Control</tt> (voir plus loin).
411
+ d'en-tête `Cache-Control` (voir plus bas).
411
412
 
412
413
  ## Vues / Templates
413
414
 
414
- Chaqie langage de template est disponible via sa propre méthode de rendu,
415
+ Chaque langage de template est disponible via sa propre méthode de rendu,
415
416
  lesquelles renvoient tout simplement une chaîne de caractères.
416
417
 
417
- ``` ruby
418
+ ```ruby
418
419
  get '/' do
419
420
  erb :index
420
421
  end
421
422
  ```
422
423
 
423
- Ceci effectue le rendu de la vue `views/index.erb`.
424
+ Ceci génère la vue `views/index.erb`.
424
425
 
425
426
  Plutôt que d'utiliser le nom d'un template, vous pouvez directement passer
426
427
  le contenu du template :
427
428
 
428
- ``` ruby
429
+ ```ruby
429
430
  get '/' do
430
431
  code = "<%= Time.now %>"
431
432
  erb code
432
433
  end
433
434
  ```
434
435
 
435
- Les méthodes de templates acceptent un second paramètre, un hash d'options :
436
+ Les méthodes de templates acceptent un hash d'options comme second argument :
436
437
 
437
- ``` ruby
438
+ ```ruby
438
439
  get '/' do
439
440
  erb :index, :layout => :post
440
441
  end
441
442
  ```
442
443
 
443
- Ceci effectuera le rendu de la vue `views/index.erb` en l'intégrant
444
- au *layout* `views/post.erb` (les vues Erb sont intégrées par défaut
445
- au *layout* `views/layout.erb` quand ce fichier existe).
444
+ Ceci génèrera la vue `views/index.erb` en l'intégrant au *layout* `views/post.erb` (`views/layout.erb` est la valeur par défaut si ce fichier existe).
446
445
 
447
446
  Toute option que Sinatra ne comprend pas sera passée au moteur de rendu :
448
447
 
449
- ``` ruby
448
+ ```ruby
450
449
  get '/' do
451
450
  haml :index, :format => :html5
452
451
  end
453
452
  ```
454
453
 
455
- Vous pouvez également définir des options par langage de template de façon
454
+ Vous pouvez également définir les options de chaque langage de template de façon
456
455
  générale :
457
456
 
458
- ``` ruby
457
+ ```ruby
459
458
  set :haml, :format => html5
460
459
 
461
460
  get '/' do
@@ -463,8 +462,7 @@ get '/' do
463
462
  end
464
463
  ```
465
464
 
466
- Les options passées à la méthode de rendu prennent le pas sur les options
467
- définies au moyen de `set`.
465
+ Les arguments passés à la méthode de rendu prennent le pas sur les options définies au moyen de `set`.
468
466
 
469
467
  Options disponibles :
470
468
 
@@ -478,7 +476,7 @@ Options disponibles :
478
476
 
479
477
  <dt>default_encoding</dt>
480
478
  <dd>
481
- Encodage de caractères à utiliser en cas d'incertitude. Par défaut, c'est
479
+ Encodage de caractères à utiliser en cas d'incertitude. Par défaut
482
480
  <tt>settings.default_encoding</tt>.
483
481
  </dd>
484
482
 
@@ -491,19 +489,18 @@ Options disponibles :
491
489
  <dt>layout</dt>
492
490
  <dd>
493
491
  S'il faut ou non utiliser un layout (<tt>true</tt> ou <tt>false</tt>).
494
- Indique le template à utiliser lorsque c'est un symbole. Exemple :
492
+ Ou indique le template à utiliser lorsque c'est un symbole. Exemple :
495
493
  <tt>erb :index, :layout => !request.xhr?</tt>.
496
494
  </dd>
497
495
 
498
496
  <dt>content_type</dt>
499
497
  <dd>
500
- Content-Type que le template produit, dépend par défaut du langage de
501
- template.
498
+ Content-Type que le template génère. La valeur par défaut dépend du langage de template.
502
499
  </dd>
503
500
 
504
501
  <dt>scope</dt>
505
502
  <dd>
506
- Contexte sous lequel effectuer le rendu du template. Par défaut il s'agit
503
+ Contexte dans lequel effectuer le rendu du template. Par défaut il s'agit
507
504
  de l'instance de l'application. Si vous changez cela, les variables
508
505
  d'instance et les méthodes utilitaires ne seront pas disponibles.
509
506
  </dd>
@@ -517,7 +514,7 @@ Options disponibles :
517
514
 
518
515
  <dt>layout_options</dt>
519
516
  <dd>
520
- Options spécifiques destinées au moteur de rendu. Exemple : <tt>set :rdoc,
517
+ Options spécifiques à la génération du layout. Exemple : <tt>set :rdoc,
521
518
  :layout_options => { :views => 'views/layouts' }</tt>
522
519
  </dd>
523
520
  </dl>
@@ -525,7 +522,7 @@ Options disponibles :
525
522
  Les templates sont supposés se trouver directement dans le dossier
526
523
  `./views`. Pour utiliser un dossier de vues différent :
527
524
 
528
- ``` ruby
525
+ ```ruby
529
526
  set :views, settings.root + '/templates'
530
527
  ```
531
528
 
@@ -537,13 +534,13 @@ caractères au lieu de les considérer comme un chemin vers un fichier.
537
534
 
538
535
  ### Templates littéraux
539
536
 
540
- ``` ruby
537
+ ```ruby
541
538
  get '/' do
542
539
  haml '%div.title Bonjour le monde'
543
540
  end
544
541
  ```
545
542
 
546
- Générera le code du template spécifié dans la chaîne de caractères.
543
+ Utilisera la chaine de caractères comme template pour générer la réponse.
547
544
 
548
545
  ### Langages de template disponibles
549
546
 
@@ -551,7 +548,7 @@ Certains langages ont plusieurs implémentations. Pour préciser l'implémentati
551
548
  à utiliser (et garantir l'aspect thread-safe), vous devez simplement l'avoir
552
549
  chargée au préalable :
553
550
 
554
- ``` ruby
551
+ ```ruby
555
552
  require 'rdiscount' # ou require 'bluecloth'
556
553
  get('/') { markdown :index }
557
554
  ```
@@ -620,7 +617,7 @@ exemple).
620
617
  <table>
621
618
  <tr>
622
619
  <td>Dépendances</td>
623
- <td><a href="http://nokogiri.org/" title="nokogiri">nokogiri</a></td>
620
+ <td><a href="http://www.nokogiri.org/" title="nokogiri">nokogiri</a></td>
624
621
  </tr>
625
622
  <tr>
626
623
  <td>Extensions de fichier</td>
@@ -676,7 +673,7 @@ exemple).
676
673
  <table>
677
674
  <tr>
678
675
  <td>Dépendances</td>
679
- <td><a href="http://www.lesscss.org/" title="less">less</a></td>
676
+ <td><a href="http://lesscss.org/" title="less">less</a></td>
680
677
  </tr>
681
678
  <tr>
682
679
  <td>Extensions de fichier</td>
@@ -694,7 +691,7 @@ exemple).
694
691
  <table>
695
692
  <tr>
696
693
  <td>Dépendances</td>
697
- <td><a href="http://www.liquidmarkup.org/" title="liquid">liquid</a></td>
694
+ <td><a href="http://liquidmarkup.org/" title="liquid">liquid</a></td>
698
695
  </tr>
699
696
  <tr>
700
697
  <td>Extensions de fichier</td>
@@ -717,7 +714,7 @@ locales.
717
714
  <td><p>Dépendances</p></td>
718
715
  <td>
719
716
  Au choix :
720
- <a href="https://github.com/rtomayko/rdiscount" title="RDiscount">RDiscount</a>,
717
+ <a href="https://github.com/davidfstr/rdiscount" title="RDiscount">RDiscount</a>,
721
718
  <a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
722
719
  <a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
723
720
  <a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a>,
@@ -736,22 +733,21 @@ locales.
736
733
  </table>
737
734
 
738
735
  Il n’est pas possible d’appeler des méthodes depuis markdown, ni de
739
- lui passer des variables locales. Par conséquent, il sera souvent utilisé
736
+ lui passer de variables locales. Par conséquent, il sera souvent utilisé
740
737
  en combinaison avec un autre moteur de rendu :
741
738
 
742
- ``` ruby
743
- erb :overview, :locals => { :text => markdown(:introduction) }
739
+ ```ruby
740
+ erb :accueil, :locals => { :text => markdown(:introduction) }
744
741
  ```
745
742
 
746
- Notez que vous pouvez également appeler la méthode `markdown` au
747
- sein d’autres templates :
743
+ Notez que vous pouvez également appeler la méthode `markdown` depuis un autre template :
748
744
 
749
- ``` ruby
750
- %h1 Hello From Haml !
751
- %p= markdown(:greetings)
745
+ ```ruby
746
+ %h1 Bonjour depuis Haml !
747
+ %p= markdown(:bienvenue)
752
748
  ```
753
749
 
754
- Comme vous ne pouvez pas appeler de Ruby au sein de Markdown, vous ne
750
+ Comme vous ne pouvez pas appeler de méthode Ruby depuis Markdown, vous ne
755
751
  pouvez pas utiliser de layouts écrits en Markdown. Toutefois, il
756
752
  est possible d’utiliser un moteur de rendu différent pour le template et
757
753
  pour le layout en utilisant l’option `:layout_engine`.
@@ -773,23 +769,22 @@ pour le layout en utilisant l’option `:layout_engine`.
773
769
  </tr>
774
770
  </table>
775
771
 
776
- Il n’est pas possible d’appeler des méthodes depuis textile, ni de lui
777
- passer des variables locales. Par conséquent, il sera souvent utilisé en
772
+ Il n’est pas possible d’appeler de méthodes depuis textile, ni de lui
773
+ passer de variables locales. Par conséquent, il sera souvent utilisé en
778
774
  combinaison avec un autre moteur de rendu :
779
775
 
780
- ``` ruby
781
- erb :overview, :locals => { :text => textile(:introduction) }
776
+ ```ruby
777
+ erb :accueil, :locals => { :text => textile(:introduction) }
782
778
  ```
783
779
 
784
- Notez que vous pouvez également appeler la méthode `textile` au
785
- sein d’autres templates :
780
+ Notez que vous pouvez également appeler la méthode `textile` depuis un autre template :
786
781
 
787
- ``` ruby
788
- %h1 Hello From Haml !
789
- %p= textile(:greetings)
782
+ ```ruby
783
+ %h1 Bonjour depuis Haml !
784
+ %p= textile(:bienvenue)
790
785
  ```
791
786
 
792
- Comme vous ne pouvez pas appeler de Ruby au sein de Textile, vous ne pouvez
787
+ Comme vous ne pouvez pas appeler de méthode Ruby depuis Textile, vous ne pouvez
793
788
  pas utiliser de layouts écrits en Textile. Toutefois, il est
794
789
  possible d’utiliser un moteur de rendu différent pour le template et
795
790
  pour le layout en utilisant l’option `:layout_engine`.
@@ -811,23 +806,22 @@ pour le layout en utilisant l’option `:layout_engine`.
811
806
  </tr>
812
807
  </table>
813
808
 
814
- Il n’est pas possible d’appeler des méthodes depuis rdoc, ni de lui
815
- passer des variables locales. Par conséquent, il sera souvent utilisé en
809
+ Il n’est pas possible d’appeler de méthodes Ruby depuis rdoc, ni de lui
810
+ passer de variables locales. Par conséquent, il sera souvent utilisé en
816
811
  combinaison avec un autre moteur de rendu :
817
812
 
818
- ``` ruby
819
- erb :overview, :locals => { :text => rdoc(:introduction) }
813
+ ```ruby
814
+ erb :accueil, :locals => { :text => rdoc(:introduction) }
820
815
  ```
821
816
 
822
- Notez que vous pouvez également appeler la méthode `rdoc` au sein
823
- d’autres templates :
817
+ Notez que vous pouvez également appeler la méthode `rdoc` depuis un autre template :
824
818
 
825
- ``` ruby
826
- %h1 Hello From Haml !
827
- %p= rdoc(:greetings)
819
+ ```ruby
820
+ %h1 Bonjour depuis Haml !
821
+ %p= rdoc(:bienvenue)
828
822
  ```
829
823
 
830
- Comme vous ne pouvez pas appeler de Ruby au sein de RDoc, vous ne pouvez
824
+ Comme vous ne pouvez pas appeler de méthodes Ruby depuis RDoc, vous ne pouvez
831
825
  pas utiliser de layouts écrits en RDoc. Toutefois, il est
832
826
  possible d’utiliser un moteur de rendu différent pour le template et
833
827
  pour le layout en utilisant l’option `:layout_engine`.
@@ -856,7 +850,7 @@ Radius, vous aurez sûrement à lui passer des variables locales.
856
850
  <table>
857
851
  <tr>
858
852
  <td>Dépendances</td>
859
- <td><a href="http://markaby.github.com/" title="Markaby">Markaby</a></td>
853
+ <td><a href="http://markaby.github.io/" title="Markaby">Markaby</a></td>
860
854
  </tr>
861
855
  <tr>
862
856
  <td>Extensions de fichier</td>
@@ -922,23 +916,22 @@ exemple).
922
916
  </tr>
923
917
  </table>
924
918
 
925
- Il n'est pas possible d'appeler des méthodes depuis creole, ni de lui
926
- passer des variables locales. Par conséquent, il sera souvent utilisé en
919
+ Il n'est pas possible d'appeler de méthodes Ruby depuis creole, ni de lui
920
+ passer de variables locales. Par conséquent, il sera souvent utilisé en
927
921
  combinaison avec un autre moteur de rendu :
928
922
 
929
- ``` ruby
930
- erb :overview, :locals => { :text => markdown(:introduction) }
923
+ ```ruby
924
+ erb :accueil, :locals => { :text => markdown(:introduction) }
931
925
  ```
932
926
 
933
- Notez que vous pouvez également appeler la méthode `creole` au sein d'autres
934
- templates :
927
+ Notez que vous pouvez également appeler la méthode `creole` depuis un autre template :
935
928
 
936
- ``` ruby
937
- %h1 Hello From Haml !
938
- %p= creole(:greetings)
929
+ ```ruby
930
+ %h1 Bonjour depuis Haml !
931
+ %p= creole(:bienvenue)
939
932
  ```
940
933
 
941
- Comme vous ne pouvez pas appeler de Ruby au sein de Creole, vous ne pouvez
934
+ Comme vous ne pouvez pas appeler de méthodes Ruby depuis Creole, vous ne pouvez
942
935
  pas utiliser de layouts écrits en Creole. Toutefois, il est possible
943
936
  d'utiliser un moteur de rendu différent pour le template et pour le layout
944
937
  en utilisant l'option `:layout_engine`.
@@ -974,7 +967,7 @@ en utilisant l'option `:layout_engine`.
974
967
  <tr>
975
968
  <td>Dépendances</td>
976
969
  <td>
977
- <a href="https://github.com/lucasmazza/ruby-stylus" title="Ruby Stylus">
970
+ <a href="https://github.com/forgecrafted/ruby-stylus" title="Ruby Stylus">
978
971
  Stylus
979
972
  </a>
980
973
  et un
@@ -996,7 +989,7 @@ en utilisant l'option `:layout_engine`.
996
989
  Avant de pouvoir utiliser des templates Stylus, vous devez auparavant charger
997
990
  `stylus` et `stylus/tilt` :
998
991
 
999
- ``` ruby
992
+ ```ruby
1000
993
  require 'sinatra'
1001
994
  require 'stylus'
1002
995
  require 'stylus/tilt'
@@ -1021,15 +1014,15 @@ end
1021
1014
  </tr>
1022
1015
  <tr>
1023
1016
  <td>Exemple</td>
1024
- <td><tt>yajl :index, :locals => { :key => 'qux' }, :callback => 'present', :variable => 'resource'</tt></p>
1017
+ <td><tt>yajl :index, :locals => { :key => 'qux' }, :callback => 'present', :variable => 'ressource'</tt></p>
1025
1018
  </td>
1026
1019
  </tr>
1027
1020
  </table>
1028
1021
 
1029
- Le source du template est évalué en tant que chaine Ruby, puis la
1022
+ La source du template est évaluée en tant que chaine Ruby, puis la
1030
1023
  variable json obtenue est convertie avec #to_json.
1031
1024
 
1032
- ``` ruby
1025
+ ```ruby
1033
1026
  json = { :foo => 'bar' }
1034
1027
  json[:baz] = key
1035
1028
  ```
@@ -1037,8 +1030,8 @@ json[:baz] = key
1037
1030
  Les options `:callback` et `:variable` peuvent être utilisées pour décorer
1038
1031
  l’objet retourné.
1039
1032
 
1040
- ``` ruby
1041
- var resource = {"foo":"bar","baz":"qux"}; present(resource);</pre>
1033
+ ```ruby
1034
+ var ressource = {"foo":"bar","baz":"qux"}; present(ressource);</pre>
1042
1035
  ```
1043
1036
 
1044
1037
  #### Templates WLang
@@ -1059,7 +1052,7 @@ var resource = {"foo":"bar","baz":"qux"}; present(resource);</pre>
1059
1052
  </table>
1060
1053
 
1061
1054
  L’appel de code ruby au sein des templates n’est pas idiomatique en wlang.
1062
- L’écriture de templates sans logique est encouragé, via le passage de variables
1055
+ L’écriture de templates sans logique est encouragée, via le passage de variables
1063
1056
  locales. Il est néanmoins possible d’écrire un layout en wlang et d’y utiliser
1064
1057
  `yield`.
1065
1058
 
@@ -1069,7 +1062,7 @@ Un template est évalué dans le même contexte que l'endroit d'où il a été
1069
1062
  appelé (gestionnaire de route). Les variables d'instance déclarées dans le
1070
1063
  gestionnaire de route sont directement accessibles dans le template :
1071
1064
 
1072
- ``` ruby
1065
+ ```ruby
1073
1066
  get '/:id' do
1074
1067
  @foo = Foo.find(params['id'])
1075
1068
  haml '%h1= @foo.nom'
@@ -1078,17 +1071,14 @@ end
1078
1071
 
1079
1072
  Alternativement, on peut passer un hash contenant des variables locales :
1080
1073
 
1081
- ``` ruby
1074
+ ```ruby
1082
1075
  get '/:id' do
1083
1076
  foo = Foo.find(params['id'])
1084
1077
  haml '%h1= foo.nom', :locals => { :foo => foo }
1085
1078
  end
1086
1079
  ```
1087
1080
 
1088
- Ceci est généralement utilisé lorsque l'on veut utiliser un template comme
1089
- partiel (depuis un autre template) et qu'il est donc nécessaire d'adapter les
1090
- noms de variables.
1091
-
1081
+ Ceci est généralement nécessaire lorsque l'on veut utiliser un template depuis un autre template (partiel) et qu'il faut donc adapter le nom des variables.
1092
1082
 
1093
1083
  ### Templates avec `yield` et layouts imbriqués
1094
1084
 
@@ -1096,30 +1086,30 @@ En général, un layout est un simple template qui appelle `yield`. Ce genre de
1096
1086
  template peut s'utiliser via l'option `:template` comme décrit précédemment ou
1097
1087
  peut être rendu depuis un bloc :
1098
1088
 
1099
- ``` ruby
1089
+ ```ruby
1100
1090
  erb :post, :layout => false do
1101
1091
  erb :index
1102
1092
  end
1103
1093
  ```
1104
1094
 
1105
- Ce code est à globalement équivalent à `erb :index, :layout => :post`.
1095
+ Ce code est plus ou moins équivalent à `erb :index, :layout => :post`.
1106
1096
 
1107
1097
  Le fait de passer des blocs aux méthodes de rendu est particulièrement utile
1108
1098
  pour gérer des templates imbriqués :
1109
1099
 
1110
- ``` ruby
1111
- erb :main_layout, :layout => false do
1112
- erb :admin_layout do
1113
- erb :user
1100
+ ```ruby
1101
+ erb :layout_principal, :layout => false do
1102
+ erb :layout_admin do
1103
+ erb :utilisateur
1114
1104
  end
1115
1105
  end
1116
1106
  ```
1117
1107
 
1118
- Ce qui peut aussi être fait avec un peu moins de code :
1108
+ Ou plus brièvement :
1119
1109
 
1120
- ``` ruby
1121
- erb :admin_layout, :layout => :main_layout do
1122
- erb :user
1110
+ ```ruby
1111
+ erb :layout_admin, :layout => :layout_principal do
1112
+ erb :utilisateur
1123
1113
  end
1124
1114
  ```
1125
1115
 
@@ -1132,7 +1122,7 @@ un bloc.
1132
1122
 
1133
1123
  Des templates peuvent être définis dans le fichier source comme ceci :
1134
1124
 
1135
- ``` ruby
1125
+ ```ruby
1136
1126
  require 'sinatra'
1137
1127
 
1138
1128
  get '/' do
@@ -1159,7 +1149,7 @@ fichiers source, il faut explicitement les déclarer avec
1159
1149
 
1160
1150
  Les templates peuvent aussi être définis grâce à la méthode de haut niveau `template` :
1161
1151
 
1162
- ``` ruby
1152
+ ```ruby
1163
1153
  template :layout do
1164
1154
  "%html\n =yield\n"
1165
1155
  end
@@ -1178,7 +1168,7 @@ template sera affiché. Vous pouvez désactivez les layouts au cas par cas en
1178
1168
  passant `:layout => false` ou bien les désactiver par défaut au moyen
1179
1169
  de `set :haml, :layout => false` :
1180
1170
 
1181
- ``` ruby
1171
+ ```ruby
1182
1172
  get '/' do
1183
1173
  haml :index, :layout => !request.xhr?
1184
1174
  end
@@ -1190,7 +1180,7 @@ Pour associer une extension de fichier avec un moteur de rendu, utilisez
1190
1180
  `Tilt.register`. Par exemple, si vous désirez utiliser l'extension
1191
1181
  de fichier `tt` pour les templates Textile, vous pouvez faire comme suit :
1192
1182
 
1193
- ``` ruby
1183
+ ```ruby
1194
1184
  Tilt.register :tt, Tilt[:textile]
1195
1185
  ```
1196
1186
 
@@ -1199,8 +1189,8 @@ Tilt.register :tt, Tilt[:textile]
1199
1189
  En premier lieu, déclarez votre moteur de rendu avec Tilt, ensuite créez
1200
1190
  votre méthode de rendu :
1201
1191
 
1202
- ``` ruby
1203
- Tilt.register :monmoteur, MonMerveilleurMoteurDeRendu
1192
+ ```ruby
1193
+ Tilt.register :monmoteur, MonMerveilleuxMoteurDeRendu
1204
1194
 
1205
1195
  helpers do
1206
1196
  def monmoteur(*args) render(:monmoteur, *args) end
@@ -1211,16 +1201,16 @@ get '/' do
1211
1201
  end
1212
1202
  ```
1213
1203
 
1214
- Utilisera `./views/index.monmoteur`. Voir [le dépôt Github](https://github.com/rtomayko/tilt) pour en savoir plus sur Tilt.
1204
+ Utilisera `./views/index.monmoteur`. Voir [le projet Github](https://github.com/rtomayko/tilt) pour en savoir plus sur Tilt.
1215
1205
 
1216
1206
  ## Filtres
1217
1207
 
1218
- Les filtres before sont exécutés avant chaque requête, dans le même contexte
1208
+ Les filtres `before` sont exécutés avant chaque requête, dans le même contexte
1219
1209
  que les routes, et permettent de modifier la requête et sa réponse. Les
1220
1210
  variables d'instance déclarées dans les filtres sont accessibles au niveau
1221
1211
  des routes et des templates :
1222
1212
 
1223
- ``` ruby
1213
+ ```ruby
1224
1214
  before do
1225
1215
  @note = 'Coucou !'
1226
1216
  request.path_info = '/foo/bar/baz'
@@ -1232,25 +1222,25 @@ get '/foo/*' do
1232
1222
  end
1233
1223
  ```
1234
1224
 
1235
- Les filtres after sont exécutés après chaque requête à l'intérieur du même
1225
+ Les filtres `after` sont exécutés après chaque requête à l'intérieur du même
1236
1226
  contexte et permettent de modifier la requête et sa réponse. Les variables
1237
- d'instance déclarées dans les filtres before ou les routes sont accessibles
1238
- au niveau des filtres after :
1227
+ d'instance déclarées dans les filtres `before` ou les routes sont accessibles
1228
+ au niveau des filtres `after` :
1239
1229
 
1240
- ``` ruby
1230
+ ```ruby
1241
1231
  after do
1242
1232
  puts response.status
1243
1233
  end
1244
1234
  ```
1245
1235
 
1246
- Note : Le corps de la réponse n'est pas disponible au niveau du filtre after
1236
+ Note : Le corps de la réponse n'est pas disponible au niveau du filtre `after`
1247
1237
  car il ne sera généré que plus tard (sauf dans le cas où vous utilisez la
1248
1238
  méthode `body` au lieu de simplement renvoyer une chaine depuis vos routes).
1249
1239
 
1250
1240
  Les filtres peuvent être associés à un masque, ce qui permet de limiter leur
1251
1241
  exécution aux cas où la requête correspond à ce masque :
1252
1242
 
1253
- ``` ruby
1243
+ ```ruby
1254
1244
  before '/secret/*' do
1255
1245
  authentification!
1256
1246
  end
@@ -1262,7 +1252,7 @@ end
1262
1252
 
1263
1253
  Tout comme les routes, les filtres acceptent également des conditions :
1264
1254
 
1265
- ``` ruby
1255
+ ```ruby
1266
1256
  before :agent => /Songbird/ do
1267
1257
  # ...
1268
1258
  end
@@ -1274,10 +1264,10 @@ end
1274
1264
 
1275
1265
  ## Helpers
1276
1266
 
1277
- Utilisez la méthode de haut niveau `helpers` pour définir des routines
1267
+ Utilisez la méthode de haut niveau `helpers` pour définir des méthodes
1278
1268
  qui seront accessibles dans vos gestionnaires de route et dans vos templates :
1279
1269
 
1280
- ``` ruby
1270
+ ```ruby
1281
1271
  helpers do
1282
1272
  def bar(nom)
1283
1273
  "#{nom}bar"
@@ -1291,7 +1281,7 @@ end
1291
1281
 
1292
1282
  Vous pouvez aussi définir les méthodes helper dans un module séparé :
1293
1283
 
1294
- ``` ruby
1284
+ ```ruby
1295
1285
  module FooUtils
1296
1286
  def foo(nom) "#{nom}foo" end
1297
1287
  end
@@ -1308,17 +1298,17 @@ l'application.
1308
1298
 
1309
1299
  ### Utiliser les sessions
1310
1300
 
1311
- Une session est utilisée pour conserver un état entre les requêtes. Une fois
1301
+ Les sessions sont utilisées pour conserver un état entre les requêtes. Une fois
1312
1302
  activées, vous avez un hash de session par session utilisateur :
1313
1303
 
1314
- ``` ruby
1304
+ ```ruby
1315
1305
  enable :sessions
1316
1306
 
1317
1307
  get '/' do
1318
1308
  "valeur = " << session['valeur'].inspect
1319
1309
  end
1320
1310
 
1321
- get '/:value' do
1311
+ get '/:valeur' do
1322
1312
  session['valeur'] = params['valeur']
1323
1313
  end
1324
1314
  ```
@@ -1330,14 +1320,14 @@ quel middleware Rack de session afin d'éviter cela. N'utilisez **pas**
1330
1320
  `enable :sessions` dans ce cas mais chargez le middleware de votre
1331
1321
  choix comme vous le feriez pour n'importe quel autre middleware :
1332
1322
 
1333
- ``` ruby
1323
+ ```ruby
1334
1324
  use Rack::Session::Pool, :expire_after => 2592000
1335
1325
 
1336
1326
  get '/' do
1337
1327
  "valeur = " << session['valeur'].inspect
1338
1328
  end
1339
1329
 
1340
- get '/:value' do
1330
+ get '/:valeur' do
1341
1331
  session['valeur'] = params['valeur']
1342
1332
  end
1343
1333
  ```
@@ -1348,21 +1338,21 @@ hasard par Sinatra. Toutefois, comme cette clé change à chaque démarrage de
1348
1338
  votre application, vous pouvez définir cette clé vous-même afin que toutes
1349
1339
  les instances de votre application la partage :
1350
1340
 
1351
- ``` ruby
1341
+ ```ruby
1352
1342
  set :session_secret, 'super secret'
1353
1343
  ```
1354
1344
 
1355
1345
  Si vous souhaitez avoir plus de contrôle, vous pouvez également enregistrer un
1356
1346
  hash avec des options lors de la configuration de `sessions` :
1357
1347
 
1358
- ``` ruby
1348
+ ```ruby
1359
1349
  set :sessions, :domain => 'foo.com'
1360
1350
  ```
1361
1351
 
1362
- Pour que les différents sous-domaines de foo.com puisse partager une session,
1363
- vous devez préfixer le domaine par *.* :
1352
+ Pour que les différents sous-domaines de foo.com puissent partager une session,
1353
+ vous devez précéder le domaine d'un *.* (point) :
1364
1354
 
1365
- ``` ruby
1355
+ ```ruby
1366
1356
  set :sessions, :domain => '.foo.com'
1367
1357
  ```
1368
1358
 
@@ -1372,37 +1362,37 @@ set :sessions, :domain => '.foo.com'
1372
1362
  Pour arrêter immédiatement la requête dans un filtre ou un gestionnaire de
1373
1363
  route :
1374
1364
 
1375
- ``` ruby
1365
+ ```ruby
1376
1366
  halt
1377
1367
  ```
1378
1368
 
1379
1369
  Vous pouvez aussi passer le code retour ...
1380
1370
 
1381
- ``` ruby
1371
+ ```ruby
1382
1372
  halt 410
1383
1373
  ```
1384
1374
 
1385
1375
  Ou le texte ...
1386
1376
 
1387
- ``` ruby
1377
+ ```ruby
1388
1378
  halt 'Ceci est le texte'
1389
1379
  ```
1390
1380
 
1391
1381
  Ou les deux ...
1392
1382
 
1393
- ``` ruby
1383
+ ```ruby
1394
1384
  halt 401, 'Partez !'
1395
1385
  ```
1396
1386
 
1397
- Ainsi que les entêtes ...
1387
+ Ainsi que les en-têtes ...
1398
1388
 
1399
- ``` ruby
1389
+ ```ruby
1400
1390
  halt 402, {'Content-Type' => 'text/plain'}, 'revanche'
1401
1391
  ```
1402
1392
 
1403
1393
  Bien sûr il est possible de combiner un template avec `halt` :
1404
1394
 
1405
- ``` ruby
1395
+ ```ruby
1406
1396
  halt erb(:erreur)
1407
1397
  ```
1408
1398
 
@@ -1411,7 +1401,7 @@ halt erb(:erreur)
1411
1401
  Une route peut passer le relais aux autres routes qui correspondent également
1412
1402
  avec `pass` :
1413
1403
 
1414
- ``` ruby
1404
+ ```ruby
1415
1405
  get '/devine/:qui' do
1416
1406
  pass unless params['qui'] == 'Frank'
1417
1407
  "Tu m'as eu !"
@@ -1432,7 +1422,7 @@ Parfois, `pass` n'est pas ce que vous recherchez, au lieu de cela vous
1432
1422
  souhaitez obtenir le résultat d'une autre route. Pour cela, utilisez
1433
1423
  simplement `call` :
1434
1424
 
1435
- ``` ruby
1425
+ ```ruby
1436
1426
  get '/foo' do
1437
1427
  status, headers, body = call env.merge("PATH_INFO" => '/bar')
1438
1428
  [status, headers, body.map(&:upcase)]
@@ -1447,14 +1437,14 @@ Notez que dans l'exemple ci-dessus, vous faciliterez les tests et améliorerez
1447
1437
  la performance en déplaçant simplement `"bar"` dans un helper
1448
1438
  utilisé à la fois par `/foo` et `/bar`.
1449
1439
 
1450
- Si vous souhiatez que la requête soit envoyée à la même instance de
1440
+ Si vous souhaitez que la requête soit envoyée à la même instance de
1451
1441
  l'application plutôt qu'à une copie, utilisez `call!` au lieu de
1452
1442
  `call`.
1453
1443
 
1454
1444
  Lisez la spécification Rack si vous souhaitez en savoir plus sur
1455
1445
  `call`.
1456
1446
 
1457
- ### Définir le corps, le code retour et les entêtes
1447
+ ### Définir le corps, le code retour et les en-têtes
1458
1448
 
1459
1449
  Il est possible et recommandé de définir le code retour et le corps de la
1460
1450
  réponse au moyen de la valeur de retour d'un bloc définissant une route.
@@ -1463,7 +1453,7 @@ le coprs de la réponse à un moment arbitraire de l'exécution. Vous pouvez le
1463
1453
  faire au moyen de la méthode `body`. Si vous faites ainsi, vous pouvez alors
1464
1454
  utiliser cette même méthode pour accéder au corps de la réponse :
1465
1455
 
1466
- ``` ruby
1456
+ ```ruby
1467
1457
  get '/foo' do
1468
1458
  body "bar"
1469
1459
  end
@@ -1478,9 +1468,9 @@ gestionnaire Rack (ceci peut être utilisé pour implémenter un streaming,
1478
1468
  voir "Valeurs de retour").
1479
1469
 
1480
1470
  Pareillement au corps de la réponse, vous pouvez également définir le code
1481
- retour et les entêtes :
1471
+ retour et les en-têtes :
1482
1472
 
1483
- ``` ruby
1473
+ ```ruby
1484
1474
  get '/foo' do
1485
1475
  status 418
1486
1476
  headers \
@@ -1490,7 +1480,7 @@ get '/foo' do
1490
1480
  end
1491
1481
  ```
1492
1482
 
1493
- Comme `body` `headers` et `status` peuvent être utilisés sans arguments
1483
+ Comme pour `body`, `headers` et `status` peuvent être utilisés sans arguments
1494
1484
  pour accéder à leurs valeurs.
1495
1485
 
1496
1486
  ### Faire du streaming
@@ -1498,10 +1488,10 @@ pour accéder à leurs valeurs.
1498
1488
  Il y a des cas où vous voulez commencer à renvoyer des données pendant que
1499
1489
  vous êtes en train de générer le reste de la réponse. Dans les cas les plus
1500
1490
  extrèmes, vous souhaitez continuer à envoyer des données tant que le client
1501
- n'abandonne pas la connection. Vous pouvez alors utiliser le helper `stream`
1491
+ n'abandonne pas la connexion. Vous pouvez alors utiliser le helper `stream`
1502
1492
  pour éviter de créer votre propre système :
1503
1493
 
1504
- ``` ruby
1494
+ ```ruby
1505
1495
  get '/' do
1506
1496
  stream do |out|
1507
1497
  out << "Ca va être hallu -\n"
@@ -1514,25 +1504,25 @@ end
1514
1504
  ```
1515
1505
 
1516
1506
  Cela permet d'implémenter des API de streaming ou de
1517
- [Server Sent Events](http://dev.w3.org/html5/eventsource/) et peut servir de
1518
- base pour des [WebSockets](http://en.wikipedia.org/wiki/WebSocket). Vous
1507
+ [Server Sent Events](https://w3c.github.io/eventsource/) et peut servir de
1508
+ base pour des [WebSockets](https://en.wikipedia.org/wiki/WebSocket). Vous
1519
1509
  pouvez aussi l'employer pour augmenter le débit quand une partie du contenu
1520
- provient d'une resource lente.
1510
+ provient d'une ressource lente.
1521
1511
 
1522
1512
  Le fonctionnement du streaming, notamment le nombre de requêtes simultanées,
1523
1513
  dépend énormément du serveur web utilisé. Certains ne prennent pas du tout en
1524
- charge le streaming (WEBRick par exemple). Lorsque le serveur ne gère pas le
1525
- streaming, la partie body de la réponse sera envoyée au client en une seule
1526
- fois, après que l'exécution du bloc passé au helper `stream` sera terminée. Le
1527
- streaming ne fonctionne pas du tout avec Shotgun.
1514
+ charge le streaming. Lorsque le serveur ne gère pas le streaming, la partie
1515
+ body de la réponse sera envoyée au client en une seule fois, après
1516
+ l'exécution du bloc passé au helper `stream`. Le streaming ne
1517
+ fonctionne pas du tout avec Shotgun.
1528
1518
 
1529
- En utilisant le helper stream avec le paramètre `keep_open`, il n'appelera
1519
+ En utilisant le helper `stream` avec le paramètre `keep_open`, il n'appelera
1530
1520
  pas la méthode `close` du flux, vous laissant la possibilité de le fermer à
1531
1521
  tout moment au cours de l'exécution. Ceci ne fonctionne qu'avec les serveurs
1532
1522
  evented (ie non threadés) tels que Thin et Rainbows. Les autres serveurs
1533
1523
  fermeront malgré tout le flux :
1534
1524
 
1535
- ``` ruby
1525
+ ```ruby
1536
1526
  # interrogation prolongée
1537
1527
 
1538
1528
  set :server, :thin
@@ -1566,7 +1556,7 @@ end
1566
1556
  Dans le contexte de la requête, la méthode utilitaire `logger` expose une
1567
1557
  instance de `Logger` :
1568
1558
 
1569
- ``` ruby
1559
+ ```ruby
1570
1560
  get '/' do
1571
1561
  logger.info "chargement des données"
1572
1562
  # ...
@@ -1582,7 +1572,7 @@ Notez que la journalisation est seulement activée par défaut pour
1582
1572
  `Sinatra::Application`, donc si vous héritez de `>Sinatra::Base`,
1583
1573
  vous aurez à l'activer vous-même :
1584
1574
 
1585
- ``` ruby
1575
+ ```ruby
1586
1576
  class MonApp < Sinatra::Base
1587
1577
  configure :production, :development do
1588
1578
  enable :logging
@@ -1601,7 +1591,7 @@ Quand vous utilisez `send_file` ou des fichiers statiques, vous
1601
1591
  pouvez rencontrer des types mime que Sinatra ne connaît pas. Utilisez
1602
1592
  `mime_type` pour les déclarer par extension de fichier :
1603
1593
 
1604
- ``` ruby
1594
+ ```ruby
1605
1595
  configure do
1606
1596
  mime_type :foo, 'text/foo'
1607
1597
  end
@@ -1609,7 +1599,7 @@ end
1609
1599
 
1610
1600
  Vous pouvez également les utiliser avec la méthode `content_type` :
1611
1601
 
1612
- ``` ruby
1602
+ ```ruby
1613
1603
  get '/' do
1614
1604
  content_type :foo
1615
1605
  "foo foo foo"
@@ -1621,7 +1611,7 @@ end
1621
1611
  Pour former des URLs, vous devriez utiliser la méthode `url`, par exemple en
1622
1612
  Haml :
1623
1613
 
1624
- ``` ruby
1614
+ ```ruby
1625
1615
  %a{:href => url('/foo')} foo
1626
1616
  ```
1627
1617
 
@@ -1635,24 +1625,24 @@ pour un exemple).
1635
1625
  Vous pouvez déclencher une redirection du navigateur avec la méthode
1636
1626
  `redirect` :
1637
1627
 
1638
- ``` ruby
1628
+ ```ruby
1639
1629
  get '/foo' do
1640
1630
  redirect to('/bar')
1641
1631
  end
1642
1632
  ```
1643
1633
 
1644
- Tout paramètre additionnel est géré comme des arguments pour la méthode
1634
+ Tout paramètre additionnel sera utilisé comme argument pour la méthode
1645
1635
  `halt` :
1646
1636
 
1647
- ``` ruby
1637
+ ```ruby
1648
1638
  redirect to('/bar'), 303
1649
- redirect 'http://google.com', 'mauvais endroit mon pote'
1639
+ redirect 'http://www.google.com/', 'mauvais endroit mon pote'
1650
1640
  ```
1651
1641
 
1652
1642
  Vous pouvez aussi rediriger vers la page dont l'utilisateur venait au moyen de
1653
1643
  `redirect back` :
1654
1644
 
1655
- ``` ruby
1645
+ ```ruby
1656
1646
  get '/foo' do
1657
1647
  "<a href='/bar'>faire quelque chose</a>"
1658
1648
  end
@@ -1665,13 +1655,13 @@ end
1665
1655
 
1666
1656
  Pour passer des arguments à une redirection, ajoutez-les soit à la requête :
1667
1657
 
1668
- ``` ruby
1658
+ ```ruby
1669
1659
  redirect to('/bar?sum=42')
1670
1660
  ```
1671
1661
 
1672
1662
  Ou bien utilisez une session :
1673
1663
 
1674
- ``` ruby
1664
+ ```ruby
1675
1665
  enable :sessions
1676
1666
 
1677
1667
  get '/foo' do
@@ -1686,11 +1676,11 @@ end
1686
1676
 
1687
1677
  ### Contrôle du cache
1688
1678
 
1689
- Définir correctement vos entêtes à la base pour un bon cache HTTP.
1679
+ Définissez correctement vos en-têtes à la base pour un bon cache HTTP.
1690
1680
 
1691
- Vous pouvez facilement définir l'entête Cache-Control de la manière suivante :
1681
+ Vous pouvez facilement définir l'en-tête Cache-Control de la manière suivante :
1692
1682
 
1693
- ``` ruby
1683
+ ```ruby
1694
1684
  get '/' do
1695
1685
  cache_control :public
1696
1686
  "met le en cache !"
@@ -1699,27 +1689,27 @@ end
1699
1689
 
1700
1690
  Conseil de pro : définir le cache dans un filtre before :
1701
1691
 
1702
- ``` ruby
1692
+ ```ruby
1703
1693
  before do
1704
1694
  cache_control :public, :must_revalidate, :max_age => 60
1705
1695
  end
1706
1696
  ```
1707
1697
 
1708
- Si vous utilisez la méthode `expires` pour définir l'entête correspondant,
1698
+ Si vous utilisez la méthode `expires` pour définir l'en-tête correspondant,
1709
1699
  `Cache-Control` sera alors défini automatiquement :
1710
1700
 
1711
- ``` ruby
1701
+ ```ruby
1712
1702
  before do
1713
1703
  expires 500, :public, :must_revalidate
1714
1704
  end
1715
1705
  ```
1716
1706
 
1717
- Pour utiliser correctement les caches, vous devriez utiliser `etag` ou
1707
+ Pour utiliser correctement le cache, vous devriez utiliser `etag` ou
1718
1708
  `last_modified`. Il est recommandé d'utiliser ces méthodes *avant* de faire
1719
1709
  d'importantes modifications, car elles vont immédiatement déclencher la réponse
1720
1710
  si le client a déjà la version courante dans son cache :
1721
1711
 
1722
- ``` ruby
1712
+ ```ruby
1723
1713
  get '/article/:id' do
1724
1714
  @article = Article.find params['id']
1725
1715
  last_modified @article.updated_at
@@ -1729,18 +1719,18 @@ end
1729
1719
  ```
1730
1720
 
1731
1721
  Il est également possible d'utiliser un
1732
- [weak ETag](http://en.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation) :
1722
+ [weak ETag](https://en.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation) :
1733
1723
 
1734
- ``` ruby
1724
+ ```ruby
1735
1725
  etag @article.sha1, :weak
1736
1726
  ```
1737
1727
 
1738
1728
  Ces méthodes ne sont pas chargées de mettre des données en cache, mais elles
1739
- fournissent les informations nécessaires pour votre cache. Si vous êtes à la
1740
- recherche de solutions rapides pour un reverse-proxy de cache, essayez
1729
+ fournissent les informations nécessaires pour le cache de votre navigateur. Si vous êtes à la
1730
+ recherche d'une solution rapide pour un reverse-proxy de cache, essayez
1741
1731
  [rack-cache](https://github.com/rtomayko/rack-cache) :
1742
1732
 
1743
- ``` ruby
1733
+ ```ruby
1744
1734
  require "rack/cache"
1745
1735
  require "sinatra"
1746
1736
 
@@ -1758,23 +1748,23 @@ d'en-tête `Cache-Control` (voir plus loin).
1758
1748
 
1759
1749
  D'après la RFC 2616, votre application devrait se comporter différement lorsque
1760
1750
  l'en-tête If-Match ou If-None-Match est défini à `*` en tenant compte du
1761
- fait que la resource demandée existe déjà ou pas. Sinatra considère que les
1762
- requêtes portant sur des resources sûres (tel que get) ou idempotentes (tel que
1763
- put) existent déjà et pour les autres resources (par exemple dans le cas
1764
- de requêtes post) qu'il s'agit de nouvelles resources. Vous pouvez modifier ce
1751
+ fait que la ressource demandée existe déjà ou pas. Sinatra considère que les
1752
+ requêtes portant sur des ressources sûres (tel que get) ou idempotentes (tel que
1753
+ put) existent déjà et pour les autres ressources (par exemple dans le cas
1754
+ de requêtes post) qu'il s'agit de nouvelles ressources. Vous pouvez modifier ce
1765
1755
  comportement en passant une option `:new_resource` :
1766
1756
 
1767
- ``` ruby
1757
+ ```ruby
1768
1758
  get '/create' do
1769
1759
  etag '', :new_resource => true
1770
1760
  Article.create
1771
- erb :new_article
1761
+ erb :nouvel_article
1772
1762
  end
1773
1763
  ```
1774
1764
 
1775
- Si vous souhaitez utilisez un ETag faible, utilisez l'option <tt>:kind</tt> :
1765
+ Si vous souhaitez avoir un ETag faible, utilisez l'option `:kind` :
1776
1766
 
1777
- ``` ruby
1767
+ ```ruby
1778
1768
  etag '', :new_resource => true, :kind => :weak
1779
1769
  ```
1780
1770
 
@@ -1782,7 +1772,7 @@ etag '', :new_resource => true, :kind => :weak
1782
1772
 
1783
1773
  Pour envoyer des fichiers, vous pouvez utiliser la méthode `send_file` :
1784
1774
 
1785
- ``` ruby
1775
+ ```ruby
1786
1776
  get '/' do
1787
1777
  send_file 'foo.png'
1788
1778
  end
@@ -1790,7 +1780,7 @@ end
1790
1780
 
1791
1781
  Quelques options sont également acceptées :
1792
1782
 
1793
- ``` ruby
1783
+ ```ruby
1794
1784
  send_file 'foo.png', :type => :jpg
1795
1785
  ```
1796
1786
 
@@ -1804,8 +1794,8 @@ Les options sont :
1804
1794
 
1805
1795
  <dt>last_modified</dt>
1806
1796
  <dd>
1807
- valeur pour l’entête Last-Modified, par défaut la date de modification du
1808
- fichier
1797
+ valeur pour l’en-tête Last-Modified, par défaut la date de modification du
1798
+ fichier.
1809
1799
  </dd>
1810
1800
 
1811
1801
  <dt>type</dt>
@@ -1816,35 +1806,35 @@ Les options sont :
1816
1806
 
1817
1807
  <dt>disposition</dt>
1818
1808
  <dd>
1819
- utilisé pour Content-Disposition, les valuers possibles étant : <tt>nil</tt>
1809
+ utilisé pour Content-Disposition, les valeurs possibles étant : <tt>nil</tt>
1820
1810
  (par défaut), <tt>:attachment</tt> et <tt>:inline</tt>
1821
1811
  </dd>
1822
1812
 
1823
1813
  <dt>length</dt>
1824
- <dd>entête Content-Length, par défaut la taille du fichier</dd>
1814
+ <dd>en-tête Content-Length, par défaut la taille du fichier</dd>
1825
1815
 
1826
1816
  <dt>status</dt>
1827
1817
  <dd>
1828
1818
  code état à renvoyer. Utile quand un fichier statique sert de page d’erreur.
1819
+
1820
+ Si le gestionnaire Rack le supporte, d'autres moyens que le streaming via le
1821
+ processus Ruby seront utilisés. Si vous utilisez cette méthode, Sinatra gérera
1822
+ automatiquement les requêtes de type range.
1829
1823
  </dd>
1830
1824
  </dl>
1831
1825
 
1832
- Si le gestionnaire Rack le supporte, d'autres moyens que le streaming via le
1833
- processus Ruby seront utilisés. Si vous utilisez cette méthode, Sinatra gérera
1834
- automatiquement les requêtes de type range.
1835
-
1836
1826
  ### Accéder à l'objet requête
1837
1827
 
1838
1828
  L'objet correspondant à la requête envoyée peut être récupéré dans le contexte
1839
1829
  de la requête (filtres, routes, gestionnaires d'erreur) au moyen de la méthode
1840
1830
  `request` :
1841
1831
 
1842
- ``` ruby
1832
+ ```ruby
1843
1833
  # application tournant à l'adresse http://exemple.com/exemple
1844
1834
  get '/foo' do
1845
1835
  t = %w[text/css text/html application/javascript]
1846
1836
  request.accept # ['text/html', '*/*']
1847
- request.accept? 'text/xml' # true
1837
+ request.accept? 'text/xml' # vrai
1848
1838
  request.preferred_type(t) # 'text/html'
1849
1839
  request.body # corps de la requête envoyée par le client
1850
1840
  # (voir ci-dessous)
@@ -1857,10 +1847,10 @@ get '/foo' do
1857
1847
  request.content_length # taille de request.body
1858
1848
  request.media_type # type de média pour request.body
1859
1849
  request.host # "exemple.com"
1860
- request.get? # true (méthodes similaires pour les autres
1850
+ request.get? # vrai (méthodes similaires pour les autres
1861
1851
  # verbes HTTP)
1862
- request.form_data? # false
1863
- request["UN_ENTETE"] # valeur de l'entête UN_ENTETE
1852
+ request.form_data? # faux
1853
+ request["UN_ENTETE"] # valeur de l'en-tête UN_ENTETE
1864
1854
  request.referrer # référant du client ou '/'
1865
1855
  request.user_agent # user agent (utilisé par la condition :agent)
1866
1856
  request.cookies # tableau contenant les cookies du navigateur
@@ -1868,7 +1858,7 @@ get '/foo' do
1868
1858
  request.url # "http://exemple.com/exemple/foo"
1869
1859
  request.path # "/exemple/foo"
1870
1860
  request.ip # adresse IP du client
1871
- request.secure? # false
1861
+ request.secure? # faux
1872
1862
  request.forwarded? # vrai (si on est derrière un proxy inverse)
1873
1863
  request.env # tableau brut de l'environnement fourni par Rack
1874
1864
  end
@@ -1877,7 +1867,7 @@ end
1877
1867
  Certaines options, telles que `script_name` ou `path_info`
1878
1868
  peuvent également être modifiées :
1879
1869
 
1880
- ``` ruby
1870
+ ```ruby
1881
1871
  before { request.path_info = "/" }
1882
1872
 
1883
1873
  get "/" do
@@ -1887,7 +1877,7 @@ end
1887
1877
 
1888
1878
  `request.body` est un objet IO ou StringIO :
1889
1879
 
1890
- ``` ruby
1880
+ ```ruby
1891
1881
  post "/api" do
1892
1882
  request.body.rewind # au cas où il a déjà été lu
1893
1883
  donnees = JSON.parse request.body.read
@@ -1901,7 +1891,7 @@ Vous pouvez utiliser la méthode `attachment` pour indiquer au navigateur que
1901
1891
  la réponse devrait être stockée sur le disque plutôt qu'affichée :
1902
1892
 
1903
1893
 
1904
- ``` ruby
1894
+ ```ruby
1905
1895
  get '/' do
1906
1896
  attachment
1907
1897
  "enregistre-le !"
@@ -1910,7 +1900,7 @@ end
1910
1900
 
1911
1901
  Vous pouvez également lui passer un nom de fichier :
1912
1902
 
1913
- ``` ruby
1903
+ ```ruby
1914
1904
  get '/' do
1915
1905
  attachment "info.txt"
1916
1906
  "enregistre-le !"
@@ -1923,7 +1913,7 @@ Sinatra fourni un helper `time_for` pour convertir une valeur donnée en
1923
1913
  objet `Time`. Il peut aussi faire la conversion à partir d'objets `DateTime`,
1924
1914
  `Date` ou de classes similaires :
1925
1915
 
1926
- ``` ruby
1916
+ ```ruby
1927
1917
  get '/' do
1928
1918
  pass if Time.now > time_for('Dec 23, 2012')
1929
1919
  "encore temps"
@@ -1935,7 +1925,7 @@ consorts. Par conséquent, vous pouvez très facilement étendre le
1935
1925
  fonctionnement de ces méthodes en surchargeant le helper `time_for` dans
1936
1926
  votre application :
1937
1927
 
1938
- ``` ruby
1928
+ ```ruby
1939
1929
  helpers do
1940
1930
  def time_for(value)
1941
1931
  case value
@@ -1958,17 +1948,17 @@ end
1958
1948
  La méthode `find_template` est utilisée pour trouver les fichiers de
1959
1949
  templates à générer :
1960
1950
 
1961
- ``` ruby
1951
+ ```ruby
1962
1952
  find_template settings.views, 'foo', Tilt[:haml] do |file|
1963
1953
  puts "pourrait être #{file}"
1964
1954
  end
1965
1955
  ```
1966
1956
 
1967
- Ce n'est pas très utilise. En revanche, il est utile de pouvoir surcharger
1957
+ Ce n'est pas très utile. En revanche, il est utile de pouvoir surcharger
1968
1958
  cette méthode afin de définir son propre mécanisme de recherche. Par exemple,
1969
1959
  vous pouvez utiliser plus d'un répertoire de vues :
1970
1960
 
1971
- ``` ruby
1961
+ ```ruby
1972
1962
  set :views, ['views', 'templates']
1973
1963
 
1974
1964
  helpers do
@@ -1981,14 +1971,14 @@ end
1981
1971
  Un autre exemple est d'utiliser des répertoires différents pour des moteurs
1982
1972
  de rendu différents :
1983
1973
 
1984
- ``` ruby
1974
+ ```ruby
1985
1975
  set :views, :sass => 'views/sass', :haml => 'templates', :default => 'views'
1986
1976
 
1987
1977
  helpers do
1988
- def find_template(views, name, engine, &block)
1989
- _, folder = views.detect { |k,v| engine == Tilt[k] }
1990
- folder ||= views[:default]
1991
- super(folder, name, engine, &block)
1978
+ def find_template(vues, nom, moteur, &bloc)
1979
+ _, dossier = vues.detect { |k,v| moteur == Tilt[k] }
1980
+ dossier ||= vues[:default]
1981
+ super(dossier, nom, moteur, &bloc)
1992
1982
  end
1993
1983
  end
1994
1984
  ```
@@ -1998,27 +1988,27 @@ d'autres !
1998
1988
 
1999
1989
  Notez que `find_template` ne vérifie pas que le fichier existe mais
2000
1990
  va plutôt exécuter le bloc pour tous les chemins possibles. Cela n'induit pas
2001
- un problème de performance dans le sens où `render` va utiliser `break` dès
2002
- qu'un fichier est trouvé. De plus, l'emplacement des templates (et leur
1991
+ de problème de performance dans le sens où `render` va utiliser `break` dès
1992
+ qu'un fichier sera trouvé. De plus, l'emplacement des templates (et leur
2003
1993
  contenu) est mis en cache si vous n'êtes pas en mode développement. Vous
2004
- devriez garder cela en tête si vous écrivez une méthode vraiment dingue.
1994
+ devez garder cela en tête si vous écrivez une méthode vraiment dingue.
2005
1995
 
2006
1996
  ## Configuration
2007
1997
 
2008
1998
  Lancé une seule fois au démarrage de tous les environnements :
2009
1999
 
2010
- ``` ruby
2000
+ ```ruby
2011
2001
  configure do
2012
2002
  # définir un paramètre
2013
- set :option, 'value'
2003
+ set :option, 'valeur'
2014
2004
 
2015
- # définir plusieurs paramètre
2005
+ # définir plusieurs paramètres
2016
2006
  set :a => 1, :b => 2
2017
2007
 
2018
- # identique à "set :option, true"
2008
+ # équivalent à "set :option, true"
2019
2009
  enable :option
2020
2010
 
2021
- # identique à "set :option, false""
2011
+ # équivalent à "set :option, false""
2022
2012
  disable :option
2023
2013
 
2024
2014
  # vous pouvez également avoir des paramètres dynamiques avec des blocs
@@ -2026,10 +2016,9 @@ configure do
2026
2016
  end
2027
2017
  ```
2028
2018
 
2029
- Lancé si l'environnement (variable d'environnement RACK_ENV) est défini comme
2030
- `:production` :
2019
+ Lancé si l'environnement (variable d'environnement RACK_ENV) est `:production` :
2031
2020
 
2032
- ``` ruby
2021
+ ```ruby
2033
2022
  configure :production do
2034
2023
  ...
2035
2024
  end
@@ -2037,7 +2026,7 @@ Lancé si l'environnement (variable d'environnement RACK_ENV) est défini comme
2037
2026
 
2038
2027
  Lancé si l'environnement est `:production` ou `:test` :
2039
2028
 
2040
- ``` ruby
2029
+ ```ruby
2041
2030
  configure :production, :test do
2042
2031
  ...
2043
2032
  end
@@ -2045,7 +2034,7 @@ Lancé si l'environnement est `:production` ou `:test` :
2045
2034
 
2046
2035
  Vous pouvez accéder à ces paramètres via `settings` :
2047
2036
 
2048
- ``` ruby
2037
+ ```ruby
2049
2038
  configure do
2050
2039
  set :foo, 'bar'
2051
2040
  end
@@ -2059,26 +2048,26 @@ end
2059
2048
 
2060
2049
  ### Se protéger des attaques
2061
2050
 
2062
- Sinatra utilise [Rack::Protection](https://github.com/rkh/rack-protection#readme)
2051
+ Sinatra utilise [Rack::Protection](https://github.com/sinatra/rack-protection#readme)
2063
2052
  pour protéger votre application contre les principales attaques opportunistes.
2064
2053
  Vous pouvez très simplement désactiver cette fonctionnalité (ce qui exposera
2065
2054
  votre application à beaucoup de vulnerabilités courantes) :
2066
2055
 
2067
- ``` ruby
2056
+ ```ruby
2068
2057
  disable :protection
2069
2058
  ```
2070
2059
 
2071
2060
  Pour désactiver seulement un type de protection, vous pouvez définir `protection`
2072
2061
  avec un hash d'options :
2073
2062
 
2074
- ``` ruby
2063
+ ```ruby
2075
2064
  set :protection, :except => :path_traversal
2076
2065
  ```
2077
2066
 
2078
2067
  Vous pouvez également lui passer un tableau pour désactiver plusieurs types de
2079
2068
  protection :
2080
2069
 
2081
- ``` ruby
2070
+ ```ruby
2082
2071
  set :protection, :except => [:path_traversal, :session_hijacking]
2083
2072
  ```
2084
2073
 
@@ -2087,7 +2076,7 @@ un système de protection au niveau de la session. Dans le cas où vous gérez
2087
2076
  vous même les sessions, vous devez utiliser l'option `:session` pour que cela
2088
2077
  soit le cas :
2089
2078
 
2090
- ``` ruby
2079
+ ```ruby
2091
2080
  use Rack::Session::Pool
2092
2081
  set :protection, :session => true
2093
2082
  ```
@@ -2250,14 +2239,14 @@ templates sont mis en cache par défaut.
2250
2239
  Pour exécuter votre application dans un environnement différent, définissez la
2251
2240
  variable d'environnement `RACK_ENV` :
2252
2241
 
2253
- ``` shell
2242
+ ```shell
2254
2243
  RACK_ENV=production ruby my_app.rb
2255
2244
  ```
2256
2245
 
2257
2246
  Vous pouvez utiliser une des méthodes `development?`, `test?` et `production?`
2258
2247
  pour déterminer quel est l'environnement en cours :
2259
2248
 
2260
- ``` ruby
2249
+ ```ruby
2261
2250
  get '/' do
2262
2251
  if settings.development?
2263
2252
  "développement !"
@@ -2278,7 +2267,7 @@ vieux `haml`, `erb`, `halt`, etc.
2278
2267
  Quand une exception <tt>Sinatra::NotFound</tt> est soulevée, ou que le code
2279
2268
  retour est 404, le gestionnaire <tt>not_found</tt> est invoqué :
2280
2269
 
2281
- ``` ruby
2270
+ ```ruby
2282
2271
  not_found do
2283
2272
  'Pas moyen de trouver ce que vous cherchez'
2284
2273
  end
@@ -2290,7 +2279,7 @@ Le gestionnaire `error` est invoqué à chaque fois qu'une exception est
2290
2279
  soulevée dans une route ou un filtre. L'objet exception est accessible via la
2291
2280
  variable Rack `sinatra.error` :
2292
2281
 
2293
- ``` ruby
2282
+ ```ruby
2294
2283
  error do
2295
2284
  'Désolé mais une méchante erreur est survenue - ' + env['sinatra.error'].message
2296
2285
  end
@@ -2298,28 +2287,30 @@ end
2298
2287
 
2299
2288
  Erreur sur mesure :
2300
2289
 
2301
- ``` ruby
2290
+ ```ruby
2302
2291
  error MonErreurSurMesure do
2303
- 'Donc il est arrivé ceci...' + env['sinatra.error'].message
2292
+ 'Oups ! Il est arrivé...' + env['sinatra.error'].message
2304
2293
  end
2305
2294
  ```
2306
2295
 
2307
- Donc si ceci arrive :
2296
+ Donc si cette erreur est soulevée :
2308
2297
 
2309
- ``` ruby
2298
+ ```ruby
2310
2299
  get '/' do
2311
2300
  raise MonErreurSurMesure, 'quelque chose de mal'
2312
2301
  end
2313
2302
  ```
2314
2303
 
2315
- Vous obtenez ça :
2304
+ La réponse sera :
2316
2305
 
2317
- Donc il est arrivé ceci... quelque chose de mal
2306
+ ```
2307
+ Oups ! Il est arrivé... quelque chose de mal
2308
+ ```
2318
2309
 
2319
2310
  Alternativement, vous pouvez avoir un gestionnaire d'erreur associé à un code
2320
2311
  particulier :
2321
2312
 
2322
- ``` ruby
2313
+ ```ruby
2323
2314
  error 403 do
2324
2315
  'Accès interdit'
2325
2316
  end
@@ -2331,29 +2322,29 @@ end
2331
2322
 
2332
2323
  Ou un intervalle :
2333
2324
 
2334
- ``` ruby
2325
+ ```ruby
2335
2326
  error 400..510 do
2336
2327
  'Boom'
2337
2328
  end
2338
2329
  ```
2339
2330
 
2340
2331
  Sinatra installe pour vous quelques gestionnaires `not_found` et
2341
- `error` génériques lorsque vous êtes en environnement
2332
+ `error` génériques lorsque vous êtes en environnement de
2342
2333
  `development`.
2343
2334
 
2344
2335
  ## Les Middlewares Rack
2345
2336
 
2346
- Sinatra tourne avec [Rack](http://rack.github.io/), une interface standard
2337
+ Sinatra fonctionne avec [Rack](http://rack.github.io/), une interface standard
2347
2338
  et minimale pour les web frameworks Ruby. Un des points forts de Rack est le
2348
- support de ce que l'on appelle des "middlewares" -- composant qui vient se
2339
+ support de ce que l'on appelle des "middlewares" -- composants qui viennent se
2349
2340
  situer entre le serveur et votre application, et dont le but est de
2350
2341
  visualiser/manipuler la requête/réponse HTTP, et d'offrir diverses
2351
2342
  fonctionnalités classiques.
2352
2343
 
2353
- Sinatra permet de construire facilement des middlewares Rack via la méthode de
2344
+ Sinatra permet d'utiliser facilement des middlewares Rack via la méthode de
2354
2345
  haut niveau `use` :
2355
2346
 
2356
- ``` ruby
2347
+ ```ruby
2357
2348
  require 'sinatra'
2358
2349
  require 'mon_middleware_perso'
2359
2350
 
@@ -2366,20 +2357,20 @@ end
2366
2357
  ```
2367
2358
 
2368
2359
  La sémantique de `use` est identique à celle définie dans le DSL de
2369
- [Rack::Builder](http://rubydoc.info/github/rack/rack/master/Rack/Builder)
2370
- (le plus souvent utilisé dans un fichier rackup). Par exemple, la méthode
2360
+ [Rack::Builder](http://www.rubydoc.info/github/rack/rack/master/Rack/Builder)
2361
+ (le plus souvent utilisé dans un fichier `rackup`). Par exemple, la méthode
2371
2362
  `use` accepte divers arguments ainsi que des blocs :
2372
2363
 
2373
- ``` ruby
2374
- use Rack::Auth::Basic do |login, password|
2375
- login == 'admin' && password == 'secret'
2364
+ ```ruby
2365
+ use Rack::Auth::Basic do |identifiant, mot_de_passe|
2366
+ identifiant == 'admin' && mot_de_passe == 'secret'
2376
2367
  end
2377
2368
  ```
2378
2369
 
2379
2370
  Rack est distribué avec de nombreux middlewares standards pour loguer, débuguer,
2380
2371
  faire du routage URL, de l'authentification ou gérer des sessions. Sinatra gère
2381
2372
  plusieurs de ces composants automatiquement via son système de configuration, ce
2382
- qui vous dispense de faire un `use` en ce qui les concerne.
2373
+ qui vous dispense de faire un `use` pour ces derniers.
2383
2374
 
2384
2375
  Vous trouverez d'autres middlewares intéressants sur
2385
2376
  [rack](https://github.com/rack/rack/tree/master/lib/rack),
@@ -2392,7 +2383,7 @@ Les tests pour Sinatra peuvent être écrit avec n'importe quelle bibliothèque
2392
2383
  basée sur Rack. [Rack::Test](http://gitrdoc.com/brynary/rack-test) est
2393
2384
  recommandé :
2394
2385
 
2395
- ``` ruby
2386
+ ```ruby
2396
2387
  require 'mon_application_sinatra'
2397
2388
  require 'minitest/autorun'
2398
2389
  require 'rack/test'
@@ -2410,7 +2401,7 @@ class MonTest < Minitest::Test
2410
2401
  end
2411
2402
 
2412
2403
  def test_avec_des_parametres
2413
- get '/rencontrer', :name => 'Frank'
2404
+ get '/rencontrer', :nom => 'Frank'
2414
2405
  assert_equal 'Salut Frank !', last_response.body
2415
2406
  end
2416
2407
 
@@ -2432,7 +2423,7 @@ niveau supérieur suppose une configuration dans le style des micro-applications
2432
2423
  `./views`, des logs, une page d'erreur, etc...). C'est là que
2433
2424
  `Sinatra::Base` prend tout son intérêt :
2434
2425
 
2435
- ``` ruby
2426
+ ```ruby
2436
2427
  require 'sinatra/base'
2437
2428
 
2438
2429
  class MonApplication < Sinatra::Base
@@ -2457,13 +2448,13 @@ pour transformer la plupart des applications de haut niveau en un composant
2457
2448
 
2458
2449
  `Sinatra::Base` est une page blanche. La plupart des options sont
2459
2450
  désactivées par défaut, y compris le serveur intégré. Reportez-vous à
2460
- [Options et Configuration](http://sinatra.github.com/configuration.html)
2451
+ [Options et Configuration](http://www.sinatrarb.com/configuration.html)
2461
2452
  pour plus d'informations sur les options et leur fonctionnement. Si vous
2462
2453
  souhaitez un comportement plus proche de celui obtenu lorsque vous définissez
2463
2454
  votre application au niveau supérieur (aussi connu sous le nom de style
2464
2455
  Classique), vous pouvez créer une classe héritant de `Sinatra::Application`.
2465
2456
 
2466
- ``` ruby
2457
+ ```ruby
2467
2458
  require 'sinatra/base'
2468
2459
 
2469
2460
  class MyApp < Sinatra::Application
@@ -2476,11 +2467,11 @@ end
2476
2467
  ### Style modulaire vs. style classique
2477
2468
 
2478
2469
  Contrairement aux idées reçues, il n'y a rien de mal à utiliser le style
2479
- classique. Si c'est ce qui convient pour votre application, vous n'avez pas
2470
+ classique. Si c'est ce qui convient pour votre application, vous n'avez
2480
2471
  aucune raison de passer à une application modulaire.
2481
2472
 
2482
2473
  Le principal inconvénient du style classique sur le style modulaire est que vous
2483
- ne pouvez avoir qu'une application Ruby par processus Ruby. Si vous pensez en
2474
+ ne pouvez avoir qu'une application par processus Ruby. Si vous pensez en
2484
2475
  utiliser plus, passez au style modulaire. Et rien ne vous empêche de mixer style
2485
2476
  classique et style modulaire.
2486
2477
 
@@ -2533,7 +2524,7 @@ mineures en ce qui concerne les paramètres par défaut :
2533
2524
  <tr>
2534
2525
  <td>static</td>
2535
2526
  <td>true</td>
2536
- <td>false</td>
2527
+ <td>File.exist?(public_folder)</td>
2537
2528
  <td>true</td>
2538
2529
  </tr>
2539
2530
  </table>
@@ -2543,7 +2534,7 @@ mineures en ce qui concerne les paramètres par défaut :
2543
2534
  Il y a deux façons de faire pour démarrer une application modulaire, démarrez
2544
2535
  avec `run!` :
2545
2536
 
2546
- ``` ruby
2537
+ ```ruby
2547
2538
  # my_app.rb
2548
2539
  require 'sinatra/base'
2549
2540
 
@@ -2557,14 +2548,14 @@ end
2557
2548
 
2558
2549
  Démarrez ensuite avec :
2559
2550
 
2560
- ``` shell
2551
+ ```shell
2561
2552
  ruby my_app.rb
2562
2553
  ```
2563
2554
 
2564
2555
  Ou alors avec un fichier `config.ru`, qui permet d'utiliser n'importe
2565
2556
  quel gestionnaire Rack :
2566
2557
 
2567
- ``` ruby
2558
+ ```ruby
2568
2559
  # config.ru
2569
2560
  require './my_app'
2570
2561
  run MyApp
@@ -2572,7 +2563,7 @@ run MyApp
2572
2563
 
2573
2564
  Exécutez :
2574
2565
 
2575
- ``` shell
2566
+ ```shell
2576
2567
  rackup -p 4567
2577
2568
  ```
2578
2569
 
@@ -2580,7 +2571,7 @@ rackup -p 4567
2580
2571
 
2581
2572
  Ecrivez votre application :
2582
2573
 
2583
- ``` ruby
2574
+ ```ruby
2584
2575
  # app.rb
2585
2576
  require 'sinatra'
2586
2577
 
@@ -2591,7 +2582,7 @@ end
2591
2582
 
2592
2583
  Et un fichier `config.ru` correspondant :
2593
2584
 
2594
- ``` ruby
2585
+ ```ruby
2595
2586
  require './app'
2596
2587
  run Sinatra::Application
2597
2588
  ```
@@ -2614,11 +2605,11 @@ de passer au style modulaire pour utiliser un fichier `config.ru`.**
2614
2605
 
2615
2606
  Non seulement Sinatra peut utiliser d'autres middlewares Rack, il peut
2616
2607
  également être à son tour utilisé au-dessus de n'importe quel endpoint Rack
2617
- en tant que middleware. Ce endpoint peut très bien être une autre
2608
+ en tant que middleware. Cet endpoint peut très bien être une autre
2618
2609
  application Sinatra, ou n'importe quelle application basée sur Rack
2619
2610
  (Rails/Ramaze/Camping/...) :
2620
2611
 
2621
- ``` ruby
2612
+ ```ruby
2622
2613
  require 'sinatra/base'
2623
2614
 
2624
2615
  class EcranDeConnexion < Sinatra::Base
@@ -2655,7 +2646,7 @@ Il se peut que vous ayez besoin de créer une nouvelle application à l'exécuti
2655
2646
  sans avoir à les assigner à une constante, vous pouvez le faire grâce à
2656
2647
  `Sinatra.new` :
2657
2648
 
2658
- ``` ruby
2649
+ ```ruby
2659
2650
  require 'sinatra/base'
2660
2651
  mon_app = Sinatra.new { get('/') { "salut" } }
2661
2652
  mon_app.run!
@@ -2663,7 +2654,7 @@ mon_app.run!
2663
2654
 
2664
2655
  L'application dont elle hérite peut être passé en argument optionnel :
2665
2656
 
2666
- ``` ruby
2657
+ ```ruby
2667
2658
  # config.ru
2668
2659
  require 'sinatra/base'
2669
2660
 
@@ -2681,12 +2672,12 @@ map('/b') do
2681
2672
  end
2682
2673
  ```
2683
2674
 
2684
- C'est notamment utile pour tester des extensions à Sinatra ou bien pour
2675
+ C'est notamment utile pour tester des extensions pour Sinatra ou bien pour
2685
2676
  utiliser Sinatra dans votre propre bibliothèque.
2686
2677
 
2687
2678
  Cela permet également d'utiliser très facilement Sinatra comme middleware :
2688
2679
 
2689
- ``` ruby
2680
+ ```ruby
2690
2681
  require 'sinatra/base'
2691
2682
 
2692
2683
  use Sinatra do
@@ -2712,7 +2703,7 @@ les requêtes sont traitées par une seule classe d'application.
2712
2703
 
2713
2704
  Les options définies au moyen de `set` deviennent des méthodes de classe :
2714
2705
 
2715
- ``` ruby
2706
+ ```ruby
2716
2707
  class MonApp < Sinatra::Base
2717
2708
  # Eh, je suis dans le contexte de l'application !
2718
2709
  set :foo, 42
@@ -2746,7 +2737,7 @@ contexte. Depuis celui-ci, vous pouvez accéder aux objets `request` et
2746
2737
  Vous pouvez accéder au contexte de l'application depuis le contexte de la
2747
2738
  requête au moyen de `settings` :
2748
2739
 
2749
- ``` ruby
2740
+ ```ruby
2750
2741
  class MonApp < Sinatra::Base
2751
2742
  # Eh, je suis dans le contexte de l'application !
2752
2743
  get '/ajouter_route/:nom' do
@@ -2776,9 +2767,9 @@ Le contexte de délégation se contente de transmettre les appels de méthodes a
2776
2767
  contexte de classe. Toutefois, il ne se comporte pas à 100% comme le contexte
2777
2768
  de classe car vous n'avez pas le binding de la classe : seules les méthodes
2778
2769
  spécifiquement déclarées pour délégation sont disponibles et il n'est pas
2779
- possible de partager des variables/états avec le contexte de classe
2780
- (comprenez : `self` n'est pas le même). Vous pouvez ajouter des délégation de
2781
- méthodes en appelant `Sinatra::Delegator.delegate :method_name`.
2770
+ possible de partager de variables/états avec le contexte de classe
2771
+ (comprenez : `self` n'est pas le même). Vous pouvez ajouter des délégations de
2772
+ méthode en appelant `Sinatra::Delegator.delegate :method_name`.
2782
2773
 
2783
2774
  Vous avez le binding du contexte de délégation dans :
2784
2775
 
@@ -2793,7 +2784,7 @@ qui [étend l'objet principal](https://github.com/sinatra/sinatra/blob/ca06364/l
2793
2784
 
2794
2785
  Les applications Sinatra peuvent être lancées directement :
2795
2786
 
2796
- ``` shell
2787
+ ```shell
2797
2788
  ruby mon_application.rb [-h] [-x] [-e ENVIRONNEMENT] [-p PORT] [-o HOTE] [-s SERVEUR]
2798
2789
  ```
2799
2790
 
@@ -2808,6 +2799,41 @@ Avec les options :
2808
2799
  -x # active le mutex lock (off par défaut)
2809
2800
  ```
2810
2801
 
2802
+ ### Multi-threading
2803
+
2804
+ _Cette partie est basée sur [une réponse StackOverflow][so-answer] de Konstantin._
2805
+
2806
+ Sinatra n'impose pas de modèle de concurrence. Sinatra est thread-safe, vous pouvez
2807
+ donc utiliser n'importe quel gestionnaire Rack, comme Thin, Puma ou WEBrick en mode
2808
+ multi-threaded.
2809
+
2810
+ Cela signifie néanmoins qu'il vous faudra spécifier les paramètres correspondant au
2811
+ gestionnaire Rack utilisé lors du démarrage du serveur.
2812
+
2813
+ L'exemple ci-dessous montre comment vous pouvez exécuter un serveur Thin de manière
2814
+ multi-threaded:
2815
+
2816
+ ```
2817
+ # app.rb
2818
+ require 'sinatra/base'
2819
+
2820
+ classe App < Sinatra::Base
2821
+   get '/' do
2822
+ 'Bonjour le monde !'
2823
+   end
2824
+ end
2825
+
2826
+ App.run!
2827
+ ```
2828
+
2829
+ Pour démarrer le serveur, exécuter la commande suivante:
2830
+
2831
+ ```
2832
+ thin --threaded start
2833
+ ```
2834
+
2835
+ [so-answer]: http://stackoverflow.com/questions/6278817/is-sinatra-multi-threaded/6282999#6282999)
2836
+
2811
2837
  ## Configuration nécessaire
2812
2838
 
2813
2839
  Les versions suivantes de Ruby sont officiellement supportées :
@@ -2890,25 +2916,25 @@ stable.
2890
2916
  Pour cela, la méthode la plus simple est d'installer une gem de prerelease que
2891
2917
  nous publions de temps en temps :
2892
2918
 
2893
- ``` shell
2919
+ ```shell
2894
2920
  gem install sinatra --pre
2895
2921
  ```
2896
2922
  Ce qui permet de bénéficier des toutes dernières fonctionnalités.
2897
2923
 
2898
2924
  ### Installer avec Bundler
2899
2925
 
2900
- Il est cependant conseillé de passer par [Bundler](http://gembundler.com/) pour
2926
+ Il est cependant conseillé de passer par [Bundler](http://bundler.io) pour
2901
2927
  faire tourner votre application avec la dernière version de Sinatra.
2902
2928
 
2903
2929
  Pour commencer, installez bundler si nécessaire :
2904
2930
 
2905
- ``` shell
2931
+ ```shell
2906
2932
  gem install bundler
2907
2933
  ```
2908
2934
 
2909
2935
  Ensuite, créez un fichier `Gemfile` dans le dossier de votre projet :
2910
2936
 
2911
- ``` ruby
2937
+ ```ruby
2912
2938
  source 'https://rubygems.org'
2913
2939
  gem 'sinatra', :github => "sinatra/sinatra"
2914
2940
 
@@ -2923,7 +2949,7 @@ automatiquement téléchargées et ajoutées par Bundler.
2923
2949
 
2924
2950
  Vous pouvez alors lancer votre application de la façon suivante :
2925
2951
 
2926
- ``` shell
2952
+ ```shell
2927
2953
  bundle exec ruby myapp.rb
2928
2954
  ```
2929
2955
 
@@ -2933,7 +2959,7 @@ Si vous ne souhaitez pas employer Bundler, vous pouvez cloner Sinatra en local
2933
2959
  dans votre projet et démarrez votre application avec le dossier `sinatra/lib`
2934
2960
  dans le `$LOAD_PATH` :
2935
2961
 
2936
- ``` shell
2962
+ ```shell
2937
2963
  cd myapp
2938
2964
  git clone git://github.com/sinatra/sinatra.git
2939
2965
  ruby -I sinatra/lib myapp.rb
@@ -2942,7 +2968,7 @@ ruby -I sinatra/lib myapp.rb
2942
2968
  Et de temps en temps, vous devrez récupérer la dernière version du code source
2943
2969
  de Sinatra :
2944
2970
 
2945
- ``` shell
2971
+ ```shell
2946
2972
  cd myapp/sinatra
2947
2973
  git pull
2948
2974
  ```
@@ -2951,7 +2977,7 @@ git pull
2951
2977
 
2952
2978
  Une dernière méthode consiste à construire la gem vous-même :
2953
2979
 
2954
- ``` shell
2980
+ ```shell
2955
2981
  git clone git://github.com/sinatra/sinatra.git
2956
2982
  cd sinatra
2957
2983
  rake sinatra.gemspec
@@ -2960,7 +2986,7 @@ rake install
2960
2986
 
2961
2987
  Si vous installez les gems en tant que root, vous devez encore faire un :
2962
2988
 
2963
- ``` shell
2989
+ ```shell
2964
2990
  sudo rake install
2965
2991
  ```
2966
2992
 
@@ -2975,14 +3001,14 @@ SemVer que SemVerTag.
2975
3001
  de news, et des liens vers d'autres ressources.
2976
3002
  * [Contribuer](http://www.sinatrarb.com/contributing) - Vous avez trouvé un
2977
3003
  bug ? Besoin d'aide ? Vous avez un patch ?
2978
- * [Suivi des problèmes](http://github.com/sinatra/sinatra/issues)
2979
- * [Twitter](http://twitter.com/sinatra)
3004
+ * [Suivi des problèmes](https://github.com/sinatra/sinatra/issues)
3005
+ * [Twitter](https://twitter.com/sinatra)
2980
3006
  * [Mailing List](http://groups.google.com/group/sinatrarb/topics)
2981
3007
  * IRC : [#sinatra](irc://chat.freenode.net/#sinatra) sur http://freenode.net
2982
3008
  * [Sinatra Book](https://github.com/sinatra/sinatra-book/) Tutoriels et recettes
2983
3009
  * [Sinatra Recipes](http://recipes.sinatrarb.com/) trucs et astuces rédigés par
2984
3010
  la communauté
2985
- * Documentation API de la [dernière version](http://rubydoc.info/gems/sinatra)
2986
- ou du [HEAD courant](http://rubydoc.info/github/sinatra/sinatra) sur
2987
- http://rubydoc.info
2988
- * [CI server](http://travis-ci.org/sinatra/sinatra)
3011
+ * Documentation API de la [dernière version](http://www.rubydoc.info/gems/sinatra)
3012
+ ou du [HEAD courant](http://www.rubydoc.info/github/sinatra/sinatra) sur
3013
+ http://www.rubydoc.info/
3014
+ * [CI server](https://travis-ci.org/sinatra/sinatra)