2025-05-16 06:22:53 +00:00
|
|
|
|
[tool.ruff]
|
2025-05-31 16:33:48 +00:00
|
|
|
|
line-length = 120 # Максимальная длина строки кода
|
|
|
|
|
fix = true # Автоматическое исправление ошибок где возможно
|
2025-07-02 19:30:21 +00:00
|
|
|
|
exclude = ["alembic/**/*.py", "tests/**/*.py"]
|
2025-05-31 16:33:48 +00:00
|
|
|
|
|
|
|
|
|
[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 = [
|
2025-06-01 23:56:11 +00:00
|
|
|
|
"S603", # subprocess calls - разрешаем в коде вызовы subprocess
|
|
|
|
|
"S607", # partial executable path - разрешаем в коде частичные пути к исполняемым файлам
|
|
|
|
|
"S608", # subprocess-without-shell - разрешаем в коде вызовы subprocess без shell
|
2025-05-31 16:33:48 +00:00
|
|
|
|
"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 -
|
2025-06-02 18:50:58 +00:00
|
|
|
|
"EM101", # exception can use f-string
|
2025-05-31 16:33:48 +00:00
|
|
|
|
"D206", # indent-with-spaces -
|
|
|
|
|
"D300", # triple-single-quotes -
|
|
|
|
|
"E501", # line-too-long - используем line-length вместо этого правила
|
2025-06-01 23:56:11 +00:00
|
|
|
|
"G004", # f-strings в логах разрешены
|
|
|
|
|
"FA100", # from __future__ import annotations не нужно для Python 3.13+
|
|
|
|
|
"FA102", # PEP 604 union синтаксис доступен в Python 3.13+
|
|
|
|
|
"BLE001", # blind except - разрешаем в коде общие except блоки
|
2025-06-02 18:50:58 +00:00
|
|
|
|
"TRY301", # Abstract `raise` to an inner function - иногда удобнее
|
2025-06-01 23:56:11 +00:00
|
|
|
|
"TRY300", # return/break в try блоке - иногда удобнее
|
|
|
|
|
"ARG001", # неиспользуемые аргументы - часто нужны для совместимости API
|
2025-06-02 19:40:10 +00:00
|
|
|
|
"PLR0911", #
|
2025-06-01 23:56:11 +00:00
|
|
|
|
"PLR0913", # too many arguments - иногда неизбежно
|
|
|
|
|
"PLR0912", # too many branches - иногда неизбежно
|
|
|
|
|
"PLR0915", # too many statements - иногда неизбежно
|
2025-06-02 19:40:10 +00:00
|
|
|
|
"PLR0911", # too many return statements - иногда неизбежно для обработки различных case'ов
|
|
|
|
|
"FBT001", # boolean positional arguments - иногда удобно для API совместимости
|
|
|
|
|
"FBT002", # boolean default arguments - иногда удобно для API совместимости
|
|
|
|
|
"PERF203", # try-except in loop - иногда нужно для обработки отдельных элементов
|
2025-05-31 16:33:48 +00:00
|
|
|
|
# Игнорируем некоторые строгие правила для удобства разработки
|
2025-07-02 19:30:21 +00:00
|
|
|
|
"ANN001", # Missing type annotation for `self` - иногда нужно
|
|
|
|
|
"ANN002", # Missing type annotation for `args`
|
2025-06-26 14:19:42 +00:00
|
|
|
|
"ANN003", # Missing type annotation for `*args` - иногда нужно
|
2025-07-02 19:30:21 +00:00
|
|
|
|
"ANN202", # Missing return type annotation for private function `wrapper` - иногда нужно
|
2025-05-31 16:33:48 +00:00
|
|
|
|
"ANN401", # Dynamically typed expressions (Any) - иногда нужно
|
|
|
|
|
"S101", # assert statements - нужно в тестах
|
|
|
|
|
"T201", # print statements - нужно для отладки
|
2025-06-02 18:50:58 +00:00
|
|
|
|
"TRY003", # Avoid specifying long messages outside the exception class - иногда допустимо
|
2025-05-31 16:33:48 +00:00
|
|
|
|
"PLR2004", # Magic values - иногда допустимо
|
|
|
|
|
"RUF001", # ambiguous unicode characters - для кириллицы
|
2025-06-26 14:19:42 +00:00
|
|
|
|
"RUF002", #
|
|
|
|
|
"RUF003", #
|
|
|
|
|
"RUF006", #
|
2025-06-01 23:56:11 +00:00
|
|
|
|
"TD002", # TODO без автора - не критично
|
|
|
|
|
"TD003", # TODO без ссылки на issue - не критично
|
2025-05-31 16:33:48 +00:00
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
# Настройки для отдельных директорий
|
|
|
|
|
[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
|
|
|
|
|
]
|
|
|
|
|
|
2025-06-01 23:56:11 +00:00
|
|
|
|
# Настройки приложения
|
|
|
|
|
"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 - нормально для скриптов
|
|
|
|
|
]
|
|
|
|
|
|
2025-05-31 16:33:48 +00:00
|
|
|
|
[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"]
|
2025-06-01 23:56:11 +00:00
|
|
|
|
|
|
|
|
|
[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 для фикстур
|