sinatra-base 1.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. data/.yardopts +4 -0
  2. data/AUTHORS +15 -0
  3. data/CHANGES +524 -1
  4. data/Gemfile +82 -0
  5. data/LICENSE +1 -1
  6. data/README.de.rdoc +2093 -0
  7. data/README.es.rdoc +2091 -0
  8. data/README.fr.rdoc +2116 -0
  9. data/README.hu.rdoc +607 -0
  10. data/README.jp.rdoc +514 -23
  11. data/README.pt-br.rdoc +647 -0
  12. data/README.pt-pt.rdoc +646 -0
  13. data/README.rdoc +1580 -205
  14. data/README.ru.rdoc +2015 -0
  15. data/README.zh.rdoc +1816 -0
  16. data/Rakefile +110 -44
  17. data/examples/chat.rb +61 -0
  18. data/examples/simple.rb +3 -0
  19. data/examples/stream.ru +26 -0
  20. data/lib/sinatra.rb +0 -3
  21. data/lib/sinatra/base.rb +923 -393
  22. data/lib/sinatra/main.rb +9 -7
  23. data/lib/sinatra/showexceptions.rb +37 -4
  24. data/lib/sinatra/version.rb +3 -0
  25. data/sinatra-base.gemspec +15 -91
  26. data/test/base_test.rb +2 -2
  27. data/test/builder_test.rb +32 -2
  28. data/test/coffee_test.rb +92 -0
  29. data/test/contest.rb +62 -28
  30. data/test/creole_test.rb +65 -0
  31. data/test/delegator_test.rb +162 -0
  32. data/test/encoding_test.rb +20 -0
  33. data/test/erb_test.rb +25 -2
  34. data/test/extensions_test.rb +1 -1
  35. data/test/filter_test.rb +226 -8
  36. data/test/haml_test.rb +8 -2
  37. data/test/helper.rb +47 -0
  38. data/test/helpers_test.rb +1287 -80
  39. data/test/integration/app.rb +62 -0
  40. data/test/integration_helper.rb +208 -0
  41. data/test/integration_test.rb +82 -0
  42. data/test/less_test.rb +36 -6
  43. data/test/liquid_test.rb +59 -0
  44. data/test/mapped_error_test.rb +84 -7
  45. data/test/markaby_test.rb +80 -0
  46. data/test/markdown_test.rb +81 -0
  47. data/test/middleware_test.rb +1 -1
  48. data/test/nokogiri_test.rb +69 -0
  49. data/test/rack_test.rb +45 -0
  50. data/test/radius_test.rb +59 -0
  51. data/test/rdoc_test.rb +66 -0
  52. data/test/readme_test.rb +136 -0
  53. data/test/request_test.rb +13 -1
  54. data/test/response_test.rb +21 -2
  55. data/test/result_test.rb +5 -5
  56. data/test/route_added_hook_test.rb +1 -1
  57. data/test/routing_test.rb +328 -13
  58. data/test/sass_test.rb +48 -18
  59. data/test/scss_test.rb +88 -0
  60. data/test/server_test.rb +4 -3
  61. data/test/settings_test.rb +191 -21
  62. data/test/sinatra_test.rb +5 -1
  63. data/test/slim_test.rb +88 -0
  64. data/test/static_test.rb +89 -5
  65. data/test/streaming_test.rb +140 -0
  66. data/test/templates_test.rb +143 -4
  67. data/test/textile_test.rb +65 -0
  68. data/test/views/a/in_a.str +1 -0
  69. data/test/views/ascii.erb +2 -0
  70. data/test/views/b/in_b.str +1 -0
  71. data/test/views/calc.html.erb +1 -0
  72. data/test/views/explicitly_nested.str +1 -0
  73. data/test/views/hello.coffee +1 -0
  74. data/test/views/hello.creole +1 -0
  75. data/test/views/hello.liquid +1 -0
  76. data/test/views/hello.mab +1 -0
  77. data/test/views/hello.md +1 -0
  78. data/test/views/hello.nokogiri +1 -0
  79. data/test/views/hello.radius +1 -0
  80. data/test/views/hello.rdoc +1 -0
  81. data/test/views/hello.sass +1 -1
  82. data/test/views/hello.scss +3 -0
  83. data/test/views/hello.slim +1 -0
  84. data/test/views/hello.str +1 -0
  85. data/test/views/hello.textile +1 -0
  86. data/test/views/hello.yajl +1 -0
  87. data/test/views/layout2.liquid +2 -0
  88. data/test/views/layout2.mab +2 -0
  89. data/test/views/layout2.nokogiri +3 -0
  90. data/test/views/layout2.radius +2 -0
  91. data/test/views/layout2.slim +3 -0
  92. data/test/views/layout2.str +2 -0
  93. data/test/views/nested.str +1 -0
  94. data/test/views/utf8.erb +2 -0
  95. data/test/yajl_test.rb +80 -0
  96. metadata +126 -91
  97. data/lib/sinatra/tilt.rb +0 -746
  98. data/test/erubis_test.rb +0 -82
  99. data/test/views/error.erubis +0 -3
  100. data/test/views/hello.erubis +0 -1
  101. data/test/views/layout2.erubis +0 -2
