dor-workflow-client 3.0.0 → 3.1.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/dor-workflow-client.gemspec +1 -0
- data/lib/dor/models/response/workflow.rb +1 -1
- data/lib/dor/models/response/workflows.rb +34 -0
- data/lib/dor/workflow/client/version.rb +1 -1
- data/lib/dor/workflow/client/workflow_routes.rb +36 -22
- data/lib/dor/workflow/client.rb +3 -2
- data/spec/models/response/workflows_spec.rb +39 -0
- data/spec/workflow/client/connection_factory_spec.rb +5 -6
- data/spec/workflow/client/workflow_routes_spec.rb +24 -27
- data/spec/workflow/client_spec.rb +33 -8
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f379f2897210e36a67cf06fd7eed5ce8caa8b810b329a9c66dae0a03e03475d4
|
4
|
+
data.tar.gz: 309659963dca39f119c924d43be8599a3020d5154fb4dac3b4fc9923132542bf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d0240474ec807050bf566fe9f4fe329cd7c5a471da6486966fcf9baa733169ef6a2dd87d5442634180847a245f8e07355f323886450474b401810eb0270a797
|
7
|
+
data.tar.gz: f057983eab36e17474eccaebfca7bb96666eb7f0ad103fdd2d1139291ef659023f4cdad56dc32ec1d11de2903d6716deb90d2c9cb3815353c8fe131e3497e3ab
|
data/dor-workflow-client.gemspec
CHANGED
@@ -19,6 +19,7 @@ Gem::Specification.new do |gem|
|
|
19
19
|
|
20
20
|
gem.add_dependency 'activesupport', '>= 3.2.1', '< 6'
|
21
21
|
gem.add_dependency 'confstruct', '>= 0.2.7', '< 2'
|
22
|
+
gem.add_dependency 'deprecation', '~> 0'
|
22
23
|
gem.add_dependency 'faraday', '~> 0.9', '>= 0.9.2'
|
23
24
|
gem.add_dependency 'faraday_middleware'
|
24
25
|
gem.add_dependency 'net-http-persistent', '>= 2.9.4', '< 4.a'
|
@@ -5,7 +5,7 @@ require 'dor/models/response/process'
|
|
5
5
|
module Dor
|
6
6
|
module Workflow
|
7
7
|
module Response
|
8
|
-
# The response
|
8
|
+
# The response from asking the server about a workflow for an item
|
9
9
|
class Workflow
|
10
10
|
def initialize(xml:)
|
11
11
|
@xml = xml
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'dor/models/response/workflow'
|
4
|
+
|
5
|
+
module Dor
|
6
|
+
module Workflow
|
7
|
+
module Response
|
8
|
+
# The response from asking the server about all workflows for an item
|
9
|
+
class Workflows
|
10
|
+
def initialize(xml:)
|
11
|
+
@xml = xml
|
12
|
+
end
|
13
|
+
|
14
|
+
def pid
|
15
|
+
ng_xml.at_xpath('/workflows/@objectId').text
|
16
|
+
end
|
17
|
+
|
18
|
+
def workflows
|
19
|
+
@workflows ||= ng_xml.xpath('/workflows/workflow').map do |node|
|
20
|
+
Workflow.new(xml: node.to_xml)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
attr_reader :xml
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def ng_xml
|
29
|
+
@ng_xml ||= Nokogiri::XML(@xml)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -1,34 +1,51 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'deprecation'
|
4
|
+
|
3
5
|
module Dor
|
4
6
|
module Workflow
|
5
7
|
class Client
|
6
8
|
# Makes requests relating to a workflow
|
7
9
|
class WorkflowRoutes
|
10
|
+
extend Deprecation
|
11
|
+
|
8
12
|
def initialize(requestor:)
|
9
13
|
@requestor = requestor
|
10
14
|
end
|
11
15
|
|
12
|
-
#
|
13
|
-
# it will replace the old workflow with wf_xml passed to this method. You have the option of creating a datastream or not.
|
14
|
-
# Returns true on success. Caller must handle any exceptions
|
16
|
+
# This method is deprecated and calls create_workflow_by_name.
|
15
17
|
#
|
16
|
-
# @param [String] repo
|
18
|
+
# @param [String] repo Ignored
|
17
19
|
# @param [String] druid The id of the object
|
18
20
|
# @param [String] workflow_name The name of the workflow you want to create
|
19
|
-
# @param [String] wf_xml
|
21
|
+
# @param [String] wf_xml Ignored
|
20
22
|
# @param [Hash] opts optional params
|
21
23
|
# @option opts [Boolean] :create_ds if true, a workflow datastream will be created in Fedora. Set to false if you do not want a datastream to be created
|
22
24
|
# If you do not pass in an <b>opts</b> Hash, then :create_ds is set to true by default
|
23
25
|
# @option opts [String] :lane_id adds laneId attribute to all process elements in the wf_xml workflow xml. Defaults to a value of 'default'
|
24
26
|
# @return [Boolean] always true
|
25
27
|
#
|
26
|
-
def create_workflow(
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
def create_workflow(_repo, druid, workflow_name, _wf_xml, opts = { create_ds: true })
|
29
|
+
create_workflow_by_name(druid, workflow_name, opts)
|
30
|
+
end
|
31
|
+
deprecation_deprecate create_workflow: 'use create_workflow_by_name instead'
|
32
|
+
|
33
|
+
# Creates a workflow for a given object in the repository. If this particular workflow for this objects exists,
|
34
|
+
# it will replace the old workflow. You have the option of creating a datastream or not.
|
35
|
+
# Returns true on success. Caller must handle any exceptions.
|
36
|
+
#
|
37
|
+
# @param [String] repo The repository the object resides in. The service recoginzes "dor" and "sdr" at the moment
|
38
|
+
# @param [String] druid The id of the object
|
39
|
+
# @param [String] workflow_name The name of the workflow you want to create. This must correspond with a workflow
|
40
|
+
# name that is known by the workflow service.
|
41
|
+
# @param [Hash] opts optional params
|
42
|
+
# @option opts [String] :lane_id adds laneId attribute to all process elements in the wf_xml workflow xml. Defaults to a value of 'default'
|
43
|
+
# @return [Boolean] always true
|
44
|
+
#
|
45
|
+
def create_workflow_by_name(druid, workflow_name, opts = { create_ds: true })
|
46
|
+
requestor.request "objects/#{druid}/workflows/#{workflow_name}", 'post', '',
|
47
|
+
content_type: 'application/xml',
|
48
|
+
params: { 'lane-id' => opts.fetch(:lane_id, 'default') }
|
32
49
|
true
|
33
50
|
end
|
34
51
|
|
@@ -128,6 +145,14 @@ module Dor
|
|
128
145
|
requestor.request "objects/#{druid}/workflows"
|
129
146
|
end
|
130
147
|
|
148
|
+
# Retrieves all workflows for the given object
|
149
|
+
# @param [String] pid The id of the object
|
150
|
+
# @return [Workflow::Response::Workflows]
|
151
|
+
def all_workflows(pid:)
|
152
|
+
xml = all_workflows_xml(pid)
|
153
|
+
Workflow::Response::Workflows.new(xml: xml)
|
154
|
+
end
|
155
|
+
|
131
156
|
# Get workflow names into an array for given PID
|
132
157
|
# This method only works when this gem is used in a project that is configured to connect to DOR
|
133
158
|
#
|
@@ -165,17 +190,6 @@ module Dor
|
|
165
190
|
|
166
191
|
attr_reader :requestor
|
167
192
|
|
168
|
-
# Adds laneId attributes to each process of workflow xml
|
169
|
-
#
|
170
|
-
# @param [String] lane_id to add to each process element
|
171
|
-
# @param [String] wf_xml the workflow xml
|
172
|
-
# @return [String] wf_xml with lane_id attributes
|
173
|
-
def add_lane_id_to_workflow_xml(lane_id, wf_xml)
|
174
|
-
doc = Nokogiri::XML(wf_xml)
|
175
|
-
doc.xpath('/workflow/process').each { |proc| proc['laneId'] = lane_id }
|
176
|
-
doc.to_xml
|
177
|
-
end
|
178
|
-
|
179
193
|
# @param [Hash] params
|
180
194
|
# @return [String]
|
181
195
|
def create_process_xml(params)
|
data/lib/dor/workflow/client.rb
CHANGED
@@ -4,6 +4,7 @@ require 'active_support'
|
|
4
4
|
require 'active_support/core_ext'
|
5
5
|
require 'nokogiri'
|
6
6
|
require 'dor/workflow_exception'
|
7
|
+
require 'dor/models/response/workflows'
|
7
8
|
require 'dor/models/response/workflow'
|
8
9
|
require 'dor/models/response/update'
|
9
10
|
|
@@ -36,8 +37,8 @@ module Dor
|
|
36
37
|
@requestor = Requestor.new(connection: connection || ConnectionFactory.build_connection(url, timeout: timeout, logger: logger))
|
37
38
|
end
|
38
39
|
|
39
|
-
delegate :create_workflow, :
|
40
|
-
:update_workflow_error_status, :all_workflows_xml, :workflows,
|
40
|
+
delegate :create_workflow, :create_workflow_by_name, :update_workflow_status, :workflow_status,
|
41
|
+
:workflow_xml, :update_workflow_error_status, :all_workflows_xml, :workflows,
|
41
42
|
:workflow, :delete_workflow, to: :workflow_routes
|
42
43
|
|
43
44
|
delegate :lifecycle, :active_lifecycle, :milestones, to: :lifecycle_routes
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Dor::Workflow::Response::Workflows do
|
6
|
+
subject(:instance) { described_class.new(xml: xml) }
|
7
|
+
|
8
|
+
describe '#pid' do
|
9
|
+
subject { instance.pid }
|
10
|
+
|
11
|
+
let(:xml) do
|
12
|
+
<<~XML
|
13
|
+
<workflows objectId="druid:mw971zk1113">
|
14
|
+
</workflows>
|
15
|
+
XML
|
16
|
+
end
|
17
|
+
it { is_expected.to eq 'druid:mw971zk1113' }
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '#workflows' do
|
21
|
+
subject { instance.workflows }
|
22
|
+
|
23
|
+
let(:xml) do
|
24
|
+
<<~XML
|
25
|
+
<workflows objectId="druid:mw971zk1113">
|
26
|
+
<workflow repository="dor" objectId="druid:mw971zk1113" id="assemblyWF">
|
27
|
+
</workflow>
|
28
|
+
<workflow repository="dor" objectId="druid:mw971zk1113" id="sdrPreservationWF">
|
29
|
+
</workflow>
|
30
|
+
</workflows>
|
31
|
+
XML
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'has children' do
|
35
|
+
expect(subject).to all(be_kind_of Dor::Workflow::Response::Workflow)
|
36
|
+
expect(subject.map(&:workflow_name)).to eq %w[assemblyWF sdrPreservationWF]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -6,20 +6,19 @@ require 'spec_helper'
|
|
6
6
|
RSpec.describe Dor::Workflow::Client::ConnectionFactory do
|
7
7
|
let(:mock_logger) { double('Logger', info: true, debug: true, warn: true) }
|
8
8
|
|
9
|
-
let(:repo) { 'dor' }
|
10
9
|
let(:druid) { 'druid:123' }
|
11
10
|
before do
|
12
|
-
stub_request(:
|
11
|
+
stub_request(:post, "http://example.com/objects/#{druid}/workflows/httpException?lane-id=default")
|
13
12
|
.to_return(status: 500, body: 'Internal error', headers: {})
|
14
13
|
end
|
15
14
|
|
16
15
|
let(:client) { Dor::Workflow::Client.new url: 'http://example.com', logger: mock_logger }
|
17
16
|
|
18
|
-
describe '#
|
17
|
+
describe '#create_workflow_by_name' do
|
19
18
|
it 'logs an error and retry upon a targeted Faraday exception' do
|
20
|
-
expect(mock_logger).to receive(:warn).with('retrying connection (1 remaining) to http://example.com/
|
21
|
-
expect(mock_logger).to receive(:warn).with('retrying connection (0 remaining) to http://example.com/
|
22
|
-
expect { client.
|
19
|
+
expect(mock_logger).to receive(:warn).with('retrying connection (1 remaining) to http://example.com/objects/druid:123/workflows/httpException?lane-id=default: (Faraday::RetriableResponse) 500')
|
20
|
+
expect(mock_logger).to receive(:warn).with('retrying connection (0 remaining) to http://example.com/objects/druid:123/workflows/httpException?lane-id=default: (Faraday::RetriableResponse) 500')
|
21
|
+
expect { client.create_workflow_by_name(druid, 'httpException') }.to raise_error Dor::WorkflowException
|
23
22
|
end
|
24
23
|
end
|
25
24
|
end
|
@@ -7,33 +7,6 @@ RSpec.describe Dor::Workflow::Client::WorkflowRoutes do
|
|
7
7
|
|
8
8
|
let(:routes) { described_class.new(requestor: mock_requestor) }
|
9
9
|
|
10
|
-
let(:wf_xml) do
|
11
|
-
<<-EOXML
|
12
|
-
<workflow id="etdSubmitWF">
|
13
|
-
<process name="register-object" status="completed" attempts="1" />
|
14
|
-
<process name="submit" status="waiting" />
|
15
|
-
<process name="reader-approval" status="waiting" />
|
16
|
-
<process name="registrar-approval" status="waiting" />
|
17
|
-
<process name="start-accession" status="waiting" />
|
18
|
-
</workflow>
|
19
|
-
EOXML
|
20
|
-
end
|
21
|
-
|
22
|
-
describe '#add_lane_id_to_workflow_xml' do
|
23
|
-
it 'adds laneId attributes to all process elements' do
|
24
|
-
expected = <<-XML
|
25
|
-
<workflow id="etdSubmitWF">
|
26
|
-
<process name="register-object" status="completed" attempts="1" laneId="lane1"/>
|
27
|
-
<process name="submit" status="waiting" laneId="lane1"/>
|
28
|
-
<process name="reader-approval" status="waiting" laneId="lane1"/>
|
29
|
-
<process name="registrar-approval" status="waiting" laneId="lane1"/>
|
30
|
-
<process name="start-accession" status="waiting" laneId="lane1"/>
|
31
|
-
</workflow>
|
32
|
-
XML
|
33
|
-
expect(routes.send(:add_lane_id_to_workflow_xml, 'lane1', wf_xml)).to be_equivalent_to(expected)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
10
|
describe '#workflow' do
|
38
11
|
let(:xml) do
|
39
12
|
<<~XML
|
@@ -42,6 +15,7 @@ RSpec.describe Dor::Workflow::Client::WorkflowRoutes do
|
|
42
15
|
</workflow>
|
43
16
|
XML
|
44
17
|
end
|
18
|
+
|
45
19
|
before do
|
46
20
|
allow(routes).to receive(:workflow_xml) { xml }
|
47
21
|
end
|
@@ -50,4 +24,27 @@ RSpec.describe Dor::Workflow::Client::WorkflowRoutes do
|
|
50
24
|
expect(routes.workflow(pid: 'druid:mw971zk1113', workflow_name: 'accessionWF')).to be_kind_of Dor::Workflow::Response::Workflow
|
51
25
|
end
|
52
26
|
end
|
27
|
+
|
28
|
+
describe '#all_workflows' do
|
29
|
+
let(:xml) do
|
30
|
+
<<~XML
|
31
|
+
<workflows objectId="druid:mw971zk1113">
|
32
|
+
<workflow repository="dor" objectId="druid:mw971zk1113" id="accessionWF">
|
33
|
+
<process laneId="default" lifecycle="submitted" elapsed="0.0" attempts="1" datetime="2013-02-18T15:08:10-0800" status="completed" name="start-accession"/>
|
34
|
+
</workflow>
|
35
|
+
</workflows>
|
36
|
+
XML
|
37
|
+
end
|
38
|
+
|
39
|
+
before do
|
40
|
+
allow(routes).to receive(:all_workflows_xml) { xml }
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'it returns the workflows' do
|
44
|
+
expect(routes.all_workflows(pid: 'druid:mw971zk1113')).to be_kind_of Dor::Workflow::Response::Workflows
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe '#create_workflow_by_name' do
|
49
|
+
end
|
53
50
|
end
|
@@ -72,26 +72,51 @@ RSpec.describe Dor::Workflow::Client do
|
|
72
72
|
describe '#create_workflow' do
|
73
73
|
let(:stubs) do
|
74
74
|
Faraday::Adapter::Test::Stubs.new do |stub|
|
75
|
-
stub.
|
76
|
-
stub.
|
77
|
-
stub.
|
75
|
+
stub.post("objects/#{@druid}/workflows/etdSubmitWF") { |_env| [201, {}, ''] }
|
76
|
+
stub.post("objects/#{@druid}/workflows/raiseException") { |_env| raise 'broken' }
|
77
|
+
stub.post("objects/#{@druid}/workflows/laneIdWF?lane-id=foo_lane") { |_env| [201, {}, ''] }
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
81
|
-
|
81
|
+
before do
|
82
|
+
allow(Deprecation).to receive(:warn)
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'should request the workflow by name and return the URL to the workflow' do
|
82
86
|
client.create_workflow(@repo, @druid, 'etdSubmitWF', wf_xml)
|
87
|
+
expect(Deprecation).to have_received(:warn)
|
83
88
|
end
|
84
89
|
|
85
90
|
it 'should raise on an unexpected Exception' do
|
86
91
|
expect { client.create_workflow(@repo, @druid, 'raiseException', wf_xml) }.to raise_error(Exception, 'broken')
|
92
|
+
expect(Deprecation).to have_received(:warn)
|
87
93
|
end
|
88
94
|
|
89
|
-
it 'sets the
|
90
|
-
client.create_workflow(@repo, @druid, '
|
95
|
+
it 'sets the lane_id param if provided in options hash' do
|
96
|
+
client.create_workflow(@repo, @druid, 'laneIdWF', wf_xml, lane_id: 'foo_lane')
|
97
|
+
expect(Deprecation).to have_received(:warn)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
describe '#create_workflow_by_name' do
|
102
|
+
let(:stubs) do
|
103
|
+
Faraday::Adapter::Test::Stubs.new do |stub|
|
104
|
+
stub.post("objects/#{@druid}/workflows/etdSubmitWF") { |_env| [201, {}, ''] }
|
105
|
+
stub.post("objects/#{@druid}/workflows/raiseException") { |_env| raise 'broken' }
|
106
|
+
stub.post("objects/#{@druid}/workflows/laneIdWF?lane-id=foo_lane") { |_env| [201, {}, ''] }
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'should request the workflow by name and return the URL to the workflow' do
|
111
|
+
client.create_workflow_by_name(@druid, 'etdSubmitWF')
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'should raise on an unexpected Exception' do
|
115
|
+
expect { client.create_workflow_by_name(@druid, 'raiseException') }.to raise_error(Exception, 'broken')
|
91
116
|
end
|
92
117
|
|
93
|
-
it '
|
94
|
-
|
118
|
+
it 'sets the lane_id param if provided in options hash' do
|
119
|
+
client.create_workflow_by_name(@druid, 'laneIdWF', lane_id: 'foo_lane')
|
95
120
|
end
|
96
121
|
end
|
97
122
|
|
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.1.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-05-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -51,6 +51,20 @@ dependencies:
|
|
51
51
|
- - "<"
|
52
52
|
- !ruby/object:Gem::Version
|
53
53
|
version: '2'
|
54
|
+
- !ruby/object:Gem::Dependency
|
55
|
+
name: deprecation
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
type: :runtime
|
62
|
+
prerelease: false
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
54
68
|
- !ruby/object:Gem::Dependency
|
55
69
|
name: faraday
|
56
70
|
requirement: !ruby/object:Gem::Requirement
|
@@ -258,6 +272,7 @@ files:
|
|
258
272
|
- lib/dor/models/response/process.rb
|
259
273
|
- lib/dor/models/response/update.rb
|
260
274
|
- lib/dor/models/response/workflow.rb
|
275
|
+
- lib/dor/models/response/workflows.rb
|
261
276
|
- lib/dor/workflow/client.rb
|
262
277
|
- lib/dor/workflow/client/connection_factory.rb
|
263
278
|
- lib/dor/workflow/client/lifecycle_routes.rb
|
@@ -268,6 +283,7 @@ files:
|
|
268
283
|
- lib/dor/workflow/client/workflow_routes.rb
|
269
284
|
- lib/dor/workflow_exception.rb
|
270
285
|
- spec/models/response/workflow_spec.rb
|
286
|
+
- spec/models/response/workflows_spec.rb
|
271
287
|
- spec/spec_helper.rb
|
272
288
|
- spec/workflow/client/connection_factory_spec.rb
|
273
289
|
- spec/workflow/client/lifecycle_routes_spec.rb
|
@@ -299,6 +315,7 @@ specification_version: 4
|
|
299
315
|
summary: Provides convenience methods to work with the DOR Workflow Service
|
300
316
|
test_files:
|
301
317
|
- spec/models/response/workflow_spec.rb
|
318
|
+
- spec/models/response/workflows_spec.rb
|
302
319
|
- spec/spec_helper.rb
|
303
320
|
- spec/workflow/client/connection_factory_spec.rb
|
304
321
|
- spec/workflow/client/lifecycle_routes_spec.rb
|