netzooe-eservice-api 1.0.0__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 (46) hide show
  1. netzooe_eservice_api-1.0.0/.editorconfig +10 -0
  2. netzooe_eservice_api-1.0.0/.gitattributes +1 -0
  3. netzooe_eservice_api-1.0.0/.github/actions/setup-project/action.yml +17 -0
  4. netzooe_eservice_api-1.0.0/.github/dependabot.yml +10 -0
  5. netzooe_eservice_api-1.0.0/.github/environments.json +3 -0
  6. netzooe_eservice_api-1.0.0/.github/workflows/ci.yml +215 -0
  7. netzooe_eservice_api-1.0.0/.github/workflows/configure.yml +24 -0
  8. netzooe_eservice_api-1.0.0/.github/workflows/schedule-ci.yml +21 -0
  9. netzooe_eservice_api-1.0.0/.github/workflows/security.yml +33 -0
  10. netzooe_eservice_api-1.0.0/.gitignore +33 -0
  11. netzooe_eservice_api-1.0.0/.idea/.gitignore +3 -0
  12. netzooe_eservice_api-1.0.0/.idea/.name +1 -0
  13. netzooe_eservice_api-1.0.0/.idea/NetzOOE-eService-API.iml +8 -0
  14. netzooe_eservice_api-1.0.0/.idea/inspectionProfiles/Project_Default.xml +12 -0
  15. netzooe_eservice_api-1.0.0/.idea/inspectionProfiles/profiles_settings.xml +6 -0
  16. netzooe_eservice_api-1.0.0/.idea/misc.xml +9 -0
  17. netzooe_eservice_api-1.0.0/.idea/modules.xml +8 -0
  18. netzooe_eservice_api-1.0.0/.idea/runConfigurations/tests.xml +17 -0
  19. netzooe_eservice_api-1.0.0/.idea/vcs.xml +6 -0
  20. netzooe_eservice_api-1.0.0/.pre-commit-config.yaml +41 -0
  21. netzooe_eservice_api-1.0.0/.yamllint.yml +31 -0
  22. netzooe_eservice_api-1.0.0/CHANGELOG.md +12 -0
  23. netzooe_eservice_api-1.0.0/CONTRIBUTING.md +72 -0
  24. netzooe_eservice_api-1.0.0/LICENSE +201 -0
  25. netzooe_eservice_api-1.0.0/PKG-INFO +58 -0
  26. netzooe_eservice_api-1.0.0/README.md +33 -0
  27. netzooe_eservice_api-1.0.0/coverage-badge.svg +1 -0
  28. netzooe_eservice_api-1.0.0/netzooe_eservice_api/__init__.py +1 -0
  29. netzooe_eservice_api-1.0.0/netzooe_eservice_api/api.py +231 -0
  30. netzooe_eservice_api-1.0.0/netzooe_eservice_api/constants.py +25 -0
  31. netzooe_eservice_api-1.0.0/netzooe_eservice_api/error.py +33 -0
  32. netzooe_eservice_api-1.0.0/netzooe_eservice_api/py.typed +0 -0
  33. netzooe_eservice_api-1.0.0/netzooe_eservice_api/version.py +24 -0
  34. netzooe_eservice_api-1.0.0/netzooe_eservice_api.egg-info/PKG-INFO +58 -0
  35. netzooe_eservice_api-1.0.0/netzooe_eservice_api.egg-info/SOURCES.txt +44 -0
  36. netzooe_eservice_api-1.0.0/netzooe_eservice_api.egg-info/dependency_links.txt +1 -0
  37. netzooe_eservice_api-1.0.0/netzooe_eservice_api.egg-info/requires.txt +1 -0
  38. netzooe_eservice_api-1.0.0/netzooe_eservice_api.egg-info/top_level.txt +1 -0
  39. netzooe_eservice_api-1.0.0/pyproject.toml +163 -0
  40. netzooe_eservice_api-1.0.0/scripts/lint.sh +11 -0
  41. netzooe_eservice_api-1.0.0/scripts/setup.sh +8 -0
  42. netzooe_eservice_api-1.0.0/setup.cfg +4 -0
  43. netzooe_eservice_api-1.0.0/tests/__init__.py +0 -0
  44. netzooe_eservice_api-1.0.0/tests/conftest.py +0 -0
  45. netzooe_eservice_api-1.0.0/tests/test_api.py +428 -0
  46. netzooe_eservice_api-1.0.0/uv.lock +1536 -0
