Skip to content
This repository has been archived by the owner on Dec 24, 2019. It is now read-only.

Commit

Permalink
Remove the logic from Babushka::Vars, converting it to a module for t…
Browse files Browse the repository at this point in the history
…he #removed! calls.
  • Loading branch information
benhoskings committed Jan 28, 2013
1 parent 677483d commit e601497
Show file tree
Hide file tree
Showing 3 changed files with 2 additions and 161 deletions.
3 changes: 1 addition & 2 deletions lib/babushka/task.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ class Task
include PathHelpers
include ShellHelpers

attr_reader :opts, :vars, :caches, :persistent_log
attr_reader :opts, :caches, :persistent_log
attr_accessor :reportable

def initialize
Expand All @@ -15,7 +15,6 @@ def initialize

def process dep_names, with_vars
raise "A task is already running." if running?
@vars = Vars.new
@running = true
cleanup_saved_vars # TODO: remove after August '13 or so.
Base.in_thread { RunReporter.post_reports }
Expand Down
100 changes: 1 addition & 99 deletions lib/babushka/vars.rb
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
module Babushka
class Vars
include LogHelpers

attr_reader :vars, :saved_vars

module Vars
module Helpers
def set(key, value)
removed! :instead => 'an argument for a dep parameter', :example => "requires 'some dep'.with(:#{key} => '#{value}')"
Expand Down Expand Up @@ -48,99 +44,5 @@ def print_var_removal_for method_name, var_name, opts
end
end

def initialize
@vars = Hashish.hash
@saved_vars = Hashish.hash
end

def set key, value
vars[key.to_s][:value] = value
end

def merge key, value
set key, ((vars[key.to_s] || {})[:value] || {}).merge(value)
end

def var name, opts = {}
define_var name, opts
if vars[name.to_s].has_key? :value
if vars[name.to_s][:value].respond_to? :call
vars[name.to_s][:value].call
else
vars[name.to_s][:value]
end
elsif opts[:ask] != false
ask_for_var name.to_s, opts
else
default_for name
end
end

def define_var name, opts = {}
vars[name.to_s].update opts.slice(:default, :type, :message, :choices, :choice_descriptions)
vars[name.to_s][:choices] ||= vars[name.to_s][:choice_descriptions].keys unless vars[name.to_s][:choice_descriptions].nil?
vars[name.to_s]
end

def for_save
vars.dup.inject(saved_vars.dup) {|vars_to_save,(var,_)|
vars_to_save[var].update vars[var]
save_referenced_default_for(var, vars_to_save) if vars[var][:default].is_a?(Symbol)
vars_to_save
}.reject_r {|var,data|
![String, Symbol, Hash, Numeric, TrueClass, FalseClass].include?(data.class) ||
var.to_s['password']
}
end

def default_for key
if vars[key.to_s][:default].respond_to? :call
# If the default is a proc, re-evaluate it every time.
instance_eval { vars[key.to_s][:default].call }

elsif saved_vars[key.to_s].has_key? :value
# Otherwise, if there's a saved value, use that.
saved_vars[key.to_s][:value]

# Symbol defaults are references to other vars.
elsif vars[key.to_s][:default].is_a? Symbol
# Look up the current value of the referenced var.
referenced_val = var vars[key.to_s][:default], :ask => false
# Use the corresponding saved value if there is one, otherwise use the reference.
(saved_vars[key.to_s][:values] ||= {})[referenced_val] || referenced_val

else
# Otherwise, use the default.
vars[key.to_s][:default]
end
end


private

def ask_for_var key, opts
set key, Prompt.send("get_#{vars[key][:type] || 'value'}",
message_for(key),
vars[key].slice(:choices, :choice_descriptions).merge(
opts
).merge(
:default => default_for(key),
:dynamic => vars[key][:default].respond_to?(:call)
)
)
end

def message_for key
printable_key = key.to_s.gsub '_', ' '
vars[key][:message] || printable_key
end

def save_referenced_default_for var, vars_to_save
vars_to_save[var][:values] ||= {}
vars_to_save[var][:values][ # set the saved value of this var
vars[vars[var][:default].to_s][:value] # for this var's current default reference
] = vars_to_save[var].delete(:value) # to the referenced var's value
end

end
end
60 changes: 0 additions & 60 deletions spec/babushka/vars_spec.rb

This file was deleted.

0 comments on commit e601497

Please sign in to comment.