main
  1#!/usr/bin/env ruby
  2require 'ruby_gntp'
  3
  4@all_files ={}
  5
  6class ChangedFile
  7  attr_accessor :name,:last_changed_time
  8
  9  def initialize(name)
 10    @name = name
 11    @last_changed_time = File.mtime(name)
 12  end
 13
 14  def has_changed?
 15    @last_changed_time < File.mtime(@name)
 16  end
 17
 18  def update
 19    @last_changed_time = File.mtime(@name)
 20  end
 21
 22  def was_deleted?
 23    not File.exists?(@name)
 24  end
 25end
 26
 27
 28class BuildMessage
 29  def initialize(error_items)
 30    @error_items = error_items
 31  end
 32
 33  def successful
 34    @error_items.length == 0
 35  end
 36
 37  def message
 38    successful ? "Build Successful" : @error_items.join("\r\n")
 39  end
 40end
 41
 42
 43def scan_for_new_files
 44  has_new_files = false
 45  Dir.glob("**/*.cs").each do|file|
 46    unless (@all_files.key?(file))
 47      has_new_files = true
 48      @all_files[file] = ChangedFile.new(file)
 49    end
 50  end
 51  has_new_files
 52end
 53
 54def remove_all_deleted
 55  remaining = @all_files.select{|path,item| ! item.was_deleted?}
 56  files_were_deleted = remaining.length != @all_files.length
 57  @all_files = remaining
 58  files_were_deleted
 59end
 60
 61def changes_have_occured
 62  return scan_for_new_files | remove_all_deleted | files_have_changed
 63end
 64
 65def files_have_changed
 66  has_changed = false
 67  @all_files.each do|path,file|
 68    has_changed |= file.has_changed?
 69    file.update
 70  end
 71  return has_changed
 72end
 73
 74def get_errors_in(output)
 75  error_pattern = /error|FAIL/
 76  output.split("\n").select{|item| error_pattern =~ item}
 77end
 78
 79def notify(build_message)
 80  #icon = build_message.successful ? "green" : "red"
 81  #args = {:t => "Build",:i => ".\\#{icon}.jpg"}
 82  #command_line = "build/tools/growl/growlnotify.exe"
 83  #args.each {|key,value| command_line += " /#{key}:\"#{value}\""}
 84  #`#{command_line} "#{build_message.message}"`
 85
 86  begin
 87  GNTP.notify({
 88    :app_name => 'c# practice',
 89    :title => build_message.successful ? 'PASS' : 'FAIL',
 90    :text => build_message.message,
 91    :icon => build_message.successful ? 'green.jpg' : 'red.jpg'
 92  })
 93  rescue StandardError
 94  end
 95end
 96
 97def monitor
 98  if changes_have_occured
 99    errors = get_errors_in(`rake spec`)
100    notify(BuildMessage.new(errors))
101  end
102end
103
104while true do
105  monitor
106  sleep(1)
107end