rubydora 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitmodules CHANGED
@@ -1,3 +1,4 @@
1
1
  [submodule "jetty"]
2
2
  path = jetty
3
3
  url = git://github.com/projecthydra/hydra-jetty.git
4
+ ignore = dirty
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.0
1
+ 0.8.0
@@ -118,7 +118,7 @@ module Rubydora
118
118
  # Does this datastream already exist?
119
119
  # @return [Boolean]
120
120
  def new?
121
- profile.empty?
121
+ digital_object.nil? || digital_object.new? || profile_xml.blank?
122
122
  end
123
123
 
124
124
  # Retrieve the content of the datastream (and cache it)
@@ -178,18 +178,31 @@ module Rubydora
178
178
  ## Force a recheck of the profile if they've passed :validateChecksum and we don't have dsChecksumValid
179
179
  return @profile
180
180
  end
181
+
181
182
  return @profile = {} unless digital_object.respond_to? :repository
183
+
182
184
  @profile = begin
185
+ xml = profile_xml(opts)
186
+
187
+ (self.profile_xml_to_hash(xml) unless xml.blank?) || {}
188
+ end
189
+ end
190
+
191
+ def profile_xml opts = {}
192
+ @profile_xml = nil unless opts.empty?
193
+
194
+ @profile_xml ||= begin
195
+
183
196
  options = { :pid => pid, :dsid => dsid }
184
197
  options.merge!(opts)
185
198
  options[:asOfDateTime] = asOfDateTime if asOfDateTime
186
199
  options[:validateChecksum] = true if repository.config[:validateChecksum]
187
- self.profile_xml_to_hash(repository.datastream(options))
200
+ repository.datastream(options)
188
201
  rescue RestClient::Unauthorized => e
189
202
  raise e
190
203
  rescue RestClient::ResourceNotFound
191
204
  # the datastream is new
192
- {}
205
+ ''
193
206
  end
194
207
  end
195
208
 
@@ -231,7 +244,7 @@ module Rubydora
231
244
  def create
232
245
  check_if_read_only
233
246
  run_callbacks :create do
234
- repository.add_datastream to_api_params.merge({ :pid => pid, :dsid => dsid })
247
+ repository.add_datastream to_api_params.merge({ :pid => pid, :dsid => dsid, :content => content })
235
248
  reset_profile_attributes
236
249
  self.class.new(digital_object, dsid, @options)
237
250
  end
@@ -290,6 +303,7 @@ module Rubydora
290
303
  # @return [Hash]
291
304
  def reset_profile_attributes
292
305
  @profile = nil
306
+ @profile_xml = nil
293
307
  @changed_attributes = {}
294
308
  end
295
309
 
@@ -90,7 +90,6 @@ module Rubydora
90
90
  _run_initialize_callbacks do
91
91
  self.pid = pid
92
92
  @repository = repository
93
- @new = true
94
93
  @options = options
95
94
 
96
95
  options.each do |key, value|
@@ -110,8 +109,7 @@ module Rubydora
110
109
  # Does this object already exist?
111
110
  # @return [Boolean]
112
111
  def new?
113
- self.profile ### Make sure we've checked the repository at least once
114
- @new
112
+ self.profile_xml.blank?
115
113
  end
116
114
 
117
115
  def asOfDateTime asOfDateTime = nil
@@ -129,10 +127,9 @@ module Rubydora
129
127
  # Retrieve the object profile as a hash (and cache it)
130
128
  # @return [Hash] see Fedora #getObject documentation for keys
131
129
  def profile
130
+ return {} if profile_xml.nil?
131
+
132
132
  @profile ||= begin
133
- options = { :pid => pid }
134
- options[:asOfDateTime] = asOfDateTime if asOfDateTime
135
- profile_xml = repository.object(options)
136
133
  profile_xml.gsub! '<objectProfile', '<objectProfile xmlns="http://www.fedora.info/definitions/1/0/access/"' unless profile_xml =~ /xmlns=/
137
134
  doc = Nokogiri::XML(profile_xml)
138
135
  h = doc.xpath('/access:objectProfile/*', {'access' => "http://www.fedora.info/definitions/1/0/access/"} ).inject({}) do |sum, node|
@@ -153,11 +150,20 @@ module Rubydora
153
150
  @new = false
154
151
 
155
152
  h
156
- rescue RestClient::ResourceNotFound => e
157
- {}
153
+
158
154
  end.freeze
159
155
  end
160
156
 
157
+ def profile_xml
158
+ @profile_xml ||= begin
159
+ options = { :pid => pid }
160
+ options[:asOfDateTime] = asOfDateTime if asOfDateTime
161
+ repository.object(options)
162
+ rescue RestClient::ResourceNotFound => e
163
+ ''
164
+ end
165
+ end
166
+
161
167
  def versions
162
168
  versions_xml = repository.object_versions(:pid => pid)
163
169
  versions_xml.gsub! '<fedoraObjectHistory', '<fedoraObjectHistory xmlns="http://www.fedora.info/definitions/1/0/access/"' unless versions_xml =~ /xmlns=/
@@ -210,6 +216,7 @@ module Rubydora
210
216
  if self.new?
