active-fedora 1.1.8 → 1.1.9

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.
@@ -34,7 +34,6 @@ module ActiveFedora
34
34
  # node.xpath("./foxml:datastreamVersion[last()]/foxml:xmlContent/rdf:RDF/rdf:Description/*").each do |f|
35
35
  node.xpath("./foxml:datastreamVersion[last()]/foxml:xmlContent/rdf:RDF/rdf:Description/*", {"rdf"=>"http://www.w3.org/1999/02/22-rdf-syntax-ns#", "foxml"=>"info:fedora/fedora-system:def/foxml#"}).each do |f|
36
36
  r = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>ActiveFedora::SemanticNode::PREDICATE_MAPPINGS.invert[f.name], :object=>f["resource"])
37
- puts "adding #{r.inspect} to template"
38
37
  tmpl.add_relationship(r)
39
38
  end
40
39
  tmpl.send(:dirty=, false)
@@ -1,2 +1,2 @@
1
1
  module Hydra;end
2
- require "hydra/mods_article"
2
+ require "hydra/sample_mods_datastream"
@@ -0,0 +1,100 @@
1
+ require "hydra"
2
+ module Hydra
3
+ class Hydra::SampleModsDatastream < ActiveFedora::NokogiriDatastream
4
+
5
+ # have to call this in order to set namespace & schema
6
+ root_property :mods, "mods", "http://www.loc.gov/mods/v3", :attributes=>["id", "version"], :schema=>"http://www.loc.gov/standards/mods/v3/mods-3-2.xsd"
7
+
8
+ property :title_info, :path=>"titleInfo",
9
+ :convenience_methods => {
10
+ :main_title => {:path=>"title"},
11
+ :language => {:path=>{:attribute=>"lang"}},
12
+ }
13
+ property :abstract, :path=>"abstract"
14
+ property :topic_tag, :path=>'subject',:default_content_path => "topic"
15
+
16
+ property :name_, :path=>"name",
17
+ :attributes=>[:xlink, :lang, "xml:lang", :script, :transliteration, {:type=>["personal", "enumerated", "corporate"]} ],
18
+ :subelements=>["namePart", "displayForm", "affiliation", :role, "description"],
19
+ :default_content_path => "namePart",
20
+ :convenience_methods => {
21
+ :date => {:path=>"namePart", :attributes=>{:type=>"date"}},
22
+ :family_name => {:path=>"namePart", :attributes=>{:type=>"family"}},
23
+ :first_name => {:path=>"namePart", :attributes=>{:type=>"given"}},
24
+ :terms_of_address => {:path=>"namePart", :attributes=>{:type=>"termsOfAddress"}}
25
+ }
26
+
27
+ property :person, :variant_of=>:name_, :attributes=>{:type=>"personal"}
28
+ property :organizaton, :variant_of=>:name_, :attributes=>{:type=>"institutional"}
29
+ property :conference, :variant_of=>:name_, :attributes=>{:type=>"conference"}
30
+
31
+ property :role, :path=>"role",
32
+ :parents=>[:name_],
33
+ :convenience_methods => {
34
+ :text => {:path=>"roleTerm", :attributes=>{:type=>"text"}},
35
+ :code => {:path=>"roleTerm", :attributes=>{:type=>"code"}},
36
+ }
37
+
38
+ property :journal, :path=>'relatedItem', :attributes=>{:type=>"host"},
39
+ :subelements=>[:title_info, :origin_info, :issue],
40
+ :convenience_methods => {
41
+ :issn => {:path=>"identifier", :attributes=>{:type=>"issn"}},
42
+ }
43
+
44
+ property :origin_info, :path=>'originInfo',
45
+ :subelements=>["publisher","dateIssued"]
46
+
47
+ property :issue, :path=>'part',
48
+ :subelements=>[:start_page, :end_page],
49
+ :convenience_methods => {
50
+ :volume => {:path=>"detail", :attributes=>{:type=>"volume"}},
51
+ :level => {:path=>"detail", :attributes=>{:type=>"level"}},
52
+ :publication_date => {:path=>"date"}
53
+ }
54
+ property :start_page, :path=>"extent", :attributes=>{:unit=>"pages"}, :default_content_path => "start"
55
+ property :end_page, :path=>"extent", :attributes=>{:unit=>"pages"}, :default_content_path => "end"
56
+
57
+ generate_accessors_from_properties
58
+ # accessor :title_info, :relative_xpath=>'oxns:titleInfo', :children=>[
59
+ # {:main_title=>{:relative_xpath=>'oxns:title'}},
60
+ # {:language =>{:relative_xpath=>{:attribute=>"lang"} }}
61
+ # ]
62
+ # accessor :abstract
63
+ # accessor :topic_tag, :relative_xpath=>'oxns:subject/oxns:topic'
64
+ # accessor :person, :relative_xpath=>'oxns:name[@type="personal"]', :children=>[
65
+ # {:last_name=>{:relative_xpath=>'oxns:namePart[@type="family"]'}},
66
+ # {:first_name=>{:relative_xpath=>'oxns:namePart[@type="given"]'}},
67
+ # {:institution=>{:relative_xpath=>'oxns:affiliation'}},
68
+ # {:role=>{:children=>[
69
+ # {:text=>{:relative_xpath=>'oxns:roleTerm[@type="text"]'}},
70
+ # {:code=>{:relative_xpath=>'oxns:roleTerm[@type="code"]'}}
71
+ # ]}}
72
+ # ]
73
+ # accessor :organization, :relative_xpath=>'oxns:name[@type="institutional"]', :children=>[
74
+ # {:role=>{:children=>[
75
+ # {:text=>{:relative_xpath=>'oxns:roleTerm[@type="text"]'}},
76
+ # {:code=>{:relative_xpath=>'oxns:roleTerm[@type="code"]'}}
77
+ # ]}}
78
+ # ]
79
+ # accessor :conference, :relative_xpath=>'oxns:name[@type="conference"]', :children=>[
80
+ # {:role=>{:children=>[
81
+ # {:text=>{:relative_xpath=>'oxns:roleTerm[@type="text"]'}},
82
+ # {:code=>{:relative_xpath=>'oxns:roleTerm[@type="code"]'}}
83
+ # ]}}
84
+ # ]
85
+ # accessor :journal, :relative_xpath=>'oxns:relatedItem[@type="host"]', :children=>[
86
+ # {:title=>{:relative_xpath=>'oxns:titleInfo/oxns:title'}},
87
+ # {:publisher=>{:relative_xpath=>'oxns:originInfo/oxns:publisher'}},
88
+ # {:issn=>{:relative_xpath=>'oxns:identifier[@type="issn"]'}},
89
+ # {:date_issued=>{:relative_xpath=>'oxns:originInfo/oxns:dateIssued'}},
90
+ # {:issue => {:relative_xpath=>"oxns:part", :children=>[
91
+ # {:volume=>{:relative_xpath=>'oxns:detail[@type="volume"]'}},
92
+ # {:level=>{:relative_xpath=>'oxns:detail[@type="level"]'}},
93
+ # {:start_page=>{:relative_xpath=>'oxns:extent[@unit="pages"]/oxns:start'}},
94
+ # {:end_page=>{:relative_xpath=>'oxns:extent[@unit="pages"]/oxns:end'}},
95
+ # {:publication_date=>{:relative_xpath=>'oxns:date'}}
96
+ # ]}}
97
+ # ]
98
+
99
+ end
100
+ end
@@ -0,0 +1,225 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <foxml:digitalObject VERSION="1.1" PID="hydrangea:fixture_mods_article1"
3
+ xmlns:foxml="info:fedora/fedora-system:def/foxml#"
4
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5
+ xsi:schemaLocation="info:fedora/fedora-system:def/foxml# http://www.fedora.info/definitions/1/0/foxml1-1.xsd">
6
+ <foxml:objectProperties>
7
+ <foxml:property NAME="info:fedora/fedora-system:def/model#state" VALUE="Active"/>
8
+ <foxml:property NAME="info:fedora/fedora-system:def/model#label" VALUE=""/>
9
+ <foxml:property NAME="info:fedora/fedora-system:def/model#ownerId" VALUE="fedoraAdmin"/>
10
+ <foxml:property NAME="info:fedora/fedora-system:def/model#createdDate" VALUE="2010-06-17T19:56:19.301Z"/>
11
+ <foxml:property NAME="info:fedora/fedora-system:def/view#lastModifiedDate" VALUE="2010-06-17T19:57:30.688Z"/>
12
+ </foxml:objectProperties>
13
+ <foxml:datastream ID="AUDIT" STATE="A" CONTROL_GROUP="X" VERSIONABLE="false">
14
+ <foxml:datastreamVersion ID="AUDIT.0" LABEL="Audit Trail for this object" CREATED="2010-06-17T19:56:19.301Z" MIMETYPE="text/xml" FORMAT_URI="info:fedora/fedora-system:format/xml.fedora.audit">
15
+ <foxml:xmlContent>
16
+ <audit:auditTrail xmlns:audit="info:fedora/fedora-system:def/audit#">
17
+ <audit:record ID="AUDREC1">
18
+ <audit:process type="Fedora API-M"/>
19
+ <audit:action>addDatastream</audit:action>
20
+ <audit:componentID>descMetadata</audit:componentID>
21
+ <audit:responsibility>fedoraAdmin</audit:responsibility>
22
+ <audit:date>2010-06-17T19:56:22.150Z</audit:date>
23
+ <audit:justification></audit:justification>
24
+ </audit:record>
25
+ <audit:record ID="AUDREC2">
26
+ <audit:process type="Fedora API-M"/>
27
+ <audit:action>addDatastream</audit:action>
28
+ <audit:componentID>RELS-EXT</audit:componentID>
29
+ <audit:responsibility>fedoraAdmin</audit:responsibility>
30
+ <audit:date>2010-06-17T19:56:22.353Z</audit:date>
31
+ <audit:justification></audit:justification>
32
+ </audit:record>
33
+ <audit:record ID="AUDREC3">
34
+ <audit:process type="Fedora API-M"/>
35
+ <audit:action>addDatastream</audit:action>
36
+ <audit:componentID>rightsMetadata</audit:componentID>
37
+ <audit:responsibility>fedoraAdmin</audit:responsibility>
38
+ <audit:date>2010-06-17T19:56:23.335Z</audit:date>
39
+ <audit:justification></audit:justification>
40
+ </audit:record>
41
+ <audit:record ID="AUDREC4">
42
+ <audit:process type="Fedora API-M"/>
43
+ <audit:action>addDatastream</audit:action>
44
+ <audit:componentID>properties</audit:componentID>
45
+ <audit:responsibility>fedoraAdmin</audit:responsibility>
46
+ <audit:date>2010-06-17T19:56:23.477Z</audit:date>
47
+ <audit:justification></audit:justification>
48
+ </audit:record>
49
+ <audit:record ID="AUDREC5">
50
+ <audit:process type="Fedora API-M"/>
51
+ <audit:action>modifyObject</audit:action>
52
+ <audit:componentID></audit:componentID>
53
+ <audit:responsibility>fedoraAdmin</audit:responsibility>
54
+ <audit:date>2010-06-17T19:57:30.688Z</audit:date>
55
+ <audit:justification></audit:justification>
56
+ </audit:record>
57
+ </audit:auditTrail>
58
+ </foxml:xmlContent>
59
+ </foxml:datastreamVersion>
60
+ </foxml:datastream>
61
+ <foxml:datastream ID="DC" STATE="A" CONTROL_GROUP="X" VERSIONABLE="true">
62
+ <foxml:datastreamVersion ID="DC1.0" LABEL="Dublin Core Record for this object" CREATED="2010-06-17T19:56:19.301Z" MIMETYPE="text/xml" FORMAT_URI="http://www.openarchives.org/OAI/2.0/oai_dc/" SIZE="360">
63
+ <foxml:xmlContent>
64
+ <oai_dc:dc xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd">
65
+ <dc:identifier>hydrangea:fixture_mods_article1</dc:identifier>
66
+ </oai_dc:dc>
67
+ </foxml:xmlContent>
68
+ </foxml:datastreamVersion>
69
+ </foxml:datastream>
70
+ <foxml:datastream ID="descMetadata" STATE="A" CONTROL_GROUP="X" VERSIONABLE="true">
71
+ <foxml:datastreamVersion ID="descMetadata.0" LABEL="" CREATED="2010-06-17T19:56:22.150Z" MIMETYPE="text/xml" SIZE="19">
72
+ <foxml:xmlContent>
73
+ <mods version="3.0" xsi:schemaLocation="http://www.loc.gov/mods/v3
74
+ http://www.loc.gov/standards/mods/v3/mods-3-0.xsd" xmlns="http://www.loc.gov/mods/v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
75
+
76
+ <titleInfo>
77
+ <nonSort>THE</nonSort>
78
+ <title>ARTICLE TITLE</title>
79
+ <subTitle>SUBTITLE</subTitle>
80
+ </titleInfo>
81
+ <titleInfo type="alternative">
82
+ <title>VARYING FORM OF TITLE</title>
83
+ </titleInfo>
84
+
85
+ <name type="personal">
86
+ <namePart type="family">FAMILY NAME</namePart>
87
+ <namePart type="given">GIVEN NAMES</namePart>
88
+ <namePart type="termsOfAddress">DR.</namePart>
89
+ <displayForm>NAME AS IT APPEARS</displayForm>
90
+ <affiliation>FACULTY, UNIVERSITY</affiliation>
91
+ <role>
92
+ <roleTerm authority="marcrelator" type="text">creator</roleTerm>
93
+ </role>
94
+ <role>
95
+ <roleTerm type="text">submitter</roleTerm>
96
+ </role>
97
+ </name>
98
+ <name type="personal">
99
+ <namePart type="family">Lacks</namePart>
100
+ <namePart type="given">Henrietta</namePart>
101
+ <displayForm>HeLa</displayForm>
102
+ <affiliation>Baltimore</affiliation>
103
+ <role>
104
+ <roleTerm type="text">contributor</roleTerm>
105
+ </role>
106
+ </name>
107
+
108
+ <typeOfResource>text</typeOfResource>
109
+ <genre authority="local">journal article</genre>
110
+
111
+ <abstract>ABSTRACT</abstract>
112
+ <subject>
113
+ <topic>TOPIC 1</topic>
114
+ <topic>TOPIC 2</topic>
115
+ </subject>
116
+ <subject authority="AUTHORITY SOURCE (RFCD, LCSH)">
117
+ <topic>CONTROLLED TERM</topic>
118
+ </subject>
119
+
120
+ <language>
121
+ <languageTerm authority="iso639-2b" type="code">en-aus </languageTerm>
122
+ </language>
123
+
124
+ <physicalDescription>
125
+ <internetMediaType>application/pdf</internetMediaType>
126
+ <extent>36 p.</extent>
127
+ </physicalDescription>
128
+
129
+ <relatedItem type="host">
130
+ <titleInfo>
131
+ <title>TITLE OF HOST JOURNAL</title>
132
+ </titleInfo>
133
+ <originInfo>
134
+ <publisher>PUBLISHER</publisher>
135
+ <dateIssued>DATE</dateIssued>
136
+ </originInfo>
137
+ <identifier type="issn">0013-8908</identifier>
138
+ <part>
139
+ <detail type="volume">
140
+ <number>2</number>
141
+ </detail>
142
+ <detail type="level">
143
+ <number>2</number>
144
+ </detail>
145
+ <extent unit="pages">
146
+ <start>195</start>
147
+ <end>230</end>
148
+ </extent>
149
+ <date>FEB. 2007</date>
150
+ </part>
151
+ </relatedItem>
152
+
153
+ <identifier type="uri">http://URL.edu.au/</identifier>
154
+ <identifier type="doi">doi:10.1006/jmbi.1995.0238</identifier>
155
+ <location>
156
+ <url>http://URL.edu.au/</url>
157
+ </location>
158
+ <accessCondition type="restrictionOnAccess">EMBARGO NOTE</accessCondition>
159
+ <accessCondition type="use and reproduction">OPEN ACCESS</accessCondition>
160
+
161
+ </mods>
162
+ </foxml:xmlContent>
163
+ </foxml:datastreamVersion>
164
+ </foxml:datastream>
165
+ <foxml:datastream ID="RELS-EXT" STATE="A" CONTROL_GROUP="X" VERSIONABLE="true">
166
+ <foxml:datastreamVersion ID="RELS-EXT.0" LABEL="" CREATED="2010-06-17T19:56:22.353Z" MIMETYPE="text/xml" SIZE="306">
167
+ <foxml:xmlContent>
168
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
169
+ <rdf:Description rdf:about="info:fedora/hydrangea:fixture_mods_article1">
170
+ <hasModel xmlns="info:fedora/fedora-system:def/relations-external#" rdf:resource="info:fedora/afmodel:HydrangeaArticle"></hasModel>
171
+ </rdf:Description>
172
+ </rdf:RDF>
173
+ </foxml:xmlContent>
174
+ </foxml:datastreamVersion>
175
+ </foxml:datastream>
176
+ <foxml:datastream ID="rightsMetadata" STATE="A" CONTROL_GROUP="X" VERSIONABLE="true">
177
+ <foxml:datastreamVersion ID="rightsMetadata.0" LABEL="" CREATED="2010-06-17T19:56:23.335Z" MIMETYPE="text/xml" SIZE="19">
178
+ <foxml:xmlContent>
179
+ <rightsMetadata>
180
+ <copyright>
181
+ <human>(c)2009 The Hydra Project</human>
182
+ <human type="someSpecialisedType">Blah Blah</human>
183
+ <human type="aDifferentType">More blah</human>
184
+ <machine><a rel="license" href="http://creativecommons.org/licenses/publicdomain/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/publicdomain/88x31.png" /></a><br />This work is in the <a rel="license" href="http://creativecommons.org/licenses/publicdomain/">Public Domain</a>.</machine>
185
+ </copyright>
186
+ <access type="discover">
187
+ <human></human>
188
+ <machine>
189
+ <policy>hydra-policy:4502</policy>
190
+ <group>public</group>
191
+ </machine>
192
+ </access>
193
+ <access type="read">
194
+ <human></human>
195
+ <machine>
196
+ <group>public</group>
197
+ </machine>
198
+ </access>
199
+ <access type="edit">
200
+ <human></human>
201
+ <machine>
202
+ <person>researcher1</person>
203
+ <group>archivist</group>
204
+ </machine>
205
+ </access>
206
+ <access type="etc">
207
+ <!-- etc -->
208
+ </access>
209
+ <use>
210
+ <human>You are free to re-distribute this object, but you cannot change it or sell it. </human>
211
+ <machine><a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/3.0/us/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-nd/3.0/us/88x31.png" /></a><br />This <span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Sound" rel="dc:type">work</span> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/3.0/us/">Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 United States License</a>.</machine>
212
+ </use>
213
+
214
+ </rightsMetadata>
215
+ </foxml:xmlContent>
216
+ </foxml:datastreamVersion>
217
+ </foxml:datastream>
218
+ <foxml:datastream ID="properties" STATE="A" CONTROL_GROUP="X" VERSIONABLE="true">
219
+ <foxml:datastreamVersion ID="properties.0" LABEL="" CREATED="2010-06-17T19:56:23.477Z" MIMETYPE="text/xml" SIZE="19">
220
+ <foxml:xmlContent>
221
+ <fields></fields>
222
+ </foxml:xmlContent>
223
+ </foxml:datastreamVersion>
224
+ </foxml:datastream>
225
+ </foxml:digitalObject>
@@ -1,5 +1,4 @@
1
1
  require File.join( File.dirname(__FILE__), "../spec_helper" )
