From 248704e0b633d82813af06ecb7aa0cf7346ac3bd Mon Sep 17 00:00:00 2001 From: wbi Date: Tue, 24 Mar 2026 16:31:01 +0100 Subject: [PATCH 1/3] Add stricter Ruff linting --- dissect/volume/ddf/c_ddf.py | 1 + dissect/volume/disk/__init__.py | 2 ++ dissect/volume/disk/partition.py | 1 - dissect/volume/disk/schemes/__init__.py | 2 ++ dissect/volume/exceptions.py | 3 +++ dissect/volume/lvm/__init__.py | 2 ++ dissect/volume/md/__init__.py | 2 ++ dissect/volume/md/md.py | 1 - dissect/volume/raid/stream.py | 1 - pyproject.toml | 22 ++++++++++++++++++++-- tests/_docs/conf.py | 2 ++ 11 files changed, 34 insertions(+), 5 deletions(-) diff --git a/dissect/volume/ddf/c_ddf.py b/dissect/volume/ddf/c_ddf.py index cc8b4b5..8f0240f 100644 --- a/dissect/volume/ddf/c_ddf.py +++ b/dissect/volume/ddf/c_ddf.py @@ -1,4 +1,5 @@ # Reference: https://www.snia.org/sites/default/files/SNIA_DDF_Technical_Position_v2.0.pdf +from __future__ import annotations from dissect.cstruct import cstruct diff --git a/dissect/volume/disk/__init__.py b/dissect/volume/disk/__init__.py index f11833e..0154102 100644 --- a/dissect/volume/disk/__init__.py +++ b/dissect/volume/disk/__init__.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from dissect.volume.disk.disk import Disk from dissect.volume.disk.partition import Partition from dissect.volume.exceptions import DiskError diff --git a/dissect/volume/disk/partition.py b/dissect/volume/disk/partition.py index 4dbb5a0..00935a7 100644 --- a/dissect/volume/disk/partition.py +++ b/dissect/volume/disk/partition.py @@ -235,7 +235,6 @@ def open(self) -> BinaryIO: def translate_partition_type(type: int | str | UUID, prepend_type: bool = True) -> str: """Translate a partition type to a human-readable format.""" - if not isinstance(type, str): name = PARTITION_TYPES.get(type, "Unknown") type = hex(type) if isinstance(type, int) else type diff --git a/dissect/volume/disk/schemes/__init__.py b/dissect/volume/disk/schemes/__init__.py index 0305553..3c7f52c 100644 --- a/dissect/volume/disk/schemes/__init__.py +++ b/dissect/volume/disk/schemes/__init__.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from dissect.volume.disk.schemes.apm import APM from dissect.volume.disk.schemes.bsd import BSD from dissect.volume.disk.schemes.gpt import GPT diff --git a/dissect/volume/exceptions.py b/dissect/volume/exceptions.py index 739f6b9..8eb3c46 100644 --- a/dissect/volume/exceptions.py +++ b/dissect/volume/exceptions.py @@ -1,3 +1,6 @@ +from __future__ import annotations + + class Error(Exception): pass diff --git a/dissect/volume/lvm/__init__.py b/dissect/volume/lvm/__init__.py index f0ed0b2..3a14443 100644 --- a/dissect/volume/lvm/__init__.py +++ b/dissect/volume/lvm/__init__.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from dissect.volume.lvm.lvm2 import LVM2 from dissect.volume.lvm.physical import LVM2Device diff --git a/dissect/volume/md/__init__.py b/dissect/volume/md/__init__.py index 0279df9..2a5180c 100644 --- a/dissect/volume/md/__init__.py +++ b/dissect/volume/md/__init__.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from dissect.volume.md.md import MD, MDPhysicalDisk __all__ = [ diff --git a/dissect/volume/md/md.py b/dissect/volume/md/md.py index 422674e..6d9ecf4 100644 --- a/dissect/volume/md/md.py +++ b/dissect/volume/md/md.py @@ -151,7 +151,6 @@ def find_super_block(fh: BinaryIO) -> tuple[int | None, int | None, int | None]: A tuple containing the sector, major version, and minor version of the super block, or a tuple of ``None`` if no super block was found. """ - size = fh.size if (hasattr(fh, "size") and fh.size is not None) else fh.seek(0, io.SEEK_END) size //= SECTOR_SIZE diff --git a/dissect/volume/raid/stream.py b/dissect/volume/raid/stream.py index a5fe099..2d1edeb 100644 --- a/dissect/volume/raid/stream.py +++ b/dissect/volume/raid/stream.py @@ -198,7 +198,6 @@ def __init__(self, virtual_disk: VirtualDisk): def _get_stripe_read_info(self, offset: int) -> tuple[int, int, int, int, int | None]: """Calculate the stripe, offset in the stripe, data disk, parity disk and "Q" parity disk for a given sector.""" - # Reference: raid5_compute_sector stripe_size = self.virtual_disk.stripe_size raid_disks = self.virtual_disk.num_disks diff --git a/pyproject.toml b/pyproject.toml index d4c0fce..719107b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -94,7 +94,7 @@ select = [ "SLOT", "SIM", "TID", - "TCH", + "TC", "PTH", "PLC", "TRY", @@ -102,8 +102,25 @@ select = [ "PERF", "FURB", "RUF", + "D" ] -ignore = ["E203", "B904", "UP024", "ANN002", "ANN003", "ANN204", "ANN401", "SIM105", "TRY003"] +ignore = [ + "E203", "B904", "UP024", "ANN002", "ANN003", "ANN204", "ANN401", "SIM105", "TRY003", "PLC0415", + # Ignore some pydocstyle rules for now as they require a larger cleanup + "D1", + "D205", + "D301", + "D417", + # Seems bugged: https://github.com/astral-sh/ruff/issues/16824 + "D402", +] +future-annotations = true + +[tool.ruff.lint.pydocstyle] +convention = "google" + +[tool.ruff.lint.flake8-type-checking] +strict = true [tool.ruff.lint.per-file-ignores] "tests/docs/**" = ["INP001"] @@ -112,6 +129,7 @@ ignore = ["E203", "B904", "UP024", "ANN002", "ANN003", "ANN204", "ANN401", "SIM1 [tool.ruff.lint.isort] known-first-party = ["dissect.volume"] known-third-party = ["dissect"] +required-imports = ["from __future__ import annotations"] [tool.setuptools.packages.find] include = ["dissect.*"] diff --git a/tests/_docs/conf.py b/tests/_docs/conf.py index a44587a..5504934 100644 --- a/tests/_docs/conf.py +++ b/tests/_docs/conf.py @@ -1,3 +1,5 @@ +from __future__ import annotations + extensions = [ "autoapi.extension", "sphinx.ext.autodoc", From 163017e917b784170981b3fa9b5032ae076ed03c Mon Sep 17 00:00:00 2001 From: wbi Date: Tue, 24 Mar 2026 16:33:05 +0100 Subject: [PATCH 2/3] Add stricter Ruff linting --- dissect/volume/ddf/ddf.py | 8 ++++++-- dissect/volume/lvm/lvm2.py | 2 +- dissect/volume/vinum/vinum.py | 12 ++++++++---- dissect/volume/vss.py | 7 +++++-- tests/vinum/test_config.py | 5 ++++- tests/vinum/test_vinum.py | 7 +++++-- 6 files changed, 29 insertions(+), 12 deletions(-) diff --git a/dissect/volume/ddf/ddf.py b/dissect/volume/ddf/ddf.py index 95da5cc..7dcb0b1 100644 --- a/dissect/volume/ddf/ddf.py +++ b/dissect/volume/ddf/ddf.py @@ -1,7 +1,7 @@ from __future__ import annotations import io -from typing import BinaryIO +from typing import TYPE_CHECKING, BinaryIO from dissect.util import ts @@ -10,12 +10,16 @@ from dissect.volume.raid.raid import ( RAID, Configuration, - DiskMap, PhysicalDisk, VirtualDisk, ) from dissect.volume.raid.stream import Layout, Level +if TYPE_CHECKING: + from dissect.volume.raid.raid import ( + DiskMap, + ) + DEFAULT_SECTOR_SIZE = 512 DECADE = 3600 * 24 * (365 * 10 + 2) diff --git a/dissect/volume/lvm/lvm2.py b/dissect/volume/lvm/lvm2.py index 875ed70..f49e428 100644 --- a/dissect/volume/lvm/lvm2.py +++ b/dissect/volume/lvm/lvm2.py @@ -18,7 +18,7 @@ class LVM2: - """Logical Volume Manager""" + """Logical Volume Manager.""" def __init__(self, fh: list[BinaryIO | LVM2Device] | BinaryIO | LVM2Device): self.fh = [fh] if not isinstance(fh, list) else fh diff --git a/dissect/volume/vinum/vinum.py b/dissect/volume/vinum/vinum.py index ecd936d..d32f142 100644 --- a/dissect/volume/vinum/vinum.py +++ b/dissect/volume/vinum/vinum.py @@ -15,23 +15,27 @@ from dissect.volume.raid.raid import ( RAID, Configuration, - DiskMap, PhysicalDisk, VirtualDisk, ) from dissect.volume.raid.stream import Layout, Level from dissect.volume.vinum.c_vinum import MAGIC_ACTIVE, MAGIC_INACTIVE, c_vinum from dissect.volume.vinum.config import ( - SD, - Plex, PlexOrg, PlexState, SDState, - Volume, parse_vinum_config, ) if TYPE_CHECKING: + from dissect.volume.raid.raid import ( + DiskMap, + ) + from dissect.volume.vinum.config import ( + SD, + Plex, + Volume, + ) VinumPhysicalDiskDescriptor = BinaryIO | "VinumPhysicalDisk" log = logging.getLogger(__name__) diff --git a/dissect/volume/vss.py b/dissect/volume/vss.py index 9549bf2..9d3cf94 100644 --- a/dissect/volume/vss.py +++ b/dissect/volume/vss.py @@ -6,13 +6,16 @@ import uuid from collections import defaultdict from functools import cached_property -from typing import BinaryIO +from typing import TYPE_CHECKING, BinaryIO -from dissect.cstruct import Structure, cstruct +from dissect.cstruct import cstruct from dissect.util.stream import AlignedStream from dissect.volume.exceptions import Error +if TYPE_CHECKING: + from dissect.cstruct import Structure + log = logging.getLogger(__name__) log.setLevel(os.getenv("DISSECT_LOG_VSS", "CRITICAL")) diff --git a/tests/vinum/test_config.py b/tests/vinum/test_config.py index 90ec52f..01e0dd3 100644 --- a/tests/vinum/test_config.py +++ b/tests/vinum/test_config.py @@ -14,7 +14,6 @@ PlexState, SDState, TokenizeError, - VinumConfigs, Volume, VolumeState, _parse_plex_config, @@ -30,6 +29,10 @@ if TYPE_CHECKING: from collections.abc import Iterator + from dissect.volume.vinum.config import ( + VinumConfigs, + ) + CONF_TS = datetime.min.replace(tzinfo=timezone.utc) diff --git a/tests/vinum/test_vinum.py b/tests/vinum/test_vinum.py index 7749cfc..7e06961 100644 --- a/tests/vinum/test_vinum.py +++ b/tests/vinum/test_vinum.py @@ -2,11 +2,11 @@ from datetime import datetime, timezone from io import BytesIO -from typing import BinaryIO +from typing import TYPE_CHECKING, BinaryIO import pytest -from dissect.volume.raid.stream import Layout, Level +from dissect.volume.raid.stream import Level from dissect.volume.vinum.c_vinum import c_vinum from dissect.volume.vinum.vinum import ( Vinum, @@ -15,6 +15,9 @@ VinumPlexDisk, ) +if TYPE_CHECKING: + from dissect.volume.raid.stream import Layout + @pytest.mark.parametrize( ( From 18c0ac9829e9bc718b2aa621a4bcef0423922c86 Mon Sep 17 00:00:00 2001 From: wbi Date: Tue, 24 Mar 2026 17:16:38 +0100 Subject: [PATCH 3/3] Linting error --- dissect/volume/vinum/vinum.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dissect/volume/vinum/vinum.py b/dissect/volume/vinum/vinum.py index d32f142..721021e 100644 --- a/dissect/volume/vinum/vinum.py +++ b/dissect/volume/vinum/vinum.py @@ -36,6 +36,7 @@ Plex, Volume, ) + VinumPhysicalDiskDescriptor = BinaryIO | "VinumPhysicalDisk" log = logging.getLogger(__name__)