Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ A tiny, dependency-free parser for human-friendly duration strings.
from duration_utils import parse_duration

parse_duration("1h30m") # 5400
parse_duration("2d4h") # 187200
parse_duration("1w") # 604800
```

Expand Down
4 changes: 3 additions & 1 deletion duration_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@

import re

# Seconds per unit. Supported: weeks, hours, minutes, seconds.
# Seconds per unit. Supported: weeks, days, hours, minutes, seconds.
_UNITS = {
"w": 604800,
"d": 86400,
"h": 3600,
"m": 60,
"s": 1,
Comment thread
KaisAbiyyi marked this conversation as resolved.
Expand All @@ -20,6 +21,7 @@ def parse_duration(text: str) -> int:

Examples:
parse_duration("1h30m") -> 5400
parse_duration("2d4h") -> 187200
parse_duration("1w") -> 604800

Raises ValueError on empty or malformed input.
Expand Down
9 changes: 9 additions & 0 deletions tests/test_duration_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,18 @@ def test_seconds(self):
def test_weeks(self):
self.assertEqual(parse_duration("1w"), 604800)

def test_days(self):
self.assertEqual(parse_duration("1d"), 86400)

def test_combined(self):
self.assertEqual(parse_duration("1h30m"), 5400)

def test_days_combined_with_hours(self):
self.assertEqual(parse_duration("2d4h"), 187200)

def test_all_supported_units_combined(self):
self.assertEqual(parse_duration("1w2d3h4m5s"), 788645)

def test_invalid_raises(self):
with self.assertRaises(ValueError):
parse_duration("abc")
Expand Down