2
-
3
2
  require 'rexml/document'
4
3
  require "hydra"
5
4
 
@@ -35,7 +34,7 @@ describe ActiveFedora::Base do
35
34
  # m.root_property :myxml, "my_xml", "http://www.example.gov/schema/v3"
36
35
  # end
37
36
 
38
- has_metadata :name=>"mods_article", :type=> Hydra::ModsArticle
37
+ has_metadata :name=>"mods_article", :type=> Hydra::SampleModsDatastream
39
38
 
40
39
  has_metadata :name => "dublin_core", :type => ActiveFedora::QualifiedDublinCoreDatastream do |m|
41
40
  # Default :multiple => true
@@ -0,0 +1,45 @@
1
+ require File.join( File.dirname(__FILE__), "../spec_helper" )
2
+ # require File.join( File.dirname(__FILE__), "..", "samples", "models", "mods_article" )
3
+ require "hydra"
4
+ describe ActiveFedora::Base do
5
+
6
+ before(:all) do
7
+ class HydrangeaArticle < ActiveFedora::Base
8
+
9
+ has_relationship "parts", :is_part_of, :inbound => true
10
+
11
+ # Uses the Hydra Rights Metadata Schema for tracking access permissions & copyright
12
+ # has_metadata :name => "rightsMetadata", :type => Hydra::RightsMetadata
13
+
14
+ # Uses the Hydra MODS Article profile for tracking most of the descriptive metadata
15
+ has_metadata :name => "descMetadata", :type => Hydra::SampleModsDatastream
16
+
17
+ # A place to put extra metadata values
18
+ has_metadata :name => "properties", :type => ActiveFedora::MetadataDatastream do |m|
19
+ m.field 'collection', :string
20
+ end
21
+ end
22
+ end
23
+
24
+ before(:each) do
25
+ @test_article = HydrangeaArticle.load_instance("hydrangea:fixture_mods_article1")
26
+ end
27
+
28
+ describe ".update_indexed_attributes" do
29
+ before(:each) do
30
+ @test_article.update_indexed_attributes({[{:person=>0}, :first_name] => "GIVEN NAMES"}, :datastreams=>"descMetadata")
31
+ end
32
+ after(:each) do
33
+ @test_article.update_indexed_attributes({[{:person=>0}, :first_name] => "GIVEN NAMES"}, :datastreams=>"descMetadata")
34
+ end
35
+ it "should update the xml in the specified datatsream and save those changes to Fedora" do
36
+ @test_article.get_values_from_datastream("descMetadata", [{:person=>0}, :first_name]).should == ["GIVEN NAMES"]
37
+ test_args = {:params=>{[{:person=>0}, :first_name]=>{"0"=>"Replacement FirstName"}}, :opts=>{:datastreams=>"descMetadata"}}
38
+ @test_article.update_indexed_attributes(test_args[:params], test_args[:opts])
39
+ @test_article.get_values_from_datastream("descMetadata", [{:person=>0}, :first_name]).should == ["Replacement FirstName"]
40
+ @test_article.save
41
+ retrieved_article = HydrangeaArticle.load_instance("hydrangea:fixture_mods_article1")
42
+ retrieved_article.get_values_from_datastream("descMetadata", [{:person=>0}, :first_name]).should == ["Replacement FirstName"]
43
+ end
44
+ end
45
+ end
@@ -14,17 +14,24 @@ describe ActiveFedora::Base do
14
14
  describe ".metadata_streams" do