@@ -0,0 +1,10 @@
1
+ root = true
2
+
3
+ [*]
4
+ end_of_line = lf
5
+ insert_final_newline = true
6
+ indent_style = space
7
+ indent_size = 4
8
+
9
+ [{*.css,*.md,*.yml,*.yaml}]
10
+ indent_size = 2
@@ -0,0 +1 @@
1
+ * text=auto eol=lf
@@ -0,0 +1,17 @@
1
+ name: Set up project
2
+ inputs:
3
+ python-version:
4
+ description: Python version
5
+
6
+ runs:
7
+ using: composite
8
+ steps:
9
+ - name: Set up Python
10
+ uses: actions/setup-python@v5
11
+ with:
12
+ python-version: ${{ inputs.python-version }}
13
+ - name: Install uv
14
+ uses: astral-sh/setup-uv@v7
15
+ - name: Install the project
16
+ run: uv sync --all-extras --dev
17
+ shell: bash
@@ -0,0 +1,10 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: pip
4
+ directory: /
5
+ schedule:
6
+ interval: weekly
7
+ - package-ecosystem: github-actions
8
+ directory: /
9
+ schedule:
10
+ interval: weekly
@@ -0,0 +1,3 @@
1
+ {
2
+ "python-version": ["3.13", "3.14"]
3
+ }
@@ -0,0 +1,215 @@
1
+ name: CI
2
+
3
+ permissions:
4
+ contents: read
5
+ pull-requests: write
6
+
7
+ on:
8
+ workflow_dispatch:
9
+ inputs:
10
+ build-python-package:
11
+ description: Build python package
12
+ type: boolean
13
+ pull_request:
14
+ push:
15
+ branches:
16
+ - main
17
+ - develop
18
+ tags:
19
+ - v*
20
+
21
+ jobs:
22
+ configure:
23
+ name: Configure
24
+ uses: ./.github/workflows/configure.yml
25
+
26
+ code-analysis:
27
+ name: Code analysis using Python ${{ matrix.python-version }}
28
+ runs-on: ubuntu-latest
29
+ needs: configure
30
+ strategy:
31
+ fail-fast: False
32
+ matrix:
33
+ python-version: ${{ fromJson(needs.configure.outputs.environments).python-version }}
34
+ steps:
35
+ - name: Check out repository
36
+ uses: actions/checkout@v6
37
+ - name: Set up project
38
+ uses: ./.github/actions/setup-project
39
+ with:
40
+ python-version: ${{ matrix.python-version }}
41
+ - name: Lint python files with black
42
+ run: uv run black --diff --check $(git ls-files '*.py')
43
+ - name: Lint python files with mypy
44
+ run: uv run mypy $(git ls-files '*.py')
45
+ - name: Lint python files with ruff
46
+ run: uv run ruff check $(git ls-files '*.py')
47
+ - name: Lint YAML files
48
+ run: uv run yamllint $(git ls-files '*.yml' '*.yaml')
49
+ - name: Lint Markdown files
50
+ run: uv run rumdl check $(git ls-files '*.md')
51
+
52
+ security:
53
+ name: Security
54
+ uses: ./.github/workflows/security.yml
55
+ needs: configure
56
+ with:
57
+ environments: ${{ needs.configure.outputs.environments }}
58
+
59
+ tests:
60
+ name: Tests using Python ${{ matrix.python-version }}
61
+ runs-on: ubuntu-latest
62
+ needs: configure
63
+ strategy:
64
+ fail-fast: False
65
+ matrix:
66
+ python-version: ${{ fromJson(needs.configure.outputs.environments).python-version }}
67
+ steps:
68
+ - name: Check out repository
69
+ uses: actions/checkout@v6
70
+ - name: Set up project
71
+ uses: ./.github/actions/setup-project
72
+ with:
73
+ python-version: ${{ matrix.python-version }}
74
+ - name: Run tests
75
+ run: uv run pytest -n auto
76
+ - name: Upload coverage
77
+ uses: actions/upload-artifact@v6
78
+ with:
79
+ name: coverage-xml-${{ matrix.python-version }}
80
+ path: reports/coverage.xml
81
+ if-no-files-found: error
82
+ overwrite: True
83
+
84
+ coverage:
85
+ name: Generate coverage badge
86
+ runs-on: ubuntu-latest
87
+ if: github.ref_type != 'tag'
88
+ needs:
89
+ - configure
90
+ - tests
91
+ permissions:
92
+ contents: write
93
+ steps:
94
+ - name: Check out repository
95
+ uses: actions/checkout@v6
96
+ - name: Set up project
97
+ uses: ./.github/actions/setup-project
98
+ with:
99
+ python-version: ${{ fromJson(needs.configure.outputs.environments).python-version[0] }}
100
+ - name: Download coverage
101
+ uses: actions/download-artifact@v7
102
+ with:
103
+ name: coverage-xml-${{ fromJson(needs.configure.outputs.environments).python-version[0] }}
104
+ path: reports
105
+ - name: Create coverage badge
106
+ run: uv run genbadge coverage --input-file reports/coverage.xml
107
+ - name: Verify coverage badge changed
108
+ uses: tj-actions/verify-changed-files@v20
109
+ id: changed-files
110
+ with:
111
+ files: coverage-badge.svg
112
+ - name: Commit coverage badge
113
+ if: steps.changed-files.outputs.files_changed == 'true'
114
+ run: |
115
+ git config --local user.email "github-actions[bot]@users.noreply.github.com"
116
+ git config --local user.name "github-actions[bot]"
117
+ git add coverage-badge.svg
118
+ git commit -m "Updated coverage-badge.svg"
119
+ - name: Push changes
120
+ if: steps.changed-files.outputs.files_changed == 'true'
121
+ uses: ad-m/github-push-action@master
122
+ with:
123
+ github_token: ${{ secrets.GITHUB_TOKEN }}
124
+ branch: ${{ github.ref }}
125
+
126
+ build-python-package:
127
+ name: Build python package
128
+ runs-on: ubuntu-latest
129
+ if: |
130
+ github.ref_type == 'tag'
131
+ || (
132
+ github.ref_type == 'branch'
133
+ && inputs.build-python-package
134
+ )
135
+ && !endsWith(github.ref_name, '/merge')
136
+ needs:
137
+ - configure
138
+ - code-analysis
139
+ - security
140
+ - tests
141
+ steps:
142
+ - name: Check out repository
143
+ uses: actions/checkout@v6
144
+ - name: Set up project
145
+ uses: ./.github/actions/setup-project
146
+ with:
147
+ python-version: ${{ fromJson(needs.configure.outputs.environments).python-version[0] }}
148
+ - name: Build package
149
+ run: uv run python -m build
150
+ - name: Upload package files
151
+ uses: actions/upload-artifact@v6
152
+ with:
153
+ name: python-package
154
+ path: dist
155
+ if-no-files-found: error
156
+
157
+ release:
158
+ name: Release on GitHub
159
+ runs-on: ubuntu-latest
160
+ if: github.ref_type == 'tag'
161
+ needs:
162
+ - configure
163
+ - build-python-package
164
+ permissions:
165
+ contents: write
166
+ steps:
167
+ - name: Check out repository
168
+ uses: actions/checkout@v6
169
+ - name: Set up project
170
+ uses: ./.github/actions/setup-project
171
+ with:
172
+ python-version: ${{ fromJson(needs.configure.outputs.environments).python-version[0] }}
173
+ - name: Download files
174
+ uses: actions/download-artifact@v7
175
+ with:
176
+ name: python-package
177
+ path: dist
178
+ - name: Check if prerelease
179
+ id: check_prerelease
180
+ run: |
181
+ TAG_NAME="${GITHUB_REF#refs/tags/}"
182
+ echo "Tag: $TAG_NAME"
183
+
184
+ if [[ "$TAG_NAME" =~ ^v[0-9]+\.[0-9]+\.[0-9]+b[0-9]+$ ]]; then
185
+ echo "🟡 Pre-release detected"
186
+ echo "prerelease=true" >> "$GITHUB_OUTPUT"
187
+ else
188
+ echo "🟢 Regular release"
189
+ echo "prerelease=false" >> "$GITHUB_OUTPUT"
190
+ fi
191
+ - name: Release on GitHub
192
+ uses: softprops/action-gh-release@v2
193
+ with:
194
+ files: |
195
+ dist/*.tar.gz
196
+ dist/*.whl
197
+ prerelease: ${{ steps.check_prerelease.outputs.prerelease }}
198
+
199
+ publish-on-pypi:
200
+ name: Publish
201
+ runs-on: ubuntu-latest
202
+ if: github.ref_type == 'tag'
203
+ needs:
204
+ - release
205
+ steps:
206
+ - name: Download files
207
+ uses: actions/download-artifact@v7
208
+ with:
209
+ name: python-package
210
+ path: dist
211
+ - name: Publish on PyPi
212
+ uses: pypa/gh-action-pypi-publish@release/v1
213
+ with:
214
+ password: ${{ secrets.PYPI_API_TOKEN }}
215
+ packages-dir: dist
@@ -0,0 +1,24 @@
1
+ name: Configure
2
+
3
+ permissions:
4
+ contents: read
5
+ pull-requests: write
6
+
7
+ on:
8
+ workflow_call:
9
+ outputs:
10
+ environments:
11
+ value: ${{ jobs.configure.outputs.environments }}
12
+
13
+ jobs:
14
+ configure:
15
+ name: Configure
16
+ runs-on: ubuntu-latest
17
+ outputs:
18
+ environments: ${{ steps.set-environments.outputs.environments }}
19
+ steps:
20
+ - name: Check out repository
21
+ uses: actions/checkout@v6
22
+ - name: Set environments
23
+ id: set-environments
24
+ run: echo "environments=$(jq -c . < ./.github/environments.json)" >> $GITHUB_OUTPUT
@@ -0,0 +1,21 @@
1
+ name: Schedule CI
2
+
3
+ permissions:
4
+ contents: read
5
+ pull-requests: write
6
+
7
+ on:
8
+ schedule:
9
+ - cron: 30 5 * * *
10
+
11
+ jobs:
12
+ configure:
13
+ name: Configure
14
+ uses: ./.github/workflows/configure.yml
15
+
16
+ security:
17
+ name: Security
18
+ uses: ./.github/workflows/security.yml
19
+ needs: configure
20
+ with:
21
+ environments: ${{ needs.configure.outputs.environments }}
@@ -0,0 +1,33 @@
1
+ name: Security
2
+
3
+ permissions:
4
+ contents: read
5
+ pull-requests: write
6
+
7
+ on:
8
+ workflow_call:
9
+ inputs:
10
+ environments:
11
+ required: True
12
+ type: string
13
+
14
+ jobs:
15
+ security:
16
+ name: Audit packages using Python ${{ matrix.python-version }}
17
+ runs-on: ubuntu-latest
18
+ continue-on-error: True
19
+ strategy:
20
+ fail-fast: False
21
+ matrix:
22
+ python-version: ${{ fromJson(inputs.environments).python-version }}
23
+ steps:
24
+ - name: Check out repository
25
+ uses: actions/checkout@v6
26
+ - name: Set up project
27
+ uses: ./.github/actions/setup-project
28
+ with:
29
+ python-version: ${{ matrix.python-version }}
30
+ - name: Create requirements.txt
31
+ run: uv export --quiet --locked --all-extras --dev --no-hashes --no-editable --output-file=requirements.txt
32
+ - name: Audit python packages
33
+ run: uv run pip-audit --requirement=requirements.txt
@@ -0,0 +1,33 @@
1
+ # OS generated files
2
+ .DS_Store
3
+ ._*
4
+ *.swp
5
+
6
+ # cache
7
+ *.pyc
8
+
9
+ # virtualenv
10
+ .venv
11
+
12
+ # GitHub Action
13
+ output/
14
+
15
+ # checks
16
+ .ruff_cache
17
+ .mypy_cache
18
+ .pytest_cache
19
+ .rumdl_cache
20
+
21
+ # reports
22
+ reports/
23
+ .coverage
24
+
25
+ # build package
26
+ *.egg
27
+ *.egg-info
28
+ build/
29
+ dist/
30
+ netzooe_eservice_api/version.py
31
+
32
+ # others
33
+ netzooe_eservice_api/test.py
@@ -0,0 +1,3 @@
1
+ # Default ignored files
2
+ /shelf/
3
+ /workspace.xml
@@ -0,0 +1 @@
1
+ NetzOOE-eService-API
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="PYTHON_MODULE" version="4">
3
+ <component name="NewModuleRootManager">
4
+ <content url="file://$MODULE_DIR$" />
5
+ <orderEntry type="jdk" jdkName="uv (netzooe_eservice_api)" jdkType="Python SDK" />
6
+ <orderEntry type="sourceFolder" forTests="false" />
7
+ </component>
8
+ </module>
@@ -0,0 +1,12 @@
1
+ <component name="InspectionProjectProfileManager">
2
+ <profile version="1.0">
3
+ <option name="myName" value="Project Default" />
4
+ <inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
5
+ <option name="ignoredIdentifiers">
6
+ <list>
7
+ <option value="str.*" />
8
+ </list>
9
+ </option>
10
+ </inspection_tool>
11
+ </profile>
12
+ </component>
@@ -0,0 +1,6 @@
1
+ <component name="InspectionProjectProfileManager">
2
+ <settings>
3
+ <option name="USE_PROJECT_PROFILE" value="false" />
4
+ <version value="1.0" />
5
+ </settings>
6
+ </component>
@@ -0,0 +1,9 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="Black">
4
+ <option name="enabledOnReformat" value="true" />
5
+ <option name="enabledOnSave" value="true" />
6
+ <option name="sdkName" value="uv (netzooe_eservice_api)" />
7
+ </component>
8
+ <component name="ProjectRootManager" version="2" project-jdk-name="uv (netzooe_eservice_api)" project-jdk-type="Python SDK" />
9
+ </project>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/NetzOOE-eService-API.iml" filepath="$PROJECT_DIR$/.idea/NetzOOE-eService-API.iml" />
6
+ </modules>
7
+ </component>
8
+ </project>
@@ -0,0 +1,17 @@
1
+ <component name="ProjectRunConfigurationManager">
2
+ <configuration default="false" name="tests" type="tests" factoryName="Autodetect">
3
+ <module name="NetzOOE-eService-API" />
4
+ <option name="ENV_FILES" value="" />
5
+ <option name="INTERPRETER_OPTIONS" value="" />
6
+ <option name="PARENT_ENVS" value="true" />
7
+ <option name="SDK_HOME" value="" />
8
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/tests" />
9
+ <option name="IS_MODULE_SDK" value="true" />
10
+ <option name="ADD_CONTENT_ROOTS" value="true" />
11
+ <option name="ADD_SOURCE_ROOTS" value="true" />
12
+ <option name="_new_additionalArguments" value="&quot;&quot;" />
13
+ <option name="_new_target" value="&quot;$PROJECT_DIR$/tests&quot;" />
14
+ <option name="_new_targetType" value="&quot;PATH&quot;" />
15
+ <method v="2" />
16
+ </configuration>
17
+ </component>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="$PROJECT_DIR$" vcs="Git" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,41 @@
1
+ repos:
2
+ - repo: https://github.com/pre-commit/pre-commit-hooks
3
+ rev: v6.0.0
4
+ hooks:
5
+ - id: check-shebang-scripts-are-executable
6
+ - id: check-symlinks
7
+ - id: check-yaml
8
+ - id: check-toml
9
+ - id: detect-private-key
10
+ - id: end-of-file-fixer
11
+ - id: trailing-whitespace
12
+ - repo: local
13
+ hooks:
14
+ - id: black
15
+ name: black
16
+ entry: uv run black --check
17
+ language: system
18
+ types:
19
+ - python
20
+ - id: ruff
21
+ name: ruff
22
+ entry: uv run ruff check
23
+ language: system
24
+ types:
25
+ - python
26
+ - id: mypy
27
+ name: mypy
28
+ entry: uv run mypy
29
+ language: system
30
+ types:
31
+ - python
32
+ - id: rumdl
33
+ name: rumdl
34
+ entry: uv run rumdl check
35
+ language: system
36
+ files: \.md$
37
+ - id: yamllint
38
+ name: yamllint
39
+ entry: uv run yamllint
40
+ language: system
41
+ files: \.ya?ml$
@@ -0,0 +1,31 @@
1
+ extends: default
2
+
3
+ ignore-from-file: .gitignore
4
+
5
+ rules:
6
+ document-start: disable
7
+ truthy:
8
+ allowed-values: ['True', 'False', 'yes', 'no', 'on', 'off'] # yamllint disable rule:brackets
9
+ line-length:
10
+ max: 140
11
+ allow-non-breakable-words: True
12
+ allow-non-breakable-inline-mappings: True
13
+ quoted-strings:
14
+ quote-type: single
15
+ required: only-when-needed
16
+ empty-lines:
17
+ max: 1
18
+ max-start: 0
19
+ max-end: 0
20
+ braces:
21
+ forbid: non-empty
22
+ min-spaces-inside: 0
23
+ max-spaces-inside: 0
24
+ min-spaces-inside-empty: -1
25
+ max-spaces-inside-empty: -1
26
+ brackets:
27
+ forbid: non-empty
28
+ min-spaces-inside: 0
29
+ max-spaces-inside: 0
30
+ min-spaces-inside-empty: -1
31
+ max-spaces-inside-empty: -1
@@ -0,0 +1,12 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [1.0.0] - 2026-02-14
11
+
12
+ Initial release
@@ -0,0 +1,72 @@
1
+ # Contributing
2
+
3
+ <!--start-contributing-->
4
+
5
+ ## Guidelines
6
+
7
+ Contributing to this project should be as easy and transparent as possible, whether it's:
8
+
9
+ - Reporting a bug
10
+ - Discussing the current state of the code
11
+ - Submitting a fix
12
+ - Proposing new features
13
+
14
+ ## Getting started
15
+
16
+ Set up the project with `./scripts/setup.sh`.
17
+
18
+ ## GitHub is used for everything
19
+
20
+ GitHub is used to host code, to track issues and feature requests, as well as accept pull requests.
21
+
22
+ Pull requests are the best way to propose changes to the codebase.
23
+
24
+ 1. Fork the repo and create your branch from `main`
25
+ 2. If you've changed something, update the documentation.
26
+ 3. Make sure your code lints with `./scripts/lint.sh`.
27
+ 4. Test you contribution.
28
+ 5. Issue that pull request!
29
+
30
+ ## Report bugs using Github's [issues](https://github.com/superbox-dev/netzooe_eservice_api/issues)
31
+
32
+ GitHub issues are used to track public bugs.
33
+ Report a bug by [opening a new issue](https://github.com/superbox-dev/netzooe_eservice_api/issues/new/choose);
34
+ it's that easy!
35
+
36
+ ## Write bug reports with detail, background, and sample code
37
+
38
+ **Great Bug Reports** tend to have:
39
+
40
+ - A quick summary and/or background
41
+ - Steps to reproduce
42
+ - Be specific!
43
+ - Give sample code if you can
44
+ - What you expected would happen
45
+ - What actually happens
46
+ - Notes (possibly including why you think this might be happening, or stuff you tried that didn't work)
47
+
48
+ People *love* thorough bug reports. I'm not even kidding.
49
+
50
+ ## Use a Consistent Coding Style
51
+
52
+ Use [black](https://github.com/ambv/black) to make sure the code follows the style.
53
+
54
+ ```bash
55
+ uv run black .
56
+ ```
57
+
58
+ ## Test your code modification
59
+
60
+ To test the code we use [pytest](https://docs.pytest.org):
61
+
62
+ ```bash
63
+ uv run pytest -n auto
64
+ ```
65
+
66
+ ## License
67
+
68
+ By contributing, you agree that your contributions will be licensed under its [Apache License][license].
69
+
70
+ [license]: https://github.com/superbox-dev/keba_keenergy/blob/main/LICENSE
71
+
72
+ <!--end-contributing-->