sinatra-base 1.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,647 @@
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 como:
15
+
16
+ sudo gem install sinatra
17
+ ruby minhaapp.rb
18
+
19
+ Acesse 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
+ .. mostrando alguma coisa ..
28
+ end
29
+
30
+ post '/' do
31
+ .. criando alguma coisa ..
32
+ end
33
+
34
+ put '/' do
35
+ .. atualizando alguma coisa ..
36
+ end
37
+
38
+ delete '/' do
39
+ .. apagando alguma coisa ..
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 via a
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
+ Você também pode acessar parâmetros nomeados via bloco de parâmetros:
55
+
56
+ get '/ola/:nome' do |n|
57
+ "Olá #{n}!"
58
+ end
59
+
60
+ Padrões de rota também podem incluir parâmetros splat (ou curingas), acessáveis
61
+ via o array <tt>params[:splat]</tt>.
62
+
63
+ get '/diga/*/para/*' do
64
+ # corresponde a /diga/ola/para/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 se correspondem 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
+ "Hello, #{c}!"
83
+ end
84
+
85
+ Rotas podem incluir uma variedade de condições correspondes, tal como o agente usuário:
86
+
87
+ get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
88
+ "Você está utilizando 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 diretório <tt>./public</tt>. Você pode especificar
98
+ um local diferente pela opção <tt>:public_folder</tt>
99
+
100
+ set :public_folder, File.dirname(__FILE__) + '/estatico'
101
+
102
+ Note que o nome do diretório público não é incluido na 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 diretório <tt>./views</tt>.
109
+ Para utilizar um diretório view 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 em um sub-diretório (nesse
115
+ caso utilize <tt>:'subdir/template'</tt>). Métodos de renderização irão processar
116
+ qualquer string passada diretamente para elas.
117
+
118
+ === Haml Templates
119
+
120
+ A gem/biblioteca haml é necessária para renderizar templates HAML:
121
+
122
+ # Você precisa do 'require haml' em sua 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 setadas 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
+ # Você precisa do 'require erb' em sua 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
+ # Você precisa do 'require erubis' em sua 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
+ # Você precisa do 'require builder' em sua 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
+ # Você precisa do 'require haml' ou 'require sass' em sua 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 setadas 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
+ # Você precisa do 'require less' em sua 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
+ === Inline Templates
222
+
223
+ get '/' do
224
+ haml '%div.title Olá Mundo'
225
+ end
226
+
227
+ Renderiza a string, em uma linha, no template.
228
+
229
+ === Acessando Variáveis nos Templates
230
+
231
+ Templates são avaliados dentro do mesmo contexto como manipuladores de rota. Variáveis
232
+ de instância setadas em rotas manipuladas são diretamente acessadas 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 utilizando quando renderizamos templates como 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 você tem templates
271
+ inline no outro 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 toda vez que um
290
+ template for renderizado. Você pode desabilitar layouts passando <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 pode modificar a requisição e a reposta. Variáveis de instância setadas nos
315
+ filtros são acessadas através de rotas e templates:
316
+
317
+ before do
318
+ @nota = 'Oi!'
319
+ request.path_info = '/foo/bar/baz'
320
+ end
321
+
322
+ get '/foo/*' do
323
+ @nota #=> 'Oi!'
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 acessadas através dos filtros after:
330
+
331
+ after do
332
+ puts response.status
333
+ end
334
+
335
+ Filtros opcionalmente tem 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
+ authenticate!
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 com um filtro ou rota utilize:
349
+
350
+ halt
351
+
352
+ Você também pode especificar o status quando parar...
353
+
354
+ halt 410
355
+
356
+ Ou com corpo de texto...
357
+
358
+ halt 'isso será o corpo do 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
+ Uma rota pode processar aposta para a próxima rota correspondente usando <tt>pass</tt>:
371
+
372
+ get '/adivinhar/:quem' do
373
+ pass unless params[:quem] == 'Frank'
374
+ 'Você me pegou!'
375
+ end
376
+
377
+ get '/adivinhar/*' do
378
+ 'Você falhou!'
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
+ Rodando uma vez, na inicialização, em qualquer ambiente:
387
+
388
+ configure do
389
+ ...
390
+ end
391
+
392
+ Rodando somente quando o ambiente (RACK_ENV environment variável) é setado para
393
+ <tt>:production</tt>:
394
+
395
+ configure :production do
396
+ ...
397
+ end
398
+
399
+ Rodando quando o ambiente é setado para <tt>:production</tt> ou
400
+ <tt>:test</tt>:
401
+
402
+ configure :production, :test do
403
+ ...
404
+ end
405
+
406
+ == Tratamento de Erros
407
+
408
+ Tratamento de erros rodam dentro do mesmo contexto como rotas e filtros before, o
409
+ que significa que você pega todos os presentes que tem para oferecer, como <tt>haml</tt>, <tt>erb</tt>,
410
+ <tt>halt</tt>, etc.
411
+
412
+ === Não Encontrado
413
+
414
+ Quando um <tt>Sinatra::NotFound</tt> exception é levantado, ou o código de status
415
+ da reposta é 404, o <tt>not_found</tt> manipulador é invocado:
416
+
417
+ not_found do
418
+ 'Isto está longe de ser encontrado'
419
+ end
420
+
421
+ === Erro
422
+
423
+ O manipulador +error+ é invocado toda a vez que uma exceção é lançada a partir de
424
+ um bloco de rota ou um filtro. O objeto da exceção pode ser obtido a partir da variável
425
+ Rack <tt>sinatra.error</tt>:
426
+
427
+ error do
428
+ 'Desculpe, houve um erro desagradável - ' + env['sinatra.error'].name
429
+ end
430
+
431
+ Erros customizados:
432
+
433
+ error MeuErroCustomizado do
434
+ 'Então que aconteceu foi...' + env['sinatra.error'].message
435
+ end
436
+
437
+ Então, se isso acontecer:
438
+
439
+ get '/' do
440
+ raise MeuErroCustomizado, 'alguma coisa ruim'
441
+ end
442
+
443
+ Você receberá isso:
444
+
445
+ Então que aconteceu foi... alguma coisa ruim
446
+
447
+ Alternativamente, você pode instalar manipulador de erro para um código de status:
448
+
449
+ error 403 do
450
+ 'Accesso negado'
451
+ end
452
+
453
+ get '/secreto' do
454
+ 403
455
+ end
456
+
457
+ Ou um range:
458
+
459
+ error 400..510 do
460
+ 'Boom'
461
+ end
462
+
463
+ O Sinatra instala os manipuladores especiais <tt>not_found</tt> e <tt>error</tt> quando
464
+ roda sobre o ambiente de desenvolvimento.
465
+
466
+ == Mime Types
467
+
468
+ Quando utilizamos <tt>send_file</tt> ou arquivos estáticos você pode ter mime types Sinatra
469
+ não entendidos. Use +mime_type+ para registrar eles por extensão de arquivos:
470
+
471
+ mime_type :foo, 'text/foo'
472
+
473
+ Você também pode utilizar isto com o helper +content_type+:
474
+
475
+ content_type :foo
476
+
477
+ == Middleware Rack
478
+
479
+ O Sinatra roda no Rack[http://rack.rubyforge.org/], uma interface padrão
480
+ mínima para frameworks web em Ruby. Um das capacidades mais interessantes do Rack
481
+ para desenvolver aplicativos é suporte a "middleware" -- componentes que ficam
482
+ entre o servidor e sua aplicação monitorando e/ou manipulando o request/response do
483
+ HTTP para prover vários tipos de funcionalidades comuns.
484
+
485
+ O Sinatra faz construtores pipelines do middleware Rack facilmente em um nível superior
486
+ utilizando o método +use+:
487
+
488
+ require 'sinatra'
489
+ require 'meu_middleware_customizado'
490
+
491
+ use Rack::Lint
492
+ use MeuMiddlewareCustomizado
493
+
494
+ get '/ola' do
495
+ 'Olá mundo'
496
+ end
497
+
498
+ A semântica de +use+ é idêntica aquela definida para a DSL
499
+ Rack::Builder[http://rack.rubyforge.org/doc/classes/Rack/Builder.html]
500
+ (mais frequentemente utilizada para arquivos rackup). Por exemplo, o método +use+
501
+ aceita múltiplos argumentos/variáveis bem como blocos:
502
+
503
+ use Rack::Auth::Basic do |usuario, senha|
504
+ usuario == 'admin' && senha == 'secreto'
505
+ end
506
+
507
+ O Rack é distribuido com uma variedade de middleware padrões para logs,
508
+ debugs, rotas de URL, autenticação, e manipuladores de sessão. Sinatra utilizada
509
+ muitos desses componentes automaticamente baseando sobre configuração, então, tipicamente
510
+ você não tem +use+ explicitamente.
511
+
512
+ == Testando
513
+
514
+ Testes no Sinatra podem ser escritos utilizando qualquer biblioteca ou framework
515
+ de teste baseados no Rack. {Rack::Test}[http://gitrdoc.com/brynary/rack-test] é
516
+ recomendado:
517
+
518
+ require 'minha_aplicacao_sinatra'
519
+ require 'rack/test'
520
+
521
+ class MinhaAplicacaoTeste < Test::Unit::TestCase
522
+ include Rack::Test::Methods
523
+
524
+ def app
525
+ Sinatra::Application
526
+ end
527
+
528
+ def meu_test_default
529
+ get '/'
530
+ assert_equal 'Ola Mundo!', last_response.body
531
+ end
532
+
533
+ def teste_com_parametros
534
+ get '/atender', :name => 'Frank'
535
+ assert_equal 'Olá Frank!', last_response.bodymeet
536
+ end
537
+
538
+ def test_com_ambiente_rack
539
+ get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
540
+ assert_equal "Você está utilizando o Songbird!", last_response.body
541
+ end
542
+ end
543
+
544
+ NOTA: Os módulos de classe embutidos Sinatra::Test e Sinatra::TestHarness
545
+ são depreciados na versão 0.9.2.
546
+
547
+ == Sinatra::Base - Middleware, Bibliotecas e aplicativos modulares
548
+
549
+ Definir sua aplicação em um nível superior de trabalho funciona bem para micro aplicativos, mas tem
550
+ consideráveis incovenientes na construção de componentes reutilizáveis como um middleware Rack,
551
+ metal Rails, bibliotecas simples como um componente de servidor, ou
552
+ mesmo extensões Sinatra. A DSL de nível superior polui o espaço do objeto
553
+ e assume um estilo de configuração de micro aplicativos (exemplo: uma simples arquivo de
554
+ aplicação, diretórios ./public e ./views, logs, página de detalhes de exceção,
555
+ etc.). É onde o Sinatra::Base entra em jogo:
556
+
557
+ require 'sinatra/base'
558
+
559
+ class MinhaApp < Sinatra::Base
560
+ set :sessions, true
561
+ set :foo, 'bar'
562
+
563
+ get '/' do
564
+ 'Ola mundo!'
565
+ end
566
+ end
567
+
568
+ A classe MinhaApp é um componente Rack independente que pode agir como um
569
+ middleware Rack, uma aplicação Rack, ou metal Rails. Você pode +utilizar+ ou
570
+ +executar+ esta classe com um arquivo rackup +config.ru+; ou, controlar um componente
571
+ de servidor fornecendo como biblioteca:
572
+
573
+ MinhaApp.run! :host => 'localhost', :port => 9090
574
+
575
+ Os métodos disponíveis para subclasses Sinatra::Base são exatamente como aqueles
576
+ disponíveis via a DSL de nível superior. Aplicações de nível mais alto podem ser convertidas para
577
+ componentes Sinatra::Base com duas modificações:
578
+
579
+ * Seu arquivo deve requerer +sinatra/base+ ao invés de +sinatra+;
580
+ outra coisa, todos os métodos DSL do Sinatra são importados para o espaço
581
+ principal.
582
+ * Coloque as rotas da sua aplicação, manipuladores de erro, filtros e opções na subclasse de
583
+ um Sinatra::Base.
584
+
585
+ +Sinatra::Base+ é um quadro branco. Muitas opções são desabilitadas por padrão,
586
+ incluindo o servidor embutido. Veja {Opções e Configurações}[http://sinatra.github.com/configuration.html]
587
+ para detalhes de opções disponíveis e seus comportamentos.
588
+
589
+ SIDEBAR: A DSL de alto nível do Sinatra é implementada utilizando um simples sistema de
590
+ delegação. A classe +Sinatra::Application+ -- uma subclasse especial da
591
+ Sinatra::Base -- recebe todos os :get, :put, :post, :delete, :before,
592
+ :error, :not_found, :configure, e :set messages enviados para o
593
+ alto nível. Dê uma olhada no código você mesmo: aqui está o
594
+ {Sinatra::Delegator mixin}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/base.rb#L1128]
595
+ sendo {incluido dentro de um espaço principal}[http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854f606fe5992/lib/sinatra/main.rb#L28]
596
+
597
+ == Linha de Comando
598
+
599
+ Aplicações Sinatra podem ser executadas diretamente:
600
+
601
+ ruby minhaapp.rb [-h] [-x] [-e AMBIENTE] [-p PORTA] [-o HOST] [-s SERVIDOR]
602
+
603
+ As opções são:
604
+
605
+ -h # ajuda
606
+ -p # define a porta (padrão é 4567)
607
+ -o # define o host (padrão é 0.0.0.0)
608
+ -e # define o ambiente (padrão é development)
609
+ -s # especifica o servidor/manipulador rack (padrão é thin)
610
+ -x # ativa o bloqueio (padrão é desligado)
611
+
612
+ == A última versão
613
+
614
+ Se você gostaria de utilizar o código da última versão do Sinatra, crie um clone
615
+ local e execute sua aplicação com o diretório <tt>sinatra/lib</tt> no
616
+ <tt>LOAD_PATH</tt>:
617
+
618
+ cd minhaapp
619
+ git clone git://github.com/sinatra/sinatra.git
620
+ ruby -I sinatra/lib minhaapp.rb
621
+
622
+ Alternativamente, você pode adicionar o diretório do <tt>sinatra/lib</tt> no
623
+ <tt>LOAD_PATH</tt> do seu aplicativo:
624
+
625
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/sinatra/lib'
626
+ require 'rubygems'
627
+ require 'sinatra'
628
+
629
+ get '/sobre' do
630
+ "Estou rodando a versão" + Sinatra::VERSION
631
+ end
632
+
633
+ Para atualizar o código do Sinatra no futuro:
634
+
635
+ cd meuprojeto/sinatra
636
+ git pull
637
+
638
+ == Mais
639
+
640
+ * {Website do Projeto}[http://www.sinatrarb.com/] - Documentação adicional,
641
+ novidades e links para outros recursos.
642
+ * {Contribuir}[http://www.sinatrarb.com/contributing] - Encontrar um bug? Precisa
643
+ de ajuda? Tem um patch?
644
+ * {Acompanhar Questões}[http://github.com/sinatra/sinatra/issues]
645
+ * {Twitter}[http://twitter.com/sinatra]
646
+ * {Lista de Email}[http://groups.google.com/group/sinatrarb/topics]
647
+ * {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] em http://freenode.net