sinatra-bundles 0.0.2

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 (73) hide show
  1. data/.document +5 -0
  2. data/.gitignore +21 -0
  3. data/LICENSE +20 -0
  4. data/README.md +20 -0
  5. data/Rakefile +47 -0
  6. data/VERSION +1 -0
  7. data/lib/sinatra-bundles.rb +0 -0
  8. data/lib/sinatra/bundles.rb +111 -0
  9. data/spec/app.rb +11 -0
  10. data/spec/production_app.rb +12 -0
  11. data/spec/public/javascripts/test1.js +5 -0
  12. data/spec/public/javascripts/test2.js +5 -0
  13. data/spec/public/stylesheets/test1.css +3 -0
  14. data/spec/public/stylesheets/test2.css +3 -0
  15. data/spec/sinatra-bundles_spec.rb +154 -0
  16. data/spec/spec.opts +2 -0
  17. data/spec/spec_helper.rb +17 -0
  18. data/vendor/cache/sinatra-0.10.1.gem +0 -0
  19. data/vendor/gems/sinatra-0.10.1/AUTHORS +43 -0
  20. data/vendor/gems/sinatra-0.10.1/CHANGES +467 -0
  21. data/vendor/gems/sinatra-0.10.1/LICENSE +22 -0
  22. data/vendor/gems/sinatra-0.10.1/README.jp.rdoc +552 -0
  23. data/vendor/gems/sinatra-0.10.1/README.rdoc +622 -0
  24. data/vendor/gems/sinatra-0.10.1/Rakefile +129 -0
  25. data/vendor/gems/sinatra-0.10.1/lib/sinatra.rb +7 -0
  26. data/vendor/gems/sinatra-0.10.1/lib/sinatra/base.rb +1143 -0
  27. data/vendor/gems/sinatra-0.10.1/lib/sinatra/images/404.png +0 -0
  28. data/vendor/gems/sinatra-0.10.1/lib/sinatra/images/500.png +0 -0
  29. data/vendor/gems/sinatra-0.10.1/lib/sinatra/main.rb +28 -0
  30. data/vendor/gems/sinatra-0.10.1/lib/sinatra/showexceptions.rb +303 -0
  31. data/vendor/gems/sinatra-0.10.1/lib/sinatra/tilt.rb +509 -0
  32. data/vendor/gems/sinatra-0.10.1/sinatra.gemspec +86 -0
  33. data/vendor/gems/sinatra-0.10.1/test/base_test.rb +160 -0
  34. data/vendor/gems/sinatra-0.10.1/test/builder_test.rb +65 -0
  35. data/vendor/gems/sinatra-0.10.1/test/contest.rb +64 -0
  36. data/vendor/gems/sinatra-0.10.1/test/erb_test.rb +81 -0
  37. data/vendor/gems/sinatra-0.10.1/test/erubis_test.rb +82 -0
  38. data/vendor/gems/sinatra-0.10.1/test/extensions_test.rb +100 -0
  39. data/vendor/gems/sinatra-0.10.1/test/filter_test.rb +195 -0
  40. data/vendor/gems/sinatra-0.10.1/test/haml_test.rb +90 -0
  41. data/vendor/gems/sinatra-0.10.1/test/helper.rb +76 -0
  42. data/vendor/gems/sinatra-0.10.1/test/helpers_test.rb +573 -0
  43. data/vendor/gems/sinatra-0.10.1/test/mapped_error_test.rb +186 -0
  44. data/vendor/gems/sinatra-0.10.1/test/middleware_test.rb +68 -0
  45. data/vendor/gems/sinatra-0.10.1/test/request_test.rb +33 -0
  46. data/vendor/gems/sinatra-0.10.1/test/response_test.rb +42 -0
  47. data/vendor/gems/sinatra-0.10.1/test/result_test.rb +98 -0
  48. data/vendor/gems/sinatra-0.10.1/test/route_added_hook_test.rb +59 -0
  49. data/vendor/gems/sinatra-0.10.1/test/routing_test.rb +878 -0
  50. data/vendor/gems/sinatra-0.10.1/test/sass_test.rb +79 -0
  51. data/vendor/gems/sinatra-0.10.1/test/server_test.rb +47 -0
  52. data/vendor/gems/sinatra-0.10.1/test/sinatra_test.rb +13 -0
  53. data/vendor/gems/sinatra-0.10.1/test/static_test.rb +87 -0
  54. data/vendor/gems/sinatra-0.10.1/test/templates_test.rb +155 -0
  55. data/vendor/gems/sinatra-0.10.1/test/views/error.builder +3 -0
  56. data/vendor/gems/sinatra-0.10.1/test/views/error.erb +3 -0
  57. data/vendor/gems/sinatra-0.10.1/test/views/error.erubis +3 -0
  58. data/vendor/gems/sinatra-0.10.1/test/views/error.haml +3 -0
  59. data/vendor/gems/sinatra-0.10.1/test/views/error.sass +2 -0
  60. data/vendor/gems/sinatra-0.10.1/test/views/foo/hello.test +1 -0
  61. data/vendor/gems/sinatra-0.10.1/test/views/hello.builder +1 -0
  62. data/vendor/gems/sinatra-0.10.1/test/views/hello.erb +1 -0
  63. data/vendor/gems/sinatra-0.10.1/test/views/hello.erubis +1 -0
  64. data/vendor/gems/sinatra-0.10.1/test/views/hello.haml +1 -0
  65. data/vendor/gems/sinatra-0.10.1/test/views/hello.sass +2 -0
  66. data/vendor/gems/sinatra-0.10.1/test/views/hello.test +1 -0
  67. data/vendor/gems/sinatra-0.10.1/test/views/layout2.builder +3 -0
  68. data/vendor/gems/sinatra-0.10.1/test/views/layout2.erb +2 -0
  69. data/vendor/gems/sinatra-0.10.1/test/views/layout2.erubis +2 -0
  70. data/vendor/gems/sinatra-0.10.1/test/views/layout2.haml +2 -0
  71. data/vendor/gems/sinatra-0.10.1/test/views/layout2.test +1 -0
  72. data/vendor/specifications/sinatra-0.10.1.gemspec +40 -0
  73. metadata +169 -0
