lyber-core 5.5.1 → 6.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: 111851f92d3a3e5eea02835d7344f396109b4ee1d1d3d9ef876572d5e4635ff3
4
- data.tar.gz: e02aac8fd5daef98edf95f7c428ba17030ecc11ba5ddafa699c25e34ed4d1743
3
+ metadata.gz: '0786ae4b4aa512ea86d9a147d4002d141fc2658e8f52b533056c658dee6d727e'
4
+ data.tar.gz: fd8b91265cbf0f5aa5c456d2f7edd88c4d7fd8c4fad019bd99df403021e7dd39
5
5
  SHA512:
6
- metadata.gz: 408a6bd0a29d3bd855401c920bae9be51d6ecfeb7ff04f8f90a758b813c2cafe45cc27794a16401ac3384c10dfcc43cde33ed2558d08c43ab471bb4f12d9af11
7
- data.tar.gz: 5381aa2ba9b906e2bcdc25b2fba7bce54b9a0cc9125008ca901f1bb28c61f250e9b5f092c33e0c96d5c65a0a3fb34f4e8fbf4a28eb6b8050f973176ea8dfdbb4
6
+ metadata.gz: 2c250695948c1c111c181886b8d03ffe23475a8c5ce020da62f67782710a682ac0f9cbbe1952e1efe36eb9d20363c63049477a01b47763770862ba7e200e1da2
7
+ data.tar.gz: 665ab707ba5e5603440dc1c9ee3b8f1b0ac67dc7bc213f441baeb1525070f8e3f1b2eaee317ad3d283216ba3d304574b898b2bd92c11d42182545c906be3d7cf
data/README.md CHANGED
@@ -53,13 +53,13 @@ module Robots
53
53
  obj = Dor::Item.find(druid)
54
54
  if some_logic_here_to_determine_if_shelving_occurs
55
55
  obj.shelve
56
- return LyberCore::Robot::ReturnState.COMPLETED # set the final state to completed
57
- # return LyberCore::Robot::ReturnState.new(state: 'completed', note: 'some custom note to pass back to workflow') # set the final state to completed with a custom note
56
+ return LyberCore::Robot::ReturnState.new(status: 'completed') # set the final state to completed
57
+ # return LyberCore::Robot::ReturnState.new(status: 'completed', note: 'some custom note to pass back to workflow') # set the final state to completed with a custom note
58
58
 
59
59
  else
60
60
  # just return skipped if we did nothing
61
- return LyberCore::Robot::ReturnState.SKIPPED # set the final state to skipped
62
- # return LyberCore::Robot::ReturnState.new(state: 'skipped', note: 'some custom note to pass back to workflow') # set the final state to skipped with a custom note
61
+ return LyberCore::Robot::ReturnState.new(status: 'skipped') # set the final state to skipped
62
+ # return LyberCore::Robot::ReturnState.new(status: 'skipped', note: 'some custom note to pass back to workflow') # set the final state to skipped with a custom note
63
63
  end
64
64
  end
65
65
 
data/lib/lyber_core.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dor-services'
4
3
  require 'lyber_core/log'
4
+ require 'lyber_core/workflow'
5
5
  require 'lyber_core/robot'
6
6
  require 'lyber_core/return_state'
@@ -11,18 +11,6 @@ module LyberCore
11
11
  ALLOWED_RETURN_STATES = %w[completed skipped waiting].freeze
12
12
  DEFAULT_RETURN_STATE = 'completed'
13
13
 
14
- def self.SKIPPED
15
- new(status: 'skipped')
16
- end
17
-
18
- def self.COMPLETED
19
- new(status: 'completed')
20
- end
21
-
22
- def self.WAITING
23
- new(status: 'waiting')
24
- end
25
-
26
14
  def initialize(params = {})
27
15
  self.status = params[:status] || DEFAULT_RETURN_STATE
28
16
  self.note = params[:note] || ''
@@ -1,9 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'benchmark'
4
- require 'active_support'
5
- require 'active_support/core_ext'
6
- require 'active_support/core_ext/string/inflections' # camelcase
7
4
 
8
5
  module LyberCore
9
6
  module Robot
@@ -21,56 +18,36 @@ module LyberCore
21
18
  end
22
19
  end
23
20
 
