sinatra 1.3.0.e → 1.3.0.f

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

Potentially problematic release.


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

data/README.es.rdoc CHANGED
@@ -100,6 +100,17 @@ O con un parámetro de bloque:
100
100
  "Hola, #{c}!"
101
101
  end
102
102
 
103
+ Los patrones de ruta pueden contener parámetros opcionales:
104
+
105
+ get '/posts.?:formato?' do
106
+ # coincide con "GET /posts" y además admite cualquier extensión, por
107
+ # ejemplo, "GET /posts.json", "GET /posts.xml", etc.
108
+ end
109
+
110
+ A propósito, a menos que desactivés la protección para el ataque <em>path
111
+ traversal</em> (ver más abajo), el path de la petición puede ser modificado
112
+ antes de que se compare con los de tus rutas.
113
+
103
114
  === Condiciones
104
115
 
105
116
  Las rutas pueden incluir una variedad de condiciones de selección, como por
@@ -139,6 +150,26 @@ Podés definir tus propias condiciones fácilmente:
139
150
  "Lo siento, perdiste."
140
151
  end
141
152
 
153
+ Si tu condición acepta más de un argumento, podés pasarle un arreglo. Al
154
+ definir la condición puede resultarte conveniente utilizar el operador splat en
155
+ la lista de parámetros:
156
+
157
+ set(:autorizar) do |*roles| # <- mirá el splat
158
+ condition do
159
+ unless sesion_iniciada? && roles.any? {|rol| usuario_actual.tiene_rol? rol }
160
+ redirect "/iniciar_sesion/", 303
161
+ end
162
+ end
163
+ end
164
+
165
+ get "/mi/cuenta/", :autorizar => [:usuario, :administrador] do
166
+ "Detalles de mi cuenta"
167
+ end
168
+
169
+ get "/solo/administradores/", :autorizar => :administrador do
170
+ "Únicamente para administradores!"
171
+ end
172
+
142
173
  === Valores de Retorno
143
174
 
144
175
  El valor de retorno de un bloque de ruta determina al menos el cuerpo de la
@@ -209,14 +240,17 @@ O, usando un lookahead negativo:
209
240
 
210
241
  Los archivos estáticos son servidos desde el directorio público
211
242
  <tt>./public</tt>. Podés especificar una ubicación diferente ajustando la
212
- opción <tt>:public</tt>:
243
+ opción <tt>:public_folder</tt>:
213
244
 
214
- set :public, File.dirname(__FILE__) + '/estaticos'
245
+ set :public_folder, File.dirname(__FILE__) + '/estaticos'
215
246
 
216
247
  Notá que el nombre del directorio público no está incluido en la URL. Por
217
248
  ejemplo, el archivo <tt>./public/css/style.css</tt> se accede a través de
218
249
  <tt>http://ejemplo.com/css/style.css</tt>.
219
250
 
251
+ Usá la configuración <tt>:static_cache_control</tt> para agregar el encabezado
252
+ <tt>Cache-Control</tt> (ver la sección de configuración para más detalles).
253
+
220
254
  == Vistas / Plantillas
221
255
 
222
256
  Cada lenguaje de plantilla se expone a través de un método de renderizado que
@@ -428,7 +462,7 @@ layout distinto al de la plantilla pasando la opción <tt>:layout_engine</tt>.
428
462
 
