Project

lyber-core

0.0
A long-lived project that still receives updates
Contains classes to make http connections with a client-cert, use Jhove, and call Suri Also contains core classes to build robots
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Project Readme

CircleCI Test Coverage Maintainability Gem Version

lyber_core

Robot Creation

Create a class that subclasses LyberCore::Robot

  • In the initializer, call super with the workflow name, step name
  • Your class #perform_work method will perform the actual work; druid is available as an instance variable.
module Robots
  module DorRepo
    module Accession

      class Shelve < LyberCore::Robot

        def initialize
          super('accessionWF', 'shelve')
        end

        def perform_work
          cocina_object.shelve
        end
      end
    end
  end
end

By default, the druid will be set to the completed state, but you can optionally have it set to skipped by creating a ReturnState object as shown below. You can also return custom notes in this way

module Robots
  module DorRepo
    module Accession

      class Shelve < LyberCore::Robot

        def initialize
          super('accessionWF', 'shelve')
        end

        def perform
          if some_logic_here_to_determine_if_shelving_occurs
            cocina_object.shelve
            return LyberCore::ReturnState.new(status: 'completed') # set the final state to completed
#           return LyberCore::ReturnState.new(status: 'completed', note: 'some custom note to pass back to workflow') # set the final state to completed with a custom note

          else
            # just return skipped if we did nothing
            return LyberCore::ReturnState.new(status: 'skipped') # set the final state to skipped
#           return LyberCore::ReturnState.new(status: 'skipped', note: 'some custom note to pass back to workflow') # set the final state to skipped with a custom note
          end
        end
      end
    end
  end
end

By default, a robot will not retry. To enable retries for specific errors:

module Robots
  module DorRepo
    module Accession

      class Shelve < LyberCore::Robot
        def initialize
          super('accessionWF', 'shelve', retriable_exceptions: [Dor::Services::Client::Error])
        end

        def perform_work
          cocina_object.shelve
        end
      end
    end
  end
end

Robot Environment Setup

Create a config/boot.rb containing:

require 'rubygems'
require 'bundler/setup'
Bundler.require(:default)

LyberCore::Boot.up(__dir__)

# Any additional robot-specific configuratio.

The configuration must include:

redis_url: ~

workflow:
  url: http://workflow.example.com/workflow
  logfile: 'log/workflow_service.log'
  shift_age: 'weekly'
  timeout: 60

And optionally:

# For Dor Services Client
dor_services:
  url:  'https://dor-services-test.stanford.test'
  token: secret-token

# For Cocina::Models::Mapping::Purl
purl_url: 'https://purl-example.stanford.edu'

# For DruidTools::Druid
stacks:
  local_workspace_root: ~

The following environment variables can optionally be set:

  • ROBOT_ENVIRONMENT
  • ROBOT_LOG_LEVEL

Robot Testing

Include the following in rspec/spec_helper.rb:

ENV['ROBOT_ENVIRONMENT'] = 'test'
require File.expand_path("#{__dir__}/../config/boot")

include LyberCore::Rspec

Robots can be invoked with:

test_perform(robot, druid)

to avoid the workflow updates in perform().