mirror of
https://github.com/Second-Hand-Friends/kleinanzeigen-bot.git
synced 2026-03-12 02:31:45 +01:00
refact: use ruff instead of autopep8,bandit,pylint for linting
This commit is contained in:
232
pyproject.toml
232
pyproject.toml
@@ -53,13 +53,12 @@ dev = [
|
||||
"pytest-cov>=6.0.0",
|
||||
# linting:
|
||||
"autopep8",
|
||||
"pylint",
|
||||
"ruff",
|
||||
"mypy",
|
||||
"pyright",
|
||||
# security:
|
||||
"bandit",
|
||||
# packaging:
|
||||
"pyinstaller",
|
||||
"platformdirs", # required by pyinstaller
|
||||
]
|
||||
|
||||
[project.urls]
|
||||
@@ -84,8 +83,8 @@ compile.cmd = "python -O -m PyInstaller pyinstaller.spec --clean"
|
||||
compile.env = {PYTHONHASHSEED = "1", SOURCE_DATE_EPOCH = "0"} # https://pyinstaller.org/en/stable/advanced-topics.html#creating-a-reproducible-build
|
||||
debug = "python -m pdb -m kleinanzeigen_bot"
|
||||
format = "autopep8 --recursive --in-place src tests --verbose"
|
||||
lint = {shell = "pylint -v src tests && autopep8 -v --exit-code --recursive --diff src tests && mypy" }
|
||||
audit = "bandit -c pyproject.toml -r src"
|
||||
lint = {shell = "ruff check && mypy && pyright" }
|
||||
fix = {shell = "ruff check --fix" }
|
||||
test = "python -m pytest --capture=tee-sys -v"
|
||||
utest = "python -m pytest --capture=tee-sys -v -m 'not itest'"
|
||||
itest = "python -m pytest --capture=tee-sys -v -m 'itest'"
|
||||
@@ -109,11 +108,135 @@ aggressive = 3
|
||||
|
||||
|
||||
#####################
|
||||
# bandit
|
||||
# https://pypi.org/project/bandit/
|
||||
# https://github.com/PyCQA/bandit
|
||||
# ruff
|
||||
# https://pypi.org/project/ruff/
|
||||
# https://docs.astral.sh/ruff/configuration/
|
||||
#####################
|
||||
[tool.bandit]
|
||||
[tool.ruff]
|
||||
include = ["pyproject.toml", "src/**/*.py", "tests/**/*.py"]
|
||||
line-length = 160
|
||||
indent-width = 4
|
||||
target-version = "py310"
|
||||
|
||||
[tool.ruff.lint]
|
||||
# https://docs.astral.sh/ruff/rules/
|
||||
select = [
|
||||
"A", # flake8-builtins
|
||||
"ARG", # flake8-unused-arguments
|
||||
"ANN", # flake8-annotations
|
||||
"ASYNC", # flake8-async
|
||||
#"BLE", # flake8-blind-except
|
||||
"B", # flake8-bugbear
|
||||
"C4", # flake8-comprehensions
|
||||
#"COM", # flake8-commas
|
||||
#"CPY", # flake8-copyright
|
||||
"DTZ", # flake8-datetimez
|
||||
#"EM", # TODO flake8-errmsg
|
||||
#"ERA", # eradicate commented-out code
|
||||
"EXE", # flake8-executable
|
||||
"FA", # flake8-future-annotations
|
||||
"FBT", # flake8-boolean-trap
|
||||
"FIX", # flake8-fixme
|
||||
"G", # flake8-logging-format
|
||||
"ICN", # flake8-import-conventions
|
||||
"ISC", # flake8-implicit-str-concat
|
||||
"INP", # flake8-no-pep420
|
||||
"INT", # flake8-gettext
|
||||
"LOG", # flake8-logging
|
||||
"PIE", # flake8-pie
|
||||
"PT", # flake8-pytest-style
|
||||
#"PTH", # flake8-use-pathlib
|
||||
"PYI", # flake8-pyi
|
||||
"Q", # flake8-quotes
|
||||
"RET", # flake8-return
|
||||
"RSE", # flake8-raise
|
||||
"S", # flake8-bandit
|
||||
"SIM", # flake8-simplify
|
||||
"SLF", # flake8-self
|
||||
"SLOT", # flake8-slots
|
||||
"T10", # flake8-debugger
|
||||
#"T20", # flake8-print
|
||||
"TC", # flake8-type-checking
|
||||
"TD", # flake8-todo
|
||||
"TID", # flake8-flake8-tidy-import
|
||||
"YTT", # flake8-2020
|
||||
|
||||
"E", # pycodestyle-errors
|
||||
"W", # pycodestyle-warnings
|
||||
|
||||
#"C90", # mccabe
|
||||
"D", # pydocstyle
|
||||
"F", # pyflakes
|
||||
"FLY", # flynt
|
||||
"I", # isort
|
||||
"PERF", # perflint
|
||||
"PGH", # pygrep-hooks
|
||||
"PL", # pylint
|
||||
]
|
||||
ignore = [
|
||||
"ANN401", # Dynamically typed expressions (typing.Any) are disallowed
|
||||
"ASYNC210", # TODO Async functions should not call blocking HTTP methods
|
||||
"ASYNC230", # TODO Async functions should not open files with blocking methods like `open`
|
||||
"D1", # Missing docstring in ...
|
||||
"D200", # One-line docstring should fit on one line
|
||||
"D202", # No blank lines allowed after function docstring (found 1)
|
||||
"D203", # 1 blank line required before class docstring
|
||||
"D204", # 1 blank line required after class docstring
|
||||
"D205", # 1 blank line required between summary line and description
|
||||
"D209", # Multi-line docstring closing quotes should be on a separate line"
|
||||
"D212", # Multi-line docstring summary should start at the first line
|
||||
"D213", # Multi-line docstring summary should start at the second line
|
||||
"D400", # First line should end with a period
|
||||
"D401", # First line of docstring should be in imperative mood
|
||||
"D402", # First line should not be the function's signature
|
||||
"D404", # First word of the docstring should not be "This"
|
||||
"D413", # Missing blank line after last section ("Returns")"
|
||||
"D415", # First line should end with a period, question mark, or exclamation point
|
||||
"D417", # Missing argument description in the docstring for
|
||||
#"E124", # Don't change indention of multi-line statements
|
||||
#"E128", # Don't change indention of multi-line statements
|
||||
#"E231", # Don't add whitespace after colon (:) on type declaration
|
||||
#"E251", # Don't remove whitespace around parameter '=' sign.
|
||||
"E401", # Don't put imports on separate lines
|
||||
"Q000", # TODO Single quotes found but double quotes preferred
|
||||
"PERF203", # `try`-`except` within a loop incurs performance overhead
|
||||
"RET504", # Unnecessary assignment to `...` before `return` statement
|
||||
"PYI041", # Use `float` instead of `int | float`
|
||||
"SIM102", # Use a single `if` statement instead of nested `if` statements
|
||||
"SIM105", # Use `contextlib.suppress(TimeoutError)` instead of `try`-`except`-`pass`
|
||||
"SIM114", # Combine `if` branches using logical `or` operator
|
||||
"TC006", # Add quotes to type expression in `typing.cast()`
|
||||
]
|
||||
|
||||
[tool.ruff.format]
|
||||
quote-style = "double"
|
||||
indent-style = "space"
|
||||
line-ending = "native"
|
||||
docstring-code-format = false
|
||||
skip-magic-trailing-comma = false
|
||||
|
||||
[tool.ruff.lint.per-file-ignores]
|
||||
"tests/**/*.py" = [
|
||||
"ARG",
|
||||
"B",
|
||||
"FBT",
|
||||
"INP",
|
||||
"SLF",
|
||||
"S101", # Use of `assert` detected
|
||||
"PLR2004" # Magic value used in comparison
|
||||
]
|
||||
|
||||
[tool.ruff.lint.pylint]
|
||||
# https://pylint.pycqa.org/en/latest/user_guide/configuration/all-options.html#design-checker
|
||||
# https://pylint.pycqa.org/en/latest/user_guide/checkers/features.html#design-checker-messages
|
||||
#max-args = 6 # max. number of args for function / method (R0913)
|
||||
#max-attributes = 15 # max. number of instance attrs for a class (R0902)
|
||||
max-branches = 40 # max. number of branch for function / method body (R0912)
|
||||
#max-locals = 30 # max. number of local vars for function / method body (R0914)
|
||||
max-returns = 15 # max. number of return / yield for function / method body (R0911)
|
||||
max-statements = 150 # max. number of statements in function / method body (R0915)
|
||||
#max-public-methods = 30 # max. number of public methods for a class (R0904)
|
||||
#max-positional-arguments = 6 # max. number of positional args for function / method (R0917)
|
||||
|
||||
|
||||
#####################
|
||||
@@ -147,97 +270,6 @@ pythonVersion = "3.10"
|
||||
typeCheckingMode = "standard"
|
||||
|
||||
|
||||
#####################
|
||||
# pylint
|
||||
# https://pypi.org/project/pylint/
|
||||
# https://github.com/PyCQA/pylint
|
||||
#####################
|
||||
[tool.pylint.master]
|
||||
extension-pkg-whitelist = "win32api"
|
||||
ignore = "version.py"
|
||||
jobs = 4
|
||||
persistent = "no"
|
||||
|
||||
# https://pylint.pycqa.org/en/latest/user_guide/checkers/extensions.html
|
||||
load-plugins = [
|
||||
"pylint.extensions.bad_builtin",
|
||||
#"pylint.extensions.broad_try_clause",
|
||||
"pylint.extensions.check_elif",
|
||||
"pylint.extensions.code_style",
|
||||
"pylint.extensions.comparison_placement",
|
||||
#"pylint.extensions.confusing_elif",
|
||||
"pylint.extensions.consider_ternary_expression",
|
||||
"pylint.extensions.consider_refactoring_into_while_condition",
|
||||
"pylint.extensions.dict_init_mutate",
|
||||
"pylint.extensions.docstyle",
|
||||
#"pylint.extensions.docparams",
|
||||
"pylint.extensions.dunder",
|
||||
"pylint.extensions.empty_comment",
|
||||
"pylint.extensions.eq_without_hash",
|
||||
"pylint.extensions.for_any_all",
|
||||
#"pylint.extensions.magic_value",
|
||||
#"pylint.extensions.mccabe",
|
||||
"pylint.extensions.set_membership",
|
||||
"pylint.extensions.no_self_use",
|
||||
"pylint.extensions.overlapping_exceptions",
|
||||
"pylint.extensions.private_import",
|
||||
"pylint.extensions.redefined_loop_name",
|
||||
"pylint.extensions.redefined_variable_type",
|
||||
"pylint.extensions.set_membership",
|
||||
"pylint.extensions.typing",
|
||||
#"pylint.extensions.while_used"
|
||||
]
|
||||
|
||||
[tool.pylint.basic]
|
||||
good-names = ["i", "j", "k", "v", "by", "ex", "fd", "_", "T"]
|
||||
|
||||
[tool.pylint.format]
|
||||
# https://pylint.pycqa.org/en/latest/technical_reference/features.html#format-checker
|
||||
# https://pylint.pycqa.org/en/latest/user_guide/checkers/features.html#format-checker-messages
|
||||
max-line-length = 160 # maximum number of characters on a single line (C0301)
|
||||
max-module-lines = 2000 # maximum number of lines in a module (C0302)
|
||||
|
||||
[tool.pylint.logging]
|
||||
logging-modules = "logging"
|
||||
|
||||
[tool.pylint.messages_control]
|
||||
# https://pylint.pycqa.org/en/latest/technical_reference/features.html#messages-control-options
|
||||
disable = [
|
||||
"broad-except",
|
||||
"consider-using-assignment-expr",
|
||||
"docstring-first-line-empty",
|
||||
"global-statement",
|
||||
"missing-docstring",
|
||||
"multiple-imports",
|
||||
"multiple-statements",
|
||||
"no-self-use",
|
||||
"no-member", # pylint cannot find async methods from super class
|
||||
"too-few-public-methods"
|
||||
]
|
||||
|
||||
[tool.pylint.tests]
|
||||
# Configuration specific to test files
|
||||
disable = [
|
||||
"redefined-outer-name" # Allow pytest fixtures to be used as parameters
|
||||
]
|
||||
|
||||
[tool.pylint.miscelaneous]
|
||||
# https://pylint.pycqa.org/en/latest/user_guide/configuration/all-options.html#miscellaneous-checker
|
||||
notes = [ "FIXME", "XXX", "TODO" ] # list of note tags to take in consideration
|
||||
|
||||
[tool.pylint.design]
|
||||
# https://pylint.pycqa.org/en/latest/user_guide/configuration/all-options.html#design-checker
|
||||
# https://pylint.pycqa.org/en/latest/user_guide/checkers/features.html#design-checker-messages
|
||||
max-args = 6 # max. number of args for function / method (R0913)
|
||||
max-attributes = 15 # max. number of instance attrs for a class (R0902)
|
||||
max-branches = 40 # max. number of branch for function / method body (R0912)
|
||||
max-locals = 30 # max. number of local vars for function / method body (R0914)
|
||||
max-returns = 15 # max. number of return / yield for function / method body (R0911)
|
||||
max-statements = 150 # max. number of statements in function / method body (R0915)
|
||||
max-public-methods = 30 # max. number of public methods for a class (R0904)
|
||||
max-positional-arguments = 6 # max. number of positional args for function / method (R0917)
|
||||
|
||||
|
||||
#####################
|
||||
# pytest
|
||||
# https://pypi.org/project/pytest/
|
||||
|
||||
Reference in New Issue
Block a user