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.
- updates2mqtt-1.4.2/.github/workflows/auto_assign_issue.yml +18 -0
- updates2mqtt-1.4.2/.github/workflows/auto_assign_pr.yml +18 -0
- updates2mqtt-1.4.2/.github/workflows/main.yml +18 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/.pre-commit-config.yaml +2 -2
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/CHANGELOG.md +4 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/PKG-INFO +9 -4
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/README.md +8 -3
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/common_packages.yaml +26 -2
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/home_assistant.md +7 -0
- updates2mqtt-1.4.2/docs/images/updates2mqtt-dark-256x256.png +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/installation.md +6 -5
- updates2mqtt-1.4.2/docs/robots.txt +4 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/troubleshooting.md +8 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/examples/config.yaml.maximal +2 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/examples/docker-compose.yaml +1 -1
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/mkdocs.yml +21 -3
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/pyproject.toml +4 -2
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/src/updates2mqtt/config.py +3 -1
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/src/updates2mqtt/hass_formatter.py +20 -4
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/src/updates2mqtt/mqtt.py +8 -6
- updates2mqtt-1.4.2/tests/test_hass_formatter.py +68 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/uv.lock +144 -45
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/.dockerignore +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/.github/dependabot.yml +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/.github/workflows/docker-publish.yml +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/.github/workflows/pypi-publish.yml +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/.github/workflows/python-package.yml +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/.gitignore +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/.hintrc +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/.python-version +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/.safety-project.ini +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/Dockerfile +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/LICENSE +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/SECURITY.md +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/conftest.py +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/configuration.md +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/examples/config_maximal.md +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/examples/config_minimal.md +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/examples/docker_compose.md +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/images/ha_entities.png +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/images/ha_mqtt_discovery.png +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/images/ha_update_detail.png +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/images/ha_update_dialog.png +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/images/ha_update_page.png +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/images/logo-blank-256x256.png +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/index.md +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/docs/local_builds.md +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/examples/config.yaml.minimal +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/no_config.yaml +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/refresh-deps.sh +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/scripts/healthcheck.sh +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/src/updates2mqtt/__init__.py +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/src/updates2mqtt/__main__.py +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/src/updates2mqtt/app.py +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/src/updates2mqtt/integrations/__init__.py +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/src/updates2mqtt/integrations/docker.py +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/src/updates2mqtt/integrations/git_utils.py +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/src/updates2mqtt/model.py +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/src/updates2mqtt/py.typed +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/tests/__init__.py +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/tests/test_app.py +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/tests/test_config.py +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/tests/test_docker.py +0 -0
- {updates2mqtt-1.4.1 → updates2mqtt-1.4.2}/tests/test_git_utils.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
38
|
+
{ align=left }
|
|
39
39
|
|
|
40
40
|
# updates2mqtt
|
|
41
41
|
|
|
@@ -43,14 +43,19 @@ Description-Content-Type: text/markdown
|
|
|
43
43
|
|
|
44
44
|
[](https://pypi.org/project/updates2mqtt/)
|
|
45
45
|
[](https://github.com/rhizomatics/supernotify)
|
|
46
|
-
](https://updates2mqtt.rhizomatics.org.uk/developer/coverage/)
|
|
47
|
+

|
|
48
48
|
[](https://results.pre-commit.ci/latest/github/rhizomatics/updates2mqtt/main)
|
|
49
49
|
[](https://github.com/rhizomatics/updates2mqtt/actions/workflows/pypi-publish.yml)
|
|
50
50
|
[](https://github.com/rhizomatics/updates2mqtt/actions/workflows/python-package.yml)
|
|
51
51
|
[](https://github.com/rhizomatics/updates2mqtt/actions/workflows/github-code-scanning/codeql)
|
|
52
52
|
[](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
|
-
|
|
1
|
+
{ align=left }
|
|
2
2
|
|
|
3
3
|
# updates2mqtt
|
|
4
4
|
|
|
@@ -6,14 +6,19 @@
|
|
|
6
6
|
|
|
7
7
|
[](https://pypi.org/project/updates2mqtt/)
|
|
8
8
|
[](https://github.com/rhizomatics/supernotify)
|
|
9
|
-
](https://updates2mqtt.rhizomatics.org.uk/developer/coverage/)
|
|
10
|
+

|
|
11
11
|
[](https://results.pre-commit.ci/latest/github/rhizomatics/updates2mqtt/main)
|
|
12
12
|
[](https://github.com/rhizomatics/updates2mqtt/actions/workflows/pypi-publish.yml)
|
|
13
13
|
[](https://github.com/rhizomatics/updates2mqtt/actions/workflows/python-package.yml)
|
|
14
14
|
[](https://github.com/rhizomatics/updates2mqtt/actions/workflows/github-code-scanning/codeql)
|
|
15
15
|
[](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://
|
|
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
|

|
|
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:
|
|
Binary file
|
|
@@ -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
|
-
|
|
24
|
-
- /
|
|
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
|
|
29
|
-
`/home/
|
|
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
|
|
|
@@ -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/
|
|
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/
|
|
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.
|
|
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,
|
|
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.
|
|
322
|
-
|
|
323
|
-
|
|
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.
|
|
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/
|
|
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/
|
|
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.
|
|
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/
|
|
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/
|
|
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.
|
|
916
|
+
version = "4.5.1"
|
|
850
917
|
source = { registry = "https://pypi.org/simple" }
|
|
851
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
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/
|
|
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 = "
|
|
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/
|
|
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/
|
|
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.
|
|
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/
|
|
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/
|
|
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.
|
|
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/
|
|
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/
|
|
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.
|
|
1153
|
-
source = { registry = "https://pypi.org/simple" }
|
|
1154
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1155
|
-
wheels = [
|
|
1156
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1157
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1158
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1159
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1160
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1161
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1162
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1163
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1164
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1165
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1166
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1167
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1168
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1169
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1170
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1171
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1172
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1173
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
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.
|
|
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.
|
|
1402
|
+
version = "2.6.0"
|
|
1304
1403
|
source = { registry = "https://pypi.org/simple" }
|
|
1305
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
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/
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|