oe-python-template 0.5.7__tar.gz → 0.5.8__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 (164) hide show
  1. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/.copier-answers.yml +1 -1
  2. oe_python_template-0.5.8/.coverage +0 -0
  3. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/.github/workflows/package-build-publish-release.yml +1 -1
  4. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/.gitignore +4 -10
  5. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/CHANGELOG.md +8 -1
  6. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/CONTRIBUTING.md +20 -8
  7. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/PKG-INFO +6 -5
  8. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/README.md +5 -4
  9. oe_python_template-0.5.8/RELEASE_NOTES.md +8 -0
  10. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/SECURITY.md +3 -3
  11. oe_python_template-0.5.8/VERSION +1 -0
  12. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/_readme_header.md +3 -2
  13. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/_readme_main.md +2 -2
  14. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/docs/source/conf.py +1 -1
  15. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/docs/source/index.rst +2 -1
  16. oe_python_template-0.5.8/docs/source/security.rst +1 -0
  17. oe_python_template-0.5.8/n +27 -0
  18. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/noxfile.py +75 -18
  19. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/pyproject.toml +4 -4
  20. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/sonar-project.properties +1 -1
  21. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/.github/workflows/package-build-publish-release.yml.jinja +1 -1
  22. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/.gitignore.jinja +4 -10
  23. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/CONTRIBUTING.md.jinja +20 -8
  24. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/SECURITY.md.jinja +3 -3
  25. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/_readme_header.md.jinja +3 -2
  26. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/_readme_main.md.jinja +2 -2
  27. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/docs/source/index.rst.jinja +2 -1
  28. oe_python_template-0.5.8/template/docs/source/security.rst.jinja +1 -0
  29. oe_python_template-0.5.8/template/n.jinja +27 -0
  30. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/noxfile.py.jinja +75 -18
  31. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/pyproject.toml.jinja +2 -2
  32. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/uv.lock +1 -1
  33. oe_python_template-0.5.7/RELEASE_NOTES.md +0 -8
  34. oe_python_template-0.5.7/VERSION +0 -1
  35. oe_python_template-0.5.7/bump +0 -7
  36. oe_python_template-0.5.7/latexmkrc +0 -11
  37. oe_python_template-0.5.7/reports/mypy.xml +0 -5
  38. oe_python_template-0.5.7/template/bump.jinja +0 -7
  39. oe_python_template-0.5.7/template/docs/source/latexmkrc.jinja +0 -11
  40. oe_python_template-0.5.7/template/latexmkrc.jinja +0 -11
  41. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/.act-env-public +0 -0
  42. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/.devcontainer/Dockerfile +0 -0
  43. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/.devcontainer/devcontainer.json +0 -0
  44. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/.devcontainer/onCreateCommand +0 -0
  45. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/.devcontainer/postAttachCommand +0 -0
  46. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/.devcontainer/postCreateCommand +0 -0
  47. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/.env.example +0 -0
  48. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/.github/dependabot.yml +0 -0
  49. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/.github/workflows/codeql.yml +0 -0
  50. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/.github/workflows/docker-image-build-publish.yml +0 -0
  51. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/.github/workflows/test-and-report.yml +0 -0
  52. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/.pre-commit-config.yaml +0 -0
  53. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/.python-version +0 -0
  54. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/.readthedocs.yml +0 -0
  55. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/.secrets.baseline +0 -0
  56. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/.vscode/extensions.json +0 -0
  57. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/.vscode/settings.json +0 -0
  58. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/CODEOWNERS +0 -0
  59. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/Dockerfile +0 -0
  60. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/LICENSE +0 -0
  61. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/SERVICE_CONNECTIONS.md +0 -0
  62. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/_readme_footer.md +0 -0
  63. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/bin/git-cliff +0 -0
  64. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/codecov.yml +0 -0
  65. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/compose.yaml +0 -0
  66. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/copier.yml +0 -0
  67. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/docs/Makefile +0 -0
  68. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/docs/make.bat +0 -0
  69. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/docs/source/_static/.keep +0 -0
  70. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/docs/source/_static/openapi_v1.json +0 -0
  71. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/docs/source/_static/openapi_v1.yaml +0 -0
  72. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/docs/source/_static/openapi_v2.json +0 -0
  73. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/docs/source/_static/openapi_v2.yaml +0 -0
  74. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/docs/source/api_v1.rst +0 -0
  75. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/docs/source/api_v2.rst +0 -0
  76. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/docs/source/contributing.rst +0 -0
  77. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/docs/source/latexmkrc +0 -0
  78. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/docs/source/main.rst +0 -0
  79. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/docs/source/reference.rst +0 -0
  80. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/docs/source/release-notes.rst +0 -0
  81. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/examples/__init__.py +0 -0
  82. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/examples/notebook.ipynb +0 -0
  83. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/examples/notebook.py +0 -0
  84. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/examples/script.py +0 -0
  85. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/examples/streamlit.py +0 -0
  86. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/git-cliff-2.7.0/CHANGELOG.md +0 -0
  87. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/git-cliff-2.7.0/LICENSE-APACHE +0 -0
  88. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/git-cliff-2.7.0/LICENSE-MIT +0 -0
  89. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/git-cliff-2.7.0/README.md +0 -0
  90. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/git-cliff-2.7.0/completions/_git-cliff +0 -0
  91. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/git-cliff-2.7.0/completions/_git-cliff.ps1 +0 -0
  92. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/git-cliff-2.7.0/completions/git-cliff.bash +0 -0
  93. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/git-cliff-2.7.0/completions/git-cliff.elv +0 -0
  94. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/git-cliff-2.7.0/completions/git-cliff.fish +0 -0
  95. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/git-cliff-2.7.0/git-cliff-completions +0 -0
  96. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/git-cliff-2.7.0/git-cliff-mangen +0 -0
  97. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/git-cliff-2.7.0/man/git-cliff.1 +0 -0
  98. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/git-cliff-2.7.0-x86_64-unknown-linux-gnu.tar.gz +0 -0
  99. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/github-action-run +0 -0
  100. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/logo.png +0 -0
  101. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/renovate.json +0 -0
  102. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/src/oe_python_template/__init__.py +0 -0
  103. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/src/oe_python_template/api.py +0 -0
  104. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/src/oe_python_template/cli.py +0 -0
  105. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/src/oe_python_template/constants.py +0 -0
  106. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/src/oe_python_template/service.py +0 -0
  107. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/.act-env-public.jinja +0 -0
  108. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/.devcontainer/Dockerfile.jinja +0 -0
  109. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/.devcontainer/devcontainer.json.jinja +0 -0
  110. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/.devcontainer/onCreateCommand.jinja +0 -0
  111. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/.devcontainer/postAttachCommand.jinja +0 -0
  112. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/.devcontainer/postCreateCommand.jinja +0 -0
  113. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/.env.example.jinja +0 -0
  114. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/.github/dependabot.yml +0 -0
  115. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/.github/workflows/codeql.yml +0 -0
  116. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/.github/workflows/docker-image-build-publish.yml.jinja +0 -0
  117. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/.github/workflows/test-and-report.yml.jinja +0 -0
  118. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/.pre-commit-config.yaml.jinja +0 -0
  119. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/.python-version +0 -0
  120. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/.readthedocs.yml.jinja +0 -0
  121. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/.vscode/extensions.json +0 -0
  122. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/.vscode/settings.json.jinja +0 -0
  123. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/CHANGELOG.md +0 -0
  124. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/CODEOWNERS.jinja +0 -0
  125. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/Dockerfile.jinja +0 -0
  126. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/LICENSE.jinja +0 -0
  127. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/SERVICE_CONNECTIONS.md.jinja +0 -0
  128. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/VERSION +0 -0
  129. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/_readme_footer.md.jinja +0 -0
  130. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/codecov.yml.jinja +0 -0
  131. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/compose.yaml.jinja +0 -0
  132. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/docs/Makefile.jinja +0 -0
  133. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/docs/make.bat.jinja +0 -0
  134. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/docs/source/_static/.keep +0 -0
  135. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/docs/source/api_v1.rst.jinja +0 -0
  136. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/docs/source/api_v2.rst.jinja +0 -0
  137. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/docs/source/conf.py.jinja +0 -0
  138. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/docs/source/contributing.rst.jinja +0 -0
  139. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/docs/source/main.rst.jinja +0 -0
  140. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/docs/source/reference.rst.jinja +0 -0
  141. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/docs/source/release-notes.rst.jinja +0 -0
  142. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/examples/__init__.py.jinja +0 -0
  143. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/examples/notebook.ipynb.jinja +0 -0
  144. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/examples/notebook.py.jinja +0 -0
  145. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/examples/script.py.jinja +0 -0
  146. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/examples/streamlit.py.jinja +0 -0
  147. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/github-action-run.jinja +0 -0
  148. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/logo.png +0 -0
  149. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/renovate.json +0 -0
  150. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/sonar-project.properties.jinja +0 -0
  151. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/src/{{ project_name_snake_case }}/__init__.py.jinja +0 -0
  152. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/src/{{ project_name_snake_case }}/api.py.jinja +0 -0
  153. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/src/{{ project_name_snake_case }}/cli.py.jinja +0 -0
  154. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/src/{{ project_name_snake_case }}/constants.py.jinja +0 -0
  155. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/src/{{ project_name_snake_case }}/service.py.jinja +0 -0
  156. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/tests/__init__.py.jinja +0 -0
  157. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/tests/api_test.py.jinja +0 -0
  158. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/tests/cli_test.py.jinja +0 -0
  159. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/tests/fixtures/.keep +0 -0
  160. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/template/{{_copier_conf.answers_file}}.jinja +0 -0
  161. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/tests/__init__.py +0 -0
  162. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/tests/api_test.py +0 -0
  163. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/tests/cli_test.py +0 -0
  164. {oe_python_template-0.5.7 → oe_python_template-0.5.8}/tests/fixtures/.keep +0 -0
