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.
Files changed (99) hide show
  1. {makeapp-2.4.0 → makeapp-2.5.0}/.gitignore +1 -0
  2. {makeapp-2.4.0 → makeapp-2.5.0}/PKG-INFO +1 -14
  3. {makeapp-2.4.0 → makeapp-2.5.0}/README.md +0 -13
  4. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/__init__.py +1 -1
  5. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/.github/workflows/python-package.yml +4 -4
  6. makeapp-2.5.0/src/makeapp/app_templates/__default__/AGENTS.md +3 -0
  7. makeapp-2.5.0/src/makeapp/app_templates/__default__/CONTRIBUTING.md +45 -0
  8. makeapp-2.5.0/src/makeapp/app_templates/__default__/IDLE.md +457 -0
  9. makeapp-2.5.0/src/makeapp/app_templates/__default__/INSTALL.md +31 -0
  10. makeapp-2.5.0/src/makeapp/app_templates/console/INSTALL.md +23 -0
  11. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/.github/workflows/python-package.yml +7 -5
  12. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/apptools.py +7 -9
  13. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/cli.py +6 -3
  14. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/helpers/tests.py +6 -2
  15. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/helpers/venvs.py +1 -1
  16. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/utils.py +54 -4
  17. makeapp-2.4.0/src/makeapp/app_templates/__default__/CONTRIBUTING.md +0 -21
  18. makeapp-2.4.0/src/makeapp/app_templates/__default__/INSTALL.md +0 -35
  19. {makeapp-2.4.0 → makeapp-2.5.0}/LICENSE +0 -0
  20. {makeapp-2.4.0 → makeapp-2.5.0}/pyproject.toml +0 -0
  21. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/.gitignore +0 -0
  22. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/AUTHORS.md +0 -0
  23. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/CHANGELOG.md +0 -0
  24. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/README.md +0 -0
  25. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/docs/index.md +0 -0
  26. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/docs/quickstart.md +0 -0
  27. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/mkdocs.yml +0 -0
  28. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/pyproject.toml +0 -0
  29. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/ruff.toml +0 -0
  30. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/src/__package_name__/__init__.py +0 -0
  31. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/tests/__init__.py +0 -0
  32. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/__default__/tests/test_basic.py +0 -0
  33. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/click/makeappconf.py +0 -0
  34. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/click/pyproject.toml +0 -0
  35. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/click/src/__package_name__/cli.py +0 -0
  36. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/console/pyproject.toml +0 -0
  37. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/console/src/__package_name__/cli.py +0 -0
  38. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/makeappconf.py +0 -0
  39. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/pyproject.toml +0 -0
  40. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/__init__.py +0 -0
  41. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/admin.py +0 -0
  42. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/apps.py +0 -0
  43. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/locale/empty +0 -0
  44. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/management/__init__.py +0 -0
  45. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/management/commands/__init__.py +0 -0
  46. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/models.py +0 -0
  47. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/templates/empty +0 -0
  48. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/templatetags/empty +0 -0
  49. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/tests/__init__.py +0 -0
  50. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/tests/conftest.py +0 -0
  51. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/tests/test_basic.py +0 -0
  52. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/django/src/__package_name__/views.py +0 -0
  53. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/pytestplugin/pyproject.toml +0 -0
  54. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/pytestplugin/src/__package_name__/entry.py +0 -0
  55. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/pytestplugin/tests/test_basic.py +0 -0
  56. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/.gitignore +0 -0
  57. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/conf/__package_name__-certbot-hook.sh +0 -0
  58. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/conf/__package_name__.service +0 -0
  59. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/conf/env_production.py +0 -0
  60. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/makeappconf.py +0 -0
  61. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/pyproject.toml +0 -0
  62. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/requirements.txt +0 -0
  63. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/src/__package_name__/core/uwsgiinit.py +0 -0
  64. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/src/__package_name__/settings/__init__.py +0 -0
  65. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/src/__package_name__/settings/auto.py +0 -0
  66. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/src/__package_name__/settings/base.py +0 -0
  67. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/src/__package_name__/settings/env_development.py +0 -0
  68. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/src/__package_name__/settings/env_testing.py +0 -0
  69. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/src/__package_name__/settings/sub_paths.py +0 -0
  70. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/src/__package_name__/uwsgicfg.py +0 -0
  71. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/state/certbot/empty +0 -0
  72. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/state/dumps/empty +0 -0
  73. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/state/media/empty +0 -0
  74. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/state/spool/empty +0 -0
  75. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/state/static/empty +0 -0
  76. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/tests/conftest.py +0 -0
  77. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/tests/requirements.txt +0 -0
  78. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/tests/test_module.py +0 -0
  79. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/app_templates/webscaff/wscaff.yml +0 -0
  80. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/appconfig.py +0 -0
  81. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/appmaker.py +0 -0
  82. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/apptemplate.py +0 -0
  83. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/exceptions.py +0 -0
  84. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/helpers/__init__.py +0 -0
  85. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/helpers/dist.py +0 -0
  86. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/helpers/files.py +0 -0
  87. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/helpers/vcs.py +0 -0
  88. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/license_templates/apache2 +0 -0
  89. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/license_templates/apache2_src +0 -0
  90. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/license_templates/bsd2cl +0 -0
  91. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/license_templates/bsd3cl +0 -0
  92. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/license_templates/gpl2 +0 -0
  93. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/license_templates/gpl2_src +0 -0
  94. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/license_templates/gpl3 +0 -0
  95. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/license_templates/gpl3_src +0 -0
  96. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/license_templates/mit +0 -0
  97. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/license_templates/no +0 -0
  98. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/license_templates/no_src +0 -0
  99. {makeapp-2.4.0 → makeapp-2.5.0}/src/makeapp/rendering.py +0 -0
@@ -12,3 +12,4 @@ __pycache__
12
12
  .pytest_cache
13
13
  .ma-*
14
14
  .env
15
+ *.lock
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: makeapp
3
- Version: 2.4.0
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/>.
@@ -1,3 +1,3 @@
1
1
 
2
- VERSION = '2.4.0'
2
+ VERSION = '2.5.0'
3
3
  """Application version number tuple."""
@@ -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.13.1
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,3 @@
1
+ # Agent rules
2
+
3
+ See IDLE.md for further instructions.
@@ -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 %}