Skip to content

Commit e7b3051

Browse files
committed
fix(ci): address remaining pyright errors
1 parent a7b6636 commit e7b3051

6 files changed

Lines changed: 42 additions & 29 deletions

File tree

pyproject.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ include = ["src/tagstudio", "tests"]
102102
reportAny = false
103103
reportIgnoreCommentWithoutRule = false
104104
reportImplicitStringConcatenation = false
105+
reportImportCycles = false
105106
reportMissingTypeArgument = false
106107
reportMissingTypeStubs = false
107108
# reportOptionalMemberAccess = false
@@ -110,6 +111,7 @@ reportUnknownArgumentType = false
110111
reportUnknownLambdaType = false
111112
reportUnknownMemberType = false
112113
reportUnusedCallResult = false
114+
reportUninitializedInstanceVariable = false
113115

114116
[tool.ruff]
115117
exclude = ["home_ui.py", "resources.py", "resources_rc.py"]

src/tagstudio/qt/controllers/preview_thumb_controller.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,18 @@
44

55
import io
66
from pathlib import Path
7-
from typing import TYPE_CHECKING
7+
from typing import TYPE_CHECKING, override
88

99
import cv2
1010
import rawpy
1111
import structlog
1212
from PIL import Image, UnidentifiedImageError
1313
from PIL.Image import DecompressionBombError
1414
from PySide6.QtCore import QSize
15+
from rawpy import (
16+
LibRawFileUnsupportedError, # pyright: ignore[reportPrivateImportUsage]
17+
LibRawIOError, # pyright: ignore[reportPrivateImportUsage]
18+
)
1519

1620
from tagstudio.core.library.alchemy.library import Library
1721
from tagstudio.core.media_types import MediaCategories
@@ -50,8 +54,8 @@ def __get_image_stats(self, filepath: Path) -> FileAttributeData:
5054
stats.width = image.width
5155
stats.height = image.height
5256
except (
53-
rawpy.LibRawIOError,
54-
rawpy.LibRawFileUnsupportedError,
57+
LibRawIOError,
58+
LibRawFileUnsupportedError,
5559
FileNotFoundError,
5660
):
5761
pass
@@ -144,18 +148,22 @@ def display_file(self, filepath: Path) -> FileAttributeData:
144148
self._display_image(filepath)
145149
return self.__get_image_stats(filepath)
146150

151+
@override
147152
def _open_file_action_callback(self):
148153
open_file(
149154
self.__current_file, windows_start_command=self.__driver.settings.windows_start_command
150155
)
151156

157+
@override
152158
def _open_explorer_action_callback(self):
153159
open_file(self.__current_file, file_manager=True)
154160

161+
@override
155162
def _delete_action_callback(self):
156163
if bool(self.__current_file):
157164
self.__driver.delete_files_callback(self.__current_file)
158165

