Sha256: 5dac2f38347354a82b1cd62c0ccb27522b3c8058ff5f832c37f5b9ef79a58e6a

Contents?: true

Size: 1.68 KB

Versions: 5

Compression:

Stored size: 1.68 KB

Contents

# frozen_string_literal: true

require 'yaml'

module Leftovers
  module Precompilers
    module YAML
      class Builder < ::Psych::TreeBuilder
        def initialize
          @constants = []

          super
        end

        def add_constant_for_tag(tag, value = nil)
          match = %r{\A!ruby/[^:]*(?::(.*))?\z}.match(tag)
          return unless match

          @constants << (match[1] || value)
        end

        def start_mapping(_anchor, tag, *rest) # leftovers:keep
          add_constant_for_tag(tag)
          tag = nil

          super
        end

        def start_sequence(_anchor, tag, *rest) # leftovers:keep
          add_constant_for_tag(tag)
          tag = nil

          super
        end

        def scalar(value, _anchor, tag, *rest) # leftovers:keep
          add_constant_for_tag(tag, value)
          tag = nil

          super
        end

        def to_ruby_file
          <<~FILE
            __leftovers_document(#{to_ruby_argument(root.to_ruby.first)})
            #{@constants.join("\n")}
          FILE
        end

        private

        def to_ruby_argument(value)
          ruby = value.inspect
          return ruby unless value.is_a?(Array)

          ruby.delete_prefix!('[')
          ruby.delete_suffix!(']')

          ruby
        end
      end

      def self.precompile(yaml)
        builder = ::Leftovers::Precompilers::YAML::Builder.new
        parser = ::Psych::Parser.new(builder)
        parser.parse(yaml)

        builder.to_ruby_file
      rescue ::Psych::SyntaxError => e
        message = [e.problem, e.context].compact.join(' ')
        raise ::Leftovers::PrecompileError.new(message, line: e.line, column: e.column)
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
leftovers-0.11.1 lib/leftovers/precompilers/yaml.rb
leftovers-0.11.0 lib/leftovers/precompilers/yaml.rb
leftovers-0.10.0 lib/leftovers/precompilers/yaml.rb
leftovers-0.9.0 lib/leftovers/precompilers/yaml.rb
leftovers-0.8.0 lib/leftovers/precompilers/yaml.rb