pancake 0.1.25 → 0.1.26

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. data/lib/pancake/generators/templates/micro/%stack_name%/pancake_init.rb.tt +1 -1
  2. data/lib/pancake/generators/templates/short/%stack_name%/pancake_init.rb.tt +1 -1
  3. data/lib/pancake/master.rb +38 -0
  4. data/lib/pancake/mixins/render.rb +61 -11
  5. data/lib/pancake/mixins/render/render.rb +26 -3
  6. data/lib/pancake/mixins/render/template.rb +3 -3
  7. data/lib/pancake/mixins/request_helper.rb +1 -1
  8. data/lib/pancake/stack/stack.rb +9 -0
  9. data/lib/pancake/stacks/short/controller.rb +8 -15
  10. data/lib/pancake/stacks/short/stack.rb +8 -0
  11. data/spec/helpers/helpers.rb +3 -3
  12. data/spec/pancake/fixtures/render_templates/inherit/bar/base.html.haml +4 -0
  13. data/spec/pancake/fixtures/render_templates/inherit/bar/implicit_scope.html.haml +5 -0
  14. data/spec/pancake/fixtures/render_templates/inherit/bar/layout.html.haml +4 -0
  15. data/spec/pancake/fixtures/render_templates/inherit/foo/base.html.haml +5 -0
  16. data/spec/pancake/fixtures/render_templates/inherit/foo/defaults.html.haml +4 -0
  17. data/spec/pancake/fixtures/render_templates/inherit/foo/explicit.html.haml +4 -0
  18. data/spec/pancake/fixtures/render_templates/inherit/foo/from_explicit.html.haml +6 -0
  19. data/spec/pancake/fixtures/render_templates/inherit/foo/from_implicit_scope.html.haml +5 -0
  20. data/spec/pancake/fixtures/render_templates/inherit/foo/simple.html.haml +4 -0
  21. data/spec/pancake/fixtures/render_templates/view_context/inherited_haml_level_2.haml +5 -0
  22. data/spec/pancake/mixins/render/template_spec.rb +5 -5
  23. data/spec/pancake/mixins/render/view_context_spec.rb +77 -29
  24. data/spec/pancake/mixins/render_spec.rb +11 -0
  25. data/spec/pancake/pancake_spec.rb +52 -0
  26. data/spec/pancake/stack/stack_spec.rb +21 -3
  27. data/spec/pancake/stacks/short/controller_spec.rb +1 -0
  28. data/spec/pancake/stacks/short/stack_spec.rb +8 -0
  29. metadata +12 -2
@@ -1 +1 @@
1
- require File.join(File.expand_path(File.dirname(__FILE__), "<%= stack_name %>"))
1
+ require File.join(File.expand_path(File.dirname(__FILE__)), "<%= stack_name %>")
@@ -1 +1 @@
1
- require ::File.join(::File.expand_path(::File.dirname(__FILE__)), "lib", "<%= stack_name %>")
1
+ require ::File.join(::File.expand_path(::File.dirname(__FILE__)), "lib", "<%= stack_name %>")
@@ -119,5 +119,43 @@ module Pancake
119
119
  def logger=(logr)
120
120
  @logger = logr
121
121
  end
122
+
123
+ # The stack to use as the master stack. Can be nil!
124
+ # The master stack is assumed to be the stack that is the controlling stack for the group of pancake stacks
125
+ # @api public
126
+ def master_stack
127
+ @master_stack
128
+ end
129
+
130
+ # set the master stack. This also sets the master_templates as this stack if that hasn't yet been set.
131
+ # @see Pancake.master_templates
132
+ # @api public
133
+ def master_stack=(stack)
134
+ self.master_templates ||= stack
135
+ @master_stack = stack
136
+ end
137
+
138
+ # Used as the definitive source of shared templates for the whole pancake graph.
139
+ # Allows different stacks to share the same templates
140
+ # @see Pancake.master_templates=
141
+ # @api public
142
+ def master_templates
143
+ @master_templates
144
+ end
145
+
146
+ # Set the master templates to control the default templates for the stack
147
+ # @see Pancake.master_templates
148
+ # @api public
149
+ def master_templates=(stack)
150
+ @master_templates = stack
151
+ end
152
+
153
+ # provides access to the default base template via the Pancake.master_templates object
154
+ # @see Pancake.master_templates
155
+ # @api public
156
+ def default_base_template(opts = {})
157
+ raise "Master Templates not set" unless master_templates
158
+ master_templates.template(master_templates.base_template_name)
159
+ end
122
160
  end # self
