dolores-cml 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.
- 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 +103 -0
- data/lib/cml/converters/jsawesome.rb +102 -0
- data/lib/cml/liquid_filters.rb +7 -0
- data/lib/cml/parser.rb +107 -0
- data/lib/cml/tag.rb +134 -0
- data/lib/cml/tags/checkbox.rb +37 -0
- data/lib/cml/tags/checkboxes.rb +24 -0
- data/lib/cml/tags/group.rb +18 -0
- data/lib/cml/tags/hidden.rb +13 -0
- data/lib/cml/tags/meta.rb +12 -0
- data/lib/cml/tags/option.rb +25 -0
- data/lib/cml/tags/radio.rb +29 -0
- data/lib/cml/tags/radios.rb +24 -0
- data/lib/cml/tags/ratings.rb +42 -0
- data/lib/cml/tags/select.rb +23 -0
- data/lib/cml/tags/text.rb +10 -0
- data/lib/cml/tags/textarea.rb +10 -0
- data/lib/cml/tags/unknown.rb +21 -0
- data/lib/cml.rb +9 -0
- data/spec/complex_spec.rb +53 -0
- data/spec/converters/jsawesome_spec.rb +57 -0
- data/spec/fixtures/complex.cml +22 -0
- data/spec/fixtures/invalid.cml +10 -0
- data/spec/meta_spec.rb +31 -0
- data/spec/sorta_match.rb +41 -0
- data/spec/spec_helper.rb +26 -0
- data/spec/tags/checkbox_spec.rb +98 -0
- data/spec/tags/checkboxes_spec.rb +30 -0
- data/spec/tags/group_spec.rb +35 -0
- data/spec/tags/hidden_spec.rb +15 -0
- data/spec/tags/meta_spec.rb +14 -0
- data/spec/tags/radios_spec.rb +30 -0
- data/spec/tags/select_spec.rb +50 -0
- data/spec/tags/text_spec.rb +36 -0
- data/spec/tags/textarea_spec.rb +18 -0
- data/spec/tags/unknown_spec.rb +19 -0
- data/spec/validation_spec.rb +28 -0
- metadata +140 -0
@@ -0,0 +1,25 @@
|
|
1
|
+
module CML
|
2
|
+
module Tags
|
3
|
+
class Option < Tag
|
4
|
+
Template = <<-HTML.freeze
|
5
|
+
<option {{value}} {{selected}}>{{label}}</option>
|
6
|
+
HTML
|
7
|
+
|
8
|
+
def wrapper(parsed)
|
9
|
+
parsed
|
10
|
+
end
|
11
|
+
|
12
|
+
def value
|
13
|
+
(@attrs["value"] || @attrs["label"]).to_s
|
14
|
+
end
|
15
|
+
|
16
|
+
def data
|
17
|
+
super.merge({
|
18
|
+
"value" => @attrs["value"] ? "value=\"#{@attrs["value"]}\"" : "",
|
19
|
+
"selected" => @attrs["selected"] ? "selected=\"selected\"" : "",
|
20
|
+
"label" => (@attrs["label"] || @cml.inner_html).to_s
|
21
|
+
})
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module CML
|
2
|
+
module Tags
|
3
|
+
class Radio < Tag
|
4
|
+
Template = <<-HTML.freeze
|
5
|
+
<label><input name="{{name}}" type="radio" value="{{value}}" class="{{classes}}" {{checked}}/> {{label}}</label>
|
6
|
+
HTML
|
7
|
+
|
8
|
+
#Radios should always be grouped, but for consistency with checkboxes, we check
|
9
|
+
def grouped?
|
10
|
+
@cml.parent && @cml.parent.name == "radios"
|
11
|
+
end
|
12
|
+
|
13
|
+
def wrapper(parsed)
|
14
|
+
grouped? ? parsed : super
|
15
|
+
end
|
16
|
+
|
17
|
+
def value
|
18
|
+
(@attrs["value"] || @attrs["label"]).to_s
|
19
|
+
end
|
20
|
+
|
21
|
+
def data
|
22
|
+
super.merge({
|
23
|
+
"checked" => @attrs["checked"] ? "checked=\"checked\"" : "",
|
24
|
+
"label" => @attrs["label"].to_s
|
25
|
+
})
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module CML
|
2
|
+
module Tags
|
3
|
+
class Radios < Tag
|
4
|
+
Template = <<-HTML.freeze
|
5
|
+
{{legend}}
|
6
|
+
{% for radio in radios %}
|
7
|
+
{{radio}}
|
8
|
+
{% endfor %}
|
9
|
+
HTML
|
10
|
+
|
11
|
+
def data
|
12
|
+
super.merge({"radios" => children})
|
13
|
+
end
|
14
|
+
|
15
|
+
def children
|
16
|
+
@cml.xpath("cml:radio").map do |c|
|
17
|
+
c["name"] ||= name
|
18
|
+
c["validates"] ||= @attrs["validates"].to_s
|
19
|
+
Radio.new(c, @opts)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module CML
|
2
|
+
module Tags
|
3
|
+
class Ratings < Tag
|
4
|
+
Template = <<-HTML.freeze
|
5
|
+
{{label}}
|
6
|
+
<table>
|
7
|
+
<thead>
|
8
|
+
<tr>
|
9
|
+
<th></th>
|
10
|
+
{% for rating in ratings limit:10 %}
|
11
|
+
<th>{{forloop.index}}</th>
|
12
|
+
{% endfor %}
|
13
|
+
<th></th>
|
14
|
+
</tr>
|
15
|
+
</thead>
|
16
|
+
<tbody>
|
17
|
+
<tr>
|
18
|
+
<td>{{from}}</td>
|
19
|
+
{% for rating in ratings limit:10 %}
|
20
|
+
<td>{{rating}}</td>
|
21
|
+
{% endfor %}
|
22
|
+
<td>{{to}}</td>
|
23
|
+
</tr>
|
24
|
+
</tbody>
|
25
|
+
</table>
|
26
|
+
HTML
|
27
|
+
|
28
|
+
def data
|
29
|
+
super.merge({"ratings" => ratings, "from" => @attrs["from"].to_s, "to" => @attrs["to"].to_s})
|
30
|
+
end
|
31
|
+
|
32
|
+
def ratings
|
33
|
+
@cml.xpath("cml:rating").map do |c|
|
34
|
+
c["name"] ||= prefix
|
35
|
+
c["validates"] ||= @attrs["validates"]
|
36
|
+
c["value"] ||= @attrs["label"]
|
37
|
+
Radio.new(c).convert
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module CML
|
2
|
+
module Tags
|
3
|
+
class Select < Tag
|
4
|
+
Template = <<-HTML.freeze
|
5
|
+
{{label}}
|
6
|
+
<select name="{{name}}" class="{{classes}}">{% for option in options %}
|
7
|
+
{{option}}{% endfor %}
|
8
|
+
</select>
|
9
|
+
HTML
|
10
|
+
|
11
|
+
def children
|
12
|
+
default = @cml["default"] ? [Option.new("<cml:option value=\"\">#{@cml["default"]}</cml:option>", @opts)] : []
|
13
|
+
default + @cml.xpath("cml:option").map do |c|
|
14
|
+
Option.new(c, @opts)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def data
|
19
|
+
super.merge({"options" => children})
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module CML
|
2
|
+
module Tags
|
3
|
+
class Unknown < Tag
|
4
|
+
Template = <<-HTML.freeze
|
5
|
+
{{content}}
|
6
|
+
HTML
|
7
|
+
|
8
|
+
def validate?
|
9
|
+
false
|
10
|
+
end
|
11
|
+
|
12
|
+
def wrapper_classes
|
13
|
+
super + " unknown"
|
14
|
+
end
|
15
|
+
|
16
|
+
def data
|
17
|
+
super.merge({"content" => @cml.inner_html})
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/cml.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "CML Complex" do
|
4
|
+
it "parses" do
|
5
|
+
@p = Parser.new(File.read(File.dirname(__FILE__) + "/fixtures/complex.cml"), {:prefix => "u12345"})
|
6
|
+
@p.to_html.should sorta_match(<<-HTML)
|
7
|
+
<div class="cml" id="u12345">
|
8
|
+
<h1>This is my name</h1>
|
9
|
+
<p>This is a description about me</p>
|
10
|
+
<div class="select">
|
11
|
+
<label>Awesome</label>
|
12
|
+
<select name="u12345[awesome]" class="awesome validates-required">
|
13
|
+
<option value="">Choose an option</option>
|
14
|
+
<option>Awesome</option>
|
15
|
+
<option>Cool</option>
|
16
|
+
<option>Rad</option>
|
17
|
+
<option>Neat</option>
|
18
|
+
</select>
|
19
|
+
<p class="instructions">Just be cool about it</p>
|
20
|
+
</div>
|
21
|
+
<div class="text">
|
22
|
+
<label>Opinion</label>
|
23
|
+
<input name="u12345[opinion]" class="opinion validates-minLength:30 large" type="text" value="">
|
24
|
+
</div>
|
25
|
+
<div class="text">
|
26
|
+
<label>Email</label>
|
27
|
+
<input name="u12345[email]" class="email validates-required validates-email" type="text" value="">
|
28
|
+
</div>
|
29
|
+
<div class="rad">
|
30
|
+
<div class="checkbox">
|
31
|
+
<label><input name="u12345[you_sure]" class="you_sure" type="checkbox" value="yes"> You sure?</label>
|
32
|
+
</div>
|
33
|
+
</div>
|
34
|
+
<div class="group only-if:awesome">
|
35
|
+
|
36
|
+
<div class="checkboxes">
|
37
|
+
<h2 class="legend">Cool checkboxes</h2>
|
38
|
+
|
39
|
+
<label>
|
40
|
+
<input name="u12345[rad][]" class="rad" type="checkbox" value="Wanna do it?">
|
41
|
+
Wanna do it?</label>
|
42
|
+
|
43
|
+
<label>
|
44
|
+
<input name="u12345[rad][]" class="rad" type="checkbox" value="Sure?">
|
45
|
+
Sure?</label>
|
46
|
+
<p class=\"instructions\">This <i>is</i> cool</p>
|
47
|
+
</div>
|
48
|
+
<input type="hidden" name="u12345[secret]" value="cool" class="secret" />
|
49
|
+
</div>
|
50
|
+
</div>
|
51
|
+
HTML
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + "/../../lib/cml/converters/jsawesome")
|
3
|
+
|
4
|
+
describe "JSAwesome Converter" do
|
5
|
+
it "converts" do
|
6
|
+
json = "[[
|
7
|
+
[\"text_field\", \"default value\"],
|
8
|
+
[\"#text_area\", \"\"],
|
9
|
+
[\"single_select\", [\"boo\", \"~yah\"]],
|
10
|
+
[\"^check\", [\"One|totally_rad\", [\"two\",true], \"three\"]],
|
11
|
+
[\"*radio\", [\"a\", \"b\", [\"c\", true]]],
|
12
|
+
[\"_hidden\",\"hot\"],
|
13
|
+
[[\"^single_check\"],[\"^Edge|edge_case\", false]]
|
14
|
+
],
|
15
|
+
{\"text_field\": \"JSAwesome\",
|
16
|
+
\"text_area\": {
|
17
|
+
\"required\":true,
|
18
|
+
\"validation\": [\"\\d+\", \"Field must contain atleast one digit\"],
|
19
|
+
\"label\": \"Input some text with atleast one digit\"
|
20
|
+
},
|
21
|
+
\"single_select\": {
|
22
|
+
\"required\":true
|
23
|
+
},
|
24
|
+
\"gold\": {
|
25
|
+
\"rando\": \"so_cool\",
|
26
|
+
\"check\": \"check_gold\",
|
27
|
+
\"_awesome_gold_strict\": true,
|
28
|
+
\"text_field\": \"awesome_gold\",
|
29
|
+
\"_awesome_gold_regex\": [\"\\\\.asdf\\\\.\", \"i\"]
|
30
|
+
}}]"
|
31
|
+
@c = Converters::JSAwesome.new(json)
|
32
|
+
@c.convert.should sorta_match(<<-HTML)
|
33
|
+
<cml:text name="text_field" label="JSAwesome" default="default value">
|
34
|
+
<gold src="awesome_gold" flags="i" regex="\\.asdf\\." strict="true" />
|
35
|
+
</cml:text>
|
36
|
+
<cml:textarea name="text_area" validates="required" label="Input some text with atleast one digit" />
|
37
|
+
<cml:select label="Single select" validates="required">
|
38
|
+
<cml:option label="Boo" />
|
39
|
+
<cml:option label="Yah" />
|
40
|
+
</cml:select>
|
41
|
+
<cml:checkboxes label="Check" gold="true">
|
42
|
+
<cml:checkbox label="One" name="totally_rad" />
|
43
|
+
<cml:checkbox label="Two" checked="true" />
|
44
|
+
<cml:checkbox label="Three" />
|
45
|
+
</cml:checkboxes>
|
46
|
+
<cml:radios label="Radio">
|
47
|
+
<cml:radio label="A" />
|
48
|
+
<cml:radio label="B" />
|
49
|
+
<cml:radio label="C" checked="true" />
|
50
|
+
</cml:radios>
|
51
|
+
<cml:hidden label="Hidden" value="hot" />
|
52
|
+
<cml:checkbox label="Single check" />
|
53
|
+
<cml:checkbox label="Edge" name="edge_case" default="false" />
|
54
|
+
<cml:meta name="rando" gold="so_cool"/>
|
55
|
+
HTML
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<h1>This is my name</h1>
|
2
|
+
<p>This is a description about me</p>
|
3
|
+
<cml:select label="Awesome" validates="required" default="Choose an option" instructions="Just be cool about it">
|
4
|
+
<cml:gold src="awesome_gold" regex="\\.asdf\\." flags="i" strict="true" />
|
5
|
+
<cml:option label="Awesome" />
|
6
|
+
<cml:option label="Cool" />
|
7
|
+
<cml:option label="Rad" />
|
8
|
+
<cml:option label="Neat" />
|
9
|
+
</cml:select>
|
10
|
+
<cml:text label="Opinion" validates="minLength:30" class="large" />
|
11
|
+
<cml:text label="Email" validates="required email" />
|
12
|
+
<div class="rad">
|
13
|
+
<cml:checkbox label="You sure?" value="yes" gold="true" />
|
14
|
+
</div>
|
15
|
+
<cml:group only-if="awesome">
|
16
|
+
<cml:checkboxes label="Cool checkboxes" name="rad">
|
17
|
+
<cml:instructions>This <i>is</i> great</cml:instructions>
|
18
|
+
<cml:checkbox label="Wanna do it?"/>
|
19
|
+
<cml:checkbox label="Sure?"/>
|
20
|
+
</cml:checkboxes>
|
21
|
+
<cml:hidden name="secret" value="cool"/>
|
22
|
+
</cml:group>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<cml:select label="Awesome">
|
2
|
+
<cml:gold src="awesome_gold" regex="\\.asdf\\." flags="i" strict="true" />
|
3
|
+
<cml:option label="Awesome" />
|
4
|
+
<cml:option label="Rad" />
|
5
|
+
<cml:option label="Rad" />
|
6
|
+
<cml:option label="Neat" />
|
7
|
+
</cml:select>
|
8
|
+
<cml:text label="Opinion" validates="minLength:30" class="large" />
|
9
|
+
<cml:text label="Awesome" validates="required email" />
|
10
|
+
<cml:checkbox label="" value="yes" gold="true" />
|
data/spec/meta_spec.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "CML Gold" do
|
4
|
+
it "should give me da gold & fields" do
|
5
|
+
cml = <<-HTML
|
6
|
+
<cml:checkboxes label="Checkboxes" aggregation="all">
|
7
|
+
<cml:gold src="awesome_gold" regex="\\.asdf\\." flags="i" strict="true" />
|
8
|
+
<cml:checkbox label="Wanna do it?" />
|
9
|
+
<cml:checkbox label="Sure?" />
|
10
|
+
</cml:checkboxes>
|
11
|
+
<cml:checkbox label="No way">
|
12
|
+
<cml:gold />
|
13
|
+
</cml:checkbox>
|
14
|
+
<cml:text name="cool" gold="true" aggregation="agg" />
|
15
|
+
<cml:textarea name="sweet" gold="sweetness" />
|
16
|
+
HTML
|
17
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
18
|
+
@p.golds.should == {
|
19
|
+
"_awesome_gold_strict" => "true",
|
20
|
+
"sweet" => "sweetness",
|
21
|
+
"no_way" => "no_way_gold",
|
22
|
+
"checkboxes" => "awesome_gold",
|
23
|
+
"_awesome_gold_regex" => ["\\.asdf\\.", "i"],
|
24
|
+
"cool" => "cool_gold"
|
25
|
+
}
|
26
|
+
@p.fields.should == {
|
27
|
+
"checkboxes"=>"all",
|
28
|
+
"cool"=>"agg"
|
29
|
+
}
|
30
|
+
end
|
31
|
+
end
|
data/spec/sorta_match.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
class SortaMatch
|
2
|
+
def initialize(dom1,dom2)
|
3
|
+
@nodes1 = Nokogiri::HTML(dom1).xpath("//*").to_a
|
4
|
+
@nodes2 = Nokogiri::HTML(dom2).xpath("//*").to_a
|
5
|
+
@children = []
|
6
|
+
@nodes1.each_with_index { |d,i| @children << [d,@nodes2[i]] }
|
7
|
+
end
|
8
|
+
|
9
|
+
def missed
|
10
|
+
[present(@nodes1[@i]), present(@nodes2[@i])]
|
11
|
+
end
|
12
|
+
|
13
|
+
def present(node)
|
14
|
+
node ? "<#{node.name}#{node.attributes.map {|k,v| " #{k}=\"#{v}\""}}>#{node.children.first if first_text?(node)}" : @why
|
15
|
+
end
|
16
|
+
|
17
|
+
def first_text?(node)
|
18
|
+
node.children.first && node.children.first.text?
|
19
|
+
end
|
20
|
+
|
21
|
+
def matches?
|
22
|
+
@i = 0
|
23
|
+
@children.detect do |a,b|
|
24
|
+
if a.nil? || b.nil?
|
25
|
+
@why = "missing"
|
26
|
+
elsif !a.text?
|
27
|
+
if a.name != b.name
|
28
|
+
@why = "tag"
|
29
|
+
elsif a.attributes.map {|k,v| [k.to_s,v.to_s]} != b.attributes.map {|k,v| [k.to_s,v.to_s]}
|
30
|
+
@why = "attributes"
|
31
|
+
elsif first_text?(b) && a.children.first.to_s.strip != b.children.first.to_s.strip
|
32
|
+
@why = "text"
|
33
|
+
end
|
34
|
+
else
|
35
|
+
@why = nil
|
36
|
+
end
|
37
|
+
@i += 1 unless @why
|
38
|
+
@why
|
39
|
+
end.nil?
|
40
|
+
end
|
41
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
require 'cml'
|
4
|
+
require 'spec'
|
5
|
+
require 'sorta_match'
|
6
|
+
#require 'spec/autorun'
|
7
|
+
include CML
|
8
|
+
|
9
|
+
Spec::Runner.configure do |config|
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
Spec::Matchers.define :sorta_match do |expected|
|
14
|
+
match do |actual|
|
15
|
+
@sm = SortaMatch.new(expected, actual)
|
16
|
+
@sm.matches?
|
17
|
+
end
|
18
|
+
|
19
|
+
failure_message_for_should do |actual|
|
20
|
+
"Expected DOM's to sorta match but they had these differences:\n #{@sm.missed.inspect}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def convert(html)
|
25
|
+
Nokogiri::HTML.fragment(html)
|
26
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "CML Radio" do
|
4
|
+
it "should render basic checkbox" do
|
5
|
+
cml = <<-HTML
|
6
|
+
<cml:checkbox label="Check"/>
|
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="checkbox">
|
12
|
+
<label><input type="checkbox" value="true" name="u12345[check]" class="check"/> Check</label>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
HTML
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should render checkbox custom value" do
|
19
|
+
cml = <<-HTML
|
20
|
+
<cml:checkbox label="Check" value="yes"/>
|
21
|
+
HTML
|
22
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
23
|
+
@p.to_html.should sorta_match(<<-HTML)
|
24
|
+
<div class="cml" id="u12345">
|
25
|
+
<div class="checkbox">
|
26
|
+
<label><input type="checkbox" value="yes" name="u12345[check]" class="check"/> Check</label>
|
27
|
+
</div>
|
28
|
+
</div>
|
29
|
+
HTML
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should render default checkbox" do
|
33
|
+
cml = <<-HTML
|
34
|
+
<cml:checkbox label="Check" default="false"/>
|
35
|
+
HTML
|
36
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
37
|
+
@p.to_html.should sorta_match(<<-HTML)
|
38
|
+
<div class="cml" id="u12345">
|
39
|
+
<div class="checkbox">
|
40
|
+
<input type="hidden" value="false" name="u12345[check]" class="check"/>
|
41
|
+
<label><input type="checkbox" value="true" name="u12345[check]" class="check"/> Check</label>
|
42
|
+
</div>
|
43
|
+
</div>
|
44
|
+
HTML
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should render checkbox with instructions attribute" do
|
48
|
+
cml = <<-HTML
|
49
|
+
<cml:checkbox label="Rad" instructions="Please be careful when you are selecting these."/>
|
50
|
+
HTML
|
51
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
52
|
+
@p.to_html.should sorta_match(<<-HTML)
|
53
|
+
<div class="cml" id="u12345">
|
54
|
+
<div class="checkbox">
|
55
|
+
<label>
|
56
|
+
<input type="checkbox" value="true" name="u12345[rad]" class="rad"/> Rad
|
57
|
+
</label>
|
58
|
+
<p class="instructions">Please be careful when you are selecting these.</p>
|
59
|
+
</div>
|
60
|
+
</div>
|
61
|
+
HTML
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should render gold" do
|
65
|
+
cml = <<-HTML
|
66
|
+
<cml:checkbox label="Rad">
|
67
|
+
<cml:gold src="rad_gold"/>
|
68
|
+
</cml:checkbox>
|
69
|
+
HTML
|
70
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
71
|
+
@p.tags[0].should be_gold
|
72
|
+
@p.to_html.should sorta_match(<<-HTML)
|
73
|
+
<div class="cml" id="u12345">
|
74
|
+
<div class="checkbox">
|
75
|
+
<label><input type="checkbox" value="true" name="u12345[rad]" class="rad"/> Rad</label>
|
76
|
+
</div>
|
77
|
+
</div>
|
78
|
+
HTML
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should render checkbox nested" do
|
82
|
+
cml = <<-HTML
|
83
|
+
<div class="rando">
|
84
|
+
<cml:checkbox label="Rad"/>
|
85
|
+
</div>
|
86
|
+
HTML
|
87
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
88
|
+
@p.to_html.should sorta_match(<<-HTML)
|
89
|
+
<div class="cml" id="u12345">
|
90
|
+
<div class="rando">
|
91
|
+
<div class="checkbox">
|
92
|
+
<label><input type="checkbox" value="true" name="u12345[rad]" class="rad"/> Rad</label>
|
93
|
+
</div>
|
94
|
+
</div>
|
95
|
+
</div>
|
96
|
+
HTML
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,30 @@
|
|
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="Wanna do it?"/>
|
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")
|
13
|
+
@p.to_html.should sorta_match(<<-HTML)
|
14
|
+
<div class="cml" id="u12345">
|
15
|
+
<div class="checkboxes">
|
16
|
+
<h2 class="legend">Cool checkboxes</h2>
|
17
|
+
<label>
|
18
|
+
<input type="checkbox" value="Wanna do it?" name="u12345[cool_checkboxes][]" class="cool_checkboxes"/> Wanna do it?
|
19
|
+
</label>
|
20
|
+
<label>
|
21
|
+
<input type="checkbox" value="Sure?" name="u12345[cool_checkboxes][]" class="cool_checkboxes"/> Sure?
|
22
|
+
</label>
|
23
|
+
<label>
|
24
|
+
<input type="checkbox" value="nope" checked="checked" name="u12345[cool_checkboxes][]" class="cool_checkboxes"/> Sure?
|
25
|
+
</label>
|
26
|
+
</div>
|
27
|
+
</div>
|
28
|
+
HTML
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,35 @@
|
|
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]">
|
7
|
+
<cml:checkboxes label="Cool checkboxes" name="rad">
|
8
|
+
<cml:checkbox label="Wanna do it?"/>
|
9
|
+
<cml:checkbox label="Sure?"/>
|
10
|
+
</cml:checkboxes>
|
11
|
+
<cml:text label="Something"/>
|
12
|
+
</cml:group>
|
13
|
+
HTML
|
14
|
+
@p = Parser.new(cml, :prefix => "u12345")
|
15
|
+
@p.to_html.should sorta_match(<<-HTML)
|
16
|
+
<div class="cml" id="u12345">
|
17
|
+
<div class="group only-if:awesome[1]">
|
18
|
+
<div class="checkboxes">
|
19
|
+
<h2 class="legend">Cool checkboxes</h2>
|
20
|
+
<label>
|
21
|
+
<input name="u12345[rad][]" class="rad" type="checkbox" value="Wanna do it?" /> Wanna do it?
|
22
|
+
</label>
|
23
|
+
<label>
|
24
|
+
<input name="u12345[rad][]" class="rad" type="checkbox" value="Sure?" /> Sure?
|
25
|
+
</label>
|
26
|
+
</div>
|
27
|
+
<div class="text">
|
28
|
+
<label>Something</label>
|
29
|
+
<input name="u12345[something]" class="something" type="text" value="" />
|
30
|
+
</div>
|
31
|
+
</div>
|
32
|
+
</div>
|
33
|
+
HTML
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,15 @@
|
|
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
|
+
<input type="hidden" value="shit" name="u12345[secret]" class="secret"/>
|
12
|
+
</div>
|
13
|
+
HTML
|
14
|
+
end
|
15
|
+
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
|