diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9a48a6331..3f34da0b6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -74,10 +74,10 @@ jobs: run: | uv run pylint --recursive=y examples pymodbus test - - name: mypy + - name: Type check with zuban if: matrix.run_lint == true run: | - uv run mypy pymodbus examples + uv run zuban check pymodbus examples - name: ruff if: matrix.run_lint == true diff --git a/check_ci.sh b/check_ci.sh index 5edcd42f6..b00381b95 100755 --- a/check_ci.sh +++ b/check_ci.sh @@ -8,6 +8,6 @@ trap 'echo "\"${last_command}\" command filed with exit code $?."' EXIT codespell ruff check --fix --exit-non-zero-on-fix . pylint --recursive=y examples pymodbus test -mypy pymodbus examples +zuban pymodbus examples pytest -x --cov --numprocesses auto echo "Ready to push" diff --git a/examples/custom_msg.py b/examples/custom_msg.py index 963363758..6670c8022 100755 --- a/examples/custom_msg.py +++ b/examples/custom_msg.py @@ -46,7 +46,7 @@ class CustomModbusResponse(ModbusPDU): def __init__(self, values: list[int] | None = None, device_id=1, transaction=0): """Initialize.""" super().__init__(dev_id=device_id, transaction_id=transaction) - self.values = values or [] + self.values: list[int] = values or [] def encode(self): """Encode response pdu. diff --git a/examples/server_async.py b/examples/server_async.py index a9df0fb18..f1d9a5f8e 100755 --- a/examples/server_async.py +++ b/examples/server_async.py @@ -85,7 +85,7 @@ def setup_server(description=None, context=None, cmdline=None): elif args.store == "sparse": # pragma: no cover # Continuing, or use a sparse DataBlock which can have gaps datablock = lambda : ModbusSparseDataBlock({0x00: 0, 0x05: 1}) # pylint: disable=unnecessary-lambda-assignment - else: # args.store == "factory" # pragma: no cover + elif args.store == "factory" or True: # pragma: no cover # pylint: disable=condition-evals-to-constant # Alternately, use the factory methods to initialize the DataBlocks # or simply do not pass them to have them initialized to 0x00 on the # full address range:: diff --git a/pymodbus/datastore/context.py b/pymodbus/datastore/context.py index e91821d9c..0efd2456f 100644 --- a/pymodbus/datastore/context.py +++ b/pymodbus/datastore/context.py @@ -161,7 +161,7 @@ def __init__(self, devices=None, single=True): :param single: Set to true to treat this as a single context """ self.single = single - self._devices = devices or {} # type: ignore[var-annotated, unused-ignore] + self._devices: dict = devices or {} if self.single: self._devices = {0: self._devices} diff --git a/pymodbus/pdu/mei_message.py b/pymodbus/pdu/mei_message.py index 5b0d6f960..d77e217c9 100644 --- a/pymodbus/pdu/mei_message.py +++ b/pymodbus/pdu/mei_message.py @@ -97,7 +97,7 @@ def __init__(self, read_code: int | None = None, information: dict[int, Any] | N """Initialize a new instance.""" super().__init__(transaction_id=transaction_id, dev_id=dev_id) self.read_code = read_code or DeviceInformation.BASIC - self.information = information or {} + self.information: dict[int, Any] = information or {} self.number_of_objects = 0 self.conformity = 0x83 # I support everything right now self.next_object_id = 0x00 diff --git a/pymodbus/transport/transport.py b/pymodbus/transport/transport.py index 6a42de26f..3227378f5 100644 --- a/pymodbus/transport/transport.py +++ b/pymodbus/transport/transport.py @@ -127,7 +127,7 @@ def generate_ssl( ) return new_sslctx - def copy(self) -> CommParams: + def copy(self: CommParams) -> CommParams: """Create a copy.""" return copy.copy(self) diff --git a/pyproject.toml b/pyproject.toml index 9afc21fd4..d1084b637 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,7 +58,6 @@ development = [ "build>=1.2.2", "codespell>=2.3.0", "coverage>=7.10.7", - "mypy>=1.18.2", "pylint>=4.0.0", "pytest>=8.4.2", "pytest-asyncio>=1.2.0", @@ -70,7 +69,8 @@ development = [ "ruff>=0.13.1", "twine>=6.2.0", "types-Pygments", - "types-pyserial" + "types-pyserial", + "zuban>=0.3.0" ] all = [ "pymodbus[serial, simulator, documentation, development]"