211
217
  self.pid = repository.ingest to_api_params.merge(:pid => pid)
212
218
  @profile = nil #will cause a reload with updated data
219
+ @profile_xml = nil
213
220
  else
214
221
  p = to_api_params
215
222
  repository.modify_object p.merge(:pid => pid) unless p.empty?
@@ -228,6 +235,7 @@ module Rubydora
228
235
  run_callbacks :destroy do
229
236
  @datastreams = nil
230
237
  @profile = nil
238
+ @profile_xml = nil
231
239
  @pid = nil
232
240
  nil
233
241
  end
@@ -4,7 +4,7 @@ describe Rubydora::Datastream do
4
4
  before do
5
5
  @mock_repository = mock(Rubydora::Repository, :config=>{})
6
6
  @mock_object = mock(Rubydora::DigitalObject)
7
- @mock_object.stub(:repository => @mock_repository, :pid => 'pid')
7
+ @mock_object.stub(:repository => @mock_repository, :pid => 'pid', :new? => false)
8
8
  end
9
9
 
10
10
 
@@ -53,7 +53,8 @@ describe Rubydora::Datastream do
53
53
 
54
54
 
55
55
  it "should call the appropriate api on save" do
56
- @mock_repository.should_receive(:add_datastream).with(hash_including(:pid => 'pid', :dsid => 'dsid', :controlGroup => 'M', :dsState => 'A'))
56
+ @datastream.stub(:content => 'content')
57
+ @mock_repository.should_receive(:add_datastream).with(hash_including(:content => 'content', :pid => 'pid', :dsid => 'dsid', :controlGroup => 'M', :dsState => 'A'))
57
58
  @datastream.save
58
59
  end
59
60
 
@@ -211,7 +212,11 @@ describe Rubydora::Datastream do
211
212
  end
212
213
 
213
214
  describe "has_content?" do
214
- subject { Rubydora::Datastream.new mock(:pid => 'asdf'), 'asdf' }
215
+ before(:each) do
216
+ subject.stub(:new? => true)
217
+ end
218
+
219
+ subject { Rubydora::Datastream.new mock(:pid => 'asdf', :new? => false), 'asdf' }
215
220
  it "should have content if it is persisted" do
216
221
  subject.stub(:new? => false)
217
222
  subject.should have_content
@@ -223,6 +228,7 @@ describe Rubydora::Datastream do
223
228
  end
224
229
 
225
230
  it "should have content if it has a dsLocation" do
231
+
226
232
  subject.dsLocation = "urn:abc"
227
233
  subject.controlGroup = 'E'
228
234
  subject.should have_content
@@ -310,6 +316,7 @@ describe Rubydora::Datastream do
310
316
  describe "when versions are in the repo" do
311
317
  before(:each) do
312
318
  @datastream = Rubydora::Datastream.new @mock_object, 'dsid'
319
+ @datastream.stub(:new? => false)
313
320
  @mock_repository.should_receive(:datastream_versions).any_number_of_times.and_return <<-XML
314
321
  <datastreamHistory>
315
322
  <datastreamProfile>
@@ -334,6 +341,7 @@ describe Rubydora::Datastream do
334
341
 
335
342
  it "should lookup content of datastream using the asOfDateTime parameter" do
336
343
  @mock_repository.should_receive(:datastream_dissemination).with(hash_including(:asOfDateTime => '2008-08-05T01:30:05.012Z'))
344
+ Rubydora::Datastream.any_instance.stub(:new? => false)
337
345
  @datastream.versions.last.content
338
346
  end
339
347
  end
@@ -599,6 +607,7 @@ describe Rubydora::Datastream do
599
607
  describe "with existing properties" do
600
608
  before(:each) do
601
609
  @datastream = Rubydora::Datastream.new @mock_object, 'dsid'
610
+ @datastream.stub(:new? => false)
602
611
  @datastream.stub(:profile) { {'dsMIME' => 'application/rdf+xml', 'dsChecksumType' =>'DISABLED', 'dsVersionable'=>true, 'dsControlGroup'=>'M', 'dsState'=>'A'} }
603
612
  end
604
613
  it "should not set unchanged values except for mimeType" do
@@ -616,6 +625,7 @@ describe Rubydora::Datastream do
616
625
  describe "without existing properties" do
617
626
  before(:each) do
618
627
  @datastream = Rubydora::Datastream.new @mock_object, 'dsid'
628
+ @datastream.stub(:new? => true )
619
629
  @datastream.stub(:profile) { {} }
620
630
  end
621
631
  it "should compile parameters to hash" do
@@ -92,6 +92,7 @@ describe Rubydora::DigitalObject do
92
92
  "<objectDatastreams><datastream dsid='a'></datastream>><datastream dsid='b'></datastream>><datastream dsid='c'></datastream></objectDatastreams>"
93
93
  end
94
94
  @object = Rubydora::DigitalObject.new 'pid', @mock_repository
95
+ @object.stub(:new? => false)
95
96
  end
96
97
 
97
98
  describe "datastreams" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubydora
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-04 00:00:00.000000000 Z
12
+ date: 2012-12-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fastercsv