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
@@ -0,0 +1,33 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Reorderer do
|
4
|
+
describe "reorder" do
|
5
|
+
it "should reorder an array as specified" do
|
6
|
+
Reorderer.new(0, 2, 1, 3).reorder(%w(a b c d)).must_equal(%w(a c b d))
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should fail if the array to be sorted is the wrong size" do
|
10
|
+
lambda do
|
11
|
+
Reorderer.new(0, 2, 1, 3).reorder(%w(a b c))
|
12
|
+
end.must_raise(ArgumentError)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "initialize" do
|
17
|
+
it "should fail with no arguments" do
|
18
|
+
-> { Reorderer.new }.must_raise(ArgumentError)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should fail with an empty indices argument" do
|
22
|
+
-> { Reorderer.new([]) }.must_raise(ArgumentError)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should fail with a "bad" set of arguments' do
|
26
|
+
-> { Reorderer.new(0, 1, 3, 4) }.must_raise(ArgumentError)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should succeed when passed a list" do
|
30
|
+
Reorderer.new(0, 1).must_be_kind_of(Reorderer)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe ReorderingVector do
|
4
|
+
describe "initialize" do
|
5
|
+
it "should fail with no arguments" do
|
6
|
+
-> { ReorderingVector.new }.must_raise(ArgumentError)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should contain all the indices" do
|
10
|
+
ReorderingVector.new([false] * 10).to_a.sort.must_equal((0 .. 9).to_a)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should "shuffle" non anchored indices' do
|
14
|
+
# [0, 1, 2, 3, 4, 5] has 1 & 5 anchored, and we use "reverse" as the
|
15
|
+
# shuffling function, so we should get back [4, 1, 3, 2, 0, 5]
|
16
|
+
anchored = [false, true, false, false, false, true]
|
17
|
+
r = ReorderingVector.new(anchored) { |a| a.reverse }
|
18
|
+
r.to_a.must_equal([4, 1, 3, 2, 0, 5])
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "[]" do
|
23
|
+
it "should pull the right values out of the vector" do
|
24
|
+
r = ReorderingVector.new([true, true])
|
25
|
+
r[0].must_equal(0)
|
26
|
+
r[1].must_equal(1)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "to_a" do
|
31
|
+
it "should convert to an array" do
|
32
|
+
ReorderingVector.new([true, true]).to_a.must_equal([0, 1])
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "to_ary" do
|
37
|
+
it "should convert to an array" do
|
38
|
+
a, b = ReorderingVector.new([true, true])
|
39
|
+
[a, b].must_equal([0, 1])
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "size" do
|
44
|
+
it "should be the right size" do
|
45
|
+
ReorderingVector.new([false] * 10).size.must_equal(10)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "each" do
|
50
|
+
it "should do each" do
|
51
|
+
res = []
|
52
|
+
ReorderingVector.new([false] * 10).each do |i|
|
53
|
+
res << i
|
54
|
+
end
|
55
|
+
|
56
|
+
res.sort.must_equal((0 ... 10).to_a)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
data/test/spec_helper.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
|
3
|
+
require "quiz_master"
|
4
|
+
include QuizMaster
|
5
|
+
|
6
|
+
# For simple testing I wanted a pool of example questions.
|
7
|
+
EXAMPLE_QUESTION_PARAMS = [
|
8
|
+
{
|
9
|
+
prompt: "Example 1 prompt",
|
10
|
+
answers: [
|
11
|
+
Answer.new("This is the first answer", false, tag: "5"),
|
12
|
+
Answer.new("This is the second answer", true),
|
13
|
+
Answer.new("This is the third answer", false, tag: "3"),
|
14
|
+
Answer.new("{{3}} and {{5}}", false)
|
15
|
+
]
|
16
|
+
},
|
17
|
+
{
|
18
|
+
prompt: "Example 2 prompt",
|
19
|
+
answers: [
|
20
|
+
Answer.new("This is the first answer", false, tag: "tag"),
|
21
|
+
Answer.new("This is the second answer", false),
|
22
|
+
Answer.new("This is the third answer", false),
|
23
|
+
Answer.new("This is the fourth answer {{tag}}", true)
|
24
|
+
]
|
25
|
+
},
|
26
|
+
{
|
27
|
+
prompt: "What is the colour of a Banana?",
|
28
|
+
answers: [
|
29
|
+
Answer.new("Green", false),
|
30
|
+
Answer.new("Red", false, tag: "red"),
|
31
|
+
Answer.new("Yellow", false),
|
32
|
+
Answer.new("Black", false),
|
33
|
+
Answer.new("Brown", false),
|
34
|
+
Answer.new("Blue", false, tag: "blue"),
|
35
|
+
Answer.new("All of the colours above", false, anchored: true),
|
36
|
+
Answer.new("All of the colours above except {{blue}} and {{red}}", true,
|
37
|
+
anchored: true)
|
38
|
+
]
|
39
|
+
}
|
40
|
+
]
|
41
|
+
|
42
|
+
# Render the example Questions.
|
43
|
+
#
|
44
|
+
# first_tag - The initial tag, defaults to 'a'
|
45
|
+
#
|
46
|
+
# Returns an Array of RenderedQuestions.
|
47
|
+
def example_rendered_questions(first_tag: "a")
|
48
|
+
EXAMPLE_QUESTION_PARAMS
|
49
|
+
.map { |p| p.merge(first_tag: first_tag) }
|
50
|
+
.map { |p| RenderedQuestion.new(p) }
|
51
|
+
end
|
52
|
+
|
53
|
+
# Construct the example Questions.
|
54
|
+
#
|
55
|
+
# Returns an Array of Quesitons.
|
56
|
+
def example_questions
|
57
|
+
EXAMPLE_QUESTION_PARAMS.map { |p| Question.new(p) }
|
58
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
expected_output = <<ETX
|
4
|
+
1) b
|
5
|
+
2) d
|
6
|
+
ETX
|
7
|
+
|
8
|
+
quiz = Quiz.new(example_rendered_questions.values_at(0, 1))
|
9
|
+
|
10
|
+
describe TextAnswerSheetFormatter do
|
11
|
+
it "formats a quiz answer sheet as text correctly" do
|
12
|
+
TextAnswerSheetFormatter.new.format(quiz).must_equal expected_output
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
expected_output = <<ETX
|
4
|
+
1) Example 1 prompt
|
5
|
+
|
6
|
+
a) This is the first answer
|
7
|
+
b) This is the second answer
|
8
|
+
c) This is the third answer
|
9
|
+
d) (a) and (c)
|
10
|
+
ETX
|
11
|
+
|
12
|
+
q = example_questions.first
|
13
|
+
|
14
|
+
describe TextQuestionFormatter do
|
15
|
+
it "formats a single question correctly" do
|
16
|
+
TextQuestionFormatter.new.format(q, 1).must_equal expected_output
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
expected_output = <<ETX
|
4
|
+
Header
|
5
|
+
|
6
|
+
1) Example 1 prompt
|
7
|
+
|
8
|
+
a) This is the first answer
|
9
|
+
b) This is the second answer
|
10
|
+
c) This is the third answer
|
11
|
+
d) (a) and (c)
|
12
|
+
|
13
|
+
2) What is the colour of a Banana?
|
14
|
+
|
15
|
+
a) Green
|
16
|
+
b) Red
|
17
|
+
c) Yellow
|
18
|
+
d) Black
|
19
|
+
e) Brown
|
20
|
+
f) Blue
|
21
|
+
g) All of the colours above
|
22
|
+
h) All of the colours above except (b) and (f)
|
23
|
+
|
24
|
+
Footer
|
25
|
+
ETX
|
26
|
+
|
27
|
+
quiz = Quiz.new(example_rendered_questions.values_at(0, 2),
|
28
|
+
header: "Header", footer: "Footer")
|
29
|
+
|
30
|
+
describe TextQuestionSheetFormatter do
|
31
|
+
it "formats a test OK" do
|
32
|
+
TextQuestionSheetFormatter.new.format(quiz).must_equal expected_output
|
33
|
+
end
|
34
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quiz_master
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Stok
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -114,16 +114,26 @@ files:
|
|
114
114
|
- lib/quiz_master/answers_renderer.rb
|
115
115
|
- lib/quiz_master/question.rb
|
116
116
|
- lib/quiz_master/quiz.rb
|
117
|
+
- lib/quiz_master/quiz_variant.rb
|
117
118
|
- lib/quiz_master/rendered_question.rb
|
119
|
+
- lib/quiz_master/reorderer.rb
|
120
|
+
- lib/quiz_master/reordering_vector.rb
|
118
121
|
- lib/quiz_master/text_answer_sheet_formatter.rb
|
119
122
|
- lib/quiz_master/text_assembler.rb
|
120
123
|
- lib/quiz_master/text_question_formatter.rb
|
121
124
|
- lib/quiz_master/text_question_sheet_formatter.rb
|
122
125
|
- lib/quiz_master/version.rb
|
123
126
|
- quiz_master.gemspec
|
124
|
-
- test/
|
125
|
-
- test/
|
126
|
-
- test/
|
127
|
+
- test/question_spec.rb
|
128
|
+
- test/quiz_spec.rb
|
129
|
+
- test/quiz_variant_spec.rb
|
130
|
+
- test/reorderer_spec.rb
|
131
|
+
- test/reordering_vector_spec.rb
|
132
|
+
- test/spec_helper.rb
|
133
|
+
- test/text_answer_sheet_formatter_spec.rb
|
134
|
+
- test/text_question_formatter_spec.rb
|
135
|
+
- test/text_question_sheet_formatter_spec.rb
|
136
|
+
- test/version_spec.rb
|
127
137
|
homepage: https://github.com/mikestok/quiz_master
|
128
138
|
licenses:
|
129
139
|
- MIT
|
@@ -134,9 +144,9 @@ require_paths:
|
|
134
144
|
- lib
|
135
145
|
required_ruby_version: !ruby/object:Gem::Requirement
|
136
146
|
requirements:
|
137
|
-
- - "
|
147
|
+
- - "~>"
|
138
148
|
- !ruby/object:Gem::Version
|
139
|
-
version: '
|
149
|
+
version: '2.1'
|
140
150
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
141
151
|
requirements:
|
142
152
|
- - ">="
|
@@ -149,7 +159,14 @@ signing_key:
|
|
149
159
|
specification_version: 4
|
150
160
|
summary: Simple manager for multiple choice quizzes
|
151
161
|
test_files:
|
152
|
-
- test/
|
153
|
-
- test/
|
154
|
-
- test/
|
162
|
+
- test/question_spec.rb
|
163
|
+
- test/quiz_spec.rb
|
164
|
+
- test/quiz_variant_spec.rb
|
165
|
+
- test/reorderer_spec.rb
|
166
|
+
- test/reordering_vector_spec.rb
|
167
|
+
- test/spec_helper.rb
|
168
|
+
- test/text_answer_sheet_formatter_spec.rb
|
169
|
+
- test/text_question_formatter_spec.rb
|
170
|
+
- test/text_question_sheet_formatter_spec.rb
|
171
|
+
- test/version_spec.rb
|
155
172
|
has_rdoc:
|
@@ -1,39 +0,0 @@
|
|
1
|
-
require 'minitest/spec'
|
2
|
-
require 'minitest/autorun'
|
3
|
-
require 'quiz_master'
|
4
|
-
|
5
|
-
include QuizMaster
|
6
|
-
|
7
|
-
expected_output = <<ETX
|
8
|
-
1) b
|
9
|
-
2) d
|
10
|
-
ETX
|
11
|
-
|
12
|
-
q1 = RenderedQuestion.new(
|
13
|
-
prompt: 'This is the prompt. It poses the question.',
|
14
|
-
answers: [
|
15
|
-
Answer.new('This is the first answer', false, '5'),
|
16
|
-
Answer.new('This is the second answer', true),
|
17
|
-
Answer.new('This is the third answer', false, '3'),
|
18
|
-
Answer.new('This is the fourth answer {{tag', false)
|
19
|
-
],
|
20
|
-
first_tag: 'a'
|
21
|
-
)
|
22
|
-
q2 = RenderedQuestion.new(
|
23
|
-
prompt: 'This is the prompt. It poses the question.',
|
24
|
-
answers: [
|
25
|
-
Answer.new('This is the first answer', false, 'tag'),
|
26
|
-
Answer.new('This is the second answer', false),
|
27
|
-
Answer.new('This is the third answer', false),
|
28
|
-
Answer.new('This is the fourth answer {{tag}}', true)
|
29
|
-
],
|
30
|
-
first_tag: 'a'
|
31
|
-
)
|
32
|
-
|
33
|
-
quiz = Quiz.new([q1, q2])
|
34
|
-
|
35
|
-
describe TextAnswerSheetFormatter do
|
36
|
-
it 'formats a single question test OK' do
|
37
|
-
TextAnswerSheetFormatter.new.format(quiz).must_equal expected_output
|
38
|
-
end
|
39
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
require 'minitest/spec'
|
2
|
-
require 'minitest/autorun'
|
3
|
-
require 'quiz_master'
|
4
|
-
|
5
|
-
include QuizMaster
|
6
|
-
|
7
|
-
expected_output = <<ETX
|
8
|
-
1) This is the prompt. It poses the question.
|
9
|
-
|
10
|
-
a) This is the first answer
|
11
|
-
b) This is the second answer
|
12
|
-
c) This is the third answer
|
13
|
-
d) (a) and (c)
|
14
|
-
ETX
|
15
|
-
|
16
|
-
q = Question.new(
|
17
|
-
prompt: 'This is the prompt. It poses the question.',
|
18
|
-
answers: [
|
19
|
-
Answer.new('This is the first answer', false, '5'),
|
20
|
-
Answer.new('This is the second answer', true),
|
21
|
-
Answer.new('This is the third answer', false, '3'),
|
22
|
-
Answer.new('{{3}} and {{5}}', false)
|
23
|
-
]
|
24
|
-
)
|
25
|
-
|
26
|
-
describe TextQuestionFormatter do
|
27
|
-
it 'formats a single question test OK' do
|
28
|
-
TextQuestionFormatter.new.format(q, 1).must_equal expected_output
|
29
|
-
end
|
30
|
-
end
|
@@ -1,56 +0,0 @@
|
|
1
|
-
require 'minitest/spec'
|
2
|
-
require 'minitest/autorun'
|
3
|
-
require 'quiz_master'
|
4
|
-
|
5
|
-
include QuizMaster
|
6
|
-
|
7
|
-
expected_output = <<ETX
|
8
|
-
Header
|
9
|
-
|
10
|
-
1) This is the prompt. It poses the question.
|
11
|
-
|
12
|
-
a) This is the first answer
|
13
|
-
b) This is the second answer
|
14
|
-
c) This is the third answer
|
15
|
-
d) (a) and (c)
|
16
|
-
|
17
|
-
2) What is the colour of a Banana?
|
18
|
-
|
19
|
-
a) Red
|
20
|
-
b) Green
|
21
|
-
c) Yellow
|
22
|
-
d) Brown
|
23
|
-
e) Black
|
24
|
-
f) All of the above except (a)
|
25
|
-
|
26
|
-
Footer
|
27
|
-
ETX
|
28
|
-
|
29
|
-
q = Question.new(
|
30
|
-
prompt: 'This is the prompt. It poses the question.',
|
31
|
-
answers: [
|
32
|
-
Answer.new('This is the first answer', false, '5'),
|
33
|
-
Answer.new('This is the second answer', false),
|
34
|
-
Answer.new('This is the third answer', true, '3'),
|
35
|
-
Answer.new('{{3}} and {{5}}', false)
|
36
|
-
]
|
37
|
-
)
|
38
|
-
q2 = Question.new(
|
39
|
-
prompt: 'What is the colour of a Banana?',
|
40
|
-
answers: [
|
41
|
-
Answer.new('Red', false, 'red'),
|
42
|
-
Answer.new('Green', false),
|
43
|
-
Answer.new('Yellow', false),
|
44
|
-
Answer.new('Brown', false),
|
45
|
-
Answer.new('Black', false),
|
46
|
-
Answer.new('All of the above except {{red}}', true)
|
47
|
-
]
|
48
|
-
)
|
49
|
-
|
50
|
-
quiz = Quiz.new([q, q2], header: 'Header', footer: 'Footer')
|
51
|
-
|
52
|
-
describe TextQuestionSheetFormatter do
|
53
|
-
it 'formats a test OK' do
|
54
|
-
TextQuestionSheetFormatter.new.format(quiz).must_equal expected_output
|
55
|
-
end
|
56
|
-
end
|