sinatra-acd 1.4.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +5 -0
  3. data/AUTHORS +61 -0
  4. data/CHANGES +1293 -0
  5. data/Gemfile +76 -0
  6. data/LICENSE +23 -0
  7. data/README.de.md +2864 -0
  8. data/README.es.md +2786 -0
  9. data/README.fr.md +2924 -0
  10. data/README.hu.md +694 -0
  11. data/README.ja.md +2726 -0
  12. data/README.ko.md +2832 -0
  13. data/README.md +2980 -0
  14. data/README.pt-br.md +965 -0
  15. data/README.pt-pt.md +791 -0
  16. data/README.ru.md +2799 -0
  17. data/README.zh.md +2158 -0
  18. data/Rakefile +199 -0
  19. data/examples/chat.rb +61 -0
  20. data/examples/simple.rb +3 -0
  21. data/examples/stream.ru +26 -0
  22. data/lib/sinatra.rb +4 -0
  23. data/lib/sinatra/base.rb +2044 -0
  24. data/lib/sinatra/images/404.png +0 -0
  25. data/lib/sinatra/images/500.png +0 -0
  26. data/lib/sinatra/main.rb +34 -0
  27. data/lib/sinatra/show_exceptions.rb +345 -0
  28. data/lib/sinatra/version.rb +3 -0
  29. data/sinatra.gemspec +19 -0
  30. data/test/asciidoctor_test.rb +72 -0
  31. data/test/base_test.rb +171 -0
  32. data/test/builder_test.rb +91 -0
  33. data/test/coffee_test.rb +90 -0
  34. data/test/compile_test.rb +183 -0
  35. data/test/contest.rb +100 -0
  36. data/test/creole_test.rb +65 -0
  37. data/test/delegator_test.rb +160 -0
  38. data/test/encoding_test.rb +20 -0
  39. data/test/erb_test.rb +116 -0
  40. data/test/extensions_test.rb +98 -0
  41. data/test/filter_test.rb +487 -0
  42. data/test/haml_test.rb +109 -0
  43. data/test/helper.rb +131 -0
  44. data/test/helpers_test.rb +1917 -0
  45. data/test/integration/app.rb +79 -0
  46. data/test/integration_helper.rb +236 -0
  47. data/test/integration_test.rb +104 -0
  48. data/test/less_test.rb +69 -0
  49. data/test/liquid_test.rb +77 -0
  50. data/test/mapped_error_test.rb +285 -0
  51. data/test/markaby_test.rb +80 -0
  52. data/test/markdown_test.rb +82 -0
  53. data/test/mediawiki_test.rb +68 -0
  54. data/test/middleware_test.rb +68 -0
  55. data/test/nokogiri_test.rb +67 -0
  56. data/test/public/favicon.ico +0 -0
  57. data/test/rabl_test.rb +89 -0
  58. data/test/rack_test.rb +45 -0
  59. data/test/radius_test.rb +59 -0
  60. data/test/rdoc_test.rb +66 -0
  61. data/test/readme_test.rb +130 -0
  62. data/test/request_test.rb +97 -0
  63. data/test/response_test.rb +63 -0
  64. data/test/result_test.rb +76 -0
  65. data/test/route_added_hook_test.rb +59 -0
  66. data/test/routing_test.rb +1412 -0
  67. data/test/sass_test.rb +115 -0
  68. data/test/scss_test.rb +88 -0
  69. data/test/server_test.rb +48 -0
  70. data/test/settings_test.rb +582 -0
  71. data/test/sinatra_test.rb +12 -0
  72. data/test/slim_test.rb +102 -0
  73. data/test/static_test.rb +236 -0
  74. data/test/streaming_test.rb +149 -0
  75. data/test/stylus_test.rb +90 -0
  76. data/test/templates_test.rb +382 -0
  77. data/test/textile_test.rb +65 -0
  78. data/test/views/a/in_a.str +1 -0
  79. data/test/views/ascii.erb +2 -0
  80. data/test/views/b/in_b.str +1 -0
  81. data/test/views/calc.html.erb +1 -0
  82. data/test/views/error.builder +3 -0
  83. data/test/views/error.erb +3 -0
  84. data/test/views/error.haml +3 -0
  85. data/test/views/error.sass +2 -0
  86. data/test/views/explicitly_nested.str +1 -0
  87. data/test/views/foo/hello.test +1 -0
  88. data/test/views/hello.asciidoc +1 -0
  89. data/test/views/hello.builder +1 -0
  90. data/test/views/hello.coffee +1 -0
  91. data/test/views/hello.creole +1 -0
  92. data/test/views/hello.erb +1 -0
  93. data/test/views/hello.haml +1 -0
  94. data/test/views/hello.less +5 -0
  95. data/test/views/hello.liquid +1 -0
  96. data/test/views/hello.mab +1 -0
  97. data/test/views/hello.md +1 -0
  98. data/test/views/hello.mediawiki +1 -0
  99. data/test/views/hello.nokogiri +1 -0
  100. data/test/views/hello.rabl +2 -0
  101. data/test/views/hello.radius +1 -0
  102. data/test/views/hello.rdoc +1 -0
  103. data/test/views/hello.sass +2 -0
  104. data/test/views/hello.scss +3 -0
  105. data/test/views/hello.slim +1 -0
  106. data/test/views/hello.str +1 -0
  107. data/test/views/hello.styl +2 -0
  108. data/test/views/hello.test +1 -0
  109. data/test/views/hello.textile +1 -0
  110. data/test/views/hello.wlang +1 -0
  111. data/test/views/hello.yajl +1 -0
  112. data/test/views/layout2.builder +3 -0
  113. data/test/views/layout2.erb +2 -0
  114. data/test/views/layout2.haml +2 -0
  115. data/test/views/layout2.liquid +2 -0
  116. data/test/views/layout2.mab +2 -0
  117. data/test/views/layout2.nokogiri +3 -0
  118. data/test/views/layout2.rabl +3 -0
  119. data/test/views/layout2.radius +2 -0
  120. data/test/views/layout2.slim +3 -0
  121. data/test/views/layout2.str +2 -0
  122. data/test/views/layout2.test +1 -0
  123. data/test/views/layout2.wlang +2 -0
  124. data/test/views/nested.str +1 -0
  125. data/test/views/utf8.erb +2 -0
  126. data/test/wlang_test.rb +87 -0
  127. data/test/yajl_test.rb +86 -0
  128. metadata +280 -0
