runby_pace 0.6.150 → 0.6.151
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/lib/runby_pace/runby_time.rb +14 -27
- data/lib/runby_pace/runby_time_parser.rb +65 -30
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 71c401e8a77a8960c6c7114917cabf50a2c0d8ad
|
4
|
+
data.tar.gz: 423bbf069cd9fb50c76f23dfe02302750f9bf209
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5762c55f858d8c425b730501868f376c26b71369a58ddfb944593a4613b2d707dc7867d35a35788bcea58cf528567010c68f21758781a98b2c2546e2c1137988
|
7
|
+
data.tar.gz: 8f0daa76640f6cb19e16e1476acae567e918348f27a7e0f400f0c7f1d86187db4018ae778fbf9e0264d7abacc95b2fa4affc74443fd0ed0134f3f9713f18fa60
|
@@ -7,14 +7,14 @@ module Runby
|
|
7
7
|
|
8
8
|
attr_reader :time_s, :hours_part, :minutes_part, :seconds_part
|
9
9
|
|
10
|
+
def self.new(time)
|
11
|
+
return time if time.is_a? RunbyTime
|
12
|
+
return RunbyTime.parse time if time.is_a?(String) || time.is_a?(Symbol)
|
13
|
+
super
|
14
|
+
end
|
15
|
+
|
10
16
|
def initialize(time)
|
11
|
-
|
12
|
-
init_from_string time
|
13
|
-
elsif time.is_a?(RunbyTime)
|
14
|
-
init_from_clone time
|
15
|
-
elsif time.is_a?(Hash)
|
16
|
-
init_from_hash time
|
17
|
-
end
|
17
|
+
init_from_parts time if time.is_a? RunbyTimeParser::TimeParts
|
18
18
|
freeze
|
19
19
|
end
|
20
20
|
|
@@ -62,7 +62,7 @@ module Runby
|
|
62
62
|
end
|
63
63
|
|
64
64
|
def to_s
|
65
|
-
@time_s
|
65
|
+
@time_s
|
66
66
|
end
|
67
67
|
|
68
68
|
def total_hours
|
@@ -126,25 +126,12 @@ module Runby
|
|
126
126
|
|
127
127
|
private
|
128
128
|
|
129
|
-
# @param [
|
130
|
-
def
|
131
|
-
@time_s =
|
132
|
-
@hours_part =
|
133
|
-
@minutes_part =
|
134
|
-
@seconds_part =
|
135
|
-
end
|
136
|
-
|
137
|
-
# @param [RunbyTime] time
|
138
|
-
def init_from_clone(time)
|
139
|
-
@time_s = time.time_s
|
140
|
-
@hours_part = time.hours_part
|
141
|
-
@minutes_part = time.minutes_part
|
142
|
-
@seconds_part = time.seconds_part
|
143
|
-
end
|
144
|
-
|
145
|
-
# @param [String] time
|
146
|
-
def init_from_string(time)
|
147
|
-
init_from_clone RunbyTime.parse time
|
129
|
+
# @param [RunbyTimeParser::TimeParts] parts
|
130
|
+
def init_from_parts(parts)
|
131
|
+
@time_s = parts.format
|
132
|
+
@hours_part = parts[:hours]
|
133
|
+
@minutes_part = parts[:minutes]
|
134
|
+
@seconds_part = parts[:seconds]
|
148
135
|
end
|
149
136
|
end
|
150
137
|
end
|
@@ -5,41 +5,76 @@ module Runby
|
|
5
5
|
class RunbyTimeParser
|
6
6
|
def self.parse(str)
|
7
7
|
time = str.to_s.strip.chomp
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
elsif time.match?(/^\d?\d:\d\d$/)
|
15
|
-
parts = time.split(':')
|
16
|
-
hours_part = 0
|
17
|
-
minutes_part = parts[0].to_i
|
18
|
-
seconds_part = parts[1].to_i
|
19
|
-
elsif time.match?(/^\d+$/)
|
20
|
-
hours_part = 0
|
21
|
-
minutes_part = time.to_i
|
22
|
-
seconds_part = 0
|
23
|
-
elsif time.match?(/^\d+[,. ]\d+$/)
|
24
|
-
parts = time.split(/[,. ]/)
|
25
|
-
hours_part = 0
|
26
|
-
minutes_part = parts[0].to_i
|
27
|
-
seconds_part = (parts[1].to_i / 10.0 * 60).to_i
|
8
|
+
if time_string?(time)
|
9
|
+
parts = TimeParts.new(time.split(':').reverse)
|
10
|
+
elsif integer?(time)
|
11
|
+
parts = extract_minutes_from_integer time
|
12
|
+
elsif decimal?(time)
|
13
|
+
parts = extract_minutes_from_decimal time
|
28
14
|
else
|
29
15
|
raise 'Invalid time format'
|
30
16
|
end
|
17
|
+
RunbyTime.new(parts)
|
18
|
+
end
|
31
19
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
20
|
+
def self.decimal?(str)
|
21
|
+
str.match?(/^\d+[,. ]\d+$/)
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.integer?(str)
|
25
|
+
str.match?(/^\d+$/)
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.time_string?(str)
|
29
|
+
str.match?(/^\d?\d(:\d\d)+$/)
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.extract_minutes_from_decimal(decimal_str)
|
33
|
+
decimal_parts = decimal_str.split(/[,. ]/)
|
34
|
+
minutes = decimal_parts[0].to_i
|
35
|
+
seconds = (decimal_parts[1].to_i / 10.0 * 60).to_i
|
36
|
+
TimeParts.new([seconds, minutes])
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.extract_minutes_from_integer(integer_str)
|
40
|
+
TimeParts.new([0, integer_str.to_i])
|
41
|
+
end
|
42
|
+
|
43
|
+
# Encapsulates the parts of a time string
|
44
|
+
class TimeParts
|
45
|
+
def initialize(parts_array)
|
46
|
+
@keys = { seconds: 0, minutes: 1, hours: 2 }
|
47
|
+
@parts = Array.new(@keys.count, 0)
|
48
|
+
Range.new(0, parts_array.count - 1).each { |i| @parts[i] = parts_array[i] }
|
49
|
+
validate
|
50
|
+
freeze
|
51
|
+
end
|
52
|
+
|
53
|
+
def [](key)
|
54
|
+
i = @keys[key]
|
55
|
+
@parts[i].to_i
|
56
|
+
end
|
57
|
+
|
58
|
+
def format
|
59
|
+
time_f = +''
|
60
|
+
@parts.reverse_each do |part|
|
61
|
+
time_f << ':' << part.to_s.rjust(2, '0')
|
62
|
+
end
|
63
|
+
# Remove leading ':'
|
64
|
+
time_f.slice!(0)
|
65
|
+
# Remove leading '00:00...'
|
66
|
+
time_f.sub!(/^(?:00:)+(\d\d:\d\d)/, '\1') if time_f.length > 5
|
67
|
+
# If the time looks like 00:48, only show 0:48
|
68
|
+
time_f.slice!(0) if time_f.slice(0) == '0'
|
69
|
+
time_f
|
39
70
|
end
|
40
|
-
time_formatted = "#{hours_part_formatted}#{minutes_part.to_s.rjust(2, '0')}:#{seconds_part.to_s.rjust(2, '0')}"
|
41
71
|
|
42
|
-
|
72
|
+
def validate
|
73
|
+
raise 'Hours must be less than 24' if self[:hours] > 23
|
74
|
+
raise 'Minutes must be less than 60 if hours are supplied' if self[:hours].positive? && self[:minutes] > 59
|
75
|
+
raise 'Minutes must be less than 99 if no hours are supplied' if self[:hours].zero? && self[:minutes] > 99
|
76
|
+
raise 'Seconds must be less than 60' if self[:seconds] > 59
|
77
|
+
end
|
43
78
|
end
|
44
79
|
end
|
45
|
-
end
|
80
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: runby_pace
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.151
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ty Walls
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-07-
|
11
|
+
date: 2017-07-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -106,7 +106,7 @@ homepage: https://github.com/tygerbytes/runby-pace
|
|
106
106
|
licenses:
|
107
107
|
- MIT
|
108
108
|
metadata:
|
109
|
-
commit-hash:
|
109
|
+
commit-hash: bb461b8b253e567bb6123f62a963be7a875b3285
|
110
110
|
post_install_message:
|
111
111
|
rdoc_options: []
|
112
112
|
require_paths:
|