wpm 0.1.0 → 0.1.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +35 -0
- data/exe/wpm +2 -0
- data/lib/wpm/quotes.yml +3 -0
- data/lib/wpm/version.rb +2 -2
- data/lib/wpm.rb +161 -4
- data/wpm.gemspec +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4cc3c4877fb13c8efb66e4c318d5abb2a9fccc2b131e39da402d387be81e0018
|
4
|
+
data.tar.gz: 48cc76b43407e2c7853cea45fa365744bd9a2b36161a9f5de045e8b2145382b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5af70b6da9e4caf524ba7fe38120a36a63694314caf7f428f61f7a2665c00ea9b04248ea3418db3e129687d494ca58d254a067782ef186c9d97f198061a3c481
|
7
|
+
data.tar.gz: 280817de709846f9b27483b4e0fc95483aee28f4ca8a12c4a950810a0e7639112937a16c54e3d8deb69df5e1e7203e802accea08b718f123053593a14bb07540
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
wpm (0.1.1)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
ansi (1.5.0)
|
10
|
+
benchmark-ips (2.7.2)
|
11
|
+
builder (3.2.4)
|
12
|
+
byebug (11.0.1)
|
13
|
+
minitest (5.14.0)
|
14
|
+
minitest-reporters (1.3.8)
|
15
|
+
ansi
|
16
|
+
builder
|
17
|
+
minitest (>= 5.0)
|
18
|
+
ruby-progressbar
|
19
|
+
rake (13.0.1)
|
20
|
+
ruby-progressbar (1.10.1)
|
21
|
+
|
22
|
+
PLATFORMS
|
23
|
+
ruby
|
24
|
+
|
25
|
+
DEPENDENCIES
|
26
|
+
benchmark-ips
|
27
|
+
bundler (~> 2.0)
|
28
|
+
byebug (~> 11.0.1)
|
29
|
+
minitest (~> 5.0)
|
30
|
+
minitest-reporters (~> 1.3.8)
|
31
|
+
rake (~> 13.0.1)
|
32
|
+
wpm!
|
33
|
+
|
34
|
+
BUNDLED WITH
|
35
|
+
2.1.4
|
data/exe/wpm
CHANGED
data/lib/wpm/quotes.yml
ADDED
@@ -0,0 +1,3 @@
|
|
1
|
+
- "Do nothing out of selfish ambition or vain conceit, but in humility consider others better than yourselves. - philippians 2:3"
|
2
|
+
- "It's a funny thing, but people mostly have it backward. They think they live by what they want. But really, what guides them is what they're afraid of. What they don't want. - khaled hosseini typeracer"
|
3
|
+
- "roses are red, violets are blue"
|
data/lib/wpm/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
module
|
2
|
-
VERSION = "0.1.
|
1
|
+
module WPM
|
2
|
+
VERSION = "0.1.1"
|
3
3
|
end
|
data/lib/wpm.rb
CHANGED
@@ -1,6 +1,163 @@
|
|
1
|
-
require
|
1
|
+
require 'io/console'
|
2
|
+
require 'wpm/version'
|
3
|
+
require 'yaml'
|
2
4
|
|
3
|
-
|
4
|
-
|
5
|
-
|
5
|
+
class WPMError < StandardError; end
|
6
|
+
|
7
|
+
class Array
|
8
|
+
def average
|
9
|
+
(reduce(:+).to_f/size).round(2)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module WPM
|
14
|
+
extend self
|
15
|
+
|
16
|
+
def race(args)
|
17
|
+
help if !(args & %w[-h --help]).empty?
|
18
|
+
|
19
|
+
parse_options(args) unless args.empty?
|
20
|
+
|
21
|
+
@max_length||=4000
|
22
|
+
|
23
|
+
@eot=0x03
|
24
|
+
@eof=0x04
|
25
|
+
|
26
|
+
if quotes.empty?
|
27
|
+
puts "No quotes with less than #{@max_length} characters found"
|
28
|
+
exit
|
29
|
+
end
|
30
|
+
|
31
|
+
@color="\e[4;32m"
|
32
|
+
@no_color="\e[m"
|
33
|
+
|
34
|
+
@lines=quotes[rand(quotes.size)].chars.each_slice(term_width).map(&:join)
|
35
|
+
@line=0
|
36
|
+
@pos=0
|
37
|
+
|
38
|
+
# average length of English words
|
39
|
+
@word_length=5
|
40
|
+
|
41
|
+
@start_time=time
|
42
|
+
print_text
|
43
|
+
|
44
|
+
loop do
|
45
|
+
update_text
|
46
|
+
break if @line==@lines.size-1 and pos==@lines.last.size
|
47
|
+
end
|
48
|
+
|
49
|
+
save_wpm
|
50
|
+
puts "\nWPM: #{wpm}"
|
51
|
+
end
|
52
|
+
|
53
|
+
def help
|
54
|
+
puts <<~eof
|
55
|
+
Usage: wpm
|
56
|
+
|
57
|
+
Options:
|
58
|
+
-h: show this message
|
59
|
+
-s: print stats
|
60
|
+
-l: message length [1: short, 2: medium, 3: long]
|
61
|
+
-q: print quotes.yml path
|
62
|
+
eof
|
63
|
+
exit
|
64
|
+
end
|
65
|
+
|
66
|
+
def parse_options(args)
|
67
|
+
if args.first=='-s'
|
68
|
+
stats
|
69
|
+
exit
|
70
|
+
end
|
71
|
+
|
72
|
+
if args.first=='-q'
|
73
|
+
puts quotes_file
|
74
|
+
exit
|
75
|
+
end
|
76
|
+
|
77
|
+
if args.shift=='-l' and args.first.to_i > 0
|
78
|
+
@max_length=args.first.to_i
|
79
|
+
return
|
80
|
+
end
|
81
|
+
|
82
|
+
puts "Unknown option"
|
83
|
+
bye
|
84
|
+
rescue => e
|
85
|
+
"Bad options. For help: `wpm -h`"
|
86
|
+
exit
|
87
|
+
end
|
88
|
+
|
89
|
+
def stats
|
90
|
+
str=File.open(wpm_file).read
|
91
|
+
scores=str.split(" ").map(&:to_i).select.with_index{|e,i| i.odd?}
|
92
|
+
puts "Number of races: #{str.count("\n")}"
|
93
|
+
puts "Average speed: #{scores.average}WPM"
|
94
|
+
end
|
95
|
+
|
96
|
+
def time
|
97
|
+
Time.now.to_i
|
98
|
+
end
|
99
|
+
|
100
|
+
def wpm
|
101
|
+
@lines.join(' ').size*60/((time-@start_time)*@word_length)
|
102
|
+
end
|
103
|
+
|
104
|
+
def wpm_file
|
105
|
+
"#{ENV['HOME']}/.wpm_history"
|
106
|
+
end
|
107
|
+
|
108
|
+
def save_wpm
|
109
|
+
open(wpm_file,'a') do |f|
|
110
|
+
f.puts "#{Time.now.strftime("%Y-%M-%d")} #{wpm}"
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def quotes
|
115
|
+
YAML.load(open(quotes_file))
|
116
|
+
.sort_by(&:length)
|
117
|
+
.select {|e| e.size<@max_length}
|
118
|
+
rescue => e
|
119
|
+
"Error while reading #{quotes_file}"
|
120
|
+
end
|
121
|
+
|
122
|
+
def quotes_file
|
123
|
+
"#{__dir__}/wpm/quotes.yml"
|
124
|
+
end
|
125
|
+
|
126
|
+
def print_text
|
127
|
+
print "\r"+text.sub(/(.{#{pos}})/,"#{@color}\\1#{@no_color}")+"\r"
|
128
|
+
end
|
129
|
+
|
130
|
+
# width of the terminal
|
131
|
+
def term_width
|
132
|
+
IO.console.winsize.last
|
133
|
+
end
|
134
|
+
|
135
|
+
def update_text
|
136
|
+
system('stty raw -echo')
|
137
|
+
c=STDIN.getc
|
138
|
+
bye if c==@eof.chr or c==@eot.chr
|
139
|
+
carriage_return if @pos>=term_width-1
|
140
|
+
@pos+=1 if c==text[pos]
|
141
|
+
ensure
|
142
|
+
system('stty -raw echo')
|
143
|
+
print_text
|
144
|
+
end
|
145
|
+
|
146
|
+
def carriage_return
|
147
|
+
@pos=0
|
148
|
+
@line+=1
|
149
|
+
end
|
150
|
+
|
151
|
+
def text
|
152
|
+
@lines[@line]
|
153
|
+
end
|
154
|
+
|
155
|
+
def pos
|
156
|
+
@pos
|
157
|
+
end
|
158
|
+
|
159
|
+
def bye
|
160
|
+
puts "\nBye"
|
161
|
+
exit
|
162
|
+
end
|
6
163
|
end
|
data/wpm.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wpm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- sergioro
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-02-
|
11
|
+
date: 2020-02-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -106,6 +106,7 @@ files:
|
|
106
106
|
- ".rubocop.yml"
|
107
107
|
- ".travis.yml"
|
108
108
|
- Gemfile
|
109
|
+
- Gemfile.lock
|
109
110
|
- LICENSE.txt
|
110
111
|
- README.md
|
111
112
|
- Rakefile
|
@@ -113,6 +114,7 @@ files:
|
|
113
114
|
- bin/setup
|
114
115
|
- exe/wpm
|
115
116
|
- lib/wpm.rb
|
117
|
+
- lib/wpm/quotes.yml
|
116
118
|
- lib/wpm/version.rb
|
117
119
|
- wpm.gemspec
|
118
120
|
homepage:
|