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