Refactor and simplify CLI and Env:

* Do not modify Env logger from CLI;
* Add verbose attribute to Env;
* Implement Env#verbose?;
* Remove Env#log_level and Env#log_level=;
* Refactor related specs, improve some wording.
This commit is contained in:
Thibault Jouan 2014-05-25 17:44:24 +00:00
parent 0db2d90b72
commit 39427c35c3
4 changed files with 51 additions and 50 deletions

View File

@ -36,7 +36,7 @@ module Producer
@arguments = arguments.inject([]) do |m, e| @arguments = arguments.inject([]) do |m, e|
case e case e
when '-v' when '-v'
env.log_level = Logger::INFO env.verbose = true
when '-n' when '-n'
env.dry_run = true env.dry_run = true
else else

View File

@ -2,14 +2,14 @@ module Producer
module Core module Core
class Env class Env
attr_reader :input, :output, :registry, :logger attr_reader :input, :output, :registry, :logger
attr_accessor :target, :dry_run attr_accessor :target, :verbose, :dry_run
def initialize(input: $stdin, output: $stdout, remote: nil, registry: {}) def initialize(input: $stdin, output: $stdout, remote: nil, registry: {})
@verbose = @dry_run = false
@input = input @input = input
@output = output @output = output
@registry = registry
@remote = remote @remote = remote
@dry_run = false @registry = registry
end end
def remote def remote
@ -27,7 +27,7 @@ module Producer
def logger def logger
@logger ||= begin @logger ||= begin
logger = Logger.new(output) logger = Logger.new(output)
logger.level = Logger::ERROR logger.level = verbose? ? Logger::INFO : Logger::ERROR
logger.formatter = LoggerFormatter.new logger.formatter = LoggerFormatter.new
logger logger
end end
@ -37,12 +37,8 @@ module Producer
logger.info message logger.info message
end end
def log_level def verbose?
logger.level @verbose
end
def log_level=(level)
logger.level = level
end end
def dry_run? def dry_run?

View File

@ -108,15 +108,15 @@ module Producer::Core
end end
context 'verbose' do context 'verbose' do
it 'sets env logger level to INFO' do it 'enables env verbose mode' do
expect(cli.env.log_level).to eq Logger::INFO expect(cli.env).to be_verbose
end end
end end
context 'dry run' do context 'dry run' do
let(:options) { %w[-n] } let(:options) { %w[-n] }
it 'enables env dry run' do it 'enables env dry run mode' do
expect(cli.env).to be_dry_run expect(cli.env).to be_dry_run
end end
end end

View File

@ -3,10 +3,10 @@ require 'spec_helper'
module Producer::Core module Producer::Core
describe Env do describe Env do
let(:output) { StringIO.new } let(:output) { StringIO.new }
subject(:env) { Env.new(output: output) } subject(:env) { described_class.new(output: output) }
describe '#initialize' do describe '#initialize' do
it 'assigns $stdin as the default output' do it 'assigns $stdin as the default input' do
expect(env.input).to be $stdin expect(env.input).to be $stdin
end end
@ -18,12 +18,16 @@ module Producer::Core
expect(env.registry).to be_empty expect(env.registry).to be_empty
end end
it 'assigns verbose as false' do
expect(env.verbose).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
context 'when output is not given as argument' do context 'when output is not given as argument' do
subject(:env) { Env.new } subject(:env) { described_class.new }
it 'assigns $stdout as the default output' do it 'assigns $stdout as the default output' do
expect(env.output).to be $stdout expect(env.output).to be $stdout
@ -60,31 +64,12 @@ module Producer::Core
describe '#target' do describe '#target' do
let(:target) { double 'target' } let(:target) { double 'target' }
it 'returns the defined target' do it 'returns the assigned target' do
env.target = target env.target = target
expect(env.target).to be target expect(env.target).to be target
end end
end end
describe '#logger' do
it 'returns a logger' do
expect(env.logger).to be_a Logger
end
it 'uses env output' do
env.logger.error 'some message'
expect(output.string).to include 'some message'
end
it 'has a log level of ERROR' do
expect(env.log_level).to eq Logger::ERROR
end
it 'uses our formatter' do
expect(env.logger.formatter).to be_a LoggerFormatter
end
end
describe '#remote' do describe '#remote' do
it 'builds a Remote with the current target' do it 'builds a Remote with the current target' do
env.target = 'some_hostname.example' env.target = 'some_hostname.example'
@ -118,6 +103,33 @@ module Producer::Core
end end
end end
describe '#logger' do
it 'returns a logger' do
expect(env.logger).to be_a Logger
end
it 'uses env output' do
env.logger.error 'some message'
expect(output.string).to include 'some message'
end
it 'has a log level of ERROR' do
expect(env.logger.level).to eq Logger::ERROR
end
it 'uses our formatter' do
expect(env.logger.formatter).to be_a LoggerFormatter
end
context 'when verbose mode is enabled' do
before { env.verbose = true }
it 'has a log level of INFO' do
expect(env.logger.level).to eq Logger::INFO
end
end
end
describe '#log' do describe '#log' do
it 'logs an info message through the assigned logger' do it 'logs an info message through the assigned logger' do
expect(env.logger).to receive(:info).with 'message' expect(env.logger).to receive(:info).with 'message'
@ -125,24 +137,17 @@ module Producer::Core
end end
end end
describe '#log_level' do describe '#verbose?' do
it 'returns the logger level' do it 'returns true when verbose is enabled' do
expect(env.log_level).to eq env.logger.level env.verbose = true
end expect(env).to be_verbose
end
describe '#log_level=' do
it 'sets the logger level' do
env.log_level = Logger::DEBUG
expect(env.logger.level).to eq Logger::DEBUG
end end
end end
describe '#dry_run?' do describe '#dry_run?' do
before { env.dry_run = true }
it 'returns true when dry run is enabled' do it 'returns true when dry run is enabled' do
expect(env.dry_run?).to be true env.dry_run = true
expect(env).to be_dry_run
end end
end end
end end