oe-python-template-example 0.2.3__tar.gz → 0.2.5__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 (98) hide show
  1. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/.copier-answers.yml +1 -1
  2. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/.github/workflows/codeql.yml +1 -1
  3. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/.github/workflows/docker-image-build-publish.yml +8 -8
  4. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/.github/workflows/package-build-publish-release.yml +4 -4
  5. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/.github/workflows/test-and-report.yml +8 -8
  6. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/CONTRIBUTING.md +9 -9
  7. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/PKG-INFO +1 -1
  8. oe_python_template_example-0.2.5/VERSION +1 -0
  9. oe_python_template_example-0.2.5/docs/source/_static/openapi_v1.yaml +204 -0
  10. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/docs/source/_static/openapi_v2.yaml +32 -16
  11. oe_python_template_example-0.2.5/docs/source/api_v1.rst +9 -0
  12. oe_python_template_example-0.2.5/docs/source/api_v2.rst +9 -0
  13. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/docs/source/conf.py +1 -1
  14. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/examples/notebook.py +1 -1
  15. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/noxfile.py +28 -2
  16. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/pyproject.toml +2 -2
  17. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/sonar-project.properties +1 -1
  18. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/uv.lock +1 -1
  19. oe_python_template_example-0.2.3/VERSION +0 -1
  20. oe_python_template_example-0.2.3/docs/source/_static/openapi_v1.yaml +0 -14
  21. oe_python_template_example-0.2.3/docs/source/api_v1.rst +0 -15
  22. oe_python_template_example-0.2.3/docs/source/api_v2.rst +0 -15
  23. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/.act-env-public +0 -0
  24. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/.devcontainer/Dockerfile +0 -0
  25. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/.devcontainer/devcontainer.json +0 -0
  26. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/.devcontainer/onCreateCommand +0 -0
  27. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/.devcontainer/postAttachCommand +0 -0
  28. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/.devcontainer/postCreateCommand +0 -0
  29. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/.env.example +0 -0
  30. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/.github/copilot-instructions.md +0 -0
  31. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/.github/dependabot.yml +0 -0
  32. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/.gitignore +0 -0
  33. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/.pre-commit-config.yaml +0 -0
  34. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/.python-version +0 -0
  35. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/.readthedocs.yml +0 -0
  36. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/.secrets.baseline +0 -0
  37. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/.vscode/extensions.json +0 -0
  38. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/.vscode/settings.json +0 -0
  39. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/CHANGELOG.md +0 -0
  40. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/CODEOWNERS +0 -0
  41. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/CODE_STYLE.md +0 -0
  42. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/Dockerfile +0 -0
  43. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/LICENSE +0 -0
  44. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/README.md +0 -0
  45. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/RELEASE_NOTES.md +0 -0
  46. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/SECURITY.md +0 -0
  47. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/SERVICE_CONNECTIONS.md +0 -0
  48. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/bin/git-cliff +0 -0
  49. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/codecov.yml +0 -0
  50. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/compose.yaml +0 -0
  51. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/docs/Makefile +0 -0
  52. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/docs/make.bat +0 -0
  53. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/docs/partials/README_footer.md +0 -0
  54. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/docs/partials/README_header.md +0 -0
  55. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/docs/partials/README_main.md +0 -0
  56. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/docs/source/_static/.keep +0 -0
  57. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/docs/source/_static/openapi.json +0 -0
  58. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/docs/source/_static/openapi.yaml +0 -0
  59. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/docs/source/_static/openapi_v1.json +0 -0
  60. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/docs/source/_static/openapi_v2.json +0 -0
  61. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/docs/source/code-style.rst +0 -0
  62. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/docs/source/contributing.rst +0 -0
  63. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/docs/source/index.rst +0 -0
  64. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/docs/source/main.rst +0 -0
  65. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/docs/source/reference.rst +0 -0
  66. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/docs/source/release-notes.rst +0 -0
  67. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/docs/source/security.rst +0 -0
  68. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/examples/__init__.py +0 -0
  69. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/examples/notebook.ipynb +0 -0
  70. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/examples/script.py +0 -0
  71. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/examples/streamlit.py +0 -0
  72. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/git-cliff-2.7.0/CHANGELOG.md +0 -0
  73. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/git-cliff-2.7.0/LICENSE-APACHE +0 -0
  74. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/git-cliff-2.7.0/LICENSE-MIT +0 -0
  75. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/git-cliff-2.7.0/README.md +0 -0
  76. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/git-cliff-2.7.0/completions/_git-cliff +0 -0
  77. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/git-cliff-2.7.0/completions/_git-cliff.ps1 +0 -0
  78. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/git-cliff-2.7.0/completions/git-cliff.bash +0 -0
  79. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/git-cliff-2.7.0/completions/git-cliff.elv +0 -0
  80. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/git-cliff-2.7.0/completions/git-cliff.fish +0 -0
  81. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/git-cliff-2.7.0/git-cliff-completions +0 -0
  82. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/git-cliff-2.7.0/git-cliff-mangen +0 -0
  83. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/git-cliff-2.7.0/man/git-cliff.1 +0 -0
  84. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/git-cliff-2.7.0-x86_64-unknown-linux-gnu.tar.gz +0 -0
  85. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/github-action-run +0 -0
  86. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/logo.png +0 -0
  87. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/n +0 -0
  88. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/renovate.json +0 -0
  89. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/reports/.keep +0 -0
  90. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/src/oe_python_template_example/__init__.py +0 -0
  91. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/src/oe_python_template_example/api.py +0 -0
  92. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/src/oe_python_template_example/cli.py +0 -0
  93. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/src/oe_python_template_example/constants.py +0 -0
  94. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/src/oe_python_template_example/service.py +0 -0
  95. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/tests/__init__.py +0 -0
  96. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/tests/api_test.py +0 -0
  97. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/tests/cli_test.py +0 -0
  98. {oe_python_template_example-0.2.3 → oe_python_template_example-0.2.5}/tests/fixtures/.keep +0 -0
