diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 28042b9..d4de1b2 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -37,14 +37,12 @@ repos:
hooks:
- id: pyupgrade
args: [--py39-plus]
- - repo: https://github.com/PyCQA/isort
- rev: 5.13.2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
+ rev: v0.8.2
hooks:
- - id: isort
- - repo: https://github.com/psf/black
- rev: 24.10.0
- hooks:
- - id: black
+ - id: ruff
+ args: [--fix, --exit-non-zero-on-fix]
+ - id: ruff-format
# - repo: https://github.com/codespell-project/codespell
# rev: v2.2.1
# hooks:
diff --git a/README.md b/README.md
index 5a99dc1..75889e0 100644
--- a/README.md
+++ b/README.md
@@ -15,8 +15,8 @@
-
-
+
+
diff --git a/examples/example-service.py b/examples/example-service.py
index ef7f3f5..ccb20bc 100755
--- a/examples/example-service.py
+++ b/examples/example-service.py
@@ -25,7 +25,7 @@ class ExampleInterface(ServiceInterface):
return [what1, what2]
@method()
- def GetVariantDict(self) -> "a{sv}":
+ def GetVariantDict(self) -> "a{sv}": # noqa: F722
return {
"foo": Variant("s", "bar"),
"bat": Variant("x", -55),
diff --git a/pyproject.toml b/pyproject.toml
index a06aa75..053a972 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -105,3 +105,12 @@ ignore_errors = true
[build-system]
requires = ['setuptools>=65.4.1', 'wheel', 'Cython>=3,<3.1.0', "poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
+
+[tool.ruff]
+target-version = "py39"
+line-length = 88
+
+[tool.ruff.lint]
+ignore = [
+ "F821", # undefined names are used for decorators
+]
diff --git a/src/dbus_fast/_private/address.py b/src/dbus_fast/_private/address.py
index ee1b48b..ee150f2 100644
--- a/src/dbus_fast/_private/address.py
+++ b/src/dbus_fast/_private/address.py
@@ -1,6 +1,6 @@
import os
import re
-from typing import Dict, List, Optional, Tuple
+from typing import Optional
from urllib.parse import unquote
from ..constants import BusType
diff --git a/src/dbus_fast/_private/marshaller.py b/src/dbus_fast/_private/marshaller.py
index c69bcbe..18e0232 100644
--- a/src/dbus_fast/_private/marshaller.py
+++ b/src/dbus_fast/_private/marshaller.py
@@ -1,5 +1,5 @@
from struct import Struct, error
-from typing import Any, Callable, Dict, List, Optional, Tuple, Union
+from typing import Any, Callable, Optional, Union
from ..signature import SignatureType, Variant, get_signature_tree
diff --git a/src/dbus_fast/_private/unmarshaller.py b/src/dbus_fast/_private/unmarshaller.py
index 2d8af54..a2327df 100644
--- a/src/dbus_fast/_private/unmarshaller.py
+++ b/src/dbus_fast/_private/unmarshaller.py
@@ -5,7 +5,7 @@ import socket
import sys
from collections.abc import Iterable
from struct import Struct
-from typing import Any, Callable, Dict, List, Optional, Tuple, Union
+from typing import Any, Callable, Optional, Union
from ..constants import MESSAGE_FLAG_MAP, MESSAGE_TYPE_MAP, MessageFlag
from ..errors import InvalidMessageError
diff --git a/src/dbus_fast/_private/util.py b/src/dbus_fast/_private/util.py
index 5e37252..b7c2366 100644
--- a/src/dbus_fast/_private/util.py
+++ b/src/dbus_fast/_private/util.py
@@ -1,6 +1,6 @@
import ast
import inspect
-from typing import Any, List, Tuple, Union
+from typing import Any, Union
from ..signature import SignatureTree, Variant, get_signature_tree
diff --git a/src/dbus_fast/aio/__init__.py b/src/dbus_fast/aio/__init__.py
index 020dcc7..e04a895 100644
--- a/src/dbus_fast/aio/__init__.py
+++ b/src/dbus_fast/aio/__init__.py
@@ -1,2 +1,2 @@
-from .message_bus import MessageBus
-from .proxy_object import ProxyInterface, ProxyObject
+from .message_bus import MessageBus as MessageBus
+from .proxy_object import ProxyInterface as ProxyInterface, ProxyObject as ProxyObject
diff --git a/src/dbus_fast/aio/message_bus.py b/src/dbus_fast/aio/message_bus.py
index 8d4ae9e..e3b4aea 100644
--- a/src/dbus_fast/aio/message_bus.py
+++ b/src/dbus_fast/aio/message_bus.py
@@ -6,7 +6,7 @@ import socket
from collections import deque
from copy import copy
from functools import partial
-from typing import Any, Callable, List, Optional, Set, Tuple
+from typing import Any, Callable, Optional
from .. import introspection as intr
from ..auth import Authenticator, AuthExternal
diff --git a/src/dbus_fast/aio/proxy_object.py b/src/dbus_fast/aio/proxy_object.py
index c37f146..75e1ba0 100644
--- a/src/dbus_fast/aio/proxy_object.py
+++ b/src/dbus_fast/aio/proxy_object.py
@@ -1,5 +1,5 @@
import xml.etree.ElementTree as ET
-from typing import TYPE_CHECKING, Any, List, Union
+from typing import TYPE_CHECKING, Any, Union
from .. import introspection as intr
from .._private.util import replace_fds_with_idx, replace_idx_with_fds
diff --git a/src/dbus_fast/auth.py b/src/dbus_fast/auth.py
index e8a36ab..7e39589 100644
--- a/src/dbus_fast/auth.py
+++ b/src/dbus_fast/auth.py
@@ -1,6 +1,6 @@
import enum
import os
-from typing import List, Optional, Tuple
+from typing import Optional
from .errors import AuthError
diff --git a/src/dbus_fast/errors.py b/src/dbus_fast/errors.py
index 0ef39c1..5f2a1e7 100644
--- a/src/dbus_fast/errors.py
+++ b/src/dbus_fast/errors.py
@@ -53,9 +53,9 @@ class InvalidMemberNameError(TypeError):
super().__init__(f"invalid member name: {member}")
-from .constants import ErrorType, MessageType
-from .message import Message
-from .validators import assert_interface_name_valid
+from .constants import ErrorType, MessageType # noqa: E402
+from .message import Message # noqa: E402
+from .validators import assert_interface_name_valid # noqa: E402
class DBusError(Exception):
diff --git a/src/dbus_fast/glib/__init__.py b/src/dbus_fast/glib/__init__.py
index 020dcc7..e04a895 100644
--- a/src/dbus_fast/glib/__init__.py
+++ b/src/dbus_fast/glib/__init__.py
@@ -1,2 +1,2 @@
-from .message_bus import MessageBus
-from .proxy_object import ProxyInterface, ProxyObject
+from .message_bus import MessageBus as MessageBus
+from .proxy_object import ProxyInterface as ProxyInterface, ProxyObject as ProxyObject
diff --git a/src/dbus_fast/glib/proxy_object.py b/src/dbus_fast/glib/proxy_object.py
index 2322456..71d8e6e 100644
--- a/src/dbus_fast/glib/proxy_object.py
+++ b/src/dbus_fast/glib/proxy_object.py
@@ -1,5 +1,5 @@
import xml.etree.ElementTree as ET
-from typing import List, Union
+from typing import Union
from .. import introspection as intr
from ..constants import ErrorType
diff --git a/src/dbus_fast/introspection.py b/src/dbus_fast/introspection.py
index dccddd9..2c97db5 100644
--- a/src/dbus_fast/introspection.py
+++ b/src/dbus_fast/introspection.py
@@ -1,5 +1,5 @@
import xml.etree.ElementTree as ET
-from typing import List, Optional, Union
+from typing import Optional, Union
from .constants import ArgDirection, PropertyAccess
from .errors import InvalidIntrospectionError
diff --git a/src/dbus_fast/message.py b/src/dbus_fast/message.py
index 56b13bd..44aeb55 100644
--- a/src/dbus_fast/message.py
+++ b/src/dbus_fast/message.py
@@ -1,4 +1,4 @@
-from typing import Any, List, Optional, Union
+from typing import Any, Optional, Union
from ._private.constants import LITTLE_ENDIAN, PROTOCOL_VERSION, HeaderField
from ._private.marshaller import Marshaller
diff --git a/src/dbus_fast/message_bus.py b/src/dbus_fast/message_bus.py
index a30eb1a..2534127 100644
--- a/src/dbus_fast/message_bus.py
+++ b/src/dbus_fast/message_bus.py
@@ -4,7 +4,7 @@ import socket
import traceback
import xml.etree.ElementTree as ET
from functools import partial
-from typing import Any, Callable, Dict, List, Optional, Type, Union
+from typing import Any, Callable, Optional, Union
from . import introspection as intr
from ._private.address import get_bus_address, parse_address
diff --git a/src/dbus_fast/proxy_object.py b/src/dbus_fast/proxy_object.py
index cc83f4a..e9c40b2 100644
--- a/src/dbus_fast/proxy_object.py
+++ b/src/dbus_fast/proxy_object.py
@@ -6,7 +6,7 @@ import xml.etree.ElementTree as ET
from collections.abc import Coroutine
from dataclasses import dataclass
from functools import lru_cache
-from typing import Callable, Dict, List, Optional, Type, Union
+from typing import Callable, Optional, Union
from . import introspection as intr
from . import message_bus
diff --git a/src/dbus_fast/send_reply.py b/src/dbus_fast/send_reply.py
index a90587b..00d4440 100644
--- a/src/dbus_fast/send_reply.py
+++ b/src/dbus_fast/send_reply.py
@@ -1,6 +1,6 @@
import traceback
from types import TracebackType
-from typing import TYPE_CHECKING, Optional, Type
+from typing import TYPE_CHECKING, Optional
from .constants import ErrorType
from .errors import DBusError
diff --git a/src/dbus_fast/service.py b/src/dbus_fast/service.py
index 25defde..b31120a 100644
--- a/src/dbus_fast/service.py
+++ b/src/dbus_fast/service.py
@@ -2,7 +2,7 @@ import asyncio
import copy
import inspect
from functools import wraps
-from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Set, Tuple
+from typing import TYPE_CHECKING, Any, Callable, Optional
from . import introspection as intr
from ._private.util import (
diff --git a/src/dbus_fast/signature.py b/src/dbus_fast/signature.py
index 940cf02..23afbe5 100644
--- a/src/dbus_fast/signature.py
+++ b/src/dbus_fast/signature.py
@@ -1,5 +1,5 @@
from functools import lru_cache
-from typing import Any, Callable, Dict, List, Optional, Tuple, Union
+from typing import Any, Callable, Optional, Union
from .errors import InvalidSignatureError, SignatureBodyMismatchError
from .validators import is_object_path_valid
diff --git a/tests/client/test_methods.py b/tests/client/test_methods.py
index ffade23..aac6059 100644
--- a/tests/client/test_methods.py
+++ b/tests/client/test_methods.py
@@ -40,7 +40,7 @@ class ExampleInterface(ServiceInterface):
return [what1, what2, what3]
@method()
- def GetComplex(self) -> "a{sv}":
+ def GetComplex(self) -> "a{sv}": # noqa: F722
"""Return complex output."""
return {"hello": Variant("s", "world")}
diff --git a/tests/client/test_properties.py b/tests/client/test_properties.py
index c628903..eab9073 100644
--- a/tests/client/test_properties.py
+++ b/tests/client/test_properties.py
@@ -31,7 +31,7 @@ class ExampleInterface(ServiceInterface):
return self._int64_property
@dbus_property(access=PropertyAccess.READ)
- def ComplexProperty(self) -> "a{sv}":
+ def ComplexProperty(self) -> "a{sv}": # noqa: F722
"""Return complex output."""
return {"hello": Variant("s", "world")}
diff --git a/tests/client/test_signals.py b/tests/client/test_signals.py
index d08473d..85b3fc4 100644
--- a/tests/client/test_signals.py
+++ b/tests/client/test_signals.py
@@ -21,7 +21,7 @@ class ExampleInterface(ServiceInterface):
return ["hello", "world"]
@signal()
- def SignalComplex(self) -> "a{sv}":
+ def SignalComplex(self) -> "a{sv}": # noqa: F722
"""Broadcast a complex signal."""
return {"hello": Variant("s", "world")}
diff --git a/tests/service/test_decorators.py b/tests/service/test_decorators.py
index b1769ef..8278b3b 100644
--- a/tests/service/test_decorators.py
+++ b/tests/service/test_decorators.py
@@ -19,7 +19,7 @@ class ExampleInterface(ServiceInterface):
pass
@signal()
- def some_signal(self) -> "as":
+ def some_signal(self) -> "as": # noqa: F722
return ["result"]
@signal(name="renamed_signal", disabled=True)
diff --git a/tests/service/test_methods.py b/tests/service/test_methods.py
index 6fdfe5d..99f21b6 100644
--- a/tests/service/test_methods.py
+++ b/tests/service/test_methods.py
@@ -29,8 +29,12 @@ class ExampleInterface(ServiceInterface):
@method()
def echo_containers(
- self, array: "as", variant: "v", dict_entries: "a{sv}", struct: "(s(s(v)))"
- ) -> "asva{sv}(s(s(v)))":
+ self,
+ array: "as", # noqa: F722
+ variant: "v",
+ dict_entries: "a{sv}", # noqa: F722
+ struct: "(s(s(v)))", # noqa: F722
+ ) -> "asva{sv}(s(s(v)))": # noqa: F722
assert type(self) is ExampleInterface
return [array, variant, dict_entries, struct]
@@ -76,8 +80,12 @@ class AsyncInterface(ServiceInterface):
@method()
async def echo_containers(
- self, array: "as", variant: "v", dict_entries: "a{sv}", struct: "(s(s(v)))"
- ) -> "asva{sv}(s(s(v)))":
+ self,
+ array: "as", # noqa: F722
+ variant: "v",
+ dict_entries: "a{sv}", # noqa: F722
+ struct: "(s(s(v)))", # noqa: F722
+ ) -> "asva{sv}(s(s(v)))": # noqa: F722
assert type(self) is AsyncInterface
return [array, variant, dict_entries, struct]
diff --git a/tests/test_address_parser.py b/tests/test_address_parser.py
index bf999c1..c162ca2 100644
--- a/tests/test_address_parser.py
+++ b/tests/test_address_parser.py
@@ -63,8 +63,9 @@ def test_get_session_bus_address():
with patch.dict(os.environ, DBUS_SESSION_BUS_ADDRESS="unix:path=/dog"):
assert get_session_bus_address() == "unix:path=/dog"
assert get_bus_address(BusType.SESSION) == "unix:path=/dog"
- with patch.dict(os.environ, DBUS_SESSION_BUS_ADDRESS="", DISPLAY=""), pytest.raises(
- InvalidAddressError
+ with (
+ patch.dict(os.environ, DBUS_SESSION_BUS_ADDRESS="", DISPLAY=""),
+ pytest.raises(InvalidAddressError),
):
assert get_session_bus_address()
diff --git a/tests/test_disconnect.py b/tests/test_disconnect.py
index b8fa367..e4bd9bc 100644
--- a/tests/test_disconnect.py
+++ b/tests/test_disconnect.py
@@ -52,8 +52,9 @@ async def test_unexpected_disconnect(event_loop):
await bus.connect()
assert bus.connected
- with patch.object(bus._writer, "_write_without_remove_writer"), patch.object(
- bus._writer, "sock", FakeSocket()
+ with (
+ patch.object(bus._writer, "_write_without_remove_writer"),
+ patch.object(bus._writer, "sock", FakeSocket()),
):
ping = bus.call(
Message(
diff --git a/tests/test_marshaller.py b/tests/test_marshaller.py
index debe82c..7a04ce4 100644
--- a/tests/test_marshaller.py
+++ b/tests/test_marshaller.py
@@ -2,7 +2,7 @@ import io
import json
import os
from enum import Enum
-from typing import Any, Dict
+from typing import Any
import pytest
@@ -101,8 +101,6 @@ def test_marshalling_with_table():
@pytest.mark.parametrize("unmarshall_table", (table,))
def test_unmarshalling_with_table(unmarshall_table):
- from dbus_fast._private import unmarshaller
-
for item in unmarshall_table:
stream = io.BytesIO(bytes.fromhex(item["data"]))
unmarshaller = Unmarshaller(stream)
diff --git a/tests/util.py b/tests/util.py
index 80c7f3f..658a398 100644
--- a/tests/util.py
+++ b/tests/util.py
@@ -7,7 +7,7 @@ def check_gi_repository():
if _has_gi is not None:
return _has_gi
try:
- from gi.repository import GLib
+ from gi.repository import GLib # noqa: F401
_has_gi = True
return _has_gi