diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 557b9b42..ca3b8b22 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -11,7 +11,7 @@ jobs: - uses: actions/setup-python@v2 - uses: psf/black@stable with: - version: ~=23.11 + version: ~=24.3.0 src: "." options: "--check" diff --git a/game/ato/closestairfields.py b/game/ato/closestairfields.py index 4dd0032e..821b05a8 100644 --- a/game/ato/closestairfields.py +++ b/game/ato/closestairfields.py @@ -1,4 +1,5 @@ """Objective adjacency lists.""" + from __future__ import annotations from typing import Dict, Iterator, List, Optional, TYPE_CHECKING diff --git a/game/ato/flightplans/flightplan.py b/game/ato/flightplans/flightplan.py index 5c1e1618..19d9c001 100644 --- a/game/ato/flightplans/flightplan.py +++ b/game/ato/flightplans/flightplan.py @@ -5,6 +5,7 @@ MissionPlanner. Those only plan basic information like the objective, aircraft type, and the size of the flight. The FlightPlanBuilder is responsible for generating the waypoints for the mission. """ + from __future__ import annotations import math diff --git a/game/ato/flightplans/formation.py b/game/ato/flightplans/formation.py index 4ba8ab1c..b937d9de 100644 --- a/game/ato/flightplans/formation.py +++ b/game/ato/flightplans/formation.py @@ -30,8 +30,7 @@ LayoutT = TypeVar("LayoutT", bound=FormationLayout) class FormationFlightPlan(LoiterFlightPlan[LayoutT], ABC): @property @abstractmethod - def package_speed_waypoints(self) -> set[FlightWaypoint]: - ... + def package_speed_waypoints(self) -> set[FlightWaypoint]: ... @property def combat_speed_waypoints(self) -> set[FlightWaypoint]: @@ -69,13 +68,11 @@ class FormationFlightPlan(LoiterFlightPlan[LayoutT], ABC): @property @abstractmethod - def join_time(self) -> datetime: - ... + def join_time(self) -> datetime: ... @property @abstractmethod - def split_time(self) -> datetime: - ... + def split_time(self) -> datetime: ... def tot_for_waypoint(self, waypoint: FlightWaypoint) -> datetime | None: if waypoint == self.layout.join: diff --git a/game/ato/flightplans/ibuilder.py b/game/ato/flightplans/ibuilder.py index 25ea3157..899e22ee 100644 --- a/game/ato/flightplans/ibuilder.py +++ b/game/ato/flightplans/ibuilder.py @@ -60,8 +60,7 @@ class IBuilder(ABC, Generic[FlightPlanT, LayoutT]): return self.flight.departure.theater @abstractmethod - def build(self, dump_debug_info: bool = False) -> FlightPlanT: - ... + def build(self, dump_debug_info: bool = False) -> FlightPlanT: ... @property def package(self) -> Package: diff --git a/game/ato/flightplans/loiter.py b/game/ato/flightplans/loiter.py index 4d6e9dce..731e5eaf 100644 --- a/game/ato/flightplans/loiter.py +++ b/game/ato/flightplans/loiter.py @@ -30,8 +30,7 @@ class LoiterFlightPlan(StandardFlightPlan[LayoutT], ABC): @property @abstractmethod - def push_time(self) -> datetime: - ... + def push_time(self) -> datetime: ... def depart_time_for_waypoint(self, waypoint: FlightWaypoint) -> datetime | None: if waypoint == self.layout.hold: diff --git a/game/ato/flightplans/uizonedisplay.py b/game/ato/flightplans/uizonedisplay.py index 8d880c87..9aa83946 100644 --- a/game/ato/flightplans/uizonedisplay.py +++ b/game/ato/flightplans/uizonedisplay.py @@ -14,5 +14,4 @@ class UiZone: class UiZoneDisplay(abc.ABC): @abc.abstractmethod - def ui_zone(self) -> UiZone: - ... + def ui_zone(self) -> UiZone: ... diff --git a/game/ato/flightstate/flightstate.py b/game/ato/flightstate/flightstate.py index 46bf2f34..040d568b 100644 --- a/game/ato/flightstate/flightstate.py +++ b/game/ato/flightstate/flightstate.py @@ -57,14 +57,12 @@ class FlightState(ABC): @property @abstractmethod - def cancelable(self) -> bool: - ... + def cancelable(self) -> bool: ... @abstractmethod def on_game_tick( self, events: GameUpdateEvents, time: datetime, duration: timedelta - ) -> None: - ... + ) -> None: ... @property def in_flight(self) -> bool: @@ -95,17 +93,14 @@ class FlightState(ABC): @property @abstractmethod - def is_waiting_for_start(self) -> bool: - ... + def is_waiting_for_start(self) -> bool: ... @abstractmethod - def estimate_position(self) -> Point: - ... + def estimate_position(self) -> Point: ... @property @abstractmethod - def spawn_type(self) -> StartType: - ... + def spawn_type(self) -> StartType: ... def a2a_commit_region(self) -> Optional[ThreatPoly]: return None diff --git a/game/ato/flightstate/inflight.py b/game/ato/flightstate/inflight.py index fc0be5e3..ad29b451 100644 --- a/game/ato/flightstate/inflight.py +++ b/game/ato/flightstate/inflight.py @@ -67,16 +67,13 @@ class InFlight(FlightState, ABC): ) @abstractmethod - def estimate_position(self) -> Point: - ... + def estimate_position(self) -> Point: ... @abstractmethod - def estimate_altitude(self) -> tuple[Distance, str]: - ... + def estimate_altitude(self) -> tuple[Distance, str]: ... @abstractmethod - def estimate_speed(self) -> Speed: - ... + def estimate_speed(self) -> Speed: ... def estimate_fuel_at_current_waypoint(self) -> float: initial_fuel = super().estimate_fuel() diff --git a/game/ato/iflightroster.py b/game/ato/iflightroster.py index 32231445..eb06efa1 100644 --- a/game/ato/iflightroster.py +++ b/game/ato/iflightroster.py @@ -9,26 +9,20 @@ if TYPE_CHECKING: class IFlightRoster(ABC): @abstractmethod - def iter_pilots(self) -> Iterator[Pilot | None]: - ... + def iter_pilots(self) -> Iterator[Pilot | None]: ... @abstractmethod - def pilot_at(self, idx: int) -> Pilot | None: - ... + def pilot_at(self, idx: int) -> Pilot | None: ... @property @abstractmethod - def max_size(self) -> int: - ... + def max_size(self) -> int: ... @abstractmethod - def resize(self, new_size: int) -> None: - ... + def resize(self, new_size: int) -> None: ... @abstractmethod - def set_pilot(self, index: int, pilot: Optional[Pilot]) -> None: - ... + def set_pilot(self, index: int, pilot: Optional[Pilot]) -> None: ... @abstractmethod - def clear(self) -> None: - ... + def clear(self) -> None: ... diff --git a/game/callsigns.py b/game/callsigns.py index a722606f..0be66087 100644 --- a/game/callsigns.py +++ b/game/callsigns.py @@ -1,4 +1,5 @@ """Support for working with DCS group callsigns.""" + import logging import re from typing import Any diff --git a/game/campaignloader/factionrecommendation.py b/game/campaignloader/factionrecommendation.py index b9b2d841..bc51fad8 100644 --- a/game/campaignloader/factionrecommendation.py +++ b/game/campaignloader/factionrecommendation.py @@ -14,12 +14,10 @@ class FactionRecommendation(ABC): self.name = name @abstractmethod - def register_campaign_specific_faction(self, factions: Factions) -> None: - ... + def register_campaign_specific_faction(self, factions: Factions) -> None: ... @abstractmethod - def get_faction(self, factions: Factions) -> Faction: - ... + def get_faction(self, factions: Factions) -> Faction: ... @staticmethod def from_field( diff --git a/game/commander/tasks/frontlinestancetask.py b/game/commander/tasks/frontlinestancetask.py index 0eaa6aa4..c6240262 100644 --- a/game/commander/tasks/frontlinestancetask.py +++ b/game/commander/tasks/frontlinestancetask.py @@ -21,8 +21,7 @@ class FrontLineStanceTask(TheaterCommanderTask, ABC): @property @abstractmethod - def stance(self) -> CombatStance: - ... + def stance(self) -> CombatStance: ... @staticmethod def management_allowed(state: TheaterState) -> bool: @@ -49,8 +48,7 @@ class FrontLineStanceTask(TheaterCommanderTask, ABC): @property @abstractmethod - def have_sufficient_front_line_advantage(self) -> bool: - ... + def have_sufficient_front_line_advantage(self) -> bool: ... @property def ground_force_balance(self) -> float: diff --git a/game/commander/tasks/packageplanningtask.py b/game/commander/tasks/packageplanningtask.py index 36b11680..91de350f 100644 --- a/game/commander/tasks/packageplanningtask.py +++ b/game/commander/tasks/packageplanningtask.py @@ -54,8 +54,7 @@ class PackagePlanningTask(TheaterCommanderTask, Generic[MissionTargetT]): coalition.ato.add_package(self.package) @abstractmethod - def propose_flights(self) -> None: - ... + def propose_flights(self) -> None: ... def propose_flight( self, @@ -118,9 +117,9 @@ class PackagePlanningTask(TheaterCommanderTask, Generic[MissionTargetT]): target_ranges: list[ tuple[Union[IadsGroundObject, NavalGroundObject], Distance] ] = [] - all_iads: Iterator[ - Union[IadsGroundObject, NavalGroundObject] - ] = itertools.chain(state.enemy_air_defenses, state.enemy_ships) + all_iads: Iterator[Union[IadsGroundObject, NavalGroundObject]] = ( + itertools.chain(state.enemy_air_defenses, state.enemy_ships) + ) for target in all_iads: distance = meters(target.distance_to(self.target)) if range_type is RangeType.Detection: diff --git a/game/commander/tasks/theatercommandertask.py b/game/commander/tasks/theatercommandertask.py index 5daa6b6c..473f67c9 100644 --- a/game/commander/tasks/theatercommandertask.py +++ b/game/commander/tasks/theatercommandertask.py @@ -12,5 +12,4 @@ if TYPE_CHECKING: class TheaterCommanderTask(PrimitiveTask[TheaterState]): @abstractmethod - def execute(self, coalition: Coalition) -> None: - ... + def execute(self, coalition: Coalition) -> None: ... diff --git a/game/commander/theatercommander.py b/game/commander/theatercommander.py index 0bc63828..23f64a6f 100644 --- a/game/commander/theatercommander.py +++ b/game/commander/theatercommander.py @@ -52,6 +52,7 @@ even though it is a primitive task used by many other tasks. https://en.wikipedia.org/wiki/Hierarchical_task_network """ + from __future__ import annotations from datetime import datetime diff --git a/game/dcs/groundunittype.py b/game/dcs/groundunittype.py index c44eee21..701b2cd8 100644 --- a/game/dcs/groundunittype.py +++ b/game/dcs/groundunittype.py @@ -60,9 +60,9 @@ class GroundUnitType(UnitType[Type[VehicleType]]): reversed_heading: bool = False _by_name: ClassVar[dict[str, GroundUnitType]] = {} - _by_unit_type: ClassVar[ - dict[type[VehicleType], list[GroundUnitType]] - ] = defaultdict(list) + _by_unit_type: ClassVar[dict[type[VehicleType], list[GroundUnitType]]] = ( + defaultdict(list) + ) def __setstate__(self, state: dict[str, Any]) -> None: # Update any existing models with new data on load. diff --git a/game/dcs/lasercodeconfig.py b/game/dcs/lasercodeconfig.py index 01c63fe2..c7566d9f 100644 --- a/game/dcs/lasercodeconfig.py +++ b/game/dcs/lasercodeconfig.py @@ -17,12 +17,10 @@ class LaserCodeConfig(ABC): ) @abstractmethod - def iter_prop_ids(self) -> Iterator[str]: - ... + def iter_prop_ids(self) -> Iterator[str]: ... @abstractmethod - def property_dict_for_code(self, code: int) -> dict[str, int]: - ... + def property_dict_for_code(self, code: int) -> dict[str, int]: ... class SinglePropertyLaserCodeConfig(LaserCodeConfig): diff --git a/game/flightplan/waypointactions/waypointaction.py b/game/flightplan/waypointactions/waypointaction.py index a82a8678..6951274a 100644 --- a/game/flightplan/waypointactions/waypointaction.py +++ b/game/flightplan/waypointactions/waypointaction.py @@ -15,15 +15,12 @@ if TYPE_CHECKING: class WaypointAction(ABC): @abstractmethod - def describe(self) -> str: - ... + def describe(self) -> str: ... @abstractmethod def update_state( self, state: ActionState, time: datetime, duration: timedelta - ) -> timedelta: - ... + ) -> timedelta: ... @abstractmethod - def iter_tasks(self, ctx: TaskContext) -> Iterator[Task]: - ... + def iter_tasks(self, ctx: TaskContext) -> Iterator[Task]: ... diff --git a/game/flightplan/waypointstrategy.py b/game/flightplan/waypointstrategy.py index d91bf3f6..e5a06543 100644 --- a/game/flightplan/waypointstrategy.py +++ b/game/flightplan/waypointstrategy.py @@ -28,14 +28,12 @@ def point_at_heading(p: Point, heading: Heading, distance: Distance) -> Point: class Prerequisite(ABC): @abstractmethod - def is_satisfied(self) -> bool: - ... + def is_satisfied(self) -> bool: ... @abstractmethod def describe_debug_info( self, to_geojson: Callable[[BaseGeometry], dict[str, Any]] - ) -> dict[str, Any]: - ... + ) -> dict[str, Any]: ... class DistancePrerequisite(Prerequisite): diff --git a/game/htn.py b/game/htn.py index ae145262..b0f1ff90 100644 --- a/game/htn.py +++ b/game/htn.py @@ -11,8 +11,7 @@ WorldStateT = TypeVar("WorldStateT", bound="WorldState[Any]") class WorldState(ABC, Generic[WorldStateT]): @abstractmethod - def clone(self) -> WorldStateT: - ... + def clone(self) -> WorldStateT: ... class Task(Generic[WorldStateT]): @@ -24,18 +23,17 @@ Method = Sequence[Task[WorldStateT]] class PrimitiveTask(Task[WorldStateT], Generic[WorldStateT], ABC): @abstractmethod - def preconditions_met(self, state: WorldStateT) -> bool: - ... + def preconditions_met(self, state: WorldStateT) -> bool: ... @abstractmethod - def apply_effects(self, state: WorldStateT) -> None: - ... + def apply_effects(self, state: WorldStateT) -> None: ... class CompoundTask(Task[WorldStateT], Generic[WorldStateT], ABC): @abstractmethod - def each_valid_method(self, state: WorldStateT) -> Iterator[Method[WorldStateT]]: - ... + def each_valid_method( + self, state: WorldStateT + ) -> Iterator[Method[WorldStateT]]: ... PrimitiveTaskT = TypeVar("PrimitiveTaskT", bound=PrimitiveTask[Any]) diff --git a/game/infos/information.py b/game/infos/information.py index efc3fb96..727aab56 100644 --- a/game/infos/information.py +++ b/game/infos/information.py @@ -10,9 +10,11 @@ class Information: def __str__(self) -> str: return "[{}][{}] {} {}".format( - self.timestamp.strftime("%Y-%m-%d %H:%M:%S") - if self.timestamp is not None - else "", + ( + self.timestamp.strftime("%Y-%m-%d %H:%M:%S") + if self.timestamp is not None + else "" + ), self.turn, self.title, self.text, diff --git a/game/lasercodes/ilasercoderegistry.py b/game/lasercodes/ilasercoderegistry.py index e59a9d66..3f48285f 100644 --- a/game/lasercodes/ilasercoderegistry.py +++ b/game/lasercodes/ilasercoderegistry.py @@ -9,9 +9,7 @@ if TYPE_CHECKING: class ILaserCodeRegistry(ABC): @abstractmethod - def alloc_laser_code(self) -> LaserCode: - ... + def alloc_laser_code(self) -> LaserCode: ... @abstractmethod - def release_code(self, code: LaserCode) -> None: - ... + def release_code(self, code: LaserCode) -> None: ... diff --git a/game/logging_config.py b/game/logging_config.py index 19ff1c7f..e6128b37 100644 --- a/game/logging_config.py +++ b/game/logging_config.py @@ -1,4 +1,5 @@ """Logging APIs.""" + import logging import logging.config import os diff --git a/game/missiongenerator/briefinggenerator.py b/game/missiongenerator/briefinggenerator.py index e7c459c3..531efb9b 100644 --- a/game/missiongenerator/briefinggenerator.py +++ b/game/missiongenerator/briefinggenerator.py @@ -1,6 +1,7 @@ """ Briefing generation logic """ + from __future__ import annotations import os diff --git a/game/missiongenerator/kneeboard.py b/game/missiongenerator/kneeboard.py index 366fd020..5572877a 100644 --- a/game/missiongenerator/kneeboard.py +++ b/game/missiongenerator/kneeboard.py @@ -22,6 +22,7 @@ https://forums.eagle.ru/showthread.php?t=206360 claims that kneeboard pages can only be added per airframe, so PvP missions where each side have the same aircraft will be able to see the enemy's kneeboard for the same airframe. """ + import datetime import math import textwrap diff --git a/game/missiongenerator/tgogenerator.py b/game/missiongenerator/tgogenerator.py index 414e1778..0cf9a7bc 100644 --- a/game/missiongenerator/tgogenerator.py +++ b/game/missiongenerator/tgogenerator.py @@ -5,6 +5,7 @@ groups, statics, missile sites, and AA sites for the mission. Each of these objectives is defined in the Theater by a TheaterGroundObject. These classes create the pydcs groups and statics for those areas and add them to the mission. """ + from __future__ import annotations import logging diff --git a/game/purchaseadapter.py b/game/purchaseadapter.py index 06aa712c..192759eb 100644 --- a/game/purchaseadapter.py +++ b/game/purchaseadapter.py @@ -48,12 +48,10 @@ class PurchaseAdapter(Generic[ItemType]): return self.pending_delivery_quantity(item) < 0 @abstractmethod - def current_quantity_of(self, item: ItemType) -> int: - ... + def current_quantity_of(self, item: ItemType) -> int: ... @abstractmethod - def pending_delivery_quantity(self, item: ItemType) -> int: - ... + def pending_delivery_quantity(self, item: ItemType) -> int: ... def expected_quantity_next_turn(self, item: ItemType) -> int: return self.current_quantity_of(item) + self.pending_delivery_quantity(item) @@ -65,36 +63,28 @@ class PurchaseAdapter(Generic[ItemType]): return self.can_sell(item) or self.has_pending_orders(item) @abstractmethod - def can_sell(self, item: ItemType) -> bool: - ... + def can_sell(self, item: ItemType) -> bool: ... @abstractmethod - def do_purchase(self, item: ItemType) -> None: - ... + def do_purchase(self, item: ItemType) -> None: ... @abstractmethod - def do_cancel_purchase(self, item: ItemType) -> None: - ... + def do_cancel_purchase(self, item: ItemType) -> None: ... @abstractmethod - def do_sale(self, item: ItemType) -> None: - ... + def do_sale(self, item: ItemType) -> None: ... @abstractmethod - def do_cancel_sale(self, item: ItemType) -> None: - ... + def do_cancel_sale(self, item: ItemType) -> None: ... @abstractmethod - def price_of(self, item: ItemType) -> int: - ... + def price_of(self, item: ItemType) -> int: ... @abstractmethod - def name_of(self, item: ItemType, multiline: bool = False) -> str: - ... + def name_of(self, item: ItemType, multiline: bool = False) -> str: ... @abstractmethod - def unit_type_of(self, item: ItemType) -> UnitType[Any]: - ... + def unit_type_of(self, item: ItemType) -> UnitType[Any]: ... class AircraftPurchaseAdapter(PurchaseAdapter[Squadron]): diff --git a/game/radio/tacan.py b/game/radio/tacan.py index fb7bd42f..f635b186 100644 --- a/game/radio/tacan.py +++ b/game/radio/tacan.py @@ -1,4 +1,5 @@ """TACAN channel handling.""" + from __future__ import annotations import re diff --git a/game/runways.py b/game/runways.py index 68d8ee2d..a733c24c 100644 --- a/game/runways.py +++ b/game/runways.py @@ -1,4 +1,5 @@ """Runway information and selection.""" + from __future__ import annotations import logging diff --git a/game/savecompat.py b/game/savecompat.py index 6338d40f..829d60fe 100644 --- a/game/savecompat.py +++ b/game/savecompat.py @@ -1,4 +1,5 @@ """Tools for aiding in save compat removal after compatibility breaks.""" + from collections.abc import Callable from typing import TypeVar diff --git a/game/sidc.py b/game/sidc.py index 6fcef144..5b435915 100644 --- a/game/sidc.py +++ b/game/sidc.py @@ -10,6 +10,7 @@ from the output. https://nso.nato.int/nso/nsdd/main/standards/ap-details/1912/EN https://www.spatialillusions.com/milsymbol/docs/milsymbol-APP6d.html """ + from __future__ import annotations from abc import ABC, abstractmethod @@ -330,18 +331,15 @@ class SymbolIdentificationCode: class SidcDescribable(ABC): @property @abstractmethod - def standard_identity(self) -> StandardIdentity: - ... + def standard_identity(self) -> StandardIdentity: ... @property @abstractmethod - def sidc_status(self) -> Status: - ... + def sidc_status(self) -> Status: ... @property @abstractmethod - def symbol_set_and_entity(self) -> tuple[SymbolSet, Entity]: - ... + def symbol_set_and_entity(self) -> tuple[SymbolSet, Entity]: ... def sidc(self) -> SymbolIdentificationCode: symbol_set, entity = self.symbol_set_and_entity diff --git a/game/sim/combat/frozencombat.py b/game/sim/combat/frozencombat.py index 332c107f..45be3a0b 100644 --- a/game/sim/combat/frozencombat.py +++ b/game/sim/combat/frozencombat.py @@ -40,20 +40,16 @@ class FrozenCombat(ABC): events: GameUpdateEvents, time: datetime, elapsed_time: timedelta, - ) -> None: - ... + ) -> None: ... @abstractmethod - def because(self) -> str: - ... + def because(self) -> str: ... @abstractmethod - def describe(self) -> str: - ... + def describe(self) -> str: ... @abstractmethod - def iter_flights(self) -> Iterator[Flight]: - ... + def iter_flights(self) -> Iterator[Flight]: ... def update_flight_states(self) -> None: for flight in self.iter_flights(): diff --git a/game/sim/combat/joinablecombat.py b/game/sim/combat/joinablecombat.py index 84c19c40..18ed9d12 100644 --- a/game/sim/combat/joinablecombat.py +++ b/game/sim/combat/joinablecombat.py @@ -18,8 +18,7 @@ class JoinableCombat(FrozenCombat, ABC): self.flights = flights @abstractmethod - def joinable_by(self, flight: Flight) -> bool: - ... + def joinable_by(self, flight: Flight) -> bool: ... def join(self, flight: Flight) -> None: assert isinstance(flight.state, InFlight) diff --git a/game/theater/controlpoint.py b/game/theater/controlpoint.py index ea86dae1..bd761b17 100644 --- a/game/theater/controlpoint.py +++ b/game/theater/controlpoint.py @@ -472,8 +472,7 @@ class ControlPoint(MissionTarget, SidcDescribable, ABC): @property @abstractmethod - def heading(self) -> Heading: - ... + def heading(self) -> Heading: ... def __str__(self) -> str: return self.name @@ -594,8 +593,7 @@ class ControlPoint(MissionTarget, SidcDescribable, ABC): @property @abstractmethod - def can_deploy_ground_units(self) -> bool: - ... + def can_deploy_ground_units(self) -> bool: ... @property @abstractmethod @@ -880,8 +878,7 @@ class ControlPoint(MissionTarget, SidcDescribable, ABC): return None @abstractmethod - def can_operate(self, aircraft: AircraftType) -> bool: - ... + def can_operate(self, aircraft: AircraftType) -> bool: ... def unclaimed_parking(self) -> int: return self.total_aircraft_parking - self.allocated_aircraft().total @@ -892,8 +889,7 @@ class ControlPoint(MissionTarget, SidcDescribable, ABC): theater: ConflictTheater, conditions: Conditions, dynamic_runways: Dict[str, RunwayData], - ) -> RunwayData: - ... + ) -> RunwayData: ... def stub_runway_data(self) -> RunwayData: return RunwayData( @@ -910,13 +906,11 @@ class ControlPoint(MissionTarget, SidcDescribable, ABC): @property @abstractmethod - def runway_is_destroyable(self) -> bool: - ... + def runway_is_destroyable(self) -> bool: ... @property @abstractmethod - def runway_status(self) -> RunwayStatus: - ... + def runway_status(self) -> RunwayStatus: ... @abstractmethod def describe_runway_status(self) -> str | None: @@ -1074,13 +1068,11 @@ class ControlPoint(MissionTarget, SidcDescribable, ABC): @property @abstractmethod - def category(self) -> str: - ... + def category(self) -> str: ... @property @abstractmethod - def status(self) -> ControlPointStatus: - ... + def status(self) -> ControlPointStatus: ... class Airfield(ControlPoint): diff --git a/game/theater/frontline.py b/game/theater/frontline.py index 702e383f..e76c3801 100644 --- a/game/theater/frontline.py +++ b/game/theater/frontline.py @@ -107,7 +107,7 @@ class FrontLine(MissionTarget): yield from [ FlightType.CAS, FlightType.AEWC, - FlightType.REFUELING + FlightType.REFUELING, # TODO: FlightType.TROOP_TRANSPORT # TODO: FlightType.EVAC ] diff --git a/game/theater/transitnetwork.py b/game/theater/transitnetwork.py index 500bb554..e690385b 100644 --- a/game/theater/transitnetwork.py +++ b/game/theater/transitnetwork.py @@ -47,9 +47,9 @@ class TransitConnection(Enum): class TransitNetwork: def __init__(self) -> None: - self.nodes: Dict[ - ControlPoint, Dict[ControlPoint, TransitConnection] - ] = defaultdict(dict) + self.nodes: Dict[ControlPoint, Dict[ControlPoint, TransitConnection]] = ( + defaultdict(dict) + ) def has_destinations(self, control_point: ControlPoint) -> bool: return bool(self.nodes[control_point]) diff --git a/game/transfers.py b/game/transfers.py index 8f8b92be..21141007 100644 --- a/game/transfers.py +++ b/game/transfers.py @@ -29,6 +29,7 @@ transports and processing the turn's transit actions. Routing is handled by TransitNetwork. """ + from __future__ import annotations import logging @@ -494,9 +495,9 @@ TransportType = TypeVar("TransportType", bound=MultiGroupTransport) class TransportMap(Generic[TransportType]): def __init__(self) -> None: # Dict of origin -> destination -> transport. - self.transports: dict[ - ControlPoint, dict[ControlPoint, TransportType] - ] = defaultdict(dict) + self.transports: dict[ControlPoint, dict[ControlPoint, TransportType]] = ( + defaultdict(dict) + ) def create_transport( self, origin: ControlPoint, destination: ControlPoint diff --git a/game/unitmap.py b/game/unitmap.py index 9ad12ec2..ba5b9be0 100644 --- a/game/unitmap.py +++ b/game/unitmap.py @@ -1,4 +1,5 @@ """Maps generated units back to their Liberation types.""" + from __future__ import annotations import itertools diff --git a/game/weather/weather.py b/game/weather/weather.py index 0573766d..0c8287af 100644 --- a/game/weather/weather.py +++ b/game/weather/weather.py @@ -101,8 +101,7 @@ class Weather(ABC): @property @abstractmethod - def archetype(self) -> WeatherArchetype: - ... + def archetype(self) -> WeatherArchetype: ... @property def pressure_adjustment(self) -> float: diff --git a/game/weather/windspeedgenerators.py b/game/weather/windspeedgenerators.py index 2afce3d6..ae2f29fc 100644 --- a/game/weather/windspeedgenerators.py +++ b/game/weather/windspeedgenerators.py @@ -25,8 +25,7 @@ class WeibullWindSpeedParameters: class WindSpeedGenerator(ABC): @abstractmethod - def random_wind(self) -> WindConditions: - ... + def random_wind(self) -> WindConditions: ... @staticmethod def from_data(data: dict[str, Any]) -> WindSpeedGenerator: diff --git a/qt_ui/dialogs.py b/qt_ui/dialogs.py index 92064768..7f4eb58d 100644 --- a/qt_ui/dialogs.py +++ b/qt_ui/dialogs.py @@ -1,4 +1,5 @@ """Application-wide dialog management.""" + from typing import Optional from game.ato.flight import Flight diff --git a/qt_ui/models.py b/qt_ui/models.py index 58266f0d..683a6292 100644 --- a/qt_ui/models.py +++ b/qt_ui/models.py @@ -1,4 +1,5 @@ """Qt data models for game objects.""" + from __future__ import annotations import datetime diff --git a/qt_ui/widgets/QFlightSizeSpinner.py b/qt_ui/widgets/QFlightSizeSpinner.py index 0ec0bd63..42614626 100644 --- a/qt_ui/widgets/QFlightSizeSpinner.py +++ b/qt_ui/widgets/QFlightSizeSpinner.py @@ -1,4 +1,5 @@ """Spin box for selecting the number of aircraft in a flight.""" + from PySide6.QtWidgets import QSpinBox diff --git a/qt_ui/widgets/QLabeledWidget.py b/qt_ui/widgets/QLabeledWidget.py index aa357c0b..b69d79e7 100644 --- a/qt_ui/widgets/QLabeledWidget.py +++ b/qt_ui/widgets/QLabeledWidget.py @@ -1,4 +1,5 @@ """A layout containing a widget with an associated label.""" + from typing import Optional from PySide6.QtCore import Qt diff --git a/qt_ui/widgets/ato.py b/qt_ui/widgets/ato.py index 0b7b2836..eaa2e450 100644 --- a/qt_ui/widgets/ato.py +++ b/qt_ui/widgets/ato.py @@ -1,4 +1,5 @@ """Widgets for displaying air tasking orders.""" + import logging from typing import Optional diff --git a/qt_ui/widgets/clientslots.py b/qt_ui/widgets/clientslots.py index 5af9fd10..238775ec 100644 --- a/qt_ui/widgets/clientslots.py +++ b/qt_ui/widgets/clientslots.py @@ -1,4 +1,5 @@ """Widgets for displaying client slots.""" + from PySide6.QtWidgets import QLabel from qt_ui.models import AtoModel diff --git a/qt_ui/widgets/combos/QAircraftTypeSelector.py b/qt_ui/widgets/combos/QAircraftTypeSelector.py index 41afa1f7..cf6d5967 100644 --- a/qt_ui/widgets/combos/QAircraftTypeSelector.py +++ b/qt_ui/widgets/combos/QAircraftTypeSelector.py @@ -1,4 +1,5 @@ """Combo box for selecting aircraft types.""" + from PySide6.QtWidgets import QComboBox from game.dcs.aircrafttype import AircraftType diff --git a/qt_ui/widgets/combos/QArrivalAirfieldSelector.py b/qt_ui/widgets/combos/QArrivalAirfieldSelector.py index 02215603..287454af 100644 --- a/qt_ui/widgets/combos/QArrivalAirfieldSelector.py +++ b/qt_ui/widgets/combos/QArrivalAirfieldSelector.py @@ -1,4 +1,5 @@ """Combo box for selecting a departure airfield.""" + from typing import Iterable, Optional from PySide6.QtWidgets import QComboBox diff --git a/qt_ui/windows/mission/QEditFlightDialog.py b/qt_ui/windows/mission/QEditFlightDialog.py index 935ac5ef..567e80a3 100644 --- a/qt_ui/windows/mission/QEditFlightDialog.py +++ b/qt_ui/windows/mission/QEditFlightDialog.py @@ -1,4 +1,5 @@ """Dialog window for editing flights.""" + from PySide6.QtWidgets import ( QDialog, QVBoxLayout, diff --git a/qt_ui/windows/mission/QPackageDialog.py b/qt_ui/windows/mission/QPackageDialog.py index dfb3dae5..dd5436de 100644 --- a/qt_ui/windows/mission/QPackageDialog.py +++ b/qt_ui/windows/mission/QPackageDialog.py @@ -1,4 +1,5 @@ """Dialogs for creating and editing ATO packages.""" + import logging from typing import Optional diff --git a/qt_ui/windows/mission/flight/SquadronSelector.py b/qt_ui/windows/mission/flight/SquadronSelector.py index 65969a18..a8b95c1b 100644 --- a/qt_ui/windows/mission/flight/SquadronSelector.py +++ b/qt_ui/windows/mission/flight/SquadronSelector.py @@ -1,4 +1,5 @@ """Combo box for selecting squadrons.""" + from typing import Optional from PySide6.QtWidgets import QComboBox diff --git a/qt_ui/windows/mission/flight/payload/missingpropertydataerror.py b/qt_ui/windows/mission/flight/payload/missingpropertydataerror.py index d46f307f..951892bd 100644 --- a/qt_ui/windows/mission/flight/payload/missingpropertydataerror.py +++ b/qt_ui/windows/mission/flight/payload/missingpropertydataerror.py @@ -1,2 +1 @@ -class MissingPropertyDataError(RuntimeError): - ... +class MissingPropertyDataError(RuntimeError): ... diff --git a/resources/tools/arcgis_landmap_import.py b/resources/tools/arcgis_landmap_import.py index d4b20af4..5f963d34 100644 --- a/resources/tools/arcgis_landmap_import.py +++ b/resources/tools/arcgis_landmap_import.py @@ -1,4 +1,5 @@ """Generates landmaps from GIS shapefiles.""" + import argparse import logging import pickle diff --git a/resources/tools/datalint.py b/resources/tools/datalint.py index a3a815a9..b03ae93d 100644 --- a/resources/tools/datalint.py +++ b/resources/tools/datalint.py @@ -17,8 +17,7 @@ from game import VERSION class ReportElement(ABC): @abstractmethod - def __str__(self) -> str: - ... + def __str__(self) -> str: ... class Heading(ReportElement): @@ -75,8 +74,7 @@ ReportStream: TypeAlias = Iterator[ReportElement] class LinterBase(ABC): - def stream_reports(self) -> ReportStream: - ... + def stream_reports(self) -> ReportStream: ... class UncheckedDataLinter(LinterBase): diff --git a/resources/tools/import_beacons.py b/resources/tools/import_beacons.py index c6b4d6c9..bf47f141 100644 --- a/resources/tools/import_beacons.py +++ b/resources/tools/import_beacons.py @@ -20,6 +20,7 @@ beacons = { } """ + import argparse import dataclasses import gettext diff --git a/resources/tools/loadoutviewer.py b/resources/tools/loadoutviewer.py index 22d707f3..b75d4aea 100644 --- a/resources/tools/loadoutviewer.py +++ b/resources/tools/loadoutviewer.py @@ -1,4 +1,5 @@ """Command-line utility for displaying human readable loadout configurations.""" + import argparse import sys from collections.abc import Iterator diff --git a/tests/flightplan/waypointsolvertestcasereducer.py b/tests/flightplan/waypointsolvertestcasereducer.py index ab0c5ad5..ab017639 100644 --- a/tests/flightplan/waypointsolvertestcasereducer.py +++ b/tests/flightplan/waypointsolvertestcasereducer.py @@ -23,12 +23,10 @@ def doctrine_from_name(name: str) -> Doctrine: class Reducer(Generic[ReducerT], Iterator[ReducerT], ABC): @abstractmethod - def accept(self) -> None: - ... + def accept(self) -> None: ... @abstractmethod - def reject(self) -> None: - ... + def reject(self) -> None: ... class MultiPolyReducer(Reducer[MultiPolygon]):