@@ -1,4 +1,4 @@
1
- _commit: v0.6.15
1
+ _commit: v0.6.21
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
@@ -76,7 +76,7 @@ jobs:
76
76
  # Prefix the list here with "+" to use these queries and those in the config file.
77
77
 
78
78
  # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
79
- # queries: security-extended,security-and-quality
79
+ queries: security-extended,security-and-quality
80
80
 
81
81
  # If the analyze step fails for one of the languages you are analyzing with
82
82
  # "We were unable to automatically build your code", modify the matrix above
@@ -21,18 +21,18 @@ jobs:
21
21
  id-token: write
22
22
  steps:
23
23
  - name: Checkout
24
- uses: actions/checkout@v4
24
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
25
25
 
26
26
  - name: Set up QEMU
27
- uses: docker/setup-qemu-action@v3
27
+ uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0
28
28
 
29
29
  - name: Set up Docker Buildx
30
- uses: docker/setup-buildx-action@v3
30
+ uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3.10.0
31
31
 
32
32
 
33
33
 
34
34
  - name: Log in to Docker Hub
35
- uses: docker/login-action@v3
35
+ uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
36
36
  with:
37
37
 
38
38
  username: ${{ secrets.DOCKER_USERNAME }}
@@ -41,7 +41,7 @@ jobs:
41
41
 
42
42
 
43
43
  - name: Log in to GitHub container registry
44
- uses: docker/login-action@v3
44
+ uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
45
45
  with:
46
46
  registry: ghcr.io
47
47
 
@@ -51,7 +51,7 @@ jobs:
51
51
 
52
52
  - name: Extract metadata (tags, labels) for Docker
53
53
  id: meta
54
- uses: docker/metadata-action@v5
54
+ uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0
55
55
  with:
56
56
 
57
57
 
@@ -73,7 +73,7 @@ jobs:
73
73
 
74
74
  - name: Build and push Docker image
75
75
  id: push
76
- uses: docker/build-push-action@v6
76
+ uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0
77
77
  with:
78
78
  context: .
79
79
  file: ./Dockerfile
@@ -86,7 +86,7 @@ jobs:
86
86
 
87
87
 
88
88
  - name: Generate artifact attestation
89
- uses: actions/attest-build-provenance@v2
89
+ uses: actions/attest-build-provenance@c074443f1aee8d4aeeae555aebba3282517141b2 # v2.2.3
90
90
  with:
91
91
  subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
92
92
  subject-digest: ${{ steps.push.outputs.digest }}
@@ -15,12 +15,12 @@ jobs:
15
15
  packages: read
16
16
  steps:
17
17
  - name: Checkout
18
- uses: actions/checkout@v4
18
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
19
19
  with:
20
20
  fetch-depth: 0
21
21
 
22
22
  - name: Generate release notes
