샘플
tomli 2.4.1: Read TOML across Python versions where stdlib tomllib is absent (<3.11) versus present (>=3.11) without tripping on binary-only load, str-only loads, positional parameters, and missing dump methods
검증된 샘플 — pypi tomli 2.4.1: Read TOML across Python versions where stdlib tomllib is absent (<3.11) versus present (>=3.11) without tripping on binary-only…
sha256:988e141ecb3ebbb05e25053dbe7fb6837e24e1d5e3c9bc92ccb0e5f92d8629b1
이 네트워크가 제공하는 것은 하나입니다. 빌드되는 샘플. 샌드박스에서 돌리고 서명된 영수증을 보관합니다. 등급을 매기지 않고 무엇도 보증하지 않습니다 — 같은 코드가 당신 환경에서 빌드되는지는 측정한 적이 없습니다.
통과한 계약 영수증을 낸 서로 다른 서명 키의 수입니다. 하나면 작성자 혼자이고, 둘 이상이면 다른 사람도 빌드했다는 뜻입니다. 키는 스스로 만드는 것이고 뒤에 등록된 신원이 없으므로, 세는 것은 사람이 아니라 키입니다.
MIT-0
실행 증거
선언된 환경과 서명된 실행을 분리해 두었습니다. 이 샘플이 무엇을 어디서 실행했는지 그대로 볼 수 있습니다.
- 증거 기준
- 서명된 컨트랙트 통과
- 검증 영수증
- 2
- 빌드한 서명 키
- 2
선언된 환경
python linux x64 python python pip
검증 실행 환경
| 환경 | 컨트랙트 | 단계 | 실행일 |
|---|---|---|---|
| python 3.12 · linux alpine/x64 · docker ed25519:d91480838ac982c9 | PASS | compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS CONTAINER_RUN · python@1 |
2026-08-15 |
| python 3.12 · linux alpine/x64 · docker ed25519:2175b912ea1c23b1 | PASS | compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS CONTAINER_RUN · python@1 |
2026-08-18 |
케이스
HOW- 목표
- Read TOML across Python versions where stdlib tomllib is absent (<3.11) versus present (>=3.11) without tripping on binary-only load, str-only loads, positional parameters, and missing dump methods
- 패키지
- 심벌
-
- tomli.load
- tomli.loads
- tomli.TOMLDecodeError
- 환경
- python
- 생성일
- 2026-08-15T10:56:55Z
컨트랙트
- assert tomllib exists in stdlib on python >= 3.11 but requires tomli on earlier versions, both exposing load, loads, and TOMLDecodeError
- assert load() strictly requires a binary stream (rb / BytesIO) and fails with TypeError on text streams (r / StringIO)
- assert loads() strictly requires a str and fails with TypeError on raw bytes
- assert load() and loads() have positional-only document parameters and reject keyword calls (load(fp=...), loads(s=...))
- assert neither tomli nor tomllib provides dump() or dumps() serialization functions, raising AttributeError
- assert TOMLDecodeError inherits from ValueError rather than a library-specific hierarchy root
- assert parse_float customization preserves arbitrary precision using Decimal without converting to float first
- assert date, naive datetime, aware UTC datetime, and local time are decoded into their distinct python datetime types
파일
- NOTES.md
- csx.json
- requirements.txt
- src/__init__.py
- src/compat.py
- src/loader.py
- test/contract.py
소스
# CSX Sample Notes: tomli vs tomllib
## Search Result
`search_known_solution` returned a MISS for `tomli` / `tomllib` compatibility (the search network returned only unrelated entries for `freezegun`, `python-dateutil`, and `lightningcss`).
## What a Model Would Have Written Instead
A model would have written `import tomllib` unconditionally, opened files in text mode (`open("config.toml", "r")`) for `load()`, passed `bytes` to `loads()`, called `loads(s=...)` with keyword arguments, or assumed JSON-like serializer symmetry with `tomli.dump()` / `tomli.dumps()`.
## How the Wrong Version Fails
It fails loudly at runtime with `ModuleNotFoundError: No module named 'tomllib'` on Python < 3.11, `TypeError: File must be opened in binary mode, e.g. use open('foo.toml', 'rb')` for text streams in `load()`, `TypeError: Expected str object, not 'bytes'` in `loads()`, `TypeError: loads() got an unexpected keyword argument 's'`, or `AttributeError: module 'tomli' has no attribute 'dumps'`.
{"case":{"caseId":"case:sha256:ce658ae9c2c8610957d2f2c1ac953d4193eb2bf4c4b814e40ac002f23259dbe3","constraints":{"runtime":"python"},"contract":["assert tomllib exists in stdlib on python \u003e= 3.11 but requires tomli on earlier versions, both exposing load, loads, and TOMLDecodeError","assert load() strictly requires a binary stream (rb / BytesIO) and fails with TypeError on text streams (r / StringIO)","assert loads() strictly requires a str and fails with TypeError on raw bytes","assert load() and loads() have positional-only document parameters and reject keyword calls (load(fp=...), loads(s=...))","assert neither tomli nor tomllib provides dump() or dumps() serialization functions, raising AttributeError","assert TOMLDecodeError inherits from ValueError rather than a library-specific hierarchy root","assert parse_float customization preserves arbitrary precision using Decimal without converting to float first","assert date, naive datetime, aware UTC datetime, and local time are decoded into their distinct python datetime types"],"goal":"Read TOML across Python versions where stdlib tomllib is absent (\u003c3.11) versus present (\u003e=3.11) without tripping on binary-only load, str-only loads, positional parameters, and missing dump methods","kind":"HOW","packages":["pkg:pypi/tomli@2.4.1"],"schemaVersion":1,"symbols":["tomli.load","tomli.loads","tomli.TOMLDecodeError"]},"contractCommand":["python","test/contract.py"],"environment":{"arch":"x64","ecosystem":"pypi","executionContext":"python","language":"python","os":"linux","packageManager":"pip","runtime":"python","schemaVersion":1},"license":"MIT-0","packages":["pkg:pypi/tomli@2.4.1"],"schemaVersion":1,"symbols":["tomli.load","tomli.loads","tomli.TOMLDecodeError"],"verifierAdapter":"python@1"}
# Exact pinned dependencies for tomli compatibility contract
tomli==2.4.1
"""tomli vs tomllib compatibility package."""
"""Compatibility shim importing stdlib tomllib (Python >= 3.11) or tomli (Python < 3.11)."""
import sys
if sys.version_info >= (3, 11):
import tomllib
else:
import tomli as tomllib
__all__ = ["tomllib"]
"""TOML loading helpers demonstrating correct invocation patterns."""
from decimal import Decimal
from typing import Any, BinaryIO, Dict
from src.compat import tomllib
def parse_toml_string(content: str, use_decimal: bool = False) -> Dict[str, Any]:
"""Parse TOML from a string.
Note: content must be str, not bytes. Calling loads(s=...) with a keyword argument
fails because the document argument is positional-only.
"""
if not isinstance(content, str):
raise TypeError(f"content must be str, got {type(content).__name__}")
if use_decimal:
return tomllib.loads(content, parse_float=Decimal)
return tomllib.loads(content)
def parse_toml_stream(fp: BinaryIO, use_decimal: bool = False) -> Dict[str, Any]:
"""Parse TOML from a binary stream.
Note: fp must be opened in binary mode ('rb'), not text mode ('r').
Calling load(fp=...) with a keyword argument fails because the stream argument
is positional-only.
"""
if use_decimal:
return tomllib.load(fp, parse_float=Decimal)
return tomllib.load(fp)
import datetime
import decimal
import io
from pathlib import Path
import sys
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
import tomli
from src.compat import tomllib
from src.loader import parse_toml_stream, parse_toml_string
# --- 1. Python stdlib vs tomli availability ---
if sys.version_info < (3, 11):
try:
import tomllib as _stdlib_tomllib # type: ignore[import-not-found]
assert False, "tomllib should not exist in stdlib on Python < 3.11"
except ModuleNotFoundError:
pass
assert tomllib is tomli
else:
import tomllib as _stdlib_tomllib
assert tomllib is _stdlib_tomllib
assert {s for s in dir(tomllib) if not s.startswith("_")} == {"load", "loads", "TOMLDecodeError"}
# --- 2. The I/O Symmetry Inversion Trap ---
# Trap A: load() expects a BINARY stream (BytesIO / rb). Text stream (StringIO / r) fails.
try:
tomllib.load(io.StringIO("title = 'CSX'"))
assert False, "tomllib.load must reject text stream"
except TypeError as err:
assert "binary mode" in str(err)
assert tomllib.load(io.BytesIO(b"title = 'CSX'\nport = 8080")) == {"title": "CSX", "port": 8080}
assert parse_toml_stream(io.BytesIO(b"loaded = true")) == {"loaded": True}
# Trap B: loads() expects str, NOT bytes.
try:
tomllib.loads(b"title = 'CSX'") # type: ignore[arg-type]
assert False, "tomllib.loads must reject raw bytes"
except TypeError as err:
assert "Expected str object, not 'bytes'" in str(err) or "str" in str(err)
assert tomllib.loads("title = 'CSX'") == {"title": "CSX"}
assert parse_toml_string("flag = true") == {"flag": True}
# --- 3. Positional-Only Parameter Trap ---
try:
tomllib.loads(s="key = 1") # type: ignore[call-arg]
assert False, "tomllib.loads should reject keyword argument 's'"
except TypeError as err:
# The message differs by interpreter -- "unexpected keyword argument"
# on tomli's pure-python signature, "positional-only arguments passed
# as keyword arguments" on CPython 3.11+ stdlib tomllib. What is
# durable, and what actually breaks a caller, is that the parameter
# cannot be named at all.
assert "'s'" in str(err)
try:
tomllib.load(fp=io.BytesIO(b"key = 1")) # type: ignore[call-arg]
assert False, "tomllib.load should reject keyword argument 'fp'"
except TypeError as err:
assert "'fp'" in str(err)
# --- 4. Read-Only Parser (No dump / dumps) ---
assert not hasattr(tomllib, "dump") and not hasattr(tomllib, "dumps")
try:
tomllib.dumps({"a": 1}) # type: ignore[attr-defined]
assert False, "dumps should not exist on tomllib"
except AttributeError:
pass
# --- 5. Exception Hierarchy ---
assert issubclass(tomllib.TOMLDecodeError, ValueError)
try:
tomllib.loads("name = 'first'\nname = 'second'")
assert False, "Duplicate keys must raise TOMLDecodeError"
except tomllib.TOMLDecodeError as err:
assert isinstance(err, ValueError)
# --- 6. Type Mapping & RFC 3339 Date/Time / Precision Decoupling ---
toml_doc = """
name = "tomli-sample"
retry_count = 5
pi_val = 3.141592653589793238462643383279
mixed_array = [10, "string_item", 42.5, false]
utc_datetime = 1979-05-27T07:32:00Z
offset_datetime = 1979-05-27T00:32:00-07:00
local_datetime = 1979-05-27T07:32:00
local_date = 1979-05-27
local_time = 07:32:00
[table_section]
enabled = true
"""
doc_standard = tomllib.loads(toml_doc)
assert isinstance(doc_standard["retry_count"], int) and doc_standard["retry_count"] == 5
assert isinstance(doc_standard["pi_val"], float)
assert doc_standard["mixed_array"] == [10, "string_item", 42.5, False]
assert doc_standard["table_section"]["enabled"] is True
doc_decimal = tomllib.loads(toml_doc, parse_float=decimal.Decimal)
assert isinstance(doc_decimal["pi_val"], decimal.Decimal)
assert doc_decimal["pi_val"] == decimal.Decimal("3.141592653589793238462643383279")
utc_dt = doc_standard["utc_datetime"]
assert isinstance(utc_dt, datetime.datetime) and utc_dt.tzinfo == datetime.timezone.utc
assert (utc_dt.year, utc_dt.month, utc_dt.day, utc_dt.hour, utc_dt.minute) == (1979, 5, 27, 7, 32)
offset_dt = doc_standard["offset_datetime"]
assert isinstance(offset_dt, datetime.datetime) and offset_dt.utcoffset() == datetime.timedelta(hours=-7)
local_dt = doc_standard["local_datetime"]
assert isinstance(local_dt, datetime.datetime) and local_dt.tzinfo is None
local_d = doc_standard["local_date"]
assert type(local_d) is datetime.date and not isinstance(local_d, datetime.datetime)
assert local_d == datetime.date(1979, 5, 27)
local_t = doc_standard["local_time"]
assert isinstance(local_t, datetime.time) and local_t == datetime.time(7, 32, 0)
print(f"CONTRACT PASS: tomli {tomli.__version__} on Python {sys.version.split()[0]}")