ak-py-bootstrap 0.9.4__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.
- ak_py_bootstrap-0.9.4/.github/workflows/ci.yml +84 -0
- ak_py_bootstrap-0.9.4/.gitignore +165 -0
- ak_py_bootstrap-0.9.4/.pre-commit-config.yaml +18 -0
- ak_py_bootstrap-0.9.4/.readthedocs.yaml +38 -0
- ak_py_bootstrap-0.9.4/AUTHORS.md +8 -0
- ak_py_bootstrap-0.9.4/CHANGELOG.md +113 -0
- ak_py_bootstrap-0.9.4/CLAUDE.md +128 -0
- ak_py_bootstrap-0.9.4/LICENSE +201 -0
- ak_py_bootstrap-0.9.4/Makefile +169 -0
- ak_py_bootstrap-0.9.4/PKG-INFO +427 -0
- ak_py_bootstrap-0.9.4/README.md +400 -0
- ak_py_bootstrap-0.9.4/ak_py_bootstrap.egg-info/PKG-INFO +427 -0
- ak_py_bootstrap-0.9.4/ak_py_bootstrap.egg-info/SOURCES.txt +126 -0
- ak_py_bootstrap-0.9.4/ak_py_bootstrap.egg-info/dependency_links.txt +1 -0
- ak_py_bootstrap-0.9.4/ak_py_bootstrap.egg-info/entry_points.txt +5 -0
- ak_py_bootstrap-0.9.4/ak_py_bootstrap.egg-info/scm_file_list.json +123 -0
- ak_py_bootstrap-0.9.4/ak_py_bootstrap.egg-info/scm_version.json +8 -0
- ak_py_bootstrap-0.9.4/ak_py_bootstrap.egg-info/top_level.txt +1 -0
- ak_py_bootstrap-0.9.4/changelog.d/README.md +42 -0
- ak_py_bootstrap-0.9.4/changelog.d/_template.md +71 -0
- ak_py_bootstrap-0.9.4/docs/Makefile +20 -0
- ak_py_bootstrap-0.9.4/docs/__init__.py +0 -0
- ak_py_bootstrap-0.9.4/docs/_templates/.gitkeep +0 -0
- ak_py_bootstrap-0.9.4/docs/authors.md +5 -0
- ak_py_bootstrap-0.9.4/docs/changelog.md +5 -0
- ak_py_bootstrap-0.9.4/docs/concepts/architecture.md +77 -0
- ak_py_bootstrap-0.9.4/docs/concepts/index.md +12 -0
- ak_py_bootstrap-0.9.4/docs/conf.py +66 -0
- ak_py_bootstrap-0.9.4/docs/contributing.md +96 -0
- ak_py_bootstrap-0.9.4/docs/guides/distribute-bootstraps-as-a-plugin.md +58 -0
- ak_py_bootstrap-0.9.4/docs/guides/export-and-modify-a-bootstrap.md +23 -0
- ak_py_bootstrap-0.9.4/docs/guides/generate-a-project.md +71 -0
- ak_py_bootstrap-0.9.4/docs/guides/index.md +20 -0
- ak_py_bootstrap-0.9.4/docs/guides/register-a-bootstrap.md +47 -0
- ak_py_bootstrap-0.9.4/docs/guides/write-a-bootstrap.md +37 -0
- ak_py_bootstrap-0.9.4/docs/index.md +78 -0
- ak_py_bootstrap-0.9.4/docs/installation.md +34 -0
- ak_py_bootstrap-0.9.4/docs/make.bat +35 -0
- ak_py_bootstrap-0.9.4/docs/quickstart.md +65 -0
- ak_py_bootstrap-0.9.4/docs/reference/api.md +11 -0
- ak_py_bootstrap-0.9.4/docs/reference/cli.md +12 -0
- ak_py_bootstrap-0.9.4/docs/reference/index.md +11 -0
- ak_py_bootstrap-0.9.4/docs/releasing/changelog.md +62 -0
- ak_py_bootstrap-0.9.4/docs/releasing/configure-github-actions.md +220 -0
- ak_py_bootstrap-0.9.4/docs/releasing/configure-pypi.md +112 -0
- ak_py_bootstrap-0.9.4/docs/releasing/configure-readthedocs.md +290 -0
- ak_py_bootstrap-0.9.4/docs/static/.gitkeep +0 -0
- ak_py_bootstrap-0.9.4/docs/static/rtd-flyout.js +56 -0
- ak_py_bootstrap-0.9.4/docs/versioning.md +33 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/__init__.py +4 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/base/__init__.py +0 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/base/operations/__init__.py +10 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/base/operations/base.py +35 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/base/operations/recursive_container.py +69 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/base/operations/runner.py +53 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/files_processors/__init__.py +9 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/files_processors/base.py +106 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/files_processors/copy.py +45 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/files_processors/generate.py +65 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/operations/__init__.py +13 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/operations/base.py +52 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/operations/build_bootstrap.py +180 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/operations/dispatcher.py +82 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/operations/export_bootstrap.py +109 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/operations/list_bootstraps.py +38 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/operations/register_bootstrap.py +127 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/scripts/__init__.py +0 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/scripts/bootstrap.py +39 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/__init__.py +7 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/application/CHANGELOG.md.tmpl +13 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/application/README.md.tmpl +52 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/application/__entry_point__.py +37 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/application/pyproject.toml.tmpl +57 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/application/requirements-dev.txt +7 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/application/requirements.txt +0 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/application/tests/__init__.py +0 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/application/tox.ini.tmpl +49 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/application/{empty}.gitignore.tmpl +161 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/bootstrap/__entry_point__.py +37 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/bootstrap/__entry_point__.py.tmpl +58 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/bootstrap/demo-file.txt.tmpl.tmpl +18 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/AUTHORS.md.tmpl +8 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/CHANGELOG.md.tmpl +13 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/README.md.tmpl +94 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/__entry_point__.py +63 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/docs/Makefile +20 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/docs/__init__.py +0 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/docs/conf.py.tmpl +57 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/docs/index.rst.tmpl +14 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/docs/make.bat +35 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/pyproject.toml.tmpl +169 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/requirements-dev.txt +8 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/requirements.txt +0 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/tests/__init__.py +0 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/tests/test_package.py.tmpl +12 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/tox.ini.tmpl +81 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/{empty}.gitignore.tmpl +161 -0
- ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/{python_name}/__init__.py.tmpl +23 -0
- ak_py_bootstrap-0.9.4/pyproject.toml +192 -0
- ak_py_bootstrap-0.9.4/setup.cfg +4 -0
- ak_py_bootstrap-0.9.4/tests/__init__.py +0 -0
- ak_py_bootstrap-0.9.4/tests/base/__init__.py +0 -0
- ak_py_bootstrap-0.9.4/tests/base/operations/__init__.py +0 -0
- ak_py_bootstrap-0.9.4/tests/base/operations/test_base.py +36 -0
- ak_py_bootstrap-0.9.4/tests/base/operations/test_recursive_container.py +89 -0
- ak_py_bootstrap-0.9.4/tests/operations/__init__.py +0 -0
- ak_py_bootstrap-0.9.4/tests/operations/test_build_bootstrap.py +116 -0
- ak_py_bootstrap-0.9.4/tests/operations/test_export_bootstrap.py +114 -0
- ak_py_bootstrap-0.9.4/tests/operations/test_list_bootstraps.py +46 -0
- ak_py_bootstrap-0.9.4/tests/operations/test_register_bootstrap.py +145 -0
- ak_py_bootstrap-0.9.4/tests/scripts/__init__.py +0 -0
- ak_py_bootstrap-0.9.4/tests/scripts/test_bootstrap.py +512 -0
- ak_py_bootstrap-0.9.4/tests/tst-register-bootstrap-source/__entry_point__.py +31 -0
- ak_py_bootstrap-0.9.4/tests/tst-register-bootstrap-source/some-dir/copied-file.txt +1 -0
- ak_py_bootstrap-0.9.4/tests/tst-register-bootstrap-source/some-file.txt +1 -0
- ak_py_bootstrap-0.9.4/tests/tst-register-bootstrap-source/{python_name}/generated-file.txt.tmpl +11 -0
- ak_py_bootstrap-0.9.4/tests/tst_templates/__init__.py +7 -0
- ak_py_bootstrap-0.9.4/tests/tst_templates/test_bootstrap/__entry_point__.py +31 -0
- ak_py_bootstrap-0.9.4/tests/tst_templates/test_bootstrap/some-dir/copied-file.txt +1 -0
- ak_py_bootstrap-0.9.4/tests/tst_templates/test_bootstrap/some-file.txt +1 -0
- ak_py_bootstrap-0.9.4/tests/tst_templates/test_bootstrap/{python_name}/generated-file.txt.tmpl +11 -0
- ak_py_bootstrap-0.9.4/tests/tst_templates/test_missed_entry_point/some_file.txt +0 -0
- ak_py_bootstrap-0.9.4/tests/tst_templates/test_wrong_entry_point/__entry_point__.py +7 -0
- ak_py_bootstrap-0.9.4/tools/check_matrix.py +159 -0
- ak_py_bootstrap-0.9.4/tools/check_no_diff.py +38 -0
- ak_py_bootstrap-0.9.4/tools/check_version.py +74 -0
- ak_py_bootstrap-0.9.4/tools/smoke.py +85 -0
- ak_py_bootstrap-0.9.4/tox.ini +16 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
name: ci
|
|
2
|
+
|
|
3
|
+
# Runs on PRs into main / release/*, on pushes to those branches, and for the
|
|
4
|
+
# merge queue (so it gates queued PRs).
|
|
5
|
+
#
|
|
6
|
+
# This workflow is `make check`, split across jobs so the legs run in parallel.
|
|
7
|
+
# Every check is a `make` target invoked exactly as it is locally - there is no
|
|
8
|
+
# check that CI enforces and `make check` does not, and none the other way
|
|
9
|
+
# round. `tox` owns only the interpreter matrix, so the test job pins one
|
|
10
|
+
# interpreter per leg and hands `make` the matching env rather than letting tox
|
|
11
|
+
# discover interpreters itself.
|
|
12
|
+
|
|
13
|
+
on:
|
|
14
|
+
pull_request:
|
|
15
|
+
branches:
|
|
16
|
+
- main
|
|
17
|
+
- "release/*"
|
|
18
|
+
push:
|
|
19
|
+
branches:
|
|
20
|
+
- main
|
|
21
|
+
- "release/*"
|
|
22
|
+
merge_group:
|
|
23
|
+
|
|
24
|
+
permissions:
|
|
25
|
+
contents: read
|
|
26
|
+
|
|
27
|
+
concurrency:
|
|
28
|
+
group: ci-${{ github.event.pull_request.number || github.ref }}
|
|
29
|
+
# Cancel superseded PR runs; never cancel a merge-queue or push run.
|
|
30
|
+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
31
|
+
|
|
32
|
+
jobs:
|
|
33
|
+
# Style, annotations, the docs build and the changelog fragment. All
|
|
34
|
+
# single-interpreter, so they share one matrix over `make` targets.
|
|
35
|
+
checks:
|
|
36
|
+
runs-on: ubuntu-latest
|
|
37
|
+
strategy:
|
|
38
|
+
fail-fast: false
|
|
39
|
+
matrix:
|
|
40
|
+
target: [cs, ann, doc, cl-check]
|
|
41
|
+
steps:
|
|
42
|
+
- uses: actions/checkout@v7
|
|
43
|
+
with:
|
|
44
|
+
fetch-depth: 0 # setuptools-scm (doc) and cl-check need history + tags
|
|
45
|
+
- uses: actions/setup-python@v7
|
|
46
|
+
with:
|
|
47
|
+
python-version: "3.13"
|
|
48
|
+
cache: pip
|
|
49
|
+
cache-dependency-path: pyproject.toml
|
|
50
|
+
# The Makefile defaults PYTHON to python3.13; setup-python already put the
|
|
51
|
+
# interpreter we want first on PATH, so point it there instead.
|
|
52
|
+
- run: make ${{ matrix.target }} PYTHON=python
|
|
53
|
+
|
|
54
|
+
# The suite, once per supported interpreter. Each leg installs only its own
|
|
55
|
+
# interpreter, so tox never has to find a second one.
|
|
56
|
+
test:
|
|
57
|
+
runs-on: ubuntu-latest
|
|
58
|
+
strategy:
|
|
59
|
+
fail-fast: false
|
|
60
|
+
matrix:
|
|
61
|
+
include:
|
|
62
|
+
- python: "3.13"
|
|
63
|
+
toxenv: py313
|
|
64
|
+
- python: "3.14"
|
|
65
|
+
toxenv: py314
|
|
66
|
+
steps:
|
|
67
|
+
- uses: actions/checkout@v7
|
|
68
|
+
with:
|
|
69
|
+
fetch-depth: 0 # setuptools-scm needs full history + tags
|
|
70
|
+
- uses: actions/setup-python@v7
|
|
71
|
+
with:
|
|
72
|
+
python-version: ${{ matrix.python }}
|
|
73
|
+
cache: pip
|
|
74
|
+
cache-dependency-path: pyproject.toml
|
|
75
|
+
- run: make test PY_ENV=${{ matrix.toxenv }} PYTHON=python
|
|
76
|
+
# Reporting only - the coverage gate is `fail_under` in pyproject.toml,
|
|
77
|
+
# which `make test` already enforced above. A Codecov outage must not
|
|
78
|
+
# turn the build red, hence fail_ci_if_error: false.
|
|
79
|
+
- uses: codecov/codecov-action@v7
|
|
80
|
+
with:
|
|
81
|
+
files: ./coverage.xml
|
|
82
|
+
flags: ${{ matrix.toxenv }}
|
|
83
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
84
|
+
fail_ci_if_error: false
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
### Python template
|
|
2
|
+
# Byte-compiled / optimized / DLL files
|
|
3
|
+
__pycache__/
|
|
4
|
+
*.py[cod]
|
|
5
|
+
*$py.class
|
|
6
|
+
|
|
7
|
+
# C extensions
|
|
8
|
+
*.so
|
|
9
|
+
|
|
10
|
+
# Distribution / packaging
|
|
11
|
+
.Python
|
|
12
|
+
build/
|
|
13
|
+
develop-eggs/
|
|
14
|
+
dist/
|
|
15
|
+
downloads/
|
|
16
|
+
eggs/
|
|
17
|
+
.eggs/
|
|
18
|
+
lib/
|
|
19
|
+
lib64/
|
|
20
|
+
parts/
|
|
21
|
+
sdist/
|
|
22
|
+
var/
|
|
23
|
+
wheels/
|
|
24
|
+
share/python-wheels/
|
|
25
|
+
*.egg-info/
|
|
26
|
+
.installed.cfg
|
|
27
|
+
*.egg
|
|
28
|
+
MANIFEST
|
|
29
|
+
|
|
30
|
+
# PyInstaller
|
|
31
|
+
# Usually these files are written by a python script from a template
|
|
32
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
33
|
+
*.manifest
|
|
34
|
+
*.spec
|
|
35
|
+
|
|
36
|
+
# Installer logs
|
|
37
|
+
pip-log.txt
|
|
38
|
+
pip-delete-this-directory.txt
|
|
39
|
+
|
|
40
|
+
# Unit test / coverage reports
|
|
41
|
+
htmlcov/
|
|
42
|
+
.tox/
|
|
43
|
+
.nox/
|
|
44
|
+
.coverage
|
|
45
|
+
.coverage.*
|
|
46
|
+
.cache
|
|
47
|
+
nosetests.xml
|
|
48
|
+
coverage.xml
|
|
49
|
+
*.cover
|
|
50
|
+
*.py,cover
|
|
51
|
+
.hypothesis/
|
|
52
|
+
.pytest_cache/
|
|
53
|
+
cover/
|
|
54
|
+
|
|
55
|
+
# Translations
|
|
56
|
+
*.mo
|
|
57
|
+
*.pot
|
|
58
|
+
|
|
59
|
+
# Django stuff:
|
|
60
|
+
*.log
|
|
61
|
+
local_settings.py
|
|
62
|
+
db.sqlite3
|
|
63
|
+
db.sqlite3-journal
|
|
64
|
+
|
|
65
|
+
# Flask stuff:
|
|
66
|
+
instance/
|
|
67
|
+
.webassets-cache
|
|
68
|
+
|
|
69
|
+
# Scrapy stuff:
|
|
70
|
+
.scrapy
|
|
71
|
+
|
|
72
|
+
# Sphinx documentation
|
|
73
|
+
docs/_build/
|
|
74
|
+
docs/build/
|
|
75
|
+
docs/modules/
|
|
76
|
+
|
|
77
|
+
# PyBuilder
|
|
78
|
+
.pybuilder/
|
|
79
|
+
target/
|
|
80
|
+
|
|
81
|
+
# Jupyter Notebook
|
|
82
|
+
.ipynb_checkpoints
|
|
83
|
+
|
|
84
|
+
# IPython
|
|
85
|
+
profile_default/
|
|
86
|
+
ipython_config.py
|
|
87
|
+
|
|
88
|
+
# pyenv
|
|
89
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
90
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
91
|
+
# .python-version
|
|
92
|
+
|
|
93
|
+
# pipenv
|
|
94
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
95
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
96
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
97
|
+
# install all needed dependencies.
|
|
98
|
+
#Pipfile.lock
|
|
99
|
+
|
|
100
|
+
# poetry
|
|
101
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
102
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
103
|
+
# commonly ignored for libraries.
|
|
104
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
105
|
+
#poetry.lock
|
|
106
|
+
|
|
107
|
+
# pdm
|
|
108
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
109
|
+
#pdm.lock
|
|
110
|
+
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
|
111
|
+
# in version control.
|
|
112
|
+
# https://pdm.fming.dev/#use-with-ide
|
|
113
|
+
.pdm.toml
|
|
114
|
+
|
|
115
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
116
|
+
__pypackages__/
|
|
117
|
+
|
|
118
|
+
# Celery stuff
|
|
119
|
+
celerybeat-schedule
|
|
120
|
+
celerybeat.pid
|
|
121
|
+
|
|
122
|
+
# SageMath parsed files
|
|
123
|
+
*.sage.py
|
|
124
|
+
|
|
125
|
+
# Environments
|
|
126
|
+
.env
|
|
127
|
+
.venv
|
|
128
|
+
.venv-smoke
|
|
129
|
+
env/
|
|
130
|
+
venv/
|
|
131
|
+
ENV/
|
|
132
|
+
env.bak/
|
|
133
|
+
venv.bak/
|
|
134
|
+
|
|
135
|
+
# Spyder project settings
|
|
136
|
+
.spyderproject
|
|
137
|
+
.spyproject
|
|
138
|
+
|
|
139
|
+
# Rope project settings
|
|
140
|
+
.ropeproject
|
|
141
|
+
|
|
142
|
+
# mkdocs documentation
|
|
143
|
+
/site
|
|
144
|
+
|
|
145
|
+
# mypy
|
|
146
|
+
.mypy_cache/
|
|
147
|
+
.dmypy.json
|
|
148
|
+
dmypy.json
|
|
149
|
+
|
|
150
|
+
# Pyre type checker
|
|
151
|
+
.pyre/
|
|
152
|
+
|
|
153
|
+
# pytype static type analyzer
|
|
154
|
+
.pytype/
|
|
155
|
+
|
|
156
|
+
# Cython debug symbols
|
|
157
|
+
cython_debug/
|
|
158
|
+
|
|
159
|
+
# PyCharm
|
|
160
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
161
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
162
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
163
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
164
|
+
.idea/
|
|
165
|
+
py_bootstrap/templates/test-bootstrap
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
3
|
+
rev: v5.0.0
|
|
4
|
+
hooks:
|
|
5
|
+
- id: check-merge-conflict
|
|
6
|
+
- id: check-docstring-first
|
|
7
|
+
- id: debug-statements
|
|
8
|
+
- id: end-of-file-fixer
|
|
9
|
+
- id: trailing-whitespace
|
|
10
|
+
- repo: https://github.com/pycqa/flake8
|
|
11
|
+
rev: 7.2.0
|
|
12
|
+
hooks:
|
|
13
|
+
- id: flake8
|
|
14
|
+
- repo: https://github.com/pre-commit/mirrors-mypy
|
|
15
|
+
rev: v1.16.0
|
|
16
|
+
hooks:
|
|
17
|
+
- id: mypy
|
|
18
|
+
language_version: python3
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Read the Docs build configuration.
|
|
2
|
+
# https://docs.readthedocs.io/en/stable/config-file/v2.html
|
|
3
|
+
version: 2
|
|
4
|
+
|
|
5
|
+
build:
|
|
6
|
+
os: ubuntu-24.04
|
|
7
|
+
tools:
|
|
8
|
+
python: "3.13"
|
|
9
|
+
jobs:
|
|
10
|
+
# Full history + tags so setuptools-scm can resolve the version.
|
|
11
|
+
post_checkout:
|
|
12
|
+
- git fetch --unshallow || true
|
|
13
|
+
- git fetch --tags || true
|
|
14
|
+
pre_build:
|
|
15
|
+
# `make apidoc` installs the `doc` dependency group (PEP 735) and
|
|
16
|
+
# regenerates docs/modules/, which is gitignored. Pointing VENV at the
|
|
17
|
+
# environment Read the Docs already built stops make from creating a
|
|
18
|
+
# second one, and keeps the sphinx-apidoc flags defined in one place.
|
|
19
|
+
# pip must be >= 25.1 first: PEP 735 `--group` is what the target uses.
|
|
20
|
+
#
|
|
21
|
+
# Equivalent without make:
|
|
22
|
+
# python -m pip install --group doc
|
|
23
|
+
# sphinx-apidoc --separate --force --no-toc --module-first \
|
|
24
|
+
# --ext-viewcode --output-dir docs/modules py_bootstrap
|
|
25
|
+
- python -m pip install --upgrade pip
|
|
26
|
+
- make apidoc VENV=$READTHEDOCS_VIRTUALENV_PATH
|
|
27
|
+
|
|
28
|
+
sphinx:
|
|
29
|
+
configuration: docs/conf.py
|
|
30
|
+
fail_on_warning: false
|
|
31
|
+
|
|
32
|
+
python:
|
|
33
|
+
install:
|
|
34
|
+
- method: pip
|
|
35
|
+
path: .
|
|
36
|
+
|
|
37
|
+
formats:
|
|
38
|
+
- pdf
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Py Bootstrap Changelog
|
|
2
|
+
|
|
3
|
+
<!-- towncrier release notes start -->
|
|
4
|
+
|
|
5
|
+
## [0.9.4] - 2026-09-07
|
|
6
|
+
### Added
|
|
7
|
+
- Added `tools/check_matrix.py`, which fails when the supported-Python list drifts apart. The interpreters are declared three times with nothing linking them — `tox.ini` `env_list`, the `pyproject.toml` classifiers and the `ci.yml` test matrix — so adding a version in one place and forgetting the others used to pass silently. `make test` runs it before handing over to `tox`.
|
|
8
|
+
- Added a `CLAUDE.md` at the repository root describing the project for Claude Code: the `make`-driven command set, the mandatory `changelog.d/` news fragment, the operation-object and entry-point discovery architecture, the templating rules that are easy to get wrong (rendered destination paths, the `.tmpl` suffix, the `{empty}` dotfile placeholder), and the test fixture layout. It also sets a 200-line limit on every `CLAUDE.md` in the repository.
|
|
9
|
+
- Added coverage reporting to Codecov. The suite now writes `coverage.xml` alongside the existing terminal and HTML reports, and the `ci` workflow uploads it once per interpreter. The coverage gate itself is unchanged — `fail_under = 95` still fails `make test` locally and in CI, so the upload is reporting only and a Codecov outage cannot turn the build red.
|
|
10
|
+
- Declared support for Python 3.14 with a `Programming Language :: Python :: 3.14` classifier. The test suite already ran on `py314` through `tox`, but the package metadata advertised only 3.13.
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
- Corrected the maintainer release docs after `release.yml` was removed. `docs/releasing/configure-github-actions.md` and `configure-pypi.md` described a release pipeline that no longer exists and listed `tools/` scripts that were never written; both now open with a "not implemented" admonition and read as a design record. The contributing guide documents the actual flow, which is `make release` from a clean checkout.
|
|
14
|
+
- Extended the code style and annotation checks to `tools/`. `make format`, `make cs` and `make ann` previously covered only `py_bootstrap/` and `tests/`, leaving the release and check scripts unchecked.
|
|
15
|
+
- Folded the separate `changelog` workflow into `.github/workflows/ci.yml` as another `make cl-check` leg, and dropped the `skip-changelog` label bypass. The `ci` workflow is now exactly `make check` split across parallel jobs, so a check either fails in both places or neither — `make check` also runs `doc`, which previously only ran on GitHub.
|
|
16
|
+
- Switched the default release index to the real PyPI. `make dist-upload` and `make release` now upload to `pypi` instead of `testpypi`; pass `PYPI=testpypi` to rehearse a release against the sandbox index.
|
|
17
|
+
- Upgraded the `ci` workflow to `actions/checkout@v7` and `actions/setup-python@v7`. The previous major versions target Node.js 20, which GitHub has deprecated, so every job emitted a warning and was silently forced onto Node.js 24.
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
- Corrected the Read the Docs setup guide on two settings that silently stop automatic builds: the project must use a **Connected repository** rather than a manually configured repository URL, which leaves it with no GitHub integration at all, so no push or tag event ever reaches Read the Docs; and the `.readthedocs.yaml` path field takes a path relative to the repository root, not a URL. Also clarified that a version being *Hidden* and being *Active* are independent settings.
|
|
21
|
+
- Fixed the `ci` GitHub Actions workflow, which invoked `tox` environments (`cs`, `ann`, `utc`, `doc`) that `tox.ini` does not define, so every run failed. The checks now go through `make`, matching how they are documented and run locally, and the suite runs once per supported interpreter with only that interpreter installed.
|
|
22
|
+
|
|
23
|
+
## [0.9.3] - 2026-09-06
|
|
24
|
+
### Added
|
|
25
|
+
- Added `docs/static/rtd-flyout.js`, which removes the "On Read the Docs" section (Project Home, Builds) from the Read the Docs flyout menu. Read the Docs offers no setting for this and the flyout exposes no CSS hooks, so it is done with a small script loaded through `html_js_files`.
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
- Documented building the published documentation from release tags: `stable` as the default Read the Docs version, activating `v*` tag versions, and hiding `latest` so readers are offered documentation matching a released artefact. The README badge and link now point at `stable`.
|
|
29
|
+
|
|
30
|
+
## [0.9.2] - 2026-09-06
|
|
31
|
+
### Added
|
|
32
|
+
- Added `docs/releasing/configure-readthedocs.md`, a setup guide for hosting the documentation on Read the Docs: creating the project, verifying the first build, the version and automation-rule settings, pull request previews, and troubleshooting.
|
|
33
|
+
- Added a `make apidoc` target that regenerates the `docs/modules/` API stubs. `make doc` depends on it and Read the Docs calls it with `VENV=$READTHEDOCS_VIRTUALENV_PATH`, so the `sphinx-apidoc` flags are defined once instead of being duplicated in `.readthedocs.yaml`, and Read the Docs no longer needs a second virtualenv.
|
|
34
|
+
|
|
35
|
+
### Changed
|
|
36
|
+
- Changed the `towncrier` output template so generated `CHANGELOG.md` sections match the compact style of the hand-written history: no blank line after the version or category headings, one blank line between categories.
|
|
37
|
+
|
|
38
|
+
### Fixed
|
|
39
|
+
- Fixed the Read the Docs build: `.readthedocs.yaml` installed a `docs` dependency group, but the group in `pyproject.toml` is named `doc`. Every build failed at the `pre_build` step with `Dependency group 'docs' not found`.
|
|
40
|
+
|
|
41
|
+
## [0.9.1] - 2026-09-06
|
|
42
|
+
### Added
|
|
43
|
+
- Added GitHub Actions workflows: `ci` (style, types, tests and docs on every pull request), `changelog` (fails a pull request that adds no news fragment) and `release` (builds and publishes to PyPI through Trusted Publishing on a `v*` tag, then creates the GitHub Release).
|
|
44
|
+
- Added a `Makefile` as the task runner for development and release work. Targets install the PEP 735 dependency group they need on demand into a single virtualenv, so the toolchain is no longer duplicated per task. Run `make` for the full list.
|
|
45
|
+
- Added release tooling under `tools/`, driven by the `Makefile`: `check_version.py` rejects a version that is not PEP 440 or whose tag already exists locally or on the remote, `check_no_diff.py` refuses to release from a dirty working tree, and `smoke.py` installs the freshly built wheel into a throwaway virtualenv and exercises the console script. `make release VERSION=X.Y.Z` chains the tag, build and upload steps; `make dist-build` and `make dist-upload` are usable on their own.
|
|
46
|
+
- Adopted `towncrier` for changelog management. Document user-facing changes by adding a news fragment under `changelog.d/` (see `changelog.d/README.md`); the release flow collates them into `CHANGELOG.md`.
|
|
47
|
+
|
|
48
|
+
### Changed
|
|
49
|
+
- Project version is now derived from git tags via `setuptools-scm`. The hand-maintained `NAME`, `TITLE`, `DESCRIPTION`, `VERSION`, `PY_VERSION`, `AUTHOR` and `AUTHOR_EMAIL` constants were removed from `py_bootstrap/__init__.py`; consumers read `importlib.metadata` instead.
|
|
50
|
+
- Reduced `tox.ini` to the interpreter matrix (`py313`, `py314`) running the test suite. Every other task moved to the `Makefile`.
|
|
51
|
+
- Reworked the documentation: the Sphinx site is now MyST Markdown with installation, quickstart, guides, concepts and API reference sections, published on Read the Docs via `.readthedocs.yaml`. The hand-written `docs/modules/*.rst` stubs are generated by `sphinx-apidoc` at build time instead of being committed.
|
|
52
|
+
|
|
53
|
+
### Removed
|
|
54
|
+
- Removed `requirements.txt` and `requirements-dev.txt`. Dependencies are declared in `pyproject.toml` as PEP 735 dependency groups; install them with `pip install -e . --group dev` or `make deps`.
|
|
55
|
+
|
|
56
|
+
## [0.9.0] - 2025-11-02
|
|
57
|
+
### Changed
|
|
58
|
+
- Move `name` and `description` CLI arguments processing from `BaseBuildBootstrapOperation` to `DefaultBuildBootstrapOperation`. See `py_bootstrap/operations/build_bootstrap.py` file for details.
|
|
59
|
+
|
|
60
|
+
## [0.8.0] - 2025-09-13
|
|
61
|
+
### Added
|
|
62
|
+
- Add `tox.ini` to `application` bootstrap. See `py_bootstrap/templates/application/tox.ini` file for details.
|
|
63
|
+
- Add `tox.ini` to `package` bootstrap. See `py_bootstrap/templates/package/tox.ini` file for details.
|
|
64
|
+
|
|
65
|
+
### Changed
|
|
66
|
+
- `underscored_name` placeholder is replaced to `python_name` in all templates and corresponding builders. see `py_bootstrap/templates/` directory for details.
|
|
67
|
+
|
|
68
|
+
## [0.7.0] - 2025-06-24
|
|
69
|
+
### Changed
|
|
70
|
+
- Convert `templates` directory into a Python package. See `py_bootstrap/templates/__init__.py` file for details.
|
|
71
|
+
- Implement getting a list of bootstraps from setuptools plugins. See `py_bootstrap/operations/base.py` file for details.
|
|
72
|
+
|
|
73
|
+
## [0.6.1] - 2025-06-24
|
|
74
|
+
### Changed
|
|
75
|
+
- Refactor `README.md` files in `application`, `package`. See `py_bootastrap/templates/` directory for details.
|
|
76
|
+
- Refactor project's `README.md` file. See `README.md` for details.
|
|
77
|
+
|
|
78
|
+
## [0.6.0] - 2025-06-24
|
|
79
|
+
### Added
|
|
80
|
+
- Actualize `README.md` file. Prepare `Using` and `For Development` sections.
|
|
81
|
+
- Refactor implemented bootstraps for unification, fix small bugs and actualize help data. See `py_bootstrap/templates` directory for details.
|
|
82
|
+
- Implement `bootstrap` template for developing bootstraps from scratches. See `py_bootstrap/templates/bootstrap/` directory for details.
|
|
83
|
+
- Implement exporting bootstraps templates operation. See `py_bootstrap/operations/export_bootstrap.py` file for details.
|
|
84
|
+
|
|
85
|
+
## [0.5.0] - 2025-06-23
|
|
86
|
+
### Added
|
|
87
|
+
- Implement `FilesProcessors` functionality. See `py_bootstrap/files_processors/` directory for details.
|
|
88
|
+
|
|
89
|
+
### Changed
|
|
90
|
+
- Refactor operations functionality. See `py_bootstrap/operations/` directory for details.
|
|
91
|
+
- Rename `BaseOperationsDispatcher` to `BaseRecursiveOperationsContainer`, move it in a separated file. See `/py_bootstrap/base/operations/recursive_container.py` file for details.
|
|
92
|
+
|
|
93
|
+
## [0.4.0] - 2025-06-02
|
|
94
|
+
### Added
|
|
95
|
+
- Implement `RegisterBootstrapOperation` class for registering new customer's bootstraps. See `/py_bootstrap/operations/register_bootstrap.py` file for details.
|
|
96
|
+
- Prepare `template` bootstrap structure. See `/py_bootstrap/templates/template/` directory for details.
|
|
97
|
+
|
|
98
|
+
## [0.3.0] - 2025-06-01
|
|
99
|
+
### Added
|
|
100
|
+
- Prepare `application` bootstrap structure. See `/py_bootstrap/templates/application/` directory for details.
|
|
101
|
+
|
|
102
|
+
## [0.2.0] - 2025-06-01
|
|
103
|
+
### Added
|
|
104
|
+
- Prepare `package` bootstrap structure. See `/py_bootstrap/templates/package/` directory for details.
|
|
105
|
+
- Implement `BuildBootstrapOperation` class for generating a given bootstrap. See `/py_bootstrap/operations/build_bootstraps.py` file for details.
|
|
106
|
+
- Implement `ListBootstrapsOperation` class for printing enabled bootstraps. See `/py_bootstrap/operations/list_bootstraps.py` file for details.
|
|
107
|
+
- Implement the main script for running bootstrap operations. See `/py_bootstrap/scripts/bootstrap.py` file for details.
|
|
108
|
+
- Implement base functionality for operations. See `/py_bootstrap/base/operations.py` file for details.
|
|
109
|
+
- Implement the main CLI entrypoint. See `/py_bootstrap/cli_entrypoint.py` file for details.
|
|
110
|
+
|
|
111
|
+
## [0.1.0] - 2024-06-08
|
|
112
|
+
### Added
|
|
113
|
+
- Prepare a common skeleton based on tox automation.
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
+
|
|
5
|
+
## File Size Rule
|
|
6
|
+
|
|
7
|
+
Applies to **every** `CLAUDE.md` in this repo — this file is always loaded, so the rule is stated
|
|
8
|
+
once here and never repeated in the per-directory files.
|
|
9
|
+
|
|
10
|
+
- Maximum limit: 200 rows/lines.
|
|
11
|
+
- Never add notes, logs, or explanations that push the file over this limit.
|
|
12
|
+
- Delete old or unused instructions before adding new ones.
|
|
13
|
+
- Don't duplicate info between CLAUDE.md files — document a thing in the directory that owns it and
|
|
14
|
+
link to it from elsewhere.
|
|
15
|
+
|
|
16
|
+
## What this is
|
|
17
|
+
|
|
18
|
+
`ak-py-bootstrap` — a zero-runtime-dependency CLI (`bootstrap`) that generates Python
|
|
19
|
+
project skeletons from *bootstraps* (templates). Python >= 3.13 only. Package dir is
|
|
20
|
+
`py_bootstrap/`; distribution name is `ak-py-bootstrap`.
|
|
21
|
+
|
|
22
|
+
## Commands
|
|
23
|
+
|
|
24
|
+
Everything goes through `make` (run `make` alone for the target list). Each target
|
|
25
|
+
installs only the PEP 735 dependency group it needs into a single `.venv` and stamps it
|
|
26
|
+
in `.venv/.stamps/`, so re-runs are free.
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
make deps # install the `dev` group + editable install
|
|
30
|
+
make format # isort + black (write)
|
|
31
|
+
make cs # isort/black --check + flake8
|
|
32
|
+
make ann # mypy
|
|
33
|
+
make test # tox: full suite under coverage on py313 and py314
|
|
34
|
+
make check # everything the `ci` workflow runs, same targets
|
|
35
|
+
make doc # sphinx-apidoc into docs/modules/ then sphinx-build into docs/build/
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Narrower test runs (the suite is stdlib `unittest`, no pytest):
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
make test PY_ENV=py313
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
.venv/bin/python -m unittest tests.operations.test_build_bootstrap.DefaultBuildBootstrapOperationTestCase.test_run
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
`tox` exists *only* to run the suite across interpreters (`py313`, `py314`); every other
|
|
49
|
+
task lives in the `Makefile`. ... and leCoverage has `fail_under = 95`.
|
|
50
|
+
|
|
51
|
+
Line length differs by tool on purpose: black formats at 80, flake8 allows 88.
|
|
52
|
+
|
|
53
|
+
## Changelog fragments are mandatory
|
|
54
|
+
|
|
55
|
+
Every PR must add one file to `changelog.d/` named `<issue>.<type>.md`, or `+<slug>.<type>.md`
|
|
56
|
+
when there is no issue number (types: `added`/`changed`/`deprecated`/`removed`/`fixed`/`security`).
|
|
57
|
+
CI enforces this; `make cl-check` mirrors it. Version numbers come from `setuptools-scm`
|
|
58
|
+
tags, never from a file. Releases: `make release VERSION=X.Y.Z` publishes to the real
|
|
59
|
+
PyPI — pass `PYPI=testpypi` to rehearse; it refuses to run on a dirty tree.
|
|
60
|
+
|
|
61
|
+
## Architecture
|
|
62
|
+
|
|
63
|
+
`docs/concepts/architecture.md` is the canonical description and is kept current — read it
|
|
64
|
+
before making structural changes. The essentials:
|
|
65
|
+
|
|
66
|
+
**Operation objects, not functions.** Every unit of work is a `BaseOperation` subclass with
|
|
67
|
+
a `run()`. CLI-facing ones (`BaseCliOperation`) additionally have a *classmethod*
|
|
68
|
+
`prepare_cli_parser(parser, prefix)` that registers argparse arguments, and receive their
|
|
69
|
+
parsed `Namespace` via `set_cli_namespace()`. Construction takes no arguments — collaborators
|
|
70
|
+
are injected through `set_*` methods before `run()`. Follow this shape for new operations.
|
|
71
|
+
|
|
72
|
+
**Two-phase CLI.** `py_bootstrap/scripts/bootstrap.py` builds the parser tree by walking
|
|
73
|
+
operation classes, then dispatches at `run()` time by reading the subcommand out of the
|
|
74
|
+
namespace. Because `build`/`export` add one sub-parser per discovered bootstrap, *building
|
|
75
|
+
the parser already imports every bootstrap's `__entry_point__`* — parser construction must
|
|
76
|
+
stay side-effect free. `build_parser()` in that module is the hook `sphinx-argparse` uses to
|
|
77
|
+
render `docs/reference/cli.md`.
|
|
78
|
+
|
|
79
|
+
**Discovery via entry points.** Bootstraps are found through the `py_bootstrap_templates`
|
|
80
|
+
setuptools entry-point group (`BaseBootstrapsOperation.find_bootstraps()`). Each contributing
|
|
81
|
+
package points at a `...py_bootstrap.templates` module exposing `ENABLED_TEMPLATES` — a list
|
|
82
|
+
of subdirectory names, each of which must contain `__entry_point__.py`. This project registers
|
|
83
|
+
its own built-ins the same way (`py_bootstrap/templates/__init__.py`), so built-in, registered
|
|
84
|
+
and third-party plugin bootstraps are indistinguishable to the tool. Import failures during
|
|
85
|
+
discovery are logged and skipped, never raised.
|
|
86
|
+
|
|
87
|
+
**A bootstrap's `__entry_point__.py`** must define module-level `DESCRIPTION` plus
|
|
88
|
+
`BuildOperation` and `ExportOperation` classes — `register` validates by string-searching the
|
|
89
|
+
file for those two names. Subclass `DefaultBuildBootstrapOperation` to get the standard
|
|
90
|
+
`--name`/`--description` options and the derived `python_name`/`upper_name`/`class_name`/`title`
|
|
91
|
+
placeholders; subclass `BaseBuildBootstrapOperation` directly for something bespoke. Override
|
|
92
|
+
`build_context()` and always `super()` into it.
|
|
93
|
+
|
|
94
|
+
**Files processors** (`py_bootstrap/files_processors/`) do the actual walking and writing.
|
|
95
|
+
`CopyFilesProcessor` copies verbatim (used by `export` and `register`);
|
|
96
|
+
`GenerateFilesProcessor` subclasses it and adds templating (used by `build`).
|
|
97
|
+
|
|
98
|
+
### Templating rules (easy to get wrong)
|
|
99
|
+
|
|
100
|
+
- Rendering is plain `str.format(**context)` — the context is a flat `str -> str` map. Literal
|
|
101
|
+
braces in template content must be doubled.
|
|
102
|
+
- **Destination paths are rendered too**, not just file content. Hence a directory named
|
|
103
|
+
`{python_name}/` in a bootstrap becomes a directory named after the project.
|
|
104
|
+
- A file is templated only if it ends in `.tmpl`; the suffix is stripped on output. To emit a
|
|
105
|
+
file that itself ends in `.tmpl`, name it `*.tmpl.tmpl` (see `templates/bootstrap/`).
|
|
106
|
+
- `{empty}` renders to `""` and exists so template files can produce dotfiles:
|
|
107
|
+
`{empty}.gitignore.tmpl` -> `.gitignore`. A bare `.gitignore` in the bootstrap dir would be
|
|
108
|
+
swallowed by this repo's own tooling.
|
|
109
|
+
- `__entry_point__.py` is skipped by `build` but copied by `export`/`register`.
|
|
110
|
+
|
|
111
|
+
## Tests
|
|
112
|
+
|
|
113
|
+
`tests/` mirrors the package layout. Fixtures live in two places with different roles:
|
|
114
|
+
`tests/tst_templates/` is an importable package of bootstrap fixtures (including deliberately
|
|
115
|
+
broken ones: `test_missed_entry_point`, `test_wrong_entry_point`), while
|
|
116
|
+
`tests/tst-register-bootstrap-source/` is a non-importable directory used as a `register`
|
|
117
|
+
source. Tests exercise operations by constructing them and feeding a hand-built
|
|
118
|
+
`argparse.Namespace` rather than by going through the CLI; `tests/scripts/test_bootstrap.py`
|
|
119
|
+
is the exception that drives `main()` end to end. Tests that write files create them under
|
|
120
|
+
the CWD and clean up in `tearDown`.
|
|
121
|
+
|
|
122
|
+
mypy excludes `templates/` and `tst_templates/` (they contain intentionally invalid template
|
|
123
|
+
syntax) and relaxes several error codes for `tests.*`.
|
|
124
|
+
|
|
125
|
+
## Notes
|
|
126
|
+
|
|
127
|
+
- The `Makefile` is the source of truth for how the checks actually run.
|
|
128
|
+
- `docs/modules/` and `docs/build/` are generated; never edit them by hand.
|