class Burner::JobSet

This class understands how jobs fit together as a cohesive unit. It does not know how to use them, but it knows how to group them together in a logical manner following some simple rules, such as:

- Jobs in a set should have unique names (unless the name is blank)
- Subsets of jobs can be extracted, by name, in constant time.

Public Class Methods

new(jobs = []) click to toggle source
# File lib/burner/job_set.rb, line 22
def initialize(jobs = [])
  @jobs = Jobs.array(jobs).freeze

  assert_unique_job_names
end

Public Instance Methods

jobs(names = nil) click to toggle source
# File lib/burner/job_set.rb, line 28
def jobs(names = nil)
  return @jobs unless names

  Array(names).map do |name|
    job = named_jobs_by_name[name.to_s]

    raise JobNotFoundError, "#{name} was not declared as a job" unless job

    job
  end
end

Private Instance Methods

assert_unique_job_names() click to toggle source
# File lib/burner/job_set.rb, line 50
def assert_unique_job_names
  unique_job_names = Set.new

  named_jobs.each do |job|
    if unique_job_names.include?(job.name)
      raise DuplicateJobNameError, "job with name: #{job.name} already declared"
    end

    unique_job_names << job.name
  end

  nil
end
named_jobs() click to toggle source
# File lib/burner/job_set.rb, line 46
def named_jobs
  @named_jobs ||= @jobs.reject { |job| job.name == '' }
end
named_jobs_by_name() click to toggle source
# File lib/burner/job_set.rb, line 42
def named_jobs_by_name
  @named_jobs_by_name ||= named_jobs.each_with_object({}) { |job, memo| memo[job.name] = job }
end