psychic-runner 0.0.7 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/bin/psychic +1 -1
- data/lib/psychic/cli.rb +8 -1
- data/lib/psychic/output_helper.rb +84 -0
- data/lib/psychic/runner.rb +88 -16
- data/lib/psychic/runner/base_runner.rb +89 -36
- data/lib/psychic/runner/cli.rb +80 -25
- data/lib/psychic/runner/code_helper.rb +131 -0
- data/lib/psychic/runner/code_sample.rb +70 -0
- data/lib/psychic/runner/factories/ruby_factories.rb +16 -0
- data/lib/psychic/runner/{cold/shell_script_runner.rb → factories/shell_script_factories.rb} +4 -4
- data/lib/psychic/runner/{hot_runner.rb → hot_read_task_factory.rb} +4 -3
- data/lib/psychic/runner/magic_task_factory.rb +95 -0
- data/lib/psychic/runner/sample_finder.rb +36 -0
- data/lib/psychic/runner/sample_runner.rb +7 -15
- data/lib/psychic/runner/task_factory_registry.rb +31 -0
- data/lib/psychic/runner/version.rb +1 -1
- data/lib/psychic/shell/mixlib_shellout_executor.rb +3 -1
- data/lib/psychic/task.rb +14 -0
- data/spec/psychic/runner/factories/bundler_detector_spec.rb +90 -0
- data/spec/psychic/runner/{cold → factories}/shell_script_runner_spec.rb +10 -10
- data/spec/psychic/runner/{hot_runner_spec.rb → hot_read_task_factory_spec.rb} +7 -8
- data/spec/psychic/runner/sample_finder_spec.rb +34 -0
- data/spec/psychic/runner_spec.rb +7 -5
- metadata +20 -9
- data/lib/psychic/runner/cold_runner_registry.rb +0 -31
| @@ -37,7 +37,9 @@ module Psychic | |
| 37 37 | 
             
                    @logger = opts.delete(:logger) || logger
         | 
| 38 38 | 
             
                    @shell = Mixlib::ShellOut.new(command, opts)
         | 
| 39 39 | 
             
                    @shell.live_stream = IOToLog.new(@logger)
         | 
| 40 | 
            -
                     | 
| 40 | 
            +
                    Bundler.with_clean_env do
         | 
| 41 | 
            +
                      @shell.run_command
         | 
| 42 | 
            +
                    end
         | 
| 41 43 | 
             
                    execution_result
         | 
| 42 44 | 
             
                  rescue SystemCallError, *MIXLIB_SHELLOUT_EXCEPTION_CLASSES, TypeError => e
         | 
| 43 45 | 
             
                    # See https://github.com/opscode/mixlib-shellout/issues/62
         | 
    
        data/lib/psychic/task.rb
    ADDED
    
    | @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            module Psychic
         | 
| 2 | 
            +
              class Runner
         | 
| 3 | 
            +
                class Task < Strict.new(:name, :command)
         | 
| 4 | 
            +
                  def command
         | 
| 5 | 
            +
                    fail NotImplementedError, 'Subclasses must implement command'
         | 
| 6 | 
            +
                  end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  def execute(opts)
         | 
| 9 | 
            +
                    puts "Executing: #{command}" if opts[:verbose]
         | 
| 10 | 
            +
                    executor.execute(command, opts)
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
            end
         | 
| @@ -0,0 +1,90 @@ | |
| 1 | 
            +
            module Psychic
         | 
| 2 | 
            +
              class Runner
         | 
| 3 | 
            +
                module Factories
         | 
| 4 | 
            +
                  RSpec.describe BundlerTaskFactory do
         | 
| 5 | 
            +
                    let(:shell) { Psychic::Shell.shell = double('shell') }
         | 
| 6 | 
            +
                    subject { described_class.new(cwd: current_dir) }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                    shared_context 'without bundler' do
         | 
| 9 | 
            +
                      before(:each) do
         | 
| 10 | 
            +
                        ENV['BUNDLE_GEMFILE'] = nil
         | 
| 11 | 
            +
                      end
         | 
| 12 | 
            +
                    end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                    shared_context 'with Gemfile' do
         | 
| 15 | 
            +
                      before(:each) do
         | 
| 16 | 
            +
                        ENV['BUNDLE_GEMFILE'] = nil
         | 
| 17 | 
            +
                        write_file 'Gemfile', ''
         | 
| 18 | 
            +
                      end
         | 
| 19 | 
            +
                    end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                    shared_context 'with .bundle/config' do
         | 
| 22 | 
            +
                      before(:each) do
         | 
| 23 | 
            +
                        ENV['BUNDLE_GEMFILE'] = nil
         | 
