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 +1 -6
- data/lib/pakada/render.rb +37 -21
- data/lib/pakada/render/controller.rb +4 -32
- data/lib/pakada/render/version.rb +1 -1
- data/spec/controller_spec.rb +1 -76
- data/spec/render_spec.rb +99 -49
- metadata +12 -12
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 :
|
24
|
-
Pakada.
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
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
|
-
|
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
|
-
|
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
|
data/spec/controller_spec.rb
CHANGED
@@ -2,7 +2,7 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe Pakada::Render::Controller do
|
4
4
|
let(:controller) {
|
5
|
-
Pakada.
|
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
|
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(:
|
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
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
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 "#
|
162
|
-
let(:
|
163
|
-
|
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
|
-
|
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 "
|
168
|
-
controller.
|
169
|
-
|
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
|
-
|
175
|
-
|
176
|
-
|
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(:
|
184
|
-
|
185
|
-
}
|
186
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
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.
|
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-
|
12
|
+
date: 2011-09-11 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: pakada
|
16
|
-
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: *
|
24
|
+
version_requirements: *74264980
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: tilt
|
27
|
-
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: *
|
35
|
+
version_requirements: *74264710
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: hike
|
38
|
-
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: *
|
46
|
+
version_requirements: *74264400
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rspec
|
49
|
-
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: *
|
57
|
+
version_requirements: *74263580
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: fakefs
|
60
|
-
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: *
|
68
|
+
version_requirements: *74263070
|
69
69
|
description:
|
70
70
|
email:
|
71
71
|
- lars.gierth@gmail.com
|