22from __future__ import annotations
33
44from dataclasses import dataclass
5-
6- from pydantic import BaseModel , Field
5+ from typing import TYPE_CHECKING , Any
76
87from .const import AircraftCategory , PositionSource
98from .exceptions import OpenSkyCoordinateError
9+ from .util import to_enum
10+
11+ if TYPE_CHECKING :
12+ from typing_extensions import Self
1013
1114
12- class StatesResponse (BaseModel ):
15+ @dataclass (slots = True )
16+ class StatesResponse :
1317 """Represents the states response."""
1418
15- states : list [StateVector ] = Field (...)
16- time : int = Field (...)
19+ states : list [StateVector ]
20+ time : int
21+
22+ @classmethod
23+ def from_api (cls , data : dict [str , Any ]) -> Self :
24+ """Initialize from the API."""
25+ return cls (
26+ time = data ["time" ],
27+ states = [
28+ StateVector .from_api (vector_data ) for vector_data in data ["states" ]
29+ ],
30+ )
1731
1832
19- class StateVector (BaseModel ):
33+ @dataclass (slots = True )
34+ # pylint: disable-next=too-many-instance-attributes
35+ class StateVector :
2036 """Represents the state of a vehicle at a particular time.
2137
2238 Attributes
@@ -43,27 +59,59 @@ class StateVector(BaseModel):
4359 category: Aircraft category.
4460 """
4561
46- icao24 : str = Field (...)
47- callsign : str | None = Field (None )
48- origin_country : str = Field (...)
49- time_position : int | None = Field (None )
50- last_contact : int = Field (...)
51- longitude : float | None = Field (None )
52- latitude : float | None = Field (None )
53- geo_altitude : float | None = Field (None )
54- on_ground : bool = Field (...)
55- velocity : float | None = Field (None )
56- true_track : float | None = Field (None )
57- vertical_rate : float | None = Field (None )
58- sensors : list [int ] | None = Field ([])
59- barometric_altitude : float | None = Field (None , alias = "baro_altitude" )
60- transponder_code : str | None = Field (None , alias = "squawk" )
61- special_purpose_indicator : bool = Field (..., alias = "spi" )
62- position_source : PositionSource = Field (...)
63- category : AircraftCategory = Field (...)
64-
65-
66- @dataclass
62+ icao24 : str
63+ callsign : str | None
64+ origin_country : str
65+ time_position : int | None
66+ last_contact : int
67+ longitude : float | None
68+ latitude : float | None
69+ geo_altitude : float | None
70+ on_ground : bool
71+ velocity : float | None
72+ true_track : float | None
73+ vertical_rate : float | None
74+ sensors : list [int ] | None
75+ barometric_altitude : float | None
76+ transponder_code : str | None
77+ special_purpose_indicator : bool
78+ position_source : PositionSource
79+ category : AircraftCategory
80+
81+ @classmethod
82+ def from_api (cls , data : dict [str , Any ]) -> Self :
83+ """Initialize from the API."""
84+ return cls (
85+ icao24 = data ["icao24" ],
86+ callsign = data .get ("callsign" ),
87+ origin_country = data ["origin_country" ],
88+ time_position = data .get ("time_position" ),
89+ last_contact = data ["last_contact" ],
90+ longitude = data .get ("longitude" ),
91+ latitude = data .get ("latitude" ),
92+ geo_altitude = data .get ("geo_altitude" ),
93+ on_ground = data ["on_ground" ],
94+ velocity = data .get ("velocity" ),
95+ true_track = data .get ("true_track" ),
96+ vertical_rate = data .get ("vertical_rate" ),
97+ sensors = data .get ("sensors" , []),
98+ barometric_altitude = data .get ("baro_altitude" ),
99+ transponder_code = data .get ("squawk" ),
100+ special_purpose_indicator = data ["spi" ],
101+ position_source = to_enum (
102+ PositionSource ,
103+ data ["position_source" ],
104+ PositionSource .UNKNOWN ,
105+ ),
106+ category = to_enum (
107+ AircraftCategory ,
108+ data ["category" ],
109+ AircraftCategory .NO_INFORMATION ,
110+ ),
111+ )
112+
113+
114+ @dataclass (slots = True )
67115class BoundingBox :
68116 """Bounding box for retrieving state vectors."""
69117
@@ -90,7 +138,3 @@ def _check_longitude(degrees: float) -> None:
90138 if degrees < - 180 or degrees > 180 :
91139 msg = f"Invalid longitude { degrees } ! Must be in [-180, 180]."
92140 raise OpenSkyCoordinateError (msg )
93-
94-
95- StatesResponse .update_forward_refs ()
96- StateVector .update_forward_refs ()
0 commit comments