strictacode 0.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- strictacode-0.0.1/.github/workflows/publish.yml +54 -0
- strictacode-0.0.1/.gitignore +210 -0
- strictacode-0.0.1/PKG-INFO +17 -0
- strictacode-0.0.1/README.md +133 -0
- strictacode-0.0.1/docs/examples.md +270 -0
- strictacode-0.0.1/docs/interpretation.md +451 -0
- strictacode-0.0.1/docs/metrics.md +472 -0
- strictacode-0.0.1/docs/report-fields.md +463 -0
- strictacode-0.0.1/pyproject.toml +32 -0
- strictacode-0.0.1/setup.cfg +4 -0
- strictacode-0.0.1/strictacode/__init__.py +0 -0
- strictacode-0.0.1/strictacode/__main__.py +84 -0
- strictacode-0.0.1/strictacode/analyzer.py +53 -0
- strictacode-0.0.1/strictacode/calc/__init__.py +10 -0
- strictacode-0.0.1/strictacode/calc/complexity.py +94 -0
- strictacode-0.0.1/strictacode/calc/pressure/__init__.py +6 -0
- strictacode-0.0.1/strictacode/calc/pressure/overengineering.py +213 -0
- strictacode-0.0.1/strictacode/calc/pressure/refactoring.py +190 -0
- strictacode-0.0.1/strictacode/calc/score.py +135 -0
- strictacode-0.0.1/strictacode/go/__init__.py +3 -0
- strictacode-0.0.1/strictacode/go/analyzer.py +374 -0
- strictacode-0.0.1/strictacode/go/collector.py +411 -0
- strictacode-0.0.1/strictacode/go/loader.py +64 -0
- strictacode-0.0.1/strictacode/graph.py +44 -0
- strictacode-0.0.1/strictacode/js/__init__.py +3 -0
- strictacode-0.0.1/strictacode/js/analyzer.py +203 -0
- strictacode-0.0.1/strictacode/js/collector.py +310 -0
- strictacode-0.0.1/strictacode/js/loader.py +62 -0
- strictacode-0.0.1/strictacode/loader.py +180 -0
- strictacode-0.0.1/strictacode/py/__init__.py +3 -0
- strictacode-0.0.1/strictacode/py/analyzer.py +52 -0
- strictacode-0.0.1/strictacode/py/collector.py +13 -0
- strictacode-0.0.1/strictacode/py/loader.py +70 -0
- strictacode-0.0.1/strictacode/reporters.py +677 -0
- strictacode-0.0.1/strictacode/skill.py +687 -0
- strictacode-0.0.1/strictacode/source.py +538 -0
- strictacode-0.0.1/strictacode/utils.py +160 -0
- strictacode-0.0.1/strictacode.egg-info/PKG-INFO +17 -0
- strictacode-0.0.1/strictacode.egg-info/SOURCES.txt +41 -0
- strictacode-0.0.1/strictacode.egg-info/dependency_links.txt +1 -0
- strictacode-0.0.1/strictacode.egg-info/entry_points.txt +2 -0
- strictacode-0.0.1/strictacode.egg-info/requires.txt +3 -0
- strictacode-0.0.1/strictacode.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- 'v*'
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
build:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v4
|
|
13
|
+
|
|
14
|
+
- name: Set up Python
|
|
15
|
+
uses: actions/setup-python@v5
|
|
16
|
+
with:
|
|
17
|
+
python-version: '3.12'
|
|
18
|
+
|
|
19
|
+
- name: Install build tools
|
|
20
|
+
run: pip install build
|
|
21
|
+
|
|
22
|
+
- name: Build package
|
|
23
|
+
run: python -m build
|
|
24
|
+
|
|
25
|
+
- name: Upload build artifacts
|
|
26
|
+
uses: actions/upload-artifact@v4
|
|
27
|
+
with:
|
|
28
|
+
name: dist
|
|
29
|
+
path: dist/
|
|
30
|
+
retention-days: 1
|
|
31
|
+
|
|
32
|
+
publish:
|
|
33
|
+
needs: build
|
|
34
|
+
runs-on: ubuntu-latest
|
|
35
|
+
permissions:
|
|
36
|
+
id-token: write
|
|
37
|
+
steps:
|
|
38
|
+
- uses: actions/checkout@v4
|
|
39
|
+
|
|
40
|
+
- name: Set up Python
|
|
41
|
+
uses: actions/setup-python@v5
|
|
42
|
+
with:
|
|
43
|
+
python-version: '3.12'
|
|
44
|
+
|
|
45
|
+
- name: Download build artifacts
|
|
46
|
+
uses: actions/download-artifact@v4
|
|
47
|
+
with:
|
|
48
|
+
name: dist
|
|
49
|
+
path: dist/
|
|
50
|
+
|
|
51
|
+
- name: Publish to PyPI
|
|
52
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
53
|
+
with:
|
|
54
|
+
password: ${{ secrets.PYPI_API_TOKEN }}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[codz]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
share/python-wheels/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
*.egg
|
|
27
|
+
MANIFEST
|
|
28
|
+
|
|
29
|
+
# PyInstaller
|
|
30
|
+
# Usually these files are written by a python script from a template
|
|
31
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
32
|
+
*.manifest
|
|
33
|
+
*.spec
|
|
34
|
+
|
|
35
|
+
# Installer logs
|
|
36
|
+
pip-log.txt
|
|
37
|
+
pip-delete-this-directory.txt
|
|
38
|
+
|
|
39
|
+
# Unit test / coverage reports
|
|
40
|
+
htmlcov/
|
|
41
|
+
.tox/
|
|
42
|
+
.nox/
|
|
43
|
+
.coverage
|
|
44
|
+
.coverage.*
|
|
45
|
+
.cache
|
|
46
|
+
nosetests.xml
|
|
47
|
+
coverage.xml
|
|
48
|
+
*.cover
|
|
49
|
+
*.py.cover
|
|
50
|
+
.hypothesis/
|
|
51
|
+
.pytest_cache/
|
|
52
|
+
cover/
|
|
53
|
+
|
|
54
|
+
# Translations
|
|
55
|
+
*.mo
|
|
56
|
+
*.pot
|
|
57
|
+
|
|
58
|
+
# Django stuff:
|
|
59
|
+
*.log
|
|
60
|
+
local_settings.py
|
|
61
|
+
db.sqlite3
|
|
62
|
+
db.sqlite3-journal
|
|
63
|
+
|
|
64
|
+
# Flask stuff:
|
|
65
|
+
instance/
|
|
66
|
+
.webassets-cache
|
|
67
|
+
|
|
68
|
+
# Scrapy stuff:
|
|
69
|
+
.scrapy
|
|
70
|
+
|
|
71
|
+
# Sphinx documentation
|
|
72
|
+
docs/_build/
|
|
73
|
+
|
|
74
|
+
# PyBuilder
|
|
75
|
+
.pybuilder/
|
|
76
|
+
target/
|
|
77
|
+
|
|
78
|
+
# Jupyter Notebook
|
|
79
|
+
.ipynb_checkpoints
|
|
80
|
+
|
|
81
|
+
# IPython
|
|
82
|
+
profile_default/
|
|
83
|
+
ipython_config.py
|
|
84
|
+
|
|
85
|
+
# pyenv
|
|
86
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
87
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
88
|
+
# .python-version
|
|
89
|
+
|
|
90
|
+
# pipenv
|
|
91
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
92
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
93
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
94
|
+
# install all needed dependencies.
|
|
95
|
+
#Pipfile.lock
|
|
96
|
+
|
|
97
|
+
# UV
|
|
98
|
+
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
|
99
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
100
|
+
# commonly ignored for libraries.
|
|
101
|
+
#uv.lock
|
|
102
|
+
|
|
103
|
+
# poetry
|
|
104
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
105
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
106
|
+
# commonly ignored for libraries.
|
|
107
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
108
|
+
#poetry.lock
|
|
109
|
+
#poetry.toml
|
|
110
|
+
|
|
111
|
+
# pdm
|
|
112
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
113
|
+
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
|
|
114
|
+
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
|
|
115
|
+
#pdm.lock
|
|
116
|
+
#pdm.toml
|
|
117
|
+
.pdm-python
|
|
118
|
+
.pdm-build/
|
|
119
|
+
|
|
120
|
+
# pixi
|
|
121
|
+
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
|
|
122
|
+
#pixi.lock
|
|
123
|
+
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
|
|
124
|
+
# in the .venv directory. It is recommended not to include this directory in version control.
|
|
125
|
+
.pixi
|
|
126
|
+
|
|
127
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
128
|
+
__pypackages__/
|
|
129
|
+
|
|
130
|
+
# Celery stuff
|
|
131
|
+
celerybeat-schedule
|
|
132
|
+
celerybeat.pid
|
|
133
|
+
|
|
134
|
+
# SageMath parsed files
|
|
135
|
+
*.sage.py
|
|
136
|
+
|
|
137
|
+
# Environments
|
|
138
|
+
.env
|
|
139
|
+
.envrc
|
|
140
|
+
.venv
|
|
141
|
+
env/
|
|
142
|
+
venv/
|
|
143
|
+
ENV/
|
|
144
|
+
env.bak/
|
|
145
|
+
venv.bak/
|
|
146
|
+
|
|
147
|
+
# Spyder project settings
|
|
148
|
+
.spyderproject
|
|
149
|
+
.spyproject
|
|
150
|
+
|
|
151
|
+
# Rope project settings
|
|
152
|
+
.ropeproject
|
|
153
|
+
|
|
154
|
+
# mkdocs documentation
|
|
155
|
+
/site
|
|
156
|
+
|
|
157
|
+
# mypy
|
|
158
|
+
.mypy_cache/
|
|
159
|
+
.dmypy.json
|
|
160
|
+
dmypy.json
|
|
161
|
+
|
|
162
|
+
# Pyre type checker
|
|
163
|
+
.pyre/
|
|
164
|
+
|
|
165
|
+
# pytype static type analyzer
|
|
166
|
+
.pytype/
|
|
167
|
+
|
|
168
|
+
# Cython debug symbols
|
|
169
|
+
cython_debug/
|
|
170
|
+
|
|
171
|
+
# PyCharm
|
|
172
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
173
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
174
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
175
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
176
|
+
.idea/
|
|
177
|
+
|
|
178
|
+
# Abstra
|
|
179
|
+
# Abstra is an AI-powered process automation framework.
|
|
180
|
+
# Ignore directories containing user credentials, local state, and settings.
|
|
181
|
+
# Learn more at https://abstra.io/docs
|
|
182
|
+
.abstra/
|
|
183
|
+
|
|
184
|
+
# Visual Studio Code
|
|
185
|
+
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
|
|
186
|
+
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
|
|
187
|
+
# and can be added to the global gitignore or merged into this file. However, if you prefer,
|
|
188
|
+
# you could uncomment the following to ignore the entire vscode folder
|
|
189
|
+
# .vscode/
|
|
190
|
+
|
|
191
|
+
# Ruff stuff:
|
|
192
|
+
.ruff_cache/
|
|
193
|
+
|
|
194
|
+
# PyPI configuration file
|
|
195
|
+
.pypirc
|
|
196
|
+
|
|
197
|
+
# Cursor
|
|
198
|
+
# Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to
|
|
199
|
+
# exclude from AI features like autocomplete and code analysis. Recommended for sensitive data
|
|
200
|
+
# refer to https://docs.cursor.com/context/ignore-files
|
|
201
|
+
.cursorignore
|
|
202
|
+
.cursorindexingignore
|
|
203
|
+
|
|
204
|
+
# Marimo
|
|
205
|
+
marimo/_static/
|
|
206
|
+
marimo/_lsp/
|
|
207
|
+
__marimo__/
|
|
208
|
+
|
|
209
|
+
# tmp docs
|
|
210
|
+
docs/plans
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: strictacode
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: Codebase health diagnostics
|
|
5
|
+
License: BSD 3-Clause
|
|
6
|
+
Project-URL: Homepage, https://github.com/qarium/strictacode
|
|
7
|
+
Classifier: Development Status :: 4 - Beta
|
|
8
|
+
Classifier: Intended Audience :: Developers
|
|
9
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
+
Requires-Python: >=3.10
|
|
15
|
+
Requires-Dist: numpy
|
|
16
|
+
Requires-Dist: radon
|
|
17
|
+
Requires-Dist: click
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Strictacode
|
|
2
|
+
|
|
3
|
+
**Диагностика здоровья кодовой базы.**
|
|
4
|
+
|
|
5
|
+
Strictacode находит болевые точки проекта: спагетти-код, overengineering и сложность, которая блокирует разработку.
|
|
6
|
+
|
|
7
|
+
> Работает с AI-агентами для автоматического анализа качества кода.
|
|
8
|
+
|
|
9
|
+
> Легко интегрируется в CI/CD пайплайны и локальный REPL-цикл разработки.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Поддерживаемые языки
|
|
14
|
+
|
|
15
|
+
Golang · Python · Javascript
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Быстрый старт
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
pip install strictacode
|
|
23
|
+
strictacode analyze . --short
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Результат не очевиден? См. [Интерпретация метрик](docs/interpretation.md) — там сценарии и рекомендации.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Зачем это нужно
|
|
31
|
+
|
|
32
|
+
Вы когда-нибудь заходили в "наследственный" проект и думали: *с чего начать?*
|
|
33
|
+
Или смотрели на отчёт о покрытии тестами и понимали: *это не показывает реальную проблему*.
|
|
34
|
+
|
|
35
|
+
Strictacode отвечает на вопрос: **насколько больно работать с этим кодом?**
|
|
36
|
+
|
|
37
|
+
Он не считает строки. Он ищет:
|
|
38
|
+
- Функции, которые сложно изменить без багов
|
|
39
|
+
- Архитектуру, которая слишком сложная для задачи
|
|
40
|
+
- Места, где техдолг уже блокирует разработку
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Как это работает
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
$ strictacode analyze ./src --short
|
|
48
|
+
|
|
49
|
+
Project:
|
|
50
|
+
* status:
|
|
51
|
+
- name: warning
|
|
52
|
+
- score: 58 ← здоровье проекта (0-100, меньше = лучше)
|
|
53
|
+
* refactoring_pressure:
|
|
54
|
+
- score: 72 ← насколько код "давит" на разработчика
|
|
55
|
+
* overengineering_pressure:
|
|
56
|
+
- score: 18 ← насколько архитектура избыточна
|
|
57
|
+
* complexity:
|
|
58
|
+
- density: 42.5 ← концентрация сложности
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Вы узнаете:
|
|
62
|
+
- **Spaghetti** (RP высокий, OP низкий) → чистите функции
|
|
63
|
+
- **Overengineering** (OP высокий, RP низкий) → упрощайте архитектуру
|
|
64
|
+
- **Кризис** (оба высокие) → изолируйте и переписывайте
|
|
65
|
+
- **Здоровый** (оба низкие) → мониторьте
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Метрики
|
|
70
|
+
|
|
71
|
+
| Метрика | Что измеряет | Хорошо | Плохо |
|
|
72
|
+
|------------------------------|-------------------------|--------|--------|
|
|
73
|
+
| **Project Score** | Общее здоровье | 0-20 | 60+ |
|
|
74
|
+
| **Refactoring Pressure** | Давление на рефакторинг | 0-40 | 60+ |
|
|
75
|
+
| **Overengineering Pressure** | Избыточная сложность | 0-40 | 60+ |
|
|
76
|
+
| **Complexity Density** | Плотность сложности | < 20 | > 50 |
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Когда использовать
|
|
81
|
+
|
|
82
|
+
| Ситуация | Что даст strictacode |
|
|
83
|
+
|---------------------------|-----------------------------------------------------------|
|
|
84
|
+
| Оценка техдолга | Оцифрует "код плохой" в метрики для менеджмента |
|
|
85
|
+
| Планирование тестирования | Укажет, какие проекты/компоненты требуют больше внимания |
|
|
86
|
+
| Планирование рефакторинга | Укажет, где "80% боли от 20% кода" |
|
|
87
|
+
| Ретроспектива спринта | Объективные данные вместо субъективных оценок |
|
|
88
|
+
| Onboarding в проект | Покажет, какие модули самые сложные |
|
|
89
|
+
| CI/CD pipeline | Заблокирует деградацию качества |
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Команды
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
# Полный отчёт
|
|
97
|
+
strictacode analyze <path>
|
|
98
|
+
|
|
99
|
+
# Короткий отчёт
|
|
100
|
+
strictacode analyze <path> --short
|
|
101
|
+
|
|
102
|
+
# Детализация по модулям, классам, функциям
|
|
103
|
+
strictacode analyze <path> --details
|
|
104
|
+
|
|
105
|
+
# JSON формат для CI/CD
|
|
106
|
+
strictacode analyze <path> --format json
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Интеграция с AI-агентами
|
|
112
|
+
|
|
113
|
+
Strictacode может быть установлен как навык (skill) в AI-агенты для автоматического анализа качества кода:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
strictacode install agent-skill --agent <agent_name>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Поддерживаемые агенты:
|
|
120
|
+
- `claude`
|
|
121
|
+
- `cursor`
|
|
122
|
+
- `codex`
|
|
123
|
+
- `gemini`
|
|
124
|
+
- `antigravity`
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Документация
|
|
129
|
+
|
|
130
|
+
- [Поля отчёта](docs/report-fields.md) — описание всех полей в отчёте с типами и примерами
|
|
131
|
+
- [Как рассчитываются метрики](docs/metrics.md) — формулы и математика
|
|
132
|
+
- [Интерпретация метрик](docs/interpretation.md) — сценарии анализа и рекомендации
|
|
133
|
+
- [Примеры использования](docs/examples.md) — реальные сценарии и алгоритмы действий
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
# Примеры использования
|
|
2
|
+
|
|
3
|
+
Эта документация содержит реальные сценарии использования strictacode с пошаговыми алгоритмами действий.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Содержание
|
|
8
|
+
|
|
9
|
+
- [Знакомство с проектом](#знакомство-с-проектом)
|
|
10
|
+
- [Повседневная разработка](#повседневная-разработка)
|
|
11
|
+
- [Принятие решений](#принятие-решений)
|
|
12
|
+
- [Процессы команды](#процессы-команды)
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Знакомство с проектом
|
|
17
|
+
|
|
18
|
+
### Onboarding новичка
|
|
19
|
+
|
|
20
|
+
**Контекст:** Новый разработчик приходит в проект. Первая задача — понять, где сложный код, а где можно работать спокойно. Без strictacode это недели чтения кода и случайные открытия.
|
|
21
|
+
|
|
22
|
+
**Команда:**
|
|
23
|
+
```bash
|
|
24
|
+
strictacode analyze . --details
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Результат:** Метрики по модулям/пакетам — где высокий RP (грязный код), где высокий OP (сложные связи), где density зашкаливает.
|
|
28
|
+
|
|
29
|
+
**Алгоритм:**
|
|
30
|
+
1. Запустить анализ с `--details`
|
|
31
|
+
2. Найти модули с `status: healthy` — начинать работу лучше с них
|
|
32
|
+
3. Посмотреть модули с `RP > 60` — там сложнее всего вносить изменения
|
|
33
|
+
4. Изучить `density` — высокая плотность означает "спагетти в одном файле"
|
|
34
|
+
5. Составить мысленную карту: "зелёные зоны" vs "красные зоны"
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
### Оценка наследственного проекта
|
|
39
|
+
|
|
40
|
+
**Контекст:** Tech lead заходит в унаследованный проект. Нужно быстро понять состояние кодовой базы и ответить на вопрос: "с чего начать?"
|
|
41
|
+
|
|
42
|
+
**Команда:**
|
|
43
|
+
```bash
|
|
44
|
+
strictacode analyze . --short
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Результат:** Project Score, RP, OP, density — общая картина здоровья.
|
|
48
|
+
|
|
49
|
+
**Алгоритм:**
|
|
50
|
+
1. Запустить короткий анализ — получить Project Score
|
|
51
|
+
2. Интерпретировать score по шкале (healthy/normal/warning/critical/emergency)
|
|
52
|
+
3. Сравнить RP и OP:
|
|
53
|
+
- RP >> OP → spaghetti-код, чистить функции
|
|
54
|
+
- OP >> RP → overengineering, упрощать архитектуру
|
|
55
|
+
- Оба высокие → кризис, изолировать и переписывать
|
|
56
|
+
4. Сформировать отчёт для стейкхолдеров с конкретными метриками
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Повседневная разработка
|
|
61
|
+
|
|
62
|
+
### Планирование юнит-тестов
|
|
63
|
+
|
|
64
|
+
**Контекст:** Разработчик планирует, какие функции покрыть unit-тестами в первую очередь. Ограниченное время — нужно найти максимальный выхлоп.
|
|
65
|
+
|
|
66
|
+
**Команда:**
|
|
67
|
+
```bash
|
|
68
|
+
strictacode analyze . --details
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**Результат:** Детализация по модулям/классам/функциям с метриками сложности.
|
|
72
|
+
|
|
73
|
+
**Алгоритм:**
|
|
74
|
+
1. Запустить анализ с `--details`
|
|
75
|
+
2. Отсортировать функции по `complexity` — функции с complexity > 15 труднее тестировать и быстрее ломаются
|
|
76
|
+
3. Смотреть на `density` в модуле — высокая плотность означает запутанный код, тесты будут сложными
|
|
77
|
+
4. Приоритет: сначала функции с высокой complexity в модулях с низким OP (меньше моков)
|
|
78
|
+
5. Функции в модулях с высоким OP отложить — там нужны интеграционные тесты
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
### Планирование интеграционных тестов на сервисы
|
|
83
|
+
|
|
84
|
+
**Контекст:** QA планирует тестирование микросервисной архитектуры. Нужно понять, какие сервисы изменяются с большими рисками, какие — с меньшими.
|
|
85
|
+
|
|
86
|
+
**Команда:**
|
|
87
|
+
```bash
|
|
88
|
+
# Для каждого сервиса
|
|
89
|
+
strictacode analyze ./service-a --short
|
|
90
|
+
strictacode analyze ./service-b --short
|
|
91
|
+
strictacode analyze ./service-c --short
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**Результат:** Project Score, RP, OP, density по каждому сервису.
|
|
95
|
+
|
|
96
|
+
**Алгоритм:**
|
|
97
|
+
1. Запустить анализ для каждого сервиса отдельно
|
|
98
|
+
2. Сравнить метрики между сервисами:
|
|
99
|
+
- Высокий RP — сервис с "грязным" кодом, изменения рискованны
|
|
100
|
+
- Высокий OP — сложная архитектура, выше шанс сломать интеграции
|
|
101
|
+
- Высокий density — много логики в одном месте, сложнее покрыть тестами
|
|
102
|
+
3. Приоритет тестирования:
|
|
103
|
+
- `status: critical/emergency` — максимальное внимание, regression-тесты обязательны
|
|
104
|
+
- `status: warning` — стандартное покрытие + smoke-тесты интеграций
|
|
105
|
+
- `status: healthy/normal` — минимальный набор smoke-тестов
|
|
106
|
+
4. Заложить буфер времени на баги в сервисах с высоким RP
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
### Приоритизация API-ручек для тестирования
|
|
111
|
+
|
|
112
|
+
**Контекст:** В сервисе много API-эндпоинтов, все протестировать невозможно. Нужно понять, какие ручки покрывать тестами в первую очередь.
|
|
113
|
+
|
|
114
|
+
**Команда:**
|
|
115
|
+
```bash
|
|
116
|
+
strictacode analyze . --details
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**Результат:** Детализация по пакетам/модулям с метриками.
|
|
120
|
+
|
|
121
|
+
**Алгоритм:**
|
|
122
|
+
1. Запустить анализ с `--details`
|
|
123
|
+
2. Найти пакеты с `status: warning` и выше — это проблемные зоны
|
|
124
|
+
3. Сопоставить пакеты с API-ручками:
|
|
125
|
+
- Какой пакет обрабатывает какую ручку
|
|
126
|
+
- Какие ручки зависят от модулей с высоким RP
|
|
127
|
+
4. Приоритет тестирования ручек:
|
|
128
|
+
- Ручки на базе пакетов с `status: critical` — тестировать первыми, максимальное покрытие
|
|
129
|
+
- Ручки на базе пакетов с `status: warning` — стандартное покрытие
|
|
130
|
+
- Ручки на базе пакетов с `status: healthy` — минимальные smoke-тесты
|
|
131
|
+
5. Ручки, которые затрагивают несколько проблемных модулей — кандидаты на end-to-end тесты
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Принятие решений
|
|
136
|
+
|
|
137
|
+
### Выбор: переписывать или рефакторить пакет/сервис
|
|
138
|
+
|
|
139
|
+
**Контекст:** Целый пакет или сервис проблемный. Нужно решить на уровне архитектурной единицы.
|
|
140
|
+
|
|
141
|
+
**Команда:**
|
|
142
|
+
```bash
|
|
143
|
+
strictacode analyze .
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
**Результат:** Метрики проекта с разбивкой по пакетам/модулям.
|
|
147
|
+
|
|
148
|
+
**Алгоритм:**
|
|
149
|
+
1. Запустить анализ всего проекта
|
|
150
|
+
2. Найти нужный пакет/сервис в результатах
|
|
151
|
+
3. Оценить общее состояние через его Project Score:
|
|
152
|
+
- Score < 40 — можно рефакторить постепенно
|
|
153
|
+
- Score 40-60 — серьёзные проблемы, нужен план
|
|
154
|
+
- Score > 60 — критическое состояние
|
|
155
|
+
4. Посмотреть распределение проблем внутри:
|
|
156
|
+
- Проблемы в 1-2 подмодулях → изолировать и рефакторить/переписать только их
|
|
157
|
+
- Проблемы распределены равномерно → системная проблема архитектуры
|
|
158
|
+
5. Оценить связи (OP): высокий OP означает, что модуль сильно связан с другими. Переписывание сломает интеграции.
|
|
159
|
+
6. Решение:
|
|
160
|
+
- Локальные проблемы → точечный рефакторинг/переписывание
|
|
161
|
+
- Системные проблемы + низкий OP → кандидат на переписывание
|
|
162
|
+
- Системные проблемы + высокий OP → постепенный рефакторинг с сохранением интерфейсов
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
### Обоснование рефакторинга менеджменту
|
|
167
|
+
|
|
168
|
+
**Контекст:** Нужно выделить время на рефакторинг в спринте. Менеджмент хочет понять: "зачем?" и "сколько?". Субъективное "код плохой" не работает.
|
|
169
|
+
|
|
170
|
+
**Команда:**
|
|
171
|
+
```bash
|
|
172
|
+
strictacode analyze . --short
|
|
173
|
+
strictacode analyze . --format json > quality-baseline.json
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
**Результат:** Метрики в читаемом виде + JSON для отслеживания прогресса.
|
|
177
|
+
|
|
178
|
+
**Алгоритм:**
|
|
179
|
+
1. Запустить анализ, сохранить baseline
|
|
180
|
+
2. Сформулировать проблему через метрики:
|
|
181
|
+
- "RP = 72 — это значит, что каждое изменение кода несёт высокий риск багов"
|
|
182
|
+
- "Density = 58 — код спагетти-подобный, время на задачу увеличивается в 2 раза"
|
|
183
|
+
3. Показать тенденцию: запустить анализ на коде 3-месячной давности (git checkout), сравнить
|
|
184
|
+
4. Перевести в бизнес-язык:
|
|
185
|
+
- Высокий RP → медленнее фичи, больше багов в проде
|
|
186
|
+
- Высокий OP → сложнее onboardить новичков, дольше code review
|
|
187
|
+
5. Предложить план: "Снизим RP с 72 до 40 за 2 спринта, это ускорит разработку на X%"
|
|
188
|
+
6. После рефакторинга: запустить анализ снова, показать динамику
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Процессы команды
|
|
193
|
+
|
|
194
|
+
### Ретроспектива спринта
|
|
195
|
+
|
|
196
|
+
**Контекст:** Команда проводит ретро. Обсуждаем качество кода. Мнения расходятся: "нормальный код" vs "всё разваливается". Нужны объективные данные.
|
|
197
|
+
|
|
198
|
+
**Команда:**
|
|
199
|
+
```bash
|
|
200
|
+
# До спринта
|
|
201
|
+
strictacode analyze . --format json > sprint-start.json
|
|
202
|
+
|
|
203
|
+
# После спринта
|
|
204
|
+
strictacode analyze . --format json > sprint-end.json
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**Результат:** Два снапшота состояния кодовой базы.
|
|
208
|
+
|
|
209
|
+
**Алгоритм:**
|
|
210
|
+
1. Запустить анализ в начале спринта, сохранить baseline
|
|
211
|
+
2. В течение спринта — не трогать, просто работать
|
|
212
|
+
3. В конце спринта — запустить анализ снова
|
|
213
|
+
4. Сравнить метрики:
|
|
214
|
+
- RP вырос → накопили техдолг, следующий спринт нужно заложить время на чистку
|
|
215
|
+
- OP вырос → добавили абстракций, проверить — они нужны или преждевременны?
|
|
216
|
+
- Density вырос → начали писать "грязный" код, нужен code review строже
|
|
217
|
+
5. Обсудить на ретро:
|
|
218
|
+
- Какие модули ухудшились и почему?
|
|
219
|
+
- Это нормальный рост или проблема?
|
|
220
|
+
- Что сделать в следующем спринте?
|
|
221
|
+
6. Сохранить sprint-end.json как baseline для следующего спринта
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
### CI/CD гейты
|
|
226
|
+
|
|
227
|
+
**Контекст:** Нужно заблокировать деградацию качества кода в пайплайне. Pull request с плохим кодом не должен попадать в main.
|
|
228
|
+
|
|
229
|
+
**Команда (в CI):**
|
|
230
|
+
```bash
|
|
231
|
+
strictacode analyze . --format json > current.json
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**Результат:** JSON-отчёт для автоматической проверки.
|
|
235
|
+
|
|
236
|
+
**Алгоритм:**
|
|
237
|
+
1. Определить baseline: запустить анализ на текущем main, сохранить `baseline.json` в репозиторий
|
|
238
|
+
2. В CI-пайплайне добавить шаг после тестов:
|
|
239
|
+
- Запустить `strictacode analyze . --format json > current.json`
|
|
240
|
+
- Сравнить `current.json` с `baseline.json` по ключевым метрикам
|
|
241
|
+
3. Блокировать PR если:
|
|
242
|
+
- Project Score вырос выше порога (например, > 60)
|
|
243
|
+
- RP вырос больше чем на N пунктов относительно baseline
|
|
244
|
+
4. После мерджа в main — обновить `baseline.json`
|
|
245
|
+
|
|
246
|
+
**Пример проверки (Python скрипт):**
|
|
247
|
+
```python
|
|
248
|
+
import json
|
|
249
|
+
|
|
250
|
+
THRESHOLD_SCORE = 60
|
|
251
|
+
THRESHOLD_RP_DIFF = 10
|
|
252
|
+
|
|
253
|
+
with open("baseline.json") as f:
|
|
254
|
+
baseline = json.load(f)
|
|
255
|
+
with open("current.json") as f:
|
|
256
|
+
current = json.load(f)
|
|
257
|
+
|
|
258
|
+
score = current["project"]["status"]["score"]
|
|
259
|
+
rp_diff = current["project"]["refactoring_pressure"]["score"] - baseline["project"]["refactoring_pressure"]["score"]
|
|
260
|
+
|
|
261
|
+
if score > THRESHOLD_SCORE:
|
|
262
|
+
print(f"FAIL: Project Score {score} > {THRESHOLD_SCORE}")
|
|
263
|
+
exit(1)
|
|
264
|
+
|
|
265
|
+
if rp_diff > THRESHOLD_RP_DIFF:
|
|
266
|
+
print(f"FAIL: RP вырос на {rp_diff} пунктов (порог: {THRESHOLD_RP_DIFF})")
|
|
267
|
+
exit(1)
|
|
268
|
+
|
|
269
|
+
print("OK: Метрики в пределах нормы")
|
|
270
|
+
```
|