Class: Questions::Answers

Inherits:
Array
  • Object
show all
Defined in:
lib/questions/answers.rb

Overview

Answers manages many answers. Each item is a Answer object in this collection.

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ Answers

Instantiates a new Answers object.

Each parameter will be send to #<<.

Examples:

parameter as Answer

answers = Answers.new Answer.new(:abort)
answers.first.instruction #=> :abort
answers.first.active #=> true

parameter as Symbol

answers = Answers.new :abort
answers.first.instruction #=> :abort
answers.first.active #=> true

parameter as Array

answers = Answers.new [:abort, Answer.new(:overwrite)]
answers.first.instruction #=> :abort
answers.first.active #=> true
answers.last.instruction #=> :overwrite
answers.last.active #=> true

parameter as Hash

answers = Answers.new({abort: true, overwrite: false, "non-symbol" => "ignored"})
answers.size #=> 2
answers.first.instruction #=> :abort
answers.first.active #=> true
answers.last.instruction #=> :overwrite
answers.last.active #=> false

Parameters:

  • args (Answer, Symbol, Array, Hash)

    Initial answers



36
37
38
# File 'lib/questions/answers.rb', line 36

def initialize(*args)
  args.each { |arg| self << arg }
end

Instance Method Details

#<<(arg) ⇒ Answers

Adds answer. Answer can be an instance of Questions::Answer, Symbol, a Hash or an Array. Chaining is supported.

Examples:

parameter as Answer

answers = Answers.new
answers << Answer.new(:abort)
answers.first.instruction #=> :abort
answers.first.active #=> true

parameter as Symbol

answers = Answers.new
answers << :abort << :overwrite
answers.first.instruction #=> :abort
answers.first.active #=> true
answers.last.instruction #=> :overwrite
answers.last.active #=> true

parameter as Array

answers = Answers.new
answers << [:abort, Answer.new(:overwrite)]
answers.first.instruction #=> :abort
answers.first.active #=> true
answers.last.instruction #=> :overwrite
answers.last.active #=> true

parameter as Hash

answers = Answers.new
answers << {abort: true, overwrite: false, "non-symbol" => "ignored"}
answers.size #=> 2
answers.first.instruction #=> :abort
answers.first.active #=> true
answers.last.instruction #=> :overwrite
answers.last.active #=> false

Returns:



75
76
77
78
79
80
81
82
83
84
85
# File 'lib/questions/answers.rb', line 75

def <<(arg)
  case arg
  when Answer then super arg
  when Symbol then super Answer.new(arg)
  when Array
    arg.each { |arg| self << arg } # call as Answer or Symbol
  when Hash
    self << AnswersHelper.convert_hash_to_answers(AnswersHelper.select_symbols(arg)) # call as Array
  end
  self
end

#[](indicator) ⇒ Answer

Gets answer by indicator.

Examples:

answers = Answers.new [:abort, :overwrite]
answers[:a].instruction #=> :abort
answers[:o].instruction #=> :overwrite

Returns:



95
96
97
98
# File 'lib/questions/answers.rb', line 95

def [](indicator)
  update_indicators_for_uniqueness!
  select { |answer| answer.indicator == indicator }.first
end

#has_unique_indicators?Boolean

Returns true if indicators are unique, false otherwise.

Examples:

answers = Answers.new [:abort, :abort_all, :abc]
answers.indicators #=> [:a, :A, :a]
answers.has_unique_indicators? #=> false
answers.update_indicators_for_uniqueness!
answers.indicators #=> [:a, :A, :ab]
answers.has_unique_indicators? #=> true

Returns:

  • (Boolean)


138
139
140
141
# File 'lib/questions/answers.rb', line 138

def has_unique_indicators?
  indicators = indicators()
  indicators == indicators.uniq
end

#indicatorsObject

Gets all indicators of answers.

Examples:

answers = Answers.new [:abort, :abort_all, :abc]
answers.indicators #=> [:a, :A, :a]
answers.update_indicators_for_uniqueness!
answers.indicators #=> [:a, :A, :ab]


125
126
127
# File 'lib/questions/answers.rb', line 125

def indicators
  map(&:indicator)
end

#to_sObject

Returns all answers as choice string.

Examples:

with only true answers

answers = Answers.new [:abort, :abort_all, :abc]
answers.choice_string #=> "[a]bort, [A]bort all, [ab]c"

with false answer

answers = Answers.new {abort: true, abort_all: false, abc: true}
answers.choice_string #=> "[a]bort, [ab]c"


152
153
154
155
# File 'lib/questions/answers.rb', line 152

def to_s
  update_indicators_for_uniqueness!
  map(&:to_s).compact.join(", ")
end

#update_indicators_for_uniqueness!Object

Updates indicators to get all unique.

Examples:

answers = Answers.new [:abort, :abort_all, :abc]
answers.indicators #=> [:a, :A, :a]
answers.has_unique_indicators? #=> false
answers.update_indicators_for_uniqueness!
answers.indicators #=> [:a, :A, :ab]
answers.has_unique_indicators? #=> true


109
110
111
112
113
114
115
116
# File 'lib/questions/answers.rb', line 109

def update_indicators_for_uniqueness!
  return if has_unique_indicators?

  each_with_index do |answer, num|
    other_indicators = first(num).map(&:indicator)
    answer.indicator = AnswersHelper.free_indicator_of(answer, used_indicators: other_indicators)
  end
end