Skip to content

Commit

Permalink
Fix lint errors
Browse files Browse the repository at this point in the history
Create render_with_meta  in order to clarify different function signatures
  • Loading branch information
tomers committed Apr 21, 2024
1 parent 0a277e7 commit 3b43eed
Show file tree
Hide file tree
Showing 13 changed files with 77 additions and 50 deletions.
17 changes: 9 additions & 8 deletions src/labelle/_vendor/matplotlib/font_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
# - setWeights function needs improvement
# - 'light' is an invalid weight value, remove it.

from typing import Set
from collections import namedtuple
from functools import lru_cache
import logging
Expand Down Expand Up @@ -193,8 +194,8 @@ def win32FontDirectory():
"""
import winreg
try:
with winreg.OpenKey(winreg.HKEY_CURRENT_USER, MSFolders) as user:
return winreg.QueryValueEx(user, 'Fonts')[0]
with winreg.OpenKey(winreg.HKEY_CURRENT_USER, MSFolders) as user: # type: ignore[attr-defined]
return winreg.QueryValueEx(user, 'Fonts')[0] # type: ignore[attr-defined]
except OSError:
return os.path.join(os.environ['WINDIR'], 'Fonts')

Expand All @@ -205,17 +206,17 @@ def _get_win32_installed_fonts():
items = set()
# Search and resolve fonts listed in the registry.
for domain, base_dirs in [
(winreg.HKEY_LOCAL_MACHINE, [win32FontDirectory()]), # System.
(winreg.HKEY_CURRENT_USER, MSUserFontDirectories), # User.
(winreg.HKEY_LOCAL_MACHINE, [win32FontDirectory()]), # type: ignore[attr-defined] # System.
(winreg.HKEY_CURRENT_USER, MSUserFontDirectories), # type: ignore[attr-defined] # User.
]:
for base_dir in base_dirs:
for reg_path in MSFontDirectories:
try:
with winreg.OpenKey(domain, reg_path) as local:
for j in range(winreg.QueryInfoKey(local)[1]):
with winreg.OpenKey(domain, reg_path) as local: # type: ignore[attr-defined]
for j in range(winreg.QueryInfoKey(local)[1]): # type: ignore[attr-defined]
# value may contain the filename of the font or its
# absolute path.
key, value, tp = winreg.EnumValue(local, j)
key, value, tp = winreg.EnumValue(local, j) # type: ignore[attr-defined]
if not isinstance(value, str):
continue
try:
Expand Down Expand Up @@ -253,7 +254,7 @@ def findSystemFonts(fontpaths=None, fontext='ttf'):
available. A list of TrueType fonts are returned by default with
AFM fonts as an option.
"""
fontfiles = set()
fontfiles: Set[str] = set()
fontexts = get_fontext_synonyms(fontext)

if fontpaths is None:
Expand Down
6 changes: 4 additions & 2 deletions src/labelle/cli/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
PrintPreviewRenderEngine,
QrRenderEngine,
RenderContext,
RenderEngine,
TestPatternRenderEngine,
TextRenderEngine,
)
Expand Down Expand Up @@ -249,7 +250,7 @@ def run():
if args.max_length is not None and args.max_length < args.min_length:
raise CommandLineUsageError("Maximum length is less than minimum length")

render_engines = []
render_engines: list[RenderEngine] = []

if args.test_pattern:
render_engines.append(TestPatternRenderEngine(args.test_pattern))
Expand Down Expand Up @@ -306,6 +307,7 @@ def run():
)

# print or show the label
render: RenderEngine
if args.preview or args.preview_inverted or args.imagemagick or args.browser:
render = PrintPreviewRenderEngine(
render_engine=render_engine,
Expand Down Expand Up @@ -336,7 +338,7 @@ def run():
max_width_px=max_payload_len_px,
min_width_px=min_payload_len_px,
)
bitmap, _ = render.render(render_context)
bitmap, _ = render.render_with_meta(render_context)

