sinatra 1.4.3 → 1.4.4

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

Potentially problematic release.


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

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 95ab29a70bb8b47332668d03c988fbcb2922e0ac
4
- data.tar.gz: a814ad7ff43ae1a4bfe5882cbb70f8df9a6004e8
3
+ metadata.gz: a77c975dfc3ecd79a66e1c9c14fbd1e5e3b6d411
4
+ data.tar.gz: 354494508bcc4ee11f3f71dd29eed29ca10ebc0f
5
5
  SHA512:
6
- metadata.gz: 0c33567db4dfb6bf90d7629a22391c89fcbe83d1feb1b176913bbd5c9ce78aab09714e347afe29a2a9f06260d4829da45b53d429677a747c23a99cbce5b45405
7
- data.tar.gz: 6d2dcad14d5021925113eef50e77edf31342b21f5366ed6ab0092cdf40a69b2d7bdb53c4f5bedcc80874f0a644ba152dddd4529d233e4f07032065722ad13615
6
+ metadata.gz: de08e878cebd592101c61121f09971c62bdbddf95dac2a3025521ae0a629554993b3729e56884eca51d428fa0a9042fa28c58ce77774b1f8057f317ca72cc198
7
+ data.tar.gz: 8ad8c36ec09eb1a6c06f7d493b626f12a2fe3eb82fcf692f311600f58312bfb01a8bb44670b9ff249aa96d621960887b40dcedc0b5b0bff30ec05666ab05ca34
data/.yardopts CHANGED
@@ -1,4 +1,5 @@
1
- --readme README.rdoc
1
+ --readme README.md
2
2
  --title 'Sinatra API Documentation'
3
3
  --charset utf-8
4
- 'lib/**/*.rb' - '*.rdoc'
4
+ --markup markdown
5
+ 'lib/**/*.rb' - '*.md'
data/CHANGES CHANGED
@@ -1,3 +1,38 @@
1
+ = 1.4.4 / 2013-10-21
2
+
3
+ * Allow setting layout to false in specifically for a singe rendering engine.
4
+ (Matt Wildig)
5
+
6
+ * Allow using wildcard in argument passed to `request.accept?`. (wilkie)
7
+
8
+ * Treat missing Accept header like wild card. (Patricio Mac Adden)
9
+
10
+ * Improve tests and documentation. (Darío Javier Cravero, Armen P., michelc,
11
+ Patricio Mac Adden, Matt Wildig, Vipul A M, utenmiki, George Timoschenko,
12
+ Diogo Scudelletti)
13
+
14
+ * Fix Ruby warnings. (Vipul A M, Patricio Mac Adden)
15
+
16
+ * Improve self-hosted server started by `run!` method or in classic mode.
17
+ (Tobias Bühlmann)
18
+
19
+ * Reduce objects allocated per request. (Vipul A M)
20
+
21
+ * Drop unused, undocumented options hash from Sinatra.new. (George Timoschenko)
22
+
23
+ * Keep Content-Length header when response is a `Rack::File` or when streaming.
24
+ (Patricio Mac Adden, George Timoschenko)
25
+
26
+ * Use reel if it's the only server available besides webrick. (Tobias Bühlmann)
27
+
28
+ * Add `disable :traps` so setting up signal traps for self hosted server can be
29
+ skipped. (George Timoschenko)
30
+
31
+ * The `status` option passed to `send_file` may now be a string. (George
32
+ Timoschenko)
33
+
34
+ * Reduce file size of dev mode images for 404 and 500 pages. (Francis Go)
35
+
1
36
  = 1.4.3 / 2013-06-07
2
37
 
3
38
  * Running a Sinatra file directly or via `run!` it will now ignore an
@@ -118,7 +153,7 @@
118
153
  * Add `x_cascade` option to disable `X-Cascade` header on missing route.
119
154
  (Konstantin Haase)
120
155
 