23
- uses: orhun/git-cliff-action@v4
23
+ uses: orhun/git-cliff-action@4a4a951bc43fafe41cd2348d181853f52356bee7 # v4.4.2
24
24
  id: git-cliff
25
25
  with:
26
26
  config: pyproject.toml
@@ -34,9 +34,9 @@ jobs:
34
34
 
35
35
 
36
36
  - name: Install uv
37
- uses: astral-sh/setup-uv@v5
37
+ uses: astral-sh/setup-uv@f94ec6bedd8674c4426838e6b50417d36b6ab231 # v5.3.1
38
38
  with:
39
- version: "0.5.9"
39
+ version: "0.6.3"
40
40
  cache-dependency-glob: uv.lock
41
41
  enable-cache: true
42
42
 
@@ -17,7 +17,7 @@ jobs:
17
17
  id-token: write
18
18
  steps:
19
19
  - name: Checkout
20
- uses: actions/checkout@v4
20
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
21
21
  with:
22
22
  fetch-depth: 0
23
23
 
@@ -30,9 +30,9 @@ jobs:
30
30
  sudo apt-get install -y curl jq xsltproc gnupg2 libcairo2
31
31
 
32
32
  - name: Install uv (python package manager)
33
- uses: astral-sh/setup-uv@v5
33
+ uses: astral-sh/setup-uv@f94ec6bedd8674c4426838e6b50417d36b6ab231 # v5.3.1
34
34
  with:
35
- version: "0.5.9"
35
+ version: "0.6.3"
36
36
  enable-cache: true
37
37
  cache-dependency-glob: uv.lock
38
38
 
@@ -58,7 +58,7 @@ jobs:
58
58
  echo "Development build - Current version in pyproject.toml: $TOML_VERSION"
59
59
 
60
60
  - name: Create .env file
61
- uses: SpicyPizza/create-envfile@v2.0
61
+ uses: SpicyPizza/create-envfile@ace6d4f5d7802b600276c23ca417e669f1a06f6f # v2.0.3
62
62
  with:
63
63
  envkey_ENV_KEY: "ENV_VALUE"
64
64
  fail_on_empty: true
@@ -80,7 +80,7 @@ jobs:
80
80
  uv run nox
81
81
 
82
82
  - name: Upload test results
83
- uses: actions/upload-artifact@v4
83
+ uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1
84
84
  if: ${{ always() && (env.GITHUB_WORKFLOW_RUNTIME != 'ACT') }}
85
85
  with:
86
86
  name: test-results
@@ -94,7 +94,7 @@ jobs:
94
94
  retention-days: 30
95
95
 
96
96
  - name: Upload coverage reports to Codecov
97
- uses: codecov/codecov-action@v5
97
+ uses: codecov/codecov-action@0565863a31f2c772f9f0395002a31e3f06189574 # v5.4.0
98
98
  if: ${{ !cancelled() && (env.GITHUB_WORKFLOW_RUNTIME != 'ACT') }}
99
99
  with:
100
100
  token: ${{ secrets.CODECOV_TOKEN }}
@@ -102,12 +102,12 @@ jobs:
102
102
 
103
103
  - name: Upload test results to Codecov
104
104
  if: ${{ !cancelled() && (env.GITHUB_WORKFLOW_RUNTIME != 'ACT') }}
105
- uses: codecov/test-results-action@v1
105
+ uses: codecov/test-results-action@f2dba722c67b86c6caa034178c6e4d35335f6706 # v1.1.0
106
106
  with:
107
107
  token: ${{ secrets.CODECOV_TOKEN }}
108
108
  - name: SonarQube Scan
109
109
  if: ${{ !cancelled() && (env.GITHUB_WORKFLOW_RUNTIME != 'ACT') }}
110
- uses: SonarSource/sonarqube-scan-action@v5
110
+ uses: SonarSource/sonarqube-scan-action@0303d6b62e310685c0e34d0b9cde218036885c4d # v5.0.0
111
111
  env:
112
112
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
113
113
  SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
@@ -20,6 +20,7 @@ fi
20
20
  which jq &> /dev/null || brew install jq
21
21
  which xmllint &> /dev/null || brew install xmllint
22
22
  which act &> /dev/null || brew install act
23
+ which pinact &> /dev/null || brew install pinact
23
24
  uv run pre-commit install # install pre-commit hooks, see https://pre-commit.com/
