All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
pytest-benchmarkinfrastructure intests/benchmarks/- Codec benchmarks (
test_bench_codec.py): encode, decode, roundtrip for small/medium/large messages - Float benchmarks (
test_bench_float.py):BoundedFloatencoding at low (precision=2), medium (precision=4), and high (precision=6) levels - Routing benchmarks (
test_bench_routing.py):encode_with_routing,decode_with_routing,decode_by_iddispatch path - Fragmentation benchmarks: fragment, reassemble, and full roundtrip throughput
[tool.pytest-benchmark]config inpyproject.toml(min_rounds=100, warmup, sort by mean)- Benchmarks excluded from default
pytestrun vianorecursedirs; run explicitly withpytest tests/benchmarks/ --benchmark-only
fragment_message()— splits encoded payloads into acoustic-modem-sized chunks with 4-byte headersreassemble_fragments()— reconstructs original payload; handles out-of-order, duplicates, missing fragmentsiter_fragments()— memory-efficient generator for streaming large messages- 4-byte fragment header: Fragment ID (16-bit), Sequence (8-bit), Total (8-bit)
- Max 255 fragments per message (~15 KB at 64-byte frame size)
FragmentationErrorfor all failure modes- 29 tests, 95% coverage (
tests/unit/test_fragmentation.py) examples/fragmentation_demo.py
MockModemDriver— loopback acoustic channel simulator with configurable parametersMockModemConfig— dataclass for channel configuration (delay, packet loss, BER, frame size, data rate)ModemDriver— abstract base class for vendor-agnostic modem interface- Queue-based producer-consumer architecture with background RX thread
- Probabilistic packet loss and bit error injection
- Multiple RX callback support
- 18 tests, ~99% modem module coverage (
tests/unit/test_modem_mock.py) examples/hitl_simulation.py
- Bumped version
0.1.1→0.3.0 pyproject.toml: addedpytest-benchmark>=4.0.0to dev dependencies, registeredbenchmarkmarker, addednorecursedirsto exclude benchmarks from default runs- Fixed pre-existing
rufflint issues (I001,UP035) andblackformatting insrc/uwacomm/fragmentation.py,modem/mock.py,modem/driver.py,__init__.py
- Added dual-platform CI (GitHub + Gitea) with platform detection
- PyPI publishing restricted to GitHub only (security best practice)
- Codecov integration for coverage upload
0.1.0 - 2026-02-10
- Initial release of uwacomm (Underwater Communications Codec)
- Pydantic-based message modeling with
BaseMessage - Compact binary encoding/decoding with bounded field optimization
- Support for: booleans, bounded integers, enums, fixed-length bytes/strings, fixed-size arrays
- Deterministic big-endian encoding
- CRC-16 and CRC-32 implementations
- Basic framing utilities (length prefix, CRC wrapping)
- Protobuf schema generation from Pydantic models
- Size calculation utilities
- CLI tool with
uwacomm --analyzecommand for message schema analysis (inspired by DCCL) - Comprehensive test suite with property-based tests (92 tests, 72% coverage)
- Full type hints and mypy strict mode compliance
- Documentation with mkdocs-material
- GitHub Actions CI/CD pipeline
- Proper attribution to DCCL (Dynamic Compact Control Language) from GobySoft
- Schema-first approach inspired by DCCL (Dynamic Compact Control Language)
- Pydantic v2 as the primary message definition interface
- Explicit bounds enable compact encoding (fewer bits for constrained ranges)
- Deterministic, platform-independent serialization
- Security-conscious parsing with bounds checking
- Floating-point encoding not yet implemented (deferred to v0.2.0)
- Nested messages not supported in v0.1.0
- Variable-length arrays/strings use fixed-size encoding
- No zigzag or varint encoding yet
- Little-endian encoding not supported (big-endian only)