123
161
  end # Pancake
@@ -42,7 +42,7 @@ module Pancake
42
42
  end
43
43
 
44
44
  raise TemplateNotFound unless renderer_path
45
- _template_cache[name] = Template.new(name, renderer_path.join)
45
+ _template_cache[name] = Template.new(name, self, renderer_path.join)
46
46
  end
47
47
 
48
48
  def _view_context_cache
@@ -61,6 +61,25 @@ module Pancake
61
61
  [_find_template(template), _find_view_context_class_for(template)]
62
62
  end
63
63
 
64
+ def _template_name_for(name, opts = {})
65
+ opts[:format] ||= :html
66
+ "#{name}.#{opts[:format]}"
67
+ end
68
+
69
+ def template(name_or_template, opts = {})
70
+ case name_or_template
71
+ when String, Symbol
72
+ _find_template(_template_name_for(name_or_template, opts))
73
+ when Template
74
+ name_or_template
75
+ else
76
+ nil
77
+ end
78
+ end
79
+
80
+ def base_template_name
81
+ :base
82
+ end
64
83
 
65
84
  end # ClassMethods
66
85
 
@@ -109,18 +128,49 @@ module Pancake
109
128
  out
110
129
  end
111
130
 
112
- def template(name_or_template)
113
- case name_or_template
114
- when String, Symbol
115
- self.class._find_template(_template_name_for(name_or_template, {}))
116
- when Template
117
- name_or_template
131
+ def template(name_or_template, opts = {})
132
+ opts[:format] ||= content_type
133
+ self.class.template(name_or_template, opts)
134
+ end
135
+
136
+ def negotiate_content_type!(*allowed_types)
137
+ return content_type if content_type
138
+
139
+ allowed_types = allowed_types.flatten
140
+ opts = allowed_types.pop if allowed_types.last.kind_of?(Hash)
141
+ if opts[:format]
142
+ cont, ct, mt = Pancake::MimeTypes.negotiate_by_extension(opts[:format].to_s, allowed_types)
118
143
  else
119
- nil
144
+ env["HTTP_ACCEPT"] ||= "*/*"
145
+ cont, ct, mt = Pancake::MimeTypes.negotiate_accept_type(env["HTTP_ACCEPT"], allowed_types)
120
146
  end
147
+
148
+ raise Errors::NotAcceptable unless cont
149
+
150
+ headers["Content-Type"] = ct
151
+ self.mime_type = mt
152
+ self.content_type = cont
153
+ cont
154
+ end
155
+
156
+ def content_type
157
+ env['pancake.request.format']
158
+ end
159
+
160
+ def content_type=(format)
161
+ env['pancake.request.format'] = format
162
+ end
163
+
164
+ def mime_type
165
+ env['pancake.request.mime']
166
+ end
167
+
168
+ def mime_type=(mime)
169
+ env['pancake.request.mime'] = mime
121
170
  end
122
171
 
123
172
 
173
+
124
174
  # A place holder method for any implementor that wants
125
175
  # to configure the view context prior to rendering occuring
126
176
  # any time this method is overwritten, it should call super!
@@ -130,9 +180,9 @@ module Pancake
130
180
  end
131
181
 
132
182
  private
133
- def _template_name_for(name, opts)
134
- opts[:format] ||= params[:format] || :html
135
- "#{name}.#{opts[:format]}"
183
+ def _template_name_for(name, opts = {})
184
+ opts[:format] ||= content_type
185
+ self.class._template_name_for(name, opts)
136
186
  end
137
187
 
138
188
  def _partial_template_name_for(name, opts)
@@ -48,10 +48,10 @@ module Pancake
48
48
  end
49
49
 
50
50
  if @_inherit_helper.inherits_from
