From 6771ec920537114b86e986fcaef22bb4c0813b63 Mon Sep 17 00:00:00 2001 From: Cameron Blankenbuehler Date: Mon, 29 May 2023 21:21:29 -0400 Subject: [PATCH] Add mypy fix some typing errors --- boggler/board_randomizer.py | 6 ++-- boggler/boggler_utils.py | 34 +++++++++--------- poetry.lock | 72 ++++++++++++++++++++++++++++++++++++- pyproject.toml | 1 + 4 files changed, 91 insertions(+), 22 deletions(-) diff --git a/boggler/board_randomizer.py b/boggler/board_randomizer.py index d3e4a8a..859b037 100755 --- a/boggler/board_randomizer.py +++ b/boggler/board_randomizer.py @@ -4,9 +4,9 @@ from random import randint, shuffle from math import sqrt, floor from pathlib import Path -def read_dice_file(dice_path: str): +def read_dice_file(dice_path: Path): '''Return list of die strings from file ignoring all comments (#)''' - with open(Path.absolute(dice_path), 'r+', encoding="utf-8") as file: + with open(dice_path, 'r+', encoding="utf-8") as file: return [line.rstrip().split(',') for line in file.readlines() if line[0] != "#"] def roll_die(die: str): @@ -44,5 +44,3 @@ if __name__ == '__main__': print(board[r]) except Exception as e: print("Argument must be a valid file path!", file=stderr) - - diff --git a/boggler/boggler_utils.py b/boggler/boggler_utils.py index 0d38018..4966a34 100755 --- a/boggler/boggler_utils.py +++ b/boggler/boggler_utils.py @@ -9,10 +9,10 @@ import operator class BoardCell: '''Boggle Board cell''' def __init__(self, row: int, col: int, letters: str, - adjacent_cells: list[BoardCell] = None) -> BoardCell: + adjacent_cells: list[BoardCell] = None) -> None: self.__row: int = row self.__col: int = col - self.__pos: tuple(int, int) = (self.__row, self.__col) + self.__pos: tuple[int, int] = (self.__row, self.__col) self.__letters: str = letters self.__adjacent_cells: list[BoardCell] = adjacent_cells @@ -53,11 +53,11 @@ class BoardCell: class BoggleBoard: '''Boggle board structure''' - def __init__(self, board: list[list[str]], max_word_len: int = 14) -> BoggleBoard: + def __init__(self, board: list[list[str]], max_word_len: int = 14) -> None: self.__height: int = len(board) self.__width: int = len(board[0]) if self.__height > 0 else 0 self.__board_list = board - self.__board: dict[(int, int), BoardCell] = {} + self.__board: dict[tuple[int, int], BoardCell] = {} # Max word length is limited by size of the board self.__max_word_len = min(max_word_len, self.__width * self.__height) @@ -104,7 +104,7 @@ class BoggleBoard: return self.__max_word_len @property - def board(self) -> dict[(int, int), BoardCell]: + def board(self) -> dict[tuple[int, int], BoardCell]: '''Getter for board property''' return self.__board @@ -129,14 +129,14 @@ class BoggleBoard: indexes.append((row, col+1)) # right return indexes - def get_cell(self, row: int, col: int) -> str: + def get_cell(self, row: int, col: int) -> BoardCell: '''Return the value at the specified row x column''' return self.__board[(row, col)] class WordNode: '''A node describing a single letter in a WordTree.''' def __init__(self, letters: str, is_word: bool = False, parent: WordNode = None, - children: dict[str, WordNode] = None, board_pos = None) -> WordNode: + children: dict[str, WordNode] = None, board_pos = (None, None)) -> None: self.__letters = letters self.__is_word = is_word self.__children = children if children is not None else {} @@ -200,14 +200,14 @@ class WordNode: class WordTree: '''A tree populated by WordNode(s) to complete words from a given root letter and wordlist''' - def __init__(self, alphabet: list, root: WordNode, words: list[str] = None, - max_word_len = 16) -> WordTree: - self.__alphabet: list = alphabet - self.__wordlist: list[str] = words - self.__root: WordNode = root - self.__max_word_len: int = max_word_len + def __init__(self, alphabet: list[str], root: WordNode, words: list[str] = None, + max_word_len = 16) -> None: + self.__alphabet = alphabet + self.__wordlist = words + self.__root = root + self.__max_word_len = max_word_len self.__tree: dict[str, WordNode] = {} - self.__word_paths: dict[str, list[WordNode]] = [] + self.__word_paths: list[str, list[WordNode]] = [] # Generate root node self.__tree[root.letters] = root @@ -330,7 +330,7 @@ class WordTree: log.debug(f"MAX WORD LENGTH REACHED! len = {word_len}") subtree.active_node = subtree.active_node.parent self.active_node = self.active_node.parent - return + return subtree # TODO rework active_node refs for recursion so don't have to be reset to parent at every point of return if self.active_node.is_word and len(self.active_node.children) == 0: @@ -339,7 +339,7 @@ class WordTree: log.debug("1: WORD FOUND: %s %s", "".join([board.board[x].letters for x in word_path]), word_path) self.active_node = self.active_node.parent subtree.active_node = subtree.active_node.parent - return + return subtree elif self.active_node.is_word: word_path = subtree.active_node.path[::-1] subtree.word_paths.append((subtree.active_node.get_word(board), word_path)) @@ -371,7 +371,7 @@ def build_full_boggle_tree(board: BoggleBoard, wordlist_path: Path) -> dict[str, '''Return dictionary of WordTree(s) for every letter on a BoggleBoard''' alphabet = sorted(set([cell.letters for cell in board.board.values()])) board_tree = {} - index = {} + index: dict[str] = {} log.info("Reading in wordlists...") for letters in alphabet: diff --git a/poetry.lock b/poetry.lock index 4018949..3c9c001 100644 --- a/poetry.lock +++ b/poetry.lock @@ -131,6 +131,64 @@ files = [ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] +[[package]] +name = "mypy" +version = "1.3.0" +description = "Optional static typing for Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mypy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c1eb485cea53f4f5284e5baf92902cd0088b24984f4209e25981cc359d64448d"}, + {file = "mypy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4c99c3ecf223cf2952638da9cd82793d8f3c0c5fa8b6ae2b2d9ed1e1ff51ba85"}, + {file = "mypy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:550a8b3a19bb6589679a7c3c31f64312e7ff482a816c96e0cecec9ad3a7564dd"}, + {file = "mypy-1.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cbc07246253b9e3d7d74c9ff948cd0fd7a71afcc2b77c7f0a59c26e9395cb152"}, + {file = "mypy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:a22435632710a4fcf8acf86cbd0d69f68ac389a3892cb23fbad176d1cddaf228"}, + {file = "mypy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6e33bb8b2613614a33dff70565f4c803f889ebd2f859466e42b46e1df76018dd"}, + {file = "mypy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7d23370d2a6b7a71dc65d1266f9a34e4cde9e8e21511322415db4b26f46f6b8c"}, + {file = "mypy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:658fe7b674769a0770d4b26cb4d6f005e88a442fe82446f020be8e5f5efb2fae"}, + {file = "mypy-1.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6e42d29e324cdda61daaec2336c42512e59c7c375340bd202efa1fe0f7b8f8ca"}, + {file = "mypy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:d0b6c62206e04061e27009481cb0ec966f7d6172b5b936f3ead3d74f29fe3dcf"}, + {file = "mypy-1.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:76ec771e2342f1b558c36d49900dfe81d140361dd0d2df6cd71b3db1be155409"}, + {file = "mypy-1.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebc95f8386314272bbc817026f8ce8f4f0d2ef7ae44f947c4664efac9adec929"}, + {file = "mypy-1.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:faff86aa10c1aa4a10e1a301de160f3d8fc8703b88c7e98de46b531ff1276a9a"}, + {file = "mypy-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:8c5979d0deb27e0f4479bee18ea0f83732a893e81b78e62e2dda3e7e518c92ee"}, + {file = "mypy-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c5d2cc54175bab47011b09688b418db71403aefad07cbcd62d44010543fc143f"}, + {file = "mypy-1.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:87df44954c31d86df96c8bd6e80dfcd773473e877ac6176a8e29898bfb3501cb"}, + {file = "mypy-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:473117e310febe632ddf10e745a355714e771ffe534f06db40702775056614c4"}, + {file = "mypy-1.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:74bc9b6e0e79808bf8678d7678b2ae3736ea72d56eede3820bd3849823e7f305"}, + {file = "mypy-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:44797d031a41516fcf5cbfa652265bb994e53e51994c1bd649ffcd0c3a7eccbf"}, + {file = "mypy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ddae0f39ca146972ff6bb4399f3b2943884a774b8771ea0a8f50e971f5ea5ba8"}, + {file = "mypy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1c4c42c60a8103ead4c1c060ac3cdd3ff01e18fddce6f1016e08939647a0e703"}, + {file = "mypy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e86c2c6852f62f8f2b24cb7a613ebe8e0c7dc1402c61d36a609174f63e0ff017"}, + {file = "mypy-1.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f9dca1e257d4cc129517779226753dbefb4f2266c4eaad610fc15c6a7e14283e"}, + {file = "mypy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:95d8d31a7713510685b05fbb18d6ac287a56c8f6554d88c19e73f724a445448a"}, + {file = "mypy-1.3.0-py3-none-any.whl", hash = "sha256:a8763e72d5d9574d45ce5881962bc8e9046bf7b375b0abf031f3e6811732a897"}, + {file = "mypy-1.3.0.tar.gz", hash = "sha256:e1f4d16e296f5135624b34e8fb741eb0eadedca90862405b1f1fde2040b9bd11"}, +] + +[package.dependencies] +mypy-extensions = ">=1.0.0" +typing-extensions = ">=3.10" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +install-types = ["pip"] +python2 = ["typed-ast (>=1.4.0,<2)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + [[package]] name = "packaging" version = "23.1" @@ -233,6 +291,18 @@ files = [ {file = "tomlkit-0.11.8.tar.gz", hash = "sha256:9330fc7faa1db67b541b28e62018c17d20be733177d290a13b24c62d1614e0c3"}, ] +[[package]] +name = "typing-extensions" +version = "4.6.2" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.6.2-py3-none-any.whl", hash = "sha256:3a8b36f13dd5fdc5d1b16fe317f5668545de77fa0b8e02006381fd49d731ab98"}, + {file = "typing_extensions-4.6.2.tar.gz", hash = "sha256:06006244c70ac8ee83fa8282cb188f697b8db25bc8b4df07be1873c43897060c"}, +] + [[package]] name = "wrapt" version = "1.15.0" @@ -321,4 +391,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "bf961bbdd90c506c2048c1e7493c013434938bb8bd2ddfe9d260fdae5462b444" +content-hash = "a14e3d6fa508612e47f2dab1d5068300be5735fce187ae7543b198ed57eede70" diff --git a/pyproject.toml b/pyproject.toml index ab8d3d7..2b147ab 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,6 +35,7 @@ boggler = "boggler.__main__:main" [tool.poetry.group.dev.dependencies] pytest = "^7.3.1" pylint = "^2.17.4" +mypy = "^1.3.0" [build-system] requires = ["poetry-core"]