@@ -0,0 +1,90 @@
1
+ require File.expand_path('../helper', __FILE__)
2
+
3
+ begin
4
+ require 'stylus'
5
+ require 'stylus/tilt'
6
+
7
+ begin
8
+ Stylus.compile '1'
9
+ rescue RuntimeError
10
+ raise LoadError, 'unable to find Stylus compiler'
11
+ end
12
+
13
+ class StylusTest < Test::Unit::TestCase
14
+ def stylus_app(options = {}, &block)
15
+ mock_app do
16
+ set :views, File.dirname(__FILE__) + '/views'
17
+ set(options)
18
+ get('/', &block)
19
+ end
20
+ get '/'
21
+ end
22
+
23
+ it 'renders inline Stylus strings' do
24
+ stylus_app { stylus "a\n margin auto\n" }
25
+ assert ok?
26
+ assert body.include?("a {\n margin: auto;\n}\n")
27
+ end
28
+
29
+ it 'defaults content type to css' do
30
+ stylus_app { stylus :hello }
31
+ assert ok?
32
+ assert_equal "text/css;charset=utf-8", response['Content-Type']
33
+ end
34
+
35
+ it 'defaults allows setting content type per route' do
36
+ stylus_app do
37
+ content_type :html
38
+ stylus :hello
39
+ end
40
+ assert ok?
41
+ assert_equal "text/html;charset=utf-8", response['Content-Type']
42
+ end
43
+
44
+ it 'defaults allows setting content type globally' do
45
+ stylus_app(:styl => { :content_type => 'html' }) do
46
+ stylus :hello
47
+ end
48
+ assert ok?
49
+ assert_equal "text/html;charset=utf-8", response['Content-Type']
50
+ end
51
+
52
+ it 'renders .styl files in views path' do
53
+ stylus_app { stylus :hello }
54
+ assert ok?
55
+ assert_include body, "a {\n margin: auto;\n}\n"
56
+ end
57
+
58
+ it 'ignores the layout option' do
59
+ stylus_app { stylus :hello, :layout => :layout2 }
60
+ assert ok?
61
+ assert_include body, "a {\n margin: auto;\n}\n"
62
+ end
63
+
64
+ it "raises error if template not found" do
65
+ mock_app {
66
+ get('/') { stylus :no_such_template }
67
+ }
68
+ assert_raise(Errno::ENOENT) { get('/') }
69
+ end
70
+
71
+ it "passes stylus options to the stylus engine" do
72
+ stylus_app { stylus :hello, :no_wrap => true }
73
+ assert ok?
74
+ assert_body "a {\n margin: auto;\n}\n"
75
+ end
76
+
77
+ it "passes default stylus options to the stylus engine" do
78
+ mock_app do
79
+ set :stylus, :no_wrap => true # default stylus style is :nested
80
+ get('/') { stylus :hello }
81
+ end
82
+ get '/'
83
+ assert ok?
84
+ assert_body "a {\n margin: auto;\n}\n"
85
+ end
86
+ end
87
+
88
+ rescue LoadError
89
+ warn "#{$!.to_s}: skipping stylus tests"
90
+ end
@@ -0,0 +1,382 @@
1
+ # encoding: UTF-8
2
+ require File.expand_path('../helper', __FILE__)
3
+ File.delete(File.dirname(__FILE__) + '/views/layout.test') rescue nil
4
+
5
+ class TestTemplate < Tilt::Template
6
+ def prepare
7
+ end
8
+
9
+ def evaluate(scope, locals={}, &block)
10
+ inner = block ? block.call : ''
11
+ data + inner
12
+ end
13
+
14
+ Tilt.register 'test', self
15
+ end
16
+
17
+ class TemplatesTest < Test::Unit::TestCase
18
+ def render_app(base=Sinatra::Base, options = {}, &block)
19
+ base, options = Sinatra::Base, base if base.is_a? Hash
20
+ mock_app(base) do
21
+ set :views, File.dirname(__FILE__) + '/views'
22
+ set options
23
+ get('/', &block)
24
+ template(:layout3) { "Layout 3!\n" }
25
+ end
26
+ get '/'
27
+ end
28
+
29
+ def with_default_layout
30
+ layout = File.dirname(__FILE__) + '/views/layout.test'
31
+ File.open(layout, 'wb') { |io| io.write "Layout!\n" }
32
+ yield
33
+ ensure
34
+ File.unlink(layout) rescue nil
35
+ end
36
+
37
+ it 'falls back to engine layout' do
38
+ mock_app do
39
+ template(:layout3) { 'Layout 3!<%= yield %>' }
40
+ set :erb, :layout => :layout3
41
+
42
+ get('/') do
43
+ erb('Hello World!', { :layout => true })
44
+ end
45
+ end
46
+
47
+ get '/'
48
+ assert ok?
49
+ assert_equal "Layout 3!Hello World!", body
50
+ end
51
+
52
+ it 'falls back to default layout if engine layout is true' do
53
+ mock_app do
54
+ template(:layout) { 'Layout!!! <%= yield %>' }
55
+ set :erb, :layout => true
56
+
57
+ get('/') do
58
+ erb('Hello World!', { :layout => true })
59
+ end
60
+ end
61
+
62
+ get '/'
63
+ assert ok?
64
+ assert_equal "Layout!!! Hello World!", body
65
+ end
66
+
67
+ it 'renders no layout if layout if falsy' do
68
+ mock_app do
69
+ template(:layout) { 'Layout!!! <%= yield %>' }
70
+ set :erb, :layout => true
71
+
72
+ get('/') do
73
+ erb('Hello World!', { :layout => nil })
74
+ end
75
+ end
76
+
77
+ get '/'
78
+ assert ok?
79
+ assert_equal "Hello World!", body
80
+ end
81
+
82
+ it 'allows overriding false default layout with explicit true' do
83
+ mock_app do
84
+ template(:layout) { 'Layout!!! <%= yield %>' }
85
+ set :erb, :layout => false
86
+
87
+ get('/') do
88
+ erb('Hello World!', { :layout => true })
89
+ end
90
+ end
91
+
92
+ get '/'
93
+ assert ok?
94
+ assert_equal "Layout!!! Hello World!", body
95
+ end
96
+
97
+ it 'renders String templates directly' do
98
+ render_app { render(:test, 'Hello World') }
99
+ assert ok?
100
+ assert_equal 'Hello World', body
101
+ end
102
+
103
+ it 'renders Proc templates using the call result' do
104
+ render_app { render(:test, Proc.new {'Hello World'}) }
105
+ assert ok?
106
+ assert_equal 'Hello World', body
107
+ end
108
+
109
+ it 'looks up Symbol templates in views directory' do
110
+ render_app { render(:test, :hello) }
111
+ assert ok?
112
+ assert_equal "Hello World!\n", body
113
+ end
114
+
115
+ it 'uses the default layout template if not explicitly overridden' do
116
+ with_default_layout do
117
+ render_app { render(:test, :hello) }
118
+ assert ok?
119
+ assert_equal "Layout!\nHello World!\n", body
120
+ end
121
+ end
122
+
123
+ it 'uses the default layout template if not really overriden' do
124
+ with_default_layout do
125
+ render_app { render(:test, :hello, :layout => true) }
126
+ assert ok?
127
+ assert_equal "Layout!\nHello World!\n", body
128
+ end
129
+ end
130
+
131
+ it 'uses the layout template specified' do
132
+ render_app { render(:test, :hello, :layout => :layout2) }
133
+ assert ok?
134
+ assert_equal "Layout 2!\nHello World!\n", body
135
+ end
136
+
137
+ it 'uses layout templates defined with the #template method' do
138
+ render_app { render(:test, :hello, :layout => :layout3) }
139
+ assert ok?
140
+ assert_equal "Layout 3!\nHello World!\n", body
141
+ end
142
+
143
+ it 'avoids wrapping layouts around nested templates' do
144
+ render_app { render(:str, :nested, :layout => :layout2) }
145
+ assert ok?
146
+ assert_equal(
147
+ "<h1>String Layout!</h1>\n<content><h1>Hello From String</h1></content>",
148
+ body
149
+ )
150
+ end
151
+
152
+ it 'allows explicitly wrapping layouts around nested templates' do
153
+ render_app { render(:str, :explicitly_nested, :layout => :layout2) }
154
+ assert ok?
155
+ assert_equal(
156
+ "<h1>String Layout!</h1>\n<content><h1>String Layout!</h1>\n<h1>Hello From String</h1></content>",
157
+ body
158
+ )
159
+ end
160
+
161
+ it 'two independent render calls do not disable layouts' do
162
+ render_app do
163
+ render :str, :explicitly_nested, :layout => :layout2
164
+ render :str, :nested, :layout => :layout2
165
+ end
166
+ assert ok?
167
+ assert_equal(
168
+ "<h1>String Layout!</h1>\n<content><h1>Hello From String</h1></content>",
169
+ body
170
+ )
171
+ end
172
+
173
+ it 'is possible to use partials in layouts' do
174
+ render_app do
175
+ settings.layout { "<%= erb 'foo' %><%= yield %>" }
176
+ erb 'bar'
177
+ end
178
+ assert ok?
179
+ assert_equal "foobar", body
180
+ end
181
+
182
+ it 'loads templates from source file' do
183
+ mock_app { enable(:inline_templates) }
184
+ assert_equal "this is foo\n\n", @app.templates[:foo][0]
185
+ assert_equal "X\n= yield\nX\n", @app.templates[:layout][0]
186
+ end
187
+
188
+ it 'ignores spaces after names of inline templates' do
189
+ mock_app { enable(:inline_templates) }
190
+ assert_equal "There's a space after 'bar'!\n\n", @app.templates[:bar][0]
191
+ assert_equal "this is not foo\n\n", @app.templates[:"foo bar"][0]
192
+ end
193
+
194
+ it 'loads templates from given source file' do
195
+ mock_app { set(:inline_templates, __FILE__) }
196
+ assert_equal "this is foo\n\n", @app.templates[:foo][0]
197
+ end
198
+
199
+ test 'inline_templates ignores IO errors' do
200
+ assert_nothing_raised { mock_app { set(:inline_templates, '/foo/bar') } }
201
+
202
+ assert @app.templates.empty?
203
+ end
204
+
205
+ it 'allows unicode in inline templates' do
206
+ mock_app { set(:inline_templates, __FILE__) }
207
+ assert_equal(
208
+ "Den som tror at hemma det är där man bor har aldrig vart hos mig.\n\n",
209
+ @app.templates[:umlaut][0]
210
+ )
211
+ end
212
+
213
+ it 'loads templates from specified views directory' do
214
+ render_app { render(:test, :hello, :views => settings.views + '/foo') }
215
+
216
+ assert_equal "from another views directory\n", body
217
+ end
218
+
219
+ it 'takes views directory into consideration for caching' do
220
+ render_app do
221
+ render(:test, :hello) + render(:test, :hello, :views => settings.views + '/foo')
222
+ end
223
+ assert_equal "Hello World!\nfrom another views directory\n", body
224
+ end
225
+
226
+ it 'passes locals to the layout' do
227
+ mock_app do
228
+ template(:my_layout) { 'Hello <%= name %>!<%= yield %>' }
229
+
230
+ get('/') do
231
+ erb('<p>content</p>', { :layout => :my_layout }, { :name => 'Mike'})
232
+ end
233
+ end
234
+
235
+ get '/'
236
+ assert ok?
237
+ assert_equal 'Hello Mike!<p>content</p>', body
238
+ end
239
+
240
+ it 'sets layout-only options via layout_options' do
241
+ render_app do
242
+ render(:str, :in_a,
243
+ :views => settings.views + '/a',
244
+ :layout_options => { :views => settings.views },
245
+ :layout => :layout2)
246
+ end
247
+
248
+ assert ok?
249
+ assert_equal "<h1>String Layout!</h1>\nGimme an A!\n", body
250
+ end
251
+
252
+ it 'loads templates defined in subclasses' do
253
+ base = Class.new(Sinatra::Base)
254
+ base.template(:foo) { 'bar' }
255
+ render_app(base) { render(:test, :foo) }
256
+ assert ok?
257
+ assert_equal 'bar', body
258
+ end
259
+
260
+ it 'allows setting default content type per template engine' do
261
+ render_app(:str => { :content_type => :txt }) {
262
+ render :str, 'foo'
263
+ }
264
+ assert_equal 'text/plain;charset=utf-8', response['Content-Type']
265
+ end
266
+
267
+ it 'setting default content type does not affect other template engines' do
268
+ render_app(:str => { :content_type => :txt }) {
269
+ render :test, 'foo'
270
+ }
271
+ assert_equal 'text/html;charset=utf-8', response['Content-Type']
272
+ end
273
+
274
+ it 'setting default content type per template engine does not override content_type' do
275
+ render_app :str => { :content_type => :txt } do
276
+ content_type :html
277
+ render :str, 'foo'
278
+ end
279
+ assert_equal 'text/html;charset=utf-8', response['Content-Type']
280
+ end
281
+
282
+ it 'uses templates in superclasses before subclasses' do
283
+ base = Class.new(Sinatra::Base)
284
+ base.template(:foo) { 'template in superclass' }
285
+ assert_equal 'template in superclass', base.templates[:foo].first.call
286
+
287
+ mock_app(base) do
288
+ set :views, File.dirname(__FILE__) + '/views'
289
+ template(:foo) { 'template in subclass' }
290
+ get('/') { render :test, :foo }
291
+ end
292
+ assert_equal 'template in subclass', @app.templates[:foo].first.call
293
+
294
+ get '/'
295
+ assert ok?
296
+ assert_equal 'template in subclass', body
297
+ end
298
+
299
+ it "is possible to use a different engine for the layout than for the template itself explicitly" do
300
+ render_app do
301
+ settings.template(:layout) { 'Hello <%= yield %>!' }
302
+ render :str, "<%= 'World' %>", :layout_engine => :erb
303
+ end
304
+ assert_equal "Hello <%= 'World' %>!", body
305
+ end
306
+
307
+ it "is possible to use a different engine for the layout than for the template itself globally" do
308
+ render_app :str => { :layout_engine => :erb } do
309
+ settings.template(:layout) { 'Hello <%= yield %>!' }
310
+ render :str, "<%= 'World' %>"
311
+ end
312
+ assert_equal "Hello <%= 'World' %>!", body
313
+ end
314
+
315
+ it "does not leak the content type to the template" do
316
+ render_app :str => { :layout_engine => :erb } do
317
+ settings.template(:layout) { 'Hello <%= yield %>!' }
318
+ render :str, "<%= 'World' %>", :content_type => :txt
319
+ end
320
+ assert_equal "text/html;charset=utf-8", headers['Content-Type']
321
+ end
322
+
323
+ it "is possible to register another template" do
324
+ Tilt.register "html.erb", Tilt[:erb]
325
+ render_app { render :erb, :calc }
326
+ assert_equal '2', body
327
+ end
328
+
329
+ it "passes scope to the template" do
330
+ mock_app do
331
+ template(:scoped) { 'Hello <%= foo %>' }
332
+
333
+ get('/') do
334
+ some_scope = Object.new
335
+ def some_scope.foo() 'World!' end
336
+ erb :scoped, :scope => some_scope
337
+ end
338
+ end
339
+
340
+ get '/'
341
+ assert ok?
342
+ assert_equal 'Hello World!', body
343
+ end
344
+
345
+ it "is possible to use custom logic for finding template files" do
346
+ mock_app do
347
+ set :views, ["a", "b"].map { |d| File.dirname(__FILE__) + '/views/' + d }
348
+ def find_template(views, name, engine, &block)
349
+ Array(views).each { |v| super(v, name, engine, &block) }
350
+ end
351
+
352
+ get('/:name') { render(:str, params[:name].to_sym) }
353
+ end
354
+
355
+ get '/in_a'
356
+ assert_body 'Gimme an A!'
357
+
358
+ get '/in_b'
359
+ assert_body 'Gimme a B!'
360
+ end
361
+ end
362
+
363
+ # __END__ : this is not the real end of the script.
364
+
365
+ __END__
366
+
367
+ @@ foo
368
+ this is foo
369
+
370
+ @@ bar
371
+ There's a space after 'bar'!
372
+
373
+ @@ foo bar
374
+ this is not foo
375
+
376
+ @@ umlaut
377
+ Den som tror at hemma det är där man bor har aldrig vart hos mig.
378
+
379
+ @@ layout
380
+ X
381
+ = yield
382
+ X