dor-workflow-client 3.11.1 → 3.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/README.md +1 -1
- data/lib/dor/workflow/client/connection_factory.rb +1 -1
- data/lib/dor/workflow/client/version.rb +1 -1
- data/lib/dor/workflow/client/workflow_routes.rb +22 -10
- data/spec/workflow/client/connection_factory_spec.rb +8 -4
- data/spec/workflow/client/workflow_routes_spec.rb +25 -1
- data/spec/workflow/client_spec.rb +48 -27
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5cbb16ceddf569a9b82c822b1b885ebba29b592cd012ae340cb76882c61cc3d8
|
4
|
+
data.tar.gz: 4f1a7c2f940898abb328618ba1a8e09628fcf5a232e146b5546811a2bd3c223f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 228c451516708789a413be980b76fe25cb1efa7cf12865763291350ff86b2bdb63adfae2390ad02c3ef5fe33a213e68213a5a8dfb35a99531bded86fe396e21b
|
7
|
+
data.tar.gz: 42646cbdf62345f5128f7cc7c3391f245a387d6255734ddd498c71f38d82e6f6ec6ddbd2d3ad33c553abc09a9fee6525276343f7e6802cda1ed156aa8d55f643
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -24,7 +24,7 @@ Consumers of recent versions of the [dor-services](https://github.com/sul-dlss/d
|
|
24
24
|
### Example usage
|
25
25
|
Create a workflow
|
26
26
|
```
|
27
|
-
client.create_workflow_by_name('druid:bc123df4567', 'etdSubmitWF')
|
27
|
+
client.create_workflow_by_name('druid:bc123df4567', 'etdSubmitWF', version: '1')
|
28
28
|
```
|
29
29
|
|
30
30
|
Update a workflow step's status
|
@@ -34,14 +34,17 @@ module Dor
|
|
34
34
|
# @param [String] druid The id of the object
|
35
35
|
# @param [String] workflow_name The name of the workflow you want to create. This must correspond with a workflow
|
36
36
|
# name that is known by the workflow service.
|
37
|
-
# @param [
|
38
|
-
# @
|
39
|
-
# @option opts [Integer] :version specifies the version so that workflow service doesn't need to query dor-services.
|
37
|
+
# @param [String] lane_id adds laneId attribute to all process elements in the wf_xml workflow xml. Defaults to a value of 'default'
|
38
|
+
# @param [Integer] version specifies the version so that workflow service doesn't need to query dor-services.
|
40
39
|
# @return [Boolean] always true
|
41
40
|
#
|
42
|
-
def create_workflow_by_name(druid, workflow_name,
|
43
|
-
params = { 'lane-id' =>
|
44
|
-
|
41
|
+
def create_workflow_by_name(druid, workflow_name, version: nil, lane_id: 'default')
|
42
|
+
params = { 'lane-id' => lane_id }
|
43
|
+
if version
|
44
|
+
params['version'] = version
|
45
|
+
else
|
46
|
+
Deprecation.warn(self, 'Calling create_workflow_by_name without passing version is deprecated and will result in an error in dor-workflow-client 4.0')
|
47
|
+
end
|
45
48
|
requestor.request "objects/#{druid}/workflows/#{workflow_name}", 'post', '',
|
46
49
|
content_type: 'application/xml',
|
47
50
|
params: params
|
@@ -136,7 +139,7 @@ module Dor
|
|
136
139
|
workflow = opts[:workflow]
|
137
140
|
process = opts[:process]
|
138
141
|
end
|
139
|
-
workflow_md =
|
142
|
+
workflow_md = fetch_workflow(druid: druid, workflow: workflow)
|
140
143
|
doc = Nokogiri::XML(workflow_md)
|
141
144
|
raise Dor::WorkflowException, "Unable to parse response:\n#{workflow_md}" if doc.root.nil?
|
142
145
|
|
@@ -166,11 +169,14 @@ module Dor
|
|
166
169
|
druid = opts[:druid]
|
167
170
|
workflow = opts[:workflow]
|
168
171
|
end
|
172
|
+
|
169
173
|
raise ArgumentError, 'missing workflow' unless workflow
|
170
174
|
return requestor.request "#{repo}/objects/#{druid}/workflows/#{workflow}" if repo
|
171
175
|
|
172
|
-
|
176
|
+
fetch_workflow(druid: druid, workflow: workflow)
|
173
177
|
end
|
178
|
+
deprecation_deprecate workflow_xml: 'workflow_xml will not be replaced'
|
179
|
+
|
174
180
|
# rubocop:enable Metrics/MethodLength
|
175
181
|
|
176
182
|
# Updates the status of one step in a workflow to error.
|
@@ -246,7 +252,7 @@ module Dor
|
|
246
252
|
# => ["accessionWF", "assemblyWF", "disseminationWF"]
|
247
253
|
def workflows(pid, repo = nil)
|
248
254
|
Deprecation.warn(self, 'Passing the second argument (repo) to workflows is deprecated and can be omitted') if repo
|
249
|
-
xml_doc = Nokogiri::XML(
|
255
|
+
xml_doc = Nokogiri::XML(fetch_workflow(druid: pid, workflow: ''))
|
250
256
|
xml_doc.xpath('//workflow').collect { |workflow| workflow['id'] }
|
251
257
|
end
|
252
258
|
|
@@ -256,7 +262,7 @@ module Dor
|
|
256
262
|
# @return [Workflow::Response::Workflow]
|
257
263
|
def workflow(repo: nil, pid:, workflow_name:)
|
258
264
|
Deprecation.warn(self, 'passing the repo parameter is deprecated and will be removed in the next major versions') if repo
|
259
|
-
xml =
|
265
|
+
xml = fetch_workflow(druid: pid, workflow: workflow_name)
|
260
266
|
Workflow::Response::Workflow.new(xml: xml)
|
261
267
|
end
|
262
268
|
|
@@ -282,6 +288,12 @@ module Dor
|
|
282
288
|
|
283
289
|
attr_reader :requestor
|
284
290
|
|
291
|
+
def fetch_workflow(druid:, workflow:)
|
292
|
+
raise ArgumentError, 'missing workflow' unless workflow
|
293
|
+
|
294
|
+
requestor.request "objects/#{druid}/workflows/#{workflow}"
|
295
|
+
end
|
296
|
+
|
285
297
|
# @param [Hash] params
|
286
298
|
# @return [String]
|
287
299
|
def create_process_xml(params)
|
@@ -7,18 +7,22 @@ RSpec.describe Dor::Workflow::Client::ConnectionFactory do
|
|
7
7
|
let(:mock_logger) { double('Logger', info: true, debug: true, warn: true) }
|
8
8
|
|
9
9
|
let(:druid) { 'druid:123' }
|
10
|
+
let(:request_url) { "http://example.com/objects/#{druid}/workflows/httpException?lane-id=default&version=1" }
|
10
11
|
before do
|
11
|
-
stub_request(:post,
|
12
|
+
stub_request(:post, request_url)
|
12
13
|
.to_return(status: 500, body: 'Internal error', headers: {})
|
13
14
|
end
|
14
15
|
|
15
16
|
let(:client) { Dor::Workflow::Client.new url: 'http://example.com', logger: mock_logger }
|
16
17
|
|
17
18
|
describe '#create_workflow_by_name' do
|
19
|
+
subject(:request) { client.create_workflow_by_name(druid, 'httpException', version: '1') }
|
18
20
|
it 'logs an error and retry upon a targeted Faraday exception' do
|
19
|
-
expect(mock_logger).to receive(:warn)
|
20
|
-
|
21
|
-
expect
|
21
|
+
expect(mock_logger).to receive(:warn)
|
22
|
+
.with("retrying connection (1 remaining) to #{request_url}: (Faraday::RetriableResponse) 500")
|
23
|
+
expect(mock_logger).to receive(:warn)
|
24
|
+
.with("retrying connection (0 remaining) to #{request_url}: (Faraday::RetriableResponse) 500")
|
25
|
+
expect { request }.to raise_error Dor::WorkflowException
|
22
26
|
end
|
23
27
|
end
|
24
28
|
end
|
@@ -7,6 +7,30 @@ RSpec.describe Dor::Workflow::Client::WorkflowRoutes do
|
|
7
7
|
|
8
8
|
let(:routes) { described_class.new(requestor: mock_requestor) }
|
9
9
|
|
10
|
+
describe '#fetch_workflow' do
|
11
|
+
subject(:fetch_workflow) { routes.send(:fetch_workflow, druid: 'druid:mw971zk1113', workflow: workflow) }
|
12
|
+
|
13
|
+
context 'when a workflow name is provided' do
|
14
|
+
let(:workflow) { 'etdSubmitWF' }
|
15
|
+
let(:mock_requestor) { instance_double(Dor::Workflow::Client::Requestor, request: xml) }
|
16
|
+
let(:xml) { '<workflow id="etdSubmitWF"><process name="registrar-approval" status="completed" /></workflow>' }
|
17
|
+
|
18
|
+
it 'returns the xml for a given repository, druid, and workflow' do
|
19
|
+
expect(fetch_workflow).to eq(xml)
|
20
|
+
expect(mock_requestor).to have_received(:request)
|
21
|
+
.with('objects/druid:mw971zk1113/workflows/etdSubmitWF')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'when no workflow name is provided' do
|
26
|
+
let(:workflow) { nil }
|
27
|
+
|
28
|
+
it 'raises an error' do
|
29
|
+
expect { fetch_workflow }.to raise_error ArgumentError
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
10
34
|
describe '#workflow' do
|
11
35
|
let(:xml) do
|
12
36
|
<<~XML
|
@@ -17,7 +41,7 @@ RSpec.describe Dor::Workflow::Client::WorkflowRoutes do
|
|
17
41
|
end
|
18
42
|
|
19
43
|
before do
|
20
|
-
allow(routes).to receive(:
|
44
|
+
allow(routes).to receive(:fetch_workflow) { xml }
|
21
45
|
end
|
22
46
|
|
23
47
|
it 'returns a workflow' do
|
@@ -61,7 +61,7 @@ RSpec.describe Dor::Workflow::Client do
|
|
61
61
|
end
|
62
62
|
|
63
63
|
it 'has a user_agent' do
|
64
|
-
expect(conn.headers).to include('User-Agent' => /dor-workflow-
|
64
|
+
expect(conn.headers).to include('User-Agent' => /dor-workflow-client \d+\.\d+\.\d+/)
|
65
65
|
end
|
66
66
|
|
67
67
|
it 'defaults to using the flat params encoder' do
|
@@ -83,46 +83,70 @@ RSpec.describe Dor::Workflow::Client do
|
|
83
83
|
allow(Deprecation).to receive(:warn)
|
84
84
|
end
|
85
85
|
|
86
|
-
it '
|
86
|
+
it 'requests the workflow by name and return the URL to the workflow' do
|
87
87
|
client.create_workflow(@repo, @druid, 'etdSubmitWF', wf_xml)
|
88
|
-
expect(Deprecation).to have_received(:warn)
|
88
|
+
expect(Deprecation).to have_received(:warn).twice
|
89
89
|
end
|
90
90
|
|
91
|
-
it '
|
91
|
+
it 'raises on an unexpected Exception' do
|
92
92
|
expect { client.create_workflow(@repo, @druid, 'raiseException', wf_xml) }.to raise_error(Exception, 'broken')
|
93
|
-
expect(Deprecation).to have_received(:warn)
|
93
|
+
expect(Deprecation).to have_received(:warn).twice
|
94
94
|
end
|
95
95
|
|
96
96
|
it 'sets the lane_id param if provided in options hash' do
|
97
97
|
client.create_workflow(@repo, @druid, 'laneIdWF', wf_xml, lane_id: 'foo_lane')
|
98
|
-
expect(Deprecation).to have_received(:warn)
|
98
|
+
expect(Deprecation).to have_received(:warn).twice
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
102
102
|
describe '#create_workflow_by_name' do
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
stub.post("objects/#{@druid}/workflows/versionWF?version=2") { |_env| [201, {}, ''] }
|
103
|
+
context 'with no args' do
|
104
|
+
let(:stubs) do
|
105
|
+
Faraday::Adapter::Test::Stubs.new do |stub|
|
106
|
+
stub.post("objects/#{@druid}/workflows/etdSubmitWF") { |_env| [201, {}, ''] }
|
107
|
+
end
|
109
108
|
end
|
110
|
-
end
|
111
109
|
|
112
|
-
|
113
|
-
|
110
|
+
it 'requests the workflow by name and return the URL to the workflow' do
|
111
|
+
expect(Deprecation).to receive(:warn)
|
112
|
+
client.create_workflow_by_name(@druid, 'etdSubmitWF')
|
113
|
+
end
|
114
114
|
end
|
115
115
|
|
116
|
-
|
117
|
-
|
116
|
+
context 'when an unexpected exception is raised' do
|
117
|
+
let(:stubs) do
|
118
|
+
Faraday::Adapter::Test::Stubs.new do |stub|
|
119
|
+
stub.post("objects/#{@druid}/workflows/raiseException") { |_env| raise 'broken' }
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'raises the error' do
|
124
|
+
expect { client.create_workflow_by_name(@druid, 'raiseException', version: '1') }.to raise_error(Exception, 'broken')
|
125
|
+
end
|
118
126
|
end
|
119
127
|
|
120
|
-
|
121
|
-
|
128
|
+
context 'when lane_id is provided' do
|
129
|
+
let(:stubs) do
|
130
|
+
Faraday::Adapter::Test::Stubs.new do |stub|
|
131
|
+
stub.post("objects/#{@druid}/workflows/laneIdWF?lane-id=foo_lane&version=1") { |_env| [201, {}, ''] }
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'sets the lane_id param' do
|
136
|
+
client.create_workflow_by_name(@druid, 'laneIdWF', lane_id: 'foo_lane', version: 1)
|
137
|
+
end
|
122
138
|
end
|
123
139
|
|
124
|
-
|
125
|
-
|
140
|
+
context 'when lane_id is not provided' do
|
141
|
+
let(:stubs) do
|
142
|
+
Faraday::Adapter::Test::Stubs.new do |stub|
|
143
|
+
stub.post("objects/#{@druid}/workflows/versionWF?version=2") { |_env| [201, {}, ''] }
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'sets the version param if provided in options hash' do
|
148
|
+
client.create_workflow_by_name(@druid, 'versionWF', version: 2)
|
149
|
+
end
|
126
150
|
end
|
127
151
|
end
|
128
152
|
|
@@ -336,10 +360,10 @@ RSpec.describe Dor::Workflow::Client do
|
|
336
360
|
end
|
337
361
|
|
338
362
|
describe '#workflow_xml' do
|
363
|
+
before do
|
364
|
+
allow(Deprecation).to receive(:warn)
|
365
|
+
end
|
339
366
|
context 'with positional args' do
|
340
|
-
before do
|
341
|
-
allow(Deprecation).to receive(:warn)
|
342
|
-
end
|
343
367
|
subject(:workflow_xml) { client.workflow_xml('dor', 'druid:123', workflow) }
|
344
368
|
|
345
369
|
context 'when a workflow name is provided' do
|
@@ -371,9 +395,6 @@ RSpec.describe Dor::Workflow::Client do
|
|
371
395
|
|
372
396
|
context 'when a repo is provided' do
|
373
397
|
subject(:workflow_xml) { client.workflow_xml(repo: 'dor', druid: 'druid:123', workflow: workflow) }
|
374
|
-
before do
|
375
|
-
allow(Deprecation).to receive(:warn)
|
376
|
-
end
|
377
398
|
|
378
399
|
let(:workflow) { 'etdSubmitWF' }
|
379
400
|
let(:xml) { '<workflow id="etdSubmitWF"><process name="registrar-approval" status="completed" /></workflow>' }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dor-workflow-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Willy Mene
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2019-
|
12
|
+
date: 2019-12-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|