sinatra 2.0.0 → 2.0.1.rc1

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: fcc61f758e37e82a6ba459dd28ac0427d1e293aa
4
- data.tar.gz: 89da52018e78be121896892c8f1bd2786048c191
3
+ metadata.gz: 1c83b027f753d416a96c096ee0de830d156b137a
4
+ data.tar.gz: 17ed2afbe6fb1114bb493223ea9f4f42c4cf2172
5
5
  SHA512:
6
- metadata.gz: eedfb95c98ca07e7522e60437f6e7a373b569124bf513a456f9ffc679af95b58e1c0368d08ea76085ae7ea9315947dcf956ba4d07c752ad111533a24a65d7b9e
7
- data.tar.gz: 298a3ccc3bc242b195c8788efc65e94f45274634f5e04cc7f679fd407fa9c0cff2844de338d08369f8e11452da84293a9fe12c4fdbe898c5eeeef6258cbf725a
6
+ metadata.gz: 7c3076c168f19983979015cc4e442e9da02aed4334ba4784e54a124eabc54fdb15571e246963280ffe12b4eb22753b1c07649feb1a5c7d591dfd12846e649b7e
7
+ data.tar.gz: 9a2609147de164f302ebb94ddc89f463fc8ae9157c372c42cbe57f3d96539f310a9638d5be0bdcbf8eba90d424b286735125fe52184bea3442428d1fae449c16
data/AUTHORS.md CHANGED
@@ -7,6 +7,7 @@ Sinatra was designed and developed by Blake Mizerany in California.
7
7
  * **Kashyap Kondamudi**
8
8
  * **Ashley Williams**
9
9
  * **Trevor Bramble**
10
+ * **Kunpei Sakai**
10
11
 
11
12
  ### Alumni
12
13
 
@@ -1,3 +1,19 @@
1
+ ## 2.0.1 / 2018-02-12
2
+
3
+ * Repair nested namespaces, by avoiding prefix duplication #1322. Fixes #1310 by Kunpei Sakai
4
+
5
+ * Add pattern matches to values for Mustermann::Concat #1333. Fixes #1332 by Dawa Ometto
6
+
7
+ * Ship the VERSION file with the gem, to allow local unpacking #1338 by Olle Jonsson
8
+
9
+ * Fix issue with custom error handler on bad request #1351. Fixes #1350 by Jordan Owens
10
+
11
+ * Override Rack::ShowExceptions#pretty to set custom template #1377. Fixes #1376 by Jordan Owens
12
+
13
+ * Enhanced path validation in Windows #1379 by Orange Tsai
14
+
15
+ * Improve development support and documentation by Faheel Ahmad, Shota Iguchi, Olle Jonsson, Manabu Niseki, John Hope, Horacio, Ice-Storm, GraniteRock, Raman Skaskevich, Carlos Azuaje, 284km, Dan Rice and Zachary Scott
16
+
1
17
  ## 2.0.0 / 2017-04-10
2
18
 
3
19
  * Use Mustermann for patterns #1086 by Konstantin Haase
@@ -52,7 +68,7 @@
52
68
 
53
69
  * Avoid executing filters even if prefix matches with other namespace #1253 by namusyaka
54
70
 
55
- * Make `#has_key?` also indifferent in access, can accept String or Symbol #1262 by John Hope
71
+ * Make `#has_key?` also indifferent in access, can accept String or Symbol #1262 by Stephen Paul Weber
56
72
 
57
73
  * Add `allow_if` option to bypass json csrf protection #1265 by Jordan Owens
58
74
 
@@ -62,6 +78,10 @@
62
78
 
63
79
  * Add full IndifferentHash implementation to params #1279 by Mike Pastore
64
80
 
81
+ ## 1.4.8 / 2017-01-30
82
+
83
+ * Fix the deprecation warning from Ruby about Fixnum. #1235 by Akira Matsuda
84
+
65
85
  ## 1.4.7 / 2016-01-24
66
86
 
67
87
  * Add Ashley Williams, Trevor Bramble, and Kashyap Kondamudi to team Sinatra.
@@ -610,7 +630,7 @@ Backported from 1.3.0:
610
630
 
611
631
  * The request object was shared between multiple Sinatra instances in the
612
632
  same middleware chain. This caused issues if any non-sinatra routing
613
- happend in-between two of those instances, or running a request twice
633
+ happened in-between two of those instances, or running a request twice
614
634
  against an application (described in the README). The caching was reverted.
615
635
  See GH#239 and GH#256 for more infos. (Konstantin Haase)
616
636
 
@@ -98,3 +98,9 @@ fine).
98
98
 
99
99
  [ghi]: http://github.com/sinatra/sinatra/issues
100
100
  [ml]: http://groups.google.com/group/sinatrarb/topics "Sinatra Mailing List"
