mirror of
https://github.com/kuhyx/steam-backlog-enforcer.git
synced 2026-11-11 20:33:49 +01:00
Some checks are pending
dependency freshness / dependencies on newest stable (push) Waiting to run
md-naming / markdown naming convention (push) Waiting to run
pre-commit / pre-commit (${{ matrix.group }}) (mypy, mypy, ) (push) Waiting to run
pre-commit / pre-commit (${{ matrix.group }}) (pylint, pylint, ) (push) Waiting to run
pre-commit / pre-commit (${{ matrix.group }}) (rest, , mypy,pylint) (push) Waiting to run
Tests / test (push) Waiting to run
Tests / web-coverage (push) Waiting to run
repo-contract / repo contract (push) Waiting to run
kuhy 2026-11-11: game-design research needs Librarian (app 4197610) actually played during the 6-day total block. New root command total-block-research --until T opens ONE window per lock: <= 48 h, never past the lock end, a rerun never extends it. The command only validates and records (/var/lib/steam-backlog- enforcer, root 0700; lock id + deadline + two latches). The daemon opens and closes everything: Steam hosts names, the store block, the total-block chain (IP cache kept) and the steam package, reinstalled with only guard-lib's package-block hook masked for that one pacman call (--hookdir, proved in a guest). Lock file, hook and end date are never touched. Browser-game sites stay null-routed. Only Librarian may run: loop-local allowed set, strict mode (no whitelist exceptions, no zero-achievement games), launchers and counted games killed; state.json is never read or written. Expiry latches the record, then the ordinary tick re-applies hosts (now reconciled each tick), chain, uninstall and purge; the normal store block is restored once, unconditionally. Failure modes: missing/corrupt/unparseable record = no window and a corrupt one also refuses a new window (fail closed); a clock set back cannot reopen a latched window. Checked: 3290 tests at 100% coverage; whole-tree pylint 10/10 run in three parts (the hook exceeds the 60 s cap, so SKIP=pylint here); vmbox guest with real guardctl package-block and the real unit, window opened, Librarian-only enforced, clock moved past the deadline and the full block re-applied. Not verified on the host. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WzxdWWzuCEg1m87jpKyRrw
41 lines
1.3 KiB
Python
41 lines
1.3 KiB
Python
"""Autouse isolation for the total-block research window.
|
|
|
|
The record lives in ``/var/lib/steam-backlog-enforcer`` (root only) and the
|
|
install step checks pacman's real ``db.lck``. A test that reached either would
|
|
open or burn a window on the developer's machine, so both are redirected to
|
|
``tmp_path`` for every test, and the module-level memory (corrupt-record log
|
|
dedupe, install backoff, windows already released) starts empty each time.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import TYPE_CHECKING
|
|
from unittest.mock import patch
|
|
|
|
import pytest
|
|
|
|
from steam_backlog_enforcer import _research_net, _research_window
|
|
|
|
if TYPE_CHECKING:
|
|
from collections.abc import Iterator
|
|
from pathlib import Path
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def _isolate_research(tmp_path: Path) -> Iterator[None]:
|
|
"""Point the research record and pacman lock at tmp_path; reset memory."""
|
|
_research_window.LOGGED.clear()
|
|
_research_net.RETRY.clear()
|
|
_research_net.RELEASED.clear()
|
|
with (
|
|
patch(
|
|
"steam_backlog_enforcer._research_record.RESEARCH_FILE",
|
|
tmp_path / "research" / "total_block_research.json",
|
|
),
|
|
patch(
|
|
"steam_backlog_enforcer._research_net.DB_LOCK_FILE",
|
|
tmp_path / "pacman" / "db.lck",
|
|
),
|
|
):
|
|
yield
|