class OtbJobQueue::JobsSequencer

Sequences jobs order based on their dependencies

Public Class Methods

new(parser) click to toggle source

Creates a new instance of the JobsSequencer with a parser as a param @param parser

# File lib/otb_job_queue/jobs_sequencer.rb, line 11
def initialize(parser)
  @parser = parser
end

Public Instance Methods

call(jobs_input) click to toggle source

Parses an input of jobs into a string or raises Errors @api public @return [String] correct sequence of jobs @example

sequencer = OtbJobQueue::JobsSequencer.new(OtbJobQueue::JobsParser)
sequencer.call("a => ") #=> "a"
sequencer.call("a => b\nb => c\nc => ") #=> 'cba'
# File lib/otb_job_queue/jobs_sequencer.rb, line 22
def call(jobs_input)
  jobs_to_sequence = @parser.call(jobs_input)
  check_self_dependecies(jobs_to_sequence)
  jobs_to_sequence.tsort.join
rescue TSort::Cyclic => error
  raise CircularDependencyError, "Jobs can't have circular dependencies: #{error.message}"
end

Private Instance Methods

check_self_dependecies(jobs_to_sequence) click to toggle source

Verifies if the jobs_to_sequence has self dependencies @api private @param [Hash] jobs to sequence hash @return [SelfDependencyError, void]

# File lib/otb_job_queue/jobs_sequencer.rb, line 36
def check_self_dependecies(jobs_to_sequence)
  jobs_to_sequence.each do |job, dependency|
    if job == dependency.first
      raise SelfDependencyError, "Jobs can't depend on themselves: #{job} => #{dependency.first}"
    end
  end
end