Sha256: 2a20f75b9feb34225431bb8cae61bcbe35cad34362a52b9166a185560ca798d3

Contents?: true

Size: 1.75 KB

Versions: 41

Compression:

Stored size: 1.75 KB

Contents

module Redcar
  class TodoList
    class FileParser
      TodoItem = Struct.new("TodoItem", :path, :line, :action)

      def initialize
        @tag_list = Hash.new {|h,k| h[k] = [] }
        @optional_colon = ":" if TodoList.storage['require_colon']
      end

      def parse_files(path)
        #IMPROVE: is there a better/more efficient way to find all tags?
        find_dirs(path)
        @tag_list
      end

      def find_dirs(path)
        return unless File.directory? path
        unless TodoList.storage['excluded_dirs'].include? File.basename(path)
          Dir["#{path}/*"].each {|subdir| find_dirs(subdir) }
          find_files(path)
        end
      end

      def find_files(path)
        TodoList.storage['included_suffixes'].each do |suffix|
          files = File.join(path, "*#{suffix}")
          Dir.glob(files).each do |file_path|
            unless TodoList.storage['excluded_files'].include?(File.basename(file_path))
              find_tags(file_path)
            end
          end
        end
      end

      def find_tags(file_path)
        tags = TodoList.storage['tags']
        File.open(file_path) do |file|
          file.readlines.each_with_index do |line, idx|
            included_tags = tags.select {|tag| line.include? "#{tag}#{@optional_colon}" }
            create_tag_items(included_tags, file_path, line, idx)
          end
        end
      end

      def create_tag_items(included_tags, file, line, idx)
        included_tags.each do |tag|
          action = line[(line.index(tag) + tag.length)..-1]
          @tag_list[tag] << TodoItem.new.tap do |t|
            t.path   = file
            t.line   = idx
            t.action = (action.chars.first == ":" ? action[1..-1] : action).strip
          end
        end
      end
    end
  end
end

Version data entries

41 entries across 41 versions & 2 rubygems

Version Path
redcar-0.13 plugins/todo_list/lib/todo_list/file_parser.rb
redcar-dev-0.13.5dev plugins/todo_list/lib/todo_list/file_parser.rb
redcar-dev-0.13.4dev plugins/todo_list/lib/todo_list/file_parser.rb
redcar-dev-0.13.3dev plugins/todo_list/lib/todo_list/file_parser.rb
redcar-dev-0.13.2dev plugins/todo_list/lib/todo_list/file_parser.rb
redcar-dev-0.13.1dev plugins/todo_list/lib/todo_list/file_parser.rb
redcar-0.12.1 plugins/todo_list/lib/todo_list/file_parser.rb
redcar-dev-0.13.0dev plugins/todo_list/lib/todo_list/file_parser.rb
redcar-0.12 plugins/todo_list/lib/todo_list/file_parser.rb
redcar-dev-0.12.27dev plugins/todo_list/lib/todo_list/file_parser.rb
redcar-dev-0.12.26dev plugins/todo_list/lib/todo_list/file_parser.rb
redcar-dev-0.12.25dev plugins/todo_list/lib/todo_list/file_parser.rb
redcar-dev-0.12.24dev plugins/todo_list/lib/todo_list/file_parser.rb
redcar-dev-0.12.23dev plugins/todo_list/lib/todo_list/file_parser.rb
redcar-dev-0.12.22dev plugins/todo_list/lib/todo_list/file_parser.rb
redcar-dev-0.12.21dev plugins/todo_list/lib/todo_list/file_parser.rb
redcar-dev-0.12.20dev plugins/todo_list/lib/todo_list/file_parser.rb
redcar-dev-0.12.19dev plugins/todo_list/lib/todo_list/file_parser.rb
redcar-dev-0.12.18dev plugins/todo_list/lib/todo_list/file_parser.rb
redcar-dev-0.12.17dev plugins/todo_list/lib/todo_list/file_parser.rb