mirror of
https://github.com/kuhyx/steam-backlog-enforcer.git
synced 2026-07-04 13:43:45 +02:00
Reduce per-file-ignores by fixing lint violations across codebase
Fix ruff violations in ~15 source files and ~60+ test files to minimize per-file-ignores in pyproject.toml. Remaining ignores are justified with comments explaining why each suppression is necessary. Source fixes: FBT003 (keyword args), S310 (URL validation), SLF001 (private access), T201 (print→logging), C901 (complexity), E501 (line length), E402 (import order). Test fixes: SIM117 (combined with), FBT (boolean args), PERF203 (try in loop), S310/S607 (URLs/executables), E402/E501 (imports/lines), S108 (tmp paths), PLR0913 (too many args), ARG (unused args), ANN (type annotations), RUF059 (unused unpacked vars), PT019 (fixture naming). Remaining per-file-ignores (with justifications): - Tests: ARG, D, PLC0415, PLR2004, S101, SLF001 - music_gen sources: PLC0415 (heavy ML lazy imports) - moviepy_showcase: PLC0415 (circular dependency) - generate_images: PLR0913 (matplotlib helpers need many params) - praca_magisterska_video: E501, E402 (long paths, mpl.use)
This commit is contained in:
parent
1f02540eb5
commit
2ed98ce4db
@ -24,8 +24,8 @@ import pwd
|
||||
import shutil
|
||||
import subprocess
|
||||
import time
|
||||
import urllib.request
|
||||
|
||||
import requests
|
||||
import websockets
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@ -42,10 +42,9 @@ _STEAM_STARTUP_WAIT = 45
|
||||
|
||||
def _get_shared_js_ws_url() -> str | None:
|
||||
"""Query the CDP HTTP endpoint and return the SharedJSContext WS URL."""
|
||||
url = f"http://127.0.0.1:{_CDP_PORT}/json"
|
||||
try:
|
||||
with urllib.request.urlopen(url, timeout=5) as resp:
|
||||
targets = json.loads(resp.read())
|
||||
resp = requests.get(f"http://127.0.0.1:{_CDP_PORT}/json", timeout=5)
|
||||
targets = resp.json()
|
||||
except (OSError, ValueError):
|
||||
return None
|
||||
|
||||
|
||||
@ -63,7 +63,7 @@ class TestRemoveGameDirs:
|
||||
(tmp_path / "shadercache" / "440").mkdir(parents=True)
|
||||
call_count = 0
|
||||
|
||||
def fake_rmtree(path: object, **_kw: object) -> None:
|
||||
def fake_rmtree(_path: object, **_kw: object) -> None:
|
||||
nonlocal call_count
|
||||
call_count += 1
|
||||
msg = "perm"
|
||||
|
||||
@ -25,6 +25,7 @@ from python_pkg.steam_backlog_enforcer.hltb import (
|
||||
)
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from collections.abc import Callable
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
@ -243,7 +244,7 @@ def _make_ctx(
|
||||
session: MagicMock,
|
||||
*,
|
||||
cache: dict[int, float] | None = None,
|
||||
progress_cb: Any = None,
|
||||
progress_cb: Callable[..., object] | None = None,
|
||||
) -> _SearchCtx:
|
||||
return _SearchCtx(
|
||||
session=session,
|
||||
|
||||
@ -33,7 +33,7 @@ class TestFetchHltbTimesCached:
|
||||
):
|
||||
# fetch_hltb_times modifies cache in-place
|
||||
def add_to_cache(
|
||||
games: object,
|
||||
_games: object,
|
||||
cache: dict[int, float] | None = None,
|
||||
progress_cb: object = None,
|
||||
) -> list[object]:
|
||||
@ -85,7 +85,7 @@ class TestFetchHltbTimesCached:
|
||||
):
|
||||
|
||||
def add_found(
|
||||
games: object,
|
||||
_games: object,
|
||||
cache: dict[int, float] | None = None,
|
||||
progress_cb: object = None,
|
||||
) -> list[object]:
|
||||
|
||||
@ -37,11 +37,9 @@ class TestGetSharedJsWsUrl:
|
||||
{"title": "Other", "webSocketDebuggerUrl": "ws://other"},
|
||||
]
|
||||
mock_resp = MagicMock()
|
||||
mock_resp.read.return_value = json.dumps(targets).encode()
|
||||
mock_resp.__enter__ = MagicMock(return_value=mock_resp)
|
||||
mock_resp.__exit__ = MagicMock(return_value=False)
|
||||
mock_resp.json.return_value = targets
|
||||
with patch(
|
||||
"python_pkg.steam_backlog_enforcer.library_hider.urllib.request.urlopen",
|
||||
"python_pkg.steam_backlog_enforcer.library_hider.requests.get",
|
||||
return_value=mock_resp,
|
||||
):
|
||||
result = _get_shared_js_ws_url()
|
||||
@ -50,18 +48,16 @@ class TestGetSharedJsWsUrl:
|
||||
def test_no_shared_context(self) -> None:
|
||||
targets = [{"title": "Other", "webSocketDebuggerUrl": "ws://other"}]
|
||||
mock_resp = MagicMock()
|
||||
mock_resp.read.return_value = json.dumps(targets).encode()
|
||||
mock_resp.__enter__ = MagicMock(return_value=mock_resp)
|
||||
mock_resp.__exit__ = MagicMock(return_value=False)
|
||||
mock_resp.json.return_value = targets
|
||||
with patch(
|
||||
"python_pkg.steam_backlog_enforcer.library_hider.urllib.request.urlopen",
|
||||
"python_pkg.steam_backlog_enforcer.library_hider.requests.get",
|
||||
return_value=mock_resp,
|
||||
):
|
||||
assert _get_shared_js_ws_url() is None
|
||||
|
||||
def test_connection_error(self) -> None:
|
||||
with patch(
|
||||
"python_pkg.steam_backlog_enforcer.library_hider.urllib.request.urlopen",
|
||||
"python_pkg.steam_backlog_enforcer.library_hider.requests.get",
|
||||
side_effect=OSError,
|
||||
):
|
||||
assert _get_shared_js_ws_url() is None
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
import tempfile
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
from python_pkg.steam_backlog_enforcer.library_hider import (
|
||||
@ -32,7 +33,10 @@ class TestRunAsUser:
|
||||
with (
|
||||
patch(f"{PKG}.os.geteuid", return_value=0),
|
||||
patch(f"{PKG}.pwd.getpwnam", return_value=mock_pw),
|
||||
patch.dict(os.environ, {"DISPLAY": ":1", "XAUTHORITY": "/tmp/.X"}),
|
||||
patch.dict(
|
||||
os.environ,
|
||||
{"DISPLAY": ":1", "XAUTHORITY": tempfile.gettempdir() + "/.X"},
|
||||
),
|
||||
patch(f"{PKG}.subprocess.Popen") as mock_popen,
|
||||
):
|
||||
_run_as_user(["steam", "-shutdown"], "alice")
|
||||
|
||||
@ -55,9 +55,9 @@ class TestFinalizeCompletion:
|
||||
):
|
||||
|
||||
def set_next(
|
||||
games: object,
|
||||
_games: object,
|
||||
s: State,
|
||||
c: object,
|
||||
_c: object,
|
||||
) -> None:
|
||||
s.current_app_id = 2
|
||||
s.current_game_name = "NewGame"
|
||||
@ -89,9 +89,9 @@ class TestFinalizeCompletion:
|
||||
):
|
||||
|
||||
def set_none(
|
||||
games: object,
|
||||
_games: object,
|
||||
s: State,
|
||||
c: object,
|
||||
_c: object,
|
||||
) -> None:
|
||||
s.current_app_id = None
|
||||
|
||||
@ -112,9 +112,9 @@ class TestFinalizeCompletion:
|
||||
):
|
||||
|
||||
def set_2(
|
||||
games: object,
|
||||
_games: object,
|
||||
s: State,
|
||||
c: object,
|
||||
_c: object,
|
||||
) -> None:
|
||||
s.current_app_id = 2
|
||||
s.current_game_name = "Next"
|
||||
@ -137,9 +137,9 @@ class TestFinalizeCompletion:
|
||||
):
|
||||
|
||||
def set_2(
|
||||
games: object,
|
||||
_games: object,
|
||||
s: State,
|
||||
c: object,
|
||||
_c: object,
|
||||
) -> None:
|
||||
s.current_app_id = 2
|
||||
s.current_game_name = "Next"
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Any
|
||||
from typing import TYPE_CHECKING
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
from python_pkg.steam_backlog_enforcer.config import Config, State
|
||||
@ -15,6 +15,9 @@ from python_pkg.steam_backlog_enforcer.scanning import (
|
||||
)
|
||||
from python_pkg.steam_backlog_enforcer.steam_api import GameInfo
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from collections.abc import Callable
|
||||
|
||||
|
||||
def _game(
|
||||
app_id: int = 1,
|
||||
@ -41,8 +44,8 @@ class TestDoScan:
|
||||
mock_client = MagicMock()
|
||||
|
||||
def build_game_list(
|
||||
skip_app_ids: Any = None,
|
||||
progress_callback: Any = None,
|
||||
skip_app_ids: object = None,
|
||||
progress_callback: Callable[..., object] | None = None,
|
||||
) -> list[GameInfo]:
|
||||
# Trigger progress callback to cover those lines.
|
||||
if progress_callback:
|
||||
@ -58,7 +61,7 @@ class TestDoScan:
|
||||
),
|
||||
patch(
|
||||
"python_pkg.steam_backlog_enforcer.scanning.fetch_hltb_times_cached",
|
||||
side_effect=lambda games, progress_cb=None: (
|
||||
side_effect=lambda _games, progress_cb=None: (
|
||||
progress_cb(1, 1, 1, "TF2") if progress_cb else None,
|
||||
{440: 20.0},
|
||||
)[1],
|
||||
@ -84,8 +87,8 @@ class TestDoScan:
|
||||
mock_client = MagicMock()
|
||||
|
||||
def build_game_list(
|
||||
skip_app_ids: Any = None,
|
||||
progress_callback: Any = None,
|
||||
skip_app_ids: object = None,
|
||||
progress_callback: Callable[..., object] | None = None,
|
||||
) -> list[GameInfo]:
|
||||
if progress_callback:
|
||||
# current=1, total=2 → not %50 and not ==total → covers False branch
|
||||
|
||||
@ -253,7 +253,7 @@ class TestSteamAPIClient:
|
||||
|
||||
def test_fetch_one_game(self) -> None:
|
||||
client = SteamAPIClient("key", "id")
|
||||
ach = AchievementInfo("A1", "Ach1", True, 100)
|
||||
ach = AchievementInfo("A1", "Ach1", achieved=True, unlock_time=100)
|
||||
with patch.object(client, "get_achievement_details", return_value=[ach]):
|
||||
result = client._fetch_one_game(
|
||||
{"appid": 440, "name": "TF2", "playtime_forever": 60},
|
||||
@ -275,7 +275,7 @@ class TestSteamAPIClient:
|
||||
|
||||
def test_build_game_list(self) -> None:
|
||||
client = SteamAPIClient("key", "id")
|
||||
ach = AchievementInfo("A1", "Ach1", True, 100)
|
||||
ach = AchievementInfo("A1", "Ach1", achieved=True, unlock_time=100)
|
||||
with (
|
||||
patch.object(
|
||||
client,
|
||||
@ -322,7 +322,7 @@ class TestSteamAPIClient:
|
||||
|
||||
def test_refresh_single_game(self) -> None:
|
||||
client = SteamAPIClient("key", "id")
|
||||
ach = AchievementInfo("A1", "Ach1", True, 100)
|
||||
ach = AchievementInfo("A1", "Ach1", achieved=True, unlock_time=100)
|
||||
with patch.object(client, "get_achievement_details", return_value=[ach]):
|
||||
result = client.refresh_single_game(440, "TF2", 60)
|
||||
assert result is not None
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import TYPE_CHECKING, Any
|
||||
from typing import TYPE_CHECKING
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
from python_pkg.steam_backlog_enforcer.store_blocker import (
|
||||
@ -382,7 +382,7 @@ class TestBlockStoreIptables:
|
||||
]
|
||||
call_count = 0
|
||||
|
||||
def side_effect(*args: Any, **kwargs: Any) -> MagicMock:
|
||||
def side_effect(*_args: object, **_kwargs: object) -> MagicMock:
|
||||
nonlocal call_count
|
||||
idx = min(call_count, len(results) - 1)
|
||||
call_count += 1
|
||||
|
||||
@ -38,7 +38,7 @@ class TestDisableHostsProtection:
|
||||
|
||||
def run_side_effect(
|
||||
cmd: list[str],
|
||||
**kwargs: object,
|
||||
**_kwargs: object,
|
||||
) -> MagicMock:
|
||||
if any("findmnt" in str(c) for c in cmd):
|
||||
return findmnt_found
|
||||
@ -52,7 +52,7 @@ class TestDisableHostsProtection:
|
||||
|
||||
def run_side_effect(
|
||||
cmd: list[str],
|
||||
**kwargs: object,
|
||||
**_kwargs: object,
|
||||
) -> MagicMock:
|
||||
if any("findmnt" in str(c) for c in cmd):
|
||||
return findmnt_missing
|
||||
|
||||
Loading…
Reference in New Issue
Block a user