pakada-render 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/config.ru CHANGED
@@ -5,17 +5,12 @@ require "awesome_print"
5
5
  class ::MyModule
6
6
  include Pakada::Module
7
7
  @path = Pathname.new(".")
8
- @dependencies << Pakada::Dispatch
8
+ @dependencies << Pakada::Dispatch << Pakada::Render
9
9
 
10
10
  def routes
11
11
  route :test, "/", &controller(:foo).action(:bar)
12
12
  end
13
13
  end
14
14
 
15
- Pakada.instance(:default) {|ins|
16
- ins.urls = ["/"]
17
- ins.modules = MyModule, Pakada::Render
18
- }
19
-
20
15
  Pakada.boot
21
16
  run Pakada
data/lib/pakada/render.rb CHANGED
@@ -15,22 +15,50 @@ class Pakada::Render
15
15
  attr_reader :load_path, :template_map
16
16
 
17
17
  def initialize
18
- Pakada.safety(RenderingContext).send :include, Hooked
18
+ Pakada.safety(Pakada::Render::RenderingContext).send :include, Hooked
19
19
  end
20
20
 
21
21
  def hooks
22
22
  if Pakada[:dispatch]
23
- Pakada[:dispatch].after :request, method(:render_layout)
24
- Pakada.safety(Pakada::Dispatch::Controller).tap {|c|
25
- c.around(:included) {|inner, klass|
26
- inner.call klass
27
- klass.send :include, Pakada.safety(Pakada::Render::Controller)
28
- klass.after :new, method(:render_controller)
29
- }
30
- }
23
+ Pakada[:dispatch].after :create_controller, method(:make_renderable)
24
+ Pakada[:dispatch].around :request, method(:render_layout)
25
+ end
26
+ end
27
+
28
+ def make_renderable(cls)
29
+ cls.send :include, Pakada.safety(Pakada::Render::Controller)
30
+ unless cls.options.key? :render
31
+ cls.options[:render] = true
32
+ end
33
+ unless cls.options.key? :layout
34
+ cls.options[:layout] = true
35
+ end
36
+ cls.instance_after :process, method(:render_controller)
37
+ end
38
+
39
+ def render_controller(controller)
40
+ unless controller.options[:layout]
41
+ controller.request.env["pakada.render.layout"] = false
42
+ end
43
+
44
+ if controller.options[:render]
45
+ controller.response.write controller.render
31
46
  end
32
47
  end
33
48
 
49
+ def render_layout(request, env)
50
+ key = "pakada.render.layout"
51
+ request.call(env).tap {|response|
52
+ env[key] = true unless env.key? key
53
+ if env[key]
54
+ response[1].delete "Content-Length"
55
+ content = []
56
+ response[2].each {|chunk| content << chunk }
57
+ response[2] = [render!(:layout, :content => content)]
58
+ end
59
+ }
60
+ end
61
+
34
62
  def boot
35
63
  Pakada.modules.each_value {|mod|
36
64
  mod.extend Pakada.safety(Pakada::Render::Rendering)
@@ -62,16 +90,4 @@ class Pakada::Render
62
90
  map
63
91
  }
64
92
  end
65
-
66
- def render_controller(controller)
67
- controller.response.write controller.render if controller.render?
68
- end
69
-
70
- def render_layout(response)
71
- content = []
72
- response[2].each {|chunk| content << chunk }
73
- response[2] = [render!(:layout, :content => content)]
74
-
75
- response[1].delete "Content-Length"
76
- end
77
93
  end
@@ -1,45 +1,17 @@
1
1
  class Pakada::Render
2
2
  module Controller
3
- def self.included(klass)
4
- klass.extend Pakada.safety(self::ClassMethods)
5
- klass.instance_variable_set :@rendering_rules, :render => [], :dont_render => []
6
- end
7
-
8
3
  def render(template = nil, additional_locals = {})
9
4
  if Hash === template
10
5
  template, additional_locals = nil, template
11
6
  end
12
- template ||= options.values_at(:module, :controller, :action).join("/")
7
+
8
+ template ||= options.values_at(:module, :controller, :action).compact.join("/")
13
9
 
14
10
  locals = instance_variables.inject({}) {|locals, key|
15
- locals[key.to_sym] = instance_variable_get(key)
16
- locals
11
+ locals[key.to_sym] = instance_variable_get(key); locals
17
12
  }.merge(additional_locals)
