fluke/devops-client/lib/devops-client/handler/helpers/input_utils.rb
Tim Lianov 03dc3d8d99 v3
2018-04-04 22:44:39 +03:00

155 lines
3.9 KiB
Ruby

require "devops-client/handler/helpers/validators"
module InputUtils
def question str
return true if self.options[:no_ask]
if block_given?
yield
end
res = false
#system("stty raw -echo")
begin
print "#{str}? (y/n): "
s = STDIN.gets.strip
if s == "y"
res = true
elsif s == "n"
res == false
else
raise ArgumentError.new
end
rescue ArgumentError
retry
end
#print "#{s}\n\r"
#system("stty -raw echo")
res
end
def input_run_list
begin
run_list = get_comma_separated_list(I18n.t("input.run_list.label") + ": ")
raise ArgumentError.new(I18n.t("input.run_list.invalid", list: run_list.join(","))) unless Validators.validate_run_list(run_list)
run_list
rescue ArgumentError => e
puts e.message
retry
end
end
def choose_image_cmd images, t=nil
abort(I18n.t("handler.error.list.empty", :name => "Image")) if images.empty?
if options[:image_id].nil?
images[ choose_number_from_list(I18n.t("headers.image"), images, t) ]
else
i = images.detect { |i| i["name"] == options[:image_id]}
abort("No such image") if i.nil?
return i
end
end
def get_comma_separated_list msg
print msg
STDIN.gets.strip.split(",").map{|e| e.strip}
end
def ask_for_file_and_get_contents(ask_msg, error_message=nil)
filepath = enter_parameter(msg)
get_file_contents(filepath, error_message)
end
def get_file_contents(filepath, error_message=nil)
begin
File.read(filepath)
rescue Errno::ENOENT => e
abort(error_message || 'Wrong file path')
end
end
def enter_parameter msg
str = enter_parameter_or_empty(msg)
raise ArgumentError.new if str.empty?
str
rescue ArgumentError
retry
end
def enter_parameter_or_empty msg
print msg
return STDIN.gets.strip
end
def enter_hash(msg, more_question = 'Add one more key?')
puts(msg)
hash = {}
while question(more_question)
hash[enter_parameter('Key: ')] = enter_parameter('Value: ')
end
hash
end
def choose_number_from_list title, list, table=nil, default=nil
i = 0
if table.nil?
puts I18n.t("handler.message.choose", :name => title.downcase) + "\n" + list.map{|p| i += 1; "#{i}. #{p}"}.join("\n")
else
puts table
end
begin
print "#{I18n.t("handler.message.choose", :name => title.downcase)}: "
buf = STDIN.gets.strip
if buf.empty? and !default.nil?
return default
end
i = Integer buf
rescue ArgumentError
retry
end until i > 0 and i <= list.size
return i - 1
end
def choose_item_from_list(title, items)
items[ choose_number_from_list(title, items) ]
end
def choose_indexes_from_list title, list, table=nil, default=nil, defindex=nil
abort(I18n.t("handler.error.list.empty", :name => title)) if list.empty?
ar = nil
if table.nil?
i = 0
print I18n.t("handler.message.choose", :name => title.downcase) + "\n#{list.map{|p| i += 1; "#{i}. #{p}"}.join("\n")}\n"
else
puts table
end
msg = if default.nil?
I18n.t("handler.message.choose_list", :name => title)
else
I18n.t("handler.message.choose_list_default", :name => title, :default => default)
end
begin
ar = get_comma_separated_list(msg + ": ").map do |g|
n = Integer g.strip
raise ArgumentError.new(I18n.t("handler.error.number.invalid")) if n < 1 or n > list.size
n
end
if ar.empty? and !default.nil?
return [ defindex ]
end
rescue ArgumentError
retry
end
ar.map{|i| i - 1}
end
def select_item_from_table(title, items, table)
items[ choose_number_from_list(title, items, table) ]
end
def select_items_from_table(title, items, table, options={})
indexes = choose_indexes_from_list(title, items, table, options[:default], options[:default_index])
items.values_at(*indexes)
end
end