lib/gush/job.rb in gush-0.0.1 vs lib/gush/job.rb in gush-0.1

- old
+ new

@@ -1,161 +1,107 @@ -require 'gush/metadata' - module Gush class Job - include Gush::Metadata - RECURSION_LIMIT = 1000 + attr_accessor :workflow_id, :incoming, :outgoing, + :finished_at, :failed_at, :started_at, :enqueued_at - DEFAULTS = { - finished: false, - enqueued: false, - failed: false, - running: false - } - - attr_accessor :finished, :enqueued, :failed, :workflow_id, :incoming, :outgoing, - :finished_at, :failed_at, :started_at, :jid, :running - attr_reader :name - attr_writer :logger - - def initialize(opts = {}) - options = DEFAULTS.dup.merge(opts) + def initialize(workflow, opts = {}) + @workflow = workflow + options = opts.dup assign_variables(options) end def as_json { name: @name, klass: self.class.to_s, - finished: @finished, - enqueued: @enqueued, - failed: @failed, + finished: finished?, + enqueued: enqueued?, + failed: failed?, incoming: @incoming, outgoing: @outgoing, - finished_at: @finished_at, - started_at: @started_at, - failed_at: @failed_at, - running: @running + finished_at: finished_at, + enqueued_at: enqueued_at, + started_at: started_at, + failed_at: failed_at, + running: running? } end def to_json(options = {}) - Yajl::Encoder.new.encode(as_json) + Gush::JSON.encode(as_json) end - def self.from_hash(hash) - hash[:klass].constantize.new( - name: hash[:name], - finished: hash[:finished], - enqueued: hash[:enqueued], - failed: hash[:failed], - incoming: hash[:incoming], - outgoing: hash[:outgoing], - failed_at: hash[:failed_at], - finished_at: hash[:finished_at], - started_at: hash[:started_at], - running: hash[:running] - ) + def self.from_hash(flow, hash) + hash[:klass].constantize.new(flow, hash) end - def before_work - end - def work end - def after_work - end - def start! - @enqueued = false - @running = true - @started_at = Time.now.to_i + @started_at = current_timestamp end def enqueue! - @enqueued = true - @running = false - @failed = false + @enqueued_at = current_timestamp @started_at = nil @finished_at = nil @failed_at = nil end def finish! - @running = false - @finished = true - @enqueued = false - @failed = false - @finished_at = Time.now.to_i + @finished_at = current_timestamp end def fail! - @finished = true - @running = false - @failed = true - @enqueued = false - @finished_at = Time.now.to_i - @failed_at = Time.now.to_i + @finished_at = current_timestamp + @failed_at = current_timestamp end def enqueued? - !!enqueued + !!enqueued_at end def finished? - !!finished + !!finished_at end def failed? - !!failed + !!failed_at end def succeeded? finished? && !failed? end def running? - !!running + !!started_at && !finished? end - def can_be_started?(flow) - !running? && - !enqueued? && - !finished? && - !failed? && - dependencies_satisfied?(flow) + def ready_to_start? + !running? && !enqueued? && !finished? && !failed? end - def dependencies(flow, level = 0) - fail DependencyLevelTooDeep if level > RECURSION_LIMIT - (incoming.map {|name| flow.find_job(name) } + incoming.flat_map{ |name| flow.find_job(name).dependencies(flow, level + 1) }).uniq + def has_no_dependencies? + incoming.empty? end - def logger - fail "You cannot log when the job is not running" unless running? - @logger - end - private + def current_timestamp + Time.now.to_i + end + def assign_variables(options) @name = options[:name] - @finished = options[:finished] - @enqueued = options[:enqueued] - @failed = options[:failed] @incoming = options[:incoming] || [] @outgoing = options[:outgoing] || [] @failed_at = options[:failed_at] @finished_at = options[:finished_at] @started_at = options[:started_at] - @running = options[:running] - end - - def dependencies_satisfied?(flow) - dependencies(flow).all? { |dep| !dep.enqueued? && dep.finished? && !dep.failed? } + @enqueued_at = options[:enqueued_at] end end end