pakada-render 0.2.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/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source :rubygems
2
+
3
+ gemspec
4
+
5
+ gem "rake"
6
+ gem "awesome_print"
7
+
8
+ gem "shotgun"
9
+ gem "thin"
10
+
11
+ gem "fakefs", :git => "https://github.com/lgierth/fakefs",
12
+ :branch => "fix_infinite_loop"
13
+ gem "pakada-dispatch", :git => "https://github.com/lgierth/pakada-dispatch"
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2011 Lars Gierth
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,4 @@
1
+ Template rendering for Pakada
2
+ =============================
3
+
4
+ TODO: Write documentation
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ task :default => :spec
2
+
3
+ require "rspec/core/rake_task"
4
+ RSpec::Core::RakeTask.new :spec
data/config.ru ADDED
@@ -0,0 +1,21 @@
1
+ require "pakada/dispatch"
2
+ require "pakada/render"
3
+ require "awesome_print"
4
+
5
+ class ::MyModule
6
+ include Pakada::Module
7
+ @path = Pathname.new(".")
8
+ @dependencies << Pakada::Dispatch
9
+
10
+ def routes
11
+ route :test, "/", &controller(:foo).action(:bar)
12
+ end
13
+ end
14
+
15
+ Pakada.instance(:default) {|ins|
16
+ ins.urls = ["/"]
17
+ ins.modules = MyModule, Pakada::Render
18
+ }
19
+
20
+ Pakada.boot
21
+ run Pakada
@@ -0,0 +1,3 @@
1
+ action(:bar) {
2
+ @name = "world"
3
+ }
@@ -0,0 +1 @@
1
+ require "pakada/theming"
@@ -0,0 +1,77 @@
1
+ require "hike"
2
+ require "tilt"
3
+
4
+ require "pakada"
5
+
6
+ require "pakada/render/controller"
7
+ require "pakada/render/renderer"
8
+ require "pakada/render/rendering"
9
+ require "pakada/render/rendering_context"
10
+ require "pakada/render/version"
11
+
12
+ class Pakada::Render
13
+ include Pakada::Module
14
+
15
+ attr_reader :load_path, :template_map
16
+
17
+ def initialize
18
+ Pakada.safety(RenderingContext).send :include, Hooked
19
+ end
20
+
21
+ def hooks
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
+ }
31
+ end
32
+ end
33
+
34
+ def boot
35
+ Pakada.modules.each_value {|mod|
36
+ mod.extend Pakada.safety(Pakada::Render::Rendering)
37
+ }
38
+
39
+ @load_path = build_load_path
40
+ @template_map = build_template_map(load_path)
41
+ end
42
+
43
+ def build_load_path
44
+ Hike::Trail.new("/").tap {|load_path|
45
+ load_path.append_extensions *Tilt.mappings.keys
46
+ load_path.append_path Pakada.path.join("templates")
47
+ Pakada.modules.each_value {|mod|
48
+ load_path.append_path mod.path.join("templates")
49
+ }
50
+ }
51
+ end
52
+
53
+ def build_template_map(load_path)
54
+ load_path.paths.map {|path|
55
+ prefix = %r|#{Regexp.quote path.to_s}/|
56
+ Dir.glob("#{path}/**/*").map {|filepath|
57
+ next if File.directory? filepath
58
+ filepath.gsub(prefix, "").rpartition(".").first
59
+ }
60
+ }.flatten.compact.uniq.inject({}) {|map, name|
61
+ map[name.to_sym] = Tilt.new(load_path.find(name))
62
+ map
63
+ }
64
+ 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
+ end
@@ -0,0 +1,45 @@
1
+ class Pakada::Render
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
+ def render(template = nil, additional_locals = {})
9
+ if Hash === template
10
+ template, additional_locals = nil, template
11
+ end
12
+ template ||= options.values_at(:module, :controller, :action).join("/")
13
+
14
+ locals = instance_variables.inject({}) {|locals, key|
15
+ locals[key] = instance_variable_get(key)
16
+ locals
17
+ }.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
+
40
+ def render(action, *more_actions)
41
+ rendering_rules[:render].push action, *more_actions
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,29 @@
1
+ class Pakada::Render
2
+ class Renderer
3
+ attr_reader :engine, :locals
4
+
5
+ def initialize(engine, locals = {})
6
+ @engine, @locals = engine, locals
7
+ @instance = Pakada.instance
8
+ end
9
+
10
+ def to_s
11
+ @string ||= Pakada.instance(@instance.name) {
12
+ context = Pakada.safety(Pakada::Render::RenderingContext).new
13
+ engine.render context, locals
14
+ }
15
+ end
16
+
17
+ def each
18
+ yield to_s
19
+ end
20
+
21
+ def [](key)
22
+ locals[key]
23
+ end
24
+
25
+ def []=(key, value)
26
+ locals[key] = value
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,14 @@
1
+ class Pakada::Render
2
+ module Rendering
3
+ def render(template, locals = {})
4
+ engine = Pakada[:render].template_map[template.to_sym]
5
+ raise ArgumentError, "Unknown template #{template.inspect}" unless engine
6
+
7
+ Pakada.safety(Pakada::Render::Renderer).new engine, locals
8
+ end
9
+
10
+ def render!(template, locals = {})
11
+ render(template, locals).to_s
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,4 @@
1
+ class Pakada::Render
2
+ class RenderingContext
3
+ end
4
+ end
@@ -0,0 +1,5 @@
1
+ class Pakada
2
+ class Render
3
+ VERSION = "0.2.0"
4
+ end
5
+ end
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "pakada/render/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "pakada-render"
7
+ s.version = Pakada::Render::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Lars Gierth"]
10
+ s.email = ["lars.gierth@gmail.com"]
11
+ s.homepage = "https://rubygems.org/gems/pakada-render"
12
+ s.summary = %q{Template rendering for Pakada}
13
+ #s.description = %q{TODO: Write a gem description}
14
+
15
+ s.add_dependency "pakada"
16
+ s.add_dependency "tilt"
17
+ s.add_dependency "hike"
18
+
19
+ s.add_development_dependency "rspec"
20
+ s.add_development_dependency "fakefs"
21
+
22
+ s.files = `git ls-files`.split("\n") - [".gitignore", ".travis.yml"]
23
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
24
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
25
+ s.require_paths = ["lib"]
26
+ end
@@ -0,0 +1,146 @@
1
+ require "spec_helper"
2
+
3
+ describe Pakada::Render::Controller do
4
+ let(:controller) {
5
+ Pakada.safety(Pakada::Dispatch::Controller).create {
6
+ include Pakada.safety(Pakada::Render::Controller)
7
+ action(:bar) {}
8
+ }
9
+ }
10
+ let(:obj) {
11
+ options = {
12
+ :module => :foo_module,
13
+ :controller => :foo,
14
+ :action => :bar
15
+ }
16
+ controller.new({}, options, &proc {})
17
+ }
18
+
19
+ let(:foo_module) { stub "foo module" }
20
+
21
+ before {
22
+ Pakada.modules[:foo_module] = foo_module
23
+ }
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
+ context "#render(template, additional_locals)" do
47
+ let(:renderer) { stub "renderer" }
48
+
49
+ it "returns a Renderer for the passed template" do
50
+ foo_module.should_receive(:render) {|template|
51
+ template.should equal(:foo)
52
+ renderer
53
+ }
54
+
55
+ obj.render(:foo).should equal(renderer)
56
+ end
57
+
58
+ it "passes all instance variables as locals to the Renderer" do
59
+ foo_module.should_receive(:render) {|template, locals|
60
+ locals[:@options].should equal(obj.options)
61
+ locals[:@params].should equal(obj.params)
62
+ locals[:@request].should equal(obj.request)
63
+ locals[:@response].should equal(obj.response)
64
+ }
65
+ obj.render additional_locals
66
+ end
67
+
68
+ let(:additional_locals) {
69
+ {
70
+ :foo => stub("foo local"),
71
+ :bar => stub("bar local")
72
+ }
73
+ }
74
+
75
+ it "merges additional_locals into the locals for Renderer" do
76
+ foo_module.should_receive(:render) {|template, locals|
77
+ locals[:foo].should equal(additional_locals[:foo])
78
+ locals[:bar].should equal(additional_locals[:bar])
79
+ }
80
+ obj.render additional_locals
81
+ end
82
+ end
83
+
84
+ context "#render" do
85
+ it "defaults template to :<module>/<controller>/<action>" do
86
+ foo_module.should_receive(:render) {|template|
87
+ template.should equal(:"foo_module/foo/bar")
88
+ }
89
+ obj.render
90
+ end
91
+ 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
+ end
@@ -0,0 +1,203 @@
1
+ require "spec_helper"
2
+ require "fileutils"
3
+
4
+ describe Pakada::Render do
5
+ let(:render) { Pakada::Render.new }
6
+
7
+ context "#initialize" do
8
+ it "makes RenderingContext hookable" do
9
+ render
10
+ Pakada.safety(Pakada::Render::RenderingContext).should respond_to(:instance_hooked)
11
+ end
12
+ end
13
+
14
+ context "#hooks" do
15
+ let(:dispatch) { stub "dispatch module" }
16
+
17
+ before {
18
+ Pakada.modules[:dispatch] = dispatch
19
+ dispatch.stub :after
20
+ }
21
+
22
+ it "hooks Pakada::Dispatch#request with #render_layout" do
23
+ dispatch.should_receive(:after) {|method, block|
24
+ method.should equal(:request)
25
+ block.should == render.method(:render_layout)
26
+ }
27
+ render.hooks
28
+ end
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
53
+ }
54
+ render.hooks
55
+ end
56
+ end
57
+
58
+ context "#boot" do
59
+ let(:load_path) { stub "load path" }
60
+ let(:template_map) { stub "template map" }
61
+
62
+ before {
63
+ render.stub :build_load_path => load_path
64
+ render.stub :build_template_map => template_map
65
+ render.boot
66
+ }
67
+
68
+ it "includes Rendering into each module" do
69
+ Pakada.modules.each_value {|mod|
70
+ rendering = Pakada.safety(Pakada::Render::Rendering)
71
+ (class << mod; self; end).included_modules.should include(rendering)
72
+ }
73
+ end
74
+
75
+ it "builds the load path" do
76
+ render.load_path.should equal(load_path)
77
+ end
78
+
79
+ it "builds the template map" do
80
+ render.template_map.should equal(template_map)
81
+ end
82
+ end
83
+
84
+ context "#build_load_path" do
85
+ let(:load_path) { render.build_load_path }
86
+
87
+ it "adds each of Tilt's mappings as an extension" do
88
+ Tilt.mappings.keys.each {|ext|
89
+ load_path.extensions.should include(".#{ext}")
90
+ }
91
+ end
92
+
93
+ it "adds the Pakada instance's path first" do
94
+ load_path.paths[0].should == Pakada.path.join("templates").to_s
95
+ end
96
+
97
+ it "adds each module's path" do
98
+ Pakada.modules.each_value {|mod|
99
+ load_path.paths.should include(mod.path.join("templates").to_s)
100
+ }
101
+ end
102
+ end
103
+
104
+ context "#build_template_map(load_path)" do
105
+ let(:baz) { stub "baz engine" }
106
+ let(:layout) { stub "layout engine" }
107
+ let(:derp) { stub "derp engine" }
108
+
109
+ before {
110
+ # undefined method `file?' for #<FakeFS::File::Stat:0xa72a808>
111
+ #FakeFS.activate!
112
+
113
+ Pakada.stub :path => Pathname.new("spec/tmp/instance").expand_path
114
+ Pakada[:render].stub :path => Pathname.new("spec/tmp/pakada-render").expand_path
115
+ Pakada[:dispatch].stub :path => Pathname.new("spec/tmp/pakada-dispatch").expand_path
116
+
117
+ path = Pakada[:render].path.join("templates")
118
+ FileUtils.mkdir_p path.join("foo/bar")
119
+ FileUtils.touch path.join("foo/bar/baz.erb").to_s
120
+ FileUtils.touch path.join("layout.md").to_s
121
+ FileUtils.touch path.join("herp_derp.haml").to_s
122
+
123
+ path = Pakada[:dispatch].path.join("templates")
124
+ FileUtils.mkdir_p path.join("foo/bar")
125
+ FileUtils.touch path.join("foo/bar/baz.sass").to_s
126
+ FileUtils.touch path.join("layout.coffee").to_s
127
+ FileUtils.touch path.join("herp_derp.textile").to_s
128
+
129
+ path = Pakada.path.join("templates")
130
+ FileUtils.mkdir_p path.join("foo/bar")
131
+ FileUtils.touch path.join("foo/bar/baz.str").to_s
132
+ FileUtils.touch path.join("layout.less").to_s
133
+ FileUtils.touch path.join("herp_derp.creole").to_s
134
+
135
+ @engines = {
136
+ path.join("foo/bar/baz.str").to_s => baz,
137
+ path.join("layout.less").to_s => layout,
138
+ path.join("herp_derp.creole").to_s => derp
139
+ }
140
+ }
141
+
142
+ after {
143
+ #FakeFS.deactivate!
144
+ #FakeFS::FileSystem.clear
145
+
146
+ FileUtils.rm_rf "spec/tmp"
147
+ }
148
+
149
+ let(:map) { render.build_template_map render.build_load_path }
150
+
151
+ it "evaluates the complete load path" do
152
+ Tilt.should_receive(:new).exactly(3).times {|path| @engines[path] }
153
+ map.should == {
154
+ :"foo/bar/baz" => baz,
155
+ :layout => layout,
156
+ :herp_derp => derp
157
+ }
158
+ end
159
+ end
160
+
161
+ context "#render_controller" do
162
+ let(:controller) { stub "controller", :response => stub("response") }
163
+ let(:result) { stub "result" }
164
+
165
+ before { controller.stub :render => result }
166
+
167
+ it "renders the controller's template" do
168
+ controller.stub :render? => true
169
+ controller.response.should_receive(:write).with result
170
+
171
+ render.render_controller controller
172
+ end
173
+
174
+ it "doesn't render if it's not supposed to" do
175
+ controller.stub :render? => false
176
+ controller.response.should_not_receive :write
177
+
178
+ render.render_controller controller
179
+ end
180
+ end
181
+
182
+ context "#render_layout" do
183
+ let(:response) {
184
+ [200, {"Content-Length" => "123"}, [content]]
185
+ }
186
+ let(:content) { stub "content" }
187
+
188
+ before { render.stub :render! }
189
+
190
+ it "render's a layout around the content" do
191
+ render.should_receive(:render!) {|template, locals|
192
+ template.should equal(:layout)
193
+ locals[:content].should == [content]
194
+ }
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
201
+ end
202
+ end
203
+ end
@@ -0,0 +1,85 @@
1
+ require "spec_helper"
2
+
3
+ describe Pakada::Render::Renderer do
4
+ let(:engine) { stub "engine" }
5
+ let(:locals) { stub "locals" }
6
+ let(:renderer) {
7
+ Pakada.safety(Pakada::Render::Renderer).new engine, locals
8
+ }
9
+ let(:rendered_template) { stub "renderer template "}
10
+
11
+ context "#initialize(engine, locals)" do
12
+ it "sets engine and locals" do
13
+ renderer.engine.should equal(engine)
14
+ renderer.locals.should equal(locals)
15
+ end
16
+ end
17
+
18
+ context "#to_s" do
19
+ let(:context) { stub "context" }
20
+
21
+ before {
22
+ Pakada.safety(Pakada::Render::RenderingContext).stub :new => context
23
+ Pakada.instance(:foo) {}
24
+ renderer
25
+ }
26
+
27
+ it "renders the template with the locals and a clean RenderingContext" do
28
+ engine.should_receive(:render) {|ctx, lkls|
29
+ context.should equal(ctx)
30
+ locals.should equal(lkls)
31
+ rendered_template
32
+ }
33
+ renderer.to_s.should equal(rendered_template)
34
+ end
35
+
36
+ it "memoizes the renderer template" do
37
+ engine.should_receive(:render).once { rendered_template }
38
+ renderer.to_s
39
+ renderer.to_s.should equal(rendered_template)
40
+ end
41
+
42
+ it "renders within the context of the Pakada instance it was created in" do
43
+ engine.should_receive(:render) {
44
+ Pakada.instance.should equal(Pakada.instance(:default))
45
+ }
46
+ Pakada.instance(:foo) { renderer.to_s }
47
+ end
48
+ end
49
+
50
+ context "#each" do
51
+ it "yields the result of #to_s" do
52
+ renderer.should_receive(:to_s) { rendered_template }
53
+ yielded = []
54
+ renderer.each {|y| yielded << y }
55
+
56
+ yielded.should == [rendered_template]
57
+ end
58
+ end
59
+
60
+ context "#[](key)" do
61
+ let(:locals) {
62
+ {
63
+ :foo => stub("foo local")
64
+ }
65
+ }
66
+
67
+ it "returns the value for the specified key in locals" do
68
+ renderer[:foo].should equal(locals[:foo])
69
+ end
70
+ end
71
+
72
+ context "#[](key, value)" do
73
+ let(:locals) {
74
+ {
75
+ :foo => stub("foo local")
76
+ }
77
+ }
78
+ let(:bar) { stub "bar local" }
79
+
80
+ it "sets the value for the specified key in locals" do
81
+ renderer[:bar] = bar
82
+ renderer[:bar].should equal(bar)
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,54 @@
1
+ require "spec_helper"
2
+
3
+ describe Pakada::Render::Rendering do
4
+ let(:render) { stub "render module" }
5
+ let(:renderer) { stub "renderer" }
6
+ let(:obj) {
7
+ Object.new.tap {|obj| obj.extend Pakada.safety(Pakada::Render::Rendering) }
8
+ }
9
+
10
+ let(:engine) { stub "engine" }
11
+ let(:locals) { stub "locals" }
12
+
13
+ before {
14
+ Pakada.safety(Pakada::Render::Renderer).stub :new => renderer
15
+
16
+ Pakada.modules[:render] = render
17
+ render.stub :template_map => {
18
+ :foo => engine
19
+ }
20
+ }
21
+
22
+ context "#render(template, locals)" do
23
+ it "raises an ArgumentError if there's no engine for the template" do
24
+ expect { obj.render :i_dont_exist }.to raise_error(ArgumentError)
25
+ end
26
+
27
+ it "returns a Renderer for the specified template and locals" do
28
+ Pakada.safety(Pakada::Render::Renderer).should_receive(:new) {|ngin, lcls|
29
+ ngin.should equal(engine)
30
+ lcls.should equal(locals)
31
+ renderer
32
+ }
33
+ obj.render(:foo, locals).should equal(renderer)
34
+ end
35
+
36
+ it "defaults locals to an empty Hash" do
37
+ Pakada.safety(Pakada::Render::Renderer).should_receive(:new) {|ngin, lcls|
38
+ lcls.should be_a(Hash)
39
+ lcls.should be_empty
40
+ renderer
41
+ }
42
+ obj.render(:foo).should equal(renderer)
43
+ end
44
+ end
45
+
46
+ context "#render!(template, locals)" do
47
+ let(:rendered_template) { stub "rendered template" }
48
+
49
+ it "returns #render#to_s" do
50
+ renderer.should_receive(:to_s) { rendered_template }
51
+ obj.render!(:foo, locals).should equal(rendered_template)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,18 @@
1
+ require "pakada/render"
2
+ require "pakada/dispatch"
3
+
4
+ require "fakefs/safe"
5
+
6
+ begin
7
+ require "awesome_print"
8
+ rescue LoadError; end
9
+
10
+ RSpec.configure do |config|
11
+ config.before(:each) {
12
+ Pakada.instances.clear
13
+ Pakada.instance(:default) {}
14
+
15
+ Pakada.stack.clear
16
+ Pakada.stack.push Pakada.instances[:default]
17
+ }
18
+ end
@@ -0,0 +1,3 @@
1
+ <pre>
2
+ <%= content.join "\n" %>
3
+ </pre>
@@ -0,0 +1 @@
1
+ hello <%= @name %>!
metadata ADDED
@@ -0,0 +1,122 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pakada-render
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Lars Gierth
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-09-03 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: pakada
16
+ requirement: &72808660 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *72808660
25
+ - !ruby/object:Gem::Dependency
26
+ name: tilt
27
+ requirement: &72808220 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *72808220
36
+ - !ruby/object:Gem::Dependency
37
+ name: hike
38
+ requirement: &72807800 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *72807800
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: &72807480 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *72807480
58
+ - !ruby/object:Gem::Dependency
59
+ name: fakefs
60
+ requirement: &72806970 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *72806970
69
+ description:
70
+ email:
71
+ - lars.gierth@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .rspec
77
+ - Gemfile
78
+ - LICENSE
79
+ - README.md
80
+ - Rakefile
81
+ - config.ru
82
+ - controllers/foo.rb
83
+ - lib/pakada-render.rb
84
+ - lib/pakada/render.rb
85
+ - lib/pakada/render/controller.rb
86
+ - lib/pakada/render/renderer.rb
87
+ - lib/pakada/render/rendering.rb
88
+ - lib/pakada/render/rendering_context.rb
89
+ - lib/pakada/render/version.rb
90
+ - pakada-render.gemspec
91
+ - spec/controller_spec.rb
92
+ - spec/render_spec.rb
93
+ - spec/renderer_spec.rb
94
+ - spec/rendering_spec.rb
95
+ - spec/spec_helper.rb
96
+ - templates/layout.erb
97
+ - templates/my_module/foo/bar.erb
98
+ homepage: https://rubygems.org/gems/pakada-render
99
+ licenses: []
100
+ post_install_message:
101
+ rdoc_options: []
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ none: false
112
+ requirements:
113
+ - - ! '>='
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ requirements: []
117
+ rubyforge_project:
118
+ rubygems_version: 1.8.10
119
+ signing_key:
120
+ specification_version: 3
121
+ summary: Template rendering for Pakada
122
+ test_files: []