require_relative 'human_duration/constants' require_relative 'human_duration/overloads' require_relative 'human_duration/version' # # docs to do # module HumanDuration # # docs to do # class Duration $time_values = {} $item_count = 0 $output_buffer = '' $type = 'compact' def self.display_type(type = 'compact') raise ArgumentError.new('Invalid type - Valid options are:- compact, short and full') unless VALID_TYPES.include? type $type = type end def self.human_duration(seconds) reset return 'negative' if seconds < 0 return 'now' if seconds.zero? split_seconds(seconds) count_items generate_output $output_buffer end def self.reset $time_values = {} $item_count = 0 $output_buffer = '' end def self.pluralize(number) return 's' unless number == 1 '' end def self.comma_or_not(count) return ', ' if count > 1 return ' & ' if count == 1 && $type == 'short' return ' and ' if count == 1 '' end def self.add_time(value, name, plural = true) return if value < 1 && $type != 'full' $output_buffer << if plural format('%s %s%s', value: value, name: name, plural: pluralize(value)) else format('%s %s', value: value, name: name) end $item_count -= 1 $output_buffer << comma_or_not($item_count) end def self.split_seconds(seconds) SPLIT_TYPES.map do |count, name| if seconds > 0 seconds, n = seconds.divmod(count) $time_values[name] = n else $time_values[name] = 0 end end end def self.count_items $time_values.each do |_name, value| $item_count += 1 if value > 0 || $type == 'full' end end def self.add_time_long $time_values.reverse_each do |name, value| add_time(value, name) end end def self.add_time_short $time_values.reverse_each do |name, value| add_time(value, SHORT_NAME_MAP[name], false) end end def self.generate_output if $type == 'short' add_time_short else add_time_long end end end end