rubydora 0.0.2
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/Gemfile +25 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +77 -0
- data/Rakefile +54 -0
- data/VERSION +1 -0
- data/lib/rubydora/array_with_callback.rb +34 -0
- data/lib/rubydora/callbacks.rb +49 -0
- data/lib/rubydora/datastream.rb +152 -0
- data/lib/rubydora/digital_object.rb +190 -0
- data/lib/rubydora/ext/solr.rb +103 -0
- data/lib/rubydora/ext.rb +5 -0
- data/lib/rubydora/extension_parameters.rb +40 -0
- data/lib/rubydora/models_mixin.rb +28 -0
- data/lib/rubydora/relationships_mixin.rb +101 -0
- data/lib/rubydora/repository.rb +82 -0
- data/lib/rubydora/resource_index.rb +43 -0
- data/lib/rubydora/rest_api_client/v33.rb +36 -0
- data/lib/rubydora/rest_api_client.rb +267 -0
- data/lib/rubydora.rb +46 -0
- data/rubydora.gemspec +104 -0
- data/spec/datastream_spec.rb +100 -0
- data/spec/digital_object_spec.rb +260 -0
- data/spec/ext_solr_spec.rb +70 -0
- data/spec/integration_test_spec.rb +93 -0
- data/spec/repository_spec.rb +85 -0
- data/spec/resource_index_spec.rb +28 -0
- data/spec/rest_api_client_spec.rb +146 -0
- data/spec/spec_helper.rb +4 -0
- metadata +245 -0
@@ -0,0 +1,267 @@
|
|
1
|
+
module Rubydora
|
2
|
+
|
3
|
+
# Provide low-level access to the Fedora Commons REST API
|
4
|
+
module RestApiClient
|
5
|
+
# Fedora API documentation available at {https://wiki.duraspace.org/display/FCR30/REST+API}
|
6
|
+
API_DOCUMENTATION = 'https://wiki.duraspace.org/display/FCR30/REST+API'
|
7
|
+
# Create an authorized HTTP client for the Fedora REST API
|
8
|
+
# @param [Hash] config
|
9
|
+
# @option config [String] :url
|
10
|
+
# @option config [String] :user
|
11
|
+
# @option config [String] :password
|
12
|
+
# @return [RestClient::Resource]
|
13
|
+
def client config = {}
|
14
|
+
config = self.config.merge(config)
|
15
|
+
@client ||= RestClient::Resource.new config[:url], :user => config[:user], :password => config[:password]
|
16
|
+
end
|
17
|
+
|
18
|
+
# {include:RestApiClient::API_DOCUMENTATION}
|
19
|
+
# @param [Hash] options
|
20
|
+
# @return [String]
|
21
|
+
def next_pid options = {}
|
22
|
+
options[:format] ||= 'xml'
|
23
|
+
client[url_for(object_url() + "/nextPID", options)].post nil
|
24
|
+
end
|
25
|
+
|
26
|
+
# {include:RestApiClient::API_DOCUMENTATION}
|
27
|
+
# @param [Hash] options
|
28
|
+
# @return [String]
|
29
|
+
def find_objects options = {}
|
30
|
+
raise "" if options[:terms] and options[:query]
|
31
|
+
options[:resultFormat] ||= 'xml'
|
32
|
+
|
33
|
+
client[object_url(nil, options)].get
|
34
|
+
end
|
35
|
+
|
36
|
+
# {include:RestApiClient::API_DOCUMENTATION}
|
37
|
+
# @param [Hash] options
|
38
|
+
# @option options [String] :pid
|
39
|
+
# @return [String]
|
40
|
+
def object options = {}
|
41
|
+
pid = options.delete(:pid)
|
42
|
+
options[:format] ||= 'xml'
|
43
|
+
client[object_url(pid, options)].get
|
44
|
+
end
|
45
|
+
|
46
|
+
# {include:RestApiClient::API_DOCUMENTATION}
|
47
|
+
# @param [Hash] options
|
48
|
+
# @option options [String] :pid
|
49
|
+
# @return [String]
|
50
|
+
def ingest options = {}
|
51
|
+
pid = options.delete(:pid) || 'new'
|
52
|
+
file = options.delete(:file)
|
53
|
+
client[object_url(pid, options)].post file, :content_type => 'text/xml'
|
54
|
+
end
|
55
|
+
|
56
|
+
# {include:RestApiClient::API_DOCUMENTATION}
|
57
|
+
# @param [Hash] options
|
58
|
+
# @option options [String] :pid
|
59
|
+
# @return [String]
|
60
|
+
def modify_object options = {}
|
61
|
+
pid = options.delete(:pid)
|
62
|
+
client[object_url(pid, options)].put nil
|
63
|
+
end
|
64
|
+
|
65
|
+
# {include:RestApiClient::API_DOCUMENTATION}
|
66
|
+
# @param [Hash] options
|
67
|
+
# @option options [String] :pid
|
68
|
+
# @return [String]
|
69
|
+
def purge_object options = {}
|
70
|
+
pid = options.delete(:pid)
|
71
|
+
client[object_url(pid, options)].delete
|
72
|
+
end
|
73
|
+
|
74
|
+
# {include:RestApiClient::API_DOCUMENTATION}
|
75
|
+
# @param [Hash] options
|
76
|
+
# @option options [String] :pid
|
77
|
+
# @return [String]
|
78
|
+
def object_versions options = {}
|
79
|
+
pid = options.delete(:pid)
|
80
|
+
options[:format] ||= 'xml'
|
81
|
+
raise "" unless pid
|
82
|
+
client[url_for(object_url(pid) + "/versions", options)].get
|
83
|
+
end
|
84
|
+
|
85
|
+
# {include:RestApiClient::API_DOCUMENTATION}
|
86
|
+
# @param [Hash] options
|
87
|
+
# @option options [String] :pid
|
88
|
+
# @return [String]
|
89
|
+
def object_xml options = {}
|
90
|
+
pid = options.delete(:pid)
|
91
|
+
raise "" unless pid
|
92
|
+
options[:format] ||= 'xml'
|
93
|
+
client[url_for(object_url(pid) + "/objectXML", options)].get
|
94
|
+
end
|
95
|
+
|
96
|
+
# {include:RestApiClient::API_DOCUMENTATION}
|
97
|
+
# @param [Hash] options
|
98
|
+
# @option options [String] :pid
|
99
|
+
# @option options [String] :dsid
|
100
|
+
# @return [String]
|
101
|
+
def datastream options = {}
|
102
|
+
pid = options.delete(:pid)
|
103
|
+
dsid = options.delete(:dsid)
|
104
|
+
options[:format] ||= 'xml'
|
105
|
+
client[datastream_url(pid, dsid, options)].get
|
106
|
+
end
|
107
|
+
|
108
|
+
alias_method :datastreams, :datastream
|
109
|
+
|
110
|
+
# {include:RestApiClient::API_DOCUMENTATION}
|
111
|
+
# @param [Hash] options
|
112
|
+
# @option options [String] :pid
|
113
|
+
# @option options [String] :dsid
|
114
|
+
# @return [String]
|
115
|
+
def set_datastream_options options = {}
|
116
|
+
pid = options.delete(:pid)
|
117
|
+
dsid = options.delete(:dsid)
|
118
|
+
client[datastream_url(pid, dsid, options)].put nil
|
119
|
+
end
|
120
|
+
|
121
|
+
# {include:RestApiClient::API_DOCUMENTATION}
|
122
|
+
# @param [Hash] options
|
123
|
+
# @option options [String] :pid
|
124
|
+
# @option options [String] :dsid
|
125
|
+
# @return [String]
|
126
|
+
def datastream_versions options = {}
|
127
|
+
pid = options.delete(:pid)
|
128
|
+
dsid = options.delete(:dsid)
|
129
|
+
raise "" unless dsid
|
130
|
+
options[:format] ||= 'xml'
|
131
|
+
client[url_for(datastream_url(pid, dsid) + "/versions", options)].get
|
132
|
+
end
|
133
|
+
|
134
|
+
# {include:RestApiClient::API_DOCUMENTATION}
|
135
|
+
# @param [Hash] options
|
136
|
+
# @option options [String] :pid
|
137
|
+
# @option options [String] :dsid
|
138
|
+
# @return [String]
|
139
|
+
def datastream_dissemination options = {}
|
140
|
+
pid = options.delete(:pid)
|
141
|
+
dsid = options.delete(:dsid)
|
142
|
+
raise "" unless dsid
|
143
|
+
client[url_for(datastream_url(pid, dsid) + "/content", options)].get
|
144
|
+
end
|
145
|
+
|
146
|
+
# {include:RestApiClient::API_DOCUMENTATION}
|
147
|
+
# @param [Hash] options
|
148
|
+
# @option options [String] :pid
|
149
|
+
# @option options [String] :dsid
|
150
|
+
# @return [String]
|
151
|
+
def add_datastream options = {}
|
152
|
+
pid = options.delete(:pid)
|
153
|
+
dsid = options.delete(:dsid)
|
154
|
+
file = options.delete(:file)
|
155
|
+
content_type = options.delete(:content_type) || options[:mimeType] || (MIME::Types.type_for(file.path).first if file.respond_to? :path) || 'text/plain'
|
156
|
+
client[datastream_url(pid, dsid, options)].post file, :content_type => content_type.to_s
|
157
|
+
end
|
158
|
+
|
159
|
+
# {include:RestApiClient::API_DOCUMENTATION}
|
160
|
+
# @param [Hash] options
|
161
|
+
# @option options [String] :pid
|
162
|
+
# @option options [String] :dsid
|
163
|
+
# @return [String]
|
164
|
+
def modify_datastream options = {}
|
165
|
+
pid = options.delete(:pid)
|
166
|
+
dsid = options.delete(:dsid)
|
167
|
+
file = options.delete(:file)
|
168
|
+
content_type = options.delete(:content_type) || options[:mimeType] || (MIME::Types.type_for(file.path).first if file.respond_to? :path) || 'text/plain'
|
169
|
+
client[datastream_url(pid, dsid, options)].put file, :content_type => content_type.to_s
|
170
|
+
end
|
171
|
+
|
172
|
+
# {include:RestApiClient::API_DOCUMENTATION}
|
173
|
+
# @param [Hash] options
|
174
|
+
# @option options [String] :pid
|
175
|
+
# @option options [String] :dsid
|
176
|
+
# @return [String]
|
177
|
+
def purge_datastream options = {}
|
178
|
+
pid = options.delete(:pid)
|
179
|
+
dsid = options.delete(:dsid)
|
180
|
+
client[datastream_url(pid, dsid, options)].delete
|
181
|
+
end
|
182
|
+
|
183
|
+
# {include:RestApiClient::API_DOCUMENTATION}
|
184
|
+
# @param [Hash] options
|
185
|
+
# @option options [String] :pid
|
186
|
+
# @return [String]
|
187
|
+
def relationships options = {}
|
188
|
+
pid = options.delete(:pid) || options[:subject]
|
189
|
+
raise "" unless pid
|
190
|
+
options[:format] ||= 'xml'
|
191
|
+
client[url_for(object_url(pid) + "/relationships", options)].get
|
192
|
+
end
|
193
|
+
|
194
|
+
# {include:RestApiClient::API_DOCUMENTATION}
|
195
|
+
# @param [Hash] options
|
196
|
+
# @option options [String] :pid
|
197
|
+
# @return [String]
|
198
|
+
def add_relationship options = {}
|
199
|
+
pid = options.delete(:pid) || options[:subject]
|
200
|
+
client[url_for(object_url(pid) + "/relationships/new", options)].post nil
|
201
|
+
end
|
202
|
+
|
203
|
+
# {include:RestApiClient::API_DOCUMENTATION}
|
204
|
+
# @param [Hash] options
|
205
|
+
# @option options [String] :pid
|
206
|
+
# @return [String]
|
207
|
+
def purge_relationship options = {}
|
208
|
+
pid = options.delete(:pid) || options[:subject]
|
209
|
+
client[url_for(object_url(pid) + "/relationships", options)].delete
|
210
|
+
end
|
211
|
+
|
212
|
+
# {include:RestApiClient::API_DOCUMENTATION}
|
213
|
+
# @param [Hash] options
|
214
|
+
# @option options [String] :pid
|
215
|
+
# @option options [String] :sdef
|
216
|
+
# @option options [String] :method
|
217
|
+
# @return [String]
|
218
|
+
def dissemination options = {}
|
219
|
+
pid = options.delete(:pid)
|
220
|
+
sdef = options.delete(:sdef)
|
221
|
+
method = options.delete(:method)
|
222
|
+
options[:format] ||= 'xml' unless pid and sdef and method
|
223
|
+
client[dissemination_url(pid,sdef,method,options)].get
|
224
|
+
end
|
225
|
+
|
226
|
+
private
|
227
|
+
|
228
|
+
# Generate a REST API compatible URI
|
229
|
+
# @param [String] base base URI
|
230
|
+
# @param [Hash] options to convert to URL parameters
|
231
|
+
# @return [String] URI
|
232
|
+
def url_for base, options = nil
|
233
|
+
return base unless options.is_a? Hash
|
234
|
+
"#{base}" + (("?#{options.map { |key, value| "#{CGI::escape(key.to_s)}=#{CGI::escape(value.to_s)}"}.join("&") }" if options and not options.empty?) || '')
|
235
|
+
end
|
236
|
+
|
237
|
+
# Generate a base object REST API endpoint URI
|
238
|
+
# @param [String] pid
|
239
|
+
# @param [Hash] options to convert to URL parameters
|
240
|
+
# @return [String] URI
|
241
|
+
def object_url pid = nil, options = nil
|
242
|
+
url_for("objects" + (("/#{CGI::escape(pid.to_s.gsub('info:fedora/', ''))}" if pid) || ''), options)
|
243
|
+
end
|
244
|
+
|
245
|
+
# Generate a base object dissemination REST API endpoint URI
|
246
|
+
# @param [String] pid
|
247
|
+
# @param [String] sdef
|
248
|
+
# @param [String] method
|
249
|
+
# @param [Hash] options to convert to URL parameters
|
250
|
+
# @return [String] URI
|
251
|
+
def dissemination_url pid, sdef = nil, method = nil, options = nil
|
252
|
+
raise "" unless pid
|
253
|
+
url_for(object_url(pid) + "/methods" + (("/#{CGI::escape(sdef)}" if sdef) || '') + (("/#{CGI::escape(method)}" if method) || ''), options)
|
254
|
+
end
|
255
|
+
|
256
|
+
# Generate a base datastream REST API endpoint URI
|
257
|
+
# @param [String] pid
|
258
|
+
# @param [String] dsid
|
259
|
+
# @param [Hash] options to convert to URL parameters
|
260
|
+
# @return [String] URI
|
261
|
+
def datastream_url pid, dsid = nil, options = nil
|
262
|
+
raise "" unless pid
|
263
|
+
url_for(object_url(pid) + "/datastreams" + (("/#{CGI::escape(dsid)}" if dsid) || ''), options)
|
264
|
+
end
|
265
|
+
|
266
|
+
end
|
267
|
+
end
|
data/lib/rubydora.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# Fedora Commons REST API module
|
2
|
+
module Rubydora
|
3
|
+
autoload :Datastream, "rubydora/datastream"
|
4
|
+
autoload :Repository, "rubydora/repository"
|
5
|
+
autoload :ResourceIndex, "rubydora/resource_index"
|
6
|
+
autoload :RestApiClient, "rubydora/rest_api_client"
|
7
|
+
autoload :ModelsMixin, "rubydora/models_mixin"
|
8
|
+
autoload :Ext, "rubydora/ext"
|
9
|
+
autoload :RelationshipsMixin, "rubydora/relationships_mixin"
|
10
|
+
autoload :DigitalObject, "rubydora/digital_object"
|
11
|
+
autoload :ExtensionParameters, "rubydora/extension_parameters"
|
12
|
+
autoload :Callbacks, "rubydora/callbacks"
|
13
|
+
autoload :ArrayWithCallback, "rubydora/array_with_callback"
|
14
|
+
|
15
|
+
require 'fastercsv'
|
16
|
+
require 'restclient'
|
17
|
+
require 'nokogiri'
|
18
|
+
|
19
|
+
# @return [String] version
|
20
|
+
def self.version
|
21
|
+
@version ||= File.read(File.join(File.dirname(__FILE__), '..', 'VERSION')).chomp
|
22
|
+
end
|
23
|
+
|
24
|
+
# version string
|
25
|
+
VERSION = self.version
|
26
|
+
|
27
|
+
# Connect to Fedora Repository
|
28
|
+
# @return Rubydora::Repository
|
29
|
+
def self.connect *args
|
30
|
+
Repository.new *args
|
31
|
+
end
|
32
|
+
|
33
|
+
# Connect to the default Fedora Repository
|
34
|
+
# @return Rubydora::Repository
|
35
|
+
def self.repository
|
36
|
+
@repository ||= self.connect(self.default_config)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Default repository connection information
|
40
|
+
# TODO: read ENV variables?
|
41
|
+
# @return Hash
|
42
|
+
def self.default_config
|
43
|
+
{}
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
data/rubydora.gemspec
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{rubydora}
|
8
|
+
s.version = "0.0.2"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Chris Beer"]
|
12
|
+
s.date = %q{2011-04-18}
|
13
|
+
s.description = %q{Fedora Commons REST API ruby library : REQUIRES FCREPO 3.4+}
|
14
|
+
s.email = %q{chris@cbeer.info}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE.txt",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
"Gemfile",
|
21
|
+
"LICENSE.txt",
|
22
|
+
"README.rdoc",
|
23
|
+
"Rakefile",
|
24
|
+
"VERSION",
|
25
|
+
"lib/rubydora.rb",
|
26
|
+
"lib/rubydora/array_with_callback.rb",
|
27
|
+
"lib/rubydora/callbacks.rb",
|
28
|
+
"lib/rubydora/datastream.rb",
|
29
|
+
"lib/rubydora/digital_object.rb",
|
30
|
+
"lib/rubydora/ext.rb",
|
31
|
+
"lib/rubydora/ext/solr.rb",
|
32
|
+
"lib/rubydora/extension_parameters.rb",
|
33
|
+
"lib/rubydora/models_mixin.rb",
|
34
|
+
"lib/rubydora/relationships_mixin.rb",
|
35
|
+
"lib/rubydora/repository.rb",
|
36
|
+
"lib/rubydora/resource_index.rb",
|
37
|
+
"lib/rubydora/rest_api_client.rb",
|
38
|
+
"lib/rubydora/rest_api_client/v33.rb",
|
39
|
+
"rubydora.gemspec",
|
40
|
+
"spec/datastream_spec.rb",
|
41
|
+
"spec/digital_object_spec.rb",
|
42
|
+
"spec/ext_solr_spec.rb",
|
43
|
+
"spec/integration_test_spec.rb",
|
44
|
+
"spec/repository_spec.rb",
|
45
|
+
"spec/resource_index_spec.rb",
|
46
|
+
"spec/rest_api_client_spec.rb",
|
47
|
+
"spec/spec_helper.rb"
|
48
|
+
]
|
49
|
+
s.homepage = %q{http://github.com/cbeer/rubydora}
|
50
|
+
s.licenses = ["MIT"]
|
51
|
+
s.require_paths = ["lib"]
|
52
|
+
s.rubygems_version = %q{1.5.3}
|
53
|
+
s.summary = %q{Fedora Commons REST API ruby library}
|
54
|
+
s.test_files = [
|
55
|
+
"spec/datastream_spec.rb",
|
56
|
+
"spec/digital_object_spec.rb",
|
57
|
+
"spec/ext_solr_spec.rb",
|
58
|
+
"spec/integration_test_spec.rb",
|
59
|
+
"spec/repository_spec.rb",
|
60
|
+
"spec/resource_index_spec.rb",
|
61
|
+
"spec/rest_api_client_spec.rb",
|
62
|
+
"spec/spec_helper.rb"
|
63
|
+
]
|
64
|
+
|
65
|
+
if s.respond_to? :specification_version then
|
66
|
+
s.specification_version = 3
|
67
|
+
|
68
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
69
|
+
s.add_runtime_dependency(%q<fastercsv>, [">= 0"])
|
70
|
+
s.add_runtime_dependency(%q<rest-client>, [">= 0"])
|
71
|
+
s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
|
72
|
+
s.add_runtime_dependency(%q<mime-types>, [">= 0"])
|
73
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
74
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
75
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.5.1"])
|
76
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
77
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
78
|
+
s.add_development_dependency(%q<yard>, [">= 0"])
|
79
|
+
else
|
80
|
+
s.add_dependency(%q<fastercsv>, [">= 0"])
|
81
|
+
s.add_dependency(%q<rest-client>, [">= 0"])
|
82
|
+
s.add_dependency(%q<nokogiri>, [">= 0"])
|
83
|
+
s.add_dependency(%q<mime-types>, [">= 0"])
|
84
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
85
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
86
|
+
s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
|
87
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
88
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
89
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
90
|
+
end
|
91
|
+
else
|
92
|
+
s.add_dependency(%q<fastercsv>, [">= 0"])
|
93
|
+
s.add_dependency(%q<rest-client>, [">= 0"])
|
94
|
+
s.add_dependency(%q<nokogiri>, [">= 0"])
|
95
|
+
s.add_dependency(%q<mime-types>, [">= 0"])
|
96
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
97
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
98
|
+
s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
|
99
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
100
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
101
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rubydora::Datastream do
|
4
|
+
describe "create" do
|
5
|
+
before(:each) do
|
6
|
+
@mock_repository = mock(Rubydora::Repository)
|
7
|
+
@mock_object = mock(Rubydora::DigitalObject)
|
8
|
+
@mock_object.should_receive(:repository).any_number_of_times.and_return(@mock_repository)
|
9
|
+
@mock_object.should_receive(:pid).any_number_of_times.and_return 'pid'
|
10
|
+
@datastream = Rubydora::Datastream.new @mock_object, 'dsid'
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should be new" do
|
14
|
+
@mock_repository.should_receive(:datastream).and_raise("")
|
15
|
+
@datastream.new?.should == true
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should be dirty" do
|
19
|
+
@mock_repository.should_receive(:datastream).and_raise("")
|
20
|
+
@datastream.dirty?.should == true
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should call the appropriate api on save" do
|
24
|
+
@mock_repository.should_receive(:datastream).and_raise("")
|
25
|
+
@mock_repository.should_receive(:add_datastream).with(hash_including(:pid => 'pid', :dsid => 'dsid', :controlGroup => 'M', :dsState => 'A'))
|
26
|
+
@datastream.save
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should be able to override defaults" do
|
30
|
+
@mock_repository.should_receive(:datastream).and_raise("")
|
31
|
+
@mock_repository.should_receive(:add_datastream).with(hash_including(:controlGroup => 'E'))
|
32
|
+
@datastream.controlGroup = 'E'
|
33
|
+
@datastream.save
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "retrieve" do
|
38
|
+
before(:each) do
|
39
|
+
@mock_repository = mock(Rubydora::Repository)
|
40
|
+
@mock_object = mock(Rubydora::DigitalObject)
|
41
|
+
@mock_object.should_receive(:repository).any_number_of_times.and_return(@mock_repository)
|
42
|
+
@mock_object.should_receive(:pid).any_number_of_times.and_return 'pid'
|
43
|
+
@datastream = Rubydora::Datastream.new @mock_object, 'dsid'
|
44
|
+
@mock_repository.should_receive(:datastream).any_number_of_times.and_return <<-XML
|
45
|
+
<datastreamProfile>
|
46
|
+
<dsLocation>some:uri</dsLocation>
|
47
|
+
<dsLabel>label</dsLabel>
|
48
|
+
</datastreamProfile>
|
49
|
+
XML
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should not be new" do
|
53
|
+
@datastream.new?.should == false
|
54
|
+
@datastream.dirty?.should == false
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should provide attribute defaults from dsProfile" do
|
58
|
+
@datastream.dsLocation.should == 'some:uri'
|
59
|
+
@datastream.dsLabel.should == 'label'
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should mediate access to datastream contents" do
|
63
|
+
@mock_repository.should_receive(:datastream_dissemination).with(hash_including(:pid => 'pid', :dsid => 'dsid')).and_return('asdf')
|
64
|
+
@datastream.content.should == "asdf"
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "update" do
|
71
|
+
|
72
|
+
before(:each) do
|
73
|
+
@mock_repository = mock(Rubydora::Repository)
|
74
|
+
@mock_object = mock(Rubydora::DigitalObject)
|
75
|
+
@mock_object.should_receive(:repository).any_number_of_times.and_return(@mock_repository)
|
76
|
+
@mock_object.should_receive(:pid).any_number_of_times.and_return 'pid'
|
77
|
+
@datastream = Rubydora::Datastream.new @mock_object, 'dsid'
|
78
|
+
@mock_repository.should_receive(:datastream).any_number_of_times.and_return <<-XML
|
79
|
+
<datastreamProfile>
|
80
|
+
<dsLocation>some:uri</dsLocation>
|
81
|
+
<dsLabel>label</dsLabel>
|
82
|
+
</datastreamProfile>
|
83
|
+
XML
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should allow profile attributes to be replaced" do
|
87
|
+
@datastream.dsLabel = "New Label"
|
88
|
+
@datastream.dsLabel.should == "New Label"
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should call the appropriate api with any dirty attributes" do
|
92
|
+
@mock_repository.should_receive(:modify_datastream).with(hash_including(:dsLabel => "New Label"))
|
93
|
+
@datastream.dsLabel = "New Label"
|
94
|
+
@datastream.save
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|