Module: ExecutionDeadline::Deadliner

Defined in:
lib/execution_deadline/deadliner.rb

Constant Summary collapse

WRAPPED_METHOD =
Proc.new do |options|
  Proc.new do |*args, **kwargs, &blk|
    set_deadline = options[:in]  && ExecutionDeadline.set_deadline(
      expires_at: Time.now + options[:in],
      raises: options[:raises]
    )

    current_deadline = ExecutionDeadline.current_deadline
    current_deadline&.require_seconds_left!(options[:runs_for]) if options[:runs_for]

    result = if !options[:interruptible]
      super(*args, **kwargs, &blk)
    else
      Timeout.timeout(current_deadline&.time_left) do
        super(*args, **kwargs, &blk)
      rescue => Timeout::Error
      end
    end

    current_deadline&.check_deadline_expiration!

    result
  ensure
    ExecutionDeadline.clear_deadline! if set_deadline
  end
end

Instance Method Summary collapse

Instance Method Details

#_execution_deadline_built_forObject



36
37
38
# File 'lib/execution_deadline/deadliner.rb', line 36

def _execution_deadline_built_for
  @_execution_deadline_built_for
end

#_execution_deadline_built_for=(val) ⇒ Object



40
41
42
# File 'lib/execution_deadline/deadliner.rb', line 40

def _execution_deadline_built_for=(val)
  @_execution_deadline_built_for = val
end

#inspectObject



32
33
34
# File 'lib/execution_deadline/deadliner.rb', line 32

def inspect
  "ExecutionDeadline::#{@_execution_deadline_built_for}Proxy"
end

#wrap_implementation(method_name, config) ⇒ Object



44
45
46
# File 'lib/execution_deadline/deadliner.rb', line 44

def wrap_implementation(method_name, config)
  define_method(method_name, &WRAPPED_METHOD.call(config))
end