sinatra 1.3.0.a → 1.3.0.b

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

Potentially problematic release.


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

data/CHANGES CHANGED
@@ -15,11 +15,37 @@
15
15
  classic style) than `Sinatra::Application` by setting `Delegator.target`.
16
16
  This was mainly introduced to ease testing. (Konstantin Haase)
17
17
 
18
+ * Added `request.accept?` and `request.preferred_type` to ease dealing with
19
+ `Accept` headers. (Konstantin Haase)
20
+
18
21
  = 1.2.2 / Not Yet Released
19
22
 
23
+ * The `:provides => :js` condition now matches both `application/javascript`
24
+ and `text/javascript`. The `:provides => :xml` condition now matches both
25
+ `application/xml` and `text/xml`. The `Content-Type` header is set
26
+ accordingly. If the client accepts both, the `application/*` version is
27
+ preferred, since the `text/*` versions are deprecated. (Konstantin Haase)
28
+
29
+ * The `provides` condition now handles wildcards in `Accept` headers correctly.
30
+ Thus `:provides => :html` matches `text/html`, `text/*` and `*/*`.
31
+ (Konstantin Haase)
32
+
33
+ * When parsing `Accept` headers, `Content-Type` preferences are honored
34
+ according to RFC 2616 section 14.1. (Konstantin Haase)
35
+
20
36
  * URIs passed to the `url` helper or `redirect` may now use any schema to be
21
37
  identified as absolute URIs, not only `http` or `https`. (Konstantin Haase)
22
38
 
39
+ * Handles `Content-Type` strings that already contain parameters correctly in
40
+ `content_type` (example: `content_type "text/plain; charset=utf-16"`).
41
+ (Konstantin Haase)
42
+
43
+ * If a route with an empty pattern is defined (`get("") { ... }`) requests with
44
+ an empty path info match this route instead of "/". (Konstantin Haase)
45
+
46
+ * In development environment, when running under a nested path, the image URIs
47
+ on the error pages are set properly. (Konstantin Haase)
48
+
23
49
  = 1.2.1 / 2011-03-17
24
50
 