device_manager = DeviceManager()
device_manager.scan()
Expand Down
2 changes: 1 addition & 1 deletion src/labelle/gui/q_device_selector.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

class QDeviceSelector(QToolBar):
_device_manager: OnlineDeviceManager
_selected_device: UsbDevice
_selected_device: UsbDevice | None

selectedDeviceChangedSignal = QtCore.pyqtSignal(name="selectedDeviceChangedSignal")

Expand Down
2 changes: 2 additions & 0 deletions src/labelle/gui/q_label_widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
PictureRenderEngine,
QrRenderEngine,
RenderContext,
RenderEngine,
TextRenderEngine,
)
from labelle.lib.render_engines.render_engine import RenderEngineException
Expand Down Expand Up @@ -372,6 +373,7 @@ def render_engine_impl(self):
BarcodeWithTextRenderEngine).
"""
render_engine: RenderEngine
if self.show_text_checkbox.isChecked():
render_engine = BarcodeWithTextRenderEngine(
content=self.label.text(),
Expand Down
14 changes: 10 additions & 4 deletions src/labelle/gui/q_labels_list.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import logging
from typing import Literal, Optional
from typing import Optional

from PIL import Image
from PyQt6 import QtCore
Expand Down Expand Up @@ -73,7 +73,7 @@ class QLabelList(QListWidget):
)
render_context: Optional[RenderContext]
itemWidget: TextDymoLabelWidget
dymo_labeler: DymoLabeler
dymo_labeler: Optional[DymoLabeler]
h_margin_mm: float
min_label_width_mm: Optional[float]
justify: str
Expand All @@ -89,6 +89,7 @@ def __init__(self, parent=None):
self.setDragDropMode(QAbstractItemView.DragDropMode.InternalMove)

def populate(self):
assert self.render_context is not None
for item_widget in [TextDymoLabelWidget(self.render_context)]:
item = QListWidgetItem(self)
item.setSizeHint(item_widget.sizeHint())
Expand All @@ -113,7 +114,7 @@ def update_params(
h_margin_mm: float,
min_label_width_mm: float,
render_context: RenderContext,
justify: Literal["left", "center", "right"] = "center",
justify: str = "center",
):
"""Update the render context used for rendering the label.
Expand Down Expand Up @@ -148,6 +149,8 @@ def _payload_render_engine(self):
return HorizontallyCombinedRenderEngine(render_engines=render_engines)

