rubydora 0.1.9 → 0.2.0

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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.9
1
+ 0.2.0
@@ -4,8 +4,10 @@ module Rubydora
4
4
  # them.
5
5
  class Datastream
6
6
  extend ActiveModel::Callbacks
7
+ define_model_callbacks :save, :create, :destroy
7
8
  define_model_callbacks :initialize, :only => :after
8
9
 
10
+
9
11
  include ActiveModel::Dirty
10
12
 
11
13
  include Rubydora::ExtensionParameters
@@ -119,27 +121,33 @@ module Rubydora
119
121
  # Add datastream to Fedora
120
122
  # @return [Rubydora::Datastream]
121
123
  def create
122
- repository.add_datastream to_api_params.merge({ :pid => pid, :dsid => dsid })
123
- reset_profile_attributes
124
- Datastream.new(digital_object, dsid)
124
+ run_callbacks :create do
125
+ repository.add_datastream to_api_params.merge({ :pid => pid, :dsid => dsid })
126
+ reset_profile_attributes
127
+ Datastream.new(digital_object, dsid)
128
+ end
125
129
  end
126
130
 
127
131
  # Modify or save the datastream
128
132
  # @return [Rubydora::Datastream]
129
133
  def save
130
- return create if new?
131
- repository.modify_datastream to_api_params.merge({ :pid => pid, :dsid => dsid })
132
- reset_profile_attributes
133
- Datastream.new(digital_object, dsid)
134
+ run_callbacks :save do
135
+ return create if new?
136
+ repository.modify_datastream to_api_params.merge({ :pid => pid, :dsid => dsid })
137
+ reset_profile_attributes
138
+ Datastream.new(digital_object, dsid)
139
+ end
134
140
  end
135
141
 
136
142
  # Purge the datastream from Fedora
137
143
  # @return [Rubydora::Datastream] `self`
138
144
  def delete
139
- repository.purge_datastream(:pid => pid, :dsid => dsid) unless self.new?
140
- digital_object.datastreams.delete(dsid)
141
- reset_profile_attributes
142
- self
145
+ run_callbacks :destroy do
146
+ repository.purge_datastream(:pid => pid, :dsid => dsid) unless self.new?
147
+ digital_object.datastreams.delete(dsid)
148
+ reset_profile_attributes
149
+ self
150
+ end
143
151
  end
144
152
 
145
153
  protected
@@ -9,6 +9,7 @@ module Rubydora
9
9
  # implementation.
10
10
  class DigitalObject
11
11
  extend ActiveModel::Callbacks
12
+ define_model_callbacks :save, :create, :destroy
12
13
  define_model_callbacks :initialize, :only => :after
13
14
  include ActiveModel::Dirty
14
15
  include Rubydora::ExtensionParameters
@@ -51,6 +52,7 @@ module Rubydora
51
52
  def self.create pid, options = {}, repository = nil
52
53
  repository ||= Rubydora.repository
53
54
  assigned_pid = repository.ingest(options.merge(:pid => pid))
55
+
54
56
  self.new assigned_pid, repository
55
57
  end
56
58
 
@@ -154,14 +156,18 @@ module Rubydora
154
156
  #
155
157
  # @return [Rubydora::DigitalObject] a new copy of this object
156
158
  def save
157
- if self.new?
158
- self.pid = repository.ingest to_api_params.merge(:pid => pid)
159
- else
160
- p = to_api_params
161
- repository.modify_object p.merge(:pid => pid) unless p.empty?
159
+ run_callbacks :save do
160
+ if self.new?
161
+ run_callbacks :create do
162
+ self.pid = repository.ingest to_api_params.merge(:pid => pid)
163
+ end
164
+ else
165
+ p = to_api_params
166
+ repository.modify_object p.merge(:pid => pid) unless p.empty?
167
+ end
162
168
  end
163
169
 
164
- self.datastreams.select { |dsid, ds| ds.changed? }.reject {|dsid, ds| ds.new? }.each { |dsid, ds| ds.save }
170
+ self.datastreams.select { |dsid, ds| ds.changed? }.each { |dsid, ds| ds.save }
165
171
  reset
166
172
  self
167
173
  end
@@ -169,9 +175,11 @@ module Rubydora
169
175
  # Purge the object from Fedora
170
176
  # @return [Rubydora::DigitalObject] `self`
171
177
  def delete
172
- repository.purge_object(:pid => pid)
173
- reset
174
- self
178
+ run_callbacks :destroy do
179
+ repository.purge_object(:pid => pid)
180
+ reset
181
+ self
182
+ end
175
183
  end
176
184
 
177
185
  # repository reference from the digital object