51
- next_template = _view_context_for.template(@_inherit_helper.inherits_from)
51
+ next_template = template.owner.template(@_inherit_helper.inherits_from)
52
52
  @_inherit_helper.inherits_from = nil
53
53
  result = _with_renderer next_template do
54
- _current_renderer.render(self,opts)
54
+ render(next_template, opts)
55
55
  end
56
56
  end
57
57
  result
@@ -72,6 +72,10 @@ module Pancake
72
72
  def _current_renderer
73
73
  @_current_renderer
74
74
  end
75
+
76
+ def content_type
77
+ @_view_context_for.content_type
78
+ end
75
79
  end # Renderer
76
80
 
77
81
  module Capture
@@ -116,7 +120,26 @@ module Pancake
116
120
  @_inherit_helper = Helper.new
117
121
  end
118
122
 
119
- def inherits_from(name_or_template)
123
+ def inherits_from(ntos, name_or_opts = nil, opts = {})
124
+ name_or_template = case ntos
125
+ when String, Symbol
126
+ if ntos == :default!
127
+ begin
128
+ Pancake.default_base_template(:format => content_type)
129
+ rescue
130
+ :base
131
+ end
132
+ else
133
+ ntos
134
+ end
135
+ else
136
+ if name_or_opts.kind_of?(Hash)
137
+ opts = name_or_opts
138
+ name_or_opts = nil
139
+ end
140
+ name_or_opts ||= ntos.base_template_name
141
+ ntos.template(name_or_opts, opts)
142
+ end
120
143
  @_inherit_helper.inherits_from = name_or_template
121
144
  end
122
145
 
@@ -5,10 +5,10 @@ module Pancake
5
5
  class UnamedTemplate < Pancake::Errors::NotFound; end
6
6
  class NotFound < Pancake::Errors::NotFound; end
7
7
 
8
- attr_reader :name, :path, :renderer
8
+ attr_reader :name, :path, :renderer, :owner
9
9
 
10
- def initialize(name, path)
11
- @name, @path = name, path
10
+ def initialize(name, owner, path)
11
+ @name, @owner, @path = name, owner, path
12
12
  raise UnamedTemplate unless name
13
13
  raise NotFound unless File.exists?(path)
14
14
  @renderer = Tilt.new(path)
@@ -102,7 +102,7 @@ module Pancake
102
102
  # An accessor for the rack environment variable
103
103
  # @api public
104
104
  def env
105
- @env
105
+ @env ||= {}
106
106
  end
107
107
 
108
108
  # A handy request method that gets hold of the current request
@@ -136,6 +136,7 @@ module Pancake
136
136
 
137
137
  # Sets this as a master stack. This means that the "master" directory will be added to all existing stack roots
138
138
  def self.set_as_master!
139
+ Pancake.master_stack ||= self
139
140
  # Want to add master to the roots for this stack only
140
141
  roots.dup.each do |root|
141
142
  unless root =~ /master\/?$/
@@ -144,6 +145,14 @@ module Pancake
144
145
  end
145
146
  end
146
147
 
148
+ def self.template(name,opts ={})
149
+ raise Errors::NotImplemented, "Stack may not be used for templates until it implements a template method"
150
+ end
151
+
152
+ def self.base_template_name
153
+ raise Errors::NotImplemented, "Stack may not be used for templates until it implements a base_template_name method"
154
+ end
155
+
147
156
  # Creates a bootloader hook(s) of the given name. That are inheritable
148
157
  # This will create hooks for use in a bootloader (but will not create the bootloader itself!)
149
158
  #
@@ -52,19 +52,11 @@ module Pancake
52
52
  raise Errors::NotFound, "No Action Found" unless allowed_action?(params["action"])
53
53
 
54
54
  @action_opts = actions[params["action"]]
55
- if params[:format]
56
- @content_type, ct, @mime_type = Pancake::MimeTypes.negotiate_by_extension(params[:format].to_s, @action_opts.formats)
57
- else
58
- @content_type, ct, @mime_type = Pancake::MimeTypes.negotiate_accept_type(env["HTTP_ACCEPT"], @action_opts.formats)
59
- end
60
55
 
