pancake 0.2.0 → 0.3.0

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 (108) hide show
  1. data/bin/pancake +96 -0
  2. data/lib/pancake.rb +5 -7
  3. data/lib/pancake/configuration.rb +2 -23
  4. data/lib/pancake/core_ext/object.rb +1 -1
  5. data/lib/pancake/defaults/configuration.rb +21 -1
  6. data/lib/pancake/generators.rb +0 -3
  7. data/lib/pancake/hooks/inheritable_inner_classes.rb +15 -2
  8. data/lib/pancake/master.rb +34 -1
  9. data/lib/pancake/mixins/render.rb +1 -2
  10. data/lib/pancake/mixins/stack_helper.rb +1 -1
  11. data/lib/pancake/router.rb +18 -63
  12. data/lib/pancake/stack/configuration.rb +3 -5
  13. data/lib/pancake/stack/router.rb +10 -33
  14. data/lib/pancake/stack/stack.rb +70 -50
  15. data/{spec/helpers → lib/pancake/test}/helpers.rb +3 -3
  16. data/lib/pancake/test/matchers.rb +20 -0
  17. data/lib/pancake/vendor/hashie/.document +5 -0
  18. data/lib/pancake/vendor/hashie/.gitignore +7 -0
  19. data/lib/pancake/vendor/hashie/Gemfile +11 -0
  20. data/lib/pancake/vendor/hashie/Gemfile.lock +25 -0
  21. data/lib/pancake/{generators/templates/short/%stack_name%/LICENSE.tt → vendor/hashie/LICENSE} +1 -1
  22. data/lib/pancake/vendor/hashie/README.rdoc +101 -0
  23. data/lib/pancake/{generators/templates/micro/%stack_name%/Rakefile.tt → vendor/hashie/Rakefile} +3 -13
  24. data/lib/pancake/vendor/hashie/VERSION +1 -0
  25. data/lib/pancake/vendor/hashie/hashie.gemspec +33 -0
  26. data/lib/pancake/vendor/hashie/lib/hashie.rb +5 -0
  27. data/lib/pancake/vendor/hashie/lib/hashie/clash.rb +86 -0
  28. data/lib/pancake/vendor/hashie/lib/hashie/dash.rb +108 -0
  29. data/lib/pancake/vendor/hashie/lib/hashie/hash.rb +22 -0
  30. data/lib/pancake/vendor/hashie/lib/hashie/hash_extensions.rb +49 -0
  31. data/lib/pancake/vendor/hashie/lib/hashie/mash.rb +148 -0
  32. data/lib/pancake/vendor/hashie/spec/hashie/clash_spec.rb +42 -0
  33. data/lib/pancake/vendor/hashie/spec/hashie/dash_spec.rb +103 -0
  34. data/lib/pancake/vendor/hashie/spec/hashie/hash_spec.rb +22 -0
  35. data/lib/pancake/vendor/hashie/spec/hashie/mash_spec.rb +135 -0
  36. data/lib/pancake/vendor/hashie/spec/spec.opts +2 -0
  37. data/lib/pancake/{generators/templates/short/%stack_name%/spec/spec_helper.rb.tt → vendor/hashie/spec/spec_helper.rb} +7 -7
  38. data/spec/pancake/configuration_spec.rb +1 -1
  39. data/spec/pancake/constants_spec.rb +1 -1
  40. data/spec/pancake/defaults/configuration_spec.rb +1 -1
  41. data/spec/pancake/hooks/on_inherit_spec.rb +13 -13
  42. data/spec/pancake/inheritance_spec.rb +22 -22
  43. data/spec/pancake/middleware_spec.rb +6 -5
  44. data/spec/pancake/middlewares/logger_spec.rb +1 -1
  45. data/spec/pancake/middlewares/static_spec.rb +1 -1
  46. data/spec/pancake/mime_types_spec.rb +1 -1
  47. data/spec/pancake/mixins/publish_spec.rb +24 -24
  48. data/spec/pancake/mixins/render/template_spec.rb +1 -1
  49. data/spec/pancake/mixins/render/view_context_spec.rb +1 -1
  50. data/spec/pancake/mixins/render_spec.rb +1 -1
  51. data/spec/pancake/mixins/request_helper_spec.rb +1 -1
  52. data/spec/pancake/mixins/stack_helper_spec.rb +3 -3
  53. data/spec/pancake/pancake_spec.rb +1 -1
  54. data/spec/pancake/paths_spec.rb +30 -30
  55. data/spec/pancake/stack/router_spec.rb +24 -62
  56. data/spec/pancake/stack/stack_configuration_spec.rb +1 -1
  57. data/spec/pancake/stack/stack_spec.rb +47 -4
  58. data/spec/spec_helper.rb +3 -3
  59. metadata +56 -128
  60. data/bin/pancake-gen +0 -30
  61. data/lib/pancake/bootloaders.rb +0 -187
  62. data/lib/pancake/generators/base.rb +0 -12
  63. data/lib/pancake/generators/micro_generator.rb +0 -17
  64. data/lib/pancake/generators/short_generator.rb +0 -18
  65. data/lib/pancake/generators/templates/common/dotgitignore +0 -22
  66. data/lib/pancake/generators/templates/common/dothtaccess +0 -17
  67. data/lib/pancake/generators/templates/micro/%stack_name%/%stack_name%.rb.tt +0 -8
  68. data/lib/pancake/generators/templates/micro/%stack_name%/config.ru.tt +0 -12
  69. data/lib/pancake/generators/templates/micro/%stack_name%/pancake_init.rb.tt +0 -1
  70. data/lib/pancake/generators/templates/micro/%stack_name%/public/.empty_directory +0 -0
  71. data/lib/pancake/generators/templates/micro/%stack_name%/tmp/.empty_directory +0 -0
  72. data/lib/pancake/generators/templates/micro/%stack_name%/views/root.html.haml +0 -1
  73. data/lib/pancake/generators/templates/short/%stack_name%/README.tt +0 -7
  74. data/lib/pancake/generators/templates/short/%stack_name%/Rakefile.tt +0 -56
  75. data/lib/pancake/generators/templates/short/%stack_name%/VERSION.tt +0 -1
  76. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%.rb.tt +0 -12
  77. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/%stack_name%.rb.tt +0 -6
  78. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/config.ru.tt +0 -10
  79. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/config/config.rb.tt +0 -23
  80. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/config/environments/development.rb.tt +0 -15
  81. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/config/environments/production.rb.tt +0 -16
  82. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/config/environments/staging.rb.tt +0 -17
  83. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/models/.empty_directory +0 -0
  84. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/mounts/.empty_directory +0 -0
  85. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/public/.empty_directory +0 -0
  86. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/tasks/%stack_name%.rake.tt +0 -4
  87. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/tmp/.empty_directory +0 -0
  88. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/views/root.html.haml +0 -2
  89. data/lib/pancake/generators/templates/short/%stack_name%/pancake_init.rb.tt +0 -1
  90. data/lib/pancake/generators/templates/short/%stack_name%/spec/%stack_name%_spec.rb.tt +0 -11
  91. data/lib/pancake/stack/app.rb +0 -10
  92. data/lib/pancake/stack/bootloader.rb +0 -114
  93. data/lib/pancake/stack/middleware.rb +0 -0
  94. data/lib/pancake/stacks/short.rb +0 -3
  95. data/lib/pancake/stacks/short/bootloaders.rb +0 -5
  96. data/lib/pancake/stacks/short/controller.rb +0 -184
  97. data/lib/pancake/stacks/short/default/views/base.html.haml +0 -5
  98. data/lib/pancake/stacks/short/default/views/error.html.haml +0 -12
  99. data/lib/pancake/stacks/short/stack.rb +0 -207
  100. data/spec/helpers/matchers.rb +0 -25
  101. data/spec/pancake/bootloaders_spec.rb +0 -119
  102. data/spec/pancake/stack/app_spec.rb +0 -28
  103. data/spec/pancake/stack/bootloader_spec.rb +0 -41
  104. data/spec/pancake/stack/middleware_spec.rb +0 -0
  105. data/spec/pancake/stacks/short/controller_spec.rb +0 -442
  106. data/spec/pancake/stacks/short/middlewares_spec.rb +0 -22
  107. data/spec/pancake/stacks/short/router_spec.rb +0 -150
  108. data/spec/pancake/stacks/short/stack_spec.rb +0 -117
