Sha256: 2ebde3b86d55914bb13cff8b02b168f0fc982135e9e5892f10c083329f1ea2fa

Contents?: true

Size: 1.63 KB

Versions: 3

Compression:

Stored size: 1.63 KB

Contents

require 'json'

module Prospectus
  ##
  # Define item objects that defined expected vs actual state
  class Item
    attr_reader :list

    def initialize(params = {})
      @options = params
      @list = List.new(params)
      @dir = Dir.pwd
    end

    def name
      return @name if @name
      @name = File.basename @dir
      @name << "::#{File.basename @options[:file]}" if @options[:suffix_file]
      @name
    end

    def prefix(value)
      raise('Name not set for sub-item') unless @name
      @name = value + '::' + @name
    end

    def noop
      @expected = 'noop'
      @actual = 'noop'
    end

    def expected
      @expected || raise("No expected state was loaded for #{name}")
    end

    def actual
      @actual || raise("No actual state was loaded for #{name}")
    end

    def to_json(_ = {})
      { name: name, expected: expected, actual: actual }.to_json
    end
  end

  ##
  # DSL for wrapping eval of item files
  class ItemDSL
    def initialize(item, params)
      @item = item
      @options = params
    end

    def name(value)
      @item.instance_variable_set(:@name, value)
    end

    def noop
      @item.noop
    end

    def expected(&block)
      state(:@expected, &block)
    end

    def actual(&block)
      state(:@actual, &block)
    end

    def deps(&block)
      dsl = ListDSL.new(@item.list, @options)
      dsl.instance_eval(&block)
    end

    private

    def state(name, &block)
      state = Prospectus::State.from_block(@options, &block)
      @item.instance_variable_set(name, state.value)
    rescue => e
      raise("Failed to set #{name} state for #{@item.name}: #{e.message}")
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
prospectus-0.5.2 lib/prospectus/item.rb
prospectus-0.5.1 lib/prospectus/item.rb
prospectus-0.5.0 lib/prospectus/item.rb