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.
Files changed (61) hide show
  1. data/.document +5 -0
  2. data/.gitignore +5 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +18 -0
  5. data/Rakefile +56 -0
  6. data/VERSION +1 -0
  7. data/cml.gemspec +129 -0
  8. data/lib/cml/converters/jsawesome.rb +103 -0
  9. data/lib/cml/gold.rb +33 -0
  10. data/lib/cml/liquid_filters.rb +13 -0
  11. data/lib/cml/parser.rb +160 -0
  12. data/lib/cml/tag.rb +308 -0
  13. data/lib/cml/tags/checkbox.rb +77 -0
  14. data/lib/cml/tags/checkboxes.rb +38 -0
  15. data/lib/cml/tags/group.rb +25 -0
  16. data/lib/cml/tags/hidden.rb +17 -0
  17. data/lib/cml/tags/iterate.rb +86 -0
  18. data/lib/cml/tags/meta.rb +12 -0
  19. data/lib/cml/tags/multiple_text.rb +11 -0
  20. data/lib/cml/tags/option.rb +29 -0
  21. data/lib/cml/tags/radio.rb +48 -0
  22. data/lib/cml/tags/radios.rb +36 -0
  23. data/lib/cml/tags/ratings.rb +61 -0
  24. data/lib/cml/tags/search.rb +97 -0
  25. data/lib/cml/tags/select.rb +50 -0
  26. data/lib/cml/tags/text.rb +45 -0
  27. data/lib/cml/tags/textarea.rb +45 -0
  28. data/lib/cml/tags/thumb.rb +25 -0
  29. data/lib/cml/tags/unknown.rb +21 -0
  30. data/lib/cml.rb +15 -0
  31. data/spec/complex_spec.rb +127 -0
  32. data/spec/converters/jsawesome_spec.rb +75 -0
  33. data/spec/fixtures/complex.cml +23 -0
  34. data/spec/fixtures/html.cml +34 -0
  35. data/spec/fixtures/invalid.cml +10 -0
  36. data/spec/fixtures/script-style.cml +12 -0
  37. data/spec/fixtures/segfault.cml +1 -0
  38. data/spec/gold_spec.rb +29 -0
  39. data/spec/meta_spec.rb +47 -0
  40. data/spec/normalize_spec.rb +214 -0
  41. data/spec/show_data_spec.rb +308 -0
  42. data/spec/sorta_match.rb +41 -0
  43. data/spec/spec_helper.rb +26 -0
  44. data/spec/tags/checkbox_spec.rb +155 -0
  45. data/spec/tags/checkboxes_spec.rb +171 -0
  46. data/spec/tags/group_spec.rb +108 -0
  47. data/spec/tags/hidden_spec.rb +17 -0
  48. data/spec/tags/iterate_spec.rb +259 -0
  49. data/spec/tags/meta_spec.rb +14 -0
  50. data/spec/tags/multiple_text_spec.rb +40 -0
  51. data/spec/tags/radios_spec.rb +81 -0
  52. data/spec/tags/ratings_spec.rb +79 -0
  53. data/spec/tags/search_spec.rb +132 -0
  54. data/spec/tags/select_spec.rb +76 -0
  55. data/spec/tags/tag_spec.rb +93 -0
  56. data/spec/tags/text_spec.rb +66 -0
  57. data/spec/tags/textarea_spec.rb +58 -0
  58. data/spec/tags/thumb_spec.rb +20 -0
  59. data/spec/tags/unknown_spec.rb +19 -0
  60. data/spec/validation_spec.rb +62 -0
  61. metadata +182 -0
