From eaf74732f943cb4e4bb662ead932524460eccd70 Mon Sep 17 00:00:00 2001 From: BoulderBadgeDad Date: Tue, 2 Jun 2026 15:42:14 -0700 Subject: [PATCH] Canonical: fix ruff lint (B023 loop-bound lambda, S110 bare except-pass) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - B023: default_fetch_tracklist built a per-item lambda closing over the loop variable `it`. Replaced with a module-level _item_get(item, key, default) helper (takes the item as a param — no closure). Behavior unchanged; the dict/object normalization test still passes. - S110: the two best-effort guards in the canonical job (skip-already-pinned read, estimate_scope active-server read) now carry `# noqa: S110 — `, matching the repo's existing convention for intentional swallow-and-continue. ruff check passes on all canonical files + tests; 30 affected tests green. --- core/metadata/canonical_resolver.py | 14 +++++++++----- core/repair_jobs/canonical_version_resolve.py | 4 ++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/core/metadata/canonical_resolver.py b/core/metadata/canonical_resolver.py index 8ce84d40..a18b4b8b 100644 --- a/core/metadata/canonical_resolver.py +++ b/core/metadata/canonical_resolver.py @@ -138,6 +138,11 @@ def resolve_canonical_for_album( } +def _item_get(item: Any, key: str, default: Any = None) -> Any: + """Read ``key`` from a track item that may be a dict or an object.""" + return item.get(key, default) if isinstance(item, dict) else getattr(item, key, default) + + def default_fetch_tracklist(source: str, album_id: str) -> Optional[List[Dict[str, Any]]]: """Production ``fetch_tracklist``: pull a release's tracklist from a metadata source and normalise to ``{title, track_number, duration_ms}``. Duration is @@ -155,14 +160,13 @@ def default_fetch_tracklist(source: str, album_id: str) -> Optional[List[Dict[st items = items.get('items') or [] out: List[Dict[str, Any]] = [] for it in items: - get = it.get if isinstance(it, dict) else (lambda k, d=None: getattr(it, k, d)) - dur = get('duration_ms') + dur = _item_get(it, 'duration_ms') if dur is None: - secs = get('duration') # some sources give seconds + secs = _item_get(it, 'duration') # some sources give seconds dur = int(secs * 1000) if isinstance(secs, (int, float)) and secs else None out.append({ - 'title': get('name') or get('title') or '', - 'track_number': get('track_number'), + 'title': _item_get(it, 'name') or _item_get(it, 'title') or '', + 'track_number': _item_get(it, 'track_number'), 'duration_ms': dur, }) return out or None diff --git a/core/repair_jobs/canonical_version_resolve.py b/core/repair_jobs/canonical_version_resolve.py index 61b28655..f7fd2f00 100644 --- a/core/repair_jobs/canonical_version_resolve.py +++ b/core/repair_jobs/canonical_version_resolve.py @@ -168,7 +168,7 @@ class CanonicalVersionResolveJob(RepairJob): result.skipped += 1 result.scanned += 1 continue - except Exception: + except Exception: # noqa: S110 — best-effort skip check; on read error just resolve it pass try: @@ -216,6 +216,6 @@ class CanonicalVersionResolveJob(RepairJob): if context.config_manager: try: active_server = context.config_manager.get_active_media_server() - except Exception: + except Exception: # noqa: S110 — best-effort; fall back to no server filter pass return len(self._load_album_ids(context.db, active_server))