dor-services-client 2.6.2 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1c7df3ec5c52111c42883e1b2f4acb0cc94bfda0a012f9afee44cf5497dc44e1
4
- data.tar.gz: dcedf9c6b29ccdfe0e13250903630823893e531836f5f1800899829c55480e2f
3
+ metadata.gz: bed8dcd19dcbcd18cb303450debe16dc2f32060e66acc3506a547870789bae5e
4
+ data.tar.gz: a7c4880010e32aceedd6a3fdfd5e81a8501e50f0e01cdd1d79ef1b2d5f6695a4
5
5
  SHA512:
6
- metadata.gz: 17fc69850386d011507a8134419a10714ef1c80cefcacba1a14ea8f406db9e0e82ce0fbc6cc8384f6d2efe3c1226edfa78a0e30f01a16332c5c8e15f98f37b33
7
- data.tar.gz: 60d9556b954999ec29148a23e3c0169853584a3ccc6ee5b94afeb2b04d8f8e9386d275f4923ffef3b01c28b02d02fb46c33d528603e4fc21a96b2bf64d6ab32d
6
+ metadata.gz: 414ba947b6c25d3219f53538cea66f6f16d4c742a413dfea18800145eb083c72dcd6d45db4762ee7cf17b1cd1d1f68d125c118f7af138526d2ed9d58546e39ac
7
+ data.tar.gz: 5b6784ff405e9b96e29c9a2e74c4ec6cbc16ccb585dd9793d542bf340e60a792d163e6c076b9c9a18cb92b070c63c82661dd1d3097b366fb460a701a07452433
data/README.md CHANGED
@@ -40,12 +40,11 @@ private
40
40
 
41
41
  def client
42
42
  @client ||= Dor::Services::Client.configure(url: Settings.dor_services.url,
43
- token: Settings.dor_services.token,
44
- token_header: Settings.dor_services.token_header)
43
+ token: Settings.dor_services.token)
45
44
  end
