pakada-render 0.2.1 → 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.
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