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