updates2mqtt 1.4.1__tar.gz → 1.4.2__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 (65) hide show
  1. updates2mqtt-1.4.2/.github/workflows/auto_assign_issue.yml +18 -0
  2. updates2mqtt-1.4.2/.github/workflows/auto_assign_pr.yml +18 -0
  3. updates2mqtt-1.4.2/.github/workflows/main.yml +18 -0
  4. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/.pre-commit-config.yaml +2 -2
  5. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/CHANGELOG.md +4 -0
  6. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/PKG-INFO +9 -4
  7. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/README.md +8 -3
  8. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/common_packages.yaml +26 -2
  9. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/home_assistant.md +7 -0
  10. updates2mqtt-1.4.2/docs/images/updates2mqtt-dark-256x256.png +0 -0
  11. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/installation.md +6 -5
  12. updates2mqtt-1.4.2/docs/robots.txt +4 -0
  13. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/troubleshooting.md +8 -0
  14. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/examples/config.yaml.maximal +2 -0
  15. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/examples/docker-compose.yaml +1 -1
  16. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/mkdocs.yml +21 -3
  17. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/pyproject.toml +4 -2
  18. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/src/updates2mqtt/config.py +3 -1
  19. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/src/updates2mqtt/hass_formatter.py +20 -4
  20. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/src/updates2mqtt/mqtt.py +8 -6
  21. updates2mqtt-1.4.2/tests/test_hass_formatter.py +68 -0
  22. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/uv.lock +144 -45
  23. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/.dockerignore +0 -0
  24. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/.github/dependabot.yml +0 -0
  25. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/.github/workflows/docker-publish.yml +0 -0
  26. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/.github/workflows/pypi-publish.yml +0 -0
  27. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/.github/workflows/python-package.yml +0 -0
  28. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/.gitignore +0 -0
  29. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/.hintrc +0 -0
  30. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/.python-version +0 -0
  31. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/.safety-project.ini +0 -0
  32. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/Dockerfile +0 -0
  33. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/LICENSE +0 -0
  34. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/SECURITY.md +0 -0
  35. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/conftest.py +0 -0
  36. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/configuration.md +0 -0
  37. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/examples/config_maximal.md +0 -0
  38. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/examples/config_minimal.md +0 -0
  39. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/examples/docker_compose.md +0 -0
  40. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/images/ha_entities.png +0 -0
  41. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/images/ha_mqtt_discovery.png +0 -0
  42. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/images/ha_update_detail.png +0 -0
  43. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/images/ha_update_dialog.png +0 -0
  44. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/images/ha_update_page.png +0 -0
  45. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/images/logo-blank-256x256.png +0 -0
  46. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/index.md +0 -0
  47. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/local_builds.md +0 -0
  48. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/examples/config.yaml.minimal +0 -0
  49. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/no_config.yaml +0 -0
  50. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/refresh-deps.sh +0 -0
  51. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/scripts/healthcheck.sh +0 -0
  52. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/src/updates2mqtt/__init__.py +0 -0
  53. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/src/updates2mqtt/__main__.py +0 -0
  54. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/src/updates2mqtt/app.py +0 -0
  55. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/src/updates2mqtt/integrations/__init__.py +0 -0
  56. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/src/updates2mqtt/integrations/docker.py +0 -0
  57. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/src/updates2mqtt/integrations/git_utils.py +0 -0
  58. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/src/updates2mqtt/model.py +0 -0
  59. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/src/updates2mqtt/py.typed +0 -0
  60. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/tests/__init__.py +0 -0
  61. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/tests/test_app.py +0 -0
  62. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/tests/test_config.py +0 -0
  63. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/tests/test_docker.py +0 -0
  64. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/tests/test_git_utils.py +0 -0
  65. {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/tests/test_mqtt.py +0 -0
@@ -0,0 +1,18 @@
1
+ name: Issue assignment
2
+
3
+ on:
4
+ issues:
5
+ types: [opened]
6
+
7
+ jobs:
8
+ auto-assign:
9
+ runs-on: ubuntu-latest
10
+ permissions:
11
+ issues: write
12
+ steps:
13
+ - name: 'Auto-assign issue'
14
+ uses: pozil/auto-assign-issue@39c06395cbac76e79afc4ad4e5c5c6db6ecfdd2e
15
+ with:
16
+ assignees: jeyrb
17
+ numOfAssignee: 1
18
+ allowSelfAssign: true
@@ -0,0 +1,18 @@
1
+ name: PR assignment
2
+
3
+ on:
4
+ pull_request:
5
+ types: [opened, edited, synchronize, reopened]
6
+
7
+ jobs:
8
+ auto-assign:
9
+ runs-on: ubuntu-latest
10
+ permissions:
11
+ pull-requests: write
12
+ steps:
13
+ - name: 'Auto-assign PR'
14
+ uses: pozil/auto-assign-issue@39c06395cbac76e79afc4ad4e5c5c6db6ecfdd2e
15
+ with:
16
+ repo-token: ${{ secrets.MY_PERSONAL_ACCESS_TOKEN }}
17
+ assignees: jeyrb
18
+ numOfAssignee: 1
@@ -0,0 +1,18 @@
1
+ name: Issue assignment
2
+
3
+ on:
4
+ issues:
5
+ types: [opened]
6
+
7
+ jobs:
8
+ auto-assign:
9
+ runs-on: ubuntu-latest
10
+ permissions:
11
+ issues: write
12
+ steps:
13
+ - name: 'Auto-assign issue'
14
+ uses: pozil/auto-assign-issue@v2
15
+ with:
16
+ assignees: jeyrb
17
+ numOfAssignee: 1
18
+ allowSelfAssign: true
@@ -17,11 +17,11 @@ repos:
17
17
  - id: check-shebang-scripts-are-executable
18
18
  name: Check shell scripts are executable
19
19
  - repo: https://github.com/astral-sh/uv-pre-commit
20
- rev: 0.9.13
20
+ rev: 0.9.16
21
21
  hooks:
22
22
  - id: uv-lock
23
23
  - repo: https://github.com/astral-sh/ruff-pre-commit
24
- rev: v0.14.7
24
+ rev: v0.14.8
25
25
  hooks:
26
26
  # Run the linter.
27
27
  - id: ruff-check
@@ -1,5 +1,9 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 1.4.2
4
+ - Replace `origin` in config MQTT message with `device` for better HomeAssistant compatibility
5
+ - An `area` can be defined in the Home Assistant section of config and this will then be used as `suggested_area` for device
6
+ - Icon and release note info added for Owntone and Homarr
3
7
  ## 1.4.1
4
8
  - More logging for Docker discovery on why Home Assistant doesn't show an update button
5
9
  - More test cases
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: updates2mqtt
3
- Version: 1.4.1
3
+ Version: 1.4.2
4
4
  Summary: System update and docker image notification and execution over MQTT
5
5
  Project-URL: Homepage, https://updates2mqtt.rhizomatics.org.uk
6
6
  Project-URL: Repository, https://github.com/rhizomatics/updates2mqtt
@@ -35,7 +35,7 @@ Requires-Dist: structlog>=25.4.0
35
35
  Requires-Dist: usingversion>=0.1.2
36
36
  Description-Content-Type: text/markdown
37
37
 
38
- [![Rhizomatics Open Source](https://avatars.githubusercontent.com/u/162821163?s=96&v=4)](https://github.com/rhizomatics)
38
+ ![updates2mqtt](/images/updates2mqtt-dark-256x256.png){ align=left }
39
39
 
40
40
  # updates2mqtt
41
41
 
@@ -43,14 +43,19 @@ Description-Content-Type: text/markdown
43
43
 
44
44
  [![PyPI - Version](https://img.shields.io/pypi/v/updates2mqtt)](https://pypi.org/project/updates2mqtt/)
45
45
  [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/rhizomatics/supernotify)
46
- ![Coverage](https://raw.githubusercontent.com/rhizomatics/updates2mqtt/ff84fbfac358820cf9c9e9e582c063cd1a137116/badges/coverage.svg)
47
- ![Tests](https://raw.githubusercontent.com/rhizomatics/updates2mqtt/ff84fbfac358820cf9c9e9e582c063cd1a137116/badges/tests.svg)
46
+ [![Coverage](https://raw.githubusercontent.com/rhizomatics/updates2mqtt/refs/heads/badges/badges/coverage.svg)](https://updates2mqtt.rhizomatics.org.uk/developer/coverage/)
47
+ ![Tests](https://raw.githubusercontent.com/rhizomatics/updates2mqtt/refs/heads/badges/badges/tests.svg)
48
48
  [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/rhizomatics/updates2mqtt/main.svg)](https://results.pre-commit.ci/latest/github/rhizomatics/updates2mqtt/main)
49
49
  [![Publish Python 🐍 distribution 📦 to PyPI and TestPyPI](https://github.com/rhizomatics/updates2mqtt/actions/workflows/pypi-publish.yml/badge.svg)](https://github.com/rhizomatics/updates2mqtt/actions/workflows/pypi-publish.yml)
50
50
  [![Github Deploy](https://github.com/rhizomatics/updates2mqtt/actions/workflows/python-package.yml/badge.svg?branch=main)](https://github.com/rhizomatics/updates2mqtt/actions/workflows/python-package.yml)
51
51
  [![CodeQL](https://github.com/rhizomatics/updates2mqtt/actions/workflows/github-code-scanning/codeql/badge.svg)](https://github.com/rhizomatics/updates2mqtt/actions/workflows/github-code-scanning/codeql)
52
52
  [![Dependabot Updates](https://github.com/rhizomatics/updates2mqtt/actions/workflows/dependabot/dependabot-updates/badge.svg)](https://github.com/rhizomatics/updates2mqtt/actions/workflows/dependabot/dependabot-updates)
53
53
 
54
+
55
+ <br/>
56
+ <br/>
57
+
58
+
54
59
  ## Summary
55
60
 
56
61
  Let Home Assistant tell you about new updates to Docker images for your containers.
@@ -1,4 +1,4 @@
1
- [![Rhizomatics Open Source](https://avatars.githubusercontent.com/u/162821163?s=96&v=4)](https://github.com/rhizomatics)
1
+ ![updates2mqtt](/images/updates2mqtt-dark-256x256.png){ align=left }
2
2
 
3
3
  # updates2mqtt
4
4
 
@@ -6,14 +6,19 @@
6
6
 
7
7
  [![PyPI - Version](https://img.shields.io/pypi/v/updates2mqtt)](https://pypi.org/project/updates2mqtt/)
8
8
  [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/rhizomatics/supernotify)
9
- ![Coverage](https://raw.githubusercontent.com/rhizomatics/updates2mqtt/ff84fbfac358820cf9c9e9e582c063cd1a137116/badges/coverage.svg)
10
- ![Tests](https://raw.githubusercontent.com/rhizomatics/updates2mqtt/ff84fbfac358820cf9c9e9e582c063cd1a137116/badges/tests.svg)
9
+ [![Coverage](https://raw.githubusercontent.com/rhizomatics/updates2mqtt/refs/heads/badges/badges/coverage.svg)](https://updates2mqtt.rhizomatics.org.uk/developer/coverage/)
10
+ ![Tests](https://raw.githubusercontent.com/rhizomatics/updates2mqtt/refs/heads/badges/badges/tests.svg)
11
11
  [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/rhizomatics/updates2mqtt/main.svg)](https://results.pre-commit.ci/latest/github/rhizomatics/updates2mqtt/main)
12
12
  [![Publish Python 🐍 distribution 📦 to PyPI and TestPyPI](https://github.com/rhizomatics/updates2mqtt/actions/workflows/pypi-publish.yml/badge.svg)](https://github.com/rhizomatics/updates2mqtt/actions/workflows/pypi-publish.yml)
13
13
  [![Github Deploy](https://github.com/rhizomatics/updates2mqtt/actions/workflows/python-package.yml/badge.svg?branch=main)](https://github.com/rhizomatics/updates2mqtt/actions/workflows/python-package.yml)
14
14
  [![CodeQL](https://github.com/rhizomatics/updates2mqtt/actions/workflows/github-code-scanning/codeql/badge.svg)](https://github.com/rhizomatics/updates2mqtt/actions/workflows/github-code-scanning/codeql)
15
15
  [![Dependabot Updates](https://github.com/rhizomatics/updates2mqtt/actions/workflows/dependabot/dependabot-updates/badge.svg)](https://github.com/rhizomatics/updates2mqtt/actions/workflows/dependabot/dependabot-updates)
16
16
 
17
+
18
+ <br/>
19
+ <br/>
20
+
21
+
17
22
  ## Summary
18
23
 
19
24
  Let Home Assistant tell you about new updates to Docker images for your containers.
@@ -26,7 +26,7 @@ common_packages:
26
26
  caddy:
27
27
  docker:
28
28
  image_name: caddy
29
- logo_url: https://d1q6f0aelx0por.cloudfront.net/product-logos/library-caddy-logo.png
29
+ logo_url: https://avatars.githubusercontent.com/u/12955528?s=48&v=4
30
30
  release_notes_url: https://github.com/caddyserver/caddy/releases
31
31
 
32
32
  uptime-kuma:
@@ -81,4 +81,28 @@ common_packages:
81
81
  docker:
82
82
  image_name: jellyfin/jellyfin
83
83
  logo_url: https://avatars.githubusercontent.com/u/45698031?s=48&v=4
84
- release_notes_url: https://github.com/jellyfin/jellyfin/releases
84
+ release_notes_url: https://github.com/jellyfin/jellyfin/releases
85
+
86
+ owntone:
87
+ docker:
88
+ image_name: owntone/owntone
89
+ logo_url: https://raw.githubusercontent.com/owntone/owntone-server/443fb684871e005a7e442a08cc4d610208abbe6c/docs/assets/logo.svg
90
+ release_notes_url: https://github.com/owntone/owntone-server/releases
91
+
92
+ homarr:
93
+ docker:
94
+ image_name: ghcr.io/homarr-labs/homarr
95
+ logo_url: https://github.com/homarr-labs/homarr/blob/dev/docs/img/logo/2340450-2-title.png?raw=true
96
+ release_notes_url: https://github.com/homarr-labs/homarr/releases
97
+
98
+ nextcloud:
99
+ docker:
100
+ image_name: nextcloud
101
+ logo_url: https://avatars.githubusercontent.com/u/19211038?s=48&v=4
102
+ release_notes_url: https://github.com/nextcloud/docker/releases
103
+
104
+ n8n:
105
+ docker:
106
+ image_name: docker.n8n.io/n8nio/n8n
107
+ logo_url: https://avatars.githubusercontent.com/u/45487711?s=48&v=4
108
+ release_notes_url: https://github.com/n8n-io/n8n/releases
@@ -16,6 +16,13 @@ The `homeassistant` default topic prefix matches the default updates2mqtt config
16
16
 
17
17
  ![Home Assistant updates in Settings](images/ha_update_page.png "Home Assistant Updates")
18
18
 
19
+ ## Device Creation
20
+
21
+ A Home Assistant device will be created for each Updates2MQTT agent on each server, and Home Assistant
22
+ will then group all the relevant entities together on this device page. Use `device_creation: false` in the
23
+ `homeassistant` config block if you want to switch off this behaviour, and `area` if you want to provide
24
+ a `suggested_area` for the device.
25
+
19
26
  ## MQTT Topics
20
27
 
21
28
  There are 3 separate types of MQTT topic used for HomeAssisstant integration:
@@ -20,13 +20,14 @@ volumes:
20
20
  - /var/run/docker.sock:/var/run/docker.sock
21
21
  # This list of paths is only needed when containers are to be updated
22
22
  # The paths here are completely dependent on where your docker-compose files live
23
- - /home/containers:/home/containers
24
- - /dev.containers:/dev.containers
25
- - /containers:/containers
23
+ # and the internal/external paths must be exactly the same
24
+ - /my/container/home:/my/container/home
25
+ - /more/containers:/more/containers
26
26
  ```
27
27
 
28
- The example `docker-compose.yaml` mounts `/home/containers` for this purpose, so if your containers are in
29
- `/home/containers/app1`, `/home/containers/app2` etc, then updates2mqtt will be able to find them. Map as many root paths as needed.
28
+ The example `docker-compose.yaml` mounts `/my/container/home` for this purpose, so if your containers are in
29
+ `/my/container/home/app1`, `/my/container/home/app2` etc, then updates2mqtt will be able to find them in
30
+ order to restart them. Map as many root paths as needed.
30
31
 
31
32
  ### Without Docker
32
33
 
@@ -0,0 +1,4 @@
1
+ User-agent: *
2
+ Allow: /
3
+
4
+ Sitemap: https://updates2mqtt.rhizomatics.org.uk/sitemap.xml
@@ -1,3 +1,11 @@
1
+ ---
2
+ tags:
3
+ - docker
4
+ - docker-compose
5
+ - homeassistant
6
+ - mqtt
7
+ - paho
8
+ ---
1
9
  # Troubleshooting
2
10
 
3
11
  ## General
@@ -19,6 +19,8 @@ homeassistant:
19
19
  prefix: homeassistant
20
20
  enabled: true
21
21
  state_topic_suffix: state
22
+ area: Server Room
23
+ device_creation: true
22
24
  docker:
23
25
  enabled: true
24
26
  allow_pull: true
@@ -5,7 +5,7 @@ services:
5
5
  volumes:
6
6
  - ./conf:/app/conf # Config file lives at /app/conf/config.yaml inside the container
7
7
  - /var/run/docker.sock:/var/run/docker.sock # Access to Docker daemon for container updates
8
- - /home/containers:/home/containers # Optional, map all root paths for docker compose directories
8
+ - /my/container/home:/my/container/home # Optional, map all root paths for docker compose directories
9
9
  restart: always
10
10
  env_file: ./.env # Environment variables file
11
11
  healthcheck:
@@ -4,13 +4,18 @@ site_description: Notify and take action on server updates via MQTT, with HomeAs
4
4
 
5
5
  repo_name: rhizomatics/updates2mqtt
6
6
  repo_url: https://github.com/rhizomatics/updates2mqtt
7
+ edit_uri: edit/main/docs/
7
8
 
8
9
  theme:
9
10
  name: material
10
11
  highlightjs: true
11
- logo: images/logo-blank-256x256.png
12
+ logo: images/updates2mqtt-dark-256x256.png
12
13
  language: en
14
+ icon:
15
+ repo: fontawesome/brands/github
13
16
  features:
17
+ - content.action.edit
18
+ - content.action.view
14
19
  - content.code.copy
15
20
  - content.code.select
16
21
  - content.code.annotate
@@ -24,14 +29,24 @@ theme:
24
29
  - navigation.top
25
30
  - toc.follow
26
31
  - toc.integrate
32
+ - search.suggest
33
+ - search
34
+ - search.share
27
35
  plugins:
28
36
  - search
29
37
  - autorefs
30
38
  - pagetree
31
39
  - optimize
32
- - tags
40
+ - tags:
41
+ tags: false
42
+ - git-revision-date-localized:
43
+ enable_creation_date: true
44
+ - meta-descriptions
33
45
  - minify:
34
46
  minify_html: true
47
+ - coverage:
48
+ page_path: developer/coverage
49
+ html_report_dir: htmlcov
35
50
  - mkdocstrings:
36
51
  handlers:
37
52
  # See: https://mkdocstrings.github.io/python/usage/
@@ -40,6 +55,10 @@ plugins:
40
55
  show_source: false
41
56
  show_root_heading: true
42
57
  summary: true
58
+ show_inheritance_diagram: false
59
+ overloads_only: true
60
+ show_if_no_docstring: false
61
+
43
62
  markdown_extensions:
44
63
  - admonition
45
64
  - pymdownx.details
@@ -52,7 +71,6 @@ markdown_extensions:
52
71
  pygments_lang_class: true
53
72
  - pymdownx.inlinehilite
54
73
  - pymdownx.superfences
55
- - admonition
56
74
  - smarty
57
75
  - toc:
58
76
  permalink: true
@@ -7,7 +7,7 @@ authors = [
7
7
  ]
8
8
 
9
9
  requires-python = ">=3.13"
10
- version = "1.4.1"
10
+ version = "1.4.2"
11
11
  license="Apache-2.0"
12
12
  keywords=["mqtt", "docker", "updates", "automation","home-assistant","homeassistant","selfhosting"]
13
13
 
@@ -60,14 +60,16 @@ dev = [
60
60
  "genbadge[all]"
61
61
  ]
62
62
  mkdocs=[
63
+ "mkdocs",
63
64
  "mkdocs-material",
64
- "mkdocstrings",
65
65
  "mkdocs-minify-plugin",
66
66
  "mkdocs-autorefs",
67
67
  "mkdocs-pagetree-plugin",
68
68
  "mkdocs-coverage",
69
69
  "mkdocstrings[python]",
70
70
  "pymdown-extensions",
71
+ "mkdocs-git-revision-date-localized-plugin",
72
+ "mkdocs-meta-descriptions-plugin",
71
73
  "pngquant"
72
74
  ]
73
75
 
@@ -49,6 +49,8 @@ class HomeAssistantDiscoveryConfig:
49
49
  class HomeAssistantConfig:
50
50
  discovery: HomeAssistantDiscoveryConfig = field(default_factory=HomeAssistantDiscoveryConfig)
51
51
  state_topic_suffix: str = "state"
52
+ device_creation: bool = True
53
+ area: str | None = None
52
54
 
53
55
 
54
56
  @dataclass
@@ -74,7 +76,7 @@ class LogConfig:
74
76
  class Config:
75
77
  log: LogConfig = field(default_factory=LogConfig)
76
78
  node: NodeConfig = field(default_factory=NodeConfig)
77
- mqtt: MqttConfig = field(default_factory=MqttConfig)
79
+ mqtt: MqttConfig = field(default_factory=MqttConfig) # pyright: ignore[reportCallIssue, reportArgumentType]
78
80
  homeassistant: HomeAssistantConfig = field(default_factory=HomeAssistantConfig)
79
81
  docker: DockerConfig = field(default_factory=DockerConfig)
80
82
  scan_interval: int = 60 * 60 * 3
@@ -19,9 +19,16 @@ HASS_UPDATE_SCHEMA = [
19
19
 
20
20
 
21
21
  def hass_format_config(
22
- discovery: Discovery, object_id: str, node_name: str, state_topic: str, command_topic: str | None, session: str
22
+ discovery: Discovery,
23
+ object_id: str,
24
+ node_name: str,
25
+ state_topic: str,
26
+ command_topic: str | None,
27
+ device_creation: bool = True,
28
+ area: str | None = None,
29
+ session: str | None = None,
23
30
  ) -> dict[str, Any]:
24
- config = {
31
+ config: dict[str, Any] = {
25
32
  "name": f"{discovery.name} {discovery.source_type} on {node_name}",
26
33
  "device_class": None, # not firmware, so defaults to null
27
34
  "unique_id": object_id,
@@ -37,11 +44,20 @@ def hass_format_config(
37
44
  "latest_version_topic": state_topic,
38
45
  "latest_version_template": "{{value_json.latest_version}}",
39
46
  "origin": {
40
- "name": "updates2mqtt",
41
- "sw_version": updates2mqtt.version,
47
+ "name": f"{node_name} updates2mqtt Agent",
48
+ "sw_version": updates2mqtt.version, # pyright: ignore[reportAttributeAccessIssue]
42
49
  "support_url": "https://github.com/rhizomatics/updates2mqtt/issues",
43
50
  },
44
51
  }
52
+ if device_creation:
53
+ config["device"] = {
54
+ "name": f"{node_name} updates2mqtt Agent",
55
+ "sw_version": updates2mqtt.version, # pyright: ignore[reportAttributeAccessIssue]
56
+ "manufacturer": "rhizomatics",
57
+ "identifiers": [f"{node_name}.updates2mqtt"],
58
+ }
59
+ if area:
60
+ config["device"]["suggested_area"] = area
45
61
  if command_topic:
46
62
  config["command_topic"] = command_topic
47
63
  config["payload_install"] = f"{discovery.source_type}|{discovery.name}|install"
@@ -315,12 +315,14 @@ class MqttPublisher:
315
315
  self.publish(
316
316
  self.config_topic(discovery),
317
317
  hass_format_config(
318
- discovery,
319
- object_id,
320
- self.node_cfg.name,
321
- self.state_topic(discovery),
322
- command_topic,
323
- discovery.session,
318
+ discovery=discovery,
319
+ object_id=object_id,
320
+ node_name=self.node_cfg.name,
321
+ area=self.hass_cfg.area,
322
+ state_topic=self.state_topic(discovery),
323
+ command_topic=command_topic,
324
+ device_creation=self.hass_cfg.device_creation,
325
+ session=discovery.session,
324
326
  ),
325
327
  )
326
328
 
@@ -0,0 +1,68 @@
1
+ import updates2mqtt
2
+ from conftest import Discovery
3
+ from updates2mqtt.hass_formatter import hass_format_config
4
+
5
+
6
+ def test_formatter_includes_device(mock_discoveries: list[Discovery], monkeypatch) -> None: # noqa: ANN001
7
+ monkeypatch.setattr(updates2mqtt, "version", "3.0.0")
8
+ msg = hass_format_config(mock_discoveries[0], "obj001", "testbed01", "state_topic_1", "command_topic_1", area="Basement")
9
+ assert msg == {
10
+ "name": "thing-1 unit_test on testbed01",
11
+ "unique_id": "obj001",
12
+ "update_policy": None,
13
+ "can_build": False,
14
+ "can_restart": False,
15
+ "can_update": False,
16
+ "command_topic": "command_topic_1",
17
+ "state_topic": "state_topic_1",
18
+ "device_class": None,
19
+ "entity_picture": None,
20
+ "icon": None,
21
+ "latest_version_template": "{{value_json.latest_version}}",
22
+ "latest_version_topic": "state_topic_1",
23
+ "payload_install": "unit_test|thing-1|install",
24
+ "source_session": None,
25
+ "supported_features": [],
26
+ "origin": {
27
+ "name": "testbed01 updates2mqtt Agent",
28
+ "sw_version": "3.0.0",
29
+ "support_url": "https://github.com/rhizomatics/updates2mqtt/issues",
30
+ },
31
+ "device": {
32
+ "identifiers": ["testbed01.updates2mqtt"],
33
+ "manufacturer": "rhizomatics",
34
+ "name": "testbed01 updates2mqtt Agent",
35
+ "suggested_area": "Basement",
36
+ "sw_version": "3.0.0",
37
+ },
38
+ }
39
+
40
+
41
+ def test_formatter_excludes_device(mock_discoveries: list[Discovery], monkeypatch) -> None: # noqa: ANN001
42
+ monkeypatch.setattr(updates2mqtt, "version", "3.0.0")
43
+ msg = hass_format_config(
44
+ mock_discoveries[0], "obj001", "testbed01", "state_topic_1", "command_topic_1", device_creation=False
45
+ )
46
+ assert msg == {
47
+ "name": "thing-1 unit_test on testbed01",
48
+ "unique_id": "obj001",
49
+ "update_policy": None,
50
+ "can_build": False,
51
+ "can_restart": False,
52
+ "can_update": False,
53
+ "command_topic": "command_topic_1",
54
+ "state_topic": "state_topic_1",
55
+ "device_class": None,
56
+ "entity_picture": None,
57
+ "icon": None,
58
+ "latest_version_template": "{{value_json.latest_version}}",
59
+ "latest_version_topic": "state_topic_1",
60
+ "payload_install": "unit_test|thing-1|install",
61
+ "source_session": None,
62
+ "supported_features": [],
63
+ "origin": {
64
+ "name": "testbed01 updates2mqtt Agent",
65
+ "sw_version": "3.0.0",
66
+ "support_url": "https://github.com/rhizomatics/updates2mqtt/issues",
67
+ },
68
+ }
@@ -55,6 +55,19 @@ wheels = [
55
55
  { url = "https://files.pythonhosted.org/packages/02/e3/a4fa1946722c4c7b063cc25043a12d9ce9b4323777f89643be74cef2993c/backrefs-6.1-py39-none-any.whl", hash = "sha256:a9e99b8a4867852cad177a6430e31b0f6e495d65f8c6c134b68c14c3c95bf4b0", size = 381058, upload-time = "2025-11-15T14:52:06.698Z" },
56
56
  ]
57
57
 
58
+ [[package]]
59
+ name = "beautifulsoup4"
60
+ version = "4.14.3"
61
+ source = { registry = "https://pypi.org/simple" }
62
+ dependencies = [
63
+ { name = "soupsieve" },
64
+ { name = "typing-extensions" },
65
+ ]
66
+ sdist = { url = "https://files.pythonhosted.org/packages/c3/b0/1c6a16426d389813b48d95e26898aff79abbde42ad353958ad95cc8c9b21/beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86", size = 627737, upload-time = "2025-11-30T15:08:26.084Z" }
67
+ wheels = [
68
+ { url = "https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb", size = 107721, upload-time = "2025-11-30T15:08:24.087Z" },
69
+ ]
70
+
58
71
  [[package]]
59
72
  name = "certifi"
60
73
  version = "2025.11.12"
@@ -304,6 +317,30 @@ wheels = [
304
317
  { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload-time = "2022-05-02T15:47:14.552Z" },
305
318
  ]
306
319
 
320
+ [[package]]
321
+ name = "gitdb"
322
+ version = "4.0.12"
323
+ source = { registry = "https://pypi.org/simple" }
324
+ dependencies = [
325
+ { name = "smmap" },
326
+ ]
327
+ sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload-time = "2025-01-02T07:20:46.413Z" }
328
+ wheels = [
329
+ { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794, upload-time = "2025-01-02T07:20:43.624Z" },
330
+ ]
331
+
332
+ [[package]]
333
+ name = "gitpython"
334
+ version = "3.1.45"
335
+ source = { registry = "https://pypi.org/simple" }
336
+ dependencies = [
337
+ { name = "gitdb" },
338
+ ]
339
+ sdist = { url = "https://files.pythonhosted.org/packages/9a/c8/dd58967d119baab745caec2f9d853297cec1989ec1d63f677d3880632b88/gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c", size = 215076, upload-time = "2025-07-24T03:45:54.871Z" }
340
+ wheels = [
341
+ { url = "https://files.pythonhosted.org/packages/01/61/d4b89fec821f72385526e1b9d9a3a0385dda4a72b206d28049e2c7cd39b8/gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77", size = 208168, upload-time = "2025-07-24T03:45:52.517Z" },
342
+ ]
343
+
307
344
  [[package]]
308
345
  name = "griffe"
309
346
  version = "1.15.0"
@@ -327,15 +364,15 @@ wheels = [
327
364
 
328
365
  [[package]]
329
366
  name = "hishel"
330
- version = "1.1.6"
367
+ version = "1.1.7"
331
368
  source = { registry = "https://pypi.org/simple" }
332
369
  dependencies = [
333
370
  { name = "msgpack" },
334
371
  { name = "typing-extensions" },
335
372
  ]
336
- sdist = { url = "https://files.pythonhosted.org/packages/5b/df/bdca7040780c09a17d968145e6436eb2aeed5e5abd4ed68ccda8130cc792/hishel-1.1.6.tar.gz", hash = "sha256:961e24bf13432f4f8ff2d1685d4d53cedc854bcb0b63b08581e44c230b67cbb1", size = 60989, upload-time = "2025-11-17T19:54:56.014Z" }
373
+ sdist = { url = "https://files.pythonhosted.org/packages/45/cf/4e1d09cc81c48ff7498398fd82c87fb21800c85e631d03831703d8594506/hishel-1.1.7.tar.gz", hash = "sha256:32c625be581e94dc50b773a8cfb9a65cba487660561950fe976ae49945455179", size = 61473, upload-time = "2025-12-03T09:32:28.524Z" }
337
374
  wheels = [
338
- { url = "https://files.pythonhosted.org/packages/d6/a4/444bb6da7935bb6d522549581ef65a614fdf385cd503effd691436ac7e1f/hishel-1.1.6-py3-none-any.whl", hash = "sha256:88379389769193998cd52a21355f26cbca990ff1f5fd815dccdd9db37b5da7c3", size = 70229, upload-time = "2025-11-17T19:54:54.753Z" },
375
+ { url = "https://files.pythonhosted.org/packages/0c/2a/8134de761e4fd9d0a3b301b897b8c5ce9ccb17af7f846d66c676d8c03fd8/hishel-1.1.7-py3-none-any.whl", hash = "sha256:436c2a5a62d705528e581cbeba85b10d130c47c861906b21262a07ac02463a9f", size = 70569, upload-time = "2025-12-03T09:32:27.144Z" },
339
376
  ]
340
377
 
341
378
  [package.optional-dependencies]
@@ -599,6 +636,21 @@ wheels = [
599
636
  { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521, upload-time = "2023-11-20T17:51:08.587Z" },
600
637
  ]
601
638
 
639
+ [[package]]
640
+ name = "mkdocs-git-revision-date-localized-plugin"
641
+ version = "1.5.0"
642
+ source = { registry = "https://pypi.org/simple" }
643
+ dependencies = [
644
+ { name = "babel" },
645
+ { name = "gitpython" },
646
+ { name = "mkdocs" },
647
+ { name = "tzdata", marker = "sys_platform == 'win32'" },
648
+ ]
649
+ sdist = { url = "https://files.pythonhosted.org/packages/0f/c5/1d3c4e6ddae6230b89d09105cb79de711655e3ebd6745f7a92efea0f5160/mkdocs_git_revision_date_localized_plugin-1.5.0.tar.gz", hash = "sha256:17345ccfdf69a1905dc96fb1070dce82d03a1eb6b0d48f958081a7589ce3c248", size = 460697, upload-time = "2025-10-31T16:11:34.44Z" }
650
+ wheels = [
651
+ { url = "https://files.pythonhosted.org/packages/bc/51/fe0e3fdb16f6eed65c9459d12bae6a4e1f0bb4e2228cb037e7907b002678/mkdocs_git_revision_date_localized_plugin-1.5.0-py3-none-any.whl", hash = "sha256:933f9e35a8c135b113f21bb57610d82e9b7bcc71dd34fb06a029053c97e99656", size = 26153, upload-time = "2025-10-31T16:11:32.987Z" },
652
+ ]
653
+
602
654
  [[package]]
603
655
  name = "mkdocs-material"
604
656
  version = "9.7.0"
@@ -630,6 +682,21 @@ wheels = [
630
682
  { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728, upload-time = "2023-11-22T19:09:43.465Z" },
631
683
  ]
632
684
 
685
+ [[package]]
686
+ name = "mkdocs-meta-descriptions-plugin"
687
+ version = "4.1.0"
688
+ source = { registry = "https://pypi.org/simple" }
689
+ dependencies = [
690
+ { name = "beautifulsoup4" },
691
+ { name = "mkdocs" },
692
+ { name = "packaging" },
693
+ { name = "pymdown-extensions" },
694
+ ]
695
+ sdist = { url = "https://files.pythonhosted.org/packages/2b/18/ee307424dd767c14b3b90137180fb0bc4784148eb3b6985bcf7324ba3174/mkdocs_meta_descriptions_plugin-4.1.0.tar.gz", hash = "sha256:2da083f97ad4d580de3fcef9ea7d2c60037445addfb41d1272f5813659ddb765", size = 144951, upload-time = "2025-04-19T15:29:53.448Z" }
696
+ wheels = [
697
+ { url = "https://files.pythonhosted.org/packages/94/54/da9ea958a070aac4bc1bed682f55aa090eff3130af5f59ad83014b2191b3/mkdocs_meta_descriptions_plugin-4.1.0-py3-none-any.whl", hash = "sha256:e1fb07c1de09e58af82d7ef85bd462766bac916f91b3a3de9f569ca495e6b810", size = 8922, upload-time = "2025-04-19T15:29:51.934Z" },
698
+ ]
699
+
633
700
  [[package]]
634
701
  name = "mkdocs-minify-plugin"
635
702
  version = "0.8.0"
@@ -681,16 +748,16 @@ python = [
681
748
 
682
749
  [[package]]
683
750
  name = "mkdocstrings-python"
684
- version = "2.0.0"
751
+ version = "2.0.1"
685
752
  source = { registry = "https://pypi.org/simple" }
686
753
  dependencies = [
687
754
  { name = "griffe" },
688
755
  { name = "mkdocs-autorefs" },
689
756
  { name = "mkdocstrings" },
690
757
  ]
691
- sdist = { url = "https://files.pythonhosted.org/packages/ca/0d/dab7b08ca7e5a38b033cd83565bb0f95f05e8f3df7bc273e793c2ad3576e/mkdocstrings_python-2.0.0.tar.gz", hash = "sha256:4d872290f595221740a304bebca5b3afa4beafe84cc6fd27314d52dc3fbb4676", size = 199113, upload-time = "2025-11-27T16:44:44.894Z" }
758
+ sdist = { url = "https://files.pythonhosted.org/packages/24/75/d30af27a2906f00eb90143470272376d728521997800f5dce5b340ba35bc/mkdocstrings_python-2.0.1.tar.gz", hash = "sha256:843a562221e6a471fefdd4b45cc6c22d2607ccbad632879234fa9692e9cf7732", size = 199345, upload-time = "2025-12-03T14:26:11.755Z" }
692
759
  wheels = [
693
- { url = "https://files.pythonhosted.org/packages/79/de/063481352688c3a1468c51c10b6cfb858d5e35dfef8323d9c83c4f2faa03/mkdocstrings_python-2.0.0-py3-none-any.whl", hash = "sha256:1d552dda109d47e4fddecbb1f06f9a86699c1b073e8b166fba89eeef0a0ffec6", size = 104803, upload-time = "2025-11-27T16:44:43.441Z" },
760
+ { url = "https://files.pythonhosted.org/packages/81/06/c5f8deba7d2cbdfa7967a716ae801aa9ca5f734b8f54fd473ef77a088dbe/mkdocstrings_python-2.0.1-py3-none-any.whl", hash = "sha256:66ecff45c5f8b71bf174e11d49afc845c2dfc7fc0ab17a86b6b337e0f24d8d90", size = 105055, upload-time = "2025-12-03T14:26:10.184Z" },
694
761
  ]
695
762
 
696
763
  [[package]]
@@ -846,11 +913,11 @@ wheels = [
846
913
 
847
914
  [[package]]
848
915
  name = "platformdirs"
849
- version = "4.5.0"
916
+ version = "4.5.1"
850
917
  source = { registry = "https://pypi.org/simple" }
851
- sdist = { url = "https://files.pythonhosted.org/packages/61/33/9611380c2bdb1225fdef633e2a9610622310fed35ab11dac9620972ee088/platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312", size = 21632, upload-time = "2025-10-08T17:44:48.791Z" }
918
+ sdist = { url = "https://files.pythonhosted.org/packages/cf/86/0248f086a84f01b37aaec0fa567b397df1a119f73c16f6c7a9aac73ea309/platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda", size = 21715, upload-time = "2025-12-05T13:52:58.638Z" }
852
919
  wheels = [
853
- { url = "https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3", size = 18651, upload-time = "2025-10-08T17:44:47.223Z" },
920
+ { url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" },
854
921
  ]
855
922
 
856
923
  [[package]]
@@ -942,7 +1009,7 @@ wheels = [
942
1009
 
943
1010
  [[package]]
944
1011
  name = "pytest"
945
- version = "8.4.2"
1012
+ version = "9.0.2"
946
1013
  source = { registry = "https://pypi.org/simple" }
947
1014
  dependencies = [
948
1015
  { name = "colorama", marker = "sys_platform == 'win32'" },
@@ -951,9 +1018,9 @@ dependencies = [
951
1018
  { name = "pluggy" },
952
1019
  { name = "pygments" },
953
1020
  ]
954
- sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" }
1021
+ sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" }
955
1022
  wheels = [
956
- { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" },
1023
+ { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" },
957
1024
  ]
958
1025
 
959
1026
  [[package]]
@@ -984,29 +1051,29 @@ wheels = [
984
1051
 
985
1052
  [[package]]
986
1053
  name = "pytest-docker-fixtures"
987
- version = "1.4.1"
1054
+ version = "1.4.2"
988
1055
  source = { registry = "https://pypi.org/simple" }
989
1056
  dependencies = [
990
1057
  { name = "docker" },
991
1058
  { name = "pytest" },
992
1059
  { name = "requests" },
993
1060
  ]
994
- sdist = { url = "https://files.pythonhosted.org/packages/69/a4/19744cbed14b9056b14ded4e466ff0a0918e400db6c4325e3436e1ee5eb0/pytest_docker_fixtures-1.4.1.tar.gz", hash = "sha256:b04f2a9e980c2709ba950c9ecabcb533f8175aede1fd4dd46862928f5d7d136d", size = 11166, upload-time = "2025-11-18T14:51:20.823Z" }
1061
+ sdist = { url = "https://files.pythonhosted.org/packages/a8/fa/249702cb610b734792493ca0bd305211003a9d79c9710ba76fba0404482c/pytest_docker_fixtures-1.4.2.tar.gz", hash = "sha256:1261094c7a50cb03e80eff16daaf5a6c36c512915d2e3634d2f52b9bddff7078", size = 11325, upload-time = "2025-12-01T13:44:01.284Z" }
995
1062
  wheels = [
996
- { url = "https://files.pythonhosted.org/packages/30/03/76fbea51ec209887c3c65b9d60443c228afc5d76339cb47b2b55fbc449cc/pytest_docker_fixtures-1.4.1-py3-none-any.whl", hash = "sha256:95db69da43cb49db798ba50e8ee2832358e979d6fba91613d02c8021f4a5b9c1", size = 14309, upload-time = "2025-11-18T14:51:19.869Z" },
1063
+ { url = "https://files.pythonhosted.org/packages/09/a1/c0dff3c5f7c8e8e1244a10d028fac851d78518f420560c54cfa5a839514b/pytest_docker_fixtures-1.4.2-py3-none-any.whl", hash = "sha256:0ed36ede25c646f775c2d7a09c7811a9a5ab9cb3003994caeb53d84efbfcae7b", size = 14407, upload-time = "2025-12-01T13:43:59.942Z" },
997
1064
  ]
998
1065
 
999
1066
  [[package]]
1000
1067
  name = "pytest-httpx"
1001
- version = "0.35.0"
1068
+ version = "0.36.0"
1002
1069
  source = { registry = "https://pypi.org/simple" }
1003
1070
  dependencies = [
1004
1071
  { name = "httpx" },
1005
1072
  { name = "pytest" },
1006
1073
  ]
1007
- sdist = { url = "https://files.pythonhosted.org/packages/1f/89/5b12b7b29e3d0af3a4b9c071ee92fa25a9017453731a38f08ba01c280f4c/pytest_httpx-0.35.0.tar.gz", hash = "sha256:d619ad5d2e67734abfbb224c3d9025d64795d4b8711116b1a13f72a251ae511f", size = 54146, upload-time = "2024-11-28T19:16:54.237Z" }
1074
+ sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/5574834da9499066fa1a5ea9c336f94dba2eae02298d36dab192fcf95c86/pytest_httpx-0.36.0.tar.gz", hash = "sha256:9edb66a5fd4388ce3c343189bc67e7e1cb50b07c2e3fc83b97d511975e8a831b", size = 56793, upload-time = "2025-12-02T16:34:57.414Z" }
1008
1075
  wheels = [
1009
- { url = "https://files.pythonhosted.org/packages/b0/ed/026d467c1853dd83102411a78126b4842618e86c895f93528b0528c7a620/pytest_httpx-0.35.0-py3-none-any.whl", hash = "sha256:ee11a00ffcea94a5cbff47af2114d34c5b231c326902458deed73f9c459fd744", size = 19442, upload-time = "2024-11-28T19:16:52.787Z" },
1076
+ { url = "https://files.pythonhosted.org/packages/e2/d2/1eb1ea9c84f0d2033eb0b49675afdc71aa4ea801b74615f00f3c33b725e3/pytest_httpx-0.36.0-py3-none-any.whl", hash = "sha256:bd4c120bb80e142df856e825ec9f17981effb84d159f9fa29ed97e2357c3a9c8", size = 20229, upload-time = "2025-12-02T16:34:56.45Z" },
1010
1077
  ]
1011
1078
 
1012
1079
  [[package]]
@@ -1149,28 +1216,28 @@ wheels = [
1149
1216
 
1150
1217
  [[package]]
1151
1218
  name = "ruff"
1152
- version = "0.14.7"
1153
- source = { registry = "https://pypi.org/simple" }
1154
- sdist = { url = "https://files.pythonhosted.org/packages/b7/5b/dd7406afa6c95e3d8fa9d652b6d6dd17dd4a6bf63cb477014e8ccd3dcd46/ruff-0.14.7.tar.gz", hash = "sha256:3417deb75d23bd14a722b57b0a1435561db65f0ad97435b4cf9f85ffcef34ae5", size = 5727324, upload-time = "2025-11-28T20:55:10.525Z" }
1155
- wheels = [
1156
- { url = "https://files.pythonhosted.org/packages/8c/b1/7ea5647aaf90106f6d102230e5df874613da43d1089864da1553b899ba5e/ruff-0.14.7-py3-none-linux_armv6l.whl", hash = "sha256:b9d5cb5a176c7236892ad7224bc1e63902e4842c460a0b5210701b13e3de4fca", size = 13414475, upload-time = "2025-11-28T20:54:54.569Z" },
1157
- { url = "https://files.pythonhosted.org/packages/af/19/fddb4cd532299db9cdaf0efdc20f5c573ce9952a11cb532d3b859d6d9871/ruff-0.14.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3f64fe375aefaf36ca7d7250292141e39b4cea8250427482ae779a2aa5d90015", size = 13634613, upload-time = "2025-11-28T20:55:17.54Z" },
1158
- { url = "https://files.pythonhosted.org/packages/40/2b/469a66e821d4f3de0440676ed3e04b8e2a1dc7575cf6fa3ba6d55e3c8557/ruff-0.14.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:93e83bd3a9e1a3bda64cb771c0d47cda0e0d148165013ae2d3554d718632d554", size = 12765458, upload-time = "2025-11-28T20:55:26.128Z" },
1159
- { url = "https://files.pythonhosted.org/packages/f1/05/0b001f734fe550bcfde4ce845948ac620ff908ab7241a39a1b39bb3c5f49/ruff-0.14.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3838948e3facc59a6070795de2ae16e5786861850f78d5914a03f12659e88f94", size = 13236412, upload-time = "2025-11-28T20:55:28.602Z" },
1160
- { url = "https://files.pythonhosted.org/packages/11/36/8ed15d243f011b4e5da75cd56d6131c6766f55334d14ba31cce5461f28aa/ruff-0.14.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:24c8487194d38b6d71cd0fd17a5b6715cda29f59baca1defe1e3a03240f851d1", size = 13182949, upload-time = "2025-11-28T20:55:33.265Z" },
1161
- { url = "https://files.pythonhosted.org/packages/3b/cf/fcb0b5a195455729834f2a6eadfe2e4519d8ca08c74f6d2b564a4f18f553/ruff-0.14.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79c73db6833f058a4be8ffe4a0913b6d4ad41f6324745179bd2aa09275b01d0b", size = 13816470, upload-time = "2025-11-28T20:55:08.203Z" },
1162
- { url = "https://files.pythonhosted.org/packages/7f/5d/34a4748577ff7a5ed2f2471456740f02e86d1568a18c9faccfc73bd9ca3f/ruff-0.14.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:12eb7014fccff10fc62d15c79d8a6be4d0c2d60fe3f8e4d169a0d2def75f5dad", size = 15289621, upload-time = "2025-11-28T20:55:30.837Z" },
1163
- { url = "https://files.pythonhosted.org/packages/53/53/0a9385f047a858ba133d96f3f8e3c9c66a31cc7c4b445368ef88ebeac209/ruff-0.14.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c623bbdc902de7ff715a93fa3bb377a4e42dd696937bf95669118773dbf0c50", size = 14975817, upload-time = "2025-11-28T20:55:24.107Z" },
1164
- { url = "https://files.pythonhosted.org/packages/a8/d7/2f1c32af54c3b46e7fadbf8006d8b9bcfbea535c316b0bd8813d6fb25e5d/ruff-0.14.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f53accc02ed2d200fa621593cdb3c1ae06aa9b2c3cae70bc96f72f0000ae97a9", size = 14284549, upload-time = "2025-11-28T20:55:06.08Z" },
1165
- { url = "https://files.pythonhosted.org/packages/92/05/434ddd86becd64629c25fb6b4ce7637dd52a45cc4a4415a3008fe61c27b9/ruff-0.14.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:281f0e61a23fcdcffca210591f0f53aafaa15f9025b5b3f9706879aaa8683bc4", size = 14071389, upload-time = "2025-11-28T20:55:35.617Z" },
1166
- { url = "https://files.pythonhosted.org/packages/ff/50/fdf89d4d80f7f9d4f420d26089a79b3bb1538fe44586b148451bc2ba8d9c/ruff-0.14.7-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:dbbaa5e14148965b91cb090236931182ee522a5fac9bc5575bafc5c07b9f9682", size = 14202679, upload-time = "2025-11-28T20:55:01.472Z" },
1167
- { url = "https://files.pythonhosted.org/packages/77/54/87b34988984555425ce967f08a36df0ebd339bb5d9d0e92a47e41151eafc/ruff-0.14.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1464b6e54880c0fe2f2d6eaefb6db15373331414eddf89d6b903767ae2458143", size = 13147677, upload-time = "2025-11-28T20:55:19.933Z" },
1168
- { url = "https://files.pythonhosted.org/packages/67/29/f55e4d44edfe053918a16a3299e758e1c18eef216b7a7092550d7a9ec51c/ruff-0.14.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:f217ed871e4621ea6128460df57b19ce0580606c23aeab50f5de425d05226784", size = 13151392, upload-time = "2025-11-28T20:55:21.967Z" },
1169
- { url = "https://files.pythonhosted.org/packages/36/69/47aae6dbd4f1d9b4f7085f4d9dcc84e04561ee7ad067bf52e0f9b02e3209/ruff-0.14.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6be02e849440ed3602d2eb478ff7ff07d53e3758f7948a2a598829660988619e", size = 13412230, upload-time = "2025-11-28T20:55:12.749Z" },
1170
- { url = "https://files.pythonhosted.org/packages/b7/4b/6e96cb6ba297f2ba502a231cd732ed7c3de98b1a896671b932a5eefa3804/ruff-0.14.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:19a0f116ee5e2b468dfe80c41c84e2bbd6b74f7b719bee86c2ecde0a34563bcc", size = 14195397, upload-time = "2025-11-28T20:54:56.896Z" },
1171
- { url = "https://files.pythonhosted.org/packages/69/82/251d5f1aa4dcad30aed491b4657cecd9fb4274214da6960ffec144c260f7/ruff-0.14.7-py3-none-win32.whl", hash = "sha256:e33052c9199b347c8937937163b9b149ef6ab2e4bb37b042e593da2e6f6cccfa", size = 13126751, upload-time = "2025-11-28T20:55:03.47Z" },
1172
- { url = "https://files.pythonhosted.org/packages/a8/b5/d0b7d145963136b564806f6584647af45ab98946660d399ec4da79cae036/ruff-0.14.7-py3-none-win_amd64.whl", hash = "sha256:e17a20ad0d3fad47a326d773a042b924d3ac31c6ca6deb6c72e9e6b5f661a7c6", size = 14531726, upload-time = "2025-11-28T20:54:59.121Z" },
1173
- { url = "https://files.pythonhosted.org/packages/1d/d2/1637f4360ada6a368d3265bf39f2cf737a0aaab15ab520fc005903e883f8/ruff-0.14.7-py3-none-win_arm64.whl", hash = "sha256:be4d653d3bea1b19742fcc6502354e32f65cd61ff2fbdb365803ef2c2aec6228", size = 13609215, upload-time = "2025-11-28T20:55:15.375Z" },
1219
+ version = "0.14.8"
1220
+ source = { registry = "https://pypi.org/simple" }
1221
+ sdist = { url = "https://files.pythonhosted.org/packages/ed/d9/f7a0c4b3a2bf2556cd5d99b05372c29980249ef71e8e32669ba77428c82c/ruff-0.14.8.tar.gz", hash = "sha256:774ed0dd87d6ce925e3b8496feb3a00ac564bea52b9feb551ecd17e0a23d1eed", size = 5765385, upload-time = "2025-12-04T15:06:17.669Z" }
1222
+ wheels = [
1223
+ { url = "https://files.pythonhosted.org/packages/48/b8/9537b52010134b1d2b72870cc3f92d5fb759394094741b09ceccae183fbe/ruff-0.14.8-py3-none-linux_armv6l.whl", hash = "sha256:ec071e9c82eca417f6111fd39f7043acb53cd3fde9b1f95bbed745962e345afb", size = 13441540, upload-time = "2025-12-04T15:06:14.896Z" },
1224
+ { url = "https://files.pythonhosted.org/packages/24/00/99031684efb025829713682012b6dd37279b1f695ed1b01725f85fd94b38/ruff-0.14.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:8cdb162a7159f4ca36ce980a18c43d8f036966e7f73f866ac8f493b75e0c27e9", size = 13669384, upload-time = "2025-12-04T15:06:51.809Z" },
1225
+ { url = "https://files.pythonhosted.org/packages/72/64/3eb5949169fc19c50c04f28ece2c189d3b6edd57e5b533649dae6ca484fe/ruff-0.14.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:2e2fcbefe91f9fad0916850edf0854530c15bd1926b6b779de47e9ab619ea38f", size = 12806917, upload-time = "2025-12-04T15:06:08.925Z" },
1226
+ { url = "https://files.pythonhosted.org/packages/c4/08/5250babb0b1b11910f470370ec0cbc67470231f7cdc033cee57d4976f941/ruff-0.14.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9d70721066a296f45786ec31916dc287b44040f553da21564de0ab4d45a869b", size = 13256112, upload-time = "2025-12-04T15:06:23.498Z" },
1227
+ { url = "https://files.pythonhosted.org/packages/78/4c/6c588e97a8e8c2d4b522c31a579e1df2b4d003eddfbe23d1f262b1a431ff/ruff-0.14.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c87e09b3cd9d126fc67a9ecd3b5b1d3ded2b9c7fce3f16e315346b9d05cfb52", size = 13227559, upload-time = "2025-12-04T15:06:33.432Z" },
1228
+ { url = "https://files.pythonhosted.org/packages/23/ce/5f78cea13eda8eceac71b5f6fa6e9223df9b87bb2c1891c166d1f0dce9f1/ruff-0.14.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d62cb310c4fbcb9ee4ac023fe17f984ae1e12b8a4a02e3d21489f9a2a5f730c", size = 13896379, upload-time = "2025-12-04T15:06:02.687Z" },
1229
+ { url = "https://files.pythonhosted.org/packages/cf/79/13de4517c4dadce9218a20035b21212a4c180e009507731f0d3b3f5df85a/ruff-0.14.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1af35c2d62633d4da0521178e8a2641c636d2a7153da0bac1b30cfd4ccd91344", size = 15372786, upload-time = "2025-12-04T15:06:29.828Z" },
1230
+ { url = "https://files.pythonhosted.org/packages/00/06/33df72b3bb42be8a1c3815fd4fae83fa2945fc725a25d87ba3e42d1cc108/ruff-0.14.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:25add4575ffecc53d60eed3f24b1e934493631b48ebbc6ebaf9d8517924aca4b", size = 14990029, upload-time = "2025-12-04T15:06:36.812Z" },
1231
+ { url = "https://files.pythonhosted.org/packages/64/61/0f34927bd90925880394de0e081ce1afab66d7b3525336f5771dcf0cb46c/ruff-0.14.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c943d847b7f02f7db4201a0600ea7d244d8a404fbb639b439e987edcf2baf9a", size = 14407037, upload-time = "2025-12-04T15:06:39.979Z" },
1232
+ { url = "https://files.pythonhosted.org/packages/96/bc/058fe0aefc0fbf0d19614cb6d1a3e2c048f7dc77ca64957f33b12cfdc5ef/ruff-0.14.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb6e8bf7b4f627548daa1b69283dac5a296bfe9ce856703b03130732e20ddfe2", size = 14102390, upload-time = "2025-12-04T15:06:46.372Z" },
1233
+ { url = "https://files.pythonhosted.org/packages/af/a4/e4f77b02b804546f4c17e8b37a524c27012dd6ff05855d2243b49a7d3cb9/ruff-0.14.8-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:7aaf2974f378e6b01d1e257c6948207aec6a9b5ba53fab23d0182efb887a0e4a", size = 14230793, upload-time = "2025-12-04T15:06:20.497Z" },
1234
+ { url = "https://files.pythonhosted.org/packages/3f/52/bb8c02373f79552e8d087cedaffad76b8892033d2876c2498a2582f09dcf/ruff-0.14.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e5758ca513c43ad8a4ef13f0f081f80f08008f410790f3611a21a92421ab045b", size = 13160039, upload-time = "2025-12-04T15:06:49.06Z" },
1235
+ { url = "https://files.pythonhosted.org/packages/1f/ad/b69d6962e477842e25c0b11622548df746290cc6d76f9e0f4ed7456c2c31/ruff-0.14.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:f74f7ba163b6e85a8d81a590363bf71618847e5078d90827749bfda1d88c9cdf", size = 13205158, upload-time = "2025-12-04T15:06:54.574Z" },
1236
+ { url = "https://files.pythonhosted.org/packages/06/63/54f23da1315c0b3dfc1bc03fbc34e10378918a20c0b0f086418734e57e74/ruff-0.14.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:eed28f6fafcc9591994c42254f5a5c5ca40e69a30721d2ab18bb0bb3baac3ab6", size = 13469550, upload-time = "2025-12-04T15:05:59.209Z" },
1237
+ { url = "https://files.pythonhosted.org/packages/70/7d/a4d7b1961e4903bc37fffb7ddcfaa7beb250f67d97cfd1ee1d5cddb1ec90/ruff-0.14.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:21d48fa744c9d1cb8d71eb0a740c4dd02751a5de9db9a730a8ef75ca34cf138e", size = 14211332, upload-time = "2025-12-04T15:06:06.027Z" },
1238
+ { url = "https://files.pythonhosted.org/packages/5d/93/2a5063341fa17054e5c86582136e9895db773e3c2ffb770dde50a09f35f0/ruff-0.14.8-py3-none-win32.whl", hash = "sha256:15f04cb45c051159baebb0f0037f404f1dc2f15a927418f29730f411a79bc4e7", size = 13151890, upload-time = "2025-12-04T15:06:11.668Z" },
1239
+ { url = "https://files.pythonhosted.org/packages/02/1c/65c61a0859c0add13a3e1cbb6024b42de587456a43006ca2d4fd3d1618fe/ruff-0.14.8-py3-none-win_amd64.whl", hash = "sha256:9eeb0b24242b5bbff3011409a739929f497f3fb5fe3b5698aba5e77e8c833097", size = 14537826, upload-time = "2025-12-04T15:06:26.409Z" },
1240
+ { url = "https://files.pythonhosted.org/packages/6d/63/8b41cea3afd7f58eb64ac9251668ee0073789a3bc9ac6f816c8c6fef986d/ruff-0.14.8-py3-none-win_arm64.whl", hash = "sha256:965a582c93c63fe715fd3e3f8aa37c4b776777203d8e1d8aa3cc0c14424a4b99", size = 13634522, upload-time = "2025-12-04T15:06:43.212Z" },
1174
1241
  ]
1175
1242
 
1176
1243
  [[package]]
@@ -1191,6 +1258,24 @@ wheels = [
1191
1258
  { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" },
1192
1259
  ]
1193
1260
 
1261
+ [[package]]
1262
+ name = "smmap"
1263
+ version = "5.0.2"
1264
+ source = { registry = "https://pypi.org/simple" }
1265
+ sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329, upload-time = "2025-01-02T07:14:40.909Z" }
1266
+ wheels = [
1267
+ { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303, upload-time = "2025-01-02T07:14:38.724Z" },
1268
+ ]
1269
+
1270
+ [[package]]
1271
+ name = "soupsieve"
1272
+ version = "2.8"
1273
+ source = { registry = "https://pypi.org/simple" }
1274
+ sdist = { url = "https://files.pythonhosted.org/packages/6d/e6/21ccce3262dd4889aa3332e5a119a3491a95e8f60939870a3a035aabac0d/soupsieve-2.8.tar.gz", hash = "sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f", size = 103472, upload-time = "2025-08-27T15:39:51.78Z" }
1275
+ wheels = [
1276
+ { url = "https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c", size = 36679, upload-time = "2025-08-27T15:39:50.179Z" },
1277
+ ]
1278
+
1194
1279
  [[package]]
1195
1280
  name = "structlog"
1196
1281
  version = "25.5.0"
@@ -1218,9 +1303,18 @@ wheels = [
1218
1303
  { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" },
1219
1304
  ]
1220
1305
 
1306
+ [[package]]
1307
+ name = "tzdata"
1308
+ version = "2025.2"
1309
+ source = { registry = "https://pypi.org/simple" }
1310
+ sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" }
1311
+ wheels = [
1312
+ { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" },
1313
+ ]
1314
+
1221
1315
  [[package]]
1222
1316
  name = "updates2mqtt"
1223
- version = "1.4.1"
1317
+ version = "1.4.2"
1224
1318
  source = { editable = "." }
1225
1319
  dependencies = [
1226
1320
  { name = "docker" },
@@ -1249,9 +1343,12 @@ dev = [
1249
1343
  { name = "ruff" },
1250
1344
  ]
1251
1345
  mkdocs = [
1346
+ { name = "mkdocs" },
1252
1347
  { name = "mkdocs-autorefs" },
1253
1348
  { name = "mkdocs-coverage" },
1349
+ { name = "mkdocs-git-revision-date-localized-plugin" },
1254
1350
  { name = "mkdocs-material" },
1351
+ { name = "mkdocs-meta-descriptions-plugin" },
1255
1352
  { name = "mkdocs-minify-plugin" },
1256
1353
  { name = "mkdocs-pagetree-plugin" },
1257
1354
  { name = "mkdocstrings", extra = ["python"] },
@@ -1287,12 +1384,14 @@ dev = [
1287
1384
  { name = "ruff", specifier = ">=0.13.0" },
1288
1385
  ]
1289
1386
  mkdocs = [
1387
+ { name = "mkdocs" },
1290
1388
  { name = "mkdocs-autorefs" },
1291
1389
  { name = "mkdocs-coverage" },
1390
+ { name = "mkdocs-git-revision-date-localized-plugin" },
1292
1391
  { name = "mkdocs-material" },
1392
+ { name = "mkdocs-meta-descriptions-plugin" },
1293
1393
  { name = "mkdocs-minify-plugin" },
1294
1394
  { name = "mkdocs-pagetree-plugin" },
1295
- { name = "mkdocstrings" },
1296
1395
  { name = "mkdocstrings", extras = ["python"] },
1297
1396
  { name = "pngquant" },
1298
1397
  { name = "pymdown-extensions" },
@@ -1300,11 +1399,11 @@ mkdocs = [
1300
1399
 
1301
1400
  [[package]]
1302
1401
  name = "urllib3"
1303
- version = "2.5.0"
1402
+ version = "2.6.0"
1304
1403
  source = { registry = "https://pypi.org/simple" }
1305
- sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" }
1404
+ sdist = { url = "https://files.pythonhosted.org/packages/1c/43/554c2569b62f49350597348fc3ac70f786e3c32e7f19d266e19817812dd3/urllib3-2.6.0.tar.gz", hash = "sha256:cb9bcef5a4b345d5da5d145dc3e30834f58e8018828cbc724d30b4cb7d4d49f1", size = 432585, upload-time = "2025-12-05T15:08:47.885Z" }
1306
1405
  wheels = [
1307
- { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" },
1406
+ { url = "https://files.pythonhosted.org/packages/56/1a/9ffe814d317c5224166b23e7c47f606d6e473712a2fad0f704ea9b99f246/urllib3-2.6.0-py3-none-any.whl", hash = "sha256:c90f7a39f716c572c4e3e58509581ebd83f9b59cced005b7db7ad2d22b0db99f", size = 131083, upload-time = "2025-12-05T15:08:45.983Z" },
1308
1407
  ]
1309
1408
 
1310
1409
  [[package]]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes