From 55f992d6715a0920fefb5c4051e9eff40f948a21 Mon Sep 17 00:00:00 2001 From: Henry Poydar Date: Sun, 7 Sep 2014 20:03:26 -0400 Subject: [PATCH] Add limit_to_hours output option --- README.md | 2 ++ lib/chronic_duration.rb | 36 ++++++++++++++++--------------- lib/chronic_duration/version.rb | 2 +- spec/lib/chronic_duration_spec.rb | 4 ++++ 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index c58586c..31943b9 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,8 @@ The reverse can also be accomplished with the output method. So pass in seconds => 2 wks 1 day 1 hr >> ChronicDuration.output(1299600, :weeks => true, :units => 2) => 2 wks 1 day + >> ChronicDuration.output(45*24*60*60 + 15*60, :limit_to_hours => true) + => 1080 hrs 15 mins >> ChronicDuration.output(1299600, :weeks => true, :units => 2, :joiner => ', ') => 2 wks, 1 day >> ChronicDuration.output(1296000) diff --git a/lib/chronic_duration.rb b/lib/chronic_duration.rb index f176bea..5746f7c 100644 --- a/lib/chronic_duration.rb +++ b/lib/chronic_duration.rb @@ -75,22 +75,24 @@ def output(seconds, opts = {}) if minutes >= 60 hours = (minutes / 60).to_i minutes = (minutes % 60).to_i - if hours >= ChronicDuration.hours_per_day - days = (hours / ChronicDuration.hours_per_day).to_i - hours = (hours % ChronicDuration.hours_per_day).to_i - if opts[:weeks] - if days >= ChronicDuration.days_per_week - weeks = (days / ChronicDuration.days_per_week).to_i - days = (days % ChronicDuration.days_per_week).to_i - if weeks >= 4 - months = (weeks / 4).to_i - weeks = (weeks % 4).to_i + if !opts[:limit_to_hours] + if hours >= ChronicDuration.hours_per_day + days = (hours / ChronicDuration.hours_per_day).to_i + hours = (hours % ChronicDuration.hours_per_day).to_i + if opts[:weeks] + if days >= ChronicDuration.days_per_week + weeks = (days / ChronicDuration.days_per_week).to_i + days = (days % ChronicDuration.days_per_week).to_i + if weeks >= 4 + months = (weeks / 4).to_i + weeks = (weeks % 4).to_i + end + end + else + if days >= 30 + months = (days / 30).to_i + days = (days % 30).to_i end - end - else - if days >= 30 - months = (days / 30).to_i - days = (days % 30).to_i end end end @@ -238,8 +240,8 @@ def filter_through_white_list(string) raise DurationParseError, "An invalid word #{word.inspect} was used in the string to be parsed." end end - # add '1' at front if string starts with something recognizable but not with a number, like 'day' or 'minute 30sec' - res.unshift(1) if res.length > 0 && mappings[res[0]] + # add '1' at front if string starts with something recognizable but not with a number, like 'day' or 'minute 30sec' + res.unshift(1) if res.length > 0 && mappings[res[0]] res.join(' ') end diff --git a/lib/chronic_duration/version.rb b/lib/chronic_duration/version.rb index 28c72e7..5456965 100644 --- a/lib/chronic_duration/version.rb +++ b/lib/chronic_duration/version.rb @@ -1,3 +1,3 @@ module ChronicDuration - VERSION = '0.10.5' + VERSION = '0.10.6' end diff --git a/spec/lib/chronic_duration_spec.rb b/spec/lib/chronic_duration_spec.rb index c3e1dbb..2e93fc9 100644 --- a/spec/lib/chronic_duration_spec.rb +++ b/spec/lib/chronic_duration_spec.rb @@ -201,6 +201,10 @@ ChronicDuration.output(45*24*60*60, :weeks => true).should =~ /.*wk.*/ end + it "returns hours and minutes only when :hours_only option specified" do + ChronicDuration.output(395*24*60*60 + 15*60, :limit_to_hours => true).should == '9480 hrs 15 mins' + end + it "returns the specified number of units if provided" do ChronicDuration.output(4 * 3600 + 60 + 1, units: 2).should == '4 hrs 1 min' ChronicDuration.output(6 * 30 * 24 * 3600 + 24 * 3600 + 3600 + 60 + 1, units: 3, format: :long).should == '6 months 1 day 1 hour'