pydiagral 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 (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))