tomlrange
Parse and validate { from = …, to = … } tables. Not a TOML parser —
feed it the dicts tomllib already produced.
The four spellings below are alternatives, not one document — a
[table] header owns every following key until the next header.
After tomllib, they collapse to two Python values. Bound accepts
a single table. Bounds accepts a table or a list of tables.
# one table
months = { from = 1, to = 12 }
[months]
from = 1
to = 12
# many tables
windows = [
{ from = 1, to = 4 },
{ from = 6, to = 10 },
]
[[windows]]
from = 1
to = 4
[[windows]]
from = 6
to = 10
import tomllib
from tomlrange import Domain
Month = Domain(int, lo=1, hi=12, name="month")
data = tomllib.loads(config)
year = Month.bound(data["months"]) # 1..12
windows = Month.bounds(data["windows"]) # 1..4 and 6..10
assert list(year) == list(range(1, 13))
assert 5 not in windows
No runtime dependencies. Endpoints stay the type tomllib gave you.
Domain as schema
A Domain is the constraint object. Bound / Bounds are the values.
from tomlrange import Domain
Hour = Domain(int, lo=0, hi=23, name="hour")
Hour.bound({"from": 7, "to": 16})
Hour.full() # requires lo and hi
Or name the domain by subclassing Spec — the class body is the schema:
from tomlrange import Spec
class Month(Spec):
typ = int
lo = 1
hi = 12
Month.parse({"from": 1, "to": 4})
Month.parse_many([{ "from": 1, "to": 4 }, { "from": 6, "to": 10 }])
Validation
On one table:
- value is a mapping
- keys are exactly
fromandto(override withDomain(..., keys=("start", "end"))) - each endpoint is
type(raw) is domain.typ(so1.0andTrueare notint) - endpoints sit inside
lo/hiwhen those are set from <= to(a singleton is{ from = 3, to = 3 })
On a list, overlap= is "reject" (default), "allow", or "merge".
Reject treats a shared endpoint as overlap (1–4 and 4–6 fail).
Adjacent integers (1–4 then 5–8) are fine; merge() will coalesce them.
Errors carry a path:
months_ranges[1].to: 13 is above month 12
What this is not
- Not a file loader. Call
tomllibyourself. - Not string ranges (
"1-12","Jan–Apr"). - Not a two-element array (
[1, 12]). After TOML decode that is a list, not a table. - Not wrap-around (
from = 11, to = 2). Write two spans. - Not
step. A range table is a closed interval.
Install
pip install tomlrange
Python 3.12+.
Metadata
Release files for tomlrange 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| tomlrange-0.1.0.tar.gz | 8.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tomlrange-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 17.0 kB
Release files / tomlrange-0.1.0.tar.gz
| Download URL | tomlrange-0.1.0.tar.gz |
|---|---|
| Size | 8.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
21dec74baae57acb1d6993bb8f93b83ed80922bdb9ac5b5e4f952ba594b8bce0
|
|
BLAKE2b-256 checksum How to use checksums |
b8969c7dd1f07e37005f5d07542ca355a3eacf0166f67449691988f9b249ea7b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.15 {"installer":{"name":"uv","version":"0.12.15","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 / tomlrange-0.1.0-py3-none-any.whl
| Download URL | tomlrange-0.1.0-py3-none-any.whl |
|---|---|
| Size | 8.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2e28837bbbb5d03c34483d85f4cc86566518b3f33edd33b05367165a0ff2104d
|
|
BLAKE2b-256 checksum How to use checksums |
9ed96da4dcb70ba7d06326967b4003e4248b68e7e5140b5de9ccc68f41aee34c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.15 {"installer":{"name":"uv","version":"0.12.15","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}
|