From 59fd2ff9e860e7abf7a577c7710b2da0e1fa665a Mon Sep 17 00:00:00 2001 From: stumpylog <797416+stumpylog@users.noreply.github.com> Date: Thu, 4 Jun 2026 09:32:52 -0700 Subject: [PATCH] ruff: enable G (logging format), ignore G004 (f-strings) Replaces the single G201 selector with the full G group. Fixes 2x G003 (string concat in log calls) and 2x G202 (redundant exc_info on logger.exception). G004 (f-strings in logging) is ignored as f-string style is accepted throughout this codebase. Co-Authored-By: Claude Sonnet 4.6 --- pyproject.toml | 47 +++++++++++++++++++------------------- src/documents/parsers.py | 2 +- src/documents/views.py | 1 - src/paperless_ai/chat.py | 2 +- src/paperless_mail/mail.py | 4 ++-- 5 files changed, 28 insertions(+), 28 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e78457e15..68e8034cb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -185,32 +185,33 @@ line-ending = "lf" [tool.ruff.lint] # https://docs.astral.sh/ruff/rules/ extend-select = [ - "COM", # https://docs.astral.sh/ruff/rules/#flake8-commas-com - "DJ", # https://docs.astral.sh/ruff/rules/#flake8-django-dj - "EXE", # https://docs.astral.sh/ruff/rules/#flake8-executable-exe - "FBT", # https://docs.astral.sh/ruff/rules/#flake8-boolean-trap-fbt - "FLY", # https://docs.astral.sh/ruff/rules/#flynt-fly - "G201", # https://docs.astral.sh/ruff/rules/#flake8-logging-format-g - "I", # https://docs.astral.sh/ruff/rules/#isort-i - "ICN", # https://docs.astral.sh/ruff/rules/#flake8-import-conventions-icn - "INP", # https://docs.astral.sh/ruff/rules/#flake8-no-pep420-inp - "ISC", # https://docs.astral.sh/ruff/rules/#flake8-implicit-str-concat-isc - "PIE", # https://docs.astral.sh/ruff/rules/#flake8-pie-pie - "PLC", # https://docs.astral.sh/ruff/rules/#pylint-pl - "PLE", # https://docs.astral.sh/ruff/rules/#pylint-pl - "PTH", # https://docs.astral.sh/ruff/rules/#flake8-use-pathlib-pth - "Q", # https://docs.astral.sh/ruff/rules/#flake8-quotes-q - "RSE", # https://docs.astral.sh/ruff/rules/#flake8-raise-rse - "RUF", # https://docs.astral.sh/ruff/rules/#ruff-specific-rules-ruf - "SIM", # https://docs.astral.sh/ruff/rules/#flake8-simplify-sim - "T20", # https://docs.astral.sh/ruff/rules/#flake8-print-t20 - "TC", # https://docs.astral.sh/ruff/rules/#flake8-type-checking-tc - "TID", # https://docs.astral.sh/ruff/rules/#flake8-tidy-imports-tid - "UP", # https://docs.astral.sh/ruff/rules/#pyupgrade-up - "W", # https://docs.astral.sh/ruff/rules/#pycodestyle-e-w + "COM", # https://docs.astral.sh/ruff/rules/#flake8-commas-com + "DJ", # https://docs.astral.sh/ruff/rules/#flake8-django-dj + "EXE", # https://docs.astral.sh/ruff/rules/#flake8-executable-exe + "FBT", # https://docs.astral.sh/ruff/rules/#flake8-boolean-trap-fbt + "FLY", # https://docs.astral.sh/ruff/rules/#flynt-fly + "G", # https://docs.astral.sh/ruff/rules/#flake8-logging-format-g + "I", # https://docs.astral.sh/ruff/rules/#isort-i + "ICN", # https://docs.astral.sh/ruff/rules/#flake8-import-conventions-icn + "INP", # https://docs.astral.sh/ruff/rules/#flake8-no-pep420-inp + "ISC", # https://docs.astral.sh/ruff/rules/#flake8-implicit-str-concat-isc + "PIE", # https://docs.astral.sh/ruff/rules/#flake8-pie-pie + "PLC", # https://docs.astral.sh/ruff/rules/#pylint-pl + "PLE", # https://docs.astral.sh/ruff/rules/#pylint-pl + "PTH", # https://docs.astral.sh/ruff/rules/#flake8-use-pathlib-pth + "Q", # https://docs.astral.sh/ruff/rules/#flake8-quotes-q + "RSE", # https://docs.astral.sh/ruff/rules/#flake8-raise-rse + "RUF", # https://docs.astral.sh/ruff/rules/#ruff-specific-rules-ruf + "SIM", # https://docs.astral.sh/ruff/rules/#flake8-simplify-sim + "T20", # https://docs.astral.sh/ruff/rules/#flake8-print-t20 + "TC", # https://docs.astral.sh/ruff/rules/#flake8-type-checking-tc + "TID", # https://docs.astral.sh/ruff/rules/#flake8-tidy-imports-tid + "UP", # https://docs.astral.sh/ruff/rules/#pyupgrade-up + "W", # https://docs.astral.sh/ruff/rules/#pycodestyle-e-w ] ignore = [ "DJ001", + "G004", # f-strings in logging: accepted style in this codebase "PLC0415", "RUF012", "SIM105", diff --git a/src/documents/parsers.py b/src/documents/parsers.py index 69ee4e285..793bbf318 100644 --- a/src/documents/parsers.py +++ b/src/documents/parsers.py @@ -110,7 +110,7 @@ def run_convert( args += ["-define", "pdf:use-cropbox=true"] if use_cropbox else [] args += [str(input_file), str(output_file)] - logger.debug("Execute: " + " ".join(args), extra={"group": logging_group}) + logger.debug("Execute: %s", " ".join(args), extra={"group": logging_group}) try: run_subprocess(args, environment, logger) diff --git a/src/documents/views.py b/src/documents/views.py index 511429129..71713284d 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -1506,7 +1506,6 @@ class DocumentViewSet( "document %s: %s", doc.pk, exc, - exc_info=True, ) raise ValidationError({"ai": [_("Invalid AI configuration.")]}) from exc diff --git a/src/paperless_ai/chat.py b/src/paperless_ai/chat.py index b2710c379..638eaae2d 100644 --- a/src/paperless_ai/chat.py +++ b/src/paperless_ai/chat.py @@ -155,7 +155,7 @@ def stream_chat_with_documents(query_str: str, documents: list[Document]): try: yield from _stream_chat_with_documents(query_str, documents) except Exception as e: - logger.exception(f"Failed to stream document chat response: {e}", exc_info=True) + logger.exception("Failed to stream document chat response: %s", e) yield CHAT_ERROR_MESSAGE diff --git a/src/paperless_mail/mail.py b/src/paperless_mail/mail.py index d551cc8cd..0d7d0b24a 100644 --- a/src/paperless_mail/mail.py +++ b/src/paperless_mail/mail.py @@ -637,8 +637,8 @@ class MailAccountHandler(LoggingMixin): self.log.info(f"Located folder: {folder_info.name}") except Exception as e: self.log.error( - "Exception during folder listing, unable to provide list folders: " - + str(e), + "Exception during folder listing, unable to provide list folders: %s", + e, ) raise MailError(