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,608 @@
1
+ = Sinatra
2
+ <i>Fontos megjegyzés: Ez a dokumentum csak egy fordítása az angol nyelvű
3
+ változat, és lehet, hogy nem naprakész.</i>
4
+
5
+ A Sinatra egy {DSL}[http://en.wikipedia.org/wiki/Domain-specific_language]
6
+ webalkalmazások Ruby nyelven történő fejlesztéséhez, minimális
7
+ energiabefektetéssel:
8
+
9
+ # myapp.rb
10
+ require 'sinatra'
11
+ get '/' do
12
+ 'Helló Világ!'
13
+ end
14
+
15
+ Telepítsd a gem-et és indítsd el az alkalmazást a következőképpen:
16
+
17
+ sudo gem install sinatra
18
+ ruby -rubygems myapp.rb
19
+
20
+ Az alkalmazás elérhető lesz itt: http://localhost:4567
21
+
22
+ == Útvonalak (routes)
23
+
24
+ A Sinatrában az útvonalat egy HTTP metódus és egy URL-re illeszkedő minta
25
+ párosa alkotja. Minden egyes útvonalhoz tartozik egy blokk:
26
+
27
+ get '/' do
28
+ .. megjelenítünk valamit ..
29
+ end
30
+
31
+ post '/' do
32
+ .. létrehozunk valamit ..
33
+ end
34
+
35
+ put '/' do
36
+ .. frissítünk valamit ..
37
+ end
38
+
39
+ delete '/' do
40
+ .. törlünk valamit ..
41
+ end
42
+
43
+ Az útvonalak illeszkedését a rendszer a definiálásuk sorrendjében
44
+ ellenőrzi. Sorrendben mindig az első illeszkedő útvonalhoz tartozó metódus kerül
45
+ meghívásra.
46
+
47
+ Az útvonalminták tartalmazhatnak paramétereket is, melyeket a <tt>params</tt>
48
+ hash-ből érhetünk el:
49
+
50
+ get '/hello/:name' do
51
+ # illeszkedik a "GET /hello/foo" és a "GET /hello/bar" útvonalakra
52
+ # ekkor params[:name] értéke 'foo' vagy 'bar' lesz
53
+ "Helló #{params[:name]}!"
54
+ end
55
+
56
+ A kulcsszavas argumentumokat (named parameters) blokk paraméterek útján
57
+ is el tudod érni:
58
+
59
+ get '/hello/:name' do |n|
60
+ "Helló #{n}!"
61
+ end
62
+
63
+ Az útvonalmintákban szerepelhetnek joker paraméterek is, melyeket a
64
+ <tt>params[:splat]</tt> tömbön keresztül tudunk elérni.
65
+
66
+ get '/say/*/to/*' do
67
+ # illeszkedik a /say/hello/to/world mintára
68
+ params[:splat] # => ["hello", "world"]
69
+ end
70
+
71
+ get '/download/*.*' do
72
+ # illeszkedik a /download/path/to/file.xml mintára
73
+ params[:splat] # => ["path/to/file", "xml"]
74
+ end
75
+
76
+ Reguláris kifejezéseket is felvehetünk az útvonalba:
77
+
78
+ get %r{/hello/([\w]+)} do
79
+ "Helló, #{params[:captures].first}!"
80
+ end
81
+
82
+ Vagy blokk paramétereket:
83
+
84
+ get %r{/hello/([\w]+)} do |c|
85
+ "Helló, #{c}!"
86
+ end
87
+
88
+ Az útvonalak azonban számos egyéb illeszkedési feltétel szerint is
89
+ tervezhetők, így például az user agent karakterláncot alapul véve:
90
+
91
+ get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
92
+ "A Songbird #{params[:agent][0]} verzióját használod"
93
+ end
94
+
95
+ get '/foo' do
96
+ # illeszkedik az egyéb user agentekre
97
+ end
98
+
99
+ == Statikus állományok
100
+
101
+ A statikus fájlok kiszolgálása a <tt>./public</tt> könyvtárból
102
+ történik, de természetesen más könyvtárat is megadhatsz erre a célra,
103
+ mégpedig a <tt>:public_folder</tt> kapcsoló beállításával:
104
+
105
+ set :public_folder, File.dirname(__FILE__) + '/static'
106
+
107
+ Fontos mgejegyezni, hogy a nyilvános könyvtár neve nem szerepel az URL-ben.
108
+ A <tt>./public/css/style.css</tt> fájl az
109
+ <tt>http://example.com/css/style.css</tt> URL-en lesz elérhető.
110
+
111
+ == Nézetek és Sablonok
112
+
113
+ A sablonfájlokat rendszerint a <tt>./views</tt> könyvtárba helyezzük, de
114
+ itt is lehetőség nyílik egyéb könyvtár használatára:
115
+
116
+ set :views, File.dirname(__FILE__) + '/templates'
117
+
118
+ Nagyon fontos észben tartani, hogy a sablononkra mindig szimbólumokkal
119
+ hivatkozunk, még akkor is, ha egyéb (ebben az esetben a
120
+ <tt>:'subdir/template'</tt>) könyvtárban tároljuk őket. A renderelő
121
+ metódusok minden, nekik közvetlenül átadott karakterláncot megjelenítenek.
122
+
123
+ === Haml sablonok
124
+
125
+ HAML sablonok rendereléséhez szükségünk lesz a haml gem-re vagy könyvtárra:
126
+
127
+ # Importáljuk be a haml-t az alkalmazásba
128
+ require 'haml'
129
+
130
+ get '/' do
131
+ haml :index
132
+ end
133
+
134
+ Ez szépen lerendereli a <tt>./views/index.haml</tt> sablont.
135
+
136
+ A {Haml kapcsolói}[http://haml.hamptoncatlin.com/docs/rdoc/classes/Haml.html]
137
+ globálisan is beállíthatók a Sinatra konfigurációi között, lásd az
138
+ {Options and Configurations}[http://www.sinatrarb.com/configuration.html] lapot.
139
+ A globális beállításokat lehetőségünk van felülírni metódus szinten is.
140
+
141
+ set :haml, {:format => :html5 } # az alapértelmezett Haml formátum az :xhtml
142
+
143
+ get '/' do
144
+ haml :index, :haml_options => {:format => :html4 } # immár felülírva
145
+ end
146
+
147
+
148
+ === Erb sablonok
149
+
150
+ # Importáljuk be az erb-t az alkalmazásba
151
+ require 'erb'
152
+
153
+ get '/' do
154
+ erb :index
155
+ end
156
+
157
+ Ez a <tt>./views/index.erb</tt> sablont fogja lerenderelni.
158
+
159
+ === Builder sablonok
160
+
161
+ Szükségünk lesz a builder gem-re vagy könyvtárra a builder sablonok
162
+ rendereléséhez:
163
+
164
+ # Importáljuk be a builder-t az alkalmazásba
165
+ require 'builder'
166
+
167
+ get '/' do
168
+ builder :index
169
+ end
170
+
171
+ Ez pedig a <tt>./views/index.builder</tt> állományt fogja renderelni.
172
+
173
+ === Sass sablonok
174
+
175
+ Sass sablonok használatához szükség lesz a haml gem-re vagy könyvtárra:
176
+
177
+ # Be kell importálni a haml, vagy a sass könyvtárat
178
+ require 'sass'
179
+
180
+ get '/stylesheet.css' do
181
+ sass :stylesheet
182
+ end
183
+
184
+ Így a <tt>./views/stylesheet.sass</tt> fájl máris renderelhető.
185
+
186
+ A {Sass kapcsolói}[http://haml.hamptoncatlin.com/docs/rdoc/classes/Sass.html]
187
+ globálisan is beállíthatók a Sinatra konfigurációi között, lásd az
188
+ {Options and Configurations}[http://www.sinatrarb.com/configuration.html] lapot.
189
+ A globális beállításokat lehetőségünk van felülírni metódus szinten is.
190
+
191
+ set :sass, {:style => :compact } # az alapértelmezett Sass stílus a :nested
192
+
193
+ get '/stylesheet.css' do
194
+ sass :stylesheet, :sass_options => {:style => :expanded } # felülírva
195
+ end
196
+
197
+
198
+ === Beágyazott sablonok
199
+
200
+ get '/' do
201
+ haml '%div.title Helló Világ'
202
+ end
203
+
204
+ Lerendereli a beágyazott sablon karakerláncát.
205
+
206
+ === Változók elérése a sablonokban
207
+
208
+ A sablonok ugyanabban a kontextusban kerülnek kiértékelésre, mint az
209
+ útvonal metódusok (route handlers). Az útvonal metódusokban megadott
210
+ változók közvetlenül elérhetőek lesznek a sablonokban:
211
+
212
+ get '/:id' do
213
+ @foo = Foo.find(params[:id])
214
+ haml '%h1= @foo.name'
215
+ end
216
+
217
+ De megadhatod egy lokális változókat tartalmazó explicit hash-ben is:
218
+
219
+ get '/:id' do
220
+ foo = Foo.find(params[:id])
221
+ haml '%h1= foo.name', :locals => { :foo => foo }
222
+ end
223
+
224
+ Ezt leginkább akkor érdemes megtenni, ha partial-eket akarunk renderelni
225
+ valamely más sablonból.
226
+
227
+ === Fájlon belüli sablonok
228
+
229
+ Sablonokat úgy is megadhatunk, hogy egyszerűen az alkalmazás fájl
230
+ végére begépeljük őket:
231
+
232
+ require 'rubygems'
233
+ require 'sinatra'
234
+
235
+ get '/' do
236
+ haml :index
237
+ end
238
+
239
+ __END__
240
+
241
+ @@ layout
242
+ %html
243
+ = yield
244
+
245
+ @@ index
246
+ %div.title Helló Világ!!!!!
247
+
248
+ Megjegyzés: azok a fájlon belüli sablonok, amelyek az alkalmazás fájl végére
249
+ kerülnek és függnek a sinatra könyvtártól, automatikusan betöltődnek.
250
+ Ha ugyanezt más alkalmazásfájlban is szeretnéd megtenni, hívd meg
251
+ a <tt>use_in_file_templates!</tt> metódust az adott fájlban.
252
+
253
+ === Kulcsszavas sablonok
254
+
255
+ Sablonokat végül a felsőszintű <tt>template</tt> metódussal is
256
+ definiálhatunk:
257
+
258
+ template :layout do
259
+ "%html\n =yield\n"
260
+ end
261
+
262
+ template :index do
263
+ '%div.title Helló Világ!'
264
+ end
265
+
266
+ get '/' do
267
+ haml :index
268
+ end
269
+
270
+ Ha létezik "layout" nevű sablon, akkor az minden esetben meghívódik, amikor
271
+ csak egy sablon renderelésre kerül. A layoutokat ki lehet kapcsolni a
272
+ <tt>:layout => false</tt> meghívásával.
273
+
274
+ get '/' do
275
+ haml :index, :layout => !request.xhr?
276
+ end
277
+
278
+ == Helperek
279
+
280
+ Használd a felső szintű <tt>helpers</tt> metódust azokhoz a helper
281
+ függvényekhez, amiket az útvonal metódusokban és a sablonokban akarsz
282
+ használni:
283
+
284
+ helpers do
285
+ def bar(name)
286
+ "#{name}bar"
287
+ end
288
+ end
289
+
290
+ get '/:name' do
291
+ bar(params[:name])
292
+ end
293
+
294
+ == Szűrők (filters)
295
+
296
+ Az előszűrők (before filter) az adott hívás kontextusában minden egyes
297
+ kérés alkalmával kiértékelődnek, így módosíthatják a kérést és a
298
+ választ egyaránt. A szűrőkbe felvett példányváltozók elérhetőek lesznek
299
+ az útvonalakban és a sablonokban is:
300
+
301
+ before do
302
+ @note = 'Csá!'
303
+ request.path_info = '/foo/bar/baz'
304
+ end
305
+
306
+ get '/foo/*' do
307
+ @note #=> 'Szeva!'
308
+ params[:splat] #=> 'bar/baz'
309
+ end
310
+
311
+ Az utószűrők az egyes kérések után, az adott kérés kontextusában kerülnek
312
+ kiértékelésre, így ezek is képesek módosítani a kérést és a választ egyaránt.
313
+ Az előszűrőkben és úvonalakban létrehozott példányváltozók elérhetőek lesznek
314
+ az utószűrők számára:
315
+
316
+ after do
317
+ puts response.status
318
+ end
319
+
320
+ == Megállítás
321
+
322
+ Egy kérés szűrőben vagy útvonalban történő azonnal blokkolásához
323
+ használd a következő parancsot:
324
+
325
+ halt
326
+
327
+ A megállításkor egy blokktörzset is megadhatsz ...
328
+
329
+ halt 'ez fog megjelenni a törzsben'
330
+
331
+ Vagy állítsd be a HTTP státuszt és a törzset is egyszerre ...
332
+
333
+ halt 401, 'menj innen!'
334
+
335
+ == Passzolás
336
+
337
+ Az útvonalak továbbadhatják a végrehajtást egy másik útvonalnak
338
+ a <tt>pass</tt> függvényhívással:
339
+
340
+ get '/guess/:who' do
341
+ pass unless params[:who] == 'Frici'
342
+ "Elkaptál!"
343
+ end
344
+
345
+ get '/guess/*' do
346
+ "Elhibáztál!"
347
+ end
348
+
349
+ Az útvonal blokkja azonnal kilép és átadja a vezérlést a következő
350
+ illeszkedő útvonalnak. Ha nem talál megfelelő útvonalat, a Sinatra
351
+ egy 404-es hibával tér vissza.
352
+
353
+ == Beállítások
354
+
355
+ Csak indításkor, de minden környezetre érvényesen fusson le:
356
+
357
+ configure do
358
+ ...
359
+ end
360
+
361
+ Csak akkor fusson le, ha a környezet (a RACK_ENV környezeti változóban)
362
+ <tt>:production</tt>-ra van állítva:
363
+
364
+ configure :production do
365
+ ...
366
+ end
367
+
368
+ Csak akkor fusson le, ha a környezet <tt>:production</tt> vagy <tt>:test</tt>:
369
+
370
+ configure :production, :test do
371
+ ...
372
+ end
373
+
374
+ == Hibakezelés
375
+
376
+ A hibakezelők ugyanabban a kontextusban futnak le, mint az útvonalak és
377
+ előszűrők, ezért számukra is elérhetőek mindazok a könyvtárak, amelyek
378
+ az utóbbiak rendelkezésére is állnak; így például a <tt>haml</tt>,
379
+ az <tt>erb</tt>, a <tt>halt</tt> stb.
380
+
381
+ === Nem található
382
+
383
+ Amikor a <tt>Sinatra::NotFound</tt> kivétel fellép, vagy a válasz HTTP
384
+ státuszkódja 404-es, mindig a <tt>not_found</tt> metódus hívódik meg.
385
+
386
+ not_found do
387
+ 'Sehol sem találom, amit keresel'
388
+ end
389
+
390
+ === Hiba
391
+
392
+ Az +error+ metódus hívódik meg olyankor, amikor egy útvonal, blokk vagy
393
+ előszűrő kivételt vált ki. A kivétel objektum lehívható a
394
+ <tt>sinatra.error</tt> Rack változótól:
395
+
396
+ error do
397
+ 'Elnézést, de valami szörnyű hiba lépett fel - ' + env['sinatra.error'].name
398
+ end
399
+
400
+ Egyéni hibakezelés:
401
+
402
+ error MyCustomError do
403
+ 'Szóval az van, hogy...' + env['sinatra.error'].message
404
+ end
405
+
406
+ És amikor fellép:
407
+
408
+ get '/' do
409
+ raise MyCustomError, 'valami nem stimmel!'
410
+ end
411
+
412
+ Ez fog megjelenni:
413
+
414
+ Szóval az van, hogy... valami nem stimmel!
415
+
416
+ A Sinatra speciális <tt>not_found</tt> és <tt>error</tt> hibakezelőket
417
+ használ, amikor a futtatási környezet fejlesztői módba van kapcsolva.
418
+
419
+ == Mime típusok
420
+
421
+ A <tt>send_file</tt> metódus használatakor, vagy statikus fájlok
422
+ kiszolgálásakor előfordulhat, hogy a Sinatra nem ismeri fel a fájlok
423
+ mime típusát. Ilyenkor használd a +mime_type+ kapcsolót a fájlkiterjesztés
424
+ bevezetéséhez:
425
+
426
+ mime_type :foo, 'text/foo'
427
+
428
+ == Rack Middleware
429
+
430
+ A Sinatra egy Ruby keretrendszerek számára kifejlesztett egyszerű és szabványos
431
+ interfészre, a {Rack}[http://rack.rubyforge.org/] -re épül. A Rack fejlesztői
432
+ szempontból egyik legérdekesebb jellemzője, hogy támogatja az úgynevezett
433
+ "middleware" elnevezésű komponenseket, amelyek beékelődnek a szerver és az
434
+ alkalmazás közé, így képesek megfigyelni és/vagy módosítani a HTTP
435
+ kéréseket és válaszokat. Segítségükkel különféle, egységesen működő
436
+ funkciókat építhetünk be rendszerünkbe.
437
+
438
+ A Sinatra keretrendszerben gyerekjáték a Rack middleware-ek behúzása a
439
+ +use+ metódus segítségével:
440
+
441
+ require 'sinatra'
442
+ require 'my_custom_middleware'
443
+
444
+ use Rack::Lint
445
+ use MyCustomMiddleware
446
+
447
+ get '/hello' do
448
+ 'Helló Világ'
449
+ end
450
+
451
+ A +use+ metódus szemantikája megegyezik a
452
+ Rack::Builder[http://rack.rubyforge.org/doc/classes/Rack/Builder.html] DSL-ben
453
+ használt +use+ metóduséval (az említett DSL-t leginkább rackup állományokban
454
+ használják). Hogy egy példát említsünk, a +use+ metódus elfogad
455
+ változókat és blokkokat egyaránt, akár kombinálva is ezeket:
456
+
457
+ use Rack::Auth::Basic do |username, password|
458
+ username == 'admin' && password == 'titkos'
459
+ end
460
+
461
+ A Rack terjesztéssel egy csomó alap middleware komponens is érkezik,
462
+ amelyekkel a naplózás, URL útvonalak megadása, autentikáció és
463
+ munkamenet-kezelés könnyen megvalósítható. A Sinatra ezek közül elég
464
+ sokat automatikusan felhasznál a beállításoktól függően, így ezek
465
+ explicit betöltésével (+use+) nem kell bajlódnod.
466
+
467
+ == Tesztelés
468
+
469
+ Sinatra teszteket bármely Rack alapú tesztelő könyvtárral vagy
470
+ keretrendszerrel készíthetsz. Mi a {Rack::Test}[http://gitrdoc.com/brynary/rack-test]
471
+ könyvtárat ajánljuk:
472
+
473
+ require 'my_sinatra_app'
474
+ require 'rack/test'
475
+
476
+ class MyAppTest < Test::Unit::TestCase
477
+ include Rack::Test::Methods
478
+
479
+ def app
480
+ Sinatra::Application
481
+ end
482
+
483
+ def test_my_default
484
+ get '/'
485
+ assert_equal 'Helló Világ!', last_response.body
486
+ end
487
+
488
+ def test_with_params
489
+ get '/meet', :name => 'Frici'
490
+ assert_equal 'Helló Frici!', last_response.body
491
+ end
492
+
493
+ def test_with_rack_env
494
+ get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
495
+ assert_equal "Songbird-öt használsz!", last_response.body
496
+ end
497
+ end
498
+
499
+ Megjegyzés: A beépített Sinatra::Test és Sinatra::TestHarness osztályok
500
+ a 0.9.2-es kiadástól kezdve elavultnak számítanak.
501
+
502
+ == Sinatra::Base - Middleware-ek, könyvtárak és moduláris alkalmazások
503
+
504
+ Az alkalmazást felső szinten építeni megfelelhet mondjuk egy kisebb
505
+ app esetén, ám kifejezetten károsnak bizonyulhat olyan komolyabb,
506
+ újra felhasználható komponensek készítésekor, mint például egy Rack
507
+ middleware, Rails metal, egyszerűbb kiszolgáló komponenssel bíró
508
+ könyvtárak vagy éppen Sinatra kiterjesztések. A felső szintű DSL
509
+ bepiszkítja az Objektum névteret, ráadásul kisalkalmazásokra szabott
510
+ beállításokat feltételez (így például egyetlen alkalmazásfájl, ./public
511
+ és ./views könyvtár meglétét, naplózást, kivételkezelő oldalt stb.).
512
+ Itt jön a képbe a Sinatra::Base osztály:
513
+
514
+ require 'sinatra/base'
515
+
516
+ class MyApp < Sinatra::Base
517
+ set :sessions, true
518
+ set :foo, 'bar'
519
+
520
+ get '/' do
521
+ 'Helló Világ!'
522
+ end
523
+ end
524
+
525
+ A MyApp osztály immár önálló Rack komponensként, mondjuk Rack middleware-ként
526
+ vagy alkalmazásként, esetleg Rails metal-ként is tud működni. Közvetlenül
527
+ használhatod (+use+) vagy futtathatod (+run+) az osztályodat egy rackup
528
+ konfigurációs állományban (+config.ru+), vagy egy szerverkomponenst
529
+ tartalmazó könyvtár vezérlésekor:
530
+
531
+ MyApp.run! :host => 'localhost', :port => 9090
532
+
533
+ A Sinatra::Base gyermekosztályaiban elérhető metódusok egyúttal a felső
534
+ szintű DSL-en keresztül is hozzáférhetők. A legtöbb felső szintű
535
+ alkalmazás átalakítható Sinatra::Base alapú komponensekké két lépésben:
536
+
537
+ * A fájlban nem a +sinatra+, hanem a +sinatra/base+ osztályt kell
538
+ beimportálni, mert egyébként az összes Sinatra DSL metódus a fő
539
+ névtérbe kerül.
540
+ * Az alkalmazás útvonalait, hibakezelőit, szűrőit és beállításait
541
+ a Sinatra::Base osztály gyermekosztályaiban kell megadni.
542
+
543
+ A +Sinatra::Base+ osztály igazából egy üres lap: a legtöbb funkció
544
+ alapból ki van kapcsolva, beleértve a beépített szervert is. A
545
+ beállításokkal és az egyes kapcsolók hatásával az
546
+ {Options and Configuration}[http://sinatra.github.com/configuration.html] lap
547
+ foglalkozik.
548
+
549
+ Széljegyzet: A Sinatra felső szintű DSL-je egy egyszerű delegációs
550
+ rendszerre épül. A Sinatra::Application osztály - a Sinatra::Base egy
551
+ speciális osztályaként - fogadja az összes :get, :put, :post,
552
+ :delete, :before, :error, :not_found, :configure és :set üzenetet,
553
+ ami csak a felső szintre beérkezik. Érdemes utánanézned a kódban,
554
+ miképp {kerül be}[http://github.com/sinatra/sinatra/blob/master/lib/sinatra/main.rb#L25]
555
+ a {Sinatra::Delegator mixin}[http://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L1064]
556
+ a fő névtérbe.
557
+
558
+ == Parancssori lehetőségek
559
+
560
+ Sinatra alkalmazásokat közvetlenül futtathatunk:
561
+
562
+ ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-s HANDLER]
563
+
564
+ Az alábbi kapcsolókat ismeri fel a rendszer:
565
+
566
+ -h # segítség
567
+ -p # a port beállítása (alapértelmezés szerint ez a 4567-es)
568
+ -e # a környezet beállítása (alapértelmezés szerint ez a development)
569
+ -s # a rack szerver/handler beállítása (alapértelmezetten ez a thin)
570
+ -x # a mutex lock bekapcsolása (alapértelmezetten ki van kapcsolva)
571
+
572
+ == Fejlesztői változat
573
+
574
+ Ha a Sinatra legfrissebb, fejlesztői változatát szeretnéd használni,
575
+ készíts egy helyi másolatot és indítsd az alkalmazásodat úgy,
576
+ hogy a <tt>sinatra/lib</tt> könyvtár elérhető legyen a
577
+ <tt>LOAD_PATH</tt>-on:
578
+
579
+ cd myapp
580
+ git clone git://github.com/sinatra/sinatra.git
581
+ ruby -Isinatra/lib myapp.rb
582
+
583
+ De hozzá is adhatod a <tt>sinatra/lib</tt> könyvtárat a <tt>LOAD_PATH</tt>-hoz
584
+ az alkalmazásodban:
585
+
586
+ $LOAD_PATH.unshift File.dirname(__FILE__) + '/sinatra/lib'
587
+ require 'rubygems'
588
+ require 'sinatra'
589
+
590
+ get '/about' do
591
+ "A következő változatot futtatom " + Sinatra::VERSION
592
+ end
593
+
594
+ A Sinatra frissítését később így végezheted el:
595
+
596
+ cd myproject/sinatra
597
+ git pull
598
+
599
+ == További információk
600
+
601
+ * {A projekt weboldala}[http://sinatra.github.com/] - Kiegészítő dokumentáció,
602
+ hírek, hasznos linkek
603
+ * {Közreműködés}[http://sinatra.github.com/contributing.html] - Hibát találtál?
604
+ Segítségre van szükséged? Foltot küldenél be?
605
+ * {Lighthouse}[http://sinatra.lighthouseapp.com] - Hibakövetés és kiadások
606
+ * {Twitter}[http://twitter.com/sinatra]
607
+ * {Levelezőlista}[http://groups.google.com/group/sinatrarb]
608
+ * {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] a http://freenode.net címen