om 3.1.0 → 3.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/{COMMON_OM_PATTERNS.textile → COMMON_OM_PATTERNS.md} +136 -126
- data/CONTRIBUTING.md +2 -2
- data/GETTING_FANCY.md +153 -0
- data/GETTING_STARTED.md +329 -0
- data/Gemfile +1 -1
- data/History.md +164 -0
- data/LICENSE +15 -20
- data/QUERYING_DOCUMENTS.md +162 -0
- data/README.md +2 -2
- data/UPDATING_DOCUMENTS.md +6 -0
- data/gemfiles/gemfile.rails3 +1 -1
- data/gemfiles/gemfile.rails4 +1 -1
- data/lib/om/version.rb +1 -1
- data/lib/om/xml/dynamic_node.rb +42 -51
- data/lib/tasks/om.rake +1 -1
- data/om.gemspec +1 -2
- data/spec/integration/differentiated_elements_spec.rb +2 -2
- data/spec/integration/element_value_spec.rb +13 -13
- data/spec/integration/proxies_and_ref_spec.rb +10 -10
- data/spec/integration/querying_documents_spec.rb +20 -27
- data/spec/integration/rights_metadata_integration_example_spec.rb +4 -4
- data/spec/integration/selective_querying_spec.rb +1 -1
- data/spec/integration/serialization_spec.rb +15 -15
- data/spec/integration/set_reentrant_terminology_spec.rb +6 -6
- data/spec/integration/subclass_terminology_spec.rb +8 -8
- data/spec/integration/xpathy_stuff_spec.rb +10 -10
- data/spec/unit/container_spec.rb +27 -27
- data/spec/unit/document_spec.rb +24 -24
- data/spec/unit/dynamic_node_spec.rb +60 -49
- data/spec/unit/named_term_proxy_spec.rb +12 -7
- data/spec/unit/node_generator_spec.rb +4 -4
- data/spec/unit/nokogiri_sanity_spec.rb +17 -18
- data/spec/unit/om_spec.rb +2 -2
- data/spec/unit/template_registry_spec.rb +51 -51
- data/spec/unit/term_builder_spec.rb +45 -44
- data/spec/unit/term_spec.rb +55 -55
- data/spec/unit/term_value_operators_spec.rb +205 -205
- data/spec/unit/term_xpath_generator_spec.rb +33 -36
- data/spec/unit/terminology_builder_spec.rb +50 -47
- data/spec/unit/terminology_spec.rb +92 -92
- data/spec/unit/validation_spec.rb +12 -12
- data/spec/unit/xml_serialization_spec.rb +20 -20
- data/spec/unit/xml_spec.rb +3 -3
- data/spec/unit/xml_terminology_based_solrizer_spec.rb +18 -18
- metadata +11 -38
- data/GETTING_FANCY.textile +0 -145
- data/GETTING_STARTED.textile +0 -254
- data/History.textile +0 -186
- data/QUERYING_DOCUMENTS.textile +0 -139
- data/UPDATING_DOCUMENTS.textile +0 -3
data/spec/unit/om_spec.rb
CHANGED
@@ -4,8 +4,8 @@ describe "OM" do
|
|
4
4
|
|
5
5
|
describe "#{}destringify" do
|
6
6
|
it "should recursively change any strings beginning with : to symbols and any number strings to integers" do
|
7
|
-
OM.destringify( [{":person"=>"0"}, ":last_name"] ).
|
8
|
-
OM.destringify( [{"person"=>"3"}, "last_name"] ).
|
7
|
+
expect(OM.destringify( [{":person"=>"0"}, ":last_name"] )).to eq([{:person=>0}, :last_name])
|
8
|
+
expect(OM.destringify( [{"person"=>"3"}, "last_name"] )).to eq([{:person=>3}, :last_name])
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
@@ -38,189 +38,189 @@ describe "OM::XML::TemplateRegistry" do
|
|
38
38
|
|
39
39
|
describe "template definitions" do
|
40
40
|
it "should contain predefined templates" do
|
41
|
-
RegistryTest.template_registry.node_types.
|
42
|
-
RegistryTest.template_registry.node_types.
|
41
|
+
expect(RegistryTest.template_registry.node_types).to include(:person)
|
42
|
+
expect(RegistryTest.template_registry.node_types).not_to include(:zombie)
|
43
43
|
end
|
44
44
|
|
45
45
|
it "should define new templates" do
|
46
|
-
RegistryTest.template_registry.node_types.
|
46
|
+
expect(RegistryTest.template_registry.node_types).not_to include(:zombie)
|
47
47
|
RegistryTest.define_template :zombie do |xml,name|
|
48
48
|
xml.monster(:wants => 'braaaaainz') do
|
49
49
|
xml.text(name)
|
50
50
|
end
|
51
51
|
end
|
52
|
-
RegistryTest.template_registry.node_types.
|
52
|
+
expect(RegistryTest.template_registry.node_types).to include(:zombie)
|
53
53
|
end
|
54
54
|
|
55
55
|
it "should instantiate a detached node from a template" do
|
56
56
|
node = RegistryTest.template_registry.instantiate(:zombie, 'Zeke')
|
57
57
|
expectation = Nokogiri::XML('<monster wants="braaaaainz">Zeke</monster>').root
|
58
|
-
node.
|
58
|
+
expect(node).to be_equivalent_to(expectation)
|
59
59
|
end
|
60
60
|
|
61
61
|
it "should raise an error when trying to instantiate an unknown node_type" do
|
62
|
-
|
62
|
+
expect { RegistryTest.template_registry.instantiate(:demigod, 'Hercules') }.to raise_error(NameError)
|
63
63
|
end
|
64
64
|
|
65
65
|
it "should raise an exception if a missing method name doesn't match a node_type" do
|
66
|
-
|
66
|
+
expect { RegistryTest.template_registry.demigod('Hercules') }.to raise_error(NameError)
|
67
67
|
end
|
68
68
|
|
69
69
|
it "should undefine existing templates" do
|
70
|
-
RegistryTest.template_registry.node_types.
|
70
|
+
expect(RegistryTest.template_registry.node_types).to include(:zombie)
|
71
71
|
RegistryTest.template_registry.undefine :zombie
|
72
|
-
RegistryTest.template_registry.node_types.
|
72
|
+
expect(RegistryTest.template_registry.node_types).not_to include(:zombie)
|
73
73
|
end
|
74
74
|
|
75
75
|
it "should complain if the template name isn't a symbol" do
|
76
|
-
lambda { RegistryTest.template_registry.define("die!") { |xml| xml.this_never_happened } }.
|
76
|
+
expect(lambda { RegistryTest.template_registry.define("die!") { |xml| xml.this_never_happened } }).to raise_error(TypeError)
|
77
77
|
end
|
78
78
|
|
79
79
|
it "should report on whether a given template is defined" do
|
80
|
-
RegistryTest.template_registry.has_node_type?(:person).
|
81
|
-
RegistryTest.template_registry.has_node_type?(:zombie).
|
80
|
+
expect(RegistryTest.template_registry.has_node_type?(:person)).to eq true
|
81
|
+
expect(RegistryTest.template_registry.has_node_type?(:zombie)).to eq false
|
82
82
|
end
|
83
83
|
|
84
84
|
it "should include defined node_types as method names for introspection" do
|
85
|
-
RegistryTest.template_registry.methods.
|
85
|
+
expect(RegistryTest.template_registry.methods).to include('person')
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
89
|
describe "template-based document manipulations" do
|
90
90
|
it "should accept a Nokogiri::XML::Node as target" do
|
91
91
|
@test_document.template_registry.after(@test_document.ng_xml.root.elements.first, :person, 'Bob', 'Builder')
|
92
|
-
@test_document.ng_xml.root.elements.length.
|
92
|
+
expect(@test_document.ng_xml.root.elements.length).to eq 2
|
93
93
|
end
|
94
94
|
|
95
95
|
it "should accept a Nokogiri::XML::NodeSet as target" do
|
96
96
|
@test_document.template_registry.after(@test_document.find_by_terms(:person => 0), :person, 'Bob', 'Builder')
|
97
|
-
@test_document.ng_xml.root.elements.length.
|
97
|
+
expect(@test_document.ng_xml.root.elements.length).to eq 2
|
98
98
|
end
|
99
99
|
|
100
100
|
it "should instantiate a detached node from a template using the template name as a method" do
|
101
101
|
node = RegistryTest.template_registry.person('Odin', 'All-Father')
|
102
102
|
expectation = Nokogiri::XML('<person title="All-Father">Odin</person>').root
|
103
|
-
node.
|
103
|
+
expect(node).to be_equivalent_to(expectation)
|
104
104
|
end
|
105
105
|
|
106
106
|
it "should add_child" do
|
107
107
|
return_value = @test_document.template_registry.add_child(@test_document.ng_xml.root, :person, 'Bob', 'Builder')
|
108
|
-
return_value.
|
109
|
-
@test_document.ng_xml.
|
108
|
+
expect(return_value).to eq @test_document.find_by_terms(:person => 1).first
|
109
|
+
expect(@test_document.ng_xml).to be_equivalent_to(@expectations[:after]).respecting_element_order
|
110
110
|
end
|
111
111
|
|
112
112
|
it "should add_next_sibling" do
|
113
113
|
return_value = @test_document.template_registry.add_next_sibling(@test_document.find_by_terms(:person => 0), :person, 'Bob', 'Builder')
|
114
|
-
return_value.
|
115
|
-
@test_document.ng_xml.
|
114
|
+
expect(return_value).to eq @test_document.find_by_terms(:person => 1).first
|
115
|
+
expect(@test_document.ng_xml).to be_equivalent_to(@expectations[:after]).respecting_element_order
|
116
116
|
end
|
117
117
|
|
118
118
|
it "should add_previous_sibling" do
|
119
119
|
return_value = @test_document.template_registry.add_previous_sibling(@test_document.find_by_terms(:person => 0), :person, 'Bob', 'Builder')
|
120
|
-
return_value.
|
121
|
-
@test_document.ng_xml.
|
120
|
+
expect(return_value).to eq(@test_document.find_by_terms(:person => 0).first)
|
121
|
+
expect(@test_document.ng_xml).to be_equivalent_to(@expectations[:before]).respecting_element_order
|
122
122
|
end
|
123
123
|
|
124
124
|
it "should after" do
|
125
125
|
return_value = @test_document.template_registry.after(@test_document.find_by_terms(:person => 0), :person, 'Bob', 'Builder')
|
126
|
-
return_value.
|
127
|
-
@test_document.ng_xml.
|
126
|
+
expect(return_value).to eq(@test_document.find_by_terms(:person => 0).first)
|
127
|
+
expect(@test_document.ng_xml).to be_equivalent_to(@expectations[:after]).respecting_element_order
|
128
128
|
end
|
129
129
|
|
130
130
|
it "should before" do
|
131
131
|
return_value = @test_document.template_registry.before(@test_document.find_by_terms(:person => 0), :person, 'Bob', 'Builder')
|
132
|
-
return_value.
|
133
|
-
@test_document.ng_xml.
|
132
|
+
expect(return_value).to eq(@test_document.find_by_terms(:person => 1).first)
|
133
|
+
expect(@test_document.ng_xml).to be_equivalent_to(@expectations[:before]).respecting_element_order
|
134
134
|
end
|
135
135
|
|
136
136
|
it "should replace" do
|
137
137
|
target_node = @test_document.find_by_terms(:person => 0).first
|
138
138
|
return_value = @test_document.template_registry.replace(target_node, :person, 'Bob', 'Builder')
|
139
|
-
return_value.
|
140
|
-
@test_document.ng_xml.
|
139
|
+
expect(return_value).to eq(@test_document.find_by_terms(:person => 0).first)
|
140
|
+
expect(@test_document.ng_xml).to be_equivalent_to(@expectations[:instead]).respecting_element_order
|
141
141
|
end
|
142
142
|
|
143
143
|
it "should swap" do
|
144
144
|
target_node = @test_document.find_by_terms(:person => 0).first
|
145
145
|
return_value = @test_document.template_registry.swap(target_node, :person, 'Bob', 'Builder')
|
146
|
-
return_value.
|
147
|
-
@test_document.ng_xml.
|
146
|
+
expect(return_value).to eq target_node
|
147
|
+
expect(@test_document.ng_xml).to be_equivalent_to(@expectations[:instead]).respecting_element_order
|
148
148
|
end
|
149
149
|
|
150
150
|
it "should yield the result if a block is given" do
|
151
151
|
target_node = @test_document.find_by_terms(:person => 0).first
|
152
152
|
expectation = Nokogiri::XML('<person xmlns="urn:registry-test" title="Actor">Alice</person>').root
|
153
|
-
@test_document.template_registry.swap(target_node, :person, 'Bob', 'Builder') { |old_node|
|
154
|
-
old_node.
|
153
|
+
expect(@test_document.template_registry.swap(target_node, :person, 'Bob', 'Builder') { |old_node|
|
154
|
+
expect(old_node).to be_equivalent_to(expectation)
|
155
155
|
old_node
|
156
|
-
}.
|
156
|
+
}).to be_equivalent_to(expectation)
|
157
157
|
end
|
158
158
|
end
|
159
159
|
|
160
160
|
describe "document-based document manipulations" do
|
161
161
|
it "should accept a Nokogiri::XML::Node as target" do
|
162
162
|
@test_document.after_node(@test_document.ng_xml.root.elements.first, :person, 'Bob', 'Builder')
|
163
|
-
@test_document.ng_xml.root.elements.length.
|
163
|
+
expect(@test_document.ng_xml.root.elements.length).to eq 2
|
164
164
|
end
|
165
165
|
|
166
166
|
it "should accept a Nokogiri::XML::NodeSet as target" do
|
167
167
|
@test_document.after_node(@test_document.find_by_terms(:person => 0), :person, 'Bob', 'Builder')
|
168
|
-
@test_document.ng_xml.root.elements.length.
|
168
|
+
expect(@test_document.ng_xml.root.elements.length).to eq 2
|
169
169
|
end
|
170
170
|
|
171
171
|
it "should accept a term-pointer array as target" do
|
172
172
|
@test_document.after_node([:person => 0], :person, 'Bob', 'Builder')
|
173
|
-
@test_document.ng_xml.root.elements.length.
|
173
|
+
expect(@test_document.ng_xml.root.elements.length).to eq 2
|
174
174
|
end
|
175
175
|
|
176
176
|
it "should instantiate a detached node from a template" do
|
177
177
|
node = @test_document.template(:person, 'Odin', 'All-Father')
|
178
178
|
expectation = Nokogiri::XML('<person title="All-Father">Odin</person>').root
|
179
|
-
node.
|
179
|
+
expect(node).to be_equivalent_to(expectation)
|
180
180
|
end
|
181
181
|
|
182
182
|
it "should add_child_node" do
|
183
183
|
return_value = @test_document.add_child_node(@test_document.ng_xml.root, :person, 'Bob', 'Builder')
|
184
|
-
return_value.
|
185
|
-
@test_document.ng_xml.
|
184
|
+
expect(return_value).to eq @test_document.find_by_terms(:person => 1).first
|
185
|
+
expect(@test_document.ng_xml).to be_equivalent_to(@expectations[:after]).respecting_element_order
|
186
186
|
end
|
187
187
|
|
188
188
|
it "should add_next_sibling_node" do
|
189
189
|
return_value = @test_document.add_next_sibling_node([:person => 0], :person, 'Bob', 'Builder')
|
190
|
-
return_value.
|
191
|
-
@test_document.ng_xml.
|
190
|
+
expect(return_value).to eq @test_document.find_by_terms(:person => 1).first
|
191
|
+
expect(@test_document.ng_xml).to be_equivalent_to(@expectations[:after]).respecting_element_order
|
192
192
|
end
|
193
193
|
|
194
194
|
it "should add_previous_sibling_node" do
|
195
195
|
return_value = @test_document.add_previous_sibling_node([:person => 0], :person, 'Bob', 'Builder')
|
196
|
-
return_value.
|
197
|
-
@test_document.ng_xml.
|
196
|
+
expect(return_value).to eq @test_document.find_by_terms(:person => 0).first
|
197
|
+
expect(@test_document.ng_xml).to be_equivalent_to(@expectations[:before]).respecting_element_order
|
198
198
|
end
|
199
199
|
|
200
200
|
it "should after_node" do
|
201
201
|
return_value = @test_document.after_node([:person => 0], :person, 'Bob', 'Builder')
|
202
|
-
return_value.
|
203
|
-
@test_document.ng_xml.
|
202
|
+
expect(return_value).to eq @test_document.find_by_terms(:person => 0).first
|
203
|
+
expect(@test_document.ng_xml).to be_equivalent_to(@expectations[:after]).respecting_element_order
|
204
204
|
end
|
205
205
|
|
206
206
|
it "should before_node" do
|
207
207
|
return_value = @test_document.before_node([:person => 0], :person, 'Bob', 'Builder')
|
208
|
-
return_value.
|
209
|
-
@test_document.ng_xml.
|
208
|
+
expect(return_value).to eq @test_document.find_by_terms(:person => 1).first
|
209
|
+
expect(@test_document.ng_xml).to be_equivalent_to(@expectations[:before]).respecting_element_order
|
210
210
|
end
|
211
211
|
|
212
212
|
it "should replace_node" do
|
213
213
|
target_node = @test_document.find_by_terms(:person => 0).first
|
214
214
|
return_value = @test_document.replace_node(target_node, :person, 'Bob', 'Builder')
|
215
|
-
return_value.
|
216
|
-
@test_document.ng_xml.
|
215
|
+
expect(return_value).to eq @test_document.find_by_terms(:person => 0).first
|
216
|
+
expect(@test_document.ng_xml).to be_equivalent_to(@expectations[:instead]).respecting_element_order
|
217
217
|
end
|
218
218
|
|
219
219
|
it "should swap_node" do
|
220
220
|
target_node = @test_document.find_by_terms(:person => 0).first
|
221
221
|
return_value = @test_document.swap_node(target_node, :person, 'Bob', 'Builder')
|
222
|
-
return_value.
|
223
|
-
@test_document.ng_xml.
|
222
|
+
expect(return_value).to eq target_node
|
223
|
+
expect(@test_document.ng_xml).to be_equivalent_to(@expectations[:instead]).respecting_element_order
|
224
224
|
end
|
225
225
|
end
|
226
226
|
|
@@ -34,7 +34,7 @@ describe "OM::XML::Term::Builder" do
|
|
34
34
|
describe '#new' do
|
35
35
|
it "should set terminology_builder attribute if provided" do
|
36
36
|
mock_terminology_builder = double("TerminologyBuilder")
|
37
|
-
OM::XML::Term::Builder.new("term1", mock_terminology_builder).terminology_builder.
|
37
|
+
expect(OM::XML::Term::Builder.new("term1", mock_terminology_builder).terminology_builder).to eq mock_terminology_builder
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
@@ -42,7 +42,7 @@ describe "OM::XML::Term::Builder" do
|
|
42
42
|
it "should set the corresponding .settings value return the mapping object" do
|
43
43
|
[:path, :index_as, :required, :type, :variant_of, :path, :attributes, :default_content_path].each do |method_name|
|
44
44
|
@test_builder.send("#{method_name}=".to_sym, "#{method_name.to_s}foo")
|
45
|
-
@test_builder.settings[method_name].
|
45
|
+
expect(@test_builder.settings[method_name]).to eq "#{method_name.to_s}foo"
|
46
46
|
end
|
47
47
|
end
|
48
48
|
# it "should be chainable" do
|
@@ -59,11 +59,11 @@ describe "OM::XML::Term::Builder" do
|
|
59
59
|
describe "settings" do
|
60
60
|
describe "defaults" do
|
61
61
|
it "should be set" do
|
62
|
-
@test_builder.settings[:required].
|
63
|
-
@test_builder.settings[:type].
|
64
|
-
@test_builder.settings[:variant_of].
|
65
|
-
@test_builder.settings[:attributes].
|
66
|
-
@test_builder.settings[:default_content_path].
|
62
|
+
expect(@test_builder.settings[:required]).to eq false
|
63
|
+
expect(@test_builder.settings[:type]).to eq :string
|
64
|
+
expect(@test_builder.settings[:variant_of]).to be_nil
|
65
|
+
expect(@test_builder.settings[:attributes]).to be_nil
|
66
|
+
expect(@test_builder.settings[:default_content_path]).to be_nil
|
67
67
|
end
|
68
68
|
end
|
69
69
|
end
|
@@ -71,19 +71,19 @@ describe "OM::XML::Term::Builder" do
|
|
71
71
|
describe ".add_child" do
|
72
72
|
it "should insert the given Term Builder into the current Term Builder's children" do
|
73
73
|
@test_builder.add_child(@test_builder_2)
|
74
|
-
@test_builder.children[@test_builder_2.name].
|
74
|
+
expect(@test_builder.children[@test_builder_2.name]).to eq @test_builder_2
|
75
75
|
end
|
76
76
|
end
|
77
77
|
describe ".retrieve_child" do
|
78
78
|
it "should fetch the child identified by the given name" do
|
79
79
|
@test_builder.add_child(@test_builder_2)
|
80
|
-
@test_builder.retrieve_child(@test_builder_2.name).
|
80
|
+
expect(@test_builder.retrieve_child(@test_builder_2.name)).to eq @test_builder.children[@test_builder_2.name]
|
81
81
|
end
|
82
82
|
end
|
83
83
|
describe ".children" do
|
84
84
|
it "should return a hash of Term Builders that are the children of the current object, indexed by name" do
|
85
85
|
@test_builder.add_child(@test_builder_2)
|
86
|
-
@test_builder.children[@test_builder_2.name].
|
86
|
+
expect(@test_builder.children[@test_builder_2.name]).to eq @test_builder_2
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
@@ -95,70 +95,71 @@ describe "OM::XML::Term::Builder" do
|
|
95
95
|
t.type = :text
|
96
96
|
end
|
97
97
|
result = test_builder.build
|
98
|
-
result.
|
99
|
-
result.index_as.
|
100
|
-
result.required.
|
101
|
-
result.type.
|
98
|
+
expect(result).to be_instance_of OM::XML::Term
|
99
|
+
expect(result.index_as).to eq [:facetable, :searchable, :sortable, :displayable]
|
100
|
+
expect(result.required).to eq true
|
101
|
+
expect(result.type).to eq :text
|
102
102
|
|
103
|
-
result.xpath.
|
104
|
-
result.xpath_constrained.
|
105
|
-
result.xpath_relative.
|
103
|
+
expect(result.xpath).to eq OM::XML::TermXpathGenerator.generate_absolute_xpath(result)
|
104
|
+
expect(result.xpath_constrained).to eq OM::XML::TermXpathGenerator.generate_constrained_xpath(result)
|
105
|
+
expect(result.xpath_relative).to eq OM::XML::TermXpathGenerator.generate_relative_xpath(result)
|
106
106
|
end
|
107
107
|
it "should create proxy terms if :proxy is set" do
|
108
108
|
test_builder = OM::XML::Term::Builder.new("my_proxy").tap do |t|
|
109
109
|
t.proxy = [:foo, :bar]
|
110
110
|
end
|
111
111
|
result = test_builder.build
|
112
|
-
result.
|
112
|
+
expect(result).to be_kind_of OM::XML::NamedTermProxy
|
113
113
|
end
|
114
114
|
it "should set path to match name if it is empty" do
|
115
|
-
@test_builder.settings[:path].
|
116
|
-
@test_builder.build.path.
|
115
|
+
expect(@test_builder.settings[:path]).to be_nil
|
116
|
+
expect(@test_builder.build.path).to eq @test_builder.name.to_s
|
117
117
|
end
|
118
118
|
it "should work recursively, calling .build on any of its children" do
|
119
|
-
OM::XML::Term.
|
119
|
+
allow_any_instance_of(OM::XML::Term).to receive(:generate_xpath_queries!)
|
120
120
|
built_child1 = OM::XML::Term.new("child1")
|
121
121
|
built_child2 = OM::XML::Term.new("child2")
|
122
122
|
|
123
123
|
mock1 = double("Builder1", :build => built_child1 )
|
124
124
|
mock2 = double("Builder2", :build => built_child2 )
|
125
|
-
mock1.
|
126
|
-
mock2.
|
125
|
+
allow(mock1).to receive(:name).and_return("child1")
|
126
|
+
allow(mock2).to receive(:name).and_return("child2")
|
127
127
|
|
128
128
|
@test_builder.children = {:mock1=>mock1, :mock2=>mock2}
|
129
129
|
result = @test_builder.build
|
130
|
-
result.children[:child1].
|
131
|
-
result.children[:child2].
|
132
|
-
result.children.length.
|
130
|
+
expect(result.children[:child1]).to eq built_child1
|
131
|
+
expect(result.children[:child2]).to eq built_child2
|
132
|
+
expect(result.children.length).to eq 2
|
133
133
|
end
|
134
134
|
end
|
135
135
|
|
136
136
|
describe ".lookup_refs" do
|
137
137
|
it "should return an empty array if no refs are declared" do
|
138
|
-
@test_builder.lookup_refs.
|
138
|
+
expect(@test_builder.lookup_refs).to eq []
|
139
139
|
end
|
140
140
|
it "should should look up the referenced TermBuilder from the terminology_builder" do
|
141
|
-
@peach.lookup_refs.
|
141
|
+
expect(@peach.lookup_refs).to eq [@stone_fruit]
|
142
142
|
end
|
143
143
|
it "should support recursive refs" do
|
144
|
-
@almond.lookup_refs.
|
144
|
+
expect(@almond.lookup_refs).to eq [@peach, @stone_fruit]
|
145
145
|
end
|
146
146
|
it "should raise an error if the TermBuilder does not have a reference to a terminology builder" do
|
147
|
-
lambda {
|
147
|
+
expect(lambda {
|
148
148
|
OM::XML::Term::Builder.new("referrer").tap do |t|
|
149
149
|
t.ref="bongos"
|
150
150
|
t.lookup_refs
|
151
151
|
end
|
152
|
-
}.
|
152
|
+
}).to raise_error(StandardError,"Cannot perform lookup_ref for the referrer builder. It doesn't have a reference to any terminology builder")
|
153
153
|
end
|
154
|
+
|
154
155
|
it "should raise an error if the referece points to a nonexistent term builder" do
|
155
156
|
tb = OM::XML::Term::Builder.new("mork",@test_terminology_builder).tap do |t|
|
156
157
|
t.ref = [:characters, :aliens]
|
157
158
|
end
|
158
|
-
|
159
|
+
expect { tb.lookup_refs }.to raise_error(OM::XML::Terminology::BadPointerError,"This TerminologyBuilder does not have a root TermBuilder defined that corresponds to \":characters\"")
|
159
160
|
end
|
160
161
|
it "should raise an error with informative error when given circular references" do
|
161
|
-
|
162
|
+
expect { @pineapple.lookup_refs }.to raise_error(OM::XML::Terminology::CircularReferenceError,"Circular reference in Terminology: :pineapple => :banana => :coconut => :pineapple")
|
162
163
|
end
|
163
164
|
end
|
164
165
|
|
@@ -168,8 +169,8 @@ describe "OM::XML::Term::Builder" do
|
|
168
169
|
children_pre = @test_builder.children
|
169
170
|
|
170
171
|
@test_builder.resolve_refs!
|
171
|
-
@test_builder.settings.
|
172
|
-
@test_builder.children.
|
172
|
+
expect(@test_builder.settings).to eq settings_pre
|
173
|
+
expect(@test_builder.children).to eq children_pre
|
173
174
|
end
|
174
175
|
it "should should look up the referenced TermBuilder, use its settings and duplicate its children without changing the name" do
|
175
176
|
term_builder = OM::XML::Term::Builder.new("orange",@test_terminology_builder).tap do |b|
|
@@ -177,24 +178,24 @@ describe "OM::XML::Term::Builder" do
|
|
177
178
|
end
|
178
179
|
term_builder.resolve_refs!
|
179
180
|
# Make sure children and settings were copied
|
180
|
-
term_builder.settings.
|
181
|
-
term_builder.children.
|
181
|
+
expect(term_builder.settings).to eq @citrus.settings.merge(:path=>"citrus")
|
182
|
+
expect(term_builder.children).to eq @citrus.children
|
182
183
|
|
183
184
|
# Make sure name and parent of both the term_builder and its target were left alone
|
184
|
-
term_builder.name.
|
185
|
-
@citrus.name.
|
185
|
+
expect(term_builder.name).to eq :orange
|
186
|
+
expect(@citrus.name).to eq :citrus
|
186
187
|
end
|
187
188
|
it "should set path based on the ref's path if set" do
|
188
189
|
[@peach,@almond].each { |x| x.resolve_refs! }
|
189
|
-
@peach.settings[:path].
|
190
|
-
@almond.settings[:path].
|
190
|
+
expect(@peach.settings[:path]).to eq "prunus"
|
191
|
+
expect(@almond.settings[:path]).to eq "prunus"
|
191
192
|
end
|
192
193
|
it "should set path based on the first ref's name if no path is set" do
|
193
194
|
orange_builder = OM::XML::Term::Builder.new("orange",@test_terminology_builder).tap do |b|
|
194
195
|
b.ref= [:fruit_trees, :citrus]
|
195
196
|
end
|
196
197
|
orange_builder.resolve_refs!
|
197
|
-
orange_builder.settings[:path].
|
198
|
+
expect(orange_builder.settings[:path]).to eq "citrus"
|
198
199
|
end
|
199
200
|
# It should not be a problem if multiple TermBuilders refer to the same child TermBuilder since the parent-child relationship is set up after calling TermBuilder.build
|
200
201
|
it "should result in clean trees of Terms after building"
|
@@ -206,11 +207,11 @@ describe "OM::XML::Term::Builder" do
|
|
206
207
|
b.required =true
|
207
208
|
end
|
208
209
|
tb.resolve_refs!
|
209
|
-
tb.settings.
|
210
|
+
expect(tb.settings).to eq({:path=>"citrus", :attributes=>{"citric_acid"=>"true", :color=>"orange"}, :required=>true, :type=>:string, :index_as=>[:facetable]})
|
210
211
|
end
|
211
212
|
it "should aggregate all settings from refs, combining them with a cascading approach" do
|
212
213
|
@almond.resolve_refs!
|
213
|
-
@almond.settings[:attributes].
|
214
|
+
expect(@almond.settings[:attributes]).to eq({:genus=>"Prunus",:subgenus=>"Amygdalus", :species=>"Prunus dulcis"})
|
214
215
|
end
|
215
216
|
end
|
216
217
|
end
|