renee-render 0.1.1 → 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/README.md +1 -1
- data/lib/renee-render/version.rb +2 -1
- data/lib/renee-render.rb +68 -61
- data/renee-render.gemspec +1 -0
- data/test/render_test.rb +10 -18
- metadata +79 -25
data/README.md
CHANGED
data/lib/renee-render/version.rb
CHANGED
data/lib/renee-render.rb
CHANGED
@@ -1,108 +1,115 @@
|
|
1
1
|
require 'tilt'
|
2
|
+
require 'callsite'
|
2
3
|
|
4
|
+
# Top-level Renee constant
|
3
5
|
class Renee
|
4
6
|
# This module is responsible for handling the rendering of templates
|
5
7
|
# using Tilt supporting all included template engines.
|
6
8
|
module Render
|
7
|
-
##
|
8
|
-
# Exception responsible for when a generic rendering error occurs.
|
9
|
-
#
|
10
|
-
class RenderError < RuntimeError; end
|
11
|
-
|
12
9
|
##
|
13
10
|
# Exception responsible for when an expected template does not exist.
|
14
11
|
#
|
15
|
-
class TemplateNotFound <
|
12
|
+
class TemplateNotFound < RuntimeError; end
|
16
13
|
|
17
14
|
# Same as render but automatically halts.
|
18
15
|
# @param (see #render)
|
19
16
|
# @return (see #render)
|
20
17
|
# @see #render
|
21
|
-
def render!(
|
22
|
-
halt render(
|
18
|
+
def render!(file, engine = nil, options = nil, &blk)
|
19
|
+
halt render(file, engine, options, &blk)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Same as inline but automatically halts.
|
23
|
+
# @param (see #inline)
|
24
|
+
# @return (see #inline)
|
25
|
+
# @see #inline
|
26
|
+
def inline!(data, engine, options = {}, &blk)
|
27
|
+
options[:_caller] = Callsite.parse(caller.first)
|
28
|
+
halt inline(data, engine, options, &blk)
|
23
29
|
end
|
24
30
|
|
31
|
+
##
|
32
|
+
# Renders a file given the engine and the content.
|
33
|
+
#
|
34
|
+
# @param [String] file The path to the file to render
|
35
|
+
# @param [Symbol] engine The name of the engine to use to render the content. If this isn't specified
|
36
|
+
# it will be detected based on the extension of the file.
|
37
|
+
# @param [Hash] options The options to pass in for rendering.
|
38
|
+
#
|
39
|
+
# @return [String] The result of rendering the data with specified engine.
|
40
|
+
#
|
41
|
+
# @example
|
42
|
+
# render "index", :haml # => "<p>test</p>"
|
43
|
+
# render "index" # => "<p>test</p>"
|
44
|
+
#
|
45
|
+
# @api public
|
46
|
+
#
|
47
|
+
def render(file, engine = nil, options = nil, &block)
|
48
|
+
options, engine = engine, nil if engine.is_a?(Hash)
|
49
|
+
render_setup(engine, options, block) do |view_options, views|
|
50
|
+
template_cache.fetch(engine, file, view_options) do
|
51
|
+
file_path, found_engine = find_template(views, file, engine)
|
52
|
+
template = Tilt[found_engine]
|
53
|
+
raise TemplateNotFound, "Template engine not found: #{found_engine.inspect}" unless template
|
54
|
+
raise TemplateNotFound, "Template #{file.inspect} (with engine #{engine.inspect}) not found in #{views.inspect}!" unless file_path
|
55
|
+
# TODO suppress errors for layouts?
|
56
|
+
template.new(file_path, 1, view_options)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end # render
|
60
|
+
|
25
61
|
##
|
26
62
|
# Renders a string given the engine and the content.
|
27
63
|
#
|
28
|
-
# @param [
|
29
|
-
# @param [
|
30
|
-
#
|
64
|
+
# @param [String] data The string data to render.
|
65
|
+
# @param [Symbol] engine The name of the engine to use to render the content. If this isn't specified
|
66
|
+
# it will be detected based on the extension of the file.
|
67
|
+
# @param [Hash] options The options to pass in for rendering.
|
31
68
|
#
|
32
69
|
# @return [String] The result of rendering the data with specified engine.
|
33
70
|
#
|
34
71
|
# @example
|
35
|
-
#
|
36
|
-
# render :haml, :index => "<p>test</p>"
|
37
|
-
# render "index" => "<p>test</p>"
|
72
|
+
# inline "%p test", :haml # => "<p>test</p>"
|
38
73
|
#
|
39
74
|
# @api public
|
40
75
|
#
|
41
|
-
def
|
42
|
-
|
43
|
-
|
76
|
+
def inline(data, engine, options = nil, &block)
|
77
|
+
options, engine = engine, nil if engine.is_a?(Hash)
|
78
|
+
call_data = options.delete(:_caller) || Callsite.parse(caller.first)
|
79
|
+
render_setup(engine, options, block) do |view_options, views|
|
80
|
+
body = data.is_a?(Proc) ? data : Proc.new { data }
|
81
|
+
template = Tilt[engine]
|
82
|
+
raise "Template engine not found: #{engine}" if template.nil?
|
83
|
+
template.new(call_data.filename, call_data.line, view_options, &body)
|
84
|
+
end
|
85
|
+
end
|
44
86
|
|
87
|
+
private
|
88
|
+
def render_setup(engine, options, block)
|
45
89
|
options ||= {}
|
46
90
|
options[:outvar] ||= '@_out_buf'
|
47
|
-
|
48
|
-
options[:default_encoding] ||= "utf-8"
|
91
|
+
options[:default_encoding] ||= settings.default_encoding || options[:encoding] || "utf-8"
|
49
92
|
|
50
93
|
locals = options.delete(:locals) || {}
|
51
94
|
views = options.delete(:views) || settings.views_path || "./views"
|
52
95
|
layout = options.delete(:layout)
|
53
|
-
layout_engine = options.delete(:layout_engine)
|
96
|
+
layout_engine = options.delete(:layout_engine)
|
54
97
|
# TODO suppress template errors for layouts?
|
55
98
|
# TODO allow content_type to be set with an option to render?
|
56
99
|
scope = options.delete(:scope) || self
|
57
100
|
|
58
101
|
# TODO default layout file convention?
|
59
|
-
template =
|
102
|
+
template = yield(options, views)
|
60
103
|
output = template.render(scope, locals, &block)
|
61
104
|
|
62
105
|
if layout # render layout
|
63
106
|
# TODO handle when layout is missing better!
|
64
107
|
options = options.merge(:views => views, :layout => false, :scope => scope)
|
65
|
-
|
108
|
+
render(layout, layout_engine, options.merge(:locals => locals)) { output }
|
109
|
+
else
|
110
|
+
output
|
66
111
|
end
|
67
|
-
|
68
|
-
output
|
69
|
-
end # render
|
70
|
-
|
71
|
-
##
|
72
|
-
# Constructs a template based on engine, data and options.
|
73
|
-
#
|
74
|
-
# @param [Symbol] engine The template engine to use for rendering.
|
75
|
-
# @param [String] data The content or file to render.
|
76
|
-
# @param [Hash] options The rendering options to pass onto tilt.
|
77
|
-
# @param [String] views The view_path from which to locate the template.
|
78
|
-
#
|
79
|
-
# @return [Tilt::Template] The tilt template to render with all required options.
|
80
|
-
# @raise [TemplateNotFound] The template to render could not be located.
|
81
|
-
# @raise [RenderError] The template to render could not be located.
|
82
|
-
#
|
83
|
-
# @api private
|
84
|
-
#
|
85
|
-
def compile_template(engine, data, options, views)
|
86
|
-
template_cache.fetch engine, data, options do
|
87
|
-
if data.is_a?(Symbol) # data is template path
|
88
|
-
file_path, engine = find_template(views, data, engine)
|
89
|
-
template = Tilt[engine]
|
90
|
-
raise TemplateNotFound, "Template engine not found: #{engine}" if template.nil?
|
91
|
-
raise TemplateNotFound, "Template '#{data}' not found in '#{views}'!" unless file_path
|
92
|
-
# TODO suppress errors for layouts?
|
93
|
-
template.new(file_path, 1, options)
|
94
|
-
elsif data.is_a?(String) # data is body string
|
95
|
-
# TODO figure out path based on caller file
|
96
|
-
path, line = options[:path] || "caller file", options[:line] || 1
|
97
|
-
body = data.is_a?(String) ? Proc.new { data } : data
|
98
|
-
template = Tilt[engine]
|
99
|
-
raise "Template engine not found: #{engine}" if template.nil?
|
100
|
-
template.new(path, line.to_i, options, &body)
|
101
|
-
else # data can't be handled
|
102
|
-
raise RenderError, "Cannot render data #{data.inspect}."
|
103
|
-
end
|
104
|
-
end # template_cache.fetch
|
105
|
-
end # compile_template
|
112
|
+
end
|
106
113
|
|
107
114
|
##
|
108
115
|
# Searches view paths for template based on data and engine with rendering options.
|
data/renee-render.gemspec
CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |s|
|
|
20
20
|
|
21
21
|
s.add_runtime_dependency 'rack', "~> 1.3.0"
|
22
22
|
s.add_runtime_dependency 'tilt', "~> 1.3.3"
|
23
|
+
s.add_runtime_dependency 'callsite', '~> 0.0.6'
|
23
24
|
s.add_development_dependency 'minitest', "~> 2.6.1"
|
24
25
|
s.add_development_dependency 'rake'
|
25
26
|
s.add_development_dependency 'bundler', "~> 1.0.10"
|
data/test/render_test.rb
CHANGED
@@ -6,9 +6,9 @@ describe Renee::Render do
|
|
6
6
|
|
7
7
|
it "should allow rendering string with engine" do
|
8
8
|
mock_app {
|
9
|
-
path("/a") { get {
|
10
|
-
path("/b") { get {
|
11
|
-
path("/c") { get { halt
|
9
|
+
path("/a") { get { inline! "<p>test</p>", :erb } }
|
10
|
+
path("/b") { get { inline! "<p><%= foo %></p>", :erb, :locals => { :foo => "bar" } } }
|
11
|
+
path("/c") { get { halt inline("<p><%= foo %></p>", :erb, :locals => { :foo => "bar" }) } }
|
12
12
|
}
|
13
13
|
get('/a')
|
14
14
|
assert_equal 200, response.status
|
@@ -25,9 +25,9 @@ describe Renee::Render do
|
|
25
25
|
create_view :index, "%p test", :haml
|
26
26
|
create_view :foo, "%p= foo", :haml
|
27
27
|
mock_app {
|
28
|
-
path("/a") { get { render!
|
29
|
-
path("/b") { get { render!
|
30
|
-
path("/c") { get { halt render(
|
28
|
+
path("/a") { get { render! 'index', :haml } }
|
29
|
+
path("/b") { get { render! 'foo', :haml, :locals => { :foo => "bar" } } }
|
30
|
+
path("/c") { get { halt render('foo', :haml, :locals => { :foo => "bar" }) } }
|
31
31
|
}
|
32
32
|
get('/a')
|
33
33
|
assert_equal 200, response.status
|
@@ -60,8 +60,8 @@ describe Renee::Render do
|
|
60
60
|
create_view :foo, "%p= foo", :haml
|
61
61
|
create_view :layout, "%div.wrapper= yield", :haml
|
62
62
|
mock_app {
|
63
|
-
path("/a") { get { render!
|
64
|
-
path("/b") { get { render!
|
63
|
+
path("/a") { get { render! 'index', :haml, :layout => :layout } }
|
64
|
+
path("/b") { get { render! 'foo', :layout => :layout, :locals => { :foo => "bar" } } }
|
65
65
|
}
|
66
66
|
get('/a')
|
67
67
|
assert_equal 200, response.status
|
@@ -76,8 +76,8 @@ describe Renee::Render do
|
|
76
76
|
create_view :foo, "%p= foo", :haml
|
77
77
|
create_view :base, "<div class='wrapper'><%= yield %></div>", :erb
|
78
78
|
mock_app {
|
79
|
-
path("/a") { get { render!
|
80
|
-
path("/b") { get { render!
|
79
|
+
path("/a") { get { render! 'index', :haml, :layout => 'base', :layout_engine => :erb } }
|
80
|
+
path("/b") { get { render! 'foo', :haml, :layout => 'base', :locals => { :foo => "bar" } } }
|
81
81
|
}
|
82
82
|
get('/a')
|
83
83
|
assert_equal 200, response.status
|
@@ -102,13 +102,5 @@ describe Renee::Render do
|
|
102
102
|
}
|
103
103
|
assert_raises(Renee::Render::TemplateNotFound) { get('/') }
|
104
104
|
end # missing template, with engine
|
105
|
-
|
106
|
-
it "should fail properly rendering invalid data" do
|
107
|
-
create_view :index, "%p test", :haml
|
108
|
-
mock_app {
|
109
|
-
get { render! :haml, /invalid regex data/ }
|
110
|
-
}
|
111
|
-
assert_raises(Renee::Render::RenderError) { get('/') }
|
112
|
-
end # missing template, with engine
|
113
105
|
end
|
114
106
|
end
|
metadata
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: renee-render
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
4
5
|
prerelease:
|
5
|
-
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
6
11
|
platform: ruby
|
7
12
|
authors:
|
8
13
|
- Josh Hull
|
@@ -12,85 +17,134 @@ autorequire:
|
|
12
17
|
bindir: bin
|
13
18
|
cert_chain: []
|
14
19
|
|
15
|
-
date: 2011-10-
|
20
|
+
date: 2011-10-20 00:00:00 Z
|
16
21
|
dependencies:
|
17
22
|
- !ruby/object:Gem::Dependency
|
18
|
-
|
19
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
23
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
20
24
|
none: false
|
21
25
|
requirements:
|
22
26
|
- - ~>
|
23
27
|
- !ruby/object:Gem::Version
|
28
|
+
hash: 27
|
29
|
+
segments:
|
30
|
+
- 1
|
31
|
+
- 3
|
32
|
+
- 0
|
24
33
|
version: 1.3.0
|
34
|
+
requirement: *id001
|
25
35
|
type: :runtime
|
26
36
|
prerelease: false
|
27
|
-
|
37
|
+
name: rack
|
28
38
|
- !ruby/object:Gem::Dependency
|
29
|
-
|
30
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
31
40
|
none: false
|
32
41
|
requirements:
|
33
42
|
- - ~>
|
34
43
|
- !ruby/object:Gem::Version
|
44
|
+
hash: 29
|
45
|
+
segments:
|
46
|
+
- 1
|
47
|
+
- 3
|
48
|
+
- 3
|
35
49
|
version: 1.3.3
|
50
|
+
requirement: *id002
|
36
51
|
type: :runtime
|
37
52
|
prerelease: false
|
38
|
-
|
53
|
+
name: tilt
|
39
54
|
- !ruby/object:Gem::Dependency
|
40
|
-
|
41
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
55
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
42
56
|
none: false
|
43
57
|
requirements:
|
44
58
|
- - ~>
|
45
59
|
- !ruby/object:Gem::Version
|
60
|
+
hash: 19
|
61
|
+
segments:
|
62
|
+
- 0
|
63
|
+
- 0
|
64
|
+
- 6
|
65
|
+
version: 0.0.6
|
66
|
+
requirement: *id003
|
67
|
+
type: :runtime
|
68
|
+
prerelease: false
|
69
|
+
name: callsite
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ~>
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
hash: 21
|
77
|
+
segments:
|
78
|
+
- 2
|
79
|
+
- 6
|
80
|
+
- 1
|
46
81
|
version: 2.6.1
|
82
|
+
requirement: *id004
|
47
83
|
type: :development
|
48
84
|
prerelease: false
|
49
|
-
|
85
|
+
name: minitest
|
50
86
|
- !ruby/object:Gem::Dependency
|
51
|
-
|
52
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
87
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
53
88
|
none: false
|
54
89
|
requirements:
|
55
90
|
- - ">="
|
56
91
|
- !ruby/object:Gem::Version
|
92
|
+
hash: 3
|
93
|
+
segments:
|
94
|
+
- 0
|
57
95
|
version: "0"
|
96
|
+
requirement: *id005
|
58
97
|
type: :development
|
59
98
|
prerelease: false
|
60
|
-
|
99
|
+
name: rake
|
61
100
|
- !ruby/object:Gem::Dependency
|
62
|
-
|
63
|
-
requirement: &id005 !ruby/object:Gem::Requirement
|
101
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
64
102
|
none: false
|
65
103
|
requirements:
|
66
104
|
- - ~>
|
67
105
|
- !ruby/object:Gem::Version
|
106
|
+
hash: 3
|
107
|
+
segments:
|
108
|
+
- 1
|
109
|
+
- 0
|
110
|
+
- 10
|
68
111
|
version: 1.0.10
|
112
|
+
requirement: *id006
|
69
113
|
type: :development
|
70
114
|
prerelease: false
|
71
|
-
|
115
|
+
name: bundler
|
72
116
|
- !ruby/object:Gem::Dependency
|
73
|
-
|
74
|
-
requirement: &id006 !ruby/object:Gem::Requirement
|
117
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
75
118
|
none: false
|
76
119
|
requirements:
|
77
120
|
- - ">="
|
78
121
|
- !ruby/object:Gem::Version
|
122
|
+
hash: 11
|
123
|
+
segments:
|
124
|
+
- 0
|
125
|
+
- 5
|
126
|
+
- 0
|
79
127
|
version: 0.5.0
|
128
|
+
requirement: *id007
|
80
129
|
type: :development
|
81
130
|
prerelease: false
|
82
|
-
|
131
|
+
name: rack-test
|
83
132
|
- !ruby/object:Gem::Dependency
|
84
|
-
|
85
|
-
requirement: &id007 !ruby/object:Gem::Requirement
|
133
|
+
version_requirements: &id008 !ruby/object:Gem::Requirement
|
86
134
|
none: false
|
87
135
|
requirements:
|
88
136
|
- - ">="
|
89
137
|
- !ruby/object:Gem::Version
|
138
|
+
hash: 7
|
139
|
+
segments:
|
140
|
+
- 2
|
141
|
+
- 2
|
142
|
+
- 0
|
90
143
|
version: 2.2.0
|
144
|
+
requirement: *id008
|
91
145
|
type: :development
|
92
146
|
prerelease: false
|
93
|
-
|
147
|
+
name: haml
|
94
148
|
description: The super-friendly web framework rendering component.
|
95
149
|
email:
|
96
150
|
- joshbuddy@gmail.com
|
@@ -124,7 +178,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
124
178
|
requirements:
|
125
179
|
- - ">="
|
126
180
|
- !ruby/object:Gem::Version
|
127
|
-
hash:
|
181
|
+
hash: 3
|
128
182
|
segments:
|
129
183
|
- 0
|
130
184
|
version: "0"
|
@@ -133,7 +187,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
133
187
|
requirements:
|
134
188
|
- - ">="
|
135
189
|
- !ruby/object:Gem::Version
|
136
|
-
hash:
|
190
|
+
hash: 3
|
137
191
|
segments:
|
138
192
|
- 0
|
139
193
|
version: "0"
|