18
- Pakada[options[:module]].render template.to_sym, locals
19
- end
20
-
21
- def render?
22
- action = options[:action]
23
- render, dont_render = *self.class.rendering_rules.values_at(:render, :dont_render)
24
-
25
- !dont_render.include?(action) && (
26
- !dont_render.include?(:*) || render.include?(action))
27
- end
28
-
29
- module ClassMethods
30
- attr_reader :rendering_rules
31
-
32
- def dont_render(action = nil, *more_actions)
33
- if action
34
- rendering_rules[:dont_render].push action, *more_actions
35
- else
36
- rendering_rules[:dont_render] = [:*]
37
- end
38
- end
39
13
 
40
- def render(action, *more_actions)
41
- rendering_rules[:render].push action, *more_actions
42
- end
14
+ Pakada[options[:module]].render template.to_sym, locals
43
15
  end
44
16
  end
45
17
  end
@@ -1,5 +1,5 @@
1
1
  class Pakada
2
2
  class Render
3
- VERSION = "0.2.1"
3
+ VERSION = "0.3.0"
4
4
  end
5
5
  end
@@ -2,7 +2,7 @@ require "spec_helper"
2
2
 
3
3
  describe Pakada::Render::Controller do
4
4
  let(:controller) {
5
- Pakada.safety(Pakada::Dispatch::Controller).create {
5
+ Pakada[:dispatch].create_controller {
6
6
  include Pakada.safety(Pakada::Render::Controller)
7
7
  action(:bar) {}
8
8
  }
@@ -22,27 +22,6 @@ describe Pakada::Render::Controller do
22
22
  Pakada.modules[:foo_module] = foo_module
23
23
  }
24
24
 
25
- context ".included(klass)" do
26
- let(:klass) { stub "includer class" }
27
-
28
- it "extends klass with ClassMethods" do
29
- class_methods = Pakada.safety(Pakada::Render::Controller::ClassMethods)
30
- klass.should_receive(:extend).with class_methods
31
-
32
- Pakada.safety(Pakada::Render::Controller).included klass
33
- end
34
-
35
- it "defaults #rendering_rules to empty Arrays" do
36
- Pakada.safety(Pakada::Render::Controller).included klass
37
-
38
- klass.rendering_rules[:render].should be_an(Array)
39
- klass.rendering_rules[:render].should be_empty
40
-
41
- klass.rendering_rules[:dont_render].should be_an(Array)
42
- klass.rendering_rules[:dont_render].should be_empty
43
- end
44
- end
45
-
46
25
  context "#render(template, additional_locals)" do
47
26
  let(:renderer) { stub "renderer" }
48
27
 
@@ -89,58 +68,4 @@ describe Pakada::Render::Controller do
89
68
  obj.render
90
69
  end
91
70
  end
92
-
93
- context "#render?" do
94
- it "returns true by default" do
95
- obj.render?.should be_true
96
- end
97
-
98
- it "returns false if dont_render rules include action" do
99
- controller.dont_render :bar
100
-
101
- obj.render?.should be_false
102
- end
103
-
104
- it "returns false if dont_render rules include wildcard" do
105
- controller.dont_render
106
-
107
- obj.render?.should be_false
108
- end
109
-
110
- it "prioritizes render rules" do
111
- controller.dont_render
112
- controller.render :bar
113
-
114
- obj.render?.should be_true
115
- end
116
- end
117
-
118
- context ".render(action, *more_actions)" do
119
- it "adds each action to the render ruleset" do
120
- controller.tap {|c|
121
- c.render :foo, :bar, :baz
122
- c.rendering_rules[:render].should include(:foo)
123
- c.rendering_rules[:render].should include(:bar)
124
- c.rendering_rules[:render].should include(:baz)
125
- }
126
- end
127
- end
128
-
129
- context ".dont_render(action, *more_actions)" do
130
- it "adds each action to the dont_render ruleset" do
131
- controller.tap {|c|
132
- c.dont_render :foo, :bar, :baz
133
- c.rendering_rules[:dont_render].should include(:foo)
134
- c.rendering_rules[:dont_render].should include(:bar)
135
- c.rendering_rules[:dont_render].should include(:baz)
136
- }
137
- end
138
- end
139
-
140
- context ".dont_render" do
141
- it "adds a wildcard to the dont_render ruleset" do
142
- controller.dont_render
143
- controller.rendering_rules[:dont_render].should include(:*)
144
- end
145
- end
146
71
  end
data/spec/render_spec.rb CHANGED
@@ -2,7 +2,7 @@ require "spec_helper"
2
2
  require "fileutils"
3
3
 
4
4
  describe Pakada::Render do
5
- let(:render) { Pakada::Render.new }
5
+ let(:render) { Pakada[:render] }
6
6
 
7
7
  context "#initialize" do
8
8
  it "makes RenderingContext hookable" do
@@ -12,7 +12,7 @@ describe Pakada::Render do
12
12
  end
13
13
 
14
14
  context "#hooks" do
15
- let(:dispatch) { stub "dispatch module" }
15
+ let(:dispatch) { stub "dispatch module", :around => nil }
16
16
 
17
17
  before {
18
18
  Pakada.modules[:dispatch] = dispatch
@@ -20,36 +20,17 @@ describe Pakada::Render do
20
20
  }
21
21
 
22
22
  it "hooks Pakada::Dispatch#request with #render_layout" do
23
- dispatch.should_receive(:after) {|method, block|
23
+ dispatch.should_receive(:around) {|method, block|
24
24
  method.should equal(:request)
25
25
  block.should == render.method(:render_layout)
26
26
  }
27
27
  render.hooks
28
28
  end
29
29
 
30
- let(:klass) { stub "controller class", :include => nil }
31
-
32
- it "hooks Pakada::Dispatch::Controller.included to include Controller" do
33
- Pakada.safety(Pakada::Dispatch::Controller).should_receive(:around) {|method, &block|
34
- method.should equal(:included)
35
- klass.should_receive(:send).with :include, Pakada.safety(Pakada::Render::Controller)
36
- klass.should_receive(:after) {|method, block|
37
- method.should equal(:new)
38
- block.should == render.method(:render_controller)
39
- }
40
- block.call stub(:call => nil), klass
41
- }
42
- render.hooks
43
- end
44
-
45
- it "hooks Pakada::Dispatch::Controller.included to hook controller#new with #render_controller" do
46
- Pakada.safety(Pakada::Dispatch::Controller).should_receive(:around) {|method, &block|
47
- method.should equal(:included)
48
- klass.should_receive(:after) {|method, block|
49
- method.should equal(:new)
50
- block.should == render.method(:render_controller)
51
- }
52
- block.call stub(:call => nil), klass
30
+ it "hooks Pakada::Dispatch#create_controller with #make_renderable" do
31
+ dispatch.should_receive(:after) {|method, block|
32
+ method.should equal(:create_controller)
33
+ block.should == render.method(:make_renderable)
53
34
  }
54
35
  render.hooks
55
36
  end
@@ -158,46 +139,115 @@ describe Pakada::Render do
158
139
  end
159
140
  end
160
141
 
161
- context "#render_controller" do
162
- let(:controller) { stub "controller", :response => stub("response") }
163
- let(:result) { stub "result" }
142
+ context "#make_renderable(controller_class)" do
143
+ let(:controller_class) { Pakada[:dispatch].create_controller {} }
144
+
145
+ it "extends the controller class with Pakada::Render::Controller" do
146
+ render.make_renderable controller_class
147
+
148
+ controller = Pakada.safety(Pakada::Render::Controller)
149
+ controller_class.included_modules.should include(controller)
150
+ end
164
151
 
165
- before { controller.stub :render => result }
152
+ it "sets the :render option to true" do
153
+ render.make_renderable controller_class
154
+ controller_class.options[:render].should be_true
155
+ end
156
+
157
+ it "doesn't set :render if already set" do
158
+ controller_class.options[:render] = false
159
+ render.make_renderable controller_class
160
+ controller_class.options[:render].should be_false
161
+ end
162
+
163
+ it "sets the :layout option to true" do
164
+ render.make_renderable controller_class
165
+ controller_class.options[:layout].should be_true
166
+ end
167
+
168
+ it "doesn't set :layout if already set" do
169
+ controller_class.options[:layout] = false
170
+ render.make_renderable controller_class
171
+ controller_class.options[:layout].should be_false
172
+ end
173
+
174
+ it "hooks controller_class#process with #render_controller" do
175
+ controller_class.should_receive(:instance_after) {|method, block|
176
+ method.should equal(:process)
177
+ block.should == render.method(:render_controller)
178
+ }
179
+ render.make_renderable controller_class
180
+ end
181
+ end
182
+
183
+ context "#render_controller(controller)" do
184
+ let(:env) { {} }
185
+ let(:controller) { Pakada[:dispatch].create_controller {}.new env }
166
186
 
167
- it "renders the controller's template" do
168
- controller.stub :render? => true
169
- controller.response.should_receive(:write).with result
187
+ it "sets env[pakada.render.layout] to false if :layout option is false" do
188
+ controller.options[:layout] = false
189
+ render.render_controller controller
190
+ controller.request.env["pakada.render.layout"].should be_false
170
191
 
192
+ controller.request.env["pakada.render.layout"] = true
193
+ controller.options[:layout] = true
171
194
  render.render_controller controller
195
+ controller.request.env["pakada.render.layout"].should be_true
172
196
  end
173
197
 
174
- it "doesn't render if it's not supposed to" do
175
- controller.stub :render? => false
176
- controller.response.should_not_receive :write
198
+ let(:rendered_controller) { stub "rendered controller" }
199
+
200
+ it "renders the controller into the response body" do
201
+ controller.should_receive(:render) { rendered_controller }
202
+ controller.response.should_receive(:write).with rendered_controller
177
203
 
204
+ controller.options[:render] = true
205
+ render.render_controller controller
206
+ end
207
+
208
+ it "doesn't render the controller if :render is false" do
209
+ render.should_not_receive :render
210
+ controller.options[:render] = false
178
211
  render.render_controller controller
179
212
  end
180
213
  end
181
214
 
182
- context "#render_layout" do
183
- let(:response) {
184
- [200, {"Content-Length" => "123"}, [content]]
185
- }
186
- let(:content) { stub "content" }
215
+ context "#render_layout(request, env)" do
216
+ let(:env) { {} }
217
+ let(:request) { proc {|env| response } }
218
+ let(:response) { [200, {"Content-Length" => "123"}, []] }
219
+
220
+ before { render.boot }
187
221
 
188
- before { render.stub :render! }
222
+ it "defaults env[pakada.render.layout] to true" do
223
+ render.render_layout request, env
224
+ env["pakada.render.layout"].should be_true
225
+ end
226
+
227
+ it "doesn't render if env[pakada.render.layout] is false" do
228
+ render.should_not_receive :render
229
+ env["pakada.render.layout"] = false
230
+ render.render_layout request, env
231
+ end
232
+
233
+ it "deletes the Content-Length header" do
234
+ render.render_layout request, env
235
+ response[1].key?("Content-Length").should be_false
236
+ end
189
237
 
190
- it "render's a layout around the content" do
238
+ let(:content) { stub "content" }
239
+ let(:renderer) { stub "renderer" }
240
+
241
+ it "renders the layout passing the response body as :content local" do
191
242
  render.should_receive(:render!) {|template, locals|
192
243
  template.should equal(:layout)
193
244
  locals[:content].should == [content]
245
+ renderer
194
246
  }
195
- render.render_layout response
196
- end
197
-
198
- it "removes the Content-Length header" do
199
- render.render_layout response
200
- response[1]["Content-Length"].should be_nil
247
+ response[2] = [content]
248
+
249
+ render.render_layout request, env
250
+ response[2].should == [renderer]
201
251
  end
202
252
  end
203
253
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pakada-render
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-03 00:00:00.000000000Z
12
+ date: 2011-09-11 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: pakada
16
- requirement: &72368450 !ruby/object:Gem::Requirement
16
+ requirement: &74264980 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *72368450
24
+ version_requirements: *74264980
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: tilt
27
- requirement: &72368050 !ruby/object:Gem::Requirement
27
+ requirement: &74264710 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *72368050
35
+ version_requirements: *74264710
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: hike
38
- requirement: &72367660 !ruby/object:Gem::Requirement
38
+ requirement: &74264400 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *72367660
46
+ version_requirements: *74264400
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &72367330 !ruby/object:Gem::Requirement
49
+ requirement: &74263580 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *72367330
57
+ version_requirements: *74263580
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: fakefs
60
- requirement: &72366750 !ruby/object:Gem::Requirement
60
+ requirement: &74263070 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *72366750
68
+ version_requirements: *74263070
69
69
  description:
70
70
  email:
71
71
  - lars.gierth@gmail.com