Class: PDK::Config::YAMLWithSchema

Inherits:
JSONSchemaNamespace show all
Defined in:
lib/pdk/config/yaml_with_schema.rb

Overview

Parses a YAML document with a JSON schema.

See Also:

  • Namespace.parse_file

Instance Attribute Summary

Attributes inherited from Namespace

#file, #name, #parent

Instance Method Summary collapse

Methods inherited from JSONSchemaNamespace

#empty_schema?, #initialize, #schema, #schema_property_names, #to_h, #validate_document!

Methods inherited from Namespace

#[], #[]=, #child_namespace?, #fetch, #include_in_parent?, #initialize, #mount, #namespace, #read_only!, #resolve, #setting, #to_h

Constructor Details

This class inherits a constructor from PDK::Config::JSONSchemaNamespace

Instance Method Details

#parse_file(filename) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/pdk/config/yaml_with_schema.rb', line 9

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, format('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, format('Syntax error when loading %{file}: %{error}', file: filename, error: "#{e.problem} #{e.context}")
rescue Psych::DisallowedClass => e
  raise PDK::Config::LoadError, format('Unsupported class in %{file}: %{error}', file: filename, error: e.message)
end

#serialize_data(data) ⇒ Object

Serializes object data into a YAML string.

See Also:

  • Namespace.serialize_data


45
46
47
48
# File 'lib/pdk/config/yaml_with_schema.rb', line 45

def serialize_data(data)
  require 'yaml'
  ::YAML.dump(data)
end