ruby-fedora 0.1.1 → 0.1.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/History.txt +7 -0
- data/README.txt +1 -1
- data/lib/fedora/base.rb +5 -0
- data/lib/fedora/connection.rb +9 -8
- data/lib/fedora/datastream.rb +1 -0
- data/lib/fedora/repository.rb +18 -11
- data/lib/ruby-fedora.rb +1 -1
- data/script/destroy +0 -0
- data/script/generate +0 -0
- data/script/txt2html +0 -0
- metadata +3 -3
data/History.txt
CHANGED
@@ -2,3 +2,10 @@
|
|
2
2
|
|
3
3
|
* very alpha enhancement:
|
4
4
|
* Initial release
|
5
|
+
|
6
|
+
== 0.1.1 2008-04-16
|
7
|
+
* Remove the gem dependency on active_resource
|
8
|
+
|
9
|
+
== 0.1.2 2008-04-30
|
10
|
+
* Rename FedoraRepository.fetch_conent to FedoraRepository.fetch_content
|
11
|
+
* Support custom mime-type for Datastream with parameter :mimeType
|
data/README.txt
CHANGED
@@ -10,7 +10,7 @@ test_object = Fedora::FedoraObject.new(:label => 'test', :contentModel => 'Image
|
|
10
10
|
repository.save(test_object)
|
11
11
|
|
12
12
|
objects = repository.find_objects('label~Image*')
|
13
|
-
object = repository.
|
13
|
+
object = repository.fetch_content('demo:1')
|
14
14
|
|
15
15
|
|
16
16
|
Check out spec/repository_spec.rb for more examples.
|
data/lib/fedora/base.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'xmlsimple'
|
2
2
|
|
3
3
|
class Hash
|
4
|
+
# {:q => 'test', :num => 5}.to_query # => 'q=test&num=5'
|
4
5
|
def to_query
|
5
6
|
self.collect { |key, value| "#{CGI.escape(key.to_s)}=#{CGI.escape(value.to_s)}" }.sort * '&'
|
6
7
|
end
|
@@ -25,6 +26,10 @@ class Fedora::BaseObject
|
|
25
26
|
@blob = attributes.delete(:blob)
|
26
27
|
end
|
27
28
|
|
29
|
+
def [](key)
|
30
|
+
@attributes[key]
|
31
|
+
end
|
32
|
+
|
28
33
|
def new_object?
|
29
34
|
@new_object
|
30
35
|
end
|
data/lib/fedora/connection.rb
CHANGED
@@ -22,23 +22,24 @@ require 'net/https'
|
|
22
22
|
# end
|
23
23
|
module Fedora::Multipart
|
24
24
|
def set_multipart_data(param_hash={})
|
25
|
+
mime_type = param_hash.delete(:content_type)
|
25
26
|
boundary_token = [Array.new(8) {rand(256)}].join
|
26
27
|
self.content_type = "multipart/form-data; boundary=#{boundary_token}"
|
27
28
|
boundary_marker = "--#{boundary_token}\r\n"
|
28
29
|
self.body = param_hash.map { |param_name, param_value|
|
29
30
|
boundary_marker + case param_value
|
30
|
-
when File then file_to_multipart(param_name, param_value)
|
31
|
-
when String then text_to_multipart(param_name, param_value)
|
31
|
+
when File then file_to_multipart(param_name, param_value, mime_type)
|
32
|
+
when String then text_to_multipart(param_name, param_value, mime_type)
|
32
33
|
else ""
|
33
34
|
end
|
34
35
|
}.join('') + "--#{boundary_token}--\r\n"
|
35
36
|
end
|
36
37
|
|
37
38
|
private
|
38
|
-
def file_to_multipart(key,file)
|
39
|
+
def file_to_multipart(key,file, mime_type = nil)
|
39
40
|
filename = File.basename(file.path)
|
40
41
|
mime_types = MIME::Types.of(filename)
|
41
|
-
mime_type
|
42
|
+
mime_type ||= mime_types.empty? ? "application/octet-stream" : mime_types.first.content_type
|
42
43
|
part = %Q{Content-Disposition: form-data; name="#{key}"; filename="#{filename}"\r\n}
|
43
44
|
part += "Content-Transfer-Encoding: binary\r\n"
|
44
45
|
part += "Content-Type: #{mime_type}\r\n\r\n#{file.read}"
|
@@ -147,7 +148,7 @@ module RubyFedora
|
|
147
148
|
# Used to update resources.
|
148
149
|
def put(path, body = '', headers = {})
|
149
150
|
if body.is_a?(File)
|
150
|
-
multipart_request(Net::HTTP::Put.new(path, build_request_headers(headers)), body)
|
151
|
+
multipart_request(Net::HTTP::Put.new(path, build_request_headers(headers)), body, headers)
|
151
152
|
else
|
152
153
|
request(:put, path, body.to_s, build_request_headers(headers))
|
153
154
|
end
|
@@ -157,7 +158,7 @@ module RubyFedora
|
|
157
158
|
# Used to create new resources.
|
158
159
|
def post(path, body = '', headers = {})
|
159
160
|
if body.is_a?(File)
|
160
|
-
multipart_request(Net::HTTP::Post.new(path, build_request_headers(headers)), body)
|
161
|
+
multipart_request(Net::HTTP::Post.new(path, build_request_headers(headers)), body, headers)
|
161
162
|
else
|
162
163
|
request(:post, path, body.to_s, build_request_headers(headers))
|
163
164
|
end
|
@@ -168,10 +169,10 @@ module RubyFedora
|
|
168
169
|
end
|
169
170
|
|
170
171
|
private
|
171
|
-
def multipart_request(req, file)
|
172
|
+
def multipart_request(req, file, headers = {})
|
172
173
|
result = nil
|
173
174
|
http.start do |conn|
|
174
|
-
req.set_multipart_data(:file => file)
|
175
|
+
req.set_multipart_data(:file => file, :content_type => headers['Content-Type'])
|
175
176
|
result = conn.request(req)
|
176
177
|
end
|
177
178
|
handle_response(result)
|
data/lib/fedora/datastream.rb
CHANGED
data/lib/fedora/repository.rb
CHANGED
@@ -9,12 +9,21 @@ require 'fedora/datastream'
|
|
9
9
|
module Fedora
|
10
10
|
NAMESPACE = "fedora:info/"
|
11
11
|
ALL_FIELDS = [
|
12
|
-
:pid, :label, :fType, :cModel, :state, :ownerId, :cDate, :dcmDate,
|
12
|
+
:pid, :label, :fType, :cModel, :state, :ownerId, :cDate, :mDate, :dcmDate,
|
13
13
|
:bMech, :title, :creator, :subject, :description, :contributor,
|
14
14
|
:date, :type, :format, :identifier, :source, :language, :relation, :coverage, :rights
|
15
15
|
]
|
16
16
|
|
17
17
|
class Repository
|
18
|
+
class StringResponse < String
|
19
|
+
attr_reader :content_type
|
20
|
+
|
21
|
+
def initialize(s, content_type)
|
22
|
+
super(s)
|
23
|
+
@content_type = content_type
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
18
27
|
attr_accessor :fedora_url
|
19
28
|
|
20
29
|
def initialize(fedora_url = "http://localhost:8080/fedora")
|
@@ -23,8 +32,9 @@ module Fedora
|
|
23
32
|
end
|
24
33
|
|
25
34
|
# Fetch the raw content of either a fedora object or datastream
|
26
|
-
def
|
27
|
-
connection.raw_get("#{url_for(object_uri)}?format=xml")
|
35
|
+
def fetch_content(object_uri)
|
36
|
+
response = connection.raw_get("#{url_for(object_uri)}?format=xml")
|
37
|
+
StringResponse.new(response.body, response.content_type)
|
28
38
|
end
|
29
39
|
|
30
40
|
# Find fedora objects with http://www.fedora.info/wiki/index.php/API-A-Lite_findObjects
|
@@ -57,7 +67,7 @@ module Fedora
|
|
57
67
|
params[:sessionToken] = options[:sessionToken] if options[:sessionToken]
|
58
68
|
includes = fields.inject("") { |s, f| s += "&#{f}=true"; s }
|
59
69
|
|
60
|
-
convert_xml(connection.get("#{fedora_url.path}/objects?#{to_query
|
70
|
+
convert_xml(connection.get("#{fedora_url.path}/objects?#{params.to_query}#{includes}"))
|
61
71
|
end
|
62
72
|
|
63
73
|
# Create the given object if it's new (not obtained from a find method). Otherwise update the object.
|
@@ -83,8 +93,10 @@ module Fedora
|
|
83
93
|
end
|
84
94
|
when Fedora::Datastream
|
85
95
|
raise ArgumentError, "Missing dsID attribute" if object.dsid.nil?
|
96
|
+
extra_headers = {}
|
97
|
+
extra_headers['Content-Type'] = object.attributes[:mimeType] if object.attributes[:mimeType]
|
86
98
|
response = connection.post("#{url_for(object)}?" + object.attributes.to_query,
|
87
|
-
object.blob)
|
99
|
+
object.blob, extra_headers)
|
88
100
|
if response.code == '201'
|
89
101
|
object.new_object = false
|
90
102
|
true
|
@@ -147,7 +159,7 @@ module Fedora
|
|
147
159
|
end
|
148
160
|
|
149
161
|
extra_params.delete(:format) if method == :export
|
150
|
-
connection.raw_get("#{url_for(object)}#{path}?#{to_query
|
162
|
+
connection.raw_get("#{url_for(object)}#{path}?#{extra_params.to_query}").body
|
151
163
|
end
|
152
164
|
|
153
165
|
private
|
@@ -185,11 +197,6 @@ module Fedora
|
|
185
197
|
def extract_pid(response)
|
186
198
|
CGI.unescape(response['Location'].split('/').last)
|
187
199
|
end
|
188
|
-
|
189
|
-
# {:q => 'test', :num => 5}.to_query # => 'q=test&num=5'
|
190
|
-
def to_query(hash)
|
191
|
-
hash.collect { |key, value| "#{CGI.escape(key.to_s)}=#{CGI.escape(value.to_s)}" }.sort * '&'
|
192
|
-
end
|
193
200
|
end
|
194
201
|
end
|
195
202
|
|
data/lib/ruby-fedora.rb
CHANGED
data/script/destroy
CHANGED
File without changes
|
data/script/generate
CHANGED
File without changes
|
data/script/txt2html
CHANGED
File without changes
|
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.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Zumwalt
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-06-19 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -110,7 +110,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
110
110
|
requirements: []
|
111
111
|
|
112
112
|
rubyforge_project: rubyfedora
|
113
|
-
rubygems_version: 1.
|
113
|
+
rubygems_version: 1.1.1
|
114
114
|
signing_key:
|
115
115
|
specification_version: 2
|
116
116
|
summary: Ruby API for Fedora
|