oe-python-template-example 0.1.13__tar.gz → 0.1.15__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 (96) hide show
  1. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/.copier-answers.yml +1 -1
  2. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/.github/workflows/package-build-publish-release.yml +1 -1
  3. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/.gitignore +5 -10
  4. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/CHANGELOG.md +8 -1
  5. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/CONTRIBUTING.md +20 -8
  6. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/PKG-INFO +7 -9
  7. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/README.md +6 -8
  8. oe_python_template_example-0.1.15/RELEASE_NOTES.md +8 -0
  9. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/SECURITY.md +3 -3
  10. oe_python_template_example-0.1.15/VERSION +1 -0
  11. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/_readme_header.md +3 -2
  12. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/_readme_main.md +3 -6
  13. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/docs/source/_static/openapi_v1.yaml +32 -16
  14. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/docs/source/_static/openapi_v2.yaml +32 -16
  15. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/docs/source/conf.py +1 -1
  16. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/docs/source/index.rst +2 -1
  17. oe_python_template_example-0.1.15/docs/source/security.rst +1 -0
  18. oe_python_template_example-0.1.15/n +27 -0
  19. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/noxfile.py +75 -18
  20. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/pyproject.toml +5 -5
  21. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/sonar-project.properties +1 -1
  22. oe_python_template_example-0.1.15/tests/fixtures/.keep +0 -0
  23. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/uv.lock +1 -1
  24. oe_python_template_example-0.1.13/RELEASE_NOTES.md +0 -8
  25. oe_python_template_example-0.1.13/VERSION +0 -1
  26. oe_python_template_example-0.1.13/bump +0 -7
  27. oe_python_template_example-0.1.13/docs/source/latexmkrc +0 -11
  28. oe_python_template_example-0.1.13/latexmkrc +0 -11
  29. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/.act-env-public +0 -0
  30. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/.devcontainer/Dockerfile +0 -0
  31. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/.devcontainer/devcontainer.json +0 -0
  32. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/.devcontainer/onCreateCommand +0 -0
  33. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/.devcontainer/postAttachCommand +0 -0
  34. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/.devcontainer/postCreateCommand +0 -0
  35. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/.env.example +0 -0
  36. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/.github/dependabot.yml +0 -0
  37. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/.github/workflows/codeql.yml +0 -0
  38. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/.github/workflows/docker-image-build-publish.yml +0 -0
  39. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/.github/workflows/test-and-report.yml +0 -0
  40. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/.pre-commit-config.yaml +0 -0
  41. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/.python-version +0 -0
  42. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/.readthedocs.yml +0 -0
  43. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/.secrets.baseline +0 -0
  44. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/.vscode/extensions.json +0 -0
  45. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/.vscode/settings.json +0 -0
  46. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/CODEOWNERS +0 -0
  47. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/Dockerfile +0 -0
  48. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/LICENSE +0 -0
  49. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/SERVICE_CONNECTIONS.md +0 -0
  50. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/_readme_footer.md +0 -0
  51. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/bin/git-cliff +0 -0
  52. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/codecov.yml +0 -0
  53. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/compose.yaml +0 -0
  54. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/docs/Makefile +0 -0
  55. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/docs/make.bat +0 -0
  56. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/docs/source/_static/.keep +0 -0
  57. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/docs/source/_static/openapi.json +0 -0
  58. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/docs/source/_static/openapi.yaml +0 -0
  59. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/docs/source/_static/openapi_v1.json +0 -0
  60. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/docs/source/_static/openapi_v2.json +0 -0
  61. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/docs/source/api_v1.rst +0 -0
  62. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/docs/source/api_v2.rst +0 -0
  63. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/docs/source/contributing.rst +0 -0
  64. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/docs/source/main.rst +0 -0
  65. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/docs/source/reference.rst +0 -0
  66. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/docs/source/release-notes.rst +0 -0
  67. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/examples/__init__.py +0 -0
  68. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/examples/notebook.ipynb +0 -0
  69. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/examples/notebook.py +0 -0
  70. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/examples/script.py +0 -0
  71. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/examples/streamlit.py +0 -0
  72. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/git-cliff-2.7.0/CHANGELOG.md +0 -0
  73. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/git-cliff-2.7.0/LICENSE-APACHE +0 -0
  74. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/git-cliff-2.7.0/LICENSE-MIT +0 -0
  75. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/git-cliff-2.7.0/README.md +0 -0
  76. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/git-cliff-2.7.0/completions/_git-cliff +0 -0
  77. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/git-cliff-2.7.0/completions/_git-cliff.ps1 +0 -0
  78. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/git-cliff-2.7.0/completions/git-cliff.bash +0 -0
  79. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/git-cliff-2.7.0/completions/git-cliff.elv +0 -0
  80. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/git-cliff-2.7.0/completions/git-cliff.fish +0 -0
  81. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/git-cliff-2.7.0/git-cliff-completions +0 -0
  82. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/git-cliff-2.7.0/git-cliff-mangen +0 -0
  83. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/git-cliff-2.7.0/man/git-cliff.1 +0 -0
  84. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/git-cliff-2.7.0-x86_64-unknown-linux-gnu.tar.gz +0 -0
  85. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/github-action-run +0 -0
  86. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/logo.png +0 -0
  87. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/renovate.json +0 -0
  88. {oe_python_template_example-0.1.13/tests/fixtures → oe_python_template_example-0.1.15/reports}/.keep +0 -0
  89. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/src/oe_python_template_example/__init__.py +0 -0
  90. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/src/oe_python_template_example/api.py +0 -0
  91. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/src/oe_python_template_example/cli.py +0 -0
  92. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/src/oe_python_template_example/constants.py +0 -0
  93. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/src/oe_python_template_example/service.py +0 -0
  94. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/tests/__init__.py +0 -0
  95. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/tests/api_test.py +0 -0
  96. {oe_python_template_example-0.1.13 → oe_python_template_example-0.1.15}/tests/cli_test.py +0 -0
