- yt-dlp's text is scrubbed wherever it is logged, not only in the adapter:
`formats.log_safe` takes out the URL, the `[extractor] <id>:` prefix and
file paths, and the job-failed, refused, edit-failed and backfill lines use
it. Done lines log the asset id, not the title-built path. The PII contract
now bans `rel`/`rel_path`/`title`.
- A traceback goes with a download/edit failure only when it is our own code
failing; for yt-dlp's DownloadError, our RuntimeErrors and OSErrors its foot
is the unscrubbed message.
- yt-dlp's `error` maps to WARNING: it fires on attempts the fallback client
set recovers from; the job's verdict is `download.job.failed`.
- The sink groups a bare `%s` pass-through by its text (numbers folded), and
a process's last batch closes the repeat window, so a short-lived download
child still reports what it dropped.
- Worker-side failures (stall, wall-clock, no asset, cached asset error) log
`download.job.failed` with a cause; they left no line at all before. The
crash, supervisor-error and non-zero-exit lines carry the code too.
- An edit failure is one coded line in `_fail_edit`, for every path.
- `logs.get_logger("__main__")` resolves to the `-m` module, so the worker
and the download child keep their names.
- TRACE lines carrying user content are gated on `logs.consented_trace()`,
not on the process level; a contract test pins it.
- The OAuth token refresh goes through `_upstream_failure`; transport errors
carry reason `transport`. Subscribe recognises a duplicate by reason code
only (the prose fallback was dead).
- Once-only guards for a stale sysconfig override and a refusing HLS session
directory; item_detail splits Plex failures from our own parse bugs.
- The playlist breaker line names the playlist and the action; comments that
were false (runner noqa, `_merge_vtt`, sink grouping) are corrected.
30 lines
2.1 KiB
TOML
30 lines
2.1 KiB
TOML
# Ruff config for the Siftlode backend. Keeps ruff's default rule set (E4/E7/E9 + F = the
|
|
# high-signal pyflakes/pycodestyle checks that catch real dead code + bugs), but ignores E402:
|
|
# a handful of modules (e.g. main.py) deliberately run setup — logging config, sys.path — before
|
|
# importing route modules, so "module import not at top of file" is intentional there, not cruft.
|
|
#
|
|
# line-length 100 (ruff's default is 88): matches the frontend prettier printWidth so both halves of
|
|
# the repo wrap at the same width, and it's the width `ruff format` enforces (gated via
|
|
# `ruff format --check` alongside `ruff check`).
|
|
line-length = 100
|
|
|
|
[lint]
|
|
# Beyond the default set, the rules that hold a LOG LINE to what E22.5 makes of it:
|
|
# LOG — stdlib logging misuse (`.warn()`, a logger built by hand, `exc_info` on `.exception`)
|
|
# G — the call's shape: %-style args, never an f-string the level filter cannot skip, and
|
|
# never `str(exc)` where `exc_info` would carry the traceback
|
|
# T20 — `print` instead of a log line. Two deliberate ones remain, each with its `# noqa`
|
|
# and a why: `downloads/runner.py`'s usage line is for whoever typed it, and
|
|
# `logsink.py` reports the SINK's own failure, which cannot be logged into the sink.
|
|
# TRY400 — `.error()` in an `except` where `.exception()` would keep the traceback
|
|
# TRY401 — the exception spelled into the message AND passed as `exc_info` (it is in both)
|
|
# S112 — `except: continue`, the silent swallow inside a loop
|
|
# S110 — `except: pass`, the same thing outside one
|
|
# BLE001 — a blind `except Exception`. Every one that remains carries `# noqa: BLE001 — <why>`,
|
|
# which is the point: catching everything is sometimes right (a worker thread with
|
|
# nobody to raise to, a best-effort backfill inside a sync) and always worth a sentence.
|
|
# The wider rule these two enforce lives in tests/test_swallowed_exceptions.py: a handler that
|
|
# neither logs nor re-raises says `# silent-ok: <why>`. Ruff sees only the two narrow shapes.
|
|
extend-select = ["LOG", "G", "T20", "TRY400", "TRY401", "S110", "S112", "BLE001"]
|
|
ignore = ["E402"]
|