From 1a1a192905c53ea55d87f64e5786b59e1a462b58 Mon Sep 17 00:00:00 2001 From: Eric Froemling Date: Fri, 10 Apr 2020 14:37:06 -0700 Subject: [PATCH] Tightened up type checking (flipped Mypy's warn_unreachable on) --- .idea/dictionaries/ericf.xml | 1 + assets/src/ba_data/python/ba/_achievement.py | 4 +-- assets/src/ba_data/python/ba/_app.py | 12 +++---- assets/src/ba_data/python/ba/_coopsession.py | 2 +- assets/src/ba_data/python/ba/_gameutils.py | 2 +- .../python/bastd/activity/coopscorescreen.py | 11 +++--- .../python/bastd/activity/teamsscorescreen.py | 3 +- .../python/bastd/actor/controlsguide.py | 3 +- .../src/ba_data/python/bastd/actor/image.py | 4 +-- .../src/ba_data/python/bastd/actor/spazbot.py | 10 +++--- assets/src/ba_data/python/bastd/actor/text.py | 4 +-- .../src/ba_data/python/bastd/game/conquest.py | 16 +++++---- .../src/ba_data/python/bastd/game/football.py | 6 ++-- .../ba_data/python/bastd/game/onslaught.py | 4 +-- assets/src/ba_data/python/bastd/game/race.py | 11 ++++-- .../ba_data/python/bastd/game/runaround.py | 2 +- .../ba_data/python/bastd/game/thelaststand.py | 2 +- assets/src/ba_data/python/bastd/tutorial.py | 3 +- .../src/ba_data/python/bastd/ui/appinvite.py | 3 +- .../ba_data/python/bastd/ui/coop/browser.py | 34 +++++++------------ assets/src/ba_data/python/bastd/ui/gather.py | 2 +- assets/src/ba_data/python/bastd/ui/kiosk.py | 6 ++-- .../python/bastd/ui/league/rankwindow.py | 2 +- .../src/ba_data/python/bastd/ui/partyqueue.py | 2 +- .../bastd/ui/playlist/customizebrowser.py | 3 +- .../python/bastd/ui/playlist/editgame.py | 19 ++++++----- assets/src/ba_data/python/bastd/ui/popup.py | 9 +---- .../python/bastd/ui/settings/advanced.py | 2 +- .../python/bastd/ui/settings/controls.py | 3 +- .../python/bastd/ui/soundtrack/browser.py | 5 +-- .../python/bastd/ui/soundtrack/edit.py | 4 +-- .../ba_data/python/bastd/ui/store/browser.py | 5 +-- .../python/bastd/ui/tournamententry.py | 4 +-- tools/efrotools/code.py | 10 +++--- 34 files changed, 101 insertions(+), 112 deletions(-) diff --git a/.idea/dictionaries/ericf.xml b/.idea/dictionaries/ericf.xml index 8c54e556..4e4b6cf0 100644 --- a/.idea/dictionaries/ericf.xml +++ b/.idea/dictionaries/ericf.xml @@ -1483,6 +1483,7 @@ sclx scly scorescreen + scoreteam scoretxt scoreval scorever diff --git a/assets/src/ba_data/python/ba/_achievement.py b/assets/src/ba_data/python/ba/_achievement.py index 3f6cd30a..34b74212 100644 --- a/assets/src/ba_data/python/ba/_achievement.py +++ b/assets/src/ba_data/python/ba/_achievement.py @@ -83,7 +83,7 @@ def award_local_achievement(achname: str) -> None: """For non-game-based achievements such as controller-connection ones.""" try: ach = get_achievement(achname) - if ach is not None and not ach.complete: + if not ach.complete: # Report new achievements to the game-service. _ba.report_achievement(achname) @@ -680,7 +680,7 @@ class Achievement: # Just piggy-back onto any current activity # (should we use the session instead?..) - activity = _ba.getactivity(doraise=False) + activity: Optional[ba.Activity] = _ba.getactivity(doraise=False) # If this gets called while this achievement is occupying a slot # already, ignore it. (probably should never happen in real diff --git a/assets/src/ba_data/python/ba/_app.py b/assets/src/ba_data/python/ba/_app.py index 32fa9df8..bb625c88 100644 --- a/assets/src/ba_data/python/ba/_app.py +++ b/assets/src/ba_data/python/ba/_app.py @@ -398,13 +398,13 @@ class App: # Gameplay. self.teams_series_length = 7 self.ffa_series_length = 24 - self.coop_session_args: dict = {} + self.coop_session_args: Dict = {} # UI. self.uicontroller: Optional[ba.UIController] = None self.main_menu_window: Optional[_ba.Widget] = None # FIXME: Kill this. - self.window_states: dict = {} # FIXME: Kill this. - self.windows: dict = {} # FIXME: Kill this. + self.window_states: Dict = {} # FIXME: Kill this. + self.windows: Dict = {} # FIXME: Kill this. self.main_window: Optional[str] = None # FIXME: Kill this. self.main_menu_selection: Optional[str] = None # FIXME: Kill this. self.have_party_queue_window = False @@ -416,9 +416,9 @@ class App: self.first_main_menu = True # FIXME: Move to mainmenu class. self.did_menu_intro = False # FIXME: Move to mainmenu class. self.main_menu_resume_callbacks: list = [] # can probably go away - self.special_offer = None - self.league_rank_cache: dict = {} - self.tournament_info: dict = {} + self.special_offer: Optional[Dict] = None + self.league_rank_cache: Dict = {} + self.tournament_info: Dict = {} self.account_tournament_list: Optional[Tuple[int, List[str]]] = None self.ping_thread_count = 0 self.invite_confirm_windows: List[Any] = [] # FIXME: Don't use Any. diff --git a/assets/src/ba_data/python/ba/_coopsession.py b/assets/src/ba_data/python/ba/_coopsession.py index f30f2316..c0f212c3 100644 --- a/assets/src/ba_data/python/ba/_coopsession.py +++ b/assets/src/ba_data/python/ba/_coopsession.py @@ -192,7 +192,7 @@ class CoopSession(Session): # If there's *no* players left in the current activity but there *is* # in the session, restart the activity to pull them into the game # (or quit if they're just in the lobby). - if activity is not None and not activity.players and self.players: + if not activity.players and self.players: # Special exception for tourney games; don't auto-restart these. if self.tournament_id is not None: diff --git a/assets/src/ba_data/python/ba/_gameutils.py b/assets/src/ba_data/python/ba/_gameutils.py index 4d92f64e..4de43c43 100644 --- a/assets/src/ba_data/python/ba/_gameutils.py +++ b/assets/src/ba_data/python/ba/_gameutils.py @@ -97,7 +97,7 @@ def sharedobj(name: str) -> Any: # We store these on the current context; whether its an activity or # session. - activity = _ba.getactivity(doraise=False) + activity: Optional[ba.Activity] = _ba.getactivity(doraise=False) if activity is not None: # Grab shared-objs dict. diff --git a/assets/src/ba_data/python/bastd/activity/coopscorescreen.py b/assets/src/ba_data/python/bastd/activity/coopscorescreen.py index 35967cd5..3ebf89ab 100644 --- a/assets/src/ba_data/python/bastd/activity/coopscorescreen.py +++ b/assets/src/ba_data/python/bastd/activity/coopscorescreen.py @@ -711,8 +711,7 @@ class CoopScoreScreen(ba.Activity): order=self._score_order, tournament_id=self.session.tournament_id, score_type=self._score_type, - campaign=self._campaign.name - if self._campaign is not None else None, + campaign=self._campaign.name, level=self._level_name) # Apply the transactions we've been adding locally. @@ -1401,10 +1400,10 @@ class CoopScoreScreen(ba.Activity): transition_delay=1.0).autoretain() new_best = (best_rank > self._old_best_rank and best_rank > 0.0) - was_string = ('' if self._old_best_rank is None else ba.Lstr( - value=' ${A}', - subs=[('${A}', ba.Lstr(resource='scoreWasText')), - ('${COUNT}', str(self._old_best_rank))])) + was_string = ba.Lstr(value=' ${A}', + subs=[('${A}', + ba.Lstr(resource='scoreWasText')), + ('${COUNT}', str(self._old_best_rank))]) if not self._newly_complete: Text(ba.Lstr(value='${A}${B}', subs=[('${A}', diff --git a/assets/src/ba_data/python/bastd/activity/teamsscorescreen.py b/assets/src/ba_data/python/bastd/activity/teamsscorescreen.py index 316823f7..181534b6 100644 --- a/assets/src/ba_data/python/bastd/activity/teamsscorescreen.py +++ b/assets/src/ba_data/python/bastd/activity/teamsscorescreen.py @@ -135,7 +135,8 @@ class TeamsScoreScreenActivity(ScoreScreenActivity): if player_entry is not None: player_records.append(player_entry) else: - raise Exception('FIXME; CODE PATH NEEDS FIXING') + print('FIXME; CODE PATH NEEDS FIXING') + player_records = [] # player_records = [[ # _get_prec_score(p), name, p # ] for name, p in list(self.stats.get_records().items())] diff --git a/assets/src/ba_data/python/bastd/actor/controlsguide.py b/assets/src/ba_data/python/bastd/actor/controlsguide.py index 8809cc69..3b54729d 100644 --- a/assets/src/ba_data/python/bastd/actor/controlsguide.py +++ b/assets/src/ba_data/python/bastd/actor/controlsguide.py @@ -264,7 +264,8 @@ class ControlsGuide(ba.Actor): # If we have a touchscreen, we only fade in if we have a player with # an input device that is *not* the touchscreen. - touchscreen = _ba.get_input_device('TouchScreen', '#1', doraise=False) + touchscreen: Optional[ba.InputDevice] = _ba.get_input_device( + 'TouchScreen', '#1', doraise=False) if touchscreen is not None: # We look at the session's players; not the activity's. diff --git a/assets/src/ba_data/python/bastd/actor/image.py b/assets/src/ba_data/python/bastd/actor/image.py index 1faa4950..05aff991 100644 --- a/assets/src/ba_data/python/bastd/actor/image.py +++ b/assets/src/ba_data/python/bastd/actor/image.py @@ -170,9 +170,7 @@ class Image(ba.Actor): ba.animate(cmb, 'input1', keys) ba.animate(self.node, 'opacity', o_keys) else: - if (transition is not self.Transition.FADE_IN - and transition is not None): - ba.print_error(f'Invalid transition: "{transition}"') + assert transition is self.Transition.FADE_IN or transition is None cmb.input0 = position[0] cmb.input1 = position[1] cmb.connectattr('output', self.node, 'position') diff --git a/assets/src/ba_data/python/bastd/actor/spazbot.py b/assets/src/ba_data/python/bastd/actor/spazbot.py index 6e3a71c2..9e14de07 100644 --- a/assets/src/ba_data/python/bastd/actor/spazbot.py +++ b/assets/src/ba_data/python/bastd/actor/spazbot.py @@ -187,9 +187,9 @@ class SpazBot(basespaz.Spaz): """ assert self.node botpt = ba.Vec3(self.node.position) - closest_dist = None - closest_vel = None - closest = None + closest_dist: Optional[float] = None + closest_vel: Optional[ba.Vec3] = None + closest: Optional[ba.Vec3] = None assert self._player_pts is not None for plpt, plvel in self._player_pts: dist = (plpt - botpt).length() @@ -985,7 +985,7 @@ class BotSet: try: if player.is_alive(): assert isinstance(player.actor, basespaz.Spaz) - assert player.actor is not None and player.actor.node + assert player.actor.node player_pts.append((ba.Vec3(player.actor.node.position), ba.Vec3(player.actor.node.velocity))) except Exception: @@ -999,7 +999,7 @@ class BotSet: """Immediately clear out any bots in the set.""" # Don't do this if the activity is shutting down or dead. - activity = ba.getactivity(doraise=False) + activity: Optional[ba.Activity] = ba.getactivity(doraise=False) if activity is None or activity.is_expired(): return diff --git a/assets/src/ba_data/python/bastd/actor/text.py b/assets/src/ba_data/python/bastd/actor/text.py index ea67965f..3e9003c2 100644 --- a/assets/src/ba_data/python/bastd/actor/text.py +++ b/assets/src/ba_data/python/bastd/actor/text.py @@ -215,9 +215,7 @@ class Text(ba.Actor): ba.animate(cmb, 'input1', keys) ba.animate(self.node, 'opacity', o_keys) else: - if (transition is not self.Transition.FADE_IN - and transition is not None): - ba.print_error(f'Invalid transition: "{transition}"') + assert transition is self.Transition.FADE_IN or transition is None cmb.input0 = position[0] cmb.input1 = position[1] cmb.connectattr('output', self.node, 'position') diff --git a/assets/src/ba_data/python/bastd/game/conquest.py b/assets/src/ba_data/python/bastd/game/conquest.py index 7509f92e..f7430357 100644 --- a/assets/src/ba_data/python/bastd/game/conquest.py +++ b/assets/src/ba_data/python/bastd/game/conquest.py @@ -45,16 +45,17 @@ class ConquestFlag(Flag): self._team: Optional[ba.Team] = None self.light: Optional[ba.Node] = None - def set_team(self, team: ba.Team) -> None: - """Set the team that owns this flag.""" - self._team = None if team is None else team - @property def team(self) -> ba.Team: """The team that owns this flag.""" assert self._team is not None return self._team + @team.setter + def team(self, team: ba.Team) -> None: + """Set the team that owns this flag.""" + self._team = team + # ba_meta export game class ConquestGame(ba.TeamGameActivity): @@ -165,7 +166,7 @@ class ConquestGame(ba.TeamGameActivity): # Give teams a flag to start with. for i in range(len(self.teams)): - self._flags[i].set_team(self.teams[i]) + self._flags[i].team = self.teams[i] light = self._flags[i].light assert light node = self._flags[i].node @@ -227,9 +228,12 @@ class ConquestGame(ba.TeamGameActivity): flag = flagnode.getdelegate() except Exception: return # Player may have left and his body hit the flag. + assert isinstance(player, ba.Player) + assert isinstance(flag, ConquestFlag) + assert flag.light if flag.team is not player.team: - flag.set_team(player.team) + flag.team = player.team flag.light.color = player.team.color flag.node.color = player.team.color self.stats.player_scored(player, 10, screenmessage=False) diff --git a/assets/src/ba_data/python/bastd/game/football.py b/assets/src/ba_data/python/bastd/game/football.py index ff8b3cc6..a7a9361d 100644 --- a/assets/src/ba_data/python/bastd/game/football.py +++ b/assets/src/ba_data/python/bastd/game/football.py @@ -590,8 +590,8 @@ class FootballCoopGame(ba.CoopGameActivity): return flagpos = ba.Vec3(self._flag.node.position) - closest_bot = None - closest_dist = None + closest_bot: Optional[spazbot.SpazBot] = None + closest_dist = 0.0 # Always gets assigned first time through. for bot in bots: # If a bot is picked up, he should forget about the flag. if bot.held_count > 0: @@ -600,8 +600,8 @@ class FootballCoopGame(ba.CoopGameActivity): botpos = ba.Vec3(bot.node.position) botdist = (botpos - flagpos).length() if closest_bot is None or botdist < closest_dist: - closest_dist = botdist closest_bot = bot + closest_dist = botdist if closest_bot is not None: closest_bot.target_flag = self._flag diff --git a/assets/src/ba_data/python/bastd/game/onslaught.py b/assets/src/ba_data/python/bastd/game/onslaught.py index d2379e7c..35f76656 100644 --- a/assets/src/ba_data/python/bastd/game/onslaught.py +++ b/assets/src/ba_data/python/bastd/game/onslaught.py @@ -959,9 +959,9 @@ class OnslaughtGame(ba.CoopGameActivity): max_dudes, group_count, max_level) - all_entries: List[Dict[str, Any]] = [] + all_entries: List[Optional[Dict[str, Any]]] = [] for group in distribution: - entries: List[Dict[str, Any]] = [] + entries: List[Optional[Dict[str, Any]]] = [] for entry in group: bot_level = bot_levels[entry[0] - 1] bot_type = bot_level[random.randrange(len(bot_level))] diff --git a/assets/src/ba_data/python/bastd/game/race.py b/assets/src/ba_data/python/bastd/game/race.py index 5640e9b7..dafabc03 100644 --- a/assets/src/ba_data/python/bastd/game/race.py +++ b/assets/src/ba_data/python/bastd/game/race.py @@ -139,7 +139,7 @@ class RaceGame(ba.TeamGameActivity): self._score_sound = ba.getsound('score') self._swipsound = ba.getsound('swip') self._last_team_time: Optional[float] = None - self._front_race_region = None + self._front_race_region: Optional[int] = None self._nub_tex = ba.gettexture('nub') self._beep_1_sound = ba.getsound('raceBeep1') self._beep_2_sound = ba.getsound('raceBeep2') @@ -190,7 +190,7 @@ class RaceGame(ba.TeamGameActivity): def _flash_player(self, player: ba.Player, scale: float) -> None: assert isinstance(player.actor, PlayerSpaz) - assert player.actor is not None and player.actor.node + assert player.actor.node pos = player.actor.node.position light = ba.newnode('light', attrs={ @@ -213,9 +213,11 @@ class RaceGame(ba.TeamGameActivity): player = playernode.getdelegate().getplayer() except Exception: player = None + assert isinstance(player, ba.Player) region = region_node.getdelegate() if not player or not region: return + assert isinstance(region, RaceRegion) last_region = player.gamedata['last_region'] this_region = region.index @@ -227,6 +229,7 @@ class RaceGame(ba.TeamGameActivity): # blown over a region, etc). if this_region > last_region + 2: if player.is_alive(): + assert player.actor player.actor.handlemessage(ba.DieMessage()) ba.screenmessage(ba.Lstr( translate=('statements', 'Killing ${NAME} for' @@ -273,6 +276,7 @@ class RaceGame(ba.TeamGameActivity): # Flash where the player is. self._flash_player(player, 1.0) player.gamedata['finished'] = True + assert player.actor player.actor.handlemessage( ba.DieMessage(immediate=True)) @@ -305,6 +309,7 @@ class RaceGame(ba.TeamGameActivity): # Print their lap number over their head. try: + assert isinstance(player.actor, PlayerSpaz) mathnode = ba.newnode('math', owner=player.actor.node, attrs={ @@ -529,7 +534,7 @@ class RaceGame(ba.TeamGameActivity): pos: Optional[ba.Vec3] try: assert isinstance(player.actor, PlayerSpaz) - assert player.actor is not None and player.actor.node + assert player.actor.node pos = ba.Vec3(player.actor.node.position) except Exception: pos = None diff --git a/assets/src/ba_data/python/bastd/game/runaround.py b/assets/src/ba_data/python/bastd/game/runaround.py index 32ba00e5..7cb58478 100644 --- a/assets/src/ba_data/python/bastd/game/runaround.py +++ b/assets/src/ba_data/python/bastd/game/runaround.py @@ -725,7 +725,7 @@ class RunaroundGame(ba.CoopGameActivity): t_sec = 0.0 base_delay = 0.5 delay = 0.0 - bot_types: List[Dict[str, Any]] = [] + bot_types: List[Optional[Dict[str, Any]]] = [] if self._preset in ['endless', 'endless_tournament']: level = self._wave diff --git a/assets/src/ba_data/python/bastd/game/thelaststand.py b/assets/src/ba_data/python/bastd/game/thelaststand.py index 08f87f32..3b8c1fd4 100644 --- a/assets/src/ba_data/python/bastd/game/thelaststand.py +++ b/assets/src/ba_data/python/bastd/game/thelaststand.py @@ -198,7 +198,7 @@ class TheLastStandGame(ba.CoopGameActivity): try: if player.is_alive(): assert isinstance(player.actor, playerspaz.PlayerSpaz) - assert player.actor is not None and player.actor.node + assert player.actor.node playerpts.append(player.actor.node.position) except Exception as exc: print('ERROR in _update_bots', exc) diff --git a/assets/src/ba_data/python/bastd/tutorial.py b/assets/src/ba_data/python/bastd/tutorial.py index ecc5d2d9..8523cb95 100644 --- a/assets/src/ba_data/python/bastd/tutorial.py +++ b/assets/src/ba_data/python/bastd/tutorial.py @@ -243,8 +243,7 @@ class TutorialActivity(ba.Activity): ba.set_analytics_screen('Tutorial Start') _ba.increment_analytics_count('Tutorial start') - # noinspection PyUnreachableCode - if 0: # pylint: disable=using-constant-test + if bool(False): # Buttons on top. text_y = 140 buttons_y = 250 diff --git a/assets/src/ba_data/python/bastd/ui/appinvite.py b/assets/src/ba_data/python/bastd/ui/appinvite.py index 54163130..f11475be 100644 --- a/assets/src/ba_data/python/bastd/ui/appinvite.py +++ b/assets/src/ba_data/python/bastd/ui/appinvite.py @@ -322,6 +322,7 @@ def handle_app_invites_press(force_code: bool = False) -> None: 'enableAppInvites', False) and not app.on_tv) if force_code: do_app_invites = False + # FIXME: Should update this to grab a code before showing the invite UI. if do_app_invites: AppInviteWindow() @@ -330,7 +331,7 @@ def handle_app_invites_press(force_code: bool = False) -> None: ba.Lstr(resource='gatherWindow.requestingAPromoCodeText'), color=(0, 1, 0)) - def handle_result(result: Dict[str, Any]) -> None: + def handle_result(result: Optional[Dict[str, Any]]) -> None: with ba.Context('ui'): if result is None: ba.screenmessage(ba.Lstr(resource='errorText'), diff --git a/assets/src/ba_data/python/bastd/ui/coop/browser.py b/assets/src/ba_data/python/bastd/ui/coop/browser.py index 902fcd02..e4f8c464 100644 --- a/assets/src/ba_data/python/bastd/ui/coop/browser.py +++ b/assets/src/ba_data/python/bastd/ui/coop/browser.py @@ -357,19 +357,14 @@ class CoopBrowserWindow(ba.Window): # Update all of our tourney buttons based on whats in data. for i, tbtn in enumerate(self._tournament_buttons): - entry: Optional[Dict[str, Any]] - try: - assert data is not None - entry = data[i] - except Exception: - entry = None - prize_y_offs = (0 if entry is None else 34 if 'prizeRange3' in - entry else 20 if 'prizeRange2' in entry else 12) + assert data is not None + entry: Dict[str, Any] = data[i] + prize_y_offs = (34 if 'prizeRange3' in entry else + 20 if 'prizeRange2' in entry else 12) x_offs = 90 # This seems to be a false alarm. # pylint: disable=unbalanced-tuple-unpacking - assert entry is not None pr1, pv1, pr2, pv2, pr3, pv3 = ( get_tournament_prize_strings(entry)) # pylint: enable=unbalanced-tuple-unpacking @@ -427,7 +422,7 @@ class CoopBrowserWindow(ba.Window): leader_name = '-' leader_score: Union[str, ba.Lstr] = '-' - if entry is not None and entry['scores']: + if entry['scores']: score = tbtn['leader'] = copy.deepcopy(entry['scores'][0]) leader_name = score[1] leader_score = ( @@ -441,15 +436,13 @@ class CoopBrowserWindow(ba.Window): ba.textwidget(edit=tbtn['current_leader_name_text'], text=ba.Lstr(value=leader_name)) - self._tournament_leader_score_type = (None if entry is None else - entry['scoreType']) + self._tournament_leader_score_type = (entry['scoreType']) ba.textwidget(edit=tbtn['current_leader_score_text'], text=leader_score) ba.buttonwidget(edit=tbtn['more_scores_button'], - label='-' if entry is None else ba.Lstr( - resource=self._r + '.seeMoreText')) + label=ba.Lstr(resource=self._r + '.seeMoreText')) out_of_time_text: Union[str, ba.Lstr] = ( - '-' if entry is None or 'totalTime' not in entry else ba.Lstr( + '-' if 'totalTime' not in entry else ba.Lstr( resource=self._r + '.ofTotalTimeText', subs=[('${TOTAL}', ba.timestring(entry['totalTime'], @@ -458,16 +451,13 @@ class CoopBrowserWindow(ba.Window): ba.textwidget(edit=tbtn['time_remaining_out_of_text'], text=out_of_time_text) - tbtn['time_remaining'] = 0 if entry is None else entry[ - 'timeRemaining'] + tbtn['time_remaining'] = entry['timeRemaining'] tbtn['has_time_remaining'] = entry is not None - tbtn['tournament_id'] = (None if entry is None else - entry['tournamentID']) + tbtn['tournament_id'] = entry['tournamentID'] tbtn['required_league'] = (None if 'requiredLeague' not in entry else entry['requiredLeague']) - game = (None if entry is None else - ba.app.tournament_info[tbtn['tournament_id']]['game']) + game = ba.app.tournament_info[tbtn['tournament_id']]['game'] if game is None: ba.textwidget(edit=tbtn['button_text'], text='-') @@ -491,7 +481,7 @@ class CoopBrowserWindow(ba.Window): levelname).get_preview_texture(), opacity=1.0 if enabled else 0.5) - fee = None if entry is None else entry['fee'] + fee = entry['fee'] if fee is None: fee_var = None diff --git a/assets/src/ba_data/python/bastd/ui/gather.py b/assets/src/ba_data/python/bastd/ui/gather.py index fc63e4f4..bc6f46b9 100644 --- a/assets/src/ba_data/python/bastd/ui/gather.py +++ b/assets/src/ba_data/python/bastd/ui/gather.py @@ -149,7 +149,7 @@ class GatherWindow(ba.Window): tabs_def: List[Tuple[str, ba.Lstr]] = [ ('about', ba.Lstr(resource=self._r + '.aboutText')) ] - if True and _ba.get_account_misc_read_val('enablePublicParties', True): + if _ba.get_account_misc_read_val('enablePublicParties', True): tabs_def.append( ('internet', ba.Lstr(resource=self._r + '.internetText'))) if platform == 'android' and subplatform == 'google': diff --git a/assets/src/ba_data/python/bastd/ui/kiosk.py b/assets/src/ba_data/python/bastd/ui/kiosk.py index 13ee9457..262ef871 100644 --- a/assets/src/ba_data/python/bastd/ui/kiosk.py +++ b/assets/src/ba_data/python/bastd/ui/kiosk.py @@ -203,8 +203,7 @@ class KioskWindow(ba.Window): self._b5: Optional[ba.Widget] self._b6: Optional[ba.Widget] - # noinspection PyUnreachableCode - if False: # pylint: disable=using-constant-test + if bool(False): ba.textwidget( parent=self._root_widget, size=(0, 0), @@ -312,8 +311,7 @@ class KioskWindow(ba.Window): self._b4 = self._b5 = self._b6 = None self._b7: Optional[ba.Widget] - # noinspection PyUnreachableCode - if False: # pylint: disable=using-constant-test + if bool(False): self._b7 = ba.buttonwidget( parent=self._root_widget, autoselect=True, diff --git a/assets/src/ba_data/python/bastd/ui/league/rankwindow.py b/assets/src/ba_data/python/bastd/ui/league/rankwindow.py index 8459cc0e..3e88d5ed 100644 --- a/assets/src/ba_data/python/bastd/ui/league/rankwindow.py +++ b/assets/src/ba_data/python/bastd/ui/league/rankwindow.py @@ -134,7 +134,7 @@ class LeagueRankWindow(ba.Window): self._season_popup_menu: Optional[popup_ui.PopupMenu] = None self._requested_season: Optional[str] = None - self._season = None + self._season: Optional[str] = None # take note of our account state; we'll refresh later if this changes self._account_state = _ba.get_account_state() diff --git a/assets/src/ba_data/python/bastd/ui/partyqueue.py b/assets/src/ba_data/python/bastd/ui/partyqueue.py index 2c769b92..19615265 100644 --- a/assets/src/ba_data/python/bastd/ui/partyqueue.py +++ b/assets/src/ba_data/python/bastd/ui/partyqueue.py @@ -293,7 +293,7 @@ class PartyQueueWindow(ba.Window): """(internal)""" return self._line_bottom - def on_account_press(self, account_id: str, + def on_account_press(self, account_id: Optional[str], origin_widget: ba.Widget) -> None: """A dude was clicked so we should show his account info.""" from bastd.ui.account import viewer diff --git a/assets/src/ba_data/python/bastd/ui/playlist/customizebrowser.py b/assets/src/ba_data/python/bastd/ui/playlist/customizebrowser.py index 9b96da1f..512b83b2 100644 --- a/assets/src/ba_data/python/bastd/ui/playlist/customizebrowser.py +++ b/assets/src/ba_data/python/bastd/ui/playlist/customizebrowser.py @@ -30,7 +30,7 @@ import _ba import ba if TYPE_CHECKING: - from typing import Any, Type, Optional, Tuple, List + from typing import Any, Type, Optional, Tuple, List, Dict class PlaylistCustomizeBrowserWindow(ba.Window): @@ -562,6 +562,7 @@ class PlaylistCustomizeBrowserWindow(ba.Window): return if self._selected_playlist_name is None: return + plst: Optional[List[Dict[str, Any]]] if self._selected_playlist_name == '__default__': plst = self._pvars.get_default_list_call() else: diff --git a/assets/src/ba_data/python/bastd/ui/playlist/editgame.py b/assets/src/ba_data/python/bastd/ui/playlist/editgame.py index 1c9d7901..f96369b6 100644 --- a/assets/src/ba_data/python/bastd/ui/playlist/editgame.py +++ b/assets/src/ba_data/python/bastd/ui/playlist/editgame.py @@ -30,7 +30,7 @@ import _ba import ba if TYPE_CHECKING: - from typing import Type, Any, Dict, Callable, Optional, Union + from typing import Type, Any, Dict, Callable, Optional, Union, List class PlaylistEditGameWindow(ba.Window): @@ -197,7 +197,7 @@ class PlaylistEditGameWindow(ba.Window): # Keep track of all the selectable widgets we make so we can wire # them up conveniently. - widget_column = [] + widget_column: List[List[ba.Widget]] = [] # Map select button. ba.textwidget(parent=self._subcontainer, @@ -419,16 +419,17 @@ class PlaylistEditGameWindow(ba.Window): else: raise Exception() - # ok now wire up the column + # Ok now wire up the column. try: # pylint: disable=unsubscriptable-object - prev_widgets = None + prev_widgets: Optional[List[ba.Widget]] = None for cwdg in widget_column: if prev_widgets is not None: - # wire our rightmost to their rightmost + # Wire our rightmost to their rightmost. ba.widget(edit=prev_widgets[-1], down_widget=cwdg[-1]) ba.widget(cwdg[-1], up_widget=prev_widgets[-1]) - # wire our leftmost to their leftmost + + # Wire our leftmost to their leftmost. ba.widget(edit=prev_widgets[0], down_widget=cwdg[0]) ba.widget(cwdg[0], up_widget=prev_widgets[0]) prev_widgets = cwdg @@ -452,14 +453,14 @@ class PlaylistEditGameWindow(ba.Window): def _select_map(self) -> None: # pylint: disable=cyclic-import - from bastd.ui.playlist import mapselect + from bastd.ui.playlist.mapselect import PlaylistMapSelectWindow # Replace ourself with the map-select UI. ba.containerwidget(edit=self._root_widget, transition='out_left') - ba.app.main_menu_window = (mapselect.PlaylistMapSelectWindow( + ba.app.main_menu_window = PlaylistMapSelectWindow( self._gameclass, self._sessiontype, copy.deepcopy(self._getconfig()), self._edit_info, - self._completion_call).get_root_widget()) + self._completion_call).get_root_widget() def _choice_inc(self, setting_name: str, widget: ba.Widget, setting: Dict[str, Any], increment: int) -> None: diff --git a/assets/src/ba_data/python/bastd/ui/popup.py b/assets/src/ba_data/python/bastd/ui/popup.py index e5091bbe..426cf6b1 100644 --- a/assets/src/ba_data/python/bastd/ui/popup.py +++ b/assets/src/ba_data/python/bastd/ui/popup.py @@ -141,14 +141,7 @@ class PopupMenuWindow(PopupWindow): # we need to flatten them. choices_display_fin: List[str] = [] for choice_display in choices_display: - if isinstance(choice_display, ba.Lstr): - choices_display_fin.append(choice_display.evaluate()) - else: - ba.print_error( - 'PopupMenuWindow got a raw string in \'choices_display\';' - ' please pass ba.Lstr values only', - once=True) - choices_display_fin.append(choice_display) + choices_display_fin.append(choice_display.evaluate()) if maxwidth is None: maxwidth = width * 1.5 diff --git a/assets/src/ba_data/python/bastd/ui/settings/advanced.py b/assets/src/ba_data/python/bastd/ui/settings/advanced.py index 553b4ff6..275d5df5 100644 --- a/assets/src/ba_data/python/bastd/ui/settings/advanced.py +++ b/assets/src/ba_data/python/bastd/ui/settings/advanced.py @@ -69,7 +69,7 @@ class AdvancedSettingsWindow(ba.Window): stack_offset=(0, -25) if app.small_ui else (0, 0))) self._prev_lang = "" self._prev_lang_list: List[str] = [] - self._complete_langs_list = None + self._complete_langs_list: Optional[List] = None self._complete_langs_error = False self._language_popup: Optional[popup_ui.PopupMenu] = None diff --git a/assets/src/ba_data/python/bastd/ui/settings/controls.py b/assets/src/ba_data/python/bastd/ui/settings/controls.py index 252ebb63..0ac3c2c1 100644 --- a/assets/src/ba_data/python/bastd/ui/settings/controls.py +++ b/assets/src/ba_data/python/bastd/ui/settings/controls.py @@ -103,8 +103,7 @@ class ControlsSettingsWindow(ba.Window): show_space_2 = True height += space_height - # noinspection PyUnreachableCode - if True: # pylint: disable=using-constant-test + if bool(True): show_remote = True height += spacing else: diff --git a/assets/src/ba_data/python/bastd/ui/soundtrack/browser.py b/assets/src/ba_data/python/bastd/ui/soundtrack/browser.py index 0f67d867..68c5b5f0 100644 --- a/assets/src/ba_data/python/bastd/ui/soundtrack/browser.py +++ b/assets/src/ba_data/python/bastd/ui/soundtrack/browser.py @@ -289,10 +289,7 @@ class SoundtrackBrowserWindow(ba.Window): copy_word = copy_text.replace('${NAME}', '').strip() base_name = self._get_soundtrack_display_name( self._selected_soundtrack).evaluate() - if not isinstance(base_name, str): - print('expected uni base_name 3fj0') - assert isinstance(base_name, bytes) - base_name = base_name.decode('utf-8') + assert isinstance(base_name, str) # If it looks like a copy, strip digits and spaces off the end. if copy_word in base_name: diff --git a/assets/src/ba_data/python/bastd/ui/soundtrack/edit.py b/assets/src/ba_data/python/bastd/ui/soundtrack/edit.py index 0b8de05c..1b23e63d 100644 --- a/assets/src/ba_data/python/bastd/ui/soundtrack/edit.py +++ b/assets/src/ba_data/python/bastd/ui/soundtrack/edit.py @@ -205,8 +205,8 @@ class SoundtrackEditWindow(ba.Window): ] # FIXME: We should probably convert this to use translations. type_names_translated = get_resource('soundtrackTypeNames') - prev_type_button = None - prev_test_button = None + prev_type_button: Optional[ba.Widget] = None + prev_test_button: Optional[ba.Widget] = None for index, song_type in enumerate(types): row = ba.rowwidget(parent=self._col, size=(self._width - 40, 40)) diff --git a/assets/src/ba_data/python/bastd/ui/store/browser.py b/assets/src/ba_data/python/bastd/ui/store/browser.py index 1e0398fc..27dc949b 100644 --- a/assets/src/ba_data/python/bastd/ui/store/browser.py +++ b/assets/src/ba_data/python/bastd/ui/store/browser.py @@ -31,7 +31,8 @@ import _ba import ba if TYPE_CHECKING: - from typing import Any, Callable, Optional, Tuple, Dict, Union, Sequence + from typing import (Any, Callable, Optional, Tuple, Dict, Union, Sequence, + List) class StoreBrowserWindow(ba.Window): @@ -850,7 +851,7 @@ class StoreBrowserWindow(ba.Window): maxwidth=700, transition_delay=0.4) - prev_row_buttons = None + prev_row_buttons: Optional[List] = None this_row_buttons = [] delay = 0.3 diff --git a/assets/src/ba_data/python/bastd/ui/tournamententry.py b/assets/src/ba_data/python/bastd/ui/tournamententry.py index f7ef9175..f40bc191 100644 --- a/assets/src/ba_data/python/bastd/ui/tournamententry.py +++ b/assets/src/ba_data/python/bastd/ui/tournamententry.py @@ -518,10 +518,10 @@ class TournamentEntryWindow(popup.PopupWindow): try: ticket_count = _ba.get_account_ticket_count() except Exception: + # FIXME: should add a ba.NotSignedInError we can use here. ticket_count = None ticket_cost = self._purchase_price - if (ticket_count is not None and ticket_cost is not None - and ticket_count < ticket_cost): + if ticket_count is not None and ticket_count < ticket_cost: getcurrency.show_get_tickets_prompt() ba.playsound(ba.getsound('error')) return diff --git a/tools/efrotools/code.py b/tools/efrotools/code.py index 1983d6fb..e3dd2837 100644 --- a/tools/efrotools/code.py +++ b/tools/efrotools/code.py @@ -644,10 +644,12 @@ def _run_idea_inspections(projroot: Path, if result.returncode != 0: # In verbose mode this stuff got printed already. if not verbose: - stdout = (result.stdout.decode() if isinstance( # type: ignore - result.stdout, bytes) else str(result.stdout)) - stderr = (result.stderr.decode() if isinstance( # type: ignore - result.stdout, bytes) else str(result.stdout)) + stdout = ( + result.stdout.decode() if isinstance( # type: ignore + result.stdout, bytes) else str(result.stdout)) + stderr = ( + result.stderr.decode() if isinstance( # type: ignore + result.stdout, bytes) else str(result.stdout)) print(f'{displayname} inspection failure stdout:\n{stdout}' + f'{displayname} inspection failure stderr:\n{stderr}') raise RuntimeError(f"{displayname} inspection failed.")