module ProjectFileReader

Public Instance Methods

read(key, data = @data) click to toggle source

little read function returns data if read already or does a lookup

# File lib/ascii_invoicer/projectFileReader.rb, line 17
def read(key, data = @data)
  return nil unless key.class == Symbol

  # data has already been read
  @logger.info Paint["KNOWN KEY: #{key}",:cyan] if data[key] if @settings.DEBUG
  return data[key]         if data[key]

  @logger.info Paint["reading :#{key}", :green, :bold] if @settings.DEBUG

  raw     = @raw_data[key.to_s]
  default = @defaults[key.to_s]

  # if key is in raw_data walk it trough applying filters
  if raw
    @logger.info "    FOUND RAW #{key}" if @settings.DEBUG
    @logger.info "     walking #{key}" if @settings.DEBUG
    return data[key]  = walk(raw, [key])
    #fail "#{self.class} DOES NOT KNOW WHAT TO DO WITH #{raw.class}"
  end

  # or the default from the settings
  unless default.nil?
    @logger.info "    FOUND DEFAULT #{key}" if @settings.DEBUG
    return data[key] = walk(default, [key])
  end

  # otherwise fail
  return data[key] = fail_at(key)
end

Private Instance Methods

apply_filter(path, value, prefix = "filter_") click to toggle source
# File lib/ascii_invoicer/projectFileReader.rb, line 78
def apply_filter(path, value, prefix = "filter_")
  begin
    path = path.join('_') if path.class == Array
    path = path.to_s      if path.class == Symbol
    parser = prefix+path
    begin parser = method(parser)
    rescue NameError
      return value
    else
      @logger.info Paint[path, :yellow] if @settings.DEBUG
      return parser.call(value)
    end
  end
  rescue => error
    fail_at path
    puts Array.new($@).keep_if{|line| line.include? "filter_"}.map {|line| Paint[line, :red, :bold]}
    puts Array.new($@).keep_if{|line| line.include? "generate_"}.map {|line| Paint[line, :blue, :bold]}
    puts Paint["      #{error} (#{@project_path})", :yellow]
  end
apply_generator(path, value) click to toggle source
# File lib/ascii_invoicer/projectFileReader.rb, line 74
def apply_generator(path, value)
  apply_filter path, value, "generate_"
end
fail_at(*criteria) click to toggle source
# File lib/ascii_invoicer/projectFileReader.rb, line 98
def fail_at(*criteria)
  @data[:valid] = false
  criteria.each  {|c|
    @errors.push c.to_sym unless @errors.include? c
  }
  return nil
end
walk(tree= @raw_data, path = []) click to toggle source
# File lib/ascii_invoicer/projectFileReader.rb, line 48
def walk(tree= @raw_data, path = [])
  catch :filter_error do
    if tree.class == Hash
      new_tree = {}
      tree.each{|k,v|
        k = k.to_sym if k.class == String
        k = walk(k, path+[k] )if k.class == Hash
        new_tree[k] = walk(v, path+[k])
      }
      new_tree = apply_filter path, new_tree
      return new_tree
    elsif tree.class == Array
      new_tree = []
      tree.each_index{|i|
        v = tree[i]
        new_tree[i] = walk(v, path+[i])
      }
      new_tree = apply_filter path, new_tree
      return new_tree
    else
      tree = apply_filter path, tree
      return tree
    end
  end
end