@@ -0,0 +1,171 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe "CML Checkboxes" do
4
+ it "should render basic checkboxes" do
5
+ cml = <<-HTML
6
+ <cml:checkboxes label="Cool checkboxes">
7
+ <cml:checkbox label="{{question}}"/>
8
+ <cml:checkbox label="Sure?"/>
9
+ <cml:checkbox label="Not really..." value="nope" checked="true"/>
10
+ </cml:checkboxes>
11
+ HTML
12
+ @p = Parser.new(cml, :prefix => "u12345", :missed => {"cool_checkboxes" => ["nope", ["Wanna do it?"]]}, :data => {"question" => "Wanna do it?"})
13
+ #puts Parser.escape(@p.to_html).gsub(/\n/,"<br/>")
14
+ @p.to_html.should sorta_match(<<-HTML)
15
+ <div class="cml" id="u12345">
16
+ <div class="checkboxes cml_field">
17
+ <h2 class="legend">Cool checkboxes</h2>
18
+ <div class="cml_row"><label class="gold_good">
19
+ <input type="checkbox" value="Wanna do it?" name="u12345[cool_checkboxes][]" class="cool_checkboxes"/> {{question}}
20
+ </label></div>
21
+ <div class="cml_row"><label class="">
22
+ <input type="checkbox" value="Sure?" name="u12345[cool_checkboxes][]" class="cool_checkboxes"/> Sure?
23
+ </label></div>
24
+ <div class="cml_row"><label class="gold_bad">
25
+ <input type="checkbox" value="nope" name="u12345[cool_checkboxes][]" class="cool_checkboxes"/> Sure?
26
+ </label></div>
27
+ </div>
28
+ </div>
29
+ HTML
30
+ end
31
+
32
+ it "should render normalize checkbox with custom gold" do
33
+ cml = <<-HTML
34
+ <cml:checkboxes label="Cool checkboxes" gold="custom">
35
+ <cml:checkbox label="Wanna do it?"/>
36
+ <cml:checkbox label="Test" checked="true"/>
37
+ </cml:checkboxes>
38
+ HTML
39
+ @p = Parser.new(cml, :prefix => "u12345", :normalize => true, :data => {})
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 checkboxes</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_row"><label class=""><input name="u12345[custom][]" type="checkbox" value="Test" class="custom" checked="checked" />
50
+ Test</label></div>
51
+ <div class="cml_gold_reason">
52
+ <label class="legend">Reason</label>
53
+ <textarea name="u12345[custom_reason]"></textarea>
54
+ </div>
55
+ </div>
56
+ </div>
57
+ HTML
58
+ end
59
+
60
+ it "should render checkboxes with extra shit" do
61
+ cml = <<-HTML
62
+ <cml:checkboxes label="Cool checkboxes">
63
+ {% for foo in bar %}
64
+ <cml:checkbox label="Wanna do it?" value="{{bar}}"/>
65
+ {% endfor %}
66
+ </cml:checkboxes>
67
+ HTML
68
+ @p = Parser.new(cml, :prefix => "u12345")
69
+ #puts Parser.escape(@p.to_html)
70
+ @p.to_html.should sorta_match(<<-HTML)
71
+ <div class="cml" id="u12345">
72
+ <div class="checkboxes cml_field">
73
+ <h2 class="legend">Cool checkboxes</h2>
74
+ {% for foo in bar %}
75
+ <div class="cml_row"><label class="">
76
+ <input type="checkbox" value="{{bar}}" name="u12345[cool_checkboxes][]" class="cool_checkboxes"/> Wanna do it?
77
+ </label></div>
78
+ {% endfor %}
79
+ </div>
80
+ </div>
81
+ HTML
82
+ end
83
+
84
+ it "should render checkboxes with default" do
85
+ cml = <<-HTML
86
+ <cml:checkboxes label="Cool checkboxes">
87
+ <cml:checkbox label="Wanna do it?" value="{{bar}}" default="false"/>
88
+ </cml:checkboxes>
89
+ HTML
90
+ @p = Parser.new(cml, :prefix => "u12345")
91
+ #puts Parser.escape(@p.to_html)
92
+ @p.to_html.should sorta_match(<<-HTML)
93
+ <div class="cml" id="u12345">
94
+ <div class="checkboxes cml_field">
95
+ <h2 class="legend">Cool checkboxes</h2>
96
+ <div class="cml_row"><label class="">
97
+ <input type="hidden" value="false" name="u12345[cool_checkboxes][]" class="cool_checkboxes"/>
98
+ <input type="checkbox" value="{{bar}}" name="u12345[cool_checkboxes][]" class="cool_checkboxes"/> Wanna do it?
99
+ </label></div>
100
+ </div>
101
+ </div>
102
+ HTML
103
+ end
104
+
105
+ it "allows floating divery" do
106
+ cml = <<-HTML
107
+ <cml:checkboxes label="Categories">
108
+ <div style="float:left;width:300px;margin-right:10px">
109
+ <cml:checkbox label="Connected &lt;i&gt;The comment reflects that the website allows you to connect or reconnect with friends&lt;/i&gt;" value="connected" />
110
+ </div>
111
+ <div style="float:left">
112
+ <cml:checkbox label="Privacy &lt;i&gt;The comment mentions privacy, privacy settings or the ability to control user privacy&lt;/i&gt;" value="privacy" />
113
+ </div>
114
+ </cml:checkboxes>
115
+ <cml:checkboxes label="foo">
116
+ <cml:checkbox label="shit" />
117
+ </cml:checkboxes>
118
+ <br style="clear:both"/>
119
+ HTML
120
+ @p = Parser.new(cml, :prefix => "u12345")
121
+ #puts Parser.escape(@p.to_html)
122
+ @p.to_html.should sorta_match(<<-HTML)
123
+ <div class="cml" id="u12345">
124
+ <div class="checkboxes cml_field">
125
+ <h2 class="legend">Categories</h2>
126
+ <div style="float:left;width:300px;margin-right:10px">
127
+ <div class="checkbox cml_field">
128
+ <div class="cml_row"><label class="">
129
+ <input name="u12345[categories]" class="categories" type="checkbox" value="connected" /> Connected <i>The comment reflects that the website allows you to connect or reconnect with friends</i>
130
+ </label></div>
131
+ </div>
132
+ </div>
133
+ <div style="float:left">
134
+ <div class="checkbox cml_field">
135
+ <div class="cml_row"><label class="">
136
+ <input name="u12345[categories]" class="categories" type="checkbox" value="privacy" /> Privacy <i>The comment mentions privacy, privacy settings or the ability to control user privacy</i>
137
+ </label></div>
138
+ </div>
139
+ </div>
140
+ </div>
141
+ <div class="checkboxes cml_field">
142
+ <h2 class="legend">foo</h2>
143
+ <div class="cml_row"><label class="">
144
+ <input name="u12345[foo][]" class="foo" type="checkbox" value="shit" /> shit
145
+ </label></div>
146
+ </div>
147
+ <br style="clear:both" />
148
+ </div>
149
+ HTML
150
+ end
151
+
152
+ it "should ignore name attribute on checkbox elements inside of checkboxes element" do
153
+ pending "This needs more thought. Don't break existing jobs if possible."
154
+ cml = <<-HTML
155
+ <cml:checkboxes label="Cool checkboxes">
156
+ <cml:checkbox label="Wanna do it?" name="broken"/>
157
+ </cml:checkboxes>
158
+ HTML
159
+ @p = Parser.new(cml, :prefix => "u12345")
160
+ @p.to_html.should sorta_match(<<-HTML)
161
+ <div class="cml" id="u12345">
162
+ <div class="checkboxes cml_field">
163
+ <h2 class="legend">Cool checkboxes</h2>
164
+ <div class="cml_row"><label class="">
165
+ <input type="checkbox" value="Wanna do it?" name="u12345[cool_checkboxes][]" class="cool_checkboxes"/> Wanna do it?
166
+ </label></div>
167
+ </div>
168
+ </div>
169
+ HTML
170
+ end
171
+ end
@@ -0,0 +1,108 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe "CML Select" do
4
+ it "should render group" do
5
+ cml = <<-HTML
6
+ <cml:group only-if="awesome[1]" class="nice" multiple="true">
7
+ <cml:checkboxes label="Cool checkboxes" name="rad" gold="true">
8
+ <cml:checkbox label="Wanna do it?"/>
9
+ <cml:checkbox label="Sure?"/>
10
+ </cml:checkboxes>
11
+ <cml:text label="Something" aggregation="all"/>
12
+ <cml:group multiple="true">
13
+ <div>
14
+ <cml:text label="nuts"/>
15
+ </div>
16
+ </cml:group>
17
+ </cml:group>
18
+ <cml:text label="Sweet" gold="true">
19
+ HTML
20
+ @p = Parser.new(cml, :prefix => "u12345")
21
+ #@p.fields.should == {"something_1" => "all"}
22
+ #@p.golds.should == {"sweet" => "sweet_gold", "rad_1" => "rad_1_gold"}
23
+ #puts Parser.escape(@p.to_html).gsub(/\n/,"<br/>")
24
+ @p.to_html.should sorta_match(<<-HTML)
25
+ <div class="cml" id="u12345">
26
+ <div class="group logic-only-if:awesome[1] multiple column nice">
27
+ <div class="checkboxes cml_field">
28
+ <h2 class="legend">Cool checkboxes</h2>
29
+ <div class="cml_row"><label class="">
30
+ <input name="u12345[rad_1][]" class="rad_1" type="checkbox" value="Wanna do it?" /> Wanna do it?
31
+ </label></div>
32
+ <div class="cml_row"><label class="">
33
+ <input name="u12345[rad_1][]" class="rad_1" type="checkbox" value="Sure?" /> Sure?
34
+ </label></div>
35
+ </div>
36
+ <div class="text cml_field">
37
+ <label class="legend">Something</label>
38
+ <div class="cml_row"><input name="u12345[something_1]" class="something_1" type="text" value="" /></div>
39
+ </div>
40
+ <div class="group multiple columnlist">
41
+ <div>
42
+ <div class="text cml_field">
43
+ <label class="legend">nuts</label>
44
+ <div class="cml_row"><input name="u12345[nuts_1][]" class="nuts_1" type="text" value="" /></div>
45
+ </div>
46
+ </div>
47
+ </div>
48
+ </div>
49
+ <div class="text cml_field">
50
+ <label class="legend">Sweet</label>
51
+ <div class="cml_row"><input name="u12345[sweet]" class="sweet" type="text" value="" /></div>
52
+ </div>
53
+ </div>
54
+ HTML
55
+ end
56
+
57
+ it "renders nested groups" do
58
+ cml = <<-HTML
59
+ <cml:group>
60
+ <cml:checkboxes label="Cool checkboxes" name="rad" gold="true">
61
+ <cml:checkbox label="Wanna do it?"/>
62
+ <cml:checkbox label="Sure?"/>
63
+ </cml:checkboxes>
64
+ <cml:text label="Something" aggregation="all"/>
65
+ <cml:group multiple="true">
66
+ <cml:text label="G1" />
67
+ <cml:text label="G2" />
68
+ </cml:group>
69
+ </cml:group>
70
+ <cml:text label="Sweet" gold="true">
71
+ HTML
72
+ @p = Parser.new(cml, :prefix => "u12345")
73
+ # puts Parser.escape(@p.to_html).gsub(/\n/,"<br/>")
74
+ @p.to_html.should sorta_match(<<-HTML)
75
+ <div class="cml" id="u12345">
76
+ <div class="group">
77
+ <div class="checkboxes cml_field">
78
+ <h2 class="legend">Cool checkboxes</h2>
79
+ <div class="cml_row"><label class="">
80
+ <input name="u12345[rad][]" class="rad" type="checkbox" value="Wanna do it?" /> Wanna do it?
81
+ </label></div>
82
+ <div class="cml_row"><label class="">
83
+ <input name="u12345[rad][]" class="rad" type="checkbox" value="Sure?" /> Sure?
84
+ </label></div>
85
+ </div>
86
+ <div class="text cml_field">
87
+ <label class="legend">Something</label>
88
+ <div class="cml_row"><input name="u12345[something]" class="something" type="text" value="" /></div>
89
+ </div>
90
+ <div class="group multiple list">
91
+ <div class="text cml_field">
92
+ <label class="legend">G1</label>
93
+ <div class="cml_row"><input name="u12345[g1][]" class="g1" value="" type="text" /></div>
94
+ </div>
95
+ <div class="text cml_field">
96
+ <label class="legend">G2</label>
97
+ <div class="cml_row"><input name="u12345[g2][]" class="g2" value="" type="text" /></div>
98
+ </div>
99
+ </div>
100
+ </div>
101
+ <div class="text cml_field">
102
+ <label class="legend">Sweet</label>
103
+ <div class="cml_row"><input name="u12345[sweet]" class="sweet" type="text" value="" /></div>
104
+ </div>
105
+ </div>
106
+ HTML
107
+ end
108
+ end
@@ -0,0 +1,17 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe "CML Hidden" do
4
+ it "should render basic hidden field" do
5
+ cml = <<-HTML
6
+ <cml:hidden name="secret" value="shit"/>
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="hidden cml_field">
12
+ <input type="hidden" value="shit" name="u12345[secret]" class="secret"/>
13
+ </div>
14
+ </div>
15
+ HTML
16
+ end
17
+ end
@@ -0,0 +1,259 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe "CML Iterate" do
4
+ it "should render iterate field without missed stuff" do
5
+ cml = <<-HTML
6
+ <cml:iterate on="secret">
7
+ Something {{ index_me}}
8
+ <b>{{secret}}</b> {{ dont_index_me }}
9
+ <cml:checkboxes label="bar" gold="true">
10
+ <cml:checkbox label="ooga" />
11
+ <cml:checkbox label="booga" />
12
+ <cml:checkbox label="boo" />
13
+ </cml:checkboxes>
14
+ <cml:radios label="foo">
15
+ <cml:radio label="nice"/>
16
+ <cml:radio label="neat"/>
17
+ </cml:radios>
18
+ <cml:ratings label="Racy" points="2">
19
+ </cml:iterate>
20
+ HTML
21
+ @p = Parser.new(cml, :prefix => "u12345", :data => {"secret" => [1,2], "index_me" => [3,4], "dont_index_me" => "foo", "bar_gold_reason" => ["Because you are wrong!","Because you are wrong!"] })
22
+ @p2 = Parser.new(cml, :prefix => "u12345")
23
+ #Auto add the structured flag
24
+ #puts Parser.escape(@p.to_html)
25
+ @p2.golds.should == {"_bar_gold_structured" => true, "bar"=>"bar_gold"}
26
+ @p2.golds(false, :no_meta => true).should == {"bar"=>"bar_gold"}
27
+ @p.to_html.should sorta_match(<<-HTML)
28
+ <div class="cml" id="u12345">
29
+ <div class="iterate">
30
+ <div class="cml_nugget">
31
+ Something {{ index_me[0] }}
32
+ <b>{{ secret[0] }}</b> {{ dont_index_me }}
33
+ <div class="checkboxes cml_field">
34
+ <h2 class="legend">bar</h2>
35
+ <div class="cml_row"><label class="">
36
+ <input name="u12345[bar][0][]" class="bar" value="ooga" type="checkbox" /> ooga</label></div>
37
+ <div class="cml_row"><label class="">
38
+ <input name="u12345[bar][0][]" class="bar" value="booga" type="checkbox" /> booga</label></div>
39
+ <div class="cml_row"><label class="">
40
+ <input name="u12345[bar][0][]" class="bar" value="boo" type="checkbox" /> boo</label></div>
41
+ </div>
42
+ <div class="radios cml_field">
43
+ <h2 class="legend">foo</h2>
44
+ <div class="cml_row"><label class="">
45
+ <input name="u12345[foo][0]" class="foo" value="nice" type="radio" /> nice</label></div>
46
+ <div class="cml_row"><label class="">
47
+ <input name="u12345[foo][0]" class="foo" value="neat" type="radio" /> neat</label></div>
48
+ </div>
49
+ <div class="ratings cml_field">
50
+ <h2 class="legend">Racy</h2>
51
+ <div class="cml_row">
52
+ <table>
53
+ <thead> <tr> <th></th> <th class="">1</th> <th class="">2</th> <th></th> </tr> </thead>
54
+ <tbody> <tr> <td></td> <td class=""><input name="u12345[racy][0]" class="racy" type="radio" value="1" /> </td> <td class=""><input name="u12345[racy][0]" class="racy" type="radio" value="2" /> </td> <td></td> </tr> </tbody>
55
+ </table>
56
+ </div>
57
+ </div>
58
+ </div>
59
+ <div class="cml_nugget">
60
+ Something {{ index_me[1] }}
61
+ <b>{{ secret[1] }}</b> {{ dont_index_me }}
62
+ <div class="checkboxes cml_field">
63
+ <h2 class="legend">bar</h2>
64
+ <div class="cml_row"><label class="">
65
+ <input name="u12345[bar][1][]" class="bar" value="ooga" type="checkbox" /> ooga</label></div>
66
+ <div class="cml_row"><label class="">
67
+ <input name="u12345[bar][1][]" class="bar" value="booga" type="checkbox" /> booga</label></div>
68
+ <div class="cml_row"><label class="">
69
+ <input name="u12345[bar][1][]" class="bar" value="boo" type="checkbox" /> boo</label></div>
70
+ </div>
71
+ <div class="radios cml_field">
72
+ <h2 class="legend">foo</h2>
73
+ <div class="cml_row"><label class="">
74
+ <input name="u12345[foo][1]" class="foo" value="nice" type="radio" /> nice</label></div>
75
+ <div class="cml_row"><label class="">
76
+ <input name="u12345[foo][1]" class="foo" value="neat" type="radio" /> neat</label></div>
77
+ </div>
78
+ <div class="ratings cml_field">
79
+ <h2 class="legend">Racy</h2>
80
+ <div class="cml_row">
81
+ <table>
82
+ <thead> <tr> <th></th> <th class="">1</th> <th class="">2</th> <th></th> </tr> </thead>
83
+ <tbody> <tr> <td></td> <td class=""><input name="u12345[racy][1]" class="racy" type="radio" value="1" /> </td> <td class=""><input name="u12345[racy][1]" class="racy" type="radio" value="2" /> </td> <td></td> </tr> </tbody>
84
+ </table>
85
+ </div>
86
+ </div>
87
+ </div>
88
+ </div>
89
+ </div>
90
+ HTML
91
+ end
92
+
93
+ it "should render iterate field with missed data" do
94
+ cml = <<-HTML
95
+ <cml:iterate on="secret">
96
+ Something {{ index_me}}
97
+ <b>{{secret}}</b> {{ dont_index_me }}
98
+ <cml:checkboxes label="bar" gold="true">
99
+ <cml:checkbox label="ooga" />
100
+ <cml:checkbox label="booga" />
101
+ <cml:checkbox label="boo" />
102
+ </cml:checkboxes>
103
+ <cml:radios label="foo">
104
+ <cml:radio label="nice"/>
105
+ <cml:radio label="neat" checked="checked"/>
106
+ </cml:radios>
107
+ <cml:ratings label="Racy" points="2">
108
+ </cml:iterate>
109
+ HTML
110
+ @p = Parser.new(cml, :prefix => "u12345", :data => {"secret" => [1,2], "index_me" => [3,4], "dont_index_me" => "foo", "bar_gold_reason" => ["Because you are wrong!","Because you are wrong!"] }, :missed => {"structured" => [{"bar" => ["ooga",["booga"]], "racy" => ["1",["2"]] },{}] })
111
+ #Auto add the structured flag
112
+ #puts Parser.escape(@p.to_html)
113
+ @p.to_html.should sorta_match(<<-HTML)
114
+ <div class="cml" id="u12345">
115
+ <div class="iterate">
116
+ <div class="cml_nugget">
117
+ Something {{ index_me[0] }}
118
+ <b>{{ secret[0] }}</b> {{ dont_index_me }}
119
+ <div class="checkboxes cml_field">
120
+ <h2 class="legend">bar</h2>
121
+ <div class="cml_row"><label class="gold_bad">
122
+ <input name="u12345[bar][0][]" class="bar" value="ooga" type="checkbox" /> ooga</label></div>
123
+ <div class="cml_row"><label class="gold_good">
124
+ <input name="u12345[bar][0][]" class="bar" value="booga" type="checkbox" /> booga</label></div>
125
+ <div class="cml_row"><label class="">
126
+ <input name="u12345[bar][0][]" class="bar" value="boo" type="checkbox" /> boo</label></div>
127
+ </div>
128
+ <div class="radios cml_field">
129
+ <h2 class="legend">foo</h2>
130
+ <div class="cml_row"><label class="">
131
+ <input name="u12345[foo][0]" class="foo" value="nice" type="radio" /> nice</label></div>
132
+ <div class="cml_row"><label class="">
133
+ <input name="u12345[foo][0]" class="foo" value="neat" type="radio" /> neat</label></div>
134
+ </div>
135
+ <div class="ratings cml_field">
136
+ <h2 class="legend">Racy</h2>
137
+ <div class="cml_row">
138
+ <table>
139
+ <thead> <tr> <th></th> <th class="gold_bad">1</th> <th class="gold_good">2</th> <th></th> </tr> </thead>
140
+ <tbody> <tr> <td></td> <td class="gold_bad"><input name="u12345[racy][0]" class="racy" type="radio" value="1" /> </td> <td class="gold_good"><input name="u12345[racy][0]" class="racy" type="radio" value="2" /> </td> <td></td> </tr> </tbody>
141
+ </table>
142
+ </div>
143
+ </div>
144
+ </div>
145
+ <div class="reason"><h4>The reason this question was marked wrong is:</h4><p>Because you are wrong!</p></div>
146
+ </div>
147
+ </div>
148
+ HTML
149
+ end
150
+
151
+ it "should handles empty iterations" do
152
+ cml = <<-HTML
153
+ <cml:iterate on="secret">
154
+ Something {{ index_me}}
155
+ <b>{{secret}}</b> {{ dont_index_me }}
156
+ <cml:radios label="foo">
157
+ <cml:radio label="nice"/>
158
+ <cml:radio label="neat"/>
159
+ </cml:radios>
160
+ </cml:iterate>
161
+ HTML
162
+ @p = Parser.new(cml, :prefix => "u12345", :data => {"secret" => [] })
163
+ #puts Parser.escape(@p.to_html)
164
+ @p.to_html.should sorta_match(<<-HTML)
165
+ <div class="cml" id="u12345">
166
+ <div class="iterate">
167
+ <div class="cml_nugget">
168
+ <div class="hidden cml_field">
169
+ <input name="u12345[secret]" class="secret" type="hidden" value="Nothing to iterate" />
170
+ </div>
171
+ </div>
172
+ </div>
173
+ </div>
174
+ HTML
175
+ end
176
+
177
+ it "should normalizes iterations" do
178
+ cml = <<-HTML
179
+ <cml:iterate on="secret">
180
+ Something {{ secret }}
181
+ <cml:radios label="foo" gold="true">
182
+ <cml:radio label="nice"/>
183
+ <cml:radio label="neat"/>
184
+ </cml:radios>
185
+ <cml:text label="nice" gold="naughty_gold" />
186
+ </cml:iterate>
187
+ HTML
188
+ @p = Parser.new(cml, :prefix => "unit[data]", :normalize => true, :data => {"naughty_gold" => [["foo","bar"],nil], "foo_gold" => [nil,"neat"], "naughty_gold_reason" => ["Because",nil], "secret" => ["else", "strange"], :missed => {} })
189
+ #puts Parser.escape(@p.to_html).gsub(/\n/,"<br/>")
190
+ @p.to_html.should sorta_match(<<-HTML)
191
+ <div class="cml" id="unit[data]">
192
+ <div class="iterate">
193
+ <div class="cml_nugget">
194
+ Something {{ secret[0] }}
195
+ <div class="checkboxes cml_field">
196
+ <h2 class="legend">foo</h2>
197
+ <div class="cml_row"><label class="">
198
+ <input name="unit[data][foo_gold][0][]" class="foo_gold" value="nice" type="checkbox" />nice</label>
199
+ </div>
200
+ <div class="cml_row"><label class="">
201
+ <input name="unit[data][foo_gold][0][]" class="foo_gold" value="neat" type="checkbox" />
202
+ neat</label>
203
+ </div>
204
+
205
+ <div class="cml_gold_reason">
206
+ <label class="legend">Reason</label>
207
+ <textarea name="unit[data][foo_gold_reason][]"></textarea>
208
+ </div>
209
+ </div>
210
+ <div class="text cml_field">
211
+ <label class="legend">nice</label>
212
+ <div class="cml_row">
213
+ <input name="unit[data][naughty_gold][0][]" class="naughty_gold cml_gold_loaded" type="text" value="foo" />
214
+ </div>
215
+ <div class="cml_row">
216
+ <input name="unit[data][naughty_gold][0][]" class="naughty_gold cml_gold_loaded" type="text" value="bar" />
217
+ </div>
218
+
219
+ <div class="cml_gold_reason">
220
+ <label class="legend">Reason</label>
221
+ <textarea name="unit[data][naughty_gold_reason][]">Because</textarea>
222
+ </div>
223
+ </div>
224
+ </div>
225
+ <div class="cml_nugget">
226
+ Something {{ secret[1] }}
227
+ <div class="checkboxes cml_field">
228
+ <h2 class="legend">foo</h2>
229
+ <div class="cml_row"><label class="">
230
+ <input name="unit[data][foo_gold][1][]" class="foo_gold" value="nice" type="checkbox" />
231
+ nice</label>
232
+ </div>
233
+ <div class="cml_row"><label class="">
234
+ <input checked="checked" name="unit[data][foo_gold][1][]" class="foo_gold cml_gold_loaded" value="neat" type="checkbox" />
235
+ neat</label>
236
+ </div>
237
+
238
+ <div class="cml_gold_reason">
239
+ <label class="legend">Reason</label>
240
+ <textarea name="unit[data][foo_gold_reason][]"></textarea>
241
+ </div>
242
+ </div>
243
+ <div class="text cml_field">
244
+ <label class="legend">nice</label>
245
+ <div class="cml_row">
246
+ <input name="unit[data][naughty_gold][1][]" class="naughty_gold" type="text" value="" />
247
+ </div>
248
+
249
+ <div class="cml_gold_reason">
250
+ <label class="legend">Reason</label>
251
+ <textarea name="unit[data][naughty_gold_reason][]"></textarea>
252
+ </div>
253
+ </div>
254
+ </div>
255
+ </div>
256
+ </div>
257
+ HTML
258
+ end
259
+ end
@@ -0,0 +1,14 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe "CML Hidden" do
4
+ it "should render basic hidden field" do
5
+ cml = <<-HTML
6
+ <cml:meta name="secret" gold="true"/>
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>
12
+ HTML
13
+ end
14
+ end
@@ -0,0 +1,40 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe "CML MultipleText" do
4
+ it "should render multiple text" do
5
+ cml = <<-HTML
6
+ <cml:multiple_text label="Coolio"/>
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="text multiple list cml_field">
13
+ <label class="legend">Coolio</label>
14
+ <div class="cml_row"><input type="text" value="" name="u12345[coolio][]" class="coolio"/></div>
15
+ </div>
16
+ </div>
17
+ HTML
18
+ end
19
+
20
+ it "should render normalized multiple text" do
21
+ cml = <<-HTML
22
+ <cml:multiple_text label="Coolio" gold="true"/>
23
+ HTML
24
+ @p = Parser.new(cml, :prefix => "u12345", :normalize => true, :data => {"coolio_gold" => ["foo", "bar"]})
25
+ #puts Parser.escape(@p.to_html).gsub(/\n/,"<br/>")
26
+ @p.to_html.should sorta_match(<<-HTML)
27
+ <div class="cml" id="u12345">
28
+ <div class="text multiple list cml_field">
29
+ <label class="legend">Coolio</label>
30
+ <div class="cml_row"><input name="u12345[coolio_gold][]" class="coolio_gold cml_gold_loaded" value="foo" type="text" /></div>
31
+ <div class="cml_row"><input name="u12345[coolio_gold][]" class="coolio_gold cml_gold_loaded" value="bar" type="text" /></div>
32
+ <div class="cml_gold_reason">
33
+ <label class="legend">Reason</label>
34
+ <textarea name="u12345[coolio_gold_reason]"></textarea>
35
+ </div>
36
+ </div>
37
+ </div>
38
+ HTML
39
+ end
40
+ end