From f36bd9fd94c6b8b80168e3ca3b9d37cc3819362a Mon Sep 17 00:00:00 2001 From: zigpy-review-bot <286747149+zigpy-review-bot@users.noreply.github.com> Date: Mon, 28 Sep 2026 02:54:19 +0200 Subject: [PATCH 1/2] Replace black with ruff format and expand ruff rule set --- .pre-commit-config.yaml | 14 +++++--------- pyproject.toml | 29 +++++++++++++++++++---------- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2250487..4a569b2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,11 +1,7 @@ repos: - - repo: https://github.com/psf/black - rev: 23.1.0 + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.16.9 hooks: - - id: black - args: ["--safe", "--quiet"] - - repo: https://github.com/charliermarsh/ruff-pre-commit - rev: 'v0.0.246' - hooks: - - id: ruff - args: ["--fix"] \ No newline at end of file + - id: ruff-check + args: ["--fix", "--exit-non-zero-on-fix"] + - id: ruff-format diff --git a/pyproject.toml b/pyproject.toml index ce03234..dd2e1de 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,18 +54,27 @@ enabled = true [project.scripts] zigpy = "zigpy_cli.__main__:cli" - [tool.ruff] +target-version = "py311" +line-length = 88 +src = ["zigpy_cli", "tests"] + +[tool.ruff.lint] select = [ - # Pyflakes - "F", - # Pycodestyle - "E", - "W", - # isort - "I001" + "B", # flake8-bugbear + "C", # complexity + "E", # pycodestyle + "F", # pyflakes/autoflake + "I", # isort + "SIM", # flake8-simplify + "UP", # pyupgrade + "W", # pycodestyle ] -src = ["zigpy_cli", "tests"] -[tool.ruff.isort] +[tool.ruff.lint.mccabe] +max-complexity = 25 + +[tool.ruff.lint.isort] +force-sort-within-sections = true known-first-party = ["zigpy_cli", "tests"] +combine-as-imports = true From 90f350895b5f93439238622f06f536a37b02fd5c Mon Sep 17 00:00:00 2001 From: zigpy-review-bot <286747149+zigpy-review-bot@users.noreply.github.com> Date: Mon, 28 Sep 2026 02:54:52 +0200 Subject: [PATCH 2/2] Apply ruff fixes Import sorting (force-sort-within-sections, as in the other zigpy libraries), SIM300 and SIM108, and ruff format joining an implicitly concatenated log format string. No behaviour change. --- zigpy_cli/__main__.py | 2 +- zigpy_cli/cli.py | 7 +------ zigpy_cli/database.py | 2 +- zigpy_cli/ota.py | 2 +- zigpy_cli/pcap.py | 2 +- zigpy_cli/radio.py | 7 ++----- 6 files changed, 7 insertions(+), 15 deletions(-) diff --git a/zigpy_cli/__main__.py b/zigpy_cli/__main__.py index 862928f..08e2b60 100644 --- a/zigpy_cli/__main__.py +++ b/zigpy_cli/__main__.py @@ -1,5 +1,5 @@ +from zigpy_cli.cli import cli # noqa: F401 import zigpy_cli.database # noqa: F401 import zigpy_cli.ota # noqa: F401 import zigpy_cli.pcap # noqa: F401 import zigpy_cli.radio # noqa: F401 -from zigpy_cli.cli import cli # noqa: F401 diff --git a/zigpy_cli/cli.py b/zigpy_cli/cli.py index a1ec735..967307f 100644 --- a/zigpy_cli/cli.py +++ b/zigpy_cli/cli.py @@ -58,12 +58,7 @@ def cli(verbose): ROOT_LOGGER.setLevel(log_level) coloredlogs.install( - fmt=( - "%(asctime)s.%(msecs)03d" - " %(hostname)s" - " %(name)s" - " %(levelname)s %(message)s" - ), + fmt="%(asctime)s.%(msecs)03d %(hostname)s %(name)s %(levelname)s %(message)s", level=log_level, level_styles=level_styles, logger=ROOT_LOGGER, diff --git a/zigpy_cli/database.py b/zigpy_cli/database.py index 021ba72..62aada6 100644 --- a/zigpy_cli/database.py +++ b/zigpy_cli/database.py @@ -121,7 +121,7 @@ def recover(input_path, output_path): pragma_user_version, ) - if zigpy.appdb.DB_VERSION != max_table_version: + if max_table_version != zigpy.appdb.DB_VERSION: LOGGER.warning( "Zigpy's current DB version is %s but the maximum table version is %s!", zigpy.appdb.DB_VERSION, diff --git a/zigpy_cli/ota.py b/zigpy_cli/ota.py index bb315c4..ade64f9 100644 --- a/zigpy_cli/ota.py +++ b/zigpy_cli/ota.py @@ -8,9 +8,9 @@ import subprocess import click -import zigpy.types as t from zigpy.ota.image import ElementTagId, HueSBLOTAImage, parse_ota_image from zigpy.ota.validators import validate_ota_image +import zigpy.types as t from zigpy.types.named import _hex_string_to_bytes from zigpy.util import convert_install_code as zigpy_convert_install_code diff --git a/zigpy_cli/pcap.py b/zigpy_cli/pcap.py index 6ed1802..1a85b42 100644 --- a/zigpy_cli/pcap.py +++ b/zigpy_cli/pcap.py @@ -6,10 +6,10 @@ import sys import click -import zigpy.types as t from scapy.config import conf as scapy_conf from scapy.layers.dot15d4 import Dot15d4 # NOQA: F401 from scapy.utils import PcapReader, PcapWriter +import zigpy.types as t from zigpy_cli.cli import cli diff --git a/zigpy_cli/radio.py b/zigpy_cli/radio.py index b55e0fc..5c7c906 100644 --- a/zigpy_cli/radio.py +++ b/zigpy_cli/radio.py @@ -11,9 +11,9 @@ import sys import click +from zigpy.application import ControllerApplication import zigpy.backups import zigpy.types -from zigpy.application import ControllerApplication from zigpy_cli.cli import cli, click_coroutine from zigpy_cli.common import CHANNELS_LIST @@ -123,10 +123,7 @@ async def backup( "i_understand_i_can_update_eui64_only_once_and_i_still_want_to_do_it" ] = True - if zigpy_format: - obj = backup.as_dict() - else: - obj = backup.as_open_coordinator_json() + obj = backup.as_dict() if zigpy_format else backup.as_open_coordinator_json() output.write(json.dumps(obj, indent=4) + "\n")