24
25
  ```
25
26
 
@@ -88,9 +89,10 @@ uv run nox -s test # run tests
88
89
  uv run nox -s lint # run formatting and linting
89
90
  uv run nox -s audit # run security and license audit, inc. sbom generation
90
91
  uv run nox -s docs # build documentation, output in docs/build/html
92
+ uv run nox -s docs_pdf # locally build pdf manual to docs/build/latex/oe-python-template-example.pdf
91
93
  ```
92
94
 
93
- As a shortcut, you can run build steps using `./n`:
95
+ As a shortcut, you can run build steps using `./n`, e.g.
94
96
 
95
97
  ```shell
96
98
  ./n test
@@ -129,22 +131,20 @@ docker build -t oe-python-template-example .
129
131
  docker run --env THE_VAR=THE_VALUE oe-python-template-example --help
130
132
  ```
131
133
 
132
- ### Copier
133
-
134
- Update from template
134
+ ### Pinning github actions
135
135
 
136
136
  ```shell
137
- uv run nox -s update_from_template
137
+ pinact run # See https://dev.to/suzukishunsuke/pin-github-actions-to-a-full-length-commit-sha-for-security-2n7p
138
138
  ```
139
139
 
140
- ### Generate PDF manual
140
+ ### Copier
141
+
142
+ Update from template
141
143
 
142
144
  ```shell
143
- brew install mactex # install MacTeX, will take a while and requires sudo
144
- ./n docs_pdf # build latex, then generate pdf from it. Output in docs/build/latex/oe-python-template-example.pdf
145
+ uv run nox -s update_from_template
145
146
  ```
146
147
 
147
-
148
148
  ## Pull Request Guidelines
149
149
 