@@ -135,22 +135,57 @@ describe Rubydora::DigitalObject do
135
135
  @object = Rubydora::DigitalObject.new 'pid', @mock_repository
136
136
  end
137
137
 
138
- it "should save all changed datastreams" do
139
- @ds1 = mock()
140
- @ds1.should_receive(:changed?).and_return(false)
141
- @ds1.should_not_receive(:save)
142
- @ds2 = mock()
143
- @ds2.should_receive(:changed?).and_return(true)
144
- @ds2.should_receive(:new?).and_return(true)
145
- @ds2.should_not_receive(:save)
146
- @ds3 = mock()
147
- @ds3.should_receive(:changed?).and_return(true)
148
- @ds3.should_receive(:new?).and_return(false)
149
- @ds3.should_receive(:save)
150
-
151
- @object.should_receive(:datastreams).and_return({:ds1 => @ds1, :ds2 => @ds2, :ds3 => @ds3 })
138
+ describe "saving an object's datastreams" do
139
+ before do
140
+ @new_ds = mock(Rubydora::Datastream)
141
+ @new_ds.stub(:new? => true, :changed? => true, :content_changed? => true, :content => 'XXX')
142
+ @new_empty_ds = mock(Rubydora::Datastream)
143
+ @new_empty_ds.stub(:new? => true, :changed? => false, :content_changed? => false, :content => nil)
144
+ @existing_ds = mock(Rubydora::Datastream)
145
+ @existing_ds.stub(:new? => false, :changed? => false, :content_changed? => false, :content => 'YYY')
146
+ @changed_attr_ds = mock(Rubydora::Datastream)
147
+ @changed_attr_ds.stub(:new? => false, :changed? => true, :content_changed? => false, :content => 'YYY')
148
+ @changed_ds = mock(Rubydora::Datastream)
149
+ @changed_ds.stub(:new? => false, :changed? => true, :content_changed? => true, :content => 'ZZZ')
150
+ @changed_empty_ds = mock(Rubydora::Datastream)
151
+ @changed_empty_ds.stub(:new? => false, :changed? => true, :content_changed? => true, :content => nil)
152
152
 
153
- @object.save
153
+ end
154
+ it "should save a new datastream with content" do
155
+ @object.stub(:datastreams) { { :new_ds => @new_ds } }
156
+ @new_ds.should_receive(:save)
157
+ @object.save
158
+ end
159
+
160
+ it "should save a datastream whose content has changed" do
161
+ @object.stub(:datastreams) { { :changed_ds => @changed_ds } }
162
+ @changed_ds.should_receive(:save)
163
+ @object.save
164
+ end
165
+
166
+ it "should save a datastream whose attributes have changed" do
167
+ @object.stub(:datastreams) { { :changed_attr_ds => @changed_attr_ds } }
168
+ @changed_attr_ds.should_receive(:save)
169
+ @object.save
170
+ end
171
+
172
+ it "should save an existing datastream whose content is nil" do
173
+ @object.stub(:datastreams) { { :changed_empty_ds => @changed_empty_ds } }
174
+ @changed_empty_ds.should_receive(:save)
175
+ @object.save
176
+ end
177
+
178
+ it "should not save a datastream that is unchanged" do
179
+ @object.stub(:datastreams) { { :existing_ds => @existing_ds } }
180
+ @existing_ds.should_not_receive(:save)
181
+ @object.save
182
+ end
183
+
184
+ it "should not save a new datastream that never received content" do
185
+ @object.stub(:datastreams) { { :new_empty_ds => @new_empty_ds } }
186
+ @new_empty_ds.should_not_receive(:save)
187
+ @object.save
188
+ end
154
189
  end
155
190
 
156
191
  it "should save all changed attributes" do
@@ -92,6 +92,16 @@ describe "Integration testing against a live Fedora repository" do
92
92
  obj.datastreams.keys.should_not include("Test")
93
93
  end
94
94
 
95
+ it "should save changed datastreams when the object is saved" do
96
+ obj = @repository.find('test:1')
97
+ obj.datastreams["new_ds"].content = "XXX"
98
+ obj.datastreams["empty_ds"].new?
99
+ obj.save
100
+
101
+ obj.datastreams["new_ds"].new?.should == false
102
+ obj.datastreams["empty_ds"].new?.should == true
103
+ end
104
+
95
105
 
96
106
  after(:all) do
97
107
  @repository.find('test:1').delete rescue nil
metadata CHANGED
@@ -1,201 +1,155 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: rubydora
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 1
8
- - 9
9
- segments_generated: true
10
- version: 0.1.9
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ prerelease:
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Chris Beer
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-10-17 00:00:00 -05:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2011-10-28 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
22
15
  name: fastercsv