61
- raise Errors::NotAcceptable unless @content_type
56
+ negotiate_content_type!(@action_opts.formats, params)
62
57
 
63
58
  logger.info "Dispatching to #{params["action"].inspect}" if logger
64
59
 
65
- # set the response header
66
- headers["Content-Type"] = ct
67
-
68
60
  result = catch(:halt){ self.send(params['action']) }
69
61
  case result
70
62
  when Array
@@ -92,10 +84,6 @@ module Pancake
92
84
  handle_request_exception(server_error)
93
85
  end
94
86
 
95
- def content_type
96
- @content_type
97
- end
98
-
99
87
  def log_http_error?(error)
100
88
  true
101
89
  end
@@ -125,10 +113,15 @@ module Pancake
125
113
  stack_class.roots
126
114
  end
127
115
 
128
- def _tempate_name_for(name, opts)
129
- opts[:format] ||= content_type
116
+ def self._template_name_for(name, opts)
117
+ opts[:format] ||= :html
130
118
  "#{name}.#{opts[:format]}"
131
119
  end
120
+
121
+ def _tempate_name_for(name, opts = {})
122
+ opts[:format] ||= content_type
123
+ self.class._template_name_for(name, opts)
124
+ end
132
125
  end # Controller
133
126
 
134
127
  end # Short
@@ -39,6 +39,14 @@ module Pancake
39
39
  self::Controller.class_eval{ include m }
40
40
  end
41
41
 
42
+ def self.template(*args)
43
+ self::Controller.template(*args)
44
+ end
45
+
46
+ def self.base_template_name
47
+ self::Controller.base_template_name
48
+ end
49
+
42
50
  # Gets a resource at a given path
43
51
  #
44
52
  # The block should finish with the final result of the action
@@ -3,7 +3,7 @@ module Pancake
3
3
  module Helpers
4
4
  def clear_constants(*classes)
5
5
  classes.flatten.each do |klass|
6
- begin
6
+ begin
7
7
  Object.class_eval do
8
8
  remove_const klass
9
9
  end
@@ -11,10 +11,10 @@ module Pancake
11
11
  end
12
12
  end
13
13
  end # clear_constnat3
14
-
14
+
15
15
  def env_for(path = "/", opts = {})
16
16
  Rack::MockRequest.env_for(path, opts)
17
17
  end
18
18
  end # Helpers
19
19
  end # Spec
20
- end # Pancake
20
+ end # Pancake
@@ -0,0 +1,4 @@
1
+ Bar Base
2
+
3
+ - content_block :content do
4
+ Bar Base Content
@@ -0,0 +1,5 @@
1
+ - inherits_from :base
2
+
3
+ - content_block :content do
4
+ Bar Implicit Scope Content
5
+ = content_block.super
@@ -0,0 +1,4 @@
1
+ Bar Layout
2
+
3
+ - content_block :content do
4
+ Bar Default Content
@@ -0,0 +1,5 @@
1
+ %p
2
+ Foo Base
3
+
4
+ - content_block :content do
5
+ Foo Content
@@ -0,0 +1,4 @@
1
+ - inherits_from :default!
2
+
3
+ - content_block :content do
4
+ Defaults Content
@@ -0,0 +1,4 @@
1
+ - inherits_from BarFoo, :layout
2
+
3
+ - content_block :content do
4
+ Explicit Content
@@ -0,0 +1,6 @@
1
+ - inherits_from :explicit
2
+
3
+ - content_block :content do
4
+ %p
5
+ From Explicit Content
6
+ = content_block.super
@@ -0,0 +1,5 @@
1
+ - inherits_from BarFoo, :implicit_scope
2
+
3
+ - content_block :content do
4
+ From Implicit Scope Content
5
+ = content_block.super
@@ -0,0 +1,4 @@
1
+ - inherits_from :base
2
+
3
+ - content_block :content do
4
+ Simple Foo Content
@@ -0,0 +1,5 @@
1
+ - inherits_from :inherited_haml_level_1
2
+
3
+ - content_block :foo do
4
+ %p inherited haml level 2 content
5
+ = content_block.super
@@ -14,31 +14,31 @@ describe Pancake::Mixins::Render::Template do
14
14
 
