Skip to content

Commit c1599c9

Browse files
fix: apply unwrap where necessary (#1113)
* fix: apply unwrap where necessary * fix: revert change that caused tests to fail * fix: revert removal of pyright ignore commet * fix: add missing ignore comments
1 parent 9319b6e commit c1599c9

File tree

8 files changed

+41
-29
lines changed

8 files changed

+41
-29
lines changed

src/tagstudio/core/library/alchemy/library.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1854,9 +1854,13 @@ def prefs(self, key: str | LibraryPrefs): # pyright: ignore[reportUnknownParame
18541854
# load given item from Preferences table
18551855
with Session(self.engine) as session:
18561856
if isinstance(key, LibraryPrefs):
1857-
return session.scalar(select(Preferences).where(Preferences.key == key.name)).value # pyright: ignore
1857+
return unwrap(
1858+
session.scalar(select(Preferences).where(Preferences.key == key.name))
1859+
).value # pyright: ignore[reportUnknownVariableType]
18581860
else:
1859-
return session.scalar(select(Preferences).where(Preferences.key == key)).value # pyright: ignore
1861+
return unwrap(
1862+
session.scalar(select(Preferences).where(Preferences.key == key))
1863+
).value # pyright: ignore[reportUnknownVariableType]
18601864

18611865
# TODO: Remove this once the 'preferences' table is removed.
18621866
@deprecated("Use `get_version() for version and `ts_ignore` system for extension exclusion.")

src/tagstudio/qt/helpers/gradients.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,18 @@
55

66
from PIL import Image
77

8+
from tagstudio.core.utils.types import unwrap
9+
810

911
def four_corner_gradient(
1012
image: Image.Image, size: tuple[int, int], mask: Image.Image | None = None
1113
) -> Image.Image:
1214
if image.size != size:
1315
# Four-Corner Gradient Background.
14-
tl = image.getpixel((0, 0))
15-
tr = image.getpixel(((image.size[0] - 1), 0))
16-
bl = image.getpixel((0, (image.size[1] - 1)))
17-
br = image.getpixel(((image.size[0] - 1), (image.size[1] - 1)))
16+
tl = unwrap(image.getpixel((0, 0)))
17+
tr = unwrap(image.getpixel(((image.size[0] - 1), 0)))
18+
bl = unwrap(image.getpixel((0, (image.size[1] - 1))))
19+
br = unwrap(image.getpixel(((image.size[0] - 1), (image.size[1] - 1))))
1820
bg = Image.new(mode="RGB", size=(2, 2))
1921
bg.paste(tl, (0, 0, 2, 2))
2022
bg.paste(tr, (1, 0, 2, 2))

src/tagstudio/qt/mixed/build_color.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from tagstudio.core.library.alchemy.enums import TagColorEnum
2424
from tagstudio.core.library.alchemy.library import Library, slugify
2525
from tagstudio.core.library.alchemy.models import TagColorGroup
26+
from tagstudio.core.utils.types import unwrap
2627
from tagstudio.qt.mixed.tag_color_preview import TagColorPreview
2728
from tagstudio.qt.mixed.tag_widget import (
2829
get_border_color,
@@ -126,8 +127,8 @@ def __init__(self, library: Library, color_group: TagColorGroup):
126127
self.border_checkbox.setFixedSize(22, 22)
127128
self.border_checkbox.clicked.connect(
128129
lambda checked: self.update_secondary(
129-
color=QColor(self.preview_button.tag_color_group.secondary)
130-
if self.preview_button.tag_color_group.secondary
130+
color=QColor(unwrap(self.preview_button.tag_color_group).secondary)
131+
if unwrap(self.preview_button.tag_color_group).secondary
131132
else None,
132133
color_border=checked,
133134
)

src/tagstudio/qt/mixed/build_tag.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from tagstudio.core.library.alchemy.enums import TagColorEnum
2929
from tagstudio.core.library.alchemy.library import Library
3030
from tagstudio.core.library.alchemy.models import Tag, TagColorGroup
31+
from tagstudio.core.utils.types import unwrap
3132
from tagstudio.qt.mixed.tag_color_preview import TagColorPreview
3233
from tagstudio.qt.mixed.tag_color_selection import TagColorSelection
3334
from tagstudio.qt.mixed.tag_search import TagSearchModal, TagSearchPanel
@@ -181,6 +182,7 @@ def __init__(self, library: Library, tag: Tag | None = None) -> None:
181182
self.color_layout.addWidget(self.color_title)
182183
self.color_button: TagColorPreview
183184
try:
185+
assert tag is not None
184186
self.color_button = TagColorPreview(self.lib, tag.color)
185187
except Exception as e:
186188
# TODO: Investigate why this happens during tests
@@ -316,7 +318,7 @@ def add_alias_callback(self):
316318
item = self.aliases_table.cellWidget(row, 1)
317319
item.setFocus()
318320

319-
def remove_alias_callback(self, alias_name: str, alias_id: int | None = None):
321+
def remove_alias_callback(self, alias_name: str, alias_id: int):
320322
logger.info("remove_alias_callback")
321323

322324
self.alias_ids.remove(alias_id)
@@ -468,7 +470,7 @@ def add_aliases(self):
468470

469471
def _update_new_alias_name_dict(self):
470472
for i in range(0, self.aliases_table.rowCount()):
471-
widget = self.aliases_table.cellWidget(i, 1)
473+
widget = cast(CustomTableItem, self.aliases_table.cellWidget(i, 1))
472474
self.new_alias_names[widget.id] = widget.text()
473475

474476
def _set_aliases(self):
@@ -574,8 +576,8 @@ def parent_post_init(self):
574576
self.setTabOrder(self.shorthand_field, self.aliases_add_button)
575577
self.setTabOrder(self.aliases_add_button, self.parent_tags_add_button)
576578
self.setTabOrder(self.parent_tags_add_button, self.color_button)
577-
self.setTabOrder(self.color_button, self.panel_cancel_button)
578-
self.setTabOrder(self.panel_cancel_button, self.panel_save_button)
579-
self.setTabOrder(self.panel_save_button, self.aliases_table.cellWidget(0, 1))
579+
self.setTabOrder(self.color_button, unwrap(self.panel_cancel_button))
580+
self.setTabOrder(unwrap(self.panel_cancel_button), unwrap(self.panel_save_button))
581+
self.setTabOrder(unwrap(self.panel_save_button), self.aliases_table.cellWidget(0, 1))
580582
self.name_field.selectAll()
581583
self.name_field.setFocus()

src/tagstudio/qt/mixed/color_box.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from tagstudio.core.constants import RESERVED_NAMESPACE_PREFIX
1414
from tagstudio.core.library.alchemy.enums import TagColorEnum
1515
from tagstudio.core.library.alchemy.models import TagColorGroup
16+
from tagstudio.core.utils.types import unwrap
1617
from tagstudio.qt.mixed.build_color import BuildColorPanel
1718
from tagstudio.qt.mixed.field_widget import FieldWidget
1819
from tagstudio.qt.mixed.tag_color_label import TagColorLabel
@@ -88,7 +89,7 @@ def set_colors(self, colors: Iterable[TagColorGroup]):
8889
color_widgets: list[TagColorLabel] = []
8990

9091
while self.base_layout.itemAt(0):
91-
self.base_layout.takeAt(0).widget().deleteLater()
92+
unwrap(self.base_layout.takeAt(0)).widget().deleteLater()
9293

9394
for color in colors_:
9495
color_widget = TagColorLabel(

src/tagstudio/qt/mixed/drop_import_modal.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
QWidget,
2222
)
2323

24+
from tagstudio.core.utils.types import unwrap
2425
from tagstudio.qt.mixed.progress_bar import ProgressWidget
2526
from tagstudio.qt.translations import Translations
2627

@@ -120,7 +121,9 @@ def collect_files_to_import(self, urls: list[QUrl]):
120121
continue
121122

122123
self.files.append(f)
123-
if (self.driver.lib.library_dir / self._get_relative_path(file)).exists():
124+
if (
125+
unwrap(self.driver.lib.library_dir) / self._get_relative_path(file)
126+
).exists():
124127
self.duplicate_files.append(f)
125128

126129
self.dirs_in_root.append(file.parent)
@@ -132,7 +135,7 @@ def collect_files_to_import(self, urls: list[QUrl]):
132135
file.parent
133136
) # to create relative path of files not in folder
134137

135-
if (Path(self.driver.lib.library_dir) / file.name).exists():
138+
if (Path(unwrap(self.driver.lib.library_dir)) / file.name).exists():
136139
self.duplicate_files.append(file)
137140

138141
def ask_duplicates_choice(self):
@@ -205,8 +208,10 @@ def copy_files(self):
205208
new_name = self._get_renamed_duplicate_filename(dest_file)
206209
dest_file = dest_file.with_name(new_name)
207210

208-
(self.driver.lib.library_dir / dest_file).parent.mkdir(parents=True, exist_ok=True)
209-
shutil.copyfile(file, self.driver.lib.library_dir / dest_file)
211+
(unwrap(self.driver.lib.library_dir) / dest_file).parent.mkdir(
212+
parents=True, exist_ok=True
213+
)
214+
shutil.copyfile(file, unwrap(self.driver.lib.library_dir) / dest_file)
210215

211216
file_count += 1
212217
yield [file_count, duplicated_files_progress]
@@ -226,7 +231,7 @@ def _get_renamed_duplicate_filename(self, filepath: Path) -> str:
226231
except ValueError:
227232
dot_idx = len(o_filename)
228233

229-
while (self.driver.lib.library_dir / filepath).exists():
234+
while (unwrap(self.driver.lib.library_dir) / filepath).exists():
230235
filepath = filepath.with_name(
231236
o_filename[:dot_idx] + f" ({index})" + o_filename[dot_idx:]
232237
)

src/tagstudio/qt/mixed/migration_modal.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
from tagstudio.core.library.alchemy.models import Entry, TagAlias
3838
from tagstudio.core.library.json.library import Library as JsonLibrary
3939
from tagstudio.core.library.json.library import Tag as JsonTag
40+
from tagstudio.core.utils.types import unwrap
4041
from tagstudio.qt.controllers.paged_panel_controller import PagedPanel
4142
from tagstudio.qt.controllers.paged_panel_state import PagedPanelState
4243
from tagstudio.qt.translations import Translations
@@ -561,7 +562,7 @@ def sanitize_json_field(value):
561562
sql_fields: list[tuple] = []
562563
json_fields: list[tuple] = []
563564

564-
sql_entry: Entry = self.sql_lib.get_entry_full(json_entry.id + 1)
565+
sql_entry: Entry = unwrap(self.sql_lib.get_entry_full(json_entry.id + 1))
565566
if not sql_entry:
566567
logger.info(
567568
"[Field Comparison]",
@@ -595,7 +596,7 @@ def sanitize_json_field(value):
595596
tags_count += 1
596597
json_tags = json_tags.union(value or [])
597598
else:
598-
key: str = self.sql_lib.get_field_name_from_id(int_key).name
599+
key: str = unwrap(self.sql_lib.get_field_name_from_id(int_key)).name
599600
json_fields.append((json_entry.id + 1, key, value))
600601
json_fields.sort()
601602

@@ -710,17 +711,15 @@ def check_alias_parity(self) -> bool:
710711

711712
def check_name_parity(self) -> bool:
712713
"""Check if all JSON tag names match the new SQL tag names."""
713-
sql_name: str = None
714-
json_name: str = None
715714

716715
def sanitize(value):
717716
"""Return value or convert a "not" value into None."""
718717
return value if value else None
719718

720719
for tag in self.sql_lib.tags:
721720
tag_id = tag.id # Tag IDs start at 0
722-
sql_name = sanitize(tag.name)
723-
json_name = sanitize(self.json_lib.get_tag(tag_id).name)
721+
sql_name: str = unwrap(sanitize(tag.name))
722+
json_name: str = unwrap(sanitize(self.json_lib.get_tag(tag_id).name))
724723

725724
logger.info(
726725
"[Name Parity]",
@@ -742,8 +741,6 @@ def sanitize(value):
742741

743742
def check_shorthand_parity(self) -> bool:
744743
"""Check if all JSON shorthands match the new SQL shorthands."""
745-
sql_shorthand: str = None
746-
json_shorthand: str = None
747744

748745
def sanitize(value):
749746
"""Return value or convert a "not" value into None."""

src/tagstudio/qt/previews/renderer.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -664,7 +664,7 @@ def _audio_album_thumb(filepath: Path, ext: str) -> Image.Image | None:
664664
artwork = Image.open(BytesIO(flac_covers[0].data))
665665
elif ext in [".mp4", ".m4a", ".aac"]:
666666
mp4_tags: mp4.MP4 = mp4.MP4(filepath)
667-
mp4_covers: list = mp4_tags.get("covr")
667+
mp4_covers: list = unwrap(mp4_tags.get("covr"))
668668
if mp4_covers:
669669
artwork = Image.open(BytesIO(mp4_covers[0]))
670670
if artwork:
@@ -1126,7 +1126,7 @@ def _image_thumb(filepath: Path) -> Image.Image:
11261126
new_bg = Image.new("RGB", im.size, color="#1e1e1e")
11271127
new_bg.paste(im, mask=im.getchannel(3))
11281128
im = new_bg
1129-
im = ImageOps.exif_transpose(im)
1129+
im = unwrap(ImageOps.exif_transpose(im))
11301130
except (
11311131
FileNotFoundError,
11321132
UnidentifiedImageError,

0 commit comments

Comments
 (0)