23
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &2185502160 !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- segments:
29
- - 0
30
- segments_generated: true
31
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
32
22
  type: :runtime
33
23
  prerelease: false
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
24
+ version_requirements: *2185502160
25
+ - !ruby/object:Gem::Dependency
36
26
  name: rest-client
37
- requirement: &id002 !ruby/object:Gem::Requirement
27
+ requirement: &2185501640 !ruby/object:Gem::Requirement
38
28
  none: false
39
- requirements:
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- segments:
43
- - 0
44
- segments_generated: true
45
- version: "0"
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
46
33
  type: :runtime
47
34
  prerelease: false
48
- version_requirements: *id002
49
- - !ruby/object:Gem::Dependency
35
+ version_requirements: *2185501640
36
+ - !ruby/object:Gem::Dependency
50
37
  name: nokogiri
51
- requirement: &id003 !ruby/object:Gem::Requirement
38
+ requirement: &2185501120 !ruby/object:Gem::Requirement
52
39
  none: false
53
- requirements:
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- segments:
57
- - 0
58
- segments_generated: true
59
- version: "0"
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
60
44
  type: :runtime
61
45
  prerelease: false
62
- version_requirements: *id003
63
- - !ruby/object:Gem::Dependency
46
+ version_requirements: *2185501120
47
+ - !ruby/object:Gem::Dependency
64
48
  name: mime-types
65
- requirement: &id004 !ruby/object:Gem::Requirement
49
+ requirement: &2185500140 !ruby/object:Gem::Requirement
66
50
  none: false
67
- requirements:
68
- - - ">="
69
- - !ruby/object:Gem::Version
70
- segments:
71
- - 0
72
- segments_generated: true
73
- version: "0"
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
74
55
  type: :runtime
75
56
  prerelease: false
76
- version_requirements: *id004
77
- - !ruby/object:Gem::Dependency
57
+ version_requirements: *2185500140
58
+ - !ruby/object:Gem::Dependency
78
59
  name: activesupport
79
- requirement: &id005 !ruby/object:Gem::Requirement
60
+ requirement: &2185499680 !ruby/object:Gem::Requirement
80
61
  none: false
81
- requirements:
82
- - - ">="
83
- - !ruby/object:Gem::Version
84
- segments:
85
- - 0
86
- segments_generated: true
87
- version: "0"
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
88
66
  type: :runtime
89
67
  prerelease: false
90
- version_requirements: *id005
91
- - !ruby/object:Gem::Dependency
68
+ version_requirements: *2185499680
69
+ - !ruby/object:Gem::Dependency
92
70
  name: activemodel
93
- requirement: &id006 !ruby/object:Gem::Requirement
71
+ requirement: &2185499200 !ruby/object:Gem::Requirement
94
72
  none: false
95
- requirements:
96
- - - ">="
97
- - !ruby/object:Gem::Version
98
- segments:
99
- - 0
100
- segments_generated: true
101
- version: "0"
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
102
77
  type: :runtime
103
78
  prerelease: false
104
- version_requirements: *id006
105
- - !ruby/object:Gem::Dependency
79
+ version_requirements: *2185499200
80
+ - !ruby/object:Gem::Dependency
106
81
  name: savon
107
- requirement: &id007 !ruby/object:Gem::Requirement
82
+ requirement: &2185498720 !ruby/object:Gem::Requirement
108
83
  none: false
109
- requirements:
110
- - - ">="
111
- - !ruby/object:Gem::Version
112
- segments:
113
- - 0
114
- segments_generated: true
115
- version: "0"
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
116
88
  type: :runtime
117
89
  prerelease: false
118
- version_requirements: *id007
119
- - !ruby/object:Gem::Dependency
90
+ version_requirements: *2185498720
91
+ - !ruby/object:Gem::Dependency
120
92
  name: rake
121
- requirement: &id008 !ruby/object:Gem::Requirement
93
+ requirement: &2185498020 !ruby/object:Gem::Requirement
122
94
  none: false
123
- requirements:
124
- - - ">="
125
- - !ruby/object:Gem::Version
126
- segments:
127
- - 0
128
- segments_generated: true
129
- version: "0"
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
130
99
  type: :development
131
100
  prerelease: false
132
- version_requirements: *id008
133
- - !ruby/object:Gem::Dependency
101
+ version_requirements: *2185498020
102
+ - !ruby/object:Gem::Dependency
134
103
  name: shoulda
135
- requirement: &id009 !ruby/object:Gem::Requirement
104
+ requirement: &2185497540 !ruby/object:Gem::Requirement
136
105
  none: false