@@ -0,0 +1,646 @@
1
+ = Sinatra
2
+ <i>Atenção: Este documento é apenas uma tradução da versão em inglês e pode estar desatualizado.</i>
3
+
4
+ Sinatra é uma DSL para criar rapidamente aplicações web em Ruby com o mínimo de
5
+ esforço:
6
+
7
+ # minhaapp.rb
8
+ require 'rubygems'
9
+ require 'sinatra'
10
+ get '/' do
11
+ 'Olá Mundo!'
12
+ end
13
+
14
+ Instale a gem e execute com:
15
+
16
+ sudo gem install sinatra
17
+ ruby minhaapp.rb
18
+
19
+ Aceda em: http://localhost:4567
20
+
21
+ == Rotas
22
+
23
+ No Sinatra, uma rota é um metodo HTTP associado a uma URL correspondente padrão.
24
+ Cada rota é associada a um bloco:
25
+
26
+ get '/' do
27
+ .. mostrar algo ..
28
+ end
29
+
30
+ post '/' do
31
+ .. criar algo ..
32
+ end
33
+
34
+ put '/' do
35
+ .. atualizar algo ..
36
+ end
37
+
38
+ delete '/' do
39
+ .. apagar algo ..
40
+ end
41
+
42
+ Rotas são encontradas na ordem em que são definidas. A primeira rota que
43
+ é encontrada invoca o pedido.
44
+
45
+ Padrões de rota podem incluir parâmetros nomeados, acessíveis através da
46
+ hash <tt>params</tt>:
47
+
48
+ get '/ola/:nome' do
49
+ # corresponde a "GET /ola/foo" e "GET /ola/bar"
50
+ # params[:nome] é 'foo' ou 'bar'
51
+ "Olá #{params[:nome]}!"
52
+ end
53
+
54
+ Pode também aceder a parâmetros nomeados através do bloco de parâmetros:
55
+
56
+ get '/ola/:nome' do |n|
57
+ "Olá #{n}!"
58
+ end
59
+
60
+ Padrões de rota podem também incluir parâmetros splat (asteriscos), acessíveis
61
+ através do array <tt>params[:splat]</tt>.
62
+
63
+ get '/diga/*/ao/*' do
64
+ # corresponde a /diga/ola/ao/mundo
65
+ params[:splat] # => ["ola", "mundo"]
66
+ end
67
+
68
+ get '/download/*.*' do
69
+ # corresponde a /download/pasta/do/arquivo.xml
70
+ params[:splat] # => ["pasta/do/arquivo", "xml"]
71
+ end
72
+
73
+ Rotas correspondem-se com expressões regulares:
74
+
75
+ get %r{/ola/([\w]+)} do
76
+ "Olá, #{params[:captures].first}!"
77
+ end
78
+
79
+ Ou com um bloco de parâmetro:
80
+
81
+ get %r{/ola/([\w]+)} do |c|
82
+ "Olá, #{c}!"
83
+ end
84
+
85
+ Rotas podem incluir uma variedade de condições correspondentes, por exemplo, o agente usuário:
86
+
87
+ get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
88
+ "Você está a utilizar a versão #{params[:agent][0]} do Songbird."
89
+ end
90
+
91
+ get '/foo' do
92
+ # Corresponde a um navegador não Songbird
93
+ end
94
+
95
+ == Arquivos estáticos
96
+
97
+ Arquivos estáticos são disponibilizados a partir do directório <tt>./public</tt>. Você pode especificar
98
+ um local diferente através da opção <tt>:public_folder</tt>
99
+
100
+ set :public_folder, File.dirname(__FILE__) + '/estatico'
101
+
102
+ Note que o nome do directório público não é incluido no URL. Um arquivo
103
+ <tt>./public/css/style.css</tt> é disponibilizado como
104
+ <tt>http://example.com/css/style.css</tt>.
105
+
106
+ == Views / Templates
107
+
108
+ Templates presumem-se estar localizados sob o directório <tt>./views</tt>.
109
+ Para utilizar um directório de views diferente:
110
+
111
+ set :views, File.dirname(__FILE__) + '/modelo'
112
+
113
+ Uma coisa importante a ser lembrada é que você sempre tem as referências dos
114
+ templates como símbolos, mesmo se eles estiverem num sub-directório (nesse
115
+ caso utilize <tt>:'subdir/template'</tt>). Métodos de renderização irão processar
116
+ qualquer string passada directamente para elas.
117
+
118
+ === Haml Templates
119
+
120
+ A gem/biblioteca haml é necessária para renderizar templates HAML:
121
+
122
+ # É necessário requerir 'haml' na aplicação.
123
+ require 'haml'
124
+
125
+ get '/' do
126
+ haml :index
127
+ end
128
+
129
+ Renderiza <tt>./views/index.haml</tt>.
130
+
131
+ {Opções Haml}[http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#options]
132
+ podem ser definidas globalmente através das configurações do sinatra,
133
+ veja {Opções e Configurações}[http://www.sinatrarb.com/configuration.html],
134
+ e substitua em uma requisição individual.
135
+
136
+ set :haml, {:format => :html5 } # o formato padrão do Haml é :xhtml
137
+
138
+ get '/' do
139
+ haml :index, :haml_options => {:format => :html4 } # substituido
140
+ end
141
+
142
+
143
+ === Erb Templates
144
+
145
+ # É necessário requerir 'erb' na aplicação.
146
+ require 'erb'
147
+
148
+ get '/' do
149
+ erb :index
150
+ end
151
+
152
+ Renderiza <tt>./views/index.erb</tt>
153
+
154
+ === Erubis
155
+
156
+ A gem/biblioteca erubis é necessária para renderizar templates erubis:
157
+
158
+ # É necessário requerir 'erubis' na aplicação.
159
+ require 'erubis'
160
+
161
+ get '/' do
162
+ erubis :index
163
+ end
164
+
165
+ Renderiza <tt>./views/index.erubis</tt>
166
+
167
+ === Builder Templates
168
+
169
+ A gem/biblioteca builder é necessária para renderizar templates builder:
170
+
171
+ # É necessário requerir 'builder' na aplicação.
172
+ require 'builder'
173
+
174
+ get '/' do
175
+ content_type 'application/xml', :charset => 'utf-8'
176
+ builder :index
177
+ end
178
+
179
+ Renderiza <tt>./views/index.builder</tt>.
180
+
181
+ === Sass Templates
182
+
183
+ A gem/biblioteca sass é necessária para renderizar templates sass:
184
+
185
+ # É necessário requerir 'haml' ou 'sass' na aplicação.
186
+ require 'sass'
187
+
188
+ get '/stylesheet.css' do
189
+ content_type 'text/css', :charset => 'utf-8'
190
+ sass :stylesheet
191
+ end
192
+
193
+ Renderiza <tt>./views/stylesheet.sass</tt>.
194
+
195
+ {Opções Sass}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
196
+ podem ser definidas globalmente através das configurações do sinatra,
197
+ veja {Opções e Configurações}[http://www.sinatrarb.com/configuration.html],
198
+ e substitua em uma requisição individual.
199
+
200
+ set :sass, {:style => :compact } # o estilo padrão do Sass é :nested
201
+
202
+ get '/stylesheet.css' do
203
+ content_type 'text/css', :charset => 'utf-8'
204
+ sass :stylesheet, :style => :expanded # substituido
205
+ end
206
+
207
+ === Less Templates
208
+
209
+ A gem/biblioteca less é necessária para renderizar templates Less:
210
+
211
+ # É necessário requerir 'less' na aplicação.
212
+ require 'less'
213
+
214
+ get '/stylesheet.css' do
215
+ content_type 'text/css', :charset => 'utf-8'
216
+ less :stylesheet
217
+ end
218
+
219
+ Renderiza <tt>./views/stylesheet.less</tt>.
220
+
221
+ === Templates Inline
222
+
223
+ get '/' do
224
+ haml '%div.title Olá Mundo'
225
+ end
226
+
227
+ Renderiza a string, em uma linha, no template.
228
+
229
+ === Acedendo a Variáveis nos Templates
230
+
231
+ Templates são avaliados dentro do mesmo contexto que os manipuladores de rota. Variáveis
232
+ de instância definidas em rotas manipuladas são directamente acedidas por templates:
233
+
234
+ get '/:id' do
235
+ @foo = Foo.find(params[:id])
236
+ haml '%h1= @foo.nome'
237
+ end
238
+
239
+ Ou, especifique um hash explícito para variáveis locais:
240
+
241
+ get '/:id' do
242
+ foo = Foo.find(params[:id])
243
+ haml '%h1= foo.nome', :locals => { :foo => foo }
244
+ end
245
+
246
+ Isso é tipicamente utilizado quando renderizamos templates parciais (partials) dentro
247
+ de outros templates.
248
+
249
+ === Templates Inline
250
+
251
+ Templates podem ser definidos no final do arquivo fonte(.rb):
252
+
253
+ require 'rubygems'
254
+ require 'sinatra'
255
+
256
+ get '/' do
257
+ haml :index
258
+ end
259
+
260
+ __END__
261
+
262
+ @@ layout
263
+ %html
264
+ = yield
265
+
266
+ @@ index
267
+ %div.title Olá Mundo!!!!!
268
+
269
+ NOTA: Templates inline definidos no arquivo fonte são automaticamente carregados
270
+ pelo sinatra. Digite `enable :inline_templates` se tem templates inline no outro
271
+ arquivo fonte.
272
+
273
+ === Templates nomeados
274
+
275
+ Templates também podem ser definidos utilizando o método top-level <tt>template</tt>:
276
+
277
+ template :layout do
278
+ "%html\n =yield\n"
279
+ end
280
+
281
+ template :index do
282
+ '%div.title Olá Mundo!'
283
+ end
284
+
285
+ get '/' do
286
+ haml :index
287
+ end
288
+
289
+ Se existir um template com nome "layout", ele será utilizado sempre que um
290
+ template for renderizado. Pode desactivar layouts usando <tt>:layout => false</tt>.
291
+
292
+ get '/' do
293
+ haml :index, :layout => !request.xhr?
294
+ end
295
+
296
+ == Helpers
297
+
298
+ Use o método de alto nível <tt>helpers</tt> para definir métodos auxiliares para utilizar em
299
+ manipuladores de rotas e modelos:
300
+
301
+ helpers do
302
+ def bar(nome)
303
+ "#{nome}bar"
304
+ end
305
+ end
306
+
307
+ get '/:nome' do
308
+ bar(params[:nome])
309
+ end
310
+
311
+ == Filtros
312
+
313
+ Filtros Before são avaliados antes de cada requisição dentro do contexto da requisição
314
+ e podem modificar a requisição e a reposta. Variáveis de instância definidas nos
315
+ filtros são acedidas através de rotas e templates:
316
+
317
+ before do
318
+ @nota = 'Olá!'
319
+ request.path_info = '/foo/bar/baz'
320
+ end
321
+
322
+ get '/foo/*' do
323
+ @nota #=> 'Olá!'
324
+ params[:splat] #=> 'bar/baz'
325
+ end
326
+
327
+ Filtros After são avaliados após cada requisição dentro do contexto da
328
+ requisição e também podem modificar o pedido e a resposta. Variáveis de instância
329
+ definidas nos filtros before e rotas são acedidas através dos filtros after:
330
+
331
+ after do
332
+ puts response.status
333
+ end
334
+
335
+ Filtros opcionalmente têm um padrão, fazendo com que sejam avaliados somente se o caminho
336
+ do pedido coincidir com esse padrão:
337
+
338
+ before '/protected/*' do
339
+ autenticar!
340
+ end
341
+
342
+ after '/create/:slug' do |slug|
343
+ session[:last_slug] = slug
344
+ end
345
+
346
+ == Halting
347
+
348
+ Para parar imediatamente uma requisição dentro de um filtro ou rota utilize:
349
+
350
+ halt
351
+
352
+ Pode também especificar o status ao parar...
353
+
354
+ halt 410
355
+
356
+ Ou com um corpo de texto...
357
+
358
+ halt 'isto será o corpo de texto'
359
+
360
+ Ou também...
361
+
362
+ halt 401, 'vamos embora!'
363
+
364
+ Com cabeçalhos...
365
+
366
+ halt 402, {'Content-Type' => 'text/plain'}, 'revanche'
367
+
368
+ == Passing
369
+
370
+ Dentro de uma rota, pode passar para a próxima rota correspondente usando <tt>pass</tt>:
371
+
372
+ get '/adivinhar/:quem' do
373
+ pass unless params[:quem] == 'Frank'
374
+ 'Apanhaste-me!'
375
+ end
376
+
377
+ get '/adivinhar/*' do
378
+ 'Falhaste!'
379
+ end
380
+
381
+ O bloqueio da rota é imediatamente encerrado e o controle continua com a próxima
382
+ rota de parâmetro. Se o parâmetro da rota não for encontrado, um 404 é retornado.
383
+
384
+ == Configuração
385
+
386
+ Correndo uma vez, na inicialização, em qualquer ambiente:
387
+
388
+ configure do
389
+ ...
390
+ end
391
+
392
+ Correndo somente quando o ambiente (RACK_ENV environment variável) é definido para
393
+ <tt>:production</tt>:
394
+
395
+ configure :production do
396
+ ...
397
+ end
398
+
399
+ Correndo quando o ambiente é definido para <tt>:production</tt> ou
400
+ <tt>:test</tt>:
401
+
402
+ configure :production, :test do
403
+ ...
404
+ end
405
+
406
+ == Lidar com Erros
407
+
408
+ Lida-se com erros no mesmo contexto das rotas e filtros before, o que signifca que
409
+ <tt>haml</tt>, <tt>erb</tt>, etc, estão disponíveis.
410
+
411
+ === Não Encontrado
412
+
413
+ Quando um <tt>Sinatra::NotFound</tt> exception é levantado, ou o código de status
414
+ da reposta é 404, o manipulador <tt>not_found</tt> é invocado:
415
+
416
+ not_found do
417
+ 'Isto está longe de ser encontrado'
418
+ end
419
+
420
+ === Erro
421
+
422
+ O manipulador +error+ é invocado sempre que uma exceção é lançada a partir de
423
+ um bloco de rota ou um filtro. O objecto da exceção pode ser obtido a partir da variável
424
+ Rack <tt>sinatra.error</tt>:
425
+
426
+ error do
427
+ 'Peço desculpa, houve um erro desagradável - ' + env['sinatra.error'].name
428
+ end
429
+
430
+ Erros personalizados:
431
+
432
+ error MeuErroPersonalizado do
433
+ 'O que aconteceu foi...' + env['sinatra.error'].message
434
+ end
435
+
436
+ Então, se isso acontecer:
437
+
438
+ get '/' do
439
+ raise MeuErroPersonalizado, 'alguma coisa desagradável'
440
+ end
441
+
442
+ O resultado será:
443
+
444
+ O que aconteceu foi...alguma coisa desagradável
445
+
446
+ Alternativamente, pode definir um manipulador de erro para um código de status:
447
+
448
+ error 403 do
449
+ 'Accesso negado'
450
+ end
451
+
452
+ get '/secreto' do
453
+ 403
454
+ end
455
+
456
+ Ou um range (alcance):
457
+
458
+ error 400..510 do
459
+ 'Boom'
460
+ end
461
+
462
+ O Sinatra define os manipuladores especiais <tt>not_found</tt> e <tt>error</tt> quando
463
+ corre no ambiente de desenvolvimento.
464
+
465
+ == Mime Types
466
+
467
+ Quando utilizamos <tt>send_file</tt> ou arquivos estáticos pode ter mime types Sinatra
468
+ não entendidos. Use +mime_type+ para os registar por extensão de arquivos:
469
+
470
+ mime_type :foo, 'text/foo'
471
+
472
+ Pode também utilizar isto com o helper +content_type+:
473
+
474
+ content_type :foo
475
+
476
+ == Middleware Rack
477
+
478
+ O Sinatra corre no Rack[http://rack.rubyforge.org/], uma interface padrão mínima para
479
+ frameworks web em Ruby. Uma das capacidades mais interessantes do Rack, para desenvolver
480
+ aplicações, é o suporte de "middleware" -- componentes que residem entre o servidor e
481
+ a aplicação, monitorizando e/ou manipulando o pedido/resposta (request/response) HTTP
482
+ para providenciar varios tipos de funcionalidades comuns.
483
+
484
+ O Sinatra torna a construção de pipelines do middleware Rack fácil a um nível superior
485
+ utilizando o método +use+:
486
+
487
+ require 'sinatra'
488
+ require 'meu_middleware_personalizado'
489
+
490
+ use Rack::Lint
491
+ use MeuMiddlewarePersonalizado
492
+
493
+ get '/ola' do
494
+ 'Olá mundo'
495
+ end
496
+
497
+ A semântica de +use+ é idêntica aquela definida para a DSL
498
+ Rack::Builder[http://rack.rubyforge.org/doc/classes/Rack/Builder.html]
499
+ (mais frequentemente utilizada para arquivos rackup). Por exemplo, o método +use+
500
+ aceita múltiplos argumentos/variáveis, bem como blocos:
501
+
502
+ use Rack::Auth::Basic do |utilizador, senha|
503
+ utilizador == 'admin' && senha == 'secreto'
504
+ end
505
+
506
+ O Rack é distribuido com uma variedade de middleware padrões para logs,
507
+ debugs, rotas de URL, autenticação, e manipuladores de sessão.Sinatra utiliza
508
+ muitos desses componentes automaticamente dependendo da configuração, por isso,
509
+ tipicamente nao é necessário utilizar +use+ explicitamente.
510
+
511
+ == Testando
512
+
513
+ Testes no Sinatra podem ser escritos utilizando qualquer biblioteca ou framework
514
+ de teste baseados no Rack. {Rack::Test}[http://gitrdoc.com/brynary/rack-test] é
515
+ recomendado:
516
+
517
+ require 'minha_aplicacao_sinatra'
518
+ require 'rack/test'
519
+
520
+ class MinhaAplicacaoTeste < Test::Unit::TestCase
521
+ include Rack::Test::Methods
522
+
523
+ def app
524
+ Sinatra::Application
525
+ end
526
+
527
+ def meu_test_default
528
+ get '/'
529
+ assert_equal 'Ola Mundo!', last_response.body
530
+ end
531
+
532
+ def teste_com_parametros
533
+ get '/atender', :name => 'Frank'
534
+ assert_equal 'Olá Frank!', last_response.bodymeet
535
+ end
536
+
537
+ def test_com_ambiente_rack
538
+ get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
539
+ assert_equal "Você está utilizando o Songbird!", last_response.body
540
+ end
541
+ end
542
+
543
+ NOTA: Os módulos de classe embutidos Sinatra::Test e Sinatra::TestHarness
544
+ são depreciados na versão 0.9.2.
545
+
546
+ == Sinatra::Base - Middleware, Bibliotecas e aplicativos modulares
547
+
548
+ Definir sua aplicação a um nível superior de trabalho funciona bem para micro aplicativos, mas tem
549
+ consideráveis incovenientes na construção de componentes reutilizáveis como um middleware Rack,
550
+ metal Rails, bibliotecas simples como um componente de servidor, ou
551
+ mesmo extensões Sinatra. A DSL de nível superior polui o espaço do objeto
552
+ e assume um estilo de configuração de micro aplicativos (exemplo: um simples arquivo de
553
+ aplicação, directórios ./public e ./views, logs, página de detalhes de excepção,
554
+ etc.). É onde o Sinatra::Base entra em jogo:
555
+
556
+ require 'sinatra/base'
557
+
558
+ class MinhaApp < Sinatra::Base
559
+ set :sessions, true
560
+ set :foo, 'bar'
561
+
562
+ get '/' do
563
+ 'Olá mundo!'
564
+ end
565
+ end
566
+
567
+ A classe MinhaApp é um componente Rack independente que pode utilizar como um
568
+ middleware Rack, uma aplicação Rack, ou metal Rails. Pode +utilizar+ ou
569
+ +executar+ esta classe com um arquivo rackup +config.ru+; ou, controlar um componente
570
+ de servidor fornecendo como biblioteca:
571
+
572
+ MinhaApp.run! :host => 'localhost', :port => 9090
573
+
574
+ Os métodos disponíveis para subclasses Sinatra::Base são exatamente como aqueles
575
+ disponíveis via a DSL de nível superior. Aplicações de nível mais alto podem ser convertidas para
576
+ componentes Sinatra::Base com duas modificações:
577
+
578
+ * Seu arquivo deve requerer +sinatra/base+ ao invés de +sinatra+;
579
+ outra coisa, todos os métodos DSL do Sinatra são importados para o espaço
580
+ principal.
581
+ * Coloque as rotas da sua aplicação, manipuladores de erro, filtros e opções na subclasse de
582
+ um Sinatra::Base.
583
+
584
+ +Sinatra::Base+ é um quadro branco. Muitas opções são desactivadas por padrão,
585
+ incluindo o servidor embutido. Veja {Opções e Configurações}[http://sinatra.github.com/configuration.html]
586
+ para detalhes de opções disponíveis e seus comportamentos.
587
+
588
+ SIDEBAR: A DSL de alto nível do Sinatra é implementada utilizando um simples sistema de
589
+ delegação. A classe +Sinatra::Application+ -- uma subclasse especial da
590
+ Sinatra::Base -- recebe todos os :get, :put, :post, :delete, :before,
591
+ :error, :not_found, :configure, e :set messages enviados para o
592
+ alto nível. Dê você mesmo uma vista de olhos ao código: aqui está o
593
+ {Sinatra::Delegator mixin}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/base.rb#L1128]
594
+ sendo {incluido dentro de um espaço principal}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/main.rb#L28]
595
+
596
+ == Linha de Comandos
597
+
598
+ As aplicações Sinatra podem ser executadas directamente:
599
+
600
+ ruby minhaapp.rb [-h] [-x] [-e AMBIENTE] [-p PORTA] [-o HOST] [-s SERVIDOR]
601
+
602
+ As opções são:
603
+
604
+ -h # ajuda
605
+ -p # define a porta (padrão é 4567)
606
+ -o # define o host (padrão é 0.0.0.0)
607
+ -e # define o ambiente (padrão é development)
608
+ -s # especifica o servidor/manipulador rack (padrão é thin)
609
+ -x # activa o bloqueio (padrão é desligado)
610
+
611
+ == A última versão
612
+
613
+ Se gostaria de utilizar o código da última versão do Sinatra, crie um clone
614
+ local e execute sua aplicação com o directório <tt>sinatra/lib</tt> no
615
+ <tt>LOAD_PATH</tt>:
616
+
617
+ cd minhaapp
618
+ git clone git://github.com/sinatra/sinatra.git
619
+ ruby -I sinatra/lib minhaapp.rb
620
+
621
+ Alternativamente, pode adicionar o directório do <tt>sinatra/lib</tt> no
622
+ <tt>LOAD_PATH</tt> do seu aplicativo:
623
+
624
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/sinatra/lib'
625
+ require 'rubygems'
626
+ require 'sinatra'
627
+
628
+ get '/sobre' do
629
+ "Estou correndo a versão" + Sinatra::VERSION
630
+ end
631
+
632
+ Para actualizar o código do Sinatra no futuro:
633
+
634
+ cd meuprojeto/sinatra
635
+ git pull
636
+
637
+ == Mais
638
+
639
+ * {Website do Projeto}[http://www.sinatrarb.com/] - Documentação adicional,
640
+ novidades e links para outros recursos.
641
+ * {Contribuir}[http://www.sinatrarb.com/contributing] - Encontrou um bug? Precisa
642
+ de ajuda? Tem um patch?
643
+ * {Acompanhar Questões}[http://github.com/sinatra/sinatra/issues]
644
+ * {Twitter}[http://twitter.com/sinatra]
645
+ * {Lista de Email}[http://groups.google.com/group/sinatrarb/topics]
646
+ * {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] em http://freenode.net