om 3.0.0.beta1 → 3.0.0.beta2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/om/version.rb +1 -1
- data/lib/om/xml/dynamic_node.rb +2 -4
- data/lib/om/xml/term.rb +3 -6
- data/lib/om/xml/term_value_operators.rb +45 -26
- data/spec/unit/nokogiri_sanity_spec.rb +7 -7
- data/spec/unit/term_value_operators_spec.rb +9 -9
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2c2d373dd7d3fef0f2cf3d23de1aea05cc4de921
|
4
|
+
data.tar.gz: 66b678101c0255b7b9c94e81987f30329eca32d8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b074e1d3cd7ff1a25b7257679519a1d9e0913057ab8b0c4182cd90067513c8d01753b3e27e1324d058b92cff6462f4b072d6c481aca067c344368de5cb41290
|
7
|
+
data.tar.gz: 701ea9a57f9e17410dfe9c50af40ed425df1f35f676d37e292ad625c6b076034f14267859478cfb34569eb162d7ef27b6136b3e6356152a0d187b89ac1e30a65
|
data/lib/om/version.rb
CHANGED
data/lib/om/xml/dynamic_node.rb
CHANGED
@@ -69,7 +69,6 @@ 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)
|
73
72
|
new_values = term.sanitize_new_values(args.first)
|
74
73
|
existing_nodes = @document.find_by_xpath(xpath)
|
75
74
|
if existing_nodes.length > new_values.length
|
@@ -78,10 +77,9 @@ module OM
|
|
78
77
|
@document.term_value_delete select: xpath, child_index: index
|
79
78
|
end
|
80
79
|
end
|
81
|
-
new_values.
|
82
|
-
z = new_values[y]
|
80
|
+
new_values.each_with_index do |z, y|
|
83
81
|
## If we pass something that already has an index on it, we should be able to add it.
|
84
|
-
if existing_nodes[y.to_i].nil?
|
82
|
+
if existing_nodes[y.to_i].nil?
|
85
83
|
parent_pointer = parent ? parent.to_pointer : nil
|
86
84
|
@document.term_values_append(:parent_select=> parent_pointer,:parent_index=>0,:template=>to_pointer,:values=>z)
|
87
85
|
else
|
data/lib/om/xml/term.rb
CHANGED
@@ -78,15 +78,12 @@ class OM::XML::Term
|
|
78
78
|
# Sanitize new_values to always be a hash with indexes
|
79
79
|
case new_values
|
80
80
|
when Hash
|
81
|
-
new_values.
|
81
|
+
sanitize_new_values(new_values.values)
|
82
82
|
when Array
|
83
|
-
|
84
|
-
new_values = {}
|
85
|
-
nv.each {|v| new_values[nv.index(v).to_s] = serialize(v)}
|
83
|
+
new_values.map {|v| serialize(v)}
|
86
84
|
else
|
87
|
-
|
85
|
+
[serialize(new_values)]
|
88
86
|
end
|
89
|
-
new_values
|
90
87
|
end
|
91
88
|
|
92
89
|
# @param val [String,Date,Integer]
|
@@ -29,7 +29,7 @@ module OM::XML::TermValueOperators
|
|
29
29
|
#
|
30
30
|
# @param [Hash] params
|
31
31
|
# @example
|
32
|
-
# {[{":person"=>"0"}, "role", "text"]=>
|
32
|
+
# {[{":person"=>"0"}, "role", "text"]=>{'1'=>"role1", '2' => "role2", '3'=>"role3"}, [{:person=>1}, :family_name]=>"Andronicus", [{"person"=>"1"},:given_name]=>["Titus"],[{:person=>1},:role,:text]=>["otherrole1","otherrole2"] }
|
33
33
|
def update_values(params={})
|
34
34
|
# remove any terms from params that this datastream doesn't recognize
|
35
35
|
|
@@ -41,39 +41,58 @@ module OM::XML::TermValueOperators
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
-
result
|
45
|
-
|
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)
|
44
|
+
params.inject({}) do |result, (term_pointer,new_values)|
|
48
45
|
pointer = OM.destringify(term_pointer)
|
49
|
-
template_pointer = OM.pointers_to_flat_array(pointer,false)
|
50
46
|
hn = OM::XML::Terminology.term_hierarchical_name(*pointer)
|
47
|
+
result[hn] = assign_nested_attributes_for_collection_association(pointer, new_values)
|
48
|
+
result
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
# @see ActiveRecord::NestedAttributes#assign_nested_attributes_for_collection_association
|
54
|
+
# @example
|
55
|
+
#
|
56
|
+
# assign_nested_attributes_for_collection_association(:people, {
|
57
|
+
# '1' => { name: 'Peter' },
|
58
|
+
# '2' => { name: 'John', role: 'Creator' },
|
59
|
+
# '3' => { name: 'Bess' }
|
60
|
+
# })
|
61
|
+
#
|
62
|
+
# Will update the name of the Person with ID 1, build a new associated
|
63
|
+
# person with the name 'John', and mark the associated Person with ID 2
|
64
|
+
# for destruction.
|
65
|
+
#
|
66
|
+
# Also accepts an Array of attribute hashes:
|
67
|
+
#
|
68
|
+
# assign_nested_attributes_for_collection_association(:people, [
|
69
|
+
# { name: 'Peter' },
|
70
|
+
# { name: 'John', role: 'Creator' },
|
71
|
+
# { name: 'Bess' }
|
72
|
+
# ])
|
73
|
+
def assign_nested_attributes_for_collection_association(pointer, new_values)
|
51
74
|
|
52
75
|
term = self.class.terminology.retrieve_term( *OM.pointers_to_flat_array(pointer,false) )
|
53
|
-
|
54
76
|
xpath = self.class.terminology.xpath_with_indexes(*pointer)
|
55
77
|
current_values = term_values(*pointer)
|
56
78
|
|
57
|
-
|
79
|
+
new_values = term.sanitize_new_values(new_values)
|
80
|
+
|
81
|
+
|
82
|
+
if current_values.length > new_values.length
|
58
83
|
starting_index = new_values.length + 1
|
59
84
|
starting_index.upto(current_values.size).each do |index|
|
60
85
|
term_value_delete select: xpath, child_index: index
|
61
86
|
end
|
62
87
|
end
|
63
88
|
|
64
|
-
# Sanitize new_values to always be a hash with indexes
|
65
|
-
new_values = term.sanitize_new_values(new_values)
|
66
|
-
|
67
|
-
|
68
89
|
# Populate the response hash appropriately, using hierarchical names for terms as keys rather than the given pointers.
|
69
|
-
result.
|
70
|
-
result[hn] = new_values.dup
|
90
|
+
result = new_values.dup
|
71
91
|
|
72
92
|
# Skip any submitted values if the new value matches the current values
|
73
|
-
new_values.
|
74
|
-
|
75
|
-
|
76
|
-
new_values.delete(y)
|
93
|
+
new_values.each_with_index do |val, index|
|
94
|
+
if !val.nil? && current_values[index] == val
|
95
|
+
new_values.delete_at(index)
|
77
96
|
end
|
78
97
|
end
|
79
98
|
|
@@ -86,22 +105,22 @@ module OM::XML::TermValueOperators
|
|
86
105
|
parent_pointer = pointer.dup
|
87
106
|
parent_pointer.pop
|
88
107
|
parent_xpath = self.class.terminology.xpath_with_indexes(*parent_pointer)
|
108
|
+
|
109
|
+
template_pointer = OM.pointers_to_flat_array(pointer,false)
|
89
110
|
|
90
111
|
# If the value doesn't exist yet, append it. Otherwise, update the existing value.
|
91
|
-
new_values.
|
92
|
-
|
93
|
-
|
94
|
-
result[hn].delete(y)
|
112
|
+
new_values.each_with_index do |z, y|
|
113
|
+
if find_by_terms(*pointer)[y.to_i].nil?
|
114
|
+
result.delete(y)
|
95
115
|
term_values_append(:parent_select=>parent_pointer,:parent_index=>0,:template=>template_pointer,:values=>z)
|
96
|
-
# term_values_append(:parent_select=>parent_xpath,:parent_index=>0,:template=>template_pointer,:values=>z)
|
97
116
|
new_array_index = find_by_terms(*pointer).length - 1
|
98
|
-
result[
|
117
|
+
result[new_array_index] = z
|
99
118
|
else
|
100
119
|
term_value_update(xpath, y.to_i, z)
|
101
120
|
end
|
102
121
|
end
|
103
|
-
|
104
|
-
|
122
|
+
|
123
|
+
return result
|
105
124
|
end
|
106
125
|
|
107
126
|
def term_values_append(opts={})
|
@@ -20,7 +20,7 @@ describe "OM::XML::TermValueOperators" do
|
|
20
20
|
it "should respond with a hash of updated values and their indexes" do
|
21
21
|
test_args = {[{"person"=>"0"},"description"]=>["mork", "york"]}
|
22
22
|
result = @article.update_values(test_args)
|
23
|
-
result.should == {"person_0_description"=>
|
23
|
+
result.should == {"person_0_description"=>["mork", "york"]}
|
24
24
|
end
|
25
25
|
|
26
26
|
it "should update the xml in the specified datastream and know that changes have been made" do
|
@@ -34,12 +34,12 @@ describe "OM::XML::TermValueOperators" do
|
|
34
34
|
it "should update the xml according to the find_by_terms_and_values in the given hash" do
|
35
35
|
terms_attributes = {[{":person"=>"0"}, "affiliation"]=>["affiliation1", "affiliation2", "affiliation3"]}
|
36
36
|
result = @article.update_values(terms_attributes)
|
37
|
-
result.should == {"person_0_affiliation"=>
|
37
|
+
result.should == {"person_0_affiliation"=>["affiliation1", "affiliation2", "affiliation3"]}
|
38
38
|
|
39
39
|
# Trying again with a more complex update hash
|
40
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
41
|
result = @article.update_values(terms_attributes)
|
42
|
-
result.should == {"person_0_affiliation"=>
|
42
|
+
result.should == {"person_0_affiliation"=>["affiliation1", "affiliation2", "affiliation3"], "person_1_last_name"=>["Andronicus"],"person_1_first_name"=>["Titus"], "person_1_role"=>["otherrole1","otherrole2"]}
|
43
43
|
@article.should be_changed
|
44
44
|
end
|
45
45
|
|
@@ -47,25 +47,25 @@ describe "OM::XML::TermValueOperators" do
|
|
47
47
|
terms_attributes = {[{":person"=>"0"}, "affiliation"]=>["affiliation1", "affiliation2", "affiliation3"]}
|
48
48
|
result = @article.update_values(terms_attributes)
|
49
49
|
@article.term_values( {":person"=>"0"}, "affiliation" ).should == ["affiliation1", "affiliation2", "affiliation3"]
|
50
|
-
result.should == {"person_0_affiliation"=>
|
50
|
+
result.should == {"person_0_affiliation"=>["affiliation1", "affiliation2", "affiliation3"]}
|
51
51
|
|
52
52
|
terms_attributes = {[{":person"=>"0"}, "affiliation"]=>["affiliation1", "affiliation2", "affiliation3"]}
|
53
53
|
@article = OM::Samples::ModsArticle.from_xml( fixture( File.join("mods_articles","hydrangea_article1.xml") ) )
|
54
54
|
result = @article.update_values(terms_attributes)
|
55
55
|
@article.term_values( {":person"=>"0"}, "affiliation" ).should == ["affiliation1", "affiliation2", "affiliation3"]
|
56
|
-
result.should == {"person_0_affiliation"=>
|
56
|
+
result.should == {"person_0_affiliation"=>["affiliation1", "affiliation2", "affiliation3"]}
|
57
57
|
result = @article.update_values(terms_attributes)
|
58
58
|
|
59
59
|
terms_attributes = {[{":person"=>"0"}, "affiliation"]=>["affiliation1", "affiliation2", "affiliation3"]}
|
60
60
|
@article = OM::Samples::ModsArticle.from_xml( fixture( File.join("mods_articles","hydrangea_article1.xml") ) )
|
61
61
|
result = @article.update_values(terms_attributes)
|
62
62
|
@article.term_values( {":person"=>"0"}, "affiliation" ).should == ["affiliation1", "affiliation2", "affiliation3"]
|
63
|
-
result.should == {"person_0_affiliation"=>
|
63
|
+
result.should == {"person_0_affiliation"=>["affiliation1", "affiliation2", "affiliation3"]}
|
64
64
|
|
65
65
|
# Trying again with a more complex update hash
|
66
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
67
|
result = @article.update_values(terms_attributes)
|
68
|
-
result.should == {"person_0_affiliation"=>
|
68
|
+
result.should == {"person_0_affiliation"=>["affiliation1", "affiliation2", "affiliation3"], "person_1_last_name"=>["Andronicus"],"person_1_first_name"=>["Titus"], "person_1_role"=>["otherrole1", "otherrole2"]}
|
69
69
|
@article.should be_changed
|
70
70
|
end
|
71
71
|
end
|
@@ -31,9 +31,9 @@ describe "OM::XML::TermValueOperators" do
|
|
31
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
|
-
terms_attributes = {[{":person"=>"0"}, "affiliation"]=>
|
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.should == {"person_0_affiliation"=>
|
36
|
+
result.should == {"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
38
|
person_0_affiliation[0].text.should == "affiliation1"
|
39
39
|
person_0_affiliation[1].text.should == "affiliation2"
|
@@ -87,7 +87,7 @@ describe "OM::XML::TermValueOperators" do
|
|
87
87
|
end
|
88
88
|
|
89
89
|
it "should destringify the field key/find_by_terms_and_value pointer" do
|
90
|
-
expected_result = {"person_0_role"=>
|
90
|
+
expected_result = {"person_0_role"=>["the role"]}
|
91
91
|
@article.update_values( { [{":person"=>"0"}, "role"]=>"the role" }).should == expected_result
|
92
92
|
@article.update_values( { [{"person"=>"0"}, "role"]=>"the role" }).should == expected_result
|
93
93
|
@article.update_values( { [{:person=>0}, :role]=>"the role" }).should == expected_result
|
@@ -149,7 +149,7 @@ describe "OM::XML::TermValueOperators" do
|
|
149
149
|
|
150
150
|
it "should apply submitted hash to corresponding datastream field values" do
|
151
151
|
result = @article.update_values( {[{":person"=>"0"}, "first_name"]=>["Billy", "Bob", "Joe"] })
|
152
|
-
result.should == {"person_0_first_name"=>
|
152
|
+
result.should == {"person_0_first_name"=>["Billy", "Bob", "Joe"]}
|
153
153
|
# xpath = ds.class.xpath_with_indexes(*field_key)
|
154
154
|
# result = ds.term_values(xpath)
|
155
155
|
@article.term_values({:person=>0}, :first_name).should == ["Billy","Bob","Joe"]
|
@@ -158,7 +158,7 @@ describe "OM::XML::TermValueOperators" do
|
|
158
158
|
it "should support single-value arguments (as opposed to a hash of values with array indexes as keys)" do
|
159
159
|
# In other words, { [:journal, :title_info]=>"dork" } should have the same effect as { [:journal, :title_info]=>{"0"=>"dork"} }
|
160
160
|
result = @article.update_values( { [{":person"=>"0"}, "role"]=>"the role" } )
|
161
|
-
result.should == {"person_0_role"=>
|
161
|
+
result.should == {"person_0_role"=>["the role"]}
|
162
162
|
@article.term_values({:person=>0}, :role).first.should == "the role"
|
163
163
|
@article.term_values('//oxns:name[@type="personal"][1]/oxns:role').first.should == "the role"
|
164
164
|
end
|
@@ -176,11 +176,11 @@ describe "OM::XML::TermValueOperators" do
|
|
176
176
|
it "should work for text fields" do
|
177
177
|
att= {[{"person"=>"0"},"description"]=>["mork", "york"]}
|
178
178
|
result = @article.update_values(att)
|
179
|
-
result.should == {"person_0_description"=>
|
179
|
+
result.should == {"person_0_description"=>["mork", "york"]}
|
180
180
|
@article.term_values({:person=>0},:description).should == ['mork', 'york']
|
181
181
|
att= {[{"person"=>"0"},{"description" => 2}]=>"dork"}
|
182
182
|
result2 = @article.update_values(att)
|
183
|
-
result2.should == {"person_0_description_2"=>
|
183
|
+
result2.should == {"person_0_description_2"=>["dork"]}
|
184
184
|
@article.term_values({:person=>0},:description).should == ['mork', 'york', 'dork']
|
185
185
|
end
|
186
186
|
|
@@ -188,7 +188,7 @@ describe "OM::XML::TermValueOperators" do
|
|
188
188
|
@article.update_values([:journal, :title_info]=>["all", "for", "the"])
|
189
189
|
att = {[:journal, {:title_info => 3}]=>'glory'}
|
190
190
|
result = @article.update_values(att)
|
191
|
-
result.should == {"journal_title_info_3"=>
|
191
|
+
result.should == {"journal_title_info_3"=>["glory"]}
|
192
192
|
@article.term_values(:journal, :title_info).should == ["all", "for", "the", "glory"]
|
193
193
|
end
|
194
194
|
|
@@ -202,7 +202,7 @@ describe "OM::XML::TermValueOperators" do
|
|
202
202
|
att = {[:journal, :issue, :pages, {:end => 3}]=>'108'}
|
203
203
|
@article.term_values(:journal, :issue, :pages, :end).should == []
|
204
204
|
result = @article.update_values(att)
|
205
|
-
result.should == {"journal_issue_pages_end_3"=>
|
205
|
+
result.should == {"journal_issue_pages_end_3"=>["108"]}
|
206
206
|
@article.term_values(:journal, :issue, :pages, :end).should == ["108"]
|
207
207
|
end
|
208
208
|
|