Replace the flat GPS fields on GPSPacket and its subclasses with a
composed Position value object (has-a instead of is-a), collapsing the
Packet -> GPSPacket -> {Beacon, MicE, Telemetry, Object, Weather}
data spine. Position owns the coordinates, symbol, movement/PHG data
and the conversion/formatting logic (zulu time, DDM, human_info).
- GPSPacket holds position: Optional[Position]; subclass defaults
preserved via _position_default() (ObjectPacket 'r', WeatherPacket '_')
- to_dict()/from_dict() flatten/unflatten so the on-disk JSON format
is unchanged; verified via objectstore save/load round-trip
- GPSPacket inherits DataClassJsonMixin directly because the
@dataclass_json decorator overwrites to_dict()/from_dict() and would
clobber the flattening overrides
- constructor is breaking: position=Position(...) instead of
latitude=.../longitude=...; updated tx.py, log.py and all tests
Full test suite (775) passes; ruff format + lint clean.
This patch eliminates the need for a custom
static method on each Packetclass to convert an aprslib
raw decoded dictionary -> correct Packet class.
This now uses the built in dataclasses_json from_dict()
mixin with an override for both the WeatherPacket and
the ThirdPartyPacket.
This patch also adds the TelemetryPacket and adds some
missing members to a few of the classes from test runs
decoding all packets from APRS-IS -> Packet classes.
Also adds some verification for packets in test_packets
this patch removes the need for dacite2 package for creating
packet objects from the aprslib decoded packet dictionary.
moved the factory method from the base Packet object
to the core module.