oe-python-template 0.5.7__tar.gz → 0.5.9__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.
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/.copier-answers.yml +1 -1
- oe_python_template-0.5.9/.coverage +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/.github/workflows/package-build-publish-release.yml +1 -1
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/.gitignore +4 -10
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/CHANGELOG.md +15 -1
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/CONTRIBUTING.md +20 -8
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/PKG-INFO +6 -5
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/README.md +5 -4
- oe_python_template-0.5.9/RELEASE_NOTES.md +8 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/SECURITY.md +3 -3
- oe_python_template-0.5.9/VERSION +1 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/_readme_header.md +3 -2
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/_readme_main.md +2 -2
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/docs/source/conf.py +1 -1
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/docs/source/index.rst +2 -1
- oe_python_template-0.5.9/docs/source/security.rst +1 -0
- oe_python_template-0.5.9/n +27 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/noxfile.py +75 -18
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/pyproject.toml +4 -4
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/sonar-project.properties +1 -1
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/.github/workflows/package-build-publish-release.yml.jinja +1 -1
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/.gitignore.jinja +4 -10
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/CONTRIBUTING.md.jinja +20 -8
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/SECURITY.md.jinja +3 -3
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/_readme_header.md.jinja +3 -2
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/_readme_main.md.jinja +2 -2
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/docs/source/index.rst.jinja +2 -1
- oe_python_template-0.5.9/template/docs/source/security.rst.jinja +1 -0
- oe_python_template-0.5.9/template/n.jinja +27 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/noxfile.py.jinja +75 -18
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/pyproject.toml.jinja +2 -2
- oe_python_template-0.5.9/template/tests/fixtures/.keep +0 -0
- oe_python_template-0.5.9/tests/fixtures/.keep +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/uv.lock +1 -1
- oe_python_template-0.5.7/RELEASE_NOTES.md +0 -8
- oe_python_template-0.5.7/VERSION +0 -1
- oe_python_template-0.5.7/bump +0 -7
- oe_python_template-0.5.7/latexmkrc +0 -11
- oe_python_template-0.5.7/reports/mypy.xml +0 -5
- oe_python_template-0.5.7/template/bump.jinja +0 -7
- oe_python_template-0.5.7/template/docs/source/latexmkrc.jinja +0 -11
- oe_python_template-0.5.7/template/latexmkrc.jinja +0 -11
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/.act-env-public +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/.devcontainer/Dockerfile +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/.devcontainer/devcontainer.json +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/.devcontainer/onCreateCommand +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/.devcontainer/postAttachCommand +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/.devcontainer/postCreateCommand +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/.env.example +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/.github/dependabot.yml +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/.github/workflows/codeql.yml +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/.github/workflows/docker-image-build-publish.yml +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/.github/workflows/test-and-report.yml +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/.pre-commit-config.yaml +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/.python-version +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/.readthedocs.yml +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/.secrets.baseline +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/.vscode/extensions.json +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/.vscode/settings.json +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/CODEOWNERS +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/Dockerfile +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/LICENSE +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/SERVICE_CONNECTIONS.md +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/_readme_footer.md +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/bin/git-cliff +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/codecov.yml +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/compose.yaml +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/copier.yml +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/docs/Makefile +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/docs/make.bat +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/docs/source/_static/.keep +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/docs/source/_static/openapi_v1.json +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/docs/source/_static/openapi_v1.yaml +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/docs/source/_static/openapi_v2.json +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/docs/source/_static/openapi_v2.yaml +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/docs/source/api_v1.rst +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/docs/source/api_v2.rst +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/docs/source/contributing.rst +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/docs/source/latexmkrc +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/docs/source/main.rst +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/docs/source/reference.rst +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/docs/source/release-notes.rst +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/examples/__init__.py +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/examples/notebook.ipynb +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/examples/notebook.py +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/examples/script.py +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/examples/streamlit.py +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/git-cliff-2.7.0/CHANGELOG.md +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/git-cliff-2.7.0/LICENSE-APACHE +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/git-cliff-2.7.0/LICENSE-MIT +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/git-cliff-2.7.0/README.md +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/git-cliff-2.7.0/completions/_git-cliff +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/git-cliff-2.7.0/completions/_git-cliff.ps1 +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/git-cliff-2.7.0/completions/git-cliff.bash +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/git-cliff-2.7.0/completions/git-cliff.elv +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/git-cliff-2.7.0/completions/git-cliff.fish +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/git-cliff-2.7.0/git-cliff-completions +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/git-cliff-2.7.0/git-cliff-mangen +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/git-cliff-2.7.0/man/git-cliff.1 +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/git-cliff-2.7.0-x86_64-unknown-linux-gnu.tar.gz +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/github-action-run +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/logo.png +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/renovate.json +0 -0
- {oe_python_template-0.5.7/template/docs/source/_static → oe_python_template-0.5.9/reports}/.keep +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/src/oe_python_template/__init__.py +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/src/oe_python_template/api.py +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/src/oe_python_template/cli.py +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/src/oe_python_template/constants.py +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/src/oe_python_template/service.py +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/.act-env-public.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/.devcontainer/Dockerfile.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/.devcontainer/devcontainer.json.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/.devcontainer/onCreateCommand.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/.devcontainer/postAttachCommand.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/.devcontainer/postCreateCommand.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/.env.example.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/.github/dependabot.yml +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/.github/workflows/codeql.yml +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/.github/workflows/docker-image-build-publish.yml.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/.github/workflows/test-and-report.yml.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/.pre-commit-config.yaml.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/.python-version +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/.readthedocs.yml.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/.vscode/extensions.json +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/.vscode/settings.json.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/CHANGELOG.md +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/CODEOWNERS.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/Dockerfile.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/LICENSE.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/SERVICE_CONNECTIONS.md.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/VERSION +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/_readme_footer.md.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/codecov.yml.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/compose.yaml.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/docs/Makefile.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/docs/make.bat.jinja +0 -0
- {oe_python_template-0.5.7/template/tests/fixtures → oe_python_template-0.5.9/template/docs/source/_static}/.keep +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/docs/source/api_v1.rst.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/docs/source/api_v2.rst.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/docs/source/conf.py.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/docs/source/contributing.rst.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/docs/source/main.rst.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/docs/source/reference.rst.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/docs/source/release-notes.rst.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/examples/__init__.py.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/examples/notebook.ipynb.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/examples/notebook.py.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/examples/script.py.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/examples/streamlit.py.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/github-action-run.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/logo.png +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/renovate.json +0 -0
- {oe_python_template-0.5.7/tests/fixtures → oe_python_template-0.5.9/template/reports}/.keep +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/sonar-project.properties.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/src/{{ project_name_snake_case }}/__init__.py.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/src/{{ project_name_snake_case }}/api.py.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/src/{{ project_name_snake_case }}/cli.py.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/src/{{ project_name_snake_case }}/constants.py.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/src/{{ project_name_snake_case }}/service.py.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/tests/__init__.py.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/tests/api_test.py.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/tests/cli_test.py.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/template/{{_copier_conf.answers_file}}.jinja +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/tests/__init__.py +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/tests/api_test.py +0 -0
- {oe_python_template-0.5.7 → oe_python_template-0.5.9}/tests/cli_test.py +0 -0
|
Binary file
|
|
@@ -53,7 +53,7 @@ jobs:
|
|
|
53
53
|
env:
|
|
54
54
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
55
55
|
run: |
|
|
56
|
-
gh release create ${{ github.ref_name }} ./dist/*
|
|
56
|
+
gh release create ${{ github.ref_name }} ./dist/* ./reports/* --notes-file ${{ steps.git-cliff.outputs.changelog }}
|
|
57
57
|
|
|
58
58
|
- name: Allow other workflows to trigger on release
|
|
59
59
|
env:
|
|
@@ -43,16 +43,10 @@ develop-eggs/
|
|
|
43
43
|
.mypy_cache/
|
|
44
44
|
|
|
45
45
|
|
|
46
|
-
# Build
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
coverage_html/
|
|
51
|
-
vulnerabilities.json
|
|
52
|
-
licenses.json
|
|
53
|
-
licenses-inverted.json
|
|
54
|
-
sbom.json
|
|
55
|
-
mypi_junit.xml
|
|
46
|
+
# Build Report
|
|
47
|
+
reports/*
|
|
48
|
+
!reports/.keep
|
|
49
|
+
!reports/README.md
|
|
56
50
|
|
|
57
51
|
# IDE
|
|
58
52
|
.idea/
|
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
[🧠 OE Python Template](https://oe-python-template.readthedocs.io/en/latest/)
|
|
2
2
|
|
|
3
|
-
## [0.5.
|
|
3
|
+
## [0.5.9](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/compare/v0.5.8..0.5.9) - 2025-03-15
|
|
4
|
+
|
|
5
|
+
### 🐛 Bug Fixes
|
|
6
|
+
|
|
7
|
+
- .gitignore - ([8de2b49](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/commit/8de2b49cea020038c96e1e6fe9ff7559d172c427))
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
## [0.5.8](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/compare/v0.5.7..v0.5.8) - 2025-03-15
|
|
11
|
+
|
|
12
|
+
### 🚜 Refactor
|
|
13
|
+
|
|
14
|
+
- *(tooling)* Simplify - ([478674f](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/commit/478674f7e2fc6395bdec79b5c5e893d7266c4d56))
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
## [0.5.7](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/compare/v0.5.6..v0.5.7) - 2025-03-14
|
|
4
18
|
|
|
5
19
|
### ⛰️ Features
|
|
6
20
|
|
|
@@ -90,10 +90,28 @@ uv run nox -s audit # run security and license audit, inc. sbom generation
|
|
|
90
90
|
uv run nox -s docs # build documentation, output in docs/build/html
|
|
91
91
|
```
|
|
92
92
|
|
|
93
|
+
As a shortcut, you can run build steps using `./n`:
|
|
94
|
+
|
|
95
|
+
```shell
|
|
96
|
+
./n test
|
|
97
|
+
./n lint
|
|
98
|
+
# ...
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Generate a wheel using uv
|
|
102
|
+
```shell
|
|
103
|
+
uv build
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Notes:
|
|
107
|
+
1. Reports dumped into ```reports/```
|
|
108
|
+
3. Documentation dumped into ```docs/build/html/```
|
|
109
|
+
2. Distribution dumped into ```dist/```
|
|
110
|
+
|
|
93
111
|
### Running GitHub CI workflow locally
|
|
94
112
|
|
|
95
113
|
```shell
|
|
96
|
-
|
|
114
|
+
uv run nox -s act
|
|
97
115
|
```
|
|
98
116
|
|
|
99
117
|
Notes:
|
|
@@ -116,13 +134,7 @@ docker run --env THE_VAR=THE_VALUE oe-python-template --help
|
|
|
116
134
|
Update scaffold from template
|
|
117
135
|
|
|
118
136
|
```shell
|
|
119
|
-
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
### Updating demo application contained within oe-python-template
|
|
123
|
-
|
|
124
|
-
```shell
|
|
125
|
-
copier copy -r HEAD . . --force --trust
|
|
137
|
+
uv run nox -s update_from_template
|
|
126
138
|
```
|
|
127
139
|
|
|
128
140
|
## Pull Request Guidelines
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: oe-python-template
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.9
|
|
4
4
|
Summary: 🧠 Copier template to scaffold Python projects compliant with best practices and modern tooling.
|
|
5
5
|
Project-URL: Homepage, https://oe-python-template.readthedocs.io/en/latest/
|
|
6
6
|
Project-URL: Documentation, https://oe-python-template.readthedocs.io/en/latest/
|
|
@@ -66,13 +66,14 @@ Description-Content-Type: text/markdown
|
|
|
66
66
|
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/blob/main/noxfile.py)
|
|
67
67
|
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/actions/workflows/test-and-report.yml)
|
|
68
68
|
[](https://oe-python-template.readthedocs.io/en/latest/)
|
|
69
|
-
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/code-scanning)
|
|
70
|
-
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/dependabot)
|
|
71
69
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
|
|
72
70
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
|
|
73
71
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
|
|
74
72
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
|
|
75
73
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
|
|
74
|
+
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/code-scanning)
|
|
75
|
+
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/dependabot)
|
|
76
|
+
[](https://renovatebot.com/)
|
|
76
77
|
[](https://codecov.io/gh/helmut-hoffer-von-ankershoffen/oe-python-template)
|
|
77
78
|
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/blob/main/noxfile.py)
|
|
78
79
|
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/blob/main/noxfile.py)
|
|
@@ -179,8 +180,8 @@ uvx oe-python-template serve --port=4711 # serves webservice API on port 4711
|
|
|
179
180
|
```
|
|
180
181
|
|
|
181
182
|
Notes:
|
|
182
|
-
* The API is versioned, mounted at
|
|
183
|
-
* While serving the webservice API go to [http://127.0.0.1:8000/api/v1/hello-world](http://127.0.0.1:8000/api/v1/hello-world) to see the respons of the
|
|
183
|
+
* The API is versioned, mounted at `/api/v1` resp. `/api/v2`
|
|
184
|
+
* While serving the webservice API go to [http://127.0.0.1:8000/api/v1/hello-world](http://127.0.0.1:8000/api/v1/hello-world) to see the respons of the `hello-world` operation.
|
|
184
185
|
* Interactive documentation is provided at [http://127.0.0.1:8000/api/docs](http://127.0.0.1:8000/api/docs)
|
|
185
186
|
|
|
186
187
|
|
|
@@ -5,13 +5,14 @@
|
|
|
5
5
|
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/blob/main/noxfile.py)
|
|
6
6
|
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/actions/workflows/test-and-report.yml)
|
|
7
7
|
[](https://oe-python-template.readthedocs.io/en/latest/)
|
|
8
|
-
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/code-scanning)
|
|
9
|
-
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/dependabot)
|
|
10
8
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
|
|
11
9
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
|
|
12
10
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
|
|
13
11
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
|
|
14
12
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
|
|
13
|
+
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/code-scanning)
|
|
14
|
+
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/dependabot)
|
|
15
|
+
[](https://renovatebot.com/)
|
|
15
16
|
[](https://codecov.io/gh/helmut-hoffer-von-ankershoffen/oe-python-template)
|
|
16
17
|
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/blob/main/noxfile.py)
|
|
17
18
|
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/blob/main/noxfile.py)
|
|
@@ -118,8 +119,8 @@ uvx oe-python-template serve --port=4711 # serves webservice API on port 4711
|
|
|
118
119
|
```
|
|
119
120
|
|
|
120
121
|
Notes:
|
|
121
|
-
* The API is versioned, mounted at
|
|
122
|
-
* While serving the webservice API go to [http://127.0.0.1:8000/api/v1/hello-world](http://127.0.0.1:8000/api/v1/hello-world) to see the respons of the
|
|
122
|
+
* The API is versioned, mounted at `/api/v1` resp. `/api/v2`
|
|
123
|
+
* While serving the webservice API go to [http://127.0.0.1:8000/api/v1/hello-world](http://127.0.0.1:8000/api/v1/hello-world) to see the respons of the `hello-world` operation.
|
|
123
124
|
* Interactive documentation is provided at [http://127.0.0.1:8000/api/docs](http://127.0.0.1:8000/api/docs)
|
|
124
125
|
|
|
125
126
|
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
## [0.5.9](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/compare/v0.5.8..v0.5.9) - 2025-03-15
|
|
2
|
+
|
|
3
|
+
### 🐛 Bug Fixes
|
|
4
|
+
|
|
5
|
+
- .gitignore - ([8de2b49](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/commit/8de2b49cea020038c96e1e6fe9ff7559d172c427))
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
@@ -22,12 +22,12 @@ OE Python Template employs several automated tools to continuously monitor and i
|
|
|
22
22
|
|
|
23
23
|
- **GitHub Dependabot**: Monitors dependencies for known vulnerabilities and automatically creates pull requests to update them when security issues are found. [Dependendabot alerts](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/dependabot) published.
|
|
24
24
|
- **Renovate Bot**: Automatically creates pull requests to update dependencies when new versions are available, with a focus on security patches. [Dependency Dashboard](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/issues) published.
|
|
25
|
-
- **pip-audit**: Regularly scans Python dependencies for known vulnerabilities using data from the Python Advisory Database.
|
|
25
|
+
- **pip-audit**: Regularly scans Python dependencies for known vulnerabilities using data from the Python Advisory Database. `vulnerabilities.json` published [per release](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/releases).
|
|
26
26
|
|
|
27
27
|
### 2. Dependency Compliance
|
|
28
28
|
|
|
29
|
-
- **cyclonedx-py**: Generates a Software Bill of Materials (SBOM) in SPDX format, listing all components and dependencies used in the project.
|
|
30
|
-
- **pip-licenses**: Exports the licenses of all dependencies to ensure compliance with licensing requirements and avoid using components with problematic licenses.
|
|
29
|
+
- **cyclonedx-py**: Generates a Software Bill of Materials (SBOM) in SPDX format, listing all components and dependencies used in the project. `sbom.json` (SPDX format) published [per release](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/releases).
|
|
30
|
+
- **pip-licenses**: Exports the licenses of all dependencies to ensure compliance with licensing requirements and avoid using components with problematic licenses. `licenses.csv`, `licenses.json` and `licenses_grouped.json` published [per release](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/releases).
|
|
31
31
|
|
|
32
32
|
### 3. Static Code Analysis
|
|
33
33
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.5.9
|
|
@@ -5,13 +5,14 @@
|
|
|
5
5
|
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/blob/main/noxfile.py)
|
|
6
6
|
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/actions/workflows/test-and-report.yml)
|
|
7
7
|
[](https://oe-python-template.readthedocs.io/en/latest/)
|
|
8
|
-
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/code-scanning)
|
|
9
|
-
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/dependabot)
|
|
10
8
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
|
|
11
9
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
|
|
12
10
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
|
|
13
11
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
|
|
14
12
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
|
|
13
|
+
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/code-scanning)
|
|
14
|
+
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/dependabot)
|
|
15
|
+
[](https://renovatebot.com/)
|
|
15
16
|
[](https://codecov.io/gh/helmut-hoffer-von-ankershoffen/oe-python-template)
|
|
16
17
|
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/blob/main/noxfile.py)
|
|
17
18
|
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/blob/main/noxfile.py)
|
|
@@ -80,8 +80,8 @@ uvx oe-python-template serve --port=4711 # serves webservice API on port 4711
|
|
|
80
80
|
```
|
|
81
81
|
|
|
82
82
|
Notes:
|
|
83
|
-
* The API is versioned, mounted at
|
|
84
|
-
* While serving the webservice API go to [http://127.0.0.1:8000/api/v1/hello-world](http://127.0.0.1:8000/api/v1/hello-world) to see the respons of the
|
|
83
|
+
* The API is versioned, mounted at `/api/v1` resp. `/api/v2`
|
|
84
|
+
* While serving the webservice API go to [http://127.0.0.1:8000/api/v1/hello-world](http://127.0.0.1:8000/api/v1/hello-world) to see the respons of the `hello-world` operation.
|
|
85
85
|
* Interactive documentation is provided at [http://127.0.0.1:8000/api/docs](http://127.0.0.1:8000/api/docs)
|
|
86
86
|
|
|
87
87
|
|
|
@@ -29,7 +29,7 @@ extensions = [
|
|
|
29
29
|
project = "oe-python-template"
|
|
30
30
|
author = "Helmut Hoffer von Ankershoffen"
|
|
31
31
|
copyright = f" (c) 2025-{datetime.now(UTC).year}, {author}" # noqa: A001
|
|
32
|
-
version = "0.5.
|
|
32
|
+
version = "0.5.9"
|
|
33
33
|
release = version
|
|
34
34
|
github_username = "helmut-hoffer-von-ankershoffen"
|
|
35
35
|
github_repository = "oe-python-template"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.. mdinclude:: ../../SECURITY.md
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# Wrapper script for running nox tasks with uv.
|
|
3
|
+
# Allows simpler commands: `./n <session>` instead of `uv run nox -s <session>`
|
|
4
|
+
|
|
5
|
+
if [ $# -lt 1 ]; then
|
|
6
|
+
echo "Usage: ./n <session_name> [additional_args]"
|
|
7
|
+
echo "Examples:"
|
|
8
|
+
echo " ./n setup_dev"
|
|
9
|
+
echo " ./n lint"
|
|
10
|
+
echo " ./n docs"
|
|
11
|
+
echo " ./n audit"
|
|
12
|
+
echo " ./n test"
|
|
13
|
+
echo " ./n act"
|
|
14
|
+
echo " ./n update_from_template"
|
|
15
|
+
echo " ./n bump patch"
|
|
16
|
+
echo " ./n bump minor"
|
|
17
|
+
echo " ./n bump major"
|
|
18
|
+
echo " ./n bump x.y.z"
|
|
19
|
+
exit 1
|
|
20
|
+
fi
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
session=$1
|
|
24
|
+
shift # Remove the first argument, remaining args will be passed through
|
|
25
|
+
|
|
26
|
+
# Execute the command, forwarding all output
|
|
27
|
+
exec uv run nox -s "$session" "$@"
|
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
4
|
import os
|
|
5
|
+
import re
|
|
5
6
|
from pathlib import Path
|
|
6
7
|
|
|
7
8
|
import nox
|
|
9
|
+
import tomli
|
|
8
10
|
|
|
9
11
|
nox.options.reuse_existing_virtualenvs = True
|
|
10
12
|
nox.options.default_venv_backend = "uv"
|
|
@@ -80,39 +82,40 @@ def docs(session: nox.Session) -> None:
|
|
|
80
82
|
@nox.session(python=["3.13"])
|
|
81
83
|
def audit(session: nox.Session) -> None:
|
|
82
84
|
"""Run security audit and license checks."""
|
|
83
|
-
_setup_venv(session)
|
|
84
|
-
session.run("pip-audit", "-f", "json", "-o", "vulnerabilities.json")
|
|
85
|
-
session.run("jq", ".", "vulnerabilities.json", external=True)
|
|
86
|
-
session.run("pip-licenses", "--format=
|
|
87
|
-
session.run("
|
|
85
|
+
_setup_venv(session, True)
|
|
86
|
+
session.run("pip-audit", "-f", "json", "-o", "reports/vulnerabilities.json")
|
|
87
|
+
session.run("jq", ".", "reports/vulnerabilities.json", external=True)
|
|
88
|
+
session.run("pip-licenses", "--format=csv", "--order=license", "--output-file=reports/licenses.csv")
|
|
89
|
+
session.run("pip-licenses", "--format=json", "--output-file=reports/licenses.json")
|
|
90
|
+
session.run("jq", ".", "reports/licenses.json", external=True)
|
|
88
91
|
# Read and parse licenses.json
|
|
89
|
-
licenses_data = json.loads(Path("licenses.json").read_text(encoding="utf-8"))
|
|
92
|
+
licenses_data = json.loads(Path("reports/licenses.json").read_text(encoding="utf-8"))
|
|
90
93
|
|
|
91
|
-
|
|
92
|
-
|
|
94
|
+
licenses_grouped: dict[str, list[dict[str, str]]] = {}
|
|
95
|
+
licenses_grouped = {}
|
|
93
96
|
for pkg in licenses_data:
|
|
94
97
|
license_name = pkg["License"]
|
|
95
98
|
package_info = {"Name": pkg["Name"], "Version": pkg["Version"]}
|
|
96
99
|
|
|
97
|
-
if license_name not in
|
|
98
|
-
|
|
99
|
-
|
|
100
|
+
if license_name not in licenses_grouped:
|
|
101
|
+
licenses_grouped[license_name] = []
|
|
102
|
+
licenses_grouped[license_name].append(package_info)
|
|
100
103
|
|
|
101
|
-
# Write
|
|
102
|
-
Path("
|
|
103
|
-
json.dumps(
|
|
104
|
+
# Write grouped data
|
|
105
|
+
Path("reports/licenses_grouped.json").write_text(
|
|
106
|
+
json.dumps(licenses_grouped, indent=2),
|
|
104
107
|
encoding="utf-8",
|
|
105
108
|
)
|
|
106
|
-
session.run("jq", ".", "
|
|
107
|
-
session.run("cyclonedx-py", "environment", "-o", "sbom.json")
|
|
108
|
-
session.run("jq", ".", "sbom.json", external=True)
|
|
109
|
+
session.run("jq", ".", "reports/licenses_grouped.json", external=True)
|
|
110
|
+
session.run("cyclonedx-py", "environment", "-o", "reports/sbom.json")
|
|
111
|
+
session.run("jq", ".", "reports/sbom.json", external=True)
|
|
109
112
|
|
|
110
113
|
|
|
111
114
|
@nox.session(python=["3.11", "3.12", "3.13"])
|
|
112
115
|
def test(session: nox.Session) -> None:
|
|
113
116
|
"""Run tests with pytest."""
|
|
114
117
|
_setup_venv(session)
|
|
115
|
-
pytest_args = ["pytest", "--disable-warnings", "--junitxml=junit.xml", "-n", "auto", "--dist", "loadgroup"]
|
|
118
|
+
pytest_args = ["pytest", "--disable-warnings", "--junitxml=reports/junit.xml", "-n", "auto", "--dist", "loadgroup"]
|
|
116
119
|
if _is_act_environment():
|
|
117
120
|
pytest_args.extend(["-k", NOT_SKIP_WITH_ACT])
|
|
118
121
|
session.run(*pytest_args)
|
|
@@ -136,3 +139,57 @@ def setup_dev(session: nox.Session) -> None:
|
|
|
136
139
|
except Exception: # noqa: BLE001
|
|
137
140
|
session.log("pre-commit run failed, continuing anyway")
|
|
138
141
|
session.run("git", "add", ".", external=True)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
@nox.session(default=False)
|
|
145
|
+
def update_from_template(session: nox.Session) -> None:
|
|
146
|
+
"""Update from copier template."""
|
|
147
|
+
if Path("copier.yaml").is_file() or Path("copier.yml").is_file():
|
|
148
|
+
# Read the current version from pyproject.toml
|
|
149
|
+
with Path("pyproject.toml").open("rb") as f:
|
|
150
|
+
pyproject = tomli.load(f)
|
|
151
|
+
current_version = pyproject["tool"]["bumpversion"]["current_version"]
|
|
152
|
+
# In this case the project itself is the template
|
|
153
|
+
session.run("copier", "copy", "-r", "HEAD", ".", ".", "--force", "--trust", "--skip-tasks", external=True)
|
|
154
|
+
# Bump the version using the current version from pyproject.toml
|
|
155
|
+
session.run("bump-my-version", "replace", "--new-version", current_version, "--allow-dirty", external=True)
|
|
156
|
+
else:
|
|
157
|
+
# In this case the template has been generated from a template
|
|
158
|
+
session.run("copier", "update", "--trust", "--skip-answered", "--skip-tasks", external=True)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
@nox.session(default=False)
|
|
162
|
+
def act(session: nox.Session) -> None:
|
|
163
|
+
"""Run GitHub Actions workflow locally with act."""
|
|
164
|
+
session.run(
|
|
165
|
+
"act",
|
|
166
|
+
"-j",
|
|
167
|
+
"test",
|
|
168
|
+
"--env-file",
|
|
169
|
+
".act-env-public",
|
|
170
|
+
"--secret-file",
|
|
171
|
+
".act-env-secret",
|
|
172
|
+
"--container-architecture",
|
|
173
|
+
"linux/amd64",
|
|
174
|
+
"-P",
|
|
175
|
+
"ubuntu-latest=catthehacker/ubuntu:act-latest",
|
|
176
|
+
"--action-offline-mode",
|
|
177
|
+
"--container-daemon-socket",
|
|
178
|
+
"-",
|
|
179
|
+
external=True,
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
@nox.session(default=False)
|
|
184
|
+
def bump(session: nox.Session) -> None:
|
|
185
|
+
"""Bump version and push changes to git."""
|
|
186
|
+
version_part = session.posargs[0] if session.posargs else "patch"
|
|
187
|
+
|
|
188
|
+
# Check if the version_part is a specific version (e.g., 1.2.3)
|
|
189
|
+
if re.match(r"^[0-9]+\.[0-9]+\.[0-9]+$", version_part):
|
|
190
|
+
session.run("bump-my-version", "bump", "--new-version", version_part, external=True)
|
|
191
|
+
else:
|
|
192
|
+
session.run("bump-my-version", "bump", version_part, external=True)
|
|
193
|
+
|
|
194
|
+
# Push changes to git
|
|
195
|
+
session.run("git", "push", external=True)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "oe-python-template"
|
|
3
|
-
version = "0.5.
|
|
3
|
+
version = "0.5.9"
|
|
4
4
|
description = "🧠 Copier template to scaffold Python projects compliant with best practices and modern tooling."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
authors = [
|
|
@@ -198,7 +198,7 @@ docstring-code-format = true
|
|
|
198
198
|
convention = "google"
|
|
199
199
|
|
|
200
200
|
[tool.mypy] # https://mypy.readthedocs.io/en/latest/config_file.html
|
|
201
|
-
junit_xml = "
|
|
201
|
+
junit_xml = "reports/mypy_junit.xml"
|
|
202
202
|
plugins = "pydantic.mypy"
|
|
203
203
|
strict = true
|
|
204
204
|
disallow_subclassing_any = false
|
|
@@ -217,7 +217,7 @@ warn_required_dynamic_aliases = true
|
|
|
217
217
|
warn_untyped_fields = true
|
|
218
218
|
|
|
219
219
|
[tool.pytest.ini_options]
|
|
220
|
-
addopts = "-v --cov=oe_python_template --cov-report=term-missing --cov-report=xml:coverage.xml --cov-report=html:coverage_html"
|
|
220
|
+
addopts = "-v --cov=oe_python_template --cov-report=term-missing --cov-report=xml:reports/coverage.xml --cov-report=html:reports/coverage_html"
|
|
221
221
|
testpaths = ["tests"]
|
|
222
222
|
python_files = ["*_test.py"]
|
|
223
223
|
asyncio_mode = "auto"
|
|
@@ -242,7 +242,7 @@ source = ["src/"]
|
|
|
242
242
|
|
|
243
243
|
|
|
244
244
|
[tool.bumpversion]
|
|
245
|
-
current_version = "0.5.
|
|
245
|
+
current_version = "0.5.9"
|
|
246
246
|
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
|
|
247
247
|
serialize = ["{major}.{minor}.{patch}"]
|
|
248
248
|
search = "{current_version}"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
sonar.projectKey=helmut-hoffer-von-ankershoffen_oe-python-template
|
|
2
2
|
sonar.organization=helmut-hoffer-von-ankershoffen
|
|
3
|
-
sonar.projectVersion=0.5.
|
|
3
|
+
sonar.projectVersion=0.5.9
|
|
4
4
|
sonar.projectDescription=🧠 Copier template to scaffold Python projects compliant with best practices and modern tooling.
|
|
5
5
|
sonar.links.homepage=https://oe-python-template.readthedocs.io/en/latest/
|
|
6
6
|
sonar.links.scm=https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template
|
|
@@ -53,7 +53,7 @@ jobs:
|
|
|
53
53
|
env:
|
|
54
54
|
GITHUB_TOKEN: {% raw %}${{ secrets.GITHUB_TOKEN }}{% endraw %}
|
|
55
55
|
run: |
|
|
56
|
-
gh release create {% raw %}${{ github.ref_name }} ./dist/*
|
|
56
|
+
gh release create {% raw %}${{ github.ref_name }} ./dist/* ./reports/* --notes-file ${{ steps.git-cliff.outputs.changelog }}{% endraw %}
|
|
57
57
|
|
|
58
58
|
- name: Allow other workflows to trigger on release
|
|
59
59
|
env:
|
|
@@ -43,16 +43,10 @@ develop-eggs/
|
|
|
43
43
|
.mypy_cache/
|
|
44
44
|
|
|
45
45
|
|
|
46
|
-
# Build
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
coverage_html/
|
|
51
|
-
vulnerabilities.json
|
|
52
|
-
licenses.json
|
|
53
|
-
licenses-inverted.json
|
|
54
|
-
sbom.json
|
|
55
|
-
mypi_junit.xml
|
|
46
|
+
# Build Report
|
|
47
|
+
reports/*
|
|
48
|
+
!reports/.keep
|
|
49
|
+
!reports/README.md
|
|
56
50
|
|
|
57
51
|
# IDE
|
|
58
52
|
.idea/
|
|
@@ -90,10 +90,28 @@ uv run nox -s audit # run security and license audit, inc. sbom generation
|
|
|
90
90
|
uv run nox -s docs # build documentation, output in docs/build/html
|
|
91
91
|
```
|
|
92
92
|
|
|
93
|
+
As a shortcut, you can run build steps using `./n`:
|
|
94
|
+
|
|
95
|
+
```shell
|
|
96
|
+
./n test
|
|
97
|
+
./n lint
|
|
98
|
+
# ...
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Generate a wheel using uv
|
|
102
|
+
```shell
|
|
103
|
+
uv build
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Notes:
|
|
107
|
+
1. Reports dumped into ```reports/```
|
|
108
|
+
3. Documentation dumped into ```docs/build/html/```
|
|
109
|
+
2. Distribution dumped into ```dist/```
|
|
110
|
+
|
|
93
111
|
### Running GitHub CI workflow locally
|
|
94
112
|
|
|
95
113
|
```shell
|
|
96
|
-
|
|
114
|
+
uv run nox -s act
|
|
97
115
|
```
|
|
98
116
|
|
|
99
117
|
Notes:
|
|
@@ -116,13 +134,7 @@ docker run --env THE_VAR=THE_VALUE {{ pypi_distribution_name }} --help
|
|
|
116
134
|
Update scaffold from template
|
|
117
135
|
|
|
118
136
|
```shell
|
|
119
|
-
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
### Updating demo application contained within {{ project_name_kebab_case }}
|
|
123
|
-
|
|
124
|
-
```shell
|
|
125
|
-
copier copy -r HEAD . . --force --trust
|
|
137
|
+
uv run nox -s update_from_template
|
|
126
138
|
```
|
|
127
139
|
|
|
128
140
|
## Pull Request Guidelines
|
|
@@ -22,12 +22,12 @@ We currently provide security updates for the latest minor version.
|
|
|
22
22
|
|
|
23
23
|
- **GitHub Dependabot**: Monitors dependencies for known vulnerabilities and automatically creates pull requests to update them when security issues are found. [Dependendabot alerts]({{ github_repository_url_https }}/security/dependabot) published.
|
|
24
24
|
- **Renovate Bot**: Automatically creates pull requests to update dependencies when new versions are available, with a focus on security patches. [Dependency Dashboard]({{ github_repository_url_https }}/issues) published.
|
|
25
|
-
- **pip-audit**: Regularly scans Python dependencies for known vulnerabilities using data from the Python Advisory Database.
|
|
25
|
+
- **pip-audit**: Regularly scans Python dependencies for known vulnerabilities using data from the Python Advisory Database. `vulnerabilities.json` published [per release]({{ github_repository_url_https }}/releases).
|
|
26
26
|
|
|
27
27
|
### 2. Dependency Compliance
|
|
28
28
|
|
|
29
|
-
- **cyclonedx-py**: Generates a Software Bill of Materials (SBOM) in SPDX format, listing all components and dependencies used in the project.
|
|
30
|
-
- **pip-licenses**: Exports the licenses of all dependencies to ensure compliance with licensing requirements and avoid using components with problematic licenses.
|
|
29
|
+
- **cyclonedx-py**: Generates a Software Bill of Materials (SBOM) in SPDX format, listing all components and dependencies used in the project. `sbom.json` (SPDX format) published [per release]({{ github_repository_url_https }}/releases).
|
|
30
|
+
- **pip-licenses**: Exports the licenses of all dependencies to ensure compliance with licensing requirements and avoid using components with problematic licenses. `licenses.csv`, `licenses.json` and `licenses_grouped.json` published [per release]({{ github_repository_url_https }}/releases).
|
|
31
31
|
|
|
32
32
|
### 3. Static Code Analysis
|
|
33
33
|
|
|
@@ -5,13 +5,14 @@
|
|
|
5
5
|
[]({{ github_repository_url_https }}/blob/main/noxfile.py)
|
|
6
6
|
[]({{ github_repository_url_https }}/actions/workflows/test-and-report.yml)
|
|
7
7
|
[](https://{{ readthedocs_project_key }}.readthedocs.io/en/latest/)
|
|
8
|
-
[]({{ github_repository_url_https }}/security/code-scanning)
|
|
9
|
-
[]({{ github_repository_url_https }}/security/dependabot)
|
|
10
8
|
[](https://sonarcloud.io/summary/new_code?id={{ sonarqube_key }})
|
|
11
9
|
[](https://sonarcloud.io/summary/new_code?id={{ sonarqube_key }})
|
|
12
10
|
[](https://sonarcloud.io/summary/new_code?id={{ sonarqube_key }})
|
|
13
11
|
[](https://sonarcloud.io/summary/new_code?id={{ sonarqube_key }})
|
|
14
12
|
[](https://sonarcloud.io/summary/new_code?id={{ sonarqube_key }})
|
|
13
|
+
[]({{ github_repository_url_https }}/security/code-scanning)
|
|
14
|
+
[]({{ github_repository_url_https }}/security/dependabot)
|
|
15
|
+
[](https://renovatebot.com/)
|
|
15
16
|
[](https://codecov.io/gh/{{ github_repository_owner }}/{{ github_repository_name }})
|
|
16
17
|
[]({{ github_repository_url_https }}/blob/main/noxfile.py)
|
|
17
18
|
[]({{ github_repository_url_https }}/blob/main/noxfile.py)
|
|
@@ -80,8 +80,8 @@ uvx {{ pypi_distribution_name}} serve --port=4711 # serves webservice API on por
|
|
|
80
80
|
```
|
|
81
81
|
|
|
82
82
|
Notes:
|
|
83
|
-
* The API is versioned, mounted at
|
|
84
|
-
* While serving the webservice API go to [http://127.0.0.1:8000/api/v1/hello-world](http://127.0.0.1:8000/api/v1/hello-world) to see the respons of the
|
|
83
|
+
* The API is versioned, mounted at `/api/v1` resp. `/api/v2`
|
|
84
|
+
* While serving the webservice API go to [http://127.0.0.1:8000/api/v1/hello-world](http://127.0.0.1:8000/api/v1/hello-world) to see the respons of the `hello-world` operation.
|
|
85
85
|
* Interactive documentation is provided at [http://127.0.0.1:8000/api/docs](http://127.0.0.1:8000/api/docs)
|
|
86
86
|
|
|
87
87
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.. mdinclude:: ../../SECURITY.md
|