25
51
  * Use a generated session secret when using `enable :sessions`. (Konstantin
data/Gemfile CHANGED
@@ -39,4 +39,5 @@ platforms :mri_18 do
39
39
  # bundler platforms are broken
40
40
  next if RUBY_ENGINE != 'ruby' or RUBY_VERSION > "1.8"
41
41
  gem 'rcov', :group => 'rcov'
42
+ gem 'therubyracer', :group => 'coffee-script'
42
43
  end
@@ -851,6 +851,11 @@ teilen:
851
851
 
852
852
  set :session_secret, 'super secret'
853
853
 
854
+ Zur weiteren Konfiguration kann man einen Hash mit Optionen in den +sessions+
855
+ Einstellungen ablegen.
856
+
857
+ set :sessions, :domain => 'foo.com'
858
+
854
859
 
855
860
  == Anhalten
856
861
 
@@ -955,6 +960,31 @@ Vergleichbar mit +body+ lassen sich auch Status-Code und Header setzen:
955
960
  Genau wie bei +body+ liest ein Aufrufen von +headers+ oder +status+ ohne
956
961
  Argumente den aktuellen Wert aus.
957
962
 
963
+ === Logger
964
+
965
+ Im Geltungsbereich eines Request stellt die +logger+ Helfer-Methode eine
966
+ +Logger+ Instanz zur Verfügung:
967
+
968
+ get '/' do
969
+ logger.info "es passiert gerade etwas"
970
+ # ...
971
+ end
972
+
973
+ Der Logger übernimmt dabei automatisch alle im Rack-Handler eingestellten Log-
974
+ Vorgaben. Ist Loggen ausgeschaltet, gibt die Methode ein Leerobjekt zurück.
975
+ In den Routen und Filtern muss man sich also nicht weiter darum kümmern.
976
+
977
+
978
+ Beachte, dass das Loggen standardmäßig nur für <tt>Sinatra::Application</tt>
979
+ voreingestellt ist. Wird über <tt>Sinatra::Base</tt> vererbt, muss es erst
980
+ aktiviert werden:
981
+
982
+ class MyApp < Sinatra::Base
983
+ configure(:production, :development) do
984
+ enable :logging
985
+ end
986
+ end
987
+
958
988
 
959
989
  == Mime-Types
960
990
 
@@ -1073,29 +1103,33 @@ zugegriffen werden:
1073
1103
 
1074
1104
  # App läuft unter http://example.com/example
1075
1105
  get '/foo' do
1076
- request.body # Request-Body des Clients (siehe unten)
1077
- request.scheme # "http"
1078
- request.script_name # "/example"
1079
- request.path_info # "/foo"
1080
- request.port # 80
1081
- request.request_method # "GET"
1082
- request.query_string # ""
1083
- request.content_length # Länge von request.body
1084
- request.media_type # Media-Type von request.body
1085
- request.host # "example.com"
1086
- request.get? # true (ähnliche Methoden für andere Verben)
1087
- request.form_data? # false
1088
- request["SOME_HEADER"] # Wert des SOME_HEADER-Headers
1089
- request.referrer # der Referrer des Clients oder '/'
1090
- request.user_agent # User-Agent (genutzt von :agent-Bedingung)
1091
- request.cookies # Hash der Cookies
1092
- request.xhr? # Ist dies eine Ajax-Anfrage?
1093
- request.url # "http://example.com/example/foo"
1094
- request.path # "/example/foo"
1095
- request.ip # Client-IP-Addresse
1096
- request.secure? # false (wäre true bei SSL)
1097
- request.forwarded? # true (wenn hinter Reverse-Proxy)
1098
- requuest.env # env-Hash, den Rack durchreicht
1106
+ t = %w[text/css text/html application/javascript]
1107
+ request.accept # ['text/html', '*/*']
1108
+ request.accept? 'text/xml' # true
1109
+ request.preferred_type(t) # 'text/html'
1110
+ request.body # Request-Body des Client (siehe unten)
1111
+ request.scheme # "http"
1112
+ request.script_name # "/example"
1113
+ request.path_info # "/foo"
1114
+ request.port # 80
1115
+ request.request_method # "GET"
1116
+ request.query_string # ""
1117
+ request.content_length # Länge des request.body
1118
+ request.media_type # Medientypus von request.body
1119
+ request.host # "example.com"
1120
+ request.get? # true (ähnliche Methoden für andere Verben)
1121
+ request.form_data? # false
1122
+ request["IRGENDEIN_HEADER"] # Wert von IRGENDEIN_HEADER header
1123
+ request.referrer # Der Referrer des Clients oder '/'
1124
+ request.user_agent # User-Agent (verwendet in der :agent Bedingung)
1125
+ request.cookies # Hash des Browser-Cookies
1126
+ request.xhr? # Ist das hier ein Ajax-Request?
1127
+ request.url # "http://example.com/example/foo"
1128
+ request.path # "/example/foo"
1129
+ request.ip # IP-Adresse des Clients
1130
+ request.secure? # false (true wenn SSL)
1131
+ request.forwarded? # true (Wenn es hinter einem Reverse-Proxy verwendet wird)
1132
+ request.env # vollständiger env-Hash von Rack übergeben
1099
1133
  end
1100
1134
 
1101
1135
  Manche Optionen, wie etwa <tt>script_name</tt> oder <tt>path_info</tt>, sind
@@ -1292,10 +1326,7 @@ Diese Einstellungen sind über +settings+ erreichbar:
1292
1326
  [public] Das öffentliche Verzeichnis, aus dem Daten zur Verfügung
1293
1327
  gestellt werden können.
1294
1328
 
1295
- [reload_templates] Entscheidet, ob Templates zwischen Anfragen neu geladen
1296
- werden sollen oder nicht. Unter Ruby 1.8.6 ist es im
1297
- Entwicklungsmodus eingeschaltet (um einen Fehler in Ruby
1298
- auszugleichen, der ein Speicherleck verursacht).
1329
+ [reload_templates] Im development-Modus aktiviert.
1299
1330
 
1300
1331
  [root] Wurzelverzeichnis des Projekts.
1301
1332
 
@@ -1638,6 +1669,47 @@ andere Sinatra-Anwendung handeln, es kann jede andere Rack-Anwendung sein
1638
1669
  get('/') { "Hallo #{session['user_name']}." }
1639
1670
  end
1640
1671
 
1672
+ === Dynamische Applikationserstellung
1673
+
1674
+ Manche Situationen erfordern die Erstellung neuer Applikationen zur Laufzeit,
1675
+ ohne dass sie einer Konstanten zugeordnet werden. Dies lässt sich mit
1676
+ `Sinatra.new` erreichen:
1677
+
1678
+ require 'sinatra/base'
1679
+ my_app = Sinatra.new { get('/') { "hallo" } }
1680
+ my_app.run!
1681
+
1682
+
1683
+ Die Applikation kann mit Hilfe eines optionalen Parameters erstellt werden:
1684
+
1685
+ require 'sinatra/base'
1686
+
1687
+ controller = Sinatra.new do
1688
+ enable :logging
1689
+ helpers MyHelpers
1690
+ end
1691
+
1692
+ map('/a') do
1693
+ run Sinatra.new(controller) { get('/') { 'a' } }
1694
+ end
1695
+
1696
+ map('/b') do
1697
+ run Sinatra.new(controller) { get('/') { 'b' } }
1698
+ end
1699
+
1700
+ Das ist besonders dann interessant, wenn Sinatra-Erweiterungen getestet werden
1701
+ oder Sinatra in einer Bibliothek Verwendung findet.
1702
+
1703
+ Ebenso lassen sich damit hervorragend Sinatra-Middlewares erstellen:
1704
+
1705
+ require 'sinatra/base'
1706
+
1707
+ use Sinatra do
1708
+ get('/') { ... }
1709
+ end
1710
+
1711
+ run RailsProject::Application
1712
+
1641
1713
 
1642
1714
  == Geltungsbereich und Bindung
1643
1715
 
@@ -1672,6 +1744,7 @@ Im Anwendungs-Scope befindet man sich:
1672
1744
  * In Methoden, die von Erweiterungen definiert werden.
1673
1745
  * Im Block, der an +helpers+ übergeben wird.
1674
1746
  * In Procs und Blöcken, die an +set+ übergeben werden.
1747
+ * Der an <tt>Sinatra.new</tt> übergebene Block
1675
1748
 
1676
1749
  Auf das Scope-Objekt (die Klasse) kann wie folgt zugegriffen werden:
1677
1750
 
@@ -1751,20 +1824,8 @@ Die Optionen sind:
1751
1824
 
1752
1825
  == Systemanforderungen
1753
1826
 
1754
- Es wird empfohlen, Sinatra unter Ruby 1.8.7, 1.9.2, JRuby oder Rubinius zu
1755
- installieren.
1756
-
1757
1827
  Die folgenden Versionen werden offiziell unterstützt:
1758
1828
 
1759
- [ Ruby 1.8.6 ]
1760
- Es wird nicht empfohlen, 1.8.6 für Sinatra einzusetzen. Trotzdem wird es
1761
- offiziell bis Sinatra 1.3.0 unterstützt werden. RDoc- und CoffeeScript-
1762
- Templates werden in dieser Version nicht unterstützt. 1.8.6 hat ein größeres
1763
- Speicherleck in seiner Hash-Implementation, das von Sinatra-Versionen vor
1764
- 1.1.1 ausgelöst wird. Die aktuelle Version verhindert das zwar explizit, aber
1765
- unter Einbußen in der Performance. Ebenso muss Sinatra mit Rack 1.1.x laufen,
1766
- da Rack >= 1.2 Ruby 1.8.6 nicht mehr unterstützt.
1767
-
1768
1829
  [ Ruby 1.8.7 ]
1769
1830
  1.8.7 wird vollständig unterstützt, aber solange nichts dagegen spricht,
1770
1831
  wird ein Update auf 1.9.2 oder ein Umstieg auf JRuby/Rubinius empfohlen.
@@ -1786,6 +1847,8 @@ Die folgenden Versionen werden offiziell unterstützt:
1786
1847
  Unterstützung für C-Erweiterungen sind zur Zeit noch experimenteller Natur,
1787
1848
  betrifft im Moment aber nur RDiscount.
1788
1849
 
1850
+ <b>Ruby 1.8.6 wird nicht weiter unterstützt.</b>
1851
+
1789
1852
  Weiterhin werden wir auf kommende Ruby-Versionen ein Auge haben.
1790
1853
 
1791
1854
  Die nachfolgend aufgeführten Ruby-Implementationen werden offiziell nicht von
@@ -1794,6 +1857,7 @@ Sinatra unterstützt, funktionieren aber normalerweise:
1794
1857
  * Ältere Versionen von JRuby und Rubinius
1795
1858
  * MacRuby, Maglev, IronRuby
1796
1859
  * Ruby 1.9.0 und 1.9.1
1860
+ * Ruby 1.8.6 mit {backports}[https://github.com/marcandre/backports/#readme]
1797
1861
 
1798
1862
  Nicht offiziell unterstützt bedeutet, dass wenn Sachen nicht funktionieren,
1799
1863
  wir davon ausgehen, dass es nicht an Sinatra sondern an der jeweiligen
@@ -1129,29 +1129,33 @@ petición (filtros, rutas y manejadores de errores) a través del método
1129
1129
 
1130
1130
  # app corriendo en http://ejemplo.com/ejemplo
1131
1131
  get '/foo' do
1132
- request.body # cuerpo de la petición enviado por el cliente (ver más abajo)
1133
- request.scheme # "http"
1134
- request.script_name # "/ejemplo"
1135
- request.path_info # "/foo"
1136
- request.port # 80
1137
- request.request_method # "GET"
1138
- request.query_string # ""
1139
- request.content_length # longitud de request.body
1140
- request.media_type # tipo de medio de request.body
1141
- request.host # "ejemplo.com"
1142
- request.get? # verdadero (hay métodos análogos para los otros verbos)
1143
- request.form_data? # falso
1144
- request["UNA_CABECERA"] # valor de la cabecera UNA_CABECERA
1145
- request.referrer # la referencia del cliente o '/'
1146
- request.user_agent # user agent (usado por la condición :agent)
1147
- request.cookies # hash de las cookies del browser
1148
- request.xhr? # es una petición ajax?
1149
- request.url # "http://ejemplo.com/ejemplo/foo"
1150
- request.path # "/ejemplo/foo"
1151
- request.ip # dirección IP del cliente
1152
- request.secure? # falso (sería verdadero sobre ssl)
1153
- request.forwarded? # verdadero (si se está corriendo atrás de un proxy inverso)
1154
- requuest.env # hash de entorno directamente entregado por Rack
1132
+ t = %w[text/css text/html application/javascript]
1133
+ request.accept # ['text/html', '*/*']
1134
+ request.accept? 'text/xml' # true
1135
+ request.preferred_type(t) # 'text/html'
1136
+ request.body # cuerpo de la petición enviado por el cliente (ver más abajo)
1137
+ request.scheme # "http"
1138
+ request.script_name # "/ejemplo"
1139
+ request.path_info # "/foo"
1140
+ request.port # 80
1141
+ request.request_method # "GET"
1142
+ request.query_string # ""
1143
+ request.content_length # longitud de request.body
1144
+ request.media_type # tipo de medio de request.body
1145
+ request.host # "ejemplo.com"
1146
+ request.get? # true (hay métodos análogos para los otros verbos)
1147
+ request.form_data? # false
1148
+ request["UNA_CABECERA"] # valor de la cabecera UNA_CABECERA
1149
+ request.referrer # la referencia del cliente o '/'
1150
+ request.user_agent # user agent (usado por la condición :agent)
1151
+ request.cookies # hash de las cookies del browser
1152
+ request.xhr? # es una petición ajax?
1153
+ request.url # "http://ejemplo.com/ejemplo/foo"
1154
+ request.path # "/ejemplo/foo"
1155
+ request.ip # dirección IP del cliente
1156
+ request.secure? # false (sería true sobre ssl)
1157
+ request.forwarded? # true (si se está corriendo atrás de un proxy inverso)
1158
+ requuest.env # hash de entorno directamente entregado por Rack
1155
1159
  end
1156
1160
 
1157
1161
  Algunas opciones, como <tt>script_name</tt> o <tt>path_info</tt> pueden
@@ -1661,6 +1665,48 @@ aplicación basada en Rack (Rails/Ramaze/Camping/...):
1661
1665
  get('/') { "Hola #{session['nombre_de_usuario']}." }
1662
1666
  end
1663
1667
 
1668
+ === Creación Dinámica de Aplicaciones
1669
+
1670
+ Puede que en algunas ocasiones quieras crear nuevas aplicaciones en
1671
+ tiempo de ejecución sin tener que asignarlas a una constante. Para
1672
+ esto tenés `Sinatra.new`:
1673
+
1674
+ require 'sinatra/base'
1675
+ mi_app = Sinatra.new { get('/') { "hola" } }
1676
+ mi_app.run!
1677
+
1678
+ Acepta como argumento opcional una aplicación desde la que se
1679
+ heredará:
1680
+
1681
+ require 'sinatra/base'
1682
+
1683
+ controller = Sinatra.new do
1684
+ enable :logging
1685
+ helpers MisHelpers
1686
+ end
1687
+
1688
+ map('/a') do
1689
+ run Sinatra.new(controller) { get('/') { 'a' } }
1690
+ end
1691
+
1692
+ map('/b') do
1693
+ run Sinatra.new(controller) { get('/') { 'b' } }
1694
+ end
1695
+
1696
+ Construir aplicaciones de esta forma resulta especialmente útil para
1697
+ testear extensiones Sinatra o para usar Sinatra en tus librerías.
1698
+
1699
+ Por otro lado, hace extremadamente sencillo usar Sinatra como
1700
+ middleware:
1701
+
1702
+ require 'sinatra/base'
1703
+
1704
+ use Sinatra do
1705
+ get('/') { ... }
1706
+ end
1707
+
1708
+ run ProyectoRails::Application
1709
+
1664
1710
  == Ámbitos y Ligaduras
1665
1711
 
1666
1712
  El ámbito en el que te encontrás determina que métodos y variables están
@@ -36,6 +36,10 @@ Chaque route est associée à un bloc:
36
36
  end
37
37
 
38
38
  put '/' do
39
+ .. remplacer quelque chose ..
40
+ end
41
+
42
+ patch '/' do
39
43
  .. changer quelque chose ..
40
44
  end
41
45
 
@@ -842,6 +846,19 @@ choix comme vous le feriez pour n'importe quel autre +middleware+ :
842
846
  session[:valeur] = params[:valeur]
843
847
  end
844
848
 
849
+ Pour renforcer la sécurité, les données de session dans le cookie sont signées
850
+ avec une clé secrète de session. Une clé secrète est générée pour vous au
851
+ hasard par Sinatra. Toutefois, comme cette clé change à chaque démarrage de
852
+ votre application, vous pouvez définir cette clé vous-même afin que toutes
853
+ les instances de votre application la partage:
854
+
855
+ set :session_secret, 'super secret'
856
+
857
+ Si vous souhaitez avoir plus de contrôle, vous pouvez également enregistrer un
858
+ +hash+ avec des options lors de la configuration de +sessions+:
859
+
860
+ set :sessions, :domain => 'foo.com'
861
+
845
862
  == Halt
846
863
 
847
864
  Pour arrêter immédiatement la requête dans un filtre ou un gestionnaire de
@@ -948,6 +965,31 @@ retour et les entêtes :
948
965
  Comme +body+, +headers+ et +status+ peuvent être utilisés sans arguments
949
966
  pour accéder à leurs valeurs.
950
967
 
968
+ === Journalisation (Logging)
969
+
970
+ Dans le contexte de la requête, la méthode utilitaire +logger+ expose une
971
+ instance de +logger+:
972
+
973
+ get '/' do
974
+ logger.info "chargement des données"
975
+ # ...
976
+ end
977
+
978
+ Ce +logger+ va automatiquement prendre en compte les paramètres de
979
+ configuration pour la journalisation de votre gestionnaire Rack. Si la
980
+ journalisation est désactivée, cette méthode renverra un objet factice et
981
+ vous n'avez pas à vous en inquiéter dans vos routes en le filtrant.
982
+
983
+ Notez que la journalisation est seulement activée par défaut pour
984
+ <tt>Sinatra::Application</tt>, donc si vous héritez de <tt>Sinatra::Base</tt>,
985
+ vous aurez à l'activer vous-même:
986
+
987
+ class MonApp < Sinatra::Base
988
+ configure(:production, :development) do
989
+ enable :logging
990
+ end
991
+ end
992
+
951
993
  === Types Mime
952
994
 
953
995
  Quand vous utilisez <tt>send_file</tt> ou des fichiers statiques, vous
@@ -1121,32 +1163,36 @@ de la requête (filtres, routes, gestionnaires d'erreur) au moyen de la méthode
1121
1163
 
1122
1164
  # application tournant à l'adresse http://exemple.com/exemple
1123
1165
  get '/foo' do
1124
- request.body # corps de la requête envoyée par le client
1125
- # (voir ci-dessous)
1126
- request.scheme # "http"
1127
- request.script_name # "/exemple"
1128
- request.path_info # "/foo"
1129
- request.port # 80
1130
- request.request_method # "GET"
1131
- request.query_string # ""
1132
- request.content_length # taille de request.body
1133
- request.media_type # type de média pour request.body
1134
- request.host # "exemple.com"
1135
- request.get? # true (méthodes similaires pour les autres
1136
- # verbes HTTP)
1137
- request.form_data? # false
1138
- request["UN_ENTETE"] # valeur de l'entête UN_ENTETE
1139
- request.referer # référant du client ou '/'
1140
- request.user_agent # user agent (utilisé par la condition :agent)
1141
- request.cookies # tableau contenant les cookies du navigateur
1142
- request.xhr? # requête AJAX ?
1143
- request.url # "http://exemple.com/exemple/foo"
1144
- request.path # "/exemple/foo"
1145
- request.ip # adresse IP du client
1146
- request.secure? # false
1147
- request.forwarded? # vrai (si on est derrière un proxy inverse)
1148
- request.env # tableau brut de l'environnement fourni par
1149
- # Rack
1166
+ t = %w[text/css text/html application/javascript]
1167
+ request.accept # ['text/html', '*/*']
1168
+ request.accept? 'text/xml' # true
1169
+ request.preferred_type(t) # 'text/html'
1170
+ request.body # corps de la requête envoyée par le client
1171
+ # (voir ci-dessous)
1172
+ request.scheme # "http"
1173
+ request.script_name # "/exemple"
1174
+ request.path_info # "/foo"
1175
+ request.port # 80
1176
+ request.request_method # "GET"
1177
+ request.query_string # ""
1178
+ request.content_length # taille de request.body
1179
+ request.media_type # type de média pour request.body
1180
+ request.host # "exemple.com"
1181
+ request.get? # true (méthodes similaires pour les autres
1182
+ # verbes HTTP)
1183
+ request.form_data? # false
1184
+ request["UN_ENTETE"] # valeur de l'entête UN_ENTETE
1185
+ request.referer # référant du client ou '/'
1186
+ request.user_agent # user agent (utilisé par la condition :agent)
1187
+ request.cookies # tableau contenant les cookies du navigateur
1188
+ request.xhr? # requête AJAX ?
1189
+ request.url # "http://exemple.com/exemple/foo"
1190
+ request.path # "/exemple/foo"
1191
+ request.ip # adresse IP du client
1192
+ request.secure? # false
1193
+ request.forwarded? # vrai (si on est derrière un proxy inverse)
1194
+ request.env # tableau brut de l'environnement fourni par
1195
+ # Rack
1150
1196
  end
1151
1197
 
1152
1198
  Certaines options, telles que <tt>script_name</tt> ou <tt>path_info</tt>
@@ -1339,9 +1385,7 @@ Vous pouvez accéder à ces paramètres via <tt>settings</tt> :
1339
1385
  [public] dossier duquel les fichiers publics sont servis
1340
1386
 
1341
1387
  [reload_templates] si oui ou non les templates doivent être rechargés
1342
- entre les requêtes. Activé en mode développement
1343
- et sur Ruby 1.8.6 (pour compenser un bug Ruby
1344
- occasionnant une fuite de mémoire).
1388
+ entre les requêtes. Activé en mode développement.
1345
1389
 
1346
1390
  [root] dossier racine du projet.
1347
1391
 
@@ -1669,6 +1713,46 @@ application Sinatra, ou n'importe quelle application basée sur Rack
1669
1713
  get('/') { "Bonjour #{session['nom_utilisateur']}." }
1670
1714
  end
1671
1715
 
1716
+ === Création dynamique d'applications
1717
+
1718
+ Il se peut que vous ayez besoin de créer une nouvelle application à l'exécution
1719
+ sans avoir à les assigner à une constante, vous pouvez le faire grâce à
1720
+ `Sinatra.new`:
1721
+
1722
+ require 'sinatra/base'
1723
+ mon_app = Sinatra.new { get('/') { "salut" } }
1724
+ mon_app.run!
1725
+
1726
+ L'application dont elle hérite peut être passé en argument optionnel:
1727
+
1728
+ require 'sinatra/base'
1729
+
1730
+ controleur = Sinatra.new do
1731
+ enable :logging
1732
+ helpers MyHelpers
1733
+ end
1734
+
1735
+ map('/a') do
1736
+ run Sinatra.new(controleur) { get('/') { 'a' } }
1737
+ end
1738
+
1739
+ map('/b') do
1740
+ run Sinatra.new(controleur) { get('/') { 'b' } }
1741
+ end
1742
+
1743
+ C'est notamment utile pour tester des extensions à Sinatra ou bien pour
1744
+ utiliser Sinatra dans votre propre bibliothèque.
1745
+
1746
+ Cela permet également d'utiliser très facilement Sinatra comme middleware:
1747
+
1748
+ require 'sinatra/base'
1749
+
1750
+ use Sinatra do
1751
+ get('/') { ... }
1752
+ end
1753
+
1754
+ run RailsProject::Application
1755
+
1672
1756
  == Contextes et Binding
1673
1757
 
1674
1758
  Le contexte dans lequel vous êtes détermine les méthodes et variables
@@ -1702,6 +1786,7 @@ Vous avez le binding du contexte de l'application dans:
1702
1786
  * Les méthodes définies par les extensions
1703
1787
  * Le bloc passé à `helpers`
1704
1788
  * Les procs/blocs utilisés comme argument pour `set`
1789
+ * Le bloc passé à <tt>Sinatra.new</tt>
1705
1790
 
1706
1791
  Vous pouvez atteindre ce contexte (donc la classe) de la façon suivante:
1707
1792
 
@@ -1776,21 +1861,8 @@ Les options sont:
1776
1861
 
1777
1862
  == Configuration nécessaire
1778
1863
 
1779
- Il est recommandé d'installer Sinatra sur Ruby 1.8.7, 1.9.2, JRuby ou
1780
- Rubinius.
1781
-
1782
1864
  Les versions suivantes de Ruby sont officiellement supportées :
1783
1865
 
1784
- [ Ruby 1.8.6 ]
1785
- Il n'est pas recommandé d'utiliser 1.8.6 pour Sinatra. Toutefois, ce sera
1786
- officiellement supporté jusqu'à l'arrivée Sinatra 1.3.0. Les templates RDoc
1787
- et CoffeeScript ne sont pas supportés par cette version de Ruby. 1.8.6
1788
- contient un défaut majeur de fuite de mémoire dans l'implémentation de Hash,
1789
- qui est déclenché par les versions de Sinatra antérieure à 1.1.1. La version
1790
- actuelle prévient explicitement ce risque au prix de la performance. Vous
1791
- devrez utiliser Rack 1.1.x dans la mesure où Rack >= 1.2 ne supporte plus
1792
- 1.8.6.
1793
-
1794
1866
  [ Ruby 1.8.7 ]
1795
1867
  1.8.7 est complètement supporté, toutefois si rien ne vous y retient, nous
1796
1868
  vous recommandons de passer à 1.9.2 ou bien de passer à JRuby ou Rubinius.
@@ -1801,14 +1873,18 @@ Les versions suivantes de Ruby sont officiellement supportées :
1801
1873
  réputé causer des erreurs de segmentation lorque Sinatra est utilisé.
1802
1874
 
1803
1875
  [ Rubinius ]
1804
- Rubinius est officiellement supporté (Rubinius >= 1.2.2), à l'exception
1805
- des templates Textile.
1876
+ Rubinius est officiellement supporté (Rubinius >= 1.2.3), tout fonctionne,
1877
+ y compris tous les langages de template.
1806
1878
 
1807
1879
  [ JRuby ]
1808
- JRuby est officiellement supporté (JRuby >= 1.5.6). Aucune anomalie avec
1880
+ JRuby est officiellement supporté (JRuby >= 1.6.0). Aucune anomalie avec
1809
1881
  des bibliothèques de templates tierces ne sont connues. Toutefois, si vous
1810
1882
  choisissez JRuby, alors tournez vous vers des gestionnaires Rack JRuby car
1811
- le serveur Thin n'est pas (encore) supporté par JRuby.
1883
+ le serveur Thin n'est pas complètement supporté par JRuby. Le support des
1884
+ extensions C dans JRuby est encore expérimental, ce qui n'affecte que
1885
+ RDiscount.
1886
+
1887
+ <b>Ruby 1.8.6 n'est plus supporté.</b>
1812
1888
 
1813
1889
  Nous gardons également un oeil sur les versions Ruby à venir.
1814
1890
 
@@ -1816,15 +1892,18 @@ Les implémentations Ruby suivantes ne sont pas officiellement supportées mais
1816
1892
  sont toujours connues comme permettant à Sinatra de fonctionner :
1817
1893
 
1818
1894
  * Plus anciennes versions de JRuby et Rubinius
1819
- * MacRuby
1820
- * Maglev
1821
- * IronRuby
1895
+ * MacRuby, Maglev, IronRuby
1822
1896
  * Ruby 1.9.0 et 1.9.1
1897
+ * Ruby 1.8.6 avec {backports}[https://github.com/marcandre/backports/#readme]
1823
1898
 
1824
1899
  Ne pas être officiellement supporté signifie que si les choses se passent mal
1825
1900
  sur ces plateformes et non sur celles supportées, nous considérons que
1826
1901
  l'anomalie est de le ressort, pas du nôtre.
1827
1902
 
1903
+ Nous faisons également notre intégration continue (CI) avec ruby-head (la
1904
+ future 1.9.3), mais nous ne pouvons rien garantir étant donné que c'est
1905
+ constant mouvement. Vous pouvez vous attendre à ce que 1.9.3p0 soit supporté.
1906
+
1828
1907
  Sinatra devrait fonctionner sur n'importe quel système d'exploitation
1829
1908
  supportant l'implémentation Ruby choisie.
1830
1909