| 24 | 
            +
                        write_file '.bundle/config', <<-eos
         | 
| 25 | 
            +
            ---
         | 
| 26 | 
            +
            BUNDLE_GEMFILE: "../../Gemfile"
         | 
| 27 | 
            +
            eos
         | 
| 28 | 
            +
                      end
         | 
| 29 | 
            +
                    end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                    shared_context 'with BUNDLE_GEMFILE environment variable' do
         | 
| 32 | 
            +
                      around(:each) do | example |
         | 
| 33 | 
            +
                        ENV['BUNDLE_GEMFILE'] = 'Gemfile'
         | 
| 34 | 
            +
                        example.run
         | 
| 35 | 
            +
                        ENV['BUNDLE_GEMFILE'] = nil
         | 
| 36 | 
            +
                      end
         | 
| 37 | 
            +
                    end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                    shared_examples 'does not use bundler' do
         | 
| 40 | 
            +
                      describe 'active?' do
         | 
| 41 | 
            +
                        it 'returns false' do
         | 
| 42 | 
            +
                          expect(subject.active?).to be false
         | 
| 43 | 
            +
                        end
         | 
| 44 | 
            +
                      end
         | 
| 45 | 
            +
                    end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                    shared_examples 'uses bundler' do
         | 
| 48 | 
            +
                      describe 'known_task?' do
         | 
| 49 | 
            +
                        it 'is true for bootstrap' do
         | 
| 50 | 
            +
                          expect(subject.known_task? :bootstrap).to be true
         | 
| 51 | 
            +
                        end
         | 
| 52 | 
            +
                        it 'is false for compile' do
         | 
| 53 | 
            +
                          expect(subject.known_task? :compile).to be false
         | 
| 54 | 
            +
                        end
         | 
| 55 | 
            +
                      end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                      describe '#bootstrap' do
         | 
| 58 | 
            +
                        it 'returns bundle install' do
         | 
| 59 | 
            +
                          expect(subject.build_task(:bootstrap)).to eq('bundle install')
         | 
| 60 | 
            +
                        end
         | 
| 61 | 
            +
                      end
         | 
| 62 | 
            +
                    end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                    context 'with Gemfile' do
         | 
| 65 | 
            +
                      include_context 'with Gemfile' do
         | 
| 66 | 
            +
                        include_examples 'uses bundler'
         | 
| 67 | 
            +
                      end
         | 
| 68 | 
            +
                    end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                    context 'with .bundle/config' do
         | 
| 71 | 
            +
                      include_context 'with .bundle/config' do
         | 
| 72 | 
            +
                        include_examples 'uses bundler'
         | 
| 73 | 
            +
                      end
         | 
| 74 | 
            +
                    end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                    context 'with BUNDLE_GEMFILE environment variable' do
         | 
| 77 | 
            +
                      include_context 'with BUNDLE_GEMFILE environment variable' do
         | 
| 78 | 
            +
                        include_examples 'uses bundler'
         | 
| 79 | 
            +
                      end
         | 
| 80 | 
            +
                    end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                    context 'without bundler' do
         | 
| 83 | 
            +
                      include_context 'without bundler' do
         | 
| 84 | 
            +
                        include_examples 'does not use bundler'
         | 
| 85 | 
            +
                      end
         | 
| 86 | 
            +
                    end
         | 
| 87 | 
            +
                  end
         | 
| 88 | 
            +
                end
         | 
| 89 | 
            +
              end
         | 
| 90 | 
            +
            end
         | 
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            module Psychic
         | 
| 2 2 | 
             
              class Runner
         | 
| 3 | 
            -
                module  | 
| 4 | 
            -
                  RSpec.describe  | 
| 3 | 
            +
                module Factories
         | 
| 4 | 
            +
                  RSpec.describe ShellScriptTaskFactory do
         | 
| 5 5 | 
             
                    let(:shell) { Psychic::Shell.shell = double('shell') }
         | 
| 6 6 | 
             
                    subject { described_class.new(cwd: current_dir) }
         | 
| 7 7 |  | 
| @@ -21,15 +21,15 @@ module Psychic | |
| 21 21 | 
             
                      end
         | 
| 22 22 | 
             
                    end
         | 
| 23 23 |  | 
| 24 | 
            -
                    describe ' | 
| 24 | 
            +
                    describe 'known_task?' do
         | 
| 25 25 | 
             
                      shared_examples 'detects matching scripts' do
         | 
| 26 26 | 
             
                        it 'returns true if a matching script exists' do
         | 
