Sha256: 24e9159ad6940f5629cbe5ed2d3e8eb6ef084d63cbb797a621593cdbdd2991f6

Contents?: true

Size: 1.4 KB

Versions: 2

Compression:

Stored size: 1.4 KB

Contents

require_relative 'hashish'
require 'yaml'
require 'erb'

module FixtureOverlord
  FormattingError = Class.new(StandardError)

  def self.read_fixture(yaml_file, key)
    ReadFixture.new(yaml_file).read(key)
  end

  class ReadFixture
    def initialize(file)
      @file = file
    end

    def read(key = nil)
      hash = read_file
      hash = hash[key.to_s] unless key.nil?
      Hashish[hash].symbolize_keys
    end

    private

    # CREDIT: The next three methods are almost identitical to those within Rails' 
    #         ActiveRecord FixtureSet::File
    #
    # https://github.com/rails/rails/blob/master/activerecord/lib/active_record/fixture_set/file.rb
    #
    def read_file
      begin
        data = ::YAML.load(render)
      rescue ::ArgumentError, ::Psych::SyntaxError => error
        raise FormattingError, "a YAML error ocurred parsing #{@file}.\nThe error was:\n #{error.class}: #{error}", error.backtrace
      end
      validate(data)
    end

    def validate(data)
      unless valid_data?(data)
        raise FormattingError, "fixture is not a Hash or YAML::Omap."
      end

      raise FormattingError unless data.all? { |name, row| ::Hash === row }
      data
    end

    def render
      erb_render(
        IO.read(@file)
      )
    end

    def erb_render(content)
      ::ERB.new(content).result
    end

    def valid_data?(data)
      ::Hash === data || ::YAML::Omap === data
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
fixture_overlord-0.1.9 lib/fixture_overlord/read_fixture.rb
fixture_overlord-0.1.8 lib/fixture_overlord/read_fixture.rb