quiz_master 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +5 -0
- data/CHANGELOG.md +7 -0
- data/README.md +52 -20
- data/Rakefile +14 -14
- data/lib/quiz_master.rb +37 -10
- data/lib/quiz_master/answer.rb +13 -3
- data/lib/quiz_master/answers_renderer.rb +18 -14
- data/lib/quiz_master/question.rb +69 -0
- data/lib/quiz_master/quiz.rb +80 -1
- data/lib/quiz_master/quiz_variant.rb +36 -0
- data/lib/quiz_master/rendered_question.rb +2 -2
- data/lib/quiz_master/reorderer.rb +68 -0
- data/lib/quiz_master/reordering_vector.rb +95 -0
- data/lib/quiz_master/text_answer_sheet_formatter.rb +1 -1
- data/lib/quiz_master/text_assembler.rb +3 -3
- data/lib/quiz_master/text_question_formatter.rb +1 -1
- data/lib/quiz_master/text_question_sheet_formatter.rb +2 -1
- data/lib/quiz_master/version.rb +1 -1
- data/quiz_master.gemspec +17 -15
- data/test/question_spec.rb +55 -0
- data/test/quiz_spec.rb +55 -0
- data/test/quiz_variant_spec.rb +34 -0
- data/test/reorderer_spec.rb +33 -0
- data/test/reordering_vector_spec.rb +59 -0
- data/test/spec_helper.rb +58 -0
- data/test/text_answer_sheet_formatter_spec.rb +14 -0
- data/test/text_question_formatter_spec.rb +18 -0
- data/test/text_question_sheet_formatter_spec.rb +34 -0
- data/test/version_spec.rb +7 -0
- metadata +27 -10
- data/test/test_text_answer_sheet_formatter.rb +0 -39
- data/test/test_text_question_formatter.rb +0 -30
- data/test/test_text_question_sheet_formatter.rb +0 -56
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8d62671e4c95a71dec14536a930d4ac5c10797e3
|
4
|
+
data.tar.gz: 96e9ba4259c1ba1a4b07dea794d2d2839e3d68ae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e7dc36f5eeb2e7f9789484e5168accf43054459e7d970915ce7b771cef8fbe2335353408a3126b46a767a47a55ec3e663236b9f694be3e9279ac9fe6b2b286b2
|
7
|
+
data.tar.gz: 02781fd91885ce245291bb5c4cce1191546f211a67ecfedad60f999da65d3491efbee186e05b298c5319460e9fca2b5094f24ad56bf258c0e6342338682c7d84
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -26,33 +26,65 @@ Or install it yourself as:
|
|
26
26
|
|
27
27
|
## Usage
|
28
28
|
|
29
|
-
|
29
|
+
As of release 0.0.3 it can generate reordered quizzes like this:
|
30
30
|
|
31
31
|
```ruby
|
32
|
-
|
32
|
+
#!/usr/bin/env ruby
|
33
33
|
|
34
|
+
require "rubygems"
|
35
|
+
require "quiz_master"
|
34
36
|
include QuizMaster
|
35
37
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
)
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
38
|
+
quiz_source = Quiz.new(
|
39
|
+
[
|
40
|
+
{
|
41
|
+
prompt: "Who were orignal members of Genesis?",
|
42
|
+
answers: [
|
43
|
+
Answer.new("Phil Collins", false, tag: "phil"),
|
44
|
+
Answer.new("Tony Banks", true),
|
45
|
+
Answer.new("Steve Hackett", false, tag: "steve"),
|
46
|
+
Answer.new("{{phil}} and {{steve}}", false)
|
47
|
+
]
|
48
|
+
},
|
49
|
+
{
|
50
|
+
prompt: "Which numbers are prime?",
|
51
|
+
answers: [
|
52
|
+
Answer.new("1", false),
|
53
|
+
Answer.new("2", false, tag: "2"),
|
54
|
+
Answer.new("3", false),
|
55
|
+
Answer.new("All of the above except {{2}}", true, anchored: true)
|
56
|
+
]
|
57
|
+
},
|
58
|
+
{
|
59
|
+
prompt: "What is the colour of a Banana?",
|
60
|
+
answers: [
|
61
|
+
Answer.new("Green", false),
|
62
|
+
Answer.new("Red", false, tag: "red"),
|
63
|
+
Answer.new("Yellow", false),
|
64
|
+
Answer.new("Black", false),
|
65
|
+
Answer.new("Brown", false),
|
66
|
+
Answer.new("Blue", false, tag: "blue"),
|
67
|
+
Answer.new("All of the colours above", false, anchored: true),
|
68
|
+
Answer.new("All of the colours above except {{blue}} and {{red}}", true,
|
69
|
+
anchored: true)
|
70
|
+
]
|
71
|
+
}
|
72
|
+
].map { |q| Question.new(q) })
|
73
|
+
|
74
|
+
3.times do
|
75
|
+
answer_reorderings = quiz_source.answer_reordering_vectors
|
76
|
+
question_reordering = quiz_source.question_reordering_vector
|
77
|
+
|
78
|
+
quiz = QuizVariant.new(quiz_source, answer_reorderings, question_reordering)
|
79
|
+
|
80
|
+
puts TextQuestionSheetFormatter.new.format(quiz)
|
81
|
+
puts TextAnswerSheetFormatter.new.format(quiz)
|
82
|
+
end
|
54
83
|
```
|
55
84
|
|
85
|
+
Generating three (probably) different versions of the same quiz and an answer
|
86
|
+
sheet for each.
|
87
|
+
|
56
88
|
## Contributing
|
57
89
|
|
58
90
|
1. Fork it ( https://github.com/mikestok/quiz_master/fork )
|
data/Rakefile
CHANGED
@@ -1,26 +1,26 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require "rubocop/rake_task"
|
3
|
+
require "rake/testtask"
|
4
|
+
require "rdoc/task"
|
5
5
|
|
6
|
-
task default:
|
6
|
+
task default: %i(rubocop test)
|
7
7
|
|
8
|
-
desc
|
8
|
+
desc "Run RuboCop on the lib directory"
|
9
9
|
RuboCop::RakeTask.new(:rubocop) do |task|
|
10
|
-
task.patterns =
|
10
|
+
task.patterns = %w(Rakefile test/**/*.rb lib/**/*.rb)
|
11
11
|
# only show the files with failures
|
12
|
-
task.formatters = [
|
12
|
+
task.formatters = ["clang"]
|
13
13
|
# don't abort rake on failure
|
14
|
-
task.fail_on_error =
|
14
|
+
task.fail_on_error = true
|
15
15
|
end
|
16
16
|
|
17
17
|
Rake::TestTask.new do |t|
|
18
|
-
t.libs <<
|
19
|
-
t.test_files = FileList[
|
18
|
+
t.libs << "test"
|
19
|
+
t.test_files = FileList["test/**/*_spec.rb"]
|
20
20
|
end
|
21
21
|
|
22
22
|
RDoc::Task.new do |rdoc|
|
23
|
-
rdoc.main =
|
24
|
-
rdoc.rdoc_files.include(
|
25
|
-
rdoc.options <<
|
23
|
+
rdoc.main = "README.md"
|
24
|
+
rdoc.rdoc_files.include("README.md", "CHANGELOG.md", "lib/**/*.rb")
|
25
|
+
rdoc.options << "--markup=tomdoc"
|
26
26
|
end
|
data/lib/quiz_master.rb
CHANGED
@@ -1,17 +1,44 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
1
|
+
require "quiz_master/version"
|
2
|
+
require "quiz_master/text_question_formatter"
|
3
|
+
require "quiz_master/text_answer_sheet_formatter"
|
4
|
+
require "quiz_master/text_question_sheet_formatter"
|
5
|
+
require "quiz_master/question"
|
6
|
+
require "quiz_master/rendered_question"
|
7
|
+
require "quiz_master/answer"
|
8
|
+
require "quiz_master/quiz"
|
9
|
+
require "quiz_master/quiz_variant"
|
10
|
+
require "quiz_master/answers_renderer"
|
11
|
+
require "quiz_master/text_assembler"
|
12
|
+
require "quiz_master/reorderer"
|
13
|
+
require "quiz_master/reordering_vector"
|
11
14
|
|
12
15
|
# This provides a namespace for all of the components.
|
13
16
|
module QuizMaster
|
14
17
|
# This error is raised when something discovers that there are the wrong
|
15
18
|
# number of correct answers in a set of answers.
|
16
19
|
NumberOfCorrectAnswersError = Class.new(StandardError)
|
20
|
+
# This error is raised when we try and move an anchored answer in a question.
|
21
|
+
MovingAnchoredAnswerError = Class.new(StandardError)
|
22
|
+
# This error is raised when we create a ReorderingVector and it doesn't
|
23
|
+
# contain the indices for an array of the right size.
|
24
|
+
BadReorderingVectorIndicesError = Class.new(StandardError)
|
25
|
+
|
26
|
+
# rubocop:disable Style/MethodName
|
27
|
+
|
28
|
+
# Public: This is a convenience method to let us construct a ReorderingVector
|
29
|
+
# from an Array of indices.
|
30
|
+
#
|
31
|
+
# array - An Array of values to put in the ReorderingVector
|
32
|
+
#
|
33
|
+
# Returns a ReorderingVector whose indices are copied from the Array.
|
34
|
+
# Raises BadReorderingVectorIndicesError if the supplied Array isn't a set
|
35
|
+
# of indices.
|
36
|
+
def ReorderingVector(array)
|
37
|
+
array.sort == (0 ... array.size).to_a ||
|
38
|
+
fail(BadReorderingVectorIndicesError,
|
39
|
+
"#{array.inspect} must contain (0 ... #{array.size})")
|
40
|
+
|
41
|
+
ReorderingVector.new([false] * array.size) { array }
|
42
|
+
end
|
43
|
+
# rubocop:enable Style/MethodName
|
17
44
|
end
|
data/lib/quiz_master/answer.rb
CHANGED
@@ -15,18 +15,21 @@ module QuizMaster
|
|
15
15
|
#
|
16
16
|
# text - a String of text for the answer.
|
17
17
|
# correct - whether this answer is true or false.
|
18
|
-
# tag
|
19
|
-
# from other Answers.
|
18
|
+
# tag: - A String which can be used to reference this Answer
|
19
|
+
# from other Answers. Optional.
|
20
|
+
# anchored: - A value to be used in boolean context to determine if this
|
21
|
+
# Answer is anchored. Optional.
|
20
22
|
#
|
21
23
|
# Examples
|
22
24
|
#
|
23
25
|
# a1 = Answer.new('Correct!', true)
|
24
26
|
# a1.text # => 'Correct!'
|
25
27
|
# a1.correct? # => true
|
26
|
-
def initialize(text, correct, tag
|
28
|
+
def initialize(text, correct, tag: nil, anchored: false)
|
27
29
|
@text = text.to_s
|
28
30
|
@correct = correct
|
29
31
|
@tag = tag
|
32
|
+
@anchored = anchored
|
30
33
|
end
|
31
34
|
|
32
35
|
# Public: Tell whether this Answer is correct
|
@@ -35,5 +38,12 @@ module QuizMaster
|
|
35
38
|
def correct?
|
36
39
|
@correct ? true : false
|
37
40
|
end
|
41
|
+
|
42
|
+
# Public: Tell whether this Answer is anchored
|
43
|
+
#
|
44
|
+
# Returns +true+ or +false+
|
45
|
+
def anchored?
|
46
|
+
@anchored ? true : false
|
47
|
+
end
|
38
48
|
end
|
39
49
|
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
module QuizMaster
|
2
|
-
#
|
3
|
-
# tag references enclosed in {{...}} so that the new
|
2
|
+
# This renders a list of answers into a new list of Answers updating
|
3
|
+
# tag references enclosed in {{...}} so that the new Answers have tags
|
4
4
|
# starting at +first_tag+
|
5
5
|
class AnswersRenderer
|
6
6
|
include Enumerable
|
7
7
|
|
8
8
|
# Public: Initialize an AnswersRenderer object.
|
9
9
|
#
|
10
|
-
# answers
|
10
|
+
# answers - An Array of Answer objects.
|
11
11
|
# first_tag - Something that responds to #succ which is used as the initial
|
12
12
|
# tag in the stream of yielded Answers.
|
13
13
|
def initialize(answers:, first_tag:)
|
@@ -21,13 +21,16 @@ module QuizMaster
|
|
21
21
|
# Yields an Answer object.
|
22
22
|
#
|
23
23
|
# Returns nothing.
|
24
|
-
def each
|
25
|
-
@rendered_answers.each
|
26
|
-
yield a
|
27
|
-
end
|
24
|
+
def each(&block)
|
25
|
+
@rendered_answers.each(&block)
|
28
26
|
end
|
29
27
|
|
30
|
-
|
28
|
+
# Public: Gets the Array of all the rendered Answers.
|
29
|
+
#
|
30
|
+
# Returns an Array of rendered Answers.
|
31
|
+
def all_answers
|
32
|
+
@rendered_answers.dup
|
33
|
+
end
|
31
34
|
|
32
35
|
# Private: Create a mapping from the tags used in the original questions
|
33
36
|
# passed to our initialize to the tags we'll use in the rendered answer.
|
@@ -46,7 +49,7 @@ module QuizMaster
|
|
46
49
|
#
|
47
50
|
# Returns a Hash mapping the original_answers tags to rendered answers
|
48
51
|
# tags.
|
49
|
-
def make_tag_map(original_answers)
|
52
|
+
private def make_tag_map(original_answers)
|
50
53
|
tagged_list(original_answers).each_with_object({}) do |(tag, ans), map|
|
51
54
|
map[ans.tag] = tag if ans.tag
|
52
55
|
end
|
@@ -59,9 +62,10 @@ module QuizMaster
|
|
59
62
|
# original_answers - and Array of Answer objects
|
60
63
|
#
|
61
64
|
# Returns an Array of Answer objects.
|
62
|
-
def render_answers(original_answers)
|
65
|
+
private def render_answers(original_answers)
|
63
66
|
tagged_list(original_answers).map do |tag, answer|
|
64
|
-
Answer.new(replace_tags(answer.text), answer.correct?,
|
67
|
+
Answer.new(replace_tags(answer.text), answer.correct?,
|
68
|
+
tag: tag, anchored: true)
|
65
69
|
end
|
66
70
|
end
|
67
71
|
|
@@ -72,7 +76,7 @@ module QuizMaster
|
|
72
76
|
#
|
73
77
|
# Returns a String with the tag place holders replaced with the correct
|
74
78
|
# tags.
|
75
|
-
def replace_tags(string)
|
79
|
+
private def replace_tags(string)
|
76
80
|
string
|
77
81
|
.split(/({{[^}]+}})/)
|
78
82
|
.each_with_object(TextAssembler.new) do |fragment, assembler|
|
@@ -94,7 +98,7 @@ module QuizMaster
|
|
94
98
|
# # => [['a', 'foo'], ['b', 'bar'], ['c', 'baz']
|
95
99
|
#
|
96
100
|
# Returns an Array whose elements are Arrays containing [tag, list_element]
|
97
|
-
def tagged_list(list)
|
101
|
+
private def tagged_list(list)
|
98
102
|
list.zip(tag_sequence).map do |element, tag|
|
99
103
|
[tag, element]
|
100
104
|
end
|
@@ -104,7 +108,7 @@ module QuizMaster
|
|
104
108
|
# starting with @first_tag.
|
105
109
|
#
|
106
110
|
# Returns an Enumerator which generates tags.
|
107
|
-
def tag_sequence
|
111
|
+
private def tag_sequence
|
108
112
|
Enumerator.new do |yielder|
|
109
113
|
tag = @first_tag
|
110
114
|
loop do
|
data/lib/quiz_master/question.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require_relative "answers_renderer"
|
2
|
+
|
1
3
|
module QuizMaster
|
2
4
|
# A simple class to link a prompt to a list of Answers.
|
3
5
|
class Question
|
@@ -27,5 +29,72 @@ module QuizMaster
|
|
27
29
|
def correct_answer
|
28
30
|
answers.find(&:correct?).clone
|
29
31
|
end
|
32
|
+
|
33
|
+
# Public: Return a new Question with the Answers reordered by the
|
34
|
+
# given specification.
|
35
|
+
#
|
36
|
+
# spec - A Reorderer, initialized to specify the reordering to perform.
|
37
|
+
#
|
38
|
+
# Returns a new Question with the Answers reordered.
|
39
|
+
# Raises MovingAnchoredAnswerError if we attempt to move an anchored answer.
|
40
|
+
def reorder_answers(spec)
|
41
|
+
fail(MovingAnchoredAnswerError) if moving_anchored_answer?(spec)
|
42
|
+
self.class.new(prompt: prompt, answers: spec.reorder(answers))
|
43
|
+
end
|
44
|
+
|
45
|
+
# Public: Return a reordering vector for this question, with un-anchored
|
46
|
+
# answers shuffled according to the shuffle_block.
|
47
|
+
#
|
48
|
+
# klass - The class for the returned reordering vector. Optional.
|
49
|
+
# shuffle_block - A block which specifies how the un-anchored answer indices
|
50
|
+
# should be shuffled. It is passed an array of indices and
|
51
|
+
# is expected to return an array containing the same indices
|
52
|
+
# possibly in a different order. Optional.
|
53
|
+
#
|
54
|
+
# Examples
|
55
|
+
#
|
56
|
+
# # If this question has 4 answers with the last one anchored
|
57
|
+
# q.reordering_vector
|
58
|
+
# # => #<QuizMaster::ReorderingVector:0x???? @indices=[1, 2, 0, 3]>
|
59
|
+
# #
|
60
|
+
# # Where the first three indices can be shuffled in to any order.
|
61
|
+
#
|
62
|
+
# Returns an object of class klass.
|
63
|
+
def reordering_vector(klass = ReorderingVector, &shuffle_block)
|
64
|
+
shuffle_block ||= ->(a) { a.shuffle }
|
65
|
+
klass.new(answers.map(&:anchored?), &shuffle_block)
|
66
|
+
end
|
67
|
+
|
68
|
+
# Public: This generates a new object whose answers have been rendered.
|
69
|
+
#
|
70
|
+
# first_tag - The tag to be used for the first question, it must
|
71
|
+
# respond to succ. (Optional).
|
72
|
+
# result_class - The class of the object to return. I assume it is some
|
73
|
+
# sort of class which is compatible with Question.
|
74
|
+
# (Optional).
|
75
|
+
# renderer_class - The class to use for rendering the list of answers.
|
76
|
+
# (Optional).
|
77
|
+
#
|
78
|
+
# Returns result_class object which is the Question with the answers
|
79
|
+
# rendered.
|
80
|
+
def render_answers(first_tag: "a",
|
81
|
+
result_class: self.class,
|
82
|
+
renderer_class: AnswersRenderer)
|
83
|
+
result_class.new(prompt: prompt,
|
84
|
+
answers: renderer_class.new(answers: answers,
|
85
|
+
first_tag: first_tag
|
86
|
+
).all_answers
|
87
|
+
)
|
88
|
+
end
|
89
|
+
|
90
|
+
# Private: A predicate to tell us if the given spec will move any Answer
|
91
|
+
# which is anchored.
|
92
|
+
#
|
93
|
+
# spec - A Reorderer
|
94
|
+
#
|
95
|
+
# Returns true or false.
|
96
|
+
private def moving_anchored_answer?(spec)
|
97
|
+
answers.values_at(*spec.moving_indices).any? { |a| a.anchored? }
|
98
|
+
end
|
30
99
|
end
|
31
100
|
end
|
data/lib/quiz_master/quiz.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require_relative "reordering_vector"
|
2
|
+
require_relative "reorderer"
|
3
|
+
|
1
4
|
module QuizMaster
|
2
5
|
# A quiz is a set of questions and their answers.
|
3
6
|
#
|
@@ -17,10 +20,86 @@ module QuizMaster
|
|
17
20
|
# questions - An Array of Questions.
|
18
21
|
# header - A String containg header text (optional).
|
19
22
|
# footer - A String containg footer text (optional).
|
20
|
-
def initialize(questions, header:
|
23
|
+
def initialize(questions, header: "", footer: "")
|
21
24
|
@questions = questions
|
22
25
|
@header = header
|
23
26
|
@footer = footer
|
24
27
|
end
|
28
|
+
|
29
|
+
# Public: Return a ReorderingVector for the Answers for each of the
|
30
|
+
# Questions in the Quiz.
|
31
|
+
#
|
32
|
+
# The arguments are used for testing only and should not be supplied in
|
33
|
+
# "normal" code.
|
34
|
+
#
|
35
|
+
# klass - The class of the Array elements to return. (optional).
|
36
|
+
# shuffle_block - A block to shuffle un-anchored Answers in a question.
|
37
|
+
# (optional).
|
38
|
+
#
|
39
|
+
# Returns an Array of ReorderingVectors.
|
40
|
+
def answer_reordering_vectors(klass = ReorderingVector, &shuffle_block)
|
41
|
+
questions.map do |q|
|
42
|
+
q.reordering_vector(klass, &shuffle_block)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Public: Return a ReorderingVector for the Questions in the Quiz.
|
47
|
+
#
|
48
|
+
# The arguments are used for testing only and should not be supplied in
|
49
|
+
# "normal" code.
|
50
|
+
#
|
51
|
+
# klass - The class of the object to return. (optional).
|
52
|
+
# shuffle_block - A block to shuffle Questions in the Quiz. (optional).
|
53
|
+
#
|
54
|
+
# Returns a ReorderingVector.
|
55
|
+
def question_reordering_vector(klass = ReorderingVector, &shuffle_block)
|
56
|
+
shuffle_block ||= ->(a) { a.shuffle }
|
57
|
+
# We assume that none of the Questions in a Quiz is anchored, hence the
|
58
|
+
# [false] * questions.count.
|
59
|
+
klass.new([false] * questions.count, &shuffle_block)
|
60
|
+
end
|
61
|
+
|
62
|
+
# Public: This generates a new object with the same Questions as this
|
63
|
+
# Quiz but in a different order.
|
64
|
+
#
|
65
|
+
# vector - A vector specifying how the Questions are to be
|
66
|
+
# reordered.
|
67
|
+
# reorderer_class - The class of the Reorderer to use. (Optional).
|
68
|
+
#
|
69
|
+
# Returns a new Quiz with the questions reordered.
|
70
|
+
def reorder_questions(vector, reorderer_class = Reorderer)
|
71
|
+
reorderer = reorderer_class.new(*vector)
|
72
|
+
self.class.new(reorderer.reorder(questions),
|
73
|
+
header: header,
|
74
|
+
footer: footer)
|
75
|
+
end
|
76
|
+
|
77
|
+
# Public: This generates a new object where the Answers to each question
|
78
|
+
# have been reordered.
|
79
|
+
#
|
80
|
+
# array_of_vectors - An array of vectors specifiying how the Questions'
|
81
|
+
# Answers are to be re-ordered.
|
82
|
+
#
|
83
|
+
# Returns a new Quiz with the Questions' Answers reordered.
|
84
|
+
def reorder_answers(array_of_vectors)
|
85
|
+
new_questions = questions.zip(array_of_vectors).map do |q, vector|
|
86
|
+
question_with_reordered_answers(q, vector)
|
87
|
+
end
|
88
|
+
|
89
|
+
self.class.new(new_questions, header: header, footer: footer)
|
90
|
+
end
|
91
|
+
|
92
|
+
# Private: Create a new version of a question with its answers re-ordered.
|
93
|
+
#
|
94
|
+
# q - The "source" question.
|
95
|
+
# vector - The ReorderingVector which specifies how the answers are to be
|
96
|
+
# reordered.
|
97
|
+
#
|
98
|
+
# Returns a new Question which contains the answers from the source question
|
99
|
+
# reordered.
|
100
|
+
private def question_with_reordered_answers(q, vector)
|
101
|
+
r = Reorderer.new(*vector)
|
102
|
+
Question.new(prompt: q.prompt, answers: r.reorder(q.answers))
|
103
|
+
end
|
25
104
|
end
|
26
105
|
end
|