# Анализ сложности проектов на python
Идея описана в статье моего блога - [Управление простотой](https://олег.кряхтит.онлайн/2025/06/14/simplicity-management.html).
# Кратко
Утилита для скоринга относительной сложности проекта. Сравнивать между собой проекты с её помощью не имеет большого смысла, идея в отслеживании динамики усложнения проекта в процессе его жизненного цикла. Комплексная метрика - попугаи.
## Формат вывода
Запуск на самого себя. Если null в тестах это проблема - надо писать тесты, а не ныть.
``` yaml
app:
lines: 409
files: 5
dependencies: 0
directories: 0
max_directory_depth: 0
functions:
count: 34
size_stats:
min: 1
mean: 10
p90: 21
p95: 27
max: 31
classes:
count: 10
size_stats:
min: 2
mean: 40
p90: 295
p95: 295
max: 295
imports:
count: 26
size_stats:
min: 2
mean: 5
p90: 11
p95: 11
max: 11
tests:
lines: 0
files: 0
dependencies: 0
directories: 0
max_directory_depth: 0
functions:
count: 0
size_stats: null
classes:
count: 0
size_stats: null
imports:
count: 0
size_stats: null
logical:
api_endpoints: 0
async_events: 0
event_subscriptions: 0
periodic_tasks: 0
integrated_systems: 0
complexity_score: 172
```
# Длинно
Писалось по такому ТЗ (обвесил комментариями и отметил нереализованные пункты).
1. Анализ физической структуры проекта:
- Подсчёт строк кода (LOC) раздельно для основного кода и тестов
- Подсчёт количества файлов (.py) раздельно для app и tests
- Подсчёт количества директорий раздельно для app и tests
- Определение максимальной глубины вложенности директорий (кажется почти бесполезным).
2. Анализ кодовой базы:
- Подсчёт количества классов раздельно для app и tests
- Подсчёт количества функций раздельно для app и tests
- Расчёт статистики размеров (min, mean, p90, p95, max) для классов и функций (p90, p95 и max совпадают в небольших проектах и не имеют значения).
- Определение максимальной глубины наследования классов (кажется почти бесполезным).
3. Анализ зависимостей:
- Определение зависимостей из pyproject.toml
- PEP 621
- Poetry
- Анализ requirements.txt, requirements-dev.txt, requirements-test.txt
- Разделение зависимостей на основные (app) и тестовые (tests)
4. Анализ логической структуры:
- Обнаружение API эндпоинтов (FastAPI)
- Подсчёт асинхронных событий (FastStream)
- Выявление подписок на события (FastStream)
- Обнаружение периодических задач (FastStream - оказалось ненужным).
- Определение интеграций с внешними системами
- [x] PostgreSQL, Redis и др. (кажется почти бесполезным)
- [ ] HTTP-клиенты / SDK в микросервисной архитектуре
5. Расчёт комплексной метрики:
- Вычисление единого коэффициента сложности проекта
- Использование логарифмического масштабирования метрик
- Жёстко заданные весовые коэффициенты для разных аспектов сложности, которые можно поправить "под себя", но я бы не стал. Всё равно это попугаи.
6. Фильтрация и игнорирование:
- [ ] Автоматическое использование .gitignore
- Автоматическое разделение на основной код и тесты по шаблонам имён
- Пропуск бинарных и не-Python файлов
7. Обработка ошибок:
- Устойчивость к синтаксическим ошибкам в коде
- Обработка проблем с кодировкой файлов
8. Вывод результатов:
- Машинно- и человеко-читаемый YAML-подобный вывод.
- Разделение метрик на логические группы (app, tests, logical, complexity_score).
- Включение всех рассчитанных метрик
- Чёткое отделение финального коэффициента сложности
9. Производительность:
- Никаких требований, но работает быстро.
10. Интерфейс:
- Принимает только один обязательный аргумент: путь к директории проекта
11. Поддержка технологий:
- Совместимость с FastAPI и FastStream
- Поддержка Poetry и стандартных requirements.txt
- Распознавание async/await функций
12. Статистическая обработка:
- Корректная обработка пустых выборок
- Устойчивость к выбросам в данных
13. Архитектура:
- Решил отклониться от "один python-скрипт без зависимостей"
- "Плагинная" архитектура - достаточно докинуть новых файлов в plugins для поддержки других фреймворков, в том числе и самопальных/корпоративных.
14. Практическая полезность:
- Возможность сравнения динамики усложнения проекта
- Выявление "раздутых" компонентов (большие классы/функции)
Raw data
{
"_id": null,
"home_page": null,
"name": "complexity-meter",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "python, complexity, analyzer, statistics",
"author": null,
"author_email": "Oleg Strizhechenko <oleg.strizhechenko@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/b3/c5/39b20eeb56549ba8853346ca1501a7ecc08179bb492732ea1e083474b65e/complexity_meter-0.0.1.tar.gz",
"platform": null,
"description": "# \u0410\u043d\u0430\u043b\u0438\u0437 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 python\n\n\u0418\u0434\u0435\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u043e\u0435\u0433\u043e \u0431\u043b\u043e\u0433\u0430 - [\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u043e\u0439](https://\u043e\u043b\u0435\u0433.\u043a\u0440\u044f\u0445\u0442\u0438\u0442.\u043e\u043d\u043b\u0430\u0439\u043d/2025/06/14/simplicity-management.html).\n\n# \u041a\u0440\u0430\u0442\u043a\u043e\n\n\u0423\u0442\u0438\u043b\u0438\u0442\u0430 \u0434\u043b\u044f \u0441\u043a\u043e\u0440\u0438\u043d\u0433\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0441 \u0435\u0451 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430, \u0438\u0434\u0435\u044f \u0432 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438 \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0435\u0433\u043e \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430. \u041a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u0430\u044f \u043c\u0435\u0442\u0440\u0438\u043a\u0430 - \u043f\u043e\u043f\u0443\u0433\u0430\u0438.\n\n## \u0424\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430\n\n\u0417\u0430\u043f\u0443\u0441\u043a \u043d\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0435\u0431\u044f. \u0415\u0441\u043b\u0438 null \u0432 \u0442\u0435\u0441\u0442\u0430\u0445 \u044d\u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 - \u043d\u0430\u0434\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b, \u0430 \u043d\u0435 \u043d\u044b\u0442\u044c.\n\n``` yaml\napp:\n lines: 409\n files: 5\n dependencies: 0\n directories: 0\n max_directory_depth: 0\n functions:\n count: 34\n size_stats:\n min: 1\n mean: 10\n p90: 21\n p95: 27\n max: 31\n classes:\n count: 10\n size_stats:\n min: 2\n mean: 40\n p90: 295\n p95: 295\n max: 295\n imports:\n count: 26\n size_stats:\n min: 2\n mean: 5\n p90: 11\n p95: 11\n max: 11\ntests:\n lines: 0\n files: 0\n dependencies: 0\n directories: 0\n max_directory_depth: 0\n functions:\n count: 0\n size_stats: null\n classes:\n count: 0\n size_stats: null\n imports:\n count: 0\n size_stats: null\nlogical:\n api_endpoints: 0\n async_events: 0\n event_subscriptions: 0\n periodic_tasks: 0\n integrated_systems: 0\ncomplexity_score: 172\n```\n\n# \u0414\u043b\u0438\u043d\u043d\u043e\n\n\u041f\u0438\u0441\u0430\u043b\u043e\u0441\u044c \u043f\u043e \u0442\u0430\u043a\u043e\u043c\u0443 \u0422\u0417 (\u043e\u0431\u0432\u0435\u0441\u0438\u043b \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c\u0438 \u0438 \u043e\u0442\u043c\u0435\u0442\u0438\u043b \u043d\u0435\u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0443\u043d\u043a\u0442\u044b).\n\n1. \u0410\u043d\u0430\u043b\u0438\u0437 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430:\n - \u041f\u043e\u0434\u0441\u0447\u0451\u0442 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 (LOC) \u0440\u0430\u0437\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0438 \u0442\u0435\u0441\u0442\u043e\u0432\n - \u041f\u043e\u0434\u0441\u0447\u0451\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 (.py) \u0440\u0430\u0437\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f app \u0438 tests\n - \u041f\u043e\u0434\u0441\u0447\u0451\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439 \u0440\u0430\u0437\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f app \u0438 tests\n - \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439 (\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c).\n\n2. \u0410\u043d\u0430\u043b\u0438\u0437 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u044b:\n - \u041f\u043e\u0434\u0441\u0447\u0451\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f app \u0438 tests\n - \u041f\u043e\u0434\u0441\u0447\u0451\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0440\u0430\u0437\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f app \u0438 tests\n - \u0420\u0430\u0441\u0447\u0451\u0442 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 (min, mean, p90, p95, max) \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 (p90, p95 \u0438 max \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0432 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0438 \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f).\n - \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 (\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c).\n\n3. \u0410\u043d\u0430\u043b\u0438\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439:\n - \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438\u0437 pyproject.toml\n - PEP 621\n - Poetry\n - \u0410\u043d\u0430\u043b\u0438\u0437 requirements.txt, requirements-dev.txt, requirements-test.txt\n - \u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 (app) \u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 (tests)\n\n4. \u0410\u043d\u0430\u043b\u0438\u0437 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b:\n - \u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0435 API \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u0432 (FastAPI)\n - \u041f\u043e\u0434\u0441\u0447\u0451\u0442 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 (FastStream)\n - \u0412\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u043e\u043a \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f (FastStream)\n - \u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 (FastStream - \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u043c).\n - \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0439 \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438\n - [x] PostgreSQL, Redis \u0438 \u0434\u0440. (\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c)\n - [ ] HTTP-\u043a\u043b\u0438\u0435\u043d\u0442\u044b / SDK \u0432 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435\n\n5. \u0420\u0430\u0441\u0447\u0451\u0442 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0439 \u043c\u0435\u0442\u0440\u0438\u043a\u0438:\n - \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\n - \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u0440\u0438\u043a\n - \u0416\u0451\u0441\u0442\u043a\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0435\u0441\u043e\u0432\u044b\u0435 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u043e\u0432 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c \"\u043f\u043e\u0434 \u0441\u0435\u0431\u044f\", \u043d\u043e \u044f \u0431\u044b \u043d\u0435 \u0441\u0442\u0430\u043b. \u0412\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u044d\u0442\u043e \u043f\u043e\u043f\u0443\u0433\u0430\u0438.\n\n6. \u0424\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0438 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435:\n - [ ] \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 .gitignore\n - \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u0434 \u0438 \u0442\u0435\u0441\u0442\u044b \u043f\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c \u0438\u043c\u0451\u043d\n - \u041f\u0440\u043e\u043f\u0443\u0441\u043a \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0445 \u0438 \u043d\u0435-Python \u0444\u0430\u0439\u043b\u043e\u0432\n\n7. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a:\n - \u0423\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u043a \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0430\u043c \u0432 \u043a\u043e\u0434\u0435\n - \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u0444\u0430\u0439\u043b\u043e\u0432\n\n8. \u0412\u044b\u0432\u043e\u0434 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432:\n - \u041c\u0430\u0448\u0438\u043d\u043d\u043e- \u0438 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e-\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 YAML-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434.\n - \u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a \u043d\u0430 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u044b (app, tests, logical, complexity_score).\n - \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u0440\u0438\u043a\n - \u0427\u0451\u0442\u043a\u043e\u0435 \u043e\u0442\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438\n\n9. \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c:\n - \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439, \u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e.\n\n10. \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441:\n - \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442: \u043f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\n\n11. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439:\n - \u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441 FastAPI \u0438 FastStream\n - \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Poetry \u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 requirements.txt\n - \u0420\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435 async/await \u0444\u0443\u043d\u043a\u0446\u0438\u0439\n\n12. \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430:\n - \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0443\u0441\u0442\u044b\u0445 \u0432\u044b\u0431\u043e\u0440\u043e\u043a\n - \u0423\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u043a \u0432\u044b\u0431\u0440\u043e\u0441\u0430\u043c \u0432 \u0434\u0430\u043d\u043d\u044b\u0445\n\n13. \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430:\n - \u0420\u0435\u0448\u0438\u043b \u043e\u0442\u043a\u043b\u043e\u043d\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \"\u043e\u0434\u0438\u043d python-\u0441\u043a\u0440\u0438\u043f\u0442 \u0431\u0435\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439\"\n - \"\u041f\u043b\u0430\u0433\u0438\u043d\u043d\u0430\u044f\" \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 - \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u043a\u0438\u043d\u0443\u0442\u044c \u043d\u043e\u0432\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 plugins \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0441\u0430\u043c\u043e\u043f\u0430\u043b\u044c\u043d\u044b\u0445/\u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445.\n\n14. \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u044c:\n - \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438 \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430\n - \u0412\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \"\u0440\u0430\u0437\u0434\u0443\u0442\u044b\u0445\" \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 (\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u044b/\u0444\u0443\u043d\u043a\u0446\u0438\u0438)\n",
"bugtrack_url": null,
"license": null,
"summary": "Script to track python project complexity",
"version": "0.0.1",
"project_urls": {
"Homepage": "https://codeberg.org/strizhechenko/complexity-meter"
},
"split_keywords": [
"python",
" complexity",
" analyzer",
" statistics"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "041175a44f68ddbadfc47972c042aa6a25e9a8acaa214a3a9d89d72aa86c08ab",
"md5": "479a68e4b3cfd9bae84505e119694fa8",
"sha256": "a7bf9e0ad106da77ac1f583982f928ac4e185080527e2233b9e80439e5de0bc8"
},
"downloads": -1,
"filename": "complexity_meter-0.0.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "479a68e4b3cfd9bae84505e119694fa8",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 11971,
"upload_time": "2025-07-26T00:11:37",
"upload_time_iso_8601": "2025-07-26T00:11:37.347696Z",
"url": "https://files.pythonhosted.org/packages/04/11/75a44f68ddbadfc47972c042aa6a25e9a8acaa214a3a9d89d72aa86c08ab/complexity_meter-0.0.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b3c539b20eeb56549ba8853346ca1501a7ecc08179bb492732ea1e083474b65e",
"md5": "4e486833a52513cae39b4e5d304524b8",
"sha256": "eead8dbd5e46921038461745332f4b519695b447cc206d369264002443616541"
},
"downloads": -1,
"filename": "complexity_meter-0.0.1.tar.gz",
"has_sig": false,
"md5_digest": "4e486833a52513cae39b4e5d304524b8",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 12488,
"upload_time": "2025-07-26T00:11:39",
"upload_time_iso_8601": "2025-07-26T00:11:39.443363Z",
"url": "https://files.pythonhosted.org/packages/b3/c5/39b20eeb56549ba8853346ca1501a7ecc08179bb492732ea1e083474b65e/complexity_meter-0.0.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-26 00:11:39",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": true,
"codeberg_user": "strizhechenko",
"codeberg_project": "complexity-meter",
"lcname": "complexity-meter"
}