15
15
  describe "Creation" do
16
16
  it "should create a template with a name and a path" do
17
- result = FooBar::Template.new(:context, File.join(@templates_path, "context.erb"))
17
+ result = FooBar::Template.new(:context, FooBar, File.join(@templates_path, "context.erb"))
18
18
  result.should_not be_nil
19
19
  end
20
20
 
21
21
  it "should raise an error when creating a template without a name" do
22
22
  lambda do
23
- FooBar::Template.new(nil, File.join(@templates_path, "context.erb"))
23
+ FooBar::Template.new(nil, FooBar, File.join(@templates_path, "context.erb"))
24
24
  end.should raise_error(Pancake::Mixins::Render::Template::UnamedTemplate)
25
25
  end
26
26
 
27
27
  it "should raise an error when createing a template withouth a valid file name" do
28
28
  lambda do
29
- FooBar::Template.new(:foo, "/not/a/real/file.erb")
29
+ FooBar::Template.new(:foo, FooBar, "/not/a/real/file.erb")
30
30
  end.should raise_error(Pancake::Mixins::Render::Template::NotFound)
31
31
  end
32
32
 
33
33
  it "should raise an error when it cannot create a rendering object for the file" do
34
34
  lambda do
35
- FooBar::Template.new(:foo, "/not/registed")
35
+ FooBar::Template.new(:foo, FooBar, "/not/registed")
36
36
  end.should raise_error
37
37
  end
38
38
 
39
39
  describe "accessing information" do
40
40
  before do
41
- @template = FooBar::Template.new(:context, File.join(@templates_path, "context.erb"))
41
+ @template = FooBar::Template.new(:context, FooBar, File.join(@templates_path, "context.erb"))
42
42
  end
43
43
 
44
44
  it "should provide access to it's name" do
@@ -3,6 +3,7 @@ require File.join(File.dirname(__FILE__), "..", "..", "..", "spec_helper")
3
3
  describe Pancake::Mixins::Render::ViewContext do
4
4
 
5
5
  before do
6
+ @masters = [Pancake.master_stack, Pancake.master_templates]
6
7
  $captures = []
7
8
  class ::FooBar
8
9
  include Pancake::Mixins::Render
@@ -12,16 +13,20 @@ describe Pancake::Mixins::Render::ViewContext do
12
13
  @env = env
13
14
  end
14
15
 
15
- def _template_name_for(name, opts)
16
+ def self._template_name_for(name, opts)
16
17
  "#{name}"
17
18
  end
19
+
18
20
  push_paths :views, "", "**/*"
19
21
 
20
22
  roots << File.join(File.expand_path(File.dirname(__FILE__)),"..","..", "fixtures", "render_templates", "view_context")
21
23
  end
24
+ Pancake.master_stack = FooBar
25
+ Pancake.master_templates = FooBar
22
26
  end
23
27
 
24
28
  after do
29
+ Pancake.master_stack, Pancake.master_templates = @masters
25
30
  clear_constants :FooBar, :BarFoo
26
31
  end
27
32
 
@@ -40,34 +45,6 @@ describe Pancake::Mixins::Render::ViewContext do
40
45
  it "should include the Pancake::Mixins::RequestHelper helper" do
41
46
  (Pancake::Mixins::RequestHelper > FooBar::ViewContext).should be_true
42
47
  end
43
-
44
- #it "should allow me to setup the view context before the view is run" do
45
- # FooBar.class_eval do
46
- # def view_context_before_render(context)
47
- # super
48
- # $captures << :here
49
- # end
50
- # end
51
- # $captures.should be_blank
52
- # FooBar.new.render(:context)
53
- # $captures.should include(:here)
54
- #end
55
-
56
- #it "should execute the before render block in the instance" do
57
- # FooBar.class_eval do
58
- # def view_context_before_render(context)
59
- # super
60
- # $captures << data
61
- # end
62
- # end
63
- # foobar = FooBar.new
64
- # foobar.data = {:some => :data}
65
- # foobar.render(:context)
66
- # $captures.should include(:some => :data)
67
- # $captures.clear
68
- # FooBar.new.render(:context)
69
- # $captures.should_not include(:some => :data)
70
- #end
71
48
  end
