github exceptionptr/tsm-app-linux v1.0.5
TSM App v1.0.5

latest releases: v1.1.10, v1.1.9, v1.1.8...
2 months ago

Removed

  • Dead file tsm/ui/components/realm_row.py (RealmRowWidget was never used)
  • Dead method WoWDetectorService.add_custom_path() (never called)
  • Unused DB tables addon_versions and sync_history removed from schema
    and migrations

Fixed

  • assert self._db is not None in database.py replaced with a proper
    RuntimeError (assert can be silenced with -O)
  • Silent except Exception: pass on backup purge now logs a WARNING
  • asyncio.get_event_loop() replaced with asyncio.get_running_loop() in
    jobs.py, wow_detector.py, and app_window.py (deprecated in Python 3.12)
  • auction.py no longer accesses addon_writer._detector directly; uses the
    new public AddonWriterService.get_detector() method instead
  • All external getattr(x, "_installs", []) accesses replaced with the new
    public WoWDetectorService.installs property and the delegating
    AddonWriterService.installs property
  • SettingsDialog._logout_reset() no longer pokes self._vm._config directly;
    uses the new SettingsViewModel.reset_to_defaults() method
  • Late imports at the bottom of scheduler.py moved to the top (no actual
    circular dependency existed)
  • __main__.py no longer reaches into window._app_vm, window._settings_vm,
    and window._realm_vm directly; uses the new AppWindow.on_authenticated()
    method instead
  • app_window.py line 111 now connects to public AccountingExportView.populate
    instead of the private _populate
  • Backup delete in BackupsView now calls BackupService.delete() instead of
    calling zip_path.unlink() directly in the view
  • README WoW detection frequency corrected: detection runs at startup only, not
    every 5 minutes

Added

  • WoWDetectorService.installs - public property returning the cached install list
  • AddonWriterService.get_detector() and installs - public API on the writer
  • SettingsViewModel.reset_to_defaults() - resets config and persists in one call
  • AppWindow.on_authenticated(session) - encapsulates post-login window setup
  • AccountingExportView.populate() - renamed from _populate (public slot)
  • BackupService.delete(zip_path) - file deletion belongs in the service layer
  • tsm/ui/views/_utils.py with shared helpers:
    • set_table_cell() - replaces the duplicated _set_cell() methods in
      realm_data.py and backups.py
    • start_rate_limit_countdown() - replaces the duplicated countdown timer
      pattern in realm_data.py and backups.py
    • build_realm_tree() - replaces the duplicated API response parsing in
      app_window.py and settings.py
  • tsm/wow/utils.py with iter_wow_gv_roots() - replaces the duplicated
    installs x game-version directory loops in updater.py and backup.py
  • tsm/wow/accounts.py gains scan_tsm_accounts() and scan_realm_names(),
    moved from inline functions in accounting_export.py
  • packaging/debian/ci-depends - single source of truth for concrete package
    deps used in CI (no dpkg substitution variables); both the .deb control
    file step and the .rpm fpm flags now read from this file

Changed

  • apscheduler dependency constraint updated from >=4.0.0a5 to >=4.0.0,<5
    (APScheduler 4.0 stable has released)
  • packaging/debian/control - added missing runtime deps: python3-pydantic,
    python3-aiosqlite, python3-apscheduler, python3-structlog,
    python3-tomli-w, python3-yaml
  • release.yml .deb and .rpm steps now derive deps from ci-depends
    instead of each maintaining their own hardcoded list
  • tsm/core/scheduler.py: ServiceContainer fields typed with six Protocol
    classes (AuctionServiceProtocol, AuthServiceProtocol, UpdateServiceProtocol,
    ConfigStoreProtocol, WoWDetectorProtocol, BackupServiceProtocol) instead
    of object, enabling mypy to validate method calls in jobs.py and scheduler.py

Tests

  • tests/integration/test_scheduler.py rewritten: uses a real ServiceContainer
    with mocked services, calls start()/stop(), and asserts scheduler lifecycle
    and idempotency
  • tests/conftest.py: removed the redundant event_loop fixture (superseded by
    asyncio_mode = "auto" in pyproject.toml)
  • tests/unit/test_config_store.py (new): covers load defaults, TOML parsing,
    corrupt TOML fallback, save round-trip, and parent directory creation
  • tests/unit/test_wow_detector_service.py (new): covers empty initial state,
    set_installs, get_installs cache hit/miss, and scan() executor call
  • tests/unit/test_backup_service.py (new): covers delete success/missing,
    restore bad filename, _list_backups parsing, _find_sv_files glob, and
    run() with no accounts
  • tests/unit/test_addon_writer.py (new): covers write_data with no detector,
    missing addon dir, and successful LuaWriter call
  • tests/unit/test_auction_cache.py: added snapshot save/load round-trip and
    missing snapshot returns empty tests

CI

  • Python 3.13 added to the CI test matrix (python-version in ci.yml)

Chore

  • Fixed syntax error in app.py: impot typo corrected to import
  • auction.py: realm["name"] changed to realm.get("name", "") - name is
    optional in RealmEntry TypedDict
  • Removed unused _SUFFIX_TO_GV dict from updater.py and _GAME_VERSIONS
    tuple from backup.py
  • Removed unused Qt import from realm_data.py; Generator moved to
    collections.abc in utils.py (UP035)
  • app_window.py: captured backup_service local before lambda to narrow
    Optional type; renamed *_args to *_ in signal handlers
  • settings.py: renamed _index to _ in two combo-box signal handlers
  • __main__.py: _async_runner renamed to _ (conventional discard for
    tuple-unpacking a value kept alive only by the blocking exec() call)
  • __init__.py: added # type: ignore[import-not-found] on _version import
    (file is generated at build time by hatch-vcs)

Don't miss a new tsm-app-linux release

NewReleases is sending notifications on new releases.