From 8f52b942190d8e6c42a786d1b4e130de092583a9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Oct 2026 21:42:47 +0000 Subject: [PATCH 1/2] build(deps): bump ruff Bumps the test-and-lint-dependencies group with 1 update: [ruff](https://github.com/astral-sh/ruff). Updates `ruff` from 0.16.10 to 0.17.0 - [Release notes](https://github.com/astral-sh/ruff/releases) - [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/ruff/compare/0.16.10...0.17.0) --- updated-dependencies: - dependency-name: ruff dependency-version: 0.17.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: test-and-lint-dependencies ... Signed-off-by: dependabot[bot] --- requirements/lint.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/lint.txt b/requirements/lint.txt index 8c715d66a9..e38fe1ae33 100644 --- a/requirements/lint.txt +++ b/requirements/lint.txt @@ -6,7 +6,7 @@ # Lint tools # (We are not so interested in the specific versions of the tools: the versions # are pinned to prevent unexpected linting failures when tools update) -ruff==0.16.10 +ruff==0.17.0 mypy==2.4.0 zizmor==1.30.1 From 78076cf63d23a6433b4c42132d661cc744771421 Mon Sep 17 00:00:00 2001 From: Jussi Kukkonen Date: Mon, 2 Nov 2026 15:24:36 +0000 Subject: [PATCH 2/2] lint: Tweak datetime imports ruff does not like "import datetime" now Signed-off-by: Jussi Kukkonen --- tests/repository_simulator.py | 8 ++-- tests/test_updater_top_level_update.py | 38 ++++++++----------- tuf/api/metadata.py | 6 +-- .../_internal/trusted_metadata_set.py | 4 +- 4 files changed, 23 insertions(+), 33 deletions(-) diff --git a/tests/repository_simulator.py b/tests/repository_simulator.py index 60c156f43a..fa21512032 100644 --- a/tests/repository_simulator.py +++ b/tests/repository_simulator.py @@ -46,12 +46,12 @@ from __future__ import annotations -import datetime import hashlib import logging import os import tempfile from dataclasses import dataclass, field +from datetime import UTC, datetime, timedelta from typing import TYPE_CHECKING from urllib import parse @@ -129,10 +129,8 @@ def __init__(self) -> None: self.fetch_tracker = FetchTracker() - now = datetime.datetime.now(datetime.UTC) - self.safe_expiry = now.replace(microsecond=0) + datetime.timedelta( - days=30 - ) + now = datetime.now(UTC) + self.safe_expiry = now.replace(microsecond=0) + timedelta(days=30) self._initialize() diff --git a/tests/test_updater_top_level_update.py b/tests/test_updater_top_level_update.py index 5faae0850b..a4421305bc 100644 --- a/tests/test_updater_top_level_update.py +++ b/tests/test_updater_top_level_update.py @@ -6,11 +6,11 @@ from __future__ import annotations import builtins -import datetime import os import sys import tempfile import unittest +from datetime import UTC, datetime, timedelta from pathlib import Path from typing import TYPE_CHECKING from unittest.mock import MagicMock, call, patch @@ -49,9 +49,7 @@ class TestRefresh(unittest.TestCase): # set dump_dir to trigger repository state dumps dump_dir: str | None = None - past_datetime = datetime.datetime.now(datetime.UTC).replace( - microsecond=0 - ) - datetime.timedelta(days=5) + past_datetime = datetime.now(UTC).replace(microsecond=0) - timedelta(days=5) def setUp(self) -> None: self.temp_dir = tempfile.TemporaryDirectory() @@ -311,21 +309,19 @@ def test_expired_timestamp_version_rollback(self) -> None: - Second updater refresh performed on day 18: assert that rollback check uses expired timestamp v1""" - now = datetime.datetime.now(datetime.UTC) - self.sim.timestamp.expires = now + datetime.timedelta(days=7) + now = datetime.now(UTC) + self.sim.timestamp.expires = now + timedelta(days=7) self.sim.timestamp.version = 2 # Make a successful update of valid metadata which stores it in cache self._run_refresh() - self.sim.timestamp.expires = now + datetime.timedelta(days=21) + self.sim.timestamp.expires = now + timedelta(days=21) self.sim.timestamp.version = 1 - patcher = freezegun.freeze_time( - datetime.datetime.now(datetime.UTC) + datetime.timedelta(days=18) - ) + patcher = freezegun.freeze_time(datetime.now(UTC) + timedelta(days=18)) # Check that a rollback protection is performed even if # local timestamp has expired with patcher, self.assertRaises(BadVersionNumberError): @@ -345,8 +341,8 @@ def test_expired_timestamp_snapshot_rollback(self) -> None: - Second updater refresh performed on day 18: assert that rollback protection is done with expired timestamp v1""" - now = datetime.datetime.now(datetime.UTC) - self.sim.timestamp.expires = now + datetime.timedelta(days=7) + now = datetime.now(UTC) + self.sim.timestamp.expires = now + timedelta(days=7) # Bump the snapshot version number to 3 self.sim.update_snapshot() @@ -358,11 +354,9 @@ def test_expired_timestamp_snapshot_rollback(self) -> None: self.sim.snapshot.version = 1 # Snapshot version number is set to 2, which is still less than 3 self.sim.update_snapshot() - self.sim.timestamp.expires = now + datetime.timedelta(days=21) + self.sim.timestamp.expires = now + timedelta(days=21) - patcher = freezegun.freeze_time( - datetime.datetime.now(datetime.UTC) + datetime.timedelta(days=18) - ) + patcher = freezegun.freeze_time(datetime.now(UTC) + timedelta(days=18)) # Assert that rollback protection is done even if # local timestamp has expired with patcher, self.assertRaises(BadVersionNumberError): @@ -443,7 +437,7 @@ def test_new_snapshot_hash_mismatch(self) -> None: # Modify snapshot contents without updating # timestamp's snapshot hash - self.sim.snapshot.expires += datetime.timedelta(days=1) + self.sim.snapshot.expires += timedelta(days=1) self.sim.snapshot.version += 1 # snapshot v2 self.sim.timestamp.snapshot_meta.version = self.sim.snapshot.version self.sim.timestamp.version += 1 # timestamp v3 @@ -821,21 +815,19 @@ def test_expired_metadata(self) -> None: - Second updater refresh performed on day 18, it is successful and timestamp/snapshot final versions are v2""" - now = datetime.datetime.now(datetime.UTC) - self.sim.timestamp.expires = now + datetime.timedelta(days=7) + now = datetime.now(UTC) + self.sim.timestamp.expires = now + timedelta(days=7) # Make a successful update of valid metadata which stores it in cache self._run_refresh() self.sim.targets.version += 1 self.sim.update_snapshot() - self.sim.timestamp.expires = now + datetime.timedelta(days=21) + self.sim.timestamp.expires = now + timedelta(days=21) # Mocking time so that local timestam has expired # but the new timestamp has not - with freezegun.freeze_time( - datetime.datetime.now(datetime.UTC) + datetime.timedelta(days=18) - ): + with freezegun.freeze_time(datetime.now(UTC) + timedelta(days=18)): self._run_refresh() # Assert that the final version of timestamp/snapshot is version 2 diff --git a/tuf/api/metadata.py b/tuf/api/metadata.py index 8bd281131a..23a498932e 100644 --- a/tuf/api/metadata.py +++ b/tuf/api/metadata.py @@ -155,7 +155,7 @@ def signed_bytes(self) -> bytes: """Default canonical json byte representation of ``self.signed``.""" # Use local scope import to avoid circular import errors - from tuf.api.serialization.json import CanonicalJSONSerializer # noqa: I001, PLC0415 + from tuf.api.serialization.json import CanonicalJSONSerializer # noqa: PLC0415 return CanonicalJSONSerializer().serialize(self.signed) @@ -264,7 +264,7 @@ def from_bytes( if deserializer is None: # Use local scope import to avoid circular import errors - from tuf.api.serialization.json import JSONDeserializer # noqa: I001, PLC0415 + from tuf.api.serialization.json import JSONDeserializer # noqa: PLC0415 deserializer = JSONDeserializer() @@ -291,7 +291,7 @@ def to_bytes(self, serializer: MetadataSerializer | None = None) -> bytes: if serializer is None: # Use local scope import to avoid circular import errors - from tuf.api.serialization.json import JSONSerializer # noqa: I001, PLC0415 + from tuf.api.serialization.json import JSONSerializer # noqa: PLC0415 serializer = JSONSerializer(compact=True) diff --git a/tuf/ngclient/_internal/trusted_metadata_set.py b/tuf/ngclient/_internal/trusted_metadata_set.py index 0781466882..fff4dbc415 100644 --- a/tuf/ngclient/_internal/trusted_metadata_set.py +++ b/tuf/ngclient/_internal/trusted_metadata_set.py @@ -63,9 +63,9 @@ from __future__ import annotations -import datetime import logging from collections import abc +from datetime import UTC, datetime from typing import TYPE_CHECKING, cast from tuf.api import exceptions @@ -116,7 +116,7 @@ def __init__(self, root_data: bytes, envelope_type: EnvelopeType): """ self._trusted_set: dict[str, Signed] = {} self._trusted_delegations: set[tuple[str, str]] = set() - self.reference_time = datetime.datetime.now(datetime.UTC) + self.reference_time = datetime.now(UTC) if envelope_type is EnvelopeType.SIMPLE: self._load_data = _load_from_simple_envelope