lib/psychic/runner.rb in psychic-runner-0.0.7 vs lib/psychic/runner.rb in psychic-runner-0.0.8
- old
+ new
@@ -1,38 +1,110 @@
require 'psychic/runner/version'
+autoload :Thor, 'thor'
autoload :YAML, 'yaml'
module Psychic
autoload :Util, 'psychic/util'
autoload :Logger, 'psychic/logger'
autoload :Shell, 'psychic/shell'
+ autoload :OutputHelper, 'psychic/output_helper'
class Runner
+ autoload :MagicTaskFactory, 'psychic/runner/magic_task_factory'
autoload :BaseRunner, 'psychic/runner/base_runner'
+ autoload :CodeSample, 'psychic/runner/code_sample'
+ autoload :SampleFinder, 'psychic/runner/sample_finder'
autoload :SampleRunner, 'psychic/runner/sample_runner'
- autoload :HotRunner, 'psychic/runner/hot_runner'
- autoload :CompoundRunner, 'psychic/runner/compound_runner'
- autoload :ColdRunnerRegistry, 'psychic/runner/cold_runner_registry'
- class TaskNotImplementedError < NotImplementedError; end
- ColdRunnerRegistry.autoload_runners!
+ autoload :HotReadTaskFactory, 'psychic/runner/hot_read_task_factory'
+ autoload :TaskFactoryRegistry, 'psychic/runner/task_factory_registry'
+ class TaskNotImplementedError < NotImplementedError
+ def initialize(task_name)
+ super("#{self.class} cannot handle task #{task_name}")
+ end
+ end
+ TaskFactoryRegistry.autoload_task_factories!
include BaseRunner
include SampleRunner
- attr_reader :runners, :hot_runner, :cold_runners
+ attr_reader :runners, :hot_read_task_factory, :task_factories, :sample_factories
- def initialize(opts = { cwd: Dir.pwd })
+ def initialize(opts = { cwd: Dir.pwd }) # rubocop:disable Metrics/MethodLength
+ # TODO: Will reduce method length after further splitting Runner vs TaskFactory
fail 'cwd is required' unless opts[:cwd]
- opts[:cwd] = Pathname(opts[:cwd]).to_s # must be a string on windows...
- super
- @hot_runner = HotRunner.new(opts)
- @cold_runners = ColdRunnerRegistry.active_runners(opts)
- @runners = [@hot_runner, @cold_runners].flatten
- @known_tasks = @runners.map(&:known_tasks).uniq
+ # must be a string on windows...
+ opts[:cwd] = Pathname(opts[:cwd]).to_s
+ @opts = opts
+ init_attr(:cwd) { Dir.pwd }
+ init_hints
+ init_attr(:logger) { new_logger }
+ init_attr(:env) { ENV.to_hash }
+ init_attrs :cli, :interactive, :parameter_mode, :restore_mode, :dry_run
+ @shell_opts = select_shell_opts
+ @parameters = load_parameters(opts[:parameters])
+ # super
+ @hot_read_task_factory = HotReadTaskFactory.new(opts)
+ @sample_finder = SampleFinder.new(opts[:cwd], @hot_read_task_factory.hints['samples'])
+ @task_factories = TaskFactoryRegistry.active_task_factories(opts)
+ @runners = [@hot_read_task_factory, @task_factories].flatten
+ @known_tasks = @runners.flat_map(&:known_tasks).uniq
end
- def [](task_name)
- runner = runners.find { |r| r.command_for_task(task_name) }
+ def known_samples
+ @sample_finder.known_samples
+ end
+
+ def task_for(task_name)
+ runner = runners.find { |r| r.known_task?(task_name) }
return nil unless runner
- runner[task_name]
+ runner.task_for(task_name)
+ end
+
+ private
+
+ def init_attr(var)
+ var_name = "@#{var}"
+ var_value = @opts[var]
+ var_value = yield if var_value.nil? && block_given?
+ instance_variable_set(var_name, var_value)
+ end
+
+ def init_attrs(*vars)
+ vars.each do | var |
+ init_attr var
+ end
+ end
+
+ def init_hints
+ @hints = Psychic::Util.stringified_hash(@opts[:hints] || load_hints || {})
+ if @hints['options']
+ @opts.merge! Psychic::Util.symbolized_hash(@hints['options'])
+ end
+ end
+
+ def select_shell_opts
+ # Make sure to delete any option that isn't a MixLib::ShellOut option
+ @opts.select { |key, _| Psychic::Shell::AVAILABLE_OPTIONS.include? key }
+ end
+
+ def load_hints
+ hints_file = Dir["#{@cwd}/psychic.{yaml,yml}"].first
+ YAML.load(File.read(hints_file)) unless hints_file.nil?
+ end
+
+ def load_parameters(parameters)
+ if parameters.nil? || parameters.is_a?(String)
+ load_parameters_file(parameters)
+ else
+ parameters
+ end
+ end
+
+ def load_parameters_file(file = nil)
+ if file.nil?
+ file ||= File.expand_path(DEFAULT_PARAMS_FILE, cwd)
+ return {} unless File.exist? file
+ end
+ parameters = Psychic::Util.replace_tokens(File.read(file), @env)
+ YAML.load(parameters)
end
end
end