Sha256: 665cd21f0e95af9e06c1fdc3ec8b6643071aff652912157570d4056444914e48

Contents?: true

Size: 1.78 KB

Versions: 8

Compression:

Stored size: 1.78 KB

Contents

class TaskManager
 
  def initialize(output)
    @output = output
    @tasks = []
    @fail_index = -1
  end
  
  def add(task)
    @tasks << task
  end
  
  def run(files)
    @num_tasks_run = 0
    
    @tasks.each_index do |index|
      task = @tasks[index]

      # Don't run if this task is after the last failed task
      if task.is_configured?(files) && @fail_index >= 0 && @fail_index < index
        @output.add_result(@fail_result)
        break
      end
      
      result = nil
      begin
        result = run_task(files, task)        
      rescue Exception => ex
        result = build_exception_result ex
        @output.add_result result
      end

      next if result.nil?

      if [:error, :failure].include? result[:state]
        # Remember this task as the one that failed
        # And end this current run of tasks
        @fail_index = index
        @fail_result = result
        
        @fail_result[:state] = :error
        @fail_result[:title] = 'Fix ' + @fail_result[:title] + ' to run other tasks'
        break
      elsif result[:state] == :success
        # reset fail index
        @fail_index = -1 if index == @fail_index
      end
      
    end
    
    @num_tasks_run    
  end
  
  def run_task(files, task)
    result = task.run(files)
    return result if result.nil?

    task_run
    
    @output.add_result(result) 
    return result
  end
  
  def task_run
    @num_tasks_run += 1
    if (@num_tasks_run == 1) 
      @output.start_run
    end  
  end
  
  def build_exception_result(ex)
    return {
      :state => :error,
      :title => 'Task',
      :summary => 'Exception',
      :first => ex.message,
      :detail => ex.message + "\n" + ex.backtrace.join("\n")
    }
  end
  
  def output_exception(ex)
    @output.add_result build_exception_result ex
  end
  
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
loris-0.5.2 lib/task_manager.rb
loris-0.5.1 lib/task_manager.rb
loris-0.5.0 lib/task_manager.rb
loris-0.4.1 lib/task_manager.rb
loris-0.4.0 lib/task_manager.rb
loris-0.3.2 lib/task_manager.rb
loris-0.3.1 lib/task_manager.rb
loris-0.3.0 lib/task_manager.rb