API changes
- in version 4.5.0, `inifix.load` and `inifix.loads` used to cast any
integer-compatible string (e.g. `'1.0'`, `'1.'` or `'1e0'`) as a Python `int`.
They now read these as Python `float`s by default. The previous behavior is
still available as an opt-in, using the new argument `integer_parsing='aggressive'`.
Strings such as `'123'` (without a `'.'`, an `'e'` or an `'E'`) are still
parsed as Python `int`s in all cases.
- restrict special "bool-like" unescaped strings to lower, upper, or title cases.
This means that for instance `true`, `TRUE` or `True` are still parsed as
the Python boolean `True`, but e.g. `TruE` isn't.
- add and document `inifix.format_string`, replacing previously
undocumented `inifix.iniformat` (still available for backward compatibility,
but now deprecated)
Bug fixes
- fix a corner case where data would be lost on dump for empty string values
- fix bugs around decoding supported bool values
Other changes
- MNT: drop support for CPython 3.9
- TST: test against CPython 3.13 (both GIL flavor and free-threading flavor)
- TST: setup concurrency testing
- PERF: `inifix-format` (and the associated pre-commit hook) now runs on
multiple threads. The performance gain is modest on stable versions of Python
(as of 3.12), but expected to get more significant in the future (PEP 703).