72
49
 
73
50
  describe "inheriting classes" do
@@ -178,6 +155,13 @@ describe Pancake::Mixins::Render::ViewContext do
178
155
  result.should include("inherited haml content")
179
156
  end
180
157
 
158
+ it "should inherit a template multiple times" do
159
+ result = @foo.render(:inherited_haml_level_2)
160
+ result.should include("inherited haml level 0")
161
+ result.should include("inherited haml level 1 content")
162
+ result.should include("inherited haml level 2 content")
163
+ end
164
+
181
165
  end
182
166
 
183
167
  describe "super blocks" do
@@ -250,6 +234,70 @@ describe Pancake::Mixins::Render::ViewContext do
250
234
  end
251
235
  end
252
236
 
237
+ describe "inheriting from a template object" do
238
+ before do
239
+ path = File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "fixtures", "render_templates", "inherit"))
240
+
241
+ class ::BarFoo
242
+ include Pancake::Mixins::Render
243
+ push_paths :views, "", "**/*"
244
+ end
245
+
246
+ class ::FooBar
247
+ def self._template_name_for(name, opts = {})
248
+ opts[:format] ||= :html
249
+ r = "#{name}.#{opts[:format]}"
250
+ end
251
+ end
252
+
253
+ FooBar.roots << File.join(path, "foo")
254
+ BarFoo.roots << File.join(path, "bar")
255
+ @app = FooBar.new({})
256
+ @bar = BarFoo.new
257
+ Pancake.master_templates = BarFoo
258
+ end
259
+
260
+ it "should inherit from it's own stack with a name" do
261
+ result = @app.render(:simple)
262
+ result.should include("Foo Base")
263
+ result.should include("Simple Foo Content")
264
+ end
265
+
266
+ it "should inherit from a stack, name pair" do
267
+ result = @app.render(:explicit)
268
+ result.should include("Bar Layout")
269
+ result.should include("Explicit Content")
270
+ end
271
+
272
+ it "should inherit from the pancake default using :defaults!" do
273
+ result = @app.render(:defaults)
274
+ result.should include("Bar Base")
275
+ result.should include("Defaults Content")
276
+ end
277
+
278
+ it "should use it's own base template when pancake does not have one set" do
279
+ Pancake.master_templates = nil
280
+ result = @app.render(:defaults)
281
+ result.should include("Foo Base")
282
+ result.should include("Defaults Content")
283
+ end
284
+
285
+ it "should inherit multiple levels to an explicit base template" do
286
+ result = @app.render(:from_explicit)
287
+ result.should include("Bar Layout")
288
+ result.should include("Explicit Content")
289
+ result.should include("From Explicit Content")
290
+ end
291
+
292
+ it "should inherit to an explicit layout that inherits to a scoped template" do
293
+ result = @app.render(:from_implicit_scope)
294
+ result.should include("Bar Base")
295
+ result.should include("Bar Implicit Scope Content")
296
+ result.should include("From Implicit Scope Content")
297
+ end
298
+
299
+ end
300
+
253
301
  describe "partials" do
254
302
  before do
255
303
  @foo = FooBar.new({})
@@ -36,6 +36,17 @@ describe Pancake::Mixins::Render do
36
36
  @render.render(:haml_template).chomp.should == "IN HAML"
37
37
  end
38
38
 
39
+ it "should provide me with a template from the class" do
40
+ template = RenderSpecClass.template(:haml_template)
41
+ template.should be_a_kind_of(Pancake::Mixins::Render::Template)
42
+ end
43
+
44
+ it "should allow me to set the format for a given template" do
45
+ template = RenderSpecClass.template(:erb_template, :format => :json)
46
+ template.should be_a_kind_of(Pancake::Mixins::Render::Template)
47
+ template.name.should == "erb_template.json"
48
+ end
49
+
39
50
  it "should render erb" do
40
51
  @render.render(:erb_template).should == "IN ERB"
41
52
  end
@@ -87,4 +87,56 @@ describe "pancake" do
87
87
  Pancake.default_error_handling!
