4 attr_accessor :range, :color, :message, :backend
6 def initialize(where, color, message, backend, file = nil)
7 @range, @color, @message, @backend = [Layer.interpret_where(where, file),
9 backend.to_s.downcase.gsub(/backend/, '')]
12 def Layer.interpret_where where, file = nil
15 Layer.line_to_char_range file, where
17 if where =~ /\.\.\./ # grabbing this from JSON strings
18 Layer.range_string_to_char_range where
20 Layer.method_to_char_range file, where
27 def self.line_to_char_range(file, line)
28 file = File.read(file).split("\n")
29 start = file[0 ... line - 1].join("\n").size + 2
30 (start ... start + file[line - 1].size)
33 def self.range_string_to_char_range(range)
34 (range.split('...').first.to_i ... range.split('...').last.to_i)
37 def self.method_to_char_range(file, method)
38 # TODO: get smart about what class the method is defined on... ugh
39 start = File.read(file) =~ Regexp.new("def .*#{method.split(/#/).last}")
40 finish = start + 5 # TODO: fix
41 (start ... finish) # we're just layering the word "def" for now
44 def self.read(original_file)
45 return [] if !File.exist?(Augment.augment_path(original_file))
46 layers = JSON.parse(File.read(Augment.augment_path(original_file)))
47 layers.map!{ |l| Layer.new(l['range'], l['color'], l['message'], l['backend']) }
48 layers.sort_by{ |l| l.range.begin }.reverse
52 { 'range' => @range, 'color' => @color, 'message' => @message,
53 'backend' => @backend}.to_json