24
- # Converts a given step to the Robot class name
25
- # Examples:
26
- #
27
- # - `dor:assemblyWF:jp2-create` into `Robots::DorRepo::Assembly::Jp2Create`
28
- # - `dor:gisAssemblyWF:start-assembly-workflow` into `Robots::DorRepo::GisAssembly::StartAssemblyWorkflow`
29
- # - `dor:etdSubmitWF:binder-transfer` into `Robots:DorRepo::EtdSubmit::BinderTransfer`
30
- #
31
- # @param [String] step. fully qualified step name, e.g., `dor:accessionWF:descriptive-metadata`
32
- # @param [Hash] opts
33
- # @option :repo_suffix defaults to `Repo`
34
- # @return [String] The class name for the robot, e.g., `Robots::DorRepo::Accession:DescriptiveMetadata`
35
- def self.step_to_classname(step, opts = {})
36
- # generate the robot job class name
37
- opts[:repo_suffix] ||= 'Repo'
38
- r, w, s = step.split(/:/, 3)
39
- [
40
- 'Robots',
41
- r.camelcase + opts[:repo_suffix], # 'Dor' conflicts with dor-services
42
- w.sub('WF', '').camelcase,
43
- s.tr('-', '_').camelcase
44
- ].join('::')
45
- end
46
-
47
21
  attr_accessor :check_queued_status
48
- attr_reader :workflow_service
22
+ attr_reader :workflow_name, :process
49
23
 
50
- def initialize(repo, workflow_name, step_name, opts = {})
24
+ def initialize(workflow_name, process, check_queued_status: true)
51
25
  Signal.trap('QUIT') { puts "#{Process.pid} ignoring SIGQUIT" } # SIGQUIT ignored to let the robot finish
52
- @repo = repo
53
26
  @workflow_name = workflow_name
54
- @step_name = step_name
55
- @check_queued_status = opts.fetch(:check_queued_status, true)
56
- @workflow_service = opts.fetch(:workflow_service) { Dor::Config.workflow.client }
27
+ @process = process
28
+ @check_queued_status = check_queued_status
29
+ end
30
+
31
+ def workflow_service
32
+ raise 'The workflow_service method must be implemented on the class that includes LyberCore::Robot'
57
33
  end
58
34
 
59
35
  # Sets up logging, timing and error handling of the job
60
36
  # Calls the #perform method, then sets workflow to 'completed' or 'error' depending on success
61
37
  def work(druid)
62
- Honeybadger.context(druid: druid, step_name: @step_name, workflow_name: @workflow_name) if defined? Honeybadger
63
-
38
+ Honeybadger.context(druid: druid, process: process, workflow_name: workflow_name) if defined? Honeybadger
39
+ workflow = workflow(druid)
64
40
  LyberCore::Log.set_logfile($stdout) # let process manager(bluepill) handle logging
65
41
  LyberCore::Log.info "#{druid} processing"
66
- return if @check_queued_status && !item_queued?(druid)
42
+ return if check_queued_status && !item_queued?(druid)
67
43
 
68
- # this is the default note to pass back to workflow service, but it can be overriden by a robot that uses the Lybercore::Robot::ReturnState object to return a status
44
+ # this is the default note to pass back to workflow service,
45
+ # but it can be overriden by a robot that uses the Lybercore::Robot::ReturnState
46
+ # object to return a status
69
47
  note = Socket.gethostname
70
48
 
71
49
  # update the workflow status to indicate that started
72
- puts('setting to start')
73
- workflow_service.update_status(druid: druid, workflow: @workflow_name, process: @step_name, status: 'started', elapsed: 1.0, note: note)
50
+ workflow.start(note)
74
51
 
75
52
  result = nil
76
53
  elapsed = Benchmark.realtime do
@@ -87,25 +64,36 @@ module LyberCore
87
64
  workflow_state = 'completed'
88
65
  end
89
66
  # update the workflow status from its current state to the state returned by perform (or 'completed' as the default)
90
- workflow_service.update_status(druid: druid, workflow: @workflow_name, process: @step_name, status: workflow_state, elapsed: elapsed, note: note)
67
+ workflow.complete(workflow_state, elapsed, note)
68
+
91
69
  LyberCore::Log.info "Finished #{druid} in #{sprintf('%0.4f', elapsed)}s"
92
70
  rescue StandardError => e
93
71
  Honeybadger.notify(e) if defined? Honeybadger
94
72
  begin
95
73
  LyberCore::Log.error e.message + "\n" + e.backtrace.join("\n")
96
- workflow_service.update_error_status(druid: druid, workflow: @workflow_name, process: @step_name, error_msg: e.message, error_text: Socket.gethostname)
74
+ workflow.error(e.message, Socket.gethostname)
97
75
  rescue StandardError => e
98
- LyberCore::Log.error "Cannot set #{druid} to status='error'\n" + e.message + "\n" + e.backtrace.join("\n")
76
+ LyberCore::Log.error "Cannot set #{druid} to status='error'\n#{e.message}\n#{e.backtrace.join("\n")}"
99
77
  raise e # send exception to Resque failed queue