150
150
  - Before starting to write code read the [code style guide](CODE_STYLE.md) document for mandatory coding style
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: oe-python-template-example
3
- Version: 0.2.3
3
+ Version: 0.2.5
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/
@@ -0,0 +1 @@
1
+ 0.2.5
@@ -0,0 +1,204 @@
1
+ components:
2
+ schemas:
3
+ EchoRequest:
4
+ description: Request model for echo endpoint.
5
+ properties:
6
+ text:
7
+ description: The text to echo back
8
+ examples:
9
+ - Hello, world!
10
+ minLength: 1
11
+ title: Text
12
+ type: string
13
+ required:
14
+ - text
15
+ title: EchoRequest
16
+ type: object
17
+ EchoResponse:
18
+ description: Response model for echo endpoint.
19
+ properties:
20
+ message:
21
+ description: The message content
22
+ examples:
23
+ - Hello, world!
24
+ minLength: 1
25
+ title: Message
26
+ type: string
27
+ required:
28
+ - message
29
+ title: EchoResponse
30
+ type: object
31
+ HTTPValidationError:
32
+ properties:
33
+ detail:
34
+ items:
35
+ $ref: '#/components/schemas/ValidationError'
36
+ title: Detail
37
+ type: array
38
+ title: HTTPValidationError
39
+ type: object
40
+ Health:
41
+ description: Health status model.
42
+ properties:
43
+ reason:
44
+ anyOf:
45
+ - type: string
46
+ - type: 'null'
47
+ title: Reason
48
+ status:
49
+ $ref: '#/components/schemas/_HealthStatus'
50
+ required:
51
+ - status
52
+ title: Health
53
+ type: object
54
+ HelloWorldResponse:
55
+ description: Response model for hello-world endpoint.
56
+ properties:
57
+ message:
58
+ description: The hello world message
59
+ examples:
60
+ - Hello, world!
61
+ title: Message
62
+ type: string
63
+ required:
64
+ - message
65
+ title: HelloWorldResponse
66
+ type: object
67
+ ValidationError:
68
+ properties:
69
+ loc:
70
+ items:
71
+ anyOf:
72
+ - type: string
73
+ - type: integer
74
+ title: Location
75
+ type: array
76
+ msg:
77
+ title: Message
78
+ type: string
79
+ type:
80
+ title: Error Type
81
+ type: string
82
+ required:
83
+ - loc
84
+ - msg
85
+ - type
86
+ title: ValidationError
87
+ type: object
88
+ _HealthStatus:
89
+ description: Health status enumeration.
90
+ enum:
91
+ - UP
92
+ - DOWN
93
+ title: _HealthStatus
94
+ type: string
95
+ info:
96
+ contact:
97
+ email: helmuthva@gmail.com
98
+ name: Helmut Hoffer von Ankershoffen
99
+ url: https://github.com/helmut-hoffer-von-ankershoffen
100
+ termsOfService: https://oe-python-template-example.readthedocs.io/en/latest/
101
+ title: OE Python Template Example
102
+ version: 1.0.0
103
+ openapi: 3.1.0
104
+ paths:
105
+ /echo:
106
+ post:
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\
113
+ \ Entity: If text is not provided or empty."
114
+ operationId: echo_echo_post
115
+ requestBody:
116
+ content:
117
+ application/json:
118
+ schema:
119
+ $ref: '#/components/schemas/EchoRequest'
120
+ required: true
121
+ responses:
122
+ '200':
123
+ content:
124
+ application/json:
125
+ schema:
126
+ $ref: '#/components/schemas/EchoResponse'
127
+ description: Successful Response
128
+ '422':
129
+ content:
130
+ application/json:
131
+ schema:
132
+ $ref: '#/components/schemas/HTTPValidationError'
133
+ description: Validation Error
134
+ summary: Echo
135
+ tags:
136
+ - Basics
137
+ /health:
138
+ get:
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:\
151
+ \ The health status of the service."
152
+ operationId: health_health_get
153
+ responses:
154
+ '200':
155
+ content:
156
+ application/json:
157
+ schema:
158
+ $ref: '#/components/schemas/Health'
159
+ description: Successful Response
160
+ summary: Health
161
+ tags:
162
+ - Observability
163
+ /healthz:
164
+ get:
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:\
177
+ \ The health status of the service."
178
+ operationId: health_healthz_get
179
+ responses:
180
+ '200':
181
+ content:
182
+ application/json:
183
+ schema:
184
+ $ref: '#/components/schemas/Health'
185
+ description: Successful Response
186
+ summary: Health
187
+ tags:
188
+ - Observability
189
+ /hello-world:
190
+ get:
191
+ description: "Return a hello world message.\n\nReturns:\n
192
+ HelloWorldResponse:\
193
+ \ A response containing the hello world message."
194
+ operationId: hello_world_hello_world_get
195
+ responses:
196
+ '200':
197
+ content:
198
+ application/json:
199
+ schema:
200
+ $ref: '#/components/schemas/HelloWorldResponse'
201
+ description: Successful Response
202
+ summary: Hello World
203
+ tags:
204
+ - Basics
@@ -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:
@@ -0,0 +1,9 @@
1
+ API V1
2
+ ======
3
+
4
+ .. only:: html
5
+
6
+ .. swagger-plugin:: _static/openapi_v1.yaml
7
+ :full-page:
8
+
9
+ Visit the `Interactive API Documentation <https: //oe-python-template-example.readthedocs.io/en/latest/api_v1.html>`_
@@ -0,0 +1,9 @@
1
+ API V2
2
+ ======
3
+
4
+ .. only:: html
5
+
6
+ .. swagger-plugin:: _static/openapi_v2.yaml
7
+ :full-page:
8
+
9
+ Visit the `Interactive API Documentation <https://oe-python-template-example.readthedocs.io/en/latest/api_v2.html>`_
@@ -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.2.3"
32
+ version = "0.2.5"
33
33
  release = version
34
34
  github_username = "helmut-hoffer-von-ankershoffen"
35
35
  github_repository = "oe-python-template-example"
@@ -10,7 +10,7 @@ def _():
10
10
 
11
11
  service = Service()
12
12
  message = service.get_hello_world()
13
- message # type: ignore
13
+ print(message)
14
14
  return Service, message, service
15
15
 
16
16
 
@@ -7,11 +7,13 @@ from pathlib import Path
7
7
 
8
8
  import nox
9
9
  import tomli
10
+ from nox.command import CommandFailed
10
11
 
11
12
  nox.options.reuse_existing_virtualenvs = True
12
13
  nox.options.default_venv_backend = "uv"
13
14
 
14
15
  NOT_SKIP_WITH_ACT = "not skip_with_act"
16
+ LATEXMK_VERSION_MIN = 4.86
15
17
 
16
18
 
17
19
  def _setup_venv(session: nox.Session, all_extras: bool = True) -> None:
@@ -84,9 +86,33 @@ def docs(session: nox.Session) -> None:
84
86
 
85
87
  @nox.session(python=["3.13"], default=False)
86
88
  def docs_pdf(session: nox.Session) -> None:
87
- """Setup dev environment post project creation."""
89
+ """Setup dev environment post project creation.""" # noqa: DOC501
88
90
  _setup_venv(session)
