Sha256: ba5be069ef8b3aa21eef098764aa857f9032149945222039b58d869d1209743c

Contents?: true

Size: 1.24 KB

Versions: 1

Compression:

Stored size: 1.24 KB

Contents

# frozen_string_literal: true

require "assume/version"

module Assume
  class BadAssumption < StandardError; end

  DEFAULT_HANDLER = lambda do |result, block|
    filename, line = block.source_location
    begin
      lines = File.readlines(filename)
      line_content = lines[line - 1]
    rescue Errno::ENOENT => err
      line_content = "<unable to open source code file>"
    end

    raise BadAssumption, "\nin #{filename}\nsource" \
                         "code (line #{line}):\n#{line_content}\n" \
                         "result was: #{result.inspect}"
  end

  def assume(&block)
    raise ArgumentError, "assumptions need a block" if block.nil?
    return unless Assume.enabled?

    result = block.call

    unless result
      Assume.broken_assumption_handler.call(result, block)
    end

    nil
  end
  alias assumption assume

  class << self
    def handler=(handler)
      unless handler.respond_to?(:call)
        raise ArgumentError, "Assume::handler must respond to #call"
      end

      @assumption_handler = handler
    end

    def enabled=(val)
      @enabled = !!val
    end

    def enabled?
      @enabled
    end

    def broken_assumption_handler
      @assumption_handler || DEFAULT_HANDLER
    end
  end
end

Assume.enabled = false

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
assume-0.1.1 lib/assume.rb