def render_preview(self):
assert self.dymo_labeler is not None
assert self.render_context is not None
render_engine = PrintPreviewRenderEngine(
render_engine=self._payload_render_engine,
justify=self.justify,
Expand All @@ -165,6 +168,8 @@ def render_preview(self):
self.renderPrintPreviewSignal.emit(bitmap)

def render_print(self):
assert self.dymo_labeler is not None
assert self.render_context is not None
render_engine = PrintPayloadRenderEngine(
render_engine=self._payload_render_engine,
justify=self.justify,
Expand All @@ -174,7 +179,7 @@ def render_print(self):
min_width_px=mm_to_px(self.min_label_width_mm),
)
try:
bitmap, _ = render_engine.render(self.render_context)
bitmap, _ = render_engine.render_with_meta(self.render_context)
except RenderEngineException as err:
crash_msg_box(self, "Render Engine Failed!", err)
bitmap = EmptyRenderEngine().render(self.render_context)
Expand All @@ -193,6 +198,7 @@ def contextMenuEvent(self, event):
event (QContextMenuEvent): The context menu event.
"""
assert self.render_context is not None
contextMenu = QMenu(self)
add_text: Optional[QAction] = contextMenu.addAction("Add Text")
add_qr: Optional[QAction] = contextMenu.addAction("Add QR")
Expand Down
2 changes: 1 addition & 1 deletion src/labelle/gui/q_settings_toolbar.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ def _init_elements(self):

def update_labeler_context(
self,
supported_tape_sizes: list[int],
supported_tape_sizes: tuple[int, ...],
installed_tape_size: int,
minimum_horizontal_margin_mm: float,
):
Expand Down
7 changes: 4 additions & 3 deletions src/labelle/lib/devices/dymo_labeler.py
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ def _raw_print_label(self, lines: list[list[int]]):


class DymoLabeler:
_device: UsbDevice
_device: UsbDevice | None
tape_size_mm: int

LABELER_DISTANCE_BETWEEN_PRINT_HEAD_AND_CUTTER_MM = 8.1
Expand Down Expand Up @@ -284,7 +284,7 @@ def labeler_margin_px(self) -> tuple[float, float]:
)

@property
def device(self) -> UsbDevice:
def device(self) -> UsbDevice | None:
return self._device

@device.setter
Expand Down Expand Up @@ -340,7 +340,8 @@ def print(
LOG.debug("Printing label..")
self._functions.print_label(label_matrix)
LOG.debug("Done printing.")
self._device.dispose()
if self._device is not None:
self._device.dispose()
LOG.debug("Cleaned up.")
except POSSIBLE_USB_ERRORS as e:
raise DymoLabelerPrintError(str(e)) from e
30 changes: 15 additions & 15 deletions src/labelle/lib/render_engines/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,19 @@
from labelle.lib.render_engines.text import TextRenderEngine

__all__ = [
BarcodeRenderEngine,
BarcodeWithTextRenderEngine,
EmptyRenderEngine,
HorizontallyCombinedRenderEngine,
MarginsRenderEngine,
NoContentError,
NoPictureFilePath,
PictureRenderEngine,
PrintPayloadRenderEngine,
PrintPreviewRenderEngine,
QrRenderEngine,
RenderContext,
RenderEngine,
TestPatternRenderEngine,
TextRenderEngine,
"BarcodeRenderEngine",
"BarcodeWithTextRenderEngine",
"EmptyRenderEngine",
"HorizontallyCombinedRenderEngine",
"MarginsRenderEngine",
"NoContentError",
"NoPictureFilePath",
"PictureRenderEngine",
"PrintPayloadRenderEngine",
"PrintPreviewRenderEngine",
"QrRenderEngine",
"RenderContext",
"RenderEngine",
"TestPatternRenderEngine",
"TextRenderEngine",
]
4 changes: 3 additions & 1 deletion src/labelle/lib/render_engines/horizontally_combined.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from __future__ import annotations

from typing import Sequence

from PIL import Image

from labelle.lib.render_engines.empty import EmptyRenderEngine
Expand All @@ -12,7 +14,7 @@ class HorizontallyCombinedRenderEngine(RenderEngine):

def __init__(
self,
render_engines: list[RenderEngine],
render_engines: Sequence[RenderEngine],
):
super().__init__()
self.render_engines = render_engines
Expand Down
17 changes: 12 additions & 5 deletions src/labelle/lib/render_engines/margins.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ def __init__(
self,
render_engine: RenderEngine,
mode: Literal["print", "preview"],
justify: Literal["left", "center", "right"] = "center",
justify: str = "center",
visible_horizontal_margin_px: float = 0,
labeler_margin_px: tuple[float, float] = (0, 0),
max_width_px: float | None = None,
Expand Down Expand Up @@ -53,7 +53,7 @@ def __init__(

def _calculate_visible_width(self, payload_width_px: int) -> float:
minimal_label_width_px = (
payload_width_px + self.visible_horizontal_margin_px * 2
payload_width_px + self.visible_horizontal_margin_px * 2.0
)
if self.max_width_px is not None and minimal_label_width_px > self.max_width_px:
raise BitmapTooBigError(minimal_label_width_px, self.max_width_px)
Expand All @@ -64,7 +64,12 @@ def _calculate_visible_width(self, payload_width_px: int) -> float:
label_width_px = minimal_label_width_px
return label_width_px

def render(self, context: RenderContext) -> tuple[Image.Image, dict[str, float]]:
def render(self, _: RenderContext) -> Image.Image:
raise RuntimeError("This should never be called")

def render_with_meta(
self, context: RenderContext
) -> tuple[Image.Image, dict[str, float]]:
payload_bitmap = self.render_engine.render(context)
payload_width_px = payload_bitmap.width
label_width_px = self._calculate_visible_width(payload_width_px)
Expand Down Expand Up @@ -102,10 +107,12 @@ def render(self, context: RenderContext) -> tuple[Image.Image, dict[str, float]]
# print head is already in offset from label's edge under the cutter
horizontal_offset_px -= self.labeler_horizontal_margin_px
# no need to add vertical margins to bitmap
bitmap_height = payload_bitmap.height
bitmap_height = float(payload_bitmap.height)
elif self.mode == "preview":
# add vertical margins to bitmap
bitmap_height = payload_bitmap.height + self.labeler_vertical_margin_px * 2
bitmap_height = (
float(payload_bitmap.height) + self.labeler_vertical_margin_px * 2.0
)
vertical_offset_px = self.labeler_vertical_margin_px

bitmap = Image.new("1", (math.ceil(label_width_px), math.ceil(bitmap_height)))
Expand Down
13 changes: 8 additions & 5 deletions src/labelle/lib/render_engines/print_payload.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
from __future__ import annotations

from typing import Literal

from PIL import Image

from labelle.lib.render_engines.margins import MarginsRenderEngine
Expand All @@ -13,7 +11,7 @@ class PrintPayloadRenderEngine(RenderEngine):
def __init__(
self,
render_engine: RenderEngine,
justify: Literal["left", "center", "right"] = "center",
justify: str = "center",
visible_horizontal_margin_px: float = 0,
labeler_margin_px: tuple[float, float] = (0, 0),
max_width_px: float | None = None,
Expand All @@ -30,5 +28,10 @@ def __init__(
min_width_px=min_width_px,
)

def render(self, context: RenderContext) -> tuple[Image.Image, dict[str, float]]:
return self.render_engine.render(context)
def render(self, _: RenderContext) -> Image.Image:
raise RuntimeError("This should never be called")

def render_with_meta(
self, context: RenderContext
) -> tuple[Image.Image, dict[str, float]]:
return self.render_engine.render_with_meta(context)
6 changes: 2 additions & 4 deletions src/labelle/lib/render_engines/print_preview.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
from __future__ import annotations

from typing import Literal

from darkdetect import isDark
from PIL import Image, ImageColor, ImageDraw, ImageOps

Expand All @@ -20,7 +18,7 @@ class PrintPreviewRenderEngine(RenderEngine):
def __init__(
self,
render_engine: RenderEngine,
justify: Literal["left", "center", "right"] = "center",
justify: str = "center",
visible_horizontal_margin_px: float = 0,
labeler_margin_px: tuple[float, float] = (0, 0),
max_width_px: float | None = None,
Expand Down Expand Up @@ -50,7 +48,7 @@ def _get_text_color():
return "white" if isDark() else "blue"

def _get_label_bitmap(self, context: RenderContext):
render_bitmap, meta = self.render_engine.render(context)
render_bitmap, meta = self.render_engine.render_with_meta(context)
bitmap = ImageOps.invert(render_bitmap.convert("L")).convert("RGBA")
pixel_map = {
"black": context.foreground_color,
Expand Down
7 changes: 6 additions & 1 deletion src/labelle/lib/render_engines/render_engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,9 @@ class RenderEngineException(Exception):
class RenderEngine(ABC):
@abstractmethod
def render(self, context: RenderContext) -> Image.Image:
pass
raise NotImplementedError()

def render_with_meta(
self, context: RenderContext
) -> tuple[Image.Image, dict[str, float] | None]:
return self.render(context), None

0 comments on commit 3b43eed

Please sign in to comment.