cw 0.2.2 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -3
- data/.travis.yml +1 -1
- data/README.md +16 -40
- data/Rakefile +4 -0
- data/VERSION +1 -0
- data/bin/cw +44 -0
- data/cw.gemspec +8 -5
- data/data/text/{adv_of_sh_holmes.txt → book.txt} +4 -4
- data/example.rb +17 -17
- data/lib/cw.rb +53 -18
- data/lib/cw/alphabet.rb +37 -0
- data/lib/cw/audio_player.rb +31 -3
- data/lib/cw/book.rb +14 -7
- data/lib/cw/book_details.rb +2 -2
- data/lib/cw/cl.rb +11 -2
- data/lib/cw/config_file.rb +69 -0
- data/lib/cw/cw_dsl.rb +19 -57
- data/lib/cw/monitor_keys.rb +1 -1
- data/lib/cw/params.rb +104 -0
- data/lib/cw/print.rb +19 -23
- data/lib/cw/repeat_word.rb +2 -2
- data/lib/cw/reveal.rb +47 -0
- data/lib/cw/sentence.rb +22 -2
- data/lib/cw/test_words.rb +1 -1
- data/lib/cw/tester.rb +17 -4
- data/lib/cw/timing.rb +1 -1
- data/lib/cw/tone_generator.rb +2 -2
- data/lib/cw/words.rb +20 -1
- data/test/test_cw.rb +8 -11
- data/test/test_tester.rb +62 -0
- metadata +30 -14
- data/classes.svg +0 -145
- data/classes.svg.dot +0 -360
- data/daily.rb +0 -182
- data/data/text/progress.txt +0 -1
- data/lib/cw/cw_params.rb +0 -50
data/lib/cw/print.rb
CHANGED
@@ -75,8 +75,8 @@ class Print
|
|
75
75
|
|
76
76
|
newline_maybe value
|
77
77
|
|
78
|
-
print Paint["#{value} ",
|
79
|
-
print Paint["#{value} ",
|
78
|
+
print Paint["#{value} ", success_colour] if success
|
79
|
+
print Paint["#{value} ", fail_colour ] unless (success || type == :pass_only)
|
80
80
|
return true
|
81
81
|
end
|
82
82
|
end
|
@@ -86,8 +86,8 @@ class Print
|
|
86
86
|
end
|
87
87
|
|
88
88
|
def paint_success_failure(popped)
|
89
|
-
print paint(popped[:value],
|
90
|
-
print paint(popped[:value],
|
89
|
+
print paint(popped[:value], success_colour) if popped[:success]
|
90
|
+
print paint(popped[:value], fail_colour ) unless popped[:success]
|
91
91
|
end
|
92
92
|
|
93
93
|
def char_result popped
|
@@ -100,39 +100,35 @@ class Print
|
|
100
100
|
|
101
101
|
def heading
|
102
102
|
"Current Sentence is duration: secs".length.times do
|
103
|
-
print '*'
|
103
|
+
print paint('*', list_colour)
|
104
104
|
puts
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|
108
|
-
def
|
109
|
-
print paint(word,
|
110
|
-
cursor_pos = word.size
|
111
|
-
(12 - cursor_pos).times{print ' '}
|
108
|
+
def fail word
|
109
|
+
print paint("#{word}", fail_colour)
|
112
110
|
end
|
113
111
|
|
114
|
-
def
|
115
|
-
|
116
|
-
print paint("#{word} \r\n", :green)
|
112
|
+
def list word
|
113
|
+
print paint("#{word}", list_colour)
|
117
114
|
end
|
118
115
|
|
119
|
-
def
|
120
|
-
|
116
|
+
def success word
|
117
|
+
newline_maybe word
|
118
|
+
return if(@print_count == 0 && word == ' ')
|
119
|
+
print paint("#{word}", success_colour)
|
121
120
|
end
|
122
121
|
|
123
|
-
def
|
124
|
-
|
122
|
+
def success_colour
|
123
|
+
Params.success_colour ||= :blue
|
125
124
|
end
|
126
125
|
|
127
|
-
def
|
128
|
-
|
129
|
-
print paint("#{attempt }\r\n", :red)
|
126
|
+
def fail_colour
|
127
|
+
Params.fail_colour ||= :red
|
130
128
|
end
|
131
129
|
|
132
|
-
def
|
133
|
-
|
134
|
-
return if(@print_count == 0 && word == ' ')
|
135
|
-
print paint("#{word}", :blue)
|
130
|
+
def list_colour
|
131
|
+
Params.list_colour ||= :white
|
136
132
|
end
|
137
133
|
|
138
134
|
def print_advice name
|
data/lib/cw/repeat_word.rb
CHANGED
@@ -14,7 +14,7 @@ class RepeatWord < FileDetails
|
|
14
14
|
def print_failed_exit_words
|
15
15
|
until stream.stream_empty?
|
16
16
|
word = stream.pop[:value]
|
17
|
-
print.
|
17
|
+
print.fail word + ' ' unless @repeat_word
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -28,7 +28,7 @@ class RepeatWord < FileDetails
|
|
28
28
|
process_word_maybe
|
29
29
|
break if timing.char_delay_timeout?
|
30
30
|
end
|
31
|
-
print.
|
31
|
+
print.success letr if print_letters?
|
32
32
|
break if quit?
|
33
33
|
end
|
34
34
|
end
|
data/lib/cw/reveal.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
class Reveal < FileDetails
|
4
|
+
|
5
|
+
include Tester
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
super()
|
9
|
+
@reveal_buf = ''
|
10
|
+
puts 'Reveal mode:'
|
11
|
+
end
|
12
|
+
|
13
|
+
def print_test_advice ; print.print_advice('Test Words') ; end
|
14
|
+
|
15
|
+
def print_failed_exit_words
|
16
|
+
until stream.stream_empty?
|
17
|
+
@reveal_buf += stream.pop[:value] + ' '
|
18
|
+
end
|
19
|
+
print.success @reveal_buf
|
20
|
+
end
|
21
|
+
|
22
|
+
def process_input_word_maybe
|
23
|
+
if @word_to_process
|
24
|
+
stream.match_last_active_element @process_input_word.strip
|
25
|
+
@process_input_word = @word_to_process = nil
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def build_word_maybe
|
30
|
+
@input_word ||= empty_string
|
31
|
+
@input_word << key_chr if is_relevant_char?
|
32
|
+
move_word_to_process if complete_word?
|
33
|
+
end
|
34
|
+
|
35
|
+
def process_letter letr
|
36
|
+
current_word.process_letter letr
|
37
|
+
sleep_char_delay letr
|
38
|
+
end
|
39
|
+
|
40
|
+
def print_marked_maybe
|
41
|
+
@popped = stream.pop_next_marked
|
42
|
+
if @popped
|
43
|
+
@reveal_buf += @popped[:value] + ' '
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
data/lib/cw/sentence.rb
CHANGED
@@ -8,7 +8,8 @@ class Sentence
|
|
8
8
|
def all ; @sentences ; end
|
9
9
|
def next ; @next = true ; end
|
10
10
|
def next? ; @next ; end
|
11
|
-
def forward ; @index += 1 ; end
|
11
|
+
#todo def forward ; @index += 1 ; end
|
12
|
+
def forward ; @index ; end
|
12
13
|
def previous? ; @previous ; end
|
13
14
|
def repeat? ; @repeat ; end
|
14
15
|
def change? ; next? || previous? ; end
|
@@ -25,12 +26,31 @@ class Sentence
|
|
25
26
|
@index = @index <= 1 ? 0 : @index - 1
|
26
27
|
end
|
27
28
|
|
29
|
+
def create_progress_maybe progress_file
|
30
|
+
unless File.exists? progress_file
|
31
|
+
reset_progress progress_file
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def reset_progress progress_file
|
36
|
+
@index = 0
|
37
|
+
write_progress progress_file
|
38
|
+
end
|
39
|
+
|
40
|
+
def check_end_of_book progress_file
|
41
|
+
if @index >= @sentences.size
|
42
|
+
reset_progress progress_file
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
28
46
|
def read_progress progress_file
|
47
|
+
create_progress_maybe progress_file
|
29
48
|
File.open(progress_file, 'r') {|f| @index = f.readline.to_i}
|
49
|
+
check_end_of_book progress_file
|
30
50
|
end
|
31
51
|
|
32
52
|
def write_progress progress_file
|
33
|
-
|
53
|
+
File.open(progress_file, 'w') {|f| f.puts @index.to_s}
|
34
54
|
end
|
35
55
|
|
36
56
|
def read_book book
|
data/lib/cw/test_words.rb
CHANGED
data/lib/cw/tester.rb
CHANGED
@@ -65,6 +65,7 @@ module Tester
|
|
65
65
|
break if timing.char_delay_timeout?
|
66
66
|
else
|
67
67
|
process_space_maybe(letr) if(self.class == TestWords)
|
68
|
+
process_space_maybe(letr) if(self.class == Reveal)
|
68
69
|
process_word_maybe
|
69
70
|
break if timing.char_delay_timeout?
|
70
71
|
end
|
@@ -81,7 +82,7 @@ module Tester
|
|
81
82
|
stream.add_char(letr) if(self.class == TestLetters)
|
82
83
|
end
|
83
84
|
process_letters letr
|
84
|
-
print.
|
85
|
+
print.success letr if print_letters?
|
85
86
|
break if(book_class && change_repeat_or_quit?)
|
86
87
|
break if ((! book_class) && quit?)
|
87
88
|
end
|
@@ -117,7 +118,7 @@ module Tester
|
|
117
118
|
|
118
119
|
def print_failed_exit_words
|
119
120
|
until stream.stream_empty?
|
120
|
-
print.
|
121
|
+
print.fail stream.pop[:value]
|
121
122
|
end
|
122
123
|
end
|
123
124
|
|
@@ -152,6 +153,7 @@ module Tester
|
|
152
153
|
quit
|
153
154
|
global_quit
|
154
155
|
audio_stop
|
156
|
+
true
|
155
157
|
end
|
156
158
|
end
|
157
159
|
|
@@ -163,9 +165,20 @@ module Tester
|
|
163
165
|
@input_word.split(//).last(1).first
|
164
166
|
end
|
165
167
|
|
168
|
+
def word_proc_timeout(arg = :status)
|
169
|
+
if arg == :init
|
170
|
+
@wp_timeout = Time.now + 5
|
171
|
+
else
|
172
|
+
return true if(Time.now > @wp_timeout)
|
173
|
+
end
|
174
|
+
return false
|
175
|
+
end
|
176
|
+
|
166
177
|
def wait_for_no_word_process
|
178
|
+
word_proc_timeout(:init)
|
167
179
|
while @word_to_process
|
168
|
-
sleep 0.
|
180
|
+
sleep 0.01
|
181
|
+
exit(1) if word_proc_timeout
|
169
182
|
end
|
170
183
|
end
|
171
184
|
|
@@ -204,7 +217,7 @@ module Tester
|
|
204
217
|
stream.add_word current_word.strip
|
205
218
|
current_word.clear
|
206
219
|
letr.clear
|
207
|
-
print.
|
220
|
+
print.success space if print_letters?
|
208
221
|
end
|
209
222
|
end
|
210
223
|
|
data/lib/cw/timing.rb
CHANGED
data/lib/cw/tone_generator.rb
CHANGED
@@ -8,9 +8,9 @@ class ToneGenerator
|
|
8
8
|
|
9
9
|
def initialize
|
10
10
|
@max_amplitude = 0.5
|
11
|
-
@wpm = Params.wpm
|
11
|
+
@wpm = Params.wpm.to_f
|
12
12
|
@frequency = Params.frequency
|
13
|
-
@effective_wpm = Params.effective_wpm ? Params.effective_wpm : @wpm
|
13
|
+
@effective_wpm = Params.effective_wpm ? Params.effective_wpm.to_f : @wpm
|
14
14
|
@sample_rate = 2400
|
15
15
|
@print = Print.new
|
16
16
|
end
|
data/lib/cw/words.rb
CHANGED
@@ -13,7 +13,6 @@ class Words
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def double_words
|
16
|
-
puts 'here'
|
17
16
|
temp = []
|
18
17
|
@words.each do |wrd|
|
19
18
|
2.times { temp.push wrd }
|
@@ -73,6 +72,26 @@ class Words
|
|
73
72
|
@words.select{|wrd| wrd.include?(letr)}
|
74
73
|
end
|
75
74
|
|
75
|
+
def containing(* letters)
|
76
|
+
lets = letters.flatten.join('').split("")
|
77
|
+
found, temp, @words = false, @words, []
|
78
|
+
temp.each do |wrd|
|
79
|
+
wrd_lets = wrd.split("")
|
80
|
+
wrd_lets.each do |wrd_let|
|
81
|
+
if lets.include?(wrd_let)
|
82
|
+
found = true
|
83
|
+
else
|
84
|
+
found = false
|
85
|
+
break
|
86
|
+
end
|
87
|
+
end
|
88
|
+
if found
|
89
|
+
@words.push wrd
|
90
|
+
end
|
91
|
+
end
|
92
|
+
@words
|
93
|
+
end
|
94
|
+
|
76
95
|
def including(* letters)
|
77
96
|
@words = letters.flatten.collect{|letr| including_letter(letr)}.flatten
|
78
97
|
end
|
data/test/test_cw.rb
CHANGED
@@ -80,15 +80,6 @@ class TestCW < MiniTest::Test
|
|
80
80
|
assert (Time.now - time) < 1
|
81
81
|
end
|
82
82
|
|
83
|
-
def test_default_mp3_filename_is_mp3_output
|
84
|
-
temp = nil
|
85
|
-
cw = CW.new {
|
86
|
-
no_run
|
87
|
-
temp = Params.audio_filename
|
88
|
-
}
|
89
|
-
assert_equal "audio_output.wav", temp
|
90
|
-
end
|
91
|
-
|
92
83
|
def test_reload_reloads_dictionary
|
93
84
|
cw = CW.new {
|
94
85
|
pause
|
@@ -161,7 +152,7 @@ Ending: x
|
|
161
152
|
end
|
162
153
|
|
163
154
|
def test_wpm_defaults_to_25_if_unset
|
164
|
-
assert_equal 25, @cw.wpm
|
155
|
+
assert_equal '25', @cw.wpm.to_s
|
165
156
|
end
|
166
157
|
|
167
158
|
def test_effective_wpm_defaults_to_nil
|
@@ -367,6 +358,12 @@ Ending: x
|
|
367
358
|
assert_equal 456, @cw.frequency
|
368
359
|
end
|
369
360
|
|
361
|
+
def test_play_command_returns_play_command
|
362
|
+
assert_equal 567, @cw.play_command(567)
|
363
|
+
@cw.play_command 456
|
364
|
+
assert_equal 456, @cw.play_command
|
365
|
+
end
|
366
|
+
|
370
367
|
#todo
|
371
368
|
# def test_play_builds_correct_command_for_default
|
372
369
|
# @cw.words = "some words"
|
@@ -460,7 +457,7 @@ Ending: x
|
|
460
457
|
end
|
461
458
|
|
462
459
|
def test_set_default_filename
|
463
|
-
assert @cw.cl.cl_audio_filename.include?('audio_output
|
460
|
+
assert @cw.cl.cl_audio_filename.include?('audio_output'), 'default audio output filename invalid'
|
464
461
|
end
|
465
462
|
|
466
463
|
def test_set_audio_filename_to_given_name
|
data/test/test_tester.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
$VERBOSE = nil #FIXME
|
2
|
+
|
3
|
+
require 'minitest/autorun'
|
4
|
+
require 'minitest/pride'
|
5
|
+
require_relative '../lib/cw'
|
6
|
+
|
7
|
+
class TestTester < MiniTest::Test
|
8
|
+
|
9
|
+
# include Tester
|
10
|
+
|
11
|
+
ROOT = File.expand_path File.dirname(__FILE__) + '/../'
|
12
|
+
|
13
|
+
def setup
|
14
|
+
@object = Object.new
|
15
|
+
@object.extend(Tester)
|
16
|
+
#''end @cw = CW.new
|
17
|
+
# @cw.pause
|
18
|
+
end
|
19
|
+
|
20
|
+
def teardown
|
21
|
+
@cw = nil
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_whatever
|
25
|
+
assert true
|
26
|
+
end
|
27
|
+
#
|
28
|
+
def test_quit?
|
29
|
+
@object.instance_eval('@quit = :quit')
|
30
|
+
assert_equal :quit, @object.quit?
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_quit
|
34
|
+
assert_nil @object.quit?
|
35
|
+
@object.quit
|
36
|
+
assert @object.quit?
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_global_quit?
|
40
|
+
@object.instance_eval('@global_quit = :quit')
|
41
|
+
assert_equal :quit, @object.global_quit?
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_global_quit
|
45
|
+
assert_nil @object.global_quit?
|
46
|
+
@object.global_quit
|
47
|
+
assert @object.global_quit?
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_print_instantiates_Print_object
|
51
|
+
assert_equal Print, @object.print.class
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_timing_instantiates_Timing_object
|
55
|
+
assert_equal Timing, @object.timing.class
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_audio_instantiates_AudioPlayer_object
|
59
|
+
assert_equal AudioPlayer, @object.audio.class
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cw
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Martyn Jago
|
@@ -108,38 +108,53 @@ dependencies:
|
|
108
108
|
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: 0.7.0
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: version
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 1.0.0
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 1.0.0
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: minitest
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
114
128
|
requirements:
|
115
129
|
- - ">="
|
116
130
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
131
|
+
version: 5.8.4
|
118
132
|
type: :development
|
119
133
|
prerelease: false
|
120
134
|
version_requirements: !ruby/object:Gem::Requirement
|
121
135
|
requirements:
|
122
136
|
- - ">="
|
123
137
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
138
|
+
version: 5.8.4
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
140
|
name: simplecov
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
128
142
|
requirements:
|
129
143
|
- - ">="
|
130
144
|
- !ruby/object:Gem::Version
|
131
|
-
version:
|
145
|
+
version: 0.12.0
|
132
146
|
type: :development
|
133
147
|
prerelease: false
|
134
148
|
version_requirements: !ruby/object:Gem::Requirement
|
135
149
|
requirements:
|
136
150
|
- - ">="
|
137
151
|
- !ruby/object:Gem::Version
|
138
|
-
version:
|
152
|
+
version: 0.12.0
|
139
153
|
description: A ruby library to help learn and practice morse code
|
140
154
|
email:
|
141
155
|
- martyn.jago@btinternet.com
|
142
|
-
executables:
|
156
|
+
executables:
|
157
|
+
- cw
|
143
158
|
extensions: []
|
144
159
|
extra_rdoc_files: []
|
145
160
|
files:
|
@@ -154,17 +169,15 @@ files:
|
|
154
169
|
- LICENSE
|
155
170
|
- README.md
|
156
171
|
- Rakefile
|
172
|
+
- VERSION
|
157
173
|
- audio/.gitkeep
|
158
|
-
-
|
159
|
-
- classes.svg.dot
|
174
|
+
- bin/cw
|
160
175
|
- cw.gemspec
|
161
|
-
- daily.rb
|
162
176
|
- data/text/abbreviations.txt
|
163
|
-
- data/text/
|
177
|
+
- data/text/book.txt
|
164
178
|
- data/text/common_words.txt
|
165
179
|
- data/text/cw_conversation.txt
|
166
180
|
- data/text/most_common_words.txt
|
167
|
-
- data/text/progress.txt
|
168
181
|
- data/text/q_codes.txt
|
169
182
|
- example.rb
|
170
183
|
- lib/cw.rb
|
@@ -173,10 +186,10 @@ files:
|
|
173
186
|
- lib/cw/book.rb
|
174
187
|
- lib/cw/book_details.rb
|
175
188
|
- lib/cw/cl.rb
|
189
|
+
- lib/cw/config_file.rb
|
176
190
|
- lib/cw/current_word.rb
|
177
191
|
- lib/cw/cw_dsl.rb
|
178
192
|
- lib/cw/cw_encoding.rb
|
179
|
-
- lib/cw/cw_params.rb
|
180
193
|
- lib/cw/cw_stream.rb
|
181
194
|
- lib/cw/cw_threads.rb
|
182
195
|
- lib/cw/element.rb
|
@@ -184,11 +197,13 @@ files:
|
|
184
197
|
- lib/cw/key_input.rb
|
185
198
|
- lib/cw/monitor_keys.rb
|
186
199
|
- lib/cw/numbers.rb
|
200
|
+
- lib/cw/params.rb
|
187
201
|
- lib/cw/print.rb
|
188
202
|
- lib/cw/process.rb
|
189
203
|
- lib/cw/progress.rb
|
190
204
|
- lib/cw/randomize.rb
|
191
205
|
- lib/cw/repeat_word.rb
|
206
|
+
- lib/cw/reveal.rb
|
192
207
|
- lib/cw/rss.rb
|
193
208
|
- lib/cw/sentence.rb
|
194
209
|
- lib/cw/speak.rb
|
@@ -205,7 +220,8 @@ files:
|
|
205
220
|
- lib/cw/words.rb
|
206
221
|
- test/test_cw.rb
|
207
222
|
- test/test_stream.rb
|
208
|
-
|
223
|
+
- test/test_tester.rb
|
224
|
+
homepage: http://martynjago.co.uk/CW/
|
209
225
|
licenses:
|
210
226
|
- MIT
|
211
227
|
metadata: {}
|
@@ -220,7 +236,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
220
236
|
requirements:
|
221
237
|
- - ">="
|
222
238
|
- !ruby/object:Gem::Version
|
223
|
-
version:
|
239
|
+
version: 2.0.0
|
224
240
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
225
241
|
requirements:
|
226
242
|
- - ">="
|