Skip to main content

A Python library for performing arithmetic with HH:MM[:SS] formatted time strings.

Project description

hmscalc

PyPI version Python versions

A lightweight Python library for performing arithmetic on time values formatted as HH:MM or HH:MM:SS.

🚀 Features

  • Supports time addition and subtraction
  • Sum, average, min, and max of multiple time values
  • Accepts HH:MM and HH:MM:SS formatted strings
  • Handles negative durations gracefully
  • Comparison operators (==, !=, <, <=, >, >=)
  • Converts time to seconds, minutes, hours, timedelta, and dictionary/tuple formats
  • Integration with datetime.timedelta
  • Custom exceptions for invalid input
  • Fully testable across Python 3.9–3.14 via Docker

Supported Python versions

Python 3.9 through 3.14 (and later 3.x releases within the ^3.9 constraint).

🐳 Quick Start (Docker-based)

# Build the image
docker build -t hmscalc .

# Run tests across multiple Python versions
docker run --rm hmscalc ./runtests.sh

# Run lint
docker run --rm hmscalc ./lint.sh

📦 Project Structure

hmscalc/
├── Dockerfile         # Docker setup with pyenv and poetry
├── runtests.sh        # Runs tests on multiple Python versions
├── hmscalc/           # Source code
│   ├── hms_time.py
│   └── exceptions.py
├── tests/             # Pytest-based unit tests
├── pyproject.toml     # Poetry config
├── README.md          # This file
└── LICENSE            # MIT license

📚 Usage (inside container)

Import

from hmscalc import HMSTime
# or
from hmscalc.hms_time import HMSTime

Basic Operations

a = HMSTime("1:30:15")
b = HMSTime("2:15:45")

print(a + b)            # "3:46:00"
print(a - b)            # "-0:45:30"
print(a > b)            # False
print(a.to_seconds())   # 5415
print(a.to_minutes())   # 90.25
print(a.to_hours())     # 1.504...
print(a.to_tuple())     # (1, 30, 15)
print(a.to_dict())      # {'hh': 1, 'mm': 30, 'ss': 15, 'negative': False}

Negative Values

t = HMSTime("-1:00:00")
print(t.to_seconds())   # -3600
print(t.is_negative)    # True
print(t.to_dict())      # {'hh': 1, 'mm': 0, 'ss': 0, 'negative': True}

Sum / Average / Min / Max

times = [
    HMSTime("1:30:15"),
    HMSTime("2:15:45"),
    HMSTime("0:45:30"),
]

print(HMSTime.sum(times))      # "4:31:30"
print(HMSTime.average(times))  # "1:30:30"
print(HMSTime.min(times))      # "0:45:30"
print(HMSTime.max(times))      # "2:15:45"
print(HMSTime.sum([]))         # "0:00:00"

timedelta Integration

import datetime

t = HMSTime("1:30:15")
delta = t.to_timedelta()                          # datetime.timedelta(...)
restored = HMSTime.from_timedelta(delta)          # HMSTime("1:30:15")

Error Handling

from hmscalc import InvalidTimeFormatError, NotTimeStringError

try:
    HMSTime("1:99:00")   # minute >= 60
except InvalidTimeFormatError:
    pass

try:
    HMSTime(123)         # non-string input
except NotTimeStringError:
    pass

📋 Input Rules

  • Formats: HH:MM or HH:MM:SS (hours may exceed 24 — duration model)
  • Minutes and seconds must be in the range 0–59
  • Optional leading - for negative durations
  • Input must be a string

🔍 Examples

Basic Arithmetic

HMSTime("2:30") + HMSTime("1:45")     # "4:15:00"
HMSTime("1:00:30") - HMSTime("0:30")  # "0:30:30"
HMSTime("0:00") - HMSTime("0:01")     # "-0:01:00"

Work Time Calculation

work_sessions = [
    HMSTime("2:15:30"),
    HMSTime("1:45:00"),
    HMSTime("0:30:15"),
]
total_work = HMSTime.sum(work_sessions)
print(f"Total work time: {total_work}")  # "4:30:45"

🧪 Running tests locally via Docker

# Build image
docker build -t hmscalc .

# Run matrix tests via pyenv + poetry (Python 3.9–3.14)
docker run --rm hmscalc ./runtests.sh

📄 License

This project is licensed under the MIT License.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

hmscalc-0.3.1.tar.gz (5.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

hmscalc-0.3.1-py3-none-any.whl (6.5 kB view details)

Uploaded Python 3

File details

Details for the file hmscalc-0.3.1.tar.gz.

File metadata

  • Download URL: hmscalc-0.3.1.tar.gz
  • Upload date:
  • Size: 5.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.4.1 CPython/3.11.15 Linux/6.17.0-1015-azure

File hashes

Hashes for hmscalc-0.3.1.tar.gz
Algorithm Hash digest
SHA256 1534adc9a2caf6ad55e69b6aeaad519fa010dc796326c0b4488d0833afe364b4
MD5 b9b9aebe52b6584093d5eb4047757d96
BLAKE2b-256 f067afd647a7769ea87f6f53ef03f9c385d35e4d4fdedf6d5f0b25981288fe87

See more details on using hashes here.

File details

Details for the file hmscalc-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: hmscalc-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 6.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.4.1 CPython/3.11.15 Linux/6.17.0-1015-azure

File hashes

Hashes for hmscalc-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 3552e21fbfc90491f161571e8cbd798293cc7fe77f410fc9c081368d1fe218c6
MD5 5b9c3f6e179238dac676a8a2354240cc
BLAKE2b-256 1d3e31a15e79b696cfa6936a955d554379cb6a31ceb58bf8683a8fd83f51961a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page