class DTK::Client::InteractiveWizard
Public Class Methods
interactive_user_input(wizard_dsl, recursion_call = false)
click to toggle source
# File lib/client/util/interactive_wizard.rb, line 66 def interactive_user_input(wizard_dsl, recursion_call = false) results = {} wizard_dsl = [wizard_dsl].flatten begin wizard_dsl.each do |meta_input| input_name = meta_input.keys.first display_name = input_name.to_s.gsub(/_/,' ').capitalize metadata = meta_input.values.first # default values output = display_name validation = metadata[:validation] is_password = false is_required = metadata[:requried] case metadata[:type] when nil when :email validation = /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i when :question output = "#{metadata[:question]}" validation = metadata[:validation] when :password is_password = true is_required = true when :repeat_password is_password = true is_required = true validation = /^#{results[:password]}$/ when :selection options = "" display_field = metadata[:display_field] metadata[:options].each_with_index do |o,i| if display_field options += "\t#{i+1}. #{o[display_field]}\n" else options += "\t#{i+1}. #{o}\n" end end options += OsUtil.colorize("\t0. Skip\n", :yellow) if metadata[:skip_option] output = "Select '#{display_name}': \n\n #{options} \n " validation_range_start = metadata[:skip_option] ? 0 : 1 validation = (validation_range_start..metadata[:options].size).to_a when :group # recursion call to populate second level of hash params puts " Enter '#{display_name}': " results[input_name] = self.interactive_user_input(metadata[:options], true) next end input = text_input(output, is_required, validation, is_password) if metadata[:required_options] && !metadata[:required_options].include?(input) # case where we have to give explicit permission, if answer is not affirmative # we terminate rest of the wizard OsUtil.print(" #{metadata[:explanation]}", :red) return nil end # post processing if metadata[:type] == :selection input = input.to_i == 0 ? nil : metadata[:options][input.to_i - 1] end results[input_name] = input end return results rescue Interrupt => e puts raise DtkValidationError, "Exiting the wizard ..." end end
resolve_missing_params(param_list, additional_message = nil)
click to toggle source
# File lib/client/util/interactive_wizard.rb, line 23 def resolve_missing_params(param_list, additional_message = nil) begin user_provided_params, checkup_hash = [], {} OsUtil.print("\nPlease fill in missing data.") param_list.each do |param_info| description = if param_info['display_name'] =~ Regexp.new(param_info['description']) param_info['display_name'] else "#{param_info['display_name']} (#{param_info['description']})" end datatype_info = (param_info['datatype'] ? OsUtil.colorize(" [#{param_info['datatype'].upcase}]", :yellow) : '') string_identifier = OsUtil.colorize(description, :green) + datatype_info puts "Please enter #{string_identifier}:" while line = Readline.readline(": ", true) id = param_info['id'] user_provided_params << {:id => id, :value => line, :display_name => param_info['display_name']} checkup_hash[id] = {:value => line, :description => description} break end end # pp print for provided parameters pretty_print_provided_user_info(checkup_hash) # make sure this is satisfactory while line = Readline.readline("Is provided information ok? (yes|no) ", true) # start all over again return resolve_missing_params(param_list) if 'no'.eql? line # continue with the code break if 'yes'.eql? line end rescue Interrupt => e raise Error::Usage, "You have decided to skip correction wizard.#{additional_message}" end return user_provided_params end
text_input(output, is_required = false, validation_regex = nil, is_password = false)
click to toggle source
# File lib/client/util/interactive_wizard.rb, line 140 def text_input(output, is_required = false, validation_regex = nil, is_password = false) while line = ask("#{output}: ") { |q| q.echo = !is_password } if is_required && line.strip.empty? puts OsUtil.colorize("Field '#{output}' is required field. ", :red) next end if validation_regex && !validation_regex.match(line) puts OsUtil.colorize("Input is not valid, please enter it again. ", :red) next end return line end end
Private Class Methods
pretty_print_provided_user_info(user_information)
click to toggle source
# File lib/client/util/interactive_wizard.rb, line 158 def pretty_print_provided_user_info(user_information) OsUtil.print('--------------------------------- DATA ---------------------------------') user_information.each do |key,info| description = info[:description] value = info[:value] printf "%48s : %s\n", OsUtil.colorize(description, :green), OsUtil.colorize(value, :yellow) end OsUtil.print('------------------------------------------------------------------------') end