121
- * Improve documentation. (Kashyap, Stanislav Chistenko, Zachary Scott,
156
+ * Improve documentation. (Kashyap, Stanislav Chistenko, Zachary Scott,
122
157
  Anthony Accomazzo, Peter Suschlik, Rachel Mehl, ymmtmsys, Anurag Priyam,
123
158
  burningTyger, Tony Miller, akicho8, Vasily Polovnyov, Markus Prinz,
124
159
  Alexey Muranov, Erik Johnson, Vipul A M, Konstantin Haase)
data/Gemfile CHANGED
@@ -41,10 +41,13 @@ gem 'maruku'
41
41
  gem 'creole'
42
42
  gem 'markaby'
43
43
  gem 'radius'
44
- gem 'rabl' unless RUBY_ENGINE =~ /jruby|maglev/
44
+ unless RUBY_ENGINE =~ /jruby|maglev/
45
+ gem 'rabl'
46
+ gem 'activesupport', '< 4.0.0' if RUBY_VERSION < '1.9.3'
47
+ end
45
48
  gem 'wlang', '>= 2.0.1' unless RUBY_ENGINE =~ /jruby|rbx/
46
49
  gem 'therubyracer' unless RUBY_ENGINE =~ /jruby|rbx/
47
- gem 'redcarpet' unless RUBY_ENGINE == 'jruby'
50
+ gem 'redcarpet' unless RUBY_ENGINE == 'jruby' || RUBY_VERSION == '1.8.7'
48
51
  gem 'bluecloth' unless RUBY_ENGINE == 'jruby'
49
52
 
50
53
  if RUBY_ENGINE != 'rbx' or RUBY_VERSION < '1.9'
@@ -58,7 +61,7 @@ if RUBY_ENGINE == 'jruby'
58
61
  gem 'trinidad'
59
62
  else
60
63
  gem 'yajl-ruby'
61
- gem 'nokogiri'
64
+ gem 'nokogiri' if RUBY_VERSION >= '1.9.2'
62
65
  gem 'thin'
63
66
  end
64
67
 
@@ -70,7 +73,7 @@ if RUBY_ENGINE != 'jruby' or not ENV['TRAVIS']
70
73
  # C extensions
71
74
  gem 'rdiscount' if RUBY_VERSION != '1.9.2'
72
75
  platforms(:ruby_18) do
73
- gem 'redcarpet'
76
+ #gem 'redcarpet'
74
77
  gem 'mongrel'
75
78
  end
76
79
  gem 'RedCloth' unless RUBY_ENGINE == "macruby"
@@ -456,38 +456,38 @@ Einstellungen:
456
456
  Praktisch für Partials:
457
457
 
458
458
  <tt>erb "<%= foo %>", :locals => {:foo => "bar"}</tt></dd>
459
-
459
+
460
460
  <dt>default_encoding</dt>
461
461
  <dd>Gibt die Stringkodierung an, die verwendet werden soll. Voreingestellt
462
462
  auf <tt>settings.default_encoding</tt>.</dd>
463
-
463
+
464
464
  <dt>views</dt>
465
465
  <dd>Ordner, aus dem die Templates geladen werden. Voreingestellt auf
466
466
  <tt>settings.views</tt>.</dd>
467
-
467
+
468
468
  <dt>layout</dt>
469
469
  <dd>Legt fest, ob ein Layouttemplate verwendet werden soll oder nicht
470
470
  (<tt>true</tt> oder<tt>false</tt>). Ist es ein Symbol, dann legt es fest,
471
471
  welches Template als Layout verwendet wird:
472
472
 
473
473
  <tt>erb :index, :layout => !request.xhr?</tt></dd>
474
-
474
+
475
475
  <dt>content_type</dt>
476
476
  <dd>Content-Typ den das Template ausgibt. Voreinstellung hängt von der
477
477
  Templatesprache ab.</dd>
478
-
478
+
479
479
  <dt>scope</dt>
480
480
  <dd>Scope, in dem das Template gerendert wird. Liegt standardmäßig innerhalb
481
481
  der App-Instanz. Wird Scope geändert, sind Instanzvariablen und
482
482
  Helfermethoden nicht verfügbar.</dd>
483
-
483
+
484
484
  <dt>layout_engine</dt>
485
485
  <dd>Legt fest, welcher Renderer für das Layout verantwortlich ist. Hilfreich
486
486
  für Sprachen, die sonst keine Templates unterstützen. Voreingestellt auf
487
487
  den Renderer, der für das Template verwendet wird:
488
488
 
489
489
  <tt>set :rdoc, :layout_engine => :erb</tt></dd>
490
-
490
+
491
491
  <dt>layout_options</dt>
492
492
  <dd>Besondere Einstellungen, die nur für das Rendering verwendet werden:
493
493
 
@@ -554,7 +554,7 @@ get('/') { markdown :index }
554
554
  <table>
555
555
  <tr>
556
556
  <td>Abhängigkeit</td>
557
- <td><a href="http://www.kuwata-lab.com/erubis/">erubis</a> oder erb
557
+ <td><a href="http://www.kuwata-lab.com/erubis/">erubis</a> oder erb
558
558
  (Standardbibliothek von Ruby)</td>
559
559
  </tr>
560
560
  <tr>
@@ -686,7 +686,7 @@ denen man Variablen weitergibt.
686
686
  <table>
687
687
  <tr>
688
688
  <td>Abhängigkeit</td>
689
- <td>Eine der folgenden Bibliotheken:
689
+ <td>Eine der folgenden Bibliotheken:
690
690
  <a href="https://github.com/rtomayko/rdiscount" title="RDiscount">RDiscount</a>,
691
691
  <a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
692
692
  <a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
@@ -917,7 +917,7 @@ verwendet wird.
917
917
  <table>
918
918
  <tr>
919
919
  <td>Abhängigkeit</td>
920
- <td><a href="https://github.com/josh/ruby-coffee-script">coffee-script</a>
920
+ <td><a href="https://github.com/josh/ruby-coffee-script">coffee-script</a>
921
921
  und eine <a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme">Möglichkeit JavaScript auszuführen</a>.
922
922
  </td>
923
923
  </tr>
@@ -938,7 +938,7 @@ verwendet wird.
938
938
  <td>
939
939
  <a href="https://github.com/lucasmazza/ruby-stylus" title="Ruby Stylus">
940
940
  Stylus
941
- </a> und eine Möglichkeit
941
+ </a> und eine Möglichkeit
942
942
  <a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
943
943
  JavaScript auszuführen
944
944
  </a>.
@@ -1439,7 +1439,7 @@ get '/' do
1439
1439
  end
1440
1440
  ```
1441
1441
 
1442
- Damit lassen sich Streaming-APIs realisieren, sog.
1442
+ Damit lassen sich Streaming-APIs realisieren, sog.
1443
1443
  [Server Sent Events](http://dev.w3.org/html5/eventsource/), die als Basis für
1444
1444
  [WebSockets](http://en.wikipedia.org/wiki/WebSocket) dienen. Ebenso können sie
1445
1445
  verwendet werden, um den Durchsatz zu erhöhen, wenn ein Teil der Daten von
@@ -1469,7 +1469,7 @@ get '/subscribe' do
1469
1469
  # Client-Registrierung beim Server, damit Events mitgeteilt werden können
1470
1470
  stream(:keep_open) { |out| connections << out }
1471
1471
 
1472
- # tote Verbindungen entfernen
1472
+ # tote Verbindungen entfernen
1473
1473
  connections.reject!(&:closed?)
1474
1474
 
1475
1475
  # Rückmeldung
@@ -1503,7 +1503,7 @@ get '/' do
1503
1503
  end
1504
1504
  ```
1505
1505
 
1506
- Der Logger übernimmt dabei automatisch alle im Rack-Handler eingestellten
1506
+ Der Logger übernimmt dabei automatisch alle im Rack-Handler eingestellten
1507
1507
  Log-Vorgaben. Ist Loggen ausgeschaltet, gibt die Methode ein Leerobjekt zurück.
1508
1508
  In den Routen und Filtern muss man sich also nicht weiter darum kümmern.
1509
1509
 
@@ -1522,7 +1522,7 @@ end
1522
1522
  Damit auch keine Middleware das Logging aktivieren kann, muss die `logging`
1523
1523
  Einstellung auf `nil` gesetzt werden. Das heißt aber auch, dass `logger` in
1524
1524
  diesem Fall `nil` zurückgeben wird. Üblicherweise wird das eingesetzt, wenn ein
1525
- eigener Logger eingerichtet werden soll. Sinatra wird dann verwenden, was in
1525
+ eigener Logger eingerichtet werden soll. Sinatra wird dann verwenden, was in
1526
1526
  `env['rack.logger']` eingetragen ist.
1527
1527
 
1528
1528
  ### Mime-Types
@@ -1658,7 +1658,7 @@ get '/article/:id' do
1658
1658
  end
1659
1659
  ```
1660
1660
 
1661
- ebenso ist es möglich einen
1661
+ ebenso ist es möglich einen
1662
1662
  [schwachen ETag](http://de.wikipedia.org/wiki/HTTP_ETag) zu verwenden:
1663
1663
 
1664
1664
  ```ruby
@@ -1732,15 +1732,15 @@ send_file 'foo.png', :type => :jpg
1732
1732
  <dt>last_modified</dt>
1733
1733
  <dd>Wert für den Last-Modified-Header, Standardwert ist <tt>mtime</tt> der
1734
1734
  Datei.</dd>
1735
-
1735
+
1736
1736
  <dt>type</dt>
1737
1737
  <dd>Content-Type, der verwendet werden soll. Wird, wenn nicht angegeben, von
1738
1738
  der Dateiendung abgeleitet.</dd>
1739
-
1739
+
1740
1740
  <dt>disposition</dt>
1741
1741
  <dd>Verwendet für Content-Disposition. Mögliche Werte sind: <tt>nil</tt>
1742
1742
  (Standard), <tt>:attachment</tt> und <tt>:inline</tt>.</dd>
1743
-
1743
+
1744
1744
  <dt>length</dt>
1745
1745
  <dd>Content-Length-Header. Standardwert ist die Dateigröße.</dd>
1746
1746
  </dl>
@@ -1845,7 +1845,7 @@ end
1845
1845
 
1846
1846
  Diese Methode wird intern für +expires, `last_modiefied` und ihresgleichen
1847
1847
  verwendet. Mit ein paar Handgriffen lässt sich diese Methode also in ihrem
1848
- Verhalten erweitern, indem man `time_for` in der eigenen Applikation
1848
+ Verhalten erweitern, indem man `time_for` in der eigenen Applikation
1849
1849
  überschreibt:
1850
1850
 
1851
1851
  ```ruby
@@ -1911,7 +1911,7 @@ werden!
1911
1911
 
1912
1912
  Beachte, dass `find_template` nicht prüft, ob eine Datei tatsächlich existiert.
1913
1913
  Es wird lediglich der angegebene Block aufgerufen und nach allen möglichen
1914
- Pfaden gesucht. Das ergibt kein Performance-Problem, da `render` `block`
1914
+ Pfaden gesucht. Das ergibt kein Performance-Problem, da `render` `block`
1915
1915
  verwendet, sobald eine Datei gefunden wurde. Ebenso werden Template-Pfade samt
1916
1916
  Inhalt gecached, solange nicht im Entwicklungsmodus gearbeitet wird. Das sollte
1917
1917
  im Hinterkopf behalten werden, wenn irgendwelche verrückten Methoden
@@ -2092,7 +2092,7 @@ set :protection, :except => [:path_traversal, :session_hijacking]
2092
2092
 
2093
2093
  <dt>server</dt>
2094
2094
  <dd>Server oder Liste von Servern, die als eingebaute Server zur Verfügung
2095
- stehen. Die Reihenfolge gibt die Priorität vor, die Voreinstellung hängt von
2095
+ stehen. Die Reihenfolge gibt die Priorität vor, die Voreinstellung hängt von
2096
2096
  der verwendenten Ruby Implementierung ab.</dd>
2097
2097
 
2098
2098
  <dt>sessions</dt>
@@ -2124,7 +2124,7 @@ set :protection, :except => [:path_traversal, :session_hijacking]
2124
2124
  <dt>threaded</dt>
2125
2125
  <dd>Wird es auf <tt>true</tt> gesetzt, wird Thin aufgefordert
2126
2126
  <tt>EventMachine.defer</tt> zur Verarbeitung des Requests einzusetzen.</dd>
2127
-
2127
+
2128
2128
  <dt>views</dt>
2129
2129
  <dd>Verzeichnis der Views. Leitet sich von der <tt>app_file</tt> Einstellung
2130
2130
  ab, wenn nicht gesetzt.</dd>
@@ -2722,7 +2722,7 @@ ungültig. Ruby 1.9.3 wird bis Sinatra 2.0 unterstützt werden.</dd>
2722
2722
 
2723
2723
  <dt>JRuby</dt>
2724
2724
  <dd>Aktuelle JRuby Versionen werden offiziell unterstützt. Es wird empfohlen,
2725
- keine C-Erweiterungen zu verwenden und als Server Trinidad zu verwenden
2725
+ keine C-Erweiterungen zu verwenden und als Server Trinidad zu verwenden
2726
2726
  (<tt>gem install trinidad</tt>).</dd>
2727
2727
  </dl>
2728
2728
 
@@ -2854,7 +2854,7 @@ SemVer und SemVerTag.
2854
2854
  * [Issue-Tracker](http://github.com/sinatra/sinatra/issues)
2855
2855
  * [Twitter](http://twitter.com/sinatra)
2856
2856
  * [Mailing-Liste](http://groups.google.com/group/sinatrarb)
2857
- * [#sinatra](irc://chat.freenode.net/#sinatra) auf http://freenode.net Es
2857
+ * [#sinatra](irc://chat.freenode.net/#sinatra) auf http://freenode.net Es
2858
2858
  gibt dort auch immer wieder deutschsprachige Entwickler, die gerne weiterhelfen.
2859
2859
  * [Sinatra Book](http://sinatra-book.gittr.com) Kochbuch Tutorial
2860
2860
  * [Sinatra Recipes](http://recipes.sinatrarb.com/) Sinatra-Rezepte aus der
@@ -15,14 +15,14 @@ get '/' do
15
15
  end
16
16
  ```
17
17
 
18
- Instalá el gem y corré la aplicación con:
18
+ Instalar la gema y correr la aplicación con:
19
19
 
20
20
  ``` shell
21
21
  gem install sinatra
22
22
  ruby miapp.rb
23
23
  ```
24
24
 
25
- Podés verla en: http://localhost:4567
25
+ Ver en <http://localhost:4567>.
26
26
 
27
27
  Es recomendable además ejecutar `gem install thin`, ya que Sinatra lo va
28
28
  a utilizar cuando esté disponible.
@@ -5,7 +5,7 @@ il n'est peut être plus à jour.*
5
5
  Sinatra est un [DSL](http://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
 
@@ -14,11 +14,16 @@ get '/' do
14
14
  end
15
15
  ```
16
16
 
17
- Installez la gem et lancez avec :
17
+ Installez la gem Sinatra :
18
18
 
19
- ```bash
20
- $ gem install sinatra
21
- $ ruby mon_application.rb
19
+ ``` shell
20
+ gem install sinatra
21
+ ```
22
+
23
+ Puis lancez votre programme :
24
+
25
+ ``` shell
26
+ ruby mon_application.rb
22
27
  ```
23
28
 
24
29
  Le résultat est visible sur : http://localhost:4567
@@ -26,12 +31,97 @@ Le résultat est visible sur : http://localhost:4567
26
31
  Il est recommandé d'exécuter également `gem install thin`, pour que
27
32
  Sinatra utilise le server Thin quand il est disponible.
28
33
 
34
+ ## Table des matières
35
+
36
+ * [Sinatra](#sinatra)
37
+ * [Table des matières](#table-des-matières)
38
+ * [Routes](#routes)
39
+ * [Conditions](#conditions)
40
+ * [Valeurs de retour](#valeurs-de-retour)
41
+ * [Masques de route spécifiques](#masques-de-route-spécifiques)
42
+ * [Fichiers statiques](#fichiers-statiques)
43
+ * [Vues / Templates](#vues--templates)
44
+ * [Templates littéraux](#templates-littéraux)
45
+ * [Langages de template disponibles](#langages-de-template-disponibles)
46
+ * [Templates Haml](#templates-haml)
47
+ * [Templates Erb](#templates-erb)
48
+ * [Templates Builder](#templates-builder)
49
+ * [Templates Nokogiri](#templates-nokogiri)
50
+ * [Templates Sass](#templates-sass)
51
+ * [Templates SCSS](#templates-scss)
52
+ * [Templates Less](#templates-less)
53
+ * [Templates Liquid](#templates-liquid)
54
+ * [Templates Markdown](#templates-markdown)
55
+ * [Templates Textile](#templates-textile)
56
+ * [Templates RDoc](#templates-rdoc)
57
+ * [Templates Radius](#templates-radius)
58
+ * [Templates Markaby](#templates-markaby)
59
+ * [Templates RABL](#templates-rabl)
60
+ * [Templates Slim](#templates-slim)
61
+ * [Templates Creole](#templates-creole)
62
+ * [Templates CoffeeScript](#templates-coffeescript)
63
+ * [Templates Stylus](#templates-stylus)
64
+ * [Templates Yajl](#templates-yajl)
65
+ * [Templates WLang](#templates-wlang)
66
+ * [Accéder aux variables dans un Template](#accéder-aux-variables-dans-un-template)
67
+ * [Templates avec `yield` et layouts imbriqués](#templates-avec-yield-et-layouts-imbriqués)
68
+ * [Templates dans le fichier source](#templates-dans-le-fichier-source)
69
+ * [Templates nommés](#templates-nommés)
70
+ * [Associer des extensions de fichier](#associer-des-extensions-de-fichier)
71
+ * [Ajouter son propre moteur de rendu](#ajouter-son-propre-moteur-de-rendu)
72
+ * [Filtres](#filtres)
73
+ * [Helpers](#helpers)
74
+ * [Utiliser les sessions](#utiliser-les-sessions)
75
+ * [Halt](#halt)
76
+ * [Passer](#passer)
77
+ * [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
+ * [Faire du streaming](#faire-du-streaming)
80
+ * [Journalisation (Logging)](#journalisation-logging)
81
+ * [Types Mime](#types-mime)
82
+ * [Former des URLs](#former-des-urls)
83
+ * [Redirection du navigateur](#redirection-du-navigateur)
84
+ * [Contrôle du cache](#contrôle-du-cache)
85
+ * [Envoyer des fichiers](#envoyer-des-fichiers)
86
+ * [Accéder à l'objet requête](#accéder-à-lobjet-requête)
87
+ * [Fichiers joints](#fichiers-joints)
88
+ * [Gérer Date et Time](#gérer-date-et-time)
89
+ * [Chercher les fichiers de templates](#chercher-les-fichiers-de-templates)
90
+ * [Configuration](#configuration)
91
+ * [Se protéger des attaques](#se-protéger-des-attaques)
92
+ * [Paramètres disponibles](#paramètres-disponibles)
93
+ * [Environements](#environements)
94
+ * [Gérer les erreurs](#gérer-les-erreurs)
95
+ * [NotFound](#notfound)
96
+ * [Error](#error)
97
+ * [Les Middlewares Rack](#les-middlewares-rack)
98
+ * [Tester](#tester)
99
+ * [Sinatra::Base - Les Middlewares, Bibliothèques, et Applications Modulaires](#sinatrabase---les-middlewares-bibliothèques-et-applications-modulaires)
100
+ * [Style modulaire vs. style classique](#style-modulaire-vs-style-classique)
101
+ * [Servir une application modulaire](#servir-une-application-modulaire)
102
+ * [Utiliser une application de style classique avec un fichier config.ru](#utiliser-une-application-de-style-classique-avec-un-fichier-configru)
103
+ * [Quand utiliser un fichier config.ru ?](#quand-utiliser-un-fichier-configru-)
104
+ * [Utiliser Sinatra comme Middleware](#utiliser-sinatra-comme-middleware)
105
+ * [Création dynamique d'applications](#création-dynamique-dapplications)
106
+ * [Contextes et Binding](#contextes-et-binding)
107
+ * [Contexte de l'application/classe](#contexte-de-lapplicationclasse)
108
+ * [Contexte de la requête/instance](#contexte-de-la-requêteinstance)
109
+ * [Le contexte de délégation](#le-contexte-de-délégation)
110
+ * [Ligne de commande](#ligne-de-commande)
111
+ * [Configuration nécessaire](#configuration-nécessaire)
112
+ * [Essuyer les plâtres](#essuyer-les-plâtres)
113
+ * [Installer avec Bundler](#installer-avec-bundler)
114
+ * [Faire un clone local](#faire-un-clone-local)
115
+ * [Installer globalement](#installer-globalement)
116
+ * [Versions](#versions)
117
+ * [Mais encore](#mais-encore)
118
+
29
119
  ## Routes
30
120
 
31
121
  Dans Sinatra, une route est une méthode HTTP couplée à un masque (pattern)
32
122
  URL. Chaque route est associée à un bloc :
33
123
 
34
- ```ruby
124
+ ``` ruby
35
125
  get '/' do
36
126
  .. montrer quelque chose ..
37
127
  end
@@ -53,7 +143,15 @@ delete '/' do
53
143
  end
54
144
 
55
145
  options '/' do
56
- .. apaiser quelquechose ..
146
+ .. paramétrer quelque chose ..
147
+ end
148
+
149
+ link '/' do
150
+ .. relier quelque chose ..
151
+ end
152
+
153
+ unlink '/' do
154
+ .. séparer quelque chose ..
57
155
  end
58
156
  ```
59
157
 
@@ -63,7 +161,7 @@ route qui correspond à la requête est appelée.
63
161
  Les masques peuvent inclure des paramètres nommés, accessibles par
64
162
  l'intermédiaire du hash `params` :
65
163
 
66
- ```ruby
164
+ ``` ruby
67
165
  get '/bonjour/:nom' do
68
166
  # répond aux requêtes "GET /bonjour/foo" et "GET /bonjour/bar"
69
167
  # params[:nom] est 'foo' ou 'bar'
@@ -74,8 +172,11 @@ end
74
172
  Vous pouvez aussi accéder aux paramètres nommés directement grâce aux
75
173
  paramètres du bloc comme ceci :
76
174
 
77
- ```ruby
175
+ ``` ruby
78
176
  get '/bonjour/:nom' do |n|
177
+ # répond aux requêtes "GET /bonjour/foo" et "GET /bonjour/bar"
178
+ # params[:nom] est 'foo' ou 'bar'
179
+ # n contient params[:nom]
79
180
  "Bonjour #{n} !"
80
181
  end
81
182
  ```
@@ -83,7 +184,7 @@ end
83
184
  Une route peut contenir un splat (caractère joker), accessible par
84
185
  l'intermédiaire du tableau `params[:splat]` :
85
186
 
86
- ```ruby
187
+ ``` ruby
87
188
  get '/dire/*/a/*' do
88
189
  # répond à /dire/bonjour/a/monde
89
190
  params[:splat] # => ["bonjour", "monde"]
@@ -97,7 +198,7 @@ end
97
198
 
98
199
  Ou par l'intermédiaire des paramètres du bloc :
99
200
 
100
- ```ruby
201
+ ``` ruby
101
202
  get '/telecharger/*.*' do |chemin, ext|
102
203
  [chemin, ext] # => ["path/to/file", "xml"]
103
204
  end
@@ -105,7 +206,7 @@ end
105
206
 
106
207
  Une route peut aussi être définie par une expression régulière :
107
208
 
108
- ```ruby
209
+ ``` ruby
109
210
  get %r{/bonjour/([\w]+)} do
110
211
  "Bonjour, #{params[:captures].first} !"
111
212
  end
@@ -113,7 +214,7 @@ end
113
214
 
114
215
  Là encore on peut utiliser les paramètres de bloc :
115
216
 
116
- ```ruby
217
+ ``` ruby
117
218
  get %r{/bonjour/([\w]+)} do |c|
118
219
  "Bonjour, #{c} !"
119
220
  end
@@ -121,7 +222,7 @@ end
121
222
 
122
223
  Les routes peuvent aussi comporter des paramètres optionnels :
123
224
 
124
- ```ruby
225
+ ``` ruby
125
226
  get '/posts.?:format?' do
126
227
  # répond à "GET /posts" et aussi à "GET /posts.json", "GET /posts.xml" etc...
127
228
  end
@@ -131,12 +232,12 @@ A ce propos, à moins d'avoir désactivé la protection contre les attaques par
131
232
  "path transversal" (voir plus loin), l'URL demandée peut avoir été modifiée
132
233
  avant d'être comparée à vos routes.
133
234
 
134
- ### Conditions
235
+ ## Conditions
135
236
 
136
237
  Les routes peuvent définir toutes sortes de conditions, comme par exemple le
137
238
  "user agent" :
138
239
 
139
- ```ruby
240
+ ``` ruby
140
241
  get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
141
242
  "Vous utilisez Songbird version #{params[:agent][0]}"
142
243
  end
@@ -148,7 +249,7 @@ end
148
249
 
149
250
  Les autres conditions disponibles sont `host_name` et `provides` :
150
251
 
151
- ```ruby
252
+ ``` ruby
152
253
  get '/', :host_name => /^admin\./ do
153
254
  "Zone Administrateur, Accès refusé !"
154
255
  end
@@ -164,7 +265,7 @@ end
164
265
 
165
266
  Vous pouvez facilement définir vos propres conditions :
166
267
 
167
- ```ruby
268
+ ``` ruby
168
269
  set(:probability) { |value| condition { rand <= value } }
169
270
 
170
271
  get '/gagner_une_voiture', :probability => 0.1 do
@@ -179,7 +280,7 @@ end
179
280
  Utilisez un splat (caractère joker) dans le cas d'une condition qui prend
180
281
  plusieurs valeurs :
181
282
 
182
- ```ruby
283
+ ``` ruby
183
284
  set(:auth) do |*roles| # <- ici on utilise un splat
184
285
  condition do
185
286
  unless logged_in? && roles.any? {|role| current_user.in_role? role }
@@ -197,7 +298,7 @@ get "/reserve/aux/admins/", :auth => :admin do
197
298
  end
198
299
  ```
199
300
 
200
- ### Valeurs de retour
301
+ ## Valeurs de retour
201
302
 
202
303
  La valeur renvoyée par le bloc correspondant à une route constitue le corps de
203
304
  la réponse qui sera transmise au client HTTP ou du moins au prochain middleware
@@ -218,7 +319,7 @@ valide, d'un corps de réponse Rack ou d'un code statut HTTP :
218
319
 
219
320
  Avec cela, on peut facilement implémenter un streaming par exemple :
220
321
 
221
- ```ruby
322
+ ``` ruby
222
323
  class Stream
223
324
  def each
224
325
  100.times { |i| yield "#{i}\n" }
@@ -232,14 +333,14 @@ Vous pouvez aussi utiliser le helper `stream` (présenté un peu plus loin) pour
232
333
  éviter la surcharge et intégrer le traitement relatif au streaming dans le bloc
233
334
  de code de la route.
234
335
 
235
- ### Masques de route spécifiques
336
+ ## Masques de route spécifiques
236
337
 
237
338
  Comme cela a été vu auparavant, Sinatra offre la possibilité d'utiliser des
238
339
  masques sous forme de chaines de caractères ou des expressions régulières
239
340
  pour définir les routes. Mais il est possible de faire bien plus. Vous pouvez
240
341
  facilement définir vos propres masques :
241
342
 
242
- ```ruby
343
+ ``` ruby
243
344
  class MasqueToutSauf
244
345
  Masque = Struct.new(:captures)
245
346
 
@@ -265,7 +366,7 @@ end
265
366
  Notez que l'exemple ci-dessus est bien trop compliqué et que le même résultat
266
367
  peut être obtenu avec :
267
368
 
268
- ```ruby
369
+ ``` ruby
269
370
  get // do
270
371
  pass if request.path_info == "/index"
271
372
  # ...
@@ -274,7 +375,7 @@ end
274
375
 
275
376
  Ou bien en utilisant la forme négative :
276
377
 
277
- ```ruby
378
+ ``` ruby
278
379
  get %r{^(?!/index$)} do
279
380
  # ...
280
381
  end
@@ -286,7 +387,7 @@ Les fichiers du dossier `./public` sont servis de façon statique. Vous
286
387
  avez la possibilité d'utiliser un autre répertoire en définissant le paramètre
287
388
  `:public_folder` :
288
389
 
289
- ```ruby
390
+ ``` ruby
290
391
  set :public_folder, File.dirname(__FILE__) + '/statique'
291
392
  ```
292
393
 
@@ -302,7 +403,7 @@ d'en-tête <tt>Cache-Control</tt> (voir plus loin).
302
403
  Chaqie langage de template est disponible via sa propre méthode de rendu,
303
404
  lesquelles renvoient tout simplement une chaîne de caractères.
304
405
 
305
- ```ruby
406
+ ``` ruby
306
407
  get '/' do
307
408
  erb :index
308
409
  end
@@ -313,7 +414,7 @@ Ceci effectue le rendu de la vue `views/index.erb`.
313
414
  Plutôt que d'utiliser le nom d'un template, vous pouvez directement passer
314
415
  le contenu du template :
315
416
 
316
- ```ruby
417
+ ``` ruby
317
418
  get '/' do
318
419
  code = "<%= Time.now %>"
319
420
  erb code
@@ -322,7 +423,7 @@ end
322
423
 
323
424
  Les méthodes de templates acceptent un second paramètre, un hash d'options :
324
425
 
325
- ```ruby
426
+ ``` ruby
326
427
  get '/' do
327
428
  erb :index, :layout => :post
328
429
  end
@@ -334,7 +435,7 @@ au *layout* `views/layout.erb` quand ce fichier existe).
334
435
 
335
436
  Toute option que Sinatra ne comprend pas sera passée au moteur de rendu :
336
437
 
337
- ```ruby
438
+ ``` ruby
338
439
  get '/' do
339
440
  haml :index, :format => :html5
340
441
  end
@@ -343,7 +444,7 @@ end
343
444
  Vous pouvez également définir des options par langage de template de façon
344
445
  générale :
345
446
 
346
- ```ruby
447
+ ``` ruby
347
448
  set :haml, :format => html5
348
449
 
349
450
  get '/' do
@@ -356,42 +457,64 @@ définies au moyen de `set`.
356
457
 
357
458
  Options disponibles :
358
459
 
359
- **locals**
360
- Liste de variables locales passées au document. Pratique pour les vues
361
- partielles.
362
- Exemple : `erb "<%= foo %>", :locals => {:foo => "bar"}`.
460
+ <dl>
461
+ <dt>locals</dt>
462
+ <dd>
463
+ Liste de variables locales passées au document. Pratique pour les vues
464
+ partielles.
465
+ Exemple : <tt>erb "<%= foo %>", :locals => {:foo => "bar"}</tt>.
466
+ </dd>
363
467
 
364
- **default_encoding**
365
- Encodage de caractères à utiliser en cas d'incertitude. Par défaut, c'est
366
- `settings.default_encoding`.
468
+ <dt>default_encoding</dt>
469
+ <dd>
470
+ Encodage de caractères à utiliser en cas d'incertitude. Par défaut, c'est
471
+ <tt>settings.default_encoding</tt>.
472
+ </dd>
473
+
474
+ <dt>views</dt>
475
+ <dd>
476
+ Dossier de vues dans lequel chercher les templates. Par défaut
477
+ <tt>settings.views</tt>.
478
+ </dd>
367
479
 
368
- **views**
369
- Dossier de vues dans lequel chercher les templates. Par défaut
370
- `settings.views`.
480
+ <dt>layout</dt>
481
+ <dd>
482
+ S'il faut ou non utiliser un layout (<tt>true</tt> ou <tt>false</tt>).
483
+ Indique le template à utiliser lorsque c'est un symbole. Exemple :
484
+ <tt>erb :index, :layout => !request.xhr?</tt>.
485
+ </dd>
371
486
 
372
- **layout**
373
- S'il faut ou non utiliser un +layout+ (+true+ or +false+). Indique le
374
- template à utiliser lorsque c'est un symbole. Exemple : `erb :index,
375
- :layout => !request.xhr?`.
487
+ <dt>content_type</dt>
488
+ <dd>
489
+ Content-Type que le template produit, dépend par défaut du langage de
490
+ template.
491
+ </dd>
376
492
 
377
- **content_type**
378
- Content-Type que le template produit, dépend par défaut du langage de
379
- template.
493
+ <dt>scope</dt>
494
+ <dd>
495
+ Contexte sous lequel effectuer le rendu du template. Par défaut il s'agit
496
+ de l'instance de l'application. Si vous changez cela, les variables
497
+ d'instance et les méthodes utilitaires ne seront pas disponibles.
498
+ </dd>
380
499
 
381
- **scope**
382
- Contexte sous lequel effectuer le rendu du template. Par défaut il s'agit
383
- de l'instance de l'application. Si vous changez cela, les variables
384
- d'instance et les méthodes utilitaires ne seront pas disponibles.
500
+ <dt>layout_engine</dt>
501
+ <dd>
502
+ Moteur de rendu à utiliser pour le layout. Utile pour les langages ne
503
+ supportant pas les layouts. Il s'agit par défaut du moteur utilisé pour
504
+ le rendu du template. Exemple : <tt>set :rdoc, :layout_engine => :erb</tt>
505
+ </dd>
385
506
 
386
- **layout_engine**
387
- Moteur de rendu à utiliser pour le +layout+. Utile pour les langages ne
388
- supportant pas les +layouts+. Il s'agit par défaut du moteur utilisé pour
389
- le rendu du template. Exemple : `set :rdoc, :layout_engine => :erb`
507
+ <dt>layout_options</dt>
508
+ <dd>
509
+ Options spécifiques destinées au moteur de rendu. Exemple : <tt>set :rdoc,
510
+ :layout_options => { :views => 'views/layouts' }</tt>
511
+ </dd>
512
+ </dl>
390
513
 
391
514
  Les templates sont supposés se trouver directement dans le dossier
392
515
  `./views`. Pour utiliser un dossier de vues différent :
393
516
 
394
- ```ruby
517
+ ``` ruby
395
518
  set :views, settings.root + '/templates'
396
519
  ```
397
520
 
@@ -401,23 +524,33 @@ ce cas, utilisez `:'sous_repertoire/template'`). Il faut utiliser
401
524
  un symbole car les méthodes de rendu évaluent le contenu des chaînes de
402
525
  caractères au lieu de les considérer comme un chemin vers un fichier.
403
526
 
527
+ ### Templates littéraux
528
+
529
+ ``` ruby
530
+ get '/' do
531
+ haml '%div.title Bonjour le monde'
532
+ end
533
+ ```
534
+
535
+ Générera le code du template spécifié dans la chaîne de caractères.
536
+
404
537
  ### Langages de template disponibles
405
538
 
406
539
  Certains langages ont plusieurs implémentations. Pour préciser l'implémentation
407
540
  à utiliser (et garantir l'aspect thread-safe), vous devez simplement l'avoir
408
541
  chargée au préalable :
409
542
 
410
- ```ruby
543
+ ``` ruby
411
544
  require 'rdiscount' # ou require 'bluecloth'
412
545
  get('/') { markdown :index }
413
546
  ```
414
547
 
415
- ### Templates Haml
548
+ #### Templates Haml
416
549
 
417
550
  <table>
418
551
  <tr>
419
552
  <td>Dépendances</td>
420
- <td><a href="http://haml.info/">haml</a></td>
553
+ <td><a href="http://haml.info/" title="haml">haml</a></td>
421
554
  </tr>
422
555
  <tr>
423
556
  <td>Extensions de fichier</td>
@@ -429,12 +562,15 @@ get('/') { markdown :index }
429
562
  </tr>
430
563
  </table>
431
564
 
432
- ### Templates Erb
565
+ #### Templates Erb
433
566
 
434
567
  <table>
435
568
  <tr>
436
569
  <td>Dépendances</td>
437
- <td><a href="http://www.kuwata-lab.com/erubis/">erubis</a> ou erb (inclus avec Ruby)</td>
570
+ <td>
571
+ <a href="http://www.kuwata-lab.com/erubis/" title="erubis">erubis</a>
572
+ ou erb (inclus avec Ruby)
573
+ </td>
438
574
  </tr>
439
575
  <tr>
440
576
  <td>Extensions de fichier</td>
@@ -446,12 +582,14 @@ get('/') { markdown :index }
446
582
  </tr>
447
583
  </table>
448
584
 
449
- ### Templates Builder
585
+ #### Templates Builder
450
586
 
451
587
  <table>
452
588
  <tr>
453
589
  <td>Dépendances</td>
454
- <td><a href="http://builder.rubyforge.org/">builder</a></td>
590
+ <td>
591
+ <a href="http://builder.rubyforge.org/" title="builder">builder</a>
592
+ </td>
455
593
  </tr>
456
594
  <tr>
457
595
  <td>Extensions de fichier</td>
@@ -466,12 +604,12 @@ get('/') { markdown :index }
466
604
  Ce moteur accepte également un bloc pour des templates en ligne (voir
467
605
  exemple).
468
606
 
469
- ### Templates Nokogiri
607
+ #### Templates Nokogiri
470
608
 
471
609
  <table>
472
610
  <tr>
473
611
  <td>Dépendances</td>
474
- <td><a href="http://nokogiri.org/">nokogiri</a></td>
612
+ <td><a href="http://nokogiri.org/" title="nokogiri">nokogiri</a></td>
475
613
  </tr>
476
614
  <tr>
477
615
  <td>Extensions de fichier</td>
@@ -487,12 +625,12 @@ exemple).
487
625
  Ce moteur accepte également un bloc pour des templates en ligne (voir
488
626
  exemple).
489
627
 
490
- ### Templates Sass
628
+ #### Templates Sass
491
629
 
492
630
  <table>
493
631
  <tr>
494
632
  <td>Dépendances</td>
495
- <td><a href="http://sass-lang.com/">sass</a></td>
633
+ <td><a href="http://sass-lang.com/" title="sass">sass</a></td>
496
634
  </tr>
497
635
  <tr>
498
636
  <td>Extensions de fichier</td>
@@ -504,12 +642,12 @@ exemple).
504
642
  </tr>
505
643
  </table>
506
644
 
507
- ### Templates SCSS
645
+ #### Templates SCSS
508
646
 
509
647
  <table>
510
648
  <tr>
511
649
  <td>Dépendances</td>
512
- <td><a href="http://sass-lang.com/">sass</a></td>
650
+ <td><a href="http://sass-lang.com/" title="sass">sass</a></td>
513
651
  </tr>
514
652
  <tr>
515
653
  <td>Extensions de fichier</td>
@@ -522,12 +660,12 @@ exemple).
522
660
  </tr>
523
661
  </table>
524
662
 
525
- ### Templates Less
663
+ #### Templates Less
526
664
 
527
665
  <table>
528
666
  <tr>
529
667
  <td>Dépendances</td>
530
- <td><a href="http://www.lesscss.org/">less</a></td>
668
+ <td><a href="http://www.lesscss.org/" title="less">less</a></td>
531
669
  </tr>
532
670
  <tr>
533
671
  <td>Extensions de fichier</td>
@@ -540,12 +678,12 @@ exemple).
540
678
  </tr>
541
679
  </table>
542
680
 
543
- ### Templates Liquid
681
+ #### Templates Liquid
544
682
 
545
683
  <table>
546
684
  <tr>
547
685
  <td>Dépendances</td>
548
- <td><a href="http://www.liquidmarkup.org/">liquid</a></td>
686
+ <td><a href="http://www.liquidmarkup.org/" title="liquid">liquid</a></td>
549
687
  </tr>
550
688
  <tr>
551
689
  <td>Extensions de fichier</td>
@@ -561,12 +699,19 @@ Comme vous ne pouvez appeler de méthodes Ruby (autres que `yield`)
561
699
  dans un template Liquid, vous aurez sûrement à lui passer des variables
562
700
  locales.
563
701
 
564
- ### Templates Markdown
702
+ #### Templates Markdown
565
703
 
566
704
  <table>
567
705
  <tr>
568
706
  <td><p>Dépendances</p></td>
569
- <td><a href="https://github.com/rtomayko/rdiscount">rdiscount</a>, <a href="https://github.com/vmg/redcarpet">redcarpet</a>, <a href="http://deveiate.org/projects/BlueCloth">bluecloth</a>, <a href="http://kramdown.rubyforge.org/">kramdown</a> *ou* <a href="http://maruku.rubyforge.org/">maruku</a></td>
707
+ <td>
708
+ Au choix :
709
+ <a href="https://github.com/rtomayko/rdiscount" title="RDiscount">RDiscount</a>,
710
+ <a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
711
+ <a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
712
+ <a href="http://kramdown.rubyforge.org/" title="kramdown">kramdown</a>,
713
+ <a href="http://maruku.rubyforge.org/" title="maruku">maruku</a>
714
+ </td>
570
715
  </tr>
571
716
 
572
717
  <tr>
@@ -583,14 +728,14 @@ Il n’est pas possible d’appeler des méthodes depuis markdown, ni de
583
728
  lui passer des variables locales. Par conséquent, il sera souvent utilisé
584
729
  en combinaison avec un autre moteur de rendu :
585
730
 
586
- ```ruby
731
+ ``` ruby
587
732
  erb :overview, :locals => { :text => markdown(:introduction) }
588
733
  ```
589
734
 
590
735
  Notez que vous pouvez également appeler la méthode `markdown` au
591
736
  sein d’autres templates :
592
737
 
593
- ```ruby
738
+ ``` ruby
594
739
  %h1 Hello From Haml !
595
740
  %p= markdown(:greetings)
596
741
  ```
@@ -600,12 +745,12 @@ pouvez pas utiliser de layouts écrits en Markdown. Toutefois, il
600
745
  est possible d’utiliser un moteur de rendu différent pour le template et
601
746
  pour le layout en utilisant l’option `:layout_engine`.
602
747
 
603
- ### Templates Textile
748
+ #### Templates Textile
604
749
 
605
750
  <table>
606
751
  <tr>
607
752
  <td>Dépendances</td>
608
- <td><a href="http://redcloth.org/">RedCloth</a></td>
753
+ <td><a href="http://redcloth.org/" title="RedCloth">RedCloth</a></td>
609
754
  </tr>
610
755
  <tr>
611
756
  <td>Extensions de fichier</td>
@@ -621,14 +766,14 @@ Il n’est pas possible d’appeler des méthodes depuis textile, ni de lui
621
766
  passer des variables locales. Par conséquent, il sera souvent utilisé en
622
767
  combinaison avec un autre moteur de rendu :
623
768
 
624
- ```ruby
769
+ ``` ruby
625
770
  erb :overview, :locals => { :text => textile(:introduction) }
626
771
  ```
627
772
 
628
773
  Notez que vous pouvez également appeler la méthode `textile` au
629
774
  sein d’autres templates :
630
775
 
631
- ```ruby
776
+ ``` ruby
632
777
  %h1 Hello From Haml !
633
778
  %p= textile(:greetings)
634
779
  ```
@@ -638,12 +783,12 @@ pas utiliser de layouts écrits en Textile. Toutefois, il est
638
783
  possible d’utiliser un moteur de rendu différent pour le template et
639
784
  pour le layout en utilisant l’option `:layout_engine`.
640
785
 
641
- ### Templates RDoc
786
+ #### Templates RDoc
642
787
 
643
788
  <table>
644
789
  <tr>
645
790
  <td>Dépendances</td>
646
- <td><a href="http://rdoc.rubyforge.org/">rdoc</a></td>
791
+ <td><a href="http://rdoc.rubyforge.org/" title="RDoc">RDoc</a></td>
647
792
  </tr>
648
793
  <tr>
649
794
  <td>Extensions de fichier</td>
@@ -659,14 +804,14 @@ Il n’est pas possible d’appeler des méthodes depuis rdoc, ni de lui
659
804
  passer des variables locales. Par conséquent, il sera souvent utilisé en
660
805
  combinaison avec un autre moteur de rendu :
661
806
 
662
- ```ruby
807
+ ``` ruby
663
808
  erb :overview, :locals => { :text => rdoc(:introduction) }
664
809
  ```
665
810
 
666
811
  Notez que vous pouvez également appeler la méthode `rdoc` au sein
667
812
  d’autres templates :
668
813
 
669
- ```ruby
814
+ ``` ruby
670
815
  %h1 Hello From Haml !
671
816
  %p= rdoc(:greetings)
672
817
  ```
@@ -676,11 +821,11 @@ pas utiliser de layouts écrits en RDoc. Toutefois, il est
676
821
  possible d’utiliser un moteur de rendu différent pour le template et
677
822
  pour le layout en utilisant l’option `:layout_engine`.
678
823
 
679
- ### Templates Radius
824
+ #### Templates Radius
680
825
  <table>
681
826
  <tr>
682
827
  <td>Dépendances</td>
683
- <td><a href="http://radius.rubyforge.org/">radius</a></td>
828
+ <td><a href="http://radius.rubyforge.org/" title="Radius">Radius</a></td>
684
829
  </tr>
685
830
  <tr>
686
831
  <td>Extensions de fichier</td>
@@ -695,12 +840,12 @@ pour le layout en utilisant l’option `:layout_engine`.
695
840
  Comme vous ne pouvez pas appeler de méthodes Ruby depuis un template
696
841
  Radius, vous aurez sûrement à lui passer des variables locales.
697
842
 
698
- ### Templates Markaby
843
+ #### Templates Markaby
699
844
 
700
845
  <table>
701
846
  <tr>
702
847
  <td>Dépendances</td>
703
- <td><a href="http://markaby.github.com/">markaby</a></td>
848
+ <td><a href="http://markaby.github.com/" title="Markaby">Markaby</a></td>
704
849
  </tr>
705
850
  <tr>
706
851
  <td>Extensions de fichier</td>
@@ -715,12 +860,12 @@ Radius, vous aurez sûrement à lui passer des variables locales.
715
860
  Ce moteur accepte également un bloc pour des templates en ligne (voir
716
861
  exemple).
717
862
 
718
- ### Templates RABL
863
+ #### Templates RABL
719
864
 
720
865
  <table>
721
866
  <tr>
722
867
  <td>Dépendances</td>
723
- <td><a href="https://github.com/nesquena/rabl">rabl</a></td>
868
+ <td><a href="https://github.com/nesquena/rabl" title="Rabl">Rabl</a></td>
724
869
  </tr>
725
870
  <tr>
726
871
  <td>Extensions de fichier</td>
@@ -732,12 +877,12 @@ exemple).
732
877
  </tr>
733
878
  </table>
734
879
 
735
- ### Templates Slim
880
+ #### Templates Slim
736
881
 
737
882
  <table>
738
883
  <tr>
739
884
  <td>Dépendances</td>
740
- <td><a href="http://slim-lang.com/">slim</a></td>
885
+ <td><a href="http://slim-lang.com/" title="Slim Lang">Slim Lang</a></td>
741
886
  </tr>
742
887
  <tr>
743
888
  <td>Extensions de fichier</td>
@@ -749,12 +894,12 @@ exemple).
749
894
  </tr>
750
895
  </table>
751
896
 
752
- ### Templates Creole
897
+ #### Templates Creole
753
898
 
754
899
  <table>
755
900
  <tr>
756
901
  <td>Dépendances</td>
757
- <td><a href="https://github.com/minad/creole">creole</a></td>
902
+ <td><a href="https://github.com/minad/creole" title="Creole">Creole</a></td>
758
903
  </tr>
759
904
  <tr>
760
905
  <td>Extensions de fichier</td>
@@ -766,33 +911,41 @@ exemple).
766
911
  </tr>
767
912
  </table>
768
913
 
769
- Il n'est pas possible d'appeler des méthodes depuis markdown, ni de lui
914
+ Il n'est pas possible d'appeler des méthodes depuis creole, ni de lui
770
915
  passer des variables locales. Par conséquent, il sera souvent utilisé en
771
916
  combinaison avec un autre moteur de rendu :
772
917
 
773
- ```ruby
918
+ ``` ruby
774
919
  erb :overview, :locals => { :text => markdown(:introduction) }
775
920
  ```
776
921
 
777
- Notez que vous pouvez également appeler la méthode +markdown+ au sein d'autres
922
+ Notez que vous pouvez également appeler la méthode `creole` au sein d'autres
778
923
  templates :
779
924
 
780
- ```ruby
925
+ ``` ruby
781
926
  %h1 Hello From Haml !
782
- %p= markdown(:greetings)
927
+ %p= creole(:greetings)
783
928
  ```
784
929
 
785
- Comme vous ne pouvez pas appeler de Ruby au sein de Markdown, vous ne pouvez
786
- pas utiliser de +layouts+ écrits en Markdown. Toutefois, il est possible
787
- d'utiliser un moteur de rendu différent pour le template et pour le +layout+
930
+ Comme vous ne pouvez pas appeler de Ruby au sein de Creole, vous ne pouvez
931
+ pas utiliser de layouts écrits en Creole. Toutefois, il est possible
932
+ d'utiliser un moteur de rendu différent pour le template et pour le layout
788
933
  en utilisant l'option `:layout_engine`.
789
934
 
790
- ### Templates CoffeeScript
935
+ #### Templates CoffeeScript
791
936
 
792
937
  <table>
793
938
  <tr>
794
939
  <td>Dépendances</td>
795
- <td><a href="https://github.com/josh/ruby-coffee-script">coffee-script</a> et un [moyen d'exécuter javascript](https://github.com/sstephenson/execjs/blob/master/README.md#readme)</td>
940
+ <td>
941
+ <a href="https://github.com/josh/ruby-coffee-script" title="Ruby CoffeeScript">
942
+ CoffeeScript
943
+ </a>
944
+ et un
945
+ <a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
946
+ moyen d'exécuter javascript
947
+ </a>
948
+ </td>
796
949
  </tr>
797
950
  <tr>
798
951
  <td>Extensions de fichier</td>
@@ -804,12 +957,52 @@ en utilisant l'option `:layout_engine`.
804
957
  </tr>
805
958
  </table>
806
959
 
807
- ### Templates Yajl
960
+ #### Templates Stylus
961
+
962
+ <table>
963
+ <tr>
964
+ <td>Dépendances</td>
965
+ <td>
966
+ <a href="https://github.com/lucasmazza/ruby-stylus" title="Ruby Stylus">
967
+ Stylus
968
+ </a>
969
+ et un
970
+ <a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
971
+ moyen d'exécuter javascript
972
+ </a>
973
+ </td>
974
+ </tr>
975
+ <tr>
976
+ <td>Extensions de fichier</td>
977
+ <td><tt>.styl</tt></td>
978
+ </tr>
979
+ <tr>
980
+ <td>Exemple</td>
981
+ <td><tt>stylus :index</tt></td>
982
+ </tr>
983
+ </table>
984
+
985
+ Avant de pouvoir utiliser des templates Stylus, vous devez auparavant charger
986
+ `stylus` et `stylus/tilt` :
987
+
988
+ ``` ruby
989
+ require 'sinatra'
990
+ require 'stylus'
991
+ require 'stylus/tilt'
992
+
993
+ get '/' do
994
+ stylus :exemple
995
+ end
996
+ ```
997
+
998
+ #### Templates Yajl
808
999
 
809
1000
  <table>
810
1001
  <tr>
811
1002
  <td>Dépendances</td>
812
- <td><a href="https://github.com/brianmario/yajl-ruby">yajl-ruby</a></td>
1003
+ <td>
1004
+ <a href="https://github.com/brianmario/yajl-ruby" title="yajl-ruby">yajl-ruby</a>
1005
+ </td>
813
1006
  </tr>
814
1007
  <tr>
815
1008
  <td>Extensions de fichier</td>
@@ -825,45 +1018,39 @@ en utilisant l'option `:layout_engine`.
825
1018
  Le source du template est évalué en tant que chaine Ruby, puis la
826
1019
  variable json obtenue est convertie avec #to_json.
827
1020
 
828
- ```ruby
1021
+ ``` ruby
829
1022
  json = { :foo => 'bar' }
830
1023
  json[:baz] = key
831
1024
  ```
832
1025
 
833
- Les options `:callback` et `:variable` peuvent être utilisées pour décorer l’objet retourné.
1026
+ Les options `:callback` et `:variable` peuvent être utilisées pour décorer
1027
+ l’objet retourné.
834
1028
 
835
- ```
1029
+ ``` ruby
836
1030
  var resource = {"foo":"bar","baz":"qux"}; present(resource);</pre>
837
1031
  ```
838
1032
 
839
- ### Templates WLang
1033
+ #### Templates WLang
840
1034
 
841
1035
  <table>
842
1036
  <tr>
843
- <td>Dependency</td>
844
- <td><a href="https://github.com/blambeau/wlang/">wlang</a></td>
1037
+ <td>Dépendances</td>
1038
+ <td><a href="https://github.com/blambeau/wlang/" title="wlang">wlang</a></td>
845
1039
  </tr>
846
1040
  <tr>
847
- <td>File Extensions</td>
1041
+ <td>Extensions de fichier</td>
848
1042
  <td><tt>.wlang</tt></td>
849
1043
  </tr>
850
1044
  <tr>
851
- <td>Example</td>
1045
+ <td>Exemple</td>
852
1046
  <td><tt>wlang :index, :locals => { :key => 'value' }</tt></td>
853
1047
  </tr>
854
1048
  </table>
855
1049
 
856
- L’appel de code ruby au sein des templates n’est pas idiomatique en wlang. L’écriture de templates sans logique est encouragé, via le passage de variables locales. Il est néanmoins possible d’écrire un layout en wlang et d’y utiliser `yield`.
857
-
858
- ### Templates embarqués
859
-
860
- ```ruby
861
- get '/' do
862
- haml '%div.title Bonjour le monde'
863
- end
864
- ```
865
-
866
- Générera le code du template spécifié dans la chaîne de caractères.
1050
+ L’appel de code ruby au sein des templates n’est pas idiomatique en wlang.
1051
+ L’écriture de templates sans logique est encouragé, via le passage de variables
1052
+ locales. Il est néanmoins possible d’écrire un layout en wlang et d’y utiliser
1053
+ `yield`.
867
1054
 
868
1055
  ### Accéder aux variables dans un Template
869
1056
 
@@ -871,7 +1058,7 @@ Un template est évalué dans le même contexte que l'endroit d'où il a été
871
1058
  appelé (gestionnaire de route). Les variables d'instance déclarées dans le
872
1059
  gestionnaire de route sont directement accessibles dans le template :
873
1060
 
874
- ```ruby
1061
+ ``` ruby
875
1062
  get '/:id' do
876
1063
  @foo = Foo.find(params[:id])
877
1064
  haml '%h1= @foo.nom'
@@ -880,7 +1067,7 @@ end
880
1067
 
881
1068
  Alternativement, on peut passer un hash contenant des variables locales :
882
1069
 
883
- ```ruby
1070
+ ``` ruby
884
1071
  get '/:id' do
885
1072
  foo = Foo.find(params[:id])
886
1073
  haml '%h1= foo.nom', :locals => { :foo => foo }
@@ -891,11 +1078,50 @@ Ceci est généralement utilisé lorsque l'on veut utiliser un template comme
891
1078
  partiel (depuis un autre template) et qu'il est donc nécessaire d'adapter les
892
1079
  noms de variables.
893
1080
 
1081
+
1082
+ ### Templates avec `yield` et layouts imbriqués
1083
+
1084
+ En général, un layout est un simple template qui appelle `yield`. Ce genre de
1085
+ template peut s'utiliser via l'option `:template` comme décrit précédemment ou
1086
+ peut être rendu depuis un bloc :
1087
+
1088
+ ``` ruby
1089
+ erb :post, :layout => false do
1090
+ erb :index
1091
+ end
1092
+ ```
1093
+
1094
+ Ce code est à globalement équivalent à `erb :index, :layout => :post`.
1095
+
1096
+ Le fait de passer des blocs aux méthodes de rendu est particulièrement utile
1097
+ pour gérer des templates imbriqués :
1098
+
1099
+ ``` ruby
1100
+ erb :main_layout, :layout => false do
1101
+ erb :admin_layout do
1102
+ erb :user
1103
+ end
1104
+ end
1105
+ ```
1106
+
1107
+ Ce qui peut aussi être fait avec un peu moins de code :
1108
+
1109
+ ``` ruby
1110
+ erb :admin_layout, :layout => :main_layout do
1111
+ erb :user
1112
+ end
1113
+ ```
1114
+
1115
+ Actuellement, les méthodes de rendu qui acceptent un bloc sont : `erb`, `haml`,
1116
+ `liquid`, `slim ` et `wlang`. La méthode générale `render` accepte elle aussi
1117
+ un bloc.
1118
+
1119
+
894
1120
  ### Templates dans le fichier source
895
1121
 
896
1122
  Des templates peuvent être définis dans le fichier source comme ceci :
897
1123
 
898
- ```ruby
1124
+ ``` ruby
899
1125
  require 'sinatra'
900
1126
 
901
1127
  get '/' do
@@ -917,11 +1143,12 @@ sont automatiquement chargés. Si vous avez des templates dans d'autres
917
1143
  fichiers source, il faut explicitement les déclarer avec
918
1144
  `enable :inline_templates`.
919
1145
 
1146
+
920
1147
  ### Templates nommés
921
1148
 
922
1149
  Les templates peuvent aussi être définis grâce à la méthode de haut niveau `template` :
923
1150
 
924
- ```ruby
1151
+ ``` ruby
925
1152
  template :layout do
926
1153
  "%html\n =yield\n"
927
1154
  end
@@ -940,7 +1167,7 @@ template sera affiché. Vous pouvez désactivez les layouts au cas par cas en
940
1167
  passant `:layout => false` ou bien les désactiver par défaut au moyen
941
1168
  de `set :haml, :layout => false` :
942
1169
 
943
- ```ruby
1170
+ ``` ruby
944
1171
  get '/' do
945
1172
  haml :index, :layout => !request.xhr?
946
1173
  end
@@ -952,7 +1179,7 @@ Pour associer une extension de fichier avec un moteur de rendu, utilisez
952
1179
  `Tilt.register`. Par exemple, si vous désirez utiliser l'extension
953
1180
  de fichier `tt` pour les templates Textile, vous pouvez faire comme suit :
954
1181
 
955
- ```ruby
1182
+ ``` ruby
956
1183
  Tilt.register :tt, Tilt[:textile]
957
1184
  ```
958
1185
 
@@ -961,7 +1188,7 @@ Tilt.register :tt, Tilt[:textile]
961
1188
  En premier lieu, déclarez votre moteur de rendu avec Tilt, ensuite créez
962
1189
  votre méthode de rendu :
963
1190
 
964
- ```ruby
1191
+ ``` ruby
965
1192
  Tilt.register :monmoteur, MonMerveilleurMoteurDeRendu
966
1193
 
967
1194
  helpers do
@@ -982,7 +1209,7 @@ que les routes, et permettent de modifier la requête et sa réponse. Les
982
1209
  variables d'instance déclarées dans les filtres sont accessibles au niveau
983
1210
  des routes et des templates :
984
1211
 
985
- ```ruby
1212
+ ``` ruby
986
1213
  before do
987
1214
  @note = 'Coucou !'
988
1215
  request.path_info = '/foo/bar/baz'
@@ -999,7 +1226,7 @@ contexte et permettent de modifier la requête et sa réponse. Les variables
999
1226
  d'instance déclarées dans les filtres before ou les routes sont accessibles
1000
1227
  au niveau des filtres after :
1001
1228
 
1002
- ```ruby
1229
+ ``` ruby
1003
1230
  after do
1004
1231
  puts response.status
1005
1232
  end
@@ -1007,12 +1234,12 @@ end
1007
1234
 
1008
1235
  Note : Le corps de la réponse n'est pas disponible au niveau du filtre after
1009
1236
  car il ne sera généré que plus tard (sauf dans le cas où vous utilisez la
1010
- méthode +body+ au lieu de simplement renvoyer une chaine depuis vos routes).
1237
+ méthode `body` au lieu de simplement renvoyer une chaine depuis vos routes).
1011
1238
 
1012
1239
  Les filtres peuvent être associés à un masque, ce qui permet de limiter leur
1013
1240
  exécution aux cas où la requête correspond à ce masque :
1014
1241
 
1015
- ```ruby
1242
+ ``` ruby
1016
1243
  before '/secret/*' do
1017
1244
  authentification!
1018
1245
  end
@@ -1024,7 +1251,7 @@ end
1024
1251
 
1025
1252
  Tout comme les routes, les filtres acceptent également des conditions :
1026
1253
 
1027
- ```ruby
1254
+ ``` ruby
1028
1255
  before :agent => /Songbird/ do
1029
1256
  # ...
1030
1257
  end
@@ -1039,7 +1266,7 @@ end
1039
1266
  Utilisez la méthode de haut niveau `helpers` pour définir des routines
1040
1267
  qui seront accessibles dans vos gestionnaires de route et dans vos templates :
1041
1268
 
1042
- ```ruby
1269
+ ``` ruby
1043
1270
  helpers do
1044
1271
  def bar(nom)
1045
1272
  "#{nom}bar"
@@ -1053,7 +1280,7 @@ end
1053
1280
 
1054
1281
  Vous pouvez aussi définir les méthodes helper dans un module séparé :
1055
1282
 
1056
- ```ruby
1283
+ ``` ruby
1057
1284
  module FooUtils
1058
1285
  def foo(nom) "#{nom}foo" end
1059
1286
  end
@@ -1071,9 +1298,9 @@ l'application.
1071
1298
  ### Utiliser les sessions
1072
1299
 
1073
1300
  Une session est utilisée pour conserver un état entre les requêtes. Une fois
1074
- activées, vous avez un +hash+ de session par session utilisateur :
1301
+ activées, vous avez un hash de session par session utilisateur :
1075
1302
 
1076
- ```ruby
1303
+ ``` ruby
1077
1304
  enable :sessions
1078
1305
 
1079
1306
  get '/' do
@@ -1085,14 +1312,14 @@ get '/:value' do
1085
1312
  end
1086
1313
  ```
1087
1314
 
1088
- Notez que <tt>enable :sessions</tt> enregistre en fait toutes les données dans
1089
- un +cookie+. Ce n'est pas toujours ce que vous voulez (enregistrer beaucoup de
1315
+ Notez que `enable :sessions` enregistre en fait toutes les données dans
1316
+ un cookie. Ce n'est pas toujours ce que vous voulez (enregistrer beaucoup de
1090
1317
  données va augmenter le traffic par exemple). Vous pouvez utiliser n'importe
1091
- quel +middleware+ Rack de session afin d'éviter cela. N'utiliser *pas*
1092
- <tt>enable :sessions</tt> dans ce cas mais charger le +middleware+ de votre
1093
- choix comme vous le feriez pour n'importe quel autre +middleware+ :
1318
+ quel middleware Rack de session afin d'éviter cela. N'utilisez **pas**
1319
+ `enable :sessions` dans ce cas mais chargez le middleware de votre
1320
+ choix comme vous le feriez pour n'importe quel autre middleware :
1094
1321
 
1095
- ```ruby
1322
+ ``` ruby
1096
1323
  use Rack::Session::Pool, :expire_after => 2592000
1097
1324
 
1098
1325
  get '/' do
@@ -1110,53 +1337,61 @@ hasard par Sinatra. Toutefois, comme cette clé change à chaque démarrage de
1110
1337
  votre application, vous pouvez définir cette clé vous-même afin que toutes
1111
1338
  les instances de votre application la partage :
1112
1339
 
1113
- ```ruby
1340
+ ``` ruby
1114
1341
  set :session_secret, 'super secret'
1115
1342
  ```
1116
1343
 
1117
1344
  Si vous souhaitez avoir plus de contrôle, vous pouvez également enregistrer un
1118
- +hash+ avec des options lors de la configuration de `sessions` :
1345
+ hash avec des options lors de la configuration de `sessions` :
1119
1346
 
1120
- ```ruby
1347
+ ``` ruby
1121
1348
  set :sessions, :domain => 'foo.com'
1122
1349
  ```
1123
1350
 
1351
+ Pour que les différents sous-domaines de foo.com puisse partager une session,
1352
+ vous devez préfixer le domaine par *.* :
1353
+
1354
+ ``` ruby
1355
+ set :sessions, :domain => '.foo.com'
1356
+ ```
1357
+
1358
+
1124
1359
  ### Halt
1125
1360
 
1126
1361
  Pour arrêter immédiatement la requête dans un filtre ou un gestionnaire de
1127
1362
  route :
1128
1363
 
1129
- ```ruby
1364
+ ``` ruby
1130
1365
  halt
1131
1366
  ```
1132
1367
 
1133
1368
  Vous pouvez aussi passer le code retour ...
1134
1369
 
1135
- ```ruby
1370
+ ``` ruby
1136
1371
  halt 410
1137
1372
  ```
1138
1373
 
1139
1374
  Ou le texte ...
1140
1375
 
1141
- ```ruby
1376
+ ``` ruby
1142
1377
  halt 'Ceci est le texte'
1143
1378
  ```
1144
1379
 
1145
1380
  Ou les deux ...
1146
1381
 
1147
- ```ruby
1382
+ ``` ruby
1148
1383
  halt 401, 'Partez !'
1149
1384
  ```
1150
1385
 
1151
1386
  Ainsi que les entêtes ...
1152
1387
 
1153
- ```ruby
1388
+ ``` ruby
1154
1389
  halt 402, {'Content-Type' => 'text/plain'}, 'revanche'
1155
1390
  ```
1156
1391
 
1157
1392
  Bien sûr il est possible de combiner un template avec `halt` :
1158
1393
 
1159
- ```ruby
1394
+ ``` ruby
1160
1395
  halt erb(:erreur)
1161
1396
  ```
1162
1397
 
@@ -1165,7 +1400,7 @@ halt erb(:erreur)
1165
1400
  Une route peut passer le relais aux autres routes qui correspondent également
1166
1401
  avec `pass` :
1167
1402
 
1168
- ```ruby
1403
+ ``` ruby
1169
1404
  get '/devine/:qui' do
1170
1405
  pass unless params[:qui] == 'Frank'
1171
1406
  "Tu m'as eu !"
@@ -1182,11 +1417,11 @@ Si aucun des masques suivants ne correspond, un code 404 est retourné.
1182
1417
 
1183
1418
  ### Déclencher une autre route
1184
1419
 
1185
- Parfois, +pass+ n'est pas ce que vous recherchez, au lieu de cela vous
1420
+ Parfois, `pass` n'est pas ce que vous recherchez, au lieu de cela vous
1186
1421
  souhaitez obtenir le résultat d'une autre route. Pour cela, utilisez
1187
- simplement call :
1422
+ simplement `call` :
1188
1423
 
1189
- ```ruby
1424
+ ``` ruby
1190
1425
  get '/foo' do
1191
1426
  status, headers, body = call env.merge("PATH_INFO" => '/bar')
1192
1427
  [status, headers, body.map(&:upcase)]
@@ -1214,10 +1449,10 @@ Il est possible et recommandé de définir le code retour et le corps de la
1214
1449
  réponse au moyen de la valeur de retour d'un bloc définissant une route.
1215
1450
  Quoiqu'il en soit, dans certains cas vous pourriez avoir besoin de définir
1216
1451
  le coprs de la réponse à un moment arbitraire de l'exécution. Vous pouvez le
1217
- faire au moyen de la méthode +body+. Si vous faites ainsi, vous pouvez alors
1452
+ faire au moyen de la méthode `body`. Si vous faites ainsi, vous pouvez alors
1218
1453
  utiliser cette même méthode pour accéder au corps de la réponse :
1219
1454
 
1220
- ```ruby
1455
+ ``` ruby
1221
1456
  get '/foo' do
1222
1457
  body "bar"
1223
1458
  end
@@ -1234,7 +1469,7 @@ voir "Valeurs de retour").
1234
1469
  Pareillement au corps de la réponse, vous pouvez également définir le code
1235
1470
  retour et les entêtes :
1236
1471
 
1237
- ```ruby
1472
+ ``` ruby
1238
1473
  get '/foo' do
1239
1474
  status 418
1240
1475
  headers \
@@ -1255,7 +1490,7 @@ extrèmes, vous souhaitez continuer à envoyer des données tant que le client
1255
1490
  n'abandonne pas la connection. Vous pouvez alors utiliser le helper `stream`
1256
1491
  pour éviter de créer votre propre système :
1257
1492
 
1258
- ```ruby
1493
+ ``` ruby
1259
1494
  get '/' do
1260
1495
  stream do |out|
1261
1496
  out << "Ca va être hallu -\n"
@@ -1277,37 +1512,52 @@ Le fonctionnement du streaming, notamment le nombre de requêtes simultanées,
1277
1512
  dépend énormément du serveur web utilisé. Certains ne prennent pas du tout en
1278
1513
  charge le streaming (WEBRick par exemple). Lorsque le serveur ne gère pas le
1279
1514
  streaming, la partie body de la réponse sera envoyée au client en une seule
1280
- fois, après que l'exécution du bloc passé au helper +stream+ sera terminée. Le
1515
+ fois, après que l'exécution du bloc passé au helper `stream` sera terminée. Le
1281
1516
  streaming ne fonctionne pas du tout avec Shotgun.
1282
1517
 
1283
- En utilisant le helper +stream+ avec le paramètre +keep_open+, il n'appelera
1284
- pas la méthode +close+ du flux, vous laissant la possibilité de le fermer à
1518
+ En utilisant le helper stream avec le paramètre `keep_open`, il n'appelera
1519
+ pas la méthode `close` du flux, vous laissant la possibilité de le fermer à
1285
1520
  tout moment au cours de l'exécution. Ceci ne fonctionne qu'avec les serveurs
1286
1521
  evented (ie non threadés) tels que Thin et Rainbows. Les autres serveurs
1287
1522
  fermeront malgré tout le flux :
1288
1523
 
1289
- ```ruby
1524
+ ``` ruby
1525
+ # interrogation prolongée
1526
+
1290
1527
  set :server, :thin
1291
- connections = []
1528
+ connexions = []
1292
1529
 
1293
- get '/' do
1294
- # conserve le flux ouvert
1295
- stream(:keep_open) { |out| connections << out }
1530
+ get '/souscrire' do
1531
+ # abonne un client aux évènements du serveur
1532
+ stream(:keep_open) { |out| connexions << out }
1533
+
1534
+ # purge les connexions abandonnées
1535
+ connexions.reject!(&:closed?)
1536
+
1537
+ # compte-rendu
1538
+ "abonné"
1296
1539
  end
1297
1540
 
1298
- post '/' do
1299
- # écrit dans tous les flux ouverts
1300
- connections.each { |out| out << params[:message] << "\n" }
1301
- "message sent"
1541
+ post '/message' do
1542
+ connexions.each do |out|
1543
+ # prévient le client qu'un nouveau message est arrivé
1544
+ out << params[:message] << "\n"
1545
+
1546
+ # indique au client de se connecter à nouveau
1547
+ out.close
1548
+ end
1549
+
1550
+ # compte-rendu
1551
+ "message reçu"
1302
1552
  end
1303
1553
  ```
1304
1554
 
1305
1555
  ### Journalisation (Logging)
1306
1556
 
1307
- Dans le contexte de la requête, la méthode utilitaire +logger+ expose une
1308
- instance de +logger+ :
1557
+ Dans le contexte de la requête, la méthode utilitaire `logger` expose une
1558
+ instance de `Logger` :
1309
1559
 
1310
- ```ruby
1560
+ ``` ruby
1311
1561
  get '/' do
1312
1562
  logger.info "chargement des données"
1313
1563
  # ...
@@ -1323,7 +1573,7 @@ Notez que la journalisation est seulement activée par défaut pour
1323
1573
  `Sinatra::Application`, donc si vous héritez de `>Sinatra::Base`,
1324
1574
  vous aurez à l'activer vous-même :
1325
1575
 
1326
- ```ruby
1576
+ ``` ruby
1327
1577
  class MonApp < Sinatra::Base
1328
1578
  configure :production, :development do
1329
1579
  enable :logging
@@ -1333,7 +1583,7 @@ end
1333
1583
 
1334
1584
  Si vous souhaitez utiliser votre propre logger, vous devez définir le paramètre
1335
1585
  `logging` à `nil` pour être certain qu'aucun middleware de logging ne sera
1336
- installé (notez toutefois que +logger+ renverra alors +nil+). Dans ce cas,
1586
+ installé (notez toutefois que `logger` renverra alors `nil`). Dans ce cas,
1337
1587
  Sinatra utilisera ce qui sera présent dans `env['rack.logger']`.
1338
1588
 
1339
1589
  ### Types Mime
@@ -1342,7 +1592,7 @@ Quand vous utilisez `send_file` ou des fichiers statiques, vous
1342
1592
  pouvez rencontrer des types mime que Sinatra ne connaît pas. Utilisez
1343
1593
  `mime_type` pour les déclarer par extension de fichier :
1344
1594
 
1345
- ```ruby
1595
+ ``` ruby
1346
1596
  configure do
1347
1597
  mime_type :foo, 'text/foo'
1348
1598
  end
@@ -1350,7 +1600,7 @@ end
1350
1600
 
1351
1601
  Vous pouvez également les utiliser avec la méthode `content_type` :
1352
1602
 
1353
- ```ruby
1603
+ ``` ruby
1354
1604
  get '/' do
1355
1605
  content_type :foo
1356
1606
  "foo foo foo"
@@ -1359,16 +1609,16 @@ end
1359
1609
 
1360
1610
  ### Former des URLs
1361
1611
 
1362
- Pour former des URLs, vous devriez utiliser la méthode +url+, par exemple en
1612
+ Pour former des URLs, vous devriez utiliser la méthode `url`, par exemple en
1363
1613
  Haml :
1364
1614
 
1365
- ```ruby
1615
+ ``` ruby
1366
1616
  %a{:href => url('/foo')} foo
1367
1617
  ```
1368
1618
 
1369
1619
  Cela prend en compte les proxy inverse et les routeurs Rack, s'ils existent.
1370
1620
 
1371
- Cette méthode est également disponible sous l'alias +to+ (voir ci-dessous
1621
+ Cette méthode est également disponible sous l'alias `to` (voir ci-dessous
1372
1622
  pour un exemple).
1373
1623
 
1374
1624
  ### Redirection du navigateur
@@ -1376,7 +1626,7 @@ pour un exemple).
1376
1626
  Vous pouvez déclencher une redirection du navigateur avec la méthode
1377
1627
  `redirect` :
1378
1628
 
1379
- ```ruby
1629
+ ``` ruby
1380
1630
  get '/foo' do
1381
1631
  redirect to('/bar')
1382
1632
  end
@@ -1385,7 +1635,7 @@ end
1385
1635
  Tout paramètre additionnel est géré comme des arguments pour la méthode
1386
1636
  `halt` :
1387
1637
 
1388
- ```ruby
1638
+ ``` ruby
1389
1639
  redirect to('/bar'), 303
1390
1640
  redirect 'http://google.com', 'mauvais endroit mon pote'
1391
1641
  ```
@@ -1393,7 +1643,7 @@ redirect 'http://google.com', 'mauvais endroit mon pote'
1393
1643
  Vous pouvez aussi rediriger vers la page dont l'utilisateur venait au moyen de
1394
1644
  `redirect back` :
1395
1645
 
1396
- ```ruby
1646
+ ``` ruby
1397
1647
  get '/foo' do
1398
1648
  "<a href='/bar'>faire quelque chose</a>"
1399
1649
  end
@@ -1406,13 +1656,13 @@ end
1406
1656
 
1407
1657
  Pour passer des arguments à une redirection, ajoutez-les soit à la requête :
1408
1658
 
1409
- ```ruby
1659
+ ``` ruby
1410
1660
  redirect to('/bar?sum=42')
1411
1661
  ```
1412
1662
 
1413
1663
  Ou bien utilisez une session :
1414
1664
 
1415
- ```ruby
1665
+ ``` ruby
1416
1666
  enable :sessions
1417
1667
 
1418
1668
  get '/foo' do
@@ -1431,36 +1681,36 @@ Définir correctement vos entêtes à la base pour un bon cache HTTP.
1431
1681
 
1432
1682
  Vous pouvez facilement définir l'entête Cache-Control de la manière suivante :
1433
1683
 
1434
- ```ruby
1684
+ ``` ruby
1435
1685
  get '/' do
1436
1686
  cache_control :public
1437
1687
  "met le en cache !"
1438
1688
  end
1439
1689
  ```
1440
1690
 
1441
- Conseil de pro : définir le cache dans un filtre +before+ :
1691
+ Conseil de pro : définir le cache dans un filtre before :
1442
1692
 
1443
- ```ruby
1693
+ ``` ruby
1444
1694
  before do
1445
1695
  cache_control :public, :must_revalidate, :max_age => 60
1446
1696
  end
1447
1697
  ```
1448
1698
 
1449
- Si vous utilisez la méthode +expires+ pour définir l'entête correspondant,
1699
+ Si vous utilisez la méthode `expires` pour définir l'entête correspondant,
1450
1700
  `Cache-Control` sera alors défini automatiquement :
1451
1701
 
1452
- ```ruby
1702
+ ``` ruby
1453
1703
  before do
1454
1704
  expires 500, :public, :must_revalidate
1455
1705
  end
1456
1706
  ```
1457
1707
 
1458
- Pour utiliser correctement les caches, vous devriez utiliser +etag+ ou
1459
- +last_modified+. Il est recommandé d'utiliser ces méthodes *avant* de faire
1708
+ Pour utiliser correctement les caches, vous devriez utiliser `etag` ou
1709
+ `last_modified`. Il est recommandé d'utiliser ces méthodes *avant* de faire
1460
1710
  d'importantes modifications, car elles vont immédiatement déclencher la réponse
1461
1711
  si le client a déjà la version courante dans son cache :
1462
1712
 
1463
- ```ruby
1713
+ ``` ruby
1464
1714
  get '/article/:id' do
1465
1715
  @article = Article.find params[:id]
1466
1716
  last_modified @article.updated_at
@@ -1472,7 +1722,7 @@ end
1472
1722
  Il est également possible d'utiliser un
1473
1723
  [weak ETag](http://en.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation) :
1474
1724
 
1475
- ```ruby
1725
+ ``` ruby
1476
1726
  etag @article.sha1, :weak
1477
1727
  ```
1478
1728
 
@@ -1481,7 +1731,7 @@ fournissent les informations nécessaires pour votre cache. Si vous êtes à la
1481
1731
  recherche de solutions rapides pour un reverse-proxy de cache, essayez
1482
1732
  [rack-cache](https://github.com/rtomayko/rack-cache) :
1483
1733
 
1484
- ```ruby
1734
+ ``` ruby
1485
1735
  require "rack/cache"
1486
1736
  require "sinatra"
1487
1737
 
@@ -1505,7 +1755,7 @@ put) existent déjà et pour les autres resources (par exemple dans le cas
1505
1755
  de requêtes post) qu'il s'agit de nouvelles resources. Vous pouvez modifier ce
1506
1756
  comportement en passant une option `:new_resource` :
1507
1757
 
1508
- ```ruby
1758
+ ``` ruby
1509
1759
  get '/create' do
1510
1760
  etag '', :new_resource => true
1511
1761
  Article.create
@@ -1515,16 +1765,15 @@ end
1515
1765
 
1516
1766
  Si vous souhaitez utilisez un ETag faible, utilisez l'option <tt>:kind</tt> :
1517
1767
 
1518
- ```
1768
+ ``` ruby
1519
1769
  etag '', :new_resource => true, :kind => :weak
1520
1770
  ```
1521
1771
 
1522
1772
  ### Envoyer des fichiers
1523
1773
 
1524
- Pour envoyer des fichiers, vous pouvez utiliser la méthode
1525
- `send_file` :
1774
+ Pour envoyer des fichiers, vous pouvez utiliser la méthode `send_file` :
1526
1775
 
1527
- ```ruby
1776
+ ``` ruby
1528
1777
  get '/' do
1529
1778
  send_file 'foo.png'
1530
1779
  end
@@ -1532,7 +1781,7 @@ end
1532
1781
 
1533
1782
  Quelques options sont également acceptées :
1534
1783
 
1535
- ```ruby
1784
+ ``` ruby
1536
1785
  send_file 'foo.png', :type => :jpg
1537
1786
  ```
1538
1787
 
@@ -1545,36 +1794,43 @@ Les options sont :
1545
1794
  </dd>
1546
1795
 
1547
1796
  <dt>last_modified</dt>
1548
- <dd>valeur pour l’entête Last-Modified, par défaut la date de modification
1549
- du fichier</dd>
1797
+ <dd>
1798
+ valeur pour l’entête Last-Modified, par défaut la date de modification du
1799
+ fichier
1800
+ </dd>
1550
1801
 
1551
1802
  <dt>type</dt>
1552
- <dd>type de contenu à utiliser, deviné à partir de l’extension de fichier
1553
- si absent</dd>
1803
+ <dd>
1804
+ type de contenu à utiliser, deviné à partir de l’extension de fichier si
1805
+ absent
1806
+ </dd>
1554
1807
 
1555
1808
  <dt>disposition</dt>
1556
- <dd>utilisé pour Content-Disposition, les valuers possibles étant :
1557
- `nil` (par défaut), `:attachment` et `:inline`</dd>
1809
+ <dd>
1810
+ utilisé pour Content-Disposition, les valuers possibles étant : <tt>nil</tt>
1811
+ (par défaut), <tt>:attachment</tt> et <tt>:inline</tt>
1812
+ </dd>
1558
1813
 
1559
1814
  <dt>length</dt>
1560
1815
  <dd>entête Content-Length, par défaut la taille du fichier</dd>
1561
1816
 
1562
1817
  <dt>status</dt>
1563
- <dd>code état à renvoyer. Utile quand un fichier statique sert de page
1564
- d’erreur.</dd>
1818
+ <dd>
1819
+ code état à renvoyer. Utile quand un fichier statique sert de page d’erreur.
1820
+ </dd>
1565
1821
  </dl>
1566
1822
 
1567
- Si le gestionnaire Rack le supporte, d'autres moyens que le +streaming+ via le
1823
+ Si le gestionnaire Rack le supporte, d'autres moyens que le streaming via le
1568
1824
  processus Ruby seront utilisés. Si vous utilisez cette méthode, Sinatra gérera
1569
- automatiquement les requêtes de type +range+.
1825
+ automatiquement les requêtes de type range.
1570
1826
 
1571
1827
  ### Accéder à l'objet requête
1572
1828
 
1573
1829
  L'objet correspondant à la requête envoyée peut être récupéré dans le contexte
1574
1830
  de la requête (filtres, routes, gestionnaires d'erreur) au moyen de la méthode
1575
- +request+ :
1831
+ `request` :
1576
1832
 
1577
- ```ruby
1833
+ ``` ruby
1578
1834
  # application tournant à l'adresse http://exemple.com/exemple
1579
1835
  get '/foo' do
1580
1836
  t = %w[text/css text/html application/javascript]
@@ -1596,7 +1852,7 @@ get '/foo' do
1596
1852
  # verbes HTTP)
1597
1853
  request.form_data? # false
1598
1854
  request["UN_ENTETE"] # valeur de l'entête UN_ENTETE
1599
- request.referer # référant du client ou '/'
1855
+ request.referrer # référant du client ou '/'
1600
1856
  request.user_agent # user agent (utilisé par la condition :agent)
1601
1857
  request.cookies # tableau contenant les cookies du navigateur
1602
1858
  request.xhr? # requête AJAX ?
@@ -1605,15 +1861,14 @@ get '/foo' do
1605
1861
  request.ip # adresse IP du client
1606
1862
  request.secure? # false
1607
1863
  request.forwarded? # vrai (si on est derrière un proxy inverse)
1608
- request.env # tableau brut de l'environnement fourni par
1609
- # Rack
1864
+ request.env # tableau brut de l'environnement fourni par Rack
1610
1865
  end
1611
1866
  ```
1612
1867
 
1613
1868
  Certaines options, telles que `script_name` ou `path_info`
1614
1869
  peuvent également être modifiées :
1615
1870
 
1616
- ```ruby
1871
+ ``` ruby
1617
1872
  before { request.path_info = "/" }
1618
1873
 
1619
1874
  get "/" do
@@ -1623,7 +1878,7 @@ end
1623
1878
 
1624
1879
  `request.body` est un objet IO ou StringIO :
1625
1880
 
1626
- ```ruby
1881
+ ``` ruby
1627
1882
  post "/api" do
1628
1883
  request.body.rewind # au cas où il a déjà été lu
1629
1884
  donnees = JSON.parse request.body.read
@@ -1633,11 +1888,11 @@ end
1633
1888
 
1634
1889
  ### Fichiers joints
1635
1890
 
1636
- Vous pouvez utiliser la méthode +attachment+ pour indiquer au navigateur que
1891
+ Vous pouvez utiliser la méthode `attachment` pour indiquer au navigateur que
1637
1892
  la réponse devrait être stockée sur le disque plutôt qu'affichée :
1638
1893
 
1639
1894
 
1640
- ```ruby
1895
+ ``` ruby
1641
1896
  get '/' do
1642
1897
  attachment
1643
1898
  "enregistre-le !"
@@ -1646,7 +1901,7 @@ end
1646
1901
 
1647
1902
  Vous pouvez également lui passer un nom de fichier :
1648
1903
 
1649
- ```ruby
1904
+ ``` ruby
1650
1905
  get '/' do
1651
1906
  attachment "info.txt"
1652
1907
  "enregistre-le !"
@@ -1655,23 +1910,23 @@ end
1655
1910
 
1656
1911
  ### Gérer Date et Time
1657
1912
 
1658
- Sinatra fourni un helper +time_for+ pour convertir une valeur donnée en
1659
- objet `Time`. Il peut aussi faire la conversion à partir d'objets +DateTime+,
1913
+ Sinatra fourni un helper `time_for` pour convertir une valeur donnée en
1914
+ objet `Time`. Il peut aussi faire la conversion à partir d'objets `DateTime`,
1660
1915
  `Date` ou de classes similaires :
1661
1916
 
1662
- ```ruby
1917
+ ``` ruby
1663
1918
  get '/' do
1664
1919
  pass if Time.now > time_for('Dec 23, 2012')
1665
1920
  "encore temps"
1666
1921
  end
1667
1922
  ```
1668
1923
 
1669
- Cette méthode est utilisée en interne par +expires+, +last_modified+ et
1924
+ Cette méthode est utilisée en interne par `expires`, `last_modified` et
1670
1925
  consorts. Par conséquent, vous pouvez très facilement étendre le
1671
- fonctionnement de ces méthodes en surchargeant le helper +time_for+ dans
1926
+ fonctionnement de ces méthodes en surchargeant le helper `time_for` dans
1672
1927
  votre application :
1673
1928
 
1674
- ```ruby
1929
+ ``` ruby
1675
1930
  helpers do
1676
1931
  def time_for(value)
1677
1932
  case value
@@ -1694,7 +1949,7 @@ end
1694
1949
  La méthode `find_template` est utilisée pour trouver les fichiers de
1695
1950
  templates à générer :
1696
1951
 
1697
- ```ruby
1952
+ ``` ruby
1698
1953
  find_template settings.views, 'foo', Tilt[:haml] do |file|
1699
1954
  puts "pourrait être #{file}"
1700
1955
  end
@@ -1704,7 +1959,7 @@ Ce n'est pas très utilise. En revanche, il est utile de pouvoir surcharger
1704
1959
  cette méthode afin de définir son propre mécanisme de recherche. Par exemple,
1705
1960
  vous pouvez utiliser plus d'un répertoire de vues :
1706
1961
 
1707
- ```ruby
1962
+ ``` ruby
1708
1963
  set :views, ['views', 'templates']
1709
1964
 
1710
1965
  helpers do
@@ -1717,7 +1972,7 @@ end
1717
1972
  Un autre exemple est d'utiliser des répertoires différents pour des moteurs
1718
1973
  de rendu différents :
1719
1974
 
1720
- ```ruby
1975
+ ``` ruby
1721
1976
  set :views, :sass => 'views/sass', :haml => 'templates', :default => 'views'
1722
1977
 
1723
1978
  helpers do
@@ -1734,7 +1989,7 @@ d'autres !
1734
1989
 
1735
1990
  Notez que `find_template` ne vérifie pas que le fichier existe mais
1736
1991
  va plutôt exécuter le bloc pour tous les chemins possibles. Cela n'induit pas
1737
- un problème de performance dans le sens où `render` va utiliser +break+ dès
1992
+ un problème de performance dans le sens où `render` va utiliser `break` dès
1738
1993
  qu'un fichier est trouvé. De plus, l'emplacement des templates (et leur
1739
1994
  contenu) est mis en cache si vous n'êtes pas en mode développement. Vous
1740
1995
  devriez garder cela en tête si vous écrivez une méthode vraiment dingue.
@@ -1743,7 +1998,7 @@ devriez garder cela en tête si vous écrivez une méthode vraiment dingue.
1743
1998
 
1744
1999
  Lancé une seule fois au démarrage de tous les environnements :
1745
2000
 
1746
- ```ruby
2001
+ ``` ruby
1747
2002
  configure do
1748
2003
  # définir un paramètre
1749
2004
  set :option, 'value'
@@ -1765,20 +2020,23 @@ end
1765
2020
  Lancé si l'environnement (variable d'environnement RACK_ENV) est défini comme
1766
2021
  `:production` :
1767
2022
 
2023
+ ``` ruby
1768
2024
  configure :production do
1769
2025
  ...
1770
2026
  end
2027
+ ```
1771
2028
 
1772
- Lancé si l'environnement est `:production` ou
1773
- `:test` :
2029
+ Lancé si l'environnement est `:production` ou `:test` :
1774
2030
 
2031
+ ``` ruby
1775
2032
  configure :production, :test do
1776
2033
  ...
1777
2034
  end
2035
+ ```
1778
2036
 
1779
2037
  Vous pouvez accéder à ces paramètres via `settings` :
1780
2038
 
1781
- ```
2039
+ ``` ruby
1782
2040
  configure do
1783
2041
  set :foo, 'bar'
1784
2042
  end
@@ -1797,24 +2055,34 @@ pour protéger votre application contre les principales attaques opportunistes.
1797
2055
  Vous pouvez très simplement désactiver cette fonctionnalité (ce qui exposera
1798
2056
  votre application à beaucoup de vulnerabilités courantes) :
1799
2057
 
1800
- ```ruby
2058
+ ``` ruby
1801
2059
  disable :protection
1802
2060
  ```
1803
2061
 
1804
2062
  Pour désactiver seulement un type de protection, vous pouvez définir `protection`
1805
2063
  avec un hash d'options :
1806
2064
 
1807
- ```ruby
2065
+ ``` ruby
1808
2066
  set :protection, :except => :path_traversal
1809
2067
  ```
1810
2068
 
1811
2069
  Vous pouvez également lui passer un tableau pour désactiver plusieurs types de
1812
2070
  protection :
1813
2071
 
1814
- ```ruby
2072
+ ``` ruby
1815
2073
  set :protection, :except => [:path_traversal, :session_hijacking]
1816
2074
  ```
1817
2075
 
2076
+ Par défaut, il faut que `:sessions` soit activé pour que Sinatra mette en place
2077
+ un système de protection au niveau de la session. Dans le cas où vous gérez
2078
+ vous même les sessions, vous devez utiliser l'option `:session` pour que cela
2079
+ soit le cas :
2080
+
2081
+ ``` ruby
2082
+ use Rack::Session::Pool
2083
+ set :protection, :session => true
2084
+ ```
2085
+
1818
2086
  ### Paramètres disponibles
1819
2087
 
1820
2088
  <dl>
@@ -1951,28 +2219,44 @@ set :protection, :except => [:path_traversal, :session_hijacking]
1951
2219
  <dt>views</dt>
1952
2220
  <dd>chemin pour le dossier des vues. Si non défini, il découle du paramètre
1953
2221
  <tt>app_file</tt>.</dd>
2222
+
2223
+ <dt>x_cascade</dt>
2224
+ <dd>
2225
+ Indique s'il faut ou non définir le header X-Cascade lorsqu'aucune route
2226
+ ne correspond. Défini à <tt>true</tt> par défaut.
2227
+ </dd>
1954
2228
  </dl>
1955
2229
 
1956
2230
  ## Environements
1957
2231
 
1958
2232
  Il existe trois environnements prédéfinis : `"development"`,
1959
2233
  `"production"` et `"test"`. Les environements peuvent être
1960
- sélectionné via la variable d'environnement +RACK_ENV+. Sa valeur par défaut
2234
+ sélectionné via la variable d'environnement `RACK_ENV`. Sa valeur par défaut
1961
2235
  est `"development"`. Dans ce mode, tous les templates sont rechargés à
1962
2236
  chaque requête. Des handlers spécifiques pour `not_found` et
1963
2237
  `error` sont installés pour vous permettre d'avoir une pile de trace
1964
2238
  dans votre navigateur. En mode `"production"` et `"test"` les
1965
2239
  templates sont mis en cache par défaut.
1966
2240
 
1967
- Pour exécuter votre application dans un environnement différent, utilisez
1968
- l'option `-e` de Ruby :
2241
+ Pour exécuter votre application dans un environnement différent, définissez la
2242
+ variable d'environnement `RACK_ENV` :
1969
2243
 
1970
- ```bash
1971
- $ ruby mon_application.rb -e [ENVIRONMENT]
2244
+ ``` shell
2245
+ RACK_ENV=production ruby my_app.rb
1972
2246
  ```
1973
2247
 
1974
- Vous pouvez utiliser une des méthodes +development?+, +test?+ et +production?+
1975
- pour déterminer quel est l'environnement en cours.
2248
+ Vous pouvez utiliser une des méthodes `development?`, `test?` et `production?`
2249
+ pour déterminer quel est l'environnement en cours :
2250
+
2251
+ ``` ruby
2252
+ get '/' do
2253
+ if settings.development?
2254
+ "développement !"
2255
+ else
2256
+ "pas en développement !"
2257
+ end
2258
+ end
2259
+ ```
1976
2260
 
1977
2261
  ## Gérer les erreurs
1978
2262
 
@@ -1985,7 +2269,7 @@ vieux `haml`, `erb`, `halt`, etc.
1985
2269
  Quand une exception <tt>Sinatra::NotFound</tt> est soulevée, ou que le code
1986
2270
  retour est 404, le gestionnaire <tt>not_found</tt> est invoqué :
1987
2271
 
1988
- ```ruby
2272
+ ``` ruby
1989
2273
  not_found do
1990
2274
  'Pas moyen de trouver ce que vous cherchez'
1991
2275
  end
@@ -1993,11 +2277,11 @@ end
1993
2277
 
1994
2278
  ### Error
1995
2279
 
1996
- Le gestionnaire +error+ est invoqué à chaque fois qu'une exception est
2280
+ Le gestionnaire `error` est invoqué à chaque fois qu'une exception est
1997
2281
  soulevée dans une route ou un filtre. L'objet exception est accessible via la
1998
2282
  variable Rack `sinatra.error` :
1999
2283
 
2000
- ```ruby
2284
+ ``` ruby
2001
2285
  error do
2002
2286
  'Désolé mais une méchante erreur est survenue - ' + env['sinatra.error'].name
2003
2287
  end
@@ -2005,7 +2289,7 @@ end
2005
2289
 
2006
2290
  Erreur sur mesure :
2007
2291
 
2008
- ```ruby
2292
+ ``` ruby
2009
2293
  error MonErreurSurMesure do
2010
2294
  'Donc il est arrivé ceci...' + env['sinatra.error'].message
2011
2295
  end
@@ -2013,7 +2297,7 @@ end
2013
2297
 
2014
2298
  Donc si ceci arrive :
2015
2299
 
2016
- ```ruby
2300
+ ``` ruby
2017
2301
  get '/' do
2018
2302
  raise MonErreurSurMesure, 'quelque chose de mal'
2019
2303
  end
@@ -2026,7 +2310,7 @@ Vous obtenez ça :
2026
2310
  Alternativement, vous pouvez avoir un gestionnaire d'erreur associé à un code
2027
2311
  particulier :
2028
2312
 
2029
- ```ruby
2313
+ ``` ruby
2030
2314
  error 403 do
2031
2315
  'Accès interdit'
2032
2316
  end
@@ -2038,7 +2322,7 @@ end
2038
2322
 
2039
2323
  Ou un intervalle :
2040
2324
 
2041
- ```ruby
2325
+ ``` ruby
2042
2326
  error 400..510 do
2043
2327
  'Boom'
2044
2328
  end
@@ -2058,9 +2342,9 @@ visualiser/manipuler la requête/réponse HTTP, et d'offrir diverses
2058
2342
  fonctionnalités classiques.
2059
2343
 
2060
2344
  Sinatra permet de construire facilement des middlewares Rack via la méthode de
2061
- haut niveau +use+ :
2345
+ haut niveau `use` :
2062
2346
 
2063
- ```ruby
2347
+ ``` ruby
2064
2348
  require 'sinatra'
2065
2349
  require 'mon_middleware_perso'
2066
2350
 
@@ -2072,21 +2356,27 @@ get '/bonjour' do
2072
2356
  end
2073
2357
  ```
2074
2358
 
2075
- La sémantique de +use+ est identique à celle définie dans le DSL de
2359
+ La sémantique de `use` est identique à celle définie dans le DSL de
2076
2360
  [Rack::Builder](http://rack.rubyforge.org/doc/classes/Rack/Builder.html)
2077
2361
  (le plus souvent utilisé dans un fichier rackup). Par exemple, la méthode
2078
- +use+ accepte divers arguments ainsi que des blocs :
2362
+ `use` accepte divers arguments ainsi que des blocs :
2079
2363
 
2080
- ```
2364
+ ``` ruby
2081
2365
  use Rack::Auth::Basic do |login, password|
2082
2366
  login == 'admin' && password == 'secret'
2083
2367
  end
2084
2368
  ```
2085
2369
 
2086
- Rack est distribué avec une bonne variété de middlewares standards pour les
2087
- logs, débuguer, faire du routage URL, de l'authentification, gérer des
2088
- sessions. Sinatra utilise beaucoup de ces composants automatiquement via la
2089
- configuration, donc pour ceux-ci vous n'aurez pas à utiliser la méthode `use`.
2370
+ Rack est distribué avec de nombreux middlewares standards pour loguer, débuguer,
2371
+ faire du routage URL, de l'authentification ou gérer des sessions. Sinatra gère
2372
+ plusieurs de ces composants automatiquement via son système de configuration, ce
2373
+ qui vous dispense de faire un `use` en ce qui les concerne.
2374
+
2375
+ Vous trouverez d'autres middlewares intéressants sur
2376
+ [rack](https://github.com/rack/rack/tree/master/lib/rack),
2377
+ [rack-contrib](https://github.com/rack/rack-contrib#readm),
2378
+ [CodeRack](http://coderack.org/) ou en consultant le
2379
+ [wiki de Rack](https://github.com/rack/rack/wiki/List-of-Middleware).
2090
2380
 
2091
2381
  ## Tester
2092
2382
 
@@ -2094,7 +2384,7 @@ Les tests pour Sinatra peuvent être écrit avec n'importe quelle bibliothèque
2094
2384
  basée sur Rack. [Rack::Test](http://gitrdoc.com/brynary/rack-test) est
2095
2385
  recommandé :
2096
2386
 
2097
- ```ruby
2387
+ ``` ruby
2098
2388
  require 'mon_application_sinatra'
2099
2389
  require 'test/unit'
2100
2390
  require 'rack/test'
@@ -2134,7 +2424,7 @@ niveau supérieur suppose une configuration dans le style des micro-applications
2134
2424
  `./views`, des logs, une page d'erreur, etc...). C'est là que
2135
2425
  `Sinatra::Base` prend tout son intérêt :
2136
2426
 
2137
- ```ruby
2427
+ ``` ruby
2138
2428
  require 'sinatra/base'
2139
2429
 
2140
2430
  class MonApplication < Sinatra::Base
@@ -2190,7 +2480,7 @@ mineures en ce qui concerne les paramètres par défaut :
2190
2480
  Il y a deux façons de faire pour démarrer une application modulaire, démarrez
2191
2481
  avec `run!` :
2192
2482
 
2193
- ```ruby
2483
+ ``` ruby
2194
2484
  # my_app.rb
2195
2485
  require 'sinatra/base'
2196
2486
 
@@ -2204,14 +2494,14 @@ end
2204
2494
 
2205
2495
  Démarrez ensuite avec :
2206
2496
 
2207
- ```bash
2208
- $ ruby my_app.rb
2497
+ ``` shell
2498
+ ruby my_app.rb
2209
2499
  ```
2210
2500
 
2211
2501
  Ou alors avec un fichier `config.ru`, qui permet d'utiliser n'importe
2212
2502
  quel gestionnaire Rack :
2213
2503
 
2214
- ```ruby
2504
+ ``` ruby
2215
2505
  # config.ru
2216
2506
  require './my_app'
2217
2507
  run MyApp
@@ -2219,15 +2509,15 @@ run MyApp
2219
2509
 
2220
2510
  Exécutez :
2221
2511
 
2222
- ```bash
2223
- $ rackup -p 4567
2512
+ ``` shell
2513
+ rackup -p 4567
2224
2514
  ```
2225
2515
 
2226
2516
  ### Utiliser une application de style classique avec un fichier config.ru
2227
2517
 
2228
2518
  Ecrivez votre application :
2229
2519
 
2230
- ```ruby
2520
+ ``` ruby
2231
2521
  # app.rb
2232
2522
  require 'sinatra'
2233
2523
 
@@ -2238,7 +2528,7 @@ end
2238
2528
 
2239
2529
  Et un fichier `config.ru` correspondant :
2240
2530
 
2241
- ```ruby
2531
+ ``` ruby
2242
2532
  require './app'
2243
2533
  run Sinatra::Application
2244
2534
  ```
@@ -2265,7 +2555,7 @@ en tant que middleware. Ce endpoint peut très bien être une autre
2265
2555
  application Sinatra, ou n'importe quelle application basée sur Rack
2266
2556
  (Rails/Ramaze/Camping/...) :
2267
2557
 
2268
- ```ruby
2558
+ ``` ruby
2269
2559
  require 'sinatra/base'
2270
2560
 
2271
2561
  class EcranDeConnexion < Sinatra::Base
@@ -2302,7 +2592,7 @@ Il se peut que vous ayez besoin de créer une nouvelle application à l'exécuti
2302
2592
  sans avoir à les assigner à une constante, vous pouvez le faire grâce à
2303
2593
  `Sinatra.new` :
2304
2594
 
2305
- ```ruby
2595
+ ``` ruby
2306
2596
  require 'sinatra/base'
2307
2597
  mon_app = Sinatra.new { get('/') { "salut" } }
2308
2598
  mon_app.run!
@@ -2310,7 +2600,7 @@ mon_app.run!
2310
2600
 
2311
2601
  L'application dont elle hérite peut être passé en argument optionnel :
2312
2602
 
2313
- ```ruby
2603
+ ``` ruby
2314
2604
  # config.ru
2315
2605
  require 'sinatra/base'
2316
2606
 
@@ -2333,7 +2623,7 @@ utiliser Sinatra dans votre propre bibliothèque.
2333
2623
 
2334
2624
  Cela permet également d'utiliser très facilement Sinatra comme middleware :
2335
2625
 
2336
- ```ruby
2626
+ ``` ruby
2337
2627
  require 'sinatra/base'
2338
2628
 
2339
2629
  use Sinatra do
@@ -2350,17 +2640,16 @@ disponibles.
2350
2640
 
2351
2641
  ### Contexte de l'application/classe
2352
2642
 
2353
- Toute application Sinatra correspond à une sous-classe de `Sinatra::Base`.
2354
- Si vous utilisez le DSL haut niveau (`require 'sinatra'`), alors cette
2355
- classe est `Sinatra::Application`, sinon il s'agit de la sous-classe que
2356
- vous avez définie. Dans le contexte de la classe, vous avez accès aux méthodes
2357
- telles que `get` ou `before`, mais vous n'avez pas accès aux objets +request+
2358
- ou +session+ car c'est la même classe d'application qui traitera toutes les
2359
- requêtes.
2643
+ Une application Sinatra correspond à une sous-classe de `Sinatra::Base`. Il
2644
+ s'agit de `Sinatra::Application` si vous utilisez le DSL de haut niveau
2645
+ (`require 'sinatra'`). Sinon c'est la sous-classe que vous avez définie. Dans
2646
+ le contexte de cette classe, vous avez accès aux méthodes telles que `get` ou
2647
+ `before`, mais pas aux objets `request` ou `session` étant donné que toutes
2648
+ les requêtes sont traitées par une seule classe d'application.
2360
2649
 
2361
- Les options définies au moyen de +set+ deviennent des méthodes de classe :
2650
+ Les options définies au moyen de `set` deviennent des méthodes de classe :
2362
2651
 
2363
- ```ruby
2652
+ ``` ruby
2364
2653
  class MonApp < Sinatra::Base
2365
2654
  # Eh, je suis dans le contexte de l'application !
2366
2655
  set :foo, 42
@@ -2387,14 +2676,14 @@ Vous pouvez atteindre ce contexte (donc la classe) de la façon suivante :
2387
2676
 
2388
2677
  ### Contexte de la requête/instance
2389
2678
 
2390
- Pour tout traitement d'une requête, une nouvelle instance de votre classe
2679
+ Pour chaque requête traitée, une nouvelle instance de votre classe
2391
2680
  d'application est créée et tous vos gestionnaires sont exécutés dans ce
2392
- contexte. Dans ce dernier, vous pouvez accéder aux objets `request` et
2393
- `session` et faire appel aux fonctions de rendu telles que `erb` ou `haml`.
2681
+ contexte. Depuis celui-ci, vous pouvez accéder aux objets `request` et
2682
+ `session` ou faire appel aux fonctions de rendu telles que `erb` ou `haml`.
2394
2683
  Vous pouvez accéder au contexte de l'application depuis le contexte de la
2395
2684
  requête au moyen de `settings` :
2396
2685
 
2397
- ```ruby
2686
+ ``` ruby
2398
2687
  class MonApp < Sinatra::Base
2399
2688
  # Eh, je suis dans le contexte de l'application !
2400
2689
  get '/ajouter_route/:nom' do
@@ -2413,10 +2702,10 @@ end
2413
2702
 
2414
2703
  Vous avez le binding du contexte de la requête dans :
2415
2704
 
2416
- * les blocs get/head/post/put/delete/options
2417
- * les filtres before/after
2705
+ * les blocs get, head, post, put, delete, options, patch, link et unlink
2706
+ * les filtres before et after
2418
2707
  * les méthodes utilitaires (définies au moyen de `helpers`)
2419
- * les vues/templates
2708
+ * les vues et templates
2420
2709
 
2421
2710
  ### Le contexte de délégation
2422
2711
 
@@ -2433,7 +2722,7 @@ Vous avez le binding du contexte de délégation dans :
2433
2722
  * Le binding de haut niveau, si vous avez utilisé `require "sinatra"`
2434
2723
  * Un objet qui inclut le module `Sinatra::Delegator`
2435
2724
 
2436
- Jetez un oeil pour vous faire une idée : voici le
2725
+ Pour vous faire une idée, vous pouvez jeter un coup d'oeil au
2437
2726
  [mixin Sinatra::Delegator](https://github.com/sinatra/sinatra/blob/ca06364/lib/sinatra/base.rb#L1609-1633)
2438
2727
  qui [étend l'objet principal](https://github.com/sinatra/sinatra/blob/ca06364/lib/sinatra/main.rb#L28-30).
2439
2728
 
@@ -2441,17 +2730,17 @@ qui [étend l'objet principal](https://github.com/sinatra/sinatra/blob/ca06364/l
2441
2730
 
2442
2731
  Les applications Sinatra peuvent être lancées directement :
2443
2732
 
2444
- ```ruby
2445
- $ ruby mon_application.rb [-h] [-x] [-e ENVIRONNEMENT] [-p PORT] [-o HOTE] [-s SERVEUR]
2733
+ ``` shell
2734
+ ruby mon_application.rb [-h] [-x] [-e ENVIRONNEMENT] [-p PORT] [-o HOTE] [-s SERVEUR]
2446
2735
  ```
2447
2736
 
2448
- Les options sont :
2737
+ Avec les options :
2449
2738
 
2450
2739
  ```
2451
2740
  -h # aide
2452
2741
  -p # déclare le port (4567 par défaut)
2453
2742
  -o # déclare l'hôte (0.0.0.0 par défaut)
2454
- -e # déclare l'environnement (+development+ par défaut)
2743
+ -e # déclare l'environnement (development par défaut)
2455
2744
  -s # déclare le serveur/gestionnaire à utiliser (thin par défaut)
2456
2745
  -x # active le mutex lock (off par défaut)
2457
2746
  ```
@@ -2462,40 +2751,45 @@ Les versions suivantes de Ruby sont officiellement supportées :
2462
2751
 
2463
2752
  <dl>
2464
2753
  <dt>Ruby 1.8.7</dt>
2465
- <dd>1.8.7 est complètement supporté, toutefois si rien ne vous en empêche,
2466
- nous vous recommandons de passer à 1.9.2 ou bien de passer à JRuby ou
2467
- Rubinius. Le support de Ruby 1.8.7 ne sera pas supprimé avant la sortie de
2468
- Sinatra 2.0 et de Ruby 2.0, à moins qu’un improbable Ruby 1.8.8
2469
- apparaisse. Et même dans ce cas, nous pourrions continuer à le supporter.
2470
- **Ruby 1.8.6 n’est plus supporté**. Si vous souhaitez utiliser la
2471
- version 1.8.6, vous devez revenir à Sinatra 1.2 qui continuera à recevoir
2472
- des corrections de bugs tant que Sinatra 1.4.0 ne sera pas livré.</dd>
2754
+ <dd>
2755
+ 1.8.7 est complètement supporté, toutefois si rien ne vous en empêche,
2756
+ nous vous recommandons de faire une mise à jour ou bien de passer à JRuby
2757
+ ou Rubinius. Le support de Ruby 1.8.7 ne sera pas supprimé avant la sortie
2758
+ de Sinatra 2.0. Ruby 1.8.6 n’est plus supporté.
2759
+ </dd>
2473
2760
 
2474
2761
  <dt>Ruby 1.9.2</dt>
2475
- <dd>1.9.2 est totalement supporté et recommandé. N’utilisez pas 1.9.2p0 car
2476
- il provoque des erreurs de segmentation à l’exécution de Sinatra. Son
2477
- support continuera au minimum jusqu’à la sortie de Ruby 1.9.4/2.0 et le
2478
- support de la dernière version 1.9 se poursuivra aussi longtemps que la
2479
- core team de Ruby la supportera.</dd>
2762
+ <dd>
2763
+ 1.9.2 est totalement supporté. N’utilisez pas 1.9.2p0 car il provoque des
2764
+ erreurs de segmentation à l’exécution de Sinatra. Son support continuera
2765
+ au minimum jusqu’à la sortie de Sinatra 1.5.
2766
+ </dd>
2480
2767
 
2481
2768
  <dt>Ruby 1.9.3</dt>
2482
- <dd>1.9.3 est totalement supporté et recommandé. Nous vous rappelons que
2483
- passer à 1.9.3 depuis une version précédente annulera toutes les
2484
- sessions.</dd>
2769
+ <dd>
2770
+ 1.9.3 est totalement supporté et recommandé. Nous vous rappelons que passer
2771
+ à 1.9.3 depuis une version précédente annulera toutes les sessions. 1.9.3
2772
+ sera supporté jusqu'à la sortie de Sinatra 2.0.
2773
+ </dd>
2485
2774
 
2775
+ <dt>Ruby 2.0.0</dt>
2776
+ <dd>
2777
+ 2.0.0 est totalement supporté et recommandé. L'abandon de son support
2778
+ officiel n'est pas à l'ordre du jour.
2779
+ </dd>
2486
2780
 
2487
2781
  <dt>Rubinius</dt>
2488
- <dd>Rubinius est officiellement supporté (Rubinius <= 1.2.4), tout
2489
- fonctionne, y compris tous les langages de template. La version 2.0 à
2490
- venir est également supportée.</dd>
2782
+ <dd>
2783
+ Rubinius est officiellement supporté (Rubinius >= 2.x). Un <tt>gem install
2784
+ puma</tt> est recommandé.
2785
+ </dd>
2491
2786
 
2492
2787
  <dt>JRuby</dt>
2493
- <dd>JRuby est officiellement supporté (JRuby <= 1.6.5). Aucune anomalie
2494
- avec des bibliothèques de templates tierces ne sont connues. Toutefois, si
2495
- vous choisissez JRuby, alors tournez vous vers des gestionnaires Rack JRuby
2496
- car le serveur Thin n’est pas complètement supporté par JRuby. Le
2497
- support des extensions C dans JRuby est encore expérimental, ce qui
2498
- n’affecte que RDiscount, Redcarpet and RedCloth pour l’instant.</dd>
2788
+ <dd>
2789
+ La dernière version stable de JRuby est officiellement supportée. Il est
2790
+ déconseillé d'utiliser des extensions C avec JRuby. Un <tt>gem install
2791
+ trinidad</tt> est recommandé.
2792
+ </dd>
2499
2793
  </dl>
2500
2794
 
2501
2795
  Nous gardons également un oeil sur les versions Ruby à venir.
@@ -2509,105 +2803,107 @@ sont malgré tout connues pour permettre de faire fonctionner Sinatra :
2509
2803
  * Ruby 1.9.0 et 1.9.1 (mais nous déconseillons leur utilisation)
2510
2804
 
2511
2805
  Le fait de ne pas être officiellement supporté signifie que si quelque chose
2512
- ne fonctionne pas uniquement sur cette plateforme alors c'est un problème de la
2806
+ ne fonctionne pas sur cette plateforme uniquement alors c'est un problème de la
2513
2807
  plateforme et pas un bug de Sinatra.
2514
2808
 
2515
2809
  Nous lançons également notre intégration continue (CI) avec ruby-head (la
2516
- future 2.0.0) et la branche 1.9.4, mais étant donné les évolutions continuelles,
2517
- nous ne pouvont rien garantir, si ce n'est que les versions 1.9.4p0 et 2.0.0p0
2518
- seront supportées.
2810
+ future 2.1.0), mais nous ne pouvont rien garantir étant donné les évolutions
2811
+ continuelles. La version 2.1.0 devrait être totalement supportée.
2519
2812
 
2520
2813
  Sinatra devrait fonctionner sur n'importe quel système d'exploitation
2521
- supportant l'implémentation Ruby choisie.
2814
+ supporté par l'implémentation Ruby choisie.
2815
+
2816
+ Si vous utilisez MacRuby, vous devriez `gem install control_tower`.
2522
2817
 
2523
- Il n'est pas possible d'utiliser Sinatra sur Cardinal, SmallRuby, Blueuby ou
2818
+ Il n'est pas possible d'utiliser Sinatra sur Cardinal, SmallRuby, BlueRuby ou
2524
2819
  toute version de Ruby antérieure à 1.8.7 à l'heure actuelle.
2525
2820
 
2526
2821
  ## Essuyer les plâtres
2527
2822
 
2528
- Si vous voulez utiliser la toute dernière version de Sinatra, n'ayez pas peur
2529
- de faire tourner votre application sur la branche master, cela devrait être
2823
+ Si vous souhaitez tester la toute dernière version de Sinatra, n'hésitez pas
2824
+ à faire tourner votre application sur la branche master, celle-ci devrait être
2530
2825
  stable.
2531
2826
 
2532
- Nous publions également une gem de +prerelease+ de temps en temps que vous
2533
- pouvez installer comme suit :
2827
+ Pour cela, la méthode la plus simple est d'installer une gem de prerelease que
2828
+ nous publions de temps en temps :
2534
2829
 
2535
- ```ruby
2536
- $ gem install sinatra --pre
2830
+ ``` shell
2831
+ gem install sinatra --pre
2537
2832
  ```
2833
+ Ce qui permet de bénéficier des toutes dernières fonctionnalités.
2538
2834
 
2539
- afin d'avoir les toutes dernières fonctionnalités.
2835
+ ### Installer avec Bundler
2540
2836
 
2541
- ### Avec Bundler
2837
+ Il est cependant conseillé de passer par [Bundler](http://gembundler.com/) pour
2838
+ faire tourner votre application avec la dernière version de Sinatra.
2542
2839
 
2543
- Si vous voulez faire tourner votre application avec le tout dernier
2544
- Sinatra, [Bundler](http://gembundler.com/) est recommandé.
2840
+ Pour commencer, installez bundler si nécessaire :
2545
2841
 
2546
- Tout d'abord, installer bundler si vous ne l'avez pas :
2547
-
2548
- ```bash
2549
- $ gem install bundler
2842
+ ``` shell
2843
+ gem install bundler
2550
2844
  ```
2551
2845
 
2552
- Ensuite, dans le dossier de votre projet, créez un fichier +Gemfile+ :
2846
+ Ensuite, créez un fichier `Gemfile` dans le dossier de votre projet :
2553
2847
 
2554
- ```ruby
2555
- source :rubygems
2556
- gem 'sinatra', :git => "git://github.com/sinatra/sinatra.git"
2848
+ ``` ruby
2849
+ source 'https://rubygems.org'
2850
+ gem 'sinatra', :github => "sinatra/sinatra"
2557
2851
 
2558
2852
  # autres dépendances
2559
- gem 'haml' # par exemple, si vous utilisez haml
2560
- gem 'activerecord', '~> 3.0' # peut-être que vous avez également besoin
2561
- # de ActiveRecord 3.x
2853
+ gem 'haml' # si par exemple vous utilisez haml
2854
+ gem 'activerecord', '~> 3.0' # au cas vous auriez besoin de ActiveRecord 3.x
2562
2855
  ```
2563
2856
 
2564
- Notez que vous aurez à lister toutes les dépendances de votre application dans
2565
- ce fichier. Les dépendances directes de Sinatra (Rack et Tilt) seront
2857
+ Notez que vous devez lister toutes les dépendances de votre application dans
2858
+ ce fichier `Gemfile`. Les dépendances directes de Sinatra (Rack et Tilt) seront
2566
2859
  automatiquement téléchargées et ajoutées par Bundler.
2567
2860
 
2568
- Maintenant, vous pouvez faire tourner votre application de la façon suivante :
2861
+ Vous pouvez alors lancer votre application de la façon suivante :
2569
2862
 
2570
- ```bash
2571
- $ bundle exec ruby myapp.rb
2863
+ ``` shell
2864
+ bundle exec ruby myapp.rb
2572
2865
  ```
2573
2866
 
2574
- ### Faites le vous-même
2867
+ ### Faire un clone local
2575
2868
 
2576
- Créez un clone local et démarrez votre application avec le dossier
2577
- `sinatra/lib` dans le `$LOAD_PATH` :
2869
+ Si vous ne souhaitez pas employer Bundler, vous pouvez cloner Sinatra en local
2870
+ dans votre projet et démarrez votre application avec le dossier `sinatra/lib`
2871
+ dans le `$LOAD_PATH` :
2578
2872
 
2579
- ```bash
2580
- $ cd myapp
2581
- $ git clone git://github.com/sinatra/sinatra.git
2582
- $ ruby -Isinatra/lib myapp.rb
2873
+ ``` shell
2874
+ cd myapp
2875
+ git clone git://github.com/sinatra/sinatra.git
2876
+ ruby -I sinatra/lib myapp.rb
2877
+ ```
2583
2878
 
2584
- A l'avenir, pour mettre à jour le code source de Sinatra :
2879
+ Et de temps en temps, vous devrez récupérer la dernière version du code source
2880
+ de Sinatra :
2585
2881
 
2586
- ```bash
2587
- $ cd myapp/sinatra
2588
- $ git pull
2882
+ ``` shell
2883
+ cd myapp/sinatra
2884
+ git pull
2589
2885
  ```
2590
2886
 
2591
- ### Installez globalement
2887
+ ### Installer globalement
2592
2888
 
2593
- Vous pouvez construire la gem vous-même :
2889
+ Une dernière méthode consiste à construire la gem vous-même :
2594
2890
 
2595
- ```bash
2596
- $ git clone git://github.com/sinatra/sinatra.git
2597
- $ cd sinatra
2598
- $ rake sinatra.gemspec
2599
- $ rake install
2891
+ ``` shell
2892
+ git clone git://github.com/sinatra/sinatra.git
2893
+ cd sinatra
2894
+ rake sinatra.gemspec
2895
+ rake install
2600
2896
  ```
2601
2897
 
2602
- Si vous installez les gems en tant que +root+, la dernière étape sera :
2898
+ Si vous installez les gems en tant que root, vous devez encore faire un :
2603
2899
 
2604
- ```bash
2605
- $ sudo rake install
2900
+ ``` shell
2901
+ sudo rake install
2606
2902
  ```
2607
2903
 
2608
2904
  ## Versions
2609
2905
 
2610
- Sinatra se conforme aux (versions sémantiques)[http://semver.org/], aussi bien
2906
+ Sinatra se conforme aux [versions sémantiques](http://semver.org/), aussi bien
2611
2907
  SemVer que SemVerTag.
2612
2908
 
2613
2909
  ## Mais encore
@@ -2618,11 +2914,10 @@ SemVer que SemVerTag.
2618
2914
  bug ? Besoin d'aide ? Vous avez un patch ?
2619
2915
  * [Suivi des problèmes](http://github.com/sinatra/sinatra/issues)
2620
2916
  * [Twitter](http://twitter.com/sinatra)
2621
- * [Mailing List])(http://groups.google.com/group/sinatrarb/topics)
2622
- * [IRC : #sinatra](irc://chat.freenode.net/#sinatra) sur http://freenode.net
2623
- * [IRC : #sinatra](irc://chat.freenode.net/#sinatra) on http://freenode.net
2917
+ * [Mailing List](http://groups.google.com/group/sinatrarb/topics)
2918
+ * IRC : [#sinatra](irc://chat.freenode.net/#sinatra) sur http://freenode.net
2624
2919
  * [Sinatra Book](http://sinatra-book.gittr.com) Tutoriels et recettes
2625
- * [Sinatra Recipes](http://recipes.sinatrarb.com/) trucs et astuces rédigés par
2920
+ * [Sinatra Recipes](http://recipes.sinatrarb.com/) trucs et astuces rédigés par
2626
2921
  la communauté
2627
2922
  * Documentation API de la [dernière version](http://rubydoc.info/gems/sinatra)
2628
2923
  ou du [HEAD courant](http://rubydoc.info/github/sinatra/sinatra) sur