429
463
  Dependencias:: {rdoc}[http://rdoc.rubyforge.org/]
430
464
  Extensiones de Archivo:: <tt>.rdoc</tt>
431
- Ejemplo:: <tt>textile :LEEME, :layout_engine => :erb</tt>
465
+ Ejemplo:: <tt>rdoc :LEEME, :layout_engine => :erb</tt>
432
466
 
433
467
  No es posible llamar métodos desde rdoc, ni pasarle locales. Por lo tanto,
434
468
  generalmente vas a usarlo en combinación con otro motor de renderizado:
@@ -804,7 +838,7 @@ De manera similar, también podés asignar el código de estado y encabezados:
804
838
  get '/foo' do
805
839
  status 418
806
840
  headers \
807
- "Allow" => "BREW, POST, GET, PROPFIND, WHEN"
841
+ "Allow" => "BREW, POST, GET, PROPFIND, WHEN",
808
842
  "Refresh" => "Refresh: 20; http://www.ietf.org/rfc/rfc2324.txt"
809
843
  body "I'm a tea pot!"
810
844
  end
@@ -812,6 +846,56 @@ De manera similar, también podés asignar el código de estado y encabezados:
812
846
  También, al igual que +body+, tanto +status+ como +headers+ pueden utilizarse
813
847
  para obtener sus valores cuando no se les pasa argumentos.
814
848
 
849
+ === Streaming De Respuestas
850
+
851
+ A veces vas a querer empezar a enviar la respuesta a pesar de que todavía no
852
+ terminaste de generar su cuerpo. También es posible que, en algunos casos,
853
+ quieras seguir enviando información hasta que el cliente cierre la conexión.
854
+ Cuando esto ocurra, el +stream+ helper te va a ser de gran ayuda:
855
+
856
+ get '/' do
857
+ stream do |out|
858
+ out << "Esto va a ser legen -\n"
859
+ sleep 0.5
860
+ out << " (esperalo) \n"
861
+ sleep 1
862
+ out << "- dario!\n"
863
+ end
864
+ end
865
+
866
+ Podés implementar APIs de streaming,
867
+ {Server-Sent Events}[http://dev.w3.org/html5/eventsource/] y puede ser usado
868
+ como base para {WebSockets}[http://es.wikipedia.org/wiki/WebSockets]. También
869
+ puede ser usado para incrementar el throughput si solo una parte del contenido
870
+ depende de un recurso lento.
871
+
872
+ Hay que tener en cuenta que el comportamiento del streaming, especialmente el
873
+ número de peticiones concurrentes, depende del servidor web utilizado para
874
+ servir la aplicación. Puede que algunos servidores, como es el caso de
875
+ WEBRick, no soporten streaming directamente, así el cuerpo de la respuesta será
876
+ enviado completamente de una vez cuando el bloque pasado a +stream+ finalice su
877
+ ejecución.
878
+
879
+ Cuando se pasa +keep_open+ como parámetro, no se va a enviar el mensaje
880
+ +close+ al objeto de stream. Queda en vos cerrarlo en el punto de ejecución
881
+ que quieras. Nuevamente, hay que tener en cuenta que este comportamiento es
882
+ posible solo en servidores que soporten eventos, como Thin o Rainbows. El
883
+ resto de los servidores van a cerrar el stream de todos modos:
884
+
885
+ set :server, :thin
886
+ conexiones = []
887
+
888
+ get '/' do
889
+ # mantenemos abierto el stream
890
+ stream(:keep_open) { |salida| conexiones << salida }
891
+ end
892
+
893
+ post '/' do
894
+ # escribimos a todos los streams abiertos
895
+ conexiones.each { |salida| salida << params[:mensaje] << "\n" }
896
+ "mensaje enviado"
897
+ end
898
+
815
899
  === Log (Registro)
816
900
 
817
901
  En el ámbito de la petición, el helper +logger+ (registrador) expone
@@ -898,7 +982,7 @@ búsqueda:
898
982
 
899
983
  O usar una sesión:
900
984
 
901
- enable :session
985
+ enable :sessions
902
986
 
903
987
  get '/foo' do
904
988
  session[:secreto] = 'foo'
@@ -934,7 +1018,7 @@ Si estás usando el helper +expires+ para definir el encabezado correspondiente,
934
1018
  expires 500, :public, :must_revalidate
935
1019
  end
936
1020
 
937
- Para usar cachés adecuadamente, deberías considerar usar +etag+ y
1021
+ Para usar cachés adecuadamente, deberías considerar usar +etag+ o
938
1022
  +last_modified+. Es recomendable que llames a estos helpers *antes* de hacer
939
1023
  cualquier trabajo pesado, ya que van a enviar la respuesta inmediatamente si
940
1024
  el cliente ya tiene la versión actual en su caché:
@@ -953,7 +1037,8 @@ También es posible usar una
953
1037
 
954
1038
  Estos helpers no van a cachear nada por vos, sino que van a facilitar la
955
1039
  información necesaria para poder hacerlo. Si estás buscando soluciones rápidas
956
- de cacheo, mirá {rack-cache}[http://rtomayko.github.com/rack-cache/]:
1040
+ de cacheo con proxys inversos, mirá
1041
+ {rack-cache}[http://rtomayko.github.com/rack-cache/]:
957
1042
 
958
1043
  require "rack/cache"
959
1044
  require "sinatra"
@@ -966,6 +1051,10 @@ de cacheo, mirá {rack-cache}[http://rtomayko.github.com/rack-cache/]:
966
1051
  "hola"
967
1052
  end
968
1053
 
1054
+ Usá la configuración <tt>:static_cache_control</tt> para agregar el encabezado
1055
+ <tt>Cache-Control</tt> a archivos estáticos (ver la sección de configuración
1056
+ para más detalles).
1057
+
969
1058
  === Enviando Archivos
970
1059
 
971
1060
  Para enviar archivos, podés usar el método <tt>send_file</tt>:
@@ -1073,6 +1162,38 @@ También podés pasarle un nombre de archivo:
1073
1162
  "guardalo!"
1074
1163
  end
1075
1164
 
1165
+ === Fecha y Hora
1166
+
1167
+ Sinatra pone a tu disposición el helper +time_for+, que genera un objeto +Time+
1168
+ a partir del valor que recibe como argumento. Este valor puede ser un
1169
+ +String+, pero también es capaz de convertir objetos +DateTime+, +Date+ y de
1170
+ otras clases similares:
1171
+
1172
+ get '/' do
1173
+ pass if Time.now > time_for('Dec 23, 2012')
1174
+ "todavía hay tiempo"
1175
+ end
1176
+
1177
+ Este método es usado internamente por métodos como +expires+ y +last_modified+,
1178
+ entre otros. Por lo tanto, es posible extender el comportamiento de estos
1179
+ métodos sobreescribiendo +time_for+ en tu aplicación:
1180
+
1181
+ helpers do
1182
+ def time_for(value)
1183
+ case value
1184
+ when :ayer then Time.now - 24*60*60
1185
+ when :mañana then Time.now + 24*60*60
1186
+ else super
1187
+ end
1188
+ end
1189
+ end
1190
+
1191
+ get '/' do
1192
+ last_modified :ayer
1193
+ expires :mañana
1194
+ "hola"
1195
+ end
1196
+
1076
1197
  === Buscando los Archivos de las Plantillas
1077
1198
 
1078
1199
  El helper <tt>find_template</tt> se utiliza para encontrar los archivos de las
@@ -1162,99 +1283,131 @@ Podés acceder a estas opciones utilizando el método <tt>settings</tt>:
1162
1283
  ...
1163
1284
  end
1164
1285
 
1286
+ ==== Configurando la Protección de Ataques
1287
+
1288
+ Sinatra usa {Rack::Protection}[https://github.com/rkh/rack-protection#readme]
1289
+ para defender a tu aplicación de los ataques más comunes. Tenés que tener en
1290
+ cuenta que como consecuencia de esto puede venir asociada una disminución del
1291
+ rendimiento de tu aplicación. Si por este, o algún otro motivo, querés
1292
+ desactivar está funcionalidad, podés hacerlo:
1293
+
1294
+ disable :protection
1295
+
1296
+ También es posible desactivar una única capa de defensa:
1297
+
1298
+ set :protection, :except => :path_traversal
1299
+
1300
+ O varias:
1301
+
1302
+ set :protections, :except => [:path_traversal, :session_hijacking]
1303
+
1165
1304
  === Configuraciones Disponibles
1166
1305
 
1167
- [absolute_redirects] si está deshabilitada, Sinatra va a permitir redirecciones
1168
- relativas, sin embargo, como consecuencia de esto, va a
1169
- dejar de cumplir con el RFC 2616 (HTTP 1.1), que solamente
1170
- permite redirecciones absolutas.
1306
+ [absolute_redirects] si está deshabilitada, Sinatra va a permitir
1307
+ redirecciones relativas, sin embargo, como consecuencia
1308
+ de esto, va a dejar de cumplir con el RFC 2616 (HTTP
1309
+ 1.1), que solamente permite redirecciones absolutas.
1310
+
1311
+ Activalo si tu apliación está corriendo atrás de un proxy
1312
+ inverso que no se ha configurado adecuadamente. Notá que
1313
+ el helper +url+ va a seguir produciendo URLs absolutas, a
1314
+ menos que le pasés +false+ como segundo parámetro.
1315
+
1316
+ Deshabilitada por defecto.
1171
1317
 
1172
- Activalo si tu apliación está corriendo atrás de un proxy
1173
- inverso que no se ha configurado adecuadamente. Notá que
1174
- el helper +url+ va a seguir produciendo URLs absolutas, a
1175
- menos que le pasés +false+ como segundo parámetro.
1318
+ [add_charsets] tipos mime a los que el helper <tt>content_type</tt> les
1319
+ añade automáticamente el charset.
1176
1320
 
1177
- Deshabilitada por defecto.
1321
+ En general, no deberías asignar directamente esta opción,
1322
+ sino añadirle los charsets que quieras:
1178
1323
 
1179
- [add_charsets] tipos mime a los que el helper <tt>content_type</tt> les
1180
- añade automáticamente el charset.
1324
+ settings.add_charsets << "application/foobar"
1181
1325
 
1182
- En general, no deberías asignar directamente esta opción,
1183
- sino añadirle los charsets que quieras:
1326
+ [app_file] archivo principal de la aplicación, se utiliza para
1327
+ detectar la raíz del proyecto, el directorio de las
1328
+ vistas y el público así como las plantillas inline.
1184
1329
 
1185
- settings.add_charsets << "application/foobar"
1330
+ [bind] dirección IP que utilizará el servidor integrado (por
1331
+ defecto: 0.0.0.0).
1186
1332
 
1187
- [app_file] archivo principal de la aplicación, se utiliza para
1188
- detectar la raíz del proyecto, el directorio de las vistas
1189
- y el público así como las plantillas inline.
1333
+ [default_encoding] encoding utilizado cuando el mismo se desconoce (por
1334
+ defecto <tt>"utf-8"</tt>).
1190
1335
 
1191
- [bind] dirección IP que utilizará el servidor integrado (por
1192
- defecto: 0.0.0.0).
1336
+ [dump_errors] mostrar errores en el log.
1193
1337
 
1194
- [default_encoding] encoding utilizado cuando el mismo se desconoce (por
1195
- defecto <tt>"utf-8"</tt>).
1338
+ [environment] entorno actual, por defecto toma el valor de
1339
+ <tt>ENV['RACK_ENV']</tt>, o <tt>"development"</tt> si no
1340
+ está disponible.
1196
1341
 
1197
- [dump_errors] mostrar errores en el log.
1342
+ [logging] define si se utiliza el logger.
1198
1343
 
1199
- [environment] entorno actual, por defecto toma el valor de
1200
- <tt>ENV['RACK_ENV']</tt>, o <tt>"development"</tt> si no
1201
- está disponible.
1344
+ [lock] coloca un lock alrededor de cada petición, procesando
1345
+ solamente una por proceso.
1202
1346
 
1203
- [logging] define si se utiliza el logger.
1347
+ Habilitá esta opción si tu aplicación no es thread-safe.
1348
+ Se encuentra deshabilitada por defecto.
1204
1349
 
1205
- [lock] coloca un lock alrededor de cada petición, procesando
1206
- solamente una por proceso.
1350
+ [method_override] utiliza el parámetro <tt>_method</tt> para permtir
1351
+ formularios put/delete en navegadores que no los
1352
+ soportan.
1207
1353
 
1208
- Habilitá esta opción si tu aplicación no es thread-safe.
1209
- Se encuentra deshabilitada por defecto.
1354
+ [port] puerto en el que escuchará el servidor integrado.
1210
1355
 
1211
- [method_override] utiliza el parámetro <tt>_method</tt> para permtir
1212
- formularios put/delete en navegadores que no los soportan.
1356
+ [prefixed_redirects] define si inserta <tt>request.script_name</tt> en las
1357
+ redirecciones cuando no se proporciona un path absoluto.
1358
+ De esta manera, cuando está habilitada,
1359
+ <tt>redirect '/foo'</tt> se comporta de la misma manera
1360
+ que <tt>redirect to('/foo')</tt>. Se encuentra
1361
+ deshabilitada por defecto.
1213
1362
 
1214
- [port] puerto en el que escuchará el servidor integrado.
1363
+ [protection] define si deben activarse las protecciones para los
1364
+ ataques web más comunes. Para más detalles mirá la
1365
+ sección sobre la configuración de protección de ataques
1366
+ más arriba.
1215
1367
 
1216
- [prefixed_redirects] define si inserta <tt>request.script_name</tt> en las
1217
- redirecciones cuando no se proporciona un path absoluto.
1218
- De esta manera, cuando está habilitada,
1219
- <tt>redirect '/foo'</tt> se comporta de la misma manera
1220
- que <tt>redirect to('/foo')</tt>. Se encuentra
1221
- deshabilitada por defecto.
1368
+ [public_folder] directorio desde donde se sirven los archivos públicos.
1222
1369
 
1223
- [public] directorio desde donde se sirven los archivos públicos.
1370
+ [reload_templates] define si se recargan las plantillas entre peticiones.
1224
1371
 
1225
- [reload_templates] define si se recargan las plantillas entre peticiones.
1372
+ Se encuentra activado en el entorno de desarrollo.
1226
1373
 
1227
- Se encuentra activado en el entorno de desarrollo.
1374
+ [root] directorio raíz del proyecto.
1228
1375
 
1229
- [root] directorio raíz del proyecto.
1376
+ [raise_errors] elevar excepciones (detiene la aplicación).
1230
1377
 
1231
- [raise_errors] elevar excepciones (detiene la aplicación).
1378
+ [run] cuando está habilitada, Sinatra se va a encargar de
1379
+ iniciar el servidor web, no la habilités cuando estés
1380
+ usando rackup o algún otro medio.
1232
1381
 
1233
- [run] cuando está habilitada, Sinatra se va a encargar de
1234
- iniciar el servidor web, no la habilités cuando estés
1235
- usando rackup o algún otro medio.
1382
+ [running] indica si el servidor integrado está ejecutandose, ¡no
1383
+ cambiés esta configuración!.
1236
1384
 
1237
- [running] indica si el servidor integrado está ejecutandose, ¡no
1238
- cambiés esta configuración!.
1385
+ [server] servidor, o lista de servidores, para usar como servidor
1386
+ integrado. Por defecto: ['thin', 'mongrel', 'webrick'],
1387
+ el orden establece la prioridad.
1239
1388
 
1240
- [server] servidor, o lista de servidores, para usar como servidor
1241
- integrado. Por defecto: ['thin', 'mongrel', 'webrick'],
1242
- el orden establece la prioridad.
1389
+ [sessions] habilita sesiones basadas en cookies.
1243
1390
 
1244
- [sessions] habilita sesiones basadas en cookies.
1391
+ [show_exceptions] muestra un stack trace en el navegador.
1245
1392
 
1246
- [show_exceptions] muestra un stack trace en el navegador.
1393
+ [static] define si Sinatra debe encargarse de servir archivos
1394
+ estáticos.
1247
1395
 
1248
- [static] define si Sinatra debe encargarse de servir archivos
1249
- estáticos.
1396
+ Deshabilitala cuando usés un servidor capaz de
1397
+ hacerlo por sí solo, porque mejorará el
1398
+ rendimiento. Se encuentra habilitada por
1399
+ defecto en el estilo clásico y desactivado en el
1400
+ el modular.
1250
1401
 
1251
- Deshabilitala cuando usés un servidor capaz de
1252
- hacerlo por solo, porque mejorará el
1253
- rendimiento. Se encuentra habilitada por
1254
- defecto en el estilo clásico y desactivado en el
1255
- el modular.
1402
+ [static_cache_control] cuando Sinatra está sirviendo archivos estáticos, y
1403
+ está opción está habilitada, les va a agregar encabezados
1404
+ <tt>Cache-Control</tt> a las respuestas. Para esto
1405
+ utiliza el helper +cache_control+. Se encuentra
1406
+ deshabilitada por defecto. Notar que es necesario
1407
+ utilizar un array cuando se asignan múltiples valores:
1408
+ <tt>set :static_cache_control, [:public, :max_age => 300]</tt>.
1256
1409
 
1257
- [views] directorio de las vistas.
1410
+ [views] directorio de las vistas.
1258
1411
 
1259
1412
  == Manejo de Errores
1260
1413
 
@@ -1565,6 +1718,7 @@ esto tenés <tt>Sinatra.new</tt>:
1565
1718
  Acepta como argumento opcional una aplicación desde la que se
1566
1719
  heredará:
1567
1720
 
1721
+ # config.ru
1568
1722
  require 'sinatra/base'
1569
1723
 
1570
1724
  controller = Sinatra.new do
@@ -1701,7 +1855,14 @@ Las siguientes versiones de Ruby son soportadas oficialmente:
1701
1855
 
1702
1856
  [ Ruby 1.8.7 ]
1703
1857
  1.8.7 es soportado completamente. Sin embargo, si no hay nada que te lo
1704
- prohíba, te recomendamos que usés 1.9.2 o cambies a JRuby o Rubinius.
1858
+ prohíba, te recomendamos que usés 1.9.2 o cambies a JRuby o Rubinius. No se
1859
+ dejará de dar soporte a 1.8.7 hasta Sinatra 2.0 y Ruby 2.0, aunque si se
1860
+ libera la versión 1.8.8 de Ruby las cosas podrían llegar a cambiar. Sin
1861
+ embargo, que eso ocurra es muy poco probable, e incluso el caso de que lo
1862
+ haga, puede que se siga dando soporte a 1.8.7. <b>Hemos dejado de soportar
1863
+ Ruby 1.8.6.</b> Si querés ejecutar Sinatra sobre 1.8.6, podés utilizar la
1864
+ versión 1.2, pero tené en cuenta que una vez que Sinatra 1.4.0 sea liberado,
1865
+ ya no se corregirán errores por más que se reciban reportes de los mismos.
1705
1866
 
1706
1867
  [ Ruby 1.9.2 ]
1707
1868
  1.9.2 es soportado y recomendado. Tené en cuenta que Radius y Markaby no
@@ -1709,11 +1870,11 @@ Las siguientes versiones de Ruby son soportadas oficialmente:
1709
1870
  fallos de segmentación cuando se ejecuta Sinatra.
1710
1871
 
1711
1872
  [ Rubinius ]
1712
- Rubinius es soportado oficialmente (Rubinius >= 1.2.3). Todo
1873
+ Rubinius es soportado oficialmente (Rubinius >= 1.2.4). Todo
1713
1874
  funciona correctamente, incluyendo los lenguajes de plantillas.
1714
1875
 
1715
1876
  [ JRuby ]
1716
- JRuby es soportado oficialmente (JRuby >= 1.6.1). No se conocen
1877
+ JRuby es soportado oficialmente (JRuby >= 1.6.3). No se conocen
1717
1878
  problemas con librerías de plantillas de terceras partes. Sin
1718
1879
  embargo, si elegís usar JRuby, deberías examinar sus Rack handlers
1719
1880
  porque el servidor web Thin no es soportado completamente. El
@@ -1721,32 +1882,31 @@ Las siguientes versiones de Ruby son soportadas oficialmente:
1721
1882
  experimental, sin embargo, de momento solamente RDiscount y Redcarpted
1722
1883
  se ven afectadas.
1723
1884
 
1724
- <b>Hemos dejado de soportar Ruby 1.8.6.</b> Si querés ejecutar Sinatra sobre
1725
- 1.8.6, podés utilizar la versión 1.2, pero tené en cuenta que una vez que
1726
- Sinatra 1.4.0 sea liberado, ya no se corregirán los reportes de errores que se
1727
- reciban.
1728
-
1729
1885
  Siempre le prestamos atención a las nuevas versiones de Ruby.
1730
1886
 
1731
1887
  Las siguientes implementaciones de Ruby no se encuentran soportadas
1732
1888
  oficialmente. De cualquier manera, pueden ejecutar Sinatra:
1733
1889
 
1734
1890
  * Versiones anteriores de JRuby y Rubinius
1891
+ * Ruby Enterprise Edition
1735
1892
  * MacRuby, Maglev e IronRuby
1736
- * Ruby 1.9.0 y 1.9.1
1893
+ * Ruby 1.9.0 y 1.9.1 (pero no te recomendamos que los usés)
1737
1894
 
1738
1895
  No estar soportada oficialmente, significa que si las cosas solamente se rompen
1739
1896
  ahí y no en una plataforma soportada, asumimos que no es nuestro problema sino
1740
1897
  el suyo.
1741
1898
 
1742
1899
  Nuestro servidor CI también se ejecuta sobre ruby-head (que será la
1743
- próxima versión 1.9.3). Como está en movimiento constante, no podemos
1744
- garantizar nada. De todas formas, podés contar con que 1.9.3-p0 sea
1900
+ próxima versión 1.9.4). Como está en movimiento constante, no podemos
1901
+ garantizar nada. De todas formas, podés contar con que 1.9.4-p0 sea
1745
1902
  soportada.
1746
1903
 
1747
1904
  Sinatra debería funcionar en cualquier sistema operativo soportado por la
1748
1905
  implementación de Ruby elegida.
1749
1906
 
1907
+ En este momento, no vas a poder ejecutar Sinatra en Cardinal, SmallRuby,
1908
+ BlueRuby o cualquier versión de Ruby anterior a 1.8.7.
1909
+
1750
1910
  == A la Vanguardia
1751
1911
 
1752
1912
  Si querés usar el código de Sinatra más reciente, sentite libre de ejecutar
@@ -1833,3 +1993,4 @@ siguiendo las especificaciones SemVer y SemVerTag.
1833
1993
  {última versión liberada}[http://rubydoc.info/gems/sinatra] o para la
1834
1994
  {rama de desarrollo actual}[http://rubydoc.info/github/sinatra/sinatra]
1835
1995
  en http://rubydoc.info/
1996
+ * {Servidor de IC}[http://ci.rkh.im/view/Sinatra/]