Pickaxe 0.6.0 → 0.6.1
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.
- data/lib/pickaxe.rb +12 -1
- data/lib/pickaxe/cli.rb +9 -2
- data/lib/pickaxe/main.rb +47 -7
- data/lib/pickaxe/shell.rb +7 -0
- data/lib/pickaxe/test.rb +17 -4
- metadata +4 -4
data/lib/pickaxe.rb
CHANGED
@@ -3,11 +3,22 @@ require "bundler/setup"
|
|
3
3
|
require "active_support/all"
|
4
4
|
require "rbconfig"
|
5
5
|
require "unidecoder"
|
6
|
+
begin
|
7
|
+
require 'readline'
|
8
|
+
rescue LoadError
|
9
|
+
class Readline
|
10
|
+
def self.completion_proc=(value); end
|
11
|
+
def self.readline(prompt)
|
12
|
+
print prompt
|
13
|
+
$stdin.gets
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
6
17
|
|
7
18
|
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__)))
|
8
19
|
|
9
20
|
module Pickaxe
|
10
|
-
VERSION = "0.6.
|
21
|
+
VERSION = "0.6.1"
|
11
22
|
|
12
23
|
class PickaxeError < StandardError; end
|
13
24
|
|
data/lib/pickaxe/cli.rb
CHANGED
@@ -43,6 +43,10 @@ END_OF_BANNER
|
|
43
43
|
options[:syntax_check] = true
|
44
44
|
end
|
45
45
|
|
46
|
+
opts.on("--no-clear", "Turn off shell clearing") do |v|
|
47
|
+
options[:no_clear] = true
|
48
|
+
end
|
49
|
+
|
46
50
|
opts.on("--no-color", "Turn off colors") do |v|
|
47
51
|
options[:no_colors] = true
|
48
52
|
end
|
@@ -68,8 +72,11 @@ begin
|
|
68
72
|
! Hi there Windows user.
|
69
73
|
|
70
74
|
You will not be able to see colors, all diacritics
|
71
|
-
will be transliterated
|
72
|
-
is not available
|
75
|
+
will be transliterated, dynamic console width
|
76
|
+
is not available, You cannot answer using the [TAB]
|
77
|
+
and the console will not be cleared on new question.
|
78
|
+
|
79
|
+
Sorry for the inconvenience.
|
73
80
|
END_OF_MESSAGE
|
74
81
|
|
75
82
|
end
|
data/lib/pickaxe/main.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Pickaxe
|
2
2
|
class Main
|
3
3
|
class NoTests < PickaxeError; end
|
4
|
+
class TabTermination < PickaxeError; end
|
4
5
|
|
5
6
|
cattr_accessor :options
|
6
7
|
|
@@ -40,18 +41,26 @@ END_OF_TEST
|
|
40
41
|
puts "! Hit Control-D or Control-C to end test.\n\n".color(:green)
|
41
42
|
end
|
42
43
|
|
44
|
+
Readline.completion_proc = Proc.new do |line|
|
45
|
+
@line = line
|
46
|
+
raise TabTermination
|
47
|
+
end
|
48
|
+
|
43
49
|
while @current_index < @questions.length + (Main.options[:full_test] ? 1 : 0) do
|
44
50
|
@question = @questions[@current_index]
|
45
51
|
|
46
52
|
unless @question.nil?
|
53
|
+
Shell.clear
|
54
|
+
|
55
|
+
puts "#{@last_answer}\n\n"
|
47
56
|
print "#{@current_index+1} / #{@questions.length}\t\t"
|
48
|
-
puts "From: #{@question.file}\t\tTime spent: #{spent?}"
|
57
|
+
puts "From: #{@question.file}\t\tTime spent: #{spent?}\n\n"
|
49
58
|
|
50
59
|
puts @question.answered(@answers[@question])
|
51
60
|
else
|
52
61
|
puts END_OF_TEST_MESSAGE
|
53
62
|
end
|
54
|
-
|
63
|
+
|
55
64
|
until (line = prompt?).nil? or command(line)
|
56
65
|
# empty
|
57
66
|
end
|
@@ -70,13 +79,18 @@ END_OF_TEST
|
|
70
79
|
# <+ moves back one question
|
71
80
|
# >+ moves forward one question
|
72
81
|
# a [ b ...] answers the question
|
82
|
+
# . shows current question again
|
73
83
|
# ? shows help
|
74
84
|
#
|
75
85
|
def command(line)
|
86
|
+
@last_answer = nil
|
87
|
+
|
76
88
|
case line
|
77
89
|
when /^\s*@\s*(.+)/ then # @ question
|
78
90
|
@current_index = Integer($1) -1
|
79
91
|
true
|
92
|
+
when /\./ then
|
93
|
+
true
|
80
94
|
when /<+/ then
|
81
95
|
if @current_index > 0
|
82
96
|
@current_index -= 1
|
@@ -110,18 +124,25 @@ Available commands (whitespace does not matter):
|
|
110
124
|
< moves back one question
|
111
125
|
> moves forward one question
|
112
126
|
a [ b ...] answers the question
|
127
|
+
. shows current question again
|
113
128
|
? shows help
|
114
129
|
|
115
130
|
END_OF_HELP
|
116
131
|
false
|
117
132
|
else
|
118
|
-
@answers[@question] = line
|
133
|
+
@answers[@question] = convert_answers(line)
|
119
134
|
unless Main.options[:full_test]
|
120
|
-
|
135
|
+
@last_answer = @question.check?(@answers[@question])
|
136
|
+
|
137
|
+
if @current_index == (@questions.length-1)
|
138
|
+
puts @last_answer
|
139
|
+
end
|
140
|
+
|
121
141
|
if Main.options[:repeat_incorrect] and not @question.correct?(@answers[@question])
|
122
142
|
@answers.delete(@question)
|
123
143
|
@questions.insert(@current_index + 1 + rand(@questions.length - @current_index), @question)
|
124
|
-
@questions.delete_at(@current_index)
|
144
|
+
@questions.delete_at(@current_index)
|
145
|
+
@question.reset!
|
125
146
|
else
|
126
147
|
@current_index += 1
|
127
148
|
end
|
@@ -132,6 +153,17 @@ END_OF_HELP
|
|
132
153
|
end
|
133
154
|
end
|
134
155
|
|
156
|
+
ANSWER_CONVERTION_HASH = ('a'..'z').to_a[0,10].each_with_index.inject({}) do |m, p|
|
157
|
+
m[((p.last + 1) % 10).to_s] = p.first
|
158
|
+
m
|
159
|
+
end
|
160
|
+
|
161
|
+
def convert_answers(line)
|
162
|
+
line.gsub(/\s+/, "").downcase.each_char.collect do |c|
|
163
|
+
ANSWER_CONVERTION_HASH[c] || c
|
164
|
+
end.to_a.uniq
|
165
|
+
end
|
166
|
+
|
135
167
|
def statistics!
|
136
168
|
@questions_length ||= @questions.length.to_f
|
137
169
|
|
@@ -161,8 +193,16 @@ END_OF_HELP
|
|
161
193
|
end
|
162
194
|
|
163
195
|
def prompt?(p = "? ")
|
164
|
-
|
165
|
-
|
196
|
+
unless Pickaxe::WINDOWS_IT_IS
|
197
|
+
begin
|
198
|
+
Readline.readline(p)
|
199
|
+
rescue TabTermination
|
200
|
+
puts
|
201
|
+
@line + "\n"
|
202
|
+
end else
|
203
|
+
print p
|
204
|
+
$stdin.gets
|
205
|
+
end
|
166
206
|
end
|
167
207
|
|
168
208
|
def spent?
|
data/lib/pickaxe/shell.rb
CHANGED
@@ -11,6 +11,13 @@ module Pickaxe
|
|
11
11
|
(dynamic_width_stty.nonzero? || dynamic_width_tput)
|
12
12
|
end
|
13
13
|
end
|
14
|
+
|
15
|
+
def self.clear
|
16
|
+
unless Pickaxe::WINDOWS_IT_IS or Main.options[:no_clear]
|
17
|
+
print "\e[H\e[2J"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
14
21
|
private
|
15
22
|
def self.dynamic_width_stty
|
16
23
|
%x{stty size 2>/dev/null}.split[1].to_i
|
data/lib/pickaxe/test.rb
CHANGED
@@ -134,6 +134,10 @@ module Pickaxe
|
|
134
134
|
end
|
135
135
|
end
|
136
136
|
|
137
|
+
def reset!
|
138
|
+
@shuffled_answers = nil
|
139
|
+
end
|
140
|
+
|
137
141
|
def shuffled_answers
|
138
142
|
if @shuffled_answers.nil?
|
139
143
|
unless Main.options[:sorted_answers]
|
@@ -184,10 +188,19 @@ module Pickaxe
|
|
184
188
|
if correct?(given)
|
185
189
|
"Correct!".color(:green)
|
186
190
|
else
|
187
|
-
|
188
|
-
missed =
|
189
|
-
|
190
|
-
|
191
|
+
missed = (correct_answers - given)
|
192
|
+
missed = unless missed.empty?
|
193
|
+
"Missed: #{missed.join}".color(:yellow)
|
194
|
+
else
|
195
|
+
""
|
196
|
+
end
|
197
|
+
incorrect = (given - correct_answers)
|
198
|
+
incorrect = unless incorrect.empty?
|
199
|
+
"Wrong: #{incorrect.join}".color(:red)
|
200
|
+
else
|
201
|
+
""
|
202
|
+
end
|
203
|
+
"Incorrect, should be:".color(:red) + " #{correct_answers.join}! #{[missed, incorrect].join(" ")}"
|
191
204
|
end
|
192
205
|
end
|
193
206
|
end
|
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: 5
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 6
|
9
|
-
-
|
10
|
-
version: 0.6.
|
9
|
+
- 1
|
10
|
+
version: 0.6.1
|
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-12 00:00:00 +01:00
|
19
19
|
default_executable: bin/pickaxe
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|