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.
Files changed (128) hide show
  1. ak_py_bootstrap-0.9.4/.github/workflows/ci.yml +84 -0
  2. ak_py_bootstrap-0.9.4/.gitignore +165 -0
  3. ak_py_bootstrap-0.9.4/.pre-commit-config.yaml +18 -0
  4. ak_py_bootstrap-0.9.4/.readthedocs.yaml +38 -0
  5. ak_py_bootstrap-0.9.4/AUTHORS.md +8 -0
  6. ak_py_bootstrap-0.9.4/CHANGELOG.md +113 -0
  7. ak_py_bootstrap-0.9.4/CLAUDE.md +128 -0
  8. ak_py_bootstrap-0.9.4/LICENSE +201 -0
  9. ak_py_bootstrap-0.9.4/Makefile +169 -0
  10. ak_py_bootstrap-0.9.4/PKG-INFO +427 -0
  11. ak_py_bootstrap-0.9.4/README.md +400 -0
  12. ak_py_bootstrap-0.9.4/ak_py_bootstrap.egg-info/PKG-INFO +427 -0
  13. ak_py_bootstrap-0.9.4/ak_py_bootstrap.egg-info/SOURCES.txt +126 -0
  14. ak_py_bootstrap-0.9.4/ak_py_bootstrap.egg-info/dependency_links.txt +1 -0
  15. ak_py_bootstrap-0.9.4/ak_py_bootstrap.egg-info/entry_points.txt +5 -0
  16. ak_py_bootstrap-0.9.4/ak_py_bootstrap.egg-info/scm_file_list.json +123 -0
  17. ak_py_bootstrap-0.9.4/ak_py_bootstrap.egg-info/scm_version.json +8 -0
  18. ak_py_bootstrap-0.9.4/ak_py_bootstrap.egg-info/top_level.txt +1 -0
  19. ak_py_bootstrap-0.9.4/changelog.d/README.md +42 -0
  20. ak_py_bootstrap-0.9.4/changelog.d/_template.md +71 -0
  21. ak_py_bootstrap-0.9.4/docs/Makefile +20 -0
  22. ak_py_bootstrap-0.9.4/docs/__init__.py +0 -0
  23. ak_py_bootstrap-0.9.4/docs/_templates/.gitkeep +0 -0
  24. ak_py_bootstrap-0.9.4/docs/authors.md +5 -0
  25. ak_py_bootstrap-0.9.4/docs/changelog.md +5 -0
  26. ak_py_bootstrap-0.9.4/docs/concepts/architecture.md +77 -0
  27. ak_py_bootstrap-0.9.4/docs/concepts/index.md +12 -0
  28. ak_py_bootstrap-0.9.4/docs/conf.py +66 -0
  29. ak_py_bootstrap-0.9.4/docs/contributing.md +96 -0
  30. ak_py_bootstrap-0.9.4/docs/guides/distribute-bootstraps-as-a-plugin.md +58 -0
  31. ak_py_bootstrap-0.9.4/docs/guides/export-and-modify-a-bootstrap.md +23 -0
  32. ak_py_bootstrap-0.9.4/docs/guides/generate-a-project.md +71 -0
  33. ak_py_bootstrap-0.9.4/docs/guides/index.md +20 -0
  34. ak_py_bootstrap-0.9.4/docs/guides/register-a-bootstrap.md +47 -0
  35. ak_py_bootstrap-0.9.4/docs/guides/write-a-bootstrap.md +37 -0
  36. ak_py_bootstrap-0.9.4/docs/index.md +78 -0
  37. ak_py_bootstrap-0.9.4/docs/installation.md +34 -0
  38. ak_py_bootstrap-0.9.4/docs/make.bat +35 -0
  39. ak_py_bootstrap-0.9.4/docs/quickstart.md +65 -0
  40. ak_py_bootstrap-0.9.4/docs/reference/api.md +11 -0
  41. ak_py_bootstrap-0.9.4/docs/reference/cli.md +12 -0
  42. ak_py_bootstrap-0.9.4/docs/reference/index.md +11 -0
  43. ak_py_bootstrap-0.9.4/docs/releasing/changelog.md +62 -0
  44. ak_py_bootstrap-0.9.4/docs/releasing/configure-github-actions.md +220 -0
  45. ak_py_bootstrap-0.9.4/docs/releasing/configure-pypi.md +112 -0
  46. ak_py_bootstrap-0.9.4/docs/releasing/configure-readthedocs.md +290 -0
  47. ak_py_bootstrap-0.9.4/docs/static/.gitkeep +0 -0
  48. ak_py_bootstrap-0.9.4/docs/static/rtd-flyout.js +56 -0
  49. ak_py_bootstrap-0.9.4/docs/versioning.md +33 -0
  50. ak_py_bootstrap-0.9.4/py_bootstrap/__init__.py +4 -0
  51. ak_py_bootstrap-0.9.4/py_bootstrap/base/__init__.py +0 -0
  52. ak_py_bootstrap-0.9.4/py_bootstrap/base/operations/__init__.py +10 -0
  53. ak_py_bootstrap-0.9.4/py_bootstrap/base/operations/base.py +35 -0
  54. ak_py_bootstrap-0.9.4/py_bootstrap/base/operations/recursive_container.py +69 -0
  55. ak_py_bootstrap-0.9.4/py_bootstrap/base/operations/runner.py +53 -0
  56. ak_py_bootstrap-0.9.4/py_bootstrap/files_processors/__init__.py +9 -0
  57. ak_py_bootstrap-0.9.4/py_bootstrap/files_processors/base.py +106 -0
  58. ak_py_bootstrap-0.9.4/py_bootstrap/files_processors/copy.py +45 -0
  59. ak_py_bootstrap-0.9.4/py_bootstrap/files_processors/generate.py +65 -0
  60. ak_py_bootstrap-0.9.4/py_bootstrap/operations/__init__.py +13 -0
  61. ak_py_bootstrap-0.9.4/py_bootstrap/operations/base.py +52 -0
  62. ak_py_bootstrap-0.9.4/py_bootstrap/operations/build_bootstrap.py +180 -0
  63. ak_py_bootstrap-0.9.4/py_bootstrap/operations/dispatcher.py +82 -0
  64. ak_py_bootstrap-0.9.4/py_bootstrap/operations/export_bootstrap.py +109 -0
  65. ak_py_bootstrap-0.9.4/py_bootstrap/operations/list_bootstraps.py +38 -0
  66. ak_py_bootstrap-0.9.4/py_bootstrap/operations/register_bootstrap.py +127 -0
  67. ak_py_bootstrap-0.9.4/py_bootstrap/scripts/__init__.py +0 -0
  68. ak_py_bootstrap-0.9.4/py_bootstrap/scripts/bootstrap.py +39 -0
  69. ak_py_bootstrap-0.9.4/py_bootstrap/templates/__init__.py +7 -0
  70. ak_py_bootstrap-0.9.4/py_bootstrap/templates/application/CHANGELOG.md.tmpl +13 -0
  71. ak_py_bootstrap-0.9.4/py_bootstrap/templates/application/README.md.tmpl +52 -0
  72. ak_py_bootstrap-0.9.4/py_bootstrap/templates/application/__entry_point__.py +37 -0
  73. ak_py_bootstrap-0.9.4/py_bootstrap/templates/application/pyproject.toml.tmpl +57 -0
  74. ak_py_bootstrap-0.9.4/py_bootstrap/templates/application/requirements-dev.txt +7 -0
  75. ak_py_bootstrap-0.9.4/py_bootstrap/templates/application/requirements.txt +0 -0
  76. ak_py_bootstrap-0.9.4/py_bootstrap/templates/application/tests/__init__.py +0 -0
  77. ak_py_bootstrap-0.9.4/py_bootstrap/templates/application/tox.ini.tmpl +49 -0
  78. ak_py_bootstrap-0.9.4/py_bootstrap/templates/application/{empty}.gitignore.tmpl +161 -0
  79. ak_py_bootstrap-0.9.4/py_bootstrap/templates/bootstrap/__entry_point__.py +37 -0
  80. ak_py_bootstrap-0.9.4/py_bootstrap/templates/bootstrap/__entry_point__.py.tmpl +58 -0
  81. ak_py_bootstrap-0.9.4/py_bootstrap/templates/bootstrap/demo-file.txt.tmpl.tmpl +18 -0
  82. ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/AUTHORS.md.tmpl +8 -0
  83. ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/CHANGELOG.md.tmpl +13 -0
  84. ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/README.md.tmpl +94 -0
  85. ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/__entry_point__.py +63 -0
  86. ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/docs/Makefile +20 -0
  87. ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/docs/__init__.py +0 -0
  88. ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/docs/conf.py.tmpl +57 -0
  89. ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/docs/index.rst.tmpl +14 -0
  90. ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/docs/make.bat +35 -0
  91. ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/pyproject.toml.tmpl +169 -0
  92. ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/requirements-dev.txt +8 -0
  93. ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/requirements.txt +0 -0
  94. ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/tests/__init__.py +0 -0
  95. ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/tests/test_package.py.tmpl +12 -0
  96. ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/tox.ini.tmpl +81 -0
  97. ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/{empty}.gitignore.tmpl +161 -0
  98. ak_py_bootstrap-0.9.4/py_bootstrap/templates/package/{python_name}/__init__.py.tmpl +23 -0
  99. ak_py_bootstrap-0.9.4/pyproject.toml +192 -0
  100. ak_py_bootstrap-0.9.4/setup.cfg +4 -0
  101. ak_py_bootstrap-0.9.4/tests/__init__.py +0 -0
  102. ak_py_bootstrap-0.9.4/tests/base/__init__.py +0 -0
  103. ak_py_bootstrap-0.9.4/tests/base/operations/__init__.py +0 -0
  104. ak_py_bootstrap-0.9.4/tests/base/operations/test_base.py +36 -0
  105. ak_py_bootstrap-0.9.4/tests/base/operations/test_recursive_container.py +89 -0
  106. ak_py_bootstrap-0.9.4/tests/operations/__init__.py +0 -0
  107. ak_py_bootstrap-0.9.4/tests/operations/test_build_bootstrap.py +116 -0
  108. ak_py_bootstrap-0.9.4/tests/operations/test_export_bootstrap.py +114 -0
  109. ak_py_bootstrap-0.9.4/tests/operations/test_list_bootstraps.py +46 -0
  110. ak_py_bootstrap-0.9.4/tests/operations/test_register_bootstrap.py +145 -0
  111. ak_py_bootstrap-0.9.4/tests/scripts/__init__.py +0 -0
  112. ak_py_bootstrap-0.9.4/tests/scripts/test_bootstrap.py +512 -0
  113. ak_py_bootstrap-0.9.4/tests/tst-register-bootstrap-source/__entry_point__.py +31 -0
  114. ak_py_bootstrap-0.9.4/tests/tst-register-bootstrap-source/some-dir/copied-file.txt +1 -0
  115. ak_py_bootstrap-0.9.4/tests/tst-register-bootstrap-source/some-file.txt +1 -0
  116. ak_py_bootstrap-0.9.4/tests/tst-register-bootstrap-source/{python_name}/generated-file.txt.tmpl +11 -0
  117. ak_py_bootstrap-0.9.4/tests/tst_templates/__init__.py +7 -0
  118. ak_py_bootstrap-0.9.4/tests/tst_templates/test_bootstrap/__entry_point__.py +31 -0
  119. ak_py_bootstrap-0.9.4/tests/tst_templates/test_bootstrap/some-dir/copied-file.txt +1 -0
  120. ak_py_bootstrap-0.9.4/tests/tst_templates/test_bootstrap/some-file.txt +1 -0
  121. ak_py_bootstrap-0.9.4/tests/tst_templates/test_bootstrap/{python_name}/generated-file.txt.tmpl +11 -0
  122. ak_py_bootstrap-0.9.4/tests/tst_templates/test_missed_entry_point/some_file.txt +0 -0
  123. ak_py_bootstrap-0.9.4/tests/tst_templates/test_wrong_entry_point/__entry_point__.py +7 -0
  124. ak_py_bootstrap-0.9.4/tools/check_matrix.py +159 -0
  125. ak_py_bootstrap-0.9.4/tools/check_no_diff.py +38 -0
  126. ak_py_bootstrap-0.9.4/tools/check_version.py +74 -0
  127. ak_py_bootstrap-0.9.4/tools/smoke.py +85 -0
  128. 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,8 @@
1
+ Authors
2
+ =======
3
+
4
+ ## Owners:
5
+ * Aliaksandr Karotki, abkorotky@gmail.com.
6
+
7
+ ## Developers:
8
+ * Aliaksandr Karotki, abkorotky@gmail.com.
@@ -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.