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