cml 1.4.2 → 1.5.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/.rspec +1 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +33 -0
- data/README.rdoc +13 -3
- data/Rakefile +9 -49
- data/cml.gemspec +23 -125
- data/lib/cml/converters/jsawesome.rb +3 -3
- data/lib/cml/gold.rb +12 -7
- data/lib/cml/liquid_filters.rb +4 -0
- data/lib/cml/logic.rb +424 -0
- data/lib/cml/logic_tree/graph.rb +107 -0
- data/lib/cml/logic_tree/solver.rb +43 -0
- data/lib/cml/parser.rb +47 -7
- data/lib/cml/tag.rb +42 -21
- data/lib/cml/tags/checkbox.rb +14 -4
- data/lib/cml/tags/checkboxes.rb +4 -0
- data/lib/cml/tags/group.rb +4 -0
- data/lib/cml/tags/hours.rb +263 -0
- data/lib/cml/tags/iterate.rb +4 -0
- data/lib/cml/tags/meta.rb +4 -0
- data/lib/cml/tags/option.rb +4 -0
- data/lib/cml/tags/radio.rb +13 -4
- data/lib/cml/tags/radios.rb +4 -0
- data/lib/cml/tags/ratings.rb +9 -1
- data/lib/cml/tags/search.rb +8 -2
- data/lib/cml/tags/select.rb +6 -2
- data/lib/cml/tags/taxonomy.rb +148 -0
- data/lib/cml/tags/thumb.rb +4 -0
- data/lib/cml/tags/unknown.rb +4 -0
- data/lib/cml/version.rb +3 -0
- data/lib/cml.rb +3 -0
- data/spec/converters/jsawesome_spec.rb +0 -9
- data/spec/fixtures/logic_broken.cml +5 -0
- data/spec/fixtures/logic_circular.cml +5 -0
- data/spec/fixtures/logic_grouped.cml +7 -0
- data/spec/fixtures/logic_nested.cml +7 -0
- data/spec/fixtures/logic_none.cml +7 -0
- data/spec/fixtures/logic_not_nested.cml +7 -0
- data/spec/liquid_filter_spec.rb +19 -0
- data/spec/logic_depends_on_spec.rb +242 -0
- data/spec/logic_spec.rb +207 -0
- data/spec/logic_tree_graph_spec.rb +465 -0
- data/spec/logic_tree_solver_spec.rb +58 -0
- data/spec/meta_spec.rb +12 -2
- data/spec/show_data_spec.rb +3 -2
- data/spec/spec_helper.rb +22 -6
- data/spec/tags/checkboxes_spec.rb +2 -2
- data/spec/tags/group_spec.rb +5 -5
- data/spec/tags/hours_spec.rb +404 -0
- data/spec/tags/radios_spec.rb +2 -2
- data/spec/tags/ratings_spec.rb +1 -1
- data/spec/tags/select_spec.rb +45 -0
- data/spec/tags/tag_spec.rb +25 -0
- data/spec/tags/taxonomy_spec.rb +112 -0
- data/spec/validation_spec.rb +52 -0
- metadata +112 -17
- data/VERSION +0 -1
@@ -0,0 +1,148 @@
|
|
1
|
+
require 'uri'
|
2
|
+
|
3
|
+
module CML
|
4
|
+
module Tags
|
5
|
+
class Taxonomy < Tag
|
6
|
+
SIMPLE_OPTIONS = ["root-select", "log-search", "multi-select", "select-all"]
|
7
|
+
URL_OPTIONS = ["src", "search-src"]
|
8
|
+
ARRAY_OPTIONS = ["top-level", "selectable", "nonselectable"]
|
9
|
+
|
10
|
+
BareTemplate = <<-HTML.freeze
|
11
|
+
{{inputs}}
|
12
|
+
{{search_log}}
|
13
|
+
<div class="taxonomy_widget_container" {{taxonomy_options}}></div>
|
14
|
+
HTML
|
15
|
+
|
16
|
+
MultiInputTemplate = <<-HTML.freeze
|
17
|
+
<div class="taxonomy_choices">
|
18
|
+
{{inputs}}
|
19
|
+
</div>
|
20
|
+
HTML
|
21
|
+
|
22
|
+
InputTemplate = <<-HTML.freeze
|
23
|
+
<div class="cml_row taxonomy_choice">
|
24
|
+
<input name="{{name}}" type="{{input_type}}" class="{{classes}}" value="{{value}}" />
|
25
|
+
<input name="{{id_name}}" type="{{input_type}}" class="taxonomy_id no_validate" value="{{id_value}}" />
|
26
|
+
</div>
|
27
|
+
HTML
|
28
|
+
|
29
|
+
# The actual search logging is done by the taxonomy widget by adding
|
30
|
+
# input array fields to this div
|
31
|
+
SearchLogTemplate = <<-HTML.freeze
|
32
|
+
<div class="cml_row taxonomy_search" data-name="{{search_log_name}}"></div>
|
33
|
+
HTML
|
34
|
+
|
35
|
+
Template = <<-HTML.freeze
|
36
|
+
{{label}}
|
37
|
+
#{BareTemplate}
|
38
|
+
HTML
|
39
|
+
|
40
|
+
#allow use of the taxonomy tool for browsing without a form input
|
41
|
+
def is_field?
|
42
|
+
!(@attrs["field"] && @attrs["field"].to_s == "false")
|
43
|
+
end
|
44
|
+
|
45
|
+
def in_logic_graph?
|
46
|
+
is_field?
|
47
|
+
end
|
48
|
+
|
49
|
+
def finite_value?
|
50
|
+
true
|
51
|
+
end
|
52
|
+
|
53
|
+
def taxonomy_options
|
54
|
+
cw_data = {}
|
55
|
+
|
56
|
+
(SIMPLE_OPTIONS + ARRAY_OPTIONS).each do |opt|
|
57
|
+
attr_opt = @attrs[opt]
|
58
|
+
cw_data[opt] = attr_opt.to_s if attr_opt
|
59
|
+
end
|
60
|
+
|
61
|
+
URL_OPTIONS.each do |opt|
|
62
|
+
attr_opt = @attrs[opt]
|
63
|
+
cw_data[opt] = URI.escape(attr_opt.to_s) if attr_opt
|
64
|
+
end
|
65
|
+
|
66
|
+
cw_data.map{|opt_name, opt_value| "data-#{opt_name}=\"#{opt_value}\""}.join(" ")
|
67
|
+
end
|
68
|
+
memoize :taxonomy_options
|
69
|
+
|
70
|
+
# Overriden to get the right name prefix/suffix
|
71
|
+
def multi_type
|
72
|
+
@attrs["multi-select"] ? :list : nil
|
73
|
+
end
|
74
|
+
|
75
|
+
def value
|
76
|
+
(@attrs["value"] || (@opts[:data] || {})[name] || "").to_s
|
77
|
+
end
|
78
|
+
|
79
|
+
def id_value
|
80
|
+
( (@opts[:data] || {})[id_name] || "" ).to_s
|
81
|
+
end
|
82
|
+
|
83
|
+
def id_name
|
84
|
+
name(false, "id")
|
85
|
+
end
|
86
|
+
|
87
|
+
def search_log_name
|
88
|
+
name(true, "search_log")
|
89
|
+
end
|
90
|
+
|
91
|
+
def data
|
92
|
+
super.merge({
|
93
|
+
"taxonomy_options" => taxonomy_options,
|
94
|
+
"value" => value,
|
95
|
+
"id_value" => id_value,
|
96
|
+
"id_name" => prefix(id_name),
|
97
|
+
"search_log_name" => search_log_name,
|
98
|
+
"input_type" => "text"
|
99
|
+
})
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
def to_html
|
104
|
+
if is_field?
|
105
|
+
if @opts[:normalize]
|
106
|
+
data_opt = opts[:data] || {}
|
107
|
+
seeds = Array(data_opt[@opts[:parser].golds[name(false)]] || data_opt[name(false)])
|
108
|
+
# Zip in the id values for taxonomy nodes
|
109
|
+
seeds = seeds.zip(data_opt[id_name] || [])
|
110
|
+
seeds << nil if seeds.length == 0
|
111
|
+
|
112
|
+
inputs = seeds.map do |input, p_name|
|
113
|
+
Liquid::Template.parse(InputTemplate).render(data.merge({
|
114
|
+
"value" => input.to_s,
|
115
|
+
"id_value" => p_name.to_s,
|
116
|
+
"classes" => classes+(input ? " cml_gold_loaded" : ""),
|
117
|
+
"input_type" => "text"
|
118
|
+
}))
|
119
|
+
end.join("\n")
|
120
|
+
search_log = ""
|
121
|
+
else
|
122
|
+
search_src = @attrs["search-src"].to_s
|
123
|
+
log_search = @attrs["log-search"].to_s
|
124
|
+
multi_select = @attrs["multi-select"].to_s
|
125
|
+
|
126
|
+
inputs = Liquid::Template.parse(InputTemplate).render(data)
|
127
|
+
inputs = Liquid::Template.parse(MultiInputTemplate).render({"inputs" => inputs}) if !multi_select.empty?
|
128
|
+
|
129
|
+
if !search_src.empty? && !log_search.empty?
|
130
|
+
search_log = Liquid::Template.parse(SearchLogTemplate).render(data)
|
131
|
+
else
|
132
|
+
search_log = ""
|
133
|
+
end
|
134
|
+
end
|
135
|
+
else
|
136
|
+
inputs = ""
|
137
|
+
search_log = ""
|
138
|
+
end
|
139
|
+
|
140
|
+
wrapper(Liquid::Template.parse(Template).render(data.merge({
|
141
|
+
"inputs" => inputs,
|
142
|
+
"search_log" => search_log
|
143
|
+
}), [LiquidFilters]))
|
144
|
+
end
|
145
|
+
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
data/lib/cml/tags/thumb.rb
CHANGED
data/lib/cml/tags/unknown.rb
CHANGED
data/lib/cml/version.rb
ADDED
data/lib/cml.rb
CHANGED
@@ -61,15 +61,6 @@ describe "JSAwesome Converter" do
|
|
61
61
|
@c.convert.should sorta_match(<<-HTML)
|
62
62
|
<cml:textarea label="Street address (eg. 35 W Forth St.)" name="w_forth_st" validates="required" />
|
63
63
|
<cml:text label="City" validates="required" />
|
64
|
-
<cml:text label="State/Province" name="stateprovince" />
|
65
64
|
HTML
|
66
|
-
|
67
|
-
#For some reason can't get this spec to pass... not worth my time right now.
|
68
|
-
#<cml:text label="Zip/Postal Code" name="zippostal_code" />
|
69
|
-
#<cml:text label="Country" validates="required" />
|
70
|
-
#<cml:textarea label="Any extra company or address information?" name="extra_address_information"/>
|
71
|
-
#<cml:checkboxes label="Any issues?" name="any_issues">
|
72
|
-
# <cml:checkbox label="No address could be found even after checking the url or searching the web" name="searching_the_web" />
|
73
|
-
#</cml:checkboxes>
|
74
65
|
end
|
75
66
|
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<cml:checkboxes label="Do you have a name?" name="do_you_have_a_name" validates="required">
|
2
|
+
<cml:checkbox label="Yes" />
|
3
|
+
<cml:checkbox label="No" />
|
4
|
+
</cml:checkboxes>
|
5
|
+
<cml:text label="name" validates="required" only-if="do_you_have_a_name:[yes]" />
|
6
|
+
<cml:text label="age" only-if="do_you_have_a_name:[yes]++name:alpha"/>
|
7
|
+
<cml:text label="foo" only-if="!age||(do_you_have_a_name:[yes]++name)" />
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<cml:checkboxes label="Do you have a name?" name="do_you_have_a_name" validates="required">
|
2
|
+
<cml:checkbox label="Yes" />
|
3
|
+
<cml:checkbox label="No" />
|
4
|
+
</cml:checkboxes>
|
5
|
+
<cml:text label="name" validates="required" only-if="do_you_have_a_name:[yes]" />
|
6
|
+
<cml:text label="age" only-if="do_you_have_a_name:[yes]++name:alpha"/>
|
7
|
+
<cml:text label="foo" only-if="!age||do_you_have_a_name" />
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<cml:checkboxes label="Do you have a name?" name="do_you_have_a_name" validates="required">
|
2
|
+
<cml:checkbox label="Yes" />
|
3
|
+
<cml:checkbox label="No" />
|
4
|
+
</cml:checkboxes>
|
5
|
+
<cml:text label="name" validates="required" />
|
6
|
+
<cml:text label="age" />
|
7
|
+
<cml:text label="foo" only-if="" />
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<cml:checkboxes label="Do you have a name?" name="do_you_have_a_name" validates="required">
|
2
|
+
<cml:checkbox label="Yes" />
|
3
|
+
<cml:checkbox label="No" />
|
4
|
+
</cml:checkboxes>
|
5
|
+
<cml:text label="name" validates="required" only-if="(do_you_have_a_name:[yes])" />
|
6
|
+
<cml:text label="age" />
|
7
|
+
<cml:text label="foo" only-if="" />
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "CML Liquid Filters" do
|
4
|
+
it "allow random" do
|
5
|
+
@p = Liquid::Template.parse(<<-HTML)
|
6
|
+
{% capture my_value %}{{ 3 | random }}{% endcapture %}
|
7
|
+
{% case my_value %}
|
8
|
+
{% when '1' %}
|
9
|
+
One
|
10
|
+
{% when '2' %}
|
11
|
+
Two
|
12
|
+
{% when '0' %}
|
13
|
+
Zero
|
14
|
+
{% endcase %}
|
15
|
+
HTML
|
16
|
+
|
17
|
+
@p.render({}, [LiquidFilters]).should =~ /One|Two|Zero/
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,242 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "CML logic tree dependencies" do
|
4
|
+
|
5
|
+
it "lists a simple only-if selector" do
|
6
|
+
@p = Parser.new(<<-HTML)
|
7
|
+
<cml:text label="OMG" />
|
8
|
+
<cml:checkboxes label="w t f" only-if="omg">
|
9
|
+
<cml:checkbox label="lol" />
|
10
|
+
<cml:checkbox label="rtfm" />
|
11
|
+
</cml:checkboxes>
|
12
|
+
HTML
|
13
|
+
|
14
|
+
dependent_tag_names = @p.logic_tree.nodes['w_t_f'].depends_on.collect {|n| n.tag.name }
|
15
|
+
dependent_tag_names.should == %w{omg}
|
16
|
+
|
17
|
+
dependencies = @p.logic_tree.nodes['w_t_f'].dependencies_on
|
18
|
+
dependencies['||'].should == [{'omg' => [{ :match_key => nil, :is_not => true }]}]
|
19
|
+
dependencies['&&'].should be_nil
|
20
|
+
end
|
21
|
+
|
22
|
+
it "lists an only-if 'not' selector" do
|
23
|
+
@p = Parser.new(<<-HTML)
|
24
|
+
<cml:text label="OMG" />
|
25
|
+
<cml:checkboxes label="w t f" only-if="!omg">
|
26
|
+
<cml:checkbox label="lol" />
|
27
|
+
<cml:checkbox label="rtfm" />
|
28
|
+
</cml:checkboxes>
|
29
|
+
HTML
|
30
|
+
dependent_tag_names = @p.logic_tree.nodes['w_t_f'].depends_on.collect {|n| n.tag.name }
|
31
|
+
dependent_tag_names.should == %w{omg}
|
32
|
+
|
33
|
+
dependencies = @p.logic_tree.nodes['w_t_f'].dependencies_on
|
34
|
+
dependencies['||'].should == [{'omg' => [{ :match_key => nil, :is_not => false }]}]
|
35
|
+
dependencies['&&'].should be_nil
|
36
|
+
end
|
37
|
+
|
38
|
+
it "lists an only-if 'unchecked' selector for checkboxes" do
|
39
|
+
@p = Parser.new(<<-HTML)
|
40
|
+
<cml:checkboxes label="w t f">
|
41
|
+
<cml:checkbox label="lol" />
|
42
|
+
<cml:checkbox label="rtfm" />
|
43
|
+
</cml:checkboxes>
|
44
|
+
<cml:text label="OMG" only-if="w_t_f:unchecked" />
|
45
|
+
HTML
|
46
|
+
dependent_tag_names = @p.logic_tree.nodes['omg'].depends_on.collect {|n| n.tag.name }
|
47
|
+
dependent_tag_names.should == %w{w_t_f}
|
48
|
+
|
49
|
+
dependencies = @p.logic_tree.nodes['omg'].dependencies_on
|
50
|
+
dependencies['||'].should == [{'w_t_f' => [{ :match_key => 'lol', :is_not => true }, { :match_key => 'rtfm', :is_not => true }]}]
|
51
|
+
dependencies['&&'].should be_nil
|
52
|
+
end
|
53
|
+
|
54
|
+
it "lists an only-if 'unchecked' selector for one checkbox" do
|
55
|
+
@p = Parser.new(<<-HTML)
|
56
|
+
<cml:checkbox label="w t f">
|
57
|
+
<cml:text label="OMG" only-if="w_t_f:unchecked" />
|
58
|
+
HTML
|
59
|
+
dependent_tag_names = @p.logic_tree.nodes['omg'].depends_on.collect {|n| n.tag.name }
|
60
|
+
dependent_tag_names.should == %w{w_t_f}
|
61
|
+
|
62
|
+
dependencies = @p.logic_tree.nodes['omg'].dependencies_on
|
63
|
+
dependencies['||'].should == [{'w_t_f' => [{ :match_key => 'true', :is_not => true }]}]
|
64
|
+
dependencies['&&'].should be_nil
|
65
|
+
end
|
66
|
+
|
67
|
+
it "lists an only-if 'not unchecked' selector for one checkbox" do
|
68
|
+
@p = Parser.new(<<-HTML)
|
69
|
+
<cml:checkbox label="w t f">
|
70
|
+
<cml:text label="OMG" only-if="!w_t_f:unchecked" />
|
71
|
+
HTML
|
72
|
+
dependent_tag_names = @p.logic_tree.nodes['omg'].depends_on.collect {|n| n.tag.name }
|
73
|
+
dependent_tag_names.should == %w{w_t_f}
|
74
|
+
|
75
|
+
dependencies = @p.logic_tree.nodes['omg'].dependencies_on
|
76
|
+
dependencies['||'].should == [{'w_t_f' => [{ :match_key => 'true', :is_not => false }]}]
|
77
|
+
dependencies['&&'].should be_nil
|
78
|
+
end
|
79
|
+
|
80
|
+
it "lists complex only-if '&&' selectors" do
|
81
|
+
@p = Parser.new(<<-HTML)
|
82
|
+
<cml:text label="OMG" />
|
83
|
+
<cml:checkboxes label="w t f" only-if="omg">
|
84
|
+
<cml:checkbox label="lol" />
|
85
|
+
<cml:checkbox label="rtfm" />
|
86
|
+
</cml:checkboxes>
|
87
|
+
<cml:radios label="bacon" only-if="omg:[crispy]++w_t_f:[lol]">
|
88
|
+
<cml:radio label="tasty" />
|
89
|
+
<cml:radio label="too meaty" />
|
90
|
+
</cml:radios>
|
91
|
+
HTML
|
92
|
+
dependent_tag_names = @p.logic_tree.nodes['bacon'].depends_on.collect {|n| n.tag.name }
|
93
|
+
dependent_tag_names.should == %w{omg w_t_f}
|
94
|
+
|
95
|
+
dependencies = @p.logic_tree.nodes['bacon'].dependencies_on
|
96
|
+
dependencies['&&'].should be_nil
|
97
|
+
dependencies['||'].should == [{
|
98
|
+
'&&' => [
|
99
|
+
{'omg' => [{ :match_key => 'crispy', :is_not => false }]},
|
100
|
+
{'w_t_f' => [{ :match_key => 'lol', :is_not => false }]}
|
101
|
+
]
|
102
|
+
}]
|
103
|
+
end
|
104
|
+
|
105
|
+
it "lists complex only-if '||' selectors" do
|
106
|
+
@p = Parser.new(<<-HTML)
|
107
|
+
<cml:text label="OMG" />
|
108
|
+
<cml:checkboxes label="w t f" only-if="omg">
|
109
|
+
<cml:checkbox label="lol" />
|
110
|
+
<cml:checkbox label="rtfm" />
|
111
|
+
</cml:checkboxes>
|
112
|
+
<cml:radios label="bacon" only-if="omg:[crispy]||!w_t_f:[lol]">
|
113
|
+
<cml:radio label="tasty" />
|
114
|
+
<cml:radio label="too meaty" />
|
115
|
+
</cml:radios>
|
116
|
+
HTML
|
117
|
+
dependent_tag_names = @p.logic_tree.nodes['bacon'].depends_on.collect {|n| n.tag.name }
|
118
|
+
dependent_tag_names.should == %w{omg w_t_f}
|
119
|
+
|
120
|
+
dependencies = @p.logic_tree.nodes['bacon'].dependencies_on
|
121
|
+
dependencies['&&'].should be_nil
|
122
|
+
dependencies['||'].should == [
|
123
|
+
{'omg' => [{ :match_key => 'crispy', :is_not => false }]},
|
124
|
+
{'w_t_f' => [{ :match_key => 'lol', :is_not => true }]}
|
125
|
+
]
|
126
|
+
end
|
127
|
+
|
128
|
+
it "lists complex nested only-if selectors" do
|
129
|
+
@p = Parser.new(<<-HTML)
|
130
|
+
<cml:text label="OMG" />
|
131
|
+
<cml:checkboxes label="w t f" only-if="omg">
|
132
|
+
<cml:checkbox label="lol" />
|
133
|
+
<cml:checkbox label="rtfm" />
|
134
|
+
</cml:checkboxes>
|
135
|
+
<cml:checkboxes label="f t w" only-if="omg">
|
136
|
+
<cml:checkbox label="lmao" />
|
137
|
+
<cml:checkbox label="rtfm" />
|
138
|
+
</cml:checkboxes>
|
139
|
+
<cml:radios label="bacon" only-if="omg:[crispy]||(w_t_f:[rtfm]++f_t_w:[rtfm]||f_t_w:[lmao])">
|
140
|
+
<cml:radio label="tasty" />
|
141
|
+
<cml:radio label="too meaty" />
|
142
|
+
</cml:radios>
|
143
|
+
HTML
|
144
|
+
dependent_tag_names = @p.logic_tree.nodes['bacon'].depends_on.collect {|n| n.tag.name }
|
145
|
+
dependent_tag_names.should == %w{omg w_t_f f_t_w}
|
146
|
+
|
147
|
+
dependencies = @p.logic_tree.nodes['bacon'].dependencies_on
|
148
|
+
dependencies['&&'].should be_nil
|
149
|
+
dependencies['||'].should == [
|
150
|
+
{'omg' => [{ :match_key => 'crispy', :is_not => false }]},
|
151
|
+
{"||"=>[
|
152
|
+
{'&&' => [
|
153
|
+
{'w_t_f' => [{ :match_key => 'rtfm', :is_not => false }]},
|
154
|
+
{'f_t_w' => [{ :match_key => 'rtfm', :is_not => false }]}
|
155
|
+
]},
|
156
|
+
{'f_t_w' => [{ :match_key => 'lmao', :is_not => false }]}
|
157
|
+
]}
|
158
|
+
]
|
159
|
+
end
|
160
|
+
|
161
|
+
it "is aware of only-if group" do
|
162
|
+
@p = Parser.new(<<-HTML)
|
163
|
+
<cml:text label="OMG" />
|
164
|
+
<cml:group only-if="omg">
|
165
|
+
<cml:checkboxes label="w t f">
|
166
|
+
<cml:checkbox label="lol" />
|
167
|
+
<cml:checkbox label="rtfm" />
|
168
|
+
</cml:checkboxes>
|
169
|
+
<cml:radios label="bacon">
|
170
|
+
<cml:radio label="tasty" />
|
171
|
+
<cml:radio label="too meaty" />
|
172
|
+
</cml:radios>
|
173
|
+
</cml:group>
|
174
|
+
HTML
|
175
|
+
dependent_tag_names = @p.logic_tree.nodes['w_t_f'].depends_on.collect {|n| n.tag.name }
|
176
|
+
dependent_tag_names.should == %w{omg}
|
177
|
+
dependent_tag_names = @p.logic_tree.nodes['bacon'].depends_on.collect {|n| n.tag.name }
|
178
|
+
dependent_tag_names.should == %w{omg}
|
179
|
+
|
180
|
+
dependencies = @p.logic_tree.nodes['w_t_f'].dependencies_on
|
181
|
+
dependencies['||'].should == [{'omg' => [{ :match_key => nil, :is_not => true }]}]
|
182
|
+
dependencies['&&'].should be_nil
|
183
|
+
|
184
|
+
dependencies = @p.logic_tree.nodes['bacon'].dependencies_on
|
185
|
+
dependencies['||'].should == [{'omg' => [{ :match_key => nil, :is_not => true }]}]
|
186
|
+
dependencies['&&'].should be_nil
|
187
|
+
end
|
188
|
+
|
189
|
+
it "is aware of nested only-if group" do
|
190
|
+
@p = Parser.new(<<-HTML)
|
191
|
+
<cml:text label="OMG" />
|
192
|
+
<cml:group only-if="omg">
|
193
|
+
<cml:checkboxes label="w t f">
|
194
|
+
<cml:checkbox label="lol" />
|
195
|
+
<cml:checkbox label="rtfm" />
|
196
|
+
</cml:checkboxes>
|
197
|
+
<cml:group only-if="!w_t_f:[rtfm]">
|
198
|
+
<cml:radios label="bacon">
|
199
|
+
<cml:radio label="tasty" />
|
200
|
+
<cml:radio label="too meaty" />
|
201
|
+
</cml:radios>
|
202
|
+
</cml:group>
|
203
|
+
</cml:group>
|
204
|
+
HTML
|
205
|
+
dependent_tag_names = @p.logic_tree.nodes['w_t_f'].depends_on.collect {|n| n.tag.name }
|
206
|
+
dependent_tag_names.should == %w{omg}
|
207
|
+
dependent_tag_names = @p.logic_tree.nodes['bacon'].depends_on.collect {|n| n.tag.name }
|
208
|
+
dependent_tag_names.should == %w{omg w_t_f}
|
209
|
+
|
210
|
+
dependencies = @p.logic_tree.nodes['w_t_f'].dependencies_on
|
211
|
+
dependencies['||'].should == [
|
212
|
+
{'omg' => [{ :match_key => nil, :is_not => true }]}
|
213
|
+
]
|
214
|
+
dependencies['&&'].should be_nil
|
215
|
+
|
216
|
+
dependencies = @p.logic_tree.nodes['bacon'].dependencies_on
|
217
|
+
dependencies['||'].should == [
|
218
|
+
{'omg' => [{ :match_key => nil, :is_not => true }]},
|
219
|
+
{'w_t_f' => [{ :match_key => 'rtfm', :is_not => true }]}
|
220
|
+
]
|
221
|
+
dependencies['&&'].should be_nil
|
222
|
+
end
|
223
|
+
|
224
|
+
it "lists a simple only-if selector with indexed match" do
|
225
|
+
@p = Parser.new(<<-HTML)
|
226
|
+
<cml:checkboxes label="w t f">
|
227
|
+
<cml:checkbox label="lol" />
|
228
|
+
<cml:checkbox label="rtfm" />
|
229
|
+
</cml:checkboxes>
|
230
|
+
<cml:text label="OMG" only-if="w_t_f:[1]" />
|
231
|
+
HTML
|
232
|
+
|
233
|
+
dependent_tag_names = @p.logic_tree.nodes['omg'].depends_on.collect {|n| n.tag.name }
|
234
|
+
dependent_tag_names.should == %w{w_t_f}
|
235
|
+
|
236
|
+
dependencies = @p.logic_tree.nodes['omg'].dependencies_on
|
237
|
+
dependencies['||'].should == [
|
238
|
+
{'w_t_f' => [{ :match_key => 'rtfm', :is_not => false }]}
|
239
|
+
]
|
240
|
+
end
|
241
|
+
|
242
|
+
end
|