diff --git a/Makefile b/Makefile index 43bbdc4..1257c79 100644 --- a/Makefile +++ b/Makefile @@ -99,7 +99,7 @@ semrel-dev: format: black . isort . - ruff check --fix + ruff check --fix --unsafe-fixes check-ruff: ruff check diff --git a/codenames/classic/runner.py b/codenames/classic/runner.py index 9ef8f91..58d2033 100644 --- a/codenames/classic/runner.py +++ b/codenames/classic/runner.py @@ -59,7 +59,10 @@ def get_player(self, team: ClassicTeam, role: PlayerRole) -> Player: class ClassicGameRunner: def __init__( - self, players: ClassicGamePlayers, state: ClassicGameState | None = None, board: ClassicBoard | None = None + self, + players: ClassicGamePlayers, + state: ClassicGameState | None = None, + board: ClassicBoard | None = None, ): self.players = players if not state: @@ -153,9 +156,12 @@ def find_team(players: Collection[Player], team: ClassicTeam) -> TeamPlayers: elif isinstance(player, Operative): operative = player else: - raise ValueError(f"Player {player} is not a Spymaster or Operative") + msg = f"Player {player} is not a Spymaster or Operative" + raise ValueError(msg) if spymaster is None: - raise ValueError(f"No Spymaster found for team {team}") + msg = f"No Spymaster found for team {team}" + raise ValueError(msg) if operative is None: - raise ValueError(f"No Operative found for team {team}") + msg = f"No Operative found for team {team}" + raise ValueError(msg) return TeamPlayers(spymaster=spymaster, operative=operative) diff --git a/codenames/classic/score.py b/codenames/classic/score.py index 734ad2e..c229ea0 100644 --- a/codenames/classic/score.py +++ b/codenames/classic/score.py @@ -17,6 +17,4 @@ def new(blue: int, red: int) -> Score: def add_point(self, team: ClassicTeam) -> bool: team_score = self.blue if team == ClassicTeam.BLUE else self.red team_score.revealed += 1 - if team_score.unrevealed == 0: - return True - return False + return team_score.unrevealed == 0 diff --git a/codenames/classic/state.py b/codenames/classic/state.py index 777be9d..b60723d 100644 --- a/codenames/classic/state.py +++ b/codenames/classic/state.py @@ -121,7 +121,7 @@ def is_game_over(self) -> bool: def process_clue(self, clue: Clue) -> ClassicGivenClue | None: if self.is_game_over: - raise GameIsOver() + raise GameIsOver if self.current_player_role != PlayerRole.SPYMASTER: raise InvalidTurn("It's not the Spymaster's turn now!") self.clues.append(clue) @@ -141,7 +141,7 @@ def process_clue(self, clue: Clue) -> ClassicGivenClue | None: def process_guess(self, guess: Guess) -> ClassicGivenGuess | None: if self.is_game_over: - raise GameIsOver() + raise GameIsOver if self.current_player_role != PlayerRole.OPERATIVE: raise InvalidTurn("It's not the Operative's turn now!") if guess.card_index == PASS_GUESS: diff --git a/codenames/duet/state.py b/codenames/duet/state.py index 70fc576..c29936a 100644 --- a/codenames/duet/state.py +++ b/codenames/duet/state.py @@ -105,7 +105,7 @@ def operative_state(self) -> DuetOperativeState: def process_clue(self, clue: Clue) -> DuetGivenClue | None: if self.is_game_over: - raise GameIsOver() + raise GameIsOver if self.current_player_role != PlayerRole.SPYMASTER: raise InvalidTurn("It's not the Spymaster's turn now!") self.clues.append(clue) @@ -124,7 +124,7 @@ def process_clue(self, clue: Clue) -> DuetGivenClue | None: def process_guess(self, guess: Guess) -> DuetGivenGuess | None: if self.is_game_over: - raise GameIsOver() + raise GameIsOver if self.current_player_role != PlayerRole.OPERATIVE: raise InvalidTurn("It's not the Operative's turn now!") if guess.card_index == PASS_GUESS: @@ -149,7 +149,7 @@ def process_guess(self, guess: Guess) -> DuetGivenGuess | None: def dual_card_revealed(self, guess: Guess): card = self.board[guess.card_index] if card.revealed: - assert not card.color == DuetColor.GREEN # This should not happen + assert card.color != DuetColor.GREEN # This should not happen return if card.color == DuetColor.GREEN: self._update_score(card_color=DuetColor.GREEN) @@ -260,7 +260,8 @@ def game_result(self) -> GameResult | None: if not result_a or not result_b: return None # Otherwise, both sides, finished, no one lost, means the game is won - assert result_a.win and result_b.win + assert result_a.win + assert result_b.win return TARGET_REACHED @property diff --git a/codenames/generic/board.py b/codenames/generic/board.py index c626ad5..050651a 100644 --- a/codenames/generic/board.py +++ b/codenames/generic/board.py @@ -3,7 +3,7 @@ import abc import math from dataclasses import dataclass -from typing import TYPE_CHECKING, Any, Collection, Iterator, Union +from typing import TYPE_CHECKING, Any, Collection, Iterator from pydantic import BaseModel, field_validator @@ -27,13 +27,15 @@ class Board[C: CardColor](BaseModel, abc.ABC): def convert_cards(cls, v: Any) -> list[Card[C]]: return list(v) - def __getitem__(self, item: Union[int, str]) -> Card: + def __getitem__(self, item: int | str) -> Card: if isinstance(item, str): item = self.find_card_index(item) if not isinstance(item, int): - raise IndexError(f"Illegal index type for card: {item}") + msg = f"Illegal index type for card: {item}" + raise IndexError(msg) if item < 0 or item >= self.size: - raise IndexError(f"Card index out of bounds: {item}") + msg = f"Card index out of bounds: {item}" + raise IndexError(msg) return self.cards[item] def __iter__(self) -> Iterator[Card[C]]: # type: ignore diff --git a/codenames/generic/move.py b/codenames/generic/move.py index 218b726..f230342 100644 --- a/codenames/generic/move.py +++ b/codenames/generic/move.py @@ -61,7 +61,8 @@ def __str__(self) -> str: def correct(self) -> bool: card_color = self.guessed_card.color if not card_color: - raise ValueError(f"Card {self.guessed_card} has no color set") + msg = f"Card {self.guessed_card} has no color set" + raise ValueError(msg) return self.for_clue.team.as_card_color == card_color @property diff --git a/codenames/generic/player.py b/codenames/generic/player.py index 25ede7e..0f4ee3e 100644 --- a/codenames/generic/player.py +++ b/codenames/generic/player.py @@ -61,4 +61,4 @@ def give_clue(self, game_state: S) -> Clue: class Operative[C: CardColor, T: Team, S: OperativeState](Player[C, T], abc.ABC): @abc.abstractmethod def guess(self, game_state: S) -> Guess: - raise NotImplementedError() + raise NotImplementedError diff --git a/codenames/mini/state.py b/codenames/mini/state.py index edea1c0..e4afd68 100644 --- a/codenames/mini/state.py +++ b/codenames/mini/state.py @@ -19,16 +19,14 @@ def is_sudden_death(self) -> bool: def process_guess(self, guess: Guess) -> DuetGivenGuess | None: given_guess = super().process_guess(guess) - # If the guess is wrong or passed the turn, the timer is updated - if not given_guess or not given_guess.correct: - self._update_tokens(mistake=given_guess is not None) + # If the guess is correct, there is nothing to do + if given_guess and given_guess.correct: return given_guess - # If we reached our target score, and we are not in "sudden death", we consume a timer token - if self.is_game_over and not self.is_sudden_death: - self._update_tokens(mistake=False) + # Otherwise, the guess was incorrect or the operator passed the turn + self._update_tokens(is_mistake=given_guess is not None) return given_guess - def _update_tokens(self, mistake: bool) -> None: + def _update_tokens(self, is_mistake: bool) -> None: if self.timer_tokens >= 0: self.timer_tokens -= 1 if self.timer_tokens == 0: @@ -37,7 +35,7 @@ def _update_tokens(self, mistake: bool) -> None: elif self.timer_tokens < 0: self.game_result = TIMER_TOKENS_DEPLETED log.info("Timer tokens depleted (after sudden death)!") - if not mistake: + if not is_mistake: return self.allowed_mistakes -= 1 if self.allowed_mistakes == 0: diff --git a/codenames/online/codenames_game/adapter.py b/codenames/online/codenames_game/adapter.py index 8306bef..d3d6909 100644 --- a/codenames/online/codenames_game/adapter.py +++ b/codenames/online/codenames_game/adapter.py @@ -5,13 +5,12 @@ from dataclasses import dataclass from enum import StrEnum from time import sleep -from typing import Callable, Mapping +from typing import TYPE_CHECKING, Callable, Mapping from selenium import webdriver from selenium.common import ElementNotInteractableException from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By -from selenium.webdriver.remote.webelement import WebElement from codenames.classic.board import ClassicBoard from codenames.generic.move import PASS_GUESS, Clue, Guess @@ -28,6 +27,9 @@ ) from codenames.utils.formatting import wrap +if TYPE_CHECKING: + from selenium.webdriver.remote.webelement import WebElement + log = logging.getLogger(__name__) WEBAPP_URL = "https://codenames.game/" @@ -279,7 +281,8 @@ def get_card_containers(self) -> list[WebElement]: card_elements = self.driver.find_elements(by=By.CLASS_NAME, value="card") card_elements = [element for element in card_elements if element.text != ""] if len(card_elements) < 25: - raise ValueError(f"Expected 25 cards, loaded {len(card_elements)}") + msg = f"Expected 25 cards, loaded {len(card_elements)}" + raise ValueError(msg) return self.driver.find_elements(By.XPATH, value="//div[@role='img']") def get_clue_input(self) -> WebElement: @@ -343,11 +346,11 @@ def poll_elements[ log.debug(f"Polling [{len(element_getters)}] elements...") try: return poll_elements(element_getters, timeout_sec=timeout_sec, poll_interval_sec=poll_interval_sec) - except Exception as e: + except Exception: if screenshot: log.info(f"{self.log_prefix} Polling failed, saving screenshot...") self.screenshot("failed polling") - raise e + raise def screenshot(self, tag: str, raise_on_error: bool = False) -> str | None: return save_screenshot(adapter=self, tag=tag, raise_on_error=raise_on_error) diff --git a/codenames/online/codenames_game/card_parser.py b/codenames/online/codenames_game/card_parser.py index 9b8c166..5427197 100644 --- a/codenames/online/codenames_game/card_parser.py +++ b/codenames/online/codenames_game/card_parser.py @@ -49,10 +49,9 @@ def _parse_card_color(card_element: WebElement) -> ClassicColor: for css_class, classic_color in CSS_CLASS_TO_CLASSIC_COLOR.items(): if css_class.lower() in element_classes: return classic_color - raise ValueError(f"Could not parse card color from element classes: {element_classes}") + msg = f"Could not parse card color from element classes: {element_classes}" + raise ValueError(msg) def _is_card_revealed(card_container: WebElement) -> bool: # pylint: disable=unused-argument - if "revealed" in card_container.accessible_name: - return True - return False + return "revealed" in card_container.accessible_name diff --git a/codenames/online/codenames_game/runner.py b/codenames/online/codenames_game/runner.py index 1e85248..5a6f760 100644 --- a/codenames/online/codenames_game/runner.py +++ b/codenames/online/codenames_game/runner.py @@ -93,7 +93,7 @@ def all_players_screenshots(self, tag: str): try: adapter.screenshot(tag=tag) except Exception as e: # pylint: disable=broad-except - log.error(f"Error taking screenshot: {e}") + log.exception(f"Error taking screenshot: {e}") def run_game(self) -> ClassicGameRunner: self._start_game() @@ -103,9 +103,9 @@ def run_game(self) -> ClassicGameRunner: game_runner.guess_given_subscribers.append(self._handle_guess_given) try: game_runner.run_game() - except Exception as e: # pylint: disable=broad-except + except Exception: # pylint: disable=broad-except self.all_players_screenshots(tag="game error") - raise e + raise self.host.screenshot("game over") return game_runner @@ -164,7 +164,8 @@ def _get_adapter_for_player(self, player: Player) -> CodenamesGamePlayerAdapter: for adapter in self.adapters: if adapter.player == player: return adapter - raise ValueError(f"Player {player} not found in this game manager.") + msg = f"Player {player} not found in this game manager." + raise ValueError(msg) def _start_game(self) -> CodenamesGameRunner: if not self.host_connected: diff --git a/codenames/online/codenames_game/screenshot.py b/codenames/online/codenames_game/screenshot.py index 4b22dca..49f1014 100644 --- a/codenames/online/codenames_game/screenshot.py +++ b/codenames/online/codenames_game/screenshot.py @@ -25,7 +25,7 @@ def save_screenshot(adapter: "CodenamesGamePlayerAdapter", tag: str, raise_on_er adapter.driver.save_screenshot(path_abs) except Exception as e: # pylint: disable=broad-except if raise_on_error: - raise e + raise log.warning(f"Failed to save screenshot: {e}") return None log.info(f"{adapter.log_prefix} Screenshot saved to {path_abs}") diff --git a/codenames/online/utils.py b/codenames/online/utils.py index 4a2d839..1e1f520 100644 --- a/codenames/online/utils.py +++ b/codenames/online/utils.py @@ -38,7 +38,7 @@ def multi_click(element: WebElement, times: int = 3, warn: bool = False): def poll_elements[ T -](element_getters: list[Callable[[], T]], timeout_sec: float = 15, poll_interval_sec: float = 0.5,) -> T: +](element_getters: list[Callable[[], T]], timeout_sec: float = 15, poll_interval_sec: float = 0.5) -> T: def safe_getter() -> T | None: for element_getter in element_getters: try: diff --git a/codenames/utils/vocabulary/english.py b/codenames/utils/vocabulary/english.py index d78551b..3883278 100644 --- a/codenames/utils/vocabulary/english.py +++ b/codenames/utils/vocabulary/english.py @@ -409,5 +409,5 @@ "young", "youth", "zone", - } + }, ) diff --git a/codenames/utils/vocabulary/hebrew.py b/codenames/utils/vocabulary/hebrew.py index 36a2334..e88a287 100644 --- a/codenames/utils/vocabulary/hebrew.py +++ b/codenames/utils/vocabulary/hebrew.py @@ -424,5 +424,5 @@ "תרבות", "תרמיל", "תרסיס", - } + }, ) diff --git a/codenames/utils/vocabulary/languages.py b/codenames/utils/vocabulary/languages.py index e2c7216..a460bb3 100644 --- a/codenames/utils/vocabulary/languages.py +++ b/codenames/utils/vocabulary/languages.py @@ -18,4 +18,5 @@ def get_vocabulary(language: str) -> Vocabulary: return Vocabulary(language=language, words=ENGLISH_WORDS) if language == SupportedLanguage.HEBREW: return Vocabulary(language=language, words=HEBREW_WORDS) - raise NotImplementedError(f"Unknown language: {language}") + msg = f"Unknown language: {language}" + raise NotImplementedError(msg) diff --git a/pyproject.toml b/pyproject.toml index 54d8082..d19f481 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -106,8 +106,50 @@ line-length = 120 exclude = ["local", ".deployment"] [tool.ruff.lint] -select = ["B", "C", "E", "F", "W"] -ignore = [] +select = ["ALL"] +ignore = [ + "ARG", + "ANN001", + "ANN002", + "ANN003", + "ANN201", + "ANN202", + "ANN204", + "ANN401", + "BLE001", + "D", + "ERA001", + "EM101", + "FA", + "FBT001", + "FBT002", + "G004", + "N818", + "PERF203", + "PGH003", + "PGH004", + "PLR0911", + "PLR0913", + "PLR0915", + "PLR2004", + "PLW0603", + "PT011", + "PTH100", + "PTH103", + "PTH118", + "PYI063", + "RET504", + "RUF001", + "RUF012", + "S101", + "S311", + "SIM105", + "TC001", + "TRY003", + "TRY300", + "TRY401", + "UP035", +] [tool.black] line-length = 120 diff --git a/tests/classic/conftest.py b/tests/classic/conftest.py index f6ee480..9764c85 100644 --- a/tests/classic/conftest.py +++ b/tests/classic/conftest.py @@ -4,11 +4,11 @@ from tests.classic.utils import constants -@pytest.fixture() +@pytest.fixture def board_10() -> ClassicBoard: return constants.board_10() -@pytest.fixture() +@pytest.fixture def board_25() -> ClassicBoard: return constants.board_25() diff --git a/tests/classic/test_board.py b/tests/classic/test_board.py index 141362b..69c4b99 100644 --- a/tests/classic/test_board.py +++ b/tests/classic/test_board.py @@ -1,3 +1,5 @@ +import logging + import pytest from codenames.classic.board import ClassicBoard @@ -7,6 +9,8 @@ from codenames.utils.vocabulary.languages import SupportedLanguage, get_vocabulary from tests.classic.utils import constants +log = logging.getLogger(__name__) + def test_get_board_at_integer_index_returns_card(board_10: ClassicBoard): card = board_10[0] @@ -40,26 +44,29 @@ def test_get_board_at_float_index_raises_error(board_10: ClassicBoard): def test_two_integer_factors(): x, y = two_integer_factors(25) - assert x == 5 and y == 5 + assert x == 5 + assert y == 5 x, y = two_integer_factors(30) - assert x == 6 and y == 5 + assert x == 6 + assert y == 5 x, y = two_integer_factors(17) - assert x == 17 and y == 1 + assert x == 17 + assert y == 1 def test_str_is_printable_string(board_10: ClassicBoard, board_25: ClassicBoard): assert str(board_10) == board_10.printable_string - print() - print(board_10) + log.info("") + log.info(board_10) assert str(board_25) == board_25.printable_string - print() - print(board_25) + log.info("") + log.info(board_25) - print() - print(constants.hebrew_board().printable_string) + log.info("") + log.info(constants.hebrew_board().printable_string) @pytest.mark.parametrize( @@ -78,7 +85,11 @@ def test_basic_board_build(language: str): def test_build_board_with_params(): vocabulary = get_vocabulary(language=SupportedLanguage.ENGLISH) board = ClassicBoard.from_vocabulary( - vocabulary=vocabulary, board_size=17, assassin_amount=2, first_team=ClassicTeam.RED, seed=42 + vocabulary=vocabulary, + board_size=17, + assassin_amount=2, + first_team=ClassicTeam.RED, + seed=42, ) assert len(board.cards) == 17 assert len(board.revealed_cards) == 0 diff --git a/tests/classic/test_game_runner.py b/tests/classic/test_game_runner.py index 9cfe601..90968b5 100644 --- a/tests/classic/test_game_runner.py +++ b/tests/classic/test_game_runner.py @@ -39,19 +39,19 @@ def test_game_runner_notifies_all_players_on_clue_given(board_10: ClassicBoard): assert on_guess_given_mock.call_count == 5 * 4 assert on_guess_given_mock.call_args_list[0][1] == { - "given_guess": ClassicGivenGuess(for_clue=expected_given_clue_1, guessed_card=board_10[0]) + "given_guess": ClassicGivenGuess(for_clue=expected_given_clue_1, guessed_card=board_10[0]), } assert on_guess_given_mock.call_args_list[4][1] == { - "given_guess": ClassicGivenGuess(for_clue=expected_given_clue_1, guessed_card=board_10[1]) + "given_guess": ClassicGivenGuess(for_clue=expected_given_clue_1, guessed_card=board_10[1]), } assert on_guess_given_mock.call_args_list[8][1] == { - "given_guess": ClassicGivenGuess(for_clue=expected_given_clue_1, guessed_card=board_10[2]) + "given_guess": ClassicGivenGuess(for_clue=expected_given_clue_1, guessed_card=board_10[2]), } assert on_guess_given_mock.call_args_list[12][1] == { - "given_guess": ClassicGivenGuess(for_clue=expected_given_clue_2, guessed_card=board_10[4]) + "given_guess": ClassicGivenGuess(for_clue=expected_given_clue_2, guessed_card=board_10[4]), } assert on_guess_given_mock.call_args_list[16][1] == { - "given_guess": ClassicGivenGuess(for_clue=expected_given_clue_2, guessed_card=board_10[9]) + "given_guess": ClassicGivenGuess(for_clue=expected_given_clue_2, guessed_card=board_10[9]), } diff --git a/tests/classic/test_game_state.py b/tests/classic/test_game_state.py index bb56a2f..634d43f 100644 --- a/tests/classic/test_game_state.py +++ b/tests/classic/test_game_state.py @@ -102,13 +102,13 @@ def test_game_state_flow(board_10: ClassicBoard): given_guess=ClassicGivenGuess( for_clue=ClassicGivenClue(word="clue 1", card_amount=2, team=ClassicTeam.BLUE), guessed_card=ClassicCard(word="Card 0", color=ClassicColor.BLUE, revealed=True), - ) + ), ), GuessMove( given_guess=ClassicGivenGuess( for_clue=ClassicGivenClue(word="clue 1", card_amount=2, team=ClassicTeam.BLUE), guessed_card=ClassicCard(word="Card 1", color=ClassicColor.BLUE, revealed=True), - ) + ), ), PassMove(team=ClassicTeam.BLUE), ClueMove(given_clue=ClassicGivenClue(word="clue 2", card_amount=1, team=ClassicTeam.RED)), @@ -116,13 +116,13 @@ def test_game_state_flow(board_10: ClassicBoard): given_guess=ClassicGivenGuess( for_clue=ClassicGivenClue(word="clue 2", card_amount=1, team=ClassicTeam.RED), guessed_card=ClassicCard(word="Card 4", color=ClassicColor.RED, revealed=True), - ) + ), ), GuessMove( given_guess=ClassicGivenGuess( for_clue=ClassicGivenClue(word="clue 2", card_amount=1, team=ClassicTeam.RED), guessed_card=ClassicCard(word="Card 5", color=ClassicColor.RED, revealed=True), - ) + ), ), ClueMove(given_clue=ClassicGivenClue(word="clue 3", card_amount=2, team=ClassicTeam.BLUE)), PassMove(team=ClassicTeam.BLUE), @@ -131,7 +131,7 @@ def test_game_state_flow(board_10: ClassicBoard): given_guess=ClassicGivenGuess( for_clue=ClassicGivenClue(word="clue 4", card_amount=2, team=ClassicTeam.RED), guessed_card=ClassicCard(word="Card 9", color=ClassicColor.ASSASSIN, revealed=True), - ) + ), ), ] assert _get_moves(game_state) == expected_moves diff --git a/tests/duet/conftest.py b/tests/duet/conftest.py index 66247cc..a4bb315 100644 --- a/tests/duet/conftest.py +++ b/tests/duet/conftest.py @@ -4,16 +4,16 @@ from tests.duet.utils import constants -@pytest.fixture() +@pytest.fixture def board_10() -> DuetBoard: return constants.board_10() -@pytest.fixture() +@pytest.fixture def board_10_dual() -> DuetBoard: return constants.board_10_dual() -@pytest.fixture() +@pytest.fixture def board_25() -> DuetBoard: return constants.board_25() diff --git a/tests/mini/conftest.py b/tests/mini/conftest.py index 6f94b23..1e513ed 100644 --- a/tests/mini/conftest.py +++ b/tests/mini/conftest.py @@ -4,6 +4,6 @@ from tests.duet.utils import constants -@pytest.fixture() +@pytest.fixture def board_10() -> DuetBoard: return constants.board_10() diff --git a/tests/mini/test_game_runner.py b/tests/mini/test_game_runner.py index 759c075..e0e4d8e 100644 --- a/tests/mini/test_game_runner.py +++ b/tests/mini/test_game_runner.py @@ -17,8 +17,8 @@ def test_happy_flow(board_10: DuetBoard): DuetSide.SIDE_A: [ DictatedTurn(clue=Clue(word="A", card_amount=3), guesses=[0, 1, 4]), # Green, Green, Neutral DictatedTurn(clue=Clue(word="B", card_amount=2), guesses=[2, PASS_GUESS]), # Green, pass - DictatedTurn(clue=Clue(word="C", card_amount=2), guesses=[3]), # Green - ] + DictatedTurn(clue=Clue(word="C", card_amount=2), guesses=[3, PASS_GUESS]), # Green, pass (won't reach) + ], } players = build_players(turns_by_side=turns_by_side) state = MiniGameState.from_board(board=board_10) @@ -26,8 +26,8 @@ def test_happy_flow(board_10: DuetBoard): runner.run_game() assert runner.state.game_result == TARGET_REACHED - assert runner.state.timer_tokens == 2 - assert runner.state.allowed_mistakes == 3 + assert runner.state.timer_tokens == 3 # 5 - 1 (mistake) - 1 (pass) + assert runner.state.allowed_mistakes == 3 # 4 - 1 (mistake) assert len(runner.state.given_clues) == 3 assert len(runner.state.given_guesses) == 5 @@ -38,7 +38,7 @@ def test_timer_token_depleted(board_10: DuetBoard): DictatedTurn(clue=Clue(word="A", card_amount=3), guesses=[4]), # Neutral DictatedTurn(clue=Clue(word="B", card_amount=2), guesses=[PASS_GUESS]), # pass DictatedTurn(clue=Clue(word="NONE", card_amount=2), guesses=[4, 1, 5]), # Green, Neutral - ] + ], } players = build_players(turns_by_side=turns_by_side) state = MiniGameState.from_board(board=board_10) @@ -59,7 +59,7 @@ def test_mistake_limit_reached(board_10: DuetBoard): DictatedTurn(clue=Clue(word="A", card_amount=3), guesses=[4]), # Neutral DictatedTurn(clue=Clue(word="B", card_amount=2), guesses=[PASS_GUESS]), # pass DictatedTurn(clue=Clue(word="C", card_amount=2), guesses=[0, 1, 5]), # Green, Green, Neutral - ] + ], } players = build_players(turns_by_side=turns_by_side) state = MiniGameState.from_board(board=board_10) diff --git a/tests/utils/logging.py b/tests/utils/logging.py index d9dc344..54a411e 100644 --- a/tests/utils/logging.py +++ b/tests/utils/logging.py @@ -27,7 +27,7 @@ def configure_logging(): "level": logging.DEBUG, "handlers": ["console"], "propagate": False, - } + }, }, } dictConfig(config) diff --git a/tests/utils/moves.py b/tests/utils/moves.py index 8bc8a88..66278cf 100644 --- a/tests/utils/moves.py +++ b/tests/utils/moves.py @@ -9,7 +9,7 @@ class Move: @property def team_color(self) -> Team: - raise NotImplementedError() + raise NotImplementedError @dataclass @@ -66,7 +66,8 @@ def get_moves(given_clues: list[GivenClue], given_guesses: list[GivenGuess], cur def get_guesses_by_clues( - given_clues: list[GivenClue], given_guesses: list[GivenGuess] + given_clues: list[GivenClue], + given_guesses: list[GivenGuess], ) -> dict[GivenClue, list[GivenGuess]]: guesses_by_clues: dict[GivenClue, list[GivenGuess]] = {} for clue in given_clues: