Class: Duration

Inherits:
Object
  • Object
show all
Defined in:
lib/duration.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(hours = 0, minutes = 0) ⇒ Duration



4
5
6
7
8
9
10
11
# File 'lib/duration.rb', line 4

def initialize(hours=0, minutes=0)
    unless hours.is_a?(Integer) && minutes.is_a?(Integer)
        raise TypeError.new("Duration expects integer parameters.")
    end

    @hours=hours
    @minutes=minutes
end

Instance Attribute Details

#hoursObject

Returns the value of attribute hours.



2
3
4
# File 'lib/duration.rb', line 2

def hours
  @hours
end

#minutesObject

Returns the value of attribute minutes.



2
3
4
# File 'lib/duration.rb', line 2

def minutes
  @minutes
end

Class Method Details

.try_convert(str) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/duration.rb', line 23

def self.try_convert(str)
    floatValue = Float(str, exception: false)
    if floatValue
        parsedMinutes = floatValue * 60
        parsedHours = (parsedMinutes / 60).floor
        parsedMinutes = parsedMinutes % 60

        newDuration = Duration.new(parsedHours, parsedMinutes.round)
        return newDuration if newDuration.valid?
    end

    parts=str.split(":")
    
    return unless parts.length == 2
    
    parsedHours = Integer(parts[0], exception: false)
    parsedMinutes = Integer(parts[1], exception: false)

    parsedHours = parsedHours + (parsedMinutes / 60) if parsedHours != nil && parsedMinutes != nil
    parsedHours = (parsedMinutes / 60) if parsedHours == nil && parsedMinutes != nil
    return unless parsedHours != nil && parsedMinutes != nil

    parsedMinutes = parsedMinutes % 60
    
    newDuration = Duration.new(parsedHours, parsedMinutes)
    if newDuration.valid? then newDuration else nil end
end

Instance Method Details

#+(duration) ⇒ Object



17
18
19
20
21
# File 'lib/duration.rb', line 17

def +(duration)
    newMinutes = (@minutes + duration.minutes) % 60
    newHours = @hours + duration.hours + (@minutes + duration.minutes) / 60
    Duration.new(newHours, newMinutes)
end

#to_sObject



51
52
53
54
55
# File 'lib/duration.rb', line 51

def to_s
    formattedHours = @hours.to_s.rjust(2, "0")
    formattedMinutes = @minutes.to_s.rjust(2, "0")
    return "#{formattedHours}:#{formattedMinutes}"
end

#valid?Boolean



13
14
15
# File 'lib/duration.rb', line 13

def valid?
    @hours >= 0 && @minutes >= 0 && @minutes <= 59
end