class SimpleConfig

Attributes

groups[R]
params[R]

Public Class Methods

new(raw_data, opts = {}) click to toggle source
# File lib/inspec/utils/simpleconfig.rb, line 10
def initialize(raw_data, opts = {})
  parse(raw_data, opts)
end

Public Instance Methods

parse(raw_data, opts = nil) click to toggle source

Parse some data quotes: quoting characters, which are parsed, so everything inside it will be part of a string multiline: allow quoted text to span multiple lines comment_char: char which identifies comments standalone_comments: comments must appear alone in a line; if set to true, no comments can be added to the end of an assignment/statement line

# File lib/inspec/utils/simpleconfig.rb, line 21
def parse(raw_data, opts = nil)
  @params = {}
  @groups = []
  @vals = @params
  options = default_options.merge(opts || {})
  return if raw_data.nil?

  # prepare raw data if required
  unless options[:line_separator].nil?
    raw_data = raw_data.tr(options[:line_separator], "\n")
  end
  rest = raw_data
  rest = parse_rest(rest, options) until rest.empty?
end

Private Instance Methods

default_options() click to toggle source
# File lib/inspec/utils/simpleconfig.rb, line 108
def default_options
  {
    quotes: "",
    multiline: false,
    comment_char: "#",
    line_separator: nil, # uses this char to seperate lines before parsing
    assignment_regex: /^\s*([^=]*?)\s*=\s*(.*?)\s*$/,
    group_re: /\[([^\]]+)\]\s*$/,
    key_values: 1, # default for key=value, may require for 'key val1 val2 val3'
    standalone_comments: false,
    multiple_values: false,
  }
end
is_empty_line(l) click to toggle source
# File lib/inspec/utils/simpleconfig.rb, line 104
def is_empty_line(l)
  l =~ /^\s*$/
end
parse_group_line(line, opts) click to toggle source
# File lib/inspec/utils/simpleconfig.rb, line 68
def parse_group_line(line, opts)
  return nil if opts[:group_re].nil?

  m = opts[:group_re].match(line)
  return nil if m.nil?

  @groups.push(m[1])

  # We use a Hashie::Mash to provide method syntax for retrieving
  # values. For configs that have keys whose values may be hashes
  # (such as a mysql config that has [sections]), providing
  # a hash whose values are accessible via methods provide
  # a better user experience with `its` blocks.
  @vals = @params[m[1]] = Hashie::Mash.new
end
parse_implicit_assignment_line(line, opts) click to toggle source
# File lib/inspec/utils/simpleconfig.rb, line 84
def parse_implicit_assignment_line(line, opts)
  return nil if is_empty_line(line)

  if opts[:multiple_values]
    @vals[line.strip] ||= []
  else
    @vals[line.strip] = ""
  end
end
parse_params_line(line, opts) click to toggle source
# File lib/inspec/utils/simpleconfig.rb, line 54
def parse_params_line(line, opts)
  # now line contains what we are interested in parsing
  # check if it is an assignment
  m = opts[:assignment_regex].match(line)
  return nil if m.nil?

  if opts[:multiple_values]
    @vals[m[1]] ||= []
    @vals[m[1]].push(parse_values(m, opts[:key_values]))
  else
    @vals[m[1]] = parse_values(m, opts[:key_values])
  end
end
parse_rest(rest, opts) click to toggle source
# File lib/inspec/utils/simpleconfig.rb, line 94
def parse_rest(rest, opts)
  line, idx_nl = parse_comment_line(rest, opts)
  parse_params_line(line, opts) ||
    parse_group_line(line, opts) ||
    parse_implicit_assignment_line(line, opts)

  # return whatever is left
  rest[(idx_nl + 1)..-1] || ""
end
parse_values(match, values) click to toggle source
# File lib/inspec/utils/simpleconfig.rb, line 38
def parse_values(match, values)
  start_idx = 2
  i = 0
  count = values - 1
  return match[start_idx] if values == 1

  # iterate over expected parameters
  values = []
  loop do
    values.push(match[start_idx + i])
    i += 1
    break if i > count
  end
  values
end