15
15
  it "should return all of the datastreams from the object that are kinds of MetadataDatastreams " do
16
16
  mock_mds1 = mock("metadata ds")
17
- mock_mds1.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(true)
18
17
  mock_mds2 = mock("metadata ds")
19
- mock_mds2.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(true)
20
18
  mock_fds = mock("file ds")
21
19
  mock_fds.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(false)
22
- @test_object.expects(:datastreams).returns({:foo => mock_mds1, :bar => mock_mds2, :baz => mock_fds})
20
+ mock_ngds = mock("nokogiri ds")
21
+ mock_ngds.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(false)
22
+ mock_ngds.expects(:kind_of?).with(ActiveFedora::NokogiriDatastream).returns(true)
23
+
24
+
25
+ [mock_mds1,mock_mds2].each {|ds| ds.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(true) }
26
+ [mock_mds1,mock_mds2,mock_fds].each {|ds| ds.stubs(:kind_of?).with(ActiveFedora::NokogiriDatastream).returns(false) }
27
+
28
+ @test_object.expects(:datastreams).returns({:foo => mock_mds1, :bar => mock_mds2, :baz => mock_fds, :bork=>mock_ngds})
23
29
 
24
30
  result = @test_object.metadata_streams
25
- result.length.should == 2
31
+ result.length.should == 3
26
32
  result.should include(mock_mds1)
