tmfnll/bonito

View on GitHub
lib/bonito/runner.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

require 'timecop'
module Bonito # :nodoc:
  class Runner # :nodoc:
    def initialize(enumerable, opts = {})
      @enumerable = enumerable
      @opts = opts
    end

    def live?
      @opts.fetch(:live) { false }
    end

    def daemonise?
      @opts.fetch(:daemonise) { false }
    end

    def call
      Process.daemon if daemonise?
      @enumerable.each do |moment|
        maybe_sleep moment
        moment.evaluate
      end
    end

    private

    def maybe_sleep(moment)
      return unless live? && (nap_time = moment.offset - Time.now).positive?

      sleep nap_time
    end
  end

  def self.run(
    serial, starting:, scope: Scope.new,
    progress_factory: ProgressLogger.factory, **opts
  )
    scheduler = serial.scheduler(starting, scope, opts)
    progress = progress_factory.call total: scheduler.count
    scheduler = ProgressDecorator.new scheduler, progress
    Runner.new(scheduler, opts).call
  end
end