sinatra 1.3.0.d → 1.3.0.e

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of sinatra might be problematic. Click here for more details.

Files changed (53) hide show
  1. data/.gitignore +6 -0
  2. data/.yardopts +4 -0
  3. data/CHANGES +80 -3
  4. data/Gemfile +18 -12
  5. data/README.de.rdoc +189 -381
  6. data/README.es.rdoc +193 -316
  7. data/README.fr.rdoc +327 -475
  8. data/README.jp.rdoc +7 -1
  9. data/README.rdoc +132 -101
  10. data/README.ru.rdoc +3 -3
  11. data/README.zh.rdoc +2 -2
  12. data/Rakefile +19 -27
  13. data/lib/sinatra/base.rb +186 -262
  14. data/lib/sinatra/version.rb +3 -0
  15. data/sinatra.gemspec +12 -128
  16. data/test/base_test.rb +1 -1
  17. data/test/builder_test.rb +1 -1
  18. data/test/coffee_test.rb +1 -1
  19. data/test/creole_test.rb +1 -1
  20. data/test/delegator_test.rb +9 -7
  21. data/test/encoding_test.rb +1 -1
  22. data/test/erb_test.rb +1 -1
  23. data/test/extensions_test.rb +1 -1
  24. data/test/filter_test.rb +7 -4
  25. data/test/haml_test.rb +1 -1
  26. data/test/helper.rb +16 -1
  27. data/test/helpers_test.rb +12 -1
  28. data/test/less_test.rb +1 -1
  29. data/test/liquid_test.rb +1 -1
  30. data/test/mapped_error_test.rb +44 -1
  31. data/test/markaby_test.rb +1 -1
  32. data/test/markdown_test.rb +1 -1
  33. data/test/middleware_test.rb +1 -1
  34. data/test/nokogiri_test.rb +1 -1
  35. data/test/radius_test.rb +1 -1
  36. data/test/rdoc_test.rb +2 -2
  37. data/test/readme_test.rb +136 -0
  38. data/test/request_test.rb +1 -1
  39. data/test/response_test.rb +13 -3
  40. data/test/result_test.rb +3 -3
  41. data/test/route_added_hook_test.rb +1 -1
  42. data/test/routing_test.rb +9 -2
  43. data/test/sass_test.rb +1 -1
  44. data/test/scss_test.rb +1 -1
  45. data/test/server_test.rb +1 -1
  46. data/test/settings_test.rb +55 -22
  47. data/test/sinatra_test.rb +1 -1
  48. data/test/slim_test.rb +1 -1
  49. data/test/static_test.rb +22 -1
  50. data/test/templates_test.rb +1 -1
  51. data/test/textile_test.rb +1 -1
  52. metadata +47 -59
  53. data/lib/sinatra/rack.rb +0 -44
@@ -1,22 +1,22 @@
1
1
  = Sinatra
2
- <i>Attention: Ce document correspond à la traduction de la version anglaise et
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
5
  Sinatra est un DSL pour créer rapidement des applications web en Ruby et sans
6
- effort:
6
+ effort :
7
7
 
8
8
  # mon_application.rb
9
9
  require 'sinatra'
10
10
  get '/' do
11
- 'Bonjour Monde!'
11
+ 'Bonjour le monde !'
12
12
  end
13
13
 
14
- Installez le gem et lancez avec:
14
+ Installez la gem et lancez avec :
15
15
 
16
16
  gem install sinatra
17
17
  ruby -rubygems mon_application.rb
18
18
 
19
- Le résultat est visible sur: http://localhost:4567
19
+ Le résultat est visible sur : http://localhost:4567
20
20
 
21
21
  Il est également recommandé d'exécuter <tt>gem install thin</tt>, que Sinatra
22
22
  utilisera si disponible.
@@ -25,7 +25,7 @@ utilisera si disponible.
25
25
 
26
26
  Dans Sinatra, une route est une méthode HTTP couplée à un masque (pattern)
27
27
  URL.
28
- Chaque route est associée à un bloc:
28
+ Chaque route est associée à un bloc :
29
29
 
30
30
  get '/' do
31
31
  .. montrer quelque chose ..
@@ -55,23 +55,23 @@ Les routes sont comparées dans l'ordre où elles ont été définies. La premi
55
55
  route qui correspond à la requête est invoquée.
56
56
 
57
57
  Les masques peuvent inclure des paramètres nommés, accessibles par
58
- l'intermédiaire du hash <tt>params</tt>:
58
+ l'intermédiaire du hash <tt>params</tt> :
59
59
 
60
60
  get '/bonjour/:nom' do
61
61
  # répond aux requêtes "GET /bonjour/foo" et "GET /bonjour/bar"
62
62
  # params[:nom] est 'foo' ou 'bar'
63
- "Bonjour #{params[:nom]}!"
63
+ "Bonjour #{params[:nom]} !"
64
64
  end
65
65
 
66
66
  Vous pouvez aussi les nommer directement dans les paramètres du bloc comme
67
- ceci:
67
+ ceci :
68
68
 
69
69
  get '/bonjour/:nom' do |n|
70
- "Bonjour #{n}!"
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 de la liste <tt>params[:splat]</tt> :
75
75
 
76
76
  get '/dire/*/a/*' do
77
77
  # répondrait à /dire/bonjour/a/monde
@@ -83,22 +83,22 @@ l'intermédiaire de la liste <tt>params[:splat]</tt>:
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
+ Une route peut s'exprimer avec une Expression Régulière :
87
87
 
88
88
  get %r{/bonjour/([\w]+)} do
89
- "Bonjour, #{params[:captures].first}!"
89
+ "Bonjour, #{params[:captures].first} !"
90
90
  end
91
91
 
92
- Là aussi on peut utiliser les paramètres de bloc:
92
+ Là aussi on peut utiliser les paramètres de bloc :
93
93
 
94
94
  get %r{/bonjour/([\w]+)} do |c|
95
- "Bonjour, #{c}!"
95
+ "Bonjour, #{c} !"
96
96
  end
97
97
 
98
98
  === Conditions
99
99
 
100
100
  Les routes peuvent définir toutes sortes de conditions, comme par exemple le
101
- "user agent":
101
+ "user agent" :
102
102
 
103
103
  get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
104
104
  "Vous utilisez Songbird version #{params[:agent][0]}"
@@ -108,10 +108,10 @@ Les routes peuvent définir toutes sortes de conditions, comme par exemple le
108
108
  # Correspond à tous les autres navigateurs
109
109
  end
110
110
 
111
- Les autres conditions disponibles sont +host_name+ et +provides+:
111
+ Les autres conditions disponibles sont +host_name+ et +provides+ :
112
112
 
113
113
  get '/', :host_name => /^admin\./ do
114
- "Zone Administrateur, Accès refusé!"
114
+ "Zone Administrateur, Accès refusé !"
115
115
  end
116
116
 
117
117
  get '/', :provides => 'html' do
@@ -122,12 +122,12 @@ Les autres conditions disponibles sont +host_name+ et +provides+:
122
122
  builder :feed
123
123
  end
124
124
 
125
- Vous pouvez facilement définir vos propres conditions:
125
+ Vous pouvez facilement définir vos propres conditions :
126
126
 
127
127
  set(:probability) { |value| condition { rand <= value } }
128
128
 
129
129
  get '/gagner_une_voiture', :probability => 0.1 do
130
- "Vous avez gagné!"
130
+ "Vous avez gagné !"
131
131
  end
132
132
 
133
133
  get '/gagner_une_voiture' do
@@ -143,11 +143,11 @@ comme dans les exemples précédents. Cependant, d'autres valeurs sont
143
143
  acceptées.
144
144
 
145
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:
146
+ corps de réponse Rack ou un code retour HTTP :
147
147
 
