Sha256: 4c6fe2096376c58e1b58f19966c374dc8dfeb583d49e83fb787d37fe196243f8

Contents?: true

Size: 1.55 KB

Versions: 1

Compression:

Stored size: 1.55 KB

Contents

# frozen_string_literal: true

module Executo
  class Command
    include CommandDsl
    include TaggedLogger

    attr_reader :executo_id, :parameter_values, :status, :stdout, :stderr, :exitstatus

    def initialize(*args)
      @executo_id = args.first&.delete(:id) || SecureRandom.uuid
      @errors = ActiveModel::Errors.new(self)
      @parameter_values = args.first&.delete(:parameter_values) || {}
      super(*args)
    end

    def call
      raise 'missing target' unless target

      perform
    end

    def process_results(results)
      state = results[:state]
      logger.debug("Processing #{state} results")
      public_send(state.to_sym, results) if respond_to?(state.to_sym)
    end

    def setup_logger(id)
      logger_add_tag(self.class.name)
      logger_add_tag(id)
    end

    private

    def perform
      Executo.publish(target: target, command: command, parameters: safe_parameters, feedback: { service: self.class.name, id: executo_id, arguments: attributes.to_h })
    end

    def safe_parameters
      local_parameter_values = {}
      local_parameter_values = implicit_parameter_values if respond_to?(:implicit_parameter_values)
      local_parameter_values = local_parameter_values.merge(parameter_values)

      parameters.split.map { |parameter| parameter % local_parameter_values }
    end

    class << self
      def process_feedback(feedback, results)
        cmd = new(feedback['arguments'].merge(id: feedback['id']))
        cmd.setup_logger(feedback['id'])
        cmd.process_results(results.symbolize_keys)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
executo-0.3.12 lib/executo/command.rb