Class: Runby::RunbyTime
- Inherits:
-
Object
- Object
- Runby::RunbyTime
- Defined in:
- lib/runby_pace/runby_time.rb
Overview
Represents a human-readable time in the format MM:ss
Instance Attribute Summary collapse
-
#minutes_part ⇒ Object
readonly
Returns the value of attribute minutes_part.
-
#seconds_part ⇒ Object
readonly
Returns the value of attribute seconds_part.
-
#time_s ⇒ Object
readonly
Returns the value of attribute time_s.
Class Method Summary collapse
- .from_minutes(total_minutes) ⇒ Object
- .from_seconds(total_seconds) ⇒ Object
- .parse(str) ⇒ Object
- .try_parse(str, is_five_k = false) ⇒ Object
Instance Method Summary collapse
- #+(other) ⇒ Object
- #-(other) ⇒ Object
- #<(other) ⇒ Object
- #<=(other) ⇒ Object
- #==(other) ⇒ Object
- #>(other) ⇒ Object
- #>=(other) ⇒ Object
- #almost_equals?(other_time, tolerance_time = '00:01') ⇒ Boolean
-
#initialize(time) ⇒ RunbyTime
constructor
A new instance of RunbyTime.
- #to_s ⇒ Object
- #total_minutes ⇒ Object
- #total_seconds ⇒ Object
Constructor Details
#initialize(time) ⇒ RunbyTime
Returns a new instance of RunbyTime.
6 7 8 9 10 11 12 13 14 |
# File 'lib/runby_pace/runby_time.rb', line 6 def initialize(time) if time.is_a?(String) || time.is_a?(Symbol) init_from_string time elsif time.is_a?(RunbyTime) init_from_clone time elsif time.is_a?(Hash) init_from_hash time end end |
Instance Attribute Details
#minutes_part ⇒ Object (readonly)
Returns the value of attribute minutes_part.
4 5 6 |
# File 'lib/runby_pace/runby_time.rb', line 4 def minutes_part @minutes_part end |
#seconds_part ⇒ Object (readonly)
Returns the value of attribute seconds_part.
4 5 6 |
# File 'lib/runby_pace/runby_time.rb', line 4 def seconds_part @seconds_part end |
#time_s ⇒ Object (readonly)
Returns the value of attribute time_s.
4 5 6 |
# File 'lib/runby_pace/runby_time.rb', line 4 def time_s @time_s end |
Class Method Details
.from_minutes(total_minutes) ⇒ Object
24 25 26 |
# File 'lib/runby_pace/runby_time.rb', line 24 def self.from_minutes(total_minutes) from_seconds(total_minutes * 60.0) end |
.from_seconds(total_seconds) ⇒ Object
17 18 19 20 21 |
# File 'lib/runby_pace/runby_time.rb', line 17 def self.from_seconds(total_seconds) minutes = total_seconds.abs.to_i / 60 seconds = total_seconds.abs.to_i % 60 RunbyTime.new format('%02d:%02d', minutes, seconds) end |
.parse(str) ⇒ Object
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/runby_pace/runby_time.rb', line 28 def self.parse(str) time = str.to_s.strip.chomp if time.match(/^\d?\d:\d\d$/) parts = time.split(':') minutes_part = parts[0].to_i seconds_part = parts[1].to_i elsif time.match(/^\d+$/) minutes_part = time.to_i seconds_part = 0 elsif time.match(/^\d+[,. ]\d+$/) parts = time.split(/[,. ]/) minutes_part = parts[0].to_i seconds_part = (parts[1].to_i / 10.0 * 60).to_i else raise 'Invalid time format' end raise 'Minutes must be less than 100' if minutes_part > 99 raise 'Seconds must be less than 60' if seconds_part > 59 time_formatted = "#{minutes_part.to_s.rjust(2, '0')}:#{seconds_part.to_s.rjust(2, '0')}" RunbyTime.new(time_s: time_formatted, minutes_part: minutes_part, seconds_part: seconds_part) end |
.try_parse(str, is_five_k = false) ⇒ Object
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/runby_pace/runby_time.rb', line 53 def self.try_parse(str, is_five_k = false) time, , = nil begin time = parse str rescue StandardError => ex = "#{ex.} (#{str})" end # Break out these sanity checks into their own class if we add any more. if !time.nil? && is_five_k = '5K times of less than 14:00 are unlikely' if time.minutes_part < 14 = '5K times of greater than 42:00 are not fully supported' if time.total_seconds > (42 * 60) end { time: time, error: , warning: } end |
Instance Method Details
#+(other) ⇒ Object
90 91 92 93 94 |
# File 'lib/runby_pace/runby_time.rb', line 90 def +(other) if other.is_a?(RunbyTime) RunbyTime.from_seconds(total_seconds + other.total_seconds) end end |
#-(other) ⇒ Object
83 84 85 86 87 |
# File 'lib/runby_pace/runby_time.rb', line 83 def -(other) if other.is_a?(RunbyTime) RunbyTime.from_seconds(total_seconds - other.total_seconds) end end |
#<(other) ⇒ Object
124 125 126 127 128 |
# File 'lib/runby_pace/runby_time.rb', line 124 def <(other) if other.is_a?(RunbyTime) total_seconds < other.total_seconds end end |
#<=(other) ⇒ Object
130 131 132 133 134 |
# File 'lib/runby_pace/runby_time.rb', line 130 def <=(other) if other.is_a?(RunbyTime) total_seconds <= other.total_seconds end end |
#==(other) ⇒ Object
96 97 98 99 100 101 102 |
# File 'lib/runby_pace/runby_time.rb', line 96 def ==(other) if other.is_a?(RunbyTime) total_seconds == other.total_seconds elsif other.is_a?(String) @time_s == other end end |
#>(other) ⇒ Object
112 113 114 115 116 |
# File 'lib/runby_pace/runby_time.rb', line 112 def >(other) if other.is_a?(RunbyTime) total_seconds > other.total_seconds end end |
#>=(other) ⇒ Object
118 119 120 121 122 |
# File 'lib/runby_pace/runby_time.rb', line 118 def >=(other) if other.is_a?(RunbyTime) total_seconds >= other.total_seconds end end |
#almost_equals?(other_time, tolerance_time = '00:01') ⇒ Boolean
104 105 106 107 108 109 110 |
# File 'lib/runby_pace/runby_time.rb', line 104 def almost_equals?(other_time, tolerance_time = '00:01') if other_time.is_a?(String) other_time = RunbyTime.new(other_time) end tolerance = RunbyTime.new(tolerance_time) self >= (other_time - tolerance) && self <= (other_time + tolerance) end |
#to_s ⇒ Object
70 71 72 |
# File 'lib/runby_pace/runby_time.rb', line 70 def to_s @time_s.sub(/^[0:]*/, '') end |
#total_minutes ⇒ Object
78 79 80 |
# File 'lib/runby_pace/runby_time.rb', line 78 def total_minutes @minutes_part + (@seconds_part / 60.0) end |
#total_seconds ⇒ Object
74 75 76 |
# File 'lib/runby_pace/runby_time.rb', line 74 def total_seconds @minutes_part * 60 + @seconds_part end |