101
+
102
+ * ["Help Wanted"](https://github.com/sinatra/sinatra/labels/help%20wanted): Anyone willing to pitch in is open to contribute to this ticket as they see fit (will try to add context / summarize or ask for requirements)
103
+
104
+ * ["Good First Issue"](https://github.com/sinatra/sinatra/labels/good%20first%20issue): Potential first time contributors should start here
105
+
106
+ * ["Wishlist"](https://github.com/sinatra/sinatra/labels/Wishlist): All the things I wish we had but have no time for
data/Gemfile CHANGED
@@ -19,7 +19,7 @@ gem 'yard'
19
19
  gem "rack-protection", path: "rack-protection"
20
20
  gem "sinatra-contrib", path: "sinatra-contrib"
21
21
 
22
- gem "twitter-text", "1.14.0"
22
+ gem "twitter-text", "1.14.7"
23
23
 
24
24
  if RUBY_ENGINE == 'jruby'
25
25
  gem 'nokogiri', '!= 1.5.0'
@@ -64,6 +64,7 @@ if RUBY_ENGINE == "rbx"
64
64
  gem 'json'
65
65
  gem 'rubysl'
66
66
  gem 'rubysl-test-unit'
67
+ gem 'erubi'
67
68
  end
68
69
 
69
70
  platforms :jruby do
@@ -1,6 +1,6 @@
1
1
  # Sinatra
2
2
 
3
- *Atención: Este documento es una traducción de la versión en inglés y puede estar desactualizado.*
3
+ [![Build Status](https://secure.travis-ci.org/sinatra/sinatra.svg)](http://travis-ci.org/sinatra/sinatra)
4
4
 
5
5
  Sinatra es un
6
6
  [DSL](https://es.wikipedia.org/wiki/Lenguaje_específico_del_dominio) para
@@ -15,17 +15,117 @@ get '/' do
15
15
  end
16
16
  ```
17
17
 
18
- Instalar la gema y correr la aplicación con:
18
+ Instala la gema:
19
19
 
20
20
  ```shell
21
21
  gem install sinatra
22
22
  ruby miapp.rb
23
23
  ```
24
24
 
25
+ Y corre la aplicación:
26
+ ```shell
27
+ gem install sinatra
28
+ ruby miapp.rb
29
+ ```
30
+
25
31
  Ver en [http://localhost:4567](http://localhost:4567).
26
32
 
33
+ El código que cambiaste no tendra efecto hasta que reinicies el servidor.
34
+ Por favor reinicia el servidor cada vez que cambies tu código o usa [sinatra/reloader](http://www.sinatrarb.com/contrib/reloader).
35
+
27
36
  Se recomienda ejecutar `gem install thin`, porque Sinatra lo utilizará si está disponible.
28
37
 
38
+
39
+ ## Tabla de Contenidos
40
+
41
+ * [Sinatra](#sinatra)
42
+ * [Tabla de Contenidos](#tabla-de-contenidos)
43
+ * [Rutas](#rutas)
44
+ * [Condiciones](#condiciones)
45
+ * [Valores de Retorno](#valores-de-retorno)
46
+ * [Comparadores de Rutas Personalizados](#comparadores-de-rutas-personalizados)
47
+ * [Archivos Estáticos](#archivos-estáticos)
48
+ * [Vistas / Plantillas](#vistas--plantillas)
49
+ * [Plantillas Literales](#plantillas-literales)
50
+ * [Lenguajes de Plantillas Disponibles](#lenguajes-de-plantillas-disponibles)
51
+ * [Plantillas Haml](#plantillas-haml)
52
+ * [Plantillas Erb](#plantillas-erb)
53
+ * [Plantillas Builder](#plantillas-builder)
54
+ * [Plantillas Nokogiri](#plantillas-nokogiri)
55
+ * [Plantillas Sass](#plantillas-sass)
56
+ * [Plantillas SCSS](#plantillas-scss)
57
+ * [Plantillas Less](#plantillas-less)
58
+ * [Plantillas Liquid](#plantillas-liquid)
59
+ * [Plantillas Markdown](#plantillas-markdown)
60
+ * [Plantillas Textile](#plantillas-textile)
61
+ * [Plantillas RDoc](#plantillas-rdoc)
62
+ * [Plantillas AsciiDoc](#plantillas-asciidoc)
63
+ * [Plantillas Radius](#plantillas-radius)
64
+ * [Plantillas Markaby](#plantillas-markaby)
65
+ * [Plantillas RABL](#plantillas-rabl)
66
+ * [Plantillas Slim](#plantillas-slim)
67
+ * [Plantillas Creole](#plantillas-creole)
68
+ * [Plantillas MediaWiki](#mediawiki-templates)
69
+ * [Plantillas CofeeScript](#plantillas-coffeescript)
70
+ * [Plantillas Stylus](#plantillas-stylus)
71
+ * [Plantillas Yajl](#plantillas-yajl)
72
+ * [Plantillas Wlang](#plantillas-wlang)
73
+ * [Accediendo Variables en Plantillas](#accediendo-a-variables-en-plantillas)
74
+ * [Plantillas con `yield` y `layout` anidado](#plantillas-con-yield-y-layout-anidado)
75
+ * [Plantillas Inline](#plantillas-inline)
76
+ * [Plantillas Nombradas](#plantillas-nombradas)
77
+ * [Asociando Extensiones de Archivo](#asociando-extensiones-de-archivo)
78
+ * [Añadiendo Tu Propio Motor de Plantillas](#añadiendo-tu-propio-motor-de-plantillas)
79
+ * [Usando Lógica Personalizada para la Búsqueda en Plantillas](#usando-lógica-personalizada-para-la-búsqueda-en-plantillas)
80
+ * [Filtros](#filtros)
81
+ * [Helpers](#helpers)
82
+ * [Usando Sesiones](#usando-sesiones)
83
+ * [Secreto de Sesión](#secreto-de-sesión)
84
+ * [Configuración de Sesión](#configuración-de-sesión)
85
+ * [Escogiendo tu propio Middleware de Sesión](#escogiendo-tu-propio-middleware-de-sesión)
86
+ * [Interrupcion](#interrupción)
87
+ * [Paso](#paso)
88
+ * [Desencadenando Otra Ruta](#desencadenando-otra-ruta)
89
+ * [Configurando el Cuerpo, Código de Estado y los Encabezados](#configurando-el-cuerpo-código-de-estado-y-los-encabezados)
90
+ * [Streaming De Respuestas](#streaming-de-respuestas)
91
+ * [Logging](#logging)
92
+ * [Tipos Mime](#tipos-mime)
93
+ * [Generando URLs](#generando-urls)
94
+ * [Redirección del Navegador](#redirección-del-navegador)
95
+ * [Control del Cache](#control-del-cache)
96
+ * [Enviando Archivos](#enviando-archivos)
97
+ * [Accediendo al Objeto Request](#accediendo-al-objeto-request)
98
+ * [Archivos Adjuntos](#archivos-adjuntos)
99
+ * [Fecha y Hora](#fecha-y-hora)
100
+ * [Buscando los Archivos de las Plantillas](#buscando-los-archivos-de-las-plantillas)
101
+ * [Configuración](#configuración)
102
+ * [Configurando la Protección Contra Ataques](#configurando-la-protección-contra-ataques)
103
+ * [Configuraciones Disponibles](#configuraciones-disponibles)
104
+ * [Entornos](#entornos)
105
+ * [Manejo de Errores](#manejo-de-errores)
106
+ * [Not Found](#not-found)
107
+ * [Error](#error)
108
+ * [Rack Middleware](#rack-middleware)
109
+ * [Pruebas](#pruebas)
110
+ * [Sinatra::Base - Middleware, Librerías, y Aplicaciones Modulares](#sinatrabase---middleware-librerías-y-aplicaciones-modulares)
111
+ * [Estilo Modular vs Estilo Clásico](#estilo-modular-vs-clásico)
112
+ * [Sirviendo una Aplicación Modular](#sirviendo-una-aplicación-modular)
113
+ * [Usando una Aplicación de Estilo Clásico con config.ru](#usando-una-aplicación-clásica-con-un-archivo-configru)
114
+ * [¿Cuándo usar config.ru?](#cuándo-usar-configru)
115
+ * [Utilizando Sinatra como Middleware](#utilizando-sinatra-como-middleware)
116
+ * [Creación Dinámica de Aplicaciones](#creación-dinámica-de-aplicaciones)
117
+ * [Ámbitos y Ligaduras (Scopes and Binding)](#Ámbitos-y-ligaduras)
118
+ * [Alcance de una Aplicación/Clase](#Ámbito-de-aplicaciónclase)
119
+ * [Alcance de una Solicitud/Instancia](#Ámbito-de-peticióninstancia)
120
+ * [Alcance de Delegación](#Ámbito-de-delegación)
121
+ * [Línea de comandos](#línea-de-comandos)
122
+ * [Multi-threading](#multi-threading)
123
+ * [Requerimientos](#requerimientos)
124
+ * [A la Vanguardia](#a-la-vanguardia)
125
+ * [Usando bundler](#usando-bundler)
126
+ * [Versionado](#versionado)
127
+ * [Lecturas Recomendadas](#lecturas-recomendadas)
128
+
29
129
  ## Rutas
30
130
 
31
131
  En Sinatra, una ruta es un método HTTP junto a un patrón de un URL.
@@ -67,11 +167,21 @@ end
67
167
  ```
68
168
 
69
169
  Las rutas son comparadas en el orden en el que son definidas. La primera ruta
70
- que coincide con la petición es escogida.
170
+ que coincide con la petición es invocada.
171
+
172
+ Las rutas con barras al final son distintas a las que no tienen:
173
+
174
+
175
+ ```ruby
176
+ get '/foo' do
177
+ # no es igual que "GET /foo/"
178
+ end
179
+ ```
71
180
 
72
181
  Los patrones de las rutas pueden incluir parámetros nombrados, accesibles a
73
182
  través del hash `params`:
74
183
 
184
+
75
185
  ```ruby
76
186
  get '/hola/:nombre' do
77
187
  # coincide con "GET /hola/foo" y "GET /hola/bar"
@@ -110,7 +220,7 @@ O, con parámetros de bloque:
110
220
 
111
221
  ```ruby
112
222
  get '/descargar/*.*' do |path, ext|
113
- [path, ext] # => ["path/al/archivo", "xml"]
223
+ [path, ext] # => ["path/to/file", "xml"]
114
224
  end
115
225
  ```
116
226
 
@@ -139,10 +249,31 @@ get '/posts/:formato?' do
139
249
  end
140
250
  ```
141
251
 
252
+ Las rutas también pueden usar parámetros de consulta:
253
+
254
+ ```ruby
255
+ get '/posts' do
256
+ # es igual que "GET /posts?title=foo&author=bar"
257
+ title = params['title']
258
+ author = params['author']
259
+ # usa las variables title y author; la consulta es opcional para la ruta /posts
260
+ end
261
+ ```
262
+
142
263
  A propósito, a menos que desactives la protección para el ataque *path
143
- traversal* (ver más abajo), el path de la petición puede ser modificado
264
+ traversal* (ver más [abajo](#configurando-la-protección-contra-ataques)), el path de la petición puede ser modificado
144
265
  antes de que se compare con los de tus rutas.
145
266
 
267
+ Puedes perzonalizar las opciones de [Mustermann](https://github.com/sinatra/mustermann) usadas para una ruta pasando
268
+ el hash `:mustermann_opts`:
269
+
270
+ ```ruby
271
+ get '\A/posts\z', :mustermann_opts => { :type => :regexp, :check_anchors => false } do
272
+ # es exactamente igual a /posts, con anclaje explícito
273
+ "¡Si igualas un patrón anclado aplaude!"
274
+ end
275
+ ```
276
+
146
277
  ## Condiciones
147
278
 
148
279
  Las rutas pueden incluir una variedad de condiciones de selección, como por
@@ -174,6 +305,9 @@ get '/', :provides => ['rss', 'atom', 'xml'] do
174
305
  end
175
306
  ```
176
307
 
308
+ `provides` busca el encabezado Accept de la solicitud
309
+
310
+
177
311
  Puede definir sus propias condiciones fácilmente:
178
312
 
179
313
  ```ruby
@@ -188,12 +322,10 @@ get '/gana_un_auto' do
188
322
  end
189
323
  ```
190
324
 
191
- Si su condición acepta más de un argumento, puede pasarle un arreglo. Al
192
- definir la condición, se puede utilizar el operador splat en
193
- la lista de parámetros:
325
+ Para una condición que toma multiples valores usa splat:
194
326
 
195
327
  ```ruby
196
- set(:autorizar) do |*roles| # <- mirá el splat
328
+ set(:autorizar) do |*roles| # <- mira el splat
197
329
  condition do
198
330
  unless sesion_iniciada? && roles.any? {|rol| usuario_actual.tiene_rol? rol }
199
331
  redirect "/iniciar_sesion/", 303
@@ -210,15 +342,16 @@ get "/solo/administradores/", :autorizar => :administrador do
210
342
  end
211
343
  ```
212
344
 
213
- ### Valores de Retorno
345
+ ## Valores de Retorno
214
346
 
215
- El valor de retorno de un bloque de ruta que determina al menos el cuerpo de la
216
- respuesta que se le pasa al cliente HTTP o al siguiente middleware en la pila
217
- de Rack. Lo más común es que sea un string, como en los ejemplos anteriores.
347
+ El valor de retorno de un bloque de ruta determina por lo menos el cuerpo de la respuesta
348
+ transmitida al cliente HTTP o por lo menos al siguiente middleware en la pila de Rack.
349
+ Lo más común es que sea un string, como en los ejemplos anteriores.
218
350
  Sin embargo, otros valores también son aceptados.
219
351
 
220
- Puede devolver cualquier objeto que sea una respuesta Rack válida, un objeto
221
- que represente el cuerpo de una respuesta Rack o un código de estado HTTP:
352
+ Puedes retornar cualquier objeto que sea una respuesta Rack válida,
353
+ un objeto que represente el cuerpo de una respuesta Rack o un código
354
+ de estado HTTP:
222
355
 
223
356
  * Un arreglo con tres elementos: `[estado (Fixnum), cabeceras (Hash), cuerpo de
224
357
  la respuesta (responde a #each)]`
@@ -228,7 +361,7 @@ que represente el cuerpo de una respuesta Rack o un código de estado HTTP:
228
361
  dado
229
362
  * Un Fixnum representando el código de estado
230
363
 
231
- De esa manera, podemos fácilmente implementar un ejemplo de streaming:
364
+ De esa manera, por ejemplo, podemos fácilmente implementar un ejemplo de streaming:
232
365
 
233
366
  ```ruby
234
367
  class Stream
@@ -240,14 +373,17 @@ end
240
373
  get('/') { Stream.new }
241
374
  ```
242
375
 
243
- ### Comparadores de Rutas Personalizados
376
+ También puedes usar el `stream` helper ([descrito abajo](#streaming-de-respuestas))
377
+ para reducir el código repetitivo e incrustar la lógica de stream a la ruta
378
+
379
+ ## Comparadores de Rutas Personalizados
244
380
 
245
381
  Como se mostró anteriormente, Sinatra permite utilizar strings y expresiones
246
- regulares para definir las rutas. Sin embargo, la cosa no termina ahí. Podés
382
+ regulares para definir las rutas. Sin embargo, no termina ahí.Puedes
247
383
  definir tus propios comparadores muy fácilmente:
248
384
 
249
385
  ```ruby
250
- class PatronCualquieraMenos
386
+ class TodoMenosElPatron
251
387
  Match = Struct.new(:captures)
252
388
 
253
389
  def initialize(excepto)
@@ -261,7 +397,7 @@ class PatronCualquieraMenos
261
397
  end
262
398
 
263
399
  def cualquiera_menos(patron)
264
- PatronCualquieraMenos.new(patron)
400
+ TodoMenosElPatron.new(patron)
265
401
  end
266
402
 
267
403
  get cualquiera_menos("/index") do
@@ -279,7 +415,7 @@ get // do
279
415
  end
280
416
  ```
281
417
 
282
- O, usando un lookahead negativo:
418
+ O, usando un look ahead negativo:
283
419
 
284
420
  ```ruby
285
421
  get %r{(?!/index)} do
@@ -287,14 +423,14 @@ get %r{(?!/index)} do
287
423
  end
288
424
  ```
289
425
 
290
- ### Archivos Estáticos
426
+ ## Archivos Estáticos
291
427
 
292
428
  Los archivos estáticos son servidos desde el directorio público
293
429
  `./public`. Puede especificar una ubicación diferente ajustando la
294
430
  opción `:public_folder`:
295
431
 
296
432
  ```ruby
297
- set :public_folder, File.dirname(__FILE__) + '/estaticos'
433
+ set :public_folder, File.dirname(__FILE__) + '/static'
298
434
  ```
299
435
 
300
436
  Note que el nombre del directorio público no está incluido en la URL. Por
@@ -302,9 +438,9 @@ ejemplo, el archivo `./public/css/style.css` se accede a través de
302
438
  `http://ejemplo.com/css/style.css`.
303
439
 
304
440
  Use la configuración `:static_cache_control` para agregar el encabezado
305
- `Cache-Control` (ver la sección de configuración para más detalles).
441
+ `Cache-Control` (Ver mas [abajo](#control-del-cache)).
306
442
 
307
- ### Vistas / Plantillas
443
+ ## Vistas / Plantillas
308
444
 
309
445
  Cada lenguaje de plantilla se expone a través de un método de renderizado que
310
446
  lleva su nombre. Estos métodos simplemente devuelven un string:
@@ -317,7 +453,7 @@ end
317
453
 
318
454
  Renderiza `views/index.erb`.
319
455
 
320
- En lugar del nombre de la plantilla podés proporcionar directamente el
456
+ En lugar del nombre de la plantilla puedes proporcionar directamente el
321
457
  contenido de la misma:
322
458
 
323
459
  ```ruby
@@ -389,7 +525,7 @@ Opciones disponibles:
389
525
  <dt>layout</dt>
390
526
  <dd>
391
527
  Si es <tt>true</tt> o <tt>false</tt> indica que se debe usar, o no, un layout,
392
- respectivamente. También puede ser un símbolo que especifique qué plantilla
528
+ respectivamente. También puede ser un Symbol que especifique qué plantilla
393
529
  usar. Ejemplo: <tt>erb :index, :layout => !request.xhr?</tt>
394
530
  </dd>
395
531
 
@@ -402,7 +538,7 @@ Opciones disponibles:
402
538
  <dt>scope</dt>
403
539
  <dd>
404
540
  Ámbito en el que se renderiza la plantilla. Por defecto utiliza la instancia
405
- de la aplicación. Tené en cuenta que si cambiás esta opción las variables de
541
+ de la aplicación. Ten en cuenta que si cambiás esta opción las variables de
406
542
  instancia y los helpers van a dejar de estar disponibles.
407
543
  </dd>
408
544
 
@@ -413,22 +549,45 @@ Opciones disponibles:
413
549
  del motor usado para renderizar la plantilla.
414
550
  Ejemplo: <tt>set :rdoc, :layout_engine => :erb</tt>
415
551
  </dd>
416
-
417
- <dd>
418
- Se asume que las plantillas están ubicadas directamente bajo el directorio
419
- <tt>./views</tt>. Para usar un directorio de vistas diferente:
420
- <tt>set :views, settings.root + '/plantillas'</tt>
421
- </dd>
422
-
552
+
553
+ <dt>layout_options</dt>
423
554
  <dd>
424
- Es importante acordarse que siempre tenés que referenciar a las plantillas con
425
- símbolos, incluso cuando se encuentran en un subdirectorio (en este caso
426
- tenés que usar: `:'subdir/plantilla'` o `'subdir/plantilla'.to_sym`). Tenés que
427
- usar un símbolo porque los métodos de renderización van a renderizar
428
- directamente cualquier string que se les pase como argumento.
555
+ Opciones especiales usadas únicamente para renderizar el layout. Ejemplo:
556
+ <tt>set :rdoc, :layout_options => { :views => 'views/layouts' }</tt>
429
557
  </dd>
430
558
  </dl>
431
559
 
560
+ Se asume que las plantillas están ubicadas directamente bajo el directorio `./views`.
561
+ Para usar un directorio diferente:
562
+
563
+ ```ruby
564
+ set :views, settings.root + '/templates'
565
+ ```
566
+
567
+ Es importante acordarse que siempre tienes que referenciar a las plantillas con
568
+ símbolos, incluso cuando se encuentran en un subdirectorio (en este caso
569
+ tienes que usar: `:'subdir/plantilla'` o `'subdir/plantilla'.to_sym`). Esto es debido
570
+ a que los métodos de renderización van a renderizar directamente cualquier string que
571
+ se les pase como argumento.
572
+
573
+ ### Plantillas Literales
574
+
575
+ ```ruby
576
+ get '/' do
577
+ haml '%div.titulo Hola Mundo'
578
+ end
579
+ ```
580
+
581
+ Renderiza el string de la plantilla. Opcionalmente puedes especificar
582
+ `:path` y `:line` para un backtrace más claro si hay una ruta del sistema
583
+ de archivos o una línea asociada con ese string
584
+
585
+ ```ruby
586
+ get '/' do
587
+ haml '%div.titulo Hola Mundo', :path => 'ejemplos/archivo.haml', :line => 3
588
+ end
589
+ ```
590
+
432
591
  ### Lenguajes de Plantillas Disponibles
433
592
 
434
593
  Algunos lenguajes tienen varias implementaciones. Para especificar que
@@ -440,7 +599,7 @@ require 'rdiscount' # o require 'bluecloth'
440
599
  get('/') { markdown :index }
441
600
  ```
442
601
 
443
- ### Plantillas Haml
602
+ #### Plantillas Haml
444
603
 
445
604
  <table>
446
605
  <tr>
@@ -457,7 +616,7 @@ get('/') { markdown :index }
457
616
  </tr>
458
617
  </table>
459
618
 
460
- ### Plantillas Erb
619
+ #### Plantillas Erb
461
620
 
462
621
  <table>
463
622
  <tr>
@@ -477,7 +636,7 @@ get('/') { markdown :index }
477
636
  </tr>
478
637
  </table>
479
638
 
480
- ### Plantillas Builder
639
+ #### Plantillas Builder
481
640
 
482
641
  <table>
483
642
  <tr>
@@ -496,9 +655,9 @@ get('/') { markdown :index }
496
655
  </tr>
497
656
  </table>
498
657
 
499
- Además, acepta un bloque con la definición de la plantilla (ver ejemplo).
658
+ También toma un bloque para plantillas inline (ver [ejemplo](#plantillas-inline)).
500
659
 
501
- ### Plantillas Nokogiri
660
+ #### Plantillas Nokogiri
502
661
 
503
662
  <table>
504
663
  <tr>
@@ -515,9 +674,9 @@ Además, acepta un bloque con la definición de la plantilla (ver ejemplo).
515
674
  </tr>
516
675
  </table>
517
676
 
518
- Además, acepta un bloque con la definición de la plantilla (ver ejemplo).
677
+ También toma un bloque para plantillas inline (ver [ejemplo](#plantillas-inline)).
519
678
 
520
- ### Plantillas Sass
679
+ #### Plantillas Sass
521
680
 
522
681
  <table>
523
682
  <tr>
@@ -534,7 +693,7 @@ Además, acepta un bloque con la definición de la plantilla (ver ejemplo).
534
693
  </tr>
535
694
  </table>
536
695
 
537
- ### Plantillas SCSS
696
+ #### Plantillas SCSS
538
697
 
539
698
  <table>
540
699
  <tr>
@@ -551,7 +710,7 @@ Además, acepta un bloque con la definición de la plantilla (ver ejemplo).
551
710
  </tr>
552
711
  </table>
553
712
 
554
- ### Plantillas Less
713
+ #### Plantillas Less
555
714
 
556
715
  <table>
557
716
  <tr>
@@ -568,7 +727,7 @@ Además, acepta un bloque con la definición de la plantilla (ver ejemplo).
568
727
  </tr>
569
728
  </table>
570
729
 
571
- ### Plantillas Liquid
730
+ #### Plantillas Liquid
572
731
 
573
732
  <table>
574
733
  <tr>
@@ -588,7 +747,7 @@ Además, acepta un bloque con la definición de la plantilla (ver ejemplo).
588
747
  Como no va a poder llamar a métodos de Ruby (excepto por `yield`) desde una
589
748
  plantilla Liquid, casi siempre va a querer pasarle locales.
590
749
 
591
- ### Plantillas Markdown
750
+ #### Plantillas Markdown
592
751
 
593
752
  <table>
594
753
  <tr>
@@ -618,7 +777,7 @@ generalmente va a usarlo en combinación con otro motor de renderizado:
618
777
  erb :resumen, :locals => { :texto => markdown(:introduccion) }
619
778
  ```
620
779
 
621
- Tenga en cuenta que también podés llamar al método `markdown` desde otras
780
+ Tenga en cuenta que también puedes llamar al método `markdown` desde otras
622
781
  plantillas:
623
782
 
624
783
  ```ruby
@@ -630,7 +789,7 @@ Como no puede utilizar Ruby desde Markdown, no puede usar layouts escritos en
630
789
  Markdown. De todos modos, es posible usar un motor de renderizado para el
631
790
  layout distinto al de la plantilla pasando la opción `:layout_engine`.
632
791
 
633
- ### Plantillas Textile
792
+ #### Plantillas Textile
634
793
 
635
794
  <table>
636
795
  <tr>
@@ -654,7 +813,7 @@ generalmente vas a usarlo en combinación con otro motor de renderizado:
654
813
  erb :resumen, :locals => { :texto => textile(:introduccion) }
655
814
  ```
656
815
 
657
- Tené en cuenta que también podés llamar al método `textile` desde otras
816
+ Ten en cuenta que también puedes llamar al método `textile` desde otras
658
817
  plantillas:
659
818
 
660
819
  ```ruby
@@ -662,11 +821,11 @@ plantillas:
662
821
  %p= textile(:saludos)
663
822
  ```
664
823
 
665
- Como no podés utilizar Ruby desde Textile, no podés usar layouts escritos en
824
+ Como no puedes utilizar Ruby desde Textile, no puedes usar layouts escritos en
666
825
  Textile. De todos modos, es posible usar un motor de renderizado para el
667
826
  layout distinto al de la plantilla pasando la opción `:layout_engine`.
668
827
 
669
- ### Plantillas RDoc
828
+ #### Plantillas RDoc
670
829
 
671
830
  <table>
672
831
  <tr>
@@ -690,7 +849,7 @@ generalmente vas a usarlo en combinación con otro motor de renderizado:
690
849
  erb :resumen, :locals => { :texto => rdoc(:introduccion) }
691
850
  ```
692
851
 
693
- Tené en cuenta que también podés llamar al método `rdoc` desde otras
852
+ Ten en cuenta que también puedes llamar al método `rdoc` desde otras
694
853
  plantillas:
695
854
 
696
855
  ```ruby
@@ -698,11 +857,31 @@ plantillas:
698
857
  %p= rdoc(:saludos)
699
858
  ```
700
859
 
701
- Como no podés utilizar Ruby desde RDoc, no podés usar layouts escritos en RDoc.
860
+ Como no puedes utilizar Ruby desde RDoc, no puedes usar layouts escritos en RDoc.
702
861
  De todos modos, es posible usar un motor de renderizado para el layout distinto
703
862
  al de la plantilla pasando la opción `:layout_engine`.
704
863
 
705
- ### Plantillas Radius
864
+ #### Plantillas AsciiDoc
865
+
866
+ <table>
867
+ <tr>
868
+ <td>Dependencia</td>
869
+ <td><a href="http://asciidoctor.org/" title="Asciidoctor">Asciidoctor</a></td>
870
+ </tr>
871
+ <tr>
872
+ <td>Extensiones de Archivo</td>
873
+ <td><tt>.asciidoc</tt>, <tt>.adoc</tt> and <tt>.ad</tt></td>
874
+ </tr>
875
+ <tr>
876
+ <td>Ejemplo</td>
877
+ <td><tt>asciidoc :README, :layout_engine => :erb</tt></td>
878
+ </tr>
879
+ </table>
880
+
881
+ Desde que no se puede utilizar métodos de Ruby desde una
882
+ plantilla AsciiDoc, casi siempre va a querer pasarle locales.
883
+
884
+ #### Plantillas Radius
706
885
 
707
886
  <table>
708
887
  <tr>
@@ -722,7 +901,7 @@ al de la plantilla pasando la opción `:layout_engine`.
722
901
  Desde que no se puede utilizar métodos de Ruby (excepto por `yield`) de una
723
902
  plantilla Radius, casi siempre se necesita pasar locales.
724
903
 
725
- ### Plantillas Markaby
904
+ #### Plantillas Markaby
726
905
 
727
906
  <table>
728
907
  <tr>
@@ -739,9 +918,9 @@ plantilla Radius, casi siempre se necesita pasar locales.
739
918
  </tr>
740
919
  </table>
741
920
 
742
- Además, acepta un bloque con la definición de la plantilla (ver ejemplo).
921
+ También toma un bloque para plantillas inline (ver [ejemplo](#plantillas-inline)).
743
922
 
744
- ### Plantillas RABL
923
+ #### Plantillas RABL
745
924
 
746
925
  <table>
747
926
  <tr>
@@ -758,7 +937,7 @@ Además, acepta un bloque con la definición de la plantilla (ver ejemplo).
758
937
  </tr>
759
938
  </table>
760
939
 
761
- ### Plantillas Slim
940
+ #### Plantillas Slim
762
941
 
763
942
  <table>
764
943
  <tr>
@@ -775,7 +954,7 @@ Además, acepta un bloque con la definición de la plantilla (ver ejemplo).
775
954
  </tr>
776
955
  </table>
777
956
 
778
- ### Plantillas Creole
957
+ #### Plantillas Creole
779
958
 
780
959
  <table>
781
960
  <tr>
@@ -807,11 +986,45 @@ plantillas:
807
986
  %p= creole(:saludos)
808
987
  ```
809
988
 
810
- Como no podés utilizar Ruby desde Creole, no podés usar layouts escritos en
989
+ Como no puedes utilizar Ruby desde Creole, no puedes usar layouts escritos en
811
990
  Creole. De todos modos, es posible usar un motor de renderizado para el layout
812
991
  distinto al de la plantilla pasando la opción `:layout_engine`.
813
992
 
814
- ### Plantillas CoffeeScript
993
+ #### MediaWiki Templates
994
+
995
+ <table>
996
+ <tr>
997
+ <td>Dependencia</td>
998
+ <td><a href="https://github.com/nricciar/wikicloth" title="WikiCloth">WikiCloth</a></td>
999
+ </tr>
1000
+ <tr>
1001
+ <td>Extension de Archivo</td>
1002
+ <td><tt>.mediawiki</tt> and <tt>.mw</tt></td>
1003
+ </tr>
1004
+ <tr>
1005
+ <td>Ejemplo</td>
1006
+ <td><tt>mediawiki :wiki, :layout_engine => :erb</tt></td>
1007
+ </tr>
1008
+ </table>
1009
+
1010
+ No es posible llamar métodos desde el markup de MediaWiki, ni pasar locales al mismo.
1011
+ Por lo tanto usualmente lo usarás en combinación con otro motor de renderizado:
1012
+
1013
+ ```ruby
1014
+ erb :overview, :locals => { :text => mediawiki(:introduction) }
1015
+ ```
1016
+
1017
+ Nota que también puedes llamar al método `mediawiki` desde dentro de otras plantillas:
1018
+
1019
+ ```ruby
1020
+ %h1 Hello From Haml!
1021
+ %p= mediawiki(:greetings)
1022
+ ```
1023
+
1024
+ Debido a que no puedes llamar a Ruby desde MediaWiki, no puedes usar los diseños escritos en MediaWiki.
1025
+ De todas maneras, es posible usar otro motor de renderizado para esa plantilla pasando la opción :layout_engine.
1026
+
1027
+ #### Plantillas CoffeeScript
815
1028
 
816
1029
  <table>
817
1030
  <tr>
@@ -835,7 +1048,7 @@ distinto al de la plantilla pasando la opción `:layout_engine`.
835
1048
  </tr>
836
1049
  </table>
837
1050
 
838
- ### Plantillas Stylus
1051
+ #### Plantillas Stylus
839
1052
 
840
1053
  <table>
841
1054
  <tr>
@@ -859,7 +1072,19 @@ distinto al de la plantilla pasando la opción `:layout_engine`.
859
1072
  </tr>
860
1073
  </table>
861
1074
 
862
- ### Plantillas Yajl
1075
+ Antes de poder usar las plantillas de Stylus, necesitas cargar `stylus` y `stylus/tilt`:
1076
+
1077
+ ```ruby
1078
+ require 'sinatra'
1079
+ require 'stylus'
1080
+ require 'stylus/tilt'
1081
+
1082
+ get '/' do
1083
+ stylus :example
1084
+ end
1085
+ ```
1086
+
1087
+ #### Plantillas Yajl
863
1088
 
864
1089
  <table>
865
1090
  <tr>
@@ -893,10 +1118,11 @@ json[:baz] = key
893
1118
  Las opciones `:callback` y `:variable` se pueden utilizar para decorar el objeto renderizado:
894
1119
 
895
1120
  ```ruby
896
- var resource = {"foo":"bar","baz":"qux"}; present(resource);
1121
+ var contenido = {"foo":"bar","baz":"qux"};
1122
+ present(contenido);
897
1123
  ```
898
1124
 
899
- ### Plantillas WLang
1125
+ #### Plantillas WLang
900
1126
 
901
1127
  <table>
902
1128
  <tr>
@@ -916,16 +1142,6 @@ var resource = {"foo":"bar","baz":"qux"}; present(resource);
916
1142
  Como no vas a poder llamar a métodos de Ruby (excepto por `yield`) desde una
917
1143
  plantilla WLang, casi siempre vas a querer pasarle locales.
918
1144
 
919
- ### Plantillas Embebidas
920
-
921
- ```ruby
922
- get '/' do
923
- haml '%div.titulo Hola Mundo'
924
- end
925
- ```
926
-
927
- Renderiza el template embebido en el string.
928
-
929
1145
  ### Accediendo a Variables en Plantillas
930
1146
 
931
1147
  Las plantillas son evaluadas dentro del mismo contexto que los manejadores de
@@ -951,12 +1167,46 @@ end
951
1167
  Esto es usado típicamente cuando se renderizan plantillas como parciales desde
952
1168
  adentro de otras plantillas.
953
1169
 
1170
+ ### Plantillas con `yield` y `layout` anidado
1171
+
1172
+ Un layout es usualmente una plantilla que llama a `yield`.
1173
+ Dicha plantilla puede ser usada tanto a travé de la opción `:template`
1174
+ como describimos arriba, o puede ser rederizada con un bloque como a
1175
+ continuación:
1176
+
1177
+ ```ruby
1178
+ erb :post, :layout => false do
1179
+ erb :index
1180
+ end
1181
+ ```
1182
+ Este código es principalmente equivalente a `erb :index, :layout => :post`.
1183
+
1184
+ Pasar bloques a métodos de renderizado es la forma mas útil de crear layouts anidados:
1185
+
1186
+ ```ruby
1187
+ erb :main_layout, :layout => false do
1188
+ erb :admin_layout do
1189
+ erb :user
1190
+ end
1191
+ end
1192
+ ```
1193
+
1194
+ Esto también se puede hacer en menos líneas de código con:
1195
+
1196
+ ```ruby
1197
+ erb :admin_layout, :layout => :main_layout do
1198
+ erb :user
1199
+ end
1200
+ ```
1201
+
1202
+ Actualmente, los siguientes métodos de renderizado aceptan un bloque: `erb`, `haml`,
1203
+ `liquid`, `slim `, `wlang`. También el método general de `render` acepta un bloque.
1204
+
954
1205
  ### Plantillas Inline
955
1206
 
956
1207
  Las plantillas pueden ser definidas al final del archivo fuente:
957
1208
 
958
1209
  ```ruby
959
- require 'rubygems'
960
1210
  require 'sinatra'
961
1211
 
962
1212
  get '/' do
@@ -970,12 +1220,12 @@ __END__
970
1220
  = yield
971
1221
 
972
1222
  @@ index
973
- %div.titulo Hola mundo!!!!!
1223
+ %div.titulo Hola Mundo
974
1224
  ```
975
1225
 
976
- NOTA: únicamente las plantillas inline definidas en el archivo fuente que
1226
+ NOTA: Únicamente las plantillas inline definidas en el archivo fuente que
977
1227
  requiere Sinatra son cargadas automáticamente. Llamá `enable
978
- :inline_templates` explícitamente si tenés plantillas inline en otros
1228
+ :inline_templates` explícitamente si tienes plantillas inline en otros
979
1229
  archivos fuente.
980
1230
 
981
1231
  ### Plantillas Nombradas
@@ -998,7 +1248,7 @@ end
998
1248
  ```
999
1249
 
1000
1250
  Si existe una plantilla con el nombre "layout", va a ser usada cada vez que
1001
- una plantilla es renderizada. Podés desactivar los layouts individualmente
1251
+ una plantilla es renderizada.Puedes desactivar los layouts individualmente
1002
1252
  pasando `:layout => false` o globalmente con
1003
1253
  `set :haml, :layout => false`:
1004
1254
 
@@ -1010,20 +1260,20 @@ end
1010
1260
 
1011
1261
  ### Asociando Extensiones de Archivo
1012
1262
 
1013
- Para asociar una extensión de archivo con un motor de renderizado, usá
1014
- `Tilt.register`. Por ejemplo, si querés usar la extensión `tt` para
1015
- las plantillas Textile, podés hacer lo siguiente:
1263
+ Para asociar una extensión de archivo con un motor de renderizado, usa
1264
+ `Tilt.register`. Por ejemplo, si quieres usar la extensión `tt` para
1265
+ las plantillas Textile, puedes hacer lo siguiente:
1016
1266
 
1017
1267
  ```ruby
1018
1268
  Tilt.register :tt, Tilt[:textile]
1019
1269
  ```
1020
1270
 
1021
- ### Agregando Tu Propio Motor de Renderizado
1271
+ ### Añadiendo Tu Propio Motor de Plantillas
1022
1272
 
1023
- Primero, registrá tu motor con Tilt, y después, creá tu método de renderizado:
1273
+ Primero, registra tu motor con Tilt, y después, creá tu método de renderizado:
1024
1274
 
1025
1275
  ```ruby
1026
- Tilt.register :mipg, MiMotorParaPlantillaGenial
1276
+ Tilt.register :mipg, MiMotorDePlantilla
1027
1277
 
1028
1278
  helpers do
1029
1279
  def mypg(*args) render(:mypg, *args) end
@@ -1037,6 +1287,23 @@ end
1037
1287
  Renderiza `./views/index.mypg`. Mirá https://github.com/rtomayko/tilt
1038
1288
  para aprender más de Tilt.
1039
1289
 
1290
+ ### Usando Lógica Personalizada para la Búsqueda en Plantillas
1291
+
1292
+ Para implementar tu propio mecanismo de búsqueda de plantillas puedes
1293
+ escribir tu propio método `#find_template`
1294
+
1295
+ ```ruby
1296
+ configure do
1297
+ set :views [ './views/a', './views/b' ]
1298
+ end
1299
+
1300
+ def find_template(views, name, engine, &block)
1301
+ Array(views).each do |v|
1302
+ super(v, name, engine, &block)
1303
+ end
1304
+ end
1305
+ ```
1306
+
1040
1307
  ## Filtros
1041
1308
 
1042
1309
  Los filtros `before` son evaluados antes de cada petición dentro del mismo
@@ -1097,9 +1364,9 @@ after '/blog/*', :host_name => 'ejemplo.com' do
1097
1364
  end
1098
1365
  ```
1099
1366
 
1100
- ## Ayudantes
1367
+ ## Helpers
1101
1368
 
1102
- Usá el método top-level *helpers* para definir métodos ayudantes que
1369
+ Usá el método top-level `helpers` para definir métodos ayudantes (helpers) que
1103
1370
  pueden ser utilizados dentro de los manejadores de rutas y las plantillas:
1104
1371
 
1105
1372
  ```ruby
@@ -1115,7 +1382,7 @@ end
1115
1382
  ```
1116
1383
 
1117
1384
  Por cuestiones organizativas, puede resultar conveniente organizar los métodos
1118
- ayudantes en distintos módulos:
1385
+ helpers en distintos módulos:
1119
1386
 
1120
1387
  ```ruby
1121
1388
  module FooUtils
@@ -1129,7 +1396,7 @@ end
1129
1396
  helpers FooUtils, BarUtils
1130
1397
  ```
1131
1398
 
1132
- El efecto de utilizar *helpers* de esta manera es el mismo que resulta de
1399
+ El efecto de utilizar `helpers` de esta manera es el mismo que resulta de
1133
1400
  incluir los módulos en la clase de la aplicación.
1134
1401
 
1135
1402
  ### Usando Sesiones
@@ -1149,51 +1416,137 @@ get '/:valor' do
1149
1416
  end
1150
1417
  ```
1151
1418
 
1152
- Tené en cuenta que `enable :sessions` guarda todos los datos en una
1153
- cookie, lo cual no es siempre deseable (guardar muchos datos va a incrementar
1154
- el tráfico, por citar un ejemplo). Podés usar cualquier middleware Rack para
1155
- manejar sesiones, de la misma manera que usarías cualquier otro middleware,
1156
- pero con la salvedad de que *no* tenés que llamar a `enable :sessions`:
1419
+ #### Secreto de Sesión
1157
1420
 
1158
- ```ruby
1159
- use Rack::Session::Pool, :expire_after => 2592000
1421
+ Para mejorar la seguridad, los datos de la sesión en la cookie se firman con un secreto usando `HMAC-SHA1`. El secreto de esta sesión debería ser de manera óptima
1422
+ un valor aleatorio criptográficamente seguro de una longitud adecuada para
1423
+ `HMAC-SHA1` que es mayor o igual que 64 bytes (512 bits, 128 hex caracteres).
1424
+ Se le aconsejará que no use un secreto que sea inferior a 32
1425
+ bytes de aleatoriedad (256 bits, 64 caracteres hexadecimales).
1426
+ Por lo tanto, es **muy importante** que no solo invente el secreto,
1427
+ sino que use un generador de números aleatorios para crearlo.
1428
+ Los humanos somos extremadamente malos generando valores aleatorios
1160
1429
 
1161
- get '/' do
1162
- "valor = " << session[:valor].inspect
1163
- end
1430
+ De forma predeterminada, un secreto de sesión aleatorio seguro de 32 bytes se genera para usted por
1431
+ Sinatra, pero cambiará con cada reinicio de su aplicación. Si tienes varias
1432
+ instancias de tu aplicación y dejas que Sinatra genere la clave, cada instancia
1433
+ tendría una clave de sesión diferente y probablemente no es lo que quieres.
1164
1434
 
1165
- get '/:valor' do
1166
- session[:valor] = params['valor']
1167
- end
1435
+ Para una mejor seguridad y usabilidad es
1436
+ [recomendado](https://12factor.net/config) que genere un secreto de sesión
1437
+ aleatorio seguro y se guarde en las variables de entorno en cada host que ejecuta
1438
+ su aplicación para que todas las instancias de su aplicación compartan el mismo
1439
+ secreto. Debería rotar periódicamente esta sesión secreta a un nuevo valor.
1440
+ Aquí hay algunos ejemplos de cómo puede crear un secreto de 64 bytes y configurarlo:
1441
+
1442
+ **Generación de Secreto de Sesión**
1443
+
1444
+ ```text
1445
+ $ ruby -e "require 'securerandom'; puts SecureRandom.hex(64)"
1446
+ 99ae8af...snip...ec0f262ac
1447
+ ```
1448
+
1449
+ **Generación de Secreto de Sesión (Puntos Extras)**
1450
+
1451
+ Usa la [gema sysrandom](https://github.com/cryptosphere/sysrandom) para preferir
1452
+ el uso de el sistema RNG para generar valores aleatorios en lugar de
1453
+ espacio de usuario `OpenSSL` que MRI Ruby tiene por defecto:
1454
+
1455
+ ```text
1456
+ $ gem install sysrandom
1457
+ Building native extensions. This could take a while...
1458
+ Successfully installed sysrandom-1.x
1459
+ 1 gem installed
1460
+
1461
+ $ ruby -e "require 'sysrandom/securerandom'; puts SecureRandom.hex(64)"
1462
+ 99ae8af...snip...ec0f262ac
1168
1463
  ```
1169
1464
 
1170
- Para incrementar la seguridad, los datos de la sesión almacenados en
1171
- la cookie son firmados con un secreto de sesión. Este secreto, es
1172
- generado aleatoriamente por Sinatra. De cualquier manera, hay que
1173
- tener en cuenta que cada vez que inicies la aplicación se va a generar
1174
- uno nuevo. Así, si querés que todas las instancias de tu aplicación
1175
- compartan un único secreto, tenés que definirlo vos:
1465
+ **Secreto de Sesión en Variable de Entorno**
1466
+
1467
+ Establezca una variable de entorno `SESSION_SECRET` para Sinatra en el valor que
1468
+ generaste. Haz que este valor sea persistente durante los reinicios de su host. El
1469
+ método para hacer esto variará a través de los sistemas operativos, esto es para
1470
+ propósitos ilustrativos solamente:
1471
+
1472
+
1473
+ ```bash
1474
+ # echo "export SESSION_SECRET=99ae8af...snip...ec0f262ac" >> ~/.bashrc
1475
+ ```
1476
+
1477
+ **Configuración de la Aplicación y su Secreto de Sesión**
1478
+
1479
+ Configura tu aplicación a prueba de fallas si la variable de entorno
1480
+ `SESSION_SECRET` no esta disponible
1481
+
1482
+ Para puntos extras usa la [gema sysrandom](https://github.com/cryptosphere/sysrandom) acá tambien:
1176
1483
 
1177
1484
  ```ruby
1178
- set :session_secret, 'super secreto'
1485
+ require 'securerandom'
1486
+ # -or- require 'sysrandom/securerandom'
1487
+ set :session_secret, ENV.fetch('SESSION_SECRET') { SecureRandom.hex(64) }
1179
1488
  ```
1180
1489
 
1181
- Si necesitás una configuración más específica, `sessions` acepta un
1182
- Hash con opciones:
1490
+ #### Configuración de Sesión
1491
+
1492
+ Si desea configurarlo más, también puede almacenar un hash con opciones
1493
+ en la configuración `sessions`:
1183
1494
 
1184
1495
  ```ruby
1185
1496
  set :sessions, :domain => 'foo.com'
1186
1497
  ```
1187
1498
 
1499
+ Para compartir su sesión en otras aplicaciones en subdominios de foo.com, agregue el prefijo
1500
+ dominio con un *.* como este en su lugar:
1501
+
1502
+ ```ruby
1503
+ set :sessions, :domain => '.foo.com'
1504
+ ```
1505
+
1506
+ #### Escogiendo tu Propio Middleware de Sesión
1507
+
1508
+ Tenga en cuenta que `enable :sessions` en realidad almacena todos los datos en una cookie.
1509
+ Esto no siempre podria ser lo que quieres (almacenar muchos datos aumentará su
1510
+ tráfico, por ejemplo). Puede usar cualquier middleware de sesión proveniente de Rack
1511
+ para hacerlo, se puede utilizar uno de los siguientes métodos:
1512
+
1513
+ ```ruby
1514
+ enable :sessions
1515
+ set :session_store, Rack::Session::Pool
1516
+ ```
1517
+
1518
+ O para configurar sesiones con un hash de opciones:
1519
+
1520
+ ```ruby
1521
+ set :sessions, :expire_after => 2592000
1522
+ set :session_store, Rack::Session::Pool
1523
+ ```
1524
+
1525
+ Otra opción es **no** llamar a `enable :sessions`, sino
1526
+ su middleware de elección como lo haría con cualquier otro middleware.
1527
+
1528
+ Es importante tener en cuenta que al usar este método, la protección
1529
+ de sesiones **no estará habilitada por defecto**.
1530
+
1531
+ También será necesario agregar el middleware de Rack para hacer eso:
1532
+
1533
+ ```ruby
1534
+ use Rack::Session::Pool, :expire_after => 2592000
1535
+ use Rack::Protection::RemoteToken
1536
+ use Rack::Protection::SessionHijacking
1537
+ ```
1538
+
1539
+ Mira '[Configurando la protección contra ataques](#configurando-la-protección-contra-ataques)' para mas información.
1540
+
1188
1541
  ### Interrupción
1189
1542
 
1190
- Para detener inmediatamente una petición dentro de un filtro o una ruta usá:
1543
+ Para detener inmediatamente una petición dentro de un filtro o una ruta debes usar:
1191
1544
 
1192
1545
  ```ruby
1193
1546
  halt
1194
1547
  ```
1195
1548
 
1196
- También podés especificar el estado:
1549
+ También puedes especificar el estado:
1197
1550
 
1198
1551
  ```ruby
1199
1552
  halt 410
@@ -1242,10 +1595,10 @@ end
1242
1595
  Se sale inmediatamente del bloque de la ruta y se le pasa el control a la
1243
1596
  siguiente ruta que coincida. Si no coincide ninguna ruta, se devuelve 404.
1244
1597
 
1245
- ### Ejecutando Otra Ruta
1598
+ ### Desencadenando Otra Ruta
1246
1599
 
1247
- Cuando querés obtener el resultado de la llamada a una ruta, `pass` no te va a
1248
- servir. Para lograr esto, podés usar `call`:
1600
+ A veces, `pass` no es lo que quieres, sino obtener el
1601
+ resultado de la llamada a otra ruta. Simplemente use `call` para lograr esto:
1249
1602
 
1250
1603
  ```ruby
1251
1604
  get '/foo' do
@@ -1258,22 +1611,22 @@ get '/bar' do
1258
1611
  end
1259
1612
  ```
1260
1613
 
1261
- Notá que en el ejemplo anterior, es conveniente mover `"bar"` a un
1614
+ Nota que en el ejemplo anterior, es conveniente mover `"bar"` a un
1262
1615
  helper, y llamarlo desde `/foo` y `/bar`. Así, vas a simplificar
1263
1616
  las pruebas y a mejorar el rendimiento.
1264
1617
 
1265
- Si querés que la petición se envíe a la misma instancia de la aplicación en
1618
+ Si quieres que la petición se envíe a la misma instancia de la aplicación en
1266
1619
  lugar de otra, usá `call!` en lugar de `call`.
1267
1620
 
1268
- En la especificación de Rack podés encontrar más información sobre
1621
+ En la especificación de Rack puedes encontrar más información sobre
1269
1622
  `call`.
1270
1623
 
1271
- ### Asignando el Código de Estado, los Encabezados y el Cuerpo de una Respuesta
1624
+ ### Configurando el Cuerpo, Código de Estado y los Encabezados
1272
1625
 
1273
1626
  Es posible, y se recomienda, asignar el código de estado y el cuerpo de una
1274
- respuesta con el valor de retorno de una ruta. De cualquier manera, en varios
1275
- escenarios, puede que sea conveniente asignar el cuerpo en un punto arbitrario
1276
- del flujo de ejecución con el método `body`. A partir de ahí, podés usar ese
1627
+ respuesta con el valor de retorno de una ruta. Sin embargo, en algunos
1628
+ escenarios puede que sea conveniente asignar el cuerpo en un punto arbitrario
1629
+ del flujo de ejecución con el método helper `body`. A partir de ahí, puedes usar ese
1277
1630
  mismo método para acceder al cuerpo de la respuesta:
1278
1631
 
1279
1632
  ```ruby
@@ -1287,9 +1640,9 @@ end
1287
1640
  ```
1288
1641
 
1289
1642
  También es posible pasarle un bloque a `body`, que será ejecutado por el Rack
1290
- handler (podés usar esto para implementar streaming, mirá "Valores de retorno").
1643
+ handler (puedes usar esto para implementar streaming, mira ["Valores de Retorno"](#valores-de-retorno)).
1291
1644
 
1292
- De manera similar, también podés asignar el código de estado y encabezados:
1645
+ De manera similar, también puedes asignar el código de estado y encabezados:
1293
1646
 
1294
1647
  ```ruby
1295
1648
  get '/foo' do
@@ -1301,8 +1654,8 @@ get '/foo' do
1301
1654
  end
1302
1655
  ```
1303
1656
 
1304
- También, al igual que `body`, tanto `status` como `headers` pueden utilizarse
1305
- para obtener sus valores cuando no se les pasa argumentos.
1657
+ También, al igual que `body`, `status` y `headers` sin agregarles argumentos pueden usarse
1658
+ para acceder a sus valores actuales.
1306
1659
 
1307
1660
  ### Streaming De Respuestas
1308
1661
 
@@ -1323,8 +1676,8 @@ get '/' do
1323
1676
  end
1324
1677
  ```
1325
1678
 
1326
- Podés implementar APIs de streaming,
1327
- [Server-Sent Events](https://w3c.github.io/eventsource/) y puede ser usado
1679
+ Puedes implementar APIs de streaming,
1680
+ [Server-Sent Events](https://html.spec.whatwg.org/multipage/server-sent-events.html#server-sent-events) y puede ser usado
1328
1681
  como base para [WebSockets](https://es.wikipedia.org/wiki/WebSockets). También
1329
1682
  puede ser usado para incrementar el throughput si solo una parte del contenido
1330
1683
  depende de un recurso lento.
@@ -1337,28 +1690,45 @@ vez cuando el bloque pasado a `stream` finalice su ejecución. Si estás usando
1337
1690
  Shotgun, el streaming no va a funcionar.
1338
1691
 
1339
1692
  Cuando se pasa `keep_open` como parámetro, no se va a enviar el mensaje
1340
- `close` al objeto de stream. Queda en vos cerrarlo en el punto de ejecución
1693
+ `close` al objeto de stream. Permite que tu lo cierres en el punto de ejecución
1341
1694
  que quieras. Nuevamente, hay que tener en cuenta que este comportamiento es
1342
1695
  posible solo en servidores que soporten eventos, como Thin o Rainbows. El
1343
1696
  resto de los servidores van a cerrar el stream de todos modos:
1344
1697
 
1345
1698
  ```ruby
1346
- set :server, :thin
1347
- conexiones = []
1699
+ # long polling
1348
1700
 
1349
- get '/' do
1350
- # mantenemos abierto el stream
1351
- stream(:keep_open) { |salida| conexiones << salida }
1701
+ set :server, :thin
1702
+ connections = []
1703
+
1704
+ get '/subscribe' do
1705
+ # registrar a un cliente interesado en los eventos del servidor
1706
+ stream(:keep_open) do |out|
1707
+ connections << out
1708
+ # purgar conexiones muertas
1709
+ connections.reject!(&:closed?)
1710
+ end
1352
1711
  end
1353
1712
 
1354
- post '/' do
1355
- # escribimos a todos los streams abiertos
1356
- conexiones.each { |salida| salida << params['mensaje'] << "\n" }
1357
- "mensaje enviado"
1713
+ post '/:message' do
1714
+ connections.each do |out|
1715
+ # notificar al cliente que ha llegado un nuevo mensaje
1716
+ out << params['message'] << "\n"
1717
+
1718
+ # indicar al cliente para conectarse de nuevo
1719
+ out.close
1720
+ end
1721
+
1722
+ # reconocer
1723
+ "message received"
1358
1724
  end
1359
1725
  ```
1360
1726
 
1361
- ### Log (Registro)
1727
+ También es posible que el cliente cierre la conexión cuando intenta
1728
+ escribir en el socket. Debido a esto, se recomienda verificar con
1729
+ `out.closed?` antes de intentar escribir.
1730
+
1731
+ ### Logging
1362
1732
 
1363
1733
  En el ámbito de la petición, el helper `logger` (registrador) expone
1364
1734
  una instancia de `Logger`:
@@ -1375,7 +1745,7 @@ handler. Si el logueo está desactivado, este método va a devolver un
1375
1745
  objeto que se comporta como un logger pero que en realidad no hace
1376
1746
  nada. Así, no vas a tener que preocuparte por esta situación.
1377
1747
 
1378
- Tené en cuenta que el logueo está habilitado por defecto únicamente
1748
+ Ten en cuenta que el logueo está habilitado por defecto únicamente
1379
1749
  para `Sinatra::Application`. Si heredaste de
1380
1750
  `Sinatra::Base`, probablemente quieras habilitarlo manualmente:
1381
1751
 
@@ -1388,8 +1758,8 @@ end
1388
1758
  ```
1389
1759
 
1390
1760
  Para evitar que se inicialice cualquier middleware de logging, configurá
1391
- `logging` a `nil`. Tené en cuenta que, cuando hagas esto, `logger` va a
1392
- devolver `nil`. Un caso común es cuando querés usar tu propio logger. Sinatra
1761
+ `logging` a `nil`. Ten en cuenta que, cuando hagas esto, `logger` va a
1762
+ devolver `nil`. Un caso común es cuando quieres usar tu propio logger. Sinatra
1393
1763
  va a usar lo que encuentre en `env['rack.logger']`.
1394
1764
 
1395
1765
  ### Tipos Mime
@@ -1404,7 +1774,7 @@ configure do
1404
1774
  end
1405
1775
  ```
1406
1776
 
1407
- También lo podés usar con el ayudante `content_type`:
1777
+ También lo puedes usar con el helper `content_type`:
1408
1778
 
1409
1779
  ```ruby
1410
1780
  get '/' do
@@ -1428,7 +1798,7 @@ a continuación).
1428
1798
 
1429
1799
  ### Redirección del Navegador
1430
1800
 
1431
- Podés redireccionar al navegador con el método `redirect`:
1801
+ Puedes redireccionar al navegador con el método `redirect`:
1432
1802
 
1433
1803
  ```ruby
1434
1804
  get '/foo' do
@@ -1444,7 +1814,7 @@ redirect to('/bar'), 303
1444
1814
  redirect 'http://www.google.com/', 'te confundiste de lugar, compañero'
1445
1815
  ```
1446
1816
 
1447
- También podés redireccionar fácilmente de vuelta hacia la página desde donde
1817
+ También puedes redireccionar fácilmente de vuelta hacia la página desde donde
1448
1818
  vino el usuario con `redirect back`:
1449
1819
 
1450
1820
  ```ruby
@@ -1458,7 +1828,7 @@ get '/bar' do
1458
1828
  end
1459
1829
  ```
1460
1830
 
1461
- Para pasar argumentos con una redirección, podés agregarlos a la cadena de
1831
+ Para pasar argumentos con una redirección, puedes agregarlos a la cadena de
1462
1832
  búsqueda:
1463
1833
 
1464
1834
  ```ruby
@@ -1480,12 +1850,12 @@ get '/bar' do
1480
1850
  end
1481
1851
  ```
1482
1852
 
1483
- ### Cache Control
1853
+ ### Control del Cache
1484
1854
 
1485
1855
  Asignar tus encabezados correctamente es el cimiento para realizar un cacheo
1486
1856
  HTTP correcto.
1487
1857
 
1488
- Podés asignar el encabezado Cache-Control fácilmente:
1858
+ Puedes asignar el encabezado Cache-Control fácilmente:
1489
1859
 
1490
1860
  ```ruby
1491
1861
  get '/' do
@@ -1558,7 +1928,7 @@ De acuerdo con la RFC 2616 tu aplicación debería comportarse diferente si a la
1558
1928
  cabeceras If-Match o If-None-Match se le asigna el valor `*` cuando el
1559
1929
  recurso solicitado ya existe. Sinatra asume para peticiones seguras (como get)
1560
1930
  y potentes (como put) que el recurso existe, mientras que para el resto
1561
- (como post) asume que no. Podés cambiar este comportamiento con la opción
1931
+ (como post) asume que no. Puedes cambiar este comportamiento con la opción
1562
1932
  `:new_resource`:
1563
1933
 
1564
1934
  ```ruby
@@ -1569,7 +1939,7 @@ get '/crear' do
1569
1939
  end
1570
1940
  ```
1571
1941
 
1572
- Si querés seguir usando una weak ETag, indicalo con la opción `:kind`:
1942
+ Si quieres seguir usando una weak ETag, indicalo con la opción `:kind`:
1573
1943
 
1574
1944
  ```ruby
1575
1945
  etag '', :new_resource => true, :kind => :weak
@@ -1577,7 +1947,7 @@ etag '', :new_resource => true, :kind => :weak
1577
1947
 
1578
1948
  ### Enviando Archivos
1579
1949
 
1580
- Para enviar archivos, podés usar el método `send_file`:
1950
+ Para enviar archivos, puedes usar el método `send_file`:
1581
1951
 
1582
1952
  ```ruby
1583
1953
  get '/' do
@@ -1593,33 +1963,33 @@ send_file 'foo.png', :type => :jpg
1593
1963
 
1594
1964
  Estas opciones son:
1595
1965
 
1596
- [filename]
1597
- nombre del archivo devuelto, por defecto es el nombre real del archivo.
1598
-
1599
- [last_modified]
1600
- valor para el encabezado Last-Modified, por defecto toma el mtime del archivo.
1601
-
1602
- [type]
1603
- el content type que se va a utilizar, si no está presente se intenta adivinar
1604
- a partir de la extensión del archivo.
1605
-
1606
- [disposition]
1607
- se utiliza para el encabezado Content-Disposition, y puede tomar alguno de los
1608
- siguientes valores: `nil` (por defecto), `:attachment` e
1609
- `:inline`
1610
-
1611
- [length]
1612
- encabezado Content-Length, por defecto toma el tamaño del archivo.
1613
-
1614
- [status]
1615
- código de estado devuelto. Resulta útil al enviar un archivo estático como una
1616
- página de error.
1617
-
1618
- Si el Rack handler lo soporta, se intentará no transmitir directamente desde el
1619
- proceso de Ruby. Si usás este método, Sinatra se va a encargar automáticamente de las
1620
- peticiones de rango.
1966
+ <dl>
1967
+ <dt>filename</dt>
1968
+ <dd>Nombre del archivo devuelto, por defecto es el nombre real del archivo.</dd>
1969
+
1970
+ <dt>last_modified</dt>
1971
+ <dd>Valor para el encabezado Last-Modified, por defecto toma el mtime del archivo.</dd>
1972
+
1973
+ <dt>type</dt>
1974
+ <dd>El Content-Type que se va a utilizar, si no está presente se intenta
1975
+ adivinar a partir de la extensión del archivo.</dd>
1976
+
1977
+ <dt>disposition</dt>
1978
+ <dd>
1979
+ Se utiliza para el encabezado Content-Disposition, y puede tomar alguno de los
1980
+ siguientes valores: <tt>nil</tt> (por defecto), <tt>:attachment</tt> y <tt>:inline</tt>
1981
+ </dd>
1982
+
1983
+ <dt>length</dt>
1984
+ <dd>Encabezado Content-Length, por defecto toma el tamaño del archivo</dd>
1985
+
1986
+ <dt>status</dt>
1987
+ <dd>
1988
+ Código de estado a enviar. Útil cuando se envía un archivo estático como un error página. Si es compatible con el controlador de Rack, otros medios que no sean la transmisión del proceso de Ruby será utilizado. Si usas este método de ayuda, Sinatra manejará automáticamente las solicitudes de rango.
1989
+ </dd>
1990
+ </dl>
1621
1991
 
1622
- ### Accediendo al objeto de la petición
1992
+ ### Accediendo al objeto Request
1623
1993
 
1624
1994
  El objeto de la petición entrante puede ser accedido desde el nivel de la
1625
1995
  petición (filtros, rutas y manejadores de errores) a través del método
@@ -1681,7 +2051,7 @@ end
1681
2051
 
1682
2052
  ### Archivos Adjuntos
1683
2053
 
1684
- Podés usar el helper `attachment` para indicarle al navegador que
2054
+ Puedes usar el helper `attachment` para indicarle al navegador que
1685
2055
  almacene la respuesta en el disco en lugar de mostrarla en pantalla:
1686
2056
 
1687
2057
  ```ruby
@@ -1691,7 +2061,7 @@ get '/' do
1691
2061
  end
1692
2062
  ```
1693
2063
 
1694
- También podés pasarle un nombre de archivo:
2064
+ También puedes pasarle un nombre de archivo:
1695
2065
 
1696
2066
  ```ruby
1697
2067
  get '/' do
@@ -1747,7 +2117,7 @@ find_template settings.views, 'foo', Tilt[:haml] do |archivo|
1747
2117
  end
1748
2118
  ```
1749
2119
 
1750
- Si bien esto no es muy útil, lo interesante es que podés sobreescribir este
2120
+ Si bien esto no es muy útil, lo interesante es que puedes sobreescribir este
1751
2121
  método, y así enganchar tu propio mecanismo de búsqueda. Por ejemplo, para
1752
2122
  poder utilizar más de un directorio de vistas:
1753
2123
 
@@ -1803,7 +2173,7 @@ configure do
1803
2173
  # atajo para `set :opcion, false`
1804
2174
  disable :opcion
1805
2175
 
1806
- # también podés tener configuraciones dinámicas usando bloques
2176
+ # también puedes tener configuraciones dinámicas usando bloques
1807
2177
  set(:css_dir) { File.join(views, 'css') }
1808
2178
  end
1809
2179
  ```
@@ -1825,7 +2195,7 @@ configure :production, :test do
1825
2195
  end
1826
2196
  ```
1827
2197
 
1828
- Podés acceder a estas opciones utilizando el método `settings`:
2198
+ Puedes acceder a estas opciones utilizando el método `settings`:
1829
2199
 
1830
2200
  ```ruby
1831
2201
  configure do
@@ -1839,11 +2209,11 @@ get '/' do
1839
2209
  end
1840
2210
  ```
1841
2211
 
1842
- ### Configurando la Protección de Ataques
2212
+ ### Configurando la Protección Contra Ataques
1843
2213
 
1844
- Sinatra usa [Rack::Protection](https://github.com/sinatra/rack-protection#readme)
2214
+ Sinatra usa [Rack::Protection](https://github.com/sinatra/sinatra/tree/master/rack-protection#readme)
1845
2215
  para defender a tu aplicación de los ataques más comunes. Si por algún motivo,
1846
- querés desactivar esta funcionalidad, podés hacerlo como se indica a
2216
+ quieres desactivar esta funcionalidad, puedes hacerlo como se indica a
1847
2217
  continuación (ten en cuenta que tu aplicación va a quedar expuesta a un
1848
2218
  montón de vulnerabilidades bien conocidas):
1849
2219
 
@@ -1872,22 +2242,22 @@ set :protection, :except => [:path_traversal, :session_hijacking]
1872
2242
  redirecciones relativas, sin embargo, como consecuencia
1873
2243
  de esto, va a dejar de cumplir con el RFC 2616 (HTTP
1874
2244
  1.1), que solamente permite redirecciones absolutas.
1875
-
2245
+ </dd>
2246
+ <dd>
1876
2247
  Activalo si tu apliación está corriendo atrás de un proxy
1877
2248
  reverso que no se ha configurado adecuadamente. Notá que
1878
2249
  el helper <tt>url</tt> va a seguir produciendo URLs absolutas, a
1879
2250
  menos que le pasés <tt>false</tt> como segundo parámetro.
1880
-
1881
- Deshabilitada por defecto.
2251
+ </dd>
2252
+ <dd>Deshabilitada por defecto.</dd>
1882
2253
  </dd>
1883
2254
 
1884
2255
  <dt>add_charset</dt>
1885
2256
  <dd>
1886
2257
  Tipos mime a los que el helper <tt>content_type</tt> les
1887
- añade automáticamente el charset.
1888
-
1889
- En general, no deberías asignar directamente esta opción,
1890
- sino añadirle los charsets que quieras:
2258
+ añade automáticamente el charset. En general, no deberías
2259
+ asignar directamente esta opción, sino añadirle los charsets
2260
+ que quieras:
1891
2261
  <tt>settings.add_charset &lt;&lt; "application/foobar"</tt>
1892
2262
  </dd>
1893
2263
 
@@ -1901,7 +2271,8 @@ set :protection, :except => [:path_traversal, :session_hijacking]
1901
2271
  <dt>bind</dt>
1902
2272
  <dd>
1903
2273
  Dirección IP que utilizará el servidor integrado (por
1904
- defecto: 0.0.0.0).
2274
+ defecto: <tt>0.0.0.0</tt> <em>o</em> <tt>localhost</tt>
2275
+ si su `environment` está configurado para desarrollo).
1905
2276
  </dd>
1906
2277
 
1907
2278
  <dt>default_encoding</dt>
@@ -1931,7 +2302,8 @@ set :protection, :except => [:path_traversal, :session_hijacking]
1931
2302
  <dd>
1932
2303
  Coloca un lock alrededor de cada petición, procesando
1933
2304
  solamente una por proceso.
1934
-
2305
+ </dd>
2306
+ <dd>
1935
2307
  Habilitá esta opción si tu aplicación no es thread-safe.
1936
2308
  Se encuentra deshabilitada por defecto.
1937
2309
  </dd>
@@ -1942,7 +2314,13 @@ set :protection, :except => [:path_traversal, :session_hijacking]
1942
2314
  formularios put/delete en navegadores que no los
1943
2315
  soportan.
1944
2316
  </dd>
1945
-
2317
+
2318
+ <dt>mustermann_opts</dt>
2319
+ <dd>
2320
+ Un hash predeterminado de opciones para pasar a Mustermann.new
2321
+ al compilar las rutas.
2322
+ </dd>
2323
+
1946
2324
  <dt>port</dt>
1947
2325
  <dd>
1948
2326
  Puerto en el que escuchará el servidor integrado.
@@ -1960,16 +2338,8 @@ set :protection, :except => [:path_traversal, :session_hijacking]
1960
2338
 
1961
2339
  <dt>protection</dt>
1962
2340
  <dd>
1963
- Define si deben activarse las protecciones para los
1964
- ataques web más comunes. Para más detalles mirá la
1965
- sección sobre la configuración de protección de ataques
1966
- más arriba.
1967
- </dd>
1968
-
1969
- <dt>public_dir</dt>
1970
- <dd>
1971
- Alias para <tt>public_folder</tt>, que se encuentra a
1972
- continuación.
2341
+ Define si se habilitan o no las protecciones de ataques web.
2342
+ Ver la sección de protección encima.
1973
2343
  </dd>
1974
2344
 
1975
2345
  <dt>public_folder</dt>
@@ -1980,12 +2350,17 @@ set :protection, :except => [:path_traversal, :session_hijacking]
1980
2350
  está presente, se infiere del valor de la opción
1981
2351
  <tt>app_file</tt>.
1982
2352
  </dd>
2353
+
2354
+ <dt>quiet</dt>
2355
+ <dd>
2356
+ Inhabilita los logs generados por los comandos de inicio y detención de Sinatra.
2357
+ <tt> false </tt> por defecto.
2358
+ </dd>
1983
2359
 
1984
2360
  <dt>reload_templates</dt>
1985
2361
  <dd>
1986
- Define si se recargan las plantillas entre peticiones.
1987
-
1988
- Se encuentra activado en el entorno de desarrollo.
2362
+ Define Si se vuelven a cargar plantillas entre las solicitudes o no. Habilitado en
2363
+ modo de desarrollo.
1989
2364
  </dd>
1990
2365
 
1991
2366
  <dt>root</dt>
@@ -2022,6 +2397,11 @@ set :protection, :except => [:path_traversal, :session_hijacking]
2022
2397
  integrado. Por defecto: <tt>['thin', 'mongrel', 'webrick']</tt>,
2023
2398
  el orden establece la prioridad.
2024
2399
  </dd>
2400
+
2401
+ <dt>server_settings</dt>
2402
+ <dd>
2403
+ Si está utilizando un servidor web WEBrick, presumiblemente para su entorno de desarrollo, puede pasar un hash de opciones a <tt> server_settings </tt>, como <tt> SSLEnable </tt> o <tt> SSLVerifyClient </tt>. Sin embargo, los servidores web como Puma y Thin no son compatibles, por lo que puede establecer <tt> server_settings </tt> definiéndolo como un método cuando llame a <tt> configure </tt>.
2404
+ </dd>
2025
2405
 
2026
2406
  <dt>sessions</dt>
2027
2407
  <dd>
@@ -2029,6 +2409,13 @@ set :protection, :except => [:path_traversal, :session_hijacking]
2029
2409
  través de <tt>Rack::Session::Cookie</tt>. Ver la
2030
2410
  sección 'Usando Sesiones' para más información.
2031
2411
  </dd>
2412
+
2413
+ <dt>session_store</dt>
2414
+ <dd>
2415
+ Define el middleware de sesión Rack utilizado. Predeterminado a
2416
+ <tt>Rack::Session::Cookie</tt>. Consulte la sección 'Uso de sesiones' para obtener más información.
2417
+ información.
2418
+ </dd>
2032
2419
 
2033
2420
  <dt>show_exceptions</dt>
2034
2421
  <dd>
@@ -2037,17 +2424,19 @@ set :protection, :except => [:path_traversal, :session_hijacking]
2037
2424
  valor de <tt>environment</tt> es <tt>"development"</tt>.
2038
2425
  En caso contrario estará desactivada.
2039
2426
  </dd>
2427
+ <dd>
2428
+ También se puede establecer en <tt> :after_handler </tt> para activar la aplicación especificada
2429
+ que hara el manejo de errores antes de mostrar un stack trace en el navegador.
2430
+ </dd>
2040
2431
 
2041
2432
  <dt>static</dt>
2042
2433
  <dd>
2043
- Define si Sinatra debe encargarse de servir archivos
2044
- estáticos.
2045
-
2046
- Deshabilitala cuando uses un servidor capaz de
2047
- hacerlo por solo, porque mejorará el
2048
- rendimiento. Se encuentra habilitada por
2049
- defecto en el estilo clásico y desactivado en el
2050
- el modular.
2434
+ <dd> Define si Sinatra debe servir los archivos estáticos. </dd>
2435
+ <dd> Deshabilitar cuando se utiliza un servidor capaz de hacer esto por su cuenta. </dd>
2436
+ <dd> La desactivación aumentará el rendimiento. </dd>
2437
+ <dd>
2438
+ Habilitado por defecto en estilo clásico, deshabilitado para aplicaciones modulares.
2439
+ </dd>
2051
2440
  </dd>
2052
2441
 
2053
2442
  <dt>static_cache_control</dt>
@@ -2060,12 +2449,26 @@ set :protection, :except => [:path_traversal, :session_hijacking]
2060
2449
  utilizar un array cuando se asignan múltiples valores:
2061
2450
  <tt>set :static_cache_control, [:public, :max_age => 300]</tt>.
2062
2451
  </dd>
2452
+
2453
+ <dt>threaded</dt>
2454
+ <dd>
2455
+ Si se establece en <tt> true </tt>, le dirá a Thin que use
2456
+ <tt> EventMachine.defer </tt> para procesar la solicitud.
2457
+ </dd>
2458
+
2459
+ <dt> traps </dt>
2460
+ <dd> Define si Sinatra debería manejar las señales del sistema. </dd>
2063
2461
 
2064
2462
  <dt>views</dt>
2065
2463
  <dd>
2066
2464
  Path del directorio de las vistas. Si no está presente,
2067
2465
  se infiere del valor de la opción <tt>app_file</tt>.
2068
2466
  </dd>
2467
+ <dt>x_cascade</dt>
2468
+ <dd>
2469
+ Establece o no el encabezado de X-Cascade si no hay una coincidencia de ruta.
2470
+ <tt> verdadero </tt> por defecto.
2471
+ </dd>
2069
2472
  </dl>
2070
2473
 
2071
2474
  ## Entornos
@@ -2080,23 +2483,31 @@ de `production` y `test`, donde se cachean.
2080
2483
  especiales que muestran un stack trace en el navegador cuando son disparados.
2081
2484
 
2082
2485
  Para utilizar alguno de los otros entornos puede asignarse el valor
2083
- correspondiente a la variable de entorno `APP_ENV`, o bien utilizar la opción
2084
- `-e` al ejecutar la aplicación:
2085
-
2486
+ correspondiente a la variable de entorno `APP_ENV`:
2086
2487
  ```shell
2087
- ruby mi_app.rb -e <ENTORNO>
2488
+ APP_ENV=production ruby my_app.rb
2088
2489
  ```
2089
2490
 
2090
2491
  Los métodos `development?`, `test?` y `production?` te permiten conocer el
2091
2492
  entorno actual.
2092
2493
 
2494
+ ```ruby
2495
+ get '/' do
2496
+ if settings.development?
2497
+ "development!"
2498
+ else
2499
+ "not development!"
2500
+ end
2501
+ end
2502
+ ```
2503
+
2093
2504
  ## Manejo de Errores
2094
2505
 
2095
2506
  Los manejadores de errores se ejecutan dentro del mismo contexto que las rutas
2096
- y los filtros `before`, lo que significa que podés usar, por ejemplo,
2507
+ y los filtros `before`, lo que significa que puedes usar, por ejemplo,
2097
2508
  `haml`, `erb`, `halt`, etc.
2098
2509
 
2099
- ### No encontrado <em>(Not Found)</em>
2510
+ ### Not Found
2100
2511
 
2101
2512
  Cuando se eleva una excepción `Sinatra::NotFound`, o el código de
2102
2513
  estado de la respuesta es 404, el manejador `not_found` es invocado:
@@ -2135,11 +2546,13 @@ get '/' do
2135
2546
  end
2136
2547
  ```
2137
2548
 
2138
- Obtenés esto:
2549
+ Obtienes esto:
2139
2550
 
2551
+ ```
2140
2552
  Lo que pasó fue... algo malo
2553
+ ```
2141
2554
 
2142
- También, podés instalar un manejador de errores para un código de estado:
2555
+ También, puedes instalar un manejador de errores para un código de estado:
2143
2556
 
2144
2557
  ```ruby
2145
2558
  error 403 do
@@ -2160,7 +2573,8 @@ end
2160
2573
  ```
2161
2574
 
2162
2575
  Sinatra instala manejadores `not_found` y `error` especiales
2163
- cuando se ejecuta dentro del entorno de desarrollo "development".
2576
+ cuando se ejecuta dentro del entorno de desarrollo "development" y se muestran
2577
+ en tu navegador para que tengas información adicional sobre el error.
2164
2578
 
2165
2579
  ## Rack Middleware
2166
2580
 
@@ -2187,7 +2601,7 @@ end
2187
2601
  ```
2188
2602
 
2189
2603
  La semántica de `use` es idéntica a la definida para el DSL
2190
- Rack::Builder[http://www.rubydoc.info/github/rack/rack/master/Rack/Builder] (más
2604
+ [Rack::Builder](http://www.rubydoc.info/github/rack/rack/master/Rack/Builder) (más
2191
2605
  frecuentemente usado en archivos rackup). Por ejemplo, el método `use`
2192
2606
  acepta argumentos múltiples/variables así como bloques:
2193
2607
 
@@ -2202,7 +2616,7 @@ debugging, enrutamiento URL, autenticación y manejo de sesiones. Sinatra
2202
2616
  usa muchos de estos componentes automáticamente de acuerdo a su configuración
2203
2617
  para que usualmente no tengas que usarlas (con `use`) explícitamente.
2204
2618
 
2205
- Podés encontrar middleware útil en
2619
+ Puedes encontrar middleware útil en
2206
2620
  [rack](https://github.com/rack/rack/tree/master/lib/rack),
2207
2621
  [rack-contrib](https://github.com/rack/rack-contrib#readme),
2208
2622
  o en la [Rack wiki](https://github.com/rack/rack/wiki/List-of-Middleware).
@@ -2242,6 +2656,9 @@ class MiAppTest < Minitest::Test
2242
2656
  end
2243
2657
  ```
2244
2658
 
2659
+ Nota: Si está utilizando Sinatra en el estilo modular, reemplace
2660
+ `Sinatra::Application` anterior con el nombre de clase de su aplicación.
2661
+
2245
2662
  ## Sinatra::Base - Middleware, Librerías, y Aplicaciones Modulares
2246
2663
 
2247
2664
  Definir tu aplicación en el nivel superior funciona bien para micro-aplicaciones
@@ -2281,6 +2698,19 @@ aplicaciones top-level se pueden convertir en componentes
2281
2698
  desactivadas por defecto, incluyendo el servidor incorporado. Mirá
2282
2699
  [Opciones y Configuraciones](http://www.sinatrarb.com/configuration.html)
2283
2700
  para detalles sobre las opciones disponibles y su comportamiento.
2701
+ Si quieres un comportamiento más similar
2702
+ a cuando defines tu aplicación en el nivel superior (también conocido como Clásico)
2703
+ estilo), puede subclase `Sinatra::Aplicación`
2704
+
2705
+ ```ruby
2706
+ require 'sinatra/base'
2707
+
2708
+ class MiAplicacion < Sinatra::Application
2709
+ get '/' do
2710
+ 'Hola Mundo!'
2711
+ end
2712
+ end
2713
+ ```
2284
2714
 
2285
2715
  ### Estilo Modular vs. Clásico
2286
2716
 
@@ -2288,7 +2718,7 @@ Contrariamente a la creencia popular, no hay nada de malo con el estilo clásico
2288
2718
  Si se ajusta a tu aplicación, no es necesario que la cambies a una modular.
2289
2719
 
2290
2720
  La desventaja de usar el estilo clásico en lugar del modular consiste en que
2291
- solamente podés tener una aplicación Sinatra por proceso Ruby. Si tenés
2721
+ solamente puedes tener una aplicación Sinatra por proceso Ruby. Si tienes
2292
2722
  planificado usar más, cambiá al estilo modular. Al mismo tiempo, ten en
2293
2723
  cuenta que no hay ninguna razón por la cuál no puedas mezclar los estilos
2294
2724
  clásico y modular.
@@ -2298,45 +2728,52 @@ de ambos estilos:
2298
2728
 
2299
2729
  <table>
2300
2730
  <tr>
2301
- <td>Configuración</td>
2302
- <td>Clásica</td>
2303
- <td>Modular</td>
2731
+ <th>Configuración</th>
2732
+ <th>Clásica</th>
2733
+ <th>Modular</th>
2734
+ <th>Modular</th>
2304
2735
  </tr>
2305
2736
 
2306
2737
  <tr>
2307
2738
  <td>app_file</td>
2308
2739
  <td>archivo que carga sinatra</td>
2309
2740
  <td>archivo con la subclase de Sinatra::Base</td>
2741
+ <td>archivo con la subclase Sinatra::Application</td>
2310
2742
  </tr>
2311
2743
 
2312
2744
  <tr>
2313
2745
  <td>run</td>
2314
2746
  <td>$0 == app_file</td>
2315
2747
  <td>false</td>
2748
+ <td>false</td>
2316
2749
  </tr>
2317
2750
 
2318
2751
  <tr>
2319
2752
  <td>logging</td>
2320
2753
  <td>true</td>
2321
2754
  <td>false</td>
2755
+ <td>true</td>
2322
2756
  </tr>
2323
2757
 
2324
2758
  <tr>
2325
2759
  <td>method_override</td>
2326
2760
  <td>true</td>
2327
2761
  <td>false</td>
2762
+ <td>true</td>
2328
2763
  </tr>
2329
2764
 
2330
2765
  <tr>
2331
2766
  <td>inline_templates</td>
2332
2767
  <td>true</td>
2333
2768
  <td>false</td>
2769
+ <td>true</td>
2334
2770
  </tr>
2335
2771
 
2336
2772
  <tr>
2337
2773
  <td>static</td>
2338
2774
  <td>true</td>
2339
2775
  <td>File.exist?(public_folder)</td>
2776
+ <td>true</td>
2340
2777
  </tr>
2341
2778
  </table>
2342
2779
 
@@ -2399,15 +2836,15 @@ run Sinatra::Application
2399
2836
 
2400
2837
  ### ¿Cuándo usar config.ru?
2401
2838
 
2402
- Indicadores de que probablemente querés usar `config.ru`:
2839
+ Indicadores de que probablemente quieres usar `config.ru`:
2403
2840
 
2404
- * Querés realizar el deploy con un handler Rack distinto (Passenger, Unicorn,
2841
+ * Quieres realizar el deploy con un handler Rack distinto (Passenger, Unicorn,
2405
2842
  Heroku, ...).
2406
- * Querés usar más de una subclase de `Sinatra::Base`.
2407
- * Querés usar Sinatra únicamente para middleware, pero no como un endpoint.
2843
+ * Quieres usar más de una subclase de `Sinatra::Base`.
2844
+ * Quieres usar Sinatra únicamente para middleware, pero no como un endpoint.
2408
2845
 
2409
2846
  <b>No hay necesidad de utilizar un archivo `config.ru` exclusivamente
2410
- porque tenés una aplicación modular, y no necesitás una aplicación modular para
2847
+ porque tienes una aplicación modular, y no necesitás una aplicación modular para
2411
2848
  iniciarla con `config.ru`.</b>
2412
2849
 
2413
2850
  ### Utilizando Sinatra como Middleware
@@ -2452,7 +2889,7 @@ end
2452
2889
 
2453
2890
  Puede que en algunas ocasiones quieras crear nuevas aplicaciones en
2454
2891
  tiempo de ejecución sin tener que asignarlas a una constante. Para
2455
- esto tenés `Sinatra.new`:
2892
+ esto tienes `Sinatra.new`:
2456
2893
 
2457
2894
  ```ruby
2458
2895
  require 'sinatra/base'
@@ -2499,7 +2936,7 @@ run ProyectoRails::Application
2499
2936
 
2500
2937
  ## Ámbitos y Ligaduras
2501
2938
 
2502
- El ámbito en el que te encontrás determina que métodos y variables están
2939
+ El ámbito en el que te encuentras determina que métodos y variables están
2503
2940
  disponibles.
2504
2941
 
2505
2942
  ### Ámbito de Aplicación/Clase
@@ -2507,8 +2944,8 @@ disponibles.
2507
2944
  Cada aplicación Sinatra es una subclase de `Sinatra::Base`. Si estás
2508
2945
  usando el DSL de top-level (`require 'sinatra'`), entonces esta clase es
2509
2946
  `Sinatra::Application`, de otra manera es la subclase que creaste
2510
- explícitamente. Al nivel de la clase tenés métodos como `get` o `before`, pero
2511
- no podés acceder a los objetos `request` o `session`, ya que hay una única
2947
+ explícitamente. Al nivel de la clase tienes métodos como `get` o `before`, pero
2948
+ no puedes acceder a los objetos `request` o `session`, ya que hay una única
2512
2949
  clase de la aplicación para todas las peticiones.
2513
2950
 
2514
2951
  Las opciones creadas utilizando `set` son métodos al nivel de la clase:
@@ -2525,12 +2962,13 @@ class MiApp < Sinatra::Base
2525
2962
  end
2526
2963
  ```
2527
2964
 
2528
- Tenés la ligadura al ámbito de la aplicación dentro de:
2965
+ Tienes la ligadura al ámbito de la aplicación dentro de:
2529
2966
 
2530
2967
  * El cuerpo de la clase de tu aplicación
2531
2968
  * Métodos definidos por extensiones
2532
2969
  * El bloque pasado a `helpers`
2533
2970
  * Procs/bloques usados como el valor para `set`
2971
+ * El bloque pasado a `Sinatra.new`
2534
2972
 
2535
2973
  Este ámbito puede alcanzarse de las siguientes maneras:
2536
2974
 
@@ -2541,8 +2979,8 @@ Este ámbito puede alcanzarse de las siguientes maneras:
2541
2979
 
2542
2980
  Para cada petición entrante, una nueva instancia de la clase de tu aplicación
2543
2981
  es creada y todos los bloques de rutas son ejecutados en ese ámbito. Desde este
2544
- ámbito podés acceder a los objetos `request` y `session` o llamar a los métodos
2545
- de renderización como `erb` o `haml`. Podés acceder al ámbito de la aplicación
2982
+ ámbito puedes acceder a los objetos `request` y `session` o llamar a los métodos
2983
+ de renderización como `erb` o `haml`. Puedes acceder al ámbito de la aplicación
2546
2984
  desde el ámbito de la petición utilizando `settings`:
2547
2985
 
2548
2986
  ```ruby
@@ -2562,23 +3000,23 @@ class MiApp < Sinatra::Base
2562
3000
  end
2563
3001
  ```
2564
3002
 
2565
- Tenés la ligadura al ámbito de la petición dentro de:
3003
+ Tienes la ligadura al ámbito de la petición dentro de:
2566
3004
 
2567
- * bloques pasados a get/head/post/put/delete/options
3005
+ * bloques pasados a get, head, post, put, delete, options, patch, link y unlink
2568
3006
  * filtros before/after
2569
- * métodos ayudantes
3007
+ * métodos helpers
2570
3008
  * plantillas/vistas
2571
3009
 
2572
3010
  ### Ámbito de Delegación
2573
3011
 
2574
3012
  El ámbito de delegación solo reenvía métodos al ámbito de clase. De cualquier
2575
- manera, no se comporta 100% como el ámbito de clase porque no tenés la ligadura
3013
+ manera, no se comporta 100% como el ámbito de clase porque no tienes la ligadura
2576
3014
  de la clase: únicamente métodos marcados explícitamente para delegación están
2577
3015
  disponibles y no compartís variables/estado con el ámbito de clase (léase:
2578
- tenés un `self` diferente). Podés agregar delegaciones de método llamando a
3016
+ tienes un `self` diferente). Puedes agregar delegaciones de método llamando a
2579
3017
  `Sinatra::Delegator.delegate :nombre_del_metodo`.
2580
3018
 
2581
- Tenés la ligadura al ámbito de delegación dentro de:
3019
+ Tienes és la ligadura al ámbito de delegación dentro de:
2582
3020
 
2583
3021
  * La ligadura del top-level, si hiciste `require "sinatra"`
2584
3022
  * Un objeto extendido con el mixin `Sinatra::Delegator`
@@ -2592,7 +3030,7 @@ que [extiende el objeto main](https://github.com/sinatra/sinatra/blob/ca06364/li
2592
3030
  Las aplicaciones Sinatra pueden ser ejecutadas directamente:
2593
3031
 
2594
3032
  ```shell
2595
- ruby miapp.rb [-h] [-x] [-e ENTORNO] [-p PUERTO] [-o HOST] [-s MANEJADOR]
3033
+ ruby myapp.rb [-h] [-x] [-q] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
2596
3034
  ```
2597
3035
 
2598
3036
  Las opciones son:
@@ -2603,12 +3041,13 @@ Las opciones son:
2603
3041
  -o # asigna el host (0.0.0.0 es usado por defecto)
2604
3042
  -e # asigna el entorno (development es usado por defecto)
2605
3043
  -s # especifica el servidor/manejador rack (thin es usado por defecto)
3044
+ -q # activar el modo silecioso para el servidor (está desactivado por defecto)
2606
3045
  -x # activa el mutex lock (está desactivado por defecto)
2607
3046
  ```
2608
3047
 
2609
3048
  ### Multi-threading
2610
3049
 
2611
- _Basado en [esta respuesta en StackOverflow][so-answer] escrita por Konstantin_
3050
+ _Basado en [esta respuesta en StackOverflow](http://stackoverflow.com/questions/6278817/is-sinatra-multi-threaded/6282999#6282999) escrita por Konstantin_
2612
3051
 
2613
3052
  Sinatra no impone ningún modelo de concurrencia, sino que lo deja en manos del
2614
3053
  handler Rack que se esté usando (Thin, Puma, WEBrick). Sinatra en sí mismo es
@@ -2639,58 +3078,33 @@ Para arrancar el servidor, el comando sería:
2639
3078
  thin --threaded start
2640
3079
  ```
2641
3080
 
2642
- [so-answer]: http://stackoverflow.com/questions/6278817/is-sinatra-multi-threaded/6282999#6282999)
2643
-
2644
- ## Versiones de Ruby Soportadas
3081
+ ## Requerimientos
2645
3082
 
2646
3083
  Las siguientes versiones de Ruby son soportadas oficialmente:
2647
3084
 
2648
3085
  <dl>
2649
- <dt>Ruby 1.8.7</dt>
2650
- <dd>
2651
- 1.8.7 es soportado completamente. Sin embargo, si no hay nada que te lo
2652
- prohiba, te recomendamos que uses 1.9.2 o cambies a JRuby o Rubinius. No se
2653
- dejará de dar soporte a 1.8.7 hasta Sinatra 2.0 y Ruby 2.0, aunque si se
2654
- libera la versión 1.8.8 de Ruby las cosas podrían llegar a cambiar. Sin
2655
- embargo, que eso ocurra es muy poco probable, e incluso el caso de que lo
2656
- haga, puede que se siga dando soporte a 1.8.7. <b>Hemos dejado de soportar
2657
- Ruby 1.8.6.</b> Si querés ejecutar Sinatra sobre 1.8.6, podés utilizar la
2658
- versión 1.2, pero ten en cuenta que una vez que Sinatra 1.4.0 sea liberado,
2659
- ya no se corregirán errores por más que se reciban reportes de los mismos.
2660
- </dd>
2661
-
2662
- <dt>Ruby 1.9.2</dt>
2663
- <dd>
2664
- 1.9.2 es soportado y recomendado. No uses 1.9.2p0, porque se producen fallos
2665
- de segmentación cuando se ejecuta Sinatra. El soporte se mantendrá al menos
2666
- hasta que se libere la versión 1.9.4/2.0 de Ruby. El soporte para la última
2667
- versión de la serie 1.9 se mantendrá mientras lo haga el equipo principal de Ruby.
2668
- </dd>
2669
-
2670
- <dt>Ruby 1.9.3</dt>
2671
- <dd>
2672
- 1.9.3 es soportado y recomendado. Ten en cuenta que el cambio a 1.9.3 desde
2673
- una versión anterior va a invalidar todas las sesiones.
2674
- </dd>
3086
+ <dt>Ruby 2.2</dt>
3087
+ <dd>
3088
+ 2.2 Es totalmente compatible y recomendado. Actualmente no hay planes
3089
+ soltar el apoyo oficial para ello.
3090
+ </dd>
2675
3091
 
2676
3092
  <dt>Rubinius</dt>
2677
3093
  <dd>
2678
- Rubinius es soportado oficialmente (Rubinius >= 1.2.4). Todo funciona
2679
- correctamente, incluyendo los lenguajes de plantillas. La próxima versión,
2680
- 2.0, también es soportada, incluyendo el modo 1.9.
3094
+ Rubinius es oficialmente compatible (Rubinius> = 2.x). Se recomienda instalar la gema puma
3095
+ <tt>gem install puma</tt>.
2681
3096
  </dd>
2682
3097
 
2683
3098
  <dt>JRuby</dt>
2684
3099
  <dd>
2685
- JRuby es soportado oficialmente (JRuby >= 1.6.7). No se conocen problemas
2686
- con librerías de plantillas de terceras partes. Sin embargo, si elegís usar
2687
- JRuby, deberías examinar sus Rack handlers porque el servidor web Thin no es
2688
- soportado completamente. El soporte de JRuby para extensiones C se encuentra
2689
- en una etapa experimental, sin embargo, de momento, solamente RDiscount,
2690
- Redcarpet, RedCloth y Yajl, así como Thin y Mongrel se ven afectadas.
3100
+ La última versión estable de JRuby es oficialmente compatible. No lo es
3101
+ recomienda usar extensiones C con JRuby. Se recomienda instalar la gema trinidad
3102
+ <tt> gem install trinidad </tt>.
2691
3103
  </dd>
2692
3104
  </dl>
2693
3105
 
3106
+ Las versiones de Ruby anteriores a 2.2.2 ya no son compatibles con Sinatra 2.0 .
3107
+
2694
3108
  Siempre le prestamos atención a las nuevas versiones de Ruby.
2695
3109
 
2696
3110
  Las siguientes implementaciones de Ruby no se encuentran soportadas
@@ -2705,23 +3119,24 @@ No ser soportada oficialmente, significa que si las cosas se rompen
2705
3119
  ahí y no en una plataforma soportada, asumimos que no es nuestro problema sino
2706
3120
  el suyo.
2707
3121
 
2708
- Nuestro servidor CI también se ejecuta sobre ruby-head (que será la próxima
2709
- versión 2.1.0) y la rama 1.9.4. Como están en movimiento constante, no podemos
2710
- garantizar nada. De todas formas, podés contar con que tanto 1.9.4-p0 como
2711
- 2.1.0-p0 sea soportadas.
3122
+ También ejecutamos nuestro CI contra ruby-head (futuras versiones de MRI), pero
3123
+ no puede garantizar nada, ya que se mueve constantemente. Esperar próxima
3124
+ 2.x versiones para ser totalmente compatibles.
3125
+
3126
+ Sinatra debería trabajar en cualquier sistema operativo compatible la implementación de Ruby
3127
+ elegida
2712
3128
 
2713
- Sinatra debería funcionar en cualquier sistema operativo soportado por la
2714
- implementación de Ruby elegida.
3129
+ Si ejecuta MacRuby, debe `gem install control_tower`.
2715
3130
 
2716
- En este momento, no vas a poder ejecutar Sinatra en Cardinal, SmallRuby,
2717
- BlueRuby o cualquier versión de Ruby anterior a 1.8.7.
3131
+ Sinatra actualmente no funciona con Cardinal, SmallRuby, BlueRuby o cualquier
3132
+ versión de Ruby anterior a 2.2.
2718
3133
 
2719
3134
  ## A la Vanguardia
2720
3135
 
2721
- Si querés usar el código de Sinatra más reciente, sentite libre de ejecutar
3136
+ Si quieres usar el código de Sinatra más reciente, sientete libre de ejecutar
2722
3137
  tu aplicación sobre la rama master, en general es bastante estable.
2723
3138
 
2724
- También liberamos prereleases de vez en cuando, así, podés hacer:
3139
+ También liberamos prereleases de vez en cuando, así, puedes hacer:
2725
3140
 
2726
3141
  ```shell
2727
3142
  gem install sinatra --pre
@@ -2729,12 +3144,12 @@ gem install sinatra --pre
2729
3144
 
2730
3145
  Para obtener algunas de las últimas características.
2731
3146
 
2732
- ### Con Bundler
3147
+ ### Usando Bundler
2733
3148
 
2734
3149
  Esta es la manera recomendada para ejecutar tu aplicación sobre la última
2735
3150
  versión de Sinatra usando [Bundler](http://bundler.io).
2736
3151
 
2737
- Primero, instalá Bundler si no lo hiciste todavía:
3152
+ Primero, instala Bundler si no lo hiciste todavía:
2738
3153
 
2739
3154
  ```shell
2740
3155
  gem install bundler
@@ -2748,54 +3163,18 @@ gem 'sinatra', :git => "git://github.com/sinatra/sinatra.git"
2748
3163
 
2749
3164
  # otras dependencias
2750
3165
  gem 'haml' # por ejemplo, si usás haml
2751
- gem 'activerecord', '~> 3.0' # quizás también necesités ActiveRecord 3.x
2752
3166
  ```
2753
3167
 
2754
- Tené en cuenta que tenés que listar todas las dependencias directas de tu
3168
+ Ten en cuenta que tienes que listar todas las dependencias directas de tu
2755
3169
  aplicación. No es necesario listar las dependencias de Sinatra (Rack y Tilt)
2756
3170
  porque Bundler las agrega directamente.
2757
3171
 
2758
- Ahora podés arrancar tu aplicación así:
3172
+ Ahora puedes arrancar tu aplicación así:
2759
3173
 
2760
3174
  ```shell
2761
3175
  bundle exec ruby miapp.rb
2762
3176
  ```
2763
3177
 
2764
- ### Con Git
2765
-
2766
- Cloná el repositorio localmente y ejecutá tu aplicación, asegurándote que el
2767
- directorio `sinatra/lib` esté en el `$LOAD_PATH`:
2768
-
2769
- ```shell
2770
- cd miapp
2771
- git clone git://github.com/sinatra/sinatra.git
2772
- ruby -Isinatra/lib miapp.rb
2773
- ```
2774
-
2775
- Para actualizar el código fuente de Sinatra en el futuro:
2776
-
2777
- ```shell
2778
- cd miapp/sinatra
2779
- git pull
2780
- ```
2781
-
2782
- ### Instalación Global
2783
-
2784
- Podés construir la gem vos mismo:
2785
-
2786
- ```shell
2787
- git clone git://github.com/sinatra/sinatra.git
2788
- cd sinatra
2789
- rake sinatra.gemspec
2790
- rake install
2791
- ```
2792
-
2793
- Si instalás tus gems como root, el último paso debería ser
2794
-
2795
- ```shell
2796
- sudo rake install
2797
- ```
2798
-
2799
3178
  ## Versionado
2800
3179
 
2801
3180
  Sinatra utiliza el [Versionado Semántico](http://semver.org/),
@@ -2806,11 +3185,13 @@ siguiendo las especificaciones SemVer y SemVerTag.
2806
3185
  * [Sito web del proyecto](http://www.sinatrarb.com/) - Documentación
2807
3186
  adicional, noticias, y enlaces a otros recursos.
2808
3187
  * [Contribuyendo](http://www.sinatrarb.com/contributing) - ¿Encontraste un
2809
- error?. ¿Necesitás ayuda?. ¿Tenés un parche?.
3188
+ error?. ¿Necesitas ayuda?. ¿Tienes un parche?.
2810
3189
  * [Seguimiento de problemas](https://github.com/sinatra/sinatra/issues)
2811
3190
  * [Twitter](https://twitter.com/sinatra)
2812
3191
  * [Lista de Correo](http://groups.google.com/group/sinatrarb/topics)
2813
3192
  * [IRC: #sinatra](irc://chat.freenode.net/#sinatra) en http://freenode.net
3193
+ * [Sinatra & Friends](https://sinatrarb.slack.com) en Slack y revisa
3194
+ [acá](https://sinatra-slack.herokuapp.com/) Para una invitación.
2814
3195
  * [Sinatra Book](https://github.com/sinatra/sinatra-book/) Tutorial (en inglés).
2815
3196
  * [Sinatra Recipes](http://recipes.sinatrarb.com/) Recetas contribuidas
2816
3197
  por la comunidad (en inglés).