Sha256: 16b4ed31b4285d7e4fe3ca0eec339612ecdbd534d512adc33af13fba681b3636

Contents?: true

Size: 1.09 KB

Versions: 4

Compression:

Stored size: 1.09 KB

Contents

module Contractinator
  module Contract
    extend self

    @created = {}
    @fulfilled = {}

    def require(argument)
      @created[argument] = caller.find do |str|
        str =~ /_spec\.rb/
      end
    end

    def fulfill(argument)
      @fulfilled[argument] = caller.find do |str|
        str =~ /_spec\.rb/
      end
    end

    def created_set
      Set.new(@created.keys)
    end

    def fulfilled_set
      Set.new(@fulfilled.keys)
    end

    def unmatched_created
      unmatched_keys.intersection(created_set)
    end

    def unmatched_fulfilled
      unmatched_keys.intersection(fulfilled_set)
    end

    def unmatched_keys
      created_set ^ fulfilled_set
    end

    def validate
      unmatched_keys.empty?
    end

    def messages
      messages = []
      unmatched_created.map do |item|
        messages << "unfulfilled contract '#{item}'"
        messages << "   at #{@created[item]}"
      end

      unmatched_fulfilled.map do |item|
        messages << "excess fulfillment '#{item}'"
        messages << "   at #{@fulfilled[item]}"
      end
      messages
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
contractinator-0.1.4 lib/contractinator/contract.rb
contractinator-0.1.3 lib/contractinator/contract.rb
contractinator-0.1.1 lib/contractinator/contract.rb
contractinator-0.1.0 lib/contractinator/contract.rb