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