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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4d8df570247b1933a74f79a1267a2e09ea6aee91ef733b322ba6dd62ad09be52
4
- data.tar.gz: 04b76cc5931fb021221ee06ce7270af7832d6ab5f86dce1a89851b5a56e85b0e
3
+ metadata.gz: 1fdb8fc01a2ed982c1fd0e0d2e0aaaf58e9ac4dd89171c879c491fccaf02a83d
4
+ data.tar.gz: 50503e224f5c8c0e23cd9111de9c889b0f2773697a9acc1eb5985d8bca916111
5
5
  SHA512:
6
- metadata.gz: ccf2d68079d0762843662cc723b36d72c3a22dff330c3b51e2e1dd3e3b0ab95a316fad96e11d70c5f723bf82e68c4526ddb7e60f6717db349ccee05888241a88
7
- data.tar.gz: a606ecead248a7fbf548292c8948b3f8abff6471513f0773c47cea94f35544ebb7eb9e90b83a7ff792eb8f26f02b9f77908ffa36bb8996e746e37c3a6fad7d07
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:
@@ -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
@@ -3,7 +3,7 @@
3
3
  module Dor
4
4
  module Workflow
5
5
  class Client
6
- VERSION = '3.18.1'
6
+ VERSION = '3.19.0'
7
7
  end
8
8
  end
9
9
  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.18.1
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-24 00:00:00.000000000 Z
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.1.2
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