ruby-fedora 0.1.0 → 0.1.1
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/Manifest.txt +1 -1
- data/README.txt +26 -11
- data/config/hoe.rb +1 -2
- data/lib/fedora/base.rb +31 -0
- data/lib/fedora/connection.rb +164 -22
- data/lib/fedora/datastream.rb +1 -1
- data/lib/fedora/fedora_object.rb +1 -1
- data/lib/fedora/repository.rb +6 -6
- data/lib/ruby-fedora.rb +1 -1
- data/test/test_helper.rb +1 -1
- metadata +16 -11
- data/lib/fedora/base_object.rb +0 -19
- data/test/test_fedora.rb +0 -55
- data/test/test_httpclient.rb +0 -73
- data/test/test_restful_bits.rb +0 -63
- data/test/test_restful_fedora.rb +0 -160
data/Manifest.txt
CHANGED
data/README.txt
CHANGED
@@ -1,19 +1,34 @@
|
|
1
|
-
This should describe how this stuff can be built, tested and used...
|
2
|
-
|
3
1
|
== Installation
|
4
2
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
gem install ruby-fedora
|
4
|
+
|
5
|
+
irb
|
6
|
+
|
7
|
+
require 'ruby-fedora'
|
8
|
+
repository = Fedora::Repository.new('http://localhost:8080/fedora')
|
9
|
+
test_object = Fedora::FedoraObject.new(:label => 'test', :contentModel => 'Image', :state => 'A', :ownerID => 'fedoraAdmin')
|
10
|
+
repository.save(test_object)
|
11
|
+
|
12
|
+
objects = repository.find_objects('label~Image*')
|
13
|
+
object = repository.fetch_conent('demo:1')
|
14
|
+
|
15
|
+
|
16
|
+
Check out spec/repository_spec.rb for more examples.
|
17
|
+
|
18
|
+
== Build Test/Specs
|
19
|
+
|
20
|
+
To run ruby-fedora specs, install the following gems:
|
21
|
+
|
22
|
+
gem install facets mime-types rspec
|
23
|
+
|
24
|
+
To run the active-fedora specs, install the following gems:
|
25
|
+
|
26
|
+
- ambition
|
9
27
|
- syntax
|
10
28
|
- ParseTree
|
11
|
-
|
29
|
+
|
30
|
+
Then run "rake spec"
|
12
31
|
|
13
32
|
== TODO
|
14
33
|
|
15
|
-
- specify gem dependencies in hoe.rb
|
16
|
-
- implement finders with Ambition
|
17
|
-
- implement ActiveFedora::Base.establish_connection to read from repository.yml (or fedora.yml)
|
18
|
-
- remove dependencies on activeresource gem
|
19
34
|
- remove anything in test/* that are no longer relevant
|
data/config/hoe.rb
CHANGED
@@ -58,8 +58,7 @@ hoe = Hoe.new(GEM_NAME, VERS) do |p|
|
|
58
58
|
|
59
59
|
# == Optional
|
60
60
|
p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
|
61
|
-
|
62
|
-
p.extra_deps = [['activeresource'], ['facets']]
|
61
|
+
p.extra_deps = [['facets', '>=2.4.0'], ['xml-simple', '>=1.0.11'], ['mime-types', '>=1.15']]
|
63
62
|
#p.spec_extras = {} # A hash of extra values to set in the gemspec.
|
64
63
|
end
|
65
64
|
|
data/lib/fedora/base.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'xmlsimple'
|
2
|
+
|
3
|
+
class Hash
|
4
|
+
def to_query
|
5
|
+
self.collect { |key, value| "#{CGI.escape(key.to_s)}=#{CGI.escape(value.to_s)}" }.sort * '&'
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.from_xml(xml)
|
9
|
+
XmlSimple.xml_in(xml, 'ForceArray' => false)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class Fedora::BaseObject
|
14
|
+
attr_accessor :attributes, :blob, :uri, :url
|
15
|
+
attr_reader :errors, :uri
|
16
|
+
attr_writer :new_object
|
17
|
+
|
18
|
+
# == Parameters
|
19
|
+
# attrs<Hash>:: object attributes
|
20
|
+
#-
|
21
|
+
def initialize(attrs = nil)
|
22
|
+
@new_object = true
|
23
|
+
@attributes = attrs || {}
|
24
|
+
@errors = []
|
25
|
+
@blob = attributes.delete(:blob)
|
26
|
+
end
|
27
|
+
|
28
|
+
def new_object?
|
29
|
+
@new_object
|
30
|
+
end
|
31
|
+
end
|
data/lib/fedora/connection.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require "base64"
|
2
2
|
require 'cgi'
|
3
3
|
require "mime/types"
|
4
|
+
require 'net/http'
|
5
|
+
require 'net/https'
|
4
6
|
|
5
7
|
# Add multipart/form-data support to net/http
|
6
8
|
#
|
@@ -55,43 +57,183 @@ class Net::HTTP::Put
|
|
55
57
|
include Fedora::Multipart
|
56
58
|
end
|
57
59
|
|
58
|
-
|
59
|
-
|
60
|
+
module RubyFedora
|
61
|
+
# This class is based on ActiveResource::Connection so MIT license applies.
|
62
|
+
class ConnectionError < StandardError # :nodoc:
|
63
|
+
attr_reader :response
|
64
|
+
|
65
|
+
def initialize(response, message = nil)
|
66
|
+
@response = response
|
67
|
+
@message = message
|
68
|
+
end
|
69
|
+
|
70
|
+
def to_s
|
71
|
+
"Failed with #{response.code} #{response.message if response.respond_to?(:message)}"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# 3xx Redirection
|
76
|
+
class Redirection < ConnectionError # :nodoc:
|
77
|
+
def to_s; response['Location'] ? "#{super} => #{response['Location']}" : super; end
|
78
|
+
end
|
79
|
+
|
80
|
+
# 4xx Client Error
|
81
|
+
class ClientError < ConnectionError; end # :nodoc:
|
82
|
+
|
83
|
+
# 400 Bad Request
|
84
|
+
class BadRequest < ClientError; end # :nodoc
|
85
|
+
|
86
|
+
# 401 Unauthorized
|
87
|
+
class UnauthorizedAccess < ClientError; end # :nodoc
|
88
|
+
|
89
|
+
# 403 Forbidden
|
90
|
+
class ForbiddenAccess < ClientError; end # :nodoc
|
91
|
+
|
92
|
+
# 404 Not Found
|
93
|
+
class ResourceNotFound < ClientError; end # :nodoc:
|
94
|
+
|
95
|
+
# 409 Conflict
|
96
|
+
class ResourceConflict < ClientError; end # :nodoc:
|
97
|
+
|
98
|
+
# 5xx Server Error
|
99
|
+
class ServerError < ConnectionError; end # :nodoc:
|
100
|
+
|
101
|
+
# 405 Method Not Allowed
|
102
|
+
class MethodNotAllowed < ClientError # :nodoc:
|
103
|
+
def allowed_methods
|
104
|
+
@response['Allow'].split(',').map { |verb| verb.strip.downcase.to_sym }
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
# Class to handle connections to remote web services.
|
109
|
+
# This class is used by ActiveResource::Base to interface with REST
|
110
|
+
# services.
|
60
111
|
class Connection
|
61
|
-
|
62
|
-
|
63
|
-
|
112
|
+
attr_reader :site
|
113
|
+
attr_accessor :format
|
114
|
+
|
115
|
+
class << self
|
116
|
+
def requests
|
117
|
+
@@requests ||= []
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
# The +site+ parameter is required and will set the +site+
|
122
|
+
# attribute to the URI for the remote resource service.
|
123
|
+
def initialize(site, format = ActiveResource::Formats[:xml])
|
124
|
+
raise ArgumentError, 'Missing site URI' unless site
|
125
|
+
self.site = site
|
126
|
+
self.format = format
|
127
|
+
end
|
128
|
+
|
129
|
+
# Set URI for remote service.
|
130
|
+
def site=(site)
|
131
|
+
@site = site.is_a?(URI) ? site : URI.parse(site)
|
132
|
+
end
|
133
|
+
|
134
|
+
# Execute a GET request.
|
135
|
+
# Used to get (find) resources.
|
136
|
+
def get(path, headers = {})
|
137
|
+
format.decode(request(:get, path, build_request_headers(headers)).body)
|
138
|
+
end
|
139
|
+
|
140
|
+
# Execute a DELETE request (see HTTP protocol documentation if unfamiliar).
|
141
|
+
# Used to delete resources.
|
142
|
+
def delete(path, headers = {})
|
143
|
+
request(:delete, path, build_request_headers(headers))
|
144
|
+
end
|
145
|
+
|
146
|
+
# Execute a PUT request (see HTTP protocol documentation if unfamiliar).
|
147
|
+
# Used to update resources.
|
64
148
|
def put(path, body = '', headers = {})
|
65
149
|
if body.is_a?(File)
|
66
150
|
multipart_request(Net::HTTP::Put.new(path, build_request_headers(headers)), body)
|
67
151
|
else
|
68
|
-
|
69
|
-
end
|
152
|
+
request(:put, path, body.to_s, build_request_headers(headers))
|
153
|
+
end
|
70
154
|
end
|
71
|
-
|
155
|
+
|
156
|
+
# Execute a POST request.
|
157
|
+
# Used to create new resources.
|
72
158
|
def post(path, body = '', headers = {})
|
73
159
|
if body.is_a?(File)
|
74
|
-
multipart_request(Net::HTTP::Post.new(path, build_request_headers(headers)), body)
|
160
|
+
multipart_request(Net::HTTP::Post.new(path, build_request_headers(headers)), body)
|
75
161
|
else
|
76
|
-
|
162
|
+
request(:post, path, body.to_s, build_request_headers(headers))
|
77
163
|
end
|
78
164
|
end
|
79
|
-
|
80
|
-
def
|
81
|
-
|
82
|
-
|
83
|
-
|
165
|
+
|
166
|
+
def raw_get(path, headers = {})
|
167
|
+
request(:get, path, build_request_headers(headers))
|
168
|
+
end
|
169
|
+
|
170
|
+
private
|
171
|
+
def multipart_request(req, file)
|
172
|
+
result = nil
|
84
173
|
http.start do |conn|
|
85
174
|
req.set_multipart_data(:file => file)
|
86
175
|
result = conn.request(req)
|
87
176
|
end
|
177
|
+
handle_response(result)
|
88
178
|
end
|
89
|
-
logger.info "--> #{result.code} #{result.message} (#{result.body ? result.body : 0}b %.2fs)" % time if logger
|
90
|
-
handle_response(result)
|
91
|
-
end
|
92
179
|
|
93
|
-
|
94
|
-
request(
|
95
|
-
|
180
|
+
# Makes request to remote service.
|
181
|
+
def request(method, path, *arguments)
|
182
|
+
result = http.send(method, path, *arguments)
|
183
|
+
handle_response(result)
|
184
|
+
end
|
185
|
+
|
186
|
+
# Handles response and error codes from remote service.
|
187
|
+
def handle_response(response)
|
188
|
+
case response.code.to_i
|
189
|
+
when 301,302
|
190
|
+
raise(Redirection.new(response))
|
191
|
+
when 200...400
|
192
|
+
response
|
193
|
+
when 400
|
194
|
+
raise(BadRequest.new(response))
|
195
|
+
when 401
|
196
|
+
raise(UnauthorizedAccess.new(response))
|
197
|
+
when 403
|
198
|
+
raise(ForbiddenAccess.new(response))
|
199
|
+
when 404
|
200
|
+
raise(ResourceNotFound.new(response))
|
201
|
+
when 405
|
202
|
+
raise(MethodNotAllowed.new(response))
|
203
|
+
when 409
|
204
|
+
raise(ResourceConflict.new(response))
|
205
|
+
when 422
|
206
|
+
raise(ResourceInvalid.new(response))
|
207
|
+
when 401...500
|
208
|
+
raise(ClientError.new(response))
|
209
|
+
when 500...600
|
210
|
+
raise(ServerError.new(response))
|
211
|
+
else
|
212
|
+
raise(ConnectionError.new(response, "Unknown response code: #{response.code}"))
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
# Creates new Net::HTTP instance for communication with
|
217
|
+
# remote service and resources.
|
218
|
+
def http
|
219
|
+
http = Net::HTTP.new(@site.host, @site.port)
|
220
|
+
http.use_ssl = @site.is_a?(URI::HTTPS)
|
221
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE if http.use_ssl
|
222
|
+
http
|
223
|
+
end
|
224
|
+
|
225
|
+
def default_header
|
226
|
+
@default_header ||= { 'Content-Type' => format.mime_type }
|
227
|
+
end
|
228
|
+
|
229
|
+
# Builds headers for request to remote service.
|
230
|
+
def build_request_headers(headers)
|
231
|
+
authorization_header.update(default_header).update(headers)
|
232
|
+
end
|
233
|
+
|
234
|
+
# Sets authorization header; authentication information is pulled from credentials provided with site URI.
|
235
|
+
def authorization_header
|
236
|
+
(@site.user || @site.password ? { 'Authorization' => 'Basic ' + ["#{@site.user}:#{ @site.password}"].pack('m').delete("\r\n") } : {})
|
237
|
+
end
|
96
238
|
end
|
97
|
-
end
|
239
|
+
end
|
data/lib/fedora/datastream.rb
CHANGED
data/lib/fedora/fedora_object.rb
CHANGED
data/lib/fedora/repository.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'facets/hash/symbolize_keys'
|
2
2
|
|
3
|
-
require '
|
3
|
+
require 'fedora/base'
|
4
4
|
require 'fedora/connection'
|
5
5
|
require 'fedora/formats'
|
6
6
|
require 'fedora/fedora_object'
|
@@ -73,7 +73,7 @@ module Fedora
|
|
73
73
|
case object
|
74
74
|
when Fedora::FedoraObject
|
75
75
|
pid = (object.pid ? object : 'new')
|
76
|
-
response = connection.post("#{url_for(pid)}?" + object.attributes.to_query, object.
|
76
|
+
response = connection.post("#{url_for(pid)}?" + object.attributes.to_query, object.blob)
|
77
77
|
if response.code == '201'
|
78
78
|
object.pid = extract_pid(response)
|
79
79
|
object.new_object = false
|
@@ -84,7 +84,7 @@ module Fedora
|
|
84
84
|
when Fedora::Datastream
|
85
85
|
raise ArgumentError, "Missing dsID attribute" if object.dsid.nil?
|
86
86
|
response = connection.post("#{url_for(object)}?" + object.attributes.to_query,
|
87
|
-
object.
|
87
|
+
object.blob)
|
88
88
|
if response.code == '201'
|
89
89
|
object.new_object = false
|
90
90
|
true
|
@@ -109,7 +109,7 @@ module Fedora
|
|
109
109
|
response.code == '307'
|
110
110
|
when Fedora::Datastream
|
111
111
|
raise ArgumentError, "Missing dsID attribute" if object.dsid.nil?
|
112
|
-
response = connection.put("#{url_for(object)}?" + object.attributes.to_query, object.
|
112
|
+
response = connection.put("#{url_for(object)}?" + object.attributes.to_query, object.blob)
|
113
113
|
response.code == '201'
|
114
114
|
else
|
115
115
|
raise ArgumentError, "Unknown object type"
|
@@ -154,7 +154,7 @@ module Fedora
|
|
154
154
|
def convert_xml(response)
|
155
155
|
results = FedoraObjects.new
|
156
156
|
return results unless response && response['resultList']
|
157
|
-
|
157
|
+
|
158
158
|
results.session_token = response['listSession']['token'] if response['listSession']
|
159
159
|
objectFields = response['resultList']['objectFields']
|
160
160
|
case objectFields
|
@@ -177,7 +177,7 @@ module Fedora
|
|
177
177
|
# or not (defaults to +false+).
|
178
178
|
def connection(refresh = false)
|
179
179
|
if refresh || @connection.nil?
|
180
|
-
@connection =
|
180
|
+
@connection = RubyFedora::Connection.new(@fedora_url, Fedora::XmlFormat)
|
181
181
|
end
|
182
182
|
@connection
|
183
183
|
end
|
data/lib/ruby-fedora.rb
CHANGED
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-fedora
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Zumwalt
|
@@ -9,26 +9,35 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-04-
|
12
|
+
date: 2008-04-16 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
16
|
+
name: facets
|
17
17
|
version_requirement:
|
18
18
|
version_requirements: !ruby/object:Gem::Requirement
|
19
19
|
requirements:
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
22
|
+
version: 2.4.0
|
23
23
|
version:
|
24
24
|
- !ruby/object:Gem::Dependency
|
25
|
-
name:
|
25
|
+
name: xml-simple
|
26
|
+
version_requirement:
|
27
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
|
+
requirements:
|
29
|
+
- - ">="
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: 1.0.11
|
32
|
+
version:
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: mime-types
|
26
35
|
version_requirement:
|
27
36
|
version_requirements: !ruby/object:Gem::Requirement
|
28
37
|
requirements:
|
29
38
|
- - ">="
|
30
39
|
- !ruby/object:Gem::Version
|
31
|
-
version: "
|
40
|
+
version: "1.15"
|
32
41
|
version:
|
33
42
|
description: Ruby API for Fedora
|
34
43
|
email:
|
@@ -52,7 +61,7 @@ files:
|
|
52
61
|
- config/hoe.rb
|
53
62
|
- config/requirements.rb
|
54
63
|
- lib/ruby-fedora.rb
|
55
|
-
- lib/fedora/
|
64
|
+
- lib/fedora/base.rb
|
56
65
|
- lib/fedora/connection.rb
|
57
66
|
- lib/fedora/datastream.rb
|
58
67
|
- lib/fedora/fedora_object.rb
|
@@ -106,8 +115,4 @@ signing_key:
|
|
106
115
|
specification_version: 2
|
107
116
|
summary: Ruby API for Fedora
|
108
117
|
test_files:
|
109
|
-
- test/test_fedora.rb
|
110
118
|
- test/test_helper.rb
|
111
|
-
- test/test_httpclient.rb
|
112
|
-
- test/test_restful_bits.rb
|
113
|
-
- test/test_restful_fedora.rb
|
data/lib/fedora/base_object.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
class Fedora::BaseObject
|
2
|
-
attr_accessor :attributes, :xml_content, :uri, :url
|
3
|
-
attr_reader :errors, :uri
|
4
|
-
attr_writer :new_object
|
5
|
-
|
6
|
-
# == Parameters
|
7
|
-
# attrs<Hash>:: object attributes
|
8
|
-
#-
|
9
|
-
def initialize(attrs = nil)
|
10
|
-
@new_object = true
|
11
|
-
@attributes = attrs || {}
|
12
|
-
@errors = []
|
13
|
-
@xml_content = attributes.delete(:xml_content)
|
14
|
-
end
|
15
|
-
|
16
|
-
def new_object?
|
17
|
-
@new_object
|
18
|
-
end
|
19
|
-
end
|
data/test/test_fedora.rb
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# test_fedora.rb
|
3
|
-
#
|
4
|
-
# Created: Nov 3, 2007, 6:28:37 PM
|
5
|
-
#
|
6
|
-
# Author: Matt Zumwalt <matt.zumwalt@yourmediashelf.com>
|
7
|
-
# Copyright: Copyright (c) 2007 Matt Zumwalt <matt.zumwalt@yourmediashelf.com>
|
8
|
-
# License:
|
9
|
-
#
|
10
|
-
require File.dirname(__FILE__) + '/test_helper.rb'
|
11
|
-
|
12
|
-
class TestFedoraRepository < Test::Unit::TestCase
|
13
|
-
|
14
|
-
def setup
|
15
|
-
@fedora = Fedora::Repository.new(FEDORA_URL, :user => 'fedoraAdmin', :password => 'fedoraAdmin')
|
16
|
-
end
|
17
|
-
|
18
|
-
def teardown
|
19
|
-
# TODO cleanup
|
20
|
-
end
|
21
|
-
|
22
|
-
def test_namespace_juggling
|
23
|
-
namespace_info = @fedora.namespace_info
|
24
|
-
new_pid = @fedora.next_pid
|
25
|
-
|
26
|
-
assert_equal "#{namespace_info[:default_namespace]}#{namespace_info[:pid_delimiter]}100", namespace_info[:sample_pid]
|
27
|
-
assert_true namespace_info[:retained_pids].include?("fedora-bdef")
|
28
|
-
assert_true namespace_info[:retained_pids].include?("fedora-bmech")
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_objects
|
32
|
-
puts 'DEBUG 3'
|
33
|
-
test_object_1 = @fedora.objects.create(:namespace => "test") # Create a new empty object with an auto-assigned pid
|
34
|
-
# Creating multiple objects simultaneously by submitting an array
|
35
|
-
objects_array = @fedora.objects.create([{:owner_id => "MISC_USER_ID", :namespace => "test"},{:pid => "test:OBJECT_FROM_ARRAY_CREATE_TEST"}])
|
36
|
-
|
37
|
-
test_object_1.label = "DELETE_ME"
|
38
|
-
test_object_1.state = "I"
|
39
|
-
|
40
|
-
# Not sure if "save should return PID or "true"
|
41
|
-
assert_equal(true, test_object_1.save)
|
42
|
-
assert_equal(test_object_1.state, "I")
|
43
|
-
|
44
|
-
found_by_pid = @fedora.objects.find_by_pid(test_object_1.pid)
|
45
|
-
|
46
|
-
assert_equal(found_by_pid.label, test_object_1.label)
|
47
|
-
assert_equal(objects_array[0].owner_id, @fedora.objects.find_by_pid(objects_array[0].pid).owner_id)
|
48
|
-
|
49
|
-
test_object1.destroy
|
50
|
-
objects_array.each do |obj|
|
51
|
-
obj.destroy
|
52
|
-
end
|
53
|
-
# test_object2.destroy # leave this until the final cleanup...
|
54
|
-
end
|
55
|
-
end
|
data/test/test_httpclient.rb
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# @Creator Matt Zumwalt, MediaShelf LLC
|
3
|
-
# @Copyright Matt Zumwalt, 2007. All Rights Reserved.
|
4
|
-
#
|
5
|
-
require File.dirname(__FILE__) + '/test_helper.rb'
|
6
|
-
|
7
|
-
require 'uri'
|
8
|
-
require 'httpclient'
|
9
|
-
|
10
|
-
class TestFedoraHttpClient < Test::Unit::TestCase
|
11
|
-
|
12
|
-
def setup
|
13
|
-
@test_pid = "mshlf:test_httpclient"
|
14
|
-
@user = "fedoraAdmin"
|
15
|
-
@password = "fedoraAdmin"
|
16
|
-
end
|
17
|
-
|
18
|
-
def url_for(pid, dsid = nil, params = {})
|
19
|
-
url = "#{FEDORA_URL}/objects/#{@test_pid}"
|
20
|
-
url += "/datastreams/#{dsid}" if dsid
|
21
|
-
url += ("?" + params.collect { |key, value| "#{key}=#{value}" } * '&') unless params.empty?
|
22
|
-
url
|
23
|
-
end
|
24
|
-
|
25
|
-
def test_post_empty
|
26
|
-
client = HTTPClient.new
|
27
|
-
|
28
|
-
extheader = {'User-Agent' => 'RubyFedora'}
|
29
|
-
extheader['content-type'] = "text/xml"
|
30
|
-
uri = url_for(@test_pid)
|
31
|
-
|
32
|
-
client.set_basic_auth(uri, @user, @password)
|
33
|
-
create_response = client.post(uri, "", extheader)
|
34
|
-
|
35
|
-
assert_equal 201, create_response.header.response_status_code
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
def test_post_xml
|
40
|
-
client = HTTPClient.new
|
41
|
-
sample_xml_1 = File.new(File.dirname(__FILE__) + '/fixtures/mods-mskcc-filledsample.xml')
|
42
|
-
|
43
|
-
extheader = {'User-Agent' => 'RubyFedora'}
|
44
|
-
extheader['content-type'] = "text/xml"
|
45
|
-
request_body = sample_xml_1
|
46
|
-
uri = url_for(@test_pid, "XML_DS")
|
47
|
-
client.set_basic_auth(uri, @user, @password)
|
48
|
-
create_response = client.post(uri, request_body, extheader)
|
49
|
-
delete_response = client.delete(uri)
|
50
|
-
|
51
|
-
assert_equal 201, create_response.header.response_status_code
|
52
|
-
assert_equal 200, delete_response.header.response_status_code
|
53
|
-
end
|
54
|
-
|
55
|
-
def test_multipart_post
|
56
|
-
client = HTTPClient.new
|
57
|
-
sample_binary_file_1 = File.open(File.dirname(__FILE__) + "/fixtures/dino.jpg" )
|
58
|
-
|
59
|
-
boundary = Array::new(8){ "%2.2d" % rand(42) }.join('__')
|
60
|
-
extheader = {'User-Agent' => 'RubyFedora'}
|
61
|
-
extheader['content-type'] = "multipart/form-data; boundary=___#{ boundary }___"
|
62
|
-
extheader['Content-Type'] = "image/jpeg"
|
63
|
-
|
64
|
-
request_body = {'inputfile' => sample_binary_file_1}
|
65
|
-
uri = url_for(@test_pid, "BINARY_DS", { :dsLabel => "Foo+Bar" })
|
66
|
-
client.set_basic_auth(uri, @user, @password)
|
67
|
-
create_response = client.post(uri, request_body, extheader)
|
68
|
-
delete_response = client.delete(uri)
|
69
|
-
|
70
|
-
assert_equal 201, create_response.header.response_status_code
|
71
|
-
assert_equal 200, delete_response.header.response_status_code
|
72
|
-
end
|
73
|
-
end
|
data/test/test_restful_bits.rb
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# @Creator Matt Zumwalt, MediaShelf LLC
|
3
|
-
# @Copyright Matt Zumwalt, 2007. All Rights Reserved.
|
4
|
-
#
|
5
|
-
#++
|
6
|
-
|
7
|
-
require File.dirname(__FILE__) + '/test_helper.rb'
|
8
|
-
|
9
|
-
class TestRestfulFedora < Test::Unit::TestCase
|
10
|
-
def setup
|
11
|
-
@fedora = RubyFedora::RestfulFedora.new(FEDORA_URL, :user=>'fedoraAdmin', :password=>'fedoraAdmin')
|
12
|
-
@search_term = "test" # this should be a search term that will return at least one hit
|
13
|
-
@pid_delimiter = ":"
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_simple_search
|
17
|
-
test_object_pid = "test:do_not_delete"
|
18
|
-
should_not_exist = "test:never_use_this_pid"
|
19
|
-
|
20
|
-
find_by_pid_response = @fedora.simple_search(:conditions => {:pid => test_object_pid})
|
21
|
-
find_by_pid_convenience_response = @fedora.find_by_pid(test_object_pid)
|
22
|
-
|
23
|
-
#Should support conditions provided as an array and conditions provided as a hash.
|
24
|
-
namespace = "test"
|
25
|
-
find_by_namespace_response1 = @fedora.simple_search(:conditions => {:namespace => namespace})
|
26
|
-
#puts find_by_namespace_response1.body.content
|
27
|
-
# Decided not to support directly feeding in url query strings verbatim...
|
28
|
-
# found_by_namespace2 = @fedora.simple_search(:conditions => ["pid~#{namespace}:*"])
|
29
|
-
find_with_conditions_response = @fedora.simple_search(:conditions => {:fType => "O"})
|
30
|
-
#puts find_with_conditions_response.body.content
|
31
|
-
|
32
|
-
# found_all = @fedora.simple_search(:all)
|
33
|
-
# found_all_limited = @fedora.simple_search(:all, :limit => 10)
|
34
|
-
#
|
35
|
-
# found_by_created_range = @fedora.simple_search(:conditions => {:created_before => "2008-01-22", :created_after => "2008-01-20"})
|
36
|
-
# found_by_created_on = @fedora.simple_search(:conditions => {:date_created => "2008-01-21"})
|
37
|
-
#
|
38
|
-
# found_by_modified_range = @fedora.simple_search(:conditions => {:modified_before => "2008-01-22", :modified_after => "2008-01-20"})
|
39
|
-
# found_by_modified_on = @fedora.simple_search(:conditions => {:date_modified => "2008-01-21"})
|
40
|
-
|
41
|
-
|
42
|
-
## TODO: Decide if this is the right way to go. Possibly return XMLSimple objects instead?
|
43
|
-
assert_equal Array, find_by_pid_response.class
|
44
|
-
assert_equal Array, find_by_pid_convenience_response.class
|
45
|
-
assert_equal Array, find_by_namespace_response1.class
|
46
|
-
assert_equal Array, find_with_conditions_response.class
|
47
|
-
assert_equal test_object_pid, find_by_pid_response.first[:pid]
|
48
|
-
assert_equal test_object_pid, find_by_pid_convenience_response.first[:pid]
|
49
|
-
|
50
|
-
assert_throws RecordNotFound, @fedora.simple_search(:conditions => {:pid => should_not_exist})
|
51
|
-
end
|
52
|
-
|
53
|
-
def test_datetime_finders
|
54
|
-
created_after_response = @fedora.find_by_create_date(:after => "2008-01-01")
|
55
|
-
created_before_response = @fedora.find_by_create_date(:before => "2008-01-22")
|
56
|
-
|
57
|
-
## TODO: Decide if this is the right way to go. Possibly return XMLSimple objects instead?
|
58
|
-
assert_equal Array, created_after_response
|
59
|
-
assert_equal Array, created_before_response
|
60
|
-
assert_true created_after_response.first.has_key?(:pid)
|
61
|
-
assert_true created_before_response.last.has_key?(:pid)
|
62
|
-
end
|
63
|
-
end
|
data/test/test_restful_fedora.rb
DELETED
@@ -1,160 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# @Creator Matt Zumwalt, MediaShelf LLC
|
3
|
-
# @Copyright Matt Zumwalt, 2007. All Rights Reserved.
|
4
|
-
#
|
5
|
-
#++
|
6
|
-
|
7
|
-
require File.dirname(__FILE__) + '/test_helper.rb'
|
8
|
-
|
9
|
-
class TestRestfulFedora < Test::Unit::TestCase
|
10
|
-
|
11
|
-
def setup
|
12
|
-
@fedora = Fedora::RestfulFedora.new(FEDORA_URL, :user=>'fedoraAdmin', :password=>'fedoraAdmin')
|
13
|
-
@search_term = "test" # this should be a search term that will return at least one hit
|
14
|
-
@pid_delimiter = ":"
|
15
|
-
@test_object_pid = "test:do_not_delete"
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_pid_generator
|
19
|
-
pid1 = @fedora.next_pid
|
20
|
-
pid2 = @fedora.next_pid
|
21
|
-
pid_from_old_api = @fedora.next_pid_old_api
|
22
|
-
|
23
|
-
# Everything up to the pid_delimiter should be identical in pid1 & pid_from_old_api
|
24
|
-
assert_equal pid1[0..pid1.index(@pid_delimiter)], pid_from_old_api[0..pid1.index(@pid_delimiter)]
|
25
|
-
# After the pid_delimiter should be two integers, where the pid2 = pid1 + 1
|
26
|
-
assert_equal pid1[pid1.index(@pid_delimiter)+1..pid1.length].to_i, pid2[pid1.index(@pid_delimiter)+1..pid2.length].to_i-1
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_datastream_resource
|
31
|
-
pid_of_test_object = @fedora.create_object(:pid=>"test:test_datastream_resource", :params=>{:label=>"DELETE ME"})
|
32
|
-
|
33
|
-
sample_xml_1 = File.new(File.dirname(__FILE__) + '/fixtures/mods-mskcc-filledsample.xml')
|
34
|
-
sample_xml_2 = File.new(File.dirname(__FILE__) + '/fixtures/sample_mods_file_A.xml')
|
35
|
-
sample_binary_file_1 = File.open(File.dirname(__FILE__) + "/fixtures/dino.jpg" )
|
36
|
-
sample_binary_file_2 = File.open(File.dirname(__FILE__) + "/fixtures/minivan-in-minneapolis.jpg" )
|
37
|
-
|
38
|
-
create_xml_result = @fedora.add_xml_datastream(:pid=>pid_of_test_object, :dsid=>"XML_DS", :xml_content=>sample_xml_1.read, :params=>{:ds_label=>"Sample XML"})
|
39
|
-
create_binary_result = @fedora.add_binary_datastream(:pid=>pid_of_test_object, :dsid=>"BINARY_DS", :file=>sample_binary_file_1, :content_type => "image/jpeg", :params=>{:ds_label=>"Sample Binary File"})
|
40
|
-
object_xml = REXML::Document.new(@fedora.call_resource(:method => "GET", :resource_path =>"/objects/#{pid_of_test_object}/objectXML").content)
|
41
|
-
create_redirect_result = @fedora.add_redirect_datastream(:pid=>pid_of_test_object, :dsid=>"REDIRECT", :content_type=>"image/jpeg", :params=>{:ds_label=>"Sample Redirect", :ds_location=>create_binary_result.header['Location'].to_s})
|
42
|
-
|
43
|
-
assert_equal 201, create_xml_result.header.response_status_code
|
44
|
-
assert_equal 201, create_binary_result.header.response_status_code
|
45
|
-
#puts object_xml.elements["foxml:digitalObject/foxml:datastream[@ID='BINARY_DS']"].attributes
|
46
|
-
assert_equal "image/jpeg", object_xml.elements["foxml:digitalObject/foxml:datastream[@ID='BINARY_DS']/foxml:datastreamVersion"].attributes["MIMETYPE"]
|
47
|
-
assert_equal 201, create_redirect_result.header.response_status_code
|
48
|
-
# GETting the REDIRECT datastream should return a Location header that points to the BINARY datastream
|
49
|
-
assert_equal @fedora.get_datastream(pid_of_test_object, "REDIRECT").header['Location'], create_binary_result.header['Location']
|
50
|
-
|
51
|
-
update_xml_result = @fedora.update_datastream(:pid=>pid_of_test_object, :dsid=>"XML_DS", :xml_content=>sample_xml_2.read, :params=>{:ds_label=>"Updated XML Datastream"})
|
52
|
-
update_binary_result = @fedora.update_datastream(:pid=>pid_of_test_object, :dsid=>"BINARY_DS", :file=>sample_binary_file_1, :content_type => "image/jpeg")
|
53
|
-
|
54
|
-
assert_equal 201, update_xml_result.header.response_status_code
|
55
|
-
assert_equal 201, update_binary_result.header.response_status_code
|
56
|
-
|
57
|
-
update_attributes_only_result = @fedora.update_datastream(:pid=>pid_of_test_object, :dsid=>"XML_DS", :params=>{:ds_label=>"Updated Datastream"})
|
58
|
-
|
59
|
-
# TODO: Fix update_datastream to support updating attributes only. (Requires fix in Fedora REST code)
|
60
|
-
#assert_equal 200, update_attributes_only_result.header.response_status_code
|
61
|
-
# Make sure that updating attributes didn't change the datastream content
|
62
|
-
#assert_equal sample_xml_2, @fedora.get_datastream(:pid=>pid_of_test_object, :dsid=>"XML_DS")
|
63
|
-
|
64
|
-
delete_xml_result = @fedora.delete_datastream(:pid=>pid_of_test_object, :dsid=>"XML_DS")
|
65
|
-
delete_binary_result = @fedora.delete_datastream(:pid=>pid_of_test_object, :dsid=>"BINARY_DS")
|
66
|
-
|
67
|
-
assert_equal 200, delete_xml_result.header.response_status_code
|
68
|
-
assert_equal 200, delete_binary_result.header.response_status_code
|
69
|
-
|
70
|
-
@fedora.delete_object(:pid=>pid_of_test_object)
|
71
|
-
|
72
|
-
end
|
73
|
-
|
74
|
-
def test_simple_search
|
75
|
-
should_not_exist = "test:never_use_this_pid"
|
76
|
-
|
77
|
-
find_by_pid_response = @fedora.simple_search(:conditions => {:pid => @test_object_pid})
|
78
|
-
find_by_pid_convenience_response = @fedora.find_by_pid(@test_object_pid)
|
79
|
-
|
80
|
-
#Should support conditions provided as an array and conditions provided as a hash.
|
81
|
-
namespace = "test"
|
82
|
-
find_by_namespace_response1 = @fedora.simple_search(:conditions => {:namespace => namespace})
|
83
|
-
#puts find_by_namespace_response1.body.content
|
84
|
-
# Decided not to support directly feeding in url query strings verbatim...
|
85
|
-
# found_by_namespace2 = @fedora.simple_search(:conditions => ["pid~#{namespace}:*"])
|
86
|
-
find_with_conditions_response = @fedora.simple_search(:conditions => {:fType => "O"})
|
87
|
-
#puts find_with_conditions_response.body.content
|
88
|
-
# found_all = @fedora.simple_search(:all)
|
89
|
-
# found_all_limited = @fedora.simple_search(:all, :limit => 10)
|
90
|
-
#
|
91
|
-
# found_by_created_range = @fedora.simple_search(:conditions => {:created_before => "2008-01-22", :created_after => "2008-01-20"})
|
92
|
-
# found_by_created_on = @fedora.simple_search(:conditions => {:date_created => "2008-01-21"})
|
93
|
-
#
|
94
|
-
# found_by_modified_range = @fedora.simple_search(:conditions => {:modified_before => "2008-01-22", :modified_after => "2008-01-20"})
|
95
|
-
# found_by_modified_on = @fedora.simple_search(:conditions => {:date_modified => "2008-01-21"})
|
96
|
-
|
97
|
-
assert true
|
98
|
-
|
99
|
-
end
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
def test_datetime_finders
|
104
|
-
|
105
|
-
created_after = @fedora.find_by_create_date(:after => "2008-01-01")
|
106
|
-
created_before = @fedora.find_by_create_date(:before => "2008-01-22")
|
107
|
-
|
108
|
-
assert true
|
109
|
-
end
|
110
|
-
|
111
|
-
def test_call_resource
|
112
|
-
|
113
|
-
sample_xml_1 = File.new(File.dirname(__FILE__) + '/fixtures/mods-mskcc-filledsample.xml')
|
114
|
-
sample_binary_file_1 = File.open(File.dirname(__FILE__) + "/fixtures/dino.jpg" )
|
115
|
-
search_result = @fedora.call_resource(:method => "GET", :resource_path => "/objects", :request_body => "", :content_type => "text/xml", :auth => {}, :params => {:query =>"", :pid=>"true", :format=>"xml", :terms=>@search_term})
|
116
|
-
result_rexml = REXML::Document.new(search_result.content)
|
117
|
-
pid = result_rexml.elements["result/resultList/objectFields/pid"].text
|
118
|
-
#pid = "changeme:1"
|
119
|
-
|
120
|
-
assert_equal(result_rexml.root.name, "result")
|
121
|
-
assert_equal result_rexml.elements["result/resultList/objectFields"][1].name, "pid"
|
122
|
-
# test each of the endpoints that we want to be able to send requests to...
|
123
|
-
|
124
|
-
# Other RETRIEVE Operaitons ..
|
125
|
-
assert_equal 200, @fedora.call_resource(:method => "GET", :resource_path =>"/objects/#{pid}", :params=>{:format=>"xml"}).header.response_status_code
|
126
|
-
assert_equal 200, @fedora.call_resource(:method => "GET", :resource_path =>"/objects/#{pid}/objectXML", :params=>{:format=>"xml"}).header.response_status_code
|
127
|
-
assert_equal 200, @fedora.call_resource(:method => "GET", :resource_path =>"/objects/#{pid}/versions", :params=>{:format=>"xml"}).header.response_status_code
|
128
|
-
assert_equal 200, @fedora.call_resource(:method => "GET", :resource_path =>"/objects/#{pid}/export", :params=>{}).header.response_status_code
|
129
|
-
assert_equal 200, @fedora.call_resource(:method => "GET", :resource_path =>"/objects/#{pid}/methods", :params=>{:format=>"xml"}).header.response_status_code
|
130
|
-
assert_equal 200, @fedora.call_resource(:method => "GET", :resource_path =>"/objects/#{pid}/datastreams", :params=>{:format=>"xml"}).header.response_status_code
|
131
|
-
assert_equal 200, @fedora.call_resource(:method => "GET", :resource_path =>"/objects/#{pid}/datastreams/DC", :params=>{:format=>"xml"}).header.response_status_code
|
132
|
-
|
133
|
-
pid = "test:test_object_1"
|
134
|
-
# Create Object
|
135
|
-
object_create_response = @fedora.call_resource(:method => "POST", :resource_path =>"/objects/#{pid}", :request_body => "", :params => {"label"=>"TEST ME"})
|
136
|
-
|
137
|
-
assert_equal "#{@@fedora_url}/#{@fedora.resource_base}/objects/test%3Atest_object_1", object_create_response.header['location'][0]
|
138
|
-
assert_equal 201, object_create_response.header.response_status_code
|
139
|
-
|
140
|
-
# Create XML Datastream
|
141
|
-
xml_datastream_create_response = @fedora.call_resource(:method => "POST", :resource_path =>"/objects/#{pid}/datastreams/XML", :request_body => sample_xml_1.read, :params => {"dsLabel"=>"Sample XML File"})
|
142
|
-
# Create Binary Datastream
|
143
|
-
# !! set mimetype by setting :content_type !!
|
144
|
-
binary_datastream_create_response = @fedora.call_resource(:method => "UPLOAD", :resource_path =>"/objects/#{pid}/datastreams/BINARY", :request_body => sample_binary_file_1, :content_type => "image/jpeg", :params => {"dsLabel"=>"Sample XML File"})
|
145
|
-
assert_equal 201, xml_datastream_create_response.header.response_status_code
|
146
|
-
assert_equal 201, binary_datastream_create_response.header.response_status_code
|
147
|
-
|
148
|
-
|
149
|
-
object_xml = REXML::Document.new(@fedora.call_resource(:method => "GET", :resource_path =>"/objects/#{pid}/objectXML").content)
|
150
|
-
assert_equal "image/jpeg", object_xml.elements["foxml:digitalObject/foxml:datastream[@ID='BINARY']/foxml:datastreamVersion"].attributes["MIMETYPE"]
|
151
|
-
assert_equal "X", object_xml.elements["foxml:digitalObject/foxml:datastream[@ID='XML']"].attributes["CONTROL_GROUP"]
|
152
|
-
assert_equal "M", object_xml.elements["foxml:digitalObject/foxml:datastream[@ID='BINARY']"].attributes["CONTROL_GROUP"]
|
153
|
-
#puts object_xml.elements["foxml:digitalObject/foxml:datastream[@ID='BINARY']/foxml:datastreamVersion"].attributes["MIMETYPE"]
|
154
|
-
|
155
|
-
# Delete Object
|
156
|
-
delete_response = @fedora.call_resource(:method => "DELETE", :resource_path =>"/objects/#{pid}")
|
157
|
-
|
158
|
-
assert_equal 200, delete_response.header.response_status_code
|
159
|
-
end
|
160
|
-
end
|