From cd5ebdf4c392b5c81267938c46313d9a713ea04d Mon Sep 17 00:00:00 2001 From: Cristian Le Date: Tue, 21 May 2024 10:59:54 +0200 Subject: [PATCH 1/2] Add ruff Signed-off-by: Cristian Le --- .pre-commit-config.yaml | 21 ++----- pyproject.toml | 132 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+), 16 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3398a73..c894fdb 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -13,24 +13,13 @@ repos: - --hang-closing - --max-line-length=99 - - repo: https://github.com/PyCQA/isort - rev: "5.13.2" + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.8.6 hooks: - - id: isort - - - repo: https://github.com/pycqa/flake8 - rev: "7.1.1" - hooks: - - id: flake8 + - id: ruff args: - - --max-line-length=99 - files: > - (?x)^( - bin/.*| - examples/.*| - fmf/.*| - tests/.* - )$ + - '--fix' + - '--show-fixes' - repo: https://github.com/pre-commit/pre-commit-hooks rev: "v5.0.0" diff --git a/pyproject.toml b/pyproject.toml index 4bb236b..ee56fa3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -103,3 +103,135 @@ markers = [ testpaths = [ 'tests', ] + +[tool.ruff] +line-length = 99 +src = ["fmf", "tests"] +target-version = "py39" +lint.select = [ + "F", # pyflakes + "E", # pycodestyle + "W", # pycodestyle + "I", # isort + "N", # pep8-naming + "D", # pydocstyle + "UP", # pyupgrade + "B", # flake8-bugbear + "C4", # flake8-comprehensions + "YTT", # flake8-2020 + "PT", # flake8-pytest-style + "RET", # flake8-return + "SIM", # flake8-simplify + "COM", # flake8-commas + "DTZ", # flake8-datetimez + "T10", # flake8-debugger + "EXE", # flake8-executable + "PIE", # flake8-pie + "RSE", # flake8-raise + "PGH", # pygrep-hooks + "PLC", # pylint-convention + "PLE", # pylint-error + "PLR01", # pylint-refactor + "PLR02", + "PLR04", + "PLR1", + "RUF", # ruff + "D", # pydocstyle + ] +lint.ignore = [ + "B904", # Within an `except` clause, raise exceptions with `raise ... from err` or `raise ... + "COM812", # Trailing comma missing + # tmt codebase uses `warn` by default - disabling the check, switching to + # `warning` can be done in an extra patch. + "G010", # `warn` is deprecated in favor of `warning` + "PIE790", # Unnecessary `pass` statement + "PLC1901", # `{}` can be simplified to `{}` as an empty string is falsey + "PLE1205", # Too many arguments for `logging` format string + "RUF012", # Mutable class attributes should be annotated with `typing.ClassVar` + "RUF013", # PEP 484 prohibits implicit `Optional` + + # pydocstyle + # TODO: the permanent list (drop this comment once the temporary list + # below gets to zero items...) + "D203", # 1 blank line required before class docstring + # TODO: the temporary list - some of these will be enabled in their + # own patches + "D100", # Missing docstring in public module + "D101", # Missing docstring in public class + "D102", # Missing docstring in public method + "D103", # Missing docstring in public function + "D104", # Missing docstring in public package + "D105", # Missing docstring in magic method + "D106", # Missing docstring in public nested class + "D107", # Missing docstring in __init__ + "D202", # No blank lines allowed after function docstring + "D205", # 1 blank line required between summary line and description + "D210", # No whitespaces allowed surrounding docstring text + "D212", # Multi-line docstring summary should start at the first line + "D301", # Use r""" if any backslashes in a docstring + "D400", # First line should end with a period + "D401", # First line of docstring should be in imperative mood + "D415", # First line should end with a period, question mark, or exclamation point + # To review + "B007", + "B015", + "B018", + "C403", + "C405", + "C408", + "C409", + "C419", + "E721", + "N818", + "PGH004", + "PT009", + "PT011", + "PT012", + "PT027", + "RET505", + "RET507", + "RUF005", + "RUF017", + "SIM105", + "SIM108", + "SIM117", + "UP006", + "UP008", + "UP028", + "UP029", + "UP030", + "UP031", + "UP035", + # Auto-fixable + "D204", + "F401", + "I001", + "PLR0402", + "PT001", + "PT023", + "RSE102", + "RUF010", + "RUF100", + "UP003", + "UP009", + "UP020", + "UP024", + "UP024", + "UP025", + "UP032", + ] + +[tool.ruff.lint.flake8-bugbear] +extend-immutable-calls = ["tmt.utils.field"] + +[tool.ruff.lint.pydocstyle] +# "The PEP 257 convention includes all D errors apart from: D203, D212, +# D213, D214, D215, D404, D405, D406, D407, D408, D409, D410, D411, D413, +# D415, D416, and D417." +# +# See https://docs.astral.sh/ruff/faq/#does-ruff-support-numpy-or-google-style-docstrings for +# the most up-to-date info. +convention = "pep257" + +[tool.ruff.lint.isort] +known-first-party = ["fmf"] From 9f6adc5ea9a5de8b35f3af934eb8c44fd54dd0ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20=C5=A0pl=C3=ADchal?= Date: Fri, 7 Mar 2025 15:03:53 +0100 Subject: [PATCH 2/2] Sync ruff settings with the `tmt` config Let's make the setup of both projects consistent. --- .pre-commit-config.yaml | 1 + pyproject.toml | 113 +++++++++++++++++----------------------- 2 files changed, 48 insertions(+), 66 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c894fdb..3f04ffe 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,6 +20,7 @@ repos: args: - '--fix' - '--show-fixes' + - id: ruff-format - repo: https://github.com/pre-commit/pre-commit-hooks rev: "v5.0.0" diff --git a/pyproject.toml b/pyproject.toml index ee56fa3..c623681 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -61,7 +61,8 @@ platforms = ["linux"] [tool.hatch.envs.dev] description = "Development environment" dependencies = [ - "pytest-cov" + "pytest-cov", + "ruff", ] features = ["tests"] @@ -108,47 +109,76 @@ testpaths = [ line-length = 99 src = ["fmf", "tests"] target-version = "py39" -lint.select = [ + +[tool.ruff.format] +quote-style = "preserve" +exclude = [ + "tests/*", + ] + +[tool.ruff.lint] +select = [ "F", # pyflakes - "E", # pycodestyle - "W", # pycodestyle + "E", # pycodestyle error + "W", # pycodestyle warning "I", # isort "N", # pep8-naming "D", # pydocstyle "UP", # pyupgrade - "B", # flake8-bugbear - "C4", # flake8-comprehensions "YTT", # flake8-2020 - "PT", # flake8-pytest-style - "RET", # flake8-return - "SIM", # flake8-simplify + "ASYNC", # flake8-async + "S", # flake8-bandit + "B", # flake8-bugbear + "A", # flake8-builtins "COM", # flake8-commas + "C4", # flake8-comprehensions "DTZ", # flake8-datetimez "T10", # flake8-debugger "EXE", # flake8-executable + "ISC", # flake8-implicit-str-concat + "ICN", # flake8-import-conventions + "LOG", # flake8-logging + "G", # flake8-logging-format "PIE", # flake8-pie + "PYI", # flake8-pyi + "PT", # flake8-pytest-style + "Q003", # avoidable-escaped-quote + "Q004", # unnecessary-escaped-quote "RSE", # flake8-raise + "RET", # flake8-return + "SIM", # flake8-simplify + "TID", # flake8-tidy-imports + "INT", # flake8-gettext "PGH", # pygrep-hooks "PLC", # pylint-convention "PLE", # pylint-error - "PLR01", # pylint-refactor - "PLR02", - "PLR04", - "PLR1", + "PLR", # pylint-refactor + "FLY", # flynt + "FURB", # refurb "RUF", # ruff "D", # pydocstyle + # Override docstring convention + "D213", # multi-line-summary-second-line ] -lint.ignore = [ +ignore = [ "B904", # Within an `except` clause, raise exceptions with `raise ... from err` or `raise ... "COM812", # Trailing comma missing - # tmt codebase uses `warn` by default - disabling the check, switching to - # `warning` can be done in an extra patch. - "G010", # `warn` is deprecated in favor of `warning` + "G004", # Logging statement uses f-string "PIE790", # Unnecessary `pass` statement "PLC1901", # `{}` can be simplified to `{}` as an empty string is falsey "PLE1205", # Too many arguments for `logging` format string + "PLR09", # Too many branches/statements/arguments/returns + "PLR2004", # Magic value used in comparison "RUF012", # Mutable class attributes should be annotated with `typing.ClassVar` "RUF013", # PEP 484 prohibits implicit `Optional` + # flake8-bandit (S) https://docs.astral.sh/ruff/rules/#flake8-bandit-s + "S101", # Use of `assert` detected + "S603", # `subprocess` call: check for execution of untrusted input + "S607", # Starting a process with a partial executable path + "S105", # Possible hardcoded password assigned to: "PASS" + "SIM103", # Return the condition directly - can hurt readability + "D200", # One-line docstring should fit on one line + "D212", # Multi-line docstring summary should start at the first line # pydocstyle # TODO: the permanent list (drop this comment once the temporary list @@ -166,59 +196,10 @@ lint.ignore = [ "D107", # Missing docstring in __init__ "D202", # No blank lines allowed after function docstring "D205", # 1 blank line required between summary line and description - "D210", # No whitespaces allowed surrounding docstring text - "D212", # Multi-line docstring summary should start at the first line "D301", # Use r""" if any backslashes in a docstring "D400", # First line should end with a period "D401", # First line of docstring should be in imperative mood "D415", # First line should end with a period, question mark, or exclamation point - # To review - "B007", - "B015", - "B018", - "C403", - "C405", - "C408", - "C409", - "C419", - "E721", - "N818", - "PGH004", - "PT009", - "PT011", - "PT012", - "PT027", - "RET505", - "RET507", - "RUF005", - "RUF017", - "SIM105", - "SIM108", - "SIM117", - "UP006", - "UP008", - "UP028", - "UP029", - "UP030", - "UP031", - "UP035", - # Auto-fixable - "D204", - "F401", - "I001", - "PLR0402", - "PT001", - "PT023", - "RSE102", - "RUF010", - "RUF100", - "UP003", - "UP009", - "UP020", - "UP024", - "UP024", - "UP025", - "UP032", ] [tool.ruff.lint.flake8-bugbear]