137
- requirements:
138
- - - ">="
139
- - !ruby/object:Gem::Version
140
- segments:
141
- - 0
142
- segments_generated: true
143
- version: "0"
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
144
110
  type: :development
145
111
  prerelease: false
146
- version_requirements: *id009
147
- - !ruby/object:Gem::Dependency
112
+ version_requirements: *2185497540
113
+ - !ruby/object:Gem::Dependency
148
114
  name: bundler
149
- requirement: &id010 !ruby/object:Gem::Requirement
115
+ requirement: &2185497080 !ruby/object:Gem::Requirement
150
116
  none: false
151
- requirements:
152
- - - ">="
153
- - !ruby/object:Gem::Version
154
- segments:
155
- - 0
156
- segments_generated: true
157
- version: "0"
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
158
121
  type: :development
159
122
  prerelease: false
160
- version_requirements: *id010
161
- - !ruby/object:Gem::Dependency
123
+ version_requirements: *2185497080
124
+ - !ruby/object:Gem::Dependency
162
125
  name: rspec
163
- requirement: &id011 !ruby/object:Gem::Requirement
126
+ requirement: &2185496620 !ruby/object:Gem::Requirement
164
127
  none: false
165
- requirements:
166
- - - ">="
167
- - !ruby/object:Gem::Version
168
- segments:
169
- - 0
170
- segments_generated: true
171
- version: "0"
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
172
132
  type: :development
173
133
  prerelease: false
174
- version_requirements: *id011
175
- - !ruby/object:Gem::Dependency
134
+ version_requirements: *2185496620
135
+ - !ruby/object:Gem::Dependency
176
136
  name: yard
177
- requirement: &id012 !ruby/object:Gem::Requirement
137
+ requirement: &2185496160 !ruby/object:Gem::Requirement
178
138
  none: false
179
- requirements:
180
- - - ">="
181
- - !ruby/object:Gem::Version
182
- segments:
183
- - 0
184
- segments_generated: true
185
- version: "0"
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
186
143
  type: :development
187
144
  prerelease: false
188
- version_requirements: *id012
189
- description: "Fedora Commons REST API ruby library : REQUIRES FCREPO 3.4+"
190
- email:
145
+ version_requirements: *2185496160
146
+ description: ! 'Fedora Commons REST API ruby library : REQUIRES FCREPO 3.4+'
147
+ email:
191
148
  - chris@cbeer.info
192
149
  executables: []
193
-
194
150
  extensions: []
195
-
196
151
  extra_rdoc_files: []
197
-
198
- files:
152
+ files:
199
153
  - .gitignore
200
154
  - Gemfile
201
155
  - LICENSE.txt
@@ -231,43 +185,37 @@ files:
231
185
  - spec/rest_api_client_spec.rb
232
186
  - spec/soap_spec.rb
233
187
  - spec/spec_helper.rb
234
- has_rdoc: true
235
188
  homepage: http://github.com/cbeer/rubydora
236
189
  licenses: []
237
-
238
190
  post_install_message:
239
191
  rdoc_options: []
240
-
241
- require_paths:
192
+ require_paths:
242
193
  - lib
243
- required_ruby_version: !ruby/object:Gem::Requirement
194
+ required_ruby_version: !ruby/object:Gem::Requirement
244
195
  none: false
245
- requirements:
246
- - - ">="
247
- - !ruby/object:Gem::Version
248
- hash: -2479278186315579295
249
- segments:
196
+ requirements:
197
+ - - ! '>='
198
+ - !ruby/object:Gem::Version
199
+ version: '0'
200
+ segments:
250
201
  - 0
251
- segments_generated: true
252
- version: "0"
253
- required_rubygems_version: !ruby/object:Gem::Requirement
202
+ hash: -448019725647379174
203
+ required_rubygems_version: !ruby/object:Gem::Requirement
254
204
  none: false
255
- requirements:
256
- - - ">="
257
- - !ruby/object:Gem::Version
258
- hash: -2479278186315579295
259
- segments:
205
+ requirements:
206
+ - - ! '>='
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ segments:
260
210
  - 0
261
- segments_generated: true
262
- version: "0"
211
+ hash: -448019725647379174
263
212
  requirements: []
264
-
265
213
  rubyforge_project:
266
- rubygems_version: 1.3.7
214
+ rubygems_version: 1.8.10
267
215
  signing_key:
268
216
  specification_version: 3
269
217
  summary: Fedora Commons REST API ruby library
270
- test_files:
218
+ test_files:
271
219
  - spec/datastream_spec.rb
272
220
  - spec/digital_object_spec.rb
273
221
  - spec/ext_model_loader_spec.rb