om 2.2.1 → 3.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.textile +0 -6
- data/lib/om/version.rb +1 -1
- data/lib/om/xml/dynamic_node.rb +9 -1
- data/lib/om/xml/term_value_operators.rb +16 -9
- data/lib/om/xml/term_xpath_generator.rb +13 -6
- data/lib/om/xml/terminology.rb +2 -0
- data/spec/unit/dynamic_node_spec.rb +7 -2
- data/spec/unit/nokogiri_sanity_spec.rb +16 -18
- data/spec/unit/term_value_operators_spec.rb +42 -44
- data/spec/unit/term_xpath_generator_spec.rb +31 -4
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 311c97a223b0160f5766d16da7ec636a85073c39
|
4
|
+
data.tar.gz: 907162fe5292c1316732f68be31d987a3892e402
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 249f1349616500b6fbf03cb8d2168fe87e19ea2084f29a77ea5a15996f349ed4b71a84c17a0b9b636f70f522d89f8be4d5f2dda3b3d41d442d5e4eea1830586e
|
7
|
+
data.tar.gz: 10386c58e84a42859682dc6e70b9fe11c548befbaec48185194d7c4897803d6ab8e5876ac4d5c6f57b62b943a34e5419502fc99575b8d4ed1b1fbc8fd82b5ebe
|
data/History.textile
CHANGED
@@ -1,9 +1,3 @@
|
|
1
|
-
h3. 2.2.0 (20 June 2013)
|
2
|
-
Deprecate passing Hash values into DynamicNode#val= or
|
3
|
-
Document#update_attributes. This behavior will be removed in 3.0.0
|
4
|
-
Rails 4 support
|
5
|
-
Pass nil in order to remove a node (instead of blank string)
|
6
|
-
|
7
1
|
h3. 2.1.2 (3 May 2013)
|
8
2
|
Fix missing comma after exception
|
9
3
|
|
data/lib/om/version.rb
CHANGED
data/lib/om/xml/dynamic_node.rb
CHANGED
@@ -69,11 +69,19 @@ module OM
|
|
69
69
|
|
70
70
|
def val=(args)
|
71
71
|
@document.ng_xml_will_change!
|
72
|
+
raise ArgumentError, "The new_values passed to #{to_pointer} must be an array or a string. You provided #{args.first.inspect}" unless [Array, String, NilClass].include?(args.first.class)
|
72
73
|
new_values = term.sanitize_new_values(args.first)
|
74
|
+
existing_nodes = @document.find_by_xpath(xpath)
|
75
|
+
if existing_nodes.length > new_values.length
|
76
|
+
starting_index = new_values.length + 1
|
77
|
+
starting_index.upto(existing_nodes.size).each do |index|
|
78
|
+
@document.term_value_delete select: xpath, child_index: index
|
79
|
+
end
|
80
|
+
end
|
73
81
|
new_values.keys.sort { |a,b| a.to_i <=> b.to_i }.each do |y|
|
74
82
|
z = new_values[y]
|
75
83
|
## If we pass something that already has an index on it, we should be able to add it.
|
76
|
-
if
|
84
|
+
if existing_nodes[y.to_i].nil? || y.to_i == -1
|
77
85
|
parent_pointer = parent ? parent.to_pointer : nil
|
78
86
|
@document.term_values_append(:parent_select=> parent_pointer,:parent_index=>0,:template=>to_pointer,:values=>z)
|
79
87
|
else
|
@@ -29,10 +29,7 @@ module OM::XML::TermValueOperators
|
|
29
29
|
#
|
30
30
|
# @param [Hash] params
|
31
31
|
# @example
|
32
|
-
# {[{":person"=>"0"}, "role", "text"]=>["role1", "role2", "role3"],
|
33
|
-
# [{:person=>1}, :family_name]=>"Andronicus",
|
34
|
-
# [{"person"=>"1"},:given_name]=>["Titus"],
|
35
|
-
# [{:person=>1},:role,:text]=>["otherrole1","otherrole2"] }
|
32
|
+
# {[{":person"=>"0"}, "role", "text"]=>["role1", "role2", "role3"], [{:person=>1}, :family_name]=>"Andronicus", [{"person"=>"1"},:given_name]=>["Titus"],[{:person=>1},:role,:text]=>["otherrole1","otherrole2"] }
|
36
33
|
def update_values(params={})
|
37
34
|
# remove any terms from params that this datastream doesn't recognize
|
38
35
|
|
@@ -47,35 +44,45 @@ module OM::XML::TermValueOperators
|
|
47
44
|
result = params.dup
|
48
45
|
|
49
46
|
params.each_pair do |term_pointer,new_values|
|
47
|
+
raise ArgumentError, "The new_values passed to update_values must be an array or string. You provided #{new_values}." unless [Array, String, NilClass, Symbol].include?(new_values.class)
|
50
48
|
pointer = OM.destringify(term_pointer)
|
51
49
|
template_pointer = OM.pointers_to_flat_array(pointer,false)
|
52
50
|
hn = OM::XML::Terminology.term_hierarchical_name(*pointer)
|
53
51
|
|
54
52
|
term = self.class.terminology.retrieve_term( *OM.pointers_to_flat_array(pointer,false) )
|
55
53
|
|
54
|
+
xpath = self.class.terminology.xpath_with_indexes(*pointer)
|
55
|
+
current_values = term_values(*pointer)
|
56
|
+
|
57
|
+
if new_values.is_a?(Array) && current_values.length > new_values.length
|
58
|
+
starting_index = new_values.length + 1
|
59
|
+
starting_index.upto(current_values.size).each do |index|
|
60
|
+
term_value_delete select: xpath, child_index: index
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
56
64
|
# Sanitize new_values to always be a hash with indexes
|
57
65
|
new_values = term.sanitize_new_values(new_values)
|
58
|
-
|
66
|
+
|
67
|
+
|
59
68
|
# Populate the response hash appropriately, using hierarchical names for terms as keys rather than the given pointers.
|
60
69
|
result.delete(term_pointer)
|
61
70
|
result[hn] = new_values.dup
|
62
71
|
|
63
72
|
# Skip any submitted values if the new value matches the current values
|
64
|
-
current_values = term_values(*pointer)
|
65
73
|
new_values.keys.sort { |a,b| a.to_i <=> b.to_i }.each do |y|
|
66
74
|
z = new_values[y]
|
67
|
-
if current_values[y.to_i]==z and y.to_i > -1
|
75
|
+
if !z.nil? && current_values[y.to_i]==z and y.to_i > -1
|
68
76
|
new_values.delete(y)
|
69
77
|
end
|
70
78
|
end
|
71
|
-
|
79
|
+
|
72
80
|
# Fill out the pointer completely if the final term is a NamedTermProxy
|
73
81
|
if term.kind_of? OM::XML::NamedTermProxy
|
74
82
|
pointer.pop
|
75
83
|
pointer = pointer.concat(term.proxy_pointer)
|
76
84
|
end
|
77
85
|
|
78
|
-
xpath = self.class.terminology.xpath_with_indexes(*pointer)
|
79
86
|
parent_pointer = pointer.dup
|
80
87
|
parent_pointer.pop
|
81
88
|
parent_xpath = self.class.terminology.xpath_with_indexes(*parent_pointer)
|
@@ -206,17 +206,24 @@ module OM::XML::TermXpathGenerator
|
|
206
206
|
if query_constraints.kind_of?(Hash)
|
207
207
|
contains_functions = []
|
208
208
|
query_constraints.each_pair do |k,v|
|
209
|
-
|
210
|
-
|
209
|
+
|
210
|
+
if v.is_a?(Integer) || v == "0" || v.to_i != 0
|
211
|
+
# lookup sub element
|
212
|
+
xpath = '(' + xpath + '/' + final_term.children[query_constraints.keys.first].xpath_relative + ")[#{v.to_i + 1}]"
|
211
213
|
else
|
212
|
-
|
214
|
+
if k.instance_of?(Symbol)
|
215
|
+
constraint_path = final_term.children[k].xpath_relative
|
216
|
+
else
|
217
|
+
constraint_path = k
|
218
|
+
end
|
219
|
+
# match for text
|
220
|
+
contains_functions << "#{constraint_path}[text()=\"#{v}\"]"
|
221
|
+
xpath = add_predicate(xpath, delimited_list(contains_functions, " and ") )
|
213
222
|
end
|
214
|
-
contains_functions << "contains(#{constraint_path}, \"#{v}\")"
|
215
223
|
end
|
216
224
|
|
217
|
-
xpath = add_predicate(xpath, delimited_list(contains_functions, " and ") )
|
218
225
|
end
|
219
|
-
|
226
|
+
#
|
220
227
|
return xpath
|
221
228
|
end
|
222
229
|
|
data/lib/om/xml/terminology.rb
CHANGED
@@ -222,6 +222,8 @@ class OM::XML::Terminology
|
|
222
222
|
# Use the current terminology to generate an xpath with (optional) node indexes for each of the term pointers.
|
223
223
|
# Ex. terminology.xpath_with_indexes({:conference=>0}, {:role=>1}, :text )
|
224
224
|
# will yield an xpath like this: '//oxns:name[@type="conference"][1]/oxns:role[2]/oxns:roleTerm[@type="text"]'
|
225
|
+
# Ex. terminology.xpath_with_indexes({:conference=>0}, {:role=>1}, {:text => 0} )
|
226
|
+
# will yield an xpath like this: '//oxns:name[@type="conference"][1]/oxns:role[2]/oxns:roleTerm[@type="text"][1]'
|
225
227
|
def xpath_with_indexes(*pointers)
|
226
228
|
OM::XML::TermXpathGenerator.generate_xpath_with_indexes(self, *pointers)
|
227
229
|
end
|
@@ -126,7 +126,7 @@ describe "OM::XML::DynamicNode" do
|
|
126
126
|
end
|
127
127
|
|
128
128
|
it "Should be addressable to a specific node" do
|
129
|
-
@article.update_values( {[{:journal=>0}, {:issue=>3}, :pages, :start]=>
|
129
|
+
@article.update_values( {[{:journal=>0}, {:issue=>3}, :pages, :start]=>"434"})
|
130
130
|
|
131
131
|
@article.subject.topic(1).to_pointer == [:subject, {:topic => 1}]
|
132
132
|
@article.journal(0).issue.length.should == 2
|
@@ -141,7 +141,7 @@ describe "OM::XML::DynamicNode" do
|
|
141
141
|
|
142
142
|
describe ".nodeset" do
|
143
143
|
it "should return a Nokogiri NodeSet" do
|
144
|
-
@article.update_values( {[{:journal=>0}, {:issue=>3}, :pages, :start]=>
|
144
|
+
@article.update_values( {[{:journal=>0}, {:issue=>3}, :pages, :start]=>"434" })
|
145
145
|
nodeset = @article.journal(0).issue(1).pages.start.nodeset
|
146
146
|
nodeset.should be_kind_of Nokogiri::XML::NodeSet
|
147
147
|
nodeset.length.should == @article.journal(0).issue(1).pages.start.length
|
@@ -156,6 +156,11 @@ describe "OM::XML::DynamicNode" do
|
|
156
156
|
@article.should be_changed
|
157
157
|
end
|
158
158
|
|
159
|
+
it "should remove extra nodes if fewer are given than currently exist" do
|
160
|
+
@article.journal.title_info = %W(one two three four five)
|
161
|
+
@article.journal.title_info = %W(six seven)
|
162
|
+
@article.journal.title_info.should == ["six", "seven"]
|
163
|
+
end
|
159
164
|
end
|
160
165
|
end
|
161
166
|
end
|
@@ -18,55 +18,53 @@ describe "OM::XML::TermValueOperators" do
|
|
18
18
|
end
|
19
19
|
|
20
20
|
it "should respond with a hash of updated values and their indexes" do
|
21
|
-
test_args = {[{"person"=>"0"},"description"]=>
|
21
|
+
test_args = {[{"person"=>"0"},"description"]=>["mork", "york"]}
|
22
22
|
result = @article.update_values(test_args)
|
23
23
|
result.should == {"person_0_description"=>{"0"=>"mork","1"=>"york"}}
|
24
24
|
end
|
25
25
|
|
26
|
-
it "should update the xml in the specified
|
26
|
+
it "should update the xml in the specified datastream and know that changes have been made" do
|
27
27
|
@article.term_values({:person=>0}, :first_name).should == ["GIVEN NAMES"]
|
28
|
-
test_args = {[{:person=>0}, :first_name]=>
|
28
|
+
test_args = {[{:person=>0}, :first_name]=>"Replacement FirstName"}
|
29
29
|
@article.update_values(test_args)
|
30
30
|
@article.term_values({:person=>0}, :first_name).should == ["Replacement FirstName"]
|
31
31
|
@article.should be_changed
|
32
32
|
end
|
33
33
|
|
34
34
|
it "should update the xml according to the find_by_terms_and_values in the given hash" do
|
35
|
-
|
36
|
-
result = @article.update_values(
|
35
|
+
terms_attributes = {[{":person"=>"0"}, "affiliation"]=>["affiliation1", "affiliation2", "affiliation3"]}
|
36
|
+
result = @article.update_values(terms_attributes)
|
37
37
|
result.should == {"person_0_affiliation"=>{"0"=>"affiliation1", "1"=>"affiliation2", "2"=>"affiliation3"}}
|
38
38
|
|
39
39
|
# Trying again with a more complex update hash
|
40
|
-
|
41
|
-
result = @article.update_values(
|
40
|
+
terms_attributes = {[{":person"=>"0"}, "affiliation"]=>["affiliation1", "affiliation2", "affiliation3"], [{:person=>1}, :last_name]=>"Andronicus", [{"person"=>"1"},:first_name]=>["Titus"],[{:person=>1},:role]=>["otherrole1","otherrole2"] }
|
41
|
+
result = @article.update_values(terms_attributes)
|
42
42
|
result.should == {"person_0_affiliation"=>{"0"=>"affiliation1", "1"=>"affiliation2", "2"=>"affiliation3"}, "person_1_last_name"=>{"0"=>"Andronicus"},"person_1_first_name"=>{"0"=>"Titus"}, "person_1_role"=>{"0"=>"otherrole1","1"=>"otherrole2"}}
|
43
43
|
@article.should be_changed
|
44
44
|
end
|
45
45
|
|
46
46
|
it "should work when you re-run the command" do
|
47
|
-
|
48
|
-
result = @article.update_values(
|
47
|
+
terms_attributes = {[{":person"=>"0"}, "affiliation"]=>["affiliation1", "affiliation2", "affiliation3"]}
|
48
|
+
result = @article.update_values(terms_attributes)
|
49
49
|
@article.term_values( {":person"=>"0"}, "affiliation" ).should == ["affiliation1", "affiliation2", "affiliation3"]
|
50
50
|
result.should == {"person_0_affiliation"=>{"0"=>"affiliation1", "1"=>"affiliation2", "2"=>"affiliation3"}}
|
51
51
|
|
52
|
-
|
53
|
-
# result.should == {"person_0_affiliation"=>{"0"=>"affiliation1", "1"=>"affiliation2", "2"=>"affiliation3"}}
|
54
|
-
terms_update_hash = {[{":person"=>"0"}, "affiliation"]=>{"0"=>"affiliation1", "1"=>"affiliation2", "2"=>"affiliation3"}}
|
52
|
+
terms_attributes = {[{":person"=>"0"}, "affiliation"]=>["affiliation1", "affiliation2", "affiliation3"]}
|
55
53
|
@article = OM::Samples::ModsArticle.from_xml( fixture( File.join("mods_articles","hydrangea_article1.xml") ) )
|
56
|
-
result = @article.update_values(
|
54
|
+
result = @article.update_values(terms_attributes)
|
57
55
|
@article.term_values( {":person"=>"0"}, "affiliation" ).should == ["affiliation1", "affiliation2", "affiliation3"]
|
58
56
|
result.should == {"person_0_affiliation"=>{"0"=>"affiliation1", "1"=>"affiliation2", "2"=>"affiliation3"}}
|
59
|
-
result = @article.update_values(
|
57
|
+
result = @article.update_values(terms_attributes)
|
60
58
|
|
61
|
-
|
59
|
+
terms_attributes = {[{":person"=>"0"}, "affiliation"]=>["affiliation1", "affiliation2", "affiliation3"]}
|
62
60
|
@article = OM::Samples::ModsArticle.from_xml( fixture( File.join("mods_articles","hydrangea_article1.xml") ) )
|
63
|
-
result = @article.update_values(
|
61
|
+
result = @article.update_values(terms_attributes)
|
64
62
|
@article.term_values( {":person"=>"0"}, "affiliation" ).should == ["affiliation1", "affiliation2", "affiliation3"]
|
65
63
|
result.should == {"person_0_affiliation"=>{"0"=>"affiliation1", "1"=>"affiliation2", "2"=>"affiliation3"}}
|
66
64
|
|
67
65
|
# Trying again with a more complex update hash
|
68
|
-
|
69
|
-
result = @article.update_values(
|
66
|
+
terms_attributes = {[{":person"=>"0"}, "affiliation"]=>["affiliation1", "affiliation2", "affiliation3"], [{:person=>1}, :last_name]=>"Andronicus", [{"person"=>"1"},:first_name]=>["Titus"],[{:person=>1},:role]=>["otherrole1","otherrole2"] }
|
67
|
+
result = @article.update_values(terms_attributes)
|
70
68
|
result.should == {"person_0_affiliation"=>{"0"=>"affiliation1", "1"=>"affiliation2", "2"=>"affiliation3"}, "person_1_last_name"=>{"0"=>"Andronicus"},"person_1_first_name"=>{"0"=>"Titus"}, "person_1_role"=>{"0"=>"otherrole1","1"=>"otherrole2"}}
|
71
69
|
@article.should be_changed
|
72
70
|
end
|
@@ -17,6 +17,11 @@ describe "OM::XML::TermValueOperators" do
|
|
17
17
|
expected_values.each {|v| result.should include(v)}
|
18
18
|
end
|
19
19
|
|
20
|
+
it "should look at the index" do
|
21
|
+
result = @sample.term_values(:role, {:text => 3})
|
22
|
+
result.should == ['visionary']
|
23
|
+
end
|
24
|
+
|
20
25
|
it "should ignore whitespace elements for a term pointing to a text() node for an element that contains children" do
|
21
26
|
@article.term_values(:name, :name_content).should == ["Describes a person"]
|
22
27
|
end
|
@@ -26,8 +31,8 @@ describe "OM::XML::TermValueOperators" do
|
|
26
31
|
|
27
32
|
describe ".update_values" do
|
28
33
|
it "should update the xml according to the find_by_terms_and_values in the given hash" do
|
29
|
-
|
30
|
-
result = @article.update_values(
|
34
|
+
terms_attributes = {[{":person"=>"0"}, "affiliation"]=>["affiliation1", "affiliation2".freeze, "affiliation3"], [{:person=>1}, :last_name]=>"Andronicus", [{"person"=>"1"},:first_name]=>["Titus"],[{:person=>1},:role]=>["otherrole1","otherrole2"] }
|
35
|
+
result = @article.update_values(terms_attributes)
|
31
36
|
result.should == {"person_0_affiliation"=>{"0"=>"affiliation1", "1"=>"affiliation2", "2"=>"affiliation3"}, "person_1_last_name"=>{"0"=>"Andronicus"},"person_1_first_name"=>{"0"=>"Titus"}, "person_1_role"=>{"0"=>"otherrole1","1"=>"otherrole2"}}
|
32
37
|
person_0_affiliation = @article.find_by_terms({:person=>0}, :affiliation)
|
33
38
|
person_0_affiliation[0].text.should == "affiliation1"
|
@@ -47,8 +52,9 @@ describe "OM::XML::TermValueOperators" do
|
|
47
52
|
end
|
48
53
|
|
49
54
|
it "should allow setting a blank string " do
|
50
|
-
@article.update_values(
|
51
|
-
@article.term_values(:
|
55
|
+
@article.update_values([:abstract]=>[''])
|
56
|
+
@article.term_values(:abstract).should == [""]
|
57
|
+
end
|
52
58
|
|
53
59
|
it "should call term_value_update if the corresponding node already exists" do
|
54
60
|
@article.should_receive(:term_value_update).with('//oxns:titleInfo/oxns:title', 0, "My New Title")
|
@@ -64,28 +70,27 @@ describe "OM::XML::TermValueOperators" do
|
|
64
70
|
:values => "My New Role"
|
65
71
|
}
|
66
72
|
@article.should_receive(:term_values_append).with(expected_args).twice
|
67
|
-
@article.update_values( {[{:person=>0}, :role
|
68
|
-
@article.update_values( {[{:person=>0}, :role] =>
|
73
|
+
@article.update_values( {[{:person=>0}, {:role => 6}] => "My New Role"} )
|
74
|
+
@article.update_values( {[{:person=>0}, {:role => 7}] => "My New Role"} )
|
69
75
|
end
|
70
76
|
|
71
77
|
it "should support updating attribute values" do
|
72
78
|
pointer = [:title_info, :language]
|
73
79
|
test_val = "language value"
|
74
|
-
@article.update_values( {pointer=>
|
80
|
+
@article.update_values( {pointer=>test_val} )
|
75
81
|
@article.term_values(*pointer).first.should == test_val
|
76
82
|
end
|
77
83
|
|
78
84
|
it "should not get tripped up on root nodes" do
|
79
|
-
@article.update_values([:title_info]=>
|
85
|
+
@article.update_values([:title_info]=>["york", "mangle","mork"])
|
80
86
|
@article.term_values(*[:title_info]).should == ["york", "mangle", "mork"]
|
81
87
|
end
|
82
88
|
|
83
89
|
it "should destringify the field key/find_by_terms_and_value pointer" do
|
84
|
-
|
85
|
-
|
86
|
-
@article.update_values( { [{"
|
87
|
-
@article.update_values( { [{
|
88
|
-
@article.update_values( { [{:person=>0}, :role]=>"the role" } )
|
90
|
+
expected_result = {"person_0_role"=>{"0"=>"the role"}}
|
91
|
+
@article.update_values( { [{":person"=>"0"}, "role"]=>"the role" }).should == expected_result
|
92
|
+
@article.update_values( { [{"person"=>"0"}, "role"]=>"the role" }).should == expected_result
|
93
|
+
@article.update_values( { [{:person=>0}, :role]=>"the role" }).should == expected_result
|
89
94
|
end
|
90
95
|
|
91
96
|
it "should traverse named term proxies transparently" do
|
@@ -104,7 +109,7 @@ describe "OM::XML::TermValueOperators" do
|
|
104
109
|
end
|
105
110
|
|
106
111
|
it "should create deep trees of ancestor nodes" do
|
107
|
-
result = @article.update_values( {[{:journal=>0}, {:issue=>3}, :pages, :start]=>
|
112
|
+
result = @article.update_values( {[{:journal=>0}, {:issue=>3}, :pages, :start]=>"434" })
|
108
113
|
@article.find_by_terms({:journal=>0}, :issue).length.should == 2
|
109
114
|
@article.find_by_terms({:journal=>0}, {:issue=>1}, :pages).length.should == 1
|
110
115
|
@article.find_by_terms({:journal=>0}, {:issue=>1}, :pages, :start).length.should == 1
|
@@ -143,7 +148,7 @@ describe "OM::XML::TermValueOperators" do
|
|
143
148
|
### Examples copied over form nokogiri_datastream_spec
|
144
149
|
|
145
150
|
it "should apply submitted hash to corresponding datastream field values" do
|
146
|
-
result = @article.update_values( {[{":person"=>"0"}, "first_name"]=>
|
151
|
+
result = @article.update_values( {[{":person"=>"0"}, "first_name"]=>["Billy", "Bob", "Joe"] })
|
147
152
|
result.should == {"person_0_first_name"=>{"0"=>"Billy", "1"=>"Bob", "2"=>"Joe"}}
|
148
153
|
# xpath = ds.class.xpath_with_indexes(*field_key)
|
149
154
|
# result = ds.term_values(xpath)
|
@@ -169,73 +174,66 @@ describe "OM::XML::TermValueOperators" do
|
|
169
174
|
end
|
170
175
|
|
171
176
|
it "should work for text fields" do
|
172
|
-
att= {[{"person"=>"0"},"description"]=>
|
177
|
+
att= {[{"person"=>"0"},"description"]=>["mork", "york"]}
|
173
178
|
result = @article.update_values(att)
|
174
179
|
result.should == {"person_0_description"=>{"0"=>"mork","1"=>"york"}}
|
175
180
|
@article.term_values({:person=>0},:description).should == ['mork', 'york']
|
176
|
-
att= {[{"person"=>"0"},"description"]=>
|
181
|
+
att= {[{"person"=>"0"},{"description" => 2}]=>"dork"}
|
177
182
|
result2 = @article.update_values(att)
|
178
|
-
result2.should == {"
|
183
|
+
result2.should == {"person_0_description_2"=>{"0"=>"dork"}}
|
179
184
|
@article.term_values({:person=>0},:description).should == ['mork', 'york', 'dork']
|
180
185
|
end
|
181
186
|
|
182
|
-
it "should return the new index of any added values" do
|
183
|
-
@article.term_values({:title_info=>0},:main_title).should == ["ARTICLE TITLE HYDRANGEA ARTICLE 1", "TITLE OF HOST JOURNAL"]
|
184
|
-
result = @article.update_values [{"title_info"=>"0"},"main_title"]=>{"-1"=>"mork"}
|
185
|
-
result.should == {"title_info_0_main_title"=>{"2"=>"mork"}}
|
186
|
-
end
|
187
|
-
|
188
|
-
it "should return accurate response when multiple values have been added in a single run" do
|
189
|
-
pending "THIS SHOULD BE FIXED"
|
190
|
-
att= {[:journal, :title_info]=>{"-1"=>"mork", "0"=>"york"}}
|
191
|
-
@article.update_values(att).should == {"journal_title_info"=>{"0"=>"york", "1"=>"mork"}}
|
192
|
-
@article.term_values(*att.keys.first).should == ["york", "mork"]
|
193
|
-
end
|
194
|
-
|
195
187
|
it "should append nodes at the specified index if possible" do
|
196
188
|
@article.update_values([:journal, :title_info]=>["all", "for", "the"])
|
197
|
-
att = {[:journal, :title_info
|
189
|
+
att = {[:journal, {:title_info => 3}]=>'glory'}
|
198
190
|
result = @article.update_values(att)
|
199
|
-
result.should == {"
|
191
|
+
result.should == {"journal_title_info_3"=>{"0"=>"glory"}}
|
200
192
|
@article.term_values(:journal, :title_info).should == ["all", "for", "the", "glory"]
|
201
193
|
end
|
194
|
+
|
195
|
+
it "should remove extra nodes if fewer are given than currently exist" do
|
196
|
+
@article.update_values([:journal, :title_info]=>%W(one two three four five))
|
197
|
+
result = @article.update_values({[:journal, :title_info]=>["six", "seven"]})
|
198
|
+
@article.term_values(:journal, :title_info).should == ["six", "seven"]
|
199
|
+
end
|
202
200
|
|
203
201
|
it "should append values to the end of the array if the specified index is higher than the length of the values array" do
|
204
|
-
att = {[:journal, :issue, :pages, :end
|
202
|
+
att = {[:journal, :issue, :pages, {:end => 3}]=>'108'}
|
205
203
|
@article.term_values(:journal, :issue, :pages, :end).should == []
|
206
204
|
result = @article.update_values(att)
|
207
|
-
result.should == {"
|
205
|
+
result.should == {"journal_issue_pages_end_3"=>{"-1"=>"108"}}
|
208
206
|
@article.term_values(:journal, :issue, :pages, :end).should == ["108"]
|
209
207
|
end
|
210
208
|
|
211
209
|
it "should allow deleting of values and should delete values so that to_xml does not return emtpy nodes" do
|
212
|
-
att= {[:journal, :title_info]=>
|
210
|
+
att= {[:journal, :title_info]=>["york", "mangle","mork"]}
|
213
211
|
@article.update_values(att)
|
214
212
|
@article.term_values(:journal, :title_info).should == ['york', 'mangle', 'mork']
|
215
213
|
|
216
|
-
@article.update_values({[:journal, :title_info
|
214
|
+
@article.update_values({[:journal, {:title_info => 1}]=>nil})
|
217
215
|
@article.term_values(:journal, :title_info).should == ['york', 'mork']
|
218
216
|
|
219
|
-
@article.update_values({[:journal, :title_info
|
217
|
+
@article.update_values({[:journal, {:title_info => 0}]=>:delete})
|
220
218
|
@article.term_values(:journal, :title_info).should == ['mork']
|
221
219
|
end
|
222
220
|
|
223
221
|
describe "delete_on_update?" do
|
224
222
|
|
225
223
|
before(:each) do
|
226
|
-
att= {[:journal, :title_info]=>
|
224
|
+
att= {[:journal, :title_info]=>["york", "mangle","mork"]}
|
227
225
|
@article.update_values(att)
|
228
226
|
@article.term_values(:journal, :title_info).should == ['york', 'mangle', 'mork']
|
229
227
|
end
|
230
228
|
|
231
|
-
it "by default, setting to
|
232
|
-
@article.update_values({[:journal, :title_info
|
229
|
+
it "by default, setting to nil deletes the node" do
|
230
|
+
@article.update_values({[:journal, {:title_info => 1}]=>nil})
|
233
231
|
@article.term_values(:journal, :title_info).should == ['york', 'mork']
|
234
232
|
end
|
235
233
|
|
236
234
|
it "if delete_on_update? returns false, setting to nil won't delete node" do
|
237
235
|
@article.stub('delete_on_update?').and_return(false)
|
238
|
-
@article.update_values({[:journal, :title_info
|
236
|
+
@article.update_values({[:journal, {:title_info => 1}]=>""})
|
239
237
|
@article.term_values(:journal, :title_info).should == ['york', '', 'mork']
|
240
238
|
end
|
241
239
|
|
@@ -395,7 +393,7 @@ describe "OM::XML::TermValueOperators" do
|
|
395
393
|
1.should == 2
|
396
394
|
end
|
397
395
|
it "should delete nodes if value is :delete or nil" do
|
398
|
-
@article.update_values([:title_info]=>
|
396
|
+
@article.update_values([:title_info]=>["york", "mangle","mork"])
|
399
397
|
xpath = @article.class.terminology.xpath_for(:title_info)
|
400
398
|
|
401
399
|
@article.term_value_update([:title_info], 1, nil)
|
@@ -405,7 +403,7 @@ describe "OM::XML::TermValueOperators" do
|
|
405
403
|
@article.term_values(:title_info).should == ['york']
|
406
404
|
end
|
407
405
|
it "should create empty nodes if value is empty string" do
|
408
|
-
@article.update_values([:title_info]=>
|
406
|
+
@article.update_values([:title_info]=>["york", '', "mork"])
|
409
407
|
@article.term_values(:title_info).should == ['york', "", "mork"]
|
410
408
|
end
|
411
409
|
end
|
@@ -89,11 +89,38 @@ describe "OM::XML::TermXpathGeneratorSpec" do
|
|
89
89
|
|
90
90
|
describe "generate_xpath_with_indexes" do
|
91
91
|
it "should accept multiple constraints" do
|
92
|
-
generated_xpath = OM::XML::TermXpathGenerator.generate_xpath_with_indexes( @sample_terminology,
|
92
|
+
generated_xpath = OM::XML::TermXpathGenerator.generate_xpath_with_indexes( @sample_terminology,
|
93
|
+
:person, {:first_name=>"Tim", :family_name=>"Berners-Lee"} )
|
93
94
|
# expect an xpath that looks like this: '//oxns:name[@type="personal" and contains(oxns:namePart[@type="family"], "Berners-Lee") and contains(oxns:namePart[@type="given"], "Tim")]'
|
94
|
-
|
95
|
-
generated_xpath.should match( /\/\/oxns:name\[@type=\"personal\".*and
|
96
|
-
|
95
|
+
generated_xpath.should match( /\/\/oxns:name\[@type=\"personal\".*and oxns:namePart\[@type=\"given\"\]\[text\(\)=\"Tim\"\].*\]/ )
|
96
|
+
generated_xpath.should match( /\/\/oxns:name\[@type=\"personal\".*and oxns:namePart\[@type=\"family\"\]\[text\(\)=\"Berners-Lee\"\].*\]/ )
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should find matching nodes" do
|
100
|
+
ng = Nokogiri::XML(fixture( File.join("test_dummy_mods.xml")))
|
101
|
+
generated_xpath = OM::XML::TermXpathGenerator.generate_xpath_with_indexes( @sample_terminology,
|
102
|
+
:person, {:first_name=>"Tim", :family_name=>"Berners-Lee"} )
|
103
|
+
ng.xpath(generated_xpath, 'oxns' => "http://www.loc.gov/mods/v3").to_xml.should be_equivalent_to <<EOF
|
104
|
+
<ns3:name type="personal">
|
105
|
+
<ns3:namePart type="family">Berners-Lee</ns3:namePart>
|
106
|
+
<ns3:namePart type="given">Tim</ns3:namePart>
|
107
|
+
<ns3:role>
|
108
|
+
<ns3:roleTerm type="text" authority="marcrelator">creator</ns3:roleTerm>
|
109
|
+
<ns3:roleTerm type="code" authority="marcrelator">cre</ns3:roleTerm>
|
110
|
+
</ns3:role>
|
111
|
+
</ns3:name>
|
112
|
+
EOF
|
113
|
+
generated_xpath = OM::XML::TermXpathGenerator.generate_xpath_with_indexes( @sample_terminology,
|
114
|
+
:person, {:first_name=>"Tim", :family_name=>"Berners"} )
|
115
|
+
ng.xpath(generated_xpath, 'oxns' => "http://www.loc.gov/mods/v3").should be_empty
|
116
|
+
generated_xpath = OM::XML::TermXpathGenerator.generate_xpath_with_indexes( @sample_terminology,
|
117
|
+
:person, {:first_name=>"Frank", :family_name=>"Berners-Lee"} )
|
118
|
+
ng.xpath(generated_xpath, 'oxns' => "http://www.loc.gov/mods/v3").should be_empty
|
119
|
+
|
120
|
+
generated_xpath = OM::XML::TermXpathGenerator.generate_xpath_with_indexes( @sample_terminology,
|
121
|
+
:person, {:first_name=>"Tim", :family_name=>"Howard"} )
|
122
|
+
ng.xpath(generated_xpath, 'oxns' => "http://www.loc.gov/mods/v3").should be_empty
|
123
|
+
|
97
124
|
end
|
98
125
|
it "should support xpath queries as argument" do
|
99
126
|
OM::XML::TermXpathGenerator.generate_xpath_with_indexes(@sample_terminology, '//oxns:name[@type="personal"][1]/oxns:namePart').should == '//oxns:name[@type="personal"][1]/oxns:namePart'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: om
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Zumwalt
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-06-
|
12
|
+
date: 2013-06-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -293,9 +293,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
293
293
|
version: 1.9.3
|
294
294
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
295
295
|
requirements:
|
296
|
-
- - '
|
296
|
+
- - '>'
|
297
297
|
- !ruby/object:Gem::Version
|
298
|
-
version:
|
298
|
+
version: 1.3.1
|
299
299
|
requirements: []
|
300
300
|
rubyforge_project:
|
301
301
|
rubygems_version: 2.0.3
|