@@ -0,0 +1,82 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+ require 'erubis'
3
+
4
+ class ERubisTest < Test::Unit::TestCase
5
+ def erubis_app(&block)
6
+ mock_app {
7
+ set :views, File.dirname(__FILE__) + '/views'
8
+ get '/', &block
9
+ }
10
+ get '/'
11
+ end
12
+
13
+ it 'renders inline ERubis strings' do
14
+ erubis_app { erubis '<%= 1 + 1 %>' }
15
+ assert ok?
16
+ assert_equal '2', body
17
+ end
18
+
19
+ it 'renders .erubis files in views path' do
20
+ erubis_app { erubis :hello }
21
+ assert ok?
22
+ assert_equal "Hello World\n", body
23
+ end
24
+
25
+ it 'takes a :locals option' do
26
+ erubis_app {
27
+ locals = {:foo => 'Bar'}
28
+ erubis '<%= foo %>', :locals => locals
29
+ }
30
+ assert ok?
31
+ assert_equal 'Bar', body
32
+ end
33
+
34
+ it "renders with inline layouts" do
35
+ mock_app {
36
+ layout { 'THIS. IS. <%= yield.upcase %>!' }
37
+ get('/') { erubis 'Sparta' }
38
+ }
39
+ get '/'
40
+ assert ok?
41
+ assert_equal 'THIS. IS. SPARTA!', body
42
+ end
43
+
44
+ it "renders with file layouts" do
45
+ erubis_app {
46
+ erubis 'Hello World', :layout => :layout2
47
+ }
48
+ assert ok?
49
+ assert_equal "ERubis Layout!\nHello World\n", body
50
+ end
51
+
52
+ it "renders erubis with blocks" do
53
+ mock_app {
54
+ def container
55
+ @_out_buf << "THIS."
56
+ yield
57
+ @_out_buf << "SPARTA!"
58
+ end
59
+ def is; "IS." end
60
+ get '/' do
61
+ erubis '<% container do %> <%= is %> <% end %>'
62
+ end
63
+ }
64
+ get '/'
65
+ assert ok?
66
+ assert_equal 'THIS. IS. SPARTA!', body
67
+ end
68
+
69
+ it "can be used in a nested fashion for partials and whatnot" do
70
+ mock_app {
71
+ template(:inner) { "<inner><%= 'hi' %></inner>" }
72
+ template(:outer) { "<outer><%= erubis :inner %></outer>" }
73
+ get '/' do
74
+ erubis :outer
75
+ end
76
+ }
77
+
78
+ get '/'
79
+ assert ok?
80
+ assert_equal '<outer><inner>hi</inner></outer>', body
81
+ end
82
+ end
@@ -0,0 +1,100 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ class ExtensionsTest < Test::Unit::TestCase
4
+ module FooExtensions
5
+ def foo
6
+ end
7
+
8
+ private
9
+ def im_hiding_in_ur_foos
10
+ end
11
+ end
12
+
13
+ module BarExtensions
14
+ def bar
15
+ end
16
+ end
17
+
18
+ module BazExtensions
19
+ def baz
20
+ end
21
+ end
22
+
23
+ module QuuxExtensions
24
+ def quux
25
+ end
26
+ end
27
+
28
+ module PainExtensions
29
+ def foo=(name); end
30
+ def bar?(name); end
31
+ def fizz!(name); end
32
+ end
33
+
34
+ it 'will add the methods to the DSL for the class in which you register them and its subclasses' do
35
+ Sinatra::Base.register FooExtensions
36
+ assert Sinatra::Base.respond_to?(:foo)
37
+
38
+ Sinatra::Application.register BarExtensions
39
+ assert Sinatra::Application.respond_to?(:bar)
40
+ assert Sinatra::Application.respond_to?(:foo)
41
+ assert !Sinatra::Base.respond_to?(:bar)
42
+ end
43
+
44
+ it 'allows extending by passing a block' do
45
+ Sinatra::Base.register {
46
+ def im_in_ur_anonymous_module; end
47
+ }
48
+ assert Sinatra::Base.respond_to?(:im_in_ur_anonymous_module)
49
+ end
50
+
51
+ it 'will make sure any public methods added via Application#register are delegated to Sinatra::Delegator' do
52
+ Sinatra::Application.register FooExtensions
53
+ assert Sinatra::Delegator.private_instance_methods.
54
+ map { |m| m.to_sym }.include?(:foo)
55
+ assert !Sinatra::Delegator.private_instance_methods.
56
+ map { |m| m.to_sym }.include?(:im_hiding_in_ur_foos)
57
+ end
58
+
59
+ it 'will handle special method names' do
60
+ Sinatra::Application.register PainExtensions
61
+ assert Sinatra::Delegator.private_instance_methods.
62
+ map { |m| m.to_sym }.include?(:foo=)
63
+ assert Sinatra::Delegator.private_instance_methods.
64
+ map { |m| m.to_sym }.include?(:bar?)
65
+ assert Sinatra::Delegator.private_instance_methods.
66
+ map { |m| m.to_sym }.include?(:fizz!)
67
+ end
68
+
69
+ it 'will not delegate methods on Base#register' do
70
+ Sinatra::Base.register QuuxExtensions
71
+ assert !Sinatra::Delegator.private_instance_methods.include?("quux")
72
+ end
73
+
74
+ it 'will extend the Sinatra::Application application by default' do
75
+ Sinatra.register BazExtensions
76
+ assert !Sinatra::Base.respond_to?(:baz)
77
+ assert Sinatra::Application.respond_to?(:baz)
78
+ end
79
+
80
+ module BizzleExtension
81
+ def bizzle
82
+ bizzle_option
83
+ end
84
+
85
+ def self.registered(base)
86
+ fail "base should be BizzleApp" unless base == BizzleApp
87
+ fail "base should have already extended BizzleExtension" unless base.respond_to?(:bizzle)
88
+ base.set :bizzle_option, 'bizzle!'
89
+ end
90
+ end
91
+
92
+ class BizzleApp < Sinatra::Base
93
+ end
94
+
95
+ it 'sends .registered to the extension module after extending the class' do
96
+ BizzleApp.register BizzleExtension
97
+ assert_equal 'bizzle!', BizzleApp.bizzle_option
98
+ assert_equal 'bizzle!', BizzleApp.bizzle
99
+ end
100
+ end
@@ -0,0 +1,195 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ class BeforeFilterTest < Test::Unit::TestCase
4
+ it "executes filters in the order defined" do
5
+ count = 0
6
+ mock_app do
7
+ get('/') { 'Hello World' }
8
+ before {
9
+ assert_equal 0, count
10
+ count = 1
11
+ }
12
+ before {
13
+ assert_equal 1, count
14
+ count = 2
15
+ }
16
+ end
17
+
18
+ get '/'
19
+ assert ok?
20
+ assert_equal 2, count
21
+ assert_equal 'Hello World', body
22
+ end
23
+
24
+ it "can modify the request" do
25
+ mock_app {
26
+ get('/foo') { 'foo' }
27
+ get('/bar') { 'bar' }
28
+ before { request.path_info = '/bar' }
29
+ }
30
+
31
+ get '/foo'
32
+ assert ok?
33
+ assert_equal 'bar', body
34
+ end
35
+
36
+ it "can modify instance variables available to routes" do
37
+ mock_app {
38
+ before { @foo = 'bar' }
39
+ get('/foo') { @foo }
40
+ }
41
+
42
+ get '/foo'
43
+ assert ok?
44
+ assert_equal 'bar', body
45
+ end
46
+
47
+ it "allows redirects" do
48
+ mock_app {
49
+ before { redirect '/bar' }
50
+ get('/foo') do
51
+ fail 'before block should have halted processing'
52
+ 'ORLY?!'
53
+ end
54
+ }
55
+
56
+ get '/foo'
57
+ assert redirect?
58
+ assert_equal '/bar', response['Location']
59
+ assert_equal '', body
60
+ end
61
+
62
+ it "does not modify the response with its return value" do
63
+ mock_app {
64
+ before { 'Hello World!' }
65
+ get '/foo' do
66
+ assert_equal [], response.body
67
+ 'cool'
68
+ end
69
+ }
70
+
71
+ get '/foo'
72
+ assert ok?
73
+ assert_equal 'cool', body
74
+ end
75
+
76
+ it "does modify the response with halt" do
77
+ mock_app {
78
+ before { halt 302, 'Hi' }
79
+ get '/foo' do
80
+ "should not happen"
81
+ end
82
+ }
83
+
84
+ get '/foo'
85
+ assert_equal 302, response.status
86
+ assert_equal 'Hi', body
87
+ end
88
+
89
+ it "gives you access to params" do
90
+ mock_app {
91
+ before { @foo = params['foo'] }
92
+ get('/foo') { @foo }
93
+ }
94
+
95
+ get '/foo?foo=cool'
96
+ assert ok?
97
+ assert_equal 'cool', body
98
+ end
99
+
100
+ it "runs filters defined in superclasses" do
101
+ base = Class.new(Sinatra::Base)
102
+ base.before { @foo = 'hello from superclass' }
103
+
104
+ mock_app(base) {
105
+ get('/foo') { @foo }
106
+ }
107
+
108
+ get '/foo'
109
+ assert_equal 'hello from superclass', body
110
+ end
111
+ end
112
+
113
+ class AfterFilterTest < Test::Unit::TestCase
114
+ it "executes filters in the order defined" do
115
+ invoked = 0
116
+ mock_app do
117
+ before { invoked = 2 }
118
+ get('/') { invoked += 2 }
119
+ after { invoked *= 2 }
120
+ end
121
+
122
+ get '/'
123
+ assert ok?
124
+
125
+ assert_equal 8, invoked
126
+ end
127
+
128
+ it "executes filters in the order defined" do
129
+ count = 0
130
+ mock_app do
131
+ get('/') { 'Hello World' }
132
+ after {
133
+ assert_equal 0, count
134
+ count = 1
135
+ }
136
+ after {
137
+ assert_equal 1, count
138
+ count = 2
139
+ }
140
+ end
141
+
142
+ get '/'
143
+ assert ok?
144
+ assert_equal 2, count
145
+ assert_equal 'Hello World', body
146
+ end
147
+
148
+ it "allows redirects" do
149
+ mock_app {
150
+ get('/foo') { 'ORLY' }
151
+ after { redirect '/bar' }
152
+ }
153
+
154
+ get '/foo'
155
+ assert redirect?
156
+ assert_equal '/bar', response['Location']
157
+ assert_equal '', body
158
+ end
159
+
160
+ it "does not modify the response with its return value" do
161
+ mock_app {
162
+ get('/foo') { 'cool' }
163
+ after { 'Hello World!' }
164
+ }
165
+
166
+ get '/foo'
167
+ assert ok?
168
+ assert_equal 'cool', body
169
+ end
170
+
171
+ it "does modify the response with halt" do
172
+ mock_app {
173
+ get '/foo' do
174
+ "should not be returned"
175
+ end
176
+ after { halt 302, 'Hi' }
177
+ }
178
+
179
+ get '/foo'
180
+ assert_equal 302, response.status
181
+ assert_equal 'Hi', body
182
+ end
183
+
184
+ it "runs filters defined in superclasses" do
185
+ count = 2
186
+ base = Class.new(Sinatra::Base)
187
+ base.after { count *= 2 }
188
+ mock_app(base) {
189
+ get('/foo') { count += 2 }
190
+ }
191
+
192
+ get '/foo'
193
+ assert_equal 8, count
194
+ end
195
+ end
@@ -0,0 +1,90 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+ require 'haml'
3
+
4
+ class HAMLTest < Test::Unit::TestCase
5
+ def haml_app(&block)
6
+ mock_app {
7
+ set :views, File.dirname(__FILE__) + '/views'
8
+ get '/', &block
9
+ }
10
+ get '/'
11
+ end
12
+
13
+ it 'renders inline HAML strings' do
14
+ haml_app { haml '%h1 Hiya' }
15
+ assert ok?
16
+ assert_equal "<h1>Hiya</h1>\n", body
17
+ end
18
+
19
+ it 'renders .haml files in views path' do
20
+ haml_app { haml :hello }
21
+ assert ok?
22
+ assert_equal "<h1>Hello From Haml</h1>\n", body
23
+ end
24
+
25
+ it "renders with inline layouts" do
26
+ mock_app {
27
+ layout { %q(%h1= 'THIS. IS. ' + yield.upcase) }
28
+ get('/') { haml '%em Sparta' }
29
+ }
30
+ get '/'
31
+ assert ok?
32
+ assert_equal "<h1>THIS. IS. <EM>SPARTA</EM></h1>\n", body
33
+ end
34
+
35
+ it "renders with file layouts" do
36
+ haml_app {
37
+ haml 'Hello World', :layout => :layout2
38
+ }
39
+ assert ok?
40
+ assert_equal "<h1>HAML Layout!</h1>\n<p>Hello World</p>\n", body
41
+ end
42
+
43
+ it "raises error if template not found" do
44
+ mock_app {
45
+ get('/') { haml :no_such_template }
46
+ }
47
+ assert_raise(Errno::ENOENT) { get('/') }
48
+ end
49
+
50
+ it "passes HAML options to the Haml engine" do
51
+ mock_app {
52
+ get '/' do
53
+ haml "!!!\n%h1 Hello World", :format => :html5
54
+ end
55
+ }
56
+ get '/'
57
+ assert ok?
58
+ assert_equal "<!DOCTYPE html>\n<h1>Hello World</h1>\n", body
59
+ end
60
+
61
+ it "passes default HAML options to the Haml engine" do
62
+ mock_app {
63
+ set :haml, {:format => :html5}
64
+ get '/' do
65
+ haml "!!!\n%h1 Hello World"
66
+ end
67
+ }
68
+ get '/'
69
+ assert ok?
70
+ assert_equal "<!DOCTYPE html>\n<h1>Hello World</h1>\n", body
71
+ end
72
+
73
+ it "merges the default HAML options with the overrides and passes them to the Haml engine" do
74
+ mock_app {
75
+ set :haml, {:format => :html5, :attr_wrapper => '"'} # default HAML attr are <tag attr='single-quoted'>
76
+ get '/' do
77
+ haml "!!!\n%h1{:class => :header} Hello World"
78
+ end
79
+ get '/html4' do
80
+ haml "!!!\n%h1{:class => 'header'} Hello World", :format => :html4
81
+ end
82
+ }
83
+ get '/'
84
+ assert ok?
85
+ assert_equal "<!DOCTYPE html>\n<h1 class=\"header\">Hello World</h1>\n", body
86
+ get '/html4'
87
+ assert ok?
88
+ assert_match(/^<!DOCTYPE html PUBLIC (.*) HTML 4.01/, body)
89
+ end
90
+ end