makeapp 2.4.0__tar.gz → 2.5.0__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.
- {makeapp-2.4.0 → makeapp-2.5.0}/.gitignore +1 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/PKG-INFO +1 -14
- {makeapp-2.4.0 → makeapp-2.5.0}/README.md +0 -13
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/__init__.py +1 -1
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/.github/workflows/python-package.yml +4 -4
- makeapp-2.5.0/src/makeapp/app_templates/__default__/AGENTS.md +3 -0
- makeapp-2.5.0/src/makeapp/app_templates/__default__/CONTRIBUTING.md +45 -0
- makeapp-2.5.0/src/makeapp/app_templates/__default__/IDLE.md +457 -0
- makeapp-2.5.0/src/makeapp/app_templates/__default__/INSTALL.md +31 -0
- makeapp-2.5.0/src/makeapp/app_templates/console/INSTALL.md +23 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/.github/workflows/python-package.yml +7 -5
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/apptools.py +7 -9
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/cli.py +6 -3
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/helpers/tests.py +6 -2
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/helpers/venvs.py +1 -1
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/utils.py +54 -4
- makeapp-2.4.0/src/makeapp/app_templates/__default__/CONTRIBUTING.md +0 -21
- makeapp-2.4.0/src/makeapp/app_templates/__default__/INSTALL.md +0 -35
- {makeapp-2.4.0 → makeapp-2.5.0}/LICENSE +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/pyproject.toml +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/.gitignore +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/AUTHORS.md +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/CHANGELOG.md +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/README.md +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/docs/index.md +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/docs/quickstart.md +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/mkdocs.yml +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/pyproject.toml +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/ruff.toml +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/src/__package_name__/__init__.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/tests/__init__.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/tests/test_basic.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/click/makeappconf.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/click/pyproject.toml +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/click/src/__package_name__/cli.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/console/pyproject.toml +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/console/src/__package_name__/cli.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/makeappconf.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/pyproject.toml +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/__init__.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/admin.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/apps.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/locale/empty +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/management/__init__.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/management/commands/__init__.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/models.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/templates/empty +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/templatetags/empty +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/tests/__init__.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/tests/conftest.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/tests/test_basic.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/views.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/pytestplugin/pyproject.toml +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/pytestplugin/src/__package_name__/entry.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/pytestplugin/tests/test_basic.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/.gitignore +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/conf/__package_name__-certbot-hook.sh +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/conf/__package_name__.service +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/conf/env_production.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/makeappconf.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/pyproject.toml +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/requirements.txt +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/src/__package_name__/core/uwsgiinit.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/src/__package_name__/settings/__init__.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/src/__package_name__/settings/auto.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/src/__package_name__/settings/base.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/src/__package_name__/settings/env_development.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/src/__package_name__/settings/env_testing.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/src/__package_name__/settings/sub_paths.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/src/__package_name__/uwsgicfg.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/state/certbot/empty +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/state/dumps/empty +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/state/media/empty +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/state/spool/empty +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/state/static/empty +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/tests/conftest.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/tests/requirements.txt +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/tests/test_module.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/wscaff.yml +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/appconfig.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/appmaker.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/apptemplate.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/exceptions.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/helpers/__init__.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/helpers/dist.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/helpers/files.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/helpers/vcs.py +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/license_templates/apache2 +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/license_templates/apache2_src +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/license_templates/bsd2cl +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/license_templates/bsd3cl +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/license_templates/gpl2 +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/license_templates/gpl2_src +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/license_templates/gpl3 +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/license_templates/gpl3_src +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/license_templates/mit +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/license_templates/no +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/license_templates/no_src +0 -0
- {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/rendering.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: makeapp
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.5.0
|
|
4
4
|
Summary: Simplifies routine Python application development processes.
|
|
5
5
|
Project-URL: Homepage, https://github.com/idlesign/makeapp
|
|
6
6
|
Project-URL: Documentation, https://makeapp.readthedocs.io/
|
|
@@ -61,19 +61,6 @@ For example:
|
|
|
61
61
|
ma new shiny_cli ./shiny-cli -t click --no-prompt
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
-
## Project workflow
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
|
-
ma up # Synchronize the development environment.
|
|
68
|
-
ma style # Run Ruff checks and apply safe fixes.
|
|
69
|
-
ma tests # Run the configured test matrix.
|
|
70
|
-
ma docs --build # Build documentation without starting a server.
|
|
71
|
-
ma change "+ Add a feature" # Update the changelog and commit modified files.
|
|
72
|
-
ma release # Prepare a release and optionally publish it.
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
Review changes before running `ma change`: it stages and commits modified tracked files together with the changelog.
|
|
76
|
-
|
|
77
64
|
## Documentation
|
|
78
65
|
|
|
79
66
|
The full user and extension documentation is available at <https://makeapp.readthedocs.io/>.
|
|
@@ -44,19 +44,6 @@ For example:
|
|
|
44
44
|
ma new shiny_cli ./shiny-cli -t click --no-prompt
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
-
## Project workflow
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
ma up # Synchronize the development environment.
|
|
51
|
-
ma style # Run Ruff checks and apply safe fixes.
|
|
52
|
-
ma tests # Run the configured test matrix.
|
|
53
|
-
ma docs --build # Build documentation without starting a server.
|
|
54
|
-
ma change "+ Add a feature" # Update the changelog and commit modified files.
|
|
55
|
-
ma release # Prepare a release and optionally publish it.
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
Review changes before running `ma change`: it stages and commits modified tracked files together with the changelog.
|
|
59
|
-
|
|
60
47
|
## Documentation
|
|
61
48
|
|
|
62
49
|
The full user and extension documentation is available at <https://makeapp.readthedocs.io/>.
|
|
@@ -25,15 +25,15 @@ jobs:
|
|
|
25
25
|
- name: Install deps
|
|
26
26
|
run: |
|
|
27
27
|
uv sync --only-group tests
|
|
28
|
-
uv pip install coveralls
|
|
28
|
+
uv pip install -e . coveralls
|
|
29
29
|
- uses: astral-sh/ruff-action@v3
|
|
30
30
|
with:
|
|
31
|
-
version: 0.
|
|
31
|
+
version: 0.17.5
|
|
32
32
|
args: check
|
|
33
33
|
- name: Run tests
|
|
34
34
|
env:
|
|
35
35
|
GITHUB_TOKEN: ${{ secrets.github_token }}
|
|
36
36
|
{% endraw %}
|
|
37
37
|
run: |
|
|
38
|
-
uv run coverage run -m pytest
|
|
39
|
-
uv run coveralls --service=github
|
|
38
|
+
uv run --no-sync coverage run -m pytest
|
|
39
|
+
uv run --no-sync coveralls --service=github
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# contributing {{ app_name }}
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
## Submit issues
|
|
5
|
+
|
|
6
|
+
If you spotted something weird in application behavior or want to propose a feature you are welcome.
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
## Write code
|
|
10
|
+
|
|
11
|
+
If you are eager to participate in application development and to work on an existing issue (whether it should
|
|
12
|
+
be a bugfix or a feature implementation), fork, write code, and make a pull request right from the forked project page.
|
|
13
|
+
|
|
14
|
+
When contributing code, follow the rules from IDLE.md shipped with the project.
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
## Project workflow
|
|
18
|
+
|
|
19
|
+
The development tasks are provided by [makeapp](https://pypi.org/project/makeapp/). Install or update it first:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
uv tool install makeapp # or: uv tool upgrade makeapp
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Then, from the project directory:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
ma up # Synchronize the development environment.
|
|
29
|
+
ma style # Run Ruff checks and apply safe fixes.
|
|
30
|
+
ma tests # Run the configured test matrix.
|
|
31
|
+
ma docs --build # Build documentation without starting a server.
|
|
32
|
+
ma change "+ Add a feature" # Update the changelog and commit modified files.
|
|
33
|
+
ma release # Prepare a release and optionally publish it.
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Review changes before running `ma change`: it stages and commits modified tracked files together with the changelog.
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
## Spread the word
|
|
40
|
+
|
|
41
|
+
If you have some tips and tricks or any other words that you think might be of interest for the others --- publish it
|
|
42
|
+
wherever you find convenient.
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
See also: {{ url }}
|
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
# idle approach
|
|
2
|
+
|
|
3
|
+
Личные инструкции для агентов, работающих с idle-проектами:
|
|
4
|
+
правила оформления кода, подходы к работе с ним и с инструменты.
|
|
5
|
+
|
|
6
|
+
## Роль агента
|
|
7
|
+
|
|
8
|
+
- Основная специализация — архитектура, безопасность, системная разработка,
|
|
9
|
+
разработка веб-сервисов.
|
|
10
|
+
- Предпочитаемый стек: Linux, Python, Rust, TypeScript, PostgreSQL, SQLite.
|
|
11
|
+
- Общайся по-русски, кратко и конкретно; не допускай калькирования на русский.
|
|
12
|
+
- Проверяй гипотезы по исходникам, отличай предположения от фактов.
|
|
13
|
+
|
|
14
|
+
## Общие правила
|
|
15
|
+
|
|
16
|
+
- После завершения каждого этапа кратко сообщай результат и какой этап планируется
|
|
17
|
+
следующим. Если работа завершена и следующего этапа нет, явно говори об этом.
|
|
18
|
+
|
|
19
|
+
### Безопасность
|
|
20
|
+
|
|
21
|
+
- Безопасность - одно из ключевых требований проекта.
|
|
22
|
+
- Приложение должно гарантировать не только безопасность и стабильность исполнения
|
|
23
|
+
своего кода, но также и безопасность данных, с которыми оно работает.
|
|
24
|
+
- Не доспускай ошибок, приводящих к компрометации. Об обнаруженных критических
|
|
25
|
+
ошибках докладывай в том же сеансе, акцентируя внимание на их достоверно возможных
|
|
26
|
+
последствиях.
|
|
27
|
+
- Не раскрывай конфиденциальные данные через результаты, ошибки и диагностику.
|
|
28
|
+
|
|
29
|
+
### Область применения
|
|
30
|
+
|
|
31
|
+
- Общие правила применяются независимо от языка программирования. Раздел «Python»
|
|
32
|
+
относится к коду на Python; раздел «Rust» — к коду Rust; раздел «Django» — к проектам на Django.
|
|
33
|
+
- Этот документ задает личный стандарт проектов. Явные требования задачи и уточнения
|
|
34
|
+
в проектном `AGENTS.md` имеют приоритет над его общими правилами и значениями по умолчанию.
|
|
35
|
+
При неразрешенном противоречии уточни требование у владельца, а не меняй правила самостоятельно.
|
|
36
|
+
- Применяй правила к новому и затронутому задачей коду. Соседний код приводи к ним
|
|
37
|
+
только при необходимости для задачи; массовую реорганизацию выполняй только после утверждения
|
|
38
|
+
владельцем.
|
|
39
|
+
|
|
40
|
+
### Работа с изменениями
|
|
41
|
+
|
|
42
|
+
- Соблюдай принятые в проекте соглашения и структуру. Особенности уточняй по его
|
|
43
|
+
`AGENTS.md`, `README.md`, документам из `docs/` и существующему коду.
|
|
44
|
+
- Не выходи за рамки задачи; посторонние исправления сначала предлагай.
|
|
45
|
+
- Если замечены опечатки в коде или комментариях, предлагай их исправление.
|
|
46
|
+
- При исправлении ошибки сохраняй остальное наблюдаемое поведение.
|
|
47
|
+
- Всегда явно сообщай об обратно несовместимых изменениях.
|
|
48
|
+
|
|
49
|
+
### Совместимость для проектов, которые ещё не были опубличены - WIP
|
|
50
|
+
|
|
51
|
+
- Обязательства по обратной совместимости вступают в силу только после явного
|
|
52
|
+
объявления владельца проекта. До этого не создавай слои совместимости,
|
|
53
|
+
версионируемость форматов и структур, а также тесты поддержки прошлых выпусков.
|
|
54
|
+
После объявления сохранять совместимость в пределах одной мажорной версии
|
|
55
|
+
приложения; несовместимые изменения требуют смены мажорной версии и проверок
|
|
56
|
+
на примерах предыдущих поддерживаемых форматов. Версионируемость схем, форматов,
|
|
57
|
+
интерфейсов вводить после согласования с владельцем проекта.
|
|
58
|
+
|
|
59
|
+
### Архитектура
|
|
60
|
+
|
|
61
|
+
#### Модули и повторное использование
|
|
62
|
+
|
|
63
|
+
- Примитивы и операции распределяй по логически обособленным модулям:
|
|
64
|
+
протокол, транспорт, работа с файлами, валидация, журнал, прикладные сценарии.
|
|
65
|
+
Не собирай всё в точке входа или бесструктурном модуле `utils`; не дроби ради дробления.
|
|
66
|
+
- Не дублируй код. Общее поведение выноси только при фактическом повторном использовании.
|
|
67
|
+
|
|
68
|
+
#### Состояние, ресурсы и ошибки
|
|
69
|
+
|
|
70
|
+
- Объединяй связанное состояние, ресурсы и операции в классы или структуры, когда это логично.
|
|
71
|
+
Допускаются классы или структуры как пространства имён, когда они объединяют связанные данные и методы.
|
|
72
|
+
- Импорт модуля и создание объекта не должны неожиданно обращаться к сети,
|
|
73
|
+
запускать процессы, изменять файлы или начинать фоновую работу. Инициализация
|
|
74
|
+
состояния и проверка аргументов допустимы; внешние действия выполнять явно.
|
|
75
|
+
- Освобождай ресурсы при штатном завершении, ошибке и отмене операции.
|
|
76
|
+
- Проверяй входные данные на границе системы. Ошибки не замалчивай;
|
|
77
|
+
ожидаемые ошибки отделяй от ошибок программирования. Обрабатывай ошибки
|
|
78
|
+
там, где можно корректно завершить операцию, сохранить её состояние
|
|
79
|
+
и сообщить результат. Не добавляй неявные повторы опасных действий.
|
|
80
|
+
- Изменения ради производительности обосновывай измерениями; сохраняй
|
|
81
|
+
надёжность и функциональность.
|
|
82
|
+
|
|
83
|
+
### Зависимости и переносимость
|
|
84
|
+
|
|
85
|
+
- Не привязывай пакет к расположению репозитория,
|
|
86
|
+
рабочему каталогу разработчика, конкретному оборудованию, среде исполнения.
|
|
87
|
+
- Сначала используй стандартную библиотеку и уже принятые зависимости.
|
|
88
|
+
Не добавляй библиотеку или собственную реализацию, дублирующую имеющуюся.
|
|
89
|
+
Инструменты разработки отделяй от runtime-зависимостей.
|
|
90
|
+
- Не включай в дистрибутивы файлы окружения (`.env`), кеши, дампы,
|
|
91
|
+
временные результаты, секреты и другую чувствительную информацию.
|
|
92
|
+
|
|
93
|
+
### CLI
|
|
94
|
+
|
|
95
|
+
Правила этого подраздела относятся только к пакетам с командным интерфейсом.
|
|
96
|
+
|
|
97
|
+
- После добавления команды проверяй её запуск из постороннего каталога.
|
|
98
|
+
- В CLI оставляй только аргументы, выбор команды, взаимодействие
|
|
99
|
+
с пользователем, представление результата и коды завершения.
|
|
100
|
+
- Нижние слои не должны зависеть от CLI.
|
|
101
|
+
- Диагностику CLI направляй в stderr, данные для обработки программами
|
|
102
|
+
(например, JSON) — в stdout без примеси логов. Справка и запрос подтверждения
|
|
103
|
+
остаются интерфейсом CLI.
|
|
104
|
+
|
|
105
|
+
### Журналирование и прогресс
|
|
106
|
+
|
|
107
|
+
- Уровни выбирай по смыслу: `DEBUG`, `INFO`, `WARNING`, `ERROR`.
|
|
108
|
+
- Прикладные уведомления о прогрессе отделяй от диагностики. Для GUI и веб-интерфейса
|
|
109
|
+
допустимы структурированные события или callback прогресса; нельзя получать их разбором логов.
|
|
110
|
+
- Обработчики и формат логов настраивай в точке входа. Библиотечный код
|
|
111
|
+
не может перенастраивать глобальную конфигурацию логов.
|
|
112
|
+
- Сообщения CLI и журналов — на английском. Не логируй секреты и полные
|
|
113
|
+
данные, включая бинарные.
|
|
114
|
+
- Если проект требует обязательного журнала или аудита, полнота этих данных не должна
|
|
115
|
+
зависеть от уровня или обработчиков диагностического журналирования.
|
|
116
|
+
|
|
117
|
+
### Оформление кода
|
|
118
|
+
|
|
119
|
+
- Для строковых литералов используй двойные кавычки.
|
|
120
|
+
|
|
121
|
+
#### Имена
|
|
122
|
+
|
|
123
|
+
- Используй осмысленные имена. Никогда и нигде не используй имена переменных
|
|
124
|
+
из одной буквы. Примеры: `s` → `source`, `i` → `idx`, `p` → `path`,
|
|
125
|
+
`u1` → `user_1`, `r2` → `response_2`.
|
|
126
|
+
- Имена функций и методов начинай с глагола и формулируй как действие:
|
|
127
|
+
`filter_known_fields`, `read_database`, `create_empty_entry`. Для предикатов
|
|
128
|
+
использовать `is_`, `has_`, `can_` или `should_`, например `is_valid_image_path`.
|
|
129
|
+
|
|
130
|
+
#### Импорты
|
|
131
|
+
|
|
132
|
+
- Импорты обычно размещаются в начале модуля. Исключение - циклические импорты,
|
|
133
|
+
если они оправданы.
|
|
134
|
+
|
|
135
|
+
#### Пустые строки и логические блоки
|
|
136
|
+
|
|
137
|
+
- Внутри функций и методов разделяй смысловые части одной пустой строкой (LF).
|
|
138
|
+
- Не допускай в коде две и более последовательных пустых строк.
|
|
139
|
+
|
|
140
|
+
#### Комментарии и строки документации
|
|
141
|
+
|
|
142
|
+
- Комментриуй и документируй на понятном литературном языке, сводя сленг к минимуму.
|
|
143
|
+
- Комментарии объясняют неочевидные ограничения и причины, а не повторяют код.
|
|
144
|
+
- Убирай неактуальные комментарии.
|
|
145
|
+
- Публичные методы следует документировать простыми словами.
|
|
146
|
+
|
|
147
|
+
### Инструменты разработки
|
|
148
|
+
|
|
149
|
+
- Не используй устаревшие инструменты, когда есть подходящие новые.
|
|
150
|
+
- Линтеры и форматтеры запускай только по прямой просьбе владельца,
|
|
151
|
+
включая режимы проверки без изменений.
|
|
152
|
+
- Не переформатируй незатронутый тобой код.
|
|
153
|
+
|
|
154
|
+
### Документация
|
|
155
|
+
|
|
156
|
+
- Описания следует давать простым, доступным широкому кругу языком.
|
|
157
|
+
|
|
158
|
+
#### README
|
|
159
|
+
|
|
160
|
+
- Файл служит для краткого, но ёмкого описания функциональности проекта, с акцентом на то, какую пользу он может принести.
|
|
161
|
+
- Файл не должен содержать избыточных деталей, в том числе технических.
|
|
162
|
+
- При наличии расширенной документации, в файле дожна присутствовать ссылка на неё.
|
|
163
|
+
- В случае отсутствия расширенной документации, допускается добавление в файл примеров использования базовых инструментов, которые предлагает приложение.
|
|
164
|
+
- Не используй относительные ссылки: readme может отображаться там, где нет доступа к исходникам.
|
|
165
|
+
- Не используй абсолютные пути в файловой системе.
|
|
166
|
+
|
|
167
|
+
#### Пользовательская документация
|
|
168
|
+
|
|
169
|
+
- Хранится в docs/
|
|
170
|
+
- Должна включать
|
|
171
|
+
- минимальные требования зависимостей (например: Python 3.15+).
|
|
172
|
+
- краткую (не более двух-трех строк) информацию по установке.
|
|
173
|
+
- Может включать информацию о том, каким образом можно принять участие в проекте.
|
|
174
|
+
- Отдельным разделом допускается quickstart в минималистичном виде позволяющий решить базовую пользовательскую потребность. Далее его можно развивать по шагам, наращивая сложность.
|
|
175
|
+
- В случае необходимости описания API следует предпочитать автоматизированные средства описания (типа `mkdocs-apidescribed-plugin`).
|
|
176
|
+
|
|
177
|
+
#### INSTALL
|
|
178
|
+
|
|
179
|
+
- Файл должен представлять краткое описание процесса установки приложения.
|
|
180
|
+
|
|
181
|
+
#### CONTRIBUTING
|
|
182
|
+
|
|
183
|
+
- Файл представляет краткое описание процесса возможностей участия в развитии приложения.
|
|
184
|
+
- Важно (в том числе для агентов) указать необходимость следования правилам из IDLE.md.
|
|
185
|
+
|
|
186
|
+
#### LICENSE
|
|
187
|
+
|
|
188
|
+
- Файл должен включать текст лицензии.
|
|
189
|
+
- Если не указано иное, следует использовать BSD 3-clause.
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
### Тестирование
|
|
193
|
+
|
|
194
|
+
- Не повторяй имеющиеся тесты, а также тесты других использующихся библиотек,
|
|
195
|
+
каркасов, приложений.
|
|
196
|
+
|
|
197
|
+
#### Структура и сценарии
|
|
198
|
+
|
|
199
|
+
- Для новых самостоятельных пакетов держи тесты в `tests/`; расположение
|
|
200
|
+
тестовых файлов должно повторять иерархию модулей пакета (за исключением корневого).
|
|
201
|
+
- Группируй тесты по публичному поведению.
|
|
202
|
+
- Не пиши отдельные тесты приватных методов.
|
|
203
|
+
- Ищи существующие тесты по настройкам тестового инструмента и фактической структуре
|
|
204
|
+
проекта, не ограничиваясь `tests/`. Правило размещения новых тестов не ограничивает поиск.
|
|
205
|
+
- Покрывай успешные, ошибочные и граничные сценарии, особенно отказ до записи,
|
|
206
|
+
частичное выполнение, отмену и освобождение ресурсов.
|
|
207
|
+
- Стремись к небольшому быстрому набору тестов. Не плоди и не дублируй
|
|
208
|
+
проверки: сходные случаи объединяй там, где это логично и сохраняет понятность.
|
|
209
|
+
Для этого ознакомься с имеющимися тестами и, когда не противоречит другим правилам, развивай их.
|
|
210
|
+
- Своди к абсолютному минимуму условную логику внутри тестовых функций.
|
|
211
|
+
- Подготовку, действие и проверки разделяй пустыми строками, без обязательных
|
|
212
|
+
комментариев Arrange/Act/Assert. Имена тестов должны объяснять сценарий, но не быть многословными.
|
|
213
|
+
- Для ошибок проверяй тип и существенный текст.
|
|
214
|
+
- Нельзя писать тесты на тесты, а также тесты на документацию.
|
|
215
|
+
|
|
216
|
+
#### Фикстуры, данные и время
|
|
217
|
+
|
|
218
|
+
- Изучай и переиспользуй имеющиеся фикстуры; варианты задавать параметризацией.
|
|
219
|
+
Выбирай минимально необходимый scope и объём данных.
|
|
220
|
+
- Не создавай фикстуры ради использования в единственном месте. Исключения —
|
|
221
|
+
управление ресурсами, подготовка окружения и гарантированная очистка.
|
|
222
|
+
- Небольшие данные допустимы непосредственно в тесте. Большие должны размещаться
|
|
223
|
+
рядом в поддиректории datafixtures.
|
|
224
|
+
- Если время или случайность влияют на результат, управляй ими через подмену зависимости.
|
|
225
|
+
Не используй реальные ожидания для проверки таймеров и длительностей.
|
|
226
|
+
- Не ослабляй production-проверки ради теста.
|
|
227
|
+
|
|
228
|
+
#### Изоляция и подмены
|
|
229
|
+
|
|
230
|
+
- Общий набор тестов не должен зависеть от порядка, реального оборудования,
|
|
231
|
+
внешней сети и привилегий.
|
|
232
|
+
- Автотесты не должны требовать административных прав, изменять рабочие
|
|
233
|
+
системные каталоги, журналы и службы или затрагивать пользовательские сеансы.
|
|
234
|
+
Внешние взаимодействия, сторонние сервисы, подменяй либо выполняй в изолированной
|
|
235
|
+
тестовой среде, не затрагивающей рабочую систему и данные пользователя.
|
|
236
|
+
- Широко используй имитации ответов внешних процессов и системных интерфейсов:
|
|
237
|
+
результатов команд, ошибок доступа и исчезновения внешних объектов.
|
|
238
|
+
Подменяй внешние взаимодействия, но не проверяемые расчеты, валидацию,
|
|
239
|
+
сериализацию и прикладные решения.
|
|
240
|
+
- Unit-тесты не должны создавать реальные внешние соединения, в том числе HTTP/TLS:
|
|
241
|
+
внешние взаимодействия подменяй.
|
|
242
|
+
- Интеграционные тесты проверяют совместную работу реальных проверяемых компонентов
|
|
243
|
+
в изоляции. Допустимы временные локальные серверы и другие необходимые изолированные
|
|
244
|
+
компоненты.
|
|
245
|
+
- Проверяй обработку ответов и ошибок.
|
|
246
|
+
|
|
247
|
+
#### Границы набора проверок
|
|
248
|
+
|
|
249
|
+
- В общем наборе не выделяй отдельный набор тяжёлых тестов.
|
|
250
|
+
- Локально и в CI проверяй одно и то же публичное поведение.
|
|
251
|
+
- Не вводи дополнительную инфраструктуру проверок, в том числе VM-проверки,
|
|
252
|
+
coverage и Hypothesis, без необходимости для задачи. Сохраняй уже принятую
|
|
253
|
+
в проекте инфраструктуру проверок.
|
|
254
|
+
- Сквозные (end-to-end) тесты допустимы в отдельном явно запускаемом наборе.
|
|
255
|
+
Не включай их в общий запуск тестов ни локально, ни в CI.
|
|
256
|
+
- Не добавляй тесты внутреннего механизма стороннего сборщика или установщика.
|
|
257
|
+
|
|
258
|
+
### Файлы
|
|
259
|
+
|
|
260
|
+
- Каждый редактируемый текстовый файл должен заканчиваться ровно одним завершающим LF,
|
|
261
|
+
без дополнительных пустых строк и пробелов в концах строк.
|
|
262
|
+
|
|
263
|
+
### Проверки и отчёт
|
|
264
|
+
|
|
265
|
+
- После изменений запускай релевантные проверки и сообщай фактические результаты.
|
|
266
|
+
Если проверка не выполнена, явно укажи это, не выдавая её за успешную.
|
|
267
|
+
|
|
268
|
+
## Python
|
|
269
|
+
|
|
270
|
+
### Упаковка
|
|
271
|
+
|
|
272
|
+
#### Структура и зависимости
|
|
273
|
+
|
|
274
|
+
- Новые самостоятельные приложения оформляй как переносимые Python 3.12+ пакеты
|
|
275
|
+
с `src`-структурой и `pyproject.toml`, сборка через `hatchling`, не setuptools.
|
|
276
|
+
|
|
277
|
+
#### Дистрибутивы и служебные файлы
|
|
278
|
+
|
|
279
|
+
- В wheel включай пакет с необходимыми для работы ресурсами, метаданные и лицензии.
|
|
280
|
+
В sdist включай исходники и всё необходимое для сборки: `pyproject.toml`, используемые
|
|
281
|
+
при сборке README, лицензии, сборочные скрипты и ресурсы. Тесты и их данные
|
|
282
|
+
в wheel и sdist не включать.
|
|
283
|
+
- Для библиотек и приложений, устанавливаемых из пакета, `uv.lock` не включай в VCS.
|
|
284
|
+
Для веб-сервисов, разворачиваемых из репозитория, храни `uv.lock` в VCS
|
|
285
|
+
для воспроизводимого развёртывания. В wheel и sdist `uv.lock` не включай.
|
|
286
|
+
|
|
287
|
+
### CLI
|
|
288
|
+
|
|
289
|
+
- Точка входа — команда из `[project.scripts]`, например `<package>.cli:main`.
|
|
290
|
+
Не создавай `main.py` и `__main__.py`; функция `main()` в `cli.py` допустима.
|
|
291
|
+
- Нижние слои не должны зависеть от `argparse.Namespace`, `input` или `print`.
|
|
292
|
+
|
|
293
|
+
### Журналирование и прогресс
|
|
294
|
+
|
|
295
|
+
- Для диагностических сообщений используй стандартный `logging` и модульные логгеры
|
|
296
|
+
`logging.getLogger(__name__)`, а не `print` или собственный callback.
|
|
297
|
+
- В logging используй отложенное форматирование:
|
|
298
|
+
`logger.info("Read %d bytes", size)`; f-строки — для обычного построения строк.
|
|
299
|
+
|
|
300
|
+
### Оформление кода
|
|
301
|
+
|
|
302
|
+
#### Имена и типы
|
|
303
|
+
|
|
304
|
+
- Свойства (`@property`) и pytest-фикстуры называй как данные или ресурсы.
|
|
305
|
+
- Аннотируй аргументы и возвращаемые значения функций и методов, включая
|
|
306
|
+
непубличные. Keyword-only параметры используй, когда это предотвращает путаницу.
|
|
307
|
+
- `from __future__ import annotations` добавляйь только при необходимости отложенных
|
|
308
|
+
аннотаций, например для ссылок на ещё не определённые типы или импортов под `TYPE_CHECKING`.
|
|
309
|
+
Не добавляй его во все модули по привычке.
|
|
310
|
+
|
|
311
|
+
#### Импорты
|
|
312
|
+
|
|
313
|
+
- Внешние импорты — абсолютные, все импорты внутри приложения — относительные;
|
|
314
|
+
`import *` запрещён.
|
|
315
|
+
- Ленивый импорт допустим по конкретной причине, например, чтобы справка
|
|
316
|
+
и импорт библиотеки не требовали необязательного backend.
|
|
317
|
+
|
|
318
|
+
#### Приёмы и средства языка
|
|
319
|
+
|
|
320
|
+
- Для путей предпочитать `pathlib.Path`, сохраняя низкоуровневый `os` там,
|
|
321
|
+
где нужны гарантии работы с дескриптором.
|
|
322
|
+
- При повторном чтении одного и того же атрибуйта (илилих цепочки), или
|
|
323
|
+
неизменившегося значения словаря, сохраняй его в переменной, если это улучшает читаемость.
|
|
324
|
+
Если словарь мог измениться, повторно читать актуальное значение.
|
|
325
|
+
- Используй оператор `:=` (walrus), когда он устраняет повторное вычисление
|
|
326
|
+
и улучшает читаемость, не только в циклах, но и в компоновках (comprehensions).
|
|
327
|
+
Например: `names = {name_ for name in names_all if (name_ := name.strip())}`.
|
|
328
|
+
|
|
329
|
+
#### Пустые строки и логические блоки
|
|
330
|
+
|
|
331
|
+
- Перед блоками `with`, `for`, `while`, `if`, а также перед `elif` и `else` оставляй
|
|
332
|
+
ровно одну пустую строку. Это относится и к первому блоку сразу после объявления
|
|
333
|
+
функции, и к вложенным блокам.
|
|
334
|
+
- Перед `except` оставляй ровно одну пустую строку. После блоков и `raise` оставляй
|
|
335
|
+
одну пустую строку, если далее в функции есть код. В конце файла дополнительную
|
|
336
|
+
пустую строку не добавляй: действует правило единственного завершающего LF.
|
|
337
|
+
|
|
338
|
+
#### Строки
|
|
339
|
+
|
|
340
|
+
- Для обычного преобразования значений в строки и форматирования используй
|
|
341
|
+
f-строки, а не `str()`, `format()` или оператор `%`. Исключение — обязательное
|
|
342
|
+
отложенное форматирование сообщений `logging`, указанное выше.
|
|
343
|
+
|
|
344
|
+
#### Файлы
|
|
345
|
+
|
|
346
|
+
- Не оставляй `.py` файлы, содержащие только комментарии; исключение — `__init__.py`.
|
|
347
|
+
|
|
348
|
+
### Инструменты разработки
|
|
349
|
+
|
|
350
|
+
#### makeapp
|
|
351
|
+
|
|
352
|
+
- Для локальной разработки используй [makeapp](https://pypi.org/project/makeapp/):
|
|
353
|
+
`ma tools` и `ma tests` из каталога конкретного пакета. В CI makeapp не
|
|
354
|
+
используй: тесты запускай через pytest.
|
|
355
|
+
- Для локальной работы и разработки CLI устанавливай из каталога пакета:
|
|
356
|
+
`ma up --tool`. Запускай напрямую по имени команды.
|
|
357
|
+
В пользовательских инструкциях не описывай альтернативные способы
|
|
358
|
+
установки и ручное управление окружениями.
|
|
359
|
+
|
|
360
|
+
#### Форматирование
|
|
361
|
+
|
|
362
|
+
- При прямо запрошенном форматировании Python используй Ruff с настройками пакета.
|
|
363
|
+
Длина строки — не более 129 символов, либо более строгий лимит форматтера пакета.
|
|
364
|
+
|
|
365
|
+
### Тестирование
|
|
366
|
+
|
|
367
|
+
#### Среда и инструменты
|
|
368
|
+
|
|
369
|
+
- База тестирования — pytest. Для данных из файлов используй `pytest-datafixtures`,
|
|
370
|
+
для имитации HTTP-ответов внешних систем при использовании `requests` —
|
|
371
|
+
`pytest-responsemock` и его фикстуру `response_mock`,
|
|
372
|
+
для Django-приложений — `pytest-djangoapp`, для управления календарным временем — `time-machine`
|
|
373
|
+
(импорт и pytest-фикстура `time_machine`). Все это зависимости разработки,
|
|
374
|
+
отдельно от зависимостей времени выполнения приложений.
|
|
375
|
+
|
|
376
|
+
#### Структура и сценарии
|
|
377
|
+
|
|
378
|
+
- Например, `src/pkg/model/config.py` соответствует `tests/pkg/model/test_config.py`.
|
|
379
|
+
- Docstring добавляй к тестам только в неочевидных случаях.
|
|
380
|
+
- Для проверки исключений используй `pytest.raises(..., match=...)`.
|
|
381
|
+
|
|
382
|
+
#### Фикстуры, данные и время
|
|
383
|
+
|
|
384
|
+
- Общие фикстуры размещай в `conftest.py`.
|
|
385
|
+
Когда вариантам нужны имена, используй `pytest.param(..., id="name")`.
|
|
386
|
+
- Получай фикстуры через параметры тестов, а не через импорт функций-фикстур.
|
|
387
|
+
- Создавай callable-фикстуры, если требуется гибкость в передаче параметров:
|
|
388
|
+
такие фикстуры должны возвращать вызываемый объект.
|
|
389
|
+
- Объёмные сохранённые образцы храни в `tests/datafixtures/` и читай
|
|
390
|
+
через `pytest-datafixtures`.
|
|
391
|
+
- Используй `tmp_path` для файлов, `caplog` для логов.
|
|
392
|
+
- `time-machine` 3.x не подменяй монотонные часы: нужный источник
|
|
393
|
+
монотонного времени подменяй отдельно в тестируемом коде, не глобально.
|
|
394
|
+
|
|
395
|
+
#### Границы набора проверок
|
|
396
|
+
|
|
397
|
+
- Собственный состав wheel/sdist и установку пакета проверяй, если это относится
|
|
398
|
+
к задаче, например при изменении ресурсов пакета или точек входа.
|
|
399
|
+
|
|
400
|
+
## Rust
|
|
401
|
+
|
|
402
|
+
### Состояние, ресурсы и ошибки
|
|
403
|
+
|
|
404
|
+
- В рабочем коде ожидаемые ошибки возвращай через `Result` и распространяй через `?`.
|
|
405
|
+
Не используй `panic!`, `unwrap` и `expect` для ошибок входных данных или внешних операций.
|
|
406
|
+
- Ресурсы освобождай через владение и `Drop`. Если результат завершения операции важен,
|
|
407
|
+
возвращай его явно; резервная очистка в `Drop` не заменяет обработку ошибок.
|
|
408
|
+
|
|
409
|
+
### Оформление кода
|
|
410
|
+
|
|
411
|
+
- Для путей предпочитай `Path` и `PathBuf`, сохраняя низкоуровневые операции там,
|
|
412
|
+
где нужны гарантии работы с дескриптором.
|
|
413
|
+
- Запрет однобуквенных имён переменных не относится к параметрам типов и временам жизни.
|
|
414
|
+
- Методы доступа к данным могут называться как данные или ресурсы.
|
|
415
|
+
Сохраняй стандартные имена конструкторов и методов Rust.
|
|
416
|
+
|
|
417
|
+
### Тестирование
|
|
418
|
+
|
|
419
|
+
- Не создавай каталог для одного модуля: если достаточно одного файла,
|
|
420
|
+
использовать его вместо каталога с единственным `mod.rs`.
|
|
421
|
+
- Для проверок используй `cargo test` и `cargo check` из каталога конкретного пакета.
|
|
422
|
+
|
|
423
|
+
## Django
|
|
424
|
+
|
|
425
|
+
### Модели
|
|
426
|
+
|
|
427
|
+
- В методах `__str__()` моделей не обращайся к внешним ключам.
|
|
428
|
+
|
|
429
|
+
### URL и пространства имён
|
|
430
|
+
|
|
431
|
+
- В `urls.py` задавай `app_name` для создания пространства имён.
|
|
432
|
+
- Иерархические URL записывай прямо в `urlpatterns` вложенным деревом
|
|
433
|
+
`path("prefix/", include([path(...), ...]))`: дочерние `path` размещай внутри
|
|
434
|
+
`include`, а не в плоском списке или промежуточных переменных вроде `limits_patterns`.
|
|
435
|
+
|
|
436
|
+
### Миграции
|
|
437
|
+
|
|
438
|
+
- Миграции изменений схемы создавай и перегенерируй командами Django.
|
|
439
|
+
- Для авторских миграций данных и специальных операций `RunPython` или `RunSQL`
|
|
440
|
+
создавай пустую миграцию через `makemigrations --empty`, затем записывай
|
|
441
|
+
необходимые операции и код преобразования.
|
|
442
|
+
- Уже применённые миграции не переписывай без утверждения владельца, если проект явно не допускает
|
|
443
|
+
перегенерацию первоначальных миграций на этапе разработки.
|
|
444
|
+
- Для миграций используй встроенные средства Django, не строй отдельный набор
|
|
445
|
+
автотестов механизма миграций. Собственную логику преобразования данных проверяй.
|
|
446
|
+
|
|
447
|
+
### Тестирование
|
|
448
|
+
|
|
449
|
+
- Не используй `django.test.TestCase` для Django-тестов. Используй машинерию pytest.
|
|
450
|
+
- В Django-тестах не задавай внутренние URL вручную — получай их через `reverse()`.
|
|
451
|
+
Не вызывай reverse() каждый раз — создавай url_* фикстуры и используй их.
|
|
452
|
+
- При использовании фикстур, считающих обращения к БД, следи за актуальностью
|
|
453
|
+
ожидаемого количества запросов: проверяй фактические значения, не выдумывай числа.
|
|
454
|
+
|
|
455
|
+
----
|
|
456
|
+
|
|
457
|
+
Источник и актуальная версия: https://gist.github.com/idlesign/206cad37df9a9cfbe1a366ff6dc1bd06
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Installing {{ app_name }}
|
|
2
|
+
|
|
3
|
+
[uv](https://docs.astral.sh/uv/) is recommended for installation, though plain `pip` works too.
|
|
4
|
+
|
|
5
|
+
{% block pypi %}
|
|
6
|
+
## From PyPI
|
|
7
|
+
|
|
8
|
+
Add the package to a project:
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
uv add {{ app_name }}
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
or with pip:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
pip install {{ app_name }}
|
|
18
|
+
```
|
|
19
|
+
{% endblock %}
|
|
20
|
+
|
|
21
|
+
## From source
|
|
22
|
+
|
|
23
|
+
Clone the repository and synchronize its development environment:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
git clone {{ url }} {{ app_name }}
|
|
27
|
+
cd {{ app_name }}
|
|
28
|
+
uv sync
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Run commands in the project environment with `uv run`.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{% extends parent_template %}
|
|
2
|
+
|
|
3
|
+
{% block pypi %}
|
|
4
|
+
## From PyPI
|
|
5
|
+
|
|
6
|
+
Install the command-line application as an isolated tool:
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
uv tool install {{ app_name }}
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Upgrade it with:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
uv tool upgrade {{ app_name }}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
or with pip:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
pip install {{ app_name }}
|
|
22
|
+
```
|
|
23
|
+
{% endblock %}
|