Sha256: 35867e632e5514c1bf99b5fb24331f76dbcf96684fcd6e307417be056ad94d32

Contents?: true

Size: 1.19 KB

Versions: 50

Compression:

Stored size: 1.19 KB

Contents

# frozen_string_literal: true

require 'psych'

module Hako
  class YamlLoader
    def initialize
      @current_path = nil
    end

    # @param [String] path
    # @return [Hash]
    def load(path)
      class_loader = Psych::ClassLoader.new
      scanner = Psych::ScalarScanner.new(class_loader)
      prev_path = @current_path
      @current_path = path
      visitor = Visitor.new(scanner, class_loader) do |_, val|
        load(@current_path.parent.join(val))
      end
      path.open do |f|
        visitor.accept(Psych.parse(f))
      end
    ensure
      @current_path = prev_path
    end

    class Visitor < Psych::Visitors::ToRuby
      INCLUDE_TAG = 'tag:include'
      SHOVEL = '<<'

      def initialize(scanner, class_loader, &block)
        super(scanner, class_loader)
        @domain_types[INCLUDE_TAG] = [INCLUDE_TAG, block]
      end

      def revive_hash(hash, o)
        super(hash, o).tap do |r|
          if r[SHOVEL].is_a?(Hash)
            h2 = {}
            r.each do |k, v|
              if k == SHOVEL
                h2.merge!(v)
              else
                h2[k] = v
              end
            end
            r.replace(h2)
          end
        end
      end
    end
  end
end

Version data entries

50 entries across 50 versions & 1 rubygems

Version Path
hako-2.17.0 lib/hako/yaml_loader.rb
hako-2.16.0 lib/hako/yaml_loader.rb
hako-2.15.1 lib/hako/yaml_loader.rb
hako-2.15.0 lib/hako/yaml_loader.rb
hako-2.14.0 lib/hako/yaml_loader.rb
hako-2.13.0 lib/hako/yaml_loader.rb
hako-2.12.0 lib/hako/yaml_loader.rb
hako-2.11.1 lib/hako/yaml_loader.rb
hako-2.11.0 lib/hako/yaml_loader.rb
hako-2.10.0 lib/hako/yaml_loader.rb
hako-2.9.2 lib/hako/yaml_loader.rb
hako-2.9.1 lib/hako/yaml_loader.rb
hako-2.9.0 lib/hako/yaml_loader.rb
hako-2.8.0 lib/hako/yaml_loader.rb
hako-2.7.0 lib/hako/yaml_loader.rb
hako-2.6.2 lib/hako/yaml_loader.rb
hako-2.6.1 lib/hako/yaml_loader.rb
hako-2.6.0 lib/hako/yaml_loader.rb
hako-2.5.1 lib/hako/yaml_loader.rb
hako-2.5.0 lib/hako/yaml_loader.rb