Simplify Remote::Environment with factory method:

* Implement .new_from_string factory class method;
* Rename private method #parse_from_string as class method
  .string_to_hash;
* Remove argument kind detection logic in constructor.
This commit is contained in:
Thibault Jouan 2013-12-21 03:08:01 +00:00
parent 4885483d75
commit 012c776880
4 changed files with 34 additions and 25 deletions

View File

@ -45,7 +45,7 @@ module Producer
end
def environment
Environment.new(execute 'env')
Environment.new_from_string(execute 'env')
end
end
end

View File

@ -2,24 +2,23 @@ module Producer
module Core
class Remote
class Environment
class << self
def string_to_hash(str)
Hash[str.each_line.map { |l| l.chomp.split '=', 2 }]
end
def new_from_string(str)
new string_to_hash str
end
end
require 'forwardable'
extend Forwardable
def_delegator :@variables, :has_key?
def initialize(variables)
case variables
when String
@variables = parse_from_string variables
else
@variables = variables
end
end
private
def parse_from_string(str)
Hash[str.each_line.map { |l| l.chomp.split '=', 2 }]
@variables = variables
end
end
end

View File

@ -7,19 +7,29 @@ module Producer::Core
let(:argument) { variables }
subject(:environment) { Remote::Environment.new(argument) }
describe '#initialize' do
context 'when a hash is given' do
it 'assigns the key/value pairs' do
expect(environment.instance_eval { @variables }).to eq variables
end
describe '.string_to_hash' do
it 'converts key=value pairs separated by new lines to a hash' do
expect(Remote::Environment.string_to_hash(string))
.to eq variables
end
end
describe '.new_from_string' do
it 'builds a new instance after converting from string' do
expect(Remote::Environment).to receive(:new).with(variables)
Remote::Environment.new_from_string(string)
end
context 'when a string is given' do
let(:argument) { string }
it 'returns the instance' do
environment = double 'environment'
allow(Remote::Environment).to receive(:new) { environment }
expect(Remote::Environment.new_from_string(string)).to be environment
end
end
it 'assigns the key/value pairs' do
expect(environment.instance_eval { @variables }).to eq variables
end
describe '#initialize' do
it 'assigns the key/value pairs' do
expect(environment.instance_eval { @variables }).to eq variables
end
end

View File

@ -128,13 +128,13 @@ module Producer::Core
end
it 'builds a remote environment with the result of `env` command' do
expect(Remote::Environment).to receive(:new).with(output)
expect(Remote::Environment).to receive(:new_from_string).with(output)
remote.environment
end
it 'returns the environment' do
environment = double 'environment'
allow(Remote::Environment).to receive(:new) { environment }
allow(Remote::Environment).to receive(:new_from_string) { environment }
expect(remote.environment).to be environment
end
end