oe-python-template 0.4.2__tar.gz → 0.4.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.copier-answers.yml +1 -1
  2. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/CHANGELOG.md +15 -1
  3. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/PKG-INFO +7 -8
  4. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/README.md +6 -7
  5. oe_python_template-0.4.4/RELEASE_NOTES.md +8 -0
  6. oe_python_template-0.4.4/VERSION +1 -0
  7. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/_readme_header.md +1 -0
  8. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/_readme_main.md +5 -7
  9. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/conf.py +1 -1
  10. oe_python_template-0.4.4/examples/notebook.ipynb +46 -0
  11. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/pyproject.toml +2 -2
  12. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/sonar-project.properties +1 -1
  13. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/src/oe_python_template/api.py +11 -2
  14. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/src/oe_python_template/cli.py +3 -0
  15. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/_readme_header.md.jinja +4 -0
  16. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/_readme_main.md.jinja +5 -7
  17. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/docs/source/conf.py.jinja +4 -4
  18. oe_python_template-0.4.4/template/examples/notebook.ipynb.jinja +46 -0
  19. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/examples/streamlit.py.jinja +1 -0
  20. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/noxfile.py.jinja +4 -7
  21. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/src/{{ project_name_snake_case }}/__init__.py.jinja +1 -2
  22. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/src/{{ project_name_snake_case }}/api.py.jinja +15 -11
  23. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/src/{{ project_name_snake_case }}/cli.py.jinja +3 -0
  24. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/tests/api_test.py.jinja +2 -0
  25. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/uv.lock +1 -1
  26. oe_python_template-0.4.2/RELEASE_NOTES.md +0 -8
  27. oe_python_template-0.4.2/VERSION +0 -1
  28. oe_python_template-0.4.2/examples/jupyter.ipynb +0 -46
  29. oe_python_template-0.4.2/examples/notebook.ipynb +0 -46
  30. oe_python_template-0.4.2/template/examples/notebook.ipynb.jinja +0 -45
  31. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.act-env-public +0 -0
  32. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.devcontainer/Dockerfile +0 -0
  33. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.devcontainer/devcontainer.json +0 -0
  34. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.devcontainer/onCreateCommand +0 -0
  35. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.devcontainer/postAttachCommand +0 -0
  36. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.devcontainer/postCreateCommand +0 -0
  37. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.env.example +0 -0
  38. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.github/workflows/docker-image-build-publish.yml +0 -0
  39. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.github/workflows/package-build-publish-release.yml +0 -0
  40. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.github/workflows/test-and-report.yml +0 -0
  41. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.gitignore +0 -0
  42. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.pre-commit-config.yaml +0 -0
  43. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.python-version +0 -0
  44. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.readthedocs.yml +0 -0
  45. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.secrets.baseline +0 -0
  46. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.vscode/extensions.json +0 -0
  47. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.vscode/settings.json +0 -0
  48. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/CODEOWNERS +0 -0
  49. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/CONTRIBUTING.md +0 -0
  50. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/Dockerfile +0 -0
  51. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/LICENSE +0 -0
  52. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/SERVICE_CONNECTIONS.md +0 -0
  53. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/_readme_footer.md +0 -0
  54. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/bin/git-cliff +0 -0
  55. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/bump +0 -0
  56. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/codecov.yml +0 -0
  57. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/compose.yaml +0 -0
  58. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/copier.yml +0 -0
  59. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/Makefile +0 -0
  60. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/make.bat +0 -0
  61. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/_static/.keep +0 -0
  62. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/_static/openapi_v1.json +0 -0
  63. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/_static/openapi_v1.yaml +0 -0
  64. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/_static/openapi_v2.json +0 -0
  65. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/_static/openapi_v2.yaml +0 -0
  66. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/api_v1.rst +0 -0
  67. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/api_v2.rst +0 -0
  68. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/contributing.rst +0 -0
  69. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/index.rst +0 -0
  70. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/latexmkrc +0 -0
  71. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/main.rst +0 -0
  72. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/reference.rst +0 -0
  73. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/release-notes.rst +0 -0
  74. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/examples/__init__.py +0 -0
  75. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/examples/notebook.py +0 -0
  76. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/examples/script.py +0 -0
  77. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/examples/streamlit.py +0 -0
  78. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0/CHANGELOG.md +0 -0
  79. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0/LICENSE-APACHE +0 -0
  80. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0/LICENSE-MIT +0 -0
  81. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0/README.md +0 -0
  82. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0/completions/_git-cliff +0 -0
  83. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0/completions/_git-cliff.ps1 +0 -0
  84. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0/completions/git-cliff.bash +0 -0
  85. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0/completions/git-cliff.elv +0 -0
  86. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0/completions/git-cliff.fish +0 -0
  87. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0/git-cliff-completions +0 -0
  88. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0/git-cliff-mangen +0 -0
  89. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0/man/git-cliff.1 +0 -0
  90. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0-x86_64-unknown-linux-gnu.tar.gz +0 -0
  91. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/github-action-run +0 -0
  92. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/latexmkrc +0 -0
  93. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/logo.png +0 -0
  94. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/noxfile.py +0 -0
  95. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/renovate.json +0 -0
  96. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/reports/mypy.xml +0 -0
  97. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/src/oe_python_template/__init__.py +0 -0
  98. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/src/oe_python_template/constants.py +0 -0
  99. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/src/oe_python_template/service.py +0 -0
  100. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.act-env-public.jinja +0 -0
  101. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.devcontainer/Dockerfile.jinja +0 -0
  102. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.devcontainer/devcontainer.json.jinja +0 -0
  103. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.devcontainer/onCreateCommand.jinja +0 -0
  104. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.devcontainer/postAttachCommand.jinja +0 -0
  105. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.devcontainer/postCreateCommand.jinja +0 -0
  106. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.env.example.jinja +0 -0
  107. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.github/workflows/docker-image-build-publish.yml.jinja +0 -0
  108. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.github/workflows/package-build-publish-release.yml.jinja +0 -0
  109. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.github/workflows/test-and-report.yml.jinja +0 -0
  110. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.gitignore.jinja +0 -0
  111. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.pre-commit-config.yaml.jinja +0 -0
  112. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.python-version +0 -0
  113. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.readthedocs.yml.jinja +0 -0
  114. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.vscode/extensions.json +0 -0
  115. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.vscode/settings.json.jinja +0 -0
  116. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/CHANGELOG.md +0 -0
  117. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/CODEOWNERS.jinja +0 -0
  118. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/CONTRIBUTING.md.jinja +0 -0
  119. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/Dockerfile.jinja +0 -0
  120. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/LICENSE.jinja +0 -0
  121. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/SERVICE_CONNECTIONS.md.jinja +0 -0
  122. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/VERSION +0 -0
  123. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/_readme_footer.md.jinja +0 -0
  124. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/bump.jinja +0 -0
  125. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/codecov.yml.jinja +0 -0
  126. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/compose.yaml.jinja +0 -0
  127. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/docs/Makefile.jinja +0 -0
  128. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/docs/make.bat.jinja +0 -0
  129. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/docs/source/_static/.keep +0 -0
  130. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/docs/source/api_v1.rst.jinja +0 -0
  131. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/docs/source/api_v2.rst.jinja +0 -0
  132. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/docs/source/contributing.rst.jinja +0 -0
  133. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/docs/source/index.rst.jinja +0 -0
  134. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/docs/source/latexmkrc.jinja +0 -0
  135. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/docs/source/main.rst.jinja +0 -0
  136. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/docs/source/reference.rst.jinja +0 -0
  137. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/docs/source/release-notes.rst.jinja +0 -0
  138. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/examples/__init__.py.jinja +0 -0
  139. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/examples/notebook.py.jinja +0 -0
  140. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/examples/script.py.jinja +0 -0
  141. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/github-action-run.jinja +0 -0
  142. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/latexmkrc.jinja +0 -0
  143. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/logo.png +0 -0
  144. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/pyproject.toml.jinja +0 -0
  145. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/sonar-project.properties.jinja +0 -0
  146. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/src/{{ project_name_snake_case }}/constants.py.jinja +0 -0
  147. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/src/{{ project_name_snake_case }}/service.py.jinja +0 -0
  148. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/tests/__init__.py.jinja +0 -0
  149. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/tests/cli_test.py.jinja +0 -0
  150. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/tests/fixtures/.keep +0 -0
  151. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/{{_copier_conf.answers_file}}.jinja +0 -0
  152. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/tests/__init__.py +0 -0
  153. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/tests/api_test.py +0 -0
  154. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/tests/cli_test.py +0 -0
  155. {oe_python_template-0.4.2 → oe_python_template-0.4.4}/tests/fixtures/.keep +0 -0
