class TTY::Prompt::Suggestion

A class representing a suggestion out of possible choices

@api public

Constants

DEFAULT_INDENT
PLURAL_TEXT
SINGLE_TEXT

Attributes

indent[R]

Number of spaces

@api public

plural_text[R]

Text for multiple suggestions

@api public

single_text[R]

Text for a single suggestion

@api public

Public Class Methods

new(**options) click to toggle source

Initialize a Suggestion

@api public

# File lib/tty/prompt/suggestion.rb, line 35
def initialize(**options)
  @indent      = options.fetch(:indent) { DEFAULT_INDENT }
  @single_text = options.fetch(:single_text) { SINGLE_TEXT }
  @plural_text = options.fetch(:plural_text) { PLURAL_TEXT }
  @suggestions = []
  @comparator  = Distance.new
end

Public Instance Methods

suggest(message, possibilities) click to toggle source

Suggest matches out of possibile strings

@param [String] message

@param [Array] possibilities

@api public

# File lib/tty/prompt/suggestion.rb, line 50
def suggest(message, possibilities)
  distances        = measure_distances(message, possibilities)
  minimum_distance = distances.keys.min
  max_distance     = distances.keys.max

  if minimum_distance < max_distance
    @suggestions = distances[minimum_distance].sort
  end
  evaluate
end

Private Instance Methods

build_multiple_suggestions() click to toggle source

@api private

# File lib/tty/prompt/suggestion.rb, line 104
def build_multiple_suggestions
  plural_text + "\n" +
  @suggestions.map do |sugest|
    " " * indent + sugest
  end.join("\n")
end
build_single_suggestion() click to toggle source

@api private

# File lib/tty/prompt/suggestion.rb, line 99
def build_single_suggestion
  single_text + "\n" + (" " * indent) + @suggestions.first
end
evaluate() click to toggle source

Build up a suggestion string

@param [Array] suggestions

@return [String]

@api private

# File lib/tty/prompt/suggestion.rb, line 88
def evaluate
  return @suggestions if @suggestions.empty?

  if @suggestions.one?
    build_single_suggestion
  else
    build_multiple_suggestions
  end
end
measure_distances(message, possibilities) click to toggle source

Measure distances between messag and possibilities

@param [String] message

@param [Array] possibilities

@return [Hash]

@api private

# File lib/tty/prompt/suggestion.rb, line 72
def measure_distances(message, possibilities)
  distances = Hash.new { |hash, key| hash[key] = [] }

  possibilities.each do |possibility|
    distances[@comparator.distance(message, possibility)] << possibility
  end
  distances
end