pydiagral 1.0.0__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. pydiagral-1.0.0/.devcontainer/Dockerfile.dev +30 -0
  2. pydiagral-1.0.0/.devcontainer/devcontainer.json +48 -0
  3. pydiagral-1.0.0/.github/FUNDING.yml +1 -0
  4. pydiagral-1.0.0/.github/dependabot.yml +8 -0
  5. pydiagral-1.0.0/.github/labels.yml +40 -0
  6. pydiagral-1.0.0/.github/workflows/docs.yaml +39 -0
  7. pydiagral-1.0.0/.github/workflows/labeler.yml +21 -0
  8. pydiagral-1.0.0/.github/workflows/lint.yaml +26 -0
  9. pydiagral-1.0.0/.github/workflows/lock.yml +21 -0
  10. pydiagral-1.0.0/.github/workflows/pytest.yaml +50 -0
  11. pydiagral-1.0.0/.github/workflows/release.yaml +57 -0
  12. pydiagral-1.0.0/.github/workflows/semantic-prs.yml +20 -0
  13. pydiagral-1.0.0/.gitignore +165 -0
  14. pydiagral-1.0.0/.releaserc +27 -0
  15. pydiagral-1.0.0/.vscode/extensions.json +7 -0
  16. pydiagral-1.0.0/.vscode/settings.json +7 -0
  17. pydiagral-1.0.0/CHANGELOG.md +41 -0
  18. pydiagral-1.0.0/LICENSE +674 -0
  19. pydiagral-1.0.0/PKG-INFO +828 -0
  20. pydiagral-1.0.0/README.md +127 -0
  21. pydiagral-1.0.0/docs/api.md +12 -0
  22. pydiagral-1.0.0/docs/exceptions.md +18 -0
  23. pydiagral-1.0.0/docs/how-to-find-diagral-serial.png +0 -0
  24. pydiagral-1.0.0/docs/index.md +82 -0
  25. pydiagral-1.0.0/docs/models.md +16 -0
  26. pydiagral-1.0.0/docs/pydiagral-Logo.png +0 -0
  27. pydiagral-1.0.0/example_code.py +174 -0
  28. pydiagral-1.0.0/mkdocs.yml +18 -0
  29. pydiagral-1.0.0/pyproject.toml +225 -0
  30. pydiagral-1.0.0/src/pydiagral/__init__.py +28 -0
  31. pydiagral-1.0.0/src/pydiagral/api.py +1249 -0
  32. pydiagral-1.0.0/src/pydiagral/constants.py +4 -0
  33. pydiagral-1.0.0/src/pydiagral/exceptions.py +39 -0
  34. pydiagral-1.0.0/src/pydiagral/models.py +1498 -0
  35. pydiagral-1.0.0/src/pydiagral/utils.py +14 -0
  36. pydiagral-1.0.0/tests/__init__.py +1 -0
  37. pydiagral-1.0.0/tests/data/configuration_sample.json +354 -0
  38. pydiagral-1.0.0/tests/data/system_details_sample.json +13 -0
  39. pydiagral-1.0.0/tests/test_pydiagral_api.py +2268 -0