@@ -1,4 +1,4 @@
1
- _commit: v0.4.1-1-g567a564
1
+ _commit: v0.4.3-1-g16d5590
2
2
  _src_path: .
3
3
  author_email: helmuthva@gmail.com
4
4
  author_github_username: helmut-hoffer-von-ankershoffen
@@ -1,6 +1,20 @@
1
1
  [🧠 OE Python Template](https://oe-python-template.readthedocs.io/en/latest/)
2
2
 
3
- ## [0.4.2](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/compare/v0.4.1..0.4.2) - 2025-03-13
3
+ ## [0.4.4](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/compare/v0.4.3..0.4.4) - 2025-03-13
4
+
5
+ ### 📚 Documentation
6
+
7
+ - Link template - ([5927a2d](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/commit/5927a2d4b8cb40d5a97c9b6229f46b83cbf007fa))
8
+
9
+
10
+ ## [0.4.3](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/compare/v0.4.2..v0.4.3) - 2025-03-13
11
+
12
+ ### Enh
13
+
14
+ - *(versioned api)* Central docs entrypoint - ([24fda94](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/commit/24fda9401e864ef66109e701b7f549398282c98b))
15
+
16
+
17
+ ## [0.4.2](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/compare/v0.4.1..v0.4.2) - 2025-03-13
4
18
 
5
19
  ### 🐛 Bug Fixes
6
20
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: oe-python-template
3
- Version: 0.4.2
3
+ Version: 0.4.4
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/
@@ -91,6 +91,7 @@ Description-Content-Type: text/markdown
91
91
 
92
92
  > [!TIP]
93
93
  > 📚 [Online documentation](https://oe-python-template.readthedocs.io/en/latest/) - 📖 [PDF Manual](https://oe-python-template.readthedocs.io/_/downloads/en/latest/pdf/)
94
+
94
95
  ---
95
96
 
96
97
 
@@ -172,16 +173,14 @@ Executing the command line interface (CLI) in an isolated Python environment is
172
173
  ```shell
173
174
  uvx oe-python-template hello-world # prints "Hello, world! [..]"
174
175
  uvx oe-python-template serve # serves webservice API
176
+ uvx oe-python-template serve --port=4711 # serves webservice API on port 4711
175
177
  ```
176
178
 
177
- When serving the 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 result.
178
-
179
- The API is versioned and provides interactive documentation at [http://127.0.0.1:8000/api/v1/docs](http://127.0.0.1:8000/api/v1/docs) resp. [http://127.0.0.1:8000/api/v2/docs](http://127.0.0.1:8000/api/v2/docs)
180
-
181
-
182
- ```shell
179
+ Notes:
180
+ * The API is versioned, mounted at ```/api/v1``` resp. ```/api/v2```
181
+ * 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.
182
+ * Interactive documentation is provided at [http://127.0.0.1:8000/api/docs](http://127.0.0.1:8000/api/docs)
183
183
 
184
- When running the webservice API, goto http://127.0.0.1:8000/api/v1/docs
185
184
 
186
185
  The CLI provides extensive help:
187
186
 
@@ -30,6 +30,7 @@
30
30
 
31
31
  > [!TIP]
32
32
  > 📚 [Online documentation](https://oe-python-template.readthedocs.io/en/latest/) - 📖 [PDF Manual](https://oe-python-template.readthedocs.io/_/downloads/en/latest/pdf/)
33
+
33
34
  ---
34
35
 
35
36
 
@@ -111,16 +112,14 @@ Executing the command line interface (CLI) in an isolated Python environment is
111
112
  ```shell
112
113
  uvx oe-python-template hello-world # prints "Hello, world! [..]"
113
114
  uvx oe-python-template serve # serves webservice API
115
+ uvx oe-python-template serve --port=4711 # serves webservice API on port 4711
114
116
  ```
115
117
 
116
- When serving the 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 result.
117
-
118
- The API is versioned and provides interactive documentation at [http://127.0.0.1:8000/api/v1/docs](http://127.0.0.1:8000/api/v1/docs) resp. [http://127.0.0.1:8000/api/v2/docs](http://127.0.0.1:8000/api/v2/docs)
119
-
120
-
121
- ```shell
118
+ Notes:
119
+ * The API is versioned, mounted at ```/api/v1``` resp. ```/api/v2```
120
+ * 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.
121
+ * Interactive documentation is provided at [http://127.0.0.1:8000/api/docs](http://127.0.0.1:8000/api/docs)
122
122
 
123
- When running the webservice API, goto http://127.0.0.1:8000/api/v1/docs
124
123
 
125
124
  The CLI provides extensive help:
126
125
 
@@ -0,0 +1,8 @@
1
+ ## [0.4.4](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/compare/v0.4.3..v0.4.4) - 2025-03-13
2
+
3
+ ### 📚 Documentation
4
+
5
+ - Link template - ([5927a2d](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/commit/5927a2d4b8cb40d5a97c9b6229f46b83cbf007fa))
6
+
7
+
8
+
@@ -0,0 +1 @@
1
+ 0.4.4
@@ -30,4 +30,5 @@
30
30
 
31
31
  > [!TIP]
32
32
  > 📚 [Online documentation](https://oe-python-template.readthedocs.io/en/latest/) - 📖 [PDF Manual](https://oe-python-template.readthedocs.io/_/downloads/en/latest/pdf/)
33
+
33
34
  ---
@@ -76,16 +76,14 @@ Executing the command line interface (CLI) in an isolated Python environment is
76
76
  ```shell
77
77
  uvx oe-python-template hello-world # prints "Hello, world! [..]"
78
78
  uvx oe-python-template serve # serves webservice API
79
+ uvx oe-python-template serve --port=4711 # serves webservice API on port 4711
79
80
  ```
80
81
 
81
- When serving the 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 result.
82
-
83
- The API is versioned and provides interactive documentation at [http://127.0.0.1:8000/api/v1/docs](http://127.0.0.1:8000/api/v1/docs) resp. [http://127.0.0.1:8000/api/v2/docs](http://127.0.0.1:8000/api/v2/docs)
84
-
85
-
86
- ```shell
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.
85
+ * Interactive documentation is provided at [http://127.0.0.1:8000/api/docs](http://127.0.0.1:8000/api/docs)
87
86
 
88
- When running the webservice API, goto http://127.0.0.1:8000/api/v1/docs
89
87
 
90
88
  The CLI provides extensive help:
91
89
 
@@ -26,7 +26,7 @@ extensions = [
26
26
  project = "oe-python-template"
27
27
  author = "Helmut Hoffer von Ankershoffen"
28
28
  copyright = f" (c) 2025-{datetime.now(UTC).year}, {author}" # noqa: A001
29
- version = "0.4.2"
29
+ version = "0.4.4"
30
30
  release = version
31
31
  github_username = "helmut-hoffer-von-ankershoffen"
32
32
  github_repository = "oe-python-template"
@@ -0,0 +1,46 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "metadata": {},
7
+ "outputs": [
8
+ {
9
+ "name": "stdout",
10
+ "output_type": "stream",
11
+ "text": [
12
+ "Hello, world! The value of THE_VAR is not defined\n"
13
+ ]
14
+ }
15
+ ],
16
+ "source": [
17
+ "from oe_python_template import Service\n",
18
+ "\n",
19
+ "service = Service()\n",
20
+ "message = service.get_hello_world()\n",
21
+ "message"
22
+ ]
23
+ }
24
+ ],
25
+ "metadata": {
26
+ "kernelspec": {
27
+ "display_name": ".venv",
28
+ "language": "python",
29
+ "name": "python3"
30
+ },
31
+ "language_info": {
32
+ "codemirror_mode": {
33
+ "name": "ipython",
34
+ "version": 3
35
+ },
36
+ "file_extension": ".py",
37
+ "mimetype": "text/x-python",
38
+ "name": "python",
39
+ "nbconvert_exporter": "python",
40
+ "pygments_lexer": "ipython3",
41
+ "version": "3.11.6"
42
+ }
43
+ },
44
+ "nbformat": 4,
45
+ "nbformat_minor": 2
46
+ }
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "oe-python-template"
3
- version = "0.4.2"
3
+ version = "0.4.4"
4
4
  description = "🧠 Copier template to scaffold Python projects compliant with best practices and modern tooling."
5
5
  readme = "README.md"
6
6
  authors = [
@@ -245,7 +245,7 @@ source = ["src/"]
245
245
 
246
246
 
247
247
  [tool.bumpversion]
248
- current_version = "0.4.2"
248
+ current_version = "0.4.4"
249
249
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
250
250
  serialize = ["{major}.{minor}.{patch}"]
251
251
  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.4.2
3
+ sonar.projectVersion=0.4.4
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
@@ -8,6 +8,7 @@ This module provides a webservice API with several endpoints:
8
8
  The endpoints use Pydantic models for request and response validation.
9
9
  """
10
10
 
11
+ import os
11
12
  from collections.abc import Generator
12
13
  from enum import StrEnum
13
14
  from typing import Annotated
@@ -18,6 +19,8 @@ from pydantic import BaseModel, Field
18
19
  from oe_python_template import Service
19
20
 
20
21
  HELLO_WORLD_EXAMPLE = "Hello, world!"
22
+ UVICORN_HOST = os.environ.get("UVICORN_HOST", "127.0.0.1")
23
+ UVICORN_PORT = os.environ.get("UVICORN_PORT", "8000")
21
24
 
22
25
 
23
26
  def get_service() -> Generator[Service, None, None]:
@@ -47,12 +50,18 @@ api = FastAPI(
47
50
  {
48
51
  "name": "v1",
49
52
  "description": "API version 1, check link on the right",
50
- "externalDocs": {"description": "sub-docs", "url": "/api/v1/docs"},
53
+ "externalDocs": {
54
+ "description": "sub-docs",
55
+ "url": f"http://{UVICORN_HOST}:{UVICORN_PORT}/api/v1/docs",
56
+ },
51
57
  },
52
58
  {
53
59
  "name": "v2",
54
60
  "description": "API version 2, check link on the right",
55
- "externalDocs": {"description": "sub-docs", "url": "/api/v2/docs"},
61
+ "externalDocs": {
62
+ "description": "sub-docs",
63
+ "url": f"http://{UVICORN_HOST}:{UVICORN_PORT}/api/v2/docs",
64
+ },
56
65
  },
57
66
  ],
58
67
  )
@@ -1,5 +1,6 @@
1
1
  """CLI (Command Line Interface) of OE Python Template."""
2
2
 
3
+ import os
3
4
  from enum import StrEnum
4
5
  from typing import Annotated
5
6
 
@@ -49,6 +50,8 @@ def serve(
49
50
  ) -> None:
50
51
  """Start the API server."""
51
52
  console.print(f"Starting API server at http://{host}:{port}")
53
+ os.environ["UVICORN_HOST"] = host
54
+ os.environ["UVICORN_PORT"] = str(port)
52
55
  uvicorn.run(
53
56
  "oe_python_template.api:api",
54
57
  host=host,
@@ -30,4 +30,8 @@
30
30
 
31
31
  > [!TIP]
32
32
  > 📚 [Online documentation](https://{{ readthedocs_project_key}}.readthedocs.io/en/latest/) - 📖 [PDF Manual](https://{{ readthedocs_project_key }}.readthedocs.io/_/downloads/en/latest/pdf/)
33
+ {% if pypi_distribution_name != 'oe-python-template' %}
34
+ > [!NOTE]
35
+ > 🧠 This project was scaffolded using the template [oe-python-template](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template) with [copier](https://copier.readthedocs.io/).
36
+ {% endif %}
33
37
  ---
@@ -76,16 +76,14 @@ Executing the command line interface (CLI) in an isolated Python environment is
76
76
  ```shell
77
77
  uvx {{ pypi_distribution_name}} hello-world # prints "Hello, world! [..]"
78
78
  uvx {{ pypi_distribution_name}} serve # serves webservice API
79
+ uvx {{ pypi_distribution_name}} serve --port=4711 # serves webservice API on port 4711
79
80
  ```
80
81
 
81
- When serving the 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 result.
82
-
83
- The API is versioned and provides interactive documentation at [http://127.0.0.1:8000/api/v1/docs](http://127.0.0.1:8000/api/v1/docs) resp. [http://127.0.0.1:8000/api/v2/docs](http://127.0.0.1:8000/api/v2/docs)
84
-
85
-
86
- ```shell
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.
85
+ * Interactive documentation is provided at [http://127.0.0.1:8000/api/docs](http://127.0.0.1:8000/api/docs)
87
86
 
88
- When running the webservice API, goto http://127.0.0.1:8000/api/v1/docs
89
87
 
90
88
  The CLI provides extensive help:
91
89
 
@@ -75,11 +75,11 @@ html_static_path = ["_static"]
75
75
  html_logo = "../../logo.png"
76
76
  html_theme_options = {
77
77
  "announcement": (
78
- '<a target="_blank" href="{{ github_repository_url_https }}">GitHub</a> - ' # noqa: E501
79
- '<a target="_blank" href="https://pypi.org/project/{{ pypi_distribution_name }}">PyPI</a> - ' # noqa: E501
80
- '<a target="_blank" href="https://hub.docker.com/r/{{ docker_io_owner}}/{{ docker_io_image_name }}/tags">Docker</a> - ' # noqa: E501
78
+ '<a target="_blank" href="{{ github_repository_url_https }}">GitHub</a> - '
79
+ '<a target="_blank" href="https://pypi.org/project/{{ pypi_distribution_name }}">PyPI</a> - '
80
+ '<a target="_blank" href="https://hub.docker.com/r/{{ docker_io_owner}}/{{ docker_io_image_name }}/tags">Docker</a> - '
81
81
  '<a target="_blank" href="https://sonarcloud.io/summary/new_code?id={{ sonarqube_key }}">SonarQube</a> - ' # noqa: E501
82
- '<a target="_blank" href="https://app.codecov.io/gh/{{ github_repository_owner }}/{{ github_repository_name}}">Codecov</a>' # noqa: E501
82
+ '<a target="_blank" href="https://app.codecov.io/gh/{{ github_repository_owner }}/{{ github_repository_name}}">Codecov</a>'
83
83
  ),
84
84
  }
85
85
 
@@ -0,0 +1,46 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "metadata": {},
7
+ "outputs": [
8
+ {
9
+ "name": "stdout",
10
+ "output_type": "stream",
11
+ "text": [
12
+ "Hello, world! The value of THE_VAR is not defined\n"
13
+ ]
14
+ }
15
+ ],
16
+ "source": [
17
+ "from oe_python_template import Service\n",
18
+ "\n",
19
+ "service = Service()\n",
20
+ "message = service.get_hello_world()\n",
21
+ "message"
22
+ ]
23
+ }
24
+ ],
25
+ "metadata": {
26
+ "kernelspec": {
27
+ "display_name": ".venv",
28
+ "language": "python",
29
+ "name": "python3"
30
+ },
31
+ "language_info": {
32
+ "codemirror_mode": {
33
+ "name": "ipython",
34
+ "version": 3
35
+ },
36
+ "file_extension": ".py",
37
+ "mimetype": "text/x-python",
38
+ "name": "python",
39
+ "nbconvert_exporter": "python",
40
+ "pygments_lexer": "ipython3",
41
+ "version": "3.11.6"
42
+ }
43
+ },
44
+ "nbformat": 4,
45
+ "nbformat_minor": 2
46
+ }
@@ -6,6 +6,7 @@ This module creates a web interface using Streamlit to demonstrate the usage of
6
6
  """
7
7
 
8
8
  import streamlit as st
9
+
9
10
  from {{ project_name_snake_case }} import (
10
11
  Service,
11
12
  __version__,
@@ -46,10 +46,7 @@ def lint(session: nox.Session) -> None:
46
46
  "--check",
47
47
  ".",
48
48
  )
49
- session.run(
50
- "mypy",
51
- "src"
52
- )
49
+ session.run("mypy", "src")
53
50
 
54
51
 
55
52
  @nox.session(python=["3.13"])
@@ -128,14 +125,14 @@ def setup_dev(session: nox.Session) -> None:
128
125
  session.run("ruff", "format", ".", external=True)
129
126
  git_dir = Path(".git")
130
127
  if git_dir.is_dir():
131
- session.run("echo","found .git directory", external=True)
132
- session.run("touch",".act-env-secret", external=True)
128
+ session.run("echo", "found .git directory", external=True)
129
+ session.run("touch", ".act-env-secret", external=True)
133
130
  session.run("pre-commit", "install", external=True)
134
131
  with Path(".secrets.baseline").open("w", encoding="utf-8") as out:
135
132
  session.run("detect-secrets", "scan", stdout=out, external=True)
136
133
  session.run("git", "add", ".", external=True)
137
134
  try:
138
135
  session.run("pre-commit", external=True)
139
- except Exception: # noqa: BLE001
136
+ except Exception: # noqa: BLE001
140
137
  session.log("pre-commit run failed, continuing anyway")
141
138
  session.run("git", "add", ".", external=True)
@@ -5,12 +5,11 @@ from .constants import (
5
5
  __project_path__,
6
6
  __version__,
7
7
  )
8
-
9
8
  from .service import Service
10
9
 
11
10
  __all__ = [
11
+ "Service",
12
12
  "__project_name__",
13
13
  "__project_path__",
14
14
  "__version__",
15
- "Service",
16
15
  ]
@@ -8,6 +8,7 @@ This module provides a webservice API with several endpoints:
8
8
  The endpoints use Pydantic models for request and response validation.
9
9
  """
10
10
 
11
+ import os
11
12
  from collections.abc import Generator
12
13
  from enum import StrEnum
13
14
  from typing import Annotated
@@ -18,6 +19,8 @@ from pydantic import BaseModel, Field
18
19
  from {{ project_name_snake_case }} import Service
19
20
 
20
21
  HELLO_WORLD_EXAMPLE = "Hello, world!"
22
+ UVICORN_HOST = os.environ.get("UVICORN_HOST", "127.0.0.1")
23
+ UVICORN_PORT = os.environ.get("UVICORN_PORT", "8000")
21
24
 
22
25
 
23
26
  def get_service() -> Generator[Service, None, None]:
@@ -45,22 +48,22 @@ api = FastAPI(
45
48
  terms_of_service="https://{{ readthedocs_project_key }}.readthedocs.io/en/latest/",
46
49
  openapi_tags=[
47
50
  {
48
- 'name': 'v1',
51
+ "name": "v1",
49
52
  "description": "API version 1, check link on the right",
50
- 'externalDocs': {
51
- 'description': 'sub-docs',
52
- 'url': '/api/v1/docs'
53
- }
53
+ "externalDocs": {
54
+ "description": "sub-docs",
55
+ "url": f"http://{UVICORN_HOST}:{UVICORN_PORT}/api/v1/docs",
56
+ },
54
57
  },
55
58
  {
56
- 'name': 'v2',
59
+ "name": "v2",
57
60
  "description": "API version 2, check link on the right",
58
- 'externalDocs': {
59
- 'description': 'sub-docs',
60
- 'url': '/api/v2/docs'
61
- }
61
+ "externalDocs": {
62
+ "description": "sub-docs",
63
+ "url": f"http://{UVICORN_HOST}:{UVICORN_PORT}/api/v2/docs",
64
+ },
62
65
  },
63
- ]
66
+ ],
64
67
  )
65
68
 
66
69
  api_v1 = FastAPI(
@@ -85,6 +88,7 @@ api_v2 = FastAPI(
85
88
  terms_of_service="https://{{ readthedocs_project_key }}.readthedocs.io/en/latest/",
86
89
  )
87
90
 
91
+
88
92
  class _HealthStatus(StrEnum):
89
93
  """Health status enumeration.
90
94
 
@@ -1,5 +1,6 @@
1
1
  """CLI (Command Line Interface) of {{ project_name }}."""
2
2
 
3
+ import os
3
4
  from enum import StrEnum
4
5
  from typing import Annotated
5
6
 
@@ -49,6 +50,8 @@ def serve(
49
50
  ) -> None:
50
51
  """Start the API server."""
51
52
  console.print(f"Starting API server at http://{host}:{port}")
53
+ os.environ["UVICORN_HOST"] = host
54
+ os.environ["UVICORN_PORT"] = str(port)
52
55
  uvicorn.run(
53
56
  "{{ project_name_snake_case }}.api:api",
54
57
  host=host,
@@ -43,6 +43,7 @@ def test_hello_world_endpoint(client: TestClient) -> None:
43
43
  assert response.status_code == 200
44
44
  assert response.json()["message"].startswith("Hello, world!")
45
45
 
46
+
46
47
  def test_echo_endpoint_valid_input(client: TestClient) -> None:
47
48
  """Test that the echo endpoint returns the input text."""
48
49
  test_text = "Test message"
@@ -96,6 +97,7 @@ def test_health_endpoint(client: TestClient) -> None:
96
97
  assert response.json()["status"] == "UP"
97
98
  assert response.json()["reason"] is None
98
99
 
100
+
99
101
  @patch("{{ project_name_snake_case }}.api.Service")
100
102
  def test_health_endpoint_down(mock_service, client: TestClient) -> None:
101
103
  """Test that the health endpoint returns 500 status when service is unhealthy."""
@@ -2075,7 +2075,7 @@ wheels = [
2075
2075
 
2076
2076
  [[package]]
2077
2077
  name = "oe-python-template"
2078
- version = "0.4.2"
2078
+ version = "0.4.4"
2079
2079
  source = { editable = "." }
2080
2080
  dependencies = [
2081
2081
  { name = "fastapi", extra = ["all", "standard"] },
@@ -1,8 +0,0 @@
1
- ## [0.4.2](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/compare/v0.4.1..v0.4.2) - 2025-03-13
2
-
3
- ### 🐛 Bug Fixes
4
-
5
- - *(docs)* Hardcoded command - ([d98e6fd](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/commit/d98e6fde86fff01083b52e806295343fb5b5d828))
6
-
7
-
8
-
@@ -1 +0,0 @@
1
- 0.4.2
@@ -1,46 +0,0 @@
1
- {
2
- "cells": [
3
- {
4
- "cell_type": "code",
5
- "execution_count": 1,
6
- "metadata": {},
7
- "outputs": [
8
- {
9
- "name": "stdout",
10
- "output_type": "stream",
11
- "text": [
12
- "Hello, world! The value of THE_VAR is not defined\n"
13
- ]
14
- }
15
- ],
16
- "source": [
17
- "from oe_python_template import Service\n",
18
- "\n",
19
- "service = Service()\n",
20
- "message = service.get_hello_world()\n",
21
- "message"
22
- ]
23
- }
24
- ],
25
- "metadata": {
26
- "kernelspec": {
27
- "display_name": ".venv",
28
- "language": "python",
29
- "name": "python3"
30
- },
31
- "language_info": {
32
- "codemirror_mode": {
33
- "name": "ipython",
34
- "version": 3
35
- },
36
- "file_extension": ".py",
37
- "mimetype": "text/x-python",
38
- "name": "python",
39
- "nbconvert_exporter": "python",
40
- "pygments_lexer": "ipython3",
41
- "version": "3.11.6"
42
- }
43
- },
44
- "nbformat": 4,
45
- "nbformat_minor": 2
46
- }
@@ -1,46 +0,0 @@
1
- {
2
- "cells": [
3
- {
4
- "cell_type": "code",
5
- "execution_count": 1,
6
- "metadata": {},
7
- "outputs": [
8
- {
9
- "name": "stdout",
10
- "output_type": "stream",
11
- "text": [
12
- "Hello, world! The value of THE_VAR is not defined\n"
13
- ]
14
- }
15
- ],
16
- "source": [
17
- "from oe_python_template import Service\n",
18
- "\n",
19
- "service = Service()\n",
20
- "message = service.get_hello_world()\n",
21
- "message"
22
- ]
23
- }
24
- ],
25
- "metadata": {
26
- "kernelspec": {
27
- "display_name": ".venv",
28
- "language": "python",
29
- "name": "python3"
30
- },
31
- "language_info": {
32
- "codemirror_mode": {
33
- "name": "ipython",
34
- "version": 3
35
- },
36
- "file_extension": ".py",
37
- "mimetype": "text/x-python",
38
- "name": "python",
39
- "nbconvert_exporter": "python",
40
- "pygments_lexer": "ipython3",
41
- "version": "3.11.6"
42
- }
43
- },
44
- "nbformat": 4,
45
- "nbformat_minor": 2
46
- }