sinatra 1.3.0.d → 1.3.0.e

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

Potentially problematic release.


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

Files changed (53) hide show
  1. data/.gitignore +6 -0
  2. data/.yardopts +4 -0
  3. data/CHANGES +80 -3
  4. data/Gemfile +18 -12
  5. data/README.de.rdoc +189 -381
  6. data/README.es.rdoc +193 -316
  7. data/README.fr.rdoc +327 -475
  8. data/README.jp.rdoc +7 -1
  9. data/README.rdoc +132 -101
  10. data/README.ru.rdoc +3 -3
  11. data/README.zh.rdoc +2 -2
  12. data/Rakefile +19 -27
  13. data/lib/sinatra/base.rb +186 -262
  14. data/lib/sinatra/version.rb +3 -0
  15. data/sinatra.gemspec +12 -128
  16. data/test/base_test.rb +1 -1
  17. data/test/builder_test.rb +1 -1
  18. data/test/coffee_test.rb +1 -1
  19. data/test/creole_test.rb +1 -1
  20. data/test/delegator_test.rb +9 -7
  21. data/test/encoding_test.rb +1 -1
  22. data/test/erb_test.rb +1 -1
  23. data/test/extensions_test.rb +1 -1
  24. data/test/filter_test.rb +7 -4
  25. data/test/haml_test.rb +1 -1
  26. data/test/helper.rb +16 -1
  27. data/test/helpers_test.rb +12 -1
  28. data/test/less_test.rb +1 -1
  29. data/test/liquid_test.rb +1 -1
  30. data/test/mapped_error_test.rb +44 -1
  31. data/test/markaby_test.rb +1 -1
  32. data/test/markdown_test.rb +1 -1
  33. data/test/middleware_test.rb +1 -1
  34. data/test/nokogiri_test.rb +1 -1
  35. data/test/radius_test.rb +1 -1
  36. data/test/rdoc_test.rb +2 -2
  37. data/test/readme_test.rb +136 -0
  38. data/test/request_test.rb +1 -1
  39. data/test/response_test.rb +13 -3
  40. data/test/result_test.rb +3 -3
  41. data/test/route_added_hook_test.rb +1 -1
  42. data/test/routing_test.rb +9 -2
  43. data/test/sass_test.rb +1 -1
  44. data/test/scss_test.rb +1 -1
  45. data/test/server_test.rb +1 -1
  46. data/test/settings_test.rb +55 -22
  47. data/test/sinatra_test.rb +1 -1
  48. data/test/slim_test.rb +1 -1
  49. data/test/static_test.rb +22 -1
  50. data/test/templates_test.rb +1 -1
  51. data/test/textile_test.rb +1 -1
  52. metadata +47 -59
  53. data/lib/sinatra/rack.rb +0 -44
@@ -82,6 +82,12 @@ accesibles a través del arreglo <tt>params[:splat]</tt>:
82
82
  params[:splat] # => ["path/al/archivo", "xml"]
83
83
  end
84
84
 
85
+ O, con parámetros de bloque:
86
+
87
+ get '/descargar/*.*' do |path, ext|
88
+ [path, ext] # => ["path/al/archivo", "xml"]
89
+ end
90
+
85
91
  Rutas con Expresiones Regulares:
86
92
 
87
93
  get %r{/hola/([\w]+)} do
@@ -213,199 +219,174 @@ ejemplo, el archivo <tt>./public/css/style.css</tt> se accede a través de
213
219
 
214
220
  == Vistas / Plantillas
215
221
 
216
- Se asume que las plantillas están ubicadas directamente bajo el directorio
217
- <tt>./views</tt>. Para usar un directorio de vistas diferente:
218
-
219
- set :views, File.dirname(__FILE__) + '/plantillas'
220
-
221
- Es importante acordarse que siempre tenés que referenciar a las plantillas con
222
- símbolos, incluso cuando se encuentran en un subdirectorio (en este caso tenés
223
- que usar <tt>:'subdir/plantilla'</tt>). Tenés que usar un símbolo porque los
224
- métodos de renderización van a renderizar directamente cualquier string que se
225
- les pase como argumento.
226
-
227
- === Plantillas Haml
228
-
229
- La gem/librería <tt>haml</tt> es necesaria para para renderizar plantillas HAML:
230
-
231
- # Vas a necesitar requerir haml en tu app
232
- require 'haml'
222
+ Cada lenguaje de plantilla se expone a través de un método de renderizado que
223
+ lleva su nombre. Estos métodos simplemente devuelven un string:
233
224
 
234
225
  get '/' do
235
- haml :index
226
+ erb :index
236
227
  end
237
228
 
