pancake 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (172) hide show
  1. data/LICENSE +20 -0
  2. data/README.textile +95 -0
  3. data/Rakefile +56 -0
  4. data/TODO +17 -0
  5. data/bin/jeweler +19 -0
  6. data/bin/pancake-gen +17 -0
  7. data/bin/rubyforge +19 -0
  8. data/lib/pancake/bootloaders.rb +180 -0
  9. data/lib/pancake/configuration.rb +145 -0
  10. data/lib/pancake/constants.rb +5 -0
  11. data/lib/pancake/core_ext/class.rb +44 -0
  12. data/lib/pancake/core_ext/object.rb +22 -0
  13. data/lib/pancake/core_ext/symbol.rb +15 -0
  14. data/lib/pancake/defaults/configuration.rb +22 -0
  15. data/lib/pancake/defaults/middlewares.rb +1 -0
  16. data/lib/pancake/errors.rb +61 -0
  17. data/lib/pancake/generators/base.rb +12 -0
  18. data/lib/pancake/generators/micro_generator.rb +17 -0
  19. data/lib/pancake/generators/short_generator.rb +17 -0
  20. data/lib/pancake/generators/stack_generator.rb +17 -0
  21. data/lib/pancake/generators/templates/common/dotgitignore +22 -0
  22. data/lib/pancake/generators/templates/common/dothtaccess +17 -0
  23. data/lib/pancake/generators/templates/micro/%stack_name%/%stack_name%.rb.tt +8 -0
  24. data/lib/pancake/generators/templates/micro/%stack_name%/config.ru.tt +12 -0
  25. data/lib/pancake/generators/templates/micro/%stack_name%/pancake.init.tt +1 -0
  26. data/lib/pancake/generators/templates/micro/%stack_name%/public/.empty_directory +0 -0
  27. data/lib/pancake/generators/templates/micro/%stack_name%/tmp/.empty_directory +0 -0
  28. data/lib/pancake/generators/templates/micro/%stack_name%/views/root.html.haml +1 -0
  29. data/lib/pancake/generators/templates/short/%stack_name%/LICENSE.tt +20 -0
  30. data/lib/pancake/generators/templates/short/%stack_name%/README.tt +7 -0
  31. data/lib/pancake/generators/templates/short/%stack_name%/Rakefile.tt +50 -0
  32. data/lib/pancake/generators/templates/short/%stack_name%/VERSION.tt +1 -0
  33. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/%stack_name%.rb.tt +6 -0
  34. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/config.ru.tt +10 -0
  35. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/mounts/.empty_directory +0 -0
  36. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/public/.empty_directory +0 -0
  37. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/tmp/.empty_directory +0 -0
  38. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/views/root.html.haml +2 -0
  39. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%.rb.tt +5 -0
  40. data/lib/pancake/generators/templates/short/%stack_name%/pancake.init.tt +1 -0
  41. data/lib/pancake/generators/templates/short/%stack_name%/spec/%stack_name%_spec.rb.tt +7 -0
  42. data/lib/pancake/generators/templates/short/%stack_name%/spec/spec_helper.rb.tt +9 -0
  43. data/lib/pancake/generators/templates/stack/%stack_name%/LICENSE.tt +20 -0
  44. data/lib/pancake/generators/templates/stack/%stack_name%/README.tt +7 -0
  45. data/lib/pancake/generators/templates/stack/%stack_name%/Rakefile.tt +50 -0
  46. data/lib/pancake/generators/templates/stack/%stack_name%/VERSION.tt +1 -0
  47. data/lib/pancake/generators/templates/stack/%stack_name%/lib/%stack_name%/config/environments/development.rb.tt +18 -0
  48. data/lib/pancake/generators/templates/stack/%stack_name%/lib/%stack_name%/config/environments/production.rb.tt +18 -0
  49. data/lib/pancake/generators/templates/stack/%stack_name%/lib/%stack_name%/config/router.rb.tt +6 -0
  50. data/lib/pancake/generators/templates/stack/%stack_name%/lib/%stack_name%/config.ru.tt +12 -0
  51. data/lib/pancake/generators/templates/stack/%stack_name%/lib/%stack_name%/gems/cache/.empty_directory +0 -0
  52. data/lib/pancake/generators/templates/stack/%stack_name%/lib/%stack_name%/mounts/.empty_directory +0 -0
  53. data/lib/pancake/generators/templates/stack/%stack_name%/lib/%stack_name%/public/.empty_directory +0 -0
  54. data/lib/pancake/generators/templates/stack/%stack_name%/lib/%stack_name%/tmp/.empty_directory +0 -0
  55. data/lib/pancake/generators/templates/stack/%stack_name%/lib/%stack_name%.rb.tt +3 -0
  56. data/lib/pancake/generators/templates/stack/%stack_name%/pancake.init.tt +1 -0
  57. data/lib/pancake/generators/templates/stack/%stack_name%/spec/%stack_name%_spec.rb.tt +7 -0
  58. data/lib/pancake/generators/templates/stack/%stack_name%/spec/spec_helper.rb.tt +9 -0
  59. data/lib/pancake/generators.rb +8 -0
  60. data/lib/pancake/hooks/inheritable_inner_classes.rb +60 -0
  61. data/lib/pancake/hooks/on_inherit.rb +34 -0
  62. data/lib/pancake/logger.rb +200 -0
  63. data/lib/pancake/master.rb +123 -0
  64. data/lib/pancake/middleware.rb +347 -0
  65. data/lib/pancake/middlewares/logger.rb +16 -0
  66. data/lib/pancake/middlewares/static.rb +38 -0
  67. data/lib/pancake/mime_types.rb +265 -0
  68. data/lib/pancake/mixins/publish/action_options.rb +104 -0
  69. data/lib/pancake/mixins/publish.rb +125 -0
  70. data/lib/pancake/mixins/render/render.rb +168 -0
  71. data/lib/pancake/mixins/render/template.rb +23 -0
  72. data/lib/pancake/mixins/render/view_context.rb +21 -0
  73. data/lib/pancake/mixins/render.rb +109 -0
  74. data/lib/pancake/mixins/request_helper.rb +100 -0
  75. data/lib/pancake/mixins/stack_helper.rb +46 -0
  76. data/lib/pancake/mixins/url.rb +10 -0
  77. data/lib/pancake/paths.rb +218 -0
  78. data/lib/pancake/router.rb +99 -0
  79. data/lib/pancake/stack/app.rb +10 -0
  80. data/lib/pancake/stack/bootloader.rb +79 -0
  81. data/lib/pancake/stack/configuration.rb +44 -0
  82. data/lib/pancake/stack/middleware.rb +0 -0
  83. data/lib/pancake/stack/router.rb +21 -0
  84. data/lib/pancake/stack/stack.rb +66 -0
  85. data/lib/pancake/stacks/short/bootloaders.rb +13 -0
  86. data/lib/pancake/stacks/short/controller.rb +116 -0
  87. data/lib/pancake/stacks/short/default/views/base.html.haml +5 -0
  88. data/lib/pancake/stacks/short/stack.rb +187 -0
  89. data/lib/pancake/stacks/short.rb +3 -0
  90. data/lib/pancake.rb +58 -0
  91. data/spec/helpers/helpers.rb +20 -0
  92. data/spec/helpers/matchers.rb +25 -0
  93. data/spec/pancake/bootloaders_spec.rb +109 -0
  94. data/spec/pancake/configuration_spec.rb +177 -0
  95. data/spec/pancake/constants_spec.rb +7 -0
  96. data/spec/pancake/defaults/configuration_spec.rb +58 -0
  97. data/spec/pancake/fixtures/foo_stack/pancake.init +0 -0
  98. data/spec/pancake/fixtures/middlewares/other_public/two.html +1 -0
  99. data/spec/pancake/fixtures/middlewares/public/foo#bar.html +1 -0
  100. data/spec/pancake/fixtures/middlewares/public/one.html +1 -0
  101. data/spec/pancake/fixtures/paths/controllers/controller1.rb +0 -0
  102. data/spec/pancake/fixtures/paths/controllers/controller2.rb +0 -0
  103. data/spec/pancake/fixtures/paths/controllers/controller3.rb +0 -0
  104. data/spec/pancake/fixtures/paths/models/model1.rb +0 -0
  105. data/spec/pancake/fixtures/paths/models/model2.rb +0 -0
  106. data/spec/pancake/fixtures/paths/models/model3.rb +0 -0
  107. data/spec/pancake/fixtures/paths/stack/controllers/controller1.rb +0 -0
  108. data/spec/pancake/fixtures/paths/stack/models/model3.rb +0 -0
  109. data/spec/pancake/fixtures/paths/stack/views/view1.erb +0 -0
  110. data/spec/pancake/fixtures/paths/stack/views/view1.rb +0 -0
  111. data/spec/pancake/fixtures/paths/stack/views/view2.erb +0 -0
  112. data/spec/pancake/fixtures/paths/stack/views/view2.haml +0 -0
  113. data/spec/pancake/fixtures/render_templates/context_template.html.erb +2 -0
  114. data/spec/pancake/fixtures/render_templates/erb_template.html.erb +1 -0
  115. data/spec/pancake/fixtures/render_templates/erb_template.json.erb +1 -0
  116. data/spec/pancake/fixtures/render_templates/haml_template.html.haml +1 -0
  117. data/spec/pancake/fixtures/render_templates/haml_template.xml.haml +1 -0
  118. data/spec/pancake/fixtures/render_templates/templates/context.erb +2 -0
  119. data/spec/pancake/fixtures/render_templates/view_context/capture_erb.erb +5 -0
  120. data/spec/pancake/fixtures/render_templates/view_context/capture_haml.haml +4 -0
  121. data/spec/pancake/fixtures/render_templates/view_context/concat_erb.erb +2 -0
  122. data/spec/pancake/fixtures/render_templates/view_context/concat_haml.haml +2 -0
  123. data/spec/pancake/fixtures/render_templates/view_context/context.erb +3 -0
  124. data/spec/pancake/fixtures/render_templates/view_context/context2.erb +3 -0
  125. data/spec/pancake/fixtures/render_templates/view_context/helper_methods.erb +3 -0
  126. data/spec/pancake/fixtures/render_templates/view_context/inherited_erb_from_haml.erb +5 -0
  127. data/spec/pancake/fixtures/render_templates/view_context/inherited_erb_level_0.erb +5 -0
  128. data/spec/pancake/fixtures/render_templates/view_context/inherited_erb_level_1.erb +5 -0
  129. data/spec/pancake/fixtures/render_templates/view_context/inherited_haml_from_erb.haml +4 -0
  130. data/spec/pancake/fixtures/render_templates/view_context/inherited_haml_level_0.haml +4 -0
  131. data/spec/pancake/fixtures/render_templates/view_context/inherited_haml_level_1.haml +4 -0
  132. data/spec/pancake/fixtures/render_templates/view_context/nested_content_level_0.haml +6 -0
  133. data/spec/pancake/fixtures/render_templates/view_context/nested_content_level_1.haml +4 -0
  134. data/spec/pancake/fixtures/render_templates/view_context/nested_inner.erb +1 -0
  135. data/spec/pancake/fixtures/render_templates/view_context/nested_outer.erb +3 -0
  136. data/spec/pancake/fixtures/render_templates/view_context/super_erb_from_erb_0.erb +5 -0
  137. data/spec/pancake/fixtures/render_templates/view_context/super_erb_from_erb_1.erb +6 -0
  138. data/spec/pancake/fixtures/render_templates/view_context/super_erb_from_haml_0.erb +5 -0
  139. data/spec/pancake/fixtures/render_templates/view_context/super_erb_from_haml_1.erb +6 -0
  140. data/spec/pancake/fixtures/render_templates/view_context/super_haml_from_erb_0.haml +4 -0
  141. data/spec/pancake/fixtures/render_templates/view_context/super_haml_from_erb_1.haml +5 -0
  142. data/spec/pancake/fixtures/render_templates/view_context/super_haml_from_haml_0.haml +5 -0
  143. data/spec/pancake/fixtures/render_templates/view_context/super_haml_from_haml_1.haml +5 -0
  144. data/spec/pancake/fixtures/stacks/short/foobar/other_root/views/base.html.haml +4 -0
  145. data/spec/pancake/fixtures/stacks/short/foobar/views/basic.html.haml +1 -0
  146. data/spec/pancake/fixtures/stacks/short/foobar/views/inherited_from_base.html.haml +5 -0
  147. data/spec/pancake/hooks/on_inherit_spec.rb +65 -0
  148. data/spec/pancake/inheritance_spec.rb +100 -0
  149. data/spec/pancake/middleware_spec.rb +401 -0
  150. data/spec/pancake/middlewares/logger_spec.rb +29 -0
  151. data/spec/pancake/middlewares/static_spec.rb +83 -0
  152. data/spec/pancake/mime_types_spec.rb +234 -0
  153. data/spec/pancake/mixins/publish_spec.rb +94 -0
  154. data/spec/pancake/mixins/render/template_spec.rb +69 -0
  155. data/spec/pancake/mixins/render/view_context_spec.rb +248 -0
  156. data/spec/pancake/mixins/render_spec.rb +56 -0
  157. data/spec/pancake/mixins/request_helper_spec.rb +27 -0
  158. data/spec/pancake/mixins/stack_helper_spec.rb +46 -0
  159. data/spec/pancake/pancake_spec.rb +90 -0
  160. data/spec/pancake/paths_spec.rb +210 -0
  161. data/spec/pancake/stack/app_spec.rb +28 -0
  162. data/spec/pancake/stack/bootloader_spec.rb +41 -0
  163. data/spec/pancake/stack/middleware_spec.rb +0 -0
  164. data/spec/pancake/stack/router_spec.rb +282 -0
  165. data/spec/pancake/stack/stack_configuration_spec.rb +101 -0
  166. data/spec/pancake/stack/stack_spec.rb +60 -0
  167. data/spec/pancake/stacks/short/controller_spec.rb +322 -0
  168. data/spec/pancake/stacks/short/middlewares_spec.rb +22 -0
  169. data/spec/pancake/stacks/short/router_spec.rb +136 -0
  170. data/spec/pancake/stacks/short/stack_spec.rb +64 -0
  171. data/spec/spec_helper.rb +23 -0
  172. metadata +294 -0
