Class: DataParser

Inherits:
Object
  • Object
show all
Defined in:
lib/puppet-check/data_parser.rb

Overview

executes diagnostics on data files

Class Method Summary collapse

Class Method Details

.hiera(data) ⇒ Object

checks hieradata



88
89
90
91
92
93
94
# File 'lib/puppet-check/data_parser.rb', line 88

def self.hiera(data)
  warnings = []
  data.each do |key, value|
    warnings.push("Values missing in key '#{key}'.") if value.class.to_s == 'NilClass'
  end
  warnings
end

.json(files) ⇒ Object

checks json (.json)



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/puppet-check/data_parser.rb', line 24

def self.json(files)
  require 'json'

  files.each do |file|
    # check json syntax
    begin
      parsed = JSON.parse(File.read(file))
    rescue JSON::ParserError => err
      PuppetCheck.error_files.push("-- #{file}:\n#{err.to_s.lines.first.strip}")
    else
      # check metadata.json
      if file =~ /.*metadata\.json$/
        # metadata-json-lint has issues and is essentially no longer maintained so here is an improved and leaner version of it
        require 'spdx-licenses'

        # check for errors
        errors = []

        # check for required keys
        %w(name version author license summary source dependencies).each do |key|
          errors.push("Required field '#{key}' not found in metadata.json.") unless parsed.key?(key)
        end

        # check for duplicate dependencies and requirements
        %w(requirements dependencies).each do |key|
          next unless parsed.key?(key)
          names = []
          parsed[key].each do |req_dep|
            name = req_dep['name']
            errors.push("Duplicate #{key} on #{name}.") if names.include?(name)
            names << name
          end
        end

        # check for deprecated fields
        %w(types checksum).each do |key|
          errors.push("Deprecated field '#{key}' found.") if parsed.key?(key)
        end

        # check for summary under 144 character
        errors.push('Summary exceeds 144 characters.') if parsed.key?('summary') && parsed['summary'].size > 144

        next PuppetCheck.error_files.push("-- #{file}:\n#{errors.join("\n")}") unless errors.empty?

        # check for warnings
        warnings = []

        # check for spdx license (rubygems/util/licenses for rubygems >= 2.5 in the far future)
        if parsed.key?('license') && !SpdxLicenses.exist?(parsed['license']) && parsed['license'] !~ /[pP]roprietary/
          warnings.push("License identifier '#{parsed['license']}' is not in the SPDX list: http://spdx.org/licenses/")
        end

        next PuppetCheck.warning_files.push("-- #{file}:\n#{warnings.join("\n")}") unless warnings.empty?
      else
        # check for questionable hieradata
        warnings = hiera(parsed)
        next PuppetCheck.warning_files.push("-- #{file}:\n#{warnings.join("\n")}") unless warnings.empty?
      end
      PuppetCheck.clean_files.push("-- #{file}")
    end
  end
end

.yaml(files) ⇒ Object

checks yaml (.yaml/.yml)



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/puppet-check/data_parser.rb', line 6

def self.yaml(files)
  require 'yaml'

  files.each do |file|
    # check yaml syntax
    begin
      parsed = YAML.load_file(file)
    rescue Psych::SyntaxError, StandardError => err
      PuppetCheck.error_files.push("-- #{file}:\n#{err.to_s.gsub("(#{file}): ", '')}")
    else
      warnings = hiera(parsed)
      next PuppetCheck.warning_files.push("-- #{file}:\n#{warnings.join("\n")}") unless warnings.empty?
      PuppetCheck.clean_files.push("-- #{file}")
    end
  end
end