From 84b0c8ba88823625b1f191450101a3c95dc94d92 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Mon, 22 Mar 2021 23:43:54 +1000 Subject: [PATCH] switch DeckID to a NewType Not sure at this point whether this will buy us much in the Python codebase over a simple int alias, but let's give it a go. --- pylib/anki/decks.py | 6 +++--- qt/aqt/deckbrowser.py | 20 ++++++++++---------- qt/aqt/sidebar.py | 14 ++++++++------ 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/pylib/anki/decks.py b/pylib/anki/decks.py index 726b4c46d..ddc7bfc6d 100644 --- a/pylib/anki/decks.py +++ b/pylib/anki/decks.py @@ -7,7 +7,7 @@ import copy import pprint import sys import traceback -from typing import Any, Dict, Iterable, List, Optional, Sequence, Tuple, Union +from typing import Any, Dict, Iterable, List, NewType, Optional, Sequence, Tuple, Union import anki # pylint: disable=unused-import import anki._backend.backend_pb2 as _pb @@ -39,7 +39,7 @@ DeckConfig = Union[FilteredDeck, Config] """ New/lrn/rev conf, from deck config""" QueueConfig = Dict[str, Any] -DeckID = int +DeckID = NewType("DeckID", int) class DecksDictProxy: @@ -301,7 +301,7 @@ class DeckManager: onto = 0 else: onto = int(ontoDeckDid) - self.reparent([int(draggedDeckDid)], onto) + self.reparent([DeckID(int(draggedDeckDid))], DeckID(onto)) # Deck configurations ############################################################# diff --git a/qt/aqt/deckbrowser.py b/qt/aqt/deckbrowser.py index e9dc373ef..ddf297189 100644 --- a/qt/aqt/deckbrowser.py +++ b/qt/aqt/deckbrowser.py @@ -9,7 +9,7 @@ from typing import Any import aqt from anki.collection import OpChanges -from anki.decks import DeckTreeNode +from anki.decks import DeckID, DeckTreeNode from anki.utils import intTime from aqt import AnkiQt, gui_hooks from aqt.deck_ops import add_deck_dialog, remove_decks, rename_deck, reparent_decks @@ -99,7 +99,7 @@ class DeckBrowser: self._on_create() elif cmd == "drag": source, target = arg.split(",") - self._handle_drag_and_drop(int(source), int(target or 0)) + self._handle_drag_and_drop(DeckID(int(source)), DeckID(int(target or 0))) elif cmd == "collapse": self._collapse(int(arg)) elif cmd == "v2upgrade": @@ -251,20 +251,20 @@ class DeckBrowser: def _showOptions(self, did: str) -> None: m = QMenu(self.mw) a = m.addAction(tr(TR.ACTIONS_RENAME)) - qconnect(a.triggered, lambda b, did=did: self._rename(int(did))) + qconnect(a.triggered, lambda b, did=did: self._rename(DeckID(int(did)))) a = m.addAction(tr(TR.ACTIONS_OPTIONS)) - qconnect(a.triggered, lambda b, did=did: self._options(did)) + qconnect(a.triggered, lambda b, did=did: self._options(DeckID(int(did)))) a = m.addAction(tr(TR.ACTIONS_EXPORT)) qconnect(a.triggered, lambda b, did=did: self._export(int(did))) a = m.addAction(tr(TR.ACTIONS_DELETE)) - qconnect(a.triggered, lambda b, did=did: self._delete(int(did))) + qconnect(a.triggered, lambda b, did=did: self._delete(DeckID(int(did)))) gui_hooks.deck_browser_will_show_options_menu(m, int(did)) m.exec_(QCursor.pos()) def _export(self, did: int) -> None: self.mw.onExport(did=did) - def _rename(self, did: int) -> None: + def _rename(self, did: DeckID) -> None: deck = self.mw.col.decks.get(did) current_name = deck["name"] new_name = getOnlyText(tr(TR.DECKS_NEW_DECK_NAME), default=current_name) @@ -273,10 +273,10 @@ class DeckBrowser: rename_deck(mw=self.mw, deck_id=did, new_name=new_name) - def _options(self, did: str) -> None: + def _options(self, did: DeckID) -> None: # select the deck first, because the dyn deck conf assumes the deck # we're editing is the current one - self.mw.col.decks.select(int(did)) + self.mw.col.decks.select(did) self.mw.onDeckConf() def _collapse(self, did: int) -> None: @@ -286,10 +286,10 @@ class DeckBrowser: node.collapsed = not node.collapsed self._renderPage(reuse=True) - def _handle_drag_and_drop(self, source: int, target: int) -> None: + def _handle_drag_and_drop(self, source: DeckID, target: DeckID) -> None: reparent_decks(mw=self.mw, parent=self.mw, deck_ids=[source], new_parent=target) - def _delete(self, did: int) -> None: + def _delete(self, did: DeckID) -> None: remove_decks(mw=self.mw, parent=self.mw, deck_ids=[did]) # Top buttons diff --git a/qt/aqt/sidebar.py b/qt/aqt/sidebar.py index 5fa54e8a0..57f947d64 100644 --- a/qt/aqt/sidebar.py +++ b/qt/aqt/sidebar.py @@ -8,7 +8,7 @@ from typing import Dict, Iterable, List, Optional, Tuple, cast import aqt from anki.collection import Config, OpChanges, SearchJoiner, SearchNode -from anki.decks import DeckTreeNode +from anki.decks import DeckID, DeckTreeNode from anki.errors import InvalidInput from anki.notes import Note from anki.tags import TagTreeNode @@ -603,12 +603,14 @@ class SidebarTreeView(QTreeView): self, sources: List[SidebarItem], target: SidebarItem ) -> bool: deck_ids = [ - source.id for source in sources if source.item_type == SidebarItemType.DECK + DeckID(source.id) + for source in sources + if source.item_type == SidebarItemType.DECK ] if not deck_ids: return False - new_parent = target.id + new_parent = DeckID(target.id) reparent_decks( mw=self.mw, parent=self.browser, deck_ids=deck_ids, new_parent=new_parent @@ -1161,7 +1163,7 @@ class SidebarTreeView(QTreeView): rename_deck( mw=self.mw, - deck_id=item.id, + deck_id=DeckID(item.id), new_name=new_name, after_rename=lambda: self.refresh( lambda other: other.item_type == SidebarItemType.DECK @@ -1284,9 +1286,9 @@ class SidebarTreeView(QTreeView): def _selected_items(self) -> List[SidebarItem]: return [self.model().item_for_index(idx) for idx in self.selectedIndexes()] - def _selected_decks(self) -> List[int]: + def _selected_decks(self) -> List[DeckID]: return [ - item.id + DeckID(item.id) for item in self._selected_items() if item.item_type == SidebarItemType.DECK ]