@@ -0,0 +1,282 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe "stack router" do
4
+ before(:all) do
5
+ clear_constants "FooApp" ,"INNER_APP", "BarApp", "InnerApp", "InnerFoo", "InnerBar"
6
+ end
7
+ before(:each) do
8
+
9
+ ::INNER_APP = Proc.new{ |e|
10
+ [
11
+ 200,
12
+ {"Content-Type" => "text/plain"},
13
+ [
14
+ JSON.generate({
15
+ "SCRIPT_NAME" => e["SCRIPT_NAME"],
16
+ "PATH_INFO" => e["PATH_INFO"],
17
+ "usher.params" => e["usher.params"]
18
+ })
19
+ ]
20
+ ]
21
+ }
22
+ class ::FooApp < Pancake::Stack; end
23
+ FooApp.roots << Pancake.get_root(__FILE__)
24
+ end
25
+
26
+ after(:each) do
27
+ clear_constants "FooApp" ,"INNER_APP", "BarApp"
28
+ end
29
+
30
+ def app
31
+ @app
32
+ end
33
+
34
+ describe "mount" do
35
+ it "should let me setup routes for the stack" do
36
+ FooApp.router do |r|
37
+ r.mount(INNER_APP, "/foo", :_defaults => {:action => "foo action"}).name(:foo)
38
+ r.mount(INNER_APP, "/bar", :_defaults => {:action => "bar action"}).name(:root)
39
+ end
40
+
41
+ @app = FooApp.stackup
42
+ expected = {
43
+ "SCRIPT_NAME" => "/foo",
44
+ "PATH_INFO" => "",
45
+ "usher.params" => {"action" => "foo action"}
46
+ }
47
+
48
+ get "/foo"
49
+ JSON.parse(last_response.body).should == expected
50
+ end
51
+
52
+ it "should allow me to stop the route from partially matching" do
53
+ FooApp.with_router do |r|
54
+ r.mount(INNER_APP, "/foo/bar", :_defaults => {:action => "foo/bar"}, :_exact => true).name(:foobar)
55
+ end
56
+ @app = FooApp.stackup
57
+ expected = {
58
+ "SCRIPT_NAME" => "/foo/bar",
59
+ "PATH_INFO" => "",
60
+ "usher.params" => {"action" => "foo/bar"}
61
+ }
62
+ get "/foo/bar"
63
+ JSON.parse(last_response.body).should == expected
64
+ get "/foo"
65
+ last_response.status.should == 404
66
+ end
67
+
68
+ it "should make sure that the application is a rack application" do
69
+ lambda do
70
+ FooApp.router.mount(:not_an_app, "/foo")
71
+ end.should raise_error(Pancake::Router::RackApplicationExpected)
72
+ end
73
+
74
+
75
+ it "should not match a single segment route when only / is defined" do
76
+ FooApp.router.add("/", :_defaults => {:root => :var}) do |e|
77
+ Rack::Response.new("In the Root").finish
78
+ end
79
+ @app = FooApp.stackup
80
+ result = get "/not_a_route"
81
+ result.status.should == 404
82
+ end
83
+ end
84
+
85
+ describe "generating routes" do
86
+ before do
87
+ FooApp.router do |r|
88
+ r.add("/simple/route" ).name(:simple)
89
+ r.add("/var/with/:var", :_defaults => {:var => "some_var"}).name(:defaults)
90
+ r.add("/complex/:var" ).name(:complex)
91
+ r.add("/optional(/:var)" ).name(:optional)
92
+ r.add("/some/:unique_var")
93
+ r.add("/", :_defaults => {:var => "root var"}).name(:root)
94
+ end
95
+ end
96
+
97
+ it "should allow me to generate a named route for a stack" do
98
+ Pancake.url(FooApp, :simple).should == "/simple/route"
99
+ end
100
+
101
+ it "should allow me to generate a non-named route for a stack" do
102
+ Pancake.url(FooApp, :complex, :var => "a_variable").should == "/complex/a_variable"
103
+ end
104
+
105
+ it "should allow me to generate a route with values" do
106
+ Pancake.url(FooApp, :optional).should == "/optional"
107
+ Pancake.url(FooApp, :optional, :var => "some_var").should == "/optional/some_var"
108
+ end
109
+
110
+ it "should allow me to generate routes with defaults" do
111
+ Pancake.url(FooApp, :defaults).should == "/var/with/some_var"
112
+ Pancake.url(FooApp, :defaults, :var => "this_is_a_var").should == "/var/with/this_is_a_var"
113
+ end
114
+
115
+ it "should allow me to generate a route by params" do
116
+ Pancake.url(FooApp, :unique_var => "unique_var").should == "/some/unique_var"
117
+ end
118
+
119
+
120
+ describe "mounted route generation" do
121
+ before do
122
+ class ::BarApp < Pancake::Stack; end
123
+ BarApp.roots << Pancake.get_root(__FILE__)
124
+ BarApp.router do |r|
125
+ r.add("/simple").name(:simple)
126
+ r.add("/some/:var", :_defaults => {:var => "foo"}).name(:foo)
127
+ end
128
+ FooApp.router.mount(BarApp.stackup, "/bar")
129
+ end
130
+
131
+ it "should allow me to generate a simple nested named route" do
132
+ Pancake.url(BarApp, :simple).should == "/bar/simple"
133
+ end
134
+
135
+ it "should allow me to generate a simple nested named route for a named app" do
136
+ FooApp.router.mount(BarApp.stackup(:app_name => :bar_app), "/different")
137
+ Pancake.url(:bar_app, :simple).should == "/different/simple"
138
+ Pancake.url(BarApp, :simple).should == "/bar/simple"
139
+ end
140
+ end
141
+
142
+ end
143
+
144
+ describe "internal stack routes" do
145
+ it "should pass through to the underlying app when adding a route" do
146
+ FooApp.router.add("/bar", :_defaults => {:action => "bar"}).name(:gary)
147
+ class ::FooApp
148
+ def self.new_app_instance
149
+ INNER_APP
150
+ end
151
+ end
152
+
153
+ @app = FooApp.stackup
154
+ get "/bar"
155
+ result = JSON.parse(last_response.body)
156
+ result["usher.params"].should == {"action" => "bar"}
157
+ end
158
+
159
+ it "should add the usher.params to the request params" do
160
+ app = mock("app", :call => Rack::Response.new("OK").finish, :null_object => true)
161
+ app.should_receive(:call).with do |e|
162
+ params = Rack::Request.new(e).params
163
+ params[:action].should == "jackson"
164
+ end
165
+ FooApp.router.mount(app, "/foo/app", :_defaults => {:action => "jackson"})
166
+ @app = FooApp.stackup
167
+ get "/foo/app"
168
+ end
169
+ end
170
+
171
+ it "should allow me to inherit routes" do
172
+ FooApp.router do |r|
173
+ r.mount(INNER_APP, "/foo(/:stuff)", :_defaults => {"originator" => "FooApp"})
174
+ end
175
+ class ::BarApp < FooApp; end
176
+ BarApp.router do |r|
177
+ r.mount(INNER_APP, "/bar", :_defaults => {"originator" => "BarApp"})
178
+ end
179
+
180
+ @app = BarApp.stackup
181
+
182
+ get "/bar"
183
+ response = JSON.parse(last_response.body)
184
+ response["usher.params"]["originator"].should == "BarApp"
185
+
186
+ get "/foo/thing"
187
+ response = JSON.parse(last_response.body)
188
+ response["usher.params"]["originator"].should == "FooApp"
189
+ end
190
+
191
+ it "should generate an inherited route" do
192
+ FooApp.router do |r|
193
+ r.add("/simple").name(:simple)
194
+ r.mount(INNER_APP, "/foo(/:stuff)").name(:stuff)
195
+ end
196
+
197
+ class ::BarApp < FooApp; end
198
+
199
+ Pancake.url(BarApp, :simple).should == "/simple"
200
+ Pancake.url(BarApp, :stuff => "this_stuff").should == "/foo/this_stuff"
201
+ Pancake.url(BarApp, :stuff, :stuff => "that_stuff").should == "/foo/that_stuff"
202
+ end
203
+
204
+ it "should put the configuration into the env" do
205
+ FooApp.router.add("/foo").to do |e|
206
+ e["pancake.request.configuration"].should == Pancake.configuration.configs[FooApp]
207
+ Rack::Response.new("OK").finish
208
+ end
209
+ @app = FooApp.stackup
210
+ get "/foo"
211
+ end
212
+
213
+ it "should inherit the router as an inherited inner class" do
214
+ class ::BarApp < FooApp; end
215
+ BarApp::Router.should inherit_from(FooApp::Router)
216
+ end
217
+
218
+ describe "generating urls inside an application" do
219
+ before do
220
+ class ::BarApp < FooApp; end
221
+
222
+ class ::InnerApp
223
+ attr_reader :env
224
+ include Pancake::Mixins::RequestHelper
225
+
226
+ def self.app_block(&block)
227
+ if block_given?
228
+ @app_block = block
229
+ end
230
+ @app_block
231
+ end
232
+
233
+ def call(env)
234
+ @env = env
235
+ instance_eval &self.class.app_block
236
+ Rack::Response.new("OK").finish
237
+ end
238
+ end
239
+
240
+ class ::FooApp; def self.new_app_instance; InnerApp.new; end; end
241
+
242
+ BarApp.router do |r|
243
+ r.add("/mounted")
244
+ r.add("/foo").name(:foo)
245
+ r.add("/other").name(:other)
246
+ end
247
+
248
+ FooApp.router do |r|
249
+ r.mount(BarApp.stackup, "/bar")
250
+ r.add( "/foo" ).name(:foo)
251
+ r.add( "/simple").name(:simple)
252
+ end
253
+
254
+ @app = FooApp.stackup
255
+ end
256
+
257
+ it "should generate the urls correctly" do
258
+ InnerApp.app_block do
259
+ url(:foo).should == "/foo"
260
+ url(:simple).should == "/simple"
261
+ end
262
+
263
+ get "/foo"
264
+ end
265
+
266
+ it "should generate urls correctly when nested" do
267
+ InnerApp.app_block do
268
+ url(:foo).should == "/bar/foo"
269
+ url(:other).should == "/bar/other"
270
+ end
271
+ get "/bar/mounted"
272
+ end
273
+
274
+ it "should generate a url for another app" do
275
+ InnerApp.app_block do
276
+ url_for(BarApp, :foo).should == "/bar/foo"
277
+ url_for(FooApp, :foo).should == "/foo"
278
+ end
279
+ get "/foo"
280
+ end
281
+ end
282
+ end
@@ -0,0 +1,101 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe "pancake stack configuration" do
4
+
5
+ before(:each) do
6
+ Pancake.configuration.stacks.clear
7
+ Pancake.configuration.configs.clear
8
+ class ::FooStack < Pancake::Stack
9
+ end
10
+ FooStack.roots << Pancake.get_root(__FILE__)
11
+ end
12
+
13
+ after(:each) do
14
+ clear_constants(:FooStack)
15
+ end
16
+
17
+ it "should provide access to the stack configuration" do
18
+ FooStack.configuration.class.should inherit_from(Pancake::Configuration::Base)
19
+ end
20
+
21
+ it "should allow me to set defaults on a stack" do
22
+ FooStack.configuration do
23
+ default :foo, :bar
24
+ default :bar, "Foo Bar Man"
25
+ end
26
+ FooStack.configuration.foo.should == :bar
27
+ FooStack.configuration.bar.should == "Foo Bar Man"
28
+ end
29
+
30
+ it "should allow me to extend the configuration" do
31
+ class Pancake::Stack::Configuration
32
+ default :foo, :bar, "I am a foo default"
33
+ default :bar do
34
+ foobar
35
+ end
36
+
37
+ def foobar
38
+ :foobar
39
+ end
40
+ end
41
+ class FooBarStack < Pancake::Stack; end
42
+
43
+ FooBarStack.configuration.foo.should == :bar
44
+ FooBarStack.configuration.bar.should == :foobar
45
+ end
46
+
47
+ describe "configurations" do
48
+
49
+ it "should provide a configuration object for the stack" do
50
+ app = FooStack.stackup
51
+ app.configuration.should be_an_instance_of(FooStack::Configuration)
52
+ end
53
+
54
+ it "should put a copy of the application at the stack identified by the class" do
55
+ router = FooStack.stackup
56
+ Pancake.configuration.stacks[FooStack].should be_an_instance_of(FooStack)
57
+ end
58
+
59
+ it "should allow me to set a configuration object manually" do
60
+ config = FooStack::Configuration.new
61
+ app = FooStack.stackup(:config => config)
62
+ app.configuration.should equal(config)
63
+ end
64
+
65
+ it "should allow me to have access to the configuration object when creating the stack through a block" do
66
+ app = FooStack.stackup do |config|
67
+ config.foo = :foo
68
+ config.bar = :bar
69
+ end
70
+ app.configuration.foo.should == :foo
71
+ app.configuration.bar.should == :bar
72
+ end
73
+
74
+ it "should setup access to the configuration object through Pancakes configuration" do
75
+ router = FooStack.stackup
76
+ Pancake.configuration.stacks(FooStack).should be_an_instance_of(FooStack)
77
+ Pancake.configuration.configs(FooStack).should equal(router.configuration)
78
+ end
79
+
80
+ it "should allow me to create a configuration with a label" do
81
+ FooStack.configuration(:my_config).should be_an_instance_of(FooStack::Configuration)
82
+ FooStack.configuration(:my_config).should_not equal(FooStack.configuration)
83
+ end
84
+
85
+ it "should create a stack with an app_name" do
86
+ FooStack.stackup(:app_name => "my.app.name")
87
+ Pancake.configuration.stacks(FooStack).should be_nil
88
+ Pancake.configuration.stacks("my.app.name").should be_an_instance_of(FooStack)
89
+ Pancake.configuration.configs("my.app.name").should be_an_instance_of(FooStack::Configuration)
90
+ end
91
+
92
+ it "should provide access to the configuration in a block" do
93
+ Pancake.configuration.configs(FooStack) do |config|
94
+ config.foo = :foo
95
+ end
96
+ @app = FooStack.stackup
97
+ @app.configuration.foo.should == :foo
98
+ end
99
+ end
100
+
101
+ end
@@ -0,0 +1,60 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe "Pancake::Stack" do
4
+ before(:each) do
5
+ class ::StackSpecStack < Pancake::Stack
6
+ end
7
+ end
8
+
9
+ after(:each) do
10
+ clear_constants(:StackSpecStack)
11
+ end
12
+
13
+ describe "roots" do
14
+
15
+ it "should provide access to setting the roots" do
16
+ StackSpecStack.roots.should be_empty
17
+ StackSpecStack.roots << File.expand_path(File.dirname(__FILE__))
18
+ StackSpecStack.roots.should include(File.expand_path(File.dirname(__FILE__)))
19
+ end
20
+
21
+ it "should provide access to adding a root" do
22
+ StackSpecStack.roots.should be_empty
23
+ StackSpecStack.roots << Pancake.get_root(__FILE__)
24
+ StackSpecStack.roots.should include(File.expand_path(File.dirname(__FILE__)))
25
+ end
26
+
27
+ it "should allow me to get multiple roots in the order they're added" do
28
+ StackSpecStack.roots.should be_empty
29
+ StackSpecStack.roots << Pancake.get_root(__FILE__)
30
+ StackSpecStack.roots << "/tmp"
31
+ StackSpecStack.roots.should == [Pancake.get_root(__FILE__), "/tmp"]
32
+ end
33
+
34
+ it "should iterate over the roots in the direction they're added" do
35
+ StackSpecStack.roots.should be_empty
36
+ StackSpecStack.roots << Pancake.get_root(__FILE__)
37
+ StackSpecStack.roots << "/foo"
38
+ StackSpecStack.roots.map{|f| f}.should == [Pancake.get_root(__FILE__), "/foo"]
39
+ end
40
+
41
+ it "should allow me to set a root with a file" do
42
+ StackSpecStack.add_root(__FILE__)
43
+ StackSpecStack.roots.should include(Pancake.get_root(__FILE__))
44
+ end
45
+ end # roots
46
+
47
+ # describe "initialize stack" do
48
+
49
+ it "should mark a stack as initialized once it has called the initialize_stack method" do
50
+ StackSpecStack::BootLoader
51
+ StackSpecStack.roots << ::Pancake.get_root(__FILE__)
52
+ StackSpecStack.initialize_stack
53
+ StackSpecStack.should be_initialized
54
+ end
55
+
56
+ it "should not be initialized when it has not called initialize_stack" do
57
+ StackSpecStack.should_not be_initialized
58
+ end
59
+ # end
60
+ end