88
88
  end
89
89
  end
90
+
91
+ describe "master stack" do
92
+ before do
93
+ @b4 = Pancake.master_stack
94
+ @tb4 = Pancake.master_templates
95
+ end
96
+
97
+ after do
98
+ Pancake.master_stack = @b4
99
+ Pancake.master_templates = @tb4
100
+ end
101
+
102
+ it "should have a master stack" do
103
+ Pancake.should respond_to(:master_stack)
104
+ end
105
+
106
+ it "should let me set a master stack" do
107
+ mock_stack = mock("stack", :null_object => true)
108
+ Pancake.master_stack = mock_stack
109
+ Pancake.master_stack.should == mock_stack
110
+ end
111
+
112
+ it "should provide master templates stack as the master stack" do
113
+ mock_stack = mock("stack", :null_object => true)
114
+ Pancake.master_stack = mock_stack
115
+ Pancake.master_templates.should == mock_stack
116
+ end
117
+
118
+ it "should let me overwrite the master_templates independantly of the master" do
119
+ mock_stack = mock("stack", :null_object => true)
120
+ mock_ui = mock("ui stack", :null_object => true)
121
+ Pancake.master_stack = mock_stack
122
+ Pancake.master_templates = mock_ui
123
+ Pancake.master_templates.should == mock_ui
124
+ Pancake.master_stack.should == mock_stack
125
+ end
126
+
127
+ it "should not change the master templates when updating the master" do
128
+ stack1 = mock("stack1", :null_object => true)
129
+ ui = mock("ui", :null_object => true)
130
+ Pancake.master_templates = ui
131
+ Pancake.master_stack = stack1
132
+ end
133
+
134
+ it "should provide me with the default template from the master_templates" do
135
+ ui = mock("ui")
136
+ ui.should_receive(:base_template_name).and_return(:fred)
137
+ ui.should_receive(:template).with(:fred).and_return(:template_fred)
138
+ Pancake.master_templates = ui
139
+ Pancake.default_base_template.should == :template_fred
140
+ end
141
+ end
90
142
  end
@@ -2,13 +2,13 @@ require File.dirname(__FILE__) + '/../../spec_helper'
2
2
 
3
3
  describe "Pancake::Stack" do
4
4
  before(:each) do
5
- class ::StackSpecStack < Pancake::Stack
6
- end
5
+ class ::StackSpecStack < Pancake::Stack; end
6
+ class ::OtherSpecStack < Pancake::Stack; end
7
7
  StackSpecStack.roots.clear
8
8
  end
9
9
 
10
10
  after(:each) do
11
- clear_constants(:StackSpecStack, :FooSpecStack)
11
+ clear_constants(:StackSpecStack, :FooSpecStack, :OtherSpecStack)
12
12
  end
13
13
 
14
14
  describe "roots" do
@@ -59,6 +59,14 @@ describe "Pancake::Stack" do
59
59
  end
60
60
  # end
61
61
  describe "master stack" do
62
+ before do
63
+ @b4 = Pancake.master_stack
64
+ end
65
+
66
+ after do
67
+ Pancake.master_stack = @b4
68
+ end
69
+
62
70
  it "should set the stack to be master, and include the master dir in each root" do
63
71
  StackSpecStack.add_root(__FILE__)
64
72
  before_roots = StackSpecStack.roots.dup
@@ -66,6 +74,16 @@ describe "Pancake::Stack" do
66
74
  before_roots.each do |r|
67
75
  StackSpecStack.roots.should include(File.join(r, "master"))
68
76
  end
77
+ Pancake.master_stack.should == StackSpecStack
78
+ end
79
+
80
+ it "should not set a master stack when one has already been set" do
81
+ StackSpecStack.add_root(__FILE__)
82
+ OtherSpecStack.add_root(__FILE__)
83
+ StackSpecStack.stackup(:master => true)
84
+ Pancake.master_stack.should == StackSpecStack
85
+ OtherSpecStack.stackup(:master => true)
86
+ Pancake.master_stack.should == StackSpecStack
69
87
  end
70
88
  end
71
89
 
