devcenter 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (192) hide show
  1. data/.gitignore +18 -0
  2. data/Gemfile +8 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +39 -0
  5. data/Rakefile +2 -0
  6. data/bin/devcenter +7 -0
  7. data/devcenter.gemspec +30 -0
  8. data/lib/devcenter.rb +6 -0
  9. data/lib/devcenter/cli.rb +45 -0
  10. data/lib/devcenter/coderay_extensions.rb +70 -0
  11. data/lib/devcenter/commands.rb +4 -0
  12. data/lib/devcenter/commands/base.rb +47 -0
  13. data/lib/devcenter/commands/open.rb +34 -0
  14. data/lib/devcenter/commands/preview.rb +28 -0
  15. data/lib/devcenter/commands/pull.rb +37 -0
  16. data/lib/devcenter/helpers.rb +41 -0
  17. data/lib/devcenter/layout.html +299 -0
  18. data/lib/devcenter/md_parser.rb +87 -0
  19. data/lib/devcenter/previewer.rb +36 -0
  20. data/lib/devcenter/previewer/assets/images/public/article-icon-large.png +0 -0
  21. data/lib/devcenter/previewer/assets/images/public/article-icon.png +0 -0
  22. data/lib/devcenter/previewer/assets/images/public/aside_accordion_indicator_default.png +0 -0
  23. data/lib/devcenter/previewer/assets/images/public/aside_accordion_indicator_open.png +0 -0
  24. data/lib/devcenter/previewer/assets/images/public/body_bg.png +0 -0
  25. data/lib/devcenter/previewer/assets/images/public/callout_bg.png +0 -0
  26. data/lib/devcenter/previewer/assets/images/public/feed-icon-sprite.png +0 -0
  27. data/lib/devcenter/previewer/assets/images/public/heroku-header-logo-mobile.png +0 -0
  28. data/lib/devcenter/previewer/assets/images/public/heroku-header-logo.png +0 -0
  29. data/lib/devcenter/previewer/assets/images/public/heroku-logo.png +0 -0
  30. data/lib/devcenter/previewer/assets/images/public/icon_sprite_16.png +0 -0
  31. data/lib/devcenter/previewer/assets/images/public/index_li_bullet.png +0 -0
  32. data/lib/devcenter/previewer/assets/images/public/intro_bg.png +0 -0
  33. data/lib/devcenter/previewer/assets/images/public/jive_discussion_arrow.png +0 -0
  34. data/lib/devcenter/previewer/assets/images/public/jive_discussion_glyph.png +0 -0
  35. data/lib/devcenter/previewer/assets/images/public/line.png +0 -0
  36. data/lib/devcenter/previewer/assets/images/public/pre_code_background.png +0 -0
  37. data/lib/devcenter/previewer/assets/images/public/search-icon.png +0 -0
  38. data/lib/devcenter/previewer/assets/images/public/search_glyph.png +0 -0
  39. data/lib/devcenter/previewer/assets/images/public/search_return.png +0 -0
  40. data/lib/devcenter/previewer/assets/images/public/tag-icon-large.png +0 -0
  41. data/lib/devcenter/previewer/assets/images/public/toc-icon.png +0 -0
  42. data/lib/devcenter/previewer/assets/public.css +2125 -0
  43. data/lib/devcenter/previewer/assets/public/article-icon-large.png +0 -0
  44. data/lib/devcenter/previewer/assets/public/article-icon.png +0 -0
  45. data/lib/devcenter/previewer/assets/public/aside_accordion_indicator_default.png +0 -0
  46. data/lib/devcenter/previewer/assets/public/aside_accordion_indicator_open.png +0 -0
  47. data/lib/devcenter/previewer/assets/public/body_bg.png +0 -0
  48. data/lib/devcenter/previewer/assets/public/callout_bg.png +0 -0
  49. data/lib/devcenter/previewer/assets/public/feed-icon-sprite.png +0 -0
  50. data/lib/devcenter/previewer/assets/public/heroku-header-logo-mobile.png +0 -0
  51. data/lib/devcenter/previewer/assets/public/heroku-header-logo.png +0 -0
  52. data/lib/devcenter/previewer/assets/public/heroku-logo.png +0 -0
  53. data/lib/devcenter/previewer/assets/public/icon_sprite_16.png +0 -0
  54. data/lib/devcenter/previewer/assets/public/index_li_bullet.png +0 -0
  55. data/lib/devcenter/previewer/assets/public/intro_bg.png +0 -0
  56. data/lib/devcenter/previewer/assets/public/jive_discussion_arrow.png +0 -0
  57. data/lib/devcenter/previewer/assets/public/jive_discussion_glyph.png +0 -0
  58. data/lib/devcenter/previewer/assets/public/line.png +0 -0
  59. data/lib/devcenter/previewer/assets/public/pre_code_background.png +0 -0
  60. data/lib/devcenter/previewer/assets/public/public.css +2125 -0
  61. data/lib/devcenter/previewer/assets/public/search-icon.png +0 -0
  62. data/lib/devcenter/previewer/assets/public/search_glyph.png +0 -0
  63. data/lib/devcenter/previewer/assets/public/search_return.png +0 -0
  64. data/lib/devcenter/previewer/assets/public/tag-icon-large.png +0 -0
  65. data/lib/devcenter/previewer/assets/public/toc-icon.png +0 -0
  66. data/lib/devcenter/previewer/file_listener.rb +23 -0
  67. data/lib/devcenter/previewer/views/article.erb +345 -0
  68. data/lib/devcenter/previewer/web_app.rb +53 -0
  69. data/lib/devcenter/previewer/web_server.rb +29 -0
  70. data/lib/devcenter/version.rb +3 -0
  71. data/vendor/sinatra/.gitignore +6 -0
  72. data/vendor/sinatra/.travis.yml +16 -0
  73. data/vendor/sinatra/.yardopts +4 -0
  74. data/vendor/sinatra/AUTHORS +61 -0
  75. data/vendor/sinatra/Gemfile +91 -0
  76. data/vendor/sinatra/LICENSE +22 -0
  77. data/vendor/sinatra/README.de.rdoc +2116 -0
  78. data/vendor/sinatra/README.es.rdoc +2106 -0
  79. data/vendor/sinatra/README.fr.rdoc +2133 -0
  80. data/vendor/sinatra/README.hu.rdoc +608 -0
  81. data/vendor/sinatra/README.jp.rdoc +1056 -0
  82. data/vendor/sinatra/README.ko.rdoc +1932 -0
  83. data/vendor/sinatra/README.pt-br.rdoc +778 -0
  84. data/vendor/sinatra/README.pt-pt.rdoc +647 -0
  85. data/vendor/sinatra/README.rdoc +2049 -0
  86. data/vendor/sinatra/README.ru.rdoc +2033 -0
  87. data/vendor/sinatra/README.zh.rdoc +1816 -0
  88. data/vendor/sinatra/Rakefile +182 -0
  89. data/vendor/sinatra/examples/chat.rb +61 -0
  90. data/vendor/sinatra/examples/simple.rb +3 -0
  91. data/vendor/sinatra/examples/stream.ru +26 -0
  92. data/vendor/sinatra/lib/sinatra.rb +5 -0
  93. data/vendor/sinatra/lib/sinatra/base.rb +1820 -0
  94. data/vendor/sinatra/lib/sinatra/images/404.png +0 -0
  95. data/vendor/sinatra/lib/sinatra/images/500.png +0 -0
  96. data/vendor/sinatra/lib/sinatra/main.rb +30 -0
  97. data/vendor/sinatra/lib/sinatra/showexceptions.rb +345 -0
  98. data/vendor/sinatra/lib/sinatra/version.rb +3 -0
  99. data/vendor/sinatra/sinatra.gemspec +18 -0
  100. data/vendor/sinatra/test/base_test.rb +172 -0
  101. data/vendor/sinatra/test/builder_test.rb +91 -0
  102. data/vendor/sinatra/test/coffee_test.rb +90 -0
  103. data/vendor/sinatra/test/compile_test.rb +139 -0
  104. data/vendor/sinatra/test/contest.rb +98 -0
  105. data/vendor/sinatra/test/creole_test.rb +65 -0
  106. data/vendor/sinatra/test/delegator_test.rb +160 -0
  107. data/vendor/sinatra/test/encoding_test.rb +20 -0
  108. data/vendor/sinatra/test/erb_test.rb +98 -0
  109. data/vendor/sinatra/test/extensions_test.rb +98 -0
  110. data/vendor/sinatra/test/filter_test.rb +437 -0
  111. data/vendor/sinatra/test/haml_test.rb +91 -0
  112. data/vendor/sinatra/test/helper.rb +123 -0
  113. data/vendor/sinatra/test/helpers_test.rb +1768 -0
  114. data/vendor/sinatra/test/integration/app.rb +62 -0
  115. data/vendor/sinatra/test/integration_helper.rb +222 -0
  116. data/vendor/sinatra/test/integration_test.rb +87 -0
  117. data/vendor/sinatra/test/less_test.rb +69 -0
  118. data/vendor/sinatra/test/liquid_test.rb +59 -0
  119. data/vendor/sinatra/test/mapped_error_test.rb +305 -0
  120. data/vendor/sinatra/test/markaby_test.rb +80 -0
  121. data/vendor/sinatra/test/markdown_test.rb +82 -0
  122. data/vendor/sinatra/test/middleware_test.rb +68 -0
  123. data/vendor/sinatra/test/nokogiri_test.rb +67 -0
  124. data/vendor/sinatra/test/public/favicon.ico +0 -0
  125. data/vendor/sinatra/test/rabl_test.rb +89 -0
  126. data/vendor/sinatra/test/rack_test.rb +45 -0
  127. data/vendor/sinatra/test/radius_test.rb +59 -0
  128. data/vendor/sinatra/test/rdoc_test.rb +66 -0
  129. data/vendor/sinatra/test/readme_test.rb +120 -0
  130. data/vendor/sinatra/test/request_test.rb +45 -0
  131. data/vendor/sinatra/test/response_test.rb +64 -0
  132. data/vendor/sinatra/test/result_test.rb +76 -0
  133. data/vendor/sinatra/test/route_added_hook_test.rb +59 -0
  134. data/vendor/sinatra/test/routing_test.rb +1175 -0
  135. data/vendor/sinatra/test/sass_test.rb +116 -0
  136. data/vendor/sinatra/test/scss_test.rb +89 -0
  137. data/vendor/sinatra/test/server_test.rb +48 -0
  138. data/vendor/sinatra/test/settings_test.rb +561 -0
  139. data/vendor/sinatra/test/sinatra_test.rb +12 -0
  140. data/vendor/sinatra/test/slim_test.rb +84 -0
  141. data/vendor/sinatra/test/static_test.rb +219 -0
  142. data/vendor/sinatra/test/streaming_test.rb +149 -0
  143. data/vendor/sinatra/test/templates_test.rb +333 -0
  144. data/vendor/sinatra/test/textile_test.rb +65 -0
  145. data/vendor/sinatra/test/views/a/in_a.str +1 -0
  146. data/vendor/sinatra/test/views/ascii.erb +2 -0
  147. data/vendor/sinatra/test/views/b/in_b.str +1 -0
  148. data/vendor/sinatra/test/views/calc.html.erb +1 -0
  149. data/vendor/sinatra/test/views/error.builder +3 -0
  150. data/vendor/sinatra/test/views/error.erb +3 -0
  151. data/vendor/sinatra/test/views/error.haml +3 -0
  152. data/vendor/sinatra/test/views/error.sass +2 -0
  153. data/vendor/sinatra/test/views/explicitly_nested.str +1 -0
  154. data/vendor/sinatra/test/views/foo/hello.test +1 -0
  155. data/vendor/sinatra/test/views/hello.builder +1 -0
  156. data/vendor/sinatra/test/views/hello.coffee +1 -0
  157. data/vendor/sinatra/test/views/hello.creole +1 -0
  158. data/vendor/sinatra/test/views/hello.erb +1 -0
  159. data/vendor/sinatra/test/views/hello.haml +1 -0
  160. data/vendor/sinatra/test/views/hello.less +5 -0
  161. data/vendor/sinatra/test/views/hello.liquid +1 -0
  162. data/vendor/sinatra/test/views/hello.mab +1 -0
  163. data/vendor/sinatra/test/views/hello.md +1 -0
  164. data/vendor/sinatra/test/views/hello.nokogiri +1 -0
  165. data/vendor/sinatra/test/views/hello.rabl +2 -0
  166. data/vendor/sinatra/test/views/hello.radius +1 -0
  167. data/vendor/sinatra/test/views/hello.rdoc +1 -0
  168. data/vendor/sinatra/test/views/hello.sass +2 -0
  169. data/vendor/sinatra/test/views/hello.scss +3 -0
  170. data/vendor/sinatra/test/views/hello.slim +1 -0
  171. data/vendor/sinatra/test/views/hello.str +1 -0
  172. data/vendor/sinatra/test/views/hello.test +1 -0
  173. data/vendor/sinatra/test/views/hello.textile +1 -0
  174. data/vendor/sinatra/test/views/hello.wlang +1 -0
  175. data/vendor/sinatra/test/views/hello.yajl +1 -0
  176. data/vendor/sinatra/test/views/layout2.builder +3 -0
  177. data/vendor/sinatra/test/views/layout2.erb +2 -0
  178. data/vendor/sinatra/test/views/layout2.haml +2 -0
  179. data/vendor/sinatra/test/views/layout2.liquid +2 -0
  180. data/vendor/sinatra/test/views/layout2.mab +2 -0
  181. data/vendor/sinatra/test/views/layout2.nokogiri +3 -0
  182. data/vendor/sinatra/test/views/layout2.rabl +3 -0
  183. data/vendor/sinatra/test/views/layout2.radius +2 -0
  184. data/vendor/sinatra/test/views/layout2.slim +3 -0
  185. data/vendor/sinatra/test/views/layout2.str +2 -0
  186. data/vendor/sinatra/test/views/layout2.test +1 -0
  187. data/vendor/sinatra/test/views/layout2.wlang +2 -0
  188. data/vendor/sinatra/test/views/nested.str +1 -0
  189. data/vendor/sinatra/test/views/utf8.erb +2 -0
  190. data/vendor/sinatra/test/wlang_test.rb +70 -0
  191. data/vendor/sinatra/test/yajl_test.rb +86 -0
  192. metadata +414 -0
