Implement CLI debug option

This commit is contained in:
Thibault Jouan 2014-10-12 18:26:48 +00:00
parent 25d03d4322
commit e22d0039e1
8 changed files with 64 additions and 8 deletions

View File

@ -0,0 +1,11 @@
Feature: CLI debug option
Background:
Given a recipe with:
"""
task(:trigger_error) { fail 'some error' }
"""
Scenario: reports recipe errors
When I execute the recipe with option -d
Then the output must match /\ARuntimeError:.*\n\ncause:\nRuntimeError:/

View File

@ -10,6 +10,7 @@ Feature: CLI usage
options: options:
-v, --verbose enable verbose mode -v, --verbose enable verbose mode
-d, --debug enable debug mode
-n, --dry-run enable dry run mode -n, --dry-run enable dry run mode
-t, --target HOST target host -t, --target HOST target host
""" """

View File

@ -24,6 +24,10 @@ When /^I successfully execute the recipe on remote target$/ do
assert_exit_status 0 assert_exit_status 0
end end
When /^I execute the recipe with option (-.+)$/ do |option|
run_simple "producer #{option} recipe.rb", false
end
When /^I successfully execute the recipe with option (-.+)$/ do |option| When /^I successfully execute the recipe with option (-.+)$/ do |option|
run_simple "producer #{option} recipe.rb", false run_simple "producer #{option} recipe.rb", false
assert_exit_status 0 assert_exit_status 0

View File

@ -18,7 +18,10 @@ module Producer
stderr.puts e.message stderr.puts e.message
exit EX_USAGE exit EX_USAGE
rescue Exception => e rescue Exception => e
ef = ErrorFormatter.new(force_cause: [RecipeEvaluationError]) ef = ErrorFormatter.new(
debug: cli.env.debug?,
force_cause: [RecipeEvaluationError]
)
stderr.puts ef.format e stderr.puts ef.format e
exit EX_SOFTWARE exit EX_SOFTWARE
end end
@ -66,6 +69,10 @@ module Producer
env.verbose = true env.verbose = true
end end
opts.on '-d', '--debug', 'enable debug mode' do |e|
env.debug = true
end
opts.on '-n', '--dry-run', 'enable dry run mode' do |e| opts.on '-n', '--dry-run', 'enable dry run mode' do |e|
env.dry_run = true env.dry_run = true
end end

View File

@ -2,10 +2,10 @@ module Producer
module Core module Core
class Env class Env
attr_reader :input, :output, :error_output, :registry, :logger attr_reader :input, :output, :error_output, :registry, :logger
attr_accessor :target, :verbose, :dry_run attr_accessor :target, :verbose, :debug, :dry_run
def initialize(input: $stdin, output: $stdout, error_output: $stderr, remote: nil, registry: {}) def initialize(input: $stdin, output: $stdout, error_output: $stderr, remote: nil, registry: {})
@verbose = @dry_run = false @verbose = @debug = @dry_run = false
@input = input @input = input
@output = output @output = output
@error_output = error_output @error_output = error_output
@ -45,6 +45,10 @@ module Producer
@verbose @verbose
end end
def debug?
@debug
end
def dry_run? def dry_run?
@dry_run @dry_run
end end

View File

@ -112,6 +112,15 @@ module Producer::Core
end end
end end
context 'with debug option' do
let(:options) { %w[-d] }
it 'assigns the given target to the env' do
cli.parse_arguments!
expect(cli.env).to be_debug
end
end
context 'with combined options' do context 'with combined options' do
let(:options) { %w[-vn]} let(:options) { %w[-vn]}

View File

@ -26,6 +26,10 @@ module Producer::Core
expect(env.verbose).to be false expect(env.verbose).to be false
end end
it 'assigns debug as false' do
expect(env.debug).to be false
end
it 'assigns dry run as false' do it 'assigns dry run as false' do
expect(env.dry_run).to be false expect(env.dry_run).to be false
end end
@ -168,6 +172,13 @@ module Producer::Core
end end
end end
describe '#debug?' do
it 'returns true when debug is enabled' do
env.debug = true
expect(env).to be_debug
end
end
describe '#dry_run?' do describe '#dry_run?' do
it 'returns true when dry run is enabled' do it 'returns true when dry run is enabled' do
env.dry_run = true env.dry_run = true

View File

@ -23,14 +23,15 @@ module Producer
end end
describe '#format' do describe '#format' do
let(:message) { 'some exception' } def exception
let(:exception) { Exception.new(message) } begin fail 'original exception' rescue fail 'some exception' end
rescue
before { exception.set_backtrace %w[back trace] } $!.tap { |o| o.set_backtrace %w[back trace] }
end
it 'formats the message' do it 'formats the message' do
expect(formatter.format exception) expect(formatter.format exception)
.to match /^Exception: some exception$/ .to match /^RuntimeError: some exception$/
end end
it 'indents the backtrace' do it 'indents the backtrace' do
@ -43,6 +44,14 @@ module Producer
it 'excludes producer code from the backtrace' do it 'excludes producer code from the backtrace' do
expect(formatter.format exception).not_to include 'producer-core' expect(formatter.format exception).not_to include 'producer-core'
end end
context 'when debug is enabled' do
let(:debug) { true }
it 'does not exclude producer code from the backtrace' do
expect(formatter.format exception).to include 'producer-core'
end
end
end end
end end
end end