lib/minitest/queue.rb in ci-queue-0.1.0 vs lib/minitest/queue.rb in ci-queue-0.2.0

- old
+ new

@@ -1,13 +1,79 @@ require 'minitest' +gem 'minitest-reporters', '~> 1.1' +require 'minitest/reporters' + module Minitest + class Requeue < Skip + attr_reader :failure + + def initialize(failure) + super() + @failure = failure + end + + def result_label + "Requeued" + end + + def backtrace + failure.backtrace + end + + def error + failure.error + end + + def message + failure.message + end + end + + module Requeueing + # Make requeues acts as skips for reporters not aware of the difference. + def skipped? + super || requeued? + end + + def requeued? + Requeue === failure + end + + def requeue! + self.failures.unshift(Requeue.new(self.failures.shift)) + end + end + module Queue - attr_accessor :queue + attr_reader :queue + def queue=(queue) + @queue = queue + if queue.respond_to?(:minitest_reporters) + self.queue_reporters = queue.minitest_reporters + else + self.queue_reporters = [] + end + end + + def queue_reporters=(reporters) + @queue_reporters ||= [] + Reporters.reporters = ((Reporters.reporters || []) - @queue_reporters) + reporters + @queue_reporters = reporters + end + SuiteNotFound = Class.new(StandardError) + def loaded_tests + MiniTest::Test.runnables.flat_map do |suite| + suite.runnable_methods.map do |method| + "#{suite}##{method}" + end + end + end + def __run(*args) if queue run_from_queue(*args) else super @@ -15,19 +81,24 @@ end def run_from_queue(reporter, *) runnable_classes = Minitest::Runnable.runnables.map { |s| [s.name, s] }.to_h - queue.poll do |msg| - class_name, method = msg.split("#".freeze, 2) + queue.poll do |test_name| + class_name, method_name = test_name.split("#".freeze, 2) - if suite = runnable_classes[class_name] - Minitest::Runnable.run_one_method(suite, method, reporter) + if klass = runnable_classes[class_name] + result = Minitest.run_one_method(klass, method_name) + unless queue.acknowledge(test_name, result.passed? || result.skipped?) + result.requeue! + end + reporter.record(result) else raise SuiteNotFound, "Couldn't find suite matching: #{msg.inspect}" end end end end end MiniTest.singleton_class.prepend(MiniTest::Queue) +MiniTest::Test.prepend(MiniTest::Requeueing)