thenickperson/tracking

View on GitHub
lib/tracking/task.rb

Summary

Maintainability
A
55 mins
Test Coverage
module Tracking
    # The class for all Task objects created by List and passed to interfaces.
    # Holds all relevant data for Tasks, as well as methods for computing new Task
    # data as needed. Tasks internally save data (in their appropriate types) to
    # intance variables, while public accessors return data in strings for
    # display.
    class Task

        # Creates a new Task object. Data passed into its arguments is kept
        # (unchanged) in instance variables.
        #
        # @param [String] name the tasks's name
        # @param [Time] start_time the tasks's start time
        # @param [Time] end_time the tasks's end time (can be nil, which marks a
        # task as the current task)
        def initialize(name, start_time, end_time)
            @name = name
            @start_time = start_time
            @end_time = end_time
            @current = end_time.nil? ? true : false
        end

        # Gets raw data from the task object, without doing any conversions or
        # formatting
        #
        # @param [Symbol] key the key of the desired value
        #
        # @return the value of the requested key
        def raw key
            case key
            when :name
                return @name
            when :start_time
                return @start_time
            when :end_time
                return @end_time
            end
        end

        # Converts the task object into a string (for debugging)
        def to_s
            return "name: #{name}; start: #{@start_time}; end: #{@end_time};"
        end

        # Returns true if this task is the current (last) task
        #
        # @return [Boolean] true if this is the current task, false otherwise
        def current?
            return @current
        end

        # Calculates the length of strings from Task#elapsed_time (using the current
        # elapsed time format).
        #
        # @return [String] the length of strings from Task#elapsed_time
        def self.elapsed_time_length
            test_task = Task.new('test', Time.now, Time.now)
            return test_task.elapsed_time.length
        end

        # Accessor for this tasks's name (read/write)
        attr_accessor :name

        # Formats and returns the start time of this task.
        #
        # @return [String] the formatted start time of this task
        def start_time
            return @start_time.strftime('%H:%M')
        end

        # Calculates, formats, and returns the elapsed time of this task.
        #
        # @param [String] format the format string (or preset symbol) to use
        # @param [Boolean] show_seconds toggles the display of seconds (only for
        # presets)
        #
        # @return [String] the formatted elapsed time of this task
        def elapsed_time format=TrackingConfig[:elapsed_format], show_seconds=TrackingConfig[:show_elapsed_seconds]
            # Calculate the elapsed time and break it down into different units
            seconds = ((self.current? ? Time.now : @end_time) - @start_time).floor
            minutes = hours = days = 0
            if seconds >= 60
                minutes = seconds / 60
                seconds = seconds % 60
                if minutes >= 60
                    hours = minutes / 60
                    minutes = minutes % 60
                    if hours >= 24
                        days = hours / 24
                        hours = hours % 24
                    end
                end
            end
            # Return a string of the formatted elapsed time
            format = elapsed_time_preset(format, show_seconds) if format.class == Symbol
            return format % [days, hours, minutes, seconds]
        end

        # Gets an elapsed time formatting string from a preset.
        #
        # @param [Symbol] preset the preset to use
        # @param [Boolean] show_seconds toggles the display of seconds
        #
        # @return [String] the format string for elapsed time
        def elapsed_time_preset preset, show_seconds=TrackingConfig[:show_elapsed_seconds]
            case preset
            when :colons
                preset = '%02d:%02d:%02d'
                preset_secs = ':%02d'
            when :letters
                preset = '%02dd %02dh %02dm'
                preset_secs = ' %02ds'
            end
            preset += preset_secs if show_seconds
            return preset
        end

    end
end