148
- * Un tableau de 3 éléments: <tt>[code retour (Fixnum), entêtes (Hash), corps
148
+ * Un tableau de 3 éléments : <tt>[code retour (Fixnum), entêtes (Hash), corps
149
149
  de réponse (répondant à #each)]</tt>
150
- * Un tableau de 2 élements: <tt>[code retour (Fixnum), corps de réponse
150
+ * Un tableau de 2 élements : <tt>[code retour (Fixnum), corps de réponse
151
151
  (répondant à #each)]</tt>
152
152
  * Un objet qui répond à <tt>#each</tt> et qui ne transmet que des chaînes de
153
153
  caractères au bloc fourni
@@ -209,456 +209,301 @@ Ou bien en utilisant la forme négative :
209
209
 
210
210
  Par défaut, le dossier <tt>./public</tt> est utilisé pour servir les fichiers
211
211
  statiques. Vous pouvez changer ce dossier pour un autre nom grâce au paramètre
212
- <tt>:public</tt>:
212
+ <tt>:public</tt> :
213
213
 
214
214
  set :public, File.dirname(__FILE__) + '/statique'
215
215
 
216
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 :
218
- <tt>http://exemple.com/css/style.css</tt>.
217
+ sous <tt>./public/css/style.css</tt> est appelé avec l'URL : <tt>http://exemple.com/css/style.css</tt>.
219
218
 
220
219
  == Vues / Templates
221
220
 
222
- Par défaut, les templates sont cherchés dans le dossier <tt>./views</tt>.
223
- Pour utiliser un autre dossier, il faut le déclarer:
224
-
225
- set :views, File.dirname(__FILE__) + '/templates'
226
-
227
- Il est important de noter que les templates sont toujours référencés
228
- sous forme de symboles, même s'il s'agit d'un sous-répertoire (dans ce
229
- cas, utilisez <tt>:'sous_repertoire/template'</tt>). Vous devez utiliser un
230
- symbole car les méthodes de rendu évalueront le contenu des chaînes de
231
- caractères au lieu de les considérer comme un chemin vers un fichier.
232
-
233
- === Templates Haml
234
-
235
- Le gem <tt>haml</tt> est nécessaire pour utiliser la fonction de rendu Haml:
236
-
237
- # Chargez la bibliothèque haml dans votre application
238
- require 'haml'
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.
239
223
 
240
224
  get '/' do
241
- haml :index
225
+ erb :index
242
226
  end
243
227
 
244
- Utilisera le template: <tt>./views/index.haml</tt>.
245
-
246
- {Les options de Haml}[http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#options]
247
- peuvent se manipuler directement avec la configuration de Sinatra,
248
- voir {Options et Configuration}[http://www.sinatrarb.com/configuration.html],
249
- et supportent aussi la réécriture (surcharge) comme dans cet exemple.
228
+ Ceci effectue le rendu de <tt>views/index.erb</tt>.
250
229
 
251
- set :haml, :format => :html5 # le format par défaut dans Haml est :xhtml
230
+ Plutôt que le nom d'un template, vous pouvez directement passer le contenu du
231
+ template :
252
232
 
253
233
  get '/' do
254
- haml :index, :format => :html4 # surcharge
234
+ code = "<%= Time.now %>"
235
+ erb code
255
236
  end
256
237
 
257
-
258
- === Templates Erb
259
-
260
- # Chargez la bibliothèque erb dans votre application
261
- require 'erb'
238
+ Les templates prennent un second paramètre, un hash d'options :
262
239
 
263
240
  get '/' do
264
- erb :index
241
+ erb :index, :layout => :post
265
242
  end
266
243
 
267
- Utilisera le template: <tt>./views/index.erb</tt>.
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).
268
247
 
269
- === Templates Erubis
270
-
271
- Le gem <tt>erubis</tt> est nécessaire pour utiliser la fonction de rendu
272
- erubis:
273
-
274
- # Chargez la bibliothèque erubis dans votre application
275
- require 'erubis'
248
+ Toute option que Sinatra ne comprends pas sera passée au moteur de rendu :
276
249
 
277
250
  get '/' do
278
- erubis :index
251
+ haml :index, :format => :html5
279
252
  end
280
253
 
281
- Utilisera le template: <tt>./views/index.erubis</tt>
282
-
283
- Il est également possible de remplacer Erb par Erubis:
254
+ Vous pouvez également définir des options par langage de template de façon
255
+ générale :
284
256
 
285
- require 'erubis'
286
- Tilt.register :erb, Tilt[:erubis]
257
+ set :haml, :format => html5
287
258
 
288
259
  get '/' do
289
- erb :index
260
+ haml :index
290
261
  end
291
262
 
292
- Utilisera le template <tt>./views/index.erb</tt> avec Erubis.
263
+ Les options passées à la méthode de rendu prennent le pas sur les options
264
+ définies au moyen de +set+.
293
265
 
294
- === Templates Builder
266
+ Options disponibles :
295
267
 
296
- Le gem <tt>builder</tt> est nécessaire pour utiliser la fonction de rendu
297
- builder:
268
+ [locals]
269
+ Liste de variables locales passées au document. Pratique pour les vues
270
+ partielles.
271
+ Exemple : <tt>erb "<%= foo %>", :locals => {:foo => "bar"}</tt>.
298
272
 
299
- # Chargez la bibliothèque builder dans votre application
300
- require 'builder'
273
+ [default_encoding]
274
+ Encodage de caractères à utiliser en cas d'incertitude. Par défaut, c'est
275
+ <tt>settings.default_encoding</tt>.
301
276
 
302
- get '/' do
303
- builder :index
304
- end
277
+ [views]
278
+ Dossier de vues dans lequel chercher les templates. Par défaut
279
+ <tt>settings.views</tt>.
305
280
 
306
- Utilisera le template: <tt>./views/index.builder</tt>.
281
+ [layout]
282
+ 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>.
307
285
 
308
- === Templates Nokogiri
286
+ [content_type]
287
+ Content-Type que le template produit, dépend par défaut du langage de
288
+ template.
309
289
 
310
- Le gem <tt>nokogiri</tt> est nécessaire pour utiliser la fonction de rendu
311
- nokogiri:
290
+ [scope]
291
+ Contexte sous lequel effectuer le rendu du template. Par défaut il s'agit
292
+ de l'instance de l'application. Si vous changez cela, les variables
293
+ d'instance et les méthodes utilitaires ne seront pas disponibles.
312
294
 
313
- # Chargez la bibliothèque nokogiri dans votre application
314
- require 'nokogiri'
295
+ [layout_engine]
296
+ Moteur de rendu à utiliser pour le +layout+. Utile pour les langages ne
297
+ supportant pas les +layouts+. Il s'agit par défaut du moteur utilisé pour
298
+ le rendu du template. Exemple : <tt>set :rdoc, :layout_engine => :erb</tt>
315
299
 
316
- get '/' do
317
- nokogiri :index
318
- end
300
+ Les templates sont supposés se trouver directement dans le dossier
301
+ <tt>./views</tt>. Pour utiliser un dossier de vues différent :
319
302
 
320
- Utilisera le template: <tt>./views/index.nokogiri</tt>.
321
-
322
- === Templates Sass
303
+ set :views, settings.root + '/templates'
323
304
 
324
- Le gem <tt>haml</tt> ou <tt>sass</tt> est nécessaire pour utiliser la fonction
325
- de rendu Sass:
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
309
+ caractères au lieu de les considérer comme un chemin vers un fichier.
326
310
 
327
- # Chargez la bibliothèque haml ou sass dans votre application
328
- require 'sass'
311
+ === Langages de template disponibles
329
312
 
330
- get '/stylesheet.css' do
331
- sass :stylesheet
332
- end
313
+ 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 :
333
316
 
334
- Utilisera le template: <tt>./views/stylesheet.sass</tt>.
317
+ require 'rdiscount' # ou require 'bluecloth'
318
+ get('/') { markdown :index }
335
319
 
336
- {Les options de Sass}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
337
- peuvent se manipuler directement avec la configuration de Sinatra,
338
- voir {Options et Configuration}[http://www.sinatrarb.com/configuration.html],
339
- et supportent aussi la réécriture (surcharge) comme dans cet exemple.
320
+ === Templates Haml
340
321
 
341
- set :sass, :style => :compact # le style par défaut dans Sass est :nested
322
+ Dépendances:: {haml}[http://haml-lang.com/]
323
+ Extensions de fichier:: <tt>.haml</tt>
324
+ Exemple:: <tt>haml :index, :format => :html5</tt>
342
325
 
343
- get '/stylesheet.css' do
344
- sass :stylesheet, :style => :expanded # surcharge
345
- end
326
+ === Templates Erb
346
327
 
347
- === Scss Templates
328
+ Dépendances:: {erubis}[http://www.kuwata-lab.com/erubis/] ou
329
+ erb (inclus avec Ruby)
330
+ Extensions de fichier:: <tt>.erb</tt>, <tt>.rhtml</tt> or <tt>.erubis</tt>
331
+ (Erubis seulement)
332
+ Exemple:: <tt>erb :index</tt>
348
333
 
349
- Le gem <tt>haml</tt> ou <tt>sass</tt> est nécessaire pour utiliser la fonction
350
- de rendu Scss:
334
+ === Templates Builder
351
335
 
352
- # Chargez la bibliothèque haml ou sass dans votre application
353
- require 'sass'
336
+ Dépendances:: {builder}[http://builder.rubyforge.org/]
337
+ Extensions de fichier:: <tt>.builder</tt>
338
+ Exemple:: <tt>builder { |xml| xml.em "hi" }</tt>
354
339
 
355
- get '/stylesheet.css' do
356
- scss :stylesheet
357
- end
340
+ Ce moteur accepte également un bloc pour des templates en ligne (voir exemple).
358
341
 
359
- Utilisera le template <tt>./views/stylesheet.scss</tt>.
342
+ === Templates Nokogiri
360
343
 
361
- {Les options de Scss}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
362
- peuvent se manipuler directement avec la configuration de Sinatra,
363
- voir {Options et Configuration}[http://www.sinatrarb.com/configuration.html],
364
- et supportent aussi la réécriture (surcharge) comme dans cet exemple.
344
+ Dépendances:: {nokogiri}[http://nokogiri.org/]
345
+ Extensions de fichier:: <tt>.nokogiri</tt>
346
+ Exemple:: <tt>builder { |xml| xml.em "hi" }</tt>
365
347
 
366
- set :scss, :style => :compact # le style par défaut de Scss est :nested
348
+ Ce moteur accepte également un bloc pour des templates en ligne (voir exemple).
367
349
 
368
- get '/stylesheet.css' do
369
- scss :stylesheet, :style => :expanded # surcharge
370
- end
350
+ === Templates Sass
371
351
 
372
- === Templates Less
352
+ Dépendances:: {sass}[http://sass-lang.com/]
353
+ Extensions de fichier:: <tt>.sass</tt>
354
+ Exemple:: <tt>sass :stylesheet, :style => :expanded</tt>
373
355
 
374
- Le gem <tt>less</tt> est nécessaire pour utiliser la fonction de rendu Less:
356
+ === Templates SCSS
375
357
 
376
- # Chargez la bibliothèque less dans votre application
377
- require 'less'
358
+ Dépendances:: {sass}[http://sass-lang.com/]
359
+ Extensions de fichier:: <tt>.scss</tt>
360
+ Exemple:: <tt>scss :stylesheet, :style => :expanded</tt>
378
361
 
379
- get '/stylesheet.css' do
380
- less :stylesheet
381
- end
362
+ === Templates Less
382
363
 
383
- Utilisera le template: <tt>./views/stylesheet.less</tt>.
364
+ Dépendances:: {less}[http://www.lesscss.org/]
365
+ Extensions de fichier:: <tt>.less</tt>
366
+ Exemple:: <tt>less :stylesheet</tt>
384
367
 
385
368
  === Templates Liquid
386
369
 
387
- Le gem <tt>liquid</tt> est nécessaire pour utiliser la fonction de rendu
388
- Liquid:
389
-
390
- # Chargez la bibliothèque liquid dans votre application
391
- require 'liquid'
392
-
393
- get '/' do
394
- liquid :index
395
- end
396
-
397
- Utilisera <tt>./views/index.liquid</tt>.
370
+ Dépendances:: {liquid}[http://www.liquidmarkup.org/]
371
+ Extensions de fichier:: <tt>.liquid</tt>
372
+ Exemple:: <tt>liquid :index, :locals => { :key => 'value' }</tt>
398
373
 
399
- Comme vous ne pouvez pas appeler des méthodes Ruby (excepté +yield+) dans un
400
- template Liquid, il sera toujours nécessaire de lui passer des variables
401
- locales:
402
-
403
- liquid :index, :locals => { :key => 'value' }
374
+ Comme vous ne pouvez appeler de méthodes Ruby (autres que +yield+) dans un
375
+ template Liquid, vous aurez sûrement à lui passer des variables locales.
404
376
 
405
377
  === Templates Markdown
406
378
 
407
- Le gem <tt>rdiscount</tt> est nécessaire pour utiliser la fonction de rendu
408
- Markdown:
409
-
410
- # Chargez la bibliothèque rdiscount dans votre application
411
- require "rdiscount"
412
-
413
- get '/' do
414
- markdown :index
415
- end
416
-
417
- Utilisera <tt>./views/index.markdown</tt> (les extensions de fichier +md+ et
418
- +mkd+ sont également acceptées).
379
+ Dépendances:: {rdiscount}[https://github.com/rtomayko/rdiscount],
380
+ {redcarpet}[https://github.com/tanoku/redcarpet],
381
+ {bluecloth}[http://deveiate.org/projects/BlueCloth],
382
+ {kramdown}[http://kramdown.rubyforge.org/] *ou*
383
+ {maruku}[http://maruku.rubyforge.org/]
384
+ Extensions de fichier:: <tt>.markdown</tt>, <tt>.mkd</tt> and <tt>.md</tt>
385
+ Exemple:: <tt>markdown :index, :layout_engine => :erb</tt>
419
386
 
420
387
  Il n'est pas possible d'appeler des méthodes depuis markdown, ni même de lui
421
- passer des variables locales. Par conséquent, il sera le plus souvent utilisé
422
- en combinaison avec un autre moteur de rendu:
388
+ passer des variables locales. Par conséquent, il sera souvent utilisé en
389
+ combinaison avec un autre moteur de rendu :
423
390
 
424
- erb :vuedensemble, :locals => { :texte => markdown(:introduction) }
391
+ erb :overview, :locals => { :text => markdown(:introduction) }
425
392
 
426
393
  Notez que vous pouvez également appeler la méthode +markdown+ au sein d'autres
427
- templates:
428
-
429
- %h1 Bonjour Depuis Haml!
430
- %p= markdown(:salutations)
431
-
432
- Comme vous ne pouvez pas faire d'appels Ruby au sein de Markdown, vous ne
433
- pouvez pas utiliser des layouts écrits en Markdown. Il est toutefois possible
434
- d'utiliser un autre moteur de rendu pour le layout en passant l'option
435
- <tt>:layout_engine</tt> :
436
-
437
- get '/' do
438
- markdown :index, :layout_engine => :erb
439
- end
440
-
441
- Ceci utilisera <tt>./views/index.md</tt> avec <tt>./views/layout.erb</tt> pour
442
- layout.
443
-
444
- Souvenez vous que vous pouvez spécifier de telles options de rendu
445
- globalement :
446
-
447
- set :markdown, :layout_engine => :haml, :layout => :post
448
-
449
- get '/' do
450
- markdown :index
451
- end
394
+ templates :
452
395
 
453
- Ceci utilisera <tt>./views/index.md</tt> (et tout autre template Markdown)
454
- avec <tt>./views/post.haml</tt> pour layout.
396
+ %h1 Hello From Haml !
397
+ %p= markdown(:greetings)
455
398
 
456
- Il est également possible de traduire le Markdown avec BlueCloth plutôt que
457
- RDiscount :
458
-
459
- require 'bluecloth'
460
-
461
- Tilt.register 'markdown', BlueClothTemplate
462
- Tilt.register 'mkd', BlueClothTemplate
463
- Tilt.register 'md', BlueClothTemplate
464
-
465
- get '/' do
466
- markdown :index
467
- end
468
-
469
- Utilisera <tt>./views/index.md</tt> avec BlueCloth.
399
+ Comme vous ne pouvez pas appeler de Ruby au sein de Markdown, vous ne pouvez
400
+ 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>.
470
403
 
471
404
  === Templates Textile
472
405
 
473
- Le gem <tt>RedCloth</tt> est nécessaire pour utiliser la fonction de rendu
474
- Textile:
475
-
476
- # Chargez la bibliothèqye redcloth dans votre application
477
- require "redcloth"
478
-
479
- get '/' do
480
- textile :index
481
- end
482
-
483
- Utilisera <tt>./views/index.textile</tt>.
406
+ Dépendances:: {RedCloth}[http://redcloth.org/]
407
+ Extensions de fichier:: <tt>.textile</tt>
408
+ Exemple:: <tt>textile :index, :layout_engine => :erb</tt>
484
409
 
485
410
  Il n'est pas possible d'appeler des méthodes depuis textile, ni même de lui
486
- passer des variables locales. Par conséquent, il sera le plus souvent utilisé
487
- en combinaison avec un autre moteur de rendu:
411
+ passer des variables locales. Par conséquent, il sera souvent utilisé en
412
+ combinaison avec un autre moteur de rendu :
488
413
 
489
- erb :vuedensemble, :locals => { :texte => textile(:introduction) }
414
+ erb :overview, :locals => { :text => textile(:introduction) }
490
415
 
491
416
  Notez que vous pouvez également appeler la méthode +textile+ au sein d'autres
492
- templates:
493
-
494
- %h1 Bonjour Depuis Haml!
495
- %p= textile(:salutations)
417
+ templates :
496
418
 
497
- Comme vous ne pouvez pas faire d'appels Ruby au sein de Textile, vous ne
498
- pouvez pas utiliser des layouts écrits en Textile. Il est toutefois possible
499
- d'utiliser un autre moteur de rendu pour le layout en passant l'option
500
- <tt>:layout_engine</tt> :
419
+ %h1 Hello From Haml !
420
+ %p= textile(:greetings)
501
421
 
502
- get '/' do
503
- textile :index, :layout_engine => :erb
504
- end
505
-
506
- Ceci utilisera <tt>./views/index.textile</tt> avec <tt>./views/layout.erb</tt>
507
- pour layout.
508
-
509
- Souvenez vous que vous pouvez spécifier de telles options de rendu
510
- globalement :
511
-
512
- set :textile, :layout_engine => :haml, :layout => :post
513
-
514
- get '/' do
515
- textile :index
516
- end
517
-
518
- Ceci utilisera <tt>./views/index.textile</tt> (et tout autre template Textile)
519
- avec <tt>./views/post.haml</tt> pour layout.
422
+ Comme vous ne pouvez pas appeler de Ruby au sein de Textile, vous ne pouvez
423
+ 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>.
520
426
 
521
427
  === Templates RDoc
522
428
 
523
- Le gem <tt>rdoc</tt> est nécessaire pour utiliser la fonction de rendu RDoc:
524
-
525
- # Chargez la bibliothèque rdoc/markup/to_html dans votre application
526
- require "rdoc/markup/to_html"
527
-
528
- get '/' do
529
- rdoc :index
530
- end
531
-
532
- Utilisera <tt>./views/index.rdoc</tt>.
429
+ Dépendances:: {rdoc}[http://rdoc.rubyforge.org/]
430
+ Extensions de fichier:: <tt>.rdoc</tt>
431
+ Exemple:: <tt>textile :README, :layout_engine => :erb</tt>
533
432
 
534
433
  Il n'est pas possible d'appeler des méthodes depuis rdoc, ni même de lui
535
- passer des variables locales. Par conséquent, il sera le plus souvent utilisé
536
- en combinaison avec un autre moteur de rendu:
434
+ passer des variables locales. Par conséquent, il sera souvent utilisé en
435
+ combinaison avec un autre moteur de rendu :
537
436
 
538
- erb :vuedensemble, :locals => { :texte => rdoc(:introduction) }
437
+ erb :overview, :locals => { :text => rdoc(:introduction) }
539
438
 
540
439
  Notez que vous pouvez également appeler la méthode +rdoc+ au sein d'autres
541
- templates:
542
-
543
- %h1 Bonjour Depuis Haml!
544
- %p= rdoc(:salutations)
440
+ templates :
545
441
 
546
- Comme vous ne pouvez pas faire d'appels Ruby au sein de RDoc, vous ne
547
- pouvez pas utiliser des layouts écrits en RDoc. Il est toutefois possible
548
- d'utiliser un autre moteur de rendu pour le layout en passant l'option
549
- <tt>:layout_engine</tt> :
442
+ %h1 Hello From Haml !
443
+ %p= rdoc(:greetings)
550
444
 
551
- get '/' do
552
- rdoc :index, :layout_engine => :erb
553
- end
554
-
555
- Ceci utilisera <tt>./views/index.rdoc</tt> avec <tt>./views/layout.erb</tt>
556
- pour layout.
557
-
558
- Souvenez vous que vous pouvez spécifier de telles options de rendu
559
- globalement :
560
-
561
- set :rdoc, :layout_engine => :haml, :layout => :post
562
-
563
- get '/' do
564
- rdoc :index
565
- end
566
-
567
- Ceci utilisera <tt>./views/index.rdoc</tt> (et tout autre template RDoc)
568
- avec <tt>./views/post.haml</tt> pour layout.
445
+ Comme vous ne pouvez pas appeler de Ruby au sein de RDoc, vous ne pouvez
446
+ 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>.
569
449
 
570
450
  === Templates Radius
571
451
 
572
- Le gem radius est nécessaire pour utiliser la fonction de rendu Radius:
573
-
574
- # Chargez la bibliothèque radius dans votre application
575
- require 'radius'
576
-
577
- get '/' do
578
- radius :index
579
- end
452
+ Dépendances:: {radius}[http://radius.rubyforge.org/]
453
+ Extensions de fichier:: <tt>.radius</tt>
454
+ Exemple:: <tt>radius :index, :locals => { :key => 'value' }</tt>
580
455
 
581
- Utilisera <tt>./views/index.radius</tt>.
582
-
583
- Comme vous ne pouvez pas appeler des méthodes Ruby (excepté +yield+) dans un
584
- template Radius, il sera toujours nécessaire de lui passer des variables
585
- locales:
586
-
587
- radius :index, :locals => { :key => 'value' }
456
+ Comme vous ne pouvez pas appeler de méthodes Ruby depuis un template Radius,
457
+ vous aurez sûrement à lui passer des variables locales
588
458
 
589
459
  === Templates Markaby
590
460
 
591
- Le gem markaby est nécessaire pour utiliser la fonction de rendu Markaby:
461
+ Dépendances:: {markaby}[http://markaby.github.com/]
462
+ Extensions de fichier:: <tt>.mab</tt>
463
+ Exemple:: <tt>markaby { h1 "Bienvenue !" }</tt>
592
464
 
593
- # Chargez la bibliothèque markaby dans votre application
594
- require 'markaby'
595
-
596
- get '/' do
597
- markaby :index
598
- end
599
-
600
- Utilisera <tt>./views/index.mab</tt>.
601
-
602
- Vous pouvez également utiliser Markaby en ligne :
603
-
604
- get '/' do
605
- markaby { h1 "Salut !" }
606
- end
465
+ Ce moteur accepte également un bloc pour des templates en ligne (voir exemple).
607
466
 
608
467
  === Templates Slim
609
468
 
610
- Le gem slim est nécessaire pour utiliser la fonction de rendu Slim:
611
-
612
- # Chargez la bibliothèque slim dans votre application
613
- require 'slim'
614
-
615
- get '/' do
616
- slim :index
617
- end
618
-
619
- Utilisera <tt>./views/index.slim</tt>.
469
+ Dépendances:: {slim}[http://slim-lang.com/]
470
+ Extensions de fichier:: <tt>.slim</tt>
471
+ Exemple:: <tt>slim :index</tt>
620
472
 
621
473
  === Templates Creole
622
474
 
623
- Le gem <tt>creole</tt> est nécessaire pour utiliser la fonction de rendu
624
- Creole:
475
+ Dépendances:: {creole}[https://github.com/minad/creole]
476
+ Extensions de fichier:: <tt>.creole</tt>
477
+ Exemple:: <tt>creole :wiki, :layout_engine => :erb</tt>
625
478
 
626
- # Chargez la bibliothèque creole dans votre application
627
- require 'creole'
628
-
629
- get '/' do
630
- creole :index
631
- end
632
-
633
- Utilisera <tt>./views/index.creole</tt>.
634
-
635
- === Templates CoffeeScript
479
+ Il n'est pas possible d'appeler des méthodes depuis creole, ni même de lui
480
+ passer des variables locales. Par conséquent, il sera souvent utilisé en
481
+ combinaison avec un autre moteur de rendu :
636
482
 
637
- Le gem <tt>coffee-script</tt> est nécessaire ainsi que l'<b>une</b> des
638
- options suivantes permettant l'exécution de Java script :
483
+ erb :overview, :locals => { :text => creole(:introduction) }
639
484
 
640
- * +node+ (de Node.js) dans votre path
641
- * vous êtes sous OSX
642
- * le gem +therubyracer+
485
+ Notez que vous pouvez également appeler la méthode +creole+ au sein d'autres
486
+ templates :
643
487
 
644
- Voir http://github.com/josh/ruby-coffee-script pour une liste à jour d'options
645
- possibles.
488
+ %h1 Hello From Haml !
489
+ %p= creole(:greetings)
646
490
 
647
- Maintenant vous pouvez générer des templates CoffeeScript :
491
+ Comme vous ne pouvez pas appeler de Ruby au sein de Creole, vous ne pouvez
492
+ 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>.
648
495
 
649
- # Chargez la bibliothèque coffee-script dans votre application
650
- require 'coffee-script'
651
-
652
- get '/application.js' do
653
- coffee :application
654
- end
496
+ === Templates CoffeeScript
655
497
 
656
- Utilisera <tt>./views/application.coffee</tt>.
498
+ Dépendances:: {coffee-script}[https://github.com/josh/ruby-coffee-script]
499
+ et un {moyen d'exécuter javascript}[https://github.com/sstephenson/execjs/blob/master/README.md#readme]
500
+ Extensions de fichier:: <tt>.coffee</tt>
501
+ Exemple:: <tt>coffee :index</tt>
657
502
 
658
503
  === Templates embarqués
659
504
 
660
505
  get '/' do
661
- haml '%div.title Bonjour Monde'
506
+ haml '%div.title Bonjour le monde'
662
507
  end
663
508
 
664
509
  Générera le template embarqué spécifié dans la chaîne de caractères.
@@ -667,14 +512,14 @@ Générera le template embarqué spécifié dans la chaîne de caractères.
667
512
 
668
513
  Un template est évalué dans le même contexte que l'endroit d'où il a été
669
514
  appelé (gestionnaire de route). Les variables d'instance déclarées dans le
670
- gestionnaire de route sont directement accessibles dans le template:
515
+ gestionnaire de route sont directement accessibles dans le template :
671
516
 
672
517
  get '/:id' do
673
518
  @foo = Foo.find(params[:id])
674
519
  haml '%h1= @foo.nom'
675
520
  end
676
521
 
677
- Alternativement, on peut passer un hash contenant des variables locales:
522
+ Alternativement, on peut passer un hash contenant des variables locales :
678
523
 
679
524
  get '/:id' do
680
525
  foo = Foo.find(params[:id])
@@ -687,7 +532,7 @@ noms de variables.
687
532
 
688
533
  === Templates dans le fichier source
689
534
 
690
- Des templates peuvent être définis dans le fichier source comme ceci:
535
+ Des templates peuvent être définis dans le fichier source comme ceci :
691
536
 
692
537
  require 'sinatra'
693
538
 
@@ -702,24 +547,24 @@ Des templates peuvent être définis dans le fichier source comme ceci:
702
547
  = yield
703
548
 
704
549
  @@ index
705
- %div.title Bonjour Monde!!!!!
550
+ %div.title Bonjour le monde !
706
551
 
707
- NOTE: Les templates du fichier source qui contient <tt>require 'sinatra'</tt>
552
+ NOTE : Les templates du fichier source qui contient <tt>require 'sinatra'</tt>
708
553
  sont automatiquement chargés. Si vous avez des templates dans d'autres
709
- fichiers source, il faut explicitement les déclarer via:
554
+ fichiers source, il faut explicitement les déclarer avec
710
555
  <tt>enable :inline_templates</tt>.
711
556
 
712
557
  === Templates nommés
713
558
 
714
559
  Les templates peuvent aussi être définis grâce à la méthode de haut niveau
715
- <tt>template</tt>:
560
+ <tt>template</tt> :
716
561
 
717
562
  template :layout do
718
563
  "%html\n =yield\n"
719
564
  end
720
565
 
721
566
  template :index do
722
- '%div.title Bonjour Monde!'
567
+ '%div.title Bonjour le monde !'
723
568
  end
724
569
 
725
570
  get '/' do
@@ -729,7 +574,7 @@ Les templates peuvent aussi être définis grâce à la méthode de haut niveau
729
574
  Si un template nommé "layout" existe, il sera utilisé à chaque fois qu'un
730
575
  template sera affiché. Vous pouvez désactivez les layouts au cas par cas en
731
576
  passant <tt>:layout => false</tt> ou bien les désactiver par défaut au moyen
732
- de <tt>set :haml, :layout => false</tt>:
577
+ de <tt>set :haml, :layout => false</tt> :
733
578
 
734
579
  get '/' do
735
580
  haml :index, :layout => !request.xhr?
@@ -766,22 +611,22 @@ https://github.com/rtomayko/tilt pour en savoir plus sur Tilt.
766
611
  Un filtre <tt>before</tt> est évalué avant n'importe quelle requête, dans le
767
612
  contexte de celle-ci, et peut modifier la requête ou la réponse. Les variables
768
613
  d'instance déclarées dans le filtre sont accessibles au gestionnaire de route
769
- et au template:
614
+ et au template :
770
615
 
771
616
  before do
772
- @note = 'Coucou!'
617
+ @note = 'Coucou !'
773
618
  request.path_info = '/foo/bar/baz'
774
619
  end
775
620
 
776
621
  get '/foo/*' do
777
- @note #=> 'Coucou!'
622
+ @note #=> 'Coucou !'
778
623
  params[:splat] #=> 'bar/baz'
779
624
  end
780
625
 
781
626
  Un filtre <tt>after</tt> est évalué après chaque requête, dans le contexte
782
627
  de celle-ci et peut également modifier la requête et/ou la réponse. Toutes les
783
628
  variables d'instance déclarées dans un filtre <tt>before</tt> et dans le
784
- gestionnaire de route sont accessibles dans le filtre <tt>after</tt>:
629
+ gestionnaire de route sont accessibles dans le filtre <tt>after</tt> :
785
630
 
786
631
  after do
787
632
  puts response.status
@@ -793,7 +638,7 @@ pas disponible dans le filtre <tt>after</tt>, étant donné qu'il est généré
793
638
  plus tard.
794
639
 
795
640
  En option, on peut passer un masque au filtre, ce qui le rend actif uniquement
796
- si la requête correspond au masque en question:
641
+ si la requête correspond au masque en question :
797
642
 
798
643
  before '/secret/*' do
799
644
  authentification!
@@ -830,7 +675,7 @@ qui seront accessibles dans vos gestionnaires de route et dans vos templates :
830
675
 
831
676
  === Utiliser les sessions
832
677
 
833
- Une session est utilisé pour conserver un état entre les requêtes. Une fois
678
+ Une session est utilisée pour conserver un état entre les requêtes. Une fois
834
679
  activées, vous avez un +hash+ de session par session utilisateur :
835
680
 
836
681
  enable :sessions
@@ -864,19 +709,19 @@ Pour renforcer la sécurité, les données de session dans le cookie sont signé
864
709
  avec une clé secrète de session. Une clé secrète est générée pour vous au
865
710
  hasard par Sinatra. Toutefois, comme cette clé change à chaque démarrage de
866
711
  votre application, vous pouvez définir cette clé vous-même afin que toutes
867
- les instances de votre application la partage:
712
+ les instances de votre application la partage :
868
713
 
869
714
  set :session_secret, 'super secret'
870
715
 
871
716
  Si vous souhaitez avoir plus de contrôle, vous pouvez également enregistrer un
872
- +hash+ avec des options lors de la configuration de +sessions+:
717
+ +hash+ avec des options lors de la configuration de +sessions+ :
873
718
 
874
719
  set :sessions, :domain => 'foo.com'
875
720
 
876
721
  == Halt
877
722
 
878
723
  Pour arrêter immédiatement la requête dans un filtre ou un gestionnaire de
879
- route:
724
+ route :
880
725
 
881
726
  halt
882
727
 
@@ -890,28 +735,28 @@ Ou le texte ...
890
735
 
891
736
  Ou les deux ...
892
737
 
893
- halt 401, 'Partez!'
738
+ halt 401, 'Partez !'
894
739
 
895
740
  Ainsi que les entêtes ...
896
741
 
897
742
  halt 402, {'Content-Type' => 'text/plain'}, 'revanche'
898
743
 
899
- Bien sûr il est possible de cominer un template avec +halt+:
744
+ Bien sûr il est possible de combiner un template avec +halt+ :
900
745
 
901
746
  halt erb(:erreur)
902
747
 
903
748
  == Passer
904
749
 
905
750
  Une route peut passer le relais aux autres routes qui correspondent également
906
- avec <tt>pass</tt>:
751
+ avec <tt>pass</tt> :
907
752
 
908
753
  get '/devine/:qui' do
909
754
  pass unless params[:qui] == 'Frank'
910
- "Tu m'as eu!"
755
+ "Tu m'as eu !"
911
756
  end
912
757
 
913
758
  get '/devine/*' do
914
- 'Manqué!'
759
+ 'Manqué !'
915
760
  end
916
761
 
917
762
  On sort donc immédiatement de ce gestionnaire et on continue à chercher,
@@ -973,7 +818,7 @@ retour et les entêtes :
973
818
  headers \
974
819
  "Allow" => "BREW, POST, GET, PROPFIND, WHEN"
975
820
  "Refresh" => "Refresh: 20; http://www.ietf.org/rfc/rfc2324.txt"
976
- body "I'm a tea pot!"
821
+ body "Je suis une théière !"
977
822
  end
978
823
 
979
824
  Comme +body+, +headers+ et +status+ peuvent être utilisés sans arguments
@@ -982,7 +827,7 @@ pour accéder à leurs valeurs.
982
827
  === Journalisation (Logging)
983
828
 
984
829
  Dans le contexte de la requête, la méthode utilitaire +logger+ expose une
985
- instance de +logger+:
830
+ instance de +logger+ :
986
831
 
987
832
  get '/' do
988
833
  logger.info "chargement des données"
@@ -996,7 +841,7 @@ vous n'avez pas à vous en inquiéter dans vos routes en le filtrant.
996
841
 
997
842
  Notez que la journalisation est seulement activée par défaut pour
998
843
  <tt>Sinatra::Application</tt>, donc si vous héritez de <tt>Sinatra::Base</tt>,
999
- vous aurez à l'activer vous-même:
844
+ vous aurez à l'activer vous-même :
1000
845
 
1001
846
  class MonApp < Sinatra::Base
1002
847
  configure(:production, :development) do
@@ -1010,7 +855,9 @@ Quand vous utilisez <tt>send_file</tt> ou des fichiers statiques, vous
1010
855
  pouvez rencontrer des types mime que Sinatra ne connaît pas. Utilisez
1011
856
  +mime_type+ pour les déclarer par extension de fichier :
1012
857
 
1013
- mime_type :foo, 'text/foo'
858
+ configure do
859
+ mime_type :foo, 'text/foo'
860
+ end
1014
861
 
1015
862
  Vous pouvez également les utiliser avec la méthode +content_type+ :
1016
863
 
@@ -1047,7 +894,7 @@ Tout paramètre additionnel est géré comme des arguments pour la méthode
1047
894
  redirect 'http://google.com', 'mauvais endroit mon pote'
1048
895
 
1049
896
  Vous pouvez aussi rediriger vers la page dont l'utilisateur venait au moyen de
1050
- <tt>redirect back</tt>:
897
+ <tt>redirect back</tt> :
1051
898
 
1052
899
  get '/foo' do
1053
900
  "<a href='/bar'>faire quelque chose</a>"
@@ -1077,7 +924,7 @@ Ou bien utilisez une session :
1077
924
 
1078
925
  === Contrôle du cache
1079
926
 
1080
- Définir correctement vos entêtes à la base pour un bon cahce HTTP.
927
+ Définir correctement vos entêtes à la base pour un bon cache HTTP.
1081
928
 
1082
929
  Vous pouvez facilement définir l'entête Cache-Control de la manière suivante :
1083
930
 
@@ -1086,7 +933,7 @@ Vous pouvez facilement définir l'entête Cache-Control de la manière suivante
1086
933
  "met le en cache !"
1087
934
  end
1088
935
 
1089
- Conseil de pro : définir le cache dans un filtre +before+:
936
+ Conseil de pro : définir le cache dans un filtre +before+ :
1090
937
 
1091
938
  before do
1092
939
  cache_control :public, :must_revalidate, :max_age => 60
@@ -1101,8 +948,8 @@ Si vous utilisez la méthode +expires+ pour définir l'entête correspondant,
1101
948
 
1102
949
  Pour utiliser correctement les caches, vous devriez utiliser +etag+ et
1103
950
  +last_modified+. Il est recommandé d'utiliser ces méthodes *avant* de faire
1104
- d'important modifications, car elles vont immédiatement déclencher la réponse
1105
- si le client a déjà la version courante dans son cache:
951
+ d'importantes modifications, car elles vont immédiatement déclencher la réponse
952
+ si le client a déjà la version courante dans son cache :
1106
953
 
1107
954
  get '/article/:id' do
1108
955
  @article = Article.find params[:id]
@@ -1112,14 +959,14 @@ si le client a déjà la version courante dans son cache:
1112
959
  end
1113
960
 
1114
961
  Il est également possible d'utiliser un
1115
- {weak ETag}[http://en.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation]:
962
+ {weak ETag}[http://en.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation] :
1116
963
 
1117
964
  etag @article.sha1, :weak
1118
965
 
1119
966
  Ces méthodes ne sont pas chargées de mettre des données en cache, mais elles
1120
967
  fournissent les informations nécessaires pour votre cache. Si vous êtes à la
1121
968
  recherche de solutions rapides de cache, essayez
1122
- {rack-cache}[http://rtomayko.github.com/rack-cache/]:
969
+ {rack-cache}[http://rtomayko.github.com/rack-cache/] :
1123
970
 
1124
971
  require "rack/cache"
1125
972
  require "sinatra"
@@ -1173,7 +1020,7 @@ automatiquement les requêtes de type +range+.
1173
1020
 
1174
1021
  L'objet correspondant à la requête envoyée peut être récupéré dans le contexte
1175
1022
  de la requête (filtres, routes, gestionnaires d'erreur) au moyen de la méthode
1176
- `request`:
1023
+ +request+ :
1177
1024
 
1178
1025
  # application tournant à l'adresse http://exemple.com/exemple
1179
1026
  get '/foo' do
@@ -1210,7 +1057,7 @@ de la requête (filtres, routes, gestionnaires d'erreur) au moyen de la méthode
1210
1057
  end
1211
1058
 
1212
1059
  Certaines options, telles que <tt>script_name</tt> ou <tt>path_info</tt>
1213
- peuvent également être modifiées:
1060
+ peuvent également être modifiées :
1214
1061
 
1215
1062
  before { request.path_info = "/" }
1216
1063
 
@@ -1218,18 +1065,18 @@ peuvent également être modifiées:
1218
1065
  "toutes les requêtes arrivent ici"
1219
1066
  end
1220
1067
 
1221
- <tt>request.body</tt> est un objet IO ou StringIO:
1068
+ <tt>request.body</tt> est un objet IO ou StringIO :
1222
1069
 
1223
1070
  post "/api" do
1224
1071
  request.body.rewind # au cas où il a déjà été lu
1225
1072
  donnees = JSON.parse request.body.read
1226
- "Bonjour #{donnees['nom']}!"
1073
+ "Bonjour #{donnees['nom']} !"
1227
1074
  end
1228
1075
 
1229
1076
  === Fichiers joints
1230
1077
 
1231
1078
  Vous pouvez utiliser la méthode +attachment+ pour indiquer au navigateur que
1232
- la réponse devrait être stockée sur le disque plutôt qu'affichée:
1079
+ la réponse devrait être stockée sur le disque plutôt qu'affichée :
1233
1080
 
1234
1081
  get '/' do
1235
1082
  attachment
@@ -1289,7 +1136,7 @@ devriez garder cela en tête si vous écrivez une méthode vraiment dingue.
1289
1136
 
1290
1137
  == Configuration
1291
1138
 
1292
- Lancé une seule fois au démarrage de tous les environnements:
1139
+ Lancé une seule fois au démarrage de tous les environnements :
1293
1140
 
1294
1141
  configure do
1295
1142
  # définir un paramètre
@@ -1298,10 +1145,10 @@ Lancé une seule fois au démarrage de tous les environnements:
1298
1145
  # définir plusieurs paramètre
1299
1146
  set :a => 1, :b => 2
1300
1147
 
1301
- # identique à `set :option, true`
1148
+ # identique à "set :option, true"
1302
1149
  enable :option
1303
1150
 
1304
- # identique à `set :option, false`
1151
+ # identique à "set :option, false""
1305
1152
  disable :option
1306
1153
 
1307
1154
  # vous pouvez également avoir des paramètres dynamiques avec des blocs
@@ -1309,14 +1156,14 @@ Lancé une seule fois au démarrage de tous les environnements:
1309
1156
  end
1310
1157
 
1311
1158
  Lancé si l'environnement (variable d'environnement RACK_ENV) est défini comme
1312
- <tt>:production</tt>:
1159
+ <tt>:production</tt> :
1313
1160
 
1314
1161
  configure :production do
1315
1162
  ...
1316
1163
  end
1317
1164
 
1318
1165
  Lancé si l'environnement est <tt>:production</tt> ou
1319
- <tt>:test</tt>:
1166
+ <tt>:test</tt> :
1320
1167
 
1321
1168
  configure :production, :test do
1322
1169
  ...
@@ -1363,7 +1210,7 @@ Vous pouvez accéder à ces paramètres via <tt>settings</tt> :
1363
1210
  dossier de vues ainsi que pour les templates en ligne.
1364
1211
 
1365
1212
  [bind] adresse IP sur laquelle se brancher
1366
- (par défaut: 0.0.0.0).
1213
+ (par défaut : 0.0.0.0).
1367
1214
  Utiliser seulement pour le serveur intégré.
1368
1215
 
1369
1216
  [default_encoding] encodage à utiliser si inconnu (par défaut
@@ -1425,7 +1272,8 @@ Vous pouvez accéder à ces paramètres via <tt>settings</tt> :
1425
1272
  fichiers statiques.
1426
1273
  Désactivez si vous utilisez un serveur capable de le
1427
1274
  gérer lui même. Le désactiver augmentera la performance.
1428
- Activé par défaut.
1275
+ Activé par défaut pour le style classique, désactivé pour
1276
+ le style modulaire.
1429
1277
 
1430
1278
  [views] dossier des vues.
1431
1279
 
@@ -1435,43 +1283,43 @@ Les gestionnaires d'erreur s'exécutent dans le même contexte que les routes ou
1435
1283
  les filtres, ce qui veut dire que vous avez accès (entre autres) aux bons
1436
1284
  vieux <tt>haml</tt>, <tt>erb</tt>, <tt>halt</tt>, etc.
1437
1285
 
1438
- === Pas Trouvé
1286
+ === NotFound
1439
1287
 
1440
1288
  Quand une exception <tt>Sinatra::NotFound</tt> est soulevée, ou que le code
1441
- retour est 404, le gestionnaire <tt>not_found</tt> est invoqué:
1289
+ retour est 404, le gestionnaire <tt>not_found</tt> est invoqué :
1442
1290
 
1443
1291
  not_found do
1444
1292
  'Pas moyen de trouver ce que vous cherchez'
1445
1293
  end
1446
1294
 
1447
- === Erreur
1295
+ === Error
1448
1296
 
1449
1297
  Le gestionnaire +error+ est invoqué à chaque fois qu'une exception est
1450
1298
  soulevée dans une route ou un filtre. L'objet exception est accessible via la
1451
- variable Rack <tt>sinatra.error</tt>:
1299
+ variable Rack <tt>sinatra.error</tt> :
1452
1300
 
1453
1301
  error do
1454
1302
  'Désolé mais une méchante erreur est survenue - ' + env['sinatra.error'].name
1455
1303
  end
1456
1304
 
1457
- Erreur sur mesure:
1305
+ Erreur sur mesure :
1458
1306
 
1459
1307
  error MonErreurSurMesure do
1460
1308
  'Donc il est arrivé ceci...' + env['sinatra.error'].message
1461
1309
  end
1462
1310
 
1463
- Donc si ceci arrive:
1311
+ Donc si ceci arrive :
1464
1312
 
1465
1313
  get '/' do
1466
1314
  raise MonErreurSurMesure, 'quelque chose de mal'
1467
1315
  end
1468
1316
 
1469
- Vous obtenez ça:
1317
+ Vous obtenez ça :
1470
1318
 
1471
1319
  Donc il est arrivé ceci... quelque chose de mal
1472
1320
 
1473
1321
  Alternativement, vous pouvez avoir un gestionnaire d'erreur associé à un code
1474
- particulier:
1322
+ particulier :
1475
1323
 
1476
1324
  error 403 do
1477
1325
  'Accès interdit'
@@ -1481,7 +1329,7 @@ particulier:
1481
1329
  403
1482
1330
  end
1483
1331
 
1484
- Ou un intervalle:
1332
+ Ou un intervalle :
1485
1333
 
1486
1334
  error 400..510 do
1487
1335
  'Boom'
@@ -1501,7 +1349,7 @@ visualiser/manipuler la requête/réponse HTTP, et d'offrir diverses
1501
1349
  fonctionnalités classiques.
1502
1350
 
1503
1351
  Sinatra permet de construire facilement des middlewares Rack via la méthode de
1504
- haut niveau +use+:
1352
+ haut niveau +use+ :
1505
1353
 
1506
1354
  require 'sinatra'
1507
1355
  require 'mon_middleware_perso'
@@ -1510,13 +1358,13 @@ haut niveau +use+:
1510
1358
  use MonMiddlewarePerso
1511
1359
 
1512
1360
  get '/bonjour' do
1513
- 'Bonjour Monde'
1361
+ 'Bonjour le monde'
1514
1362
  end
1515
1363
 
1516
1364
  La sémantique de +use+ est identique à celle définie dans le DSL de
1517
1365
  Rack::Builder[http://rack.rubyforge.org/doc/classes/Rack/Builder.html]
1518
1366
  (le plus souvent utilisé dans un fichier rackup). Par exemple, la méthode
1519
- +use+ accepte divers arguments ainsi que des blocs:
1367
+ +use+ accepte divers arguments ainsi que des blocs :
1520
1368
 
1521
1369
  use Rack::Auth::Basic do |login, password|
1522
1370
  login == 'admin' && password == 'secret'
@@ -1531,7 +1379,7 @@ configuration, donc pour ceux-ci vous n'aurez pas à utiliser la méthode +use+.
1531
1379
 
1532
1380
  Les tests pour Sinatra peuvent être écrit avec n'importe quelle bibliothèque
1533
1381
  basée sur Rack. {Rack::Test}[http://gitrdoc.com/brynary/rack-test] est
1534
- recommandé:
1382
+ recommandé :
1535
1383
 
1536
1384
  require 'mon_application_sinatra'
1537
1385
  require 'test/unit'
@@ -1546,23 +1394,20 @@ recommandé:
1546
1394
 
1547
1395
  def test_ma_racine
1548
1396
  get '/'
1549
- assert_equal 'Bonjour Monde!', last_response.body
1397
+ assert_equal 'Bonjour le monde !', last_response.body
1550
1398
  end
1551
1399
 
1552
1400
  def test_avec_des_parametres
1553
1401
  get '/rencontrer', :name => 'Frank'
1554
- assert_equal 'Salut Frank!', last_response.body
1402
+ assert_equal 'Salut Frank !', last_response.body
1555
1403
  end
1556
1404
 
1557
1405
  def test_avec_rack_env
1558
1406
  get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
1559
- assert_equal "Vous utilisez Songbird!", last_response.body
1407
+ assert_equal "Vous utilisez Songbird !", last_response.body
1560
1408
  end
1561
1409
  end
1562
1410
 
1563
- NOTE: Le module intégré Sinatra::Test et la classe Sinatra::TestHarness
1564
- sont désapprouvés depuis la version 0.9.2 .
1565
-
1566
1411
  == Sinatra::Base - Les Middlewares, les Bibliothèques, et les Applications Modulaires
1567
1412
 
1568
1413
  Définir votre application au niveau supérieur fonctionne bien pour les
@@ -1571,8 +1416,8 @@ de créer des composants réutilisables comme des middlewares Rack, faire
1571
1416
  du Rails metal, ou de simples bibliothèques avec un composant serveur, ou
1572
1417
  même une extension pour Sinatra. Le DSL de haut niveau pollue l'espace de noms
1573
1418
  et est une configuration adaptée à une micro-application (un fichier unique
1574
- pour l'application, les dossiers ./public et ./views, les logs, pages
1575
- d'erreur, etc.). C'est là que Sinatra::Base entre en jeu:
1419
+ pour l'application, les dossiers <tt>./public</tt> et <tt>./views</tt>, les
1420
+ logs, pages d'erreur, etc.). C'est là que <tt>Sinatra::Base</tt> entre en jeu :
1576
1421
 
1577
1422
  require 'sinatra/base'
1578
1423
 
@@ -1581,20 +1426,20 @@ d'erreur, etc.). C'est là que Sinatra::Base entre en jeu:
1581
1426
  set :foo, 'bar'
1582
1427
 
1583
1428
  get '/' do
1584
- 'Bonjour Monde!'
1429
+ 'Bonjour le monde !'
1585
1430
  end
1586
1431
  end
1587
1432
 
1588
- Les méthodes disponibles dans Sinatra::Base sont exactement identiques à
1589
- celles disponibles dans le DSL de haut niveau. La plupart des applications
1590
- de haut niveau peuvent être converties en composant Sinatra::Base avec
1591
- deux modifications:
1433
+ Les méthodes disponibles dans <tt>Sinatra::Base</tt> sont exactement identiques
1434
+ à celles disponibles dans le DSL de haut niveau. La plupart des applications
1435
+ de haut niveau peuvent être converties en composant <tt>Sinatra::Base</tt> avec
1436
+ deux modifications :
1592
1437
 
1593
- * Votre fichier doit charger +sinatra/base+ au lieu de +sinatra+;
1438
+ * Votre fichier doit charger +sinatra/base+ au lieu de +sinatra+ ;
1594
1439
  autrement, toutes les méthodes de la DSL seront chargées dans l'espace
1595
- de noms.
1440
+ de noms.
1596
1441
  * Mettre vos gestionnaires de route, vos gestionnaires d'erreur, vos filtres
1597
- et options dans une sous-classe de Sinatra::Base.
1442
+ et options dans une sous-classe de <tt>Sinatra::Base</tt>.
1598
1443
 
1599
1444
  <tt>Sinatra::Base</tt> est plutôt épuré. La plupart des options sont
1600
1445
  désactivées par défaut, ceci inclus le serveur. Voir {Options et
@@ -1619,7 +1464,7 @@ Il n'y a que deux inconvénient au style classique comparé au style modulaire :
1619
1464
  Il n'y pas d'empêchement à mélanger style classic et style modulaire.
1620
1465
 
1621
1466
  Si vous passez d'un style à l'autre, vous devriez être vigilant à quelques
1622
- légères différences dans les paramètres :
1467
+ légères différences dans les paramètres par défaut :
1623
1468
 
1624
1469
  Paramètre Classique Modulaire
1625
1470
 
@@ -1628,6 +1473,7 @@ légères différences dans les paramètres :
1628
1473
  logging true false
1629
1474
  method_override true false
1630
1475
  inline_templates true false
1476
+ static true false
1631
1477
 
1632
1478
 
1633
1479
  === Servir une application modulaire
@@ -1653,7 +1499,7 @@ Ou alors avec un fichier <tt>config.ru</tt>, qui permet d'utiliser n'importe
1653
1499
  quel gestionnaire Rack :
1654
1500
 
1655
1501
  # config.ru
1656
- require 'my_app'
1502
+ require './my_app'
1657
1503
  run MyApp
1658
1504
 
1659
1505
  Exécutez :
@@ -1668,12 +1514,12 @@ Ecrivez votre application :
1668
1514
  require 'sinatra'
1669
1515
 
1670
1516
  get '/' do
1671
- 'Hello world!'
1517
+ 'Bonjour le monde !'
1672
1518
  end
1673
1519
 
1674
1520
  Et un fichier <tt>config.ru</tt> correspondant :
1675
1521
 
1676
- require 'app'
1522
+ require './app'
1677
1523
  run Sinatra::Application
1678
1524
 
1679
1525
  === Quand utiliser un fichier config.ru ?
@@ -1696,7 +1542,7 @@ Non seulement Sinatra peut utiliser d'autres middlewares Rack, il peut
1696
1542
  également être à son tour utilisé au-dessus de n'importe quel +endpoint+ Rack
1697
1543
  en tant que middleware. Ce +endpoint+ peut très bien être une autre
1698
1544
  application Sinatra, ou n'importe quelle application basée sur Rack
1699
- (Rails/Ramaze/Camping/...):
1545
+ (Rails/Ramaze/Camping/...) :
1700
1546
 
1701
1547
  require 'sinatra/base'
1702
1548
 
@@ -1706,7 +1552,7 @@ application Sinatra, ou n'importe quelle application basée sur Rack
1706
1552
  get('/connexion') { haml :connexion }
1707
1553
 
1708
1554
  post('/connexion') do
1709
- if params[:nom] = 'admin' and params[:motdepasse] = 'admin'
1555
+ if params[:nom] = 'admin' && params[:motdepasse] = 'admin'
1710
1556
  session['nom_utilisateur'] = params[:nom]
1711
1557
  else
1712
1558
  redirect '/connexion'
@@ -1731,13 +1577,13 @@ application Sinatra, ou n'importe quelle application basée sur Rack
1731
1577
 
1732
1578
  Il se peut que vous ayez besoin de créer une nouvelle application à l'exécution
1733
1579
  sans avoir à les assigner à une constante, vous pouvez le faire grâce à
1734
- `Sinatra.new`:
1580
+ <tt>Sinatra.new</tt> :
1735
1581
 
1736
1582
  require 'sinatra/base'
1737
1583
  mon_app = Sinatra.new { get('/') { "salut" } }
1738
1584
  mon_app.run!
1739
1585
 
1740
- L'application dont elle hérite peut être passé en argument optionnel:
1586
+ L'application dont elle hérite peut être passé en argument optionnel :
1741
1587
 
1742
1588
  require 'sinatra/base'
1743
1589
 
@@ -1757,7 +1603,7 @@ L'application dont elle hérite peut être passé en argument optionnel:
1757
1603
  C'est notamment utile pour tester des extensions à Sinatra ou bien pour
1758
1604
  utiliser Sinatra dans votre propre bibliothèque.
1759
1605
 
1760
- Cela permet également d'utiliser très facilement Sinatra comme middleware:
1606
+ Cela permet également d'utiliser très facilement Sinatra comme middleware :
1761
1607
 
1762
1608
  require 'sinatra/base'
1763
1609
 
@@ -1774,50 +1620,50 @@ disponibles.
1774
1620
 
1775
1621
  === Contexte de l'application/classe
1776
1622
 
1777
- Toute application Sinatra correspond à une sous-classe de Sinatra::Base. Si
1778
- vous utilisez le DSL haut niveau (<tt>require 'sinatra'</tt>), alors cette
1779
- classe est Sinatra::Application, sinon il s'agit de la sous-classe que vous
1780
- avez définie. Dans le contexte de la classe, vous avez accès aux méthodes
1781
- telles que `get` ou `before`, mais vous n'avez pas accès aux objets `request`
1782
- ou `session` car c'est la même classe d'application qui traitera toutes les
1623
+ Toute application Sinatra correspond à une sous-classe de <tt>Sinatra::Base</tt>.
1624
+ Si vous utilisez le DSL haut niveau (<tt>require 'sinatra'</tt>), alors cette
1625
+ classe est <tt>Sinatra::Application</tt>, sinon il s'agit de la sous-classe que
1626
+ vous avez définie. Dans le contexte de la classe, vous avez accès aux méthodes
1627
+ telles que +get+ ou +before+, mais vous n'avez pas accès aux objets +request+
1628
+ ou +session+ car c'est la même classe d'application qui traitera toutes les
1783
1629
  requêtes.
1784
1630
 
1785
- Les options définies au moyen de `set` deviennent des méthodes de classe:
1631
+ Les options définies au moyen de +set+ deviennent des méthodes de classe :
1786
1632
 
1787
1633
  class MonApp < Sinatra::Base
1788
- # Eh, je suis dans le contexte de l'application!
1634
+ # Eh, je suis dans le contexte de l'application !
1789
1635
  set :foo, 42
1790
1636
  foo # => 42
1791
1637
 
1792
1638
  get '/foo' do
1793
- # Eh, je ne suis plus dans le contexte de l'application!
1639
+ # Eh, je ne suis plus dans le contexte de l'application !
1794
1640
  end
1795
1641
  end
1796
1642
 
1797
- Vous avez le binding du contexte de l'application dans:
1643
+ Vous avez le binding du contexte de l'application dans :
1798
1644
 
1799
1645
  * Le corps de la classe d'application
1800
1646
  * Les méthodes définies par les extensions
1801
- * Le bloc passé à `helpers`
1802
- * Les procs/blocs utilisés comme argument pour `set`
1647
+ * Le bloc passé à +helpers+
1648
+ * Les procs/blocs utilisés comme argument pour +set+
1803
1649
  * Le bloc passé à <tt>Sinatra.new</tt>
1804
1650
 
1805
- Vous pouvez atteindre ce contexte (donc la classe) de la façon suivante:
1651
+ Vous pouvez atteindre ce contexte (donc la classe) de la façon suivante :
1806
1652
 
1807
- * Via l'objet passé dans les blocs `configure` (<tt>configure { |c| ... }</tt>)
1808
- * En utilisant `settings` dans le contexte de la requête
1653
+ * Via l'objet passé dans les blocs +configure+ (<tt>configure { |c| ... }</tt>)
1654
+ * En utilisant +settings+ dans le contexte de la requête
1809
1655
 
1810
1656
  === Contexte de la requête/instance
1811
1657
 
1812
1658
  Pour tout traitement d'une requête, une nouvelle instance de votre classe
1813
1659
  d'application est créée et tous vos gestionnaires sont exécutés dans ce
1814
- contexte. Dans ce dernier, vous pouvez accéder aux objets `request` et
1815
- `session` et faire appel aux fonctions de rendu telles que `erb` ou `haml`.
1660
+ contexte. Dans ce dernier, vous pouvez accéder aux objets +request+ et
1661
+ +session+ et faire appel aux fonctions de rendu telles que +erb+ ou +haml+.
1816
1662
  Vous pouvez accéder au contexte de l'application depuis le contexte de la
1817
- requête au moyen de `settings`:
1663
+ requête au moyen de +settings+ :
1818
1664
 
1819
1665
  class MonApp < Sinatra::Base
1820
- # Eh, je suis dans le contexte de l'application!
1666
+ # Eh, je suis dans le contexte de l'application !
1821
1667
  get '/ajouter_route/:nom' do
1822
1668
  # Contexte de la requête pour '/ajouter_route/:nom'
1823
1669
  @value = 42
@@ -1827,44 +1673,43 @@ requête au moyen de `settings`:
1827
1673
  @value # => nil (on est pas au sein de la même requête)
1828
1674
  end
1829
1675
 
1830
- "Route ajoutée!"
1676
+ "Route ajoutée !"
1831
1677
  end
1832
1678
  end
1833
1679
 
1834
- Vous avez le binding du contexte de la requête dans:
1680
+ Vous avez le binding du contexte de la requête dans :
1835
1681
 
1836
1682
  * les blocs get/head/post/put/delete/options
1837
1683
  * les filtres before/after
1838
- * les méthodes utilitaires (définies au moyen de `helpers`)
1684
+ * les méthodes utilitaires (définies au moyen de +helpers+)
1839
1685
  * les vues/templates
1840
1686
 
1841
1687
  === Le contexte de délégation
1842
1688
 
1843
1689
  Le contexte de délégation se contente de transmettre les appels de méthodes au
1844
1690
  contexte de classe. Toutefois, il ne se comporte pas à 100% comme le contexte
1845
- de classe car vous n'avez pas le binding de la classe: seules les méthodes
1691
+ de classe car vous n'avez pas le binding de la classe : seules les méthodes
1846
1692
  spécifiquement déclarées pour délégation sont disponibles et il n'est pas
1847
1693
  possible de partager des variables/états avec le contexte de classe
1848
- (comprenez: `self` n'est pas le même). Vous pouvez ajouter des délégation de
1694
+ (comprenez : +self+ n'est pas le même). Vous pouvez ajouter des délégation de
1849
1695
  méthodes en appelant <tt>Sinatra::Delegator.delegate :method_name</tt>.
1850
1696
 
1851
- Vous avez le binding du contexte de délégation dans:
1697
+ Vous avez le binding du contexte de délégation dans :
1852
1698
 
1853
1699
  * Le binding de haut niveau, si vous avez utilisé <tt>require "sinatra"</tt>
1854
- * Un objet qui inclut le module `Sinatra::Delegator`
1700
+ * Un objet qui inclut le module +Sinatra::Delegator+
1855
1701
 
1856
- Jetez un oeil
1857
- pour vous faire une idée: voici le mixin
1702
+ Jetez un oeil pour vous faire une idée : voici le mixin
1858
1703
  {Sinatra::Delegator}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/base.rb#L1128]
1859
1704
  qui est {inclus dans l'espace de noms principal}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/main.rb#L28]
1860
1705
 
1861
1706
  == Ligne de commande
1862
1707
 
1863
- Les applications en Sinatra peuvent être lancées directement:
1708
+ Les applications en Sinatra peuvent être lancées directement :
1864
1709
 
1865
1710
  ruby mon_application.rb [-h] [-x] [-e ENVIRONNEMENT] [-p PORT] [-o HOTE] [-s SERVEUR]
1866
1711
 
1867
- Les options sont:
1712
+ Les options sont :
1868
1713
 
1869
1714
  -h # aide
1870
1715
  -p # déclare le port (4567 par défaut)
@@ -1891,7 +1736,7 @@ Les versions suivantes de Ruby sont officiellement supportées :
1891
1736
  y compris tous les langages de template.
1892
1737
 
1893
1738
  [ JRuby ]
1894
- JRuby est officiellement supporté (JRuby >= 1.6.0). Aucune anomalie avec
1739
+ JRuby est officiellement supporté (JRuby >= 1.6.1). Aucune anomalie avec
1895
1740
  des bibliothèques de templates tierces ne sont connues. Toutefois, si vous
1896
1741
  choisissez JRuby, alors tournez vous vers des gestionnaires Rack JRuby car
1897
1742
  le serveur Thin n'est pas complètement supporté par JRuby. Le support des
@@ -1908,7 +1753,6 @@ sont toujours connues comme permettant à Sinatra de fonctionner :
1908
1753
  * Plus anciennes versions de JRuby et Rubinius
1909
1754
  * MacRuby, Maglev, IronRuby
1910
1755
  * Ruby 1.9.0 et 1.9.1
1911
- * Ruby 1.8.6 avec {backports}[https://github.com/marcandre/backports/#readme]
1912
1756
 
1913
1757
  Ne pas être officiellement supporté signifie que si les choses se passent mal
1914
1758
  sur ces plateformes et non sur celles supportées, nous considérons que
@@ -1927,12 +1771,12 @@ Si vous voulez utiliser la toute dernière version de Sinatra, n'ayez pas peur
1927
1771
  de faire tourner votre application sur la branche master, cela devrait être
1928
1772
  stable.
1929
1773
 
1930
- Nous publions également une gem de +prerelease+ de temps en temps donc vous
1931
- pouvez faire la chose suivante :
1774
+ Nous publions également une gem de +prerelease+ de temps en temps que vous
1775
+ pouvez installer comme suit :
1932
1776
 
1933
1777
  gem install sinatra --pre
1934
1778
 
1935
- afin d'avoir certaines des toutes dernières fonctionnalités.
1779
+ afin d'avoir les toutes dernières fonctionnalités.
1936
1780
 
1937
1781
  === Avec Bundler
1938
1782
 
@@ -1998,8 +1842,16 @@ SemVer que SemVerTag.
1998
1842
  * {Site internet}[http://www.sinatrarb.com/] - Plus de documentation,
1999
1843
  de news, et des liens vers d'autres ressources.
2000
1844
  * {Contribuer}[http://www.sinatrarb.com/contributing] - Vous avez trouvé un
2001
- bug? Besoin d'aide? Vous avez un patch?
1845
+ bug ? Besoin d'aide ? Vous avez un patch ?
2002
1846
  * {Suivi des problèmes}[http://github.com/sinatra/sinatra/issues]
2003
1847
  * {Twitter}[http://twitter.com/sinatra]
2004
1848
  * {Mailing List}[http://groups.google.com/group/sinatrarb/topics]
2005
- * {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] sur http://freenode.net
1849
+ * {IRC : #sinatra}[irc://chat.freenode.net/#sinatra] sur http://freenode.net
1850
+ * {IRC : #sinatra}[irc://chat.freenode.net/#sinatra] on http://freenode.net
1851
+ * {Sinatra Book}[http://sinatra-book.gittr.com] Tutoriels et recettes
1852
+ * {Sinatra Book Contrib}[http://sinatra-book-contrib.com/] Recettes contribuées
1853
+ par la communauté
1854
+ * Documentation API de la {dernière version}[http://rubydoc.info/gems/sinatra]
1855
+ ou du {HEAD courant}[http://rubydoc.info/github/sinatra/sinatra] sur
1856
+ http://rubydoc.info/
1857
+