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.
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.copier-answers.yml +1 -1
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/CHANGELOG.md +15 -1
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/PKG-INFO +7 -8
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/README.md +6 -7
- oe_python_template-0.4.4/RELEASE_NOTES.md +8 -0
- oe_python_template-0.4.4/VERSION +1 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/_readme_header.md +1 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/_readme_main.md +5 -7
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/conf.py +1 -1
- oe_python_template-0.4.4/examples/notebook.ipynb +46 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/pyproject.toml +2 -2
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/sonar-project.properties +1 -1
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/src/oe_python_template/api.py +11 -2
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/src/oe_python_template/cli.py +3 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/_readme_header.md.jinja +4 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/_readme_main.md.jinja +5 -7
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/docs/source/conf.py.jinja +4 -4
- oe_python_template-0.4.4/template/examples/notebook.ipynb.jinja +46 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/examples/streamlit.py.jinja +1 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/noxfile.py.jinja +4 -7
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/src/{{ project_name_snake_case }}/__init__.py.jinja +1 -2
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/src/{{ project_name_snake_case }}/api.py.jinja +15 -11
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/src/{{ project_name_snake_case }}/cli.py.jinja +3 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/tests/api_test.py.jinja +2 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/uv.lock +1 -1
- oe_python_template-0.4.2/RELEASE_NOTES.md +0 -8
- oe_python_template-0.4.2/VERSION +0 -1
- oe_python_template-0.4.2/examples/jupyter.ipynb +0 -46
- oe_python_template-0.4.2/examples/notebook.ipynb +0 -46
- oe_python_template-0.4.2/template/examples/notebook.ipynb.jinja +0 -45
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.act-env-public +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.devcontainer/Dockerfile +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.devcontainer/devcontainer.json +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.devcontainer/onCreateCommand +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.devcontainer/postAttachCommand +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.devcontainer/postCreateCommand +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.env.example +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.github/workflows/docker-image-build-publish.yml +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.github/workflows/package-build-publish-release.yml +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.github/workflows/test-and-report.yml +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.gitignore +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.pre-commit-config.yaml +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.python-version +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.readthedocs.yml +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.secrets.baseline +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.vscode/extensions.json +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/.vscode/settings.json +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/CODEOWNERS +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/CONTRIBUTING.md +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/Dockerfile +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/LICENSE +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/SERVICE_CONNECTIONS.md +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/_readme_footer.md +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/bin/git-cliff +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/bump +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/codecov.yml +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/compose.yaml +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/copier.yml +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/Makefile +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/make.bat +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/_static/.keep +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/_static/openapi_v1.json +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/_static/openapi_v1.yaml +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/_static/openapi_v2.json +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/_static/openapi_v2.yaml +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/api_v1.rst +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/api_v2.rst +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/contributing.rst +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/index.rst +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/latexmkrc +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/main.rst +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/reference.rst +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/docs/source/release-notes.rst +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/examples/__init__.py +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/examples/notebook.py +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/examples/script.py +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/examples/streamlit.py +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0/CHANGELOG.md +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0/LICENSE-APACHE +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0/LICENSE-MIT +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0/README.md +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0/completions/_git-cliff +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0/completions/_git-cliff.ps1 +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0/completions/git-cliff.bash +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0/completions/git-cliff.elv +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0/completions/git-cliff.fish +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0/git-cliff-completions +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0/git-cliff-mangen +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/git-cliff-2.7.0/man/git-cliff.1 +0 -0
- {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
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/github-action-run +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/latexmkrc +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/logo.png +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/noxfile.py +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/renovate.json +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/reports/mypy.xml +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/src/oe_python_template/__init__.py +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/src/oe_python_template/constants.py +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/src/oe_python_template/service.py +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.act-env-public.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.devcontainer/Dockerfile.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.devcontainer/devcontainer.json.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.devcontainer/onCreateCommand.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.devcontainer/postAttachCommand.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.devcontainer/postCreateCommand.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.env.example.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.github/workflows/docker-image-build-publish.yml.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.github/workflows/package-build-publish-release.yml.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.github/workflows/test-and-report.yml.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.gitignore.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.pre-commit-config.yaml.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.python-version +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.readthedocs.yml.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.vscode/extensions.json +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/.vscode/settings.json.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/CHANGELOG.md +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/CODEOWNERS.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/CONTRIBUTING.md.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/Dockerfile.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/LICENSE.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/SERVICE_CONNECTIONS.md.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/VERSION +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/_readme_footer.md.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/bump.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/codecov.yml.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/compose.yaml.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/docs/Makefile.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/docs/make.bat.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/docs/source/_static/.keep +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/docs/source/api_v1.rst.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/docs/source/api_v2.rst.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/docs/source/contributing.rst.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/docs/source/index.rst.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/docs/source/latexmkrc.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/docs/source/main.rst.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/docs/source/reference.rst.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/docs/source/release-notes.rst.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/examples/__init__.py.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/examples/notebook.py.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/examples/script.py.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/github-action-run.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/latexmkrc.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/logo.png +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/pyproject.toml.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/sonar-project.properties.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/src/{{ project_name_snake_case }}/constants.py.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/src/{{ project_name_snake_case }}/service.py.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/tests/__init__.py.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/tests/cli_test.py.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/tests/fixtures/.keep +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/template/{{_copier_conf.answers_file}}.jinja +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/tests/__init__.py +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/tests/api_test.py +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/tests/cli_test.py +0 -0
- {oe_python_template-0.4.2 → oe_python_template-0.4.4}/tests/fixtures/.keep +0 -0
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
[🧠 OE Python Template](https://oe-python-template.readthedocs.io/en/latest/)
|
|
2
2
|
|
|
3
|
-
## [0.4.
|
|
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.
|
|
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
|
-
|
|
178
|
-
|
|
179
|
-
|
|
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
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
|
@@ -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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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": {
|
|
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": {
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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> - '
|
|
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> - '
|
|
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>'
|
|
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
|
+
}
|
|
@@ -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:
|
|
136
|
+
except Exception: # noqa: BLE001
|
|
140
137
|
session.log("pre-commit run failed, continuing anyway")
|
|
141
138
|
session.run("git", "add", ".", external=True)
|
|
@@ -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
|
-
|
|
51
|
+
"name": "v1",
|
|
49
52
|
"description": "API version 1, check link on the right",
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
53
|
+
"externalDocs": {
|
|
54
|
+
"description": "sub-docs",
|
|
55
|
+
"url": f"http://{UVICORN_HOST}:{UVICORN_PORT}/api/v1/docs",
|
|
56
|
+
},
|
|
54
57
|
},
|
|
55
58
|
{
|
|
56
|
-
|
|
59
|
+
"name": "v2",
|
|
57
60
|
"description": "API version 2, check link on the right",
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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."""
|
|
@@ -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
|
-
|
oe_python_template-0.4.2/VERSION
DELETED
|
@@ -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
|
-
}
|