- GAP_ZONE_ID names the canvas' phantom gap-cell zone and the delta
filter tests keys against it explicitly, so it can't be confused with
the -1 "No change" color value; _sanitize_map's docstring states it
filters keys only.
- The _value init guard in PerKeyLighting.write_key_value moves above
both branches — the un-set branch also mutates _value — matching the
base class, with a note on why it tests `is None`.
- A powered-on reconfig forces the apply only when the device was
already marked active: on the inactive→active transition changed()
just applied everything, so forcing would push a redundant duplicate
frame. Regression test covers both cases.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* refactoring(logitech_receiver/notifications): change to enums PairingError and BoltPairingError
* refactoring(logitech_receiver/notifications): change to enums PairingError and BoltPairingError (Fix pre-commit checks)
* refactor(logitech_receiver/base.py): create unit tests for ping function before replacing ERRORNamedInts by IntEnum
* refactor(logitech_receiver/base.py): create unit tests for request function before replacing ERROR NamedInts by IntEnum
* refactor(logitech_receiver/base.py): create unit tests for ping function before replacing ERRORNamedInts by IntEnum (add exclusion for macOS)
* refactor(logitech_receiver/base.py): create unit tests for ping function before replacing ERRORNamedInts by IntEnum (fix for python < 3.10)