Skip to content

Commit 4b95ca4

Browse files
authored
🌴 Multiple fixes (#19)
1 parent b83dafb commit 4b95ca4

File tree

27 files changed

+147
-83
lines changed

27 files changed

+147
-83
lines changed

‎Makefile‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ semrel-dev:
9999
format:
100100
black .
101101
isort .
102-
ruff check --fix
102+
ruff check --fix --unsafe-fixes
103103

104104
check-ruff:
105105
ruff check

‎codenames/classic/runner.py‎

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,10 @@ def get_player(self, team: ClassicTeam, role: PlayerRole) -> Player:
5959

6060
class ClassicGameRunner:
6161
def __init__(
62-
self, players: ClassicGamePlayers, state: ClassicGameState | None = None, board: ClassicBoard | None = None
62+
self,
63+
players: ClassicGamePlayers,
64+
state: ClassicGameState | None = None,
65+
board: ClassicBoard | None = None,
6366
):
6467
self.players = players
6568
if not state:
@@ -153,9 +156,12 @@ def find_team(players: Collection[Player], team: ClassicTeam) -> TeamPlayers:
153156
elif isinstance(player, Operative):
154157
operative = player
155158
else:
156-
raise ValueError(f"Player {player} is not a Spymaster or Operative")
159+
msg = f"Player {player} is not a Spymaster or Operative"
160+
raise ValueError(msg)
157161
if spymaster is None:
158-
raise ValueError(f"No Spymaster found for team {team}")
162+
msg = f"No Spymaster found for team {team}"
163+
raise ValueError(msg)
159164
if operative is None:
160-
raise ValueError(f"No Operative found for team {team}")
165+
msg = f"No Operative found for team {team}"
166+
raise ValueError(msg)
161167
return TeamPlayers(spymaster=spymaster, operative=operative)

‎codenames/classic/score.py‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,4 @@ def new(blue: int, red: int) -> Score:
1717
def add_point(self, team: ClassicTeam) -> bool:
1818
team_score = self.blue if team == ClassicTeam.BLUE else self.red
1919
team_score.revealed += 1
20-
if team_score.unrevealed == 0:
21-
return True
22-
return False
20+
return team_score.unrevealed == 0

‎codenames/classic/state.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ def is_game_over(self) -> bool:
121121

122122
def process_clue(self, clue: Clue) -> ClassicGivenClue | None:
123123
if self.is_game_over:
124-
raise GameIsOver()
124+
raise GameIsOver
125125
if self.current_player_role != PlayerRole.SPYMASTER:
126126
raise InvalidTurn("It's not the Spymaster's turn now!")
127127
self.clues.append(clue)
@@ -141,7 +141,7 @@ def process_clue(self, clue: Clue) -> ClassicGivenClue | None:
141141

142142
def process_guess(self, guess: Guess) -> ClassicGivenGuess | None:
143143
if self.is_game_over:
144-
raise GameIsOver()
144+
raise GameIsOver
145145
if self.current_player_role != PlayerRole.OPERATIVE:
146146
raise InvalidTurn("It's not the Operative's turn now!")
147147
if guess.card_index == PASS_GUESS:

‎codenames/duet/state.py‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ def operative_state(self) -> DuetOperativeState:
105105

106106
def process_clue(self, clue: Clue) -> DuetGivenClue | None:
107107
if self.is_game_over:
108-
raise GameIsOver()
108+
raise GameIsOver
109109
if self.current_player_role != PlayerRole.SPYMASTER:
110110
raise InvalidTurn("It's not the Spymaster's turn now!")
111111
self.clues.append(clue)
@@ -124,7 +124,7 @@ def process_clue(self, clue: Clue) -> DuetGivenClue | None:
124124

125125
def process_guess(self, guess: Guess) -> DuetGivenGuess | None:
126126
if self.is_game_over:
127-
raise GameIsOver()
127+
raise GameIsOver
128128
if self.current_player_role != PlayerRole.OPERATIVE:
129129
raise InvalidTurn("It's not the Operative's turn now!")
130130
if guess.card_index == PASS_GUESS:
@@ -149,7 +149,7 @@ def process_guess(self, guess: Guess) -> DuetGivenGuess | None:
149149
def dual_card_revealed(self, guess: Guess):
150150
card = self.board[guess.card_index]
151151
if card.revealed:
152-
assert not card.color == DuetColor.GREEN # This should not happen
152+
assert card.color != DuetColor.GREEN # This should not happen
153153
return
154154
if card.color == DuetColor.GREEN:
155155
self._update_score(card_color=DuetColor.GREEN)
@@ -260,7 +260,8 @@ def game_result(self) -> GameResult | None:
260260
if not result_a or not result_b:
261261
return None
262262
# Otherwise, both sides, finished, no one lost, means the game is won
263-
assert result_a.win and result_b.win
263+
assert result_a.win
264+
assert result_b.win
264265
return TARGET_REACHED
265266

266267
@property

‎codenames/generic/board.py‎

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import abc
44
import math
55
from dataclasses import dataclass
6-
from typing import TYPE_CHECKING, Any, Collection, Iterator, Union
6+
from typing import TYPE_CHECKING, Any, Collection, Iterator
77

88
from pydantic import BaseModel, field_validator
99

@@ -27,13 +27,15 @@ class Board[C: CardColor](BaseModel, abc.ABC):
2727
def convert_cards(cls, v: Any) -> list[Card[C]]:
2828
return list(v)
2929

30-
def __getitem__(self, item: Union[int, str]) -> Card:
30+
def __getitem__(self, item: int | str) -> Card:
3131
if isinstance(item, str):
3232
item = self.find_card_index(item)
3333
if not isinstance(item, int):
34-
raise IndexError(f"Illegal index type for card: {item}")
34+
msg = f"Illegal index type for card: {item}"
35+
raise IndexError(msg)
3536
if item < 0 or item >= self.size:
36-
raise IndexError(f"Card index out of bounds: {item}")
37+
msg = f"Card index out of bounds: {item}"
38+
raise IndexError(msg)
3739
return self.cards[item]
3840

3941
def __iter__(self) -> Iterator[Card[C]]: # type: ignore

‎codenames/generic/move.py‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ def __str__(self) -> str:
6161
def correct(self) -> bool:
6262
card_color = self.guessed_card.color
6363
if not card_color:
64-
raise ValueError(f"Card {self.guessed_card} has no color set")
64+
msg = f"Card {self.guessed_card} has no color set"
65+
raise ValueError(msg)
6566
return self.for_clue.team.as_card_color == card_color
6667

6768
@property

‎codenames/generic/player.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,4 @@ def give_clue(self, game_state: S) -> Clue:
6161
class Operative[C: CardColor, T: Team, S: OperativeState](Player[C, T], abc.ABC):
6262
@abc.abstractmethod
6363
def guess(self, game_state: S) -> Guess:
64-
raise NotImplementedError()
64+
raise NotImplementedError

‎codenames/mini/state.py‎

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,14 @@ def is_sudden_death(self) -> bool:
1919

2020
def process_guess(self, guess: Guess) -> DuetGivenGuess | None:
2121
given_guess = super().process_guess(guess)
22-
# If the guess is wrong or passed the turn, the timer is updated
23-
if not given_guess or not given_guess.correct:
24-
self._update_tokens(mistake=given_guess is not None)
22+
# If the guess is correct, there is nothing to do
23+
if given_guess and given_guess.correct:
2524
return given_guess
26-
# If we reached our target score, and we are not in "sudden death", we consume a timer token
27-
if self.is_game_over and not self.is_sudden_death:
28-
self._update_tokens(mistake=False)
25+
# Otherwise, the guess was incorrect or the operator passed the turn
26+
self._update_tokens(is_mistake=given_guess is not None)
2927
return given_guess
3028

31-
def _update_tokens(self, mistake: bool) -> None:
29+
def _update_tokens(self, is_mistake: bool) -> None:
3230
if self.timer_tokens >= 0:
3331
self.timer_tokens -= 1
3432
if self.timer_tokens == 0:
@@ -37,7 +35,7 @@ def _update_tokens(self, mistake: bool) -> None:
3735
elif self.timer_tokens < 0:
3836
self.game_result = TIMER_TOKENS_DEPLETED
3937
log.info("Timer tokens depleted (after sudden death)!")
40-
if not mistake:
38+
if not is_mistake:
4139
return
4240
self.allowed_mistakes -= 1
4341
if self.allowed_mistakes == 0:

‎codenames/online/codenames_game/adapter.py‎

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,12 @@
55
from dataclasses import dataclass
66
from enum import StrEnum
77
from time import sleep
8-
from typing import Callable, Mapping
8+
from typing import TYPE_CHECKING, Callable, Mapping
99

1010
from selenium import webdriver
1111
from selenium.common import ElementNotInteractableException
1212
from selenium.webdriver.chrome.service import Service
1313
from selenium.webdriver.common.by import By
14-
from selenium.webdriver.remote.webelement import WebElement
1514

1615
from codenames.classic.board import ClassicBoard
1716
from codenames.generic.move import PASS_GUESS, Clue, Guess
@@ -28,6 +27,9 @@
2827
)
2928
from codenames.utils.formatting import wrap
3029

