dor-workflow-client 3.18.1 → 3.19.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -0
- data/lib/dor/workflow/client.rb +4 -0
- data/lib/dor/workflow/client/status.rb +115 -0
- data/lib/dor/workflow/client/version.rb +1 -1
- data/spec/workflow/client/status_spec.rb +181 -0
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1fdb8fc01a2ed982c1fd0e0d2e0aaaf58e9ac4dd89171c879c491fccaf02a83d
|
4
|
+
data.tar.gz: 50503e224f5c8c0e23cd9111de9c889b0f2773697a9acc1eb5985d8bca916111
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ed1e22bad5aebd865bff1c03ab340b37a73eb7b4d6671436ad4fa2b5375c68667deb26fdd630800dad6d1392a4f27877c9c32611e54495947488f0d7ad0ab0de
|
7
|
+
data.tar.gz: 604a0981194c0d857b93ddc7925a3c4036eb560141e1ba61226367e8324ee26206cd92f2abe61ce6710ac89493c1ce563d001e64bc206605aad6af25544ad652
|
data/README.md
CHANGED
@@ -51,6 +51,12 @@ Show a workflow template
|
|
51
51
|
client.workflow_template('etdSubmitWF')
|
52
52
|
```
|
53
53
|
|
54
|
+
Get the status of an object
|
55
|
+
```ruby
|
56
|
+
client.status(druid: 'druid:gv054hp4128', version: '3').display
|
57
|
+
#=> "v3 Accessioned"
|
58
|
+
```
|
59
|
+
|
54
60
|
## Underlying Clients
|
55
61
|
|
56
62
|
This gem currently uses the [Faraday](https://github.com/lostisland/faraday) HTTP client to access the back-end service. The clients be accessed directly from your `Dor::Workflow::Client` object:
|
data/lib/dor/workflow/client.rb
CHANGED
@@ -81,6 +81,10 @@ module Dor
|
|
81
81
|
WorkflowTemplate.new(requestor: requestor)
|
82
82
|
end
|
83
83
|
|
84
|
+
def status(druid:, version:)
|
85
|
+
@status ||= Status.new(druid: druid, version: version, lifecycle_routes: lifecycle_routes)
|
86
|
+
end
|
87
|
+
|
84
88
|
private
|
85
89
|
|
86
90
|
# Among other things, a distinct method helps tests mock default logger
|
@@ -0,0 +1,115 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Dor
|
4
|
+
module Workflow
|
5
|
+
class Client
|
6
|
+
# reveals the status of an object based on the lifecycles
|
7
|
+
class Status
|
8
|
+
# verbiage we want to use to describe an item when it has completed a particular step
|
9
|
+
STATUS_CODE_DISP_TXT = {
|
10
|
+
0 => 'Unknown Status', # if there are no milestones for the current version, someone likely messed up the versioning process.
|
11
|
+
1 => 'Registered',
|
12
|
+
2 => 'In accessioning',
|
13
|
+
3 => 'In accessioning (described)',
|
14
|
+
4 => 'In accessioning (described, published)',
|
15
|
+
5 => 'In accessioning (described, published, deposited)',
|
16
|
+
6 => 'Accessioned',
|
17
|
+
7 => 'Accessioned (indexed)',
|
18
|
+
8 => 'Accessioned (indexed, ingested)',
|
19
|
+
9 => 'Opened'
|
20
|
+
}.freeze
|
21
|
+
|
22
|
+
# milestones from accessioning and the order they happen in
|
23
|
+
STEPS = {
|
24
|
+
'registered' => 1,
|
25
|
+
'submitted' => 2,
|
26
|
+
'described' => 3,
|
27
|
+
'published' => 4,
|
28
|
+
'deposited' => 5,
|
29
|
+
'accessioned' => 6,
|
30
|
+
'indexed' => 7,
|
31
|
+
'shelved' => 8,
|
32
|
+
'opened' => 9
|
33
|
+
}.freeze
|
34
|
+
|
35
|
+
# @param [String] druid the object identifier
|
36
|
+
# @param [String] version the version identifier
|
37
|
+
# @param [LifecycleRoutes] lifecycle_routes the lifecycle client
|
38
|
+
def initialize(druid:, version:, lifecycle_routes:)
|
39
|
+
@druid = druid
|
40
|
+
@version = version
|
41
|
+
@lifecycle_routes = lifecycle_routes
|
42
|
+
end
|
43
|
+
|
44
|
+
# @return [Hash{Symbol => Object}] including :status_code and :status_time
|
45
|
+
def info
|
46
|
+
# if we have an accessioned milestone, this is the last possible step and should be the status regardless of time stamp
|
47
|
+
accessioned_milestones = current_milestones.select { |m| m[:milestone] == 'accessioned' }
|
48
|
+
return { status_code: STEPS['accessioned'], status_time: accessioned_milestones.last[:at].utc.xmlschema } unless accessioned_milestones.empty?
|
49
|
+
|
50
|
+
status_code = 0
|
51
|
+
status_time = nil
|
52
|
+
# for each milestone in the current version, see if it comes at the same time or after the current 'last' step, if so, make it the last and record the date/time
|
53
|
+
current_milestones.each do |m|
|
54
|
+
m_name = m[:milestone]
|
55
|
+
m_time = m[:at].utc.xmlschema
|
56
|
+
next unless STEPS.key?(m_name) && (!status_time || m_time >= status_time)
|
57
|
+
|
58
|
+
status_code = STEPS[m_name]
|
59
|
+
status_time = m_time
|
60
|
+
end
|
61
|
+
|
62
|
+
{ status_code: status_code, status_time: status_time }
|
63
|
+
end
|
64
|
+
|
65
|
+
# @param [Boolean] include_time
|
66
|
+
# @return [String] single composed status from status_info
|
67
|
+
def display(include_time: false)
|
68
|
+
status_info_hash = info
|
69
|
+
status_code = status_info_hash[:status_code]
|
70
|
+
status_time = status_info_hash[:status_time]
|
71
|
+
|
72
|
+
# use the translation table to get the appropriate verbage for the latest step
|
73
|
+
result = "v#{version} #{STATUS_CODE_DISP_TXT[status_code]}"
|
74
|
+
result += " #{format_date(status_time)}" if include_time
|
75
|
+
result
|
76
|
+
end
|
77
|
+
|
78
|
+
def milestones
|
79
|
+
@milestones ||= lifecycle_routes.milestones('dor', druid)
|
80
|
+
end
|
81
|
+
|
82
|
+
private
|
83
|
+
|
84
|
+
attr_reader :druid, :version, :lifecycle_routes
|
85
|
+
|
86
|
+
def current_milestones
|
87
|
+
current = []
|
88
|
+
# only get steps that are part of accessioning and part of the current version. That can mean they were archived with the current version
|
89
|
+
# number, or they might be active (no version number).
|
90
|
+
milestones.each do |m|
|
91
|
+
if STEPS.key?(m[:milestone]) && (m[:version].nil? || m[:version] == version)
|
92
|
+
current << m unless m[:milestone] == 'registered' && version.to_i > 1
|
93
|
+
end
|
94
|
+
end
|
95
|
+
current
|
96
|
+
end
|
97
|
+
|
98
|
+
# handles formating utc date/time to human readable
|
99
|
+
# XXX: bad form to hardcode TZ here.
|
100
|
+
def format_date(datetime)
|
101
|
+
d =
|
102
|
+
if datetime.is_a?(Time)
|
103
|
+
datetime
|
104
|
+
else
|
105
|
+
DateTime.parse(datetime).in_time_zone(ActiveSupport::TimeZone.new('Pacific Time (US & Canada)'))
|
106
|
+
end
|
107
|
+
I18n.l(d).strftime('%Y-%m-%d %I:%M%p')
|
108
|
+
rescue StandardError
|
109
|
+
d = datetime.is_a?(Time) ? datetime : Time.parse(datetime.to_s)
|
110
|
+
d.strftime('%Y-%m-%d %I:%M%p')
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,181 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Dor::Workflow::Client::Status do
|
6
|
+
subject(:instance) do
|
7
|
+
described_class.new(druid: druid, version: version, lifecycle_routes: lifecycle_routes)
|
8
|
+
end
|
9
|
+
let(:druid) { 'druid:ab123cd4567' }
|
10
|
+
let(:version) { '2' }
|
11
|
+
let(:lifecycle_routes) { Dor::Workflow::Client::LifecycleRoutes.new(requestor: requestor) }
|
12
|
+
let(:requestor) { instance_double(Dor::Workflow::Client::Requestor, request: xml) }
|
13
|
+
|
14
|
+
describe '#display' do
|
15
|
+
subject(:status) { instance.display }
|
16
|
+
|
17
|
+
before do
|
18
|
+
# TODO: this stub is too knowledgable about the inner workings of the LifecycleRoutest
|
19
|
+
# instead it should just stub :milestones which returns an array of hashes
|
20
|
+
# expect(lifecycle_routes).to receive(:query_lifecycle).and_return(xml)
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'for gv054hp4128' do
|
24
|
+
context 'when current version is published, but does not have a version attribute' do
|
25
|
+
let(:xml) do
|
26
|
+
'<?xml version="1.0" encoding="UTF-8"?>
|
27
|
+
<lifecycle objectId="druid:gv054hp4128">
|
28
|
+
<milestone date="2012-11-06T16:19:15-0800" version="2">described</milestone>
|
29
|
+
<milestone date="2012-11-06T16:21:02-0800">opened</milestone>
|
30
|
+
<milestone date="2012-11-06T16:30:03-0800">submitted</milestone>
|
31
|
+
<milestone date="2012-11-06T16:35:00-0800">described</milestone>
|
32
|
+
<milestone date="2012-11-06T16:59:39-0800" version="3">published</milestone>
|
33
|
+
<milestone date="2012-11-06T16:59:39-0800">published</milestone>
|
34
|
+
</lifecycle>'
|
35
|
+
end
|
36
|
+
|
37
|
+
let(:version) { '4' }
|
38
|
+
|
39
|
+
it 'generates a status string' do
|
40
|
+
expect(status).to eq('v4 In accessioning (described, published)')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'when current version matches the attribute in the milestone' do
|
45
|
+
let(:xml) do
|
46
|
+
'<?xml version="1.0" encoding="UTF-8"?>
|
47
|
+
<lifecycle objectId="druid:gv054hp4128">
|
48
|
+
<milestone date="2012-11-06T16:19:15-0800" version="2">described</milestone>
|
49
|
+
<milestone date="2012-11-06T16:59:39-0800" version="3">published</milestone>
|
50
|
+
</lifecycle>'
|
51
|
+
end
|
52
|
+
let(:version) { '3' }
|
53
|
+
|
54
|
+
it 'generates a status string' do
|
55
|
+
expect(status).to eq('v3 In accessioning (described, published)')
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context 'for bd504dj1946' do
|
61
|
+
let(:xml) do
|
62
|
+
'<?xml version="1.0"?>
|
63
|
+
<lifecycle objectId="druid:bd504dj1946">
|
64
|
+
<milestone date="2013-04-03T15:01:57-0700">registered</milestone>
|
65
|
+
<milestone date="2013-04-03T16:20:19-0700">digitized</milestone>
|
66
|
+
<milestone date="2013-04-16T14:18:20-0700" version="1">submitted</milestone>
|
67
|
+
<milestone date="2013-04-16T14:32:54-0700" version="1">described</milestone>
|
68
|
+
<milestone date="2013-04-16T14:55:10-0700" version="1">published</milestone>
|
69
|
+
<milestone date="2013-07-21T05:27:23-0700" version="1">deposited</milestone>
|
70
|
+
<milestone date="2013-07-21T05:28:09-0700" version="1">accessioned</milestone>
|
71
|
+
<milestone date="2013-08-15T11:59:16-0700" version="2">opened</milestone>
|
72
|
+
<milestone date="2013-10-01T12:01:07-0700" version="2">submitted</milestone>
|
73
|
+
<milestone date="2013-10-01T12:01:24-0700" version="2">described</milestone>
|
74
|
+
<milestone date="2013-10-01T12:05:38-0700" version="2">published</milestone>
|
75
|
+
<milestone date="2013-10-01T12:10:56-0700" version="2">deposited</milestone>
|
76
|
+
<milestone date="2013-10-01T12:11:10-0700" version="2">accessioned</milestone>
|
77
|
+
</lifecycle>'
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'handles a v2 accessioned object' do
|
81
|
+
expect(status).to eq('v2 Accessioned')
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'when there are no lifecycles for the current version, indicating malfunction in workflow' do
|
85
|
+
let(:version) { '3' }
|
86
|
+
|
87
|
+
it 'gives a status of unknown' do
|
88
|
+
expect(status).to eq('v3 Unknown Status')
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context 'when time is requested' do
|
93
|
+
subject(:status) { instance.display(include_time: true) }
|
94
|
+
|
95
|
+
it 'includes a formatted date/time if one is requested' do
|
96
|
+
expect(status).to eq('v2 Accessioned 2013-10-01 07:11PM')
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
context 'for an accessioned step with the exact same timestamp as the deposited step' do
|
102
|
+
let(:xml) do
|
103
|
+
'<?xml version="1.0"?>
|
104
|
+
<lifecycle objectId="druid:bd504dj1946">
|
105
|
+
<milestone date="2013-04-03T15:01:57-0700">registered</milestone>
|
106
|
+
<milestone date="2013-04-03T16:20:19-0700">digitized</milestone>
|
107
|
+
<milestone date="2013-04-16T14:18:20-0700" version="1">submitted</milestone>
|
108
|
+
<milestone date="2013-04-16T14:32:54-0700" version="1">described</milestone>
|
109
|
+
<milestone date="2013-04-16T14:55:10-0700" version="1">published</milestone>
|
110
|
+
<milestone date="2013-07-21T05:27:23-0700" version="1">deposited</milestone>
|
111
|
+
<milestone date="2013-07-21T05:28:09-0700" version="1">accessioned</milestone>
|
112
|
+
<milestone date="2013-08-15T11:59:16-0700" version="2">opened</milestone>
|
113
|
+
<milestone date="2013-10-01T12:01:07-0700" version="2">submitted</milestone>
|
114
|
+
<milestone date="2013-10-01T12:01:24-0700" version="2">described</milestone>
|
115
|
+
<milestone date="2013-10-01T12:05:38-0700" version="2">published</milestone>
|
116
|
+
<milestone date="2013-10-01T12:10:56-0700" version="2">deposited</milestone>
|
117
|
+
<milestone date="2013-10-01T12:10:56-0700" version="2">accessioned</milestone>
|
118
|
+
</lifecycle>'
|
119
|
+
end
|
120
|
+
|
121
|
+
subject(:status) { instance.display(include_time: true) }
|
122
|
+
|
123
|
+
it 'has the correct status of accessioned (v2) object' do
|
124
|
+
expect(status).to eq('v2 Accessioned 2013-10-01 07:10PM')
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
context 'for an accessioned step with an ealier timestamp than the deposited step' do
|
129
|
+
let(:xml) do
|
130
|
+
'<?xml version="1.0"?>
|
131
|
+
<lifecycle objectId="druid:bd504dj1946">
|
132
|
+
<milestone date="2013-04-03T15:01:57-0700">registered</milestone>
|
133
|
+
<milestone date="2013-04-03T16:20:19-0700">digitized</milestone>
|
134
|
+
<milestone date="2013-04-16T14:18:20-0700" version="1">submitted</milestone>
|
135
|
+
<milestone date="2013-04-16T14:32:54-0700" version="1">described</milestone>
|
136
|
+
<milestone date="2013-04-16T14:55:10-0700" version="1">published</milestone>
|
137
|
+
<milestone date="2013-07-21T05:27:23-0700" version="1">deposited</milestone>
|
138
|
+
<milestone date="2013-07-21T05:28:09-0700" version="1">accessioned</milestone>
|
139
|
+
<milestone date="2013-08-15T11:59:16-0700" version="2">opened</milestone>
|
140
|
+
<milestone date="2013-10-01T12:01:07-0700" version="2">submitted</milestone>
|
141
|
+
<milestone date="2013-10-01T12:01:24-0700" version="2">described</milestone>
|
142
|
+
<milestone date="2013-10-01T12:05:38-0700" version="2">published</milestone>
|
143
|
+
<milestone date="2013-10-01T12:10:56-0700" version="2">deposited</milestone>
|
144
|
+
<milestone date="2013-09-01T12:10:56-0700" version="2">accessioned</milestone>
|
145
|
+
</lifecycle>'
|
146
|
+
end
|
147
|
+
|
148
|
+
subject(:status) { instance.display(include_time: true) }
|
149
|
+
|
150
|
+
it 'has the correct status of accessioned (v2) object' do
|
151
|
+
expect(status).to eq('v2 Accessioned 2013-09-01 07:10PM')
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
context 'for a deposited step for a non-accessioned object' do
|
156
|
+
let(:xml) do
|
157
|
+
'<?xml version="1.0"?>
|
158
|
+
<lifecycle objectId="druid:bd504dj1946">
|
159
|
+
<milestone date="2013-04-03T15:01:57-0700">registered</milestone>
|
160
|
+
<milestone date="2013-04-03T16:20:19-0700">digitized</milestone>
|
161
|
+
<milestone date="2013-04-16T14:18:20-0700" version="1">submitted</milestone>
|
162
|
+
<milestone date="2013-04-16T14:32:54-0700" version="1">described</milestone>
|
163
|
+
<milestone date="2013-04-16T14:55:10-0700" version="1">published</milestone>
|
164
|
+
<milestone date="2013-07-21T05:27:23-0700" version="1">deposited</milestone>
|
165
|
+
<milestone date="2013-07-21T05:28:09-0700" version="1">accessioned</milestone>
|
166
|
+
<milestone date="2013-08-15T11:59:16-0700" version="2">opened</milestone>
|
167
|
+
<milestone date="2013-10-01T12:01:07-0700" version="2">submitted</milestone>
|
168
|
+
<milestone date="2013-10-01T12:01:24-0700" version="2">described</milestone>
|
169
|
+
<milestone date="2013-10-01T12:05:38-0700" version="2">published</milestone>
|
170
|
+
<milestone date="2013-10-01T12:10:56-0700" version="2">deposited</milestone>
|
171
|
+
</lifecycle>'
|
172
|
+
end
|
173
|
+
|
174
|
+
subject(:status) { instance.display(include_time: true) }
|
175
|
+
|
176
|
+
it 'has the correct status of deposited (v2) object' do
|
177
|
+
expect(status).to eq('v2 In accessioning (described, published, deposited) 2013-10-01 07:10PM')
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
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.19.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: 2020-01-
|
12
|
+
date: 2020-01-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -215,6 +215,7 @@ files:
|
|
215
215
|
- lib/dor/workflow/client/lifecycle_routes.rb
|
216
216
|
- lib/dor/workflow/client/queues.rb
|
217
217
|
- lib/dor/workflow/client/requestor.rb
|
218
|
+
- lib/dor/workflow/client/status.rb
|
218
219
|
- lib/dor/workflow/client/version.rb
|
219
220
|
- lib/dor/workflow/client/version_routes.rb
|
220
221
|
- lib/dor/workflow/client/workflow_routes.rb
|
@@ -231,6 +232,7 @@ files:
|
|
231
232
|
- spec/workflow/client/connection_factory_spec.rb
|
232
233
|
- spec/workflow/client/lifecycle_routes_spec.rb
|
233
234
|
- spec/workflow/client/requestor_spec.rb
|
235
|
+
- spec/workflow/client/status_spec.rb
|
234
236
|
- spec/workflow/client/version_routes_spec.rb
|
235
237
|
- spec/workflow/client/workflow_routes_spec.rb
|
236
238
|
- spec/workflow/client/workflow_template_spec.rb
|
@@ -253,7 +255,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
253
255
|
- !ruby/object:Gem::Version
|
254
256
|
version: '0'
|
255
257
|
requirements: []
|
256
|
-
rubygems_version: 3.
|
258
|
+
rubygems_version: 3.0.3
|
257
259
|
signing_key:
|
258
260
|
specification_version: 4
|
259
261
|
summary: Provides convenience methods to work with the DOR Workflow Service
|
@@ -265,6 +267,7 @@ test_files:
|
|
265
267
|
- spec/workflow/client/connection_factory_spec.rb
|
266
268
|
- spec/workflow/client/lifecycle_routes_spec.rb
|
267
269
|
- spec/workflow/client/requestor_spec.rb
|
270
|
+
- spec/workflow/client/status_spec.rb
|
268
271
|
- spec/workflow/client/version_routes_spec.rb
|
269
272
|
- spec/workflow/client/workflow_routes_spec.rb
|
270
273
|
- spec/workflow/client/workflow_template_spec.rb
|