Skip to content

Instantly share code, notes, and snippets.

@ErikDeBruijn
Created June 14, 2020 10:25
Show Gist options
  • Save ErikDeBruijn/3500a53c215cb7800dbb80993b52d770 to your computer and use it in GitHub Desktop.
Save ErikDeBruijn/3500a53c215cb7800dbb80993b52d770 to your computer and use it in GitHub Desktop.
Monitors changed files and will tell you as soon as a test doesn't pass anymore
#!/usr/bin/env ruby
# THIS IS A WORK IN PROGRESS TOOL
def get_changed_files
files = `git diff --name-only |grep .rb`.split("\n").map do |f|
f2 = f.split('/') ; f2.shift ; f2.join('/')
end
files_new = []
files.each do |f|
f_test = f.gsub(/\.rb$/,"_spec.rb").gsub(/^app\//,"spec\/")
files_new << f_test if File.exists?(f_test)
f_base = File.basename(f).split('.').first
files_new += Dir.glob("spec/**/**/#{f_base}_spec.rb")
end
files + files_new
end
@result_db = {}
def run_rspec(f)
result = `spring rspec #{f} 2>&1`
@result_db[f] ||= {mtime: 0, ok: false}
@result_db[f][:mtime] = File.mtime(f)
if result.nil?
@result_db[f][:ok] = true
""
else
result = result.gsub(/Running.*$/,"")
if result.include?("0 failures")
if @result_db[f][:ok] == false
`terminal-notifier -title '🟩 A test now passes again (rspec-mon)'`
end
@result_db[f][:ok] = true
else
`echo An RSPEC test failed.|terminal-notifier -title '🟥 A test fails (rspec-mon)' -open file:///tmp/rspec-mon-lastfail.txt`
result = result.gsub(/failures/,"FAILURES".bold.red)
File.open("/tmp/rspec-mon-lastfail.txt",'w') {|file| file.write(result) }
@result_db[f][:ok] = false
end
result = result.gsub(/0 failures$/,"GREEN".bold.green)
"#{f}: #{result.strip}"
end
end
def rspec_files(files)
files = files.select do |f|
@result_db[f].nil? || @result_db[f][:mtime] != File.mtime(f)
end
files.each do |f|
STDERR << run_rspec(f)
end
end
class String
def bold; "\e[1m#{self}" end
def black; "\033[30m#{self}\033[0m" end
def red; "\033[31m#{self}\033[0m" end
def green; "\033[32m#{self}\033[0m" end
def brown; "\033[33m#{self}\033[0m" end
def blue; "\033[34m#{self}\033[0m" end
def magenta; "\033[35m#{self}\033[0m" end
def cyan; "\033[36m#{self}\033[0m" end
def gray; "\033[37m#{self}\033[0m" end
end
def color(index, str, bold: false)
if bold
"\e[#{index}m\e[1m#{str}\e[0m"
else
"\e[#{index}m#{str}\e[0m"
end
end
t0, new_mtime, changed_files_old, last_time = [Time.now, File.mtime(__FILE__), nil, 0]
while true
changed_files = get_changed_files unless last_time == Time.now.to_i
if changed_files_old != changed_files
changed_files_old = changed_files
end
last_time = Time.now.to_i
rspec_files(changed_files)
sleep(0.1)
exit if new_mtime != File.mtime(__FILE__)
new_mtime = File.mtime(__FILE__)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment