sinatra 1.4.6 → 1.4.7
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 +4 -4
- data/AUTHORS.md +5 -2
- data/{CHANGES → CHANGELOG.md} +17 -1
- data/CONTRIBUTING.md +100 -0
- data/LICENSE +2 -2
- data/README.de.md +78 -41
- data/README.es.md +200 -165
- data/README.fr.md +364 -338
- data/README.hu.md +7 -7
- data/README.ja.md +199 -167
- data/README.ko.md +222 -183
- data/README.md +218 -179
- data/README.pt-br.md +146 -112
- data/README.pt-pt.md +63 -63
- data/README.ru.md +158 -35
- data/README.zh.md +1941 -1235
- data/Rakefile +2 -2
- data/lib/sinatra/base.rb +16 -24
- data/lib/sinatra/ext.rb +17 -0
- data/lib/sinatra/show_exceptions.rb +13 -7
- data/lib/sinatra/version.rb +1 -1
- data/sinatra.gemspec +1 -1
- data/test/public/hello+world.txt +1 -0
- data/test/routing_test.rb +44 -0
- data/test/static_test.rb +30 -0
- metadata +9 -6
data/README.pt-pt.md
CHANGED
@@ -4,10 +4,10 @@
|
|
4
4
|
pode estar desatualizado.*
|
5
5
|
|
6
6
|
Sinatra é uma
|
7
|
-
[DSL](
|
7
|
+
[DSL](https://pt.wikipedia.org/wiki/Linguagem_de_domínio_específico) para
|
8
8
|
criar rapidamente aplicações web em Ruby com o mínimo de esforço:
|
9
9
|
|
10
|
-
```
|
10
|
+
```ruby
|
11
11
|
# minhaapp.rb
|
12
12
|
require 'rubygems'
|
13
13
|
require 'sinatra'
|
@@ -18,19 +18,19 @@ end
|
|
18
18
|
|
19
19
|
Instale a gem e execute com:
|
20
20
|
|
21
|
-
```
|
21
|
+
```shell
|
22
22
|
sudo gem install sinatra
|
23
23
|
ruby minhaapp.rb
|
24
24
|
```
|
25
25
|
|
26
|
-
Aceda em: [localhost:4567](http://localhost:4567)
|
26
|
+
Aceda em: [http://localhost:4567](http://localhost:4567)
|
27
27
|
|
28
28
|
## Rotas
|
29
29
|
|
30
30
|
No Sinatra, uma rota é um metodo HTTP associado a uma URL correspondente
|
31
31
|
padrão. Cada rota é associada a um bloco:
|
32
32
|
|
33
|
-
```
|
33
|
+
```ruby
|
34
34
|
get '/' do
|
35
35
|
.. mostrar algo ..
|
36
36
|
end
|
@@ -54,7 +54,7 @@ Rotas são encontradas na ordem em que são definidas. A primeira rota que
|
|
54
54
|
Padrões de rota podem incluir parâmetros nomeados, acessíveis através da
|
55
55
|
hash `params`:
|
56
56
|
|
57
|
-
```
|
57
|
+
```ruby
|
58
58
|
get '/ola/:nome' do
|
59
59
|
# corresponde a "GET /ola/foo" e "GET /ola/bar"
|
60
60
|
# params['nome'] é 'foo' ou 'bar'
|
@@ -64,7 +64,7 @@ end
|
|
64
64
|
|
65
65
|
Pode também aceder a parâmetros nomeados através do bloco de parâmetros:
|
66
66
|
|
67
|
-
```
|
67
|
+
```ruby
|
68
68
|
get '/ola/:nome' do |n|
|
69
69
|
"Olá #{n}!"
|
70
70
|
end
|
@@ -73,7 +73,7 @@ end
|
|
73
73
|
Padrões de rota podem também incluir parâmetros splat (asteriscos),
|
74
74
|
acessíveis através do array `params['splat']`.
|
75
75
|
|
76
|
-
```
|
76
|
+
```ruby
|
77
77
|
get '/diga/*/ao/*' do
|
78
78
|
# corresponde a /diga/ola/ao/mundo
|
79
79
|
params['splat'] # => ["ola", "mundo"]
|
@@ -87,7 +87,7 @@ end
|
|
87
87
|
|
88
88
|
Rotas correspondem-se com expressões regulares:
|
89
89
|
|
90
|
-
```
|
90
|
+
```ruby
|
91
91
|
get /\A\/ola\/([\w]+)\z/ do
|
92
92
|
"Olá, #{params['captures'].first}!"
|
93
93
|
end
|
@@ -95,7 +95,7 @@ end
|
|
95
95
|
|
96
96
|
Ou com um bloco de parâmetro:
|
97
97
|
|
98
|
-
```
|
98
|
+
```ruby
|
99
99
|
get %r{/ola/([\w]+)} do |c|
|
100
100
|
"Olá, #{c}!"
|
101
101
|
end
|
@@ -104,7 +104,7 @@ end
|
|
104
104
|
Rotas podem incluir uma variedade de condições correspondentes, por
|
105
105
|
exemplo, o agente usuário:
|
106
106
|
|
107
|
-
```
|
107
|
+
```ruby
|
108
108
|
get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
|
109
109
|
"Você está a utilizar a versão #{params['agent'][0]} do Songbird."
|
110
110
|
end
|
@@ -120,7 +120,7 @@ Arquivos estáticos são disponibilizados a partir do directório
|
|
120
120
|
`./public`. Você pode especificar um local diferente através da opção
|
121
121
|
`:public_folder`
|
122
122
|
|
123
|
-
```
|
123
|
+
```ruby
|
124
124
|
set :public_folder, File.dirname(__FILE__) + '/estatico'
|
125
125
|
```
|
126
126
|
|
@@ -133,7 +133,7 @@ Note que o nome do directório público não é incluido no URL. Um arquivo
|
|
133
133
|
Templates presumem-se estar localizados sob o directório `./views`. Para
|
134
134
|
utilizar um directório de views diferente:
|
135
135
|
|
136
|
-
```
|
136
|
+
```ruby
|
137
137
|
set :views, File.dirname(__FILE__) + '/modelo'
|
138
138
|
```
|
139
139
|
|
@@ -146,7 +146,7 @@ processar qualquer string passada directamente para elas.
|
|
146
146
|
|
147
147
|
A gem/biblioteca haml é necessária para renderizar templates HAML:
|
148
148
|
|
149
|
-
```
|
149
|
+
```ruby
|
150
150
|
# É necessário requerir 'haml' na aplicação.
|
151
151
|
require 'haml'
|
152
152
|
|
@@ -158,13 +158,13 @@ end
|
|
158
158
|
Renderiza `./views/index.haml`.
|
159
159
|
|
160
160
|
[Opções
|
161
|
-
Haml](http://haml.info/docs/yardoc/file.
|
161
|
+
Haml](http://haml.info/docs/yardoc/file.REFERENCE.html#options)
|
162
162
|
podem ser definidas globalmente através das configurações do sinatra,
|
163
163
|
veja [Opções e
|
164
164
|
Configurações](http://www.sinatrarb.com/configuration.html), e substitua
|
165
165
|
em uma requisição individual.
|
166
166
|
|
167
|
-
```
|
167
|
+
```ruby
|
168
168
|
set :haml, {:format => :html5 } # o formato padrão do Haml é :xhtml
|
169
169
|
|
170
170
|
get '/' do
|
@@ -174,7 +174,7 @@ end
|
|
174
174
|
|
175
175
|
### Erb Templates
|
176
176
|
|
177
|
-
```
|
177
|
+
```ruby
|
178
178
|
# É necessário requerir 'erb' na aplicação.
|
179
179
|
require 'erb'
|
180
180
|
|
@@ -189,7 +189,7 @@ Renderiza `./views/index.erb`
|
|
189
189
|
|
190
190
|
A gem/biblioteca erubis é necessária para renderizar templates erubis:
|
191
191
|
|
192
|
-
```
|
192
|
+
```ruby
|
193
193
|
# É necessário requerir 'erubis' na aplicação.
|
194
194
|
require 'erubis'
|
195
195
|
|
@@ -204,7 +204,7 @@ Renderiza `./views/index.erubis`
|
|
204
204
|
|
205
205
|
A gem/biblioteca builder é necessária para renderizar templates builder:
|
206
206
|
|
207
|
-
```
|
207
|
+
```ruby
|
208
208
|
# É necessário requerir 'builder' na aplicação.
|
209
209
|
require 'builder'
|
210
210
|
|
@@ -220,7 +220,7 @@ Renderiza `./views/index.builder`.
|
|
220
220
|
|
221
221
|
A gem/biblioteca sass é necessária para renderizar templates sass:
|
222
222
|
|
223
|
-
```
|
223
|
+
```ruby
|
224
224
|
# É necessário requerir 'haml' ou 'sass' na aplicação.
|
225
225
|
require 'sass'
|
226
226
|
|
@@ -233,13 +233,13 @@ end
|
|
233
233
|
Renderiza `./views/stylesheet.sass`.
|
234
234
|
|
235
235
|
[Opções
|
236
|
-
Sass](http://sass-lang.com/
|
236
|
+
Sass](http://sass-lang.com/documentation/file.SASS_REFERENCE.html#options)
|
237
237
|
podem ser definidas globalmente através das configurações do sinatra,
|
238
238
|
veja [Opções e
|
239
239
|
Configurações](http://www.sinatrarb.com/configuration.html), e substitua
|
240
240
|
em uma requisição individual.
|
241
241
|
|
242
|
-
```
|
242
|
+
```ruby
|
243
243
|
set :sass, {:style => :compact } # o estilo padrão do Sass é :nested
|
244
244
|
|
245
245
|
get '/stylesheet.css' do
|
@@ -252,7 +252,7 @@ end
|
|
252
252
|
|
253
253
|
A gem/biblioteca less é necessária para renderizar templates Less:
|
254
254
|
|
255
|
-
```
|
255
|
+
```ruby
|
256
256
|
# É necessário requerir 'less' na aplicação.
|
257
257
|
require 'less'
|
258
258
|
|
@@ -266,7 +266,7 @@ Renderiza `./views/stylesheet.less`.
|
|
266
266
|
|
267
267
|
### Templates Inline
|
268
268
|
|
269
|
-
```
|
269
|
+
```ruby
|
270
270
|
get '/' do
|
271
271
|
haml '%div.title Olá Mundo'
|
272
272
|
end
|
@@ -280,7 +280,7 @@ Templates são avaliados dentro do mesmo contexto que os manipuladores de
|
|
280
280
|
rota. Variáveis de instância definidas em rotas manipuladas são
|
281
281
|
directamente acedidas por templates:
|
282
282
|
|
283
|
-
```
|
283
|
+
```ruby
|
284
284
|
get '/:id' do
|
285
285
|
@foo = Foo.find(params['id'])
|
286
286
|
haml '%h1= @foo.nome'
|
@@ -289,7 +289,7 @@ end
|
|
289
289
|
|
290
290
|
Ou, especifique um hash explícito para variáveis locais:
|
291
291
|
|
292
|
-
```
|
292
|
+
```ruby
|
293
293
|
get '/:id' do
|
294
294
|
foo = Foo.find(params['id'])
|
295
295
|
haml '%h1= foo.nome', :locals => { :foo => foo }
|
@@ -303,7 +303,7 @@ Isso é tipicamente utilizado quando renderizamos templates parciais
|
|
303
303
|
|
304
304
|
Templates podem ser definidos no final do arquivo fonte(.rb):
|
305
305
|
|
306
|
-
```
|
306
|
+
```ruby
|
307
307
|
require 'rubygems'
|
308
308
|
require 'sinatra'
|
309
309
|
|
@@ -330,7 +330,7 @@ templates inline no outro arquivo fonte.
|
|
330
330
|
Templates também podem ser definidos utilizando o método top-level
|
331
331
|
`template`:
|
332
332
|
|
333
|
-
```
|
333
|
+
```ruby
|
334
334
|
template :layout do
|
335
335
|
"%html\n =yield\n"
|
336
336
|
end
|
@@ -348,7 +348,7 @@ Se existir um template com nome “layout”, ele será utilizado sempre que
|
|
348
348
|
um template for renderizado. Pode desactivar layouts usando
|
349
349
|
`:layout => false`.
|
350
350
|
|
351
|
-
```
|
351
|
+
```ruby
|
352
352
|
get '/' do
|
353
353
|
haml :index, :layout => !request.xhr?
|
354
354
|
end
|
@@ -359,7 +359,7 @@ end
|
|
359
359
|
Use o método de alto nível `helpers` para definir métodos auxiliares
|
360
360
|
para utilizar em manipuladores de rotas e modelos:
|
361
361
|
|
362
|
-
```
|
362
|
+
```ruby
|
363
363
|
helpers do
|
364
364
|
def bar(nome)
|
365
365
|
"#{nome}bar"
|
@@ -378,7 +378,7 @@ da requisição e podem modificar a requisição e a reposta. Variáveis de
|
|
378
378
|
instância definidas nos filtros são acedidas através de rotas e
|
379
379
|
templates:
|
380
380
|
|
381
|
-
```
|
381
|
+
```ruby
|
382
382
|
before do
|
383
383
|
@nota = 'Olá!'
|
384
384
|
request.path_info = '/foo/bar/baz'
|
@@ -395,7 +395,7 @@ requisição e também podem modificar o pedido e a resposta. Variáveis de
|
|
395
395
|
instância definidas nos filtros before e rotas são acedidas através dos
|
396
396
|
filtros after:
|
397
397
|
|
398
|
-
```
|
398
|
+
```ruby
|
399
399
|
after do
|
400
400
|
puts response.status
|
401
401
|
end
|
@@ -404,7 +404,7 @@ end
|
|
404
404
|
Filtros opcionalmente têm um padrão, fazendo com que sejam avaliados
|
405
405
|
somente se o caminho do pedido coincidir com esse padrão:
|
406
406
|
|
407
|
-
```
|
407
|
+
```ruby
|
408
408
|
before '/protected/*' do
|
409
409
|
autenticar!
|
410
410
|
end
|
@@ -419,31 +419,31 @@ end
|
|
419
419
|
Para parar imediatamente uma requisição dentro de um filtro ou rota
|
420
420
|
utilize:
|
421
421
|
|
422
|
-
```
|
422
|
+
```ruby
|
423
423
|
halt
|
424
424
|
```
|
425
425
|
|
426
426
|
Pode também especificar o status ao parar…
|
427
427
|
|
428
|
-
```
|
428
|
+
```ruby
|
429
429
|
halt 410
|
430
430
|
```
|
431
431
|
|
432
432
|
Ou com um corpo de texto…
|
433
433
|
|
434
|
-
```
|
434
|
+
```ruby
|
435
435
|
halt 'isto será o corpo de texto'
|
436
436
|
```
|
437
437
|
|
438
438
|
Ou também…
|
439
439
|
|
440
|
-
```
|
440
|
+
```ruby
|
441
441
|
halt 401, 'vamos embora!'
|
442
442
|
```
|
443
443
|
|
444
444
|
Com cabeçalhos…
|
445
445
|
|
446
|
-
```
|
446
|
+
```ruby
|
447
447
|
halt 402, {'Content-Type' => 'text/plain'}, 'revanche'
|
448
448
|
```
|
449
449
|
|
@@ -452,7 +452,7 @@ halt 402, {'Content-Type' => 'text/plain'}, 'revanche'
|
|
452
452
|
Dentro de uma rota, pode passar para a próxima rota correspondente
|
453
453
|
usando `pass`:
|
454
454
|
|
455
|
-
```
|
455
|
+
```ruby
|
456
456
|
get '/adivinhar/:quem' do
|
457
457
|
pass unless params['quem'] == 'Frank'
|
458
458
|
'Apanhaste-me!'
|
@@ -471,7 +471,7 @@ próxima rota de parâmetro. Se o parâmetro da rota não for encontrado, um
|
|
471
471
|
|
472
472
|
Correndo uma vez, na inicialização, em qualquer ambiente:
|
473
473
|
|
474
|
-
```
|
474
|
+
```ruby
|
475
475
|
configure do
|
476
476
|
...
|
477
477
|
end
|
@@ -480,7 +480,7 @@ end
|
|
480
480
|
Correndo somente quando o ambiente (`RACK_ENV` environment variável) é
|
481
481
|
definido para `:production`:
|
482
482
|
|
483
|
-
```
|
483
|
+
```ruby
|
484
484
|
configure :production do
|
485
485
|
...
|
486
486
|
end
|
@@ -488,7 +488,7 @@ end
|
|
488
488
|
|
489
489
|
Correndo quando o ambiente é definido para `:production` ou `:test`:
|
490
490
|
|
491
|
-
```
|
491
|
+
```ruby
|
492
492
|
configure :production, :test do
|
493
493
|
...
|
494
494
|
end
|
@@ -504,7 +504,7 @@ signifca que `haml`, `erb`, etc, estão disponíveis.
|
|
504
504
|
Quando um `Sinatra::NotFound` exception é levantado, ou o código de
|
505
505
|
status da reposta é 404, o manipulador `not_found` é invocado:
|
506
506
|
|
507
|
-
```
|
507
|
+
```ruby
|
508
508
|
not_found do
|
509
509
|
'Isto está longe de ser encontrado'
|
510
510
|
end
|
@@ -516,7 +516,7 @@ O manipulador `error` é invocado sempre que uma exceção é lançada a
|
|
516
516
|
partir de um bloco de rota ou um filtro. O objecto da exceção pode ser
|
517
517
|
obtido a partir da variável Rack `sinatra.error`:
|
518
518
|
|
519
|
-
```
|
519
|
+
```ruby
|
520
520
|
error do
|
521
521
|
'Peço desculpa, houve um erro desagradável - ' + env['sinatra.error'].message
|
522
522
|
end
|
@@ -524,7 +524,7 @@ end
|
|
524
524
|
|
525
525
|
Erros personalizados:
|
526
526
|
|
527
|
-
```
|
527
|
+
```ruby
|
528
528
|
error MeuErroPersonalizado do
|
529
529
|
'O que aconteceu foi...' + env['sinatra.error'].message
|
530
530
|
end
|
@@ -532,7 +532,7 @@ end
|
|
532
532
|
|
533
533
|
Então, se isso acontecer:
|
534
534
|
|
535
|
-
```
|
535
|
+
```ruby
|
536
536
|
get '/' do
|
537
537
|
raise MeuErroPersonalizado, 'alguma coisa desagradável'
|
538
538
|
end
|
@@ -547,7 +547,7 @@ O que aconteceu foi...alguma coisa desagradável
|
|
547
547
|
Alternativamente, pode definir um manipulador de erro para um código de
|
548
548
|
status:
|
549
549
|
|
550
|
-
```
|
550
|
+
```ruby
|
551
551
|
error 403 do
|
552
552
|
'Accesso negado'
|
553
553
|
end
|
@@ -559,7 +559,7 @@ end
|
|
559
559
|
|
560
560
|
Ou um range (alcance):
|
561
561
|
|
562
|
-
```
|
562
|
+
```ruby
|
563
563
|
error 400..510 do
|
564
564
|
'Boom'
|
565
565
|
end
|
@@ -574,13 +574,13 @@ Quando utilizamos `send_file` ou arquivos estáticos pode ter mime types
|
|
574
574
|
Sinatra não entendidos. Use `mime_type` para os registar por extensão de
|
575
575
|
arquivos:
|
576
576
|
|
577
|
-
```
|
577
|
+
```ruby
|
578
578
|
mime_type :foo, 'text/foo'
|
579
579
|
```
|
580
580
|
|
581
581
|
Pode também utilizar isto com o helper `content_type`:
|
582
582
|
|
583
|
-
```
|
583
|
+
```ruby
|
584
584
|
content_type :foo
|
585
585
|
```
|
586
586
|
|
@@ -596,7 +596,7 @@ para providenciar varios tipos de funcionalidades comuns.
|
|
596
596
|
O Sinatra torna a construção de pipelines do middleware Rack fácil a um
|
597
597
|
nível superior utilizando o método `use`:
|
598
598
|
|
599
|
-
```
|
599
|
+
```ruby
|
600
600
|
require 'sinatra'
|
601
601
|
require 'meu_middleware_personalizado'
|
602
602
|
|
@@ -609,11 +609,11 @@ end
|
|
609
609
|
```
|
610
610
|
|
611
611
|
A semântica de `use` é idêntica aquela definida para a DSL
|
612
|
-
[Rack::Builder](http://rubydoc.info/github/rack/rack/master/Rack/Builder)
|
612
|
+
[Rack::Builder](http://www.rubydoc.info/github/rack/rack/master/Rack/Builder)
|
613
613
|
(mais frequentemente utilizada para arquivos rackup). Por exemplo, o
|
614
614
|
método `use` aceita múltiplos argumentos/variáveis, bem como blocos:
|
615
615
|
|
616
|
-
```
|
616
|
+
```ruby
|
617
617
|
use Rack::Auth::Basic do |utilizador, senha|
|
618
618
|
utilizador == 'admin' && senha == 'secreto'
|
619
619
|
end
|
@@ -631,7 +631,7 @@ Testes no Sinatra podem ser escritos utilizando qualquer biblioteca ou
|
|
631
631
|
framework de teste baseados no Rack.
|
632
632
|
[Rack::Test](http://gitrdoc.com/brynary/rack-test) é recomendado:
|
633
633
|
|
634
|
-
```
|
634
|
+
```ruby
|
635
635
|
require 'minha_aplicacao_sinatra'
|
636
636
|
require 'rack/test'
|
637
637
|
|
@@ -673,7 +673,7 @@ estilo de configuração de micro aplicativos (exemplo: um simples arquivo
|
|
673
673
|
de aplicação, directórios `./public` e `./views`, logs, página de detalhes
|
674
674
|
de excepção, etc.). É onde o Sinatra::Base entra em jogo:
|
675
675
|
|
676
|
-
```
|
676
|
+
```ruby
|
677
677
|
require 'sinatra/base'
|
678
678
|
|
679
679
|
class MinhaApp < Sinatra::Base
|
@@ -691,7 +691,7 @@ como um middleware Rack, uma aplicação Rack, ou metal Rails. Pode
|
|
691
691
|
utilizar ou executar esta classe com um arquivo rackup `config.ru`;
|
692
692
|
ou, controlar um componente de servidor fornecendo como biblioteca:
|
693
693
|
|
694
|
-
```
|
694
|
+
```ruby
|
695
695
|
MinhaApp.run! :host => 'localhost', :port => 9090
|
696
696
|
```
|
697
697
|
|
@@ -709,7 +709,7 @@ modificações:
|
|
709
709
|
|
710
710
|
`Sinatra::Base` é um quadro branco. Muitas opções são desactivadas por
|
711
711
|
padrão, incluindo o servidor embutido. Veja [Opções e
|
712
|
-
Configurações](http://
|
712
|
+
Configurações](http://www.sinatrarb.com/configuration.html) para
|
713
713
|
detalhes de opções disponíveis e seus comportamentos.
|
714
714
|
|
715
715
|
SIDEBAR: A DSL de alto nível do Sinatra é implementada utilizando um simples
|
@@ -726,7 +726,7 @@ principal](http://github.com/sinatra/sinatra/blob/ceac46f0bc129a6e994a06100aa854
|
|
726
726
|
|
727
727
|
As aplicações Sinatra podem ser executadas directamente:
|
728
728
|
|
729
|
-
```
|
729
|
+
```shell
|
730
730
|
ruby minhaapp.rb [-h] [-x] [-e AMBIENTE] [-p PORTA] [-o HOST] [-s SERVIDOR]
|
731
731
|
```
|
732
732
|
|
@@ -747,7 +747,7 @@ Se gostaria de utilizar o código da última versão do Sinatra, crie um
|
|
747
747
|
clone local e execute sua aplicação com o directório `sinatra/lib` no
|
748
748
|
`LOAD_PATH`:
|
749
749
|
|
750
|
-
```
|
750
|
+
```shell
|
751
751
|
cd minhaapp
|
752
752
|
git clone git://github.com/sinatra/sinatra.git
|
753
753
|
ruby -I sinatra/lib minhaapp.rb
|
@@ -756,7 +756,7 @@ ruby -I sinatra/lib minhaapp.rb
|
|
756
756
|
Alternativamente, pode adicionar o directório do `sinatra/lib` no
|
757
757
|
`LOAD_PATH` do seu aplicativo:
|
758
758
|
|
759
|
-
```
|
759
|
+
```ruby
|
760
760
|
$LOAD_PATH.unshift File.dirname(__FILE__) + '/sinatra/lib'
|
761
761
|
require 'rubygems'
|
762
762
|
require 'sinatra'
|
@@ -768,7 +768,7 @@ end
|
|
768
768
|
|
769
769
|
Para actualizar o código do Sinatra no futuro:
|
770
770
|
|
771
|
-
```
|
771
|
+
```shell
|
772
772
|
cd meuprojeto/sinatra
|
773
773
|
git pull
|
774
774
|
```
|
@@ -781,9 +781,9 @@ git pull
|
|
781
781
|
- [Contribuir](http://www.sinatrarb.com/contributing) - Encontrou um
|
782
782
|
bug? Precisa de ajuda? Tem um patch?
|
783
783
|
|
784
|
-
- [Acompanhar Questões](
|
784
|
+
- [Acompanhar Questões](https://github.com/sinatra/sinatra/issues)
|
785
785
|
|
786
|
-
- [Twitter](
|
786
|
+
- [Twitter](https://twitter.com/sinatra)
|
787
787
|
|
788
788
|
- [Lista de Email](http://groups.google.com/group/sinatrarb/topics)
|
789
789
|
|