@@ -1,25 +0,0 @@
1
- module Pancake
2
- module Matchers
3
-
4
- class InheritFrom
5
- def initialize(expected)
6
- @expected = expected
7
- end
8
-
9
- def matches?(target)
10
- @target = target
11
- @target.ancestors.include?(@expected)
12
- end
13
-
14
- def failure_message
15
- "expected #{@target} to inherit from #{@expected} but did not"
16
- end
17
- end
18
-
19
- def inherit_from(expected)
20
- InheritFrom.new(expected)
21
- end
22
-
23
-
24
- end # Matchers
25
- end # Pancake
@@ -1,119 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
-
3
- describe "Pancake::Stack::BootLoader" do
4
-
5
- before(:each) do
6
- $captures = []
7
-
8
- class ::FooStack < Pancake::Stack
9
- roots << File.join(Pancake.get_root(__FILE__), "..", "fixtures", "foo_stack")
10
- end
11
- end
12
-
13
- after(:each) do
14
- clear_constants(:FooStack)
15
- end
16
-
17
- it "should not add the bootloader without it having a run! method" do
18
- lambda do
19
- FooStack::BootLoader.add(:foo){|s,c| :here }
20
- end.should raise_error
21
- end
22
-
23
- it "should allow me to add an application specific BootLoader" do
24
- FooStack::BootLoader.add(:my_initializer){ def run!; :foo; end}
25
- FooStack::BootLoader[:my_initializer].call({}).should == :foo
26
- end
27
-
28
- it "should provide a bootloader instance" do
29
- FooStack::BootLoader.add(:my_initializer){ def run!; :foo; end}
30
- FooStack::BootLoader[:my_initializer].should inherit_from(Pancake::BootLoaderMixin::Base)
31
- end
32
-
33
- it "should allow me to remove a bootloader from another bootloader" do
34
- FooStack::BootLoader.add(:foo){ def run!; $captures << :foo; end}
35
- FooStack::BootLoader.add(:bar){ def run!; FooStack::BootLoader.delete(:removed); end }
36
- FooStack::BootLoader.add(:removed){ def run!; $captures << :removed; end}
37
- FooStack.new
38
-
39
- $captures.should == [:foo]
40
- end
41
-
42
- it "should allow me to add multiple boot loaders" do
43
- FooStack::BootLoader.add(:foo){ def run!; :foo; end}
44
- FooStack::BootLoader.add(:bar){ def run!; :bar; end}
45
- FooStack::BootLoader[:foo].call({}).should == :foo
46
- FooStack::BootLoader[:bar].call({}).should == :bar
47
- end
48
-
49
- it "should allow me to add a bootloader before another" do
50
- $captures.should be_empty
51
- FooStack::BootLoader.add(:foo){ def run!; $captures << :foo; end}
52
- FooStack::BootLoader.add(:bar){ def run!; $captures << :bar; end}
53
- FooStack::BootLoader.add(:baz, :before => :bar){ def run!; $captures << :baz; end}
54
- FooStack.new
55
- $captures.should == [:foo, :baz, :bar]
56
- end
57
-
58
- it "should allow me to add a bootloader after another" do
59
- $captures.should be_empty
60
- FooStack::BootLoader.add(:foo){ def run!; $captures << :foo; end}
61
- FooStack::BootLoader.add(:bar){ def run!; $captures << :bar; end}
62
- FooStack::BootLoader.add(:baz, :after => :foo){ def run!; $captures << :baz; end}
63
- FooStack.new
64
- $captures.should == [:foo, :baz, :bar]
65
- end
66
-
67
- it "should provide an arbitrarily complex setup" do
68
- $captures.should be_empty
69
- FooStack::BootLoader.add(:foo ){ def run!; $captures << :foo; end}
70
- FooStack::BootLoader.add(:bar ){ def run!; $captures << :bar; end}
71
- FooStack::BootLoader.add(:baz, :after => :foo ){ def run!; $captures << :baz; end}
72
- FooStack::BootLoader.add(:paz, :before => :baz ){ def run!; $captures << :paz; end}
73
- FooStack::BootLoader.add(:fred, :before => :bar ){ def run!; $captures << :fred; end}
74
- FooStack::BootLoader.add(:barney, :after => :fred ){ def run!; $captures << :barney; end}
75
-
76
- FooStack.new
77
- $captures.should == [:foo, :paz, :baz, :fred, :barney, :bar]
78
- end
79
-
80
- describe "types" do
81
-
82
- it "should run bootloaders marked as :init" do
83
- FooStack::BootLoader.add(:bar, :level => :init ){ def run!; $captures << [:bar, :init ]; end}
84
- FooStack::BootLoader.add(:baz, :level => :init ){ def run!; $captures << [:baz, :init ]; end}
85
- FooStack::BootLoader.add(:paz, :level => :init, :before => :baz){ def run!; $captures << [:paz, :init]; end}
86
-
87
- FooStack::BootLoader.run!(:only => {:level => :init})
88
- $captures.should == [[:bar, :init], [:paz, :init], [:baz, :init]]
89
- end
90
-
91
- it "should run init or then default level bootloaders individually" do
92
- FooStack::BootLoader.add(:foo ){ def run!; $captures << [:foo, :default]; end}
93
- FooStack::BootLoader.add(:grh ){ def run!; $captures << [:grh, :default]; end}
94
- FooStack::BootLoader.add(:bar, :level => :init ){ def run!; $captures << [:bar, :init ]; end}
95
- FooStack::BootLoader.add(:ptf, :before => :grh ){ def run!; $captures << [:ptf, :default]; end}
96
- FooStack::BootLoader.add(:baz, :level => :init ){ def run!; $captures << [:baz, :init ]; end}
97
- FooStack::BootLoader.add(:paz, :level => :init, :before => :baz){ def run!; $captures << [:paz, :init]; end}
98
-
99
- FooStack.new
100
- $captures.should == [[:bar, :init], [:paz, :init], [:baz, :init], [:foo, :default], [:ptf, :default], [:grh, :default]]
101
- end
102
-
103
- # it "should inherit from the default boot loaders" do
104
- # ::Pancake::Stack::BootLoader.add(:default_boot_loader_test){def run!; end}
105
- # class ::Bario < Pancake::Stack; end
106
- # Bario::BootLoader.map{|n,bl| n}.should include(:default_boot_loader_test)
107
- # ::Pancake::Stack::BootLoader.
108
- # end
109
-
110
- it "should let me pass options to the bootloaders and pass them on" do
111
- FooStack::BootLoader.add(:foo){ def run!; config[:result] << :foo; end}
112
- FooStack::BootLoader.add(:bar){ def run!; config[:result] << :bar; end}
113
-
114
- opts = { :result => [] }
115
- FooStack.new(nil, opts)
116
- opts[:result].should == [:foo, :bar]
117
- end
118
- end
119
- end
@@ -1,28 +0,0 @@
1
- require File.dirname(__FILE__) + '/../../spec_helper'
2
-
3
- describe "Pancake::Stack.new_app_instance" do
4
-
5
- before(:each) do
6
- class ::FooStack < Pancake::Stack
7
-
8
- end
9
- end
10
-
11
- after(:each) do
12
- clear_constants(:FooStack)
13
- end
14
-
15
- it "should provide a new instance of the applciation" do
16
- FooStack.new_app_instance.should == Pancake::MISSING_APP
17
- end
18
-
19
- it "should allow me to overwrite the new_app_instance for this stack" do
20
- class ::BarStack < Pancake::Stack
21
- def self.new_app_instance
22
- ::Pancake::OK_APP
23
- end
24
- end
25
-
26
- BarStack.new_app_instance.should == ::Pancake::OK_APP
27
- end
28
- end
@@ -1,41 +0,0 @@
1
- require File.dirname(__FILE__) + '/../../spec_helper'
2
-
3
- describe "Stack BootLoaders" do
4
-
5
- before(:each) do
6
- clear_constants(:FooStack, :BarStack)
7
- end
8
-
9
- it "should inherit the standard bootloaders from Pancake::Stack" do
10
- class ::FooStack < Pancake::Stack; end
11
- FooStack::BootLoader.should inherit_from(Pancake::Stack::BootLoader)
12
- end
13
-
14
- it "should get all the bootloaders from pancake stack" do
15
- class ::FooStack < Pancake::Stack; end
16
- FooStack::BootLoader.map{|n,bl|n}.should == Pancake::Stack::BootLoader.map{|n,bl|n}
17
- end
18
-
19
- it "should let FooStack define it's own bootloaders" do
20
- class ::FooStack < Pancake::Stack; end
21
- FooStack::BootLoader.add(:foo_stack_bootloader){ def run!; end }
22
- FooStack::BootLoader.map{|n,b|n}.should include(:foo_stack_bootloader)
23
- Pancake::Stack::BootLoader.map{|n,b|n}.should_not include(:foo_stack_bootloader)
24
- end
25
-
26
- it "should not pollute other bootloaders" do
27
- class ::FooStack < Pancake::Stack; end
28
- FooStack::BootLoader.add(:foo_stack_bootloader){ def run!; end }
29
- class ::BarStack < Pancake::Stack; end
30
- FooStack::BootLoader.map{|n,b|n}.should_not == BarStack::BootLoader.map{|n,b|n}
31
- BarStack::BootLoader.map{|n,b|n}.should_not include(:foo_stack_bootloader)
32
- end
33
-
34
- it "should inherit custom bootloaders" do
35
- class ::FooStack < Pancake::Stack; end
36
- FooStack::BootLoader.add(:foo_stack_bootloader){ def run!; end }
37
- class ::BarStack < FooStack; end
38
- BarStack::BootLoader.map{|n,b|n}.should include(:foo_stack_bootloader)
39
- end
40
-
41
- end
File without changes
@@ -1,442 +0,0 @@
1
- require File.join(File.expand_path(File.dirname(__FILE__)),'..', '..', '..', 'spec_helper')
2
-
3
- describe Pancake::Stacks::Short::Controller do
4
-
5
- before do
6
- class ::ShortFoo < Pancake::Stacks::Short
7
- add_root(__FILE__)
8
- add_root(File.expand_path(File.dirname(__FILE__)), "..", "fixtures", "stacks", "short", "foobar")
9
- class Controller
10
-
11
- def do_dispatch!
12
- dispatch!
13
- end
14
-
15
- publish
16
- def show; "show"; end
17
-
18
- publish
19
- def index; "index"; end
20
-
21
- publish
22
- def a_rack_response
23
- r = Rack::Response.new
24
- r.redirect("/foo")
25
- r
26
- end
27
-
28
- publish
29
- def an_array_response
30
- [200, {"Content-Type" => "text/plain"}, ["Custom Array Response"]]
31
- end
32
-
33
- protected
34
- def a_protected_method; "protected"; end
35
-
36
- private
37
- def a_private_method; "private"; end
38
- end
39
- end
40
- end
41
-
42
- after do
43
- clear_constants "ShortFoo", :ShortBar
44
- end
45
-
46
- def app
47
- ShortFoo.stackup
48
- end
49
-
50
- it "should have a Controller" do
51
- Pancake::Stacks::Short.constants.map(&:to_s).should include("Controller")
52
- end
53
-
54
- it "should inherit the subclass controller from the parent controller" do
55
- ShortFoo::Controller.should inherit_from(Pancake::Stacks::Short::Controller)
56
- end
57
-
58
- describe "dispatching an action" do
59
- before do
60
- @controller = ShortFoo::Controller.new(env_for)
61
- end
62
-
63
- it "should call the 'show' action" do
64
- @controller.params["action"] = "show"
65
- result = @controller.do_dispatch!
66
- result[0].should == 200
67
- result[2].body.join.should == "show"
68
- end
69
-
70
- it "should raise a Pancake::Response::NotFound exception when an action is now found" do
71
- @controller.params["action"] = :does_not_exist
72
- result = @controller.do_dispatch!
73
- result[0].should == 404
74
- end
75
-
76
- it "should not dispatch to a protected method" do
77
- @controller.params["action"] = "a_protected_method"
78
- result = @controller.do_dispatch!
79
- result[0].should == 404
80
- end
81
-
82
- it "should not dispatch to a private method" do
83
- @controller.params["action"] = "a_private_method"
84
- result = @controller.do_dispatch!
85
- result[0].should == 404
86
- end
87
-
88
- it "should raise an exception if pancake has told it not to handle errors" do
89
- Pancake.should_receive(:handle_errors?).and_return(false)
90
- @controller.params["action"] = "a_private_method"
91
- lambda do
92
- @controller.do_dispatch!
93
- end.should raise_error
94
- end
95
-
96
- it "should let me return an array as a rack response" do
97
- @controller.params["action"] = "an_array_response"
98
- result = @controller.do_dispatch!
99
- result.should == [200, {"Content-Type" => "text/plain"}, ["Custom Array Response"]]
100
- end
101
-
102
- it "should allow me to return a Rack::Response" do
103
- @controller.params["action"] = "a_rack_response"
104
- result = @controller.do_dispatch!
105
- result[0].should == 302
106
- result[1]["Location"].should == "/foo"
107
- end
108
-
109
- describe "helper in methods" do
110
- before do
111
- module PancakeTestHelper
112
- def some_helper_method
113
- "foo"
114
- end
115
- end
116
-
117
- class ShortFoo
118
- class Controller
119
- include PancakeTestHelper
120
- end
121
- end
122
- end
123
- after do
124
- clear_constants "PancakeTestHelper"
125
- end
126
-
127
- it "should not call a helper method" do
128
- @controller.params["action"] = "some_helper_method"
129
- result = @controller.do_dispatch!
130
- result[0].should == 404
131
- end
132
-
133
- end
134
- end
135
-
136
- describe "request helper methods" do
137
- before do
138
- class ::RequestFoo < Pancake::Stacks::Short
139
- add_root(__FILE__, "..", "..", "fixtures", "stacks", "short", "foobar")
140
- get "/foobar", :_name => :foobar do
141
- url(:foobar)
142
- end
143
-
144
- get "/template", :_name => :template do
145
- render :template
146
- end
147
-
148
- get "/vault" do
149
- v[:my_data] = "some data"
150
- render :vault
151
- end
152
-
153
- get "/redirect" do
154
- redirect "/some_other_place"
155
- end
156
- end
157
- end
158
-
159
- after do
160
- clear_constants :RequestFoo
161
- end
162
-
163
- def app
164
- RequestFoo.stackup
165
- end
166
-
167
- it "should include the request helper methods" do
168
- (Pancake::Mixins::RequestHelper > ShortFoo::Controller).should be_true
169
- end
170
-
171
- it "should provide access to the request methods in the controller" do
172
- result = get "/foobar"
173
- result.body.should == "/foobar"
174
- end
175
-
176
- it "should provide access to the helper methods in the views" do
177
- result = get "/template"
178
- result.status.should == 200
179
- result.body.should include("/foobar")
180
- result.body.should include("In Template")
181
- end
182
-
183
- it "should allow me to get information between the view and the controller" do
184
- result = get "/vault"
185
- result.status.should == 200
186
- result.body.should include("some data")
187
- result.body.should include("In Vault")
188
- end
189
-
190
- it "should redirect" do
191
- result = get "/redirect"
192
- result.status.should == 302
193
- result.headers["Location"].should == "/some_other_place"
194
- end
195
- end
196
-
197
- describe "accept type negotiations" do
198
- before do
199
- class ::ShortBar < Pancake::Stacks::Short
200
- roots << Pancake.get_root(__FILE__)
201
- # makes the dispatch method public
202
- def do_dispatch!
203
- dispatch!
204
- end
205
-
206
- provides :json, :xml, :text
207
-
208
- get "/foo/bar(.:format)" do
209
- "format #{content_type.inspect}"
210
- end
211
- end # ShortBar
212
- end # before
213
-
214
- def app
215
- ShortBar.stackup
216
- end
217
-
218
- it "should get json by default" do
219
- result = get "/foo/bar", {}, "HTTP_ACCEPT" => "application/json"
220
- result.status.should == 200
221
- result.headers["Content-Type"].should == "application/json"
222
- result.body.to_s.should == "format :json"
223
- end
224
-
225
- it "should get xml when specified" do
226
- result = get "/foo/bar.xml"
227
- result.status.should == 200
228
- result.headers["Content-Type"].should == "application/xml"
229
- result.body.to_s.should == "format :xml"
230
- end
231
-
232
- it "should get json when specified with */*" do
233
- result = get "/foo/bar", {}, "HTTP_ACCEPT" => "*/*"
234
- result.status.should == 200
235
- result.body.to_s.should == "format :json"
236
- result.headers["Content-Type"].should == "application/json"
237
- end
238
-
239
- it "should get the default when specified with */*" do
240
- result = get "/foo/bar", {}, "HTTP_ACCEPT" => "application/xml,*/*"
241
- result.status.should == 200
242
- result.body.to_s.should == "format :json"
243
- result.headers["Content-Type"].should == "application/json"
244
- end
245
-
246
- it "should use the format in preference to the content type" do
247
- result = get "/foo/bar.xml", {}, "HTTP_ACCEPT" => "*/*"
248
- result.status.should == 200
249
- result.body.to_s.should == "format :xml"
250
- result.headers["Content-Type"].should == "application/xml"
251
- end
252
-
253
- it "should get json by default" do
254
- result = get "/foo/bar"
255
- result.status.should == 200
256
- result.body.to_s.should == "format :json"
257
- result.headers["Content-Type"].should == "application/json"
258
- end
259
-
260
- it "should correctly negotiate different scenarios" do
261
- r = get "/foo/bar", {}, {}
262
- r.body.should == "format :json"
263
- r = get "/foo/bar.xml", {}, {}
264
- r.body.should == "format :xml"
265
- r = get "/foo/bar", {}, {}
266
- r.body.should == "format :json"
267
- r = get "/foo/bar", {}, "HTTP_ACCEPT" => "application/xml"
268
- r.body.should == "format :xml"
269
- r = get "/foo/bar.json"
270
- r.body.should == "format :json"
271
- end
272
-
273
- it "should negotiate based on extension" do
274
- r = get "/foo/bar"
275
- r.body.should == "format :json"
276
- r = get "/foo/bar.text"
277
- r.body.should == "format :text"
278
- r = get "/foo/bar.xml"
279
- r.body.should == "format :xml"
280
- r = get "/foo/bar.txt"
281
- r.body.should == "format :text"
282
- end
283
-
284
- it "should not provide a response to a format that is not provided" do
285
- r = get "/foo/bar.svg"
286
- r.status.should == 406
287
- end
288
- end # Accept type negotiations
289
-
290
- describe "error handling" do
291
- before do
292
- class ::ShortFoo
293
- provides :html, :xml
294
-
295
- get "/foo(.:format)" do
296
- "HERE"
297
- end
298
-
299
- get "/bad" do
300
- raise "This is bad"
301
- end
302
-
303
- get "/template/:name" do
304
- render params[:name]
305
- end
306
-
307
- end
308
- end
309
-
310
- describe "default error handling" do
311
- def app
312
- ShortFoo.stackup
313
- end
314
-
315
- it "should handle a NotFound by default" do
316
- result = get "/does_not_exist"
317
- result.status.should == 404
318
- result.body.should include(Pancake::Errors::NotFound.description)
319
- end
320
-
321
- it "should return a 500 status for a Random Error by wrapping it in a Pancake::Errors::Server" do
322
- result = get "/bad"
323
- result.status.should == 500
324
- result.body.should include(Pancake::Errors::Server.description)
325
- end
326
-
327
- it "should handle a NotAcceptable error" do
328
- result = get "/foo.no_format_i_know_of"
329
- result.status.should == 406
330
- result.body.should include(Pancake::Errors::NotAcceptable.description)
331
- end
332
-
333
- it "should return 406 for a format that is in pancake but not in the group" do
334
- r = get "/foo.svg"
335
- r.status.should == 406
336
- end
337
- end
338
-
339
- describe "custom error handling" do
340
- before do
341
- ShortFoo.handle_exception do |error|
342
- out = ""
343
- out << "CUSTOM "
344
- out << error.name
345
- out << ": "
346
- out << error.description
347
- end
348
-
349
- ShortFoo.get "/bad" do
350
- raise "Really Bad"
351
- end
352
- end
353
-
354
- after do
355
- ShortFoo.handle_exception(&Pancake::Stacks::Short::Controller::DEFAULT_EXCEPTION_HANDLER)
356
- end
357
-
358
- it "should handle Pancake::Errors::NotFound errors" do
359
- r = get "/not_a_thing"
360
- r.status.should == 404
361
- r.body.should include("CUSTOM")
362
- r.body.should include(Pancake::Errors::NotFound.description)
363
- end
364
-
365
- it "should handle an unknown server error" do
366
- r = get "/bad"
367
- r.status.should == 500
368
- r.body.should include("CUSTOM")
369
- r.body.should include(Pancake::Errors::Server.description)
370
- end
371
-
372
- it "should let me do stuff on an instance level inside the handle exception" do
373
- ShortFoo.handle_exception do |error|
374
- self.status = 123
375
- "BOOO!"
376
- end
377
-
378
- r = get "/bad"
379
- r.status.should == 123
380
- r.body.should == "BOOO!"
381
- end
382
-
383
- end
384
-
385
- describe "rendering" do
386
-
387
- it "should render a template" do
388
- result = get "/template/basic"
389
- result.body.should include("basic template")
390
- end
391
-
392
- it "should inherit from a base view provided by short stacks" do
393
- File.file?(File.join(File.expand_path(File.dirname(__FILE__)), "..", "fixtures", "stacks", "short", "foobar", "views", "base.html.haml")).should be_false
394
- result = get "/template/inherited_from_base"
395
- result.body.should include("inherited from base")
396
- result.body.should include("Pancake")
397
- end
398
-
399
- it "should allow me to overwrite the base tempalte in later roots" do
400
- ShortFoo.add_root(File.expand_path(File.dirname(__FILE__)), "..", "fixtures", "stacks", "short", "foobar", "other_root")
401
- result = get "/template/inherited_from_base"
402
- result.body.should include("inherited from base")
403
- result.body.should include("Not the default pancake")
404
- end
405
- end
406
-
407
- describe "throwing" do
408
- before do
409
- ShortFoo.get("/plain_throw"){ throw :halt }
410
- ShortFoo.get("/string_throw"){ throw :halt, "output string" }
411
- ShortFoo.get("/status_n_throw"){ self.status = 204; throw :halt }
412
- ShortFoo.get("/headers_n_throw") do
413
- headers["some-header"] = Time.now.to_s
414
- throw :halt
415
- end
416
- end
417
-
418
- it "should handle a plain throw" do
419
- result = get "/plain_throw"
420
- result.should be_successful
421
- result.body.should == ""
422
- end
423
-
424
- it "should handle a string throw" do
425
- result = get "/string_throw"
426
- result.should be_successful
427
- result.body.should == "output string"
428
- end
429
-
430
- it "should handle a change in the status" do
431
- result = get "/status_n_throw"
432
- result.status.should == 204
433
- result.body.should == ""
434
- end
435
-
436
- it "should handle a change in the headers" do
437
- result = get "/headers_n_throw"
438
- result.headers["some-header"].should_not be_blank
439
- end
440
- end
441
- end
442
- end