require 'sfn' require 'pathname' module Sfn module Utils # Helper methods for path selection module PathSelector # Humanize the base name of path # # @param path [String] # @return [String] def humanize_path_basename(path) File.basename(path).sub( File.extname(path), '' ).split(/[-_]/).map(&:capitalize).join(' ') end # Prompt user for file selection # # @param directory [String] path to directory # @param opts [Hash] options # @option opts [Array] :ignore_directories directory names # @option opts [String] :directories_name title for directories # @option opts [String] :files_name title for files # @option opts [String] :filter_prefix only return results matching filter # @return [String] file path def prompt_for_file(directory, opts={}) file_list = Dir.glob(File.join(directory, '**', '**', '*')).find_all do |file| File.file?(file) end if(opts[:filter_prefix]) file_list = file_list.find_all do |file| file.start_with?(options[:filter_prefix]) end end directories = file_list.map do |file| File.dirname(file) end.uniq files = file_list.find_all do |path| path.sub(directory, '').split('/').size == 2 end if(opts[:ignore_directories]) directories.delete_if do |dir| opts[:ignore_directories].include?(File.basename(dir)) end end if(directories.empty? && files.empty?) ui.fatal 'No formation paths discoverable!' else output = ['Please select an entry'] output << '(or directory to list):' unless directories.empty? ui.info output.join(' ') output.clear idx = 1 valid = {} unless(directories.empty?) output << ui.color("#{opts.fetch(:directories_name, 'Directories')}:", :bold) directories.each do |dir| valid[idx] = {:path => dir, :type => :directory} output << [idx, humanize_path_basename(dir)] idx += 1 end end unless(files.empty?) output << ui.color("#{opts.fetch(:files_name, 'Files')}:", :bold) files.each do |file| valid[idx] = {:path => file, :type => :file} output << [idx, humanize_path_basename(file)] idx += 1 end end max = idx.to_s.length output.map! do |o| if(o.is_a?(Array)) " #{o.first}.#{' ' * (max - o.first.to_s.length)} #{o.last}" else o end end ui.info "#{output.join("\n")}\n" response = ui.ask_question('Enter selection: ').to_i unless(valid[response]) ui.fatal 'How about using a real value' exit 1 else entry = valid[response.to_i] if(entry[:type] == :directory) prompt_for_file(entry[:path], opts) elsif Pathname(entry[:path]).absolute? entry[:path] else "/#{entry[:path]}" end end end end end end end