roger 1.4.6 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +13 -5
- data/.travis.yml +1 -1
- data/CHANGELOG.md +9 -0
- data/doc/templating.md +9 -4
- data/lib/roger/rack/roger.rb +4 -3
- data/lib/roger/release/processors/mockup.rb +25 -42
- data/lib/roger/renderer.rb +294 -0
- data/lib/roger/resolver.rb +118 -37
- data/lib/roger/template.rb +44 -115
- data/lib/roger/template/helpers/capture.rb +4 -2
- data/lib/roger/template/helpers/partial.rb +9 -20
- data/lib/roger/template/helpers/rendering.rb +15 -0
- data/lib/roger/template/template_context.rb +10 -4
- data/lib/roger/version.rb +1 -1
- data/test/project/html/formats/markdown-erb.md.erb +0 -0
- data/test/project/html/formats/preferred.html.erb +0 -0
- data/test/project/html/formats/preferred.json.erb +0 -0
- data/test/project/html/partials/_local.html.erb +1 -0
- data/test/project/html/renderer/file.html.erb +1 -0
- data/test/project/html/renderer/recursive.html.erb +1 -0
- data/test/project/partials/test/_underscored.html.erb +1 -0
- data/test/project/partials/test/deep_recursive.html.erb +1 -0
- data/test/project/partials/test/recursive.html.erb +1 -0
- data/test/unit/release/processors/mockup_test.rb +31 -15
- data/test/unit/renderer/renderer_base_test.rb +123 -0
- data/test/unit/renderer/renderer_content_for_test.rb +50 -0
- data/test/unit/renderer/renderer_helper_test.rb +54 -0
- data/test/unit/renderer/renderer_partial_test.rb +88 -0
- data/test/unit/resolver_test.rb +43 -22
- data/test/unit/template/template_base_test.rb +29 -0
- metadata +39 -11
- data/test/unit/template_test.rb +0 -208
@@ -0,0 +1,15 @@
|
|
1
|
+
module Roger
|
2
|
+
class Template
|
3
|
+
module Helpers
|
4
|
+
# The partial helper
|
5
|
+
module Rendering
|
6
|
+
# Render any file on disk
|
7
|
+
#
|
8
|
+
# @see Renderer#render_file
|
9
|
+
def render_file(path, options = {})
|
10
|
+
renderer.render_file(path, options)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require File.dirname(__FILE__) + "/helpers/capture"
|
2
2
|
require File.dirname(__FILE__) + "/helpers/partial"
|
3
|
+
require File.dirname(__FILE__) + "/helpers/rendering"
|
3
4
|
|
4
5
|
module Roger
|
5
6
|
class Template
|
@@ -7,20 +8,25 @@ module Roger
|
|
7
8
|
class TemplateContext
|
8
9
|
include Helpers::Capture
|
9
10
|
include Helpers::Partial
|
11
|
+
include Helpers::Rendering
|
10
12
|
|
11
|
-
def initialize(
|
12
|
-
@
|
13
|
+
def initialize(renderer, env = {})
|
14
|
+
@_renderer = renderer
|
13
15
|
@_env = env
|
14
16
|
end
|
15
17
|
|
18
|
+
def renderer
|
19
|
+
@_renderer
|
20
|
+
end
|
21
|
+
|
16
22
|
# The current Roger::Template in use
|
17
23
|
def template
|
18
|
-
@
|
24
|
+
@_renderer.current_template
|
19
25
|
end
|
20
26
|
|
21
27
|
# Access to the front-matter of the document (if any)
|
22
28
|
def document
|
23
|
-
@_data ||= OpenStruct.new(
|
29
|
+
@_data ||= OpenStruct.new(@_renderer.data)
|
24
30
|
end
|
25
31
|
|
26
32
|
# The current environment variables.
|
data/lib/roger/version.rb
CHANGED
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
local
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= "file" %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= renderer.render_file("recursive.html.erb") %>
|
@@ -0,0 +1 @@
|
|
1
|
+
underscored
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= partial("test/recursive") %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= partial("test/recursive") %>
|
@@ -18,44 +18,60 @@ module Roger
|
|
18
18
|
files = @mockup.call(@release)
|
19
19
|
assert_equal 0, files.length
|
20
20
|
end
|
21
|
+
|
22
|
+
def test_run_on_file
|
23
|
+
@release.project.construct.directory "build" do |dir|
|
24
|
+
dir.file "test.html.erb", "<%= 'test' %>"
|
25
|
+
end
|
26
|
+
|
27
|
+
@mockup.call(@release)
|
28
|
+
|
29
|
+
file = @release.build_path + "test.html"
|
30
|
+
|
31
|
+
assert file.exist?
|
32
|
+
assert_equal "test", File.read(file.to_s)
|
33
|
+
end
|
21
34
|
end
|
22
35
|
|
23
36
|
# Test the target_path function of Mockup
|
24
37
|
class MockupTargetPathTest < ::Test::Unit::TestCase
|
25
38
|
def setup
|
26
39
|
@base = File.dirname(__FILE__) + "/../../../project"
|
27
|
-
@template = Roger::Template.open(@base + "/html/formats/erb.html.erb")
|
28
40
|
@processor = Roger::Release::Processors::Mockup.new
|
29
41
|
end
|
30
42
|
|
31
43
|
def test_with_html_extension
|
32
|
-
|
33
|
-
|
44
|
+
assert_output "bla/test.html", "bla/test.html"
|
45
|
+
assert_output "test.html", "test.html"
|
34
46
|
end
|
35
47
|
|
36
48
|
def test_with_double_extension
|
37
|
-
|
38
|
-
|
39
|
-
|
49
|
+
assert_output "bla/test.html", "bla/test.html.erb"
|
50
|
+
assert_output "test.html", "test.html.erb"
|
51
|
+
assert_output "test.html", "test.html.test"
|
40
52
|
end
|
41
53
|
|
42
54
|
def test_with_unknown_template_mime
|
43
|
-
|
44
|
-
|
55
|
+
assert_output "bla/test.supafriek", "bla/test.supafriek"
|
56
|
+
assert_output "test.supafriek", "test.supafriek"
|
45
57
|
end
|
46
58
|
|
47
59
|
def test_with_template_mime_with_existing_extension
|
48
|
-
|
49
|
-
|
50
|
-
assert_equal "bla/test.csv", @processor.target_path("bla/test.rcsv", template).to_s
|
51
|
-
assert_equal "test.csv", @processor.target_path("test.erb", template).to_s
|
60
|
+
assert_equal "bla/test.csv", @processor.target_path("bla/test.rcsv").to_s
|
61
|
+
assert_equal "test.csv", @processor.target_path("test.rcsv").to_s
|
52
62
|
end
|
53
63
|
|
54
64
|
def test_with_template_mime_without_existing_extension
|
55
|
-
|
65
|
+
assert_output "bla/test", @processor.target_path("bla/test").to_s
|
66
|
+
assert_output "test", @processor.target_path("test").to_s
|
67
|
+
end
|
68
|
+
|
69
|
+
def assert_output(outfile, infile)
|
70
|
+
assert_equal outfile, @processor.target_path(infile).to_s
|
71
|
+
end
|
56
72
|
|
57
|
-
|
58
|
-
|
73
|
+
def template(path)
|
74
|
+
Roger::Template.new("", {}, source_path: path)
|
59
75
|
end
|
60
76
|
end
|
61
77
|
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# Generators register themself on the CLI module
|
3
|
+
require "test_helper"
|
4
|
+
require "./lib/roger/renderer.rb"
|
5
|
+
|
6
|
+
module Roger
|
7
|
+
# Roger template tests
|
8
|
+
class RendererBaseTest < ::Test::Unit::TestCase
|
9
|
+
def setup
|
10
|
+
@base = Pathname.new(File.dirname(__FILE__) + "/../../project")
|
11
|
+
@config = {
|
12
|
+
partials_path: @base + "partials",
|
13
|
+
layouts_path: @base + "layouts",
|
14
|
+
source_path: @base + "html/test.html.erb"
|
15
|
+
}
|
16
|
+
@template_path = @base + "html"
|
17
|
+
|
18
|
+
@renderer = Renderer.new({}, @config)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_render
|
22
|
+
result = @renderer.render("test.html.erb", source: "<%= 'yes' %>")
|
23
|
+
assert_equal "yes", result
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_render_file_absolute
|
27
|
+
result = @renderer.render_file(@base + "html/renderer/file.html.erb")
|
28
|
+
assert_equal "file", result
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_render_file_relative
|
32
|
+
result = @renderer.render(
|
33
|
+
@base + "html/dir1/test.html.erb",
|
34
|
+
source: "<%= renderer.render_file('../renderer/file.html.erb') %>"
|
35
|
+
)
|
36
|
+
assert_equal "file", result
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_render_file_prevent_recursive
|
40
|
+
assert_raise(ArgumentError) do
|
41
|
+
@renderer.render(@base + "html/renderer/recursive.html.erb")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# Formats
|
46
|
+
|
47
|
+
def test_render_md
|
48
|
+
result = @renderer.render("test.md", source: "# h1")
|
49
|
+
assert_equal "<h1>h1</h1>\n", result
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_render_md_erb
|
53
|
+
result = @renderer.render("test.md.erb", source: "<%= '# h1' %>")
|
54
|
+
assert_equal "<h1>h1</h1>\n", result
|
55
|
+
end
|
56
|
+
|
57
|
+
# Environment
|
58
|
+
|
59
|
+
def test_template_env
|
60
|
+
renderer = Renderer.new({ test: "test" }, @config)
|
61
|
+
result = renderer.render("test.erb", source: "<%= env[:test] %>")
|
62
|
+
assert_equal "test", result
|
63
|
+
end
|
64
|
+
|
65
|
+
# Extension
|
66
|
+
def test_source_extension
|
67
|
+
mime_types = {
|
68
|
+
"html" => "html",
|
69
|
+
# "md.erb" => "md.erb",
|
70
|
+
"html.erb" => "html.erb",
|
71
|
+
"css.erb" => "css.erb",
|
72
|
+
"json.erb" => "json.erb",
|
73
|
+
"sjon.json.erb" => "json.erb",
|
74
|
+
"js.erb" => "js.erb"
|
75
|
+
}
|
76
|
+
|
77
|
+
mime_types.each do |ext, ext_out|
|
78
|
+
assert_equal(
|
79
|
+
ext_out,
|
80
|
+
Renderer.source_extension_for(@base + "html/file.#{ext}")
|
81
|
+
)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_target_extension
|
86
|
+
mime_types = {
|
87
|
+
"html" => "html",
|
88
|
+
"html.erb" => "html",
|
89
|
+
# "md" => "html",
|
90
|
+
# "md.erb" => "html",
|
91
|
+
"css.erb" => "css",
|
92
|
+
"json.erb" => "json",
|
93
|
+
"js.erb" => "js"
|
94
|
+
}
|
95
|
+
|
96
|
+
mime_types.each do |ext, ext_out|
|
97
|
+
assert_equal(
|
98
|
+
ext_out,
|
99
|
+
Renderer.target_extension_for(@base + "html/file.#{ext}")
|
100
|
+
)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
# Mime type
|
105
|
+
def test_target_mime_type
|
106
|
+
mime_types = {
|
107
|
+
"html" => "text/html",
|
108
|
+
# "md" => "text/html",
|
109
|
+
# "md.erb" => "text/html",
|
110
|
+
"html.erb" => "text/html",
|
111
|
+
"css.erb" => "text/css",
|
112
|
+
"json.erb" => "application/json"
|
113
|
+
}
|
114
|
+
|
115
|
+
mime_types.each do |ext, mime|
|
116
|
+
assert_equal(
|
117
|
+
mime,
|
118
|
+
Renderer.target_mime_type_for(@base + "html/file.#{ext}")
|
119
|
+
)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# Generators register themself on the CLI module
|
3
|
+
require "test_helper"
|
4
|
+
require "./lib/roger/renderer.rb"
|
5
|
+
|
6
|
+
module Roger
|
7
|
+
# Roger template tests
|
8
|
+
class RendererContentForTest < ::Test::Unit::TestCase
|
9
|
+
def setup
|
10
|
+
@base = Pathname.new(File.dirname(__FILE__) + "/../../project")
|
11
|
+
@config = {
|
12
|
+
partials_path: @base + "partials",
|
13
|
+
layouts_path: @base + "layouts"
|
14
|
+
}
|
15
|
+
@template_path = @base + "html"
|
16
|
+
|
17
|
+
@source_path = @base + "html/test.html.erb"
|
18
|
+
|
19
|
+
@renderer = Renderer.new({}, @config)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Content for parts
|
23
|
+
|
24
|
+
def test_content_for_not_returning_in_template
|
25
|
+
content_for_block = 'B<% content_for :one do %><%= "one" %><% end %>A'
|
26
|
+
assert_equal "BA", @renderer.render(@source_path, source: content_for_block)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_content_for_yield_in_layout
|
30
|
+
content_for_block = "---\nlayout: \"yield\"\n---\n"
|
31
|
+
content_for_block << "B<% content_for :one do %><%= \"one\" %><% end %>A"
|
32
|
+
|
33
|
+
assert_equal "BAone", @renderer.render(@source_path, source: content_for_block)
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_content_for_yield_in_layout_without_content_for
|
37
|
+
content_for_block = "---\nlayout: \"yield\"\n---\nBA"
|
38
|
+
assert_equal "BA", @renderer.render(@source_path, source: content_for_block)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_content_for_yield_with_partial_with_block
|
42
|
+
template_string = "---\nlayout: \"yield\"\n---\nB"
|
43
|
+
template_string << "<% content_for :one do %>"
|
44
|
+
template_string << "<% partial 'test/yield' do %>CONTENT<% end %>"
|
45
|
+
template_string << "<% end %>A"
|
46
|
+
|
47
|
+
assert_equal "BAB-CONTENT-A", @renderer.render(@source_path, source: template_string)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# Generators register themself on the CLI module
|
3
|
+
require "test_helper"
|
4
|
+
require "./lib/roger/renderer.rb"
|
5
|
+
|
6
|
+
module Roger
|
7
|
+
# A simple template helper to use for testing
|
8
|
+
module RendererHelper
|
9
|
+
def a
|
10
|
+
"a"
|
11
|
+
end
|
12
|
+
|
13
|
+
def from_env(key)
|
14
|
+
env[key]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Roger template tests
|
19
|
+
class RendererHelperTest < ::Test::Unit::TestCase
|
20
|
+
def setup
|
21
|
+
@base = Pathname.new(File.dirname(__FILE__) + "/../../project")
|
22
|
+
@config = {
|
23
|
+
partials_path: @base + "partials",
|
24
|
+
layouts_path: @base + "layouts"
|
25
|
+
}
|
26
|
+
@template_path = @base + "html"
|
27
|
+
|
28
|
+
@source_path = @base + "html/test.html.erb"
|
29
|
+
|
30
|
+
@renderer = Renderer.new({}, @config)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_register_helper
|
34
|
+
Roger::Renderer.helper RendererHelper
|
35
|
+
|
36
|
+
assert Roger::Renderer.helpers.include?(RendererHelper)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_helper_works
|
40
|
+
Roger::Renderer.helper RendererHelper
|
41
|
+
|
42
|
+
result = @renderer.render(@source_path, source: "<%= a %>")
|
43
|
+
assert_equal "a", result
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_helper_has_access_to_env
|
47
|
+
Roger::Renderer.helper RendererHelper
|
48
|
+
|
49
|
+
renderer = Renderer.new({ test: "test" }, @config)
|
50
|
+
result = renderer.render(@source_path, source: "<%= from_env(:test) %>")
|
51
|
+
assert_equal result, "test"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# Generators register themself on the CLI module
|
3
|
+
require "test_helper"
|
4
|
+
require "./lib/roger/template.rb"
|
5
|
+
|
6
|
+
module Roger
|
7
|
+
# Roger template tests
|
8
|
+
class RendererPartialTest < ::Test::Unit::TestCase
|
9
|
+
def setup
|
10
|
+
@base = Pathname.new(File.dirname(__FILE__) + "/../../project")
|
11
|
+
@config = {
|
12
|
+
partials_path: @base + "partials",
|
13
|
+
layouts_path: @base + "layouts",
|
14
|
+
source_path: @base + "html/test.html.erb"
|
15
|
+
}
|
16
|
+
@template_path = @base + "html"
|
17
|
+
|
18
|
+
@renderer = Renderer.new({}, @config)
|
19
|
+
end
|
20
|
+
|
21
|
+
# Partials
|
22
|
+
|
23
|
+
def test_partial
|
24
|
+
result = render_erb_template "<%= partial 'test/simple' %>"
|
25
|
+
assert_equal result, "ERB"
|
26
|
+
|
27
|
+
result = render_erb_template "<%= partial 'test/simple.html' %>"
|
28
|
+
assert_equal result, "ERB"
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_partial_with_double_template_extensions
|
32
|
+
result = render_erb_template "<%= partial 'test/json.json' %>"
|
33
|
+
assert_equal result, "{ key: value }"
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_partial_with_underscored_name
|
37
|
+
result = render_erb_template "<%= partial 'test/underscored' %>"
|
38
|
+
assert_equal result, "underscored"
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_local_partial
|
42
|
+
result = render_erb_template "<%= partial 'local' %>"
|
43
|
+
assert_equal result, "local"
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_partial_with_preferred_extension
|
47
|
+
assert_raise(ArgumentError) do
|
48
|
+
render_erb_template "<%= partial 'test/json' %>"
|
49
|
+
end
|
50
|
+
result = @renderer.render(@base + "html/test.json.erb", source: "<%= partial 'test/json' %>")
|
51
|
+
assert_equal result, "{ key: value }"
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_partial_with_block
|
55
|
+
result = render_erb_template "<% partial 'test/yield' do %>CONTENT<% end %>"
|
56
|
+
assert_equal result, "B-CONTENT-A"
|
57
|
+
|
58
|
+
result = render_erb_template "<% partial 'test/yield' do %><%= 'CONTENT' %><% end %>"
|
59
|
+
assert_equal result, "B-CONTENT-A"
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_partial_with_block_without_yield
|
63
|
+
result = render_erb_template "<% partial 'test/simple' do %>CONTENT<% end %>"
|
64
|
+
assert_equal result, "ERB"
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_front_matter_partial_access
|
68
|
+
result = render_erb_template "---\ntest: yay!\n---\n<%= partial 'test/front_matter' %>"
|
69
|
+
assert_equal result, "yay!"
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_partial_prevent_recursive
|
73
|
+
assert_raise(ArgumentError) do
|
74
|
+
render_erb_template "<% partial 'test/recursive' %>"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_partial_prevent_deep_recursive
|
79
|
+
assert_raise(ArgumentError) do
|
80
|
+
render_erb_template "<% partial 'test/deep_recursive' %>"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def render_erb_template(template)
|
85
|
+
@renderer.render(@base + "html/partials/test.html.erb", source: template)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|