89
- session.run("make", "-C", "docs", "latexpdf", external=True)
91
+ try:
92
+ out = session.run("latexmk", "--version", external=True, silent=True)
93
+
94
+ version_match = re.search(r"Version (\d+\.\d+\w*)", str(out))
95
+ if not version_match:
96
+ session.error("Could not determine latexmk version")
97
+
98
+ version_str = version_match.group(1)
99
+
100
+ # Parse version (handle cases like "4.86a")
101
+ match = re.match(r"(\d+\.\d+)", version_str)
102
+ if not match:
103
+ session.error(f"Could not parse version number from '{version_str}'")
104
+ base_version = match.group(1)
105
+
106
+ if float(base_version) < LATEXMK_VERSION_MIN:
107
+ message = f"latexmk version {version_str} is outdated. Please run 'brew upgrade mactex' to upgrade."
108
+ raise ValueError(message) # noqa: TRY301
109
+ session.log(f"latexmk version {version_str} is sufficient")
110
+ session.run("make", "-C", "docs", "latexpdf", external=True)
111
+
112
+ except CommandFailed as e:
113
+ session.error(f"latexmk is not installed or not in PATH: {e}. Please run 'brew install mactex' to install")
114
+ except (ValueError, AttributeError) as e:
115
+ session.error(f"Failed to parse latexmk version information: {e}")
90
116
 
91
117
 
92
118
  @nox.session(python=["3.13"])
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "oe-python-template-example"
3
- version = "0.2.3"
3
+ version = "0.2.5"
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 = [
@@ -242,7 +242,7 @@ source = ["src/"]
242
242
 
243
243
 
244
244
  [tool.bumpversion]
245
- current_version = "0.2.3"
245
+ current_version = "0.2.5"
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.2.3
3
+ sonar.projectVersion=0.2.5
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
@@ -2075,7 +2075,7 @@ wheels = [
2075
2075
 
2076
2076
  [[package]]
2077
2077
  name = "oe-python-template-example"
2078
- version = "0.2.3"
2078
+ version = "0.2.5"
2079
2079
  source = { editable = "." }
2080
2080
  dependencies = [
2081
2081
  { name = "fastapi", extra = ["all", "standard"] },
@@ -1 +0,0 @@
1
- 0.2.3
@@ -1,14 +0,0 @@
1
- Traceback (most recent call last):
2
- File "/Users/helmut/Code/oe-python-template-example/.nox/docs-3-13/bin/oe-python-template-example", line 4, in <module>
3
- from oe_python_template_example.cli import cli
4
- File "/Users/helmut/Code/oe-python-template-example/src/oe_python_template_example/cli.py", line 9, in <module>
5
- import yaml
6
- File "/Users/helmut/Code/oe-python-template-example/.nox/docs-3-13/lib/python3.13/site-packages/yaml/__init__.py", line 8, in <module>
7
- from .loader import *
8
- File "/Users/helmut/Code/oe-python-template-example/.nox/docs-3-13/lib/python3.13/site-packages/yaml/loader.py", line 8, in <module>
9
- from .constructor import *
10
- File "/Users/helmut/Code/oe-python-template-example/.nox/docs-3-13/lib/python3.13/site-packages/yaml/constructor.py", line 19, in <module>
11
- class BaseConstructor:
12
- ...<149 lines>...
13
- cls.yaml_multi_constructors[tag_prefix] = multi_constructor
14
- KeyboardInterrupt
@@ -1,15 +0,0 @@
1
- API V1
2
- ======
3
-
4
- .. only:: html
5
-
6
- .. swagger-plugin:: _static/openapi_v1.yaml
7
- :full-page:
8
-
9
- .. only:: singlehtml
10
-
11
- Visit the `Interactive API Documentation <https://oe-python-template-example.readthedocs.io/en/latest/api_v1.html>`_
12
-
13
- .. only:: latex
14
-
15
- Visit the `Interactive API Documentation <https://oe-python-template-example.readthedocs.io/en/latest/api_v1.html>`_
@@ -1,15 +0,0 @@
1
- API V2
2
- ======
3
-
4
- .. only:: html
5
-
6
- .. swagger-plugin:: _static/openapi_v2.yaml
7
- :full-page:
8
-
9
- .. only:: singlehtml
10
-
11
- Visit the `Interactive API Documentation <https://oe-python-template-example.readthedocs.io/en/latest/api_v2.html>`_
12
-
13
- .. only:: latex
14
-
15
- Visit the `Interactive API Documentation <https://oe-python-template-example.readthedocs.io/en/latest/api_v2.html>`_