cw 0.2.2 → 0.2.4
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/.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
|
- - ">="
|