cml 1.4.2
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/.document +5 -0
- data/.gitignore +5 -0
- data/LICENSE +20 -0
- data/README.rdoc +18 -0
- data/Rakefile +56 -0
- data/VERSION +1 -0
- data/cml.gemspec +129 -0
- data/lib/cml/converters/jsawesome.rb +103 -0
- data/lib/cml/gold.rb +33 -0
- data/lib/cml/liquid_filters.rb +13 -0
- data/lib/cml/parser.rb +160 -0
- data/lib/cml/tag.rb +308 -0
- data/lib/cml/tags/checkbox.rb +77 -0
- data/lib/cml/tags/checkboxes.rb +38 -0
- data/lib/cml/tags/group.rb +25 -0
- data/lib/cml/tags/hidden.rb +17 -0
- data/lib/cml/tags/iterate.rb +86 -0
- data/lib/cml/tags/meta.rb +12 -0
- data/lib/cml/tags/multiple_text.rb +11 -0
- data/lib/cml/tags/option.rb +29 -0
- data/lib/cml/tags/radio.rb +48 -0
- data/lib/cml/tags/radios.rb +36 -0
- data/lib/cml/tags/ratings.rb +61 -0
- data/lib/cml/tags/search.rb +97 -0
- data/lib/cml/tags/select.rb +50 -0
- data/lib/cml/tags/text.rb +45 -0
- data/lib/cml/tags/textarea.rb +45 -0
- data/lib/cml/tags/thumb.rb +25 -0
- data/lib/cml/tags/unknown.rb +21 -0
- data/lib/cml.rb +15 -0
- data/spec/complex_spec.rb +127 -0
- data/spec/converters/jsawesome_spec.rb +75 -0
- data/spec/fixtures/complex.cml +23 -0
- data/spec/fixtures/html.cml +34 -0
- data/spec/fixtures/invalid.cml +10 -0
- data/spec/fixtures/script-style.cml +12 -0
- data/spec/fixtures/segfault.cml +1 -0
- data/spec/gold_spec.rb +29 -0
- data/spec/meta_spec.rb +47 -0
- data/spec/normalize_spec.rb +214 -0
- data/spec/show_data_spec.rb +308 -0
- data/spec/sorta_match.rb +41 -0
- data/spec/spec_helper.rb +26 -0
- data/spec/tags/checkbox_spec.rb +155 -0
- data/spec/tags/checkboxes_spec.rb +171 -0
- data/spec/tags/group_spec.rb +108 -0
- data/spec/tags/hidden_spec.rb +17 -0
- data/spec/tags/iterate_spec.rb +259 -0
- data/spec/tags/meta_spec.rb +14 -0
- data/spec/tags/multiple_text_spec.rb +40 -0
- data/spec/tags/radios_spec.rb +81 -0
- data/spec/tags/ratings_spec.rb +79 -0
- data/spec/tags/search_spec.rb +132 -0
- data/spec/tags/select_spec.rb +76 -0
- data/spec/tags/tag_spec.rb +93 -0
- data/spec/tags/text_spec.rb +66 -0
- data/spec/tags/textarea_spec.rb +58 -0
- data/spec/tags/thumb_spec.rb +20 -0
- data/spec/tags/unknown_spec.rb +19 -0
- data/spec/validation_spec.rb +62 -0
- metadata +182 -0
@@ -0,0 +1,81 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "CML Radios" do
|
4
|
+
it "should render basic radios" do
|
5
|
+
cml = <<-HTML
|
6
|
+
<cml:radios label="Cool radios">
|
7
|
+
<cml:radio label="Wanna do it?"/>
|
8
|
+
<cml:radio label="Sure?"/>
|
9
|
+
<cml:radio label="Not really..." value="nope" checked="true"/>
|
10
|
+
</cml:radios>
|
11
|
+
HTML
|
12
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
13
|
+
#puts Parser.escape(@p.to_html)
|
14
|
+
@p.to_html.should sorta_match(<<-HTML)
|
15
|
+
<div class="cml" id="u12345">
|
16
|
+
<div class="radios cml_field">
|
17
|
+
<h2 class="legend">Cool radios</h2>
|
18
|
+
<div class="cml_row"><label class="">
|
19
|
+
<input type="radio" value="Wanna do it?" name="u12345[cool_radios]" class="cool_radios"/> Wanna do it?
|
20
|
+
</label></div>
|
21
|
+
<div class="cml_row"><label class="">
|
22
|
+
<input type="radio" value="Sure?" name="u12345[cool_radios]" class="cool_radios"/> Sure?
|
23
|
+
</label></div>
|
24
|
+
<div class="cml_row"><label class="">
|
25
|
+
<input type="radio" value="nope" checked="checked" name="u12345[cool_radios]" class="cool_radios"/> Sure?
|
26
|
+
</label></div>
|
27
|
+
</div>
|
28
|
+
</div>
|
29
|
+
HTML
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
it "should render normalize radios with custom gold" do
|
34
|
+
cml = <<-HTML
|
35
|
+
<cml:radios label="Cool radios" gold="custom">
|
36
|
+
<cml:radio label="Wanna do it?"/>
|
37
|
+
</cml:radios>
|
38
|
+
HTML
|
39
|
+
@p = Parser.new(cml, :prefix => "u12345", :normalize => true)
|
40
|
+
#puts Parser.escape(@p.to_html).gsub(/\n/,"<br/>")
|
41
|
+
@p.to_html.should sorta_match(<<-HTML)
|
42
|
+
<div class="cml" id="u12345">
|
43
|
+
<div class="checkboxes cml_field">
|
44
|
+
<h2 class="legend">Cool radios</h2>
|
45
|
+
<div class="cml_row"><label class="">
|
46
|
+
<input name="u12345[custom][]" class="custom" type="checkbox" value="Wanna do it?" />
|
47
|
+
Wanna do it?
|
48
|
+
</label></div>
|
49
|
+
<div class="cml_gold_reason">
|
50
|
+
<label class="legend">Reason</label>
|
51
|
+
<textarea name="u12345[custom_reason]"></textarea>
|
52
|
+
</div>
|
53
|
+
</div>
|
54
|
+
</div>
|
55
|
+
HTML
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should render radios with extra shit" do
|
59
|
+
cml = <<-HTML
|
60
|
+
<cml:radios label="Cool radios">
|
61
|
+
{% for foo in bar %}
|
62
|
+
<cml:radio label="Wanna do it?" value="{{bar}}"/>
|
63
|
+
{% endfor %}
|
64
|
+
</cml:radios>
|
65
|
+
HTML
|
66
|
+
@p = Parser.new(cml, :prefix => "u12345", :missed => {"cool_radios" => ["nope", ["Yes!"]]}, :data => {"bar" => ["Yes!"]})
|
67
|
+
#puts Parser.escape(@p.to_html)
|
68
|
+
@p.to_html.should sorta_match(<<-HTML)
|
69
|
+
<div class="cml" id="u12345">
|
70
|
+
<div class="radios cml_field">
|
71
|
+
<h2 class="legend">Cool radios</h2>
|
72
|
+
{% for foo in bar %}
|
73
|
+
<div class="cml_row"><label class="">
|
74
|
+
<input type="radio" value="{{bar}}" name="u12345[cool_radios]" class="cool_radios"/> Wanna do it?
|
75
|
+
</label></div>
|
76
|
+
{% endfor %}
|
77
|
+
</div>
|
78
|
+
</div>
|
79
|
+
HTML
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "CML Radios" do
|
4
|
+
it "should render simple radtings" do
|
5
|
+
cml = <<-HTML
|
6
|
+
<cml:ratings label="Rate it" from="Bad" to="Worst" points="4" />
|
7
|
+
HTML
|
8
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
9
|
+
#puts Parser.escape(@p.to_html).gsub(/\n/,"<br/>")
|
10
|
+
@p.to_html.should sorta_match(<<-HTML)
|
11
|
+
<div class="cml" id="u12345">
|
12
|
+
<div class="ratings cml_field"><h2 class="legend">Rate it</h2>
|
13
|
+
<div class="cml_row">
|
14
|
+
<table>
|
15
|
+
<thead>
|
16
|
+
<tr>
|
17
|
+
<th></th><th class="">1</th><th class="">2</th><th class="">3</th><th class="">4</th><th></th>
|
18
|
+
</tr>
|
19
|
+
</thead>
|
20
|
+
<tbody>
|
21
|
+
<tr>
|
22
|
+
<td>Bad</td>
|
23
|
+
<td class=""><input name="u12345[rate_it]" class="rate_it" value="1" type="radio" /></td>
|
24
|
+
<td class=""><input name="u12345[rate_it]" class="rate_it" value="2" type="radio" /></td>
|
25
|
+
<td class=""><input name="u12345[rate_it]" class="rate_it" value="3" type="radio" /></td>
|
26
|
+
<td class=""><input name="u12345[rate_it]" class="rate_it" value="4" type="radio" /></td>
|
27
|
+
<td>Worst</td>
|
28
|
+
</tr>
|
29
|
+
</tbody>
|
30
|
+
</table>
|
31
|
+
</div>
|
32
|
+
</div>
|
33
|
+
</div>
|
34
|
+
HTML
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should render fancy pants" do
|
38
|
+
cml = <<-HTML
|
39
|
+
<cml:ratings label="Love">
|
40
|
+
<cml:rating label="Hate" value="1"/>
|
41
|
+
<cml:rating label="Annoyed" value="2"/>
|
42
|
+
<cml:rating label="Aquatance" value="3"/>
|
43
|
+
<cml:rating label="Lover" value="4"/>
|
44
|
+
</cml:ratings>
|
45
|
+
HTML
|
46
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
47
|
+
#puts Parser.escape(@p.to_html).gsub(/\n/,"<br/>")
|
48
|
+
@p.to_html.should sorta_match(<<-HTML)
|
49
|
+
<div class="cml" id="u12345">
|
50
|
+
<div class="ratings cml_field"><h2 class="legend">Love</h2>
|
51
|
+
<div class="cml_row">
|
52
|
+
<table>
|
53
|
+
<thead>
|
54
|
+
<tr>
|
55
|
+
<th></th>
|
56
|
+
<th class="">Hate</th>
|
57
|
+
<th class="">Annoyed</th>
|
58
|
+
<th class="">Aquatance</th>
|
59
|
+
<th class="">Lover</th>
|
60
|
+
<th></th>
|
61
|
+
</tr>
|
62
|
+
</thead>
|
63
|
+
<tbody>
|
64
|
+
<tr>
|
65
|
+
<td></td>
|
66
|
+
<td class=""><input name="u12345[love]" class="love" value="1" type="radio" /></td>
|
67
|
+
<td class=""><input name="u12345[love]" class="love" value="2" type="radio" /></td>
|
68
|
+
<td class=""><input name="u12345[love]" class="love" value="3" type="radio" /></td>
|
69
|
+
<td class=""><input name="u12345[love]" class="love" value="4" type="radio" /></td>
|
70
|
+
<td></td>
|
71
|
+
</tr>
|
72
|
+
</tbody>
|
73
|
+
</table>
|
74
|
+
</div>
|
75
|
+
</div>
|
76
|
+
</div>
|
77
|
+
HTML
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "CML Search" do
|
4
|
+
it "should render basic search" do
|
5
|
+
cml = <<-HTML
|
6
|
+
<cml:search label="Coolio" />
|
7
|
+
HTML
|
8
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
9
|
+
@p.to_html.should sorta_match(<<-HTML)
|
10
|
+
<div class="cml" id="u12345">
|
11
|
+
<div class="search cml_field text">
|
12
|
+
<label class="legend">Coolio</label>
|
13
|
+
<div class="cml_row search" data-engine="googlecse" data-cse="#{CML::Tags::Search::DEFAULT_CSE}">
|
14
|
+
<input name="u12345[coolio_search_terms]" type="text" value="" class="googlecse no_validate" /><input type="button" value="Search" class="no_validate" />
|
15
|
+
</div>
|
16
|
+
<div class="cml_row results"></div>
|
17
|
+
<div class="cml_row selected_result">
|
18
|
+
<input name="u12345[coolio]" class="coolio" value="" type="text" />
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
HTML
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should render basic search with attributes" do
|
26
|
+
cml = <<-HTML
|
27
|
+
<cml:search label="Coolio" validates="required" only-if="foo||bar" default="test" engine="google"/>
|
28
|
+
HTML
|
29
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
30
|
+
@p.to_html.should sorta_match(<<-HTML)
|
31
|
+
<div class="cml" id="u12345">
|
32
|
+
<div class="search logic-only-if:foo||bar cml_field text">
|
33
|
+
<label class="legend">Coolio</label>
|
34
|
+
<div class="cml_row search" data-engine="google" data-cse="">
|
35
|
+
<input name="u12345[coolio_search_terms]" type="text" value="test" class="default google no_validate" /><input type="button" value="Search" class="no_validate" />
|
36
|
+
</div>
|
37
|
+
<div class="cml_row results"></div>
|
38
|
+
<div class="cml_row selected_result">
|
39
|
+
<input name="u12345[coolio]" class="coolio validates-required" value="" type="text" />
|
40
|
+
</div>
|
41
|
+
</div>
|
42
|
+
</div>
|
43
|
+
HTML
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should render custom search with cse attribute" do
|
47
|
+
cml = <<-HTML
|
48
|
+
<cml:search label="Coolio" validates="required" only-if="foo||bar" default="test" engine="googlecse" cse="002077591359011991755:dv3z-i7mm7o" />
|
49
|
+
HTML
|
50
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
51
|
+
@p.to_html.should sorta_match(<<-HTML)
|
52
|
+
<div class="cml" id="u12345">
|
53
|
+
<div class="search logic-only-if:foo||bar cml_field text">
|
54
|
+
<label class="legend">Coolio</label>
|
55
|
+
<div class="cml_row search" data-engine="googlecse" data-cse="002077591359011991755:dv3z-i7mm7o">
|
56
|
+
<input name="u12345[coolio_search_terms]" type="text" value="test" class="default googlecse no_validate" /><input type="button" value="Search" class="no_validate" />
|
57
|
+
</div>
|
58
|
+
<div class="cml_row results"></div>
|
59
|
+
<div class="cml_row selected_result">
|
60
|
+
<input name="u12345[coolio]" class="coolio validates-required" value="" type="text" />
|
61
|
+
</div>
|
62
|
+
</div>
|
63
|
+
</div>
|
64
|
+
HTML
|
65
|
+
end
|
66
|
+
|
67
|
+
it "handles normalization/gold" do
|
68
|
+
cml = <<-HTML
|
69
|
+
<cml:search label="Coolio" gold="true" engine="google"/>
|
70
|
+
HTML
|
71
|
+
@p = Parser.new(cml, :prefix => "unit[data]", :normalize => true)
|
72
|
+
@p.to_html.should sorta_match(<<-HTML)
|
73
|
+
<div class="cml" id="unit[data]">
|
74
|
+
<div class="search cml_field text">
|
75
|
+
<label class="legend">Coolio</label>
|
76
|
+
<div class="cml_row search" data-engine="google" data-cse="">
|
77
|
+
<input name="unit[data][coolio_search_terms_gold][]" type="text" value="" class="google no_validate" /><input type="button" value="Search" class="no_validate" />
|
78
|
+
</div>
|
79
|
+
<div class="cml_row results"></div>
|
80
|
+
<div class="cml_row selected_result">
|
81
|
+
<input name="unit[data][coolio_gold][]" class="coolio_gold" type="text" value="" />
|
82
|
+
</div>
|
83
|
+
</div>
|
84
|
+
</div>
|
85
|
+
HTML
|
86
|
+
|
87
|
+
cml = <<-HTML
|
88
|
+
<cml:search label="Coolio" gold="true" />
|
89
|
+
HTML
|
90
|
+
@p = Parser.new(cml, :prefix => "unit[data]", :normalize => true, :data => {
|
91
|
+
"coolio_search_terms_gold" => ["bork"],
|
92
|
+
"coolio_gold" => ["http://apple.com", "http://microsoft.com"]
|
93
|
+
})
|
94
|
+
@p.to_html.should sorta_match(<<-HTML)
|
95
|
+
<div class="cml" id="unit[data]">
|
96
|
+
<div class="search cml_field text">
|
97
|
+
<label class="legend">Coolio</label>
|
98
|
+
<div class="cml_row search" data-engine="googlecse" data-cse="#{CML::Tags::Search::DEFAULT_CSE}">
|
99
|
+
<input name="unit[data][coolio_search_terms_gold][]" type="text" value="bork" class="googlecse no_validate" /><input type="button" value="Search" class="no_validate" />
|
100
|
+
</div>
|
101
|
+
<div class="cml_row results"></div>
|
102
|
+
<div class="cml_row selected_result">
|
103
|
+
<input name="unit[data][coolio_gold][]" class="coolio_gold cml_gold_loaded" type="text" value="http://apple.com" />
|
104
|
+
</div>
|
105
|
+
<div class="cml_row selected_result">
|
106
|
+
<input name="unit[data][coolio_gold][]" class="coolio_gold cml_gold_loaded" type="text" value="http://microsoft.com" />
|
107
|
+
</div>
|
108
|
+
</div>
|
109
|
+
</div>
|
110
|
+
HTML
|
111
|
+
end
|
112
|
+
|
113
|
+
it "should render basic search as a non-field" do
|
114
|
+
cml = <<-HTML
|
115
|
+
<cml:search label="Coolio" field="false" />
|
116
|
+
HTML
|
117
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
118
|
+
@p.to_html.should_not =~ /selected_result/
|
119
|
+
@p.to_html.should_not =~ /No data/
|
120
|
+
@p.to_html.should sorta_match(<<-HTML)
|
121
|
+
<div class="cml" id="u12345">
|
122
|
+
<div class="search cml_field text">
|
123
|
+
<label class="legend">Coolio</label>
|
124
|
+
<div class="cml_row search" data-engine="googlecse" data-cse="#{CML::Tags::Search::DEFAULT_CSE}">
|
125
|
+
<input name="u12345[coolio_search_terms]" type="text" value="" class="googlecse no_validate" /><input type="button" value="Search" class="no_validate" />
|
126
|
+
</div>
|
127
|
+
<div class="cml_row results"></div>
|
128
|
+
</div>
|
129
|
+
</div>
|
130
|
+
HTML
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "CML Select" do
|
4
|
+
it "should render basic select" do
|
5
|
+
cml = <<-HTML
|
6
|
+
<cml:select label="Basic">
|
7
|
+
<cml:option>One</option>
|
8
|
+
<cml:option>Two</option>
|
9
|
+
<cml:option>Three</option>
|
10
|
+
</cml:select>
|
11
|
+
HTML
|
12
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
13
|
+
@p.to_html.should sorta_match(<<-HTML)
|
14
|
+
<div class="cml" id="u12345">
|
15
|
+
<div class="select cml_field">
|
16
|
+
<label class="legend">Basic</label>
|
17
|
+
<div class="cml_row"><select name="u12345[basic]" class="basic">
|
18
|
+
<option>One</option>
|
19
|
+
<option>Two</option>
|
20
|
+
<option>Three</option>
|
21
|
+
</select></div>
|
22
|
+
</div>
|
23
|
+
</div>
|
24
|
+
HTML
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should render correctly when required" do
|
28
|
+
cml = <<-HTML
|
29
|
+
<cml:select label="Basic" validates="required">
|
30
|
+
<cml:option value="oney">One</cml:option>
|
31
|
+
<cml:option selected="true">Two</cml:option>
|
32
|
+
<cml:option label="Awesome"/>
|
33
|
+
</cml:select>
|
34
|
+
HTML
|
35
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
36
|
+
@p.to_html.should sorta_match(<<-HTML)
|
37
|
+
<div class="cml" id="u12345">
|
38
|
+
<div class="select cml_field">
|
39
|
+
<label class="legend">Basic</label>
|
40
|
+
<div class="cml_row"><select name="u12345[basic]" class="basic validates-required">
|
41
|
+
<option value="">Select one</option>
|
42
|
+
<option value="oney">One</option>
|
43
|
+
<option selected="selected">Two</option>
|
44
|
+
<option>Awesome</option>
|
45
|
+
</select></div>
|
46
|
+
</div>
|
47
|
+
</div>
|
48
|
+
HTML
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should render complex select" do
|
52
|
+
cml = <<-HTML
|
53
|
+
<cml:select label="Basic" default="Choose an option">
|
54
|
+
<cml:option value="oney">One</cml:option>
|
55
|
+
<cml:option selected="true">Two</cml:option>
|
56
|
+
<cml:option label="Awesome"/>
|
57
|
+
</cml:select>
|
58
|
+
HTML
|
59
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
60
|
+
@p.tags[0].children.map {|t| t.raw_label }.should == ["Choose an option", "One", "Two", "Awesome"]
|
61
|
+
#puts Parser.escape(@p.to_html)
|
62
|
+
@p.to_html.should sorta_match(<<-HTML)
|
63
|
+
<div class="cml" id="u12345">
|
64
|
+
<div class="select cml_field">
|
65
|
+
<label class="legend">Basic</label>
|
66
|
+
<div class="cml_row"><select name="u12345[basic]" class="basic">
|
67
|
+
<option value="">Choose an option</option>
|
68
|
+
<option value="oney">One</option>
|
69
|
+
<option selected="selected">Two</option>
|
70
|
+
<option>Awesome</option>
|
71
|
+
</select></div>
|
72
|
+
</div>
|
73
|
+
</div>
|
74
|
+
HTML
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "CML Tag" do
|
4
|
+
it "lists no validators when none" do
|
5
|
+
@p = Parser.new(<<-HTML)
|
6
|
+
<cml:text label="Don't validate me, bro!" />
|
7
|
+
HTML
|
8
|
+
@p.tags[0].validators.should == []
|
9
|
+
end
|
10
|
+
|
11
|
+
it "lists validators" do
|
12
|
+
@p = Parser.new(<<-HTML)
|
13
|
+
<cml:text label="Validate me!" validates="required awesome stuff dude" />
|
14
|
+
HTML
|
15
|
+
@p.tags[0].validators.should == ["required", "awesome", "stuff", "dude"]
|
16
|
+
end
|
17
|
+
|
18
|
+
it "lists matchers" do
|
19
|
+
@p = Parser.new(<<-HTML)
|
20
|
+
<cml:text label="Match me!" validates="required" matcher="range" />
|
21
|
+
HTML
|
22
|
+
@p.to_html.should sorta_match(<<-HTML)
|
23
|
+
<div class="cml" id="">
|
24
|
+
<div class="text matcher:range cml_field">
|
25
|
+
<label class="legend">Match me!</label>
|
26
|
+
<div class="cml_row"><input name="match_me" type="text" value="" class="match_me validates-required" /></div>
|
27
|
+
</div>
|
28
|
+
</div>
|
29
|
+
HTML
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "with data attributes" do
|
33
|
+
it "handles one data attribute" do
|
34
|
+
@cml = "<cml:text label='foo' data-is-fun='true' />"
|
35
|
+
@parser = Parser.new( @cml, :prefix => "u" )
|
36
|
+
@parser.to_html.should sorta_match( <<-HTML )
|
37
|
+
<div class="cml" id="u">
|
38
|
+
<div class="text cml_field" data-is-fun="true">
|
39
|
+
<label class="legend">foo</label>
|
40
|
+
<div class="cml_row">
|
41
|
+
<input name="u[foo]" class="foo" type="text" value="">
|
42
|
+
</div>
|
43
|
+
</div>
|
44
|
+
</div>
|
45
|
+
HTML
|
46
|
+
end
|
47
|
+
|
48
|
+
it "handles many data attributes" do
|
49
|
+
@cml = "<cml:text label='foo' data-is-fun='true' data-is-cool='you betcha' />"
|
50
|
+
@parser = Parser.new( @cml, :prefix => "u" )
|
51
|
+
@parser.to_html.should sorta_match( <<-HTML )
|
52
|
+
<div class="cml" id="u">
|
53
|
+
<div class="text cml_field" data-is-fun="true" data-is-cool="you betcha">
|
54
|
+
<label class="legend">foo</label>
|
55
|
+
<div class="cml_row">
|
56
|
+
<input name="u[foo]" class="foo" type="text" value="">
|
57
|
+
</div>
|
58
|
+
</div>
|
59
|
+
</div>
|
60
|
+
HTML
|
61
|
+
end
|
62
|
+
|
63
|
+
it "handles cml:textarea" do
|
64
|
+
@cml = "<cml:textarea label='foo' data-is-fun='true' data-is-cool='you betcha' />"
|
65
|
+
@parser = Parser.new( @cml, :prefix => "u" )
|
66
|
+
@parser.to_html.should sorta_match( <<-HTML )
|
67
|
+
<div class="cml" id="u">
|
68
|
+
<div class="textarea cml_field" data-is-fun="true" data-is-cool="you betcha">
|
69
|
+
<label class="legend">foo</label>
|
70
|
+
<div class="cml_row">
|
71
|
+
<textarea name="u[foo]" class="foo"></textarea>
|
72
|
+
</div>
|
73
|
+
</div>
|
74
|
+
</div>
|
75
|
+
HTML
|
76
|
+
end
|
77
|
+
|
78
|
+
it "deals with crazy characters" do
|
79
|
+
@cml = "<cml:text label='foo' data-shit=\"'str' <tag /> \\escape\" />"
|
80
|
+
@parser = Parser.new( @cml, :prefix => "u" )
|
81
|
+
@parser.to_html.should sorta_match( <<-HTML )
|
82
|
+
<div class="cml" id="u">
|
83
|
+
<div class="text cml_field" data-shit="'str' <tag /> \\escape">
|
84
|
+
<label class="legend">foo</label>
|
85
|
+
<div class="cml_row">
|
86
|
+
<input name="u[foo]" class="foo" type="text" value="">
|
87
|
+
</div>
|
88
|
+
</div>
|
89
|
+
</div>
|
90
|
+
HTML
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "CML Text" do
|
4
|
+
it "should render basic text" do
|
5
|
+
cml = <<-HTML
|
6
|
+
<cml:text label="Coolio"/>
|
7
|
+
HTML
|
8
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
9
|
+
@p.to_html.should sorta_match(<<-HTML)
|
10
|
+
<div class="cml" id="u12345">
|
11
|
+
<div class="text cml_field">
|
12
|
+
<label class="legend">Coolio</label>
|
13
|
+
<div class="cml_row"><input type="text" value="" name="u12345[coolio]" class="coolio"/></div>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
HTML
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should render text with multiple" do
|
20
|
+
cml = <<-HTML
|
21
|
+
<cml:text label="Coolio" multiple="true"/>
|
22
|
+
HTML
|
23
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
24
|
+
@p.to_html.should sorta_match(<<-HTML)
|
25
|
+
<div class="cml" id="u12345">
|
26
|
+
<div class="text multiple list cml_field">
|
27
|
+
<label class="legend">Coolio</label>
|
28
|
+
<div class="cml_row"><input type="text" value="" name="u12345[coolio][]" class="coolio"/></div>
|
29
|
+
</div>
|
30
|
+
</div>
|
31
|
+
HTML
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should maintain multiple when setting gold and mutliple is first attribute" do
|
35
|
+
cml = <<-HTML
|
36
|
+
<cml:group>
|
37
|
+
<cml:text multiple="true" validates="required" label="Coolio"/>
|
38
|
+
</cml:group>
|
39
|
+
HTML
|
40
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
41
|
+
coolio = @p.tags.select {|tag| tag.name == "coolio" }.first.gold = {}
|
42
|
+
@p.to_cml.should sorta_match(<<-HTML)
|
43
|
+
<cml:group>
|
44
|
+
<cml:text multiple="true" validates="required" label="Coolio" gold="true"></cml:text>
|
45
|
+
</cml:group>
|
46
|
+
HTML
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should render text with classes and instructions tag" do
|
50
|
+
cml = <<-HTML
|
51
|
+
<cml:text label="Coolio" class="small" validates="required" default="Awesome">
|
52
|
+
<cml:instructions>Just be <b>cool</b> bro!</cml:instructions>
|
53
|
+
</cml:text>
|
54
|
+
HTML
|
55
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
56
|
+
@p.to_html.should sorta_match(<<-HTML)
|
57
|
+
<div class="cml" id="u12345">
|
58
|
+
<div class="text cml_field small">
|
59
|
+
<label class="legend">Coolio</label>
|
60
|
+
<div class="cml_row"><input type="text" class="coolio validates-required small default" value="Awesome" name="u12345[coolio]" /></div>
|
61
|
+
<p class="instructions">Just be <b>cool</b> bro!</p>
|
62
|
+
</div>
|
63
|
+
</div>
|
64
|
+
HTML
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "CML Textarea" do
|
4
|
+
it "should render basic text" do
|
5
|
+
cml = <<-HTML
|
6
|
+
<cml:textarea label="Sweet dude man!" value="4 sure"/>
|
7
|
+
HTML
|
8
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
9
|
+
@p.to_html.should sorta_match(<<-HTML)
|
10
|
+
<div class="cml" id="u12345">
|
11
|
+
<div class="textarea cml_field">
|
12
|
+
<label class="legend">Sweet dude man!</label>
|
13
|
+
<div class="cml_row"><textarea name="u12345[sweet_dude_man]" class="sweet_dude_man">4 sure</textarea></div>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
HTML
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should render textarea normalized with instructions" do
|
20
|
+
cml = <<-HTML
|
21
|
+
<cml:textarea label="Hot" validates="url" default="Awesome" instructions="Nice" gold="true" />
|
22
|
+
HTML
|
23
|
+
@p = Parser.new(cml, :prefix => "unit[data]", :normalize => true, :data => {"hot_gold" => []})
|
24
|
+
#puts Parser.escape(@p.to_html).gsub(/\n/,"<br/>")
|
25
|
+
@p.to_html.should sorta_match(<<-HTML)
|
26
|
+
<div class="cml" id="unit[data]">
|
27
|
+
<div class="textarea cml_field">
|
28
|
+
<label class="legend">Hot</label>
|
29
|
+
<div class="cml_row">
|
30
|
+
<textarea name="unit[data][hot_gold][]" class="hot_gold validates-url default"></textarea>
|
31
|
+
</div>
|
32
|
+
<p class="instructions">Nice</p>
|
33
|
+
|
34
|
+
<div class="cml_gold_reason">
|
35
|
+
<label class="legend">Reason</label>
|
36
|
+
<textarea name="unit[data][hot_gold_reason]"></textarea>
|
37
|
+
</div>
|
38
|
+
</div>
|
39
|
+
</div>
|
40
|
+
HTML
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should render text with classes and instructions tag" do
|
44
|
+
cml = <<-HTML
|
45
|
+
<cml:textarea label="Hot" validates="url" default="Awesome" instructions="Nice" />
|
46
|
+
HTML
|
47
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
48
|
+
@p.to_html.should sorta_match(<<-HTML)
|
49
|
+
<div class="cml" id="u12345">
|
50
|
+
<div class="textarea cml_field">
|
51
|
+
<label class="legend">Hot</label>
|
52
|
+
<div class="cml_row"><textarea name="u12345[hot]" class="hot validates-url default">Awesome</textarea></div>
|
53
|
+
<p class="instructions">Nice</p>
|
54
|
+
</div>
|
55
|
+
</div>
|
56
|
+
HTML
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "CML Thumb" do
|
4
|
+
it "should render with params" do
|
5
|
+
cml = <<-HTML
|
6
|
+
<cml:thumb src="http://foobag.com/poo.jpg" width="10" />
|
7
|
+
HTML
|
8
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
9
|
+
#puts Parser.escape(@p.to_html).gsub(/\n/,"<br/>")
|
10
|
+
@p.to_html.should sorta_match(<<-HTML)
|
11
|
+
<div class="cml" id="u12345">
|
12
|
+
<div class="thumb cml_field">
|
13
|
+
<img src="http://nodenailer.crowdflower.com/?w=10&url=http%3A%2F%2Ffoobag.com%2Fpoo.jpg" />
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
HTML
|
17
|
+
|
18
|
+
@p.should be_valid
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "CML Unknown" do
|
4
|
+
it "should render unknown field" do
|
5
|
+
cml = <<-HTML
|
6
|
+
<cml:crazy name="secret">
|
7
|
+
Something
|
8
|
+
</cml:crazy>
|
9
|
+
HTML
|
10
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
11
|
+
@p.to_html.should sorta_match(<<-HTML)
|
12
|
+
<div class="cml" id="u12345">
|
13
|
+
<div class="crazy cml_field unknown">
|
14
|
+
Something
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
HTML
|
18
|
+
end
|
19
|
+
end
|