Sha256: 3f3c67e115d14284f8a4f81c31b2536e8dfb838955a0b8b1de07f9fa44df8206

Contents?: true

Size: 1.96 KB

Versions: 4

Compression:

Stored size: 1.96 KB

Contents

module Tickwork
  class Event
    class IllegalJobName < RuntimeError; end

    attr_accessor :job, :data_store_key

    def initialize(manager, period, job, block, options={})
      validate_if_option(options[:if])
      @manager = manager
      @period = period
      raise IllegalJobName unless job.is_a?(String) && !job.empty? && Tickwork::Manager::MANAGER_KEY != job
      @job = job
      @at = At.parse(options[:at])
      @block = block
      @if = options[:if]
      @thread = options.fetch(:thread, @manager.config[:thread])
      @timezone = options.fetch(:tz, @manager.config[:tz])
      namespace = options[:namespace] 
      namespace ||= '_tickwork_'
      @data_store_key = namespace + @job
    end

    def last
      @manager.data_store.read(data_store_key)
    end

    def last=(value)
      @manager.data_store.write(data_store_key, value)
    end

    def convert_timezone(t)
      @timezone ? t.in_time_zone(@timezone) : t
    end

    def run_now?(t)
      t = convert_timezone(t)
      elapsed_ready(t) and (@at.nil? or @at.ready?(t)) and (@if.nil? or @if.call(t))
    end

    def elapsed_ready(t)
      last.nil? || (t - last.to_i).to_i >= @period
    end

    def thread?
      @thread
    end

    def run(t)
      @manager.log "Triggering '#{self}'"
      self.last = convert_timezone(t)
      if thread?
        if @manager.thread_available?
          t = Thread.new do
            execute
          end
          t['creator'] = @manager
        else
          @manager.log_error "Threads exhausted; skipping #{self}"
        end
      else
        execute
      end
    end

    def to_s
      job
    end

    private
    def execute
      @block.call(@job, last)
    rescue => e
      @manager.log_error e
      @manager.handle_error e
    end

    def validate_if_option(if_option)
      if if_option && !if_option.respond_to?(:call)
        raise ArgumentError.new(':if expects a callable object, but #{if_option} does not respond to call')
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
tickwork-0.9.2 lib/tickwork/event.rb
tickwork-0.9.1 lib/tickwork/event.rb
tickwork-0.9.0 lib/tickwork/event.rb
tickwork-0.1.0 lib/tickwork/event.rb