27
33
  result.should include(mock_mds2)
34
+ result.should include(mock_ngds)
28
35
  end
29
36
  end
30
37
 
@@ -231,11 +231,14 @@ describe ActiveFedora::Base do
231
231
  end
232
232
  it "should update solr index with all metadata if any MetadataDatastreams have changed" do
233
233
  Fedora::Repository.instance.stubs(:save)
234
- mock1 = mock("ds1", :dirty? => true, :save => true, :kind_of? => ActiveFedora::MetadataDatastream)
234
+ dirty_ds = ActiveFedora::MetadataDatastream.new
235
+ dirty_ds.expects(:dirty?).returns(true)
236
+ dirty_ds.expects(:save).returns(true)
235
237
  mock2 = mock("ds2", :dirty? => false, :new_object? => false)
236
- @test_object.stubs(:datastreams_in_memory).returns({:ds1 => mock1, :ds2 => mock2})
238
+ @test_object.stubs(:datastreams_in_memory).returns({:ds1 => dirty_ds, :ds2 => mock2})
237
239
  @test_object.expects(:update_index)
238
240
  @test_object.expects(:refresh)
241
+
239
242
  @test_object.save
240
243
  end
241
244
  it "should NOT update solr index if no MetadataDatastreams have changed" do
@@ -246,18 +249,20 @@ describe ActiveFedora::Base do
246
249
  @test_object.expects(:update_index).never
