Skip to main content

SUThing suthing logo

SUThing /ˈsu.θɪŋ/ or /ˈsʌ.θɪŋ/ (Some Useful Things) is a collection of small, dependable utilities.

A Python utility package providing tools for file handling, timing, profiling, data comparison and hashing.

Python PyPI version PyPI Downloads License: MIT pre-commit

Features

  • File Handling: one-line reading and writing with the format inferred from the extension (YAML, JSON, JSON Lines, CSV/TSV, text, dotenv, pickle), transparent .gz/.bz2/.xz/.zst compression, atomic writes and streaming reads
  • Timing and Profiling: a Timer context manager/decorator and opt-in function profiling with per-key statistics
  • Data Comparison: deep diff of nested structures that reports the path of every difference, with numeric tolerance and order-insensitive matching
  • Hashing: stable hashes of JSON-like values, text, files and directory trees
  • Small Helpers: batched, slugify, to_jsonable, env_flag, setup_logging, utc_now_iso

Documentation

Full documentation is available at: growgraph.github.io/suthing

Installation

pip install suthing

Usage Examples

File Handling

from suthing import FileHandle, FileType

# format inferred from the extension
data = FileHandle.load("config.yaml")

# compressed by suffix, written atomically
FileHandle.dump(data, "output.json.gz")

# data shipped inside a package
defaults = FileHandle.load_resource("mypkg.data", "defaults.yaml")

# explicit format for an unrecognised extension
secret = FileHandle.load("token.secret", how=FileType.TXT)

Timing Code

from suthing import Timer

with Timer() as t:
    # Your code here
    pass
print(f"Execution took {t.elapsed_str}")

Profiling Functions

from suthing import Profiler, profiled


@profiled(key_args="input_size")
def my_function(input_size): ...


with Profiler() as prof:
    my_function(100)

stats = prof.summary()  # {"my_function(input_size=100)": ProfileStats(...)}

Deep Comparison

from suthing import diff, equals

equals(expected, actual)  # bool
for d in diff(expected, actual):  # where they differ
    print(d)  # $.users[1].name: values differ (expected='Bob', actual='Rob')

Requirements

  • Python 3.11+
  • pandas (imported only for CSV/TSV)
  • PyYAML
  • python-dotenv
  • optional: zstandard for .zst files (pip install "suthing[zstd]")

Development

uv sync --group dev
uv run pytest test
uv run ty check suthing test

Contributing

Contributions are welcome! Please feel free to submit a Pull Request. See Contributing for the full workflow.

Metadata

Release files for suthing 0.6.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for suthing 0.6.1
File Size Uploaded
suthing-0.6.1.tar.gz 21.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for suthing 0.6.1
File Interpreter ABI Platform
suthing-0.6.1-py3-none-any.whl Python 3 none any Details

Total release size: 47.9 kB

Release files / suthing-0.6.1.tar.gz

Download URL suthing-0.6.1.tar.gz
Size 21.2 kB
Tags Source
SHA-256 checksum
How to use checksums
b20f15bf922a60583905525a84c73888d3ad8686b6a0d629600a3132fe1a4563
BLAKE2b-256 checksum
How to use checksums
34f69adffe12d876cb37211d1d05d4484516ab21d85ef937e3220fc9c8f8db50
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.9.28 {"installer":{"name":"uv","version":"0.9.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / suthing-0.6.1-py3-none-any.whl

Download URL suthing-0.6.1-py3-none-any.whl
Size 26.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7013e33bb96f14ceafe7444eb4e069079a8c185036c5f4e15d146774a3b90923
BLAKE2b-256 checksum
How to use checksums
96880df5a43ba110a4f68af512cdcdfe8ee621aa051fdb46ad2dba4f48de2244
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.9.28 {"installer":{"name":"uv","version":"0.9.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

This release

0.6.1 This release

2 release files

0.6.0

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page