@@ -1,4 +1,4 @@
1
- _commit: v0.5.7
1
+ _commit: v0.5.10
2
2
  _src_path: gh:helmut-hoffer-von-ankershoffen/oe-python-template
3
3
  author_email: helmuthva@gmail.com
4
4
  author_github_username: helmut-hoffer-von-ankershoffen
@@ -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:
@@ -41,18 +41,13 @@ develop-eggs/
41
41
  .nox
42
42
  .dmypy.json
43
43
  .mypy_cache/
44
+ .coverage
44
45
 
45
46
 
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
47
+ # Build Report
48
+ reports/*
49
+ !reports/.keep
50
+ !reports/README.md
56
51
 
57
52
  # IDE
58
53
  .idea/
@@ -1,6 +1,13 @@
1
1
  [🧠 OE Python Template Example](https://oe-python-template-example.readthedocs.io/en/latest/)
2
2
 
3
- ## [0.1.13](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/compare/v0.1.12..0.1.13) - 2025-03-14
3
+ ## [0.1.15](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/compare/v0.1.14..0.1.15) - 2025-03-15
4
+
5
+ ### ⚙️ Miscellaneous Tasks
6
+
7
+ - .gitignore - ([b1fb3fa](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/commit/b1fb3fa01b18031cfa12f3241b62e70dc1419640))
8
+
9
+
10
+ ## [0.1.13](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/compare/v0.1.12..v0.1.13) - 2025-03-14
4
11
 
5
12
  ### 📚 Documentation
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-example --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-example
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-example
3
- Version: 0.1.13
3
+ Version: 0.1.15
4
4
  Summary: 🧠 Example project scaffolded and kept up to date with OE Python Template (oe-python-template).
5
5
  Project-URL: Homepage, https://oe-python-template-example.readthedocs.io/en/latest/
6
6
  Project-URL: Documentation, https://oe-python-template-example.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-example.svg?logo=python&color=204361&labelColor=1E2933)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/blob/main/noxfile.py)
67
67
  [![CI](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/actions/workflows/test-and-report.yml/badge.svg)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/actions/workflows/test-and-report.yml)
68
68
  [![Read the Docs](https://img.shields.io/readthedocs/oe-python-template-example)](https://oe-python-template-example.readthedocs.io/en/latest/)
69
- [![CodeQL](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/actions/workflows/codeql.yml/badge.svg)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/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-example/security/dependabot)
71
69
  [![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template-example&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
72
70
  [![Security](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template-example&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
73
71
  [![Maintainability](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template-example&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
74
72
  [![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template-example&metric=sqale_index)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
75
73
  [![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template-example&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
74
+ [![CodeQL](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/actions/workflows/codeql.yml/badge.svg)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/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-example/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-example/graph/badge.svg?token=SX34YRP30E)](https://codecov.io/gh/helmut-hoffer-von-ankershoffen/oe-python-template-example)
77
78
  [![Ruff](https://img.shields.io/badge/style-Ruff-blue?color=D6FF65)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/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-example/blob/main/noxfile.py)
@@ -135,13 +136,10 @@ uvx oe-python-template-example serve --port=4711 # serves webservice API on port
135
136
  ```
136
137
 
137
138
  Notes:
139
+ * The API is versioned, mounted at `/api/v1` resp. `/api/v2`
140
+ * 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.
141
+ * Interactive documentation is provided at [http://127.0.0.1:8000/api/docs](http://127.0.0.1:8000/api/docs)
138
142
 
139
- - The API is versioned, mounted at `/api/v1` resp. `/api/v2`
140
- - While serving the webservice API go to
141
- [http://127.0.0.1:8000/api/v1/hello-world](http://127.0.0.1:8000/api/v1/hello-world)
142
- to see the respons of the `hello-world` operation.
143
- - Interactive documentation is provided at
144
- [http://127.0.0.1:8000/api/docs](http://127.0.0.1:8000/api/docs)
145
143
 
146
144
  The CLI provides extensive help:
147
145
 
@@ -5,13 +5,14 @@
5
5
  [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/oe-python-template-example.svg?logo=python&color=204361&labelColor=1E2933)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/blob/main/noxfile.py)
6
6
  [![CI](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/actions/workflows/test-and-report.yml/badge.svg)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/actions/workflows/test-and-report.yml)
7
7
  [![Read the Docs](https://img.shields.io/readthedocs/oe-python-template-example)](https://oe-python-template-example.readthedocs.io/en/latest/)
8
- [![CodeQL](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/actions/workflows/codeql.yml/badge.svg)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/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-example/security/dependabot)
10
8
  [![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template-example&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
11
9
  [![Security](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template-example&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
12
10
  [![Maintainability](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template-example&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
13
11
  [![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template-example&metric=sqale_index)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
14
12
  [![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template-example&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
13
+ [![CodeQL](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/actions/workflows/codeql.yml/badge.svg)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/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-example/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-example/graph/badge.svg?token=SX34YRP30E)](https://codecov.io/gh/helmut-hoffer-von-ankershoffen/oe-python-template-example)
16
17
  [![Ruff](https://img.shields.io/badge/style-Ruff-blue?color=D6FF65)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/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-example/blob/main/noxfile.py)
@@ -74,13 +75,10 @@ uvx oe-python-template-example serve --port=4711 # serves webservice API on port
74
75
  ```
75
76
 
76
77
  Notes:
78
+ * The API is versioned, mounted at `/api/v1` resp. `/api/v2`
79
+ * 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.
80
+ * Interactive documentation is provided at [http://127.0.0.1:8000/api/docs](http://127.0.0.1:8000/api/docs)
77
81
 
78
- - The API is versioned, mounted at `/api/v1` resp. `/api/v2`
79
- - While serving the webservice API go to
80
- [http://127.0.0.1:8000/api/v1/hello-world](http://127.0.0.1:8000/api/v1/hello-world)
81
- to see the respons of the `hello-world` operation.
82
- - Interactive documentation is provided at
83
- [http://127.0.0.1:8000/api/docs](http://127.0.0.1:8000/api/docs)
84
82
 
85
83
  The CLI provides extensive help:
86
84
 
@@ -0,0 +1,8 @@
1
+ ## [0.1.15](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/compare/v0.1.14..v0.1.15) - 2025-03-15
2
+
3
+ ### ⚙️ Miscellaneous Tasks
4
+
5
+ - .gitignore - ([b1fb3fa](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/commit/b1fb3fa01b18031cfa12f3241b62e70dc1419640))
6
+
7
+
8
+
@@ -22,12 +22,12 @@ OE Python Template Example employs several automated tools to continuously monit
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-example/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-example/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-example/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-example/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-example/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-example/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-example/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-example/releases).
31
31
 
32
32
  ### 3. Static Code Analysis
33
33
 
@@ -0,0 +1 @@
1
+ 0.1.15
@@ -5,13 +5,14 @@
5
5
  [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/oe-python-template-example.svg?logo=python&color=204361&labelColor=1E2933)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/blob/main/noxfile.py)
6
6
  [![CI](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/actions/workflows/test-and-report.yml/badge.svg)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/actions/workflows/test-and-report.yml)
7
7
  [![Read the Docs](https://img.shields.io/readthedocs/oe-python-template-example)](https://oe-python-template-example.readthedocs.io/en/latest/)
8
- [![CodeQL](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/actions/workflows/codeql.yml/badge.svg)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/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-example/security/dependabot)
10
8
  [![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template-example&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
11
9
  [![Security](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template-example&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
12
10
  [![Maintainability](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template-example&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
13
11
  [![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template-example&metric=sqale_index)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
14
12
  [![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=helmut-hoffer-von-ankershoffen_oe-python-template-example&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
13
+ [![CodeQL](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/actions/workflows/codeql.yml/badge.svg)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/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-example/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-example/graph/badge.svg?token=SX34YRP30E)](https://codecov.io/gh/helmut-hoffer-von-ankershoffen/oe-python-template-example)
16
17
  [![Ruff](https://img.shields.io/badge/style-Ruff-blue?color=D6FF65)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/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-example/blob/main/noxfile.py)
@@ -33,13 +33,10 @@ uvx oe-python-template-example serve --port=4711 # serves webservice API on port
33
33
  ```
34
34
 
35
35
  Notes:
36
+ * The API is versioned, mounted at `/api/v1` resp. `/api/v2`
37
+ * 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.
38
+ * Interactive documentation is provided at [http://127.0.0.1:8000/api/docs](http://127.0.0.1:8000/api/docs)
36
39
 
37
- - The API is versioned, mounted at `/api/v1` resp. `/api/v2`
38
- - While serving the webservice API go to
39
- [http://127.0.0.1:8000/api/v1/hello-world](http://127.0.0.1:8000/api/v1/hello-world)
40
- to see the respons of the `hello-world` operation.
41
- - Interactive documentation is provided at
42
- [http://127.0.0.1:8000/api/docs](http://127.0.0.1:8000/api/docs)
43
40
 
44
41
  The CLI provides extensive help:
45
42
 
@@ -104,9 +104,12 @@ openapi: 3.1.0
104
104
  paths:
105
105
  /echo:
106
106
  post:
107
- description: "Echo back the provided text.\n\nArgs:\n request (EchoRequest):\
108
- \ The request containing the text to echo back.\n\nReturns:\n EchoResponse:\
109
- \ A response containing the echoed text.\n\nRaises:\n 422 Unprocessable\
107
+ description: "Echo back the provided text.\n\nArgs:\n request
108
+ (EchoRequest):\
109
+ \ The request containing the text to echo back.\n\nReturns:\n
110
+ EchoResponse:\
111
+ \ A response containing the echoed text.\n\nRaises:\n 422
112
+ Unprocessable\
110
113
  \ Entity: If text is not provided or empty."
111
114
  operationId: echo_echo_post
112
115
  requestBody:
@@ -133,12 +136,18 @@ paths:
133
136
  - Basics
134
137
  /health:
135
138
  get:
136
- description: "Check the health of the service.\n\nThis endpoint returns the\
137
- \ health status of the service.\nThe health status can be either UP or DOWN.\n\
138
- If the service is healthy, the status will be UP.\nIf the service is unhealthy,\
139
- \ the status will be DOWN and a reason will be provided.\nThe response will\
140
- \ have a 200 OK status code if the service is healthy,\nand a 500 Internal\
141
- \ Server Error status code if the service is unhealthy.\n\nReturns:\n Health:\
139
+ description: "Check the health of the service.\n\nThis endpoint returns
140
+ the\
141
+ \ health status of the service.\nThe health status can be either UP or
142
+ DOWN.\n\
143
+ If the service is healthy, the status will be UP.\nIf the service is
144
+ unhealthy,\
145
+ \ the status will be DOWN and a reason will be provided.\nThe response
146
+ will\
147
+ \ have a 200 OK status code if the service is healthy,\nand a 500
148
+ Internal\
149
+ \ Server Error status code if the service is unhealthy.\n\nReturns:\n
150
+ Health:\
142
151
  \ The health status of the service."
143
152
  operationId: health_health_get
144
153
  responses:
@@ -153,12 +162,18 @@ paths:
153
162
  - Observability
154
163
  /healthz:
155
164
  get:
156
- description: "Check the health of the service.\n\nThis endpoint returns the\
157
- \ health status of the service.\nThe health status can be either UP or DOWN.\n\
158
- If the service is healthy, the status will be UP.\nIf the service is unhealthy,\
159
- \ the status will be DOWN and a reason will be provided.\nThe response will\
160
- \ have a 200 OK status code if the service is healthy,\nand a 500 Internal\
161
- \ Server Error status code if the service is unhealthy.\n\nReturns:\n Health:\
165
+ description: "Check the health of the service.\n\nThis endpoint returns
166
+ the\
167
+ \ health status of the service.\nThe health status can be either UP or
168
+ DOWN.\n\
169
+ If the service is healthy, the status will be UP.\nIf the service is
170
+ unhealthy,\
171
+ \ the status will be DOWN and a reason will be provided.\nThe response
172
+ will\
173
+ \ have a 200 OK status code if the service is healthy,\nand a 500
174
+ Internal\
175
+ \ Server Error status code if the service is unhealthy.\n\nReturns:\n
176
+ Health:\
162
177
  \ The health status of the service."
163
178
  operationId: health_healthz_get
164
179
  responses:
@@ -173,7 +188,8 @@ paths:
173
188
  - Observability
174
189
  /hello-world:
175
190
  get:
176
- description: "Return a hello world message.\n\nReturns:\n HelloWorldResponse:\
191
+ description: "Return a hello world message.\n\nReturns:\n
192
+ HelloWorldResponse:\
177
193
  \ A response containing the hello world message."
178
194
  operationId: hello_world_hello_world_get
179
195
  responses:
@@ -104,9 +104,12 @@ openapi: 3.1.0
104
104
  paths:
105
105
  /echo:
106
106
  post:
107
- description: "Echo back the provided utterance.\n\nArgs:\n request (Utterance):\
108
- \ The request containing the utterance to echo back.\n\nReturns:\n EchoResponse:\
109
- \ A response containing the echoed utterance.\n\nRaises:\n 422 Unprocessable\
107
+ description: "Echo back the provided utterance.\n\nArgs:\n request
108
+ (Utterance):\
109
+ \ The request containing the utterance to echo back.\n\nReturns:\n
110
+ EchoResponse:\
111
+ \ A response containing the echoed utterance.\n\nRaises:\n 422
112
+ Unprocessable\
110
113
  \ Entity: If utterance is not provided or empty."
111
114
  operationId: echo_v2_echo_post
112
115
  requestBody:
@@ -133,12 +136,18 @@ paths:
133
136
  - Basics
134
137
  /health:
135
138
  get:
136
- description: "Check the health of the service.\n\nThis endpoint returns the\
137
- \ health status of the service.\nThe health status can be either UP or DOWN.\n\
138
- If the service is healthy, the status will be UP.\nIf the service is unhealthy,\
139
- \ the status will be DOWN and a reason will be provided.\nThe response will\
140
- \ have a 200 OK status code if the service is healthy,\nand a 500 Internal\
141
- \ Server Error status code if the service is unhealthy.\n\nReturns:\n Health:\
139
+ description: "Check the health of the service.\n\nThis endpoint returns
140
+ the\
141
+ \ health status of the service.\nThe health status can be either UP or
142
+ DOWN.\n\
143
+ If the service is healthy, the status will be UP.\nIf the service is
144
+ unhealthy,\
145
+ \ the status will be DOWN and a reason will be provided.\nThe response
146
+ will\
147
+ \ have a 200 OK status code if the service is healthy,\nand a 500
148
+ Internal\
149
+ \ Server Error status code if the service is unhealthy.\n\nReturns:\n
150
+ Health:\
142
151
  \ The health status of the service."
143
152
  operationId: health_health_get
144
153
  responses:
@@ -153,12 +162,18 @@ paths:
153
162
  - Observability
154
163
  /healthz:
155
164
  get:
156
- description: "Check the health of the service.\n\nThis endpoint returns the\
157
- \ health status of the service.\nThe health status can be either UP or DOWN.\n\
158
- If the service is healthy, the status will be UP.\nIf the service is unhealthy,\
159
- \ the status will be DOWN and a reason will be provided.\nThe response will\
160
- \ have a 200 OK status code if the service is healthy,\nand a 500 Internal\
161
- \ Server Error status code if the service is unhealthy.\n\nReturns:\n Health:\
165
+ description: "Check the health of the service.\n\nThis endpoint returns
166
+ the\
167
+ \ health status of the service.\nThe health status can be either UP or
168
+ DOWN.\n\
169
+ If the service is healthy, the status will be UP.\nIf the service is
170
+ unhealthy,\
171
+ \ the status will be DOWN and a reason will be provided.\nThe response
172
+ will\
173
+ \ have a 200 OK status code if the service is healthy,\nand a 500
174
+ Internal\
175
+ \ Server Error status code if the service is unhealthy.\n\nReturns:\n
176
+ Health:\
162
177
  \ The health status of the service."
163
178
  operationId: health_healthz_get
164
179
  responses:
@@ -173,7 +188,8 @@ paths:
173
188
  - Observability
174
189
  /hello-world:
175
190
  get:
176
- description: "Return a hello world message.\n\nReturns:\n HelloWorldResponse:\
191
+ description: "Return a hello world message.\n\nReturns:\n
192
+ HelloWorldResponse:\
177
193
  \ A response containing the hello world message."
178
194
  operationId: hello_world_hello_world_get
179
195
  responses:
@@ -29,7 +29,7 @@ extensions = [
29
29
  project = "oe-python-template-example"
30
30
  author = "Helmut Hoffer von Ankershoffen"
31
31
  copyright = f" (c) 2025-{datetime.now(UTC).year}, {author}" # noqa: A001
32
- version = "0.1.13"
32
+ version = "0.1.15"
33
33
  release = version
34
34
  github_username = "helmut-hoffer-von-ankershoffen"
35
35
  github_repository = "oe-python-template-example"
@@ -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-example"
3
- version = "0.1.13"
3
+ version = "0.1.15"
4
4
  description = "🧠 Example project scaffolded and kept up to date with OE Python Template (oe-python-template)."
5
5
  readme = "README.md"
6
6
  authors = [
@@ -197,8 +197,8 @@ docstring-code-format = true
197
197
  [tool.ruff.lint.pydocstyle]
198
198
  convention = "google"
199
199
 
200
- [tool.mypy] # https://mypy.readthedocs.io/en/latest/config_file.html
201
- junit_xml = "mypi_junit.xml"
200
+ [tool.mypy] # https://mypy.readthedocs.io/en/latest/config_file.html
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_example --cov-report=term-missing --cov-report=xml:coverage.xml --cov-report=html:coverage_html"
220
+ addopts = "-v --cov=oe_python_template_example --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.1.13"
245
+ current_version = "0.1.15"
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-example
2
2
  sonar.organization=helmut-hoffer-von-ankershoffen
3
- sonar.projectVersion=0.1.13
3
+ sonar.projectVersion=0.1.15
4
4
  sonar.projectDescription=🧠 Example project scaffolded and kept up to date with OE Python Template (oe-python-template).
5
5
  sonar.links.homepage=https://oe-python-template-example.readthedocs.io/en/latest/
6
6
  sonar.links.scm=https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example
File without changes
@@ -2075,7 +2075,7 @@ wheels = [
2075
2075
 
2076
2076
  [[package]]
2077
2077
  name = "oe-python-template-example"
2078
- version = "0.1.13"
2078
+ version = "0.1.15"
2079
2079
  source = { editable = "." }
2080
2080
  dependencies = [
2081
2081
  { name = "fastapi", extra = ["all", "standard"] },
@@ -1,8 +0,0 @@
1
- ## [0.1.13](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/compare/v0.1.12..v0.1.13) - 2025-03-14
2
-
3
- ### 📚 Documentation
4
-
5
- - Adapt - ([6e99c1d](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/commit/6e99c1d604c8e9fe4094b6a21d95619181ea0d14))
6
-
7
-
8
-
@@ -1 +0,0 @@
1
- 0.1.13
@@ -1,7 +0,0 @@
1
- #!/bin/sh
2
- VERSION_PART=${1:-patch}
3
- if echo "$VERSION_PART" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+$'; then
4
- uv run bump-my-version bump --new-version "$VERSION_PART" && git push
5
- else
6
- uv run bump-my-version bump "$VERSION_PART" && git push
7
- fi
@@ -1,11 +0,0 @@
1
- $latex = 'xelatex --no-pdf ' . $ENV{'LATEXOPTS'} . ' %O %S';
2
- $pdflatex = 'echo "using custom latexmkrc"; '
3
- . 'for f in *.tex_; do xelatex -jobname="${f%.*}" -interaction=nonstopmode -recorder "$f"; done; '
4
- . 'xelatex ' . $ENV{'LATEXOPTS'} . ' %O %S';
5
- $lualatex = 'lualatex ' . $ENV{'LATEXOPTS'} . ' %O %S';
6
- $xelatex = 'xelatex --no-pdf ' . $ENV{'LATEXOPTS'} . ' %O %S';
7
- $makeindex = 'makeindex -s python.ist %O -o %D %S';
8
- add_cus_dep( "glo", "gls", 0, "makeglo" );
9
- sub makeglo {
10
- return system( "makeindex -s gglo.ist -o '$_[0].gls' '$_[0].glo'" );
11
- }
@@ -1,11 +0,0 @@
1
- $latex = 'xelatex --no-pdf ' . $ENV{'LATEXOPTS'} . ' %O %S';
2
- $pdflatex = 'echo "using custom latexmkrc"; '
3
- . 'for f in *.tex_; do xelatex -jobname="${f%.*}" -interaction=nonstopmode -recorder "$f"; done; '
4
- . 'xelatex ' . $ENV{'LATEXOPTS'} . ' %O %S';
5
- $lualatex = 'lualatex ' . $ENV{'LATEXOPTS'} . ' %O %S';
6
- $xelatex = 'xelatex --no-pdf ' . $ENV{'LATEXOPTS'} . ' %O %S';
7
- $makeindex = 'makeindex -s python.ist %O -o %D %S';
8
- add_cus_dep( "glo", "gls", 0, "makeglo" );
9
- sub makeglo {
10
- return system( "makeindex -s gglo.ist -o '$_[0].gls' '$_[0].glo'" );
11
- }