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/term_spec.rb
CHANGED
@@ -3,12 +3,12 @@ require 'spec_helper'
|
|
3
3
|
describe OM::XML::Term do
|
4
4
|
describe "without a type" do
|
5
5
|
it "should default to string" do
|
6
|
-
OM::XML::Term.new(:test_term).type.
|
6
|
+
expect(OM::XML::Term.new(:test_term).type).to eq(:string)
|
7
7
|
end
|
8
8
|
end
|
9
9
|
describe "when type is specified" do
|
10
10
|
it "should accept date" do
|
11
|
-
OM::XML::Term.new(:test_term, :type=>:date).type.
|
11
|
+
expect(OM::XML::Term.new(:test_term, :type=>:date).type).to eq :date
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -25,20 +25,20 @@ describe OM::XML::Term do
|
|
25
25
|
|
26
26
|
describe '#new' do
|
27
27
|
it "should set path from mapper name if no path is provided" do
|
28
|
-
@test_name_part.path.
|
28
|
+
expect(@test_name_part.path).to eq "namePart"
|
29
29
|
end
|
30
30
|
it "should populate the xpath values if no options are provided" do
|
31
31
|
local_mapping = OM::XML::Term.new(:namePart)
|
32
|
-
local_mapping.xpath_relative.
|
33
|
-
local_mapping.xpath.
|
34
|
-
local_mapping.xpath_constrained.
|
32
|
+
expect(local_mapping.xpath_relative).to be_nil
|
33
|
+
expect(local_mapping.xpath).to be_nil
|
34
|
+
expect(local_mapping.xpath_constrained).to be_nil
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
38
|
describe 'inner_xml' do
|
39
39
|
it "should be a kind of Nokogiri::XML::Node" do
|
40
40
|
skip
|
41
|
-
@test_mapping.inner_xml.
|
41
|
+
expect(@test_mapping.inner_xml).to be_kind_of(Nokogiri::XML::Node)
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
@@ -57,17 +57,17 @@ describe OM::XML::Term do
|
|
57
57
|
# node = Nokogiri::XML::Document.parse( '<mapper name="first_name" path="namePart"><attribute name="type" value="given"/><attribute name="another_attribute" value="myval"/></mapper>' ).root
|
58
58
|
node = ng_builder.doc.root
|
59
59
|
mapper = OM::XML::Term.from_node(node)
|
60
|
-
mapper.name.
|
61
|
-
mapper.path.
|
62
|
-
mapper.attributes.
|
63
|
-
mapper.internal_xml.
|
60
|
+
expect(mapper.name).to eq :person
|
61
|
+
expect(mapper.path).to eq "name"
|
62
|
+
expect(mapper.attributes).to eq({:type=>"personal"})
|
63
|
+
expect(mapper.internal_xml).to eq node
|
64
64
|
|
65
65
|
child = mapper.children[:first_name]
|
66
66
|
|
67
|
-
child.name.
|
68
|
-
child.path.
|
69
|
-
child.attributes.
|
70
|
-
child.internal_xml.
|
67
|
+
expect(child.name).to eq :first_name
|
68
|
+
expect(child.path).to eq "namePart"
|
69
|
+
expect(child.attributes).to eq({:type=>"given", :another_attribute=>"myval"})
|
70
|
+
expect(child.internal_xml).to eq node.xpath("./mapper").first
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
@@ -79,18 +79,18 @@ describe OM::XML::Term do
|
|
79
79
|
it "should crawl down into mapper children to find the desired term" do
|
80
80
|
mock_role = double("mapper", :children =>{:text=>"the target"})
|
81
81
|
mock_conference = double("mapper", :children =>{:role=>mock_role})
|
82
|
-
@test_name_part.
|
83
|
-
@test_name_part.retrieve_term(:conference, :role, :text).
|
82
|
+
expect(@test_name_part).to receive(:children).and_return({:conference=>mock_conference})
|
83
|
+
expect(@test_name_part.retrieve_term(:conference, :role, :text)).to eq "the target"
|
84
84
|
end
|
85
85
|
it "should return an empty hash if no term can be found" do
|
86
|
-
@test_name_part.retrieve_term(:journal, :issue, :end_page).
|
86
|
+
expect(@test_name_part.retrieve_term(:journal, :issue, :end_page)).to be_nil
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
90
90
|
describe 'inner_xml' do
|
91
91
|
it "should be a kind of Nokogiri::XML::Node" do
|
92
92
|
skip
|
93
|
-
@test_name_part.inner_xml.
|
93
|
+
expect(@test_name_part.inner_xml).to be_kind_of(Nokogiri::XML::Node)
|
94
94
|
end
|
95
95
|
end
|
96
96
|
|
@@ -100,7 +100,7 @@ describe OM::XML::Term do
|
|
100
100
|
|
101
101
|
[:path, :required, :type, :variant_of, :path, :attributes, :default_content_path, :namespace_prefix].each do |method_name|
|
102
102
|
@test_name_part.send((method_name.to_s+"=").to_sym, "#{method_name.to_s}foo")
|
103
|
-
@test_name_part.send(method_name).
|
103
|
+
expect(@test_name_part.send(method_name)).to eq "#{method_name.to_s}foo"
|
104
104
|
end
|
105
105
|
end
|
106
106
|
end
|
@@ -120,76 +120,76 @@ describe OM::XML::Term do
|
|
120
120
|
}
|
121
121
|
|
122
122
|
it "should accept an array as an :index_as value" do
|
123
|
-
subject.terminology.terms[:as_array].index_as.
|
124
|
-
subject.terminology.terms[:as_array].index_as.
|
123
|
+
expect(subject.terminology.terms[:as_array].index_as).to be_a_kind_of(Array)
|
124
|
+
expect(subject.terminology.terms[:as_array].index_as).to eq [:not_searchable]
|
125
125
|
end
|
126
126
|
it "should accept a plain symbol as a value to :index_as" do
|
127
|
-
subject.terminology.terms[:as_symbol].index_as.
|
128
|
-
subject.terminology.terms[:as_symbol].index_as.
|
127
|
+
expect(subject.terminology.terms[:as_symbol].index_as).to be_a_kind_of(Array)
|
128
|
+
expect(subject.terminology.terms[:as_symbol].index_as).to eq [:not_searchable]
|
129
129
|
end
|
130
130
|
end
|
131
131
|
it "should have a .terminology attribute accessor" do
|
132
|
-
@test_volume.
|
133
|
-
@test_volume.
|
132
|
+
expect(@test_volume).to respond_to :terminology
|
133
|
+
expect(@test_volume).to respond_to :terminology=
|
134
134
|
end
|
135
135
|
describe ".ancestors" do
|
136
136
|
it "should return an array of Terms that are the ancestors of the current object, ordered from the top/root of the hierarchy" do
|
137
137
|
@test_volume.set_parent(@test_name_part)
|
138
|
-
@test_volume.ancestors.
|
138
|
+
expect(@test_volume.ancestors).to eq [@test_name_part]
|
139
139
|
end
|
140
140
|
end
|
141
141
|
describe ".parent" do
|
142
142
|
it "should retrieve the immediate parent of the given object from the ancestors array" do
|
143
143
|
@test_name_part.ancestors = ["ancestor1","ancestor2","ancestor3"]
|
144
|
-
@test_name_part.parent.
|
144
|
+
expect(@test_name_part.parent).to eq "ancestor3"
|
145
145
|
end
|
146
146
|
end
|
147
147
|
describe ".children" do
|
148
148
|
it "should return a hash of Terms that are the children of the current object, indexed by name" do
|
149
149
|
@test_volume.add_child(@test_name_part)
|
150
|
-
@test_volume.children[@test_name_part.name].
|
150
|
+
expect(@test_volume.children[@test_name_part.name]).to eq @test_name_part
|
151
151
|
end
|
152
152
|
end
|
153
153
|
describe ".retrieve_child" do
|
154
154
|
it "should fetch the child identified by the given name" do
|
155
155
|
@test_volume.add_child(@test_name_part)
|
156
|
-
@test_volume.retrieve_child(@test_name_part.name).
|
156
|
+
expect(@test_volume.retrieve_child(@test_name_part.name)).to eq @test_volume.children[@test_name_part.name]
|
157
157
|
end
|
158
158
|
end
|
159
159
|
describe ".set_parent" do
|
160
160
|
it "should insert the mapper into the given parent" do
|
161
161
|
@test_name_part.set_parent(@test_volume)
|
162
|
-
@test_name_part.ancestors.
|
163
|
-
@test_volume.children[@test_name_part.name].
|
162
|
+
expect(@test_name_part.ancestors).to include(@test_volume)
|
163
|
+
expect(@test_volume.children[@test_name_part.name]).to eq @test_name_part
|
164
164
|
end
|
165
165
|
end
|
166
166
|
describe ".add_child" do
|
167
167
|
it "should insert the given mapper into the current mappers children" do
|
168
168
|
@test_volume.add_child(@test_name_part)
|
169
|
-
@test_volume.children[@test_name_part.name].
|
170
|
-
@test_name_part.ancestors.
|
169
|
+
expect(@test_volume.children[@test_name_part.name]).to eq @test_name_part
|
170
|
+
expect(@test_name_part.ancestors).to include(@test_volume)
|
171
171
|
end
|
172
172
|
end
|
173
173
|
|
174
174
|
describe "generate_xpath_queries!" do
|
175
175
|
it "should return the current object" do
|
176
|
-
@test_name_part.generate_xpath_queries
|
176
|
+
expect(@test_name_part.generate_xpath_queries!).to eq @test_name_part
|
177
177
|
end
|
178
178
|
it "should regenerate the xpath values" do
|
179
|
-
@test_volume.xpath_relative.
|
180
|
-
@test_volume.xpath.
|
181
|
-
@test_volume.xpath_constrained.
|
179
|
+
expect(@test_volume.xpath_relative).to be_nil
|
180
|
+
expect(@test_volume.xpath).to be_nil
|
181
|
+
expect(@test_volume.xpath_constrained).to be_nil
|
182
182
|
|
183
|
-
@test_volume.generate_xpath_queries
|
183
|
+
expect(@test_volume.generate_xpath_queries!).to eq @test_volume
|
184
184
|
|
185
|
-
@test_volume.xpath_relative.
|
186
|
-
@test_volume.xpath.
|
187
|
-
@test_volume.xpath_constrained.
|
185
|
+
expect(@test_volume.xpath_relative).to eq 'detail[@type="volume"]'
|
186
|
+
expect(@test_volume.xpath).to eq '//detail[@type="volume"]'
|
187
|
+
expect(@test_volume.xpath_constrained).to eq '//detail[@type="volume" and contains(number, "#{constraint_value}")]'.gsub('"', '\"')
|
188
188
|
end
|
189
189
|
it "should trigger update on any child objects" do
|
190
190
|
mock_child = double("child term")
|
191
|
-
mock_child.
|
192
|
-
@test_name_part.
|
191
|
+
expect(mock_child).to receive(:generate_xpath_queries!).exactly(3).times
|
192
|
+
expect(@test_name_part).to receive(:children).and_return({1=>mock_child, 2=>mock_child, 3=>mock_child})
|
193
193
|
@test_name_part.generate_xpath_queries!
|
194
194
|
end
|
195
195
|
end
|
@@ -197,9 +197,9 @@ describe OM::XML::Term do
|
|
197
197
|
describe "#xml_builder_template" do
|
198
198
|
|
199
199
|
it "should generate a template call for passing into the builder block (assumes 'xml' as the argument for the block)" do
|
200
|
-
@test_date.xml_builder_template.
|
201
|
-
@test_person.xml_builder_template.
|
202
|
-
@test_affiliation.xml_builder_template.
|
200
|
+
expect(@test_date.xml_builder_template).to eq 'xml.namePart( \'#{builder_new_value}\', \'type\'=>\'date\' )'
|
201
|
+
expect(@test_person.xml_builder_template).to eq 'xml.namePart( \'#{builder_new_value}\' )'
|
202
|
+
expect(@test_affiliation.xml_builder_template).to eq 'xml.affiliation( \'#{builder_new_value}\' )'
|
203
203
|
end
|
204
204
|
|
205
205
|
it "should accept extra options" do
|
@@ -208,37 +208,37 @@ describe OM::XML::Term do
|
|
208
208
|
e1 = %q{xml.roleTerm( '#{builder_new_value}', 'type'=>'code', 'authority'=>'marcrelator' )}
|
209
209
|
e2 = %q{xml.roleTerm( '#{builder_new_value}', 'authority'=>'marcrelator', 'type'=>'code' )}
|
210
210
|
got = @test_role_code.xml_builder_template(:attributes=>{"authority"=>"marcrelator"})
|
211
|
-
[e1, e2].
|
211
|
+
expect([e1, e2]).to include(got)
|
212
212
|
end
|
213
213
|
|
214
214
|
it "should work for namespaced nodes" do
|
215
215
|
@ical_date = OM::XML::Term.new(:ical_date, :path=>"ical:date")
|
216
|
-
@ical_date.xml_builder_template.
|
216
|
+
expect(@ical_date.xml_builder_template).to eq "xml[\'ical\'].date( '\#{builder_new_value}' )"
|
217
217
|
@ical_date = OM::XML::Term.new(:ical_date, :path=>"date", :namespace_prefix=>"ical")
|
218
|
-
@ical_date.xml_builder_template.
|
218
|
+
expect(@ical_date.xml_builder_template).to eq "xml[\'ical\'].date( '\#{builder_new_value}' )"
|
219
219
|
end
|
220
220
|
|
221
221
|
it "should work for nodes with default_content_path" do
|
222
|
-
@test_volume.xml_builder_template.
|
222
|
+
expect(@test_volume.xml_builder_template).to eq "xml.detail( \'type\'=>'volume' ) { xml.number( '\#{builder_new_value}' ) }"
|
223
223
|
end
|
224
224
|
|
225
225
|
it "should support terms that are attributes" do
|
226
226
|
@type_attribute_term = OM::XML::Term.new(:type_attribute, :path=>{:attribute=>:type})
|
227
|
-
@type_attribute_term.xml_builder_template.
|
227
|
+
expect(@type_attribute_term.xml_builder_template).to eq "xml.@type( '\#{builder_new_value}' )"
|
228
228
|
end
|
229
229
|
|
230
230
|
it "should support terms with namespaced attributes" do
|
231
231
|
@french_title = OM::XML::Term.new(:french_title, :path=>"title", :attributes=>{"xml:lang"=>"fre"})
|
232
|
-
@french_title.xml_builder_template.
|
232
|
+
expect(@french_title.xml_builder_template).to eq "xml.title( '\#{builder_new_value}', 'xml:lang'=>'fre' )"
|
233
233
|
end
|
234
234
|
|
235
235
|
it "should support terms that are namespaced attributes" do
|
236
236
|
@xml_lang_attribute_term = OM::XML::Term.new(:xml_lang_attribute, :path=>{:attribute=>"xml:lang"})
|
237
|
-
@xml_lang_attribute_term.xml_builder_template.
|
237
|
+
expect(@xml_lang_attribute_term.xml_builder_template).to eq "xml.@xml:lang( '\#{builder_new_value}' )"
|
238
238
|
end
|
239
239
|
|
240
240
|
it "should generate a template call for passing into the builder block (assumes 'xml' as the argument for the block) for terms that share a name with an existing method on the builder" do
|
241
|
-
@test_type.xml_builder_template.
|
241
|
+
expect(@test_type.xml_builder_template).to eq 'xml.class_( \'#{builder_new_value}\' )'
|
242
242
|
end
|
243
243
|
end
|
244
244
|
end
|
@@ -1,66 +1,66 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe "OM::XML::TermValueOperators" do
|
4
|
-
|
4
|
+
|
5
5
|
before(:each) do
|
6
6
|
@sample = OM::Samples::ModsArticle.from_xml( fixture( File.join("test_dummy_mods.xml") ) )
|
7
7
|
@article = OM::Samples::ModsArticle.from_xml( fixture( File.join("mods_articles","hydrangea_article1.xml") ) )
|
8
8
|
@empty_sample = OM::Samples::ModsArticle.from_xml("")
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
describe ".term_values" do
|
12
12
|
|
13
13
|
it "should return build an array of values from the nodeset corresponding to the given term" do
|
14
14
|
expected_values = ["Berners-Lee", "Jobs", "Wozniak", "Klimt"]
|
15
15
|
result = @sample.term_values(:person, :last_name)
|
16
|
-
result.length.
|
17
|
-
expected_values.each {|v| result.
|
16
|
+
expect(result.length).to eq expected_values.length
|
17
|
+
expected_values.each {|v| expect(result).to include(v)}
|
18
18
|
end
|
19
19
|
|
20
20
|
it "should look at the index" do
|
21
21
|
result = @sample.term_values(:role, {:text => 3})
|
22
|
-
result.
|
22
|
+
expect(result).to eq ['visionary']
|
23
23
|
end
|
24
24
|
|
25
25
|
it "should ignore whitespace elements for a term pointing to a text() node for an element that contains children" do
|
26
|
-
@article.term_values(:name, :name_content).
|
26
|
+
expect(@article.term_values(:name, :name_content)).to eq ["Describes a person"]
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
end
|
30
|
-
|
31
|
-
|
30
|
+
|
31
|
+
|
32
32
|
describe ".update_values" do
|
33
33
|
it "should update the xml according to the find_by_terms_and_values in the given hash" do
|
34
34
|
terms_attributes = {[{":person"=>"0"}, "affiliation"]=>{'1' => "affiliation1", '2'=> "affiliation2", '3' => "affiliation3"}, [{:person=>1}, :last_name]=>"Andronicus", [{"person"=>"1"},:first_name]=>["Titus"],[{:person=>1},:role]=>["otherrole1","otherrole2"] }
|
35
35
|
result = @article.update_values(terms_attributes)
|
36
|
-
result.
|
36
|
+
expect(result).to eq({"person_0_affiliation"=>["affiliation1", "affiliation2", "affiliation3"], "person_1_last_name"=>["Andronicus"], "person_1_first_name"=>["Titus"], "person_1_role"=>["otherrole1","otherrole2"]})
|
37
37
|
person_0_affiliation = @article.find_by_terms({:person=>0}, :affiliation)
|
38
|
-
person_0_affiliation[0].text.
|
39
|
-
person_0_affiliation[1].text.
|
40
|
-
person_0_affiliation[2].text.
|
41
|
-
|
38
|
+
expect(person_0_affiliation[0].text).to eq "affiliation1"
|
39
|
+
expect(person_0_affiliation[1].text).to eq "affiliation2"
|
40
|
+
expect(person_0_affiliation[2].text).to eq "affiliation3"
|
41
|
+
|
42
42
|
person_1_last_names = @article.find_by_terms({:person=>1}, :last_name)
|
43
|
-
person_1_last_names.length.
|
44
|
-
person_1_last_names.first.text.
|
45
|
-
|
43
|
+
expect(person_1_last_names.length).to eq 1
|
44
|
+
expect(person_1_last_names.first.text).to eq "Andronicus"
|
45
|
+
|
46
46
|
person_1_first_names = @article.find_by_terms({:person=>1}, :first_name)
|
47
|
-
person_1_first_names.first.text.
|
48
|
-
|
47
|
+
expect(person_1_first_names.first.text).to eq "Titus"
|
48
|
+
|
49
49
|
person_1_roles = @article.find_by_terms({:person=>1}, :role)
|
50
|
-
person_1_roles[0].text.
|
51
|
-
person_1_roles[1].text.
|
50
|
+
expect(person_1_roles[0].text).to eq "otherrole1"
|
51
|
+
expect(person_1_roles[1].text).to eq "otherrole2"
|
52
52
|
end
|
53
53
|
|
54
54
|
it "should allow setting a blank string " do
|
55
55
|
@article.update_values([:abstract]=>[''])
|
56
|
-
@article.term_values(:abstract).
|
56
|
+
expect(@article.term_values(:abstract)).to eq [""]
|
57
57
|
end
|
58
58
|
|
59
59
|
it "should call term_value_update if the corresponding node already exists" do
|
60
|
-
@article.
|
60
|
+
expect(@article).to receive(:term_value_update).with('//oxns:titleInfo/oxns:title', 0, "My New Title")
|
61
61
|
@article.update_values( {[:title_info, :main_title] => "My New Title"} )
|
62
62
|
end
|
63
|
-
|
63
|
+
|
64
64
|
it "should call term_values_append if the corresponding node does not already exist or if the requested index is -1" do
|
65
65
|
expected_args = {
|
66
66
|
# :parent_select => OM::Samples::ModsArticle.terminology.xpath_with_indexes(*[{:person=>0}]) ,
|
@@ -69,159 +69,159 @@ describe "OM::XML::TermValueOperators" do
|
|
69
69
|
:template => [:person, :role],
|
70
70
|
:values => "My New Role"
|
71
71
|
}
|
72
|
-
@article.
|
72
|
+
expect(@article).to receive(:term_values_append).with(expected_args).twice
|
73
73
|
@article.update_values( {[{:person=>0}, {:role => 6}] => "My New Role"} )
|
74
74
|
@article.update_values( {[{:person=>0}, {:role => 7}] => "My New Role"} )
|
75
75
|
end
|
76
|
-
|
76
|
+
|
77
77
|
it "should support updating attribute values" do
|
78
78
|
pointer = [:title_info, :language]
|
79
79
|
test_val = "language value"
|
80
80
|
@article.update_values( {pointer=>test_val} )
|
81
|
-
@article.term_values(*pointer).first.
|
81
|
+
expect(@article.term_values(*pointer).first).to eq test_val
|
82
82
|
end
|
83
|
-
|
83
|
+
|
84
84
|
it "should not get tripped up on root nodes" do
|
85
85
|
@article.update_values([:title_info]=>["york", "mangle","mork"])
|
86
|
-
@article.term_values(*[:title_info]).
|
86
|
+
expect(@article.term_values(*[:title_info])).to eq ["york", "mangle", "mork"]
|
87
87
|
end
|
88
88
|
|
89
89
|
it "should destringify the field key/find_by_terms_and_value pointer" do
|
90
90
|
expected_result = {"person_0_role"=>["the role"]}
|
91
|
-
@article.update_values( { [{":person"=>"0"}, "role"]=>"the role" }).
|
92
|
-
@article.update_values( { [{"person"=>"0"}, "role"]=>"the role" }).
|
93
|
-
@article.update_values( { [{:person=>0}, :role]=>"the role" }).
|
91
|
+
expect(@article.update_values( { [{":person"=>"0"}, "role"]=>"the role" })).to eq expected_result
|
92
|
+
expect(@article.update_values( { [{"person"=>"0"}, "role"]=>"the role" })).to eq expected_result
|
93
|
+
expect(@article.update_values( { [{:person=>0}, :role]=>"the role" })).to eq expected_result
|
94
94
|
end
|
95
95
|
|
96
96
|
it "should replace stuff with the same value (in this case 'one')" do
|
97
97
|
@article.update_values( { [{:person=>0}, :role]=>["one"] })
|
98
98
|
@article.update_values( { [{:person=>0}, :role]=>["one", "two"] })
|
99
|
-
@article.term_values( {:person=>0}, :role).
|
99
|
+
expect(@article.term_values( {:person=>0}, :role)).to eq ["one", "two"]
|
100
100
|
end
|
101
|
-
|
101
|
+
|
102
102
|
it "should traverse named term proxies transparently" do
|
103
|
-
@article.term_values( :journal, :issue, :start_page).
|
103
|
+
expect(@article.term_values( :journal, :issue, :start_page)).not_to eq ["108"]
|
104
104
|
@article.update_values( { ["journal", "issue", "start_page"]=>"108" } )
|
105
|
-
@article.term_values( :journal, :issue, :start_page).
|
106
|
-
@article.term_values( :journal, :issue, :pages, :start).
|
105
|
+
expect(@article.term_values( :journal, :issue, :start_page)).to eq ["108"]
|
106
|
+
expect(@article.term_values( :journal, :issue, :pages, :start)).to eq ["108"]
|
107
107
|
end
|
108
|
-
|
108
|
+
|
109
109
|
it "should create the necessary ancestor nodes when necessary" do
|
110
|
-
|
111
|
-
|
110
|
+
expect(@sample.find_by_terms(:person).length).to eq(4)
|
111
|
+
@sample.update_values([{:person=>8}, :role, :text]=>"my role")
|
112
112
|
person_entries = @sample.find_by_terms(:person)
|
113
|
-
person_entries.length.
|
114
|
-
person_entries[4].search("./ns3:role").first.text.
|
115
|
-
|
116
|
-
|
113
|
+
expect(person_entries.length).to eq 5
|
114
|
+
expect(person_entries[4].search("./ns3:role").first.text).to eq "my role"
|
115
|
+
end
|
116
|
+
|
117
117
|
it "should create deep trees of ancestor nodes" do
|
118
118
|
result = @article.update_values( {[{:journal=>0}, {:issue=>3}, :pages, :start]=>"434" })
|
119
|
-
@article.find_by_terms({:journal=>0}, :issue).length.
|
120
|
-
@article.find_by_terms({:journal=>0}, {:issue=>1}, :pages).length.
|
121
|
-
@article.find_by_terms({:journal=>0}, {:issue=>1}, :pages, :start).length.
|
122
|
-
@article.find_by_terms({:journal=>0}, {:issue=>1}, :pages, :start).first.text.
|
119
|
+
expect(@article.find_by_terms({:journal=>0}, :issue).length).to eq 2
|
120
|
+
expect(@article.find_by_terms({:journal=>0}, {:issue=>1}, :pages).length).to eq 1
|
121
|
+
expect(@article.find_by_terms({:journal=>0}, {:issue=>1}, :pages, :start).length).to eq 1
|
122
|
+
expect(@article.find_by_terms({:journal=>0}, {:issue=>1}, :pages, :start).first.text).to eq "434"
|
123
123
|
#Last argument is a filter, we must explicitly pass no filter
|
124
|
-
@article.class.terminology.xpath_with_indexes(:subject, {:topic=>1}, {}).
|
125
|
-
@article.find_by_terms(:subject, {:topic => 1}, {}).text.
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
124
|
+
expect(@article.class.terminology.xpath_with_indexes(:subject, {:topic=>1}, {})).to eq '//oxns:subject/oxns:topic[2]'
|
125
|
+
expect(@article.find_by_terms(:subject, {:topic => 1}, {}).text).to eq "TOPIC 2"
|
126
|
+
end
|
127
|
+
|
128
|
+
it "should accommodate appending term values with apostrophes in them" do
|
129
|
+
expect(@article.find_by_terms(:person, :description)).to be_empty # making sure that there's no description node -- forces a value_append
|
130
130
|
terms_update_hash = {[:person, :description]=>" 'phrul gyi lde mig"}
|
131
131
|
result = @article.update_values(terms_update_hash)
|
132
|
-
@article.term_values(:person, :description).
|
132
|
+
expect(@article.term_values(:person, :description)).to include(" 'phrul gyi lde mig")
|
133
133
|
end
|
134
|
-
|
134
|
+
|
135
135
|
it "should support inserting nodes with namespaced attributes" do
|
136
136
|
@sample.update_values({['title_info', 'french_title']=>'Le Titre'})
|
137
|
-
@sample.term_values('title_info', 'french_title').
|
137
|
+
expect(@sample.term_values('title_info', 'french_title')).to eq ['Le Titre']
|
138
138
|
end
|
139
139
|
|
140
140
|
it "should support inserting attributes" do
|
141
141
|
skip "HYDRA-415"
|
142
142
|
@sample.update_values({['title_info', 'language']=>'Le Titre'})
|
143
|
-
@sample.term_values('title_info', 'french_title').
|
143
|
+
expect(@sample.term_values('title_info', 'french_title')).to eq ['Le Titre']
|
144
144
|
end
|
145
|
-
|
145
|
+
|
146
146
|
it "should support inserting namespaced attributes" do
|
147
147
|
skip "HYDRA-415"
|
148
148
|
@sample.update_values({['title_info', 'main_title', 'main_title_lang']=>'eng'})
|
149
|
-
@sample.term_values('title_info', 'main_title', 'main_title_lang').
|
149
|
+
expect(@sample.term_values('title_info', 'main_title', 'main_title_lang')).to eq ['eng']
|
150
150
|
## After a proxy
|
151
|
-
@article.term_values(:title,:main_title_lang).
|
151
|
+
expect(@article.term_values(:title,:main_title_lang)).to eq ['eng']
|
152
152
|
end
|
153
|
-
|
153
|
+
|
154
154
|
### Examples copied over form nokogiri_datastream_spec
|
155
|
-
|
155
|
+
|
156
156
|
it "should apply submitted hash to corresponding datastream field values" do
|
157
157
|
result = @article.update_values( {[{":person"=>"0"}, "first_name"]=>["Billy", "Bob", "Joe"] })
|
158
|
-
result.
|
158
|
+
expect(result).to eq({"person_0_first_name"=>["Billy", "Bob", "Joe"]})
|
159
159
|
# xpath = ds.class.xpath_with_indexes(*field_key)
|
160
160
|
# result = ds.term_values(xpath)
|
161
|
-
@article.term_values({:person=>0}, :first_name).
|
162
|
-
@article.term_values('//oxns:name[@type="personal"][1]/oxns:namePart[@type="given"]').
|
161
|
+
expect(@article.term_values({:person=>0}, :first_name)).to eq ["Billy","Bob","Joe"]
|
162
|
+
expect(@article.term_values('//oxns:name[@type="personal"][1]/oxns:namePart[@type="given"]')).to eq ["Billy","Bob","Joe"]
|
163
163
|
end
|
164
164
|
it "should support single-value arguments (as opposed to a hash of values with array indexes as keys)" do
|
165
165
|
# In other words, { [:journal, :title_info]=>"dork" } should have the same effect as { [:journal, :title_info]=>{"0"=>"dork"} }
|
166
166
|
result = @article.update_values( { [{":person"=>"0"}, "role"]=>"the role" } )
|
167
|
-
result.
|
168
|
-
@article.term_values({:person=>0}, :role).first.
|
169
|
-
@article.term_values('//oxns:name[@type="personal"][1]/oxns:role').first.
|
167
|
+
expect(result).to eq({"person_0_role"=>["the role"]})
|
168
|
+
expect(@article.term_values({:person=>0}, :role).first).to eq "the role"
|
169
|
+
expect(@article.term_values('//oxns:name[@type="personal"][1]/oxns:role').first).to eq "the role"
|
170
170
|
end
|
171
171
|
it "should do nothing if field key is a string (must be an array or symbol). Will not accept xpath queries!" do
|
172
172
|
xml_before = @article.to_xml
|
173
|
-
@article.update_values( { "fubar"=>"the role" } ).
|
174
|
-
@article.to_xml.
|
173
|
+
expect(@article.update_values( { "fubar"=>"the role" } )).to eq({})
|
174
|
+
expect(@article.to_xml).to eq xml_before
|
175
175
|
end
|
176
176
|
it "should do nothing if there is no term corresponding to the given field key" do
|
177
177
|
xml_before = @article.to_xml
|
178
|
-
@article.update_values( { [{"fubar"=>"0"}]=>"the role" } ).
|
179
|
-
@article.to_xml.
|
178
|
+
expect(@article.update_values( { [{"fubar"=>"0"}]=>"the role" } )).to eq({})
|
179
|
+
expect(@article.to_xml).to eq xml_before
|
180
180
|
end
|
181
|
-
|
182
|
-
it "should work for text fields" do
|
181
|
+
|
182
|
+
it "should work for text fields" do
|
183
183
|
att= {[{"person"=>"0"},"description"]=>["mork", "york"]}
|
184
184
|
result = @article.update_values(att)
|
185
|
-
result.
|
186
|
-
@article.term_values({:person=>0},:description).
|
185
|
+
expect(result).to eq({"person_0_description"=>["mork", "york"]})
|
186
|
+
expect(@article.term_values({:person=>0},:description)).to eq ['mork', 'york']
|
187
187
|
att= {[{"person"=>"0"},{"description" => 2}]=>"dork"}
|
188
188
|
result2 = @article.update_values(att)
|
189
|
-
result2.
|
190
|
-
@article.term_values({:person=>0},:description).
|
189
|
+
expect(result2).to eq({"person_0_description_2"=>["dork"]})
|
190
|
+
expect(@article.term_values({:person=>0},:description)).to eq ['mork', 'york', 'dork']
|
191
191
|
end
|
192
|
-
|
192
|
+
|
193
193
|
it "should append nodes at the specified index if possible" do
|
194
194
|
@article.update_values([:journal, :title_info]=>["all", "for", "the"])
|
195
195
|
att = {[:journal, {:title_info => 3}]=>'glory'}
|
196
196
|
result = @article.update_values(att)
|
197
|
-
result.
|
198
|
-
@article.term_values(:journal, :title_info).
|
197
|
+
expect(result).to eq({"journal_title_info_3"=>["glory"]})
|
198
|
+
expect(@article.term_values(:journal, :title_info)).to eq ["all", "for", "the", "glory"]
|
199
199
|
end
|
200
200
|
|
201
201
|
it "should remove extra nodes if fewer are given than currently exist" do
|
202
202
|
@article.update_values([:journal, :title_info]=>%W(one two three four five))
|
203
203
|
result = @article.update_values({[:journal, :title_info]=>["six", "seven"]})
|
204
|
-
@article.term_values(:journal, :title_info).
|
204
|
+
expect((@article.term_values(:journal, :title_info))).to eq ["six", "seven"]
|
205
205
|
end
|
206
|
-
|
206
|
+
|
207
207
|
it "should append values to the end of the array if the specified index is higher than the length of the values array" do
|
208
208
|
att = {[:journal, :issue, :pages, {:end => 3}]=>'108'}
|
209
|
-
@article.term_values(:journal, :issue, :pages, :end).
|
209
|
+
expect(@article.term_values(:journal, :issue, :pages, :end)).to eq []
|
210
210
|
result = @article.update_values(att)
|
211
|
-
result.
|
212
|
-
@article.term_values(:journal, :issue, :pages, :end).
|
211
|
+
expect(result).to eq({"journal_issue_pages_end_3"=>["108"]})
|
212
|
+
expect(@article.term_values(:journal, :issue, :pages, :end)).to eq ["108"]
|
213
213
|
end
|
214
|
-
|
214
|
+
|
215
215
|
it "should allow deleting of values and should delete values so that to_xml does not return emtpy nodes" do
|
216
216
|
att= {[:journal, :title_info]=>["york", "mangle","mork"]}
|
217
217
|
@article.update_values(att)
|
218
|
-
@article.term_values(:journal, :title_info).
|
219
|
-
|
218
|
+
expect(@article.term_values(:journal, :title_info)).to eq ['york', 'mangle', 'mork']
|
219
|
+
|
220
220
|
@article.update_values({[:journal, {:title_info => 1}]=>nil})
|
221
|
-
@article.term_values(:journal, :title_info).
|
222
|
-
|
221
|
+
expect(@article.term_values(:journal, :title_info)).to eq ['york', 'mork']
|
222
|
+
|
223
223
|
@article.update_values({[:journal, {:title_info => 0}]=>:delete})
|
224
|
-
@article.term_values(:journal, :title_info).
|
224
|
+
expect(@article.term_values(:journal, :title_info)).to eq ['mork']
|
225
225
|
end
|
226
226
|
|
227
227
|
describe "delete_on_update?" do
|
@@ -229,45 +229,34 @@ describe "OM::XML::TermValueOperators" do
|
|
229
229
|
before(:each) do
|
230
230
|
att= {[:journal, :title_info]=>["york", "mangle","mork"]}
|
231
231
|
@article.update_values(att)
|
232
|
-
@article.term_values(:journal, :title_info).
|
232
|
+
expect(@article.term_values(:journal, :title_info)).to eq ['york', 'mangle', 'mork']
|
233
233
|
end
|
234
234
|
|
235
235
|
it "by default, setting to nil deletes the node" do
|
236
236
|
@article.update_values({[:journal, {:title_info => 1}]=>nil})
|
237
|
-
@article.term_values(:journal, :title_info).
|
237
|
+
expect(@article.term_values(:journal, :title_info)).to eq ['york', 'mork']
|
238
238
|
end
|
239
239
|
|
240
240
|
it "if delete_on_update? returns false, setting to nil won't delete node" do
|
241
|
-
@article.
|
241
|
+
allow(@article).to receive('delete_on_update?').and_return(false)
|
242
242
|
@article.update_values({[:journal, {:title_info => 1}]=>""})
|
243
|
-
@article.term_values(:journal, :title_info).
|
243
|
+
expect(@article.term_values(:journal, :title_info)).to eq ['york', '', 'mork']
|
244
244
|
end
|
245
245
|
|
246
246
|
end
|
247
247
|
|
248
248
|
it "should retain other child nodes when updating a text content term and shoud not append an additional text node but update text in place" do
|
249
|
-
@article.term_values(:name,:name_content).
|
249
|
+
expect(@article.term_values(:name,:name_content)).to eq ["Describes a person"]
|
250
250
|
@article.update_values({[:name, :name_content]=>"Test text"})
|
251
|
-
@article.term_values(:name,:name_content).
|
252
|
-
@article.find_by_terms(:name).children.length().
|
251
|
+
expect(@article.term_values(:name,:name_content)).to eq ["Test text"]
|
252
|
+
expect(@article.find_by_terms(:name).children.length()).to eq 35
|
253
253
|
end
|
254
|
-
|
254
|
+
|
255
255
|
end
|
256
|
-
|
256
|
+
|
257
257
|
describe ".term_values_append" do
|
258
|
-
|
259
|
-
|
260
|
-
@sample.term_values_append(
|
261
|
-
:parent_select => [:person, {:first_name=>"Tim", :last_name=>"Berners-Lee"}] ,
|
262
|
-
:parent_index => :first,
|
263
|
-
:template => [:person, :affiliation],
|
264
|
-
:values => ["my new value", "another new value"]
|
265
|
-
)
|
266
|
-
end
|
267
|
-
|
268
|
-
it "should accept parent_select and template [term_reference, find_by_terms_and_value_opts] as argument arrays for generators/find_by_terms_and_values" do
|
269
|
-
# this appends two affiliation nodes into the first person node whose name is Tim Berners-Lee
|
270
|
-
expected_result = '<ns3:name type="personal">
|
258
|
+
before :each do
|
259
|
+
@expected_result = '<ns3:name type="personal">
|
271
260
|
<ns3:namePart type="family">Berners-Lee</ns3:namePart>
|
272
261
|
<ns3:namePart type="given">Tim</ns3:namePart>
|
273
262
|
<ns3:role>
|
@@ -275,119 +264,130 @@ describe "OM::XML::TermValueOperators" do
|
|
275
264
|
<ns3:roleTerm type="code" authority="marcrelator">cre</ns3:roleTerm>
|
276
265
|
</ns3:role>
|
277
266
|
<ns3:affiliation>my new value</ns3:affiliation><ns3:affiliation>another new value</ns3:affiliation></ns3:name>'
|
278
|
-
|
279
|
-
|
267
|
+
end
|
268
|
+
|
269
|
+
it "looks up the parent using :parent_select, uses :parent_index to choose the parent node from the result set, uses :template to build the node(s) to be inserted, inserts the :values(s) into the node(s) and adds the node(s) to the parent" do
|
270
|
+
@sample.term_values_append(
|
280
271
|
:parent_select => [:person, {:first_name=>"Tim", :last_name=>"Berners-Lee"}] ,
|
281
272
|
:parent_index => :first,
|
282
273
|
:template => [:person, :affiliation],
|
283
|
-
:values => ["my new value", "another new value"]
|
284
|
-
)
|
285
|
-
|
286
|
-
|
274
|
+
:values => ["my new value", "another new value"]
|
275
|
+
)
|
276
|
+
end
|
277
|
+
|
278
|
+
it "should accept parent_select and template [term_reference, find_by_terms_and_value_opts] as argument arrays for generators/find_by_terms_and_values" do
|
279
|
+
# this appends two affiliation nodes into the first person node whose name is Tim Berners-Lee
|
280
|
+
expect(@sample.term_values_append(
|
281
|
+
:parent_select => [:person, {:first_name=>"Tim", :last_name=>"Berners-Lee"}] ,
|
282
|
+
:parent_index => :first,
|
283
|
+
:template => [:person, :affiliation],
|
284
|
+
:values => ["my new value", "another new value"]
|
285
|
+
).to_xml).to eq(@expected_result)
|
286
|
+
|
287
|
+
expect(@sample.find_by_terms(:person, {:first_name=>"Tim", :last_name=>"Berners-Lee"}).first.to_xml).to eq(@expected_result)
|
287
288
|
end
|
288
|
-
|
289
|
+
|
289
290
|
it "should support adding attribute values" do
|
290
291
|
pointer = [{:title_info=>0}, :language]
|
291
292
|
test_val = "language value"
|
292
|
-
@article.term_values_append(
|
293
|
+
@article.term_values_append(
|
293
294
|
:parent_select => [{:title_info=>0}],
|
294
295
|
:parent_index => 0,
|
295
296
|
:template => [{:title_info=>0}, :language],
|
296
297
|
:values => test_val
|
297
298
|
)
|
298
|
-
@article.term_values(*pointer).first.
|
299
|
+
expect(@article.term_values(*pointer).first).to eq(test_val)
|
299
300
|
end
|
300
|
-
|
301
|
+
|
301
302
|
it "should accept symbols as arguments for generators/find_by_terms_and_values" do
|
302
303
|
# this appends a role of "my role" into the third "person" node in the document
|
303
304
|
@sample.term_values_append(
|
304
|
-
:parent_select => :person
|
305
|
+
:parent_select => :person,
|
305
306
|
:parent_index => 3,
|
306
307
|
:template => :role,
|
307
|
-
:values => "my role"
|
308
|
-
)
|
309
|
-
@sample.find_by_terms(:person)[3].search("./ns3:role[3]").first.text.
|
308
|
+
:values => "my role"
|
309
|
+
)
|
310
|
+
expect(@sample.find_by_terms(:person)[3].search("./ns3:role[3]").first.text).to eq("my role")
|
310
311
|
end
|
311
|
-
|
312
|
+
|
312
313
|
it "should accept parent_select as an (xpath) string and template as a (template) string" do
|
313
314
|
# this uses the provided template to add a node into the first node resulting from the xpath '//oxns:name[@type="personal"]'
|
314
315
|
expected_result = "<ns3:name type=\"personal\">\n <ns3:namePart type=\"family\">Berners-Lee</ns3:namePart>\n <ns3:namePart type=\"given\">Tim</ns3:namePart>\n <ns3:role>\n <ns3:roleTerm type=\"text\" authority=\"marcrelator\">creator</ns3:roleTerm>\n <ns3:roleTerm type=\"code\" authority=\"marcrelator\">cre</ns3:roleTerm>\n </ns3:role>\n <ns3:role type=\"code\" authority=\"marcrelator\"><ns3:roleTerm>creator</ns3:roleTerm></ns3:role></ns3:name>"
|
315
|
-
|
316
|
-
@sample.ng_xml.xpath('//oxns:name[@type="personal" and position()=1]/oxns:role', @sample.ox_namespaces).length.
|
317
|
-
|
316
|
+
|
317
|
+
expect(@sample.ng_xml.xpath('//oxns:name[@type="personal" and position()=1]/oxns:role', @sample.ox_namespaces).length).to eq(1)
|
318
|
+
|
318
319
|
@sample.term_values_append(
|
319
320
|
:parent_select =>'//oxns:name[@type="personal"]',
|
320
321
|
:parent_index => 0,
|
321
322
|
:template => 'xml.role { xml.roleTerm( \'#{builder_new_value}\', :type=>\'code\', :authority=>\'marcrelator\') }',
|
322
|
-
:values => "founder"
|
323
|
+
:values => "founder"
|
323
324
|
)
|
324
325
|
|
325
|
-
@sample.ng_xml.xpath('//oxns:name[@type="personal" and position()=1]/oxns:role', @sample.ox_namespaces).length.
|
326
|
-
@sample.ng_xml.xpath('//oxns:name[@type="personal" and position()=1]/oxns:role[last()]/oxns:roleTerm', @sample.ox_namespaces).first.text.
|
326
|
+
expect(@sample.ng_xml.xpath('//oxns:name[@type="personal" and position()=1]/oxns:role', @sample.ox_namespaces).length).to eq(2)
|
327
|
+
expect(@sample.ng_xml.xpath('//oxns:name[@type="personal" and position()=1]/oxns:role[last()]/oxns:roleTerm', @sample.ox_namespaces).first.text).to eq("founder")
|
327
328
|
|
328
329
|
# @sample.find_by_terms_and_value(:person).first.to_xml.should == expected_result
|
329
330
|
end
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
@sample.ng_xml.xpath('//oxns:name[@type="personal"][2]/oxns:role[1]/oxns:roleTerm', @sample.ox_namespaces).length.
|
334
|
-
|
331
|
+
|
332
|
+
it "should support more complex mixing & matching" do
|
333
|
+
skip "not working because builder_template is not returning the correct template (returns builder for role instead of roleTerm)"
|
334
|
+
expect(@sample.ng_xml.xpath('//oxns:name[@type="personal"][2]/oxns:role[1]/oxns:roleTerm', @sample.ox_namespaces).length).to eq(2)
|
335
|
+
@sample.term_values_append(
|
335
336
|
:parent_select =>'//oxns:name[@type="personal"][2]/oxns:role',
|
336
337
|
:parent_index => 0,
|
337
338
|
:template => [ :person, :role, :text, {:attributes=>{"authority"=>"marcrelator"}} ],
|
338
|
-
:values => "foo"
|
339
|
+
:values => "foo"
|
339
340
|
)
|
340
341
|
|
341
|
-
@sample.ng_xml.xpath('//oxns:name[@type="personal"][2]/oxns:role[1]/oxns:roleTerm', @sample.ox_namespaces).length.
|
342
|
-
@sample.find_by_terms({:person=>1},:role)[0].search("./oxns:roleTerm[@type=\"text\" and @authority=\"marcrelator\"]", @sample.ox_namespaces).first.text.
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
:parent_select => :person
|
342
|
+
expect(@sample.ng_xml.xpath('//oxns:name[@type="personal"][2]/oxns:role[1]/oxns:roleTerm', @sample.ox_namespaces).length).to eq(3)
|
343
|
+
expect(@sample.find_by_terms({:person=>1},:role)[0].search("./oxns:roleTerm[@type=\"text\" and @authority=\"marcrelator\"]", @sample.ox_namespaces).first.text).to eq("foo")
|
344
|
+
end
|
345
|
+
|
346
|
+
it "should create the necessary ancestor nodes when you insert a new term value" do
|
347
|
+
expect(@sample.find_by_terms(:person).length).to eq(4)
|
348
|
+
@sample.term_values_append(
|
349
|
+
:parent_select => :person,
|
349
350
|
:parent_index => 8,
|
350
351
|
:template => :role,
|
351
|
-
:values => "my role"
|
352
|
+
:values => "my role"
|
352
353
|
)
|
353
354
|
person_entries = @sample.find_by_terms(:person)
|
354
|
-
person_entries.length.
|
355
|
-
person_entries[4].search("./ns3:role").first.text.
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
355
|
+
expect(person_entries.length).to eq(5)
|
356
|
+
expect(person_entries[4].search("./ns3:role").first.text).to eq("my role")
|
357
|
+
end
|
358
|
+
|
359
|
+
it "should create the necessary ancestor nodes for deep trees of ancestors" do
|
360
|
+
deep_pointer = [{:journal=>0}, {:issue=>3}, :pages, :start]
|
361
|
+
expect(@article.find_by_terms({:journal=>0}).length).to eq(1)
|
362
|
+
expect(@article.find_by_terms({:journal=>0}, :issue).length).to eq(1)
|
363
|
+
@article.term_values_append(
|
363
364
|
:parent_select => deep_pointer[0..deep_pointer.length-2] ,
|
364
365
|
:parent_index => 0,
|
365
366
|
:template => deep_pointer,
|
366
|
-
:values => "451"
|
367
|
+
:values => "451"
|
367
368
|
)
|
368
|
-
@article.find_by_terms({:journal=>0}, :issue).length.
|
369
|
-
@article.find_by_terms({:journal=>0}, {:issue=>1}, :pages).length.
|
370
|
-
@article.find_by_terms({:journal=>0}, {:issue=>1}, :pages, :start).length.
|
371
|
-
@article.find_by_terms({:journal=>0}, {:issue=>1}, :pages, :start).first.text.
|
372
|
-
|
373
|
-
|
374
|
-
|
369
|
+
expect(@article.find_by_terms({:journal=>0}, :issue).length).to eq(2)
|
370
|
+
expect(@article.find_by_terms({:journal=>0}, {:issue=>1}, :pages).length).to eq(1)
|
371
|
+
expect(@article.find_by_terms({:journal=>0}, {:issue=>1}, :pages, :start).length).to eq(1)
|
372
|
+
expect(@article.find_by_terms({:journal=>0}, {:issue=>1}, :pages, :start).first.text).to eq("451")
|
373
|
+
|
374
|
+
end
|
375
375
|
end
|
376
|
-
|
376
|
+
|
377
377
|
describe ".term_value_update" do
|
378
|
-
|
378
|
+
|
379
379
|
it "should accept an xpath as :parent_select" do
|
380
|
-
|
381
|
-
|
382
|
-
@sample.ng_xml.xpath(sample_xpath, @sample.ox_namespaces)[1].text.
|
380
|
+
sample_xpath = '//oxns:name[@type="personal"][4]/oxns:role/oxns:roleTerm[@type="text"]'
|
381
|
+
@sample.term_value_update(sample_xpath,1,"artist")
|
382
|
+
expect(@sample.ng_xml.xpath(sample_xpath, @sample.ox_namespaces)[1].text).to eq("artist")
|
383
383
|
end
|
384
|
-
|
384
|
+
|
385
385
|
it "if :select is provided, should update the first node provided by that xpath statement" do
|
386
386
|
sample_xpath = '//oxns:name[@type="personal"][1]/oxns:namePart[@type="given"]'
|
387
387
|
@sample.term_value_update(sample_xpath,0,"Timmeh")
|
388
|
-
@sample.ng_xml.xpath(sample_xpath, @sample.ox_namespaces).first.text.
|
388
|
+
expect(@sample.ng_xml.xpath(sample_xpath, @sample.ox_namespaces).first.text).to eq("Timmeh")
|
389
389
|
end
|
390
|
-
|
390
|
+
|
391
391
|
it "should replace the existing node if you pass a template and values" do
|
392
392
|
skip
|
393
393
|
@sample.term_value_update(
|
@@ -396,72 +396,72 @@ describe "OM::XML::TermValueOperators" do
|
|
396
396
|
:template => [ :person, :role, {:attributes=>{"type"=>"code", "authority"=>"marcrelator"}} ],
|
397
397
|
:value => "foo"
|
398
398
|
)
|
399
|
-
1.
|
399
|
+
expect(1).to eq(2)
|
400
400
|
end
|
401
401
|
it "should delete nodes if value is :delete or nil" do
|
402
402
|
@article.update_values([:title_info]=>["york", "mangle","mork"])
|
403
403
|
xpath = @article.class.terminology.xpath_for(:title_info)
|
404
|
-
|
404
|
+
|
405
405
|
@article.term_value_update([:title_info], 1, nil)
|
406
|
-
@article.term_values(:title_info).
|
407
|
-
|
406
|
+
expect(@article.term_values(:title_info)).to eq(['york', 'mork'])
|
407
|
+
|
408
408
|
@article.term_value_update([:title_info], 1, :delete)
|
409
|
-
@article.term_values(:title_info).
|
409
|
+
expect(@article.term_values(:title_info)).to eq(['york'])
|
410
410
|
end
|
411
411
|
it "should create empty nodes if value is empty string" do
|
412
412
|
@article.update_values([:title_info]=>["york", '', "mork"])
|
413
|
-
@article.term_values(:title_info).
|
413
|
+
expect(@article.term_values(:title_info)).to eq(['york', "", "mork"])
|
414
414
|
end
|
415
415
|
end
|
416
|
-
|
416
|
+
|
417
417
|
describe ".term_value_delete" do
|
418
418
|
it "should accept an xpath query as :select option" do
|
419
|
-
generic_xpath
|
419
|
+
generic_xpath = '//oxns:name[@type="personal" and position()=4]/oxns:role'
|
420
420
|
specific_xpath = '//oxns:name[@type="personal" and position()=4]/oxns:role[oxns:roleTerm="visionary"]'
|
421
|
-
select_xpath
|
422
|
-
|
421
|
+
select_xpath = '//oxns:name[@type="personal" and position()=4]/oxns:role[last()]'
|
422
|
+
|
423
423
|
# Check that we're starting with 2 roles
|
424
424
|
# Check that the specific node we want to delete exists
|
425
|
-
@sample.find_by_terms_and_value(generic_xpath).length.
|
426
|
-
@sample.find_by_terms_and_value(specific_xpath).length.
|
425
|
+
expect(@sample.find_by_terms_and_value(generic_xpath).length).to eq(2)
|
426
|
+
expect(@sample.find_by_terms_and_value(specific_xpath).length).to eq(1)
|
427
427
|
|
428
428
|
@sample.term_value_delete(
|
429
429
|
:select =>select_xpath
|
430
430
|
)
|
431
431
|
# Check that we're finishing with 1 role
|
432
|
-
@sample.find_by_terms_and_value(generic_xpath).length.
|
432
|
+
expect(@sample.find_by_terms_and_value(generic_xpath).length).to eq(1)
|
433
433
|
# Check that the specific node we want to delete no longer exists
|
434
|
-
@sample.find_by_terms_and_value(specific_xpath).length.
|
435
|
-
end
|
434
|
+
expect(@sample.find_by_terms_and_value(specific_xpath).length).to eq(0)
|
435
|
+
end
|
436
436
|
it "should accept :parent_select, :parent_index and :parent_index options instead of a :select" do
|
437
|
-
|
437
|
+
|
438
438
|
generic_xpath = '//oxns:name[@type="personal" and position()=4]/oxns:role/oxns:roleTerm'
|
439
439
|
specific_xpath = '//oxns:name[@type="personal" and position()=4]/oxns:role[oxns:roleTerm="visionary"]'
|
440
|
-
|
440
|
+
|
441
441
|
# Check that we're starting with 2 roles
|
442
442
|
# Check that the specific node we want to delete exists
|
443
|
-
@sample.find_by_terms_and_value(generic_xpath).length.
|
444
|
-
@sample.find_by_terms_and_value(specific_xpath).length.
|
443
|
+
expect(@sample.find_by_terms_and_value(generic_xpath).length).to eq(4)
|
444
|
+
expect(@sample.find_by_terms_and_value(specific_xpath).length).to eq(1)
|
445
445
|
|
446
|
-
# this is attempting to delete the last child (in this case roleTerm) from the 3rd role in the document.
|
446
|
+
# this is attempting to delete the last child (in this case roleTerm) from the 3rd role in the document.
|
447
447
|
@sample.term_value_delete(
|
448
448
|
:parent_select => [:person, :role],
|
449
449
|
:parent_index => 3,
|
450
450
|
:child_index => :last
|
451
451
|
)
|
452
|
-
|
452
|
+
|
453
453
|
# Check that we're finishing with 1 role
|
454
|
-
@sample.find_by_terms_and_value(generic_xpath).length.
|
454
|
+
expect(@sample.find_by_terms_and_value(generic_xpath).length).to eq(3)
|
455
455
|
# Check that the specific node we want to delete no longer exists
|
456
|
-
@sample.find_by_terms_and_value(specific_xpath).length.
|
456
|
+
expect(@sample.find_by_terms_and_value(specific_xpath).length).to eq(1)
|
457
457
|
end
|
458
458
|
it "should work if only :parent_select and :parent_index are provided" do
|
459
459
|
generic_xpath = '//oxns:name[@type="personal"]/oxns:role'
|
460
460
|
# specific_xpath = '//oxns:name[@type="personal"]/oxns:role'
|
461
|
-
|
461
|
+
|
462
462
|
# Check that we're starting with 2 roles
|
463
463
|
# Check that the specific node we want to delete exists
|
464
|
-
@sample.find_by_terms_and_value(generic_xpath).length.
|
464
|
+
expect(@sample.find_by_terms_and_value(generic_xpath).length).to eq(4)
|
465
465
|
# @sample.find_by_terms_and_value(specific_xpath).length.should == 1
|
466
466
|
|
467
467
|
@sample.term_value_delete(
|
@@ -469,14 +469,14 @@ describe "OM::XML::TermValueOperators" do
|
|
469
469
|
:child_index => 3
|
470
470
|
)
|
471
471
|
# Check that we're finishing with 1 role
|
472
|
-
@sample.find_by_terms_and_value(generic_xpath).length.
|
472
|
+
expect(@sample.find_by_terms_and_value(generic_xpath).length).to eq(3)
|
473
473
|
end
|
474
474
|
end
|
475
|
-
|
475
|
+
|
476
476
|
describe "build_ancestors" do
|
477
477
|
it "should raise an error if it cant find a starting point for building from" do
|
478
|
-
|
478
|
+
expect { @empty_sample.build_ancestors( [:journal, :issue], 0) }.to raise_error(OM::XML::TemplateMissingException, "Cannot insert nodes into the document because it is empty. Try defining self.xml_template on the OM::Samples::ModsArticle class.")
|
479
479
|
end
|
480
480
|
end
|
481
|
-
|
481
|
+
|
482
482
|
end
|