@@ -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
5
+ {DSL}[http://pt.wikipedia.org/wiki/Linguagem_de_domínio_específico]
6
+ para criar rapidamente aplicações web em Ruby com o mínimo de esforço:
7
+
8
+ # minhaapp.rb
9
+ require 'rubygems'
10
+ require 'sinatra'
11
+ get '/' do
12
+ 'Olá Mundo!'
13
+ end
14
+
15
+ Instale a gem e execute com:
16
+
17
+ sudo gem install sinatra
18
+ ruby minhaapp.rb
19
+
20
+ Aceda em: http://localhost:4567
21
+
22
+ == Rotas
23
+
24
+ No Sinatra, uma rota é um metodo HTTP associado a uma URL correspondente padrão.
25
+ Cada rota é associada a um bloco:
26
+
27
+ get '/' do
28
+ .. mostrar algo ..
29
+ end
30
+
31
+ post '/' do
32
+ .. criar algo ..
33
+ end
34
+
35
+ put '/' do
36
+ .. atualizar algo ..
37
+ end
38
+
39
+ delete '/' do
40
+ .. apagar algo ..
41
+ end
42
+
43
+ Rotas são encontradas na ordem em que são definidas. A primeira rota que
44
+ é encontrada invoca o pedido.
45
+
46
+ Padrões de rota podem incluir parâmetros nomeados, acessíveis através da
47
+ hash <tt>params</tt>:
48
+
49
+ get '/ola/:nome' do
50
+ # corresponde a "GET /ola/foo" e "GET /ola/bar"
51
+ # params[:nome] é 'foo' ou 'bar'
52
+ "Olá #{params[:nome]}!"
53
+ end
54
+
55
+ Pode também aceder a parâmetros nomeados através do bloco de parâmetros:
56
+
57
+ get '/ola/:nome' do |n|
58
+ "Olá #{n}!"
59
+ end
60
+
61
+ Padrões de rota podem também incluir parâmetros splat (asteriscos), acessíveis
62
+ através do array <tt>params[:splat]</tt>.
63
+
64
+ get '/diga/*/ao/*' do
65
+ # corresponde a /diga/ola/ao/mundo
66
+ params[:splat] # => ["ola", "mundo"]
67
+ end
68
+
69
+ get '/download/*.*' do
70
+ # corresponde a /download/pasta/do/arquivo.xml
71
+ params[:splat] # => ["pasta/do/arquivo", "xml"]
72
+ end
73
+
74
+ Rotas correspondem-se com expressões regulares:
75
+
76
+ get %r{/ola/([\w]+)} do
77
+ "Olá, #{params[:captures].first}!"
78
+ end
79
+
80
+ Ou com um bloco de parâmetro:
81
+
82
+ get %r{/ola/([\w]+)} do |c|
83
+ "Olá, #{c}!"
84
+ end
85
+
86
+ Rotas podem incluir uma variedade de condições correspondentes, por exemplo, o agente usuário:
87
+
88
+ get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
89
+ "Você está a utilizar a versão #{params[:agent][0]} do Songbird."
90
+ end
91
+
92
+ get '/foo' do
93
+ # Corresponde a um navegador não Songbird
94
+ end
95
+
96
+ == Arquivos estáticos
97
+
98
+ Arquivos estáticos são disponibilizados a partir do directório <tt>./public</tt>. Você pode especificar
99
+ um local diferente através da opção <tt>:public_folder</tt>
100
+
101
+ set :public_folder, File.dirname(__FILE__) + '/estatico'
102
+
103
+ Note que o nome do directório público não é incluido no URL. Um arquivo
104
+ <tt>./public/css/style.css</tt> é disponibilizado como
105
+ <tt>http://example.com/css/style.css</tt>.
106
+
107
+ == Views / Templates
108
+
109
+ Templates presumem-se estar localizados sob o directório <tt>./views</tt>.
110
+ Para utilizar um directório de views diferente:
111
+
112
+ set :views, File.dirname(__FILE__) + '/modelo'
113
+
114
+ Uma coisa importante a ser lembrada é que você sempre tem as referências dos
115
+ templates como símbolos, mesmo se eles estiverem num sub-directório (nesse
116
+ caso utilize <tt>:'subdir/template'</tt>). Métodos de renderização irão processar
117
+ qualquer string passada directamente para elas.
118
+
119
+ === Haml Templates
120
+
121
+ A gem/biblioteca haml é necessária para renderizar templates HAML:
122
+
123
+ # É necessário requerir 'haml' na aplicação.
124
+ require 'haml'
125
+
126
+ get '/' do
127
+ haml :index
128
+ end
129
+
130
+ Renderiza <tt>./views/index.haml</tt>.
131
+
132
+ {Opções Haml}[http://haml.info/docs/yardoc/file.HAML_REFERENCE.html#options]
133
+ podem ser definidas globalmente através das configurações do sinatra,
134
+ veja {Opções e Configurações}[http://www.sinatrarb.com/configuration.html],
135
+ e substitua em uma requisição individual.
136
+
137
+ set :haml, {:format => :html5 } # o formato padrão do Haml é :xhtml
138
+
139
+ get '/' do
140
+ haml :index, :haml_options => {:format => :html4 } # substituido
141
+ end
142
+
143
+
144
+ === Erb Templates
145
+
146
+ # É necessário requerir 'erb' na aplicação.
147
+ require 'erb'
148
+
149
+ get '/' do
150
+ erb :index
151
+ end
152
+
153
+ Renderiza <tt>./views/index.erb</tt>
154
+
155
+ === Erubis
156
+
157
+ A gem/biblioteca erubis é necessária para renderizar templates erubis:
158
+
159
+ # É necessário requerir 'erubis' na aplicação.
160
+ require 'erubis'
161
+
162
+ get '/' do
163
+ erubis :index
164
+ end
165
+
166
+ Renderiza <tt>./views/index.erubis</tt>
167
+
168
+ === Builder Templates
169
+
170
+ A gem/biblioteca builder é necessária para renderizar templates builder:
171
+
172
+ # É necessário requerir 'builder' na aplicação.
173
+ require 'builder'
174
+
175
+ get '/' do
176
+ content_type 'application/xml', :charset => 'utf-8'
177
+ builder :index
178
+ end
179
+
180
+ Renderiza <tt>./views/index.builder</tt>.
181
+
182
+ === Sass Templates
183
+
184
+ A gem/biblioteca sass é necessária para renderizar templates sass:
185
+
186
+ # É necessário requerir 'haml' ou 'sass' na aplicação.
187
+ require 'sass'
188
+
189
+ get '/stylesheet.css' do
190
+ content_type 'text/css', :charset => 'utf-8'
191
+ sass :stylesheet
192
+ end
193
+
194
+ Renderiza <tt>./views/stylesheet.sass</tt>.
195
+
196
+ {Opções Sass}[http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#options]
197
+ podem ser definidas globalmente através das configurações do sinatra,
198
+ veja {Opções e Configurações}[http://www.sinatrarb.com/configuration.html],
199
+ e substitua em uma requisição individual.
200
+
201
+ set :sass, {:style => :compact } # o estilo padrão do Sass é :nested
202
+
203
+ get '/stylesheet.css' do
204
+ content_type 'text/css', :charset => 'utf-8'
205
+ sass :stylesheet, :style => :expanded # substituido
206
+ end
207
+
208
+ === Less Templates
209
+
210
+ A gem/biblioteca less é necessária para renderizar templates Less:
211
+
212
+ # É necessário requerir 'less' na aplicação.
213
+ require 'less'
214
+
215
+ get '/stylesheet.css' do
216
+ content_type 'text/css', :charset => 'utf-8'
217
+ less :stylesheet
218
+ end
219
+
220
+ Renderiza <tt>./views/stylesheet.less</tt>.
221
+
222
+ === Templates Inline
223
+
224
+ get '/' do
225
+ haml '%div.title Olá Mundo'
226
+ end
227
+
228
+ Renderiza a string, em uma linha, no template.
229
+
230
+ === Acedendo a Variáveis nos Templates
231
+
232
+ Templates são avaliados dentro do mesmo contexto que os manipuladores de rota. Variáveis
233
+ de instância definidas em rotas manipuladas são directamente acedidas por templates:
234
+
235
+ get '/:id' do
236
+ @foo = Foo.find(params[:id])
237
+ haml '%h1= @foo.nome'
238
+ end
239
+
240
+ Ou, especifique um hash explícito para variáveis locais:
241
+
242
+ get '/:id' do
243
+ foo = Foo.find(params[:id])
244
+ haml '%h1= foo.nome', :locals => { :foo => foo }
245
+ end
246
+
247
+ Isso é tipicamente utilizado quando renderizamos templates parciais (partials) dentro
248
+ de outros templates.
249
+
250
+ === Templates Inline
251
+
252
+ Templates podem ser definidos no final do arquivo fonte(.rb):
253
+
254
+ require 'rubygems'
255
+ require 'sinatra'
256
+
257
+ get '/' do
258
+ haml :index
259
+ end
260
+
261
+ __END__
262
+
263
+ @@ layout
264
+ %html
265
+ = yield
266
+
267
+ @@ index
268
+ %div.title Olá Mundo!!!!!
269
+
270
+ NOTA: Templates inline definidos no arquivo fonte são automaticamente carregados
271
+ pelo sinatra. Digite `enable :inline_templates` se tem templates inline no outro
272
+ arquivo fonte.
273
+
274
+ === Templates nomeados
275
+
276
+ Templates também podem ser definidos utilizando o método top-level <tt>template</tt>:
277
+
278
+ template :layout do
279
+ "%html\n =yield\n"
280
+ end
281
+
282
+ template :index do
283
+ '%div.title Olá Mundo!'
284
+ end
285
+
286
+ get '/' do
287
+ haml :index
288
+ end
289
+
290
+ Se existir um template com nome "layout", ele será utilizado sempre que um
291
+ template for renderizado. Pode desactivar layouts usando <tt>:layout => false</tt>.
292
+
293
+ get '/' do
294
+ haml :index, :layout => !request.xhr?
295
+ end
296
+
297
+ == Helpers
298
+
299
+ Use o método de alto nível <tt>helpers</tt> para definir métodos auxiliares para utilizar em
300
+ manipuladores de rotas e modelos:
301
+
302
+ helpers do
303
+ def bar(nome)
304
+ "#{nome}bar"
305
+ end
306
+ end
307
+
308
+ get '/:nome' do
309
+ bar(params[:nome])
310
+ end
311
+
312
+ == Filtros
313
+
314
+ Filtros Before são avaliados antes de cada requisição dentro do contexto da requisição
315
+ e podem modificar a requisição e a reposta. Variáveis de instância definidas nos
316
+ filtros são acedidas através de rotas e templates:
317
+
318
+ before do
319
+ @nota = 'Olá!'
320
+ request.path_info = '/foo/bar/baz'
321
+ end
322
+
323
+ get '/foo/*' do
324
+ @nota #=> 'Olá!'
325
+ params[:splat] #=> 'bar/baz'
326
+ end
327
+
328
+ Filtros After são avaliados após cada requisição dentro do contexto da
329
+ requisição e também podem modificar o pedido e a resposta. Variáveis de instância
330
+ definidas nos filtros before e rotas são acedidas através dos filtros after:
331
+
332
+ after do
333
+ puts response.status
334
+ end
335
+
336
+ Filtros opcionalmente têm um padrão, fazendo com que sejam avaliados somente se o caminho
337
+ do pedido coincidir com esse padrão:
338
+
339
+ before '/protected/*' do
340
+ autenticar!
341
+ end
342
+
343
+ after '/create/:slug' do |slug|
344
+ session[:last_slug] = slug
345
+ end
346
+
347
+ == Halting
348
+
349
+ Para parar imediatamente uma requisição dentro de um filtro ou rota utilize:
350
+
351
+ halt
352
+
353
+ Pode também especificar o status ao parar...
354
+
355
+ halt 410
356
+
357
+ Ou com um corpo de texto...
358
+
359
+ halt 'isto será o corpo de texto'
360
+
361
+ Ou também...
362
+
363
+ halt 401, 'vamos embora!'
364
+
365
+ Com cabeçalhos...
366
+
367
+ halt 402, {'Content-Type' => 'text/plain'}, 'revanche'
368
+
369
+ == Passing
370
+
371
+ Dentro de uma rota, pode passar para a próxima rota correspondente usando <tt>pass</tt>:
372
+
373
+ get '/adivinhar/:quem' do
374
+ pass unless params[:quem] == 'Frank'
375
+ 'Apanhaste-me!'
376
+ end
377
+
378
+ get '/adivinhar/*' do
379
+ 'Falhaste!'
380
+ end
381
+
382
+ O bloqueio da rota é imediatamente encerrado e o controle continua com a próxima
383
+ rota de parâmetro. Se o parâmetro da rota não for encontrado, um 404 é retornado.
384
+
385
+ == Configuração
386
+
387
+ Correndo uma vez, na inicialização, em qualquer ambiente:
388
+
389
+ configure do
390
+ ...
391
+ end
392
+
393
+ Correndo somente quando o ambiente (RACK_ENV environment variável) é definido para
394
+ <tt>:production</tt>:
395
+
396
+ configure :production do
397
+ ...
398
+ end
399
+
400
+ Correndo quando o ambiente é definido para <tt>:production</tt> ou
401
+ <tt>:test</tt>:
402
+
403
+ configure :production, :test do
404
+ ...
405
+ end
406
+
407
+ == Lidar com Erros
408
+
409
+ Lida-se com erros no mesmo contexto das rotas e filtros before, o que signifca que
410
+ <tt>haml</tt>, <tt>erb</tt>, etc, estão disponíveis.
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 manipulador <tt>not_found</tt> é invocado:
416
+
417
+ not_found do
418
+ 'Isto está longe de ser encontrado'
419
+ end
420
+
421
+ === Erro
422
+
423
+ O manipulador +error+ é invocado sempre que uma exceção é lançada a partir de
424
+ um bloco de rota ou um filtro. O objecto da exceção pode ser obtido a partir da variável
425
+ Rack <tt>sinatra.error</tt>:
426
+
427
+ error do
428
+ 'Peço desculpa, houve um erro desagradável - ' + env['sinatra.error'].name
429
+ end
430
+
431
+ Erros personalizados:
432
+
433
+ error MeuErroPersonalizado do
434
+ 'O que aconteceu foi...' + env['sinatra.error'].message
435
+ end
436
+
437
+ Então, se isso acontecer:
438
+
439
+ get '/' do
440
+ raise MeuErroPersonalizado, 'alguma coisa desagradável'
441
+ end
442
+
443
+ O resultado será:
444
+
445
+ O que aconteceu foi...alguma coisa desagradável
446
+
447
+ Alternativamente, pode definir um 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 (alcance):
458
+
459
+ error 400..510 do
460
+ 'Boom'
461
+ end
462
+
463
+ O Sinatra define os manipuladores especiais <tt>not_found</tt> e <tt>error</tt> quando
464
+ corre no ambiente de desenvolvimento.
465
+
466
+ == Mime Types
467
+
468
+ Quando utilizamos <tt>send_file</tt> ou arquivos estáticos pode ter mime types Sinatra
469
+ não entendidos. Use +mime_type+ para os registar por extensão de arquivos:
470
+
471
+ mime_type :foo, 'text/foo'
472
+
473
+ Pode também utilizar isto com o helper +content_type+:
474
+
475
+ content_type :foo
476
+
477
+ == Middleware Rack
478
+
479
+ O Sinatra corre no Rack[http://rack.rubyforge.org/], uma interface padrão mínima para
480
+ frameworks web em Ruby. Uma das capacidades mais interessantes do Rack, para desenvolver
481
+ aplicações, é o suporte de "middleware" -- componentes que residem entre o servidor e
482
+ a aplicação, monitorizando e/ou manipulando o pedido/resposta (request/response) HTTP
483
+ para providenciar varios tipos de funcionalidades comuns.
484
+
485
+ O Sinatra torna a construção de pipelines do middleware Rack fácil a um nível superior
486
+ utilizando o método +use+:
487
+
488
+ require 'sinatra'
489
+ require 'meu_middleware_personalizado'
490
+
491
+ use Rack::Lint
492
+ use MeuMiddlewarePersonalizado
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 |utilizador, senha|
504
+ utilizador == '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 utiliza
509
+ muitos desses componentes automaticamente dependendo da configuração, por isso,
510
+ tipicamente nao é necessário utilizar +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 a 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: um simples arquivo de
554
+ aplicação, directórios ./public e ./views, logs, página de detalhes de excepçã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
+ 'Olá mundo!'
565
+ end
566
+ end
567
+
568
+ A classe MinhaApp é um componente Rack independente que pode utilizar como um
569
+ middleware Rack, uma aplicação Rack, ou metal Rails. 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 desactivadas 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ê você mesmo uma vista de olhos ao código: 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 Comandos
598
+
599
+ As aplicações Sinatra podem ser executadas directamente:
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 # activa o bloqueio (padrão é desligado)
611
+
612
+ == A última versão
613
+
614
+ Se gostaria de utilizar o código da última versão do Sinatra, crie um clone
615
+ local e execute sua aplicação com o directó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, pode adicionar o directó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 correndo a versão" + Sinatra::VERSION
631
+ end
632
+
633
+ Para actualizar 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] - Encontrou 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