ezid 0.2.0 → 0.2.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/lib/ezid.rb +3 -1
- data/lib/ezid/apisession.rb +55 -57
- data/lib/ezid/record.rb +38 -26
- data/lib/ezid/server_response.rb +7 -2
- metadata +8 -5
- checksums.yaml +0 -15
data/lib/ezid.rb
CHANGED
data/lib/ezid/apisession.rb
CHANGED
@@ -1,25 +1,33 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
1
3
|
require 'net/http'
|
2
4
|
require 'ezid/record'
|
3
5
|
require 'ezid/server_response'
|
6
|
+
|
4
7
|
module Ezid
|
5
8
|
class ApiSession
|
9
|
+
attr_accessor :naa, :username, :password
|
10
|
+
attr_reader :scheme
|
6
11
|
|
7
|
-
VERSION = '0.2.
|
12
|
+
VERSION = '0.2.1'
|
8
13
|
APIVERSION = 'EZID API, Version 2'
|
9
14
|
|
10
|
-
SECURESERVER =
|
15
|
+
SECURESERVER = 'https://n2t.net/ezid'
|
11
16
|
TESTUSERNAME = 'apitest'
|
12
17
|
TESTPASSWORD = 'apitest'
|
13
|
-
SCHEMES = {:ark => 'ark:/', :doi =>
|
18
|
+
SCHEMES = { :ark => 'ark:/', :doi => 'doi:' }
|
14
19
|
|
15
|
-
PRIVATE =
|
16
|
-
PUBLIC =
|
17
|
-
UNAVAIL =
|
20
|
+
PRIVATE = 'reserved'
|
21
|
+
PUBLIC = 'public'
|
22
|
+
UNAVAIL = 'unavailable'
|
18
23
|
|
19
|
-
TESTSHOULDER = {SCHEMES[:ark] => '99999/fk4', SCHEMES[:doi] => '10.5072/FK2'}
|
20
|
-
TESTMETADATA = {'_target' => 'http://example.org/opensociety',
|
24
|
+
TESTSHOULDER = { SCHEMES[:ark] => '99999/fk4', SCHEMES[:doi] => '10.5072/FK2' }
|
25
|
+
TESTMETADATA = { '_target' => 'http://example.org/opensociety',
|
26
|
+
'erc.who' => 'Karl Popper',
|
27
|
+
'erc.what' => 'The Open Society and Its Enemies',
|
28
|
+
'erc.when' => '1945' }
|
21
29
|
|
22
|
-
def initialize(username=TESTUSERNAME, password=TESTPASSWORD, scheme
|
30
|
+
def initialize(username = TESTUSERNAME, password = TESTPASSWORD, scheme = :ark, naa = '')
|
23
31
|
if username == TESTUSERNAME
|
24
32
|
password = TESTPASSWORD
|
25
33
|
@test = true
|
@@ -32,62 +40,59 @@ module Ezid
|
|
32
40
|
@scheme = SCHEMES[scheme]
|
33
41
|
@naa = naa
|
34
42
|
|
35
|
-
if @test == true
|
36
|
-
|
37
|
-
end
|
43
|
+
@naa = TESTSHOULDER[@scheme] if @test == true
|
44
|
+
self
|
38
45
|
end
|
39
46
|
|
40
|
-
def mint(metadata={})
|
47
|
+
def mint(metadata = {})
|
41
48
|
shoulder = @scheme + @naa
|
42
49
|
metadata['_status'] = PRIVATE
|
43
|
-
|
44
|
-
request_uri = "/shoulder/" + shoulder
|
50
|
+
request_uri = "/shoulder/#{shoulder}"
|
45
51
|
request = call_api(request_uri, :post, metadata)
|
46
|
-
if
|
47
|
-
|
48
|
-
|
49
|
-
return get(request)
|
50
|
-
end
|
52
|
+
return request if request.errored?
|
53
|
+
|
54
|
+
get(request)
|
51
55
|
end
|
52
56
|
|
53
|
-
def create(identifier, metadata={})
|
57
|
+
def create(identifier, metadata = {})
|
54
58
|
metadata = transform_metadata(metadata)
|
55
|
-
|
56
|
-
identifier = @scheme + @naa + identifier
|
57
|
-
end
|
58
|
-
request_uri = "/id/" + identifier
|
59
|
+
request_uri = '/id/' + build_identifier(identifier)
|
59
60
|
request = call_api(request_uri, :put, metadata)
|
60
61
|
request.errored? ? request : get(request)
|
61
62
|
end
|
63
|
+
|
62
64
|
def transform_metadata(metadata)
|
63
|
-
|
64
|
-
|
65
|
-
end
|
66
|
-
return metadata
|
65
|
+
metadata['_status'] = PRIVATE unless metadata['_status']
|
66
|
+
metadata
|
67
67
|
end
|
68
|
+
|
68
69
|
def build_identifier(identifier)
|
69
|
-
|
70
|
+
unless identifier.start_with?(ApiSession::SCHEMES[:ark]) ||
|
71
|
+
identifier.start_with?(ApiSession::SCHEMES[:doi])
|
72
|
+
identifier = @scheme + @naa + identifier
|
73
|
+
end
|
74
|
+
identifier
|
70
75
|
end
|
76
|
+
|
71
77
|
def get(identifier)
|
72
|
-
|
78
|
+
identifier = identifier.to_str
|
79
|
+
identifier = identifier.split(' | ')[0] if identifier.include?('| ark:/')
|
80
|
+
request_uri = '/id/' + identifier
|
73
81
|
request = call_api(request_uri, :get)
|
74
|
-
if
|
75
|
-
|
76
|
-
else
|
77
|
-
return Ezid::Record.new(self,request.response["identifier"],request.response["metadata"],true)
|
78
|
-
end
|
82
|
+
return request if request.errored?
|
83
|
+
Ezid::Record.new(self, request.response['identifier'], request.response['metadata'], true)
|
79
84
|
end
|
80
85
|
|
81
86
|
def delete(identifier)
|
82
|
-
request_uri =
|
87
|
+
request_uri = '/id/' + identifier
|
83
88
|
call_api(request_uri, :delete)
|
84
89
|
end
|
85
90
|
|
86
91
|
# public utility methods
|
87
92
|
|
88
|
-
def record_modify(identifier, metadata, clear=false)
|
93
|
+
def record_modify(identifier, metadata, clear = false)
|
89
94
|
if clear
|
90
|
-
#TODO: clear old metadata
|
95
|
+
# TODO: clear old metadata
|
91
96
|
end
|
92
97
|
metadata.each do |name, value|
|
93
98
|
modify(identifier, name, value)
|
@@ -97,18 +102,13 @@ module Ezid
|
|
97
102
|
|
98
103
|
def scheme=(scheme)
|
99
104
|
@scheme = SCHEMES[scheme]
|
100
|
-
if @test == true
|
101
|
-
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
def naa=(naa)
|
106
|
-
@naa = naa
|
105
|
+
@naa = TESTSHOULDER[@scheme] if @test == true
|
106
|
+
@scheme
|
107
107
|
end
|
108
108
|
|
109
109
|
private
|
110
110
|
|
111
|
-
def call_api(request_uri, request_method, request_data=nil)
|
111
|
+
def call_api(request_uri, request_method, request_data = nil)
|
112
112
|
uri = URI(SECURESERVER + request_uri)
|
113
113
|
|
114
114
|
# which HTTP method to use?
|
@@ -125,25 +125,25 @@ module Ezid
|
|
125
125
|
end
|
126
126
|
|
127
127
|
request.basic_auth @user, @pass
|
128
|
-
request.add_field(
|
128
|
+
request.add_field('Content-Type', 'text/plain; charset=UTF-8')
|
129
129
|
|
130
130
|
# Make the call
|
131
131
|
result = Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |http|
|
132
132
|
parse_record http.request(request).body
|
133
133
|
end
|
134
|
-
|
134
|
+
Ezid::ServerResponse.new(result)
|
135
135
|
end
|
136
136
|
|
137
137
|
def parse_record(ezid_response)
|
138
138
|
parts = ezid_response.split("\n")
|
139
|
-
identifier = parts[0].split(
|
139
|
+
identifier = parts[0].split(': ')[1]
|
140
140
|
metadata = {}
|
141
141
|
if parts.length > 1
|
142
142
|
parts[1..-1].each do |p|
|
143
|
-
pair = p.split(
|
143
|
+
pair = p.split(': ')
|
144
144
|
metadata[pair[0]] = pair[1]
|
145
145
|
end
|
146
|
-
record = {'identifier' => identifier, 'metadata' => metadata}
|
146
|
+
record = { 'identifier' => identifier, 'metadata' => metadata }
|
147
147
|
else
|
148
148
|
record = identifier
|
149
149
|
end
|
@@ -151,7 +151,6 @@ module Ezid
|
|
151
151
|
end
|
152
152
|
|
153
153
|
def make_anvl(metadata)
|
154
|
-
#TODO: define escape method for anvl
|
155
154
|
def escape(s)
|
156
155
|
URI.escape(s, /[%:\n\r]/)
|
157
156
|
end
|
@@ -159,10 +158,9 @@ module Ezid
|
|
159
158
|
metadata.each do |n, v|
|
160
159
|
anvl += escape(n.to_s) + ': ' + escape(v.to_s) + "\n"
|
161
160
|
end
|
162
|
-
#remove last newline. there is probably a really good way
|
163
|
-
|
161
|
+
# remove last newline. there is probably a really good way to
|
162
|
+
# avoid adding it in the first place. if you know it, please fix.
|
163
|
+
anvl.strip.encode!('UTF-8')
|
164
164
|
end
|
165
|
-
|
166
165
|
end
|
167
|
-
|
168
166
|
end
|
data/lib/ezid/record.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
1
3
|
module Ezid
|
2
4
|
class Record
|
3
5
|
attr_reader :identifier, :metadata
|
4
|
-
def initialize(session, identifier, metadata={},persisted=false)
|
6
|
+
def initialize(session, identifier, metadata = {}, persisted = false)
|
5
7
|
@identifier = identifier
|
6
8
|
@metadata = metadata
|
7
9
|
@session = session
|
@@ -10,72 +12,82 @@ module Ezid
|
|
10
12
|
@persisted = persisted
|
11
13
|
self
|
12
14
|
end
|
15
|
+
|
13
16
|
# There has to be a better way to do this.
|
14
17
|
def reload
|
15
|
-
if
|
16
|
-
|
17
|
-
@identifier =
|
18
|
-
@metadata =
|
18
|
+
if self.stale?
|
19
|
+
new_record = @session.get(@identifier)
|
20
|
+
@identifier = new_record.identifier
|
21
|
+
@metadata = new_record.metadata
|
19
22
|
@stale = false
|
20
23
|
end
|
21
|
-
|
24
|
+
self
|
22
25
|
end
|
26
|
+
|
23
27
|
def persisted?
|
24
28
|
@changed.length != 0 ? false : @persisted
|
25
29
|
end
|
30
|
+
|
26
31
|
def [](attribute)
|
27
32
|
@metadata[attribute]
|
28
33
|
end
|
29
|
-
|
30
|
-
|
34
|
+
|
35
|
+
def []=(attribute, value)
|
36
|
+
if @metadata[attribute] != value
|
31
37
|
@changed << attribute
|
32
38
|
@changed.uniq!
|
33
39
|
end
|
34
40
|
@metadata[attribute] = value
|
35
41
|
end
|
42
|
+
|
36
43
|
def delete
|
37
44
|
@session.delete(identifier)
|
38
45
|
end
|
39
|
-
|
40
|
-
def stale?
|
41
|
-
return @stale
|
42
|
-
end
|
46
|
+
|
43
47
|
def save
|
44
48
|
return self if self.persisted?
|
45
|
-
|
49
|
+
modify_data = @changed.each_with_object({ }) { |key, hash| hash[key] = @metadata[key] }
|
46
50
|
request_uri = "/id/#{@identifier}"
|
47
|
-
result = @session.send(:call_api,request_uri, :post,
|
48
|
-
if
|
49
|
-
raise "Unable to save - error: #{result.response}"
|
50
|
-
end
|
51
|
+
result = @session.send(:call_api, request_uri, :post, modify_data)
|
52
|
+
raise "Unable to save - error: #{result.response}" if result.errored?
|
51
53
|
@persisted = true
|
52
54
|
@stale = true
|
53
55
|
@changed = []
|
54
|
-
|
56
|
+
self
|
55
57
|
end
|
58
|
+
|
59
|
+
def stale?
|
60
|
+
@stale
|
61
|
+
end
|
62
|
+
|
56
63
|
# Utility Methods
|
57
64
|
def make_public
|
58
|
-
self[
|
65
|
+
self['_status'] = Ezid::ApiSession::PUBLIC
|
59
66
|
end
|
60
67
|
|
61
68
|
def make_unavailable
|
62
|
-
self[
|
69
|
+
self['_status'] = Ezid::ApiSession::UNAVAIL
|
63
70
|
end
|
71
|
+
|
64
72
|
# Shortcut methods - leave behind from old implementation.
|
65
73
|
def status
|
66
|
-
self[
|
74
|
+
self['_status']
|
67
75
|
end
|
76
|
+
|
68
77
|
def target
|
69
|
-
self[
|
78
|
+
self['_target']
|
70
79
|
end
|
80
|
+
|
71
81
|
def target=(value)
|
72
|
-
self[
|
82
|
+
self['_target'] = value
|
73
83
|
end
|
84
|
+
|
74
85
|
def profile
|
75
|
-
self[
|
86
|
+
self['_profile']
|
76
87
|
end
|
88
|
+
|
77
89
|
def profile=(value)
|
78
|
-
self[
|
90
|
+
self['_profile'] = value
|
79
91
|
end
|
80
92
|
end
|
81
|
-
end
|
93
|
+
end
|
data/lib/ezid/server_response.rb
CHANGED
@@ -1,14 +1,19 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
1
3
|
module Ezid
|
2
4
|
class ServerResponse
|
3
5
|
attr_reader :response
|
6
|
+
|
4
7
|
def initialize(response)
|
5
8
|
@response = response
|
6
9
|
end
|
10
|
+
|
7
11
|
def errored?
|
8
|
-
|
12
|
+
@response.instance_of?(String) && @response.start_with?('bad request')
|
9
13
|
end
|
14
|
+
|
10
15
|
def to_str
|
11
16
|
@response.to_s
|
12
17
|
end
|
13
18
|
end
|
14
|
-
end
|
19
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ezid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Thomas Johnson
|
@@ -21,26 +22,28 @@ files:
|
|
21
22
|
- lib/ezid/record.rb
|
22
23
|
- lib/ezid/server_response.rb
|
23
24
|
homepage: http://achelo.us/code/ezid_api
|
24
|
-
licenses:
|
25
|
-
|
25
|
+
licenses:
|
26
|
+
- Public Domain
|
26
27
|
post_install_message:
|
27
28
|
rdoc_options: []
|
28
29
|
require_paths:
|
29
30
|
- lib
|
30
31
|
required_ruby_version: !ruby/object:Gem::Requirement
|
32
|
+
none: false
|
31
33
|
requirements:
|
32
34
|
- - ! '>='
|
33
35
|
- !ruby/object:Gem::Version
|
34
36
|
version: '0'
|
35
37
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
36
39
|
requirements:
|
37
40
|
- - ! '>='
|
38
41
|
- !ruby/object:Gem::Version
|
39
42
|
version: '0'
|
40
43
|
requirements: []
|
41
44
|
rubyforge_project:
|
42
|
-
rubygems_version:
|
45
|
+
rubygems_version: 1.8.25
|
43
46
|
signing_key:
|
44
|
-
specification_version:
|
47
|
+
specification_version: 3
|
45
48
|
summary: API client for California Digital Library's EZID service.
|
46
49
|
test_files: []
|
checksums.yaml
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
---
|
2
|
-
!binary "U0hBMQ==":
|
3
|
-
metadata.gz: !binary |-
|
4
|
-
MWU1ZmY2ZjcyNzU5MjM5OTYzYjY0YzVhMDY1Yzg4NTQ5NDVmMTgwNQ==
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
ZmM4NTE0Mjk1MGQwZWQwNWExY2Q2MmFjNWFkNjYwMDIwNmUxNDYzNg==
|
7
|
-
!binary "U0hBNTEy":
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
NTA4ZGVhY2QzZGQ1NDFjYjY5ZjIzOGJmOWJmYWYzOTc2ZGRhZTQwOGEyYWMx
|
10
|
-
OTgzNzQ1OTkwZjI3NGUyYTkxOWQ4NzYxYTkzY2EwYjZlODZkZGU1Yzc2MDEz
|
11
|
-
ZmQwNGRhNDY3ODgzZmZhNmM5Y2EwOTA4ZDZlMDljNDc1NWJkNTY=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
NmQ0ZjU2OGYwMmZiMmViYWYwMWQxZDMzZjFkMzgwNTQzOGRmOTBiN2FjODYy
|
14
|
-
OGYzMGEzNTg3ODdmZTY0ZTJiMThlZjI1NGY0YzFkNzI1YTYxMDUxNTI3OTMw
|
15
|
-
NzNlNzdiMWYwMmRiZTJkOTllZTFiMjNhNDM4M2VjNzc5ODFiNmM=
|