devcenter 0.0.1

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 (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