From 051d87fe564da75a2251f905b8c9d748b60d6ed2 Mon Sep 17 00:00:00 2001 From: friendsa Date: Wed, 5 Aug 2026 03:57:40 +0000 Subject: [PATCH] chore(release): prepare 0.9.16 changelog and version bump Trim intermediate profile-bump and non-user-facing news fragments, rewrite stale notes, fold remaining items via Towncrier, and set package version to 0.9.16 for publication. Co-authored-by: multica-agent --- CHANGELOG.md | 94 +++++++++++++++++++++++++++++++++ news/0.feature | 3 -- news/14.dep | 1 - news/24.dep | 1 - news/27.dep | 1 - news/60.dep | 1 - news/SHA-10.feature | 3 -- news/SHA-11.misc | 1 - news/SHA-13.doc | 1 - news/SHA-14.doc | 4 -- news/SHA-15.feature | 4 -- news/SHA-16.feature | 1 - news/SHA-17.feature | 3 -- news/SHA-18.feature | 6 --- news/SHA-19.feature | 4 -- news/SHA-20.feature | 8 --- news/SHA-21.feature | 5 -- news/SHA-22.feature | 3 -- news/SHA-23.doc | 7 --- news/SHA-36.doc | 1 - news/SHA-5.feature | 2 - news/SHA-7.feature | 5 -- news/SHA-8.feature | 3 -- news/SHA-9.feature | 3 -- news/readme-capability-docs.doc | 3 -- news/sha3-hygiene.misc | 1 - news/sha3-medium.feature | 1 - news/sha3-medium.removal | 1 - news/sha3-profile-o1.doc | 1 - news/sha3.bugfix | 1 - news/sha3.feature | 1 - news/sha6.dep | 1 - pyproject.toml | 2 +- uv.lock | 2 +- 34 files changed, 96 insertions(+), 83 deletions(-) delete mode 100644 news/0.feature delete mode 100644 news/14.dep delete mode 100644 news/24.dep delete mode 100644 news/27.dep delete mode 100644 news/60.dep delete mode 100644 news/SHA-10.feature delete mode 100644 news/SHA-11.misc delete mode 100644 news/SHA-13.doc delete mode 100644 news/SHA-14.doc delete mode 100644 news/SHA-15.feature delete mode 100644 news/SHA-16.feature delete mode 100644 news/SHA-17.feature delete mode 100644 news/SHA-18.feature delete mode 100644 news/SHA-19.feature delete mode 100644 news/SHA-20.feature delete mode 100644 news/SHA-21.feature delete mode 100644 news/SHA-22.feature delete mode 100644 news/SHA-23.doc delete mode 100644 news/SHA-36.doc delete mode 100644 news/SHA-5.feature delete mode 100644 news/SHA-7.feature delete mode 100644 news/SHA-8.feature delete mode 100644 news/SHA-9.feature delete mode 100644 news/readme-capability-docs.doc delete mode 100644 news/sha3-hygiene.misc delete mode 100644 news/sha3-medium.feature delete mode 100644 news/sha3-medium.removal delete mode 100644 news/sha3-profile-o1.doc delete mode 100644 news/sha3.bugfix delete mode 100644 news/sha3.feature delete mode 100644 news/sha6.dep diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f1f56a..27bba54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,97 @@ +## Release v0.9.16 (2026-08-05) + +### Features & Improvements + +- Expose a stable package-level public API (`FitFile`, `FitFileBuilder`, exceptions, version constants) + via `from fit_tool import ...`, documented in the README. Existing deep imports remain supported. ([#SHA-5](https://github.com/shaonianche/python_fit_tool/issues/SHA-5)) +- Introduce a wire-layer MVP (`fit_tool/wire`) with raw header/record models and a + stateful decoder that keeps immutable definition snapshots. `FitFile.from_bytes` + decodes via the wire layer and projects to existing typed messages while keeping + public API behavior compatible. ([#SHA-7](https://github.com/shaonianche/python_fit_tool/issues/SHA-7)) +- Unify stream and in-memory FIT decoding on one state machine (`FitDecoder` + over the wire layer) so definition snapshots, developer-field registration, + and CRC handling stay aligned between `FitFile.from_bytes` and `iter_*`. ([#SHA-8](https://github.com/shaonianche/python_fit_tool/issues/SHA-8)) +- Add a composable validation API (`validate_fit_file`, `FitFile.validate`) with + WIRE / PROFILE / FILE_TYPE levels and report or raise modes. Builder + `strict=True` now delegates to the same checks. ([#SHA-9](https://github.com/shaonianche/python_fit_tool/issues/SHA-9)) +- Split generated message construction into explicit create (`MessageClass()`) + and decode (`MessageClass.from_definition(...)`) paths; MessageFactory uses the + definition factory. ([#SHA-10](https://github.com/shaonianche/python_fit_tool/issues/SHA-10)) +- Expand decode-time component / accumulator coverage to all Profile main-field + sources via a generated registry (`fit_tool/profile/component_registry.py`), + with nested expansion (e.g. compressed speed → enhanced speed) and modular + accumulator rollover. Subfield-gated components remain deferred to subfield work. ([#SHA-15](https://github.com/shaonianche/python_fit_tool/issues/SHA-15)) +- Fix Profile **subfield resolution**: match reference field *values* (AND across multi-ref maps), apply the active subfield's type/scale/offset/units, expand components declared on that subfield, and report **ambiguous** multi-matches as PROFILE validation errors (decode still uses the first match). ([#SHA-16](https://github.com/shaonianche/python_fit_tool/issues/SHA-16)) +- Retain unknown native field ids on known messages during decode as + `UnknownField` (with `raw_bytes` for later PRESERVATION rewrite). Unedited + `to_bytes(preserve=True)` remains bit-identical via `wire_document`. ([#SHA-17](https://github.com/shaonianche/python_fit_tool/issues/SHA-17)) +- Post-edit **PRESERVATION**: per-record dirty tracking (field mutations mark + `Record.dirty`) so `to_bytes(preserve=True)` re-encodes only edited records and + copies `source_bytes` for the rest (unknown fields and other records survive). + Opt-in `ConformanceLevel.PRESERVATION` reports loss when unknown-field + `raw_bytes` were cleared. Structural `mark_dirty()` / add / remove still force + a full projected re-encode. ([#SHA-18](https://github.com/shaonianche/python_fit_tool/issues/SHA-18)) +- Encode policies: explicit `EncodeMode.PRESERVE` / `EncodeMode.CANONICAL` on + `FitFile.to_bytes` (legacy `preserve=` still works). Canonical rebuilds all + records with normalized sizes/CRCs; `strict=True` validates first and never + clamps invalid values. Policy matrix documented in README and design doc §6. ([#SHA-19](https://github.com/shaonianche/python_fit_tool/issues/SHA-19)) +- PROFILE validation supports selectable scopes (`ProfileScope.CORE` / `DOMAIN` / + `FULL`). Default `strict` / `DEFAULT_LEVELS` remain **CORE** (developer fields + + ambiguous subfields). DOMAIN and FULL add data-driven native base-type and + closed-enum checks from a gen-exported field catalog + (`fit_tool.profile.field_catalog`) derived from the bundled Profile. FULL is + opt-in only via `validate_fit_file(..., profile_scope=ProfileScope.FULL)`. ([#SHA-20](https://github.com/shaonianche/python_fit_tool/issues/SHA-20)) +- FILE_TYPE validation for **Workout** files: required `workout` / `workout_step` + messages and fields (`num_valid_steps`, step `message_index` / + `duration_type` / `target_type`). Activity behavior unchanged; other + `file_id.type` values (e.g. Course) still fail closed. SDK Workout fixtures + validate clean under FILE_TYPE. ([#SHA-21](https://github.com/shaonianche/python_fit_tool/issues/SHA-21)) +- FILE_TYPE validation for Course files: required course / lap / record / timer + events and fields (aligned with Garmin Course rules and real device exports). + Workout and other non-Activity/Course types still fail closed. ([#SHA-22](https://github.com/shaonianche/python_fit_tool/issues/SHA-22)) +- Protocol high-severity fixes: chained multi-segment FIT decode, trailing-byte rejection, compressed-timestamp reconstruction, known component expansion, and wire preservation encode for unedited buffer-decoded files. ([#sha3](https://github.com/shaonianche/python_fit_tool/issues/sha3)) +- Validate FIT header CRC when the header is larger than 12 bytes (CRC of the preceding header bytes in the final two bytes; gated by ``check_crc``). ([#sha3-medium](https://github.com/shaonianche/python_fit_tool/issues/sha3-medium)) +- Add bidirectional FIT interoperability coverage against the Garmin JavaScript + SDK at the bundled Profile version, plus corrected generated Profile scales. ([#33](https://github.com/shaonianche/python_fit_tool/issues/33)) + +### Bug Fixes + +- Copy record-header `local_id` onto parsed definition and data messages, and fix FLOAT field encoding so fractional values are preserved and FIT invalid all-ones bit patterns round-trip as `None`. ([#sha3](https://github.com/shaonianche/python_fit_tool/issues/sha3)) + +### Documentation + +- Move the detailed capability matrix and validation/encode notes from the + README into ``docs/CAPABILITY_BOUNDARY.md``. The README now keeps a short + install, public API, and minimal examples section, with a link to that doc. ([#readme-capability-docs](https://github.com/shaonianche/python_fit_tool/issues/readme-capability-docs)) +- Document the protocol fixture corpus and gap inventory under + `fit_tool/tests/data/README.md`, with constructive golden tests for component + edges, unknown fields on known messages, and subfield-bearing workout steps. ([#SHA-14](https://github.com/shaonianche/python_fit_tool/issues/SHA-14)) +- Document the current capability boundary for readers: README Supported / + Partial / Not-supported matrix and a short “what this library still does not + claim” section now match the shipped code (PROFILE scopes CORE/DOMAIN/FULL, + Activity/Workout/Course FILE_TYPE validation, post-edit PRESERVE/CANONICAL + encode). The conformance design doc and residual checklist are re-synced so + public claims stay honest — full Garmin FIT / Profile conformance is still + not advertised until every Definition of Done item is met. ([#SHA-23](https://github.com/shaonianche/python_fit_tool/issues/SHA-23)) +- Document the maintainer release checklist and harden the tag-based PyPI/GitHub + Release workflow (version gate, `v`-prefix tags, changelog extraction, split + build/publish/github-release jobs). ([#SHA-36](https://github.com/shaonianche/python_fit_tool/issues/SHA-36)) + +### Dependencies + +- Move profile-generation packages (`openpyxl`, `inflection`, plus `jinja2`) to an optional `[gen]` extra and drop unused `bitstruct` from the runtime install. ([#sha6](https://github.com/shaonianche/python_fit_tool/issues/sha6)) +- Upgrade the bundled Garmin FIT SDK Profile to 21.212.0. ([#60](https://github.com/shaonianche/python_fit_tool/issues/60)) + +### Removals and Deprecations + +- Deprecate ``Record.from_bytes`` for full-file decode. Prefer ``FitFile.from_bytes`` / ``WireDecoder`` + compatibility; the method remains for isolated record pack/unpack tests. ([#sha3-medium](https://github.com/shaonianche/python_fit_tool/issues/sha3-medium)) + +### Miscellany + +- Raise typed `Fit*` errors on core parse/encode paths and improve CLI error exits; + align package metadata with Python 3.9+ and Ruff as a CI gate. ([#sha3-hygiene](https://github.com/shaonianche/python_fit_tool/issues/sha3-hygiene)) + + ## Release v0.9.15 (2026-02-02) ### Features & Improvements diff --git a/news/0.feature b/news/0.feature deleted file mode 100644 index dc0275e..0000000 --- a/news/0.feature +++ /dev/null @@ -1,3 +0,0 @@ -Add opt-in strict FIT Activity validation, Developer Field declaration checks, bidirectional interoperability coverage -against the Garmin JavaScript SDK matching the bundled Profile, correct generated Profile scales, and current -three-digit Profile version support. diff --git a/news/14.dep b/news/14.dep deleted file mode 100644 index 089f87a..0000000 --- a/news/14.dep +++ /dev/null @@ -1 +0,0 @@ -Upgrade Garmin FIT SDK profile version to 21.188.0 diff --git a/news/24.dep b/news/24.dep deleted file mode 100644 index 0f9c967..0000000 --- a/news/24.dep +++ /dev/null @@ -1 +0,0 @@ -Upgrade Garmin FIT SDK profile version to 21.194.0 diff --git a/news/27.dep b/news/27.dep deleted file mode 100644 index 8ae8aef..0000000 --- a/news/27.dep +++ /dev/null @@ -1 +0,0 @@ -Upgrade Garmin FIT SDK profile version to 21.195.0 diff --git a/news/60.dep b/news/60.dep deleted file mode 100644 index 51cc18f..0000000 --- a/news/60.dep +++ /dev/null @@ -1 +0,0 @@ -Upgrade Garmin FIT SDK profile version to 21.212.0. diff --git a/news/SHA-10.feature b/news/SHA-10.feature deleted file mode 100644 index 87abd2f..0000000 --- a/news/SHA-10.feature +++ /dev/null @@ -1,3 +0,0 @@ -Split generated message construction into explicit create (`MessageClass()`) -and decode (`MessageClass.from_definition(...)`) paths; MessageFactory uses the -definition factory. diff --git a/news/SHA-11.misc b/news/SHA-11.misc deleted file mode 100644 index 963ca31..0000000 --- a/news/SHA-11.misc +++ /dev/null @@ -1 +0,0 @@ -Raise test coverage of core modules (validation, field, definition, wire) toward Codecov targets. diff --git a/news/SHA-13.doc b/news/SHA-13.doc deleted file mode 100644 index e84a427..0000000 --- a/news/SHA-13.doc +++ /dev/null @@ -1 +0,0 @@ -Sync design-doc current status and remaining-gaps table with main after wire-layer work; align README capability boundary wording. diff --git a/news/SHA-14.doc b/news/SHA-14.doc deleted file mode 100644 index 6372a53..0000000 --- a/news/SHA-14.doc +++ /dev/null @@ -1,4 +0,0 @@ -Document the protocol fixture corpus and gap inventory under -`fit_tool/tests/data/README.md`, with constructive Stage-2 golden tests for -component edges, unknown fields on known messages, and subfield-bearing -workout steps (explicit `xfail` where runtime is still incomplete). diff --git a/news/SHA-15.feature b/news/SHA-15.feature deleted file mode 100644 index 222fa3c..0000000 --- a/news/SHA-15.feature +++ /dev/null @@ -1,4 +0,0 @@ -Expand decode-time component / accumulator coverage to all Profile main-field -sources via a generated registry (`fit_tool/profile/component_registry.py`), -with nested expansion (e.g. compressed speed → enhanced speed) and modular -accumulator rollover. Subfield-gated components remain deferred to subfield work. diff --git a/news/SHA-16.feature b/news/SHA-16.feature deleted file mode 100644 index 806ad47..0000000 --- a/news/SHA-16.feature +++ /dev/null @@ -1 +0,0 @@ -Fix Profile **subfield resolution**: match reference field *values* (AND across multi-ref maps), apply the active subfield's type/scale/offset/units, expand components declared on that subfield, and report **ambiguous** multi-matches as PROFILE validation errors (decode still uses the first match). diff --git a/news/SHA-17.feature b/news/SHA-17.feature deleted file mode 100644 index 0624e7b..0000000 --- a/news/SHA-17.feature +++ /dev/null @@ -1,3 +0,0 @@ -Retain unknown native field ids on known messages during decode as -`UnknownField` (with `raw_bytes` for later PRESERVATION rewrite). Unedited -`to_bytes(preserve=True)` remains bit-identical via `wire_document`. diff --git a/news/SHA-18.feature b/news/SHA-18.feature deleted file mode 100644 index 76e3887..0000000 --- a/news/SHA-18.feature +++ /dev/null @@ -1,6 +0,0 @@ -Post-edit **PRESERVATION**: per-record dirty tracking (field mutations mark -`Record.dirty`) so `to_bytes(preserve=True)` re-encodes only edited records and -copies `source_bytes` for the rest (unknown fields and other records survive). -Opt-in `ConformanceLevel.PRESERVATION` reports loss when unknown-field -`raw_bytes` were cleared. Structural `mark_dirty()` / add / remove still force -a full projected re-encode. diff --git a/news/SHA-19.feature b/news/SHA-19.feature deleted file mode 100644 index ee2460d..0000000 --- a/news/SHA-19.feature +++ /dev/null @@ -1,4 +0,0 @@ -Encode policies: explicit `EncodeMode.PRESERVE` / `EncodeMode.CANONICAL` on -`FitFile.to_bytes` (legacy `preserve=` still works). Canonical rebuilds all -records with normalized sizes/CRCs; `strict=True` validates first and never -clamps invalid values. Policy matrix documented in README and design doc §6. diff --git a/news/SHA-20.feature b/news/SHA-20.feature deleted file mode 100644 index caee514..0000000 --- a/news/SHA-20.feature +++ /dev/null @@ -1,8 +0,0 @@ -PROFILE validation now supports selectable scopes (``ProfileScope.CORE`` / -``DOMAIN`` / ``FULL``) under architecture decision O1. Default ``strict`` / -``DEFAULT_LEVELS`` remain **CORE** (developer fields + ambiguous subfields). -DOMAIN and FULL add data-driven native base-type and closed-enum checks from a -gen-exported field catalog (``fit_tool.profile.field_catalog``) derived from -bundled Profile.xlsx ``21.205.0``. FULL is opt-in only; use -``validate_fit_file(..., profile_scope=ProfileScope.FULL)`` or -``profile_rule_coverage(ProfileScope.FULL)`` for coverage metrics. diff --git a/news/SHA-21.feature b/news/SHA-21.feature deleted file mode 100644 index e53e66d..0000000 --- a/news/SHA-21.feature +++ /dev/null @@ -1,5 +0,0 @@ -FILE_TYPE validation for **Workout** files: required `workout` / `workout_step` -messages and fields (`num_valid_steps`, step `message_index` / -`duration_type` / `target_type`). Activity behavior unchanged; other -`file_id.type` values (e.g. Course) still fail closed. SDK Workout fixtures -validate clean under FILE_TYPE. diff --git a/news/SHA-22.feature b/news/SHA-22.feature deleted file mode 100644 index 553e0c3..0000000 --- a/news/SHA-22.feature +++ /dev/null @@ -1,3 +0,0 @@ -FILE_TYPE validation for Course files: required course / lap / record / timer -events and fields (aligned with Garmin Course rules and real device exports). -Workout and other non-Activity/Course types still fail closed. diff --git a/news/SHA-23.doc b/news/SHA-23.doc deleted file mode 100644 index 81c2ead..0000000 --- a/news/SHA-23.doc +++ /dev/null @@ -1,7 +0,0 @@ -Document the current capability boundary for readers: README Supported / -Partial / Not-supported matrix and a short “what this library still does not -claim” section now match the shipped code (PROFILE scopes CORE/DOMAIN/FULL, -Activity/Workout/Course FILE_TYPE validation, post-edit PRESERVE/CANONICAL -encode). The conformance design doc and residual checklist are re-synced so -public claims stay honest — full Garmin FIT / Profile conformance is still -not advertised until every Definition of Done item is met. diff --git a/news/SHA-36.doc b/news/SHA-36.doc deleted file mode 100644 index f93a3b2..0000000 --- a/news/SHA-36.doc +++ /dev/null @@ -1 +0,0 @@ -Document the release checklist and harden the tag-based PyPI/GitHub Release workflow (version gate, v-prefix tags, changelog extraction, split build/publish/github-release jobs). diff --git a/news/SHA-5.feature b/news/SHA-5.feature deleted file mode 100644 index 54e92e9..0000000 --- a/news/SHA-5.feature +++ /dev/null @@ -1,2 +0,0 @@ -Expose a stable package-level public API (`FitFile`, `FitFileBuilder`, exceptions, version constants) -via `from fit_tool import ...`, documented in the README. Existing deep imports remain supported. diff --git a/news/SHA-7.feature b/news/SHA-7.feature deleted file mode 100644 index a87d25e..0000000 --- a/news/SHA-7.feature +++ /dev/null @@ -1,5 +0,0 @@ -Introduce a wire-layer MVP (`fit_tool/wire`) with raw header/record models and a -stateful decoder that keeps immutable definition snapshots. `FitFile.from_bytes` -now decodes via the wire layer and projects to existing typed messages; public -API behavior stays compatible. Deferred: compressed-timestamp reconstruction, -component expansion, chained multi-segment API, and lossless unknown-field rewrite. diff --git a/news/SHA-8.feature b/news/SHA-8.feature deleted file mode 100644 index e6bc8f0..0000000 --- a/news/SHA-8.feature +++ /dev/null @@ -1,3 +0,0 @@ -Unify stream and in-memory FIT decoding on one state machine (`FitDecoder` -over the wire layer) so definition snapshots, developer-field registration, -and CRC handling stay aligned between `FitFile.from_bytes` and `iter_*`. diff --git a/news/SHA-9.feature b/news/SHA-9.feature deleted file mode 100644 index 57d594a..0000000 --- a/news/SHA-9.feature +++ /dev/null @@ -1,3 +0,0 @@ -Add a composable validation API (`validate_fit_file`, `FitFile.validate`) with -WIRE / PROFILE / FILE_TYPE levels and report or raise modes. Builder -`strict=True` now delegates to the same checks. diff --git a/news/readme-capability-docs.doc b/news/readme-capability-docs.doc deleted file mode 100644 index 684577b..0000000 --- a/news/readme-capability-docs.doc +++ /dev/null @@ -1,3 +0,0 @@ -Move the detailed capability matrix and validation/encode notes from the -README into ``docs/CAPABILITY_BOUNDARY.md``. The README now keeps a short -install, public API, and minimal examples section, with a link to that doc. diff --git a/news/sha3-hygiene.misc b/news/sha3-hygiene.misc deleted file mode 100644 index 7a96cbc..0000000 --- a/news/sha3-hygiene.misc +++ /dev/null @@ -1 +0,0 @@ -Code hygiene: remove dead ``to_row`` statement, drop mutable ``Field.encoded_values`` class default, raise typed ``Fit*`` errors on core parse/encode paths, improve CLI error exits, align package metadata and AGENTS.md with Python 3.9+ and Ruff as a CI gate. diff --git a/news/sha3-medium.feature b/news/sha3-medium.feature deleted file mode 100644 index 4d30530..0000000 --- a/news/sha3-medium.feature +++ /dev/null @@ -1 +0,0 @@ -Validate FIT header CRC when the header is larger than 12 bytes (CRC of the preceding header bytes in the final two bytes; gated by ``check_crc``). diff --git a/news/sha3-medium.removal b/news/sha3-medium.removal deleted file mode 100644 index 90676ea..0000000 --- a/news/sha3-medium.removal +++ /dev/null @@ -1 +0,0 @@ -Deprecate ``Record.from_bytes`` for full-file decode. Prefer ``FitFile.from_bytes`` / ``WireDecoder`` + compatibility; the method remains for isolated record pack/unpack tests. diff --git a/news/sha3-profile-o1.doc b/news/sha3-profile-o1.doc deleted file mode 100644 index 13f790a..0000000 --- a/news/sha3-profile-o1.doc +++ /dev/null @@ -1 +0,0 @@ -Document PROFILE depth decision **O1**: bundled Profile.xlsx is the single source of truth; validation scopes CORE / DOMAIN / FULL with FULL opt-in (not default strict). See ``docs/FIT_CONFORMANCE_DESIGN.md`` §3.1. diff --git a/news/sha3.bugfix b/news/sha3.bugfix deleted file mode 100644 index f370c6d..0000000 --- a/news/sha3.bugfix +++ /dev/null @@ -1 +0,0 @@ -Copy record-header `local_id` onto parsed definition and data messages, and fix FLOAT field encoding so fractional values are preserved and FIT invalid all-ones bit patterns round-trip as `None`. diff --git a/news/sha3.feature b/news/sha3.feature deleted file mode 100644 index 12b9ad1..0000000 --- a/news/sha3.feature +++ /dev/null @@ -1 +0,0 @@ -Protocol high-severity fixes: chained multi-segment FIT decode, trailing-byte rejection, compressed-timestamp reconstruction, known component expansion, and wire preservation encode for unedited buffer-decoded files. diff --git a/news/sha6.dep b/news/sha6.dep deleted file mode 100644 index 543c729..0000000 --- a/news/sha6.dep +++ /dev/null @@ -1 +0,0 @@ -Move profile-generation packages (`openpyxl`, `inflection`, plus `jinja2`) to an optional `[gen]` extra and drop unused `bitstruct` from the runtime install. diff --git a/pyproject.toml b/pyproject.toml index 483a6de..659920a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "fit-tool" -version = "0.9.15" +version = "0.9.16" description = "A library for reading and writing Garmin FIT files." readme = "README.md" license = "BSD-3-Clause" diff --git a/uv.lock b/uv.lock index 3849908..018378a 100644 --- a/uv.lock +++ b/uv.lock @@ -338,7 +338,7 @@ wheels = [ [[package]] name = "fit-tool" -version = "0.9.15" +version = "0.9.16" source = { editable = "." } [package.optional-dependencies]