added slides link
[augment.git] / lib / layer.rb
blobcf688bd54cd27118c79ade4b33695df148435a13
1 require 'json'
3 class Layer
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),
8                                           color, message,
9                                           backend.to_s.downcase.gsub(/backend/, '')]
10   end
12   def Layer.interpret_where where, file = nil
13     case where
14     when Fixnum
15       Layer.line_to_char_range file, where
16     when String
17       if where =~ /\.\.\./ # grabbing this from JSON strings
18         Layer.range_string_to_char_range where
19       else
20         Layer.method_to_char_range file, where
21       end
22     else
23       where
24     end
25   end
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)
31   end
33   def self.range_string_to_char_range(range)
34     (range.split('...').first.to_i ... range.split('...').last.to_i)
35   end
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
42   end
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
49   end
51   def to_json
52     { 'range' => @range, 'color' => @color, 'message' => @message,
53       'backend' => @backend}.to_json
54   end
55 end