express_templates 0.2.7 → 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.
- checksums.yaml +4 -4
- data/lib/core_extensions/proc.rb +72 -20
- data/lib/express_templates/compiler.rb +9 -1
- data/lib/express_templates/components/base.rb +1 -1
- data/lib/express_templates/components/capabilities/building.rb +8 -0
- data/lib/express_templates/components/capabilities/conditionality.rb +8 -6
- data/lib/express_templates/components/capabilities/configurable.rb +3 -4
- data/lib/express_templates/components/capabilities/iterating.rb +18 -23
- data/lib/express_templates/components/capabilities/parenting.rb +4 -18
- data/lib/express_templates/components/capabilities/rendering.rb +2 -65
- data/lib/express_templates/components/capabilities/templating.rb +24 -22
- data/lib/express_templates/components/capabilities/wrapping.rb +23 -39
- data/lib/express_templates/components/column.rb +1 -1
- data/lib/express_templates/components/for_each.rb +28 -0
- data/lib/express_templates/components/form_for.rb +19 -0
- data/lib/express_templates/components/form_rails_support.rb +1 -1
- data/lib/express_templates/components/null_wrap.rb +9 -0
- data/lib/express_templates/components/row.rb +1 -1
- data/lib/express_templates/components/table_for.rb +119 -0
- data/lib/express_templates/components/tree_for.rb +41 -0
- data/lib/express_templates/components/unless_block.rb +40 -0
- data/lib/express_templates/components.rb +4 -0
- data/lib/express_templates/expander.rb +15 -4
- data/lib/express_templates/indenter.rb +8 -5
- data/lib/express_templates/markup/tag.rb +62 -30
- data/lib/express_templates/markup/wrapper.rb +1 -1
- data/lib/express_templates/version.rb +1 -1
- data/test/components/base_test.rb +5 -38
- data/test/components/conditionality_test.rb +1 -1
- data/test/components/configurable_test.rb +2 -2
- data/test/components/container_test.rb +1 -1
- data/test/components/iterating_test.rb +30 -9
- data/test/components/table_for_test.rb +116 -0
- data/test/core_extensions/proc_test.rb +35 -5
- data/test/dummy/log/test.log +645 -0
- data/test/fixtures/{a_big_page.html → a_big_page2.html} +0 -0
- data/test/indenter_test.rb +6 -4
- data/test/markup/tag_test.rb +15 -2
- data/test/performance_test.rb +1 -1
- data/test/test_helper.rb +2 -0
- metadata +26 -3
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
class TableForTest < ActiveSupport::TestCase
|
5
|
+
|
6
|
+
class Context
|
7
|
+
attr :items
|
8
|
+
def initialize(items)
|
9
|
+
@items = items
|
10
|
+
end
|
11
|
+
def titleize(s)
|
12
|
+
s.to_s.try(:titleize)
|
13
|
+
end
|
14
|
+
def format_price(p)
|
15
|
+
"$%0.2f" % p
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def items
|
20
|
+
[OpenStruct.new(id: 1, name: 'Foo', price: 1.23),
|
21
|
+
OpenStruct.new(id: 2, name: 'Bar', price: 5.49),
|
22
|
+
OpenStruct.new(id: 3, name: 'Baz', price: 99.97)]
|
23
|
+
end
|
24
|
+
|
25
|
+
EXAMPLE_COMPILED = -> {
|
26
|
+
ExpressTemplates::Components::TableFor.render_in(self) {
|
27
|
+
"<table id=\"items\">
|
28
|
+
<thead>
|
29
|
+
<tr>
|
30
|
+
<th class=\"name\">Name</th>
|
31
|
+
<th class=\"price\">Price</th>
|
32
|
+
</tr>
|
33
|
+
</thead>
|
34
|
+
|
35
|
+
<tbody>"+(items.each_with_index.map do |item, item_index|
|
36
|
+
"
|
37
|
+
<tr id=\"#{(-> {"item-#{item.id}"}).call}\" class=\"item\">
|
38
|
+
<td class=\"name\">#{item.name}</td>
|
39
|
+
<td class=\"price\">#{(-> (price) { '$%0.2f' % price }).call(item.price)}</td>
|
40
|
+
</tr>
|
41
|
+
"
|
42
|
+
end).join+" </tbody>
|
43
|
+
</table>
|
44
|
+
"
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
48
|
+
EXAMPLE_MARKUP = <<-HTML
|
49
|
+
<table id="items">
|
50
|
+
<thead>
|
51
|
+
<tr>
|
52
|
+
<th class="name">Name</th>
|
53
|
+
<th class="price">Price</th>
|
54
|
+
</tr>
|
55
|
+
</thead>
|
56
|
+
|
57
|
+
<tbody>
|
58
|
+
<tr id="item-1" class="item">
|
59
|
+
<td class="name">Foo</td>
|
60
|
+
<td class="price">$1.23</td>
|
61
|
+
</tr>
|
62
|
+
|
63
|
+
<tr id="item-2" class="item">
|
64
|
+
<td class="name">Bar</td>
|
65
|
+
<td class="price">$5.49</td>
|
66
|
+
</tr>
|
67
|
+
|
68
|
+
<tr id="item-3" class="item">
|
69
|
+
<td class="name">Baz</td>
|
70
|
+
<td class="price">$99.97</td>
|
71
|
+
</tr>
|
72
|
+
</tbody>
|
73
|
+
</table>
|
74
|
+
HTML
|
75
|
+
|
76
|
+
|
77
|
+
def simple_table(items)
|
78
|
+
ctx = Context.new(items)
|
79
|
+
fragment = -> {
|
80
|
+
table_for(:items) do |t|
|
81
|
+
t.column :name
|
82
|
+
t.column :price, formatter: -> (price) { '$%0.2f' % price }
|
83
|
+
end
|
84
|
+
}
|
85
|
+
return ctx, fragment
|
86
|
+
end
|
87
|
+
|
88
|
+
def example_compiled_src
|
89
|
+
# necessary because the #source method is not perfect yet
|
90
|
+
# ideally we would have #source_body
|
91
|
+
EXAMPLE_COMPILED.source_body
|
92
|
+
end
|
93
|
+
|
94
|
+
test "example view code evaluates to example markup" do
|
95
|
+
assert_equal EXAMPLE_MARKUP, Context.new(items).instance_eval(EXAMPLE_COMPILED.source_body)
|
96
|
+
end
|
97
|
+
|
98
|
+
test "compiled source is legible and transparent" do
|
99
|
+
ExpressTemplates::Markup::Tag.formatted do
|
100
|
+
ctx, fragment = simple_table(items)
|
101
|
+
assert_equal example_compiled_src, ExpressTemplates.compile(&fragment)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
test "example compiled source renders the markup in the context" do
|
106
|
+
ctx, fragment = simple_table(items)
|
107
|
+
assert_equal EXAMPLE_MARKUP, ctx.instance_eval(example_compiled_src)
|
108
|
+
end
|
109
|
+
|
110
|
+
test "rendered component matches desired markup" do
|
111
|
+
ExpressTemplates::Markup::Tag.formatted do
|
112
|
+
ctx, fragment = simple_table(items)
|
113
|
+
assert_equal EXAMPLE_MARKUP, ExpressTemplates.render(ctx, &fragment)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -31,11 +31,41 @@ class ProcTest < ActiveSupport::TestCase
|
|
31
31
|
assert_equal '{ whatever { another } }', block.source
|
32
32
|
end
|
33
33
|
|
34
|
-
#
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
34
|
+
test "#source works with a stabby lambda" do
|
35
|
+
block = return_block -> (something) { whatever }
|
36
|
+
assert_equal '-> (something) { whatever }', block.source
|
37
|
+
end
|
38
|
+
|
39
|
+
test "#source work with a stabby lambda spanning lines" do
|
40
|
+
block = return_block -> {
|
41
|
+
whatever { foo }
|
42
|
+
}
|
43
|
+
assert_equal "-> {\n whatever { foo }\n}", block.source
|
44
|
+
end
|
45
|
+
|
46
|
+
test "#source_body returns the body of a proc" do
|
47
|
+
block = return_block -> { whatever }
|
48
|
+
assert_equal 'whatever', block.source_body
|
49
|
+
end
|
50
|
+
|
51
|
+
test "#source_body handles funky bodies" do
|
52
|
+
block = return_block do
|
53
|
+
something(funky) &-> { whatever }
|
54
|
+
end
|
55
|
+
assert_equal 'something(funky) &-> { whatever }', block.source_body
|
56
|
+
end
|
57
|
+
|
58
|
+
test "#source body raises exception for arity > 0" do
|
59
|
+
block = return_block -> (foo) { whatever }
|
60
|
+
assert_raises(RuntimeError) do
|
61
|
+
block.source_body
|
62
|
+
end
|
63
|
+
end
|
39
64
|
|
65
|
+
test ".from_source stores source of a dynamicly built proc for later inspection" do
|
66
|
+
src = "-> { 'foo' }"
|
67
|
+
assert_equal src, Proc.from_source(src).source
|
68
|
+
assert_equal 'foo', Proc.from_source(src).call
|
69
|
+
end
|
40
70
|
|
41
71
|
end
|