#!/usr/bin/env ruby require 'ruby_gntp' @all_files ={} class ChangedFile attr_accessor :name,:last_changed_time def initialize(name) @name = name @last_changed_time = File.mtime(name) end def has_changed? @last_changed_time < File.mtime(@name) end def update @last_changed_time = File.mtime(@name) end def was_deleted? not File.exists?(@name) end end class BuildMessage def initialize(error_items) @error_items = error_items end def successful @error_items.length == 0 end def message successful ? "Build Successful" : @error_items.join("\r\n") end end def scan_for_new_files has_new_files = false Dir.glob("**/*.cs").each do|file| unless (@all_files.key?(file)) has_new_files = true @all_files[file] = ChangedFile.new(file) end end has_new_files end def remove_all_deleted remaining = @all_files.select{|path,item| ! item.was_deleted?} files_were_deleted = remaining.length != @all_files.length @all_files = remaining files_were_deleted end def changes_have_occured return scan_for_new_files | remove_all_deleted | files_have_changed end def files_have_changed has_changed = false @all_files.each do|path,file| has_changed |= file.has_changed? file.update end return has_changed end def get_errors_in(output) error_pattern = /error|FAIL/ output.split("\n").select{|item| error_pattern =~ item} end def notify(build_message) #icon = build_message.successful ? "green" : "red" #args = {:t => "Build",:i => ".\\#{icon}.jpg"} #command_line = "build/tools/growl/growlnotify.exe" #args.each {|key,value| command_line += " /#{key}:\"#{value}\""} #`#{command_line} "#{build_message.message}"` begin GNTP.notify({ :app_name => 'c# practice', :title => build_message.successful ? 'PASS' : 'FAIL', :text => build_message.message, :icon => build_message.successful ? 'green.jpg' : 'red.jpg' }) rescue StandardError end end def monitor if changes_have_occured errors = get_errors_in(`rake spec`) notify(BuildMessage.new(errors)) end end while true do monitor sleep(1) end