lib/psychic/cli.rb in psychic-runner-0.0.3 vs lib/psychic/cli.rb in psychic-runner-0.0.4
- old
+ new
@@ -1,37 +1,83 @@
+require 'English'
require 'thor'
require 'psychic/runner'
module Psychic
class CLI < Thor
- desc 'run_task <name>', 'Executes a custom task by name'
- def run_task(task_name, *args)
- result = runner.execute_task(task_name, *args)
+ BUILT_IN_TASKS = %w(bootstrap)
+
+ class << self
+ # Override Thor's start to strip extra_args from ARGV before it's processed
+ attr_accessor :extra_args
+
+ def start(given_args = ARGV, config = {})
+ if given_args && (split_pos = given_args.index('--'))
+ @extra_args = given_args.slice(split_pos + 1, given_args.length)
+ given_args = given_args.slice(0, split_pos)
+ end
+ super given_args, config
+ end
+ end
+
+ no_commands do
+ def extra_args
+ self.class.extra_args
+ end
+ end
+
+ desc 'task <name>', 'Executes any task by name'
+ def task(task_name)
+ result = runner.execute_task(task_name, *extra_args)
result.error!
say_status :success, task_name
rescue Psychic::Shell::ExecutionError => e
say_status :failed, task_name, :red
say e.execution_result if e.execution_result
end
- desc 'run_sample <name>', 'Executes a code sample'
- def run_sample(sample_name, *args)
- result = runner.run_sample(sample_name, *args)
- result.error!
- say_status :success, sample_name
- rescue Errno::ENOENT => e
- say_status :failed, "No code sample found for #{sample_name}", :red
- rescue Psychic::Shell::ExecutionError => e
- say_status :failed, "Executing sample #{sample_name}", :red
- say e.execution_result if e.execution_result
+ BUILT_IN_TASKS.each do |task_name|
+ desc task_name, "Executes the #{task_name} task"
+ define_method(task_name) do
+ task(task_name)
+ end
end
+ desc 'sample <name>', 'Executes a code sample'
+ # rubocop:disable Metrics/LineLength
+ method_option :interactive, desc: 'Prompt for parameters?', enum: %w(always missing), lazy_default: 'missing'
+ method_option :parameters, desc: 'YAML file containing key/value parameters. Default: psychic-parameters.yaml'
+ method_option :parameter_mode, desc: 'How should the parameters be passed?', enum: %w(tokens arguments env)
+ method_option :dry_run, desc: 'Do not execute - just show what command would be run', lazy_default: true
+ # rubocop:enable Metrics/LineLength
+ def sample(*sample_names)
+ sample_names.each do | sample_name |
+ say_status :executing, sample_name
+ begin
+ run_sample sample_name
+ rescue Errno::ENOENT
+ say_status :failed, "No code sample found for #{sample_name}", :red
+ # TODO: Fail on missing? Fail fast?
+ end
+ end
+ end
+
private
+ def run_sample(sample_name)
+ result = runner.run_sample(sample_name, *extra_args)
+ if options.dry_run
+ say_status :dry_run, sample_name
+ else
+ result.error!
+ say_status :success, sample_name
+ end
+ end
+
def runner
- # Psychic::Shell.shell = shell
- @runner ||= Psychic::Runner.new
+ runner_opts = Util.symbolized_hash(options).merge(
+ cwd: Dir.pwd, cli: shell, parameters: options.parameters
+ )
+ @runner ||= Psychic::Runner.new(runner_opts)
end
end
end
-
-# require 'psychic/commands/exec'