Skip to content

Commit 5b437f0

Browse files
authored
Show compound units in elapsed time display. (#87)
1 parent bd73aba commit 5b437f0

3 files changed

Lines changed: 44 additions & 23 deletions

File tree

lib/console/clock.rb

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,28 @@ def self.formatted_duration(duration)
1616
return format("%.2fs", duration)
1717
end
1818

19-
duration /= 60.0
19+
minutes = duration / 60.0
2020

21-
if duration < 60.0
22-
return "#{duration.floor}m"
21+
if minutes < 60.0
22+
seconds = duration % 60
23+
return format("%dm%02ds", minutes, seconds)
2324
end
2425

25-
duration /= 60.0
26+
hours = minutes / 60.0
2627

27-
if duration < 24.0
28-
return "#{duration.floor}h"
28+
if hours < 24.0
29+
minutes = minutes % 60
30+
return format("%dh%02dm", hours, minutes)
2931
end
3032

31-
duration /= 24.0
33+
days = hours / 24.0
34+
35+
if days < 100.0
36+
hours = hours % 24
37+
return format("%dd%02dh", days, hours)
38+
end
3239

33-
return "#{duration.floor}d"
40+
return format("%dd", days)
3441
end
3542

3643
# @returns [Time] The current monotonic time.

releases.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Releases
22

3+
## Unreleased
4+
5+
- Show compound units in elapsed time display.
6+
37
## v1.36.0
48

59
- Add a `size_limit` to `Console::Format::Safe` (default 16KiB) which rebuilds oversized records field-by-field, keeping as many top-level fields as fit within the limit.

test/console/clock.rb

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,30 +16,40 @@
1616
expect(subject.formatted_duration(2)).to be == "2.00s"
1717
expect(subject.formatted_duration(10)).to be == "10.00s"
1818
expect(subject.formatted_duration(59)).to be == "59.00s"
19+
expect(subject.formatted_duration(59.999)).to be == "60.00s"
1920
end
2021

2122
it "can format minutes" do
22-
expect(subject.formatted_duration(60)).to be == "1m"
23-
expect(subject.formatted_duration(61)).to be == "1m"
24-
expect(subject.formatted_duration(120)).to be == "2m"
25-
expect(subject.formatted_duration(600)).to be == "10m"
26-
expect(subject.formatted_duration(3599)).to be == "59m"
23+
expect(subject.formatted_duration(60)).to be == "1m00s"
24+
expect(subject.formatted_duration(61)).to be == "1m01s"
25+
expect(subject.formatted_duration(61.999)).to be == "1m01s"
26+
expect(subject.formatted_duration(120)).to be == "2m00s"
27+
expect(subject.formatted_duration(600)).to be == "10m00s"
28+
expect(subject.formatted_duration(3599.999)).to be == "59m59s"
29+
expect(subject.formatted_duration(3599)).to be == "59m59s"
2730
end
2831

2932
it "can format hours" do
30-
expect(subject.formatted_duration(3600)).to be == "1h"
31-
expect(subject.formatted_duration(3601)).to be == "1h"
32-
expect(subject.formatted_duration(7200)).to be == "2h"
33-
expect(subject.formatted_duration(36000)).to be == "10h"
34-
expect(subject.formatted_duration(86399)).to be == "23h"
33+
expect(subject.formatted_duration(3600)).to be == "1h00m"
34+
expect(subject.formatted_duration(3601)).to be == "1h00m"
35+
expect(subject.formatted_duration(7200)).to be == "2h00m"
36+
expect(subject.formatted_duration(36000)).to be == "10h00m"
37+
expect(subject.formatted_duration(86399.999)).to be == "23h59m"
38+
expect(subject.formatted_duration(86399)).to be == "23h59m"
3539
end
3640

3741
it "can format days" do
38-
expect(subject.formatted_duration(86400)).to be == "1d"
39-
expect(subject.formatted_duration(86401)).to be == "1d"
40-
expect(subject.formatted_duration(172800)).to be == "2d"
41-
expect(subject.formatted_duration(604799)).to be == "6d"
42-
expect(subject.formatted_duration(864000)).to be == "10d"
42+
expect(subject.formatted_duration(86400)).to be == "1d00h"
43+
expect(subject.formatted_duration(86401)).to be == "1d00h"
44+
expect(subject.formatted_duration(172800)).to be == "2d00h"
45+
expect(subject.formatted_duration(604799)).to be == "6d23h"
46+
expect(subject.formatted_duration(864000)).to be == "10d00h"
47+
end
48+
49+
it "can format many days" do
50+
expect(subject.formatted_duration(8640000 - 1)).to be == "99d23h"
51+
expect(subject.formatted_duration(8640000)).to be == "100d"
52+
expect(subject.formatted_duration(86400000)).to be == "1000d"
4353
end
4454
end
4555

0 commit comments

Comments
 (0)