@@ -1,4 +1,4 @@
1
- _commit: v0.5.6-1-gb86f82d
1
+ _commit: v0.5.7-1-g90244f2
2
2
  _src_path: .
3
3
  author_email: helmuthva@gmail.com
4
4
  author_github_username: helmut-hoffer-von-ankershoffen
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/* sbom.json licenses.json licenses-inverted.json vulnerabilities.json --notes-file ${{ steps.git-cliff.outputs.changelog }}
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 Artefacts
47
- junit.xml
48
- .coverage*
49
- coverage.xml
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,13 @@
1
1
  [🧠 OE Python Template](https://oe-python-template.readthedocs.io/en/latest/)
2
2
 
3
- ## [0.5.7](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/compare/v0.5.6..0.5.7) - 2025-03-14
3
+ ## [0.5.8](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/compare/v0.5.7..0.5.8) - 2025-03-15
4
+
5
+ ### 🚜 Refactor
6
+
7
+ - *(tooling)* Simplify - ([478674f](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/commit/478674f7e2fc6395bdec79b5c5e893d7266c4d56))
8
+
9
+
10
+ ## [0.5.7](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/compare/v0.5.6..v0.5.7) - 2025-03-14
4
11
 
5
12
  ### ⛰️ Features
6
13
 
@@ -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
- ./github-action-run.sh
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
- copier update --trust --skip-tasks --skip-answered
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.7
3
+ Version: 0.5.8
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
  [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/oe-python-template.svg?logo=python&color=204361&labelColor=1E2933)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/blob/main/noxfile.py)
67
67
  [![CI](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/actions/workflows/test-and-report.yml/badge.svg)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/actions/workflows/test-and-report.yml)
68
68
  [![Read the Docs](https://img.shields.io/readthedocs/oe-python-template)](https://oe-python-template.readthedocs.io/en/latest/)
69
- [![CodeQL](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/actions/workflows/codeql.yml/badge.svg)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/code-scanning)
70
- [![Dependabot](https://img.shields.io/badge/dependabot-active-brightgreen?style=flat-square&logo=dependabot)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/dependabot)
71
69
  [![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
72
70
  [![Security](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
73
71
  [![Maintainability](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
74
72
  [![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template&metric=sqale_index)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
75
73
  [![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
74
+ [![CodeQL](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/actions/workflows/codeql.yml/badge.svg)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/code-scanning)
75
+ [![Dependabot](https://img.shields.io/badge/dependabot-active-brightgreen?style=flat-square&logo=dependabot)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/dependabot)
76
+ [![Renovate enabled](https://img.shields.io/badge/renovate-enabled-brightgreen.svg)](https://renovatebot.com/)
76
77
  [![Coverage](https://codecov.io/gh/helmut-hoffer-von-ankershoffen/oe-python-template/graph/badge.svg?token=SX34YRP30E)](https://codecov.io/gh/helmut-hoffer-von-ankershoffen/oe-python-template)
77
78
  [![Ruff](https://img.shields.io/badge/style-Ruff-blue?color=D6FF65)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/blob/main/noxfile.py)
78
79
  [![MyPy](https://img.shields.io/badge/mypy-checked-blue)](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 ```/api/v1``` resp. ```/api/v2```
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 ```hello-world``` operation.
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
  [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/oe-python-template.svg?logo=python&color=204361&labelColor=1E2933)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/blob/main/noxfile.py)
6
6
  [![CI](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/actions/workflows/test-and-report.yml/badge.svg)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/actions/workflows/test-and-report.yml)
7
7
  [![Read the Docs](https://img.shields.io/readthedocs/oe-python-template)](https://oe-python-template.readthedocs.io/en/latest/)
8
- [![CodeQL](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/actions/workflows/codeql.yml/badge.svg)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/code-scanning)
9
- [![Dependabot](https://img.shields.io/badge/dependabot-active-brightgreen?style=flat-square&logo=dependabot)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/dependabot)
10
8
  [![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
11
9
  [![Security](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
12
10
  [![Maintainability](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
13
11
  [![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template&metric=sqale_index)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
14
12
  [![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
13
+ [![CodeQL](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/actions/workflows/codeql.yml/badge.svg)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/code-scanning)
14
+ [![Dependabot](https://img.shields.io/badge/dependabot-active-brightgreen?style=flat-square&logo=dependabot)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/dependabot)
15
+ [![Renovate enabled](https://img.shields.io/badge/renovate-enabled-brightgreen.svg)](https://renovatebot.com/)
15
16
  [![Coverage](https://codecov.io/gh/helmut-hoffer-von-ankershoffen/oe-python-template/graph/badge.svg?token=SX34YRP30E)](https://codecov.io/gh/helmut-hoffer-von-ankershoffen/oe-python-template)
16
17
  [![Ruff](https://img.shields.io/badge/style-Ruff-blue?color=D6FF65)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/blob/main/noxfile.py)
17
18
  [![MyPy](https://img.shields.io/badge/mypy-checked-blue)](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 ```/api/v1``` resp. ```/api/v2```
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 ```hello-world``` operation.
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.8](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/compare/v0.5.7..v0.5.8) - 2025-03-15
2
+
3
+ ### 🚜 Refactor
4
+
5
+ - *(tooling)* Simplify - ([478674f](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/commit/478674f7e2fc6395bdec79b5c5e893d7266c4d56))
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. ```vulnerabilities.json``` published [per release](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/releases).
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. ```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.json``` and ```licenses-inverted.json``` published [per release](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/releases).
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.8
@@ -5,13 +5,14 @@
5
5
  [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/oe-python-template.svg?logo=python&color=204361&labelColor=1E2933)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/blob/main/noxfile.py)
6
6
  [![CI](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/actions/workflows/test-and-report.yml/badge.svg)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/actions/workflows/test-and-report.yml)
7
7
  [![Read the Docs](https://img.shields.io/readthedocs/oe-python-template)](https://oe-python-template.readthedocs.io/en/latest/)
8
- [![CodeQL](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/actions/workflows/codeql.yml/badge.svg)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/code-scanning)
9
- [![Dependabot](https://img.shields.io/badge/dependabot-active-brightgreen?style=flat-square&logo=dependabot)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/dependabot)
10
8
  [![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
11
9
  [![Security](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
12
10
  [![Maintainability](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
13
11
  [![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template&metric=sqale_index)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
14
12
  [![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template)
13
+ [![CodeQL](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/actions/workflows/codeql.yml/badge.svg)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/code-scanning)
14
+ [![Dependabot](https://img.shields.io/badge/dependabot-active-brightgreen?style=flat-square&logo=dependabot)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/security/dependabot)
15
+ [![Renovate enabled](https://img.shields.io/badge/renovate-enabled-brightgreen.svg)](https://renovatebot.com/)
15
16
  [![Coverage](https://codecov.io/gh/helmut-hoffer-von-ankershoffen/oe-python-template/graph/badge.svg?token=SX34YRP30E)](https://codecov.io/gh/helmut-hoffer-von-ankershoffen/oe-python-template)
16
17
  [![Ruff](https://img.shields.io/badge/style-Ruff-blue?color=D6FF65)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/blob/main/noxfile.py)
17
18
  [![MyPy](https://img.shields.io/badge/mypy-checked-blue)](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 ```/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.
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.7"
32
+ version = "0.5.8"
33
33
  release = version
34
34
  github_username = "helmut-hoffer-von-ankershoffen"
35
35
  github_repository = "oe-python-template"
@@ -14,8 +14,9 @@
14
14
  api_v1
15
15
  api_v2
16
16
  reference
17
- release-notes
18
17
  contributing
18
+ security
19
+ release-notes
19
20
 
20
21
  .. sidebar-links::
21
22
  :caption: Links
@@ -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=json", "--output-file=licenses.json")
87
- session.run("jq", ".", "licenses.json", external=True)
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
- licenses_inverted: dict[str, list[dict[str, str]]] = {}
92
- licenses_inverted = {}
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 licenses_inverted:
98
- licenses_inverted[license_name] = []
99
- licenses_inverted[license_name].append(package_info)
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 inverted data
102
- Path("licenses-inverted.json").write_text(
103
- json.dumps(licenses_inverted, indent=2),
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", ".", "licenses-inverted.json", external=True)
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.7"
3
+ version = "0.5.8"
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 = "mypi_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.7"
245
+ current_version = "0.5.8"
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.7
3
+ sonar.projectVersion=0.5.8
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/* sbom.json licenses.json licenses-inverted.json vulnerabilities.json --notes-file ${{ steps.git-cliff.outputs.changelog }}{% endraw %}
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 Artefacts
47
- junit.xml
48
- .coverage*
49
- coverage.xml
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
- ./github-action-run.sh
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
- copier update --trust --skip-tasks --skip-answered
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. ```vulnerabilities.json``` published [per release]({{ github_repository_url_https }}/releases).
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. ```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.json``` and ```licenses-inverted.json``` published [per release]({{ github_repository_url_https }}/releases).
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
  [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/{{ pypi_distribution_name }}.svg?logo=python&color=204361&labelColor=1E2933)]({{ github_repository_url_https }}/blob/main/noxfile.py)
6
6
  [![CI]({{ github_repository_url_https }}/actions/workflows/test-and-report.yml/badge.svg)]({{ github_repository_url_https }}/actions/workflows/test-and-report.yml)
7
7
  [![Read the Docs](https://img.shields.io/readthedocs/{{ readthedocs_project_key }})](https://{{ readthedocs_project_key }}.readthedocs.io/en/latest/)
8
- [![CodeQL]({{ github_repository_url_https }}/actions/workflows/codeql.yml/badge.svg)]({{ github_repository_url_https }}/security/code-scanning)
9
- [![Dependabot](https://img.shields.io/badge/dependabot-active-brightgreen?style=flat-square&logo=dependabot)]({{ github_repository_url_https }}/security/dependabot)
10
8
  [![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project={{ sonarqube_key }}&metric=alert_status)](https://sonarcloud.io/summary/new_code?id={{ sonarqube_key }})
11
9
  [![Security](https://sonarcloud.io/api/project_badges/measure?project={{ sonarqube_key }}&metric=security_rating)](https://sonarcloud.io/summary/new_code?id={{ sonarqube_key }})
12
10
  [![Maintainability](https://sonarcloud.io/api/project_badges/measure?project={{ sonarqube_key }}&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id={{ sonarqube_key }})
13
11
  [![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project={{ sonarqube_key }}&metric=sqale_index)](https://sonarcloud.io/summary/new_code?id={{ sonarqube_key }})
14
12
  [![Code Smells](https://sonarcloud.io/api/project_badges/measure?project={{ sonarqube_key }}&metric=code_smells)](https://sonarcloud.io/summary/new_code?id={{ sonarqube_key }})
13
+ [![CodeQL]({{ github_repository_url_https }}/actions/workflows/codeql.yml/badge.svg)]({{ github_repository_url_https }}/security/code-scanning)
14
+ [![Dependabot](https://img.shields.io/badge/dependabot-active-brightgreen?style=flat-square&logo=dependabot)]({{ github_repository_url_https }}/security/dependabot)
15
+ [![Renovate enabled](https://img.shields.io/badge/renovate-enabled-brightgreen.svg)](https://renovatebot.com/)
15
16
  [![Coverage](https://codecov.io/gh/{{ github_repository_owner }}/{{ github_repository_name }}/graph/badge.svg?token=SX34YRP30E)](https://codecov.io/gh/{{ github_repository_owner }}/{{ github_repository_name }})
16
17
  [![Ruff](https://img.shields.io/badge/style-Ruff-blue?color=D6FF65)]({{ github_repository_url_https }}/blob/main/noxfile.py)
17
18
  [![MyPy](https://img.shields.io/badge/mypy-checked-blue)]({{ 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 ```/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.
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
 
@@ -14,8 +14,9 @@
14
14
  api_v1
15
15
  api_v2
16
16
  reference
17
- release-notes
18
17
  contributing
18
+ security
19
+ release-notes
19
20
 
20
21
  .. sidebar-links::
21
22
  :caption: Links
@@ -0,0 +1 @@
1
+ .. mdinclude:: ../../SECURITY.md