class Vman::Menu

Public Class Methods

new(config) click to toggle source
# File lib/vman/menu.rb, line 10
def initialize(config)
  @prompt = TTY::Prompt.new
  @s3     = S3.new(config['bucket_uri'])
end

Public Instance Methods

delete() click to toggle source
# File lib/vman/menu.rb, line 79
def delete
  obj_versions = get_versions

  @prompt.select("Select a version to delete") do |prompt|
    obj_versions.each do |v|
      prompt.choice "#{v.id} (#{v.get.last_modified})", -> { prompt_delete(v) }
    end
  end
end
list() click to toggle source
# File lib/vman/menu.rb, line 70
def list
  objects = @s3.list

  @prompt.ok("All current objects in bucket:")
  objects.each_with_index do |obj, i|
    @prompt.say("#{i+1}. #{obj.key}")
  end
end
retrieve() click to toggle source
# File lib/vman/menu.rb, line 26
def retrieve
  obj_versions = get_versions

  @prompt.select("Select a version to retrieve") do |prompt|
    obj_versions.each do |v|
      prompt.choice "#{v.id} (#{v.get.last_modified})", -> {
        name = v.object_key + '_' + v.id
        download(v, name)
        @prompt.ok("#{name} downloaded to working directory")
      }
    end
  end
end
show() click to toggle source
# File lib/vman/menu.rb, line 15
def show
  @prompt.select('Select an action') do |p|
    p.choice "Retrieve an object", -> { retrieve }
    p.choice "Store an object", -> { store }
    p.choice "List all versions of an object", -> { versions }
    p.choice "Show current version of an object", -> { version }
    p.choice "List all objects", -> { list }
    p.choice "Delete a version of an object", -> { delete }
  end
end
store() click to toggle source
# File lib/vman/menu.rb, line 40
def store
  file        = prompt_file
  key         = File.basename(file)
  stored_file = @s3.store(file, key)

  if stored_file && stored_file.class == Aws::S3::Object
    @prompt.ok("Successfully uploaded \"#{key}\" to S3")
  else
    @prompt.error("Error uploading \"#{key}\" to S3")
  end
end
version() click to toggle source
# File lib/vman/menu.rb, line 63
def version
  obj_version = get_version

  @prompt.ok("Current version for #{obj_version.object_key}:")
  @prompt.say("#{obj_version.get.version_id} (#{obj_version.get.last_modified})")
end
versions() click to toggle source
# File lib/vman/menu.rb, line 52
def versions
  obj_versions = get_versions

  @prompt.ok("Total number of versions: #{obj_versions.count}")
  obj_versions.each do |v|
    msg    = "  " + v.id + " (#{v.last_modified})"
    msg[0] = "•" if v.is_latest
    @prompt.say("#{msg}")
  end
end

Private Instance Methods

download(object, name) click to toggle source
# File lib/vman/menu.rb, line 104
def download(object, name)
  object.get({ response_target: File.open(name, 'w') })
end
get!() click to toggle source
# File lib/vman/menu.rb, line 134
def get!
  key  = @prompt.ask("Enter object key to retrieve: ")
  objs = @s3.find(key)

  if objs.count == 0
    @prompt.warn("No object found under key '#{key}'. Did you mispell it?")
    return get!
  elsif objs.count == 1
    objs.first
  else
    @prompt.warn("Found multiple objects")
    selection = @prompt.select("Which one do you want") do |prompt|
      objs.each { |obj| prompt.choice "#{obj.key}", -> { obj } }
    end
  end
end
get_version() click to toggle source
# File lib/vman/menu.rb, line 93
def get_version
  obj  = get!
  v_id = obj.get.version_id
  obj.version(v_id)
end
get_versions() click to toggle source
# File lib/vman/menu.rb, line 99
def get_versions
  obj       = get!
  _versions = @s3.versions(obj.key)
end
prompt_delete(v) click to toggle source
# File lib/vman/menu.rb, line 120
def prompt_delete(v)
  @prompt.warn("WARNING: This will remove the selected version from the S3 bucket!")
  @prompt.warn("Ensure you are deleting the correct version of this object:\n\n  #{v.object_key} - #{v.id} - #{v.get.last_modified}\n")

  if @prompt.yes?("Are you sure you want to delete this version?")
    v.delete({ version_id: v.id })
    @prompt.ok("Version id \"#{v.id}\" for object \"#{v.object_key}\" successfully deleted")
    return true
  end

  @prompt.warn("No version deleted. Exiting.")
  false
end
prompt_file() click to toggle source
# File lib/vman/menu.rb, line 108
def prompt_file
  path     = Readline.readline('Enter path to local file for upload: ')
  abs_path = File.expand_path(path).strip

  if !File.exist?(abs_path)
    @prompt.warn("Could not find \"#{abs_path}\". Did you mispell it?")
    return store
  end

  abs_path
end