| 27 | 
            -
                          expect(subject. | 
| 28 | 
            -
                          expect(subject. | 
| 27 | 
            +
                          expect(subject.known_task? :bootstrap).to be true
         | 
| 28 | 
            +
                          expect(subject.known_task? :compile).to be true
         | 
| 29 29 | 
             
                        end
         | 
| 30 30 | 
             
                        it 'returns false if a matching script does not exists' do
         | 
| 31 | 
            -
                          expect(subject. | 
| 32 | 
            -
                          expect(subject. | 
| 31 | 
            +
                          expect(subject.known_task? :foo).to be false
         | 
| 32 | 
            +
                          expect(subject.known_task? :bar).to be false
         | 
| 33 33 | 
             
                        end
         | 
| 34 34 | 
             
                      end
         | 
| 35 35 |  | 
| @@ -46,13 +46,13 @@ module Psychic | |
| 46 46 | 
             
                      end
         | 
| 47 47 | 
             
                    end
         | 
| 48 48 |  | 
| 49 | 
            -
                    describe '# | 
| 49 | 
            +
                    describe '#execute_task' do
         | 
| 50 50 | 
             
                      context 'matching a task' do
         | 
| 51 51 | 
             
                        context 'with scripts/*.sh files' do
         | 
| 52 52 | 
             
                          include_context 'with scripts/*.sh files' do
         | 
| 53 53 | 
             
                            it 'executes the script command' do
         | 
| 54 54 | 
             
                              expect(shell).to receive(:execute).with('./scripts/bootstrap.sh', cwd: current_dir)
         | 
| 55 | 
            -
                              subject.bootstrap
         | 
| 55 | 
            +
                              subject.execute_task :bootstrap
         | 
| 56 56 | 
             
                            end
         | 
| 57 57 | 
             
                          end
         | 
| 58 58 | 
             
                        end
         | 
| @@ -61,7 +61,7 @@ module Psychic | |
| 61 61 | 
             
                          include_context 'with scripts/* (no extension) files' do
         | 
| 62 62 | 
             
                            it 'executes the script command' do
         | 
| 63 63 | 
             
                              expect(shell).to receive(:execute).with('./scripts/bootstrap', cwd: current_dir)
         | 
| 64 | 
            -
                              subject.bootstrap
         | 
| 64 | 
            +
                              subject.execute_task :bootstrap
         | 
| 65 65 | 
             
                            end
         | 
| 66 66 | 
             
                          end
         | 
| 67 67 | 
             
                        end
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            module Psychic
         | 
| 2 2 | 
             
              class Runner
         | 
| 3 | 
            -
                RSpec.describe  | 
| 3 | 
            +
                RSpec.describe HotReadTaskFactory do
         | 
| 4 4 | 
             
                  let(:task_map) do
         | 
| 5 5 | 
             
                    {
         | 
| 6 6 | 
             
                      'bootstrap' => 'foo',
         | 
| @@ -12,23 +12,22 @@ module Psychic | |
| 12 12 | 
             
                  subject { described_class.new(cwd: current_dir, hints: task_map) }
         | 
| 13 13 |  | 
| 14 14 | 
             
                  shared_examples 'runs tasks' do
         | 
| 15 | 
            -
                    describe ' | 
| 15 | 
            +
                    describe 'known_task?' do
         | 
| 16 16 | 
             
                      it 'returns true for task ids' do
         | 
| 17 17 | 
             
                        task_map.each_key do |key|
         | 
| 18 | 
            -
                          expect(subject. | 
| 18 | 
            +
                          expect(subject.known_task? key).to be true
         | 
| 19 19 | 
             
                        end
         | 
| 20 20 | 
             
                      end
         | 
| 21 21 |  | 
| 22 22 | 
             
                      it 'returns false for anything else' do
         | 
| 23 | 
            -
                        expect(subject. | 
| 23 | 
            +
                        expect(subject.known_task? 'max').to be false
         | 
| 24 24 | 
             
                      end
         | 
| 25 25 | 
             
                    end
         | 
| 26 26 |  | 
| 27 | 
            -
                    describe '# | 
| 27 | 
            +
                    describe '#task_for' do
         | 
| 28 28 | 
             
                      context 'matching a task' do
         | 
| 29 | 
            -
                        it ' | 
| 30 | 
            -
                          expect( | 
| 31 | 
            -
                          subject.bootstrap
         | 
| 29 | 
            +
                        it 'builds the task command' do
         | 
| 30 | 
            +
                          expect(subject.task_for(:bootstrap)).to eq('foo')
         | 
| 32 31 | 
             
                        end
         | 
| 33 32 | 
             
                      end
         | 
| 34 33 |  | 
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Psychic
         | 
| 4 | 
            +
              class Runner
         | 
| 5 | 
            +
                RSpec.describe SampleFinder do
         | 
| 6 | 
            +
                  context 'without hints' do
         | 
| 7 | 
            +
                    describe '#known_samples' do
         | 
| 8 | 
            +
                      it 'returns an empty list' do
         | 
| 9 | 
            +
                        expect(subject.known_samples).to be_empty
         | 
| 10 | 
            +
                      end
         | 
| 11 | 
            +
                    end
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  context 'with hints' do
         | 
| 15 | 
            +
                    let(:hints) do
         | 
| 16 | 
            +
                      {
         | 
| 17 | 
            +
                        'foo' => '/path/to/foo.c',
         | 
| 18 | 
            +
                        'bar' => '/path/to/bar.rb'
         | 
| 19 | 
            +
                      }
         | 
| 20 | 
            +
                    end
         | 
| 21 | 
            +
                    subject { described_class.new(Dir.pwd, hints) }
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                    it 'returns the samples from the hints' do
         | 
| 24 | 
            +
                      samples = subject.known_samples
         | 
| 25 | 
            +
                      expect(samples.size).to eq(2)
         | 
| 26 | 
            +
                      expect(samples[0].name).to eq('foo')
         | 
| 27 | 
            +
                      expect(samples[0].source_file).to eq('/path/to/foo.c')
         | 
| 28 | 
            +
                      expect(samples[1].name).to eq('bar')
         | 
| 29 | 
            +
                      expect(samples[1].source_file).to eq('/path/to/bar.rb')
         | 
| 30 | 
            +
                    end
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
            end
         | 
    
        data/spec/psychic/runner_spec.rb
    CHANGED
    
    | @@ -20,8 +20,10 @@ module Psychic | |
| 20 20 | 
             
                  end
         | 
| 21 21 |  | 
| 22 22 | 
             
                  describe 'initialize' do
         | 
| 23 | 
            -
                    it 'should create a  | 
| 24 | 
            -
                      expect(subject. | 
| 23 | 
            +
                    it 'should create a HotReadTaskFactory for the specified directory' do
         | 
| 24 | 
            +
                      expect(subject.hot_read_task_factory).to(
         | 
| 25 | 
            +
                        be_an_instance_of Psychic::Runner::HotReadTaskFactory
         | 
| 26 | 
            +
                      )
         | 
| 25 27 | 
             
                      expect(subject.cwd).to eq(current_dir)
         | 
| 26 28 | 
             
                    end
         | 
| 27 29 | 
             
                  end
         | 
| @@ -34,9 +36,9 @@ module Psychic | |
| 34 36 | 
             
                  end
         | 
| 35 37 |  | 
| 36 38 | 
             
                  describe 'initialize' do
         | 
| 37 | 
            -
                    it 'should create a  | 
| 38 | 
            -
                      expect(subject. | 
| 39 | 
            -
                        an_instance_of(Psychic::Runner:: | 
| 39 | 
            +
                    it 'should create a ShellScriptTaskFactory' do
         | 
| 40 | 
            +
                      expect(subject.task_factories).to include(
         | 
| 41 | 
            +
                        an_instance_of(Psychic::Runner::Factories::ShellScriptTaskFactory)
         | 
| 40 42 | 
             
                      )
         | 
| 41 43 | 
             
                    end
         | 
| 42 44 | 
             
                  end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: psychic-runner
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0. | 
| 4 | 
            +
              version: 0.0.8
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Max Lincoln
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2015-01-08 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: thor
         | 
| @@ -189,22 +189,31 @@ files: | |
| 189 189 | 
             
            - bin/psychic
         | 
| 190 190 | 
             
            - lib/psychic/cli.rb
         | 
| 191 191 | 
             
            - lib/psychic/logger.rb
         | 
| 192 | 
            +
            - lib/psychic/output_helper.rb
         | 
| 192 193 | 
             
            - lib/psychic/runner.rb
         | 
| 193 194 | 
             
            - lib/psychic/runner/base_runner.rb
         | 
| 194 195 | 
             
            - lib/psychic/runner/cli.rb
         | 
| 195 | 
            -
            - lib/psychic/runner/ | 
| 196 | 
            -
            - lib/psychic/runner/ | 
| 197 | 
            -
            - lib/psychic/runner/ | 
| 196 | 
            +
            - lib/psychic/runner/code_helper.rb
         | 
| 197 | 
            +
            - lib/psychic/runner/code_sample.rb
         | 
| 198 | 
            +
            - lib/psychic/runner/factories/ruby_factories.rb
         | 
| 199 | 
            +
            - lib/psychic/runner/factories/shell_script_factories.rb
         | 
| 200 | 
            +
            - lib/psychic/runner/hot_read_task_factory.rb
         | 
| 201 | 
            +
            - lib/psychic/runner/magic_task_factory.rb
         | 
| 202 | 
            +
            - lib/psychic/runner/sample_finder.rb
         | 
| 198 203 | 
             
            - lib/psychic/runner/sample_runner.rb
         | 
| 204 | 
            +
            - lib/psychic/runner/task_factory_registry.rb
         | 
| 199 205 | 
             
            - lib/psychic/runner/version.rb
         | 
| 200 206 | 
             
            - lib/psychic/shell.rb
         | 
| 201 207 | 
             
            - lib/psychic/shell/execution_result.rb
         | 
| 202 208 | 
             
            - lib/psychic/shell/mixlib_shellout_executor.rb
         | 
| 209 | 
            +
            - lib/psychic/task.rb
         | 
| 203 210 | 
             
            - lib/psychic/tokens.rb
         | 
| 204 211 | 
             
            - lib/psychic/util.rb
         | 
| 205 212 | 
             
            - psychic-runner.gemspec
         | 
| 206 | 
            -
            - spec/psychic/runner/ | 
| 207 | 
            -
            - spec/psychic/runner/ | 
| 213 | 
            +
            - spec/psychic/runner/factories/bundler_detector_spec.rb
         | 
| 214 | 
            +
            - spec/psychic/runner/factories/shell_script_runner_spec.rb
         | 
| 215 | 
            +
            - spec/psychic/runner/hot_read_task_factory_spec.rb
         | 
| 216 | 
            +
            - spec/psychic/runner/sample_finder_spec.rb
         | 
| 208 217 | 
             
            - spec/psychic/runner_spec.rb
         | 
| 209 218 | 
             
            - spec/spec_helper.rb
         | 
| 210 219 | 
             
            homepage: 
         | 
| @@ -232,7 +241,9 @@ signing_key: | |
| 232 241 | 
             
            specification_version: 4
         | 
| 233 242 | 
             
            summary: Psychic runs anything.
         | 
| 234 243 | 
             
            test_files:
         | 
| 235 | 
            -
            - spec/psychic/runner/ | 
| 236 | 
            -
            - spec/psychic/runner/ | 
| 244 | 
            +
            - spec/psychic/runner/factories/bundler_detector_spec.rb
         | 
| 245 | 
            +
            - spec/psychic/runner/factories/shell_script_runner_spec.rb
         | 
| 246 | 
            +
            - spec/psychic/runner/hot_read_task_factory_spec.rb
         | 
| 247 | 
            +
            - spec/psychic/runner/sample_finder_spec.rb
         | 
| 237 248 | 
             
            - spec/psychic/runner_spec.rb
         | 
| 238 249 | 
             
            - spec/spec_helper.rb
         | 
| @@ -1,31 +0,0 @@ | |
| 1 | 
            -
            module Psychic
         | 
| 2 | 
            -
              class Runner
         | 
| 3 | 
            -
                class ColdRunnerRegistry
         | 
| 4 | 
            -
                  include Psychic::Logger
         | 
| 5 | 
            -
             | 
| 6 | 
            -
                  BUILT_IN_DIR = File.expand_path('../cold', __FILE__)
         | 
| 7 | 
            -
             | 
| 8 | 
            -
                  class << self
         | 
| 9 | 
            -
                    def autoload_runners!
         | 
| 10 | 
            -
                      # Load built-in runners
         | 
| 11 | 
            -
                      Dir["#{BUILT_IN_DIR}/*.rb"].each do |cold_runner_file|
         | 
| 12 | 
            -
                        require cold_runner_file
         | 
| 13 | 
            -
                      end
         | 
| 14 | 
            -
                    end
         | 
| 15 | 
            -
             | 
| 16 | 
            -
                    def runner_classes
         | 
| 17 | 
            -
                      @runner_classes ||= Set.new
         | 
| 18 | 
            -
                    end
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                    def register(klass)
         | 
| 21 | 
            -
                      runner_classes.add klass
         | 
| 22 | 
            -
                    end
         | 
| 23 | 
            -
             | 
| 24 | 
            -
                    def active_runners(opts)
         | 
| 25 | 
            -
                      runners = runner_classes.map { |k| k.new(opts) }
         | 
| 26 | 
            -
                      runners.select(&:active?)
         | 
| 27 | 
            -
                    end
         | 
| 28 | 
            -
                  end
         | 
| 29 | 
            -
                end
         | 
| 30 | 
            -
              end
         | 
| 31 | 
            -
            end
         |