class Abid::Session

Attributes

error[R]

Public Class Methods

new(task) click to toggle source
# File lib/abid/session.rb, line 10
def initialize(task)
  @task = task
  @state = task.state

  @entered = false
  @locked = false
  @result = nil
  @error = nil
  @ivar = Concurrent::IVar.new

  @on_success = []
  @on_fail = []
end

Public Instance Methods

add_observer(*args, &block) click to toggle source
# File lib/abid/session.rb, line 43
def add_observer(*args, &block)
  @ivar.add_observer(*args, &block)
end
cancel(error) click to toggle source
# File lib/abid/session.rb, line 85
def cancel(error)
  unlock(error)
  @result = :canceled
  @error = error
  @ivar.fail(error) rescue Concurrent::MultipleAssignmentError
end
capture_exception(&block) click to toggle source
# File lib/abid/session.rb, line 37
def capture_exception(&block)
  block.call
rescue Exception => e
  self.fail(e)
end
enter(&block) click to toggle source
# File lib/abid/session.rb, line 28
def enter(&block)
  synchronize do
    return @ivar if @entered
    @entered = true
  end
  block.call
  @ivar
end
fail(error) click to toggle source
# File lib/abid/session.rb, line 76
def fail(error)
  @result = :failed
  @error = error
  unlock(error)
  @ivar.fail(error) rescue Concurrent::MultipleAssignmentError
rescue Exception => e
  @ivar.fail(e) rescue Concurrent::MultipleAssignmentError
end
lock() click to toggle source
# File lib/abid/session.rb, line 47
def lock
  synchronize do
    @state.start unless @locked
    @locked = true
    true
  end
rescue AbidErrorTaskAlreadyRunning
  false
end
skip() click to toggle source
# File lib/abid/session.rb, line 70
def skip
  unlock
  @result = :skipped
  @ivar.try_set(false)
end
success() click to toggle source
# File lib/abid/session.rb, line 64
def success
  unlock
  @result = :successed
  @ivar.try_set(true)
end
synchronize(&block) click to toggle source
# File lib/abid/session.rb, line 24
def synchronize(&block)
  self.class.synchronize(&block)
end
unlock(error = nil) click to toggle source
# File lib/abid/session.rb, line 57
def unlock(error = nil)
  synchronize do
    @state.finish(error) if @locked
    @locked = false
  end
end