247
250
  @test_object.expects(:refresh)
248
251
  @test_object.instance_variable_set(:@new_object, false)
252
+
249
253
  @test_object.save
250
254
  end
251
255
  it "should update solr index if RELS-EXT datastream has changed" do
252
256
  Fedora::Repository.instance.stubs(:save)
253
- mock1 = mock("RELS-EXT", :dirty? => true, :save => true)
254
- mock1.expects(:kind_of?).with(ActiveFedora::MetadataDatastream).returns(false)
255
- mock1.expects(:instance_of?).with(ActiveFedora::RelsExtDatastream).returns(true)
256
- mock2 = mock("ds2", :dirty? => false, :new_object? => false)
257
- @test_object.stubs(:datastreams_in_memory).returns({"RELS-EXT" => mock1, :ds2 => mock2})
257
+ rels_ext = ActiveFedora::RelsExtDatastream.new
258
+ rels_ext.expects(:dirty?).returns(true)
259
+ rels_ext.expects(:save).returns(true)
260
+ clean_ds = mock("ds2", :dirty? => false, :new_object? => false)
261
+ @test_object.stubs(:datastreams_in_memory).returns({"RELS-EXT" => rels_ext, :clean_ds => clean_ds})
258
262
  @test_object.instance_variable_set(:@new_object, false)
