Sha256: f1c4ebad0506e11b55dd2f3986c77c09c0f93e55778539458336e938f257ea75

Contents?: true

Size: 1.86 KB

Versions: 5

Compression:

Stored size: 1.86 KB

Contents

# encoding: utf-8

class AsyncProcess
  include SuckerPunch::Job
  attr_reader :handler
end

class ExampleProcess < AsyncProcess

  attr_reader :log, :error, :interrupted, :name, :id
  
  def self.name
    "THE NAME"
  end

  def perform(handler, other_params)
    @handler = handler
    @handler.total = params[:ids].count
    # loop
    # if error @handler.log("error no falta", e.message)
    # @handler.increase
    #
  end
end

class ProcessHandler

  attr_reader :log, :error, :interrupted, :name, :id, :performed, :total, :clazz
  attr_accessor :total

  def initialize(id, name, clazz)
    @id = id
    @total = 0
    @performed = 0
    @log = []
    @error = ""
    @interrupted = false
    @name = name
    @clazz = clazz
  end

  def progress
    return 0 if @total == 0
    (@performed.to_f / @total.to_f)*100.0
  end

  def increase
    @performed += 1
  end

  def log(severity, message)
    @log << "[#{severity}] #{Time.now} #{message}"
  end

  def interrupt
    @interrupted = true
  end

  def running?
    @total != @performed
  end
end

class ProcessManager
  include Singleton

  attr_reader :handlers

  def initialize
    @handlers = []
  end

  def find(clazz)
    @handlers.find { |handler| handler.clazz == clazz }
  end

  def run(*args)
    clean(args.first.to_s)
    if !running?(args.first.to_s)
      handler = ProcessHandler.new(rand(1..100000000), args.first.name, args.first.to_s)
      clazz = args.first
      args[0] = handler
      clazz.perform_async(*args)
      @handlers << handler
      handler
    else
      find(args.first.to_s)
    end
  end

  def finish(handler)
    @handlers -= [handler]
  end

  def clean(clazz)
    @handlers.select { |handler| handler.clazz == clazz }.each do |handler|
      handler.interrupt
      self.finish(handler)
    end
  end

  def running?(clazz)
    !@handlers.select { |handler| handler.clazz == clazz }.empty?
  end

end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
sinatra-hexacta-0.8.6 lib/sinatra/extensions/processmanager.rb
sinatra-hexacta-0.8.5 lib/sinatra/extensions/processmanager.rb
sinatra-hexacta-0.8.4 lib/sinatra/extensions/processmanager.rb
sinatra-hexacta-0.8.3 lib/sinatra/extensions/processmanager.rb
sinatra-hexacta-0.8.1 lib/sinatra/extensions/processmanager.rb