mirror of
https://github.com/kuhyx/steam-backlog-enforcer.git
synced 2026-07-04 13:23:18 +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 shutil
|
||||||
import subprocess
|
import subprocess
|
||||||
import time
|
import time
|
||||||
import urllib.request
|
|
||||||
|
|
||||||
|
import requests
|
||||||
import websockets
|
import websockets
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@ -42,10 +42,9 @@ _STEAM_STARTUP_WAIT = 45
|
|||||||
|
|
||||||
def _get_shared_js_ws_url() -> str | None:
|
def _get_shared_js_ws_url() -> str | None:
|
||||||
"""Query the CDP HTTP endpoint and return the SharedJSContext WS URL."""
|
"""Query the CDP HTTP endpoint and return the SharedJSContext WS URL."""
|
||||||
url = f"http://127.0.0.1:{_CDP_PORT}/json"
|
|
||||||
try:
|
try:
|
||||||
with urllib.request.urlopen(url, timeout=5) as resp:
|
resp = requests.get(f"http://127.0.0.1:{_CDP_PORT}/json", timeout=5)
|
||||||
targets = json.loads(resp.read())
|
targets = resp.json()
|
||||||
except (OSError, ValueError):
|
except (OSError, ValueError):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|||||||
@ -63,7 +63,7 @@ class TestRemoveGameDirs:
|
|||||||
(tmp_path / "shadercache" / "440").mkdir(parents=True)
|
(tmp_path / "shadercache" / "440").mkdir(parents=True)
|
||||||
call_count = 0
|
call_count = 0
|
||||||
|
|
||||||
def fake_rmtree(path: object, **_kw: object) -> None:
|
def fake_rmtree(_path: object, **_kw: object) -> None:
|
||||||
nonlocal call_count
|
nonlocal call_count
|
||||||
call_count += 1
|
call_count += 1
|
||||||
msg = "perm"
|
msg = "perm"
|
||||||
|
|||||||
@ -25,6 +25,7 @@ from python_pkg.steam_backlog_enforcer.hltb import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
|
from collections.abc import Callable
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
@ -243,7 +244,7 @@ def _make_ctx(
|
|||||||
session: MagicMock,
|
session: MagicMock,
|
||||||
*,
|
*,
|
||||||
cache: dict[int, float] | None = None,
|
cache: dict[int, float] | None = None,
|
||||||
progress_cb: Any = None,
|
progress_cb: Callable[..., object] | None = None,
|
||||||
) -> _SearchCtx:
|
) -> _SearchCtx:
|
||||||
return _SearchCtx(
|
return _SearchCtx(
|
||||||
session=session,
|
session=session,
|
||||||
|
|||||||
@ -33,7 +33,7 @@ class TestFetchHltbTimesCached:
|
|||||||
):
|
):
|
||||||
# fetch_hltb_times modifies cache in-place
|
# fetch_hltb_times modifies cache in-place
|
||||||
def add_to_cache(
|
def add_to_cache(
|
||||||
games: object,
|
_games: object,
|
||||||
cache: dict[int, float] | None = None,
|
cache: dict[int, float] | None = None,
|
||||||
progress_cb: object = None,
|
progress_cb: object = None,
|
||||||
) -> list[object]:
|
) -> list[object]:
|
||||||
@ -85,7 +85,7 @@ class TestFetchHltbTimesCached:
|
|||||||
):
|
):
|
||||||
|
|
||||||
def add_found(
|
def add_found(
|
||||||
games: object,
|
_games: object,
|
||||||
cache: dict[int, float] | None = None,
|
cache: dict[int, float] | None = None,
|
||||||
progress_cb: object = None,
|
progress_cb: object = None,
|
||||||
) -> list[object]:
|
) -> list[object]:
|
||||||
|
|||||||
@ -37,11 +37,9 @@ class TestGetSharedJsWsUrl:
|
|||||||
{"title": "Other", "webSocketDebuggerUrl": "ws://other"},
|
{"title": "Other", "webSocketDebuggerUrl": "ws://other"},
|
||||||
]
|
]
|
||||||
mock_resp = MagicMock()
|
mock_resp = MagicMock()
|
||||||
mock_resp.read.return_value = json.dumps(targets).encode()
|
mock_resp.json.return_value = targets
|
||||||
mock_resp.__enter__ = MagicMock(return_value=mock_resp)
|
|
||||||
mock_resp.__exit__ = MagicMock(return_value=False)
|
|
||||||
with patch(
|
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,
|
return_value=mock_resp,
|
||||||
):
|
):
|
||||||
result = _get_shared_js_ws_url()
|
result = _get_shared_js_ws_url()
|
||||||
@ -50,18 +48,16 @@ class TestGetSharedJsWsUrl:
|
|||||||
def test_no_shared_context(self) -> None:
|
def test_no_shared_context(self) -> None:
|
||||||
targets = [{"title": "Other", "webSocketDebuggerUrl": "ws://other"}]
|
targets = [{"title": "Other", "webSocketDebuggerUrl": "ws://other"}]
|
||||||
mock_resp = MagicMock()
|
mock_resp = MagicMock()
|
||||||
mock_resp.read.return_value = json.dumps(targets).encode()
|
mock_resp.json.return_value = targets
|
||||||
mock_resp.__enter__ = MagicMock(return_value=mock_resp)
|
|
||||||
mock_resp.__exit__ = MagicMock(return_value=False)
|
|
||||||
with patch(
|
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,
|
return_value=mock_resp,
|
||||||
):
|
):
|
||||||
assert _get_shared_js_ws_url() is None
|
assert _get_shared_js_ws_url() is None
|
||||||
|
|
||||||
def test_connection_error(self) -> None:
|
def test_connection_error(self) -> None:
|
||||||
with patch(
|
with patch(
|
||||||
"python_pkg.steam_backlog_enforcer.library_hider.urllib.request.urlopen",
|
"python_pkg.steam_backlog_enforcer.library_hider.requests.get",
|
||||||
side_effect=OSError,
|
side_effect=OSError,
|
||||||
):
|
):
|
||||||
assert _get_shared_js_ws_url() is None
|
assert _get_shared_js_ws_url() is None
|
||||||
|
|||||||
@ -3,6 +3,7 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import tempfile
|
||||||
from unittest.mock import MagicMock, patch
|
from unittest.mock import MagicMock, patch
|
||||||
|
|
||||||
from python_pkg.steam_backlog_enforcer.library_hider import (
|
from python_pkg.steam_backlog_enforcer.library_hider import (
|
||||||
@ -32,7 +33,10 @@ class TestRunAsUser:
|
|||||||
with (
|
with (
|
||||||
patch(f"{PKG}.os.geteuid", return_value=0),
|
patch(f"{PKG}.os.geteuid", return_value=0),
|
||||||
patch(f"{PKG}.pwd.getpwnam", return_value=mock_pw),
|
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,
|
patch(f"{PKG}.subprocess.Popen") as mock_popen,
|
||||||
):
|
):
|
||||||
_run_as_user(["steam", "-shutdown"], "alice")
|
_run_as_user(["steam", "-shutdown"], "alice")
|
||||||
|
|||||||
@ -55,9 +55,9 @@ class TestFinalizeCompletion:
|
|||||||
):
|
):
|
||||||
|
|
||||||
def set_next(
|
def set_next(
|
||||||
games: object,
|
_games: object,
|
||||||
s: State,
|
s: State,
|
||||||
c: object,
|
_c: object,
|
||||||
) -> None:
|
) -> None:
|
||||||
s.current_app_id = 2
|
s.current_app_id = 2
|
||||||
s.current_game_name = "NewGame"
|
s.current_game_name = "NewGame"
|
||||||
@ -89,9 +89,9 @@ class TestFinalizeCompletion:
|
|||||||
):
|
):
|
||||||
|
|
||||||
def set_none(
|
def set_none(
|
||||||
games: object,
|
_games: object,
|
||||||
s: State,
|
s: State,
|
||||||
c: object,
|
_c: object,
|
||||||
) -> None:
|
) -> None:
|
||||||
s.current_app_id = None
|
s.current_app_id = None
|
||||||
|
|
||||||
@ -112,9 +112,9 @@ class TestFinalizeCompletion:
|
|||||||
):
|
):
|
||||||
|
|
||||||
def set_2(
|
def set_2(
|
||||||
games: object,
|
_games: object,
|
||||||
s: State,
|
s: State,
|
||||||
c: object,
|
_c: object,
|
||||||
) -> None:
|
) -> None:
|
||||||
s.current_app_id = 2
|
s.current_app_id = 2
|
||||||
s.current_game_name = "Next"
|
s.current_game_name = "Next"
|
||||||
@ -137,9 +137,9 @@ class TestFinalizeCompletion:
|
|||||||
):
|
):
|
||||||
|
|
||||||
def set_2(
|
def set_2(
|
||||||
games: object,
|
_games: object,
|
||||||
s: State,
|
s: State,
|
||||||
c: object,
|
_c: object,
|
||||||
) -> None:
|
) -> None:
|
||||||
s.current_app_id = 2
|
s.current_app_id = 2
|
||||||
s.current_game_name = "Next"
|
s.current_game_name = "Next"
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from typing import Any
|
from typing import TYPE_CHECKING
|
||||||
from unittest.mock import MagicMock, patch
|
from unittest.mock import MagicMock, patch
|
||||||
|
|
||||||
from python_pkg.steam_backlog_enforcer.config import Config, State
|
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
|
from python_pkg.steam_backlog_enforcer.steam_api import GameInfo
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from collections.abc import Callable
|
||||||
|
|
||||||
|
|
||||||
def _game(
|
def _game(
|
||||||
app_id: int = 1,
|
app_id: int = 1,
|
||||||
@ -41,8 +44,8 @@ class TestDoScan:
|
|||||||
mock_client = MagicMock()
|
mock_client = MagicMock()
|
||||||
|
|
||||||
def build_game_list(
|
def build_game_list(
|
||||||
skip_app_ids: Any = None,
|
skip_app_ids: object = None,
|
||||||
progress_callback: Any = None,
|
progress_callback: Callable[..., object] | None = None,
|
||||||
) -> list[GameInfo]:
|
) -> list[GameInfo]:
|
||||||
# Trigger progress callback to cover those lines.
|
# Trigger progress callback to cover those lines.
|
||||||
if progress_callback:
|
if progress_callback:
|
||||||
@ -58,7 +61,7 @@ class TestDoScan:
|
|||||||
),
|
),
|
||||||
patch(
|
patch(
|
||||||
"python_pkg.steam_backlog_enforcer.scanning.fetch_hltb_times_cached",
|
"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,
|
progress_cb(1, 1, 1, "TF2") if progress_cb else None,
|
||||||
{440: 20.0},
|
{440: 20.0},
|
||||||
)[1],
|
)[1],
|
||||||
@ -84,8 +87,8 @@ class TestDoScan:
|
|||||||
mock_client = MagicMock()
|
mock_client = MagicMock()
|
||||||
|
|
||||||
def build_game_list(
|
def build_game_list(
|
||||||
skip_app_ids: Any = None,
|
skip_app_ids: object = None,
|
||||||
progress_callback: Any = None,
|
progress_callback: Callable[..., object] | None = None,
|
||||||
) -> list[GameInfo]:
|
) -> list[GameInfo]:
|
||||||
if progress_callback:
|
if progress_callback:
|
||||||
# current=1, total=2 → not %50 and not ==total → covers False branch
|
# 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:
|
def test_fetch_one_game(self) -> None:
|
||||||
client = SteamAPIClient("key", "id")
|
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]):
|
with patch.object(client, "get_achievement_details", return_value=[ach]):
|
||||||
result = client._fetch_one_game(
|
result = client._fetch_one_game(
|
||||||
{"appid": 440, "name": "TF2", "playtime_forever": 60},
|
{"appid": 440, "name": "TF2", "playtime_forever": 60},
|
||||||
@ -275,7 +275,7 @@ class TestSteamAPIClient:
|
|||||||
|
|
||||||
def test_build_game_list(self) -> None:
|
def test_build_game_list(self) -> None:
|
||||||
client = SteamAPIClient("key", "id")
|
client = SteamAPIClient("key", "id")
|
||||||
ach = AchievementInfo("A1", "Ach1", True, 100)
|
ach = AchievementInfo("A1", "Ach1", achieved=True, unlock_time=100)
|
||||||
with (
|
with (
|
||||||
patch.object(
|
patch.object(
|
||||||
client,
|
client,
|
||||||
@ -322,7 +322,7 @@ class TestSteamAPIClient:
|
|||||||
|
|
||||||
def test_refresh_single_game(self) -> None:
|
def test_refresh_single_game(self) -> None:
|
||||||
client = SteamAPIClient("key", "id")
|
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]):
|
with patch.object(client, "get_achievement_details", return_value=[ach]):
|
||||||
result = client.refresh_single_game(440, "TF2", 60)
|
result = client.refresh_single_game(440, "TF2", 60)
|
||||||
assert result is not None
|
assert result is not None
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from typing import TYPE_CHECKING, Any
|
from typing import TYPE_CHECKING
|
||||||
from unittest.mock import MagicMock, patch
|
from unittest.mock import MagicMock, patch
|
||||||
|
|
||||||
from python_pkg.steam_backlog_enforcer.store_blocker import (
|
from python_pkg.steam_backlog_enforcer.store_blocker import (
|
||||||
@ -382,7 +382,7 @@ class TestBlockStoreIptables:
|
|||||||
]
|
]
|
||||||
call_count = 0
|
call_count = 0
|
||||||
|
|
||||||
def side_effect(*args: Any, **kwargs: Any) -> MagicMock:
|
def side_effect(*_args: object, **_kwargs: object) -> MagicMock:
|
||||||
nonlocal call_count
|
nonlocal call_count
|
||||||
idx = min(call_count, len(results) - 1)
|
idx = min(call_count, len(results) - 1)
|
||||||
call_count += 1
|
call_count += 1
|
||||||
|
|||||||
@ -38,7 +38,7 @@ class TestDisableHostsProtection:
|
|||||||
|
|
||||||
def run_side_effect(
|
def run_side_effect(
|
||||||
cmd: list[str],
|
cmd: list[str],
|
||||||
**kwargs: object,
|
**_kwargs: object,
|
||||||
) -> MagicMock:
|
) -> MagicMock:
|
||||||
if any("findmnt" in str(c) for c in cmd):
|
if any("findmnt" in str(c) for c in cmd):
|
||||||
return findmnt_found
|
return findmnt_found
|
||||||
@ -52,7 +52,7 @@ class TestDisableHostsProtection:
|
|||||||
|
|
||||||
def run_side_effect(
|
def run_side_effect(
|
||||||
cmd: list[str],
|
cmd: list[str],
|
||||||
**kwargs: object,
|
**_kwargs: object,
|
||||||
) -> MagicMock:
|
) -> MagicMock:
|
||||||
if any("findmnt" in str(c) for c in cmd):
|
if any("findmnt" in str(c) for c in cmd):
|
||||||
return findmnt_missing
|
return findmnt_missing
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user