[tool.ruff] line-length = 120 # Максимальная длина строки кода fix = true # Автоматическое исправление ошибок где возможно exclude = ["alembic/**/*.py", "tests/**/*.py"] [tool.ruff.lint] # Включаем автоматическое исправление для всех правил, которые поддерживают это fixable = ["ALL"] unfixable = [] # Выбранные правила для проверки кода select = [ "E", # pycodestyle errors - ошибки стиля кода "W", # pycodestyle warnings - предупреждения стиля кода "F", # pyflakes - неиспользуемые импорты, переменные и синтаксические ошибки "I", # isort - сортировка и группировка импортов "N", # pep8-naming - соглашения именования PEP 8 "UP", # pyupgrade - обновление синтаксиса до современного Python "YTT", # flake8-2020 - проверки для Python 2020+ "ANN", # flake8-annotations - проверка аннотаций типов "S", # bandit - проверки безопасности "BLE", # flake8-blind-except - избегание слепых except блоков "FBT", # flake8-boolean-trap - избегание boolean параметров "B", # flake8-bugbear - обнаружение вероятных багов "A", # flake8-builtins - избегание переопределения встроенных функций "C4", # flake8-comprehensions - улучшение list/dict/set comprehensions "DTZ", # flake8-datetimez - правильная работа с часовыми поясами "T10", # flake8-debugger - обнаружение отладочных вызовов "DJ", # flake8-django - специфичные для Django проверки "EM", # flake8-errmsg - правильное форматирование сообщений об ошибках "EXE", # flake8-executable - проверка исполняемых файлов "FA", # flake8-future-annotations - использование future annotations "ISC", # flake8-implicit-str-concat - неявная конкатенация строк "ICN", # flake8-import-conventions - соглашения импортов "G", # flake8-logging-format - форматирование логирования "INP", # flake8-no-pep420 - проверка __init__.py файлов "PIE", # flake8-pie - разнообразные улучшения кода "T20", # flake8-print - избегание print statements "PYI", # flake8-pyi - проверки для .pyi файлов "PT", # flake8-pytest-style - стиль pytest тестов "Q", # flake8-quotes - единообразие кавычек "RSE", # flake8-raise - правильное использование raise "RET", # flake8-return - правильное использование return "SLF", # flake8-self - избегание доступа к приватным членам "SLOT", # flake8-slots - использование __slots__ "SIM", # flake8-simplify - упрощение кода "TID", # flake8-tidy-imports - организация импортов "INT", # flake8-gettext - интернационализация "ARG", # flake8-unused-arguments - неиспользуемые аргументы "PTH", # flake8-use-pathlib - использование pathlib вместо os.path "TD", # flake8-todos - проверка TODO комментариев "PD", # pandas-vet - лучшие практики pandas "PGH", # pygrep-hooks - общие проверки с помощью grep "PL", # pylint - расширенные проверки качества кода "TRY", # tryceratops - улучшение обработки исключений "FLY", # flynt - преобразование в f-strings "NPY", # numpy specific rules - правила для numpy "AIR", # airflow - правила для Apache Airflow "PERF", # perflint - проверки производительности "FURB", # refurb - рефакторинг предложения "LOG", # flake8-logging - правильное логирование "RUF", # ruff specific rules - специфичные правила ruff ] # Игнорируемые правила (в основном конфликтующие с форматтером) ignore = [ "S603", # subprocess calls - разрешаем в коде вызовы subprocess "S607", # partial executable path - разрешаем в коде частичные пути к исполняемым файлам "S608", # subprocess-without-shell - разрешаем в коде вызовы subprocess без shell "COM812", # trailing-comma-missing - конфликтует с форматтером "COM819", # trailing-comma-prohibited - "ISC001", # single-line-implicit-string-concatenation - "ISC002", # multi-line-implicit-string-concatenation - "Q000", # bad-quotes-inline-string - "Q001", # bad-quotes-multiline-string - "Q002", # bad-quotes-docstring - "Q003", # avoidable-escaped-quote - "W191", # tab-indentation - "E111", # indentation-with-invalid-multiple - "E114", # indentation-with-invalid-multiple-comment - "E117", # over-indented - "EM101", # exception can use f-string "D206", # indent-with-spaces - "D300", # triple-single-quotes - "E501", # line-too-long - используем line-length вместо этого правила "G004", # f-strings в логах разрешены "FA100", # from __future__ import annotations не нужно для Python 3.13+ "FA102", # PEP 604 union синтаксис доступен в Python 3.13+ "BLE001", # blind except - разрешаем в коде общие except блоки "TRY301", # Abstract `raise` to an inner function - иногда удобнее "TRY300", # return/break в try блоке - иногда удобнее "ARG001", # неиспользуемые аргументы - часто нужны для совместимости API "PLR0911", # "PLR0913", # too many arguments - иногда неизбежно "PLR0912", # too many branches - иногда неизбежно "PLR0915", # too many statements - иногда неизбежно "PLR0911", # too many return statements - иногда неизбежно для обработки различных case'ов "FBT001", # boolean positional arguments - иногда удобно для API совместимости "FBT002", # boolean default arguments - иногда удобно для API совместимости "PERF203", # try-except in loop - иногда нужно для обработки отдельных элементов # Игнорируем некоторые строгие правила для удобства разработки "ANN001", # Missing type annotation for `self` - иногда нужно "ANN002", # Missing type annotation for `args` "ANN003", # Missing type annotation for `*args` - иногда нужно "ANN202", # Missing return type annotation for private function `wrapper` - иногда нужно "ANN401", # Dynamically typed expressions (Any) - иногда нужно "S101", # assert statements - нужно в тестах "T201", # print statements - нужно для отладки "TRY003", # Avoid specifying long messages outside the exception class - иногда допустимо "PLR2004", # Magic values - иногда допустимо "RUF001", # ambiguous unicode characters - для кириллицы "RUF002", # "RUF003", # "RUF006", # "TD002", # TODO без автора - не критично "TD003", # TODO без ссылки на issue - не критично ] # Настройки для отдельных директорий [tool.ruff.lint.per-file-ignores] # Тесты - более мягкие правила "tests/**/*.py" = [ "S101", # assert statements - нормально в тестах "PLR2004", # magic values - нормально в тестах "ANN", # type annotations - не обязательно в тестах "EXE001", # shebang without executable - нормально для тестовых скриптов "PTH100", # os.path usage - допустимо в тестах "PTH120", # os.path.dirname - допустимо в тестах "BLE001", # blind except - допустимо в тестах "T201", # print statements - нормально в тестах "F841", # unused variables - нормально в тестах "ARG001", # unused arguments - нормально в тестах "DTZ005", # datetime without tz - допустимо в тестах ] # Утилиты - более мягкие правила для аннотаций "utils/**/*.py" = [ "T201", # print statements - иногда нужно в утилитах "A001", # builtin shadowing - иногда нужно "F841", # unused variables - иногда остаются при рефакторинге "RET503", # missing return - иногда допустимо "ARG001", # unused arguments - иногда для совместимости API ] # Миграции Alembic "alembic/**/*.py" = [ "ANN", # type annotations - не нужно в миграциях "INP001", # missing __init__.py - нормально для alembic ] # Настройки приложения "settings.py" = [ "S105", # possible hardcoded password - "Authorization" это название заголовка HTTP ] # Тестовые файлы в корне "test_*.py" = [ "S106", # hardcoded password - нормально в тестах "S603", # subprocess calls - нормально в тестах "S607", # partial executable path - нормально в тестах "BLE001", # blind except - допустимо в тестах "ANN", # type annotations - не обязательно в тестах "T201", # print statements - нормально в тестах "INP001", # missing __init__.py - нормально для скриптов ] [tool.ruff.lint.isort] # Настройки для сортировки импортов known-first-party = ["auth", "cache", "orm", "resolvers", "services", "utils", "schema", "settings"] section-order = ["future", "standard-library", "third-party", "first-party", "local-folder"] [tool.pytest.ini_options] # Конфигурация pytest testpaths = ["tests"] python_files = ["test_*.py", "*_test.py"] python_classes = ["Test*"] python_functions = ["test_*"] addopts = [ "-ra", # Показывать краткую сводку всех результатов тестов "--strict-markers", # Требовать регистрации всех маркеров "--tb=short", # Короткий traceback "-v", # Verbose output ] markers = [ "slow: marks tests as slow (deselect with '-m \"not slow\"')", "integration: marks tests as integration tests", "unit: marks tests as unit tests", ] # Настройки для pytest-asyncio asyncio_mode = "auto" # Автоматическое обнаружение async тестов asyncio_default_fixture_loop_scope = "function" # Область видимости event loop для фикстур