Pickaxe 0.6.3 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/pickaxe.rb +1 -1
- data/lib/pickaxe/cli.rb +10 -0
- data/lib/pickaxe/errors.rb +0 -7
- data/lib/pickaxe/test.rb +59 -10
- metadata +5 -5
data/lib/pickaxe.rb
CHANGED
data/lib/pickaxe/cli.rb
CHANGED
@@ -26,6 +26,10 @@ END_OF_BANNER
|
|
26
26
|
Pickaxe::Main.options[:select] = Integer(v)
|
27
27
|
end
|
28
28
|
|
29
|
+
opts.on("--single", "Generated test will have only 1 correct answer") do |v|
|
30
|
+
Pickaxe::Main.options[:one_choice] = true
|
31
|
+
end
|
32
|
+
|
29
33
|
opts.on("--full-test", "Checks test after all questions are answered") do |v|
|
30
34
|
Pickaxe::Main.options[:full_test] = true
|
31
35
|
end
|
@@ -82,6 +86,12 @@ END_OF_MESSAGE
|
|
82
86
|
$stderr.puts(("! --full-test disables the --repeat-incorrect option" ).color(:yellow))
|
83
87
|
Pickaxe::Main.options[:repeat_incorrect] = false
|
84
88
|
end
|
89
|
+
|
90
|
+
if Pickaxe::Main.options[:one_choice] and Pickaxe::Main.options[:repeat_incorrect]
|
91
|
+
$stderr.puts(("! --one-choice disables the --repeat-incorrect option" ).color(:yellow))
|
92
|
+
Pickaxe::Main.options[:repeat_incorrect] = false
|
93
|
+
end
|
94
|
+
|
85
95
|
Pickaxe::Main.new(ARGV)
|
86
96
|
rescue Pickaxe::PickaxeError, OptionParser::InvalidOption => e
|
87
97
|
$stderr.puts(("! " + e.to_s).color(:red))
|
data/lib/pickaxe/errors.rb
CHANGED
@@ -49,12 +49,5 @@ module Pickaxe
|
|
49
49
|
BadQuestion.message(question.content.first, "has no correct answers"))
|
50
50
|
end
|
51
51
|
end
|
52
|
-
|
53
|
-
class NotUniqueAnswerIndices < TestSyntaxError
|
54
|
-
def initialize(question)
|
55
|
-
super(question.content.first.index,
|
56
|
-
BadQuestion.message(question.content.first, "answer indices are not unique"))
|
57
|
-
end
|
58
|
-
end
|
59
52
|
end
|
60
53
|
end
|
data/lib/pickaxe/test.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
1
3
|
module Pickaxe
|
2
4
|
class TestLine < String
|
3
5
|
attr_accessor :index
|
@@ -11,7 +13,7 @@ module Pickaxe
|
|
11
13
|
end
|
12
14
|
end
|
13
15
|
|
14
|
-
class Test
|
16
|
+
class Test
|
15
17
|
include Pickaxe::Errors
|
16
18
|
|
17
19
|
attr_reader :questions
|
@@ -106,6 +108,11 @@ module Pickaxe
|
|
106
108
|
|
107
109
|
RE = /^\s*(\d+)\.?\s*(.+)$/u
|
108
110
|
|
111
|
+
def initialize(*args)
|
112
|
+
super(*args)
|
113
|
+
reindex_answers(self.answers)
|
114
|
+
end
|
115
|
+
|
109
116
|
def self.parse(file, answers)
|
110
117
|
content = []
|
111
118
|
until answers.first.nil? or Answer::RE.match(answers.first)
|
@@ -128,8 +135,7 @@ module Pickaxe
|
|
128
135
|
|
129
136
|
answers = answers.collect {|answer| Answer.parse(answer) }
|
130
137
|
Question.new(file, m[1], content, answers).tap do |q|
|
131
|
-
raise NoCorrectAnswer.new(q) if q.correct_answers.blank?
|
132
|
-
raise NotUniqueAnswerIndices.new(q) unless q.answer_indices.uniq!.nil?
|
138
|
+
raise NoCorrectAnswer.new(q) if q.correct_answers.blank?
|
133
139
|
q.content = q.content.join(" ").gsub("\\n", "\n")
|
134
140
|
end
|
135
141
|
end
|
@@ -142,17 +148,57 @@ module Pickaxe
|
|
142
148
|
if @shuffled_answers.nil?
|
143
149
|
unless Main.options[:sorted_answers]
|
144
150
|
@shuffled_answers = self.answers.shuffle
|
145
|
-
|
146
|
-
@shuffled_answers[order].index = index
|
147
|
-
end
|
151
|
+
reindex_answers(@shuffled_answers)
|
148
152
|
else
|
149
153
|
@shuffled_answers = self.answers
|
150
154
|
end
|
155
|
+
|
156
|
+
if Main.options[:one_choice]
|
157
|
+
# NOTE:
|
158
|
+
# This hack line removes possible answers that states that non of
|
159
|
+
# other answers are correct (in Polish), because this invalidates
|
160
|
+
# the algorithm fot generating fourth answer from given 3
|
161
|
+
#
|
162
|
+
# NOTE: Other languages will remain untouched.
|
163
|
+
#
|
164
|
+
@shuffled_answers.reject! { |a| a.content =~ /(\s+|^)żadne(\s+|$)/u }
|
165
|
+
reindex_answers(@shuffled_answers)
|
166
|
+
# END OF HACK
|
167
|
+
|
168
|
+
@shuffled_answers = generate_fourth_answer(@shuffled_answers[0...3])
|
169
|
+
end
|
151
170
|
end
|
152
171
|
|
153
172
|
@shuffled_answers
|
154
173
|
end
|
155
174
|
|
175
|
+
def reindex_answers(answers)
|
176
|
+
letters = ('a'...'z').to_a
|
177
|
+
answers.each_with_index do |index, order|
|
178
|
+
answers[order].index = letters[order]
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
def generate_fourth_answer(answers)
|
183
|
+
correct = correct_answers(answers)
|
184
|
+
answers + case correct.length
|
185
|
+
when 0 then
|
186
|
+
[Answer.new(Answer::EMPTY, "d", true)]
|
187
|
+
when 1
|
188
|
+
left = answer_indices(answers) - correct
|
189
|
+
fourth = (0...([3, left.length].min)).collect {|i| left.combination(i).to_a.flatten }.shuffle.first
|
190
|
+
fourth = if fourth.empty?
|
191
|
+
Answer::EMPTY
|
192
|
+
else
|
193
|
+
Answer::CORRECT_ARE % fourth.map(&:upcase).join(", ")
|
194
|
+
end
|
195
|
+
[Answer.new(fourth, "d", false)]
|
196
|
+
else
|
197
|
+
answers.each {|a| a.correctness = false }
|
198
|
+
[Answer.new(Answer::CORRECT_ARE % correct.map(&:upcase).join(", "), "d", true)]
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
156
202
|
def answered(indices)
|
157
203
|
content = self.content.word_wrap(:indent => index.to_s.length+2)
|
158
204
|
content + "\n\n" + self.shuffled_answers.collect do |answer|
|
@@ -176,12 +222,12 @@ module Pickaxe
|
|
176
222
|
given.sort == correct_answers
|
177
223
|
end
|
178
224
|
|
179
|
-
def correct_answers
|
180
|
-
|
225
|
+
def correct_answers(a = shuffled_answers)
|
226
|
+
a.select(&:correctness).collect(&:index).sort
|
181
227
|
end
|
182
228
|
|
183
|
-
def answer_indices
|
184
|
-
|
229
|
+
def answer_indices(a = shuffled_answers)
|
230
|
+
a.collect(&:index)
|
185
231
|
end
|
186
232
|
|
187
233
|
def check?(given)
|
@@ -206,6 +252,9 @@ module Pickaxe
|
|
206
252
|
end
|
207
253
|
|
208
254
|
class Answer < Struct.new(:content, :index, :correctness)
|
255
|
+
EMPTY = "None of answers above is correct"
|
256
|
+
CORRECT_ARE = "Correct answers: %s"
|
257
|
+
|
209
258
|
RE = /^\s*(>+)?\s*(\?+)?\s*\(?(\w)\)\s*(.+)$/u
|
210
259
|
LINE_RE = /^\s*\\?\s*([[:alpha:]]|\w+)/u
|
211
260
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: Pickaxe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 3
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 7
|
9
|
+
- 0
|
10
|
+
version: 0.7.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Dawid Fatyga
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-12-
|
18
|
+
date: 2010-12-13 00:00:00 +01:00
|
19
19
|
default_executable: bin/pickaxe
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|