100
78
  end
101
79
  end
102
80
 
103
81
  private
104
82
 
83
+ def workflow(druid)
84
+ Workflow.new(workflow_service: workflow_service,
85
+ druid: druid,
86
+ workflow_name: workflow_name,
87
+ process: process)
88
+ end
89
+
105
90
  def item_queued?(druid)
106
- status = workflow_service.workflow_status(druid: druid, workflow: @workflow_name, process: @step_name)
91
+ status = workflow_service.workflow_status(druid: druid,
92
+ workflow: workflow_name,
93
+ process: process)
107
94
  return true if status =~ /queued/i
108
- msg = "Item #{druid} is not queued for #{@step_name} (#{@workflow_name}), but has status of '#{status}'. Will skip processing"
95
+
96
+ msg = "Item #{druid} is not queued for #{process} (#{workflow_name}), but has status of '#{status}'. Will skip processing"
109
97
  Honeybadger.notify(msg) if defined? Honeybadger
110
98
  LyberCore::Log.warn msg
111
99
  false
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LyberCore
4
+ # This encapsulates the workflow operations that lyber-core does
5
+ class Workflow
6
+ def initialize(workflow_service:, druid:, workflow_name:, process:)
7
+ @workflow_service = workflow_service
8
+ @druid = druid
9
+ @workflow_name = workflow_name
10
+ @process = process
11
+ end
12
+
13
+ def start(note)
14
+ workflow_service.update_status(druid: druid,
15
+ workflow: workflow_name,
16
+ process: process,
17
+ status: 'started',
18
+ elapsed: 1.0,
19
+ note: note)
20
+ end
21
+
22
+ def complete(status, elapsed, note)
23
+ workflow_service.update_status(druid: druid,
24
+ workflow: workflow_name,
25
+ process: process,
26
+ status: status,
27
+ elapsed: elapsed,
28
+ note: note)
29
+ end
30
+
31
+ def error(error_msg, error_text)
32
+ workflow_service.update_error_status(druid: druid,
33
+ workflow: workflow_name,
34
+ process: process,
35
+ error_msg: error_msg,
36
+ error_text: error_text)
37
+ end
38
+
39
+ private
40
+
41
+ attr_reader :workflow_service, :druid, :workflow_name, :process
42
+ end
43
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lyber-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.5.1
4
+ version: 6.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alpana Pande
@@ -16,56 +16,8 @@ authors:
16
16
  autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
- date: 2020-02-04 00:00:00.000000000 Z
19
+ date: 2020-02-06 00:00:00.000000000 Z
20
20
  dependencies:
21
- - !ruby/object:Gem::Dependency
22
- name: activesupport
23
- requirement: !ruby/object:Gem::Requirement
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- version: '0'
28
- type: :runtime
29
- prerelease: false
30
- version_requirements: !ruby/object:Gem::Requirement
31
- requirements:
32
- - - ">="
33
- - !ruby/object:Gem::Version
34
- version: '0'
35
- - !ruby/object:Gem::Dependency
36
- name: dor-services
37
- requirement: !ruby/object:Gem::Requirement
38
- requirements:
39
- - - ">="
40
- - !ruby/object:Gem::Version
41
- version: 7.0.0
42
- - - "<"
43
- - !ruby/object:Gem::Version
44
- version: '9'
45
- type: :runtime
46
- prerelease: false
47
- version_requirements: !ruby/object:Gem::Requirement
48
- requirements:
49
- - - ">="
50
- - !ruby/object:Gem::Version
51
- version: 7.0.0
52
- - - "<"
53
- - !ruby/object:Gem::Version
54
- version: '9'
55
- - !ruby/object:Gem::Dependency
56
- name: dor-workflow-client
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '3.11'
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '3.11'
69
21
  - !ruby/object:Gem::Dependency
70
22
  name: coveralls
71
23
  requirement: !ruby/object:Gem::Requirement
@@ -180,6 +132,7 @@ files:
180
132
  - lib/lyber_core/log.rb
181
133
  - lib/lyber_core/return_state.rb
182
134
  - lib/lyber_core/robot.rb
135
+ - lib/lyber_core/workflow.rb
183
136
  - lib/tasks/rdoc.rake
184
137
  homepage: http://github.com/sul-dlss/lyber-core
185
138
  licenses:
@@ -200,7 +153,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
200
153
  - !ruby/object:Gem::Version
201
154
  version: 1.3.6
202
155
  requirements: []
203
- rubygems_version: 3.1.2
156
+ rubygems_version: 3.0.3
204
157
  signing_key:
205
158
  specification_version: 4
206
159
  summary: Core services used by the SUL Digital Library