259
263
  @test_object.expects(:refresh)
260
264
  @test_object.expects(:update_index)
265
+
261
266
  @test_object.save
262
267
  end
263
268
  end
@@ -283,12 +288,11 @@ describe ActiveFedora::Base do
283
288
  end
284
289
 
285
290
  it "should call .to_xml on all MetadataDatastreams and return the resulting document" do
286
- mock1 = mock("ds1", :to_xml)
287
- mock2 = mock("ds2", :to_xml)
288
- mock1.expects(:included_modules).returns( [ActiveFedora::MetadataDatastreamHelper] )
289
- mock2.expects(:included_modules).returns( [ActiveFedora::MetadataDatastreamHelper] )
291
+ ds1 = ActiveFedora::MetadataDatastream.new
292
+ ds2 = ActiveFedora::MetadataDatastream.new
293
+ [ds1,ds2].each {|ds| ds.expects(:to_xml)}
290
294
 
291
- @test_object.expects(:datastreams).returns({:ds1 => mock1, :ds2 => mock2})
295
+ @test_object.expects(:datastreams).returns({:ds1 => ds1, :ds2 => ds2})
292
296
  @test_object.to_xml
293
297
  end
294
298
  end
@@ -411,15 +415,52 @@ describe ActiveFedora::Base do
411
415
  f.pid.should == 'numbnuts:1'