30+
if TYPE_CHECKING:
31+
from selenium.webdriver.remote.webelement import WebElement
32+
3133
log = logging.getLogger(__name__)
3234

3335
WEBAPP_URL = "https://codenames.game/"
@@ -279,7 +281,8 @@ def get_card_containers(self) -> list[WebElement]:
279281
card_elements = self.driver.find_elements(by=By.CLASS_NAME, value="card")
280282
card_elements = [element for element in card_elements if element.text != ""]
281283
if len(card_elements) < 25:
282-
raise ValueError(f"Expected 25 cards, loaded {len(card_elements)}")
284+
msg = f"Expected 25 cards, loaded {len(card_elements)}"
285+
raise ValueError(msg)
283286
return self.driver.find_elements(By.XPATH, value="//div[@role='img']")
284287

285288
def get_clue_input(self) -> WebElement:
@@ -343,11 +346,11 @@ def poll_elements[
343346
log.debug(f"Polling [{len(element_getters)}] elements...")
344347
try:
345348
return poll_elements(element_getters, timeout_sec=timeout_sec, poll_interval_sec=poll_interval_sec)
346-
except Exception as e:
349+
except Exception:
347350
if screenshot:
348351
log.info(f"{self.log_prefix} Polling failed, saving screenshot...")
349352
self.screenshot("failed polling")
350-
raise e
353+
raise
351354

352355
def screenshot(self, tag: str, raise_on_error: bool = False) -> str | None:
353356
return save_screenshot(adapter=self, tag=tag, raise_on_error=raise_on_error)

0 commit comments

Comments
 (0)