Class: Canon::Formatters::YamlFormatter

Inherits:
Object
  • Object
show all
Defined in:
lib/canon/formatters/yaml_formatter.rb

Overview

YAML formatter for canonicalization

Class Method Summary collapse

Class Method Details

.format(yaml) ⇒ Object



9
10
11
12
# File 'lib/canon/formatters/yaml_formatter.rb', line 9

def self.format(yaml)
  parsed = parse(yaml)
  Canon::YamlParsing.dump(sort_yaml_keys(parsed))
end

.parse(yaml) ⇒ Object



14
15
16
17
18
19
20
21
# File 'lib/canon/formatters/yaml_formatter.rb', line 14

def self.parse(yaml)
  # Validate before parsing
  Canon::Validators::YamlValidator.validate!(yaml)
  # Return as-is if already parsed
  return yaml if yaml.is_a?(Hash) || yaml.is_a?(Array)

  Canon::YamlParsing.safe_load(yaml, aliases: true)
end

.sort_yaml_keys(obj) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/canon/formatters/yaml_formatter.rb', line 23

def self.sort_yaml_keys(obj)
  case obj
  when Hash
    # Single pass: sorted keys once, one rebuilt hash (the
    # transform_values + sort.to_h form rebuilt every container
    # twice).
    sorted = {}
    obj.keys.sort.each { |key| sorted[key] = sort_yaml_keys(obj[key]) }
    sorted
  when Array
    obj.map { |item| sort_yaml_keys(item) }
  else
    obj
  end
end