dor-services-client 6.35.0 → 7.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +69 -0
- data/README.md +1 -4
- data/dor-services-client.gemspec +1 -1
- data/lib/dor/services/client.rb +10 -7
- data/lib/dor/services/client/marcxml.rb +4 -1
- data/lib/dor/services/client/object.rb +12 -4
- data/lib/dor/services/client/objects.rb +7 -4
- data/lib/dor/services/client/version.rb +1 -1
- data/lib/dor/services/client/versioned_service.rb +4 -2
- metadata +4 -5
- data/lib/dor/services/client/release_tags.rb +0 -61
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 26ea6df47f6abced00a0cc0aa06683f0ffffc3b7e09c04df374245ca0e510fa0
|
4
|
+
data.tar.gz: a19dfa02264725f02f51713077bc3a391a15c6f26e96dd2074be4546d6dfdc9d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a53f6fb8e64122cfb94267fad031ed6594fb7df1d9dcb94828e7ad377f31842790faa7d5cabbdc6bba9425013075639f0b7b06c1f72a08c9d0466d0ea6572568
|
7
|
+
data.tar.gz: f78536e5a84e2579eabcf662b445090889748576ff9fa9a8d0a2445052712929f49f46695f0cd068f9afc8b4968ee566fbca98c40f3668511278b6b14f108548
|
data/.rubocop.yml
CHANGED
@@ -8,3 +8,72 @@ Metrics/BlockLength:
|
|
8
8
|
Exclude:
|
9
9
|
- 'dor-services-client.gemspec'
|
10
10
|
- 'spec/**/*'
|
11
|
+
|
12
|
+
Gemspec/DateAssignment: # (new in 1.10)
|
13
|
+
Enabled: true
|
14
|
+
Layout/SpaceBeforeBrackets: # (new in 1.7)
|
15
|
+
Enabled: true
|
16
|
+
Lint/AmbiguousAssignment: # (new in 1.7)
|
17
|
+
Enabled: true
|
18
|
+
Lint/DeprecatedConstants: # (new in 1.8)
|
19
|
+
Enabled: true
|
20
|
+
Lint/DuplicateBranch: # (new in 1.3)
|
21
|
+
Enabled: true
|
22
|
+
Lint/DuplicateRegexpCharacterClassElement: # (new in 1.1)
|
23
|
+
Enabled: true
|
24
|
+
Lint/EmptyBlock: # (new in 1.1)
|
25
|
+
Enabled: true
|
26
|
+
Lint/EmptyClass: # (new in 1.3)
|
27
|
+
Enabled: true
|
28
|
+
Lint/EmptyInPattern: # (new in 1.16)
|
29
|
+
Enabled: true
|
30
|
+
Lint/LambdaWithoutLiteralBlock: # (new in 1.8)
|
31
|
+
Enabled: true
|
32
|
+
Lint/NoReturnInBeginEndBlocks: # (new in 1.2)
|
33
|
+
Enabled: true
|
34
|
+
Lint/NumberedParameterAssignment: # (new in 1.9)
|
35
|
+
Enabled: true
|
36
|
+
Lint/OrAssignmentToConstant: # (new in 1.9)
|
37
|
+
Enabled: true
|
38
|
+
Lint/RedundantDirGlobSort: # (new in 1.8)
|
39
|
+
Enabled: true
|
40
|
+
Lint/SymbolConversion: # (new in 1.9)
|
41
|
+
Enabled: true
|
42
|
+
Lint/ToEnumArguments: # (new in 1.1)
|
43
|
+
Enabled: true
|
44
|
+
Lint/TripleQuotes: # (new in 1.9)
|
45
|
+
Enabled: true
|
46
|
+
Lint/UnexpectedBlockArity: # (new in 1.5)
|
47
|
+
Enabled: true
|
48
|
+
Lint/UnmodifiedReduceAccumulator: # (new in 1.1)
|
49
|
+
Enabled: true
|
50
|
+
Style/ArgumentsForwarding: # (new in 1.1)
|
51
|
+
Enabled: true
|
52
|
+
Style/CollectionCompact: # (new in 1.2)
|
53
|
+
Enabled: true
|
54
|
+
Style/DocumentDynamicEvalDefinition: # (new in 1.1)
|
55
|
+
Enabled: true
|
56
|
+
Style/EndlessMethod: # (new in 1.8)
|
57
|
+
Enabled: true
|
58
|
+
Style/HashConversion: # (new in 1.10)
|
59
|
+
Enabled: true
|
60
|
+
Style/HashExcept: # (new in 1.7)
|
61
|
+
Enabled: true
|
62
|
+
Style/IfWithBooleanLiteralBranches: # (new in 1.9)
|
63
|
+
Enabled: true
|
64
|
+
Style/InPatternThen: # (new in 1.16)
|
65
|
+
Enabled: true
|
66
|
+
Style/MultilineInPatternThen: # (new in 1.16)
|
67
|
+
Enabled: true
|
68
|
+
Style/NegatedIfElseCondition: # (new in 1.2)
|
69
|
+
Enabled: true
|
70
|
+
Style/NilLambda: # (new in 1.3)
|
71
|
+
Enabled: true
|
72
|
+
Style/QuotedSymbols: # (new in 1.16)
|
73
|
+
Enabled: true
|
74
|
+
Style/RedundantArgument: # (new in 1.4)
|
75
|
+
Enabled: true
|
76
|
+
Style/StringChars: # (new in 1.12)
|
77
|
+
Enabled: true
|
78
|
+
Style/SwapValues: # (new in 1.1)
|
79
|
+
Enabled: true
|
data/README.md
CHANGED
@@ -61,6 +61,7 @@ objects_client = Dor::Services::Client.objects
|
|
61
61
|
|
62
62
|
# Register a non-existent object
|
63
63
|
objects_client.register(params: {})
|
64
|
+
objects_client.register(params: {}, assign_doi: true)
|
64
65
|
|
65
66
|
# Interact with virtual objects
|
66
67
|
virtual_objects_client = Dor::Services::Client.virtual_objects
|
@@ -156,10 +157,6 @@ object_client.administrative_tags.update(current: 'Current : Tag', new: 'Replace
|
|
156
157
|
object_client.administrative_tags.destroy(tag: 'Delete : Me')
|
157
158
|
object_client.administrative_tags.list
|
158
159
|
|
159
|
-
# Create and list release tags for an object
|
160
|
-
object_client.release_tags.create(release: release, what: what, to: to, who: who)
|
161
|
-
object_client.release_tags.list
|
162
|
-
|
163
160
|
# Create and list events for an object
|
164
161
|
object_client.events.create(type: type, data: data)
|
165
162
|
object_client.events.list
|
data/dor-services-client.gemspec
CHANGED
@@ -25,7 +25,7 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.required_ruby_version = '~> 2.6'
|
26
26
|
|
27
27
|
spec.add_dependency 'activesupport', '>= 4.2', '< 7'
|
28
|
-
spec.add_dependency 'cocina-models', '~> 0.
|
28
|
+
spec.add_dependency 'cocina-models', '~> 0.61.0' # leave pinned to patch level until cocina-models hits 1.0
|
29
29
|
spec.add_dependency 'deprecation', '>= 0'
|
30
30
|
spec.add_dependency 'faraday', '>= 0.15', '< 2'
|
31
31
|
spec.add_dependency 'moab-versioning', '~> 4.0'
|
data/lib/dor/services/client.rb
CHANGED
@@ -26,11 +26,17 @@ module Dor
|
|
26
26
|
# Base class for Dor::Services::Client exceptions
|
27
27
|
class Error < StandardError; end
|
28
28
|
|
29
|
-
# Error that is raised when the remote server returns a 404 Not Found
|
29
|
+
# Error that is raised when the ultimate remote server returns a 404 Not Found for the id in our request (e.g. for druid, barcode, catkey)
|
30
30
|
class NotFoundResponse < Error; end
|
31
31
|
|
32
|
+
# Error that is raised when the remote server returns some unparsable response
|
33
|
+
class MalformedResponse < Error; end
|
34
|
+
|
35
|
+
# Error that wraps Faraday connection exceptions
|
36
|
+
class ConnectionFailed < Error; end
|
37
|
+
|
32
38
|
# Error that is raised when the remote server returns some unexpected response
|
33
|
-
# this could be any 4xx or 5xx status
|
39
|
+
# this could be any 4xx or 5xx status (except the ones that are direct children of the Error class above)
|
34
40
|
class UnexpectedResponse < Error; end
|
35
41
|
|
36
42
|
# Error that is raised when the remote server returns a 401 Unauthorized
|
@@ -39,11 +45,8 @@ module Dor
|
|
39
45
|
# Error that is raised when the remote server returns a 409 Conflict
|
40
46
|
class ConflictResponse < UnexpectedResponse; end
|
41
47
|
|
42
|
-
# Error that is raised when the remote server returns
|
43
|
-
class
|
44
|
-
|
45
|
-
# Error that wraps Faraday connection exceptions
|
46
|
-
class ConnectionFailed < Error; end
|
48
|
+
# Error that is raised when the remote server returns a 400 Bad Request; apps should not retry the request
|
49
|
+
class BadRequestError < UnexpectedResponse; end
|
47
50
|
|
48
51
|
# @param object_identifier [String] the pid for the object
|
49
52
|
# @raise [ArgumentError] when `object_identifier` is `nil`
|
@@ -21,6 +21,7 @@ module Dor
|
|
21
21
|
return resp.body if resp.success? && resp.body.present?
|
22
22
|
|
23
23
|
# This method needs its own exception handling logic due to how the endpoint service (SearchWorks) operates
|
24
|
+
# raise a NotFoundResponse because the resource being requested was not found in the ILS (via dor-services-app)
|
24
25
|
raise NotFoundResponse, ResponseErrorFormatter.format(response: resp) if resp.success? && resp.body.blank?
|
25
26
|
|
26
27
|
raise UnexpectedResponse, ResponseErrorFormatter.format(response: resp)
|
@@ -42,10 +43,12 @@ module Dor
|
|
42
43
|
end
|
43
44
|
|
44
45
|
# This method needs its own exception handling logic due to how the endpoint service (Symphony) operates
|
45
|
-
|
46
|
+
|
46
47
|
# DOR Services App does not respond with a 404 when no match in Symphony.
|
47
48
|
# Rather, it responds with a 500 containing "Record not found in Symphony" in the body.
|
49
|
+
# raise a NotFoundResponse because the resource being requested was not found in the ILS (via dor-services-app)
|
48
50
|
raise NotFoundResponse, ResponseErrorFormatter.format(response: resp) if !resp.success? && resp.body.match?(/Record not found in Symphony/)
|
51
|
+
|
49
52
|
raise UnexpectedResponse, ResponseErrorFormatter.format(response: resp) unless resp.success?
|
50
53
|
|
51
54
|
resp.body
|
@@ -27,10 +27,6 @@ module Dor
|
|
27
27
|
@workspace ||= Workspace.new(**parent_params)
|
28
28
|
end
|
29
29
|
|
30
|
-
def release_tags
|
31
|
-
@release_tags ||= ReleaseTags.new(**parent_params)
|
32
|
-
end
|
33
|
-
|
34
30
|
def administrative_tags
|
35
31
|
@administrative_tags ||= AdministrativeTags.new(**parent_params)
|
36
32
|
end
|
@@ -108,6 +104,18 @@ module Dor
|
|
108
104
|
raise_exception_based_on_response!(resp)
|
109
105
|
end
|
110
106
|
|
107
|
+
# Update the DOI metadata at DataCite
|
108
|
+
# @raise [NotFoundResponse] when the response is a 404 (object not found)
|
109
|
+
# @return [boolean] true on success
|
110
|
+
def update_doi_metadata
|
111
|
+
resp = connection.post do |req|
|
112
|
+
req.url "#{object_path}/update_doi_metadata"
|
113
|
+
end
|
114
|
+
return true if resp.success?
|
115
|
+
|
116
|
+
raise_exception_based_on_response!(resp)
|
117
|
+
end
|
118
|
+
|
111
119
|
# Notify the external Goobi system for a new object that was registered in DOR
|
112
120
|
# @raise [NotFoundResponse] when the response is a 404 (object not found)
|
113
121
|
# @raise [UnexpectedResponse] when the response is not successful.
|
@@ -8,10 +8,11 @@ module Dor
|
|
8
8
|
# API calls that are about a repository objects
|
9
9
|
class Objects < VersionedService
|
10
10
|
# Creates a new object in DOR
|
11
|
-
# @param [Cocina::Models::RequestDRO,Cocina::Models::RequestCollection,Cocina::Models::RequestAPO]
|
11
|
+
# @param params [Cocina::Models::RequestDRO,Cocina::Models::RequestCollection,Cocina::Models::RequestAPO]
|
12
|
+
# @param assign_doi [Boolean]
|
12
13
|
# @return [Cocina::Models::RequestDRO,Cocina::Models::RequestCollection,Cocina::Models::RequestAPO] the returned model
|
13
|
-
def register(params:)
|
14
|
-
json_str = register_response(params: params)
|
14
|
+
def register(params:, assign_doi: false)
|
15
|
+
json_str = register_response(params: params, assign_doi: assign_doi)
|
15
16
|
json = JSON.parse(json_str)
|
16
17
|
|
17
18
|
Cocina::Models.build(json)
|
@@ -21,14 +22,16 @@ module Dor
|
|
21
22
|
|
22
23
|
# make the registration request to the server
|
23
24
|
# @param params [Hash] optional params (see dor-services-app)
|
25
|
+
# @param assign_doi [Boolean]
|
24
26
|
# @raise [UnexpectedResponse] on an unsuccessful response from the server
|
25
27
|
# @return [String] the raw JSON from the server
|
26
|
-
def register_response(params:)
|
28
|
+
def register_response(params:, assign_doi:)
|
27
29
|
resp = connection.post do |req|
|
28
30
|
req.url "#{api_version}/objects"
|
29
31
|
req.headers['Content-Type'] = 'application/json'
|
30
32
|
# asking the service to return JSON (else it'll be plain text)
|
31
33
|
req.headers['Accept'] = 'application/json'
|
34
|
+
req.params[:assign_doi] = true if assign_doi
|
32
35
|
req.body = params.to_json
|
33
36
|
end
|
34
37
|
return resp.body if resp.success?
|
@@ -22,10 +22,12 @@ module Dor
|
|
22
22
|
# rubocop:disable Metrics/MethodLength
|
23
23
|
def raise_exception_based_on_response!(response, object_identifier = nil)
|
24
24
|
exception_class = case response.status
|
25
|
-
when
|
26
|
-
|
25
|
+
when 400
|
26
|
+
BadRequestError
|
27
27
|
when 401
|
28
28
|
UnauthorizedResponse
|
29
|
+
when 404
|
30
|
+
NotFoundResponse
|
29
31
|
when 409
|
30
32
|
ConflictResponse
|
31
33
|
else
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dor-services-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 7.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Coyne
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2021-
|
12
|
+
date: 2021-07-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -37,14 +37,14 @@ dependencies:
|
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.
|
40
|
+
version: 0.61.0
|
41
41
|
type: :runtime
|
42
42
|
prerelease: false
|
43
43
|
version_requirements: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
47
|
+
version: 0.61.0
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: deprecation
|
50
50
|
requirement: !ruby/object:Gem::Requirement
|
@@ -243,7 +243,6 @@ files:
|
|
243
243
|
- lib/dor/services/client/object.rb
|
244
244
|
- lib/dor/services/client/object_version.rb
|
245
245
|
- lib/dor/services/client/objects.rb
|
246
|
-
- lib/dor/services/client/release_tags.rb
|
247
246
|
- lib/dor/services/client/response_error_formatter.rb
|
248
247
|
- lib/dor/services/client/transfer.rb
|
249
248
|
- lib/dor/services/client/version.rb
|
@@ -1,61 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Dor
|
4
|
-
module Services
|
5
|
-
class Client
|
6
|
-
# API calls that are about a repository object
|
7
|
-
class ReleaseTags < VersionedService
|
8
|
-
# @param object_identifier [String] the pid for the object
|
9
|
-
def initialize(connection:, version:, object_identifier:)
|
10
|
-
super(connection: connection, version: version)
|
11
|
-
@object_identifier = object_identifier
|
12
|
-
end
|
13
|
-
|
14
|
-
# Creates a new release tag for the object
|
15
|
-
# @param release [Boolean]
|
16
|
-
# @param what [String]
|
17
|
-
# @param to [String]
|
18
|
-
# @param who [String]
|
19
|
-
# @return [Boolean] true if successful
|
20
|
-
# @raise [NotFoundResponse] when the response is a 404 (object not found)
|
21
|
-
# @raise [UnexpectedResponse] if the request is unsuccessful.
|
22
|
-
# rubocop:disable Metrics/MethodLength
|
23
|
-
def create(release:, what:, to:, who:)
|
24
|
-
params = {
|
25
|
-
to: to,
|
26
|
-
who: who,
|
27
|
-
what: what,
|
28
|
-
release: release
|
29
|
-
}
|
30
|
-
resp = connection.post do |req|
|
31
|
-
req.url "#{api_version}/objects/#{object_identifier}/release_tags"
|
32
|
-
req.headers['Content-Type'] = 'application/json'
|
33
|
-
req.body = params.to_json
|
34
|
-
end
|
35
|
-
raise_exception_based_on_response!(resp, object_identifier) unless resp.success?
|
36
|
-
|
37
|
-
true
|
38
|
-
end
|
39
|
-
# rubocop:enable Metrics/MethodLength
|
40
|
-
|
41
|
-
# List new release tags for the object
|
42
|
-
# @raise [NotFoundResponse] when the response is a 404 (object not found)
|
43
|
-
# @raise [UnexpectedResponse] if the request is unsuccessful.
|
44
|
-
# @return [Hash] (see Dor::ReleaseTags::IdentityMetadata.released_for)
|
45
|
-
def list
|
46
|
-
resp = connection.get do |req|
|
47
|
-
req.url "#{api_version}/objects/#{object_identifier}/release_tags"
|
48
|
-
end
|
49
|
-
|
50
|
-
raise_exception_based_on_response!(resp, object_identifier) unless resp.success?
|
51
|
-
|
52
|
-
JSON.parse(resp.body)
|
53
|
-
end
|
54
|
-
|
55
|
-
private
|
56
|
-
|
57
|
-
attr_reader :object_identifier
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|