From 86fdb49fb418dff45499fda845bbfdbf5e5c9c5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joa=CC=83o=20Lui=CC=81s?= Date: Fri, 29 Jul 2016 11:44:28 +0100 Subject: [PATCH] add support for plugins * cucumber plugin @ https://github.com/Seedrs/rrrspec-cucumber --- rrrspec-client/lib/rrrspec/client.rb | 1 + .../rrrspec/client/rspec_runner_factory.rb | 13 +++++++ .../lib/rrrspec/client/slave_runner.rb | 16 ++++++--- rrrspec-client/lib/rrrspec/registry.rb | 34 +++++++++++++++++++ rrrspec-client/spec/rrrspec/registry_spec.rb | 15 ++++++++ 5 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 rrrspec-client/lib/rrrspec/client/rspec_runner_factory.rb create mode 100644 rrrspec-client/lib/rrrspec/registry.rb create mode 100644 rrrspec-client/spec/rrrspec/registry_spec.rb diff --git a/rrrspec-client/lib/rrrspec/client.rb b/rrrspec-client/lib/rrrspec/client.rb index cb7cdb3..3781447 100644 --- a/rrrspec-client/lib/rrrspec/client.rb +++ b/rrrspec-client/lib/rrrspec/client.rb @@ -1,4 +1,5 @@ require 'rrrspec' +require 'rrrspec/registry' require 'rrrspec/client/configuration' require 'rrrspec/client/rspec_runner' require 'rrrspec/client/slave_runner' diff --git a/rrrspec-client/lib/rrrspec/client/rspec_runner_factory.rb b/rrrspec-client/lib/rrrspec/client/rspec_runner_factory.rb new file mode 100644 index 0000000..76219fb --- /dev/null +++ b/rrrspec-client/lib/rrrspec/client/rspec_runner_factory.rb @@ -0,0 +1,13 @@ +require 'rrrspec/client/rspec_runner' + +module RRRSpec + module Client + class RSpecRunnerFactory + + def create + return RSpecRunner.new + end + + end + end +end diff --git a/rrrspec-client/lib/rrrspec/client/slave_runner.rb b/rrrspec-client/lib/rrrspec/client/slave_runner.rb index 099bca8..be041e2 100644 --- a/rrrspec-client/lib/rrrspec/client/slave_runner.rb +++ b/rrrspec-client/lib/rrrspec/client/slave_runner.rb @@ -17,7 +17,10 @@ def initialize(slave, working_dir, taskset_key) @slave = slave @taskset = Taskset.new(taskset_key) @timeout = TASKQUEUE_TASK_TIMEOUT - @rspec_runner = RSpecRunner.new + @runners = Hash.new do |runners, file_ext| + runner_factory = RRRSpec::Registry.get_runner_factory(file_ext) + runners[file_ext] = runner_factory.create + end @working_path = File.join(working_dir, @taskset.rsync_name) @unknown_spec_timeout_sec = @taskset.unknown_spec_timeout_sec @least_timeout_sec = @taskset.least_timeout_sec @@ -57,9 +60,12 @@ def work @timeout = TASKQUEUE_TASK_TIMEOUT trial = Trial.create(task, @slave) - @rspec_runner.reset + task_file_ext = File.extname(task.spec_file) + runner = @runners[task_file_ext] + + runner.reset $0 = "rrrspec slave[#{ENV['SLAVE_NUMBER']}]: setting up #{task.spec_file}" - status, outbuf, errbuf = @rspec_runner.setup(File.join(@working_path, task.spec_file)) + status, outbuf, errbuf = runner.setup(File.join(@working_path, task.spec_file)) unless status trial.finish('error', outbuf, errbuf, nil, nil, nil) ArbiterQueue.trial(trial) @@ -75,7 +81,7 @@ def work hard_timeout_sec, TIMEOUT_EXITCODE ) do Timeout::timeout(soft_timeout_sec, SoftTimeoutException) do - @rspec_runner.run(formatter) + runner.run(formatter) end end if status @@ -130,6 +136,8 @@ def example_pending def example_failed(notification) @failed += 1 + return if !notification.respond_to?(:exception) + if notification.exception.is_a?(SoftTimeoutException) @timeout = true end diff --git a/rrrspec-client/lib/rrrspec/registry.rb b/rrrspec-client/lib/rrrspec/registry.rb new file mode 100644 index 0000000..d4eafcf --- /dev/null +++ b/rrrspec-client/lib/rrrspec/registry.rb @@ -0,0 +1,34 @@ +require 'rrrspec/client/rspec_runner' +require 'rrrspec/client/rspec_runner_factory' + +module RRRSpec + module Registry + + class NoFactoryForFileExtensionException < Exception + + def initialize(file_extension) + super "There is no factory for #{file_extension}" + end + end + + @@runner_factories = Hash.new + + def self.reset_runner_factories + @@runner_factories = [] + end + + def self.register_runner_factory(runner_factory, file_extension) + @@runner_factories[file_extension] = runner_factory + end + + + def self.get_runner_factory(file_extension) + raise NoFactoryForFileExtensionException, file_extension unless @@runner_factories[file_extension] + + @@runner_factories[file_extension].new + end + + end + + Registry.register_runner_factory RRRSpec::Client::RSpecRunnerFactory, '.rb' +end diff --git a/rrrspec-client/spec/rrrspec/registry_spec.rb b/rrrspec-client/spec/rrrspec/registry_spec.rb new file mode 100644 index 0000000..8c4b452 --- /dev/null +++ b/rrrspec-client/spec/rrrspec/registry_spec.rb @@ -0,0 +1,15 @@ +module RRRSpec + + RSpec.describe Registry do + subject { Registry } + + it 'should return a runner on .rb' do + expect(subject.get_runner_factory('.rb')).to be_truthy + end + + it 'should raise exception on .feature' do + expect { subject.get_runner_factory('.feature') }.to raise_error('There is no factory for .feature') + end + end + +end