lib/bait/build.rb in bait-0.5.0 vs lib/bait/build.rb in bait-0.5.1

- old
+ new

@@ -1,12 +1,16 @@ require 'bait/object' require 'bait/tester' -require 'json' +require 'bait/build_helper' require 'bait/pubsub' +require 'bait/phase' +require 'json' module Bait class Build < Bait::Object + include Bait::BuildHelper + adapter :memory, Moneta.new(:YAML, :file => Bait.db_file('builds')) attribute :ref, String attribute :owner_name, String @@ -26,84 +30,53 @@ after_destroy do self.broadcast(:remove) self.cleanup! end - def test! - Open3.popen2e(self.script) do |stdin, oe, wait_thr| - self.status = "testing" - self.broadcast :status, self.status - self.save - oe.each do |line| - self.output << line - self.broadcast(:output, line) - end - if wait_thr.value.exitstatus == 0 - self.status = "passed" - else - self.status = "failed" - end - end - rescue Errno::ENOENT => ex - self.output << "A test script was expected but missing.\nError: #{ex.message}" - self.status = "script missing" - ensure - self.save - self.broadcast(:status, status) - end - def test_later self.status = "queued" self.output = "" self.save Bait::Tester.new.async.perform(self.id) unless Bait.env == "test" self end - def queued? - self.reload.status == "queued" + def test! + Bait::Phase.new(self.script("test")).on(:init) do + self.status = 'testing' + self.save + self.broadcast(:status, self.status) + end.on(:output) do |line| + self.output << line + self.broadcast(:output, line) + end.on(:missing) do |message| + self.output << message + self.status = "script missing" + self.save + end.on(:done) do |zerostatus| + if zerostatus + self.status = "passed" + else + self.status = "failed" + end + self.save + self.broadcast(:status, self.status) + # good place to check for a coverage report + end.run! end - def passed? - self.reload.status == "passed" - end - - def clone_path - File.join(sandbox_directory, self.name) - end - - def bait_dir - File.join(clone_path, ".bait") - end - - def script - File.join(bait_dir, "test.sh") - end - - def cloned? - Dir.exists? File.join(clone_path, ".git/") - end - - def cleanup! - FileUtils.rm_rf(sandbox_directory) if Dir.exists?(sandbox_directory) - end - - def sandbox_directory - File.join Bait.storage_dir, "tester", self.name, self.id - end - def clone! - unless cloned? - unless Dir.exists?(sandbox_directory) - FileUtils.mkdir_p sandbox_directory - end - begin - Git.clone(clone_url, name, :path => sandbox_directory) - rescue => ex - msg = "Failed to clone #{clone_url}" - self.output << "#{msg}\n\n#{ex.message}\n\n#{ex.backtrace.join("\n")}" - self.save - end + return if cloned? + unless Dir.exists?(sandbox_directory) + FileUtils.mkdir_p sandbox_directory + end + begin + Git.clone(clone_url, name, :path => sandbox_directory) + rescue => ex + msg = "Failed to clone #{clone_url}" + self.output << "#{msg}\n\n#{ex.message}\n\n#{ex.backtrace.join("\n")}" + self.status = "failed to clone" + self.save end end protected