412
416
 
413
417
  end
418
+
419
+ describe "get_values_from_datastream" do
420
+ it "should look up the named datastream and call get_values with the given pointer/field_name" do
421
+ mock_ds = mock("Datastream", :get_values=>["value1", "value2"])
422
+ @test_object.stubs(:datastreams_in_memory).returns({"ds1"=>mock_ds})
423
+ @test_object.get_values_from_datastream("ds1", "--my xpath--").should == ["value1", "value2"]
424
+ end
425
+ end
426
+
427
+ describe "update_datastream_attributes" do
428
+ it "should look up any datastreams specified as keys in the given hash and call update_attributes on the datastream" do
429
+ mock_desc_metadata = mock("descMetadata")
430
+ mock_properties = mock("properties")
431
+ mock_ds_hash = {'descMetadata'=>mock_desc_metadata, 'properties'=>mock_properties}
432
+
433
+ ds_values_hash = {
434
+ "descMetadata"=>{ [{:person=>0}, :role]=>{"0"=>"role1", "1"=>"role2", "2"=>"role3"} },
435
+ "properties"=>{ "notes"=>"foo" }
436
+ }
437
+ m = FooHistory.new
438
+ m.stubs(:datastreams_in_memory).returns(mock_ds_hash)
439
+ mock_desc_metadata.expects(:update_attributes).with( ds_values_hash['descMetadata'] )
440
+ mock_properties.expects(:update_attributes).with( ds_values_hash['properties'] )
441
+ m.update_datastream_attributes( ds_values_hash )
442
+ end
443
+ it "should not do anything and should return an empty hash if the specified datastream does not exist" do
444
+ ds_values_hash = {
445
+ "nonexistentDatastream"=>{ "notes"=>"foo" }
446
+ }
447
+ m = FooHistory.new
448
+ untouched_xml = m.to_xml
449
+ m.update_datastream_attributes( ds_values_hash ).should == {}
450
+ m.to_xml.should == untouched_xml
451
+ end
452
+ end
453
+
414
454
  describe "update_attributes" do
415
- it "should be able to handle ds's without fields field" do
416
- class Moo < ActiveFedora::Base;end
417
- m = Moo.new
418
- ds = mock('ds')
419
- m.expects(:datastreams).returns({ :ds1=>ds})
420
- ds.expects(:fields).returns(Hash.new)
421
- m.update_attributes(:foo=>'bar')
455
+
456
+ it "should call .update_attributes on all metadata datastreams & nokogiri datastreams" do
457
+ m = FooHistory.new
458
+ att= {"fubar"=>{"-1"=>"mork", "0"=>"york", "1"=>"mangle"}}
459
+
460
+ m.metadata_streams.each {|ds| ds.expects(:update_attributes)}
461
+ m.update_attributes(att)
422
462
  end
463
+
423
464
  it "should be able to update attr on text fields" do
424
465
  m = FooHistory.new
425
466
  m.should_not be_nil
@@ -474,92 +515,16 @@ describe ActiveFedora::Base do
474
515
  end
475
516
 
476
517
  describe "update_indexed_attributes" do
477
- it "should work for text fields" do
478
- att= {"swank"=>{"-1"=>"mork", "1"=>"york"}}
479
- n = FooHistory.new
480
- result = n.update_indexed_attributes(att)
481
- result.should == {"swank"=>{"1"=>"york", "0"=>"mork"}}
482
- n.datastreams["someData"].swank_values.should == ['mork', 'york']
483
- n.datastreams["someData"].swank_values.should == ['mork', 'york']
484
- att= {"swank"=>{"-1"=>"dork"}}
485
- result2 = n.update_indexed_attributes(att)
486
- result2.should == {"swank"=>{"2"=>"dork"}}
487
- n.datastreams["someData"].swank_values.should == ['mork', 'york', 'dork']
488
- end
489
-
490
- it "should return the new index of any added values" do
491
- n = FooHistory.new
492
- n.datastreams["someData"].swank_values = ["my_val1","my_val2"]
493
- result = n.update_indexed_attributes "swank"=>{"-1"=>"mork"}
494
- result.should == {"swank"=>{"2"=>"mork"}}
495
- end
496
-
497
- it "should return accurate response when multiple values have been added in a single run" do
498
- pending
499
- att= {"swank"=>{"-1"=>"mork", "0"=>"york"}}
500
- n = FooHistory.new
501
- n.update_indexed_attributes(att).should == {"swank"=>{"0"=>"york", "1"=>"mork"}}
502
- end
503
-
504
- it "should apply submitted hash to corresponding datastream values" do
505
- att= {"fubar"=>{"-1"=>"mork", "0"=>"york"}}
506
- n = FooHistory.new
507
- n.update_indexed_attributes(att)
508
- n.datastreams["someData"].fubar_values.should == ['mork', 'york']
509
- n.datastreams["someData"].fubar_values.should == ['mork', 'york']
510
-
511
- att= {"fubar"=>{"0"=>"zork", "1"=>"tork", "2"=>'mangle'}}
512
- n.update_indexed_attributes(att)
513
- n.datastreams["someData"].fubar_values.should == ['zork', 'tork', 'mangle']
514
-
515
- att= {"fubar"=>{"0"=>"hork", "1"=>"tork", '-1'=>'dang'}}
516
- result = n.update_indexed_attributes(att)
517
- result.should == {"fubar"=>{"0"=>"hork", "1"=>"tork", '3'=>'dang'}}
518
- n.datastreams["someData"].fubar_values.should == ['hork', 'tork', 'mangle', 'dang']
519
-
520
- #really? should it hit all matching datastreams?
521
- n.datastreams["withText"].fubar_values.should == ['hork', 'tork', 'mangle', 'dang']
522
- end
523
-
524
- it "should deal gracefully with adding new values at explicitly declared indexes" do
525
- n = FooHistory.new
526
- n.datastreams["someData"].fubar_values = ["all", "for", "the"]
527
- att = {"fubar"=>{"3"=>'glory'}}
528
- result = n.update_indexed_attributes(att)
529
- result.should == {"fubar"=>{"3"=>"glory"}}
530
- n.datastreams["someData"].fubar_values.should == ["all", "for", "the", "glory"]
531
-
532
- n.datastreams["withText"].fubar_values.should == ["glory"]
533
- end
534
-
535
- it "should allow deleting of values and should delete values so that to_xml does not return emtpy nodes" do
518
+ it "should call .update_indexed_attributes on all metadata datastreams & nokogiri datastreams" do
519
+ m = FooHistory.new
536
520
  att= {"fubar"=>{"-1"=>"mork", "0"=>"york", "1"=>"mangle"}}
537
- n = FooHistory.new
538
- n.update_indexed_attributes(att)
539
- n.datastreams["someData"].fubar_values.should == ['mork', 'york', 'mangle']
540
- rexml = REXML::Document.new(n.datastreams["someData"].to_xml)
541
- #puts rexml.root.elements.each {|el| el.to_s}
542
- #puts rexml.root.elements.to_a.inspect
543
- rexml.root.elements.to_a.length.should == 3
544
- n.update_indexed_attributes({"fubar"=>{"1"=>""}})
545
- n.datastreams["someData"].fubar_values.should == ['mork', 'mangle']
546
- rexml = REXML::Document.new(n.datastreams["someData"].to_xml)
547
- rexml.root.elements.to_a.length.should == 2
548
- n.update_indexed_attributes({"fubar"=>{"0"=>:delete}})
549
- n.datastreams["someData"].fubar_values.should == ['mangle']
550
- rexml = REXML::Document.new(n.datastreams["someData"].to_xml)
551
- rexml.root.elements.to_a.length.should == 1
552
521
 
553
- n.datastreams["someData"].fubar_values = ["val1", nil, "val2"]
554
- n.update_indexed_attributes({"fubar"=>{"1"=>""}})
555
- n.datastreams["someData"].fubar_values.should == ["val1", "val2"]
522
+ m.datastreams_in_memory.each_value {|ds| ds.expects(:update_indexed_attributes)}
523
+ m.update_indexed_attributes(att)
556
524
  end
557
-
558
-
559
525
  it "should take a :datastreams argument" do
560
526
  att= {"fubar"=>{"-1"=>"mork", "0"=>"york", "1"=>"mangle"}}
561
527
  m = FooHistory.new
562
-
563
528
  m.update_indexed_attributes(att, :datastreams=>"withText")
564
529
  m.should_not be_nil
565
530
  m.datastreams['someData'].fubar_values.should == []