summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--searx/weather.py63
1 files changed, 37 insertions, 26 deletions
diff --git a/searx/weather.py b/searx/weather.py
index 449b261ae..429758055 100644
--- a/searx/weather.py
+++ b/searx/weather.py
@@ -255,7 +255,8 @@ class DateTime(msgspec.Struct):
return babel.dates.format_date(self.datetime, format=fmt, locale=locale)
-TemperatureUnits: t.TypeAlias = t.Literal["°C", "°F", "K"]
+TemperatureUnit: t.TypeAlias = t.Literal["°C", "°F", "K"]
+TEMPERATURE_UNITS: t.Final[tuple[TemperatureUnit]] = t.get_args(TemperatureUnit)
class Temperature(msgspec.Struct, kw_only=True):
@@ -263,19 +264,19 @@ class Temperature(msgspec.Struct, kw_only=True):
measured values."""
val: float
- unit: TemperatureUnits
+ unit: TemperatureUnit
si_name: t.ClassVar[str] = "Q11579"
- units: t.ClassVar[list[str]] = list(t.get_args(TemperatureUnits))
+ UNITS: t.ClassVar[tuple[TemperatureUnit]] = TEMPERATURE_UNITS
def __post_init__(self):
- if self.unit not in self.units:
+ if self.unit not in self.UNITS:
raise ValueError(f"invalid unit: {self.unit}")
def __str__(self):
return self.l10n()
- def value(self, unit: TemperatureUnits) -> float:
+ def value(self, unit: TemperatureUnit) -> float:
if unit == self.unit:
return self.val
si_val = convert_to_si(si_name=self.si_name, symbol=self.unit, value=self.val)
@@ -283,7 +284,7 @@ class Temperature(msgspec.Struct, kw_only=True):
def l10n(
self,
- unit: TemperatureUnits | None = None,
+ unit: TemperatureUnit | None = None,
locale: babel.Locale | GeoLocation | None = None,
template: str = "{value} {unit}",
num_pattern: str = "#,##0",
@@ -322,7 +323,8 @@ class Temperature(msgspec.Struct, kw_only=True):
return template.format(value=val_str, unit=unit)
-PressureUnits: t.TypeAlias = t.Literal["Pa", "hPa", "cm Hg", "bar"]
+PressureUnit: t.TypeAlias = t.Literal["Pa", "hPa", "cm Hg", "bar"]
+PRESSURE_UNITS: t.Final[tuple[PressureUnit]] = t.get_args(PressureUnit)
class Pressure(msgspec.Struct, kw_only=True):
@@ -330,19 +332,19 @@ class Pressure(msgspec.Struct, kw_only=True):
measured values."""
val: float
- unit: PressureUnits
+ unit: PressureUnit
si_name: t.ClassVar[str] = "Q44395"
- units: t.ClassVar[list[str]] = list(t.get_args(PressureUnits))
+ UNITS: t.ClassVar[tuple[PressureUnit]] = PRESSURE_UNITS
def __post_init__(self):
- if self.unit not in self.units:
+ if self.unit not in self.UNITS:
raise ValueError(f"invalid unit: {self.unit}")
def __str__(self):
return self.l10n()
- def value(self, unit: PressureUnits) -> float:
+ def value(self, unit: PressureUnit) -> float:
if unit == self.unit:
return self.val
si_val = convert_to_si(si_name=self.si_name, symbol=self.unit, value=self.val)
@@ -350,7 +352,7 @@ class Pressure(msgspec.Struct, kw_only=True):
def l10n(
self,
- unit: PressureUnits | None = None,
+ unit: PressureUnit | None = None,
locale: babel.Locale | GeoLocation | None = None,
template: str = "{value} {unit}",
num_pattern: str = "#,##0",
@@ -367,7 +369,8 @@ class Pressure(msgspec.Struct, kw_only=True):
return template.format(value=val_str, unit=unit)
-WindSpeedUnits: t.TypeAlias = t.Literal["m/s", "km/h", "kn", "mph", "mi/h", "Bft"]
+WindSpeedUnit: t.TypeAlias = t.Literal["m/s", "km/h", "kn", "mph", "mi/h", "Bft"]
+WIND_SPEED_UNITS: t.Final[tuple[WindSpeedUnit]] = t.get_args(WindSpeedUnit)
class WindSpeed(msgspec.Struct, kw_only=True):
@@ -382,19 +385,19 @@ class WindSpeed(msgspec.Struct, kw_only=True):
"""
val: float
- unit: WindSpeedUnits
+ unit: WindSpeedUnit
si_name: t.ClassVar[str] = "Q182429"
- units: t.ClassVar[list[str]] = list(t.get_args(WindSpeedUnits))
+ UNITS: t.ClassVar[tuple[WindSpeedUnit]] = WIND_SPEED_UNITS
def __post_init__(self):
- if self.unit not in self.units:
+ if self.unit not in self.UNITS:
raise ValueError(f"invalid unit: {self.unit}")
def __str__(self):
return self.l10n()
- def value(self, unit: WindSpeedUnits) -> float:
+ def value(self, unit: WindSpeedUnit) -> float:
if unit == self.unit:
return self.val
si_val = convert_to_si(si_name=self.si_name, symbol=self.unit, value=self.val)
@@ -402,7 +405,7 @@ class WindSpeed(msgspec.Struct, kw_only=True):
def l10n(
self,
- unit: WindSpeedUnits | None = None,
+ unit: WindSpeedUnit | None = None,
locale: babel.Locale | GeoLocation | None = None,
template: str = "{value} {unit}",
num_pattern: str = "#,##0",
@@ -419,7 +422,8 @@ class WindSpeed(msgspec.Struct, kw_only=True):
return template.format(value=val_str, unit=unit)
-RelativeHumidityUnits: t.TypeAlias = t.Literal["%"]
+RelativeHumidityUnit: t.TypeAlias = t.Literal["%"]
+RELATIVE_HUMIDITY_UNITS: t.Final[tuple[RelativeHumidityUnit]] = t.get_args(RelativeHumidityUnit)
class RelativeHumidity(msgspec.Struct):
@@ -428,8 +432,12 @@ class RelativeHumidity(msgspec.Struct):
val: float
# there exists only one unit (%) --> set "%" as the final value (constant)
- unit: t.ClassVar["t.Final[RelativeHumidityUnits]"] = "%"
- units: t.ClassVar[list[str]] = list(t.get_args(RelativeHumidityUnits))
+ unit: t.ClassVar[RelativeHumidityUnit] = "%"
+ UNITS: t.ClassVar[tuple[RelativeHumidityUnit]] = RELATIVE_HUMIDITY_UNITS
+
+ def __post_init__(self):
+ if self.unit not in self.UNITS:
+ raise ValueError(f"invalid unit: {self.unit}")
def __str__(self):
return self.l10n()
@@ -457,20 +465,23 @@ CompassPoint: t.TypeAlias = t.Literal[
"N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"
]
"""Compass point type definition"""
+COMPASS_POINTS: t.Final[tuple[CompassPoint]] = t.get_args(CompassPoint)
-CompassUnits: t.TypeAlias = t.Literal["°", "Point"]
+CompassUnit: t.TypeAlias = t.Literal["°", "Point"]
+COMPASS_UNITS: t.Final[tuple[CompassUnit]] = t.get_args(CompassUnit)
class Compass(msgspec.Struct):
"""Class for converting compass points and azimuth values (360°)"""
val: "float | int | CompassPoint"
- unit: CompassUnits = "°"
+ unit: CompassUnit = "°"
+ UNITS: t.ClassVar[tuple[CompassUnit]] = COMPASS_UNITS
TURN: t.ClassVar[float] = 360.0
"""Full turn (360°)"""
- POINTS: t.ClassVar[list[CompassPoint]] = list(t.get_args(CompassPoint))
+ POINTS: t.ClassVar[tuple[CompassPoint]] = COMPASS_POINTS
"""Compass points."""
RANGE: t.ClassVar[float] = TURN / len(POINTS)
@@ -488,7 +499,7 @@ class Compass(msgspec.Struct):
def __str__(self):
return self.l10n()
- def value(self, unit: CompassUnits):
+ def value(self, unit: CompassUnit):
if unit == "Point" and isinstance(self.val, float):
return self.point(self.val)
if unit == "°":
@@ -507,7 +518,7 @@ class Compass(msgspec.Struct):
def l10n(
self,
- unit: CompassUnits = "Point",
+ unit: CompassUnit = "Point",
locale: babel.Locale | GeoLocation | None = None,
template: str = "{value}{unit}",
num_pattern: str = "#,##0",