sinatra-base 1.0 → 1.4.0

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