oe-python-template-example 0.1.12__tar.gz → 0.1.14__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/.copier-answers.yml +1 -1
- oe_python_template_example-0.1.14/.coverage +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/.github/workflows/package-build-publish-release.yml +1 -1
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/.gitignore +4 -10
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/CHANGELOG.md +7 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/CONTRIBUTING.md +20 -8
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/PKG-INFO +65 -86
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/README.md +64 -85
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/SECURITY.md +3 -3
- oe_python_template_example-0.1.14/VERSION +1 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/_readme_header.md +3 -2
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/_readme_main.md +61 -83
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/docs/source/conf.py +1 -1
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/docs/source/index.rst +2 -1
- oe_python_template_example-0.1.14/docs/source/security.rst +1 -0
- oe_python_template_example-0.1.14/n +27 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/noxfile.py +75 -18
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/pyproject.toml +5 -5
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/sonar-project.properties +1 -1
- oe_python_template_example-0.1.14/tests/fixtures/.keep +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/uv.lock +1 -1
- oe_python_template_example-0.1.12/VERSION +0 -1
- oe_python_template_example-0.1.12/bump +0 -7
- oe_python_template_example-0.1.12/docs/source/latexmkrc +0 -11
- oe_python_template_example-0.1.12/latexmkrc +0 -11
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/.act-env-public +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/.devcontainer/Dockerfile +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/.devcontainer/devcontainer.json +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/.devcontainer/onCreateCommand +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/.devcontainer/postAttachCommand +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/.devcontainer/postCreateCommand +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/.env.example +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/.github/dependabot.yml +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/.github/workflows/codeql.yml +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/.github/workflows/docker-image-build-publish.yml +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/.github/workflows/test-and-report.yml +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/.pre-commit-config.yaml +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/.python-version +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/.readthedocs.yml +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/.secrets.baseline +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/.vscode/extensions.json +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/.vscode/settings.json +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/CODEOWNERS +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/Dockerfile +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/LICENSE +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/RELEASE_NOTES.md +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/SERVICE_CONNECTIONS.md +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/_readme_footer.md +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/bin/git-cliff +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/codecov.yml +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/compose.yaml +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/docs/Makefile +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/docs/make.bat +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/docs/source/_static/.keep +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/docs/source/_static/openapi.json +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/docs/source/_static/openapi.yaml +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/docs/source/_static/openapi_v1.json +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/docs/source/_static/openapi_v1.yaml +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/docs/source/_static/openapi_v2.json +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/docs/source/_static/openapi_v2.yaml +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/docs/source/api_v1.rst +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/docs/source/api_v2.rst +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/docs/source/contributing.rst +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/docs/source/main.rst +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/docs/source/reference.rst +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/docs/source/release-notes.rst +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/examples/__init__.py +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/examples/notebook.ipynb +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/examples/notebook.py +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/examples/script.py +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/examples/streamlit.py +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/git-cliff-2.7.0/CHANGELOG.md +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/git-cliff-2.7.0/LICENSE-APACHE +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/git-cliff-2.7.0/LICENSE-MIT +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/git-cliff-2.7.0/README.md +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/git-cliff-2.7.0/completions/_git-cliff +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/git-cliff-2.7.0/completions/_git-cliff.ps1 +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/git-cliff-2.7.0/completions/git-cliff.bash +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/git-cliff-2.7.0/completions/git-cliff.elv +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/git-cliff-2.7.0/completions/git-cliff.fish +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/git-cliff-2.7.0/git-cliff-completions +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/git-cliff-2.7.0/git-cliff-mangen +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/git-cliff-2.7.0/man/git-cliff.1 +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/git-cliff-2.7.0-x86_64-unknown-linux-gnu.tar.gz +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/github-action-run +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/logo.png +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/renovate.json +0 -0
- {oe_python_template_example-0.1.12/tests/fixtures → oe_python_template_example-0.1.14/reports}/.keep +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/src/oe_python_template_example/__init__.py +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/src/oe_python_template_example/api.py +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/src/oe_python_template_example/cli.py +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/src/oe_python_template_example/constants.py +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/src/oe_python_template_example/service.py +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/tests/__init__.py +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/tests/api_test.py +0 -0
- {oe_python_template_example-0.1.12 → oe_python_template_example-0.1.14}/tests/cli_test.py +0 -0
Binary file
|
@@ -53,7 +53,7 @@ jobs:
|
|
53
53
|
env:
|
54
54
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
55
55
|
run: |
|
56
|
-
gh release create ${{ github.ref_name }} ./dist/*
|
56
|
+
gh release create ${{ github.ref_name }} ./dist/* ./reports/* --notes-file ${{ steps.git-cliff.outputs.changelog }}
|
57
57
|
|
58
58
|
- name: Allow other workflows to trigger on release
|
59
59
|
env:
|
@@ -43,16 +43,10 @@ develop-eggs/
|
|
43
43
|
.mypy_cache/
|
44
44
|
|
45
45
|
|
46
|
-
# Build
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
coverage_html/
|
51
|
-
vulnerabilities.json
|
52
|
-
licenses.json
|
53
|
-
licenses-inverted.json
|
54
|
-
sbom.json
|
55
|
-
mypi_junit.xml
|
46
|
+
# Build Report
|
47
|
+
reports/*
|
48
|
+
!reports/.keep
|
49
|
+
!reports/README.md
|
56
50
|
|
57
51
|
# IDE
|
58
52
|
.idea/
|
@@ -1,5 +1,12 @@
|
|
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..v0.1.13) - 2025-03-14
|
4
|
+
|
5
|
+
### 📚 Documentation
|
6
|
+
|
7
|
+
- Adapt - ([6e99c1d](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/commit/6e99c1d604c8e9fe4094b6a21d95619181ea0d14))
|
8
|
+
|
9
|
+
|
3
10
|
## [0.1.7](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/compare/v0.1.6..v0.1.7) - 2025-03-14
|
4
11
|
|
5
12
|
### Deps
|
@@ -90,10 +90,28 @@ uv run nox -s audit # run security and license audit, inc. sbom generation
|
|
90
90
|
uv run nox -s docs # build documentation, output in docs/build/html
|
91
91
|
```
|
92
92
|
|
93
|
+
As a shortcut, you can run build steps using `./n`:
|
94
|
+
|
95
|
+
```shell
|
96
|
+
./n test
|
97
|
+
./n lint
|
98
|
+
# ...
|
99
|
+
```
|
100
|
+
|
101
|
+
Generate a wheel using uv
|
102
|
+
```shell
|
103
|
+
uv build
|
104
|
+
```
|
105
|
+
|
106
|
+
Notes:
|
107
|
+
1. Reports dumped into ```reports/```
|
108
|
+
3. Documentation dumped into ```docs/build/html/```
|
109
|
+
2. Distribution dumped into ```dist/```
|
110
|
+
|
93
111
|
### Running GitHub CI workflow locally
|
94
112
|
|
95
113
|
```shell
|
96
|
-
|
114
|
+
uv run nox -s act
|
97
115
|
```
|
98
116
|
|
99
117
|
Notes:
|
@@ -116,13 +134,7 @@ docker run --env THE_VAR=THE_VALUE oe-python-template-example --help
|
|
116
134
|
Update scaffold from template
|
117
135
|
|
118
136
|
```shell
|
119
|
-
|
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.
|
3
|
+
Version: 0.1.14
|
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
|
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/blob/main/noxfile.py)
|
67
67
|
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/actions/workflows/test-and-report.yml)
|
68
68
|
[](https://oe-python-template-example.readthedocs.io/en/latest/)
|
69
|
-
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/security/code-scanning)
|
70
|
-
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/security/dependabot)
|
71
69
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
|
72
70
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
|
73
71
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
|
74
72
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
|
75
73
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
|
74
|
+
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/security/code-scanning)
|
75
|
+
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/security/dependabot)
|
76
|
+
[](https://renovatebot.com/)
|
76
77
|
[](https://codecov.io/gh/helmut-hoffer-von-ankershoffen/oe-python-template-example)
|
77
78
|
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/blob/main/noxfile.py)
|
78
79
|
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/blob/main/noxfile.py)
|
@@ -100,64 +101,13 @@ Description-Content-Type: text/markdown
|
|
100
101
|
---
|
101
102
|
|
102
103
|
|
103
|
-
Example project scaffolded and kept up to date with OE Python Template
|
104
|
+
Example project scaffolded and kept up to date with OE Python Template
|
105
|
+
(oe-python-template).
|
104
106
|
|
105
107
|
Use Cases:
|
106
|
-
1) Fast and easy to use project setup
|
107
|
-
2) Consistent update of already scaffolded projects to benefit from new and improved features.
|
108
|
-
3) Dummy CLI application and service demonstrating example usage of the generated directory structure and build pipeline
|
109
|
-
|
110
|
-
## Scaffolding
|
111
|
-
|
112
|
-
**Step 1**: Install uv package manager and copier
|
113
|
-
```shell
|
114
|
-
if [[ "$OSTYPE" == "darwin"* ]]; then # Install dependencies for macOS X
|
115
|
-
if ! command -v brew &> /dev/null; then ## Install Homebrew if not present
|
116
|
-
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
117
|
-
fi
|
118
|
-
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then # Install dependencies for Linux
|
119
|
-
sudo apt-get update -y && sudo apt-get install curl -y # Install curl
|
120
|
-
fi
|
121
|
-
if ! command -v uvx &> /dev/null; then # Install uv package manager if not present
|
122
|
-
curl -LsSf https://astral.sh/uv/install.sh | sh
|
123
|
-
source $HOME/.local/bin/env
|
124
|
-
fi
|
125
|
-
uv tool install copier # Install copier as global tool
|
126
|
-
```
|
127
|
-
|
128
|
-
**Step 2**: Now create an empty repository on GitHubm, clone to your local machine, and change into it's directory.
|
129
108
|
|
130
|
-
|
131
|
-
|
132
|
-
copier copy gh:helmut-hoffer-von-ankershoffen/oe-python-template .
|
133
|
-
```
|
134
|
-
**Step 4**: Setup the local environment
|
135
|
-
|
136
|
-
```shell
|
137
|
-
uv run nox -s setup_dev
|
138
|
-
```
|
139
|
-
|
140
|
-
**Step 5**: Perform initial commit and push
|
141
|
-
```shell
|
142
|
-
git add .
|
143
|
-
git commit -m "feat: Initial commit"
|
144
|
-
git push
|
145
|
-
```
|
146
|
-
|
147
|
-
Visit your GitHub repository and check the Actions tab. The CI workflow should fail at the SonarQube step,
|
148
|
-
as this external service is not yet configured for our new repository.
|
149
|
-
|
150
|
-
**Step 6**: Follow the [instructions](SERVICE_CONNECTIONS.md) to wire up
|
151
|
-
external services such as Cloudcov, SonarQube Cloud, Read The Docs, Docker.io, GHCR.io and Streamlit Community Cloud.
|
152
|
-
|
153
|
-
**Step 7**: Release the first versions
|
154
|
-
```shell
|
155
|
-
./bump
|
156
|
-
```
|
157
|
-
Notes:
|
158
|
-
* You can remove this section post having successfully scafolded your project.
|
159
|
-
* The following sections refer to the dummy application and service provided by this template.
|
160
|
-
Use them as inspiration and adapt them to your own project.
|
109
|
+
1. Dummy CLI application and service demonstrating example usage of the
|
110
|
+
directory structure and build pipeline generated by oe-python-template
|
161
111
|
|
162
112
|
## Overview
|
163
113
|
|
@@ -167,13 +117,17 @@ Adding OE Python Template Example to your project as a dependency is easy.
|
|
167
117
|
uv add oe-python-template-example # add dependency to your project
|
168
118
|
```
|
169
119
|
|
170
|
-
If you don't have uv installed follow
|
120
|
+
If you don't have uv installed follow
|
121
|
+
[these instructions](https://docs.astral.sh/uv/getting-started/installation/).
|
122
|
+
If you still prefer pip over the modern and fast package manager
|
123
|
+
[uv](https://github.com/astral-sh/uv), you can install the library like this:
|
171
124
|
|
172
125
|
```shell
|
173
126
|
pip install oe-python-template-example # add dependency to your project
|
174
127
|
```
|
175
128
|
|
176
|
-
Executing the command line interface (CLI) in an isolated Python environment is
|
129
|
+
Executing the command line interface (CLI) in an isolated Python environment is
|
130
|
+
just as easy:
|
177
131
|
|
178
132
|
```shell
|
179
133
|
uvx oe-python-template-example hello-world # prints "Hello, world! [..]"
|
@@ -182,8 +136,8 @@ uvx oe-python-template-example serve --port=4711 # serves webservice API on port
|
|
182
136
|
```
|
183
137
|
|
184
138
|
Notes:
|
185
|
-
* The API is versioned, mounted at
|
186
|
-
* 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
|
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.
|
187
141
|
* Interactive documentation is provided at [http://127.0.0.1:8000/api/docs](http://127.0.0.1:8000/api/docs)
|
188
142
|
|
189
143
|
|
@@ -197,27 +151,44 @@ uvx oe-python-template-example openapi --help
|
|
197
151
|
uvx oe-python-template-example serve --help
|
198
152
|
```
|
199
153
|
|
200
|
-
|
201
154
|
## Operational Excellence
|
202
155
|
|
203
|
-
This project is designed with operational excellence in mind, using modern
|
156
|
+
This project is designed with operational excellence in mind, using modern
|
157
|
+
Python tooling and practices. It includes:
|
204
158
|
|
205
|
-
|
159
|
+
- Various examples demonstrating usage:
|
206
160
|
- [Simple Python script](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/blob/main/examples/script.py)
|
207
|
-
- [Streamlit web application](https://oe-python-template-example.streamlit.app/)
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
161
|
+
- [Streamlit web application](https://oe-python-template-example.streamlit.app/)
|
162
|
+
deployed on [Streamlit Community Cloud](https://streamlit.io/cloud)
|
163
|
+
- [Jupyter](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/blob/main/examples/notebook.ipynb)
|
164
|
+
and
|
165
|
+
[Marimo](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/blob/main/examples/notebook.py)
|
166
|
+
notebook
|
167
|
+
- [Complete reference documentation](https://oe-python-template-example.readthedocs.io/en/latest/reference.html)
|
168
|
+
on Read the Docs
|
169
|
+
- [Transparent test coverage](https://app.codecov.io/gh/helmut-hoffer-von-ankershoffen/oe-python-template-example)
|
170
|
+
including unit and E2E tests (reported on Codecov)
|
171
|
+
- Matrix tested with
|
172
|
+
[multiple python versions](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/blob/main/noxfile.py)
|
173
|
+
to ensure compatibility (powered by [Nox](https://nox.thea.codes/en/stable/))
|
174
|
+
- Compliant with modern linting and formatting standards (powered by
|
175
|
+
[Ruff](https://github.com/astral-sh/ruff))
|
176
|
+
- Up-to-date dependencies (monitored by
|
177
|
+
[Renovate](https://github.com/renovatebot/renovate) and
|
178
|
+
[GitHub Dependabot](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/security/dependabot))
|
179
|
+
- [A-grade code quality](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
|
180
|
+
in security, maintainability, and reliability with low technical debt and
|
181
|
+
codesmell (verified by SonarQube)
|
182
|
+
- Additional code security checks using
|
183
|
+
[GitHub CodeQL](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/security/code-scanning)
|
184
|
+
- [Security Policy](SECURITY.md)
|
185
|
+
- [License](LICENSE) compliant with the Open Source Initiative (OSI)
|
186
|
+
- 1-liner for installation and execution of command line interface (CLI) via
|
187
|
+
[uv(x)](https://github.com/astral-sh/uv) or
|
188
|
+
[Docker](https://hub.docker.com/r/helmuthva/oe-python-template-example/tags)
|
189
|
+
- Setup for developing inside a
|
190
|
+
[devcontainer](https://code.visualstudio.com/docs/devcontainers/containers)
|
191
|
+
included (supports VSCode and GitHub Codespaces)
|
221
192
|
|
222
193
|
## Usage Examples
|
223
194
|
|
@@ -242,15 +213,19 @@ message = Service.get_hello_world()
|
|
242
213
|
console.print(f"[blue]{message}[/blue]")
|
243
214
|
```
|
244
215
|
|
245
|
-
[Show script code](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/blob/main/examples/script.py) -
|
216
|
+
[Show script code](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/blob/main/examples/script.py) -
|
217
|
+
[Read the reference documentation](https://oe-python-template-example.readthedocs.io/en/latest/reference.html)
|
246
218
|
|
247
219
|
### Streamlit App
|
248
220
|
|
249
|
-
Serve the functionality provided by OE Python Template Example in the web by
|
221
|
+
Serve the functionality provided by OE Python Template Example in the web by
|
222
|
+
easily integrating the service into a Streamlit application.
|
250
223
|
|
251
|
-
[Try it out!](https://oe-python-template-example.streamlit.app) -
|
224
|
+
[Try it out!](https://oe-python-template-example.streamlit.app) -
|
225
|
+
[Show the code](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/blob/main/examples/streamlit.py)
|
252
226
|
|
253
227
|
... or serve the app locally
|
228
|
+
|
254
229
|
```shell
|
255
230
|
uv sync --all-extras # Install streamlit dependency part of the examples extra, see pyproject.toml
|
256
231
|
uv run streamlit run examples/streamlit.py # Serve on localhost:8501, opens browser
|
@@ -267,7 +242,9 @@ uv run streamlit run examples/streamlit.py # Serve on localhost:8501, o
|
|
267
242
|
```shell
|
268
243
|
uv sync --all-extras # Install dependencies required for examples such as Juypyter kernel, see pyproject.toml
|
269
244
|
```
|
270
|
-
|
245
|
+
|
246
|
+
Install the
|
247
|
+
[Jupyter extension for VSCode](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter)
|
271
248
|
|
272
249
|
Click on `examples/notebook.ipynb` in VSCode and run it.
|
273
250
|
|
@@ -291,9 +268,11 @@ uv run marimo edit examples/notebook.py --watch # Edit on localhost:2718, op
|
|
291
268
|
|
292
269
|
... or edit interactively within VSCode
|
293
270
|
|
294
|
-
Install the
|
271
|
+
Install the
|
272
|
+
[Marimo extension for VSCode](https://marketplace.visualstudio.com/items?itemName=marimo-team.vscode-marimo)
|
295
273
|
|
296
|
-
Click on `examples/notebook.py` in VSCode and click on the caret next to the Run
|
274
|
+
Click on `examples/notebook.py` in VSCode and click on the caret next to the Run
|
275
|
+
icon above the code (looks like a pencil) > "Start in marimo editor" (edit).
|
297
276
|
|
298
277
|
## Command Line Interface (CLI)
|
299
278
|
|
@@ -370,7 +349,7 @@ curl http://127.0.0.1:8000/api/v2/docs
|
|
370
349
|
|
371
350
|
## Extra: Lorem Ipsum
|
372
351
|
|
373
|
-
|
352
|
+
Nothing yet
|
374
353
|
|
375
354
|
|
376
355
|
## Further Reading
|
@@ -5,13 +5,14 @@
|
|
5
5
|
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/blob/main/noxfile.py)
|
6
6
|
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/actions/workflows/test-and-report.yml)
|
7
7
|
[](https://oe-python-template-example.readthedocs.io/en/latest/)
|
8
|
-
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/security/code-scanning)
|
9
|
-
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/security/dependabot)
|
10
8
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
|
11
9
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
|
12
10
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
|
13
11
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
|
14
12
|
[](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
|
13
|
+
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/security/code-scanning)
|
14
|
+
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/security/dependabot)
|
15
|
+
[](https://renovatebot.com/)
|
15
16
|
[](https://codecov.io/gh/helmut-hoffer-von-ankershoffen/oe-python-template-example)
|
16
17
|
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/blob/main/noxfile.py)
|
17
18
|
[](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/blob/main/noxfile.py)
|
@@ -39,64 +40,13 @@
|
|
39
40
|
---
|
40
41
|
|
41
42
|
|
42
|
-
Example project scaffolded and kept up to date with OE Python Template
|
43
|
+
Example project scaffolded and kept up to date with OE Python Template
|
44
|
+
(oe-python-template).
|
43
45
|
|
44
46
|
Use Cases:
|
45
|
-
1) Fast and easy to use project setup
|
46
|
-
2) Consistent update of already scaffolded projects to benefit from new and improved features.
|
47
|
-
3) Dummy CLI application and service demonstrating example usage of the generated directory structure and build pipeline
|
48
|
-
|
49
|
-
## Scaffolding
|
50
|
-
|
51
|
-
**Step 1**: Install uv package manager and copier
|
52
|
-
```shell
|
53
|
-
if [[ "$OSTYPE" == "darwin"* ]]; then # Install dependencies for macOS X
|
54
|
-
if ! command -v brew &> /dev/null; then ## Install Homebrew if not present
|
55
|
-
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
56
|
-
fi
|
57
|
-
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then # Install dependencies for Linux
|
58
|
-
sudo apt-get update -y && sudo apt-get install curl -y # Install curl
|
59
|
-
fi
|
60
|
-
if ! command -v uvx &> /dev/null; then # Install uv package manager if not present
|
61
|
-
curl -LsSf https://astral.sh/uv/install.sh | sh
|
62
|
-
source $HOME/.local/bin/env
|
63
|
-
fi
|
64
|
-
uv tool install copier # Install copier as global tool
|
65
|
-
```
|
66
|
-
|
67
|
-
**Step 2**: Now create an empty repository on GitHubm, clone to your local machine, and change into it's directory.
|
68
47
|
|
69
|
-
|
70
|
-
|
71
|
-
copier copy gh:helmut-hoffer-von-ankershoffen/oe-python-template .
|
72
|
-
```
|
73
|
-
**Step 4**: Setup the local environment
|
74
|
-
|
75
|
-
```shell
|
76
|
-
uv run nox -s setup_dev
|
77
|
-
```
|
78
|
-
|
79
|
-
**Step 5**: Perform initial commit and push
|
80
|
-
```shell
|
81
|
-
git add .
|
82
|
-
git commit -m "feat: Initial commit"
|
83
|
-
git push
|
84
|
-
```
|
85
|
-
|
86
|
-
Visit your GitHub repository and check the Actions tab. The CI workflow should fail at the SonarQube step,
|
87
|
-
as this external service is not yet configured for our new repository.
|
88
|
-
|
89
|
-
**Step 6**: Follow the [instructions](SERVICE_CONNECTIONS.md) to wire up
|
90
|
-
external services such as Cloudcov, SonarQube Cloud, Read The Docs, Docker.io, GHCR.io and Streamlit Community Cloud.
|
91
|
-
|
92
|
-
**Step 7**: Release the first versions
|
93
|
-
```shell
|
94
|
-
./bump
|
95
|
-
```
|
96
|
-
Notes:
|
97
|
-
* You can remove this section post having successfully scafolded your project.
|
98
|
-
* The following sections refer to the dummy application and service provided by this template.
|
99
|
-
Use them as inspiration and adapt them to your own project.
|
48
|
+
1. Dummy CLI application and service demonstrating example usage of the
|
49
|
+
directory structure and build pipeline generated by oe-python-template
|
100
50
|
|
101
51
|
## Overview
|
102
52
|
|
@@ -106,13 +56,17 @@ Adding OE Python Template Example to your project as a dependency is easy.
|
|
106
56
|
uv add oe-python-template-example # add dependency to your project
|
107
57
|
```
|
108
58
|
|
109
|
-
If you don't have uv installed follow
|
59
|
+
If you don't have uv installed follow
|
60
|
+
[these instructions](https://docs.astral.sh/uv/getting-started/installation/).
|
61
|
+
If you still prefer pip over the modern and fast package manager
|
62
|
+
[uv](https://github.com/astral-sh/uv), you can install the library like this:
|
110
63
|
|
111
64
|
```shell
|
112
65
|
pip install oe-python-template-example # add dependency to your project
|
113
66
|
```
|
114
67
|
|
115
|
-
Executing the command line interface (CLI) in an isolated Python environment is
|
68
|
+
Executing the command line interface (CLI) in an isolated Python environment is
|
69
|
+
just as easy:
|
116
70
|
|
117
71
|
```shell
|
118
72
|
uvx oe-python-template-example hello-world # prints "Hello, world! [..]"
|
@@ -121,8 +75,8 @@ uvx oe-python-template-example serve --port=4711 # serves webservice API on port
|
|
121
75
|
```
|
122
76
|
|
123
77
|
Notes:
|
124
|
-
* The API is versioned, mounted at
|
125
|
-
* 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
|
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.
|
126
80
|
* Interactive documentation is provided at [http://127.0.0.1:8000/api/docs](http://127.0.0.1:8000/api/docs)
|
127
81
|
|
128
82
|
|
@@ -136,27 +90,44 @@ uvx oe-python-template-example openapi --help
|
|
136
90
|
uvx oe-python-template-example serve --help
|
137
91
|
```
|
138
92
|
|
139
|
-
|
140
93
|
## Operational Excellence
|
141
94
|
|
142
|
-
This project is designed with operational excellence in mind, using modern
|
95
|
+
This project is designed with operational excellence in mind, using modern
|
96
|
+
Python tooling and practices. It includes:
|
143
97
|
|
144
|
-
|
98
|
+
- Various examples demonstrating usage:
|
145
99
|
- [Simple Python script](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/blob/main/examples/script.py)
|
146
|
-
- [Streamlit web application](https://oe-python-template-example.streamlit.app/)
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
100
|
+
- [Streamlit web application](https://oe-python-template-example.streamlit.app/)
|
101
|
+
deployed on [Streamlit Community Cloud](https://streamlit.io/cloud)
|
102
|
+
- [Jupyter](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/blob/main/examples/notebook.ipynb)
|
103
|
+
and
|
104
|
+
[Marimo](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/blob/main/examples/notebook.py)
|
105
|
+
notebook
|
106
|
+
- [Complete reference documentation](https://oe-python-template-example.readthedocs.io/en/latest/reference.html)
|
107
|
+
on Read the Docs
|
108
|
+
- [Transparent test coverage](https://app.codecov.io/gh/helmut-hoffer-von-ankershoffen/oe-python-template-example)
|
109
|
+
including unit and E2E tests (reported on Codecov)
|
110
|
+
- Matrix tested with
|
111
|
+
[multiple python versions](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/blob/main/noxfile.py)
|
112
|
+
to ensure compatibility (powered by [Nox](https://nox.thea.codes/en/stable/))
|
113
|
+
- Compliant with modern linting and formatting standards (powered by
|
114
|
+
[Ruff](https://github.com/astral-sh/ruff))
|
115
|
+
- Up-to-date dependencies (monitored by
|
116
|
+
[Renovate](https://github.com/renovatebot/renovate) and
|
117
|
+
[GitHub Dependabot](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/security/dependabot))
|
118
|
+
- [A-grade code quality](https://sonarcloud.io/summary/new_code?id=helmut-hoffer-von-ankershoffen_oe-python-template-example)
|
119
|
+
in security, maintainability, and reliability with low technical debt and
|
120
|
+
codesmell (verified by SonarQube)
|
121
|
+
- Additional code security checks using
|
122
|
+
[GitHub CodeQL](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/security/code-scanning)
|
123
|
+
- [Security Policy](SECURITY.md)
|
124
|
+
- [License](LICENSE) compliant with the Open Source Initiative (OSI)
|
125
|
+
- 1-liner for installation and execution of command line interface (CLI) via
|
126
|
+
[uv(x)](https://github.com/astral-sh/uv) or
|
127
|
+
[Docker](https://hub.docker.com/r/helmuthva/oe-python-template-example/tags)
|
128
|
+
- Setup for developing inside a
|
129
|
+
[devcontainer](https://code.visualstudio.com/docs/devcontainers/containers)
|
130
|
+
included (supports VSCode and GitHub Codespaces)
|
160
131
|
|
161
132
|
## Usage Examples
|
162
133
|
|
@@ -181,15 +152,19 @@ message = Service.get_hello_world()
|
|
181
152
|
console.print(f"[blue]{message}[/blue]")
|
182
153
|
```
|
183
154
|
|
184
|
-
[Show script code](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/blob/main/examples/script.py) -
|
155
|
+
[Show script code](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/blob/main/examples/script.py) -
|
156
|
+
[Read the reference documentation](https://oe-python-template-example.readthedocs.io/en/latest/reference.html)
|
185
157
|
|
186
158
|
### Streamlit App
|
187
159
|
|
188
|
-
Serve the functionality provided by OE Python Template Example in the web by
|
160
|
+
Serve the functionality provided by OE Python Template Example in the web by
|
161
|
+
easily integrating the service into a Streamlit application.
|
189
162
|
|
190
|
-
[Try it out!](https://oe-python-template-example.streamlit.app) -
|
163
|
+
[Try it out!](https://oe-python-template-example.streamlit.app) -
|
164
|
+
[Show the code](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example/blob/main/examples/streamlit.py)
|
191
165
|
|
192
166
|
... or serve the app locally
|
167
|
+
|
193
168
|
```shell
|
194
169
|
uv sync --all-extras # Install streamlit dependency part of the examples extra, see pyproject.toml
|
195
170
|
uv run streamlit run examples/streamlit.py # Serve on localhost:8501, opens browser
|
@@ -206,7 +181,9 @@ uv run streamlit run examples/streamlit.py # Serve on localhost:8501, o
|
|
206
181
|
```shell
|
207
182
|
uv sync --all-extras # Install dependencies required for examples such as Juypyter kernel, see pyproject.toml
|
208
183
|
```
|
209
|
-
|
184
|
+
|
185
|
+
Install the
|
186
|
+
[Jupyter extension for VSCode](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter)
|
210
187
|
|
211
188
|
Click on `examples/notebook.ipynb` in VSCode and run it.
|
212
189
|
|
@@ -230,9 +207,11 @@ uv run marimo edit examples/notebook.py --watch # Edit on localhost:2718, op
|
|
230
207
|
|
231
208
|
... or edit interactively within VSCode
|
232
209
|
|
233
|
-
Install the
|
210
|
+
Install the
|
211
|
+
[Marimo extension for VSCode](https://marketplace.visualstudio.com/items?itemName=marimo-team.vscode-marimo)
|
234
212
|
|
235
|
-
Click on `examples/notebook.py` in VSCode and click on the caret next to the Run
|
213
|
+
Click on `examples/notebook.py` in VSCode and click on the caret next to the Run
|
214
|
+
icon above the code (looks like a pencil) > "Start in marimo editor" (edit).
|
236
215
|
|
237
216
|
## Command Line Interface (CLI)
|
238
217
|
|
@@ -309,7 +288,7 @@ curl http://127.0.0.1:8000/api/v2/docs
|
|
309
288
|
|
310
289
|
## Extra: Lorem Ipsum
|
311
290
|
|
312
|
-
|
291
|
+
Nothing yet
|
313
292
|
|
314
293
|
|
315
294
|
## Further Reading
|
@@ -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.
|
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.
|
30
|
-
- **pip-licenses**: Exports the licenses of all dependencies to ensure compliance with licensing requirements and avoid using components with problematic licenses.
|
29
|
+
- **cyclonedx-py**: Generates a Software Bill of Materials (SBOM) in SPDX format, listing all components and dependencies used in the project. `sbom.json` (SPDX format) published [per release](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-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.14
|