Skip to content

Commit

Permalink
Use assignment expressions (PEP572) (#615)
Browse files Browse the repository at this point in the history
* Use assignment expressions (PEP572)

* Remove debug code

---------

Co-authored-by: Richard <[email protected]>
  • Loading branch information
rikroe and rikroe authored May 16, 2024
1 parent 865df88 commit f315620
Show file tree
Hide file tree
Showing 8 changed files with 37 additions and 61 deletions.
15 changes: 1 addition & 14 deletions bimmer_connected/tests/test_vehicle_status.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import time_machine

from bimmer_connected.api.regions import get_region_from_name
from bimmer_connected.vehicle.climate import Climate, ClimateActivityState
from bimmer_connected.vehicle.climate import ClimateActivityState
from bimmer_connected.vehicle.doors_windows import LidState, LockState
from bimmer_connected.vehicle.fuel_and_battery import ChargingState, FuelAndBattery
from bimmer_connected.vehicle.location import VehicleLocation
Expand Down Expand Up @@ -65,19 +65,6 @@ async def test_generic_error_handling(caplog, bmw_fixture: respx.Router):

caplog.clear()

vehicle = account.get_vehicle(VIN_I20)
state_wo_climate_activity = vehicle.data["state"].copy()
state_wo_climate_activity["climateControlState"].pop("activity", None)
vehicle.climate = Climate()

assert vehicle.climate.activity == ClimateActivityState.UNKNOWN
vehicle.update_state(vehicle.data, state_wo_climate_activity)
assert (
any("climate" in r.message and "KeyError" in r.message and "'activity'" in r.message for r in caplog.records)
is True
)
assert vehicle.climate.activity == ClimateActivityState.UNKNOWN


@pytest.mark.asyncio
async def test_range_combustion_no_info(caplog, bmw_fixture: respx.Router):
Expand Down
9 changes: 2 additions & 7 deletions bimmer_connected/vehicle/charging_profile.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,10 +132,7 @@ class ChargingProfile(VehicleDataBase):
def _parse_vehicle_data(cls, vehicle_data: Dict) -> Dict:
"""Parse charging data."""
retval: Dict[str, Any] = {}

if ATTR_STATE in vehicle_data and "chargingProfile" in vehicle_data[ATTR_STATE]:
charging_profile = vehicle_data[ATTR_STATE]["chargingProfile"]

if ATTR_STATE in vehicle_data and (charging_profile := vehicle_data[ATTR_STATE].get("chargingProfile")):
retval["is_pre_entry_climatization_enabled"] = bool(charging_profile.get("climatisationOn", False))
retval["departure_times"] = [DepartureTimer(t) for t in charging_profile.get("departureTimes", [])]
retval["preferred_charging_window"] = ChargingWindow(charging_profile.get("reductionOfChargeCurrent", {}))
Expand All @@ -145,16 +142,14 @@ def _parse_vehicle_data(cls, vehicle_data: Dict) -> Dict:
if "acCurrentLimit" in charging_profile["chargingSettings"]:
retval["ac_current_limit"] = charging_profile["chargingSettings"]["acCurrentLimit"]

if ATTR_CHARGING_SETTINGS in vehicle_data:
charging_settings = vehicle_data[ATTR_CHARGING_SETTINGS]
if charging_settings := vehicle_data.get(ATTR_CHARGING_SETTINGS):
if "servicePack" in charging_settings:
retval["charging_preferences_service_pack"] = charging_settings["servicePack"]
if (
"chargingSettingsDetail" in charging_settings
and "acLimit" in charging_settings["chargingSettingsDetail"]
):
retval["ac_available_limits"] = charging_settings["chargingSettingsDetail"]["acLimit"]["values"]

return retval

def format_for_remote_service(self) -> dict:
Expand Down
23 changes: 11 additions & 12 deletions bimmer_connected/vehicle/climate.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,18 +38,17 @@ def _parse_vehicle_data(cls, vehicle_data: Dict) -> Dict:
"""Parse tire status."""
retval: Dict[str, Any] = {}

if ATTR_STATE in vehicle_data:
if "climateControlState" in vehicle_data[ATTR_STATE]:
retval["activity"] = ClimateActivityState(vehicle_data[ATTR_STATE]["climateControlState"]["activity"])
retval["activity_end_time"] = (
(
datetime.datetime.now(datetime.timezone.utc)
+ datetime.timedelta(
seconds=int(vehicle_data[ATTR_STATE]["climateControlState"]["remainingSeconds"])
)
)
if "remainingSeconds" in vehicle_data[ATTR_STATE]["climateControlState"]
else None
if ATTR_STATE in vehicle_data and (
climate_control_state := vehicle_data[ATTR_STATE].get("climateControlState")
):
retval["activity"] = ClimateActivityState(climate_control_state["activity"])
retval["activity_end_time"] = (
(
datetime.datetime.now(datetime.timezone.utc)
+ datetime.timedelta(seconds=int(climate_control_state["remainingSeconds"]))
)
if "remainingSeconds" in climate_control_state
else None
)

return retval
18 changes: 8 additions & 10 deletions bimmer_connected/vehicle/doors_windows.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,28 +76,26 @@ def _parse_vehicle_data(cls, vehicle_data: Dict) -> Dict:
retval: Dict[str, Any] = {}

if ATTR_STATE in vehicle_data:
if "doorsState" in vehicle_data[ATTR_STATE]:
if doors_state := vehicle_data[ATTR_STATE].get("doorsState"):
retval["lids"] = [
Lid(k, v)
for k, v in vehicle_data[ATTR_STATE]["doorsState"].items()
for k, v in doors_state.items()
if k not in ["combinedState", "combinedSecurityState"] and v != LidState.INVALID
]
retval["door_lock_state"] = LockState(
vehicle_data[ATTR_STATE]["doorsState"].get("combinedSecurityState", "UNKNOWN")
)
retval["door_lock_state"] = LockState(doors_state.get("combinedSecurityState", "UNKNOWN"))

if "windowsState" in vehicle_data[ATTR_STATE]:
if windows_state := vehicle_data[ATTR_STATE].get("windowsState"):
retval["windows"] = [
Window(k, v)
for k, v in vehicle_data[ATTR_STATE]["windowsState"].items()
for k, v in windows_state.items()
if k not in ["combinedState"] and v != LidState.INVALID
]

if "roofState" in vehicle_data[ATTR_STATE]:
if roof_state := vehicle_data[ATTR_STATE].get("roofState"):
retval["lids"].append(
Lid(
to_camel_case(vehicle_data[ATTR_STATE]["roofState"]["roofStateType"]),
vehicle_data[ATTR_STATE]["roofState"]["roofState"],
to_camel_case(roof_state["roofStateType"]),
roof_state["roofState"],
)
)

Expand Down
3 changes: 1 addition & 2 deletions bimmer_connected/vehicle/fuel_and_battery.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,7 @@ def _parse_vehicle_data(cls, vehicle_data: Dict) -> Optional[Dict]:
retval.update(cls._parse_fuel_data(state.get("combustionFuelLevel", {})))

if drivetrain in HV_BATTERY_DRIVE_TRAINS:
electric_data = state.get("electricChargingState", {})
if electric_data:
if electric_data := state.get("electricChargingState", {}):
retval.update(
cls._parse_electric_data(
electric_data,
Expand Down
3 changes: 1 addition & 2 deletions bimmer_connected/vehicle/location.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,7 @@ def _parse_vehicle_data(cls, vehicle_data: Dict):
parse_datetime(vehicle_data.get(ATTR_STATE, {}).get("lastFetched")) or date_dummy,
parse_datetime(vehicle_data.get(ATTR_ATTRIBUTES, {}).get("lastFetched")) or date_dummy,
)
if ATTR_STATE in vehicle_data and "location" in vehicle_data[ATTR_STATE]:
location = vehicle_data[ATTR_STATE]["location"]
if ATTR_STATE in vehicle_data and (location := vehicle_data[ATTR_STATE].get("location")):
retval["location"] = GPSPosition(location["coordinates"]["latitude"], location["coordinates"]["longitude"])
retval["heading"] = location["heading"]
return retval
Expand Down
16 changes: 8 additions & 8 deletions bimmer_connected/vehicle/reports.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,7 @@ def _parse_vehicle_data(cls, vehicle_data: Dict) -> Optional[Dict]:
"""Parse doors and windows."""
retval: Dict[str, Any] = {}

if ATTR_STATE in vehicle_data and "requiredServices" in vehicle_data[ATTR_STATE]:
messages = vehicle_data[ATTR_STATE]["requiredServices"]
if ATTR_STATE in vehicle_data and (messages := vehicle_data[ATTR_STATE].get("requiredServices")):
retval["messages"] = [ConditionBasedService.from_api_entry(**m) for m in messages]
retval["is_service_required"] = any((m.state != ConditionBasedServiceStatus.OK) for m in retval["messages"])

Expand Down Expand Up @@ -108,8 +107,7 @@ def _parse_vehicle_data(cls, vehicle_data: Dict) -> Optional[Dict]:
"""Parse doors and windows."""
retval: Dict[str, Any] = {}

if ATTR_STATE in vehicle_data and "checkControlMessages" in vehicle_data[ATTR_STATE]:
messages = vehicle_data[ATTR_STATE]["checkControlMessages"]
if ATTR_STATE in vehicle_data and (messages := vehicle_data[ATTR_STATE].get("checkControlMessages")):
retval["messages"] = [CheckControlMessage.from_api_entry(**m) for m in messages if m["severity"] != "OK"]
retval["has_check_control_messages"] = len([m for m in retval["messages"] if m.state != "LOW"]) > 0

Expand All @@ -134,13 +132,15 @@ def _parse_vehicle_data(cls, vehicle_data: Dict) -> Optional[Dict]:
"""Parse headunit hard/software."""
retval: Dict[str, Any] = {}

if ATTR_ATTRIBUTES in vehicle_data and "softwareVersionCurrent" in vehicle_data[ATTR_ATTRIBUTES]:
if ATTR_ATTRIBUTES in vehicle_data and (
software_version := vehicle_data[ATTR_ATTRIBUTES].get("softwareVersionCurrent")
):
retval["idrive_version"] = vehicle_data[ATTR_ATTRIBUTES]["hmiVersion"]
retval["headunit_type"] = vehicle_data[ATTR_ATTRIBUTES]["headUnitType"]

istep = vehicle_data[ATTR_ATTRIBUTES]["softwareVersionCurrent"]["iStep"]
month = vehicle_data[ATTR_ATTRIBUTES]["softwareVersionCurrent"]["puStep"]["month"]
year = vehicle_data[ATTR_ATTRIBUTES]["softwareVersionCurrent"]["puStep"]["year"]
istep = software_version["iStep"]
month = software_version["puStep"]["month"]
year = software_version["puStep"]["year"]
model_year = vehicle_data[ATTR_ATTRIBUTES]["year"]

retval["software_version"] = f"{month:02d}/{str(model_year)[:2]}{year:02d}.{str(istep)[1:]}"
Expand Down
11 changes: 5 additions & 6 deletions bimmer_connected/vehicle/tires.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,10 @@ def _parse_vehicle_data(cls, vehicle_data: Dict) -> Dict:
"""Parse tire status."""
retval: Dict[str, Any] = {}

if ATTR_STATE in vehicle_data:
if "tireState" in vehicle_data[ATTR_STATE]:
retval["front_left"] = TireState(**vehicle_data[ATTR_STATE]["tireState"]["frontLeft"])
retval["front_right"] = TireState(**vehicle_data[ATTR_STATE]["tireState"]["frontRight"])
retval["rear_left"] = TireState(**vehicle_data[ATTR_STATE]["tireState"]["rearLeft"])
retval["rear_right"] = TireState(**vehicle_data[ATTR_STATE]["tireState"]["rearRight"])
if ATTR_STATE in vehicle_data and (tire_state := vehicle_data[ATTR_STATE].get("tireState")):
retval["front_left"] = TireState(**tire_state["frontLeft"])
retval["front_right"] = TireState(**tire_state["frontRight"])
retval["rear_left"] = TireState(**tire_state["rearLeft"])
retval["rear_right"] = TireState(**tire_state["rearRight"])

return retval

0 comments on commit f315620

Please sign in to comment.