238
- Renderiza <tt>./views/index.haml</tt>.
239
-
240
- Las {opciones de Haml}[http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#options]
241
- pueden ser ajustadas globalmente a través de las configuraciones de Sinatra,
242
- ver {Opciones y Configuraciones}[http://www.sinatrarb.com/configuration.html],
243
- y reemplazadas individualmente.
229
+ Renderiza <tt>views/index.erb</tt>.
244
230
 
245
- set :haml, :format => :html5 # el formato por defecto de Haml es :xhtml
231
+ En lugar del nombre de la plantilla podés proporcionar directamente el
232
+ contenido de la misma:
246
233
 
247
234
  get '/' do
248
- haml :index, :format => :html4 # reemplazado
235
+ codigo = "<%= Time.now %>"
236
+ erb codigo
249
237
  end
250
238
 
251
- === Plantillas Erb
252
-
253
- # Vas a necesitar requerir erb en tu app
254
- require 'erb'
239
+ Los métodos de renderizado, aceptan además un segundo argumento, el hash de
240
+ opciones:
255
241
 
256
242
  get '/' do
257
- erb :index
243
+ erb :index, :layout => :post
258
244
  end
259
245
 
260
- Renderiza <tt>./views/index.erb</tt>
261
-
262
- === Plantillas Erubis
263
-
264
- La gem/librería <tt>erubis</tt> es necesaria para renderizar plantillas Erubis:
246
+ Renderiza <tt>views/index.erb</tt> embebido en <tt>views/post.erb</tt> (por
247
+ defecto, la plantilla :index es embebida en <tt>views/layout.erb</tt> siempre y
248
+ cuando este último archivo exista).
265
249
 
266
- # Vas a necesitar requerir erubis en tu app
267
- require 'erubis'
250
+ Cualquier opción que Sinatra no entienda le será pasada al motor de renderizado
251
+ de la plantilla:
268
252
 
269
253
  get '/' do
270
- erubis :index
254
+ haml :index, :format => :html5
271
255
  end
272
256
 
273
- Renderiza <tt>./views/index.erubis</tt>.
257
+ Además podés definir las opciones para un lenguaje de plantillas de forma
258
+ general:
274
259
 
275
- También es posible reemplazar Erb con Erubis:
276
-
277
- require 'erubis'
278
- Tilt.register :erb, Tilt[:erubis]
260
+ set :haml, :format => :html5
279
261
 
280
262
  get '/' do
281
- erb :index
263
+ haml :index
282
264
  end
283
265
 
284
- Renderiza <tt>./views/index.erb</tt> con Erubis.
285
-
286
- === Plantillas Builder
266
+ Las opciones pasadas al método de renderizado tienen precedencia sobre las
267
+ definidas mediante +set+.
287
268
 
288
- La gem/librería <tt>builder</tt> es necesaria para renderizar plantillas
289
- builder:
269
+ Opciones disponibles:
290
270
 
291
- # Vas a necesitar requerir builder en tu app
292
- require 'builder'
271
+ [locals]
272
+ Lista de variables locales pasadas al documento. Resultan muy útiles cuando
273
+ se combinan con parciales.
274
+ Ejemplo: <tt>erb "<%= foo %>", :locals => {:foo => "bar"}</tt>
293
275
 
294
- get '/' do
295
- builder :index
296
- end
276
+ [default_encoding]
277
+ Encoding utilizado cuando el de un string es dudoso. Por defecto toma el
278
+ valor de <tt>settings.default_encoding</tt>.
297
279
 
298
- Renderiza <tt>./views/index.builder</tt>.
280
+ [views]
281
+ Directorio desde donde se cargan las vistas. Por defecto toma el valor de
282
+ <tt>settings.views</tt>.
299
283
 
300
- === Plantillas Nokogiri
284
+ [layout]
285
+ Si es +true+ o +false+ indica que se debe usar, o nó, un layout,
286
+ respectivamente. También puede ser un símbolo que especifique qué plantilla
287
+ usar. Ejemplo: <tt>erb :index, :layout => !request.xhr?</tt>
301
288
 
302
- La gem/librería <tt>nokogiri</tt> es necesaria para renderizar plantillas
303
- nokogiri:
289
+ [content_type]
290
+ Content-Type que produce la plantilla. El valor por defecto depende de cada
291
+ lenguaje de plantillas.
304
292
 
305
- # Vas a necesitar requerir nokogiri en tu app
306
- require 'nokogiri'
293
+ [scope]
294
+ Ámbito en el que se renderiza la plantilla. Por defecto utiliza la instancia
295
+ de la aplicación. Tené en cuenta que si cambiás esta opción las variables de
296
+ instancia y los helpers van a dejar de estar disponibles.
307
297
 
308
- get '/' do
309
- nokogiri :index
310
- end
298
+ [layout_engine]
299
+ Motor de renderizado de plantillas que usa para el layout. Resulta
300
+ conveniente para lenguajes que no soportan layouts. Por defecto toma el valor
301
+ del motor usado para renderizar la plantilla.
302
+ Ejemplo: <tt>set :rdoc, :layout_engine => :erb</tt>
311
303
 
312
- Renderiza <tt>./views/index.nokogiri</tt>.
304
+ Se asume que las plantillas están ubicadas directamente bajo el directorio
305
+ <tt>./views</tt>. Para usar un directorio de vistas diferente:
313
306
 
314
- === Plantillas Sass
307
+ set :views, settings.root + '/plantillas'
315
308
 
316
- La gem/librería <tt>haml</tt> o <tt>sass</tt> es necesaria para renderizar
317
- plantillas Sass:
309
+ Es importante acordarse que siempre tenés que referenciar a las plantillas con
310
+ símbolos, incluso cuando se encuentran en un subdirectorio (en este caso tenés
311
+ que usar <tt>:'subdir/plantilla'</tt>). Tenés que usar un símbolo porque los
312
+ métodos de renderización van a renderizar directamente cualquier string que se
313
+ les pase como argumento.
318
314
 
319
- # Vas a necesitar requerir haml o sass en tu app
320
- require 'sass'
315
+ === Lenguajes de Plantillas Disponibles
321
316
 
322
- get '/stylesheet.css' do
323
- sass :stylesheet
324
- end
317
+ Algunos lenguajes tienen varias implementaciones. Para especificar que
318
+ implementación usar (y para ser thread-safe), deberías requerirla antes de
319
+ usarla:
325
320
 
326
- Renderiza <tt>./views/stylesheet.sass</tt>.
321
+ require 'rdiscount' # o require 'bluecloth'
322
+ get('/') { markdown :index }
327
323
 
328
- Las {opciones de Sass}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
329
- pueden ser ajustadas globalmente a través de las configuraciones de Sinatra,
330
- ver {Opciones y Configuraciones}[http://www.sinatrarb.com/configuration.html],
331
- y reemplazadas individualmente.
324
+ === Plantillas Haml
332
325
 
333
- set :sass, :style => :compact # el estilo por defecto de Sass es :nested
326
+ Dependencias:: {haml}[http://haml-lang.com/]
327
+ Extensiones de Archivo:: <tt>.haml</tt>
328
+ Ejemplo:: <tt>haml :index, :format => :html5</tt>
334
329
 
335
- get '/stylesheet.css' do
336
- sass :stylesheet, :style => :expanded # reemplazado
337
- end
330
+ === Plantillas Erb
338
331
 
339
- === Plantillas Scss
332
+ Dependencias:: {erubis}[http://www.kuwata-lab.com/erubis/] o
333
+ erb (incluida en Ruby)
334
+ Extensiones de Archivo:: <tt>.erb</tt>, <tt>.rhtml</tt> o <tt>.erubis</tt>
335
+ (solamente con Erubis)
336
+ Ejemplo:: <tt>erb :index</tt>
340
337
 
341
- La gem/librería <tt>haml</tt> o <tt>sass</tt>es necesaria para renderizar
342
- plantillas Scss:
338
+ === Plantillas Builder
343
339
 
344
- # Vas a necesitar requerir haml o sass en tu app
345
- require 'sass'
340
+ Dependencias:: {builder}[http://builder.rubyforge.org/]
341
+ Extensiones de Archivo:: <tt>.builder</tt>
342
+ Ejemplo:: <tt>builder { |xml| xml.em "hola" }</tt>
346
343
 
347
- get '/stylesheet.css' do
348
- scss :stylesheet
349
- end
344
+ Además, acepta un bloque con la definición de la plantilla (ver el ejemplo).
350
345
 
351
- Renderiza <tt>./views/stylesheet.scss</tt>.
346
+ === Plantillas Nokogiri
352
347
 
353
- Las {opciones de Scss}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
354
- pueden ser ajustadas globalmente a través de las configuraciones de Sinatra,
355
- ver {Opciones y Configuraciones}[http://www.sinatrarb.com/configuration.html],
356
- y reemplazadas individualmente.
348
+ Dependencias:: {nokogiri}[http://nokogiri.org/]
349
+ Extensiones de Archivo:: <tt>.nokogiri</tt>
350
+ Ejemplo:: <tt>nokogiri { |xml| xml.em "hola" }</tt>
357
351
 
358
- set :scss, :style => :compact # el estilo por defecto de Sass es :nested
352
+ Además, acepta un bloque con la definición de la plantilla (ver el ejemplo).
359
353
 
360
- get '/stylesheet.css' do
361
- scss :stylesheet, :style => :expanded # reemplazado
362
- end
354
+ === Plantillas Sass
363
355
 
364
- === Plantillas Less
356
+ Dependencias:: {sass}[http://sass-lang.com/]
357
+ Extensiones de Archivo:: <tt>.sass</tt>
358
+ Ejemplo:: <tt>sass :stylesheet, :style => :expanded</tt>
365
359
 
366
- La gem/librería <tt>less</tt> es necesaria para renderizar plantillas Less:
360
+ === Plantillas SCSS
367
361
 
368
- # Vas a necesitar requerir less en tu app
369
- require 'less'
362
+ Dependencias:: {scss}[http://sass-lang.com/]
363
+ Extensiones de Archivo:: <tt>.scss</tt>
364
+ Ejemplo:: <tt>scss :stylesheet, :style => :expanded</tt>
370
365
 
371
- get '/stylesheet.css' do
372
- less :stylesheet
373
- end
366
+ === Plantillas Less
374
367
 
375
- Renderiza <tt>./views/stylesheet.less</tt>.
368
+ Dependencias:: {less}[http://www.lesscss.org/]
369
+ Extensiones de Archivo:: <tt>.less</tt>
370
+ Ejemplo:: <tt>less :stylesheet</tt>
376
371
 
377
372
  === Plantillas Liquid
378
373
 
379
- La gem/librería <tt>liquid</tt> es necesaria para renderizar plantillas Liquid:
374
+ Dependencias:: {liquid}[http://www.liquidmarkup.org/]
375
+ Extensiones de Archivo:: <tt>.liquid</tt>
376
+ Ejemplo:: <tt>liquid :index, :locals => { :clave => 'valor' }</tt>
380
377
 
381
- # Vas a necesitar requerir liquid en tu app
382
- require 'liquid'
383
-
384
- get '/' do
385
- liquid :index
386
- end
387
-
388
- Renderiza <tt>./views/index.liquid</tt>.
389
-
390
- Como no vas a poder llamar a métodos de Ruby (excepto a +yield+) desde una
391
- plantilla Liquid, casi siempre vas a querer pasarle locales:
392
-
393
- liquid :index, :locals => { :clave => 'valor' }
378
+ Como no vas a poder llamar a métodos de Ruby (excepto por +yield+) desde una
379
+ plantilla Liquid, casi siempre vas a querer pasarle locales.
394
380
 
395
381
  === Plantillas Markdown
396
382
 
397
- La gem/librería <tt>rdiscount</tt> es necesaria para renderizar plantillas
398
- Markdown:
399
-
400
- # Vas a necesitar requerir rdiscount en tu app
401
- require "rdiscount"
402
-
403
- get '/' do
404
- markdown :index
405
- end
406
-
407
- Renderiza <tt>./views/index.markdown</tt> (+md+ y +mkd+ también son extensiones
408
- de archivo válidas).
383
+ Dependencias:: {rdiscount}[https://github.com/rtomayko/rdiscount],
384
+ {redcarpet}[https://github.com/tanoku/redcarpet],
385
+ {bluecloth}[http://deveiate.org/projects/BlueCloth],
386
+ {kramdown}[http://kramdown.rubyforge.org/] *o*
387
+ {maruku}[http://maruku.rubyforge.org/]
388
+ Extensiones de Archivo:: <tt>.markdown</tt>, <tt>.mkd</tt> y <tt>.md</tt>
389
+ Ejemplo:: <tt>markdown :index, :layout_engine => :erb</tt>
409
390
 
410
391
  No es posible llamar métodos desde markdown, ni pasarle locales. Por lo tanto,
411
392
  generalmente vas a usarlo en combinación con otro motor de renderizado:
@@ -420,52 +401,13 @@ plantillas:
420
401
 
421
402
  Como no podés utilizar Ruby desde Markdown, no podés usar layouts escritos en
422
403
  Markdown. De todos modos, es posible usar un motor de renderizado para el
423
- layout distinto al de la plantilla pasando la opción <tt>:layout_engine</tt>:
424
-
425
- get '/' do
426
- markdown :index, :layout_engine => :erb
427
- end
428
-
429
- Renderiza <tt>./views/index.md</tt> con el layout <tt>./views/layout.erb</tt>.
430
-
431
- Recordá que podés asignar las opciones de renderizado globalmente:
432
-
433
- set :markdown, :layout_engine => :haml, :layout => :post
434
-
435
- get '/' do
436
- markdown :index
437
- end
438
-
439
- Renderiza <tt>./views/index.md</tt> (o cualquier otra plantilla Markdown) con
440
- el layout <tt>./views/post.haml</tt>.
441
-
442
- También es posible parsear Markdown con BlueCloth en lugar de RDiscount:
443
-
444
- require 'bluecloth'
445
-
446
- Tilt.register 'markdown', BlueClothTemplate
447
- Tilt.register 'mkd', BlueClothTemplate
448
- Tilt.register 'md', BlueClothTemplate
449
-
450
- get '/' do
451
- markdown :index
452
- end
453
-
454
- Renderiza <tt>./views/index.md</tt> con BlueCloth.
404
+ layout distinto al de la plantilla pasando la opción <tt>:layout_engine</tt>.
455
405
 
456
406
  === Plantillas Textile
457
407
 
458
- La gem/librería <tt>RedCloth</tt> es necesaria para renderizar plantillas
459
- Textile:
460
-
461
- # Vas a necesitar requerir redcloth en tu app
462
- require "redcloth"
463
-
464
- get '/' do
465
- textile :index
466
- end
467
-
468
- Renderiza <tt>./views/index.textile</tt>.
408
+ Dependencias:: {RedCloth}[http://redcloth.org/]
409
+ Extensiones de Archivo:: <tt>.textile</tt>
410
+ Ejemplo:: <tt>textile :index, :layout_engine => :erb</tt>
469
411
 
470
412
  No es posible llamar métodos desde textile, ni pasarle locales. Por lo tanto,
471
413
  generalmente vas a usarlo en combinación con otro motor de renderizado:
@@ -480,38 +422,13 @@ plantillas:
480
422
 
481
423
  Como no podés utilizar Ruby desde Textile, no podés usar layouts escritos en
482
424
  Textile. De todos modos, es posible usar un motor de renderizado para el
483
- layout distinto al de la plantilla pasando la opción <tt>:layout_engine</tt>:
484
-
485
- get '/' do
486
- textile :index, :layout_engine => :erb
487
- end
488
-
489
- Renderiza <tt>./views/index.textile</tt> con el layout
490
- <tt>./views/layout.erb</tt>.
491
-
492
- Recordá que podés asignar las opciones de renderizado globalmente:
493
-
494
- set :textile, :layout_engine => :haml, :layout => :post
495
-
496
- get '/' do
497
- textile :index
498
- end
499
-
500
- Renderiza <tt>./views/index.textile</tt> (o cualquier otra plantilla Textile)
501
- con el layout <tt>./views/post.haml</tt>.
425
+ layout distinto al de la plantilla pasando la opción <tt>:layout_engine</tt>.
502
426
 
503
427
  === Plantillas RDoc
504
428
 
505
- La gem/librería <tt>rdoc</tt> es necesaria para renderizar plantillas RDoc:
506
-
507
- # Vas a necesitar requerir rdoc/markup/to_html en tu app
508
- require "rdoc/markup/to_html"
509
-
510
- get '/' do
511
- rdoc :index
512
- end
513
-
514
- Renderiza <tt>./views/index.rdoc</tt>.
429
+ Dependencias:: {rdoc}[http://rdoc.rubyforge.org/]
430
+ Extensiones de Archivo:: <tt>.rdoc</tt>
431
+ Ejemplo:: <tt>textile :LEEME, :layout_engine => :erb</tt>
515
432
 
516
433
  No es posible llamar métodos desde rdoc, ni pasarle locales. Por lo tanto,
517
434
  generalmente vas a usarlo en combinación con otro motor de renderizado:
@@ -526,109 +443,58 @@ plantillas:
526
443
 
527
444
  Como no podés utilizar Ruby desde RDoc, no podés usar layouts escritos en RDoc.
528
445
  De todos modos, es posible usar un motor de renderizado para el layout distinto
529
- al de la plantilla pasando la opción <tt>:layout_engine</tt>:
530
-
531
- get '/' do
532
- rdoc :index, :layout_engine => :erb
533
- end
534
-
535
- Renderiza <tt>./views/index.rdoc</tt> con el layout <tt>./views/layout.erb</tt>.
536
-
537
- Recordá que podés asignar las opciones de renderizado globalmente:
538
-
539
- set :rdoc, :layout_engine => :haml, :layout => :post
540
-
541
- get '/' do
542
- rdoc :index
543
- end
544
-
545
- Renderiza <tt>./views/index.rdoc</tt> (o cualquier otra plantilla RDoc) con el
546
- layout <tt>./views/post.haml</tt>.
446
+ al de la plantilla pasando la opción <tt>:layout_engine</tt>.
547
447
 
548
448
  === Plantillas Radius
549
449
 
550
- La gem/librería <tt>radius</tt> es necesaria para renderizar plantillas Radius:
551
-
552
- # Vas a necesitar requerir radius en tu app
553
- require 'radius'
554
-
555
- get '/' do
556
- radius :index
557
- end
450
+ Dependencias:: {radius}[http://radius.rubyforge.org/]
451
+ Extensiones de Archivo:: <tt>.radius</tt>
452
+ Ejemplo:: <tt>radius :index, :locals => { :clave => 'valor' }</tt>
558
453
 
559
- Renderiza <tt>./views/index.radius</tt>.
560
-
561
- Como no vas a poder llamar a métodos de Ruby (excepto a +yield+) desde una
562
- plantilla Radius, casi siempre vas a querer pasarle locales:
563
-
564
- radius :index, :locals => { :clave => 'valor' }
454
+ Como no vas a poder llamar a métodos de Ruby (excepto por +yield+) desde una
455
+ plantilla Radius, casi siempre vas a querer pasarle locales.
565
456
 
566
457
  === Plantillas Markaby
567
458
 
568
- La gem/librería <tt>markaby</tt> es necesaria para renderizar plantillas
569
- Markaby:
570
-
571
- # Vas a necesitar requerir markaby en tu app
572
- require 'markaby'
573
-
574
- get '/' do
575
- markaby :index
576
- end
577
-
578
- Renderiza <tt>./views/index.mab</tt>.
579
-
580
- También podés usar Markaby inline:
581
-
582
- get '/' do
583
- markaby { h1 "Bienvenido!" }
584
- end
459
+ Dependencias:: {markaby}[http://markaby.github.com/]
460
+ Extensiones de Archivo:: <tt>.mab</tt>
461
+ Ejemplos:: <tt>markaby { h1 "Bienvenido!" }</tt>
585
462
 
463
+ Además, acepta un bloque con la definición de la plantilla (ver el ejemplo).
586
464
 
587
465
  === Plantillas Slim
588
466
 
589
- La gem/librería <tt>slim</tt> es necesaria para renderizar plantillas Slim:
590
-
591
- # Vas a necesitar requerir slim en tu app
592
- require 'slim'
593
-
594
- get '/' do
595
- slim :index
596
- end
597
-
598
- Renderiza <tt>./views/index.slim</tt>.
467
+ Dependencias:: {slim}[http://slim-lang.com/]
468
+ Extensiones de Archivo:: <tt>.slim</tt>
469
+ Ejemplo:: <tt>slim :index</tt>
599
470
 
600
471
  === Plantillas Creole
601
472
 
602
- La gem/librería <tt>creole</tt> es necesaria para renderizar plantillas Creole:
473
+ Dependencias:: {creole}[https://github.com/minad/creole]
474
+ Extensiones de Archivo:: <tt>.creole</tt>
475
+ Ejemplo:: <tt>creole :wiki, :layout_engine => :erb</tt>
603
476
 
604
- # Vas a necesitar requerir creole en tu app
605
- require 'creole'
606
-
607
- get '/' do
608
- creole :index
609
- end
610
-
611
- Renderiza <tt>./views/index.creole</tt>.
612
-
613
- === Plantillas CoffeeScript
477
+ No es posible llamar métodos desde creole, ni pasarle locales. Por lo tanto,
478
+ generalmente vas a usarlo en combinación con otro motor de renderizado:
614
479
 
615
- La gem/librería <tt>coffee-script</tt> y al menos <b>una</b> de las siguientes
616
- opciones para ejecutar JavaScript:
480
+ erb :resumen, :locals => { :texto => cerole(:introduccion) }
617
481
 
618
- * +node+ (de Node.js) en tu path
619
- * utilizar OSX
620
- * la gem/librería +therubyracer+
482
+ Tené en cuenta que también podés llamar al método +creole+ desde otras
483
+ plantillas:
621
484
 
622
- son necesarios para renderizar plantillas CoffeeScript:
485
+ %h1 Hola Desde Haml!
486
+ %p= creole(:saludos)
623
487
 
624
- # Vas a necesitar requerir coffee-script en tu app
625
- require 'coffee-script'
488
+ Como no podés utilizar Ruby desde Creole, no podés usar layouts escritos en
489
+ Creloe. De todos modos, es posible usar un motor de renderizado para el layout
490
+ distinto al de la plantilla pasando la opción <tt>:layout_engine</tt>.
626
491
 
627
- get '/application.js' do
628
- coffee :application
629
- end
492
+ === Plantillas CoffeeScript
630
493
 
631
- Renderiza <tt>./views/application.coffee</tt>.
494
+ Dependencias:: {coffee-script}[https://github.com/josh/ruby-coffee-script]
495
+ y un {mecanismo para ejecutar javascript}[https://github.com/sstephenson/execjs/blob/master/README.md#readme]
496
+ Extensiones de Archivo:: <tt>.coffee</tt>
497
+ Ejemplo:: <tt>coffee :index</tt>
632
498
 
633
499
  === Plantillas Embebidas
634
500
 
@@ -653,7 +519,7 @@ O es posible especificar un Hash de variables locales explícitamente:
653
519
 
654
520
  get '/:id' do
655
521
  foo = Foo.find(params[:id])
656
- haml '%h1= foo.nombre', :locals => { :foo => foo }
522
+ haml '%h1= bar.nombre', :locals => { :bar => foo }
657
523
  end
658
524
 
659
525
  Esto es usado típicamente cuando se renderizan plantillas como parciales desde
@@ -977,7 +843,9 @@ Cuando usás <tt>send_file</tt> o archivos estáticos tal vez tengas tipos mime
977
843
  que Sinatra no entiende. Usá +mime_type+ para registrarlos a través de la
978
844
  extensión de archivo:
979
845
 
980
- mime_type :foo, 'text/foo'
846
+ configure do
847
+ mime_type :foo, 'text/foo'
848
+ end
981
849
 
982
850
  También lo podés usar con el ayudante +content_type+:
983
851
 
@@ -1484,11 +1352,17 @@ debugging, enrutamiento URL, autenticación, y manejo de sesiones. Sinatra
1484
1352
  usa muchos de estos componentes automáticamente de acuerdo a su configuración
1485
1353
  para que típicamente no tengas que usarlas (con +use+) explícitamente.
1486
1354
 
1355
+ Podés encontrar middleware útil en
1356
+ {rack}[https://github.com/rack/rack/tree/master/lib/rack],
1357
+ {rack-contrib}[https://github.com/rack/rack-contrib#readme],
1358
+ con {CodeRack}[http://coderack.org/] o en la
1359
+ {Rack wiki}[https://github.com/rack/rack/wiki/List-of-Middleware].
1360
+
1487
1361
  == Pruebas
1488
1362
 
1489
1363
  Las pruebas para las aplicaciones Sinatra pueden ser escritas utilizando
1490
1364
  cualquier framework o librería de pruebas basada en Rack. Se recomienda usar
1491
- {Rack::Test}[http://gitrdoc.com/brynary/rack-test]:
1365
+ {Rack::Test}[http://rdoc.info/github/brynary/rack-test/master/frames]:
1492
1366
 
1493
1367
  require 'mi_app_sinatra'
1494
1368
  require 'test/unit'
@@ -1517,9 +1391,6 @@ cualquier framework o librería de pruebas basada en Rack. Se recomienda usar
1517
1391
  end
1518
1392
  end
1519
1393
 
1520
- NOTA: El módulo Sinatra::Test y la clase Sinatra::TestHarness están
1521
- deprecados a partir de la versión 0.9.2.
1522
-
1523
1394
  == Sinatra::Base - Middleware, Librerías, y Aplicaciones Modulares
1524
1395
 
1525
1396
  Definir tu aplicación en el top-level funciona bien para micro-aplicaciones
@@ -1528,8 +1399,8 @@ reutilizables como Rack middleware, Rails metal, simple librerías con un
1528
1399
  componente de servidor, o incluso extensiones de Sinatra. El DSL de top-level
1529
1400
  contamina el espacio de nombres de Object y asume una configuración apropiada
1530
1401
  para micro-aplicaciones (por ejemplo, un único archivo de aplicación, los
1531
- directorios ./public y ./views, logging, página con detalles de excepción,
1532
- etc.). Ahí es donde Sinatra::Base entra en el juego:
1402
+ directorios <tt>./public</tt> y <tt>./views</tt>, logging, página con detalles
1403
+ de excepción, etc.). Ahí es donde <tt>Sinatra::Base</tt> entra en el juego:
1533
1404
 
1534
1405
  require 'sinatra/base'
1535
1406
 
@@ -1542,16 +1413,16 @@ etc.). Ahí es donde Sinatra::Base entra en el juego:
1542
1413
  end
1543
1414
  end
1544
1415
 
1545
- Las subclases de Sinatra::Base tienen disponibles exactamente los mismos
1546
- métodos que los provistos por el DSL de top-level. La mayoría de las
1547
- aplicaciones top-level se pueden convertir en componentes Sinatra::Base con
1548
- dos modificaciones:
1416
+ Las subclases de <tt>Sinatra::Base</tt> tienen disponibles exactamente los
1417
+ mismos métodos que los provistos por el DSL de top-level. La mayoría de las
1418
+ aplicaciones top-level se pueden convertir en componentes
1419
+ <tt>Sinatra::Base</tt> con dos modificaciones:
1549
1420
 
1550
1421
  * Tu archivo debe requerir <tt>sinatra/base</tt> en lugar de +sinatra+; de otra
1551
1422
  manera, todos los métodos del DSL de sinatra son importados dentro del
1552
1423
  espacio de nombres principal.
1553
1424
  * Poné las rutas, manejadores de errores, filtros y opciones de tu aplicación
1554
- en una subclase de Sinatra::Base.
1425
+ en una subclase de <tt>Sinatra::Base</tt>.
1555
1426
 
1556
1427
  <tt>Sinatra::Base</tt> es una pizarra en blanco. La mayoría de las opciones están
1557
1428
  desactivadas por defecto, incluyendo el servidor incorporado. Mirá
@@ -1580,7 +1451,7 @@ entre sus configuraciones:
1580
1451
 
1581
1452
  Configuración Clásica Modular
1582
1453
 
1583
- app_file archivo que carga sinatra nil
1454
+ app_file archivo que carga sinatra archivo con la subclase de Sinatra::Base
1584
1455
  run $0 == app_file false
1585
1456
  logging true false
1586
1457
  method_override true false
@@ -1609,7 +1480,7 @@ Iniciar con:
1609
1480
  O, con un archivo <tt>config.ru</tt>, que permite usar cualquier handler Rack:
1610
1481
 
1611
1482
  # config.ru
1612
- require 'mi_app'
1483
+ require './mi_app'
1613
1484
  run MiApp
1614
1485
 
1615
1486
  Después ejecutar:
@@ -1629,7 +1500,7 @@ Escribí el archivo de tu aplicación:
1629
1500
 
1630
1501
  Y el <tt>config.ru</tt> correspondiente:
1631
1502
 
1632
- require 'app'
1503
+ require './app'
1633
1504
  run Sinatra::Application
1634
1505
 
1635
1506
  === ¿Cuándo Usar config.ru?
@@ -1660,7 +1531,7 @@ aplicación basada en Rack (Rails/Ramaze/Camping/...):
1660
1531
  get('/login') { haml :login }
1661
1532
 
1662
1533
  post('/login') do
1663
- if params[:nombre] = 'admin' and params[:password] = 'admin'
1534
+ if params[:nombre] == 'admin' && params[:password] == 'admin'
1664
1535
  session['nombre_de_usuario'] = params[:nombre]
1665
1536
  else
1666
1537
  redirect '/login'
@@ -1685,7 +1556,7 @@ aplicación basada en Rack (Rails/Ramaze/Camping/...):
1685
1556
 
1686
1557
  Puede que en algunas ocasiones quieras crear nuevas aplicaciones en
1687
1558
  tiempo de ejecución sin tener que asignarlas a una constante. Para
1688
- esto tenés `Sinatra.new`:
1559
+ esto tenés <tt>Sinatra.new</tt>:
1689
1560
 
1690
1561
  require 'sinatra/base'
1691
1562
  mi_app = Sinatra.new { get('/') { "hola" } }
@@ -1730,12 +1601,12 @@ disponibles.
1730
1601
 
1731
1602
  === Ámbito de Aplicación/Clase
1732
1603
 
1733
- Cada aplicación Sinatra es una subclase de Sinatra::Base. Si estás usando el
1734
- DSL de top-level (<tt>require 'sinatra'</tt>), entonces esta clase es
1735
- Sinatra::Application, de otra manera es la subclase que creaste explícitamente.
1736
- Al nivel de la clase tenés métodos como +get+ o +before+, pero no podés acceder
1737
- a los objetos +request+ o +session+, ya que hay una única clase de la
1738
- aplicación para todas las peticiones.
1604
+ Cada aplicación Sinatra es una subclase de <tt>Sinatra::Base</tt>. Si estás
1605
+ usando el DSL de top-level (<tt>require 'sinatra'</tt>), entonces esta clase es
1606
+ <tt>Sinatra::Application</tt>, de otra manera es la subclase que creaste
1607
+ explícitamente. Al nivel de la clase tenés métodos como +get+ o +before+, pero
1608
+ no podés acceder a los objetos +request+ o +session+, ya que hay una única
1609
+ clase de la aplicación para todas las peticiones.
1739
1610
 
1740
1611
  Las opciones creadas utilizando +set+ son métodos al nivel de la clase:
1741
1612
 
@@ -1835,21 +1706,25 @@ Las siguientes versiones de Ruby son soportadas oficialmente:
1835
1706
  [ Ruby 1.9.2 ]
1836
1707
  1.9.2 es soportado y recomendado. Tené en cuenta que Radius y Markaby no
1837
1708
  son compatibles con 1.9 actualmente. Además, no usés 1.9.2p0, porque produce
1838
- fallos de segmentación cuando se utiliza Sinatra.
1709
+ fallos de segmentación cuando se ejecuta Sinatra.
1839
1710
 
1840
1711
  [ Rubinius ]
1841
1712
  Rubinius es soportado oficialmente (Rubinius >= 1.2.3). Todo
1842
1713
  funciona correctamente, incluyendo los lenguajes de plantillas.
1843
1714
 
1844
1715
  [ JRuby ]
1845
- JRuby es soportado oficialmente (JRuby >= 1.6.0). No se conocen
1716
+ JRuby es soportado oficialmente (JRuby >= 1.6.1). No se conocen
1846
1717
  problemas con librerías de plantillas de terceras partes. Sin
1847
1718
  embargo, si elegís usar JRuby, deberías examinar sus Rack handlers
1848
1719
  porque el servidor web Thin no es soportado completamente. El
1849
1720
  soporte de JRuby para extensiones C se encuentra en una etapa
1850
- experimental, sin embargo, de momento solo RDiscount se ve afectada.
1721
+ experimental, sin embargo, de momento solamente RDiscount y Redcarpted
1722
+ se ven afectadas.
1851
1723
 
1852
- <b>Hemos dejado de soportar Ruby 1.8.6.</b>
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.
1853
1728
 
1854
1729
  Siempre le prestamos atención a las nuevas versiones de Ruby.
1855
1730
 
@@ -1859,7 +1734,6 @@ oficialmente. De cualquier manera, pueden ejecutar Sinatra:
1859
1734
  * Versiones anteriores de JRuby y Rubinius
1860
1735
  * MacRuby, Maglev e IronRuby
1861
1736
  * Ruby 1.9.0 y 1.9.1
1862
- * Ruby 1.8.6 con {backports}[https://github.com/marcandre/backports/#readme]
1863
1737
 
1864
1738
  No estar soportada oficialmente, significa que si las cosas solamente se rompen
1865
1739
  ahí y no en una plataforma soportada, asumimos que no es nuestro problema sino
@@ -1952,6 +1826,9 @@ siguiendo las especificaciones SemVer y SemVerTag.
1952
1826
  * {Twitter}[http://twitter.com/sinatra]
1953
1827
  * {Lista de Correo}[http://groups.google.com/group/sinatrarb/topics]
1954
1828
  * {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] en http://freenode.net
1829
+ * {Sinatra Book}[http://sinatra-book.gittr.com] Tutorial (en inglés).
1830
+ * {Sinatra Book Contrib}[http://sinatra-book-contrib.com/] Recetas contribuidas
1831
+ por la comunidad (en inglés).
1955
1832
  * Documentación de la API para la
1956
1833
  {última versión liberada}[http://rubydoc.info/gems/sinatra] o para la
1957
1834
  {rama de desarrollo actual}[http://rubydoc.info/github/sinatra/sinatra]