class Sfn::Command::Parameters
Parameters
command
Constants
- NEW_ITEM_DEFAULT
Default contents for new item creation
Public Instance Methods
execute!()
click to toggle source
Execute parameters action request
# File lib/sfn-parameters/command.rb, line 19 def execute! action, item = arguments[0].to_s, arguments[1].to_s ui.info "Running parameters action #{ui.color(action.to_s, :bold)}" if respond_to?("run_action_#{action}") send("run_action_#{action}", item) else allowed_actions = public_methods.grep(/^run_action/).sort.map do |item| item.to_s.sub("run_action_", "") end raise ArgumentError.new "Unsupported action received `#{action}`. " \ "Allowed: #{allowed_actions.join(", ")}" end end
new_item(item)
click to toggle source
Expand path for new item if required
@param item [String] @return [String]
# File lib/sfn-parameters/command.rb, line 136 def new_item(item) unless item.include?(File::SEPARATOR) prefixes = [ config.get(:sfn_parameters, :directory), "infrastructure", "stacks", ].compact prefix = prefixes.find_all do |dir| File.directory?(dir) end if prefix.size > 1 raise ArgumentError.new "Unable to auto-determine directory for item! Multiple directories found. " \ "(detected: #{prefix.join(", ")})" elsif prefix.empty? raise ArgumentError.new "No existing parameter directories found. Please create required directory. " \ "(checked: #{prefixes.join(", ")})" end File.join(prefix.first, "#{item}.json") end end
run_action_create(item)
click to toggle source
Perform create on item
@param item [String] item to lock
# File lib/sfn-parameters/command.rb, line 88 def run_action_create(item) unless ENV["EDITOR"] raise ArgumentError.new "$EDITOR must be set for create/edit commands!" end begin item = validate_item(item) rescue ArgumentError new_item = true item = new_item(item) end FileUtils.mkdir_p(File.dirname(item)) tmp = Bogo::EphemeralFile.new(["sfn-parameters", ".json"]) content = new_item ? NEW_ITEM_DEFAULT : load_json(File.read(item)).to_smash if content[:sfn_parameters_lock] ui.print ui.color(" *", :bold) ui.print " Unlocking #{ui.color(item, :bold)} for edit... " content = unlock_content(content) ui.puts ui.color("unlocked", :green) end lock_enabled = content.delete(:sfn_lock_enabled) || new_item tmp.write(format_json(content)) tmp.flush system("#{ENV["EDITOR"]} #{tmp.path}") content = load_json(File.read(tmp.path)).to_smash ui.print ui.color(" *", :bold) if lock_enabled ui.print " Locking #{ui.color(item, :bold)} for storage... " content = lock_content(content) ui.puts ui.color("locked", :blue) else ui.puts " Storing #{ui.color(item, :bold)} for storage... #{ui.color("unlocked", :yellow)}" end File.write(item, format_json(content)) tmp.close end
run_action_edit(item)
click to toggle source
Perform edit on item
@param item [String] item to lock
# File lib/sfn-parameters/command.rb, line 127 def run_action_edit(item) validate_item(item) run_action_create(item) end
run_action_lock(item)
click to toggle source
Perform locking on item
@param item [String] item to lock
# File lib/sfn-parameters/command.rb, line 36 def run_action_lock(item) item = validate_item(item) ui.print " Locking #{ui.color(item, :bold)}... " content = load_json(File.read(item)).to_smash if content[:sfn_parameters_lock] ui.puts ui.color("no-op", :yellow) ui.warn "Item is already locked! (#{item})" else thing = lock_content(content) val = format_json(thing) File.write(item, val) ui.puts ui.color("locked", :blue) end end
run_action_show(item)
click to toggle source
Perform show on item
@param item [String] item to lock
# File lib/sfn-parameters/command.rb, line 72 def run_action_show(item) item = validate_item(item) content = Bogo::Config.new(item).data if content[:sfn_parameters_lock] ui.print ui.color(" *", :bold) ui.print " Unlocking #{ui.color(item, :bold)} for display... " content = unlock_content(content) content.delete(:sfn_lock_enabled) ui.puts ui.color("unlocked", :green) end ui.puts format_json(content) end
run_action_unlock(item)
click to toggle source
Perform unlocking on item
@param item [String] item to lock
# File lib/sfn-parameters/command.rb, line 54 def run_action_unlock(item) item = validate_item(item) ui.print " Unlocking #{ui.color(item, :bold)}... " content = load_json(File.read(item)).to_smash if content[:sfn_parameters_lock] content = unlock_content(content) content.delete(:sfn_lock_enabled) File.write(item, format_json(content)) ui.puts ui.color("unlocked", :green) else ui.puts ui.color("no-op", :yellow) ui.warn "Item is already unlocked! (#{item})" end end
validate_item(item)
click to toggle source
Validate existence of requested item. Expand path if only name given
@param item [String] @return [String]
# File lib/sfn-parameters/command.rb, line 162 def validate_item(item) if item.to_s.empty? raise NameError.new "Item name is required. No item name provided." end items = [item] ["", ".json", ".rb", ".xml", ".yaml", ".yml"].each do |extension| items += [ File.join( config.fetch( :sfn_parameters, :directory, "stacks" ), "#{item}#{extension}" ), File.join( config.fetch( :sfn_parameters, :directory, "infrastructure" ), "#{item}#{extension}" ), ] end items = items.map { |item| File.expand_path(item) }.uniq valid = items.find_all do |file| File.exist?(file) end if valid.empty? raise ArgumentError.new "Failed to locate item `#{item}`!" elsif valid.size > 1 raise ArgumentError.new "Multiple matches detected for item `#{item}`. " \ "(Matches: #{valid.join(", ")})" else valid.first end end