@@ -0,0 +1,30 @@
1
+ # Use the Python 3.12 base image for development containers
2
+ ARG VARIANT="3.12"
3
+ FROM mcr.microsoft.com/devcontainers/python:1-${VARIANT}
4
+
5
+ # Configure the shell for RUN commands
6
+ SHELL ["/bin/bash", "-o", "pipefail", "-c"]
7
+
8
+ # Set the working directory
9
+ WORKDIR /workspaces
10
+
11
+ # Copy files into the container
12
+ COPY pyproject.toml ./
13
+ COPY LICENSE ./
14
+ COPY README.md ./
15
+
16
+ # Install pip-tools
17
+ RUN pip install --upgrade pip && pip install pip-tools
18
+
19
+ # Generate requirements.txt from pyproject.toml and install dependencies
20
+ RUN pip-compile pyproject.toml -o requirements.txt && \
21
+ pip install -r requirements.txt
22
+
23
+ # Install the project in editable mode
24
+ RUN pip install -e .[dev]
25
+
26
+ # Set the default shell to bash instead of sh
27
+ ENV SHELL /bin/bash
28
+
29
+ # Keep the container running
30
+ CMD ["bash"]
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "pydiagral Dev",
3
+ "context": "..",
4
+ "dockerFile": "./Dockerfile.dev",
5
+ "features": {
6
+ "ghcr.io/devcontainers/features/github-cli:1": {}
7
+ },
8
+ "postCreateCommand": "pip install -e .",
9
+ "runArgs": ["-e", "GIT_EDITOR=code --wait"],
10
+ "customizations": {
11
+ "vscode": {
12
+ "extensions": [
13
+ "charliermarsh.ruff",
14
+ "ms-python.vscode-pylance",
15
+ "visualstudioexptteam.vscodeintellicode",
16
+ "redhat.vscode-yaml",
17
+ "esbenp.prettier-vscode",
18
+ "GitHub.vscode-pull-request-github",
19
+ "GitHub.copilot"
20
+ ],
21
+ // Please keep this file in sync with settings in .vscode/settings.default.json
22
+ "settings": {
23
+ "python.defaultInterpreterPath": "/usr/local/bin/python",
24
+ "python.pythonPath": "/usr/local/bin/python",
25
+ "python.terminal.activateEnvInCurrentTerminal": true,
26
+ "python.testing.pytestArgs": ["--no-cov"],
27
+ "pylint.importStrategy": "fromEnvironment",
28
+ "python.linting.enabled": true,
29
+ "python.linting.ruffEnabled": true,
30
+ "python.linting.pylintEnabled": false,
31
+ "python.linting.flake8Enabled": false,
32
+ "editor.formatOnPaste": false,
33
+ "editor.formatOnSave": true,
34
+ "editor.formatOnType": true,
35
+ "files.trimTrailingWhitespace": true,
36
+ "terminal.integrated.profiles.linux": {
37
+ "zsh": {
38
+ "path": "/usr/bin/zsh"
39
+ }
40
+ },
41
+ "terminal.integrated.defaultProfile.linux": "zsh",
42
+ "[python]": {
43
+ "editor.defaultFormatter": "charliermarsh.ruff"
44
+ }
45
+ }
46
+ }
47
+ }
48
+ }
@@ -0,0 +1 @@
1
+ github: [mguyard]
@@ -0,0 +1,8 @@
1
+ version: 2
2
+
3
+ updates:
4
+ - package-ecosystem: github-actions
5
+ directory: /
6
+ schedule:
7
+ interval: daily
8
+ target-branch: 'dev'
@@ -0,0 +1,40 @@
1
+ ---
2
+ # Conventional Commit related labels (match entries in `semantics-prs.yml`).
3
+ - name: bug
4
+ description: Something isn't working
5
+ color: d73a4a
6
+ - name: chore
7
+ description: Chore
8
+ color: bfdadc
9
+ - name: ci
10
+ description: Continuous Integration
11
+ color: 4a97d6
12
+ - name: documentation
13
+ description: Improvements or additions to documentation
14
+ color: 0075ca
15
+ - name: feature
16
+ description: New feature or request
17
+ color: a2eeef
18
+ - name: performance
19
+ description: Performance
20
+ color: '016175'
21
+ - name: refactoring
22
+ description: Refactoring
23
+ color: ef67c4
24
+ - name: testing
25
+ description: Testing
26
+ color: b1fc6f
27
+
28
+ # Other labels
29
+ - name: breaking
30
+ description: Breaking Changes
31
+ color: bfd4f2
32
+ - name: help wanted
33
+ description: Extra attention is needed
34
+ color: 008672
35
+ - name: question
36
+ description: Further information is requested
37
+ color: d876e3
38
+ - name: waiting
39
+ description: Waiting for something
40
+ color: daa036
@@ -0,0 +1,39 @@
1
+ name: Generate and Deploy Documentation
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+ workflow_dispatch:
7
+ inputs:
8
+ release:
9
+ description: 'Release to generate and deploy documentation for'
10
+ required: true
11
+ default: 'latest'
12
+
13
+ jobs:
14
+ deploy-docs:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - name: Checkout Code
18
+ uses: actions/checkout@v4
19
+ with:
20
+ ref: ${{ github.event.inputs.release || github.ref }}
21
+
22
+ - name: Set up Python
23
+ uses: actions/setup-python@v4
24
+ with:
25
+ python-version: '3.12'
26
+
27
+ - name: Install dependencies
28
+ run: |
29
+ pip install --upgrade pip
30
+ pip install mkdocs mkdocstrings[python] mkdocs-material
31
+
32
+ - name: Build documentation
33
+ run: mkdocs build --strict
34
+
35
+ - name: Deploy to GitHub Pages
36
+ uses: peaceiris/actions-gh-pages@v4
37
+ with:
38
+ github_token: ${{ secrets.GITHUB_TOKEN }}
39
+ publish_dir: ./site
@@ -0,0 +1,21 @@
1
+ ---
2
+ name: Manage labels
3
+
4
+ on:
5
+ push:
6
+ branches:
7
+ - main
8
+ workflow_dispatch:
9
+
10
+ jobs:
11
+ labeler:
12
+ name: Labeler
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - name: Check out the repository
16
+ uses: actions/checkout@v4
17
+
18
+ - name: Run Labeler
19
+ uses: crazy-max/ghaction-github-labeler@v5.0.0
20
+ with:
21
+ skip-delete: true
@@ -0,0 +1,26 @@
1
+ name: Ruff Linter
2
+
3
+ on:
4
+ push:
5
+ branches: [ dev ]
6
+ pull_request:
7
+ branches: [ main, beta ]
8
+ workflow_dispatch:
9
+ inputs:
10
+ branch:
11
+ description: 'Branch to run linter on'
12
+ required: true
13
+ default: 'dev'
14
+
15
+ jobs:
16
+ ruff:
17
+ runs-on: ubuntu-latest
18
+ if: github.event_name != 'workflow_dispatch' || github.event.inputs.branch == 'dev'
19
+ steps:
20
+ - uses: actions/checkout@v4
21
+ with:
22
+ ref: ${{ github.event.inputs.branch || github.ref }}
23
+ - uses: chartboost/ruff-action@v1
24
+ with:
25
+ args: check --output-format=github --verbose
26
+ src: "."
@@ -0,0 +1,21 @@
1
+ name: Lock
2
+
3
+ # yamllint disable-line rule:truthy
4
+ on:
5
+ schedule:
6
+ - cron: '23 13 * * *'
7
+ workflow_dispatch:
8
+
9
+ jobs:
10
+ lock:
11
+ if: github.repository_owner == 'mguyard'
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: dessant/lock-threads@v5.0.1
15
+ with:
16
+ github-token: ${{ github.token }}
17
+ issue-inactive-days: '30'
18
+ issue-lock-reason: ''
19
+ pr-inactive-days: '30'
20
+ pr-lock-reason: ''
21
+ log-output: true
@@ -0,0 +1,50 @@
1
+ name: PyTest
2
+
3
+ on:
4
+ push:
5
+ branches: [ dev ]
6
+ pull_request:
7
+ branches: [ main, beta ]
8
+ workflow_dispatch:
9
+ inputs:
10
+ branch:
11
+ description: 'Branch to run linter on'
12
+ required: true
13
+ default: 'dev'
14
+
15
+ jobs:
16
+ pytest:
17
+ runs-on: ubuntu-latest
18
+
19
+ steps:
20
+ - name: Checkout code
21
+ uses: actions/checkout@v4
22
+
23
+ - name: Set up Python
24
+ uses: actions/setup-python@v4
25
+ with:
26
+ python-version: '3.12' # Replace with the version of Python you are using
27
+
28
+ - name: Set the PYPROJECT_VERSION environment variable
29
+ run: echo "PYPROJECT_VERSION=0.1.0-dev" >> $GITHUB_ENV
30
+
31
+ - name: Install dependencies
32
+ run: |
33
+ python -m pip install --upgrade pip setuptools wheel hatchling
34
+ pip install pytest pytest-asyncio pytest-html
35
+
36
+ - name: Install pydiagral
37
+ run: |
38
+ pip install --upgrade hatchling
39
+ pip install -e .
40
+
41
+ - name: Run tests
42
+ run: |
43
+ pytest -v --html=report.html --self-contained-html
44
+
45
+ - name: Upload test report
46
+ if: always()
47
+ uses: actions/upload-artifact@v4
48
+ with:
49
+ name: pytest-report
50
+ path: report.html
@@ -0,0 +1,57 @@
1
+ name: Generate Release and publish to PyPI
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ - beta
8
+ workflow_dispatch:
9
+
10
+ jobs:
11
+ release:
12
+ name: Release
13
+ runs-on: ubuntu-latest
14
+ environment:
15
+ name: Semver
16
+ steps:
17
+ - name: Checkout
18
+ uses: actions/checkout@v4
19
+ with:
20
+ fetch-depth: 0
21
+
22
+ - name: Set up Python
23
+ uses: actions/setup-python@v4
24
+ with:
25
+ python-version: "3.10"
26
+
27
+ - name: Install dependencies
28
+ run: |
29
+ python -m pip install --upgrade pip
30
+ python -m pip install hatchling twine
31
+
32
+ - name: Semantic Release
33
+ id: semantic
34
+ uses: cycjimmy/semantic-release-action@v4
35
+ with:
36
+ branch: ${{ github.ref_name }} # Utiliser la branche actuelle
37
+ env:
38
+ GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
39
+ PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
40
+
41
+ - name: Show version
42
+ if: steps.semantic.outputs.new_release_published == 'true'
43
+ run: |
44
+ echo ${{ steps.semantic.outputs.new_release_version }}
45
+ echo ${{ steps.semantic.outputs.new_release_major_version }}
46
+ echo ${{ steps.semantic.outputs.new_release_minor_version }}
47
+ echo ${{ steps.semantic.outputs.new_release_patch_version }}
48
+
49
+ - name: Build package
50
+ if: steps.semantic.outputs.new_release_published == 'true'
51
+ run: python -m hatchling build
52
+ env:
53
+ PYPROJECT_VERSION: ${{ steps.semantic.outputs.new_release_version }}
54
+
55
+ - name: Publish to PyPI
56
+ if: steps.semantic.outputs.new_release_published == 'true'
57
+ run: twine upload dist/* -u __token__ -p "${{ secrets.PYPI_TOKEN }}"
@@ -0,0 +1,20 @@
1
+ ---
2
+ name: Semantic PR
3
+
4
+ on:
5
+ pull_request_target:
6
+ types:
7
+ - opened
8
+ - edited
9
+ - synchronize
10
+ - reopened
11
+
12
+ jobs:
13
+ main:
14
+ name: Validate PR title
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: ytanikin/PRConventionalCommits@1.2.0
18
+ with:
19
+ task_types: '["feat","fix","docs","test","ci","refactor","perf","chore"]'
20
+ custom_labels: '{"feat": "feature", "fix": "bug", "docs": "documentation", "test": "testing", "ci": "ci", "refactor": "refactoring", "perf": "performance", "chore": "chore"}'
@@ -0,0 +1,165 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py,cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ #Pipfile.lock
96
+
97
+ # poetry
98
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
102
+ #poetry.lock
103
+
104
+ # pdm
105
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
106
+ #pdm.lock
107
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
108
+ # in version control.
109
+ # https://pdm.fming.dev/latest/usage/project/#working-with-version-control
110
+ .pdm.toml
111
+ .pdm-python
112
+ .pdm-build/
113
+
114
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
115
+ __pypackages__/
116
+
117
+ # Celery stuff
118
+ celerybeat-schedule
119
+ celerybeat.pid
120
+
121
+ # SageMath parsed files
122
+ *.sage.py
123
+
124
+ # Environments
125
+ .env
126
+ .venv
127
+ env/
128
+ venv/
129
+ ENV/
130
+ env.bak/
131
+ venv.bak/
132
+
133
+ # Spyder project settings
134
+ .spyderproject
135
+ .spyproject
136
+
137
+ # Rope project settings
138
+ .ropeproject
139
+
140
+ # mkdocs documentation
141
+ /site
142
+
143
+ # mypy
144
+ .mypy_cache/
145
+ .dmypy.json
146
+ dmypy.json
147
+
148
+ # Pyre type checker
149
+ .pyre/
150
+
151
+ # pytype static type analyzer
152
+ .pytype/
153
+
154
+ # Cython debug symbols
155
+ cython_debug/
156
+
157
+ # PyCharm
158
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
159
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
160
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
161
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
162
+ #.idea/
163
+
164
+ # Exclusion of env file
165
+ .env
@@ -0,0 +1,27 @@
1
+ {
2
+ "branches": [
3
+ "main",
4
+ {
5
+ "name": "beta",
6
+ "prerelease": true
7
+ }
8
+ ],
9
+ "plugins": [
10
+ "@semantic-release/commit-analyzer",
11
+ "@semantic-release/release-notes-generator",
12
+ [
13
+ "@semantic-release/changelog",
14
+ {
15
+ "changelogFile": "CHANGELOG.md"
16
+ }
17
+ ],
18
+ ["@semantic-release/git", {
19
+ "assets": [
20
+ "CHANGELOG.md",
21
+ "pyproject.toml"
22
+ ],
23
+ "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
24
+ }],
25
+ "@semantic-release/github"
26
+ ]
27
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "recommendations": [
3
+ "charliermarsh.ruff",
4
+ "esbenp.prettier-vscode",
5
+ "ms-python.python"
6
+ ]
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "python.testing.pytestArgs": [
3
+ "tests"
4
+ ],
5
+ "python.testing.unittestEnabled": false,
6
+ "python.testing.pytestEnabled": true
7
+ }
@@ -0,0 +1,41 @@
1
+ # 1.0.0 (2025-02-22)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * Add data in debug request log ([8951ce5](https://github.com/mguyard/pydiagral/commit/8951ce5cc4e7c896aa87bf99312253138fa8a247))
7
+ * Allow detail and user fields in WebHookNotification model to be optional ([0ca68c3](https://github.com/mguyard/pydiagral/commit/0ca68c348a8dcaa58929c987f97ef57b3c8a5efc))
8
+ * Allow detail and user fields in WebHookNotification model to be optional ([5499bbb](https://github.com/mguyard/pydiagral/commit/5499bbbb341f82b19a1513441b861ea720ad0363))
9
+ * Bad object name use in test script ([71d740d](https://github.com/mguyard/pydiagral/commit/71d740daa812daf4d704581c0e4a862565b5c441))
10
+ * Change aiohttp dependancy from static version 3.10.5 to ^3.8.0 ([d509427](https://github.com/mguyard/pydiagral/commit/d50942725f424d361f725999c803470c8a5636e0))
11
+ * Rename test script to don't block pytest ([ec8323f](https://github.com/mguyard/pydiagral/commit/ec8323fdcd6e06ee6aadf5cd2005e7245aa0d219))
12
+ * Resolve aiohttp dependancy syntax ([d9fddcf](https://github.com/mguyard/pydiagral/commit/d9fddcf5801d41f54d1f0409ded98ff7e9717f6c))
13
+ * Resolve issue with Anomalies model and optional fields ([027289a](https://github.com/mguyard/pydiagral/commit/027289a78356ecceb4cf5b8d3121dbcba258b619))
14
+ * Resolve issue with field name containing underscore but without field alias ([1ee94a5](https://github.com/mguyard/pydiagral/commit/1ee94a5de79efa61de668434de830df5abd7ed2d))
15
+ * Resolve issue with previous commit where body data was extracted and not passed ([957a49a](https://github.com/mguyard/pydiagral/commit/957a49af6ceff43fbc07662bef2bb6e5da08cb80))
16
+ * Resolve issue with WebHookNotification dataclass ([b0a4c46](https://github.com/mguyard/pydiagral/commit/b0a4c46fcf817e509879da8046a7f90a1a2d9afb))
17
+ * Return User in WebHookNotification model ([39fc249](https://github.com/mguyard/pydiagral/commit/39fc2493e4abe3aa2e2c2c94ffc483e197efc12d))
18
+ * set is_valid_email methode as private with __ ([90795a5](https://github.com/mguyard/pydiagral/commit/90795a5a15c6c110b1eda56309450e2c042e7721))
19
+ * Update of models to more match models name purposed in Diagral API and ajust test.py script ([798ddd0](https://github.com/mguyard/pydiagral/commit/798ddd039db6909faf354b7fc463446c260d24eb))
20
+ * Update return types in DiagralAPI::get_devices_info methods for improved data handling ([a48ea90](https://github.com/mguyard/pydiagral/commit/a48ea90f97f3c9ac72c5b0ef736feaa301720e54))
21
+ * Update WebHookNotification model to require detail and user fields with improved initialization ([b373e3e](https://github.com/mguyard/pydiagral/commit/b373e3e0727334a422c741e64da0947d69c43df5))
22
+
23
+
24
+ ### Features
25
+
26
+ * Add a class method to create a WebHookNotification instance from a dictionary ([1e17e78](https://github.com/mguyard/pydiagral/commit/1e17e78cbb0275424b4a3c4a1731a23d2b57660a))
27
+ * Add a data model for the device list and update the method for retrieving device information ([8b4160a](https://github.com/mguyard/pydiagral/commit/8b4160a8d9426ab3ffe79ce44cdecba82ae90e8b))
28
+ * Add alarm_type to WebHookNotification and implement alarm type determination based on alarm_code ([fc87d91](https://github.com/mguyard/pydiagral/commit/fc87d91f868e10cf8594cc916167b2ba0ae68927))
29
+ * Add an asynchronous method to retrieve device information from the alarm configuration ([fe1bd8f](https://github.com/mguyard/pydiagral/commit/fe1bd8f46894af25399c27fac07ed6c49c6f644c))
30
+ * Add an optional device_label field to WebHookNotificationDetail ([c429777](https://github.com/mguyard/pydiagral/commit/c42977737b9ac83d7c17b0a48667c0c2f9f362d5))
31
+ * Add apikey argument in validate_apikey and delete_apikey function ([3c40eab](https://github.com/mguyard/pydiagral/commit/3c40eabfe6100bea6715a789b4d9bb03500fe962))
32
+ * Add function to identity webhook type based on alarm_code provided in webhook notification ([088a3c0](https://github.com/mguyard/pydiagral/commit/088a3c03e4aed8f20074ed1b55e1880f9e0ee242))
33
+ * Add model for Webhook Notification ([ca1fe40](https://github.com/mguyard/pydiagral/commit/ca1fe4079ef3c0c54c0589ced92621fef73fa6cf))
34
+ * Add WebHookNotificationUser model to represent users triggering webhook notifications and include it in WebHookNotification model ([d13341f](https://github.com/mguyard/pydiagral/commit/d13341f5ee328c6c4c8c56d046182885d1fc256c))
35
+ * Allow get_configuration function to return results ([f94956a](https://github.com/mguyard/pydiagral/commit/f94956abb4aea8e38aa78451e2d0d6c28c162405))
36
+ * Implement webhook registration, update, and deletion functionality ([37d2c40](https://github.com/mguyard/pydiagral/commit/37d2c40151bd7dbe3244bd33ae97e88589aad6d0))
37
+ * Improve test script example with more easy usage ([8636b6f](https://github.com/mguyard/pydiagral/commit/8636b6f0c809af94f9b090e5decdfc46dac05e4c))
38
+ * Improve test script example with more easy usage ([3199f64](https://github.com/mguyard/pydiagral/commit/3199f64e154f848c745d7e0e6287325b04479355))
39
+ * Include timezone (utc) in the created_at answer for get_anomalies function + test adaptation ([9005af8](https://github.com/mguyard/pydiagral/commit/9005af8637000f94e3ff3007696b228d855565f0))
40
+ * Inplementation of new methods ([d8a2c18](https://github.com/mguyard/pydiagral/commit/d8a2c18637803436a12b13fe7ce813217b5c8357))
41
+ * Update get_anomalies method to return an empty dict if no anomalies are found ([ad2b1da](https://github.com/mguyard/pydiagral/commit/ad2b1daa3b2396866a7f69bfe6aefc0b054dc76d))