- Central directory now folds into the last data volume when there is room,
instead of unconditionally creating a separate
.zipvolume holding only metadata. A 1368 MiB file split at 1024 MiB used to produce three files (.z01,.z02,.zip) where.zipwas ~80 bytes; it now produces two (.z01,.zip).
VolumeManager.start_final_volume()accepts an optionalreserved_byteshint. The writer pre-serializes the central directory and passes its exact size + EOCD size so the volume manager can decide whether to fold. Default of 0 preserves the previous behavior.
- Fix path traversal (zip slip) in
sanitize_arcname - Add ZIP32 overflow guards (4GB file limit, 65535 entry limit)
- Detect and skip symlinks
- Sanitize directory entry arcnames through
sanitize_arcname
- CI workflow (lint, type-check, test across Python 3.9–3.13)
- Trusted publisher PyPI publishing via OIDC
- CLI tests, volume boundary tests, overflow guard tests
- API reference and limitations documentation
- Compression parameter validation
- Volume count warning when exceeding 99 volumes
- Streaming compression in
writestrfor large buffers - CI: p7zip-full for integration tests, 80% coverage threshold
- Local file headers no longer split across volume boundaries
close()is now idempotent (safe on re-entry)__exit__skips finalization on error instead of writing corrupt archive- Archive name length validated against 65535-byte ZIP limit
space_remaining()returnssys.maxsizeinstead offloat("inf")- CLI returns exit code 1 for unknown subcommands
- README clone URL matches repository URL
create()returnslist[Path]for consistency withclose()parse_sizetype annotation includesfloat- Removed placeholder author email from pyproject.toml
- Pinned build tool version in publish workflow
- Dead code:
_is_utf8()method,SPLIT_ARCHIVE_SIGconstant - Python 3.14 from classifiers (not yet released)