46
45
  ```
47
46
 
48
- Note that the client may **not** be used without first having been configured, and the `url` keyword is **required**. The `token` and `token_header` arguments are optional (though when using the client with staging and production servers, you will always need to supply these in practice). For more about dor-services-app's token-based authentication, see [its README](https://github.com/sul-dlss/dor-services-app#authentication).
47
+ Note that the client may **not** be used without first having been configured, and the `url` keyword is **required**. The `token` argument is optional (though when using the client with staging and production servers, you will always need to supply it in practice). For more about dor-services-app's token-based authentication, see [its README](https://github.com/sul-dlss/dor-services-app#authentication).
49
48
 
50
49
  ## API Coverage
51
50
 
@@ -64,6 +63,12 @@ virtual_objects_client = Dor::Services::Client.virtual_objects
64
63
  # Create a batch of virtual objects
65
64
  virtual_objects_client.create(virtual_objects: [{ parent_id: '', child_ids: [''] }])
66
65
 
66
+ # For getting background job results
67
+ background_jobs_client = Dor::Services::Client.background_job_results
68
+
69
+ # Show results of background job
70
+ background_jobs_client.show(job_id: 123)
71
+
67
72
  # For performing operations on a known, registered object
68
73
  object_client = Dor::Services::Client.object(object_identifier)
69
74
 
@@ -76,9 +81,6 @@ object_client.update_marc_record
76
81
  # Copy metadata from Symphony into descMetadata
77
82
  object_client.refresh_metadata
78
83
 
79
- # Add constituents to an object (virtual-merge)
80
- object_client.add_constituents(child_druids:)
81
-
82
84
  # Send a notification to goobi
83
85
  object_client.notify_goobi
84
86
 
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
23
23
  spec.require_paths = ['lib']
24
24
 
25
25
  spec.add_dependency 'activesupport', '>= 4.2', '< 7'
26
- spec.add_dependency 'cocina-models', '~> 0.1.0'
26
+ spec.add_dependency 'cocina-models', '~> 0.4.0'
27
27
  spec.add_dependency 'faraday', '~> 0.15'
28
28
  spec.add_dependency 'moab-versioning', '~> 4.0'
29
29
  spec.add_dependency 'nokogiri', '~> 1.8'
@@ -3,10 +3,10 @@
3
3
  require 'active_support/core_ext/hash/indifferent_access'
4
4
  require 'active_support/core_ext/module/delegation'
5
5
  require 'active_support/core_ext/object/blank'
6
+ require 'cocina/models'
6
7
  require 'faraday'
7
8
  require 'singleton'
8
9
  require 'zeitwerk'
9
- require 'cocina/models'
10
10
 
11
11
  class DorServicesClientInflector < Zeitwerk::Inflector
12
12
  def camelize(basename, _abspath)
@@ -29,6 +29,12 @@ loader.setup
29
29
  module Dor
30
30
  module Services
31
31
  class Client
32
+ include Singleton
33
+
34
+ DEFAULT_VERSION = 'v1'
35
+ TOKEN_HEADER = 'Authorization'
36
+
37
+ # Base class for Dor::Services::Client exceptions
32
38
  class Error < StandardError; end
33
39
 
34
40
  # Error that is raised when the remote server returns a 404 Not Found
@@ -41,12 +47,9 @@ module Dor
41
47
  # Error that is raised when the remote server returns some unparsable response
42
48
  class MalformedResponse < Error; end
43
49
 
50
+ # Error that wraps Faraday connection exceptions
44
51
  class ConnectionFailed < Error; end
45
52
 
46
- DEFAULT_VERSION = 'v1'
47
-
48
- include Singleton
49
-
50
53
  # @param object_identifier [String] the pid for the object
51
54
  # @raise [ArgumentError] when `object_identifier` is `nil`
52
55
  # @return [Dor::Services::Client::Object] an instance of the `Client::Object` class
@@ -71,15 +74,17 @@ module Dor
71
74
  @virtual_objects ||= VirtualObjects.new(connection: connection, version: DEFAULT_VERSION)
72
75
  end
73
76
 
77
+ # @return [Dor::Services::Client::BackgroundJobResults] an instance of the `Client::BackgroundJobResults` class
78
+ def background_job_results
79
+ @background_job_results ||= BackgroundJobResults.new(connection: connection, version: DEFAULT_VERSION)
80
+ end
81
+
74
82
  class << self
75
- # @param [String] url
76
- # @param [String] token a bearer token for HTTP auth
77
- # @param [String] token_header ('Authorization') set this to something if you are also using
78
- # basic auth, or the headers will collide
79
- def configure(url:, token: nil, token_header: 'Authorization')
83
+ # @param [String] url the base url of the endpoint the client should connect to (required)
84
+ # @param [String] token a bearer token for HTTP authentication (required)
85
+ def configure(url:, token:)
80
86
  instance.url = url
81
87
  instance.token = token
82
- instance.token_header = token_header
83
88
 
84
89
  # Force connection to be re-established when `.configure` is called
85
90
  instance.connection = nil
@@ -87,14 +92,14 @@ module Dor
87
92
  self
88
93
  end
89
94
 
90
- delegate :objects, :object, :virtual_objects, to: :instance
95
+ delegate :objects, :object, :virtual_objects, :background_job_results, to: :instance
91
96
  end
92
97
 
93
- attr_writer :url, :token, :token_header, :connection
98
+ attr_writer :url, :token, :connection
94
99
 
95
100
  private
96
101
 
97
- attr_reader :token, :token_header
102
+ attr_reader :token
98
103
 
99
104
  def url
100
105
  @url || raise(Error, 'url has not yet been configured')
@@ -110,7 +115,7 @@ module Dor
110
115
  # causes the adapter not to be set. Thus, everything breaks.
111
116
  builder.adapter Faraday.default_adapter
112
117
  builder.headers[:user_agent] = user_agent
113
- builder.headers[token_header] = "Bearer #{token}" if token
118
+ builder.headers[TOKEN_HEADER] = "Bearer #{token}"
114
119
  end
115
120
  end
116
121
 
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
5
+ module Dor
6
+ module Services
7
+ class Client
8
+ # API calls around background job results from dor-services-app
9
+ class BackgroundJobResults < VersionedService
10
+ # Get status/result of a background job
11
+ # @param job_id [String] required string representing a job identifier
12
+ # @raise [NotFoundResponse] when the response is a 404 (object not found)
13
+ # @raise [UnexpectedResponse] on an unsuccessful response from the server
14
+ # @return [String] result of background job
15
+ def show(job_id:)
16
+ resp = connection.get do |req|
17
+ req.url "#{api_version}/background_job_results/#{job_id}"
18
+ req.headers['Accept'] = 'application/json'
19
+ end
20
+ # We expect this endpoint to semi-regularly return 422 responses, so do
21
+ # not bother raising the exception
22
+ return JSON.parse(resp.body).with_indifferent_access if resp.success? || resp.status == 422
23
+
24
+ raise_exception_based_on_response!(resp)
25
+ end
26
+
27
+ private
28
+
29
+ def raise_exception_based_on_response!(response)
30
+ raise (response.status == 404 ? NotFoundResponse : UnexpectedResponse),
31
+ ResponseErrorFormatter.format(response: response)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -103,19 +103,6 @@ module Dor
103
103
  raise_exception_based_on_response!(resp)
104
104
  end
105
105
 
106
- # TODO: Remove once Argo is using `VirtualObjects#create` instead.
107
- # Does a virtual-merge of the children into the parent
108
- # @param [Array<String>] child_druids the identifier of the children
109
- # @raise [NotFoundResponse] when the response is a 404 (object not found)
110
- # @raise [UnexpectedResponse] when the response is not successful.
111
- # @return [boolean] true on success
112
- def add_constituents(child_druids:)
113
- resp = connection.put object_path, constituent_ids: child_druids
114
- return true if resp.success?
115
-
116
- raise_exception_based_on_response!(resp)
117
- end
118
-
119
106
  # Notify the external Goobi system for a new object that was registered in DOR
120
107
  # @raise [NotFoundResponse] when the response is a 404 (object not found)
121
108
  # @raise [UnexpectedResponse] when the response is not successful.
@@ -3,7 +3,7 @@
3
3
  module Dor
4
4
  module Services
5
5
  class Client
6
- VERSION = '2.6.2'
6
+ VERSION = '3.0.0'
7
7
  end
8
8
  end
9
9
  end
@@ -9,7 +9,7 @@ module Dor
9
9
  # @param virtual_objects [Array] required array of virtual object params (see dor-services-app)
10
10
  # @raise [NotFoundResponse] when the response is a 404 (object not found)
11
11
  # @raise [UnexpectedResponse] on an unsuccessful response from the server
12
- # @return [NilClass] nil if no errors
12
+ # @return [String] URL from Location response header if no errors
13
13
  def create(virtual_objects:)
14
14
  resp = connection.post do |req|
15
15
  req.url "#{api_version}/virtual_objects"
@@ -17,7 +17,7 @@ module Dor
17
17
  req.headers['Accept'] = 'application/json'
18
18
  req.body = { virtual_objects: virtual_objects }.to_json
19
19
  end
20
- return if resp.success?
20
+ return resp.headers['Location'] if resp.success?
21
21
 
22
22
  raise_exception_based_on_response!(resp)
23
23
  end
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: 2.6.2
4
+ version: 3.0.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: 2019-09-11 00:00:00.000000000 Z
12
+ date: 2019-09-20 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.1.0
40
+ version: 0.4.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.1.0
47
+ version: 0.4.0
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: faraday
50
50
  requirement: !ruby/object:Gem::Requirement
@@ -206,6 +206,7 @@ files:
206
206
  - bin/setup
207
207
  - dor-services-client.gemspec
208
208
  - lib/dor/services/client.rb
209
+ - lib/dor/services/client/background_job_results.rb
209
210
  - lib/dor/services/client/collections.rb
210
211
  - lib/dor/services/client/embargo.rb
211
212
  - lib/dor/services/client/error_faraday_middleware.rb