Skip to content

Commit

Permalink
Make ServerConfig mutable
Browse files Browse the repository at this point in the history
  • Loading branch information
v-yarotsky committed Mar 22, 2014
1 parent ec879c7 commit 559ebcd
Show file tree
Hide file tree
Showing 6 changed files with 10 additions and 35 deletions.
2 changes: 1 addition & 1 deletion lib/taketo/config_visitors/compiler_visitor.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def initialize
end

visit Server do |s|
s.config = @server_configs_stack.inject(ServerConfig.new, &:merge).merge(s.config)
s.config = @server_configs_stack.inject(ServerConfig.new, &:merge!).merge!(s.config)
s.path = make_node_path(s)
end

Expand Down
2 changes: 1 addition & 1 deletion lib/taketo/constructs/config.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class Config < BaseConstruct
def initialize(*args)
super(nil)
@shared_server_configs = {}
@default_server_config = @default_server_config.merge(
@default_server_config.merge!(
:ssh_command => :ssh,
:default_command => "bash"
)
Expand Down
2 changes: 1 addition & 1 deletion lib/taketo/constructs/environment.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ def default_server_config=(server_config)
end

def add_rails_env(server_config)
ServerConfig.new(:environment_variables => { :RAILS_ENV => name.to_s }).merge(server_config)
ServerConfig.new(:environment_variables => { :RAILS_ENV => name.to_s }).merge!(server_config)
end
private :add_rails_env
end
Expand Down
13 changes: 0 additions & 13 deletions lib/taketo/server_config.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

module Taketo

# TODO make it immutable maybe?
class ServerConfig
FIELDS = [:ssh_command, :host, :port, :username, :default_location, :default_command, :identity_file, :global_alias].freeze
attr_accessor *FIELDS
Expand All @@ -23,22 +22,13 @@ def global_alias=(value)
@global_alias = value.to_s
end

def merge(server_config)
dup.merge!(server_config)
end

def merge!(server_config)
config_hash = Hash[server_config.to_a]
FIELDS.each { |f| send("#{f}=", config_hash[f]) if config_hash.key?(f) }
add_environment_variables(config_hash[:environment_variables])
Array(config_hash[:commands]).each { |c| add_command(c) }
self
end
protected :merge!

def dup
Marshal.load(Marshal.dump(self))
end

def to_a
values = FIELDS.map { |f| send(f) }
Expand All @@ -56,9 +46,6 @@ def add_environment_variables(env_variables)
def include_shared_server_config(server_config)
merge!(server_config)
end

# overriding command?

end

end
24 changes: 6 additions & 18 deletions spec/lib/taketo/server_config_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,38 +17,32 @@ module Taketo
described_class.new
end

describe "#merge" do
describe "#merge!" do
context "with other ServerConfig" do
it "merges fields" do
merged = server_config.merge(described_class.new(:host => "3.4.5.6"))
merged = server_config.merge!(described_class.new(:host => "3.4.5.6"))
expect(merged.host).to eq("3.4.5.6")
expect(merged.port).to eq(1234) # didn't change
end

it "deeply merges environment_variables" do
merged = server_config.merge(described_class.new(:environment_variables => { :BAR => "bar" }))
merged = server_config.merge!(described_class.new(:environment_variables => { :BAR => "bar" }))
expect(merged.environment_variables).to eq(:SOME_API_SECRET => "sshhh. secret!", :BAR => "bar")
end
end

context "with Hash" do
it "merges fields" do
merged = server_config.merge(:host => "3.4.5.6")
merged = server_config.merge!(:host => "3.4.5.6")
expect(merged.host).to eq("3.4.5.6")
expect(merged.port).to eq(1234) # didn't change
end

it "deeply merges environment_variables" do
merged = server_config.merge(:environment_variables => { :BAR => "bar" })
merged = server_config.merge!(:environment_variables => { :BAR => "bar" })
expect(merged.environment_variables).to eq(:SOME_API_SECRET => "sshhh. secret!", :BAR => "bar")
end
end

it "does not alter source server config" do
merged = server_config.merge(:host => "2.3.4.5")
expect(merged.host).to eq("2.3.4.5")
expect(server_config.host).to eq("1.2.3.4")
end
end

specify "#global_alias= converts to string" do
Expand All @@ -58,7 +52,7 @@ module Taketo

describe "#ssh_command" do
it "returns symbol" do
merged = server_config.merge(:ssh_command => "mosh")
merged = server_config.merge!(:ssh_command => "mosh")
expect(merged.ssh_command).to eq(:mosh)
end

Expand All @@ -67,12 +61,6 @@ module Taketo
end
end

describe "#dup" do
it "duplicates fields" do
expect(server_config.dup.environment_variables).not_to equal(server_config.environment_variables)
end
end

describe "#add_command" do
it "does not add duplicate commands" do
server_command1 = ServerCommand.explicit_command("say_hi_1")
Expand Down
2 changes: 1 addition & 1 deletion spec/support/helpers/construct_spec_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ def server(name, options = {})
options = options.dup
s = Server.new(name)
s.path = options.delete(:path) || s.path
s.config = s.config.merge(options)
s.config.merge!(options)
yield s if block_given?
s
end
Expand Down

0 comments on commit 559ebcd

Please sign in to comment.