166+
@override
159167
def _button_wrapper_callback(self):
160168
open_file(
161169
self.__current_file, windows_start_command=self.__driver.settings.windows_start_command

src/tagstudio/qt/helpers/text_wrapper.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
def wrap_line(
99
text: str,
10-
font: ImageFont.ImageFont,
10+
font: ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont,
1111
width: int = 256,
1212
draw: ImageDraw.ImageDraw | None = None,
1313
) -> int:
@@ -31,7 +31,7 @@ def wrap_line(
3131

3232
def wrap_full_text(
3333
text: str,
34-
font: ImageFont.ImageFont,
34+
font: ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont,
3535
width: int = 256,
3636
draw: ImageDraw.ImageDraw | None = None,
3737
) -> str:

src/tagstudio/qt/previews/renderer.py

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ class _TarFile:
118118
def __init__(self, filepath: Path, mode: Literal["r"]) -> None:
119119
self.tar: tarfile.TarFile
120120
self.filepath = filepath
121-
self.mode = mode
121+
self.mode: Literal["r"] = mode
122122

123123
def namelist(self) -> list[str]:
124124
return self.tar.getnames()
@@ -127,10 +127,10 @@ def read(self, name: str) -> bytes:
127127
return unwrap(self.tar.extractfile(name)).read()
128128

129129
def __enter__(self) -> "_TarFile":
130-
self.tar = tarfile.open(self.filepath, self.mode).__enter__()
130+
self.tar = tarfile.open(name=self.filepath, mode=self.mode).__enter__()
131131
return self
132132

133-
def __exit__(self, *args) -> None:
133+
def __exit__(self, *args) -> None: # pyright: ignore[reportUnknownParameterType, reportMissingParameterType]
134134
self.tar.__exit__(*args)
135135

136136

@@ -293,7 +293,7 @@ def _render_mask(
293293

294294
im: Image.Image = Image.new(
295295
mode="L",
296-
size=tuple([d * smooth_factor for d in size]), # type: ignore
296+
size=tuple([d * smooth_factor for d in size]), # type: ignore # pyright: ignore[reportArgumentType]
297297
color="black",
298298
)
299299
draw = ImageDraw.Draw(im)
@@ -324,7 +324,7 @@ def _render_edge(
324324
# Highlight
325325
im_hl: Image.Image = Image.new(
326326
mode="RGBA",
327-
size=tuple([d * smooth_factor for d in size]), # type: ignore
327+
size=tuple([d * smooth_factor for d in size]), # type: ignore # pyright: ignore[reportArgumentType]
328328
color="#00000000",
329329
)
330330
draw = ImageDraw.Draw(im_hl)
@@ -343,7 +343,7 @@ def _render_edge(
343343
# Shadow
344344
im_sh: Image.Image = Image.new(
345345
mode="RGBA",
346-
size=tuple([d * smooth_factor for d in size]), # type: ignore
346+
size=tuple([d * smooth_factor for d in size]), # type: ignore # pyright: ignore[reportArgumentType]
347347
color="#00000000",
348348
)
349349
draw = ImageDraw.Draw(im_sh)
@@ -388,21 +388,21 @@ def _render_center_icon(
388388
# Create larger blank image based on smooth_factor
389389
im: Image.Image = Image.new(
390390
"RGBA",
391-
size=tuple([d * smooth_factor for d in size]), # type: ignore
391+
size=tuple([d * smooth_factor for d in size]), # type: ignore # pyright: ignore[reportArgumentType]
392392
color="#FF000000",
393393
)
394394

395395
# Create solid background color
396396
bg: Image.Image
397397
bg = Image.new(
398398
"RGB",
399-
size=tuple([d * smooth_factor for d in size]), # type: ignore
399+
size=tuple([d * smooth_factor for d in size]), # type: ignore # pyright: ignore[reportArgumentType]
400400
color="#000000FF",
401401
)
402402

403403
# Use a background image if provided
404404
if bg_image:
405-
bg_im = Image.Image.resize(bg_image, size=tuple([d * smooth_factor for d in size])) # type: ignore
405+
bg_im = Image.Image.resize(bg_image, size=tuple([d * smooth_factor for d in size])) # type: ignore # pyright: ignore[reportArgumentType]
406406
bg_im = ImageEnhance.Brightness(bg_im).enhance(0.3) # Reduce the brightness
407407
bg.paste(bg_im)
408408

@@ -411,7 +411,7 @@ def _render_center_icon(
411411
bg,
412412
(0, 0),
413413
mask=self._get_mask(
414-
tuple([d * smooth_factor for d in size]), # type: ignore
414+
tuple([d * smooth_factor for d in size]), # type: ignore # pyright: ignore[reportArgumentType]
415415
(pixel_ratio * smooth_factor),
416416
),
417417
)
@@ -495,19 +495,19 @@ def _render_corner_icon(
495495
# Create larger blank image based on smooth_factor
496496
im: Image.Image = Image.new(
497497
"RGBA",
498-
size=tuple([d * smooth_factor for d in size]), # type: ignore
498+
size=tuple([d * smooth_factor for d in size]), # type: ignore # pyright: ignore[reportArgumentType]
499499
color="#00000000",
500500
)
501501

502502
bg: Image.Image
503503
# Use a background image if provided
504504
if bg_image:
505-
bg = Image.Image.resize(bg_image, size=tuple([d * smooth_factor for d in size])) # type: ignore
505+
bg = Image.Image.resize(bg_image, size=tuple([d * smooth_factor for d in size])) # type: ignore # pyright: ignore[reportArgumentType]
506506
# Create solid background color
507507
else:
508508
bg = Image.new(
509509
"RGB",
510-
size=tuple([d * smooth_factor for d in size]), # type: ignore
510+
size=tuple([d * smooth_factor for d in size]), # type: ignore # pyright: ignore[reportArgumentType]
511511
color="#000000",
512512
)
513513
# Apply color overlay
@@ -521,7 +521,7 @@ def _render_corner_icon(
521521
bg,
522522
(0, 0),
523523
mask=self._get_mask(
524-
tuple([d * smooth_factor for d in size]), # type: ignore
524+
tuple([d * smooth_factor for d in size]), # type: ignore # pyright: ignore[reportArgumentType]
525525
(pixel_ratio * smooth_factor),
526526
),
527527
)
@@ -662,17 +662,17 @@ def _audio_album_thumb(filepath: Path, ext: str) -> Image.Image | None:
662662
artwork = None
663663
if ext in [".mp3"]:
664664
id3_tags: id3.ID3 = id3.ID3(filepath)
665-
id3_covers: list = id3_tags.getall("APIC")
665+
id3_covers: list = id3_tags.getall("APIC") # pyright: ignore[reportUnknownVariableType]
666666
if id3_covers:
667667
artwork = Image.open(BytesIO(id3_covers[0].data))
668668
elif ext in [".flac"]:
669669
flac_tags: flac.FLAC = flac.FLAC(filepath)
670-
flac_covers: list = flac_tags.pictures
670+
flac_covers: list = flac_tags.pictures # pyright: ignore[reportUnknownVariableType]
671671
if flac_covers:
672672
artwork = Image.open(BytesIO(flac_covers[0].data))
673673
elif ext in [".mp4", ".m4a", ".aac"]:
674674
mp4_tags: mp4.MP4 = mp4.MP4(filepath)
675-
mp4_covers: list | None = mp4_tags.get("covr") # pyright: ignore[reportAssignmentType]
675+
mp4_covers: list | None = mp4_tags.get("covr") # pyright: ignore[reportUnknownVariableType]
676676
if mp4_covers:
677677
artwork = Image.open(BytesIO(mp4_covers[0]))
678678
if artwork:
@@ -1088,7 +1088,7 @@ def _font_long_thumb(filepath: Path, size: int) -> Image.Image | None:
10881088
font = ImageFont.truetype(filepath, size=font_size)
10891089
text_wrapped: str = wrap_full_text(
10901090
FONT_SAMPLE_TEXT,
1091-
font=font, # pyright: ignore[reportArgumentType]
1091+
font=font,
10921092
width=size,
10931093
draw=draw,
10941094
)
@@ -1120,8 +1120,8 @@ def _image_raw_thumb(filepath: Path) -> Image.Image | None:
11201120
)
11211121
except (
11221122
DecompressionBombError,
1123-
rawpy.LibRawIOError,
1124-
rawpy.LibRawFileUnsupportedError,
1123+
rawpy.LibRawIOError, # pyright: ignore[reportPrivateImportUsage]
1124+
rawpy.LibRawFileUnsupportedError, # pyright: ignore[reportPrivateImportUsage]
11251125
) as e:
11261126
logger.error("Couldn't render thumbnail", filepath=filepath, error=type(e).__name__)
11271127
return im
@@ -1137,6 +1137,7 @@ def _image_exr_thumb(filepath: Path) -> Image.Image | None:
11371137
try:
11381138
# Load the EXR data to an array and rotate the color space from BGRA -> RGBA
11391139
raw_array = cv2.imread(str(filepath), cv2.IMREAD_UNCHANGED)
1140+
assert raw_array
11401141
raw_array[..., :3] = raw_array[..., 2::-1]
11411142

11421143
# Correct the gamma of the raw array
@@ -1209,7 +1210,7 @@ def _image_vector_thumb(filepath: Path, size: int) -> Image.Image:
12091210
# Write the image to a buffer as png
12101211
buffer: QBuffer = QBuffer()
12111212
buffer.open(QBuffer.OpenModeFlag.ReadWrite)
1212-
q_image.save(buffer, "PNG") # type: ignore[call-overload]
1213+
q_image.save(device=buffer, format="PNG") # type: ignore # pyright: ignore[reportArgumentType]
12131214

12141215
# Load the image from the buffer
12151216
im = Image.new("RGB", (size, size), color="#1e1e1e")
@@ -1258,7 +1259,7 @@ def get_image(path: str) -> Image.Image | None:
12581259
return im
12591260

12601261
@staticmethod
1261-
def _model_stl_thumb(filepath: Path, size: int) -> Image.Image | None:
1262+
def _model_stl_thumb(filepath: Path, size: int) -> Image.Image | None: # pyright: ignore[reportUnusedParameter]
12621263
"""Render a thumbnail for an STL file.
12631264
12641265
Args:
@@ -1614,6 +1615,7 @@ def render_ignored(
16141615

16151616
def fetch_cached_image(file_name: Path):
16161617
image: Image.Image | None = None
1618+
assert self.driver.cache_manager
16171619
cached_path = self.driver.cache_manager.get_file_path(file_name)
16181620

16191621
if cached_path and cached_path.is_file():
@@ -1876,6 +1878,7 @@ def _render(
18761878
image = self._resize_image(image, (adj_size, adj_size))
18771879

18781880
if save_to_file and savable_media_type and image:
1881+
assert self.driver.cache_manager
18791882
self.driver.cache_manager.save_image(image, save_to_file, mode="RGBA")
18801883

18811884
except (

src/tagstudio/qt/utils/custom_runnable.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from PySide6.QtCore import QObject, QRunnable, Signal
66

77

8-
class CustomRunnable(QRunnable, QObject):
8+
class CustomRunnable(QRunnable, QObject): # pyright: ignore[reportUnsafeMultipleInheritance]
99
done = Signal()
1010

1111
def __init__(self, function) -> None:

tests/qt/test_tag_search_panel.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def test_tag_widget_actions_replaced_correctly(qtbot: QtBot, qt_driver: QtDriver
2929
# Set the widget
3030
tags = library.tags
3131
panel.set_tag_widget(tags[0], 0)
32-
tag_widget: TagWidget = panel.scroll_layout.itemAt(0).widget()
32+
tag_widget: TagWidget = panel.scroll_layout.itemAt(0).widget() # pyright: ignore[reportAssignmentType]
3333

3434
should_replace_actions = {
3535
tag_widget: ["on_edit()", "on_remove()"],

0 commit comments

Comments
 (0)