@@ -7,6 +7,7 @@ describe Pancake::Stacks::Short::Controller do
7
7
  add_root(__FILE__)
8
8
  add_root(File.expand_path(File.dirname(__FILE__)), "..", "fixtures", "stacks", "short", "foobar")
9
9
  class Controller
10
+
10
11
  def do_dispatch!
11
12
  dispatch!
12
13
  end
@@ -3,6 +3,7 @@ require File.dirname(__FILE__) + '/../../../spec_helper'
3
3
  describe Pancake::Stacks::Short do
4
4
 
5
5
  before do
6
+ @master_before = [Pancake.master_stack, Pancake.master_templates]
6
7
  $captures = []
7
8
  class ::ShortMiddle
8
9
  attr_accessor :app
@@ -34,16 +35,23 @@ describe Pancake::Stacks::Short do
34
35
  end
35
36
 
36
37
  @app = ShortFoo
38
+ Pancake.master_stack = ShortFoo
39
+ Pancake.master_templates = ShortFoo
37
40
  end
38
41
 
39
42
  after do
40
43
  clear_constants :ShortFoo, :ShortMiddle, :OtherFoo, "ShortFoo::Router"
44
+ Pancake.master_stack, Pancake.master_templates = @master_before
41
45
  end
42
46
 
43
47
  def app
44
48
  @app.stackup
45
49
  end
46
50
 
51
+ it "should provide access through the stack interface to the templates" do
52
+ ShortFoo.template(:inherited_from_base).should be_an_instance_of(Pancake::Mixins::Render::Template)
53
+ end
54
+
47
55
  it "should go through the middleware to get to the actions" do
48
56
  get "/foo"
49
57
  $captures.should == [ShortMiddle]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pancake
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.25
4
+ version: 0.1.26
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Neighman
@@ -9,7 +9,7 @@ autorequire: pancake
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-23 00:00:00 +11:00
12
+ date: 2009-11-28 00:00:00 +11:00
13
13
  default_executable: pancake-gen
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -213,6 +213,15 @@ files:
213
213
  - spec/pancake/fixtures/render_templates/erb_template.json.erb
214
214
  - spec/pancake/fixtures/render_templates/haml_template.html.haml
215
215
  - spec/pancake/fixtures/render_templates/haml_template.xml.haml
216
+ - spec/pancake/fixtures/render_templates/inherit/bar/base.html.haml
217
+ - spec/pancake/fixtures/render_templates/inherit/bar/implicit_scope.html.haml
218
+ - spec/pancake/fixtures/render_templates/inherit/bar/layout.html.haml
219
+ - spec/pancake/fixtures/render_templates/inherit/foo/base.html.haml
220
+ - spec/pancake/fixtures/render_templates/inherit/foo/defaults.html.haml
221
+ - spec/pancake/fixtures/render_templates/inherit/foo/explicit.html.haml
222
+ - spec/pancake/fixtures/render_templates/inherit/foo/from_explicit.html.haml
223
+ - spec/pancake/fixtures/render_templates/inherit/foo/from_implicit_scope.html.haml
224
+ - spec/pancake/fixtures/render_templates/inherit/foo/simple.html.haml
216
225
  - spec/pancake/fixtures/render_templates/templates/context.erb
217
226
  - spec/pancake/fixtures/render_templates/view_context/_basic.haml
218
227
  - spec/pancake/fixtures/render_templates/view_context/_basic.html.haml
@@ -234,6 +243,7 @@ files:
234
243
  - spec/pancake/fixtures/render_templates/view_context/inherited_haml_from_erb.haml
235
244
  - spec/pancake/fixtures/render_templates/view_context/inherited_haml_level_0.haml
236
245
  - spec/pancake/fixtures/render_templates/view_context/inherited_haml_level_1.haml
246
+ - spec/pancake/fixtures/render_templates/view_context/inherited_haml_level_2.haml
237
247
  - spec/pancake/fixtures/render_templates/view_context/nested_content_level_0.haml
238
248
  - spec/pancake/fixtures/render_templates/view_context/nested_content_level_1.haml
239
249
  - spec/pancake/fixtures/render_templates/view_context/nested_inner.erb