Improve duration humanization. (#4071)
parent
64c1c0f37d
commit
cf1fc45142
@ -1,88 +0,0 @@ |
|||||||
/* |
|
||||||
* Minio Cloud Storage, (C) 2016 Minio, Inc. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||||
* you may not use this file except in compliance with the License. |
|
||||||
* You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
*/ |
|
||||||
|
|
||||||
package cmd |
|
||||||
|
|
||||||
import ( |
|
||||||
"fmt" |
|
||||||
"math" |
|
||||||
"time" |
|
||||||
) |
|
||||||
|
|
||||||
// humanizedDuration container to capture humanized time.
|
|
||||||
type humanizedDuration struct { |
|
||||||
Days int64 `json:"days,omitempty"` |
|
||||||
Hours int64 `json:"hours,omitempty"` |
|
||||||
Minutes int64 `json:"minutes,omitempty"` |
|
||||||
Seconds int64 `json:"seconds,omitempty"` |
|
||||||
} |
|
||||||
|
|
||||||
// StringShort() humanizes humanizedDuration to human readable short format.
|
|
||||||
// This does not print at seconds.
|
|
||||||
func (r humanizedDuration) StringShort() string { |
|
||||||
if r.Days == 0 && r.Hours == 0 { |
|
||||||
return fmt.Sprintf("%d minutes", r.Minutes) |
|
||||||
} |
|
||||||
if r.Days == 0 { |
|
||||||
return fmt.Sprintf("%d hours %d minutes", r.Hours, r.Minutes) |
|
||||||
} |
|
||||||
return fmt.Sprintf("%d days %d hours %d minutes", r.Days, r.Hours, r.Minutes) |
|
||||||
} |
|
||||||
|
|
||||||
// String() humanizes humanizedDuration to human readable,
|
|
||||||
func (r humanizedDuration) String() string { |
|
||||||
if r.Days == 0 && r.Hours == 0 && r.Minutes == 0 { |
|
||||||
return fmt.Sprintf("%d seconds", r.Seconds) |
|
||||||
} |
|
||||||
if r.Days == 0 && r.Hours == 0 { |
|
||||||
return fmt.Sprintf("%d minutes %d seconds", r.Minutes, r.Seconds) |
|
||||||
} |
|
||||||
if r.Days == 0 { |
|
||||||
return fmt.Sprintf("%d hours %d minutes %d seconds", r.Hours, r.Minutes, r.Seconds) |
|
||||||
} |
|
||||||
return fmt.Sprintf("%d days %d hours %d minutes %d seconds", r.Days, r.Hours, r.Minutes, r.Seconds) |
|
||||||
} |
|
||||||
|
|
||||||
// timeDurationToHumanizedDuration convert golang time.Duration to a custom more readable humanizedDuration.
|
|
||||||
func timeDurationToHumanizedDuration(duration time.Duration) humanizedDuration { |
|
||||||
r := humanizedDuration{} |
|
||||||
if duration.Seconds() < 60.0 { |
|
||||||
r.Seconds = int64(duration.Seconds()) |
|
||||||
return r |
|
||||||
} |
|
||||||
if duration.Minutes() < 60.0 { |
|
||||||
remainingSeconds := math.Mod(duration.Seconds(), 60) |
|
||||||
r.Seconds = int64(remainingSeconds) |
|
||||||
r.Minutes = int64(duration.Minutes()) |
|
||||||
return r |
|
||||||
} |
|
||||||
if duration.Hours() < 24.0 { |
|
||||||
remainingMinutes := math.Mod(duration.Minutes(), 60) |
|
||||||
remainingSeconds := math.Mod(duration.Seconds(), 60) |
|
||||||
r.Seconds = int64(remainingSeconds) |
|
||||||
r.Minutes = int64(remainingMinutes) |
|
||||||
r.Hours = int64(duration.Hours()) |
|
||||||
return r |
|
||||||
} |
|
||||||
remainingHours := math.Mod(duration.Hours(), 24) |
|
||||||
remainingMinutes := math.Mod(duration.Minutes(), 60) |
|
||||||
remainingSeconds := math.Mod(duration.Seconds(), 60) |
|
||||||
r.Hours = int64(remainingHours) |
|
||||||
r.Minutes = int64(remainingMinutes) |
|
||||||
r.Seconds = int64(remainingSeconds) |
|
||||||
r.Days = int64(duration.Hours() / 24) |
|
||||||
return r |
|
||||||
} |
|
@ -1,75 +0,0 @@ |
|||||||
/* |
|
||||||
* Minio Cloud Storage, (C) 2016 Minio, Inc. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||||
* you may not use this file except in compliance with the License. |
|
||||||
* You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
*/ |
|
||||||
|
|
||||||
package cmd |
|
||||||
|
|
||||||
import ( |
|
||||||
"testing" |
|
||||||
"time" |
|
||||||
) |
|
||||||
|
|
||||||
// Test humanized duration.
|
|
||||||
func TestHumanizedDuration(t *testing.T) { |
|
||||||
duration := time.Duration(90487000000000) |
|
||||||
humanDuration := timeDurationToHumanizedDuration(duration) |
|
||||||
if !hasSuffix(humanDuration.String(), "seconds") { |
|
||||||
t.Fatal("Stringer method for humanized duration should have seconds.", humanDuration.String()) |
|
||||||
} |
|
||||||
if hasSuffix(humanDuration.StringShort(), "seconds") { |
|
||||||
t.Fatal("StringShorter method for humanized duration should not have seconds.", humanDuration.StringShort()) |
|
||||||
} |
|
||||||
|
|
||||||
// Test humanized duration for seconds.
|
|
||||||
humanSecDuration := timeDurationToHumanizedDuration(time.Duration(5 * time.Second)) |
|
||||||
expectedHumanSecDuration := humanizedDuration{ |
|
||||||
Seconds: 5, |
|
||||||
} |
|
||||||
if humanSecDuration != expectedHumanSecDuration { |
|
||||||
t.Fatalf("Expected %#v, got %#v incorrect conversion of duration to humanized form", |
|
||||||
expectedHumanSecDuration, humanSecDuration) |
|
||||||
} |
|
||||||
if hasSuffix(humanSecDuration.String(), "days") || |
|
||||||
hasSuffix(humanSecDuration.String(), "hours") || |
|
||||||
hasSuffix(humanSecDuration.String(), "minutes") { |
|
||||||
t.Fatal("Stringer method for humanized duration should have only seconds.", humanSecDuration.String()) |
|
||||||
} |
|
||||||
|
|
||||||
// Test humanized duration for minutes.
|
|
||||||
humanMinDuration := timeDurationToHumanizedDuration(10 * time.Minute) |
|
||||||
expectedHumanMinDuration := humanizedDuration{ |
|
||||||
Minutes: 10, |
|
||||||
} |
|
||||||
if humanMinDuration != expectedHumanMinDuration { |
|
||||||
t.Fatalf("Expected %#v, got %#v incorrect conversion of duration to humanized form", |
|
||||||
expectedHumanMinDuration, humanMinDuration) |
|
||||||
} |
|
||||||
if hasSuffix(humanMinDuration.String(), "hours") { |
|
||||||
t.Fatal("Stringer method for humanized duration should have only minutes.", humanMinDuration.String()) |
|
||||||
} |
|
||||||
|
|
||||||
// Test humanized duration for hours.
|
|
||||||
humanHourDuration := timeDurationToHumanizedDuration(10 * time.Hour) |
|
||||||
expectedHumanHourDuration := humanizedDuration{ |
|
||||||
Hours: 10, |
|
||||||
} |
|
||||||
if humanHourDuration != expectedHumanHourDuration { |
|
||||||
t.Fatalf("Expected %#v, got %#v incorrect conversion of duration to humanized form", |
|
||||||
expectedHumanHourDuration, humanHourDuration) |
|
||||||
} |
|
||||||
if hasSuffix(humanHourDuration.String(), "days") { |
|
||||||
t.Fatal("Stringer method for humanized duration should have hours.", humanHourDuration.String()) |
|
||||||
} |
|
||||||
} |
|
Loading…
Reference in new issue