Sha256: f47f91dc36121752aa392e36250f233de6a9ba8edc6966a73764c9483995bbad

Contents?: true

Size: 1.83 KB

Versions: 2

Compression:

Stored size: 1.83 KB

Contents

require 'pdk'

module PDK
  class Config
    # Parses a YAML document with a JSON schema.
    #
    # @see PDK::Config::Namespace.parse_file
    class YAMLWithSchema < JSONSchemaNamespace
      def parse_file(filename)
        raise unless block_given?
        data = load_data(filename)
        data = '' if data.nil?
        require 'yaml'
        require 'json-schema'

        @raw_data = ::YAML.safe_load(data, [Symbol], [], true)
        @raw_data = {} if @raw_data.nil?

        begin
          # Ensure the parsed document is actually valid
          validate_document!(@raw_data)
        rescue ::JSON::Schema::ValidationError => e
          raise PDK::Config::LoadError, 'The configuration file %{filename} is not valid: %{message}' % {
            filename: filename,
            message:  e.message,
          }
        end

        require 'pdk/config/json_schema_setting'

        schema_property_names.each do |key|
          yield key, PDK::Config::JSONSchemaSetting.new(key, self, @raw_data[key])
        end

        # Remove all of the "known" settings from the schema and
        # we're left with the settings that we don't manage.
        self.unmanaged_settings = @raw_data.reject { |k, _| schema_property_names.include?(k) }
      rescue Psych::SyntaxError => e
        raise PDK::Config::LoadError, 'Syntax error when loading %{file}: %{error}' % {
          file:  filename,
          error: "#{e.problem} #{e.context}",
        }
      rescue Psych::DisallowedClass => e
        raise PDK::Config::LoadError, 'Unsupported class in %{file}: %{error}' % {
          file:  filename,
          error: e.message,
        }
      end

      # Serializes object data into a YAML string.
      #
      # @see PDK::Config::Namespace.serialize_data
      def serialize_data(data)
        require 'yaml'
        ::YAML.dump(data)
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
pdk-2.7.1 lib/pdk/config/yaml_with_schema.rb
pdk-2.7.0 lib/pdk/config/yaml_with_schema.rb