From 6aec41fbd85451a302fef477df5339a411d6a35d Mon Sep 17 00:00:00 2001 From: Alexandre Detiste Date: Sun, 10 Dec 2023 02:49:26 +0100 Subject: [PATCH] annotate --- src/escpos/capabilities.py | 18 +++++----- src/escpos/cli.py | 6 ++-- src/escpos/config.py | 9 ++--- src/escpos/constants.py | 2 +- src/escpos/escpos.py | 41 ++++++++++++--------- src/escpos/exceptions.py | 66 +++++++++++++++++----------------- src/escpos/image.py | 10 +++--- src/escpos/magicencode.py | 4 +-- src/escpos/printer/cups.py | 15 ++++---- src/escpos/printer/dummy.py | 14 ++++---- src/escpos/printer/file.py | 4 +-- src/escpos/printer/lp.py | 2 +- src/escpos/printer/network.py | 6 ++-- src/escpos/printer/serial.py | 6 ++-- src/escpos/printer/usb.py | 6 ++-- src/escpos/printer/win32raw.py | 4 +-- 16 files changed, 116 insertions(+), 97 deletions(-) diff --git a/src/escpos/capabilities.py b/src/escpos/capabilities.py index ae64f32..e58ef47 100644 --- a/src/escpos/capabilities.py +++ b/src/escpos/capabilities.py @@ -93,7 +93,7 @@ class NotSupported(Exception): BARCODE_B = "barcodeB" -class BaseProfile(object): +class BaseProfile: """This represents a printer profile. A printer profile knows about the number of columns, supported @@ -118,16 +118,18 @@ class BaseProfile(object): ) return font - def get_columns(self, font): + def get_columns(self, font) -> int: """Return the number of columns for the given font.""" font = self.get_font(font) - return self.fonts[str(font)]["columns"] + columns = self.fonts[str(font)]["columns"] + assert type(columns) is int + return columns - def supports(self, feature): + def supports(self, feature) -> bool: """Return true/false for the given feature.""" return self.features.get(feature) - def get_code_pages(self): + def get_code_pages(self) -> Dict[str, int]: """Return the support code pages as a ``{name: index}`` dict.""" return {v: k for k, v in self.codePages.items()} @@ -164,7 +166,7 @@ def get_profile_class(name: str) -> Type[BaseProfile]: return CLASS_CACHE[name] -def clean(s): +def clean(s: str) -> str: """Clean profile name.""" # Remove invalid characters s = re.sub("[^0-9a-zA-Z_]", "", s) @@ -183,14 +185,14 @@ class Profile(ProfileBaseClass): For users, who want to provide their own profile. """ - def __init__(self, columns=None, features=None): + def __init__(self, columns: Optional[int] = None, features=None) -> None: """Initialize profile.""" super(Profile, self).__init__() self.columns = columns self.features = features or {} - def get_columns(self, font): + def get_columns(self, font) -> int: """Get column count of printer.""" if self.columns is not None: return self.columns diff --git a/src/escpos/cli.py b/src/escpos/cli.py index 2f79507..2b91634 100644 --- a/src/escpos/cli.py +++ b/src/escpos/cli.py @@ -26,7 +26,7 @@ from . import version # Must be defined before it's used in DEMO_FUNCTIONS -def str_to_bool(string): +def str_to_bool(string: str) -> bool: """Convert string to bool. Used as a type in argparse so that we get back a proper @@ -561,7 +561,7 @@ def generate_parser() -> argparse.ArgumentParser: return parser -def main(): +def main() -> None: """Handle main entry point of CLI script. Handles loading of configuration and creating and processing of command @@ -619,7 +619,7 @@ def main(): globals()[target_command](**command_arguments) -def demo(printer, **kwargs): +def demo(printer, **kwargs) -> None: """Print demos. Called when CLI is passed `demo`. This function diff --git a/src/escpos/config.py b/src/escpos/config.py index f0d249b..3682c23 100644 --- a/src/escpos/config.py +++ b/src/escpos/config.py @@ -4,6 +4,7 @@ This module contains the implementations of abstract base class :py:class:`Confi """ import os import pathlib +from typing import Optional import appdirs import yaml @@ -11,7 +12,7 @@ import yaml from . import exceptions, printer -class Config(object): +class Config: """Configuration handler class. This class loads configuration from a default or specified directory. It @@ -21,7 +22,7 @@ class Config(object): _app_name = "python-escpos" _config_file = "config.yaml" - def __init__(self): + def __init__(self) -> None: """Initialize configuration. Remember to add anything that needs to be reset between configurations @@ -33,7 +34,7 @@ class Config(object): self._printer_name = None self._printer_config = None - def _reset_config(self): + def _reset_config(self) -> None: """Clear the loaded configuration. If we are loading a changed config, we don't want to have leftover @@ -45,7 +46,7 @@ class Config(object): self._printer_name = None self._printer_config = None - def load(self, config_path=None): + def load(self, config_path = None): """Load and parse the configuration file using pyyaml. :param config_path: An optional file path, file handle, or byte string diff --git a/src/escpos/constants.py b/src/escpos/constants.py index 5328f4e..fb05502 100644 --- a/src/escpos/constants.py +++ b/src/escpos/constants.py @@ -47,7 +47,7 @@ HW_RESET: bytes = ESC + b"\x3f\x0a\x00" # Reset printer hardware # Cash Drawer (ESC p ) _CASH_DRAWER = ( - lambda m, t1="", t2="": ESC + b"p" + m + six.int2byte(t1) + six.int2byte(t2) + lambda m, t1="", t2="": ESC + b"p" + m + bytes((t1, t2)) ) #: decimal cash drawer kick sequence diff --git a/src/escpos/escpos.py b/src/escpos/escpos.py index 64bc452..8816c98 100644 --- a/src/escpos/escpos.py +++ b/src/escpos/escpos.py @@ -15,7 +15,8 @@ import textwrap import warnings from abc import ABCMeta, abstractmethod # abstract base class support from re import match as re_match -from typing import List, Literal, Optional, Union +from types import TracebackType +from typing import List, Literal, Optional, Union, Any import barcode import qrcode @@ -107,8 +108,7 @@ SW_BARCODE_NAMES = { } -@six.add_metaclass(ABCMeta) -class Escpos(object): +class Escpos(object, metaclass=ABCMeta): """ESC/POS Printer object. This class is the abstract base class for an Esc/Pos-printer. The printer implementations are children of this @@ -164,7 +164,7 @@ class Escpos(object): """ pass - def _read(self): + def _read(self) -> bytes: """Read from printer. Returns a NotImplementedError if the instance of the class doesn't override this method. @@ -250,7 +250,7 @@ class Escpos(object): header = ( GS + b"v0" - + six.int2byte(density_byte) + + bytes((density_byte,)) + self._int_low_high(im.width_bytes, 2) + self._int_low_high(im.height, 2) ) @@ -263,8 +263,8 @@ class Escpos(object): ) tone = b"0" colors = b"1" - ym = six.int2byte(1 if high_density_vertical else 2) - xm = six.int2byte(1 if high_density_horizontal else 2) + ym = b"1" if high_density_vertical else b"2" + xm = b"1" if high_density_horizontal else b"2" header = tone + xm + ym + colors + img_header raster_data = im.to_raster_format() self._image_send_graphics_data(b"0", b"p", header + raster_data) @@ -857,7 +857,7 @@ class Escpos(object): image = my_code.writer._image self.image(image, impl=impl, center=center) - def text(self, txt): + def text(self, txt:str) -> None: """Print alpha-numeric text. The text has to be encoded in the currently selected codepage. @@ -868,7 +868,7 @@ class Escpos(object): """ self.magic.write(str(txt)) - def textln(self, txt=""): + def textln(self, txt: str = "") -> None: """Print alpha-numeric text with a newline. The text has to be encoded in the currently selected codepage. @@ -879,7 +879,7 @@ class Escpos(object): """ self.text("{}\n".format(txt)) - def ln(self, count=1): + def ln(self, count: int = 1) -> None: """Print a newline or more. :param count: number of newlines to print @@ -890,7 +890,7 @@ class Escpos(object): if count > 0: self.text("\n" * count) - def block_text(self, txt, font="0", columns=None): + def block_text(self, txt, font="0", columns=None) -> None: """Print text wrapped to specific columns. Text has to be encoded in unicode. @@ -1297,7 +1297,7 @@ class Escpos(object): return False return not (status[0] & RT_MASK_ONLINE) - def paper_status(self): + def paper_status(self) -> int: # could be IntEnum """Query the paper status of the printer. Returns 2 if there is plenty of paper, 1 if the paper has arrived to @@ -1314,6 +1314,8 @@ class Escpos(object): return 1 if status[0] & RT_MASK_PAPER == RT_MASK_PAPER: return 2 + # not reached + return 0 def target(self, type: str = "ROLL") -> None: """Select where to print to. @@ -1368,7 +1370,7 @@ class Escpos(object): self._raw(BUZZER + six.int2byte(times) + six.int2byte(duration)) -class EscposIO(object): +class EscposIO: r"""ESC/POS Printer IO object. Allows the class to be used together with the `with`-statement. You have to define a printer instance @@ -1414,7 +1416,7 @@ class EscposIO(object): """ self.params.update(kwargs) - def writelines(self, text, **kwargs): + def writelines(self, text: str, **kwargs) -> None: """Print text.""" params = dict(self.params) params.update(kwargs) @@ -1434,18 +1436,23 @@ class EscposIO(object): self.printer.set(**params) self.printer.text("{0}\n".format(line)) - def close(self): + def close(self) -> None: """Close printer. Called upon closing the `with`-statement. """ self.printer.close() - def __enter__(self, **kwargs): + def __enter__(self, **kwargs: Any) -> 'EscposIO': """Enter context.""" return self - def __exit__(self, type, value, traceback): + def __exit__( + self, + type: type[BaseException], + value: BaseException, + traceback: TracebackType + ) -> None: """Cut and close if configured. If :py:attr:`autocut ` is `True` (set by this class' constructor), diff --git a/src/escpos/exceptions.py b/src/escpos/exceptions.py index a583467..d8e28cc 100644 --- a/src/escpos/exceptions.py +++ b/src/escpos/exceptions.py @@ -26,6 +26,8 @@ Result/Exit codes: :license: MIT """ +from typing import Optional + class Error(Exception): """Base class for ESC/POS errors. @@ -37,7 +39,7 @@ class Error(Exception): """ - def __init__(self, msg, status=None): + def __init__(self, msg:str, status: Optional[int] = None) -> None: """Initialize Error object.""" Exception.__init__(self) self.msg = msg @@ -45,7 +47,7 @@ class Error(Exception): if status is not None: self.resultcode = status - def __str__(self): + def __str__(self) -> str: """Return string representation of Error.""" return self.msg @@ -64,13 +66,13 @@ class BarcodeTypeError(Error): """ - def __init__(self, msg=""): + def __init__(self, msg: str = "") -> None: """Initialize BarcodeTypeError object.""" Error.__init__(self, msg) self.msg = msg self.resultcode = 10 - def __str__(self): + def __str__(self) -> str: """Return string representation of BarcodeTypeError.""" return "No Barcode type is defined ({msg})".format(msg=self.msg) @@ -89,13 +91,13 @@ class BarcodeSizeError(Error): """ - def __init__(self, msg=""): + def __init__(self, msg: str = "") -> None: """Initialize BarcodeSizeError object.""" Error.__init__(self, msg) self.msg = msg self.resultcode = 20 - def __str__(self): + def __str__(self) -> str: """Return string representation of BarcodeSizeError.""" return "Barcode size is out of range ({msg})".format(msg=self.msg) @@ -114,13 +116,13 @@ class BarcodeCodeError(Error): """ - def __init__(self, msg=""): + def __init__(self, msg: str = "") -> None: """Initialize BarcodeCodeError object.""" Error.__init__(self, msg) self.msg = msg self.resultcode = 30 - def __str__(self): + def __str__(self) -> str: """Return string representation of BarcodeCodeError.""" return "No Barcode code was supplied ({msg})".format(msg=self.msg) @@ -137,13 +139,13 @@ class ImageSizeError(Error): """ - def __init__(self, msg=""): + def __init__(self, msg: str = "") -> None: """Initialize ImageSizeError object.""" Error.__init__(self, msg) self.msg = msg self.resultcode = 40 - def __str__(self): + def __str__(self) -> str: """Return string representation of ImageSizeError.""" return "Image height is longer than 255px and can't be printed ({msg})".format( msg=self.msg @@ -162,13 +164,13 @@ class ImageWidthError(Error): """ - def __init__(self, msg=""): + def __init__(self, msg: str = "") -> None: """Initialize ImageWidthError object.""" Error.__init__(self, msg) self.msg = msg self.resultcode = 41 - def __str__(self): + def __str__(self) -> str: """Return string representation of ImageWidthError.""" return "Image width is too large ({msg})".format(msg=self.msg) @@ -186,13 +188,13 @@ class TextError(Error): """ - def __init__(self, msg=""): + def __init__(self, msg: str = "") -> None: """Initialize TextError object.""" Error.__init__(self, msg) self.msg = msg self.resultcode = 50 - def __str__(self): + def __str__(self) -> str: """Return string representation of TextError.""" return "Text string must be supplied to the text() method ({msg})".format( msg=self.msg @@ -212,13 +214,13 @@ class CashDrawerError(Error): """ - def __init__(self, msg=""): + def __init__(self, msg: str = "") -> None: """Initialize CashDrawerError object.""" Error.__init__(self, msg) self.msg = msg self.resultcode = 60 - def __str__(self): + def __str__(self) -> str: """Return string representation of CashDrawerError.""" return "Valid pin must be set to send pulse ({msg})".format(msg=self.msg) @@ -239,13 +241,13 @@ class TabPosError(Error): """ - def __init__(self, msg=""): + def __init__(self, msg: str = "") -> None: """Initialize TabPosError object.""" Error.__init__(self, msg) self.msg = msg self.resultcode = 70 - def __str__(self): + def __str__(self) -> str: """Return string representation of TabPosError.""" return "Valid tab positions must be in the range 0 to 16 ({msg})".format( msg=self.msg @@ -265,13 +267,13 @@ class CharCodeError(Error): """ - def __init__(self, msg=""): + def __init__(self, msg: str = "") -> None: """Initialize CharCodeError object.""" Error.__init__(self, msg) self.msg = msg self.resultcode = 80 - def __str__(self): + def __str__(self) -> str: """Return string representation of CharCodeError.""" return "Valid char code must be set ({msg})".format(msg=self.msg) @@ -289,13 +291,13 @@ class DeviceNotFoundError(Error): """ - def __init__(self, msg=""): + def __init__(self, msg: str = "") -> None: """Initialize DeviceNotFoundError object.""" Error.__init__(self, msg) self.msg = msg self.resultcode = 90 - def __str__(self): + def __str__(self) -> str: """Return string representation of DeviceNotFoundError.""" return f"Device not found ({self.msg})" @@ -313,13 +315,13 @@ class USBNotFoundError(DeviceNotFoundError): """ - def __init__(self, msg=""): + def __init__(self, msg: str = "") -> None: """Initialize USBNotFoundError object.""" Error.__init__(self, msg) self.msg = msg self.resultcode = 91 - def __str__(self): + def __str__(self) -> str: """Return string representation of USBNotFoundError.""" return f"USB device not found ({self.msg})" @@ -337,13 +339,13 @@ class SetVariableError(Error): """ - def __init__(self, msg=""): + def __init__(self, msg: str = "") -> None: """Initialize SetVariableError object.""" Error.__init__(self, msg) self.msg = msg self.resultcode = 100 - def __str__(self): + def __str__(self) -> str: """Return string representation of SetVariableError.""" return "Set variable out of range ({msg})".format(msg=self.msg) @@ -364,13 +366,13 @@ class ConfigNotFoundError(Error): """ - def __init__(self, msg=""): + def __init__(self, msg: str = "") -> None: """Initialize ConfigNotFoundError object.""" Error.__init__(self, msg) self.msg = msg self.resultcode = 200 - def __str__(self): + def __str__(self) -> str: """Return string representation of ConfigNotFoundError.""" return "Configuration not found ({msg})".format(msg=self.msg) @@ -388,13 +390,13 @@ class ConfigSyntaxError(Error): """ - def __init__(self, msg=""): + def __init__(self, msg: str = "") -> None: """Initialize ConfigSyntaxError object.""" Error.__init__(self, msg) self.msg = msg self.resultcode = 210 - def __str__(self): + def __str__(self) -> str: """Return string representation of ConfigSyntaxError.""" return "Configuration syntax is invalid ({msg})".format(msg=self.msg) @@ -412,12 +414,12 @@ class ConfigSectionMissingError(Error): """ - def __init__(self, msg=""): + def __init__(self, msg: str = "") -> None: """Initialize ConfigSectionMissingError object.""" Error.__init__(self, msg) self.msg = msg self.resultcode = 220 - def __str__(self): + def __str__(self) -> str: """Return string representation of ConfigSectionMissingError.""" return "Configuration section is missing ({msg})".format(msg=self.msg) diff --git a/src/escpos/image.py b/src/escpos/image.py index 70fae52..6907078 100644 --- a/src/escpos/image.py +++ b/src/escpos/image.py @@ -10,12 +10,12 @@ This module contains the image format handler :py:class:`EscposImage`. import math -from typing import Union +from typing import Union, Iterator from PIL import Image, ImageOps -class EscposImage(object): +class EscposImage: """ Load images in, and output ESC/POS formats. @@ -23,7 +23,7 @@ class EscposImage(object): PIL, rather than spend CPU cycles looping over pixels. """ - def __init__(self, img_source: Union[Image.Image, str]): + def __init__(self, img_source: Union[Image.Image, str]) -> None: """Load in an image. :param img_source: PIL.Image, or filename to load one from. @@ -65,7 +65,7 @@ class EscposImage(object): _, height_pixels = self._im.size return height_pixels - def to_column_format(self, high_density_vertical: bool = True): + def to_column_format(self, high_density_vertical: bool = True) -> Iterator[bytes]: """Extract slices of an image as equal-sized blobs of column-format data. :param high_density_vertical: Printed line height in dots @@ -82,7 +82,7 @@ class EscposImage(object): yield (im_bytes) left += line_height - def to_raster_format(self): + def to_raster_format(self) -> bytes: """Convert image to raster-format binary.""" return self._im.tobytes() diff --git a/src/escpos/magicencode.py b/src/escpos/magicencode.py index 5e79100..1af3131 100644 --- a/src/escpos/magicencode.py +++ b/src/escpos/magicencode.py @@ -23,7 +23,7 @@ from .constants import CODEPAGE_CHANGE from .exceptions import Error -class Encoder(object): +class Encoder: """Take available code spaces and pick the right one for a given character. Note: To determine the code page, it needs to do the conversion, and @@ -202,7 +202,7 @@ def split_writable_text(encoder, text, encoding): return text, None -class MagicEncode(object): +class MagicEncode: """Help switching to the right code page. A helper that helps us to automatically switch to the right diff --git a/src/escpos/printer/cups.py b/src/escpos/printer/cups.py index b4d430e..faae161 100644 --- a/src/escpos/printer/cups.py +++ b/src/escpos/printer/cups.py @@ -11,7 +11,7 @@ import functools import logging import tempfile -from typing import Literal, Optional, Type, Union +from typing import Literal, Optional, Type, Union, List from ..escpos import Escpos from ..exceptions import DeviceNotFoundError @@ -84,7 +84,7 @@ class CupsPrinter(Escpos): return is_usable() @dependency_pycups - def __init__(self, printer_name: str = "", *args, **kwargs): + def __init__(self, printer_name: str = "", *args, **kwargs) -> None: """Class constructor for CupsPrinter. :param printer_name: CUPS printer name (Optional) @@ -163,7 +163,7 @@ class CupsPrinter(Escpos): return logging.info("CupsPrinter printer enabled") - def _raw(self, msg): + def _raw(self, msg: bytes) -> None: """Append any command sent in raw format to temporary file. :param msg: arbitrary code to be printed @@ -176,8 +176,9 @@ class CupsPrinter(Escpos): self.pending_job = False raise TypeError("Bytes required. Printer job not opened") - def send(self): + def send(self) -> None: """Send the print job to the printer.""" + assert self.device if self.pending_job: # Rewind tempfile self.tmpfile.seek(0) @@ -190,7 +191,7 @@ class CupsPrinter(Escpos): ) self._clear() - def _clear(self): + def _clear(self) -> None: """Finish the print job. Remove temporary file. @@ -198,7 +199,7 @@ class CupsPrinter(Escpos): self.tmpfile.close() self.pending_job = False - def _read(self): + def _read(self) -> List[int]: """Return a single-item array with the accepting state of the print queue. states: idle = [3], printing a job = [4], stopped = [5] @@ -209,7 +210,7 @@ class CupsPrinter(Escpos): return [] return [state] - def close(self): + def close(self) -> None: """Close CUPS connection. Send pending job to the printer if needed. diff --git a/src/escpos/printer/dummy.py b/src/escpos/printer/dummy.py index 36601ba..a712016 100644 --- a/src/escpos/printer/dummy.py +++ b/src/escpos/printer/dummy.py @@ -7,6 +7,7 @@ :copyright: Copyright (c) 2012-2023 Bashlinux and python-escpos :license: MIT """ +from typing import List from ..escpos import Escpos @@ -39,25 +40,24 @@ class Dummy(Escpos): """ return is_usable() - def __init__(self, *args, **kwargs): + def __init__(self, *args, **kwargs) -> None: """Init with empty output list.""" Escpos.__init__(self, *args, **kwargs) - self._output_list = [] + self._output_list: List[bytes] = [] - def _raw(self, msg): + def _raw(self, msg: bytes) -> None: """Print any command sent in raw format. :param msg: arbitrary code to be printed - :type msg: bytes """ self._output_list.append(msg) @property - def output(self): + def output(self) -> bytes: """Get the data that was sent to this printer.""" return b"".join(self._output_list) - def clear(self): + def clear(self) -> None: """Clear the buffer of the printer. This method can be called if you send the contents to a physical printer @@ -65,6 +65,6 @@ class Dummy(Escpos): """ del self._output_list[:] - def close(self): + def close(self) -> None: """Close not implemented for Dummy printer.""" pass diff --git a/src/escpos/printer/file.py b/src/escpos/printer/file.py index 67cbe4f..9082265 100644 --- a/src/escpos/printer/file.py +++ b/src/escpos/printer/file.py @@ -88,12 +88,12 @@ class File(Escpos): if self.device: self.device.flush() - def _raw(self, msg): + def _raw(self, msg: bytes) -> None: """Print any command sent in raw format. :param msg: arbitrary code to be printed - :type msg: bytes """ + assert self.device self.device.write(msg) if self.auto_flush: self.flush() diff --git a/src/escpos/printer/lp.py b/src/escpos/printer/lp.py index 951df66..f928d38 100644 --- a/src/escpos/printer/lp.py +++ b/src/escpos/printer/lp.py @@ -182,7 +182,7 @@ class LP(Escpos): if not self._is_closing: self.open(_close_opened=False) - def _raw(self, msg): + def _raw(self, msg: bytes) -> None: """Write raw command(s) to the printer. :param msg: arbitrary code to be printed diff --git a/src/escpos/printer/network.py b/src/escpos/printer/network.py index 5b0d0fa..7a2d5c1 100644 --- a/src/escpos/printer/network.py +++ b/src/escpos/printer/network.py @@ -110,16 +110,18 @@ class Network(Escpos): return logging.info("Network printer enabled") - def _raw(self, msg): + def _raw(self, msg: bytes) -> None: """Print any command sent in raw format. :param msg: arbitrary code to be printed :type msg: bytes """ + assert self.device self.device.sendall(msg) - def _read(self): + def _read(self) -> bytes: """Read data from the TCP socket.""" + assert self.device return self.device.recv(16) def close(self) -> None: diff --git a/src/escpos/printer/serial.py b/src/escpos/printer/serial.py index bbe1d25..66592af 100644 --- a/src/escpos/printer/serial.py +++ b/src/escpos/printer/serial.py @@ -155,16 +155,18 @@ class Serial(Escpos): return logging.info("Serial printer enabled") - def _raw(self, msg): + def _raw(self, msg) -> None: """Print any command sent in raw format. :param msg: arbitrary code to be printed :type msg: bytes """ + assert self.device self.device.write(msg) - def _read(self): + def _read(self) -> bytes: """Read the data buffer and return it to the caller.""" + assert self.device return self.device.read(16) def close(self) -> None: diff --git a/src/escpos/printer/usb.py b/src/escpos/printer/usb.py index d07df7b..9f7dde7 100644 --- a/src/escpos/printer/usb.py +++ b/src/escpos/printer/usb.py @@ -181,16 +181,18 @@ class Usb(Escpos): except usb.core.USBError as e: logging.error("Could not set configuration: %s", str(e)) - def _raw(self, msg): + def _raw(self, msg: bytes) -> None: """Print any command sent in raw format. :param msg: arbitrary code to be printed :type msg: bytes """ + assert self.device self.device.write(self.out_ep, msg, self.timeout) - def _read(self): + def _read(self) -> bytes: """Read a data buffer and return it to the caller.""" + assert self.device return self.device.read(self.in_ep, 16) @dependency_usb diff --git a/src/escpos/printer/win32raw.py b/src/escpos/printer/win32raw.py index 2b26732..c4aed39 100644 --- a/src/escpos/printer/win32raw.py +++ b/src/escpos/printer/win32raw.py @@ -76,7 +76,7 @@ class Win32Raw(Escpos): return is_usable() @dependency_win32print - def __init__(self, printer_name: str = "", *args, **kwargs): + def __init__(self, printer_name: str = "", *args, **kwargs) -> None: """Initialize default printer.""" Escpos.__init__(self, *args, **kwargs) self.printer_name = printer_name @@ -148,7 +148,7 @@ class Win32Raw(Escpos): win32print.ClosePrinter(self._device) self._device = False - def _raw(self, msg) -> None: + def _raw(